sp_armthumb.c 5.3 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655100656100657100658100659100660100661100662100663100664100665100666100667100668100669100670100671100672100673100674100675100676100677100678100679100680100681100682100683100684100685100686100687100688100689100690100691100692100693100694100695100696100697100698100699100700100701100702100703100704100705100706100707100708100709100710100711100712100713100714100715100716100717100718100719100720100721100722100723100724100725100726100727100728100729100730100731100732100733100734100735100736100737100738100739100740100741100742100743100744100745100746100747100748100749100750100751100752100753100754100755100756100757100758100759100760100761100762100763100764100765100766100767100768100769100770100771100772100773100774100775100776100777100778100779100780100781100782100783100784100785100786100787100788100789100790100791100792100793100794100795100796100797100798100799100800100801100802100803100804100805100806100807100808100809100810100811100812100813100814100815100816100817100818100819100820100821100822100823100824100825100826100827100828100829100830100831100832100833100834100835100836100837100838100839100840100841100842100843100844100845100846100847100848100849100850100851100852100853100854100855100856100857100858100859100860100861100862100863100864100865100866100867100868100869100870100871100872100873100874100875100876100877100878100879100880100881100882100883100884100885100886100887100888100889100890100891100892100893100894100895100896100897100898100899100900100901100902100903100904100905100906100907100908100909100910100911100912100913100914100915100916100917100918100919100920100921100922100923100924100925100926100927100928100929100930100931100932100933100934100935100936100937100938100939100940100941100942100943100944100945100946100947100948100949100950100951100952100953100954100955100956100957100958100959100960100961100962100963100964100965100966100967100968100969100970100971100972100973100974100975100976100977100978100979100980100981100982100983100984100985100986100987100988100989100990100991100992100993100994100995100996100997100998100999101000101001101002101003101004101005101006101007101008101009101010101011101012101013101014101015101016101017101018101019101020101021101022101023101024101025101026101027101028101029101030101031101032101033101034101035101036101037101038101039101040101041101042101043101044101045101046101047101048101049101050101051101052101053101054101055101056101057101058101059101060101061101062101063101064101065101066101067101068101069101070101071101072101073101074101075101076101077101078101079101080101081101082101083101084101085101086101087101088101089101090101091101092101093101094101095101096101097101098101099101100101101101102101103101104101105101106101107101108101109101110101111101112101113101114101115101116101117101118101119101120101121101122101123101124101125101126101127101128101129101130101131101132101133101134101135101136101137101138101139101140101141101142101143101144101145101146101147101148101149101150101151101152101153101154101155101156101157101158101159101160101161101162101163101164101165101166101167101168101169101170101171101172101173101174101175101176101177101178101179101180101181101182101183101184101185101186101187101188101189101190101191101192101193101194101195101196101197101198101199101200101201101202101203101204101205101206101207101208101209101210101211101212101213101214101215101216101217101218101219101220101221101222101223101224101225101226101227101228101229101230101231101232101233101234101235101236101237101238101239101240101241101242101243101244101245101246101247101248101249101250101251101252101253101254101255101256101257101258101259101260101261101262101263101264101265101266101267101268101269101270101271101272101273101274101275101276101277101278101279101280101281101282101283101284101285101286101287101288101289101290101291101292101293101294101295101296101297101298101299101300101301101302101303101304101305101306101307101308101309101310101311101312101313101314101315101316101317101318101319101320101321101322101323101324101325101326101327101328101329101330101331101332101333101334101335101336101337101338101339101340101341101342101343101344101345101346101347101348101349101350101351101352101353101354101355101356101357101358101359101360101361101362101363101364101365101366101367101368101369101370101371101372101373101374101375101376101377101378101379101380101381101382101383101384101385101386101387101388101389101390101391101392101393101394101395101396101397101398101399101400101401101402101403101404101405101406101407101408101409101410101411101412101413101414101415101416101417101418101419101420101421101422101423101424101425101426101427101428101429101430101431101432101433101434101435101436101437101438101439101440101441101442101443101444101445101446101447101448101449101450101451101452101453101454101455101456101457101458101459101460101461101462101463101464101465101466101467101468101469101470101471101472101473101474101475101476101477101478101479101480101481101482101483101484101485101486101487101488101489101490101491101492101493101494101495101496101497101498101499101500101501101502101503101504101505101506101507101508101509101510101511101512101513101514101515101516101517101518101519101520101521101522101523101524101525101526101527101528101529101530101531101532101533101534101535101536101537101538101539101540101541101542101543101544101545101546101547101548101549101550101551101552101553101554101555101556101557101558101559101560101561101562101563101564101565101566101567101568101569101570101571101572101573101574101575101576101577101578101579101580101581101582101583101584101585101586101587101588101589101590101591101592101593101594101595101596101597101598101599101600101601101602101603101604101605101606101607101608101609101610101611101612101613101614101615101616101617101618101619101620101621101622101623101624101625101626101627101628101629101630101631101632101633101634101635101636101637101638101639101640101641101642101643101644101645101646101647101648101649101650101651101652101653101654101655101656101657101658101659101660101661101662101663101664101665101666101667101668101669101670101671101672101673101674101675101676101677101678101679101680101681101682101683101684101685101686101687101688101689101690101691101692101693101694101695101696101697101698101699101700101701101702101703101704101705101706101707101708101709101710101711101712101713101714101715101716101717101718101719101720101721101722101723101724101725101726101727101728101729101730101731101732101733101734101735101736101737101738101739101740101741101742101743101744101745101746101747101748101749101750101751101752101753101754101755101756101757101758101759101760101761101762101763101764101765101766101767101768101769101770101771101772101773101774101775101776101777101778101779101780101781101782101783101784101785101786101787101788101789101790101791101792101793101794101795101796101797101798101799101800101801101802101803101804101805101806101807101808101809101810101811101812101813101814101815101816101817101818101819101820101821101822101823101824101825101826101827101828101829101830101831101832101833101834101835101836101837101838101839101840101841101842101843101844101845101846101847101848101849101850101851101852101853101854101855101856101857101858101859101860101861101862101863101864101865101866101867101868101869101870101871101872101873101874101875101876101877101878101879101880101881101882101883101884101885101886101887101888101889101890101891101892101893101894101895101896101897101898101899101900101901101902101903101904101905101906101907101908101909101910101911101912101913101914101915101916101917101918101919101920101921101922101923101924101925101926101927101928101929101930101931101932101933101934101935101936101937101938101939101940101941101942101943101944101945101946101947101948101949101950101951101952101953101954101955101956101957101958101959101960101961101962101963101964101965101966101967101968101969101970101971101972101973101974101975101976101977101978101979101980101981101982101983101984101985101986101987101988101989101990101991101992101993101994101995101996101997101998101999102000102001102002102003102004102005102006102007102008102009102010102011102012102013102014102015102016102017102018102019102020102021102022102023102024102025102026102027102028102029102030102031102032102033102034102035102036102037102038102039102040102041102042102043102044102045102046102047102048102049102050102051102052102053102054102055102056102057102058102059102060102061102062102063102064102065102066102067102068102069102070102071102072102073102074102075102076102077102078102079102080102081102082102083102084102085102086102087102088102089102090102091102092102093102094102095102096102097102098102099102100102101102102102103102104102105102106102107102108102109102110102111102112102113102114102115102116102117102118102119102120102121102122102123102124102125102126102127102128102129102130102131102132102133102134102135102136102137102138102139102140102141102142102143102144102145102146102147102148102149102150102151102152102153102154102155102156102157102158102159102160102161102162102163102164102165102166102167102168102169102170102171102172102173102174102175102176102177102178102179102180102181102182102183102184102185102186102187102188102189102190102191102192102193102194102195102196102197102198102199102200102201102202102203102204102205102206102207102208102209102210102211102212102213102214102215102216102217102218102219102220102221102222102223102224102225102226102227102228102229102230102231102232102233102234102235102236102237102238102239102240102241102242102243102244102245102246102247102248102249102250102251102252102253102254102255102256102257102258102259102260102261102262102263102264102265102266102267102268102269102270102271102272102273102274102275102276102277102278102279102280102281102282102283102284102285102286102287102288102289102290102291102292102293102294102295102296102297102298102299102300102301102302102303102304102305102306102307102308102309102310102311102312102313102314102315102316102317102318102319102320102321102322102323102324102325102326102327102328102329102330102331102332102333102334102335102336102337102338102339102340102341102342102343102344102345102346102347102348102349102350102351102352102353102354102355102356102357102358102359102360102361102362102363102364102365102366102367102368102369102370102371102372102373102374102375102376102377102378102379102380102381102382102383102384102385102386102387102388102389102390102391102392102393102394102395102396102397102398102399102400102401102402102403102404102405102406102407102408102409102410102411102412102413102414102415102416102417102418102419102420102421102422102423102424102425102426102427102428102429102430102431102432102433102434102435102436102437102438102439102440102441102442102443102444102445102446102447102448102449102450102451102452102453102454102455102456102457102458102459102460102461102462102463102464102465102466102467102468102469102470102471102472102473102474102475102476102477102478102479102480102481102482102483102484102485102486102487102488102489102490102491102492102493102494102495102496102497102498102499102500102501102502102503102504102505102506102507102508102509102510102511102512102513102514102515102516102517102518102519102520102521102522102523102524102525102526102527102528102529102530102531102532102533102534102535102536102537102538102539102540102541102542102543102544102545102546102547102548102549102550102551102552102553102554102555102556102557102558102559102560102561102562102563102564102565102566102567102568102569102570102571102572102573102574102575102576102577102578102579102580102581102582102583102584102585102586102587102588102589102590102591102592102593102594102595102596102597102598102599102600102601102602102603102604102605102606102607102608102609102610102611102612102613102614102615102616102617102618102619102620102621102622102623102624102625102626102627102628102629102630102631102632102633102634102635102636102637102638102639102640102641102642102643102644102645102646102647102648102649102650102651102652102653102654102655102656102657102658102659102660102661102662102663102664102665102666102667102668102669102670102671102672102673102674102675102676102677102678102679102680102681102682102683102684102685102686102687102688102689102690102691102692102693102694102695102696102697102698102699102700102701102702102703102704102705102706102707102708102709102710102711102712102713102714102715102716102717102718102719102720102721102722102723102724102725102726102727102728102729102730102731102732102733102734102735102736102737102738102739102740102741102742102743102744102745102746102747102748102749102750102751102752102753102754102755102756102757102758102759102760102761102762102763102764102765102766102767102768102769102770102771102772102773102774102775102776102777102778102779102780102781102782102783102784102785102786102787102788102789102790102791102792102793102794102795102796102797102798102799102800102801102802102803102804102805102806102807102808102809102810102811102812102813102814102815102816102817102818102819102820102821102822102823102824102825102826102827102828102829102830102831102832102833102834102835102836102837102838102839102840102841102842102843102844102845102846102847102848102849102850102851102852102853102854102855102856102857102858102859102860102861102862102863102864102865102866102867102868102869102870102871102872102873102874102875102876102877102878102879102880102881102882102883102884102885102886102887102888102889102890102891102892102893102894102895102896102897102898102899102900102901102902102903102904102905102906102907102908102909102910102911102912102913102914102915102916102917102918102919102920102921102922102923102924102925102926102927102928102929102930102931102932102933102934102935102936102937102938102939102940102941102942102943102944102945102946102947102948102949102950102951102952102953102954102955102956102957102958102959102960102961102962102963102964102965102966102967102968102969102970102971102972102973102974102975102976102977102978102979102980102981102982102983102984102985102986102987102988102989102990102991102992102993102994102995102996102997102998102999103000103001103002103003103004103005103006103007103008103009103010103011103012103013103014103015103016103017103018103019103020103021103022103023103024103025103026103027103028103029103030103031103032103033103034103035103036103037103038103039103040103041103042103043103044103045103046103047103048103049103050103051103052103053103054103055103056103057103058103059103060103061103062103063103064103065103066103067103068103069103070103071103072103073103074103075103076103077103078103079103080103081103082103083103084103085103086103087103088103089103090103091103092103093103094103095103096103097103098103099103100103101103102103103103104103105103106103107103108103109103110103111103112103113103114103115103116103117103118103119103120103121103122103123103124103125103126103127103128103129103130103131103132103133103134103135103136103137103138103139103140103141103142103143103144103145103146103147103148103149103150103151103152103153103154103155103156103157103158103159103160103161103162103163103164103165103166103167103168103169103170103171103172103173103174103175103176103177103178103179103180103181103182103183103184103185103186103187103188103189103190103191103192103193103194103195103196103197103198103199103200103201103202103203103204103205103206103207103208103209103210103211103212103213103214103215103216103217103218103219103220103221103222103223103224103225103226103227103228103229103230103231103232103233103234103235103236103237103238103239103240103241103242103243103244103245103246103247103248103249103250103251103252103253103254103255103256103257103258103259103260103261103262103263103264103265103266103267103268103269103270103271103272103273103274103275103276103277103278103279103280103281103282103283103284103285103286103287103288103289103290103291103292103293103294103295103296103297103298103299103300103301103302103303103304103305103306103307103308103309103310103311103312103313103314103315103316103317103318103319103320103321103322103323103324103325103326103327103328103329103330103331103332103333103334103335103336103337103338103339103340103341103342103343103344103345103346103347103348103349103350103351103352103353103354103355103356103357103358103359103360103361103362103363103364103365103366103367103368103369103370103371103372103373103374103375103376103377103378103379103380103381103382103383103384103385103386103387103388103389103390103391103392103393103394103395103396103397103398103399103400103401103402103403103404103405103406103407103408103409103410103411103412103413103414103415103416103417103418103419103420103421103422103423103424103425103426103427103428103429103430103431103432103433103434103435103436103437103438103439103440103441103442103443103444103445103446103447103448103449103450103451103452103453103454103455103456103457103458103459103460103461103462103463103464103465103466103467103468103469103470103471103472103473103474103475103476103477103478103479103480103481103482103483103484103485103486103487103488103489103490103491103492103493103494103495103496103497103498103499103500103501103502103503103504103505103506103507103508103509103510103511103512103513103514103515103516103517103518103519103520103521103522103523103524103525103526103527103528103529103530103531103532103533103534103535103536103537103538103539103540103541103542103543103544103545103546103547103548103549103550103551103552103553103554103555103556103557103558103559103560103561103562103563103564103565103566103567103568103569103570103571103572103573103574103575103576103577103578103579103580103581103582103583103584103585103586103587103588103589103590103591103592103593103594103595103596103597103598103599103600103601103602103603103604103605103606103607103608103609103610103611103612103613103614103615103616103617103618103619103620103621103622103623103624103625103626103627103628103629103630103631103632103633103634103635103636103637103638103639103640103641103642103643103644103645103646103647103648103649103650103651103652103653103654103655103656103657103658103659103660103661103662103663103664103665103666103667103668103669103670103671103672103673103674103675103676103677103678103679103680103681103682103683103684103685103686103687103688103689103690103691103692103693103694103695103696103697103698103699103700103701103702103703103704103705103706103707103708103709103710103711103712103713103714103715103716103717103718103719103720103721103722103723103724103725103726103727103728103729103730103731103732103733103734103735103736103737103738103739103740103741103742103743103744103745103746103747103748103749103750103751103752103753103754103755103756103757103758103759103760103761103762103763103764103765103766103767103768103769103770103771103772103773103774103775103776103777103778103779103780103781103782103783103784103785103786103787103788103789103790103791103792103793103794103795103796103797103798103799103800103801103802103803103804103805103806103807103808103809103810103811103812103813103814103815103816103817103818103819103820103821103822103823103824103825103826103827103828103829103830103831103832103833103834103835103836103837103838103839103840103841103842103843103844103845103846103847103848103849103850103851103852103853103854103855103856103857103858103859103860103861103862103863103864103865103866103867103868103869103870103871103872103873103874103875103876103877103878103879103880103881103882103883103884103885103886103887103888103889103890103891103892103893103894103895103896103897103898103899103900103901103902103903103904103905103906103907103908103909103910103911103912103913103914103915103916103917103918103919103920103921103922103923103924103925103926103927103928103929103930103931103932103933103934103935103936103937103938103939103940103941103942103943103944103945103946103947103948103949103950103951103952103953103954103955103956103957103958103959103960103961103962103963103964103965103966103967103968103969103970103971103972103973103974103975103976103977103978103979103980103981103982103983103984103985103986103987103988103989103990103991103992103993103994103995103996103997103998103999104000104001104002104003104004104005104006104007104008104009104010104011104012104013104014104015104016104017104018104019104020104021104022104023104024104025104026104027104028104029104030104031104032104033104034104035104036104037104038104039104040104041104042104043104044104045104046104047104048104049104050104051104052104053104054104055104056104057104058104059104060104061104062104063104064104065104066104067104068104069104070104071104072104073104074104075104076104077104078104079104080104081104082104083104084104085104086104087104088104089104090104091104092104093104094104095104096104097104098104099104100104101104102104103104104104105104106104107104108104109104110104111104112104113104114104115104116104117104118104119104120104121104122104123104124104125104126104127104128104129104130104131104132104133104134104135104136104137104138104139104140104141104142104143104144104145104146104147104148104149104150104151104152104153104154104155104156104157104158104159104160104161104162104163104164104165104166104167104168104169104170104171104172104173104174104175104176104177104178104179104180104181104182104183104184104185104186104187104188104189104190104191104192104193104194104195104196104197104198104199104200104201104202104203104204104205104206104207104208104209104210104211104212104213104214104215104216104217104218104219104220104221104222104223104224104225104226104227104228104229104230104231104232104233104234104235104236104237104238104239104240104241104242104243104244104245104246104247104248104249104250104251104252104253104254104255104256104257104258104259104260104261104262104263104264104265104266104267104268104269104270104271104272104273104274104275104276104277104278104279104280104281104282104283104284104285104286104287104288104289104290104291104292104293104294104295104296104297104298104299104300104301104302104303104304104305104306104307104308104309104310104311104312104313104314104315104316104317104318104319104320104321104322104323104324104325104326104327104328104329104330104331104332104333104334104335104336104337104338104339104340104341104342104343104344104345104346104347104348104349104350104351104352104353104354104355104356104357104358104359104360104361104362104363104364104365104366104367104368104369104370104371104372104373104374104375104376104377104378104379104380104381104382104383104384104385104386104387104388104389104390104391104392104393104394104395104396104397104398104399104400104401104402104403104404104405104406104407104408104409104410104411104412104413104414104415104416104417104418104419104420104421104422104423104424104425104426104427104428104429104430104431104432104433104434104435104436104437104438104439104440104441104442104443104444104445104446104447104448104449104450104451104452104453104454104455104456104457104458104459104460104461104462104463104464104465104466104467104468104469104470104471104472104473104474104475104476104477104478104479104480104481104482104483104484104485104486104487104488104489104490104491104492104493104494104495104496104497104498104499104500104501104502104503104504104505104506104507104508104509104510104511104512104513104514104515104516104517104518104519104520104521104522104523104524104525104526104527104528104529104530104531104532104533104534104535104536104537104538104539104540104541104542104543104544104545104546104547104548104549104550104551104552104553104554104555104556104557104558104559104560104561104562104563104564104565104566104567104568104569104570104571104572104573104574104575104576104577104578104579104580104581104582104583104584104585104586104587104588104589104590104591104592104593104594104595104596104597104598104599104600104601104602104603104604104605104606104607104608104609104610104611104612104613104614104615104616104617104618104619104620104621104622104623104624104625104626104627104628104629104630104631104632104633104634104635104636104637104638104639104640104641104642104643104644104645104646104647104648104649104650104651104652104653104654104655104656104657104658104659104660104661104662104663104664104665104666104667104668104669104670104671104672104673104674104675104676104677104678104679104680104681104682104683104684104685104686104687104688104689104690104691104692104693104694104695104696104697104698104699104700104701104702104703104704104705104706104707104708104709104710104711104712104713104714104715104716104717104718104719104720104721104722104723104724104725104726104727104728104729104730104731104732104733104734104735104736104737104738104739104740104741104742104743104744104745104746104747104748104749104750104751104752104753104754104755104756104757104758104759104760104761104762104763104764104765104766104767104768104769104770104771104772104773104774104775104776104777104778104779104780104781104782104783104784104785104786104787104788104789104790104791104792104793104794104795104796104797104798104799104800104801104802104803104804104805104806104807104808104809104810104811104812104813104814104815104816104817104818104819104820104821104822104823104824104825104826104827104828104829104830104831104832104833104834104835104836104837104838104839104840104841104842104843104844104845104846104847104848104849104850104851104852104853104854104855104856104857104858104859104860104861104862104863104864104865104866104867104868104869104870104871104872104873104874104875104876104877104878104879104880104881104882104883104884104885104886104887104888104889104890104891104892104893104894104895104896104897104898104899104900104901104902104903104904104905104906104907104908104909104910104911104912104913104914104915104916104917104918104919104920104921104922104923104924104925104926104927104928104929104930104931104932104933104934104935104936104937104938104939104940104941104942104943104944104945104946104947104948104949104950104951104952104953104954104955104956104957104958104959104960104961104962104963104964104965104966104967104968104969104970104971104972104973104974104975104976104977104978104979104980104981104982104983104984104985104986104987104988104989104990104991104992104993104994104995104996104997104998104999105000105001105002105003105004105005105006105007105008105009105010105011105012105013105014105015105016105017105018105019105020105021105022105023105024105025105026105027105028105029105030105031105032105033105034105035105036105037105038105039105040105041105042105043105044105045105046105047105048105049105050105051105052105053105054105055105056105057105058105059105060105061105062105063105064105065105066105067105068105069105070105071105072105073105074105075105076105077105078105079105080105081105082105083105084105085105086105087105088105089105090105091105092105093105094105095105096105097105098105099105100105101105102105103105104105105105106105107105108105109105110105111105112105113105114105115105116105117105118105119105120105121105122105123105124105125105126105127105128105129105130105131105132105133105134105135105136105137105138105139105140105141105142105143105144105145105146105147105148105149105150105151105152105153105154105155105156105157105158105159105160105161105162105163105164105165105166105167105168105169105170105171105172105173105174105175105176105177105178105179105180105181105182105183105184105185105186105187105188105189105190105191105192105193105194105195105196105197105198105199105200105201105202105203105204105205105206105207105208105209105210105211105212105213105214105215105216105217105218105219105220105221105222105223105224105225105226105227105228105229105230105231105232105233105234105235105236105237105238105239105240105241105242105243105244105245105246105247105248105249105250105251105252105253105254105255105256105257105258105259105260105261105262105263105264105265105266105267105268105269105270105271105272105273105274105275105276105277105278105279105280105281105282105283105284105285105286105287105288105289105290105291105292105293105294105295105296105297105298105299105300105301105302105303105304105305105306105307105308105309105310105311105312105313105314105315105316105317105318105319105320105321105322105323105324105325105326105327105328105329105330105331105332105333105334105335105336105337105338105339105340105341105342105343105344105345105346105347105348105349105350105351105352105353105354105355105356105357105358105359105360105361105362105363105364105365105366105367105368105369105370105371105372105373105374105375105376105377105378105379105380105381105382105383105384105385105386105387105388105389105390105391105392105393105394105395105396105397105398105399105400105401105402105403105404105405105406105407105408105409105410105411105412105413105414105415105416105417105418105419105420105421105422105423105424105425105426105427105428105429105430105431105432105433105434105435105436105437105438105439105440105441105442105443105444105445105446105447105448105449105450105451105452105453105454105455105456105457105458105459105460105461105462105463105464105465105466105467105468105469105470105471105472105473105474105475105476105477105478105479105480105481105482105483105484105485105486105487105488105489105490105491105492105493105494105495105496105497105498105499105500105501105502105503105504105505105506105507105508105509105510105511105512105513105514105515105516105517105518105519105520105521105522105523105524105525105526105527105528105529105530105531105532105533105534105535105536105537105538105539105540105541105542105543105544105545105546105547105548105549105550105551105552105553105554105555105556105557105558105559105560105561105562105563105564105565105566105567105568105569105570105571105572105573105574105575105576105577105578105579105580105581105582105583105584105585105586105587105588105589105590105591105592105593105594105595105596105597105598105599105600105601105602105603105604105605105606105607105608105609105610105611105612105613105614105615105616105617105618105619105620105621105622105623105624105625105626105627105628105629105630105631105632105633105634105635105636105637105638105639105640105641105642105643105644105645105646105647105648105649105650105651105652105653105654105655105656105657105658105659105660105661105662105663105664105665105666105667105668105669105670105671105672105673105674105675105676105677105678105679105680105681105682105683105684105685105686105687105688105689105690105691105692105693105694105695105696105697105698105699105700105701105702105703105704105705105706105707105708105709105710105711105712105713105714105715105716105717105718105719105720105721105722105723105724105725105726105727105728105729105730105731105732105733105734105735105736105737105738105739105740105741105742105743105744105745105746105747105748105749105750105751105752105753105754105755105756105757105758105759105760105761105762105763105764105765105766105767105768105769105770105771105772105773105774105775105776105777105778105779105780105781105782105783105784105785105786105787105788105789105790105791105792105793105794105795105796105797105798105799105800105801105802105803105804105805105806105807105808105809105810105811105812105813105814105815105816105817105818105819105820105821105822105823105824105825105826105827105828105829105830105831105832105833105834105835105836105837105838105839105840105841105842105843105844105845105846105847105848105849105850105851105852105853105854105855105856105857105858105859105860105861105862105863105864105865105866105867105868105869105870105871105872105873105874105875105876105877105878105879105880105881105882105883105884105885105886105887105888105889105890105891105892105893105894105895105896105897105898105899105900105901105902105903105904105905105906105907105908105909105910105911105912105913105914105915105916105917105918105919105920105921105922105923105924105925105926105927105928105929105930105931105932105933105934105935105936105937105938105939105940105941105942105943105944105945105946105947105948105949105950105951105952105953105954105955105956105957105958105959105960105961105962105963105964105965105966105967105968105969105970105971105972105973105974105975105976105977105978105979105980105981105982105983105984105985105986105987105988105989105990105991105992105993105994105995105996105997105998105999106000106001106002106003106004106005106006106007106008106009106010106011106012106013106014106015106016106017106018106019106020106021106022106023106024106025106026106027106028106029106030106031106032106033106034106035106036106037106038106039106040106041106042106043106044106045106046106047106048106049106050106051106052106053106054106055106056106057106058106059106060106061106062106063106064106065106066106067106068106069106070106071106072106073106074106075106076106077106078106079106080106081106082106083106084106085106086106087106088106089106090106091106092106093106094106095106096106097106098106099106100106101106102106103106104106105106106106107106108106109106110106111106112106113106114106115106116106117106118106119106120106121106122106123106124106125106126106127106128106129106130106131106132106133106134106135106136106137106138106139106140106141106142106143106144106145106146106147106148106149106150106151106152106153106154106155106156106157106158106159106160106161106162106163106164106165106166106167106168106169106170106171106172106173106174106175106176106177106178106179106180106181106182106183106184106185106186106187106188106189106190106191106192106193106194106195106196106197106198106199106200106201106202106203106204106205106206106207106208106209106210106211106212106213106214106215106216106217106218106219106220106221106222106223106224106225106226106227106228106229106230106231106232106233106234106235106236106237106238106239106240106241106242106243106244106245106246106247106248106249106250106251106252106253106254106255106256106257106258106259106260106261106262106263106264106265106266106267106268106269106270106271106272106273106274106275106276106277106278106279106280106281106282106283106284106285106286106287106288106289106290106291106292106293106294106295106296106297106298106299106300106301106302106303106304106305106306106307106308106309106310106311106312106313106314106315106316106317106318106319106320106321106322106323106324106325106326106327106328106329106330106331106332106333106334106335106336106337106338106339106340106341106342106343106344106345106346106347106348106349106350106351106352106353106354106355106356106357106358106359106360106361106362106363106364106365106366106367106368106369106370106371106372106373106374106375106376106377106378106379106380106381106382106383106384106385106386106387106388106389106390106391106392106393106394106395106396106397106398106399106400106401106402106403106404106405106406106407106408106409106410106411106412106413106414106415106416106417106418106419106420106421106422106423106424106425106426106427106428106429106430106431106432106433106434106435106436106437106438106439106440106441106442106443106444106445106446106447106448106449106450106451106452106453106454106455106456106457106458106459106460106461106462106463106464106465106466106467106468106469106470106471106472106473106474106475106476106477106478106479106480106481106482106483106484106485106486106487106488106489106490106491106492106493106494106495106496106497106498106499106500106501106502106503106504106505106506106507106508106509106510106511106512106513106514106515106516106517106518106519106520106521106522106523106524106525106526106527106528106529106530106531106532106533106534106535106536106537106538106539106540106541106542106543106544106545106546106547106548106549106550106551106552106553106554106555106556106557106558106559106560106561106562106563106564106565106566106567106568106569106570106571106572106573106574106575106576106577106578106579106580106581106582106583106584106585106586106587106588106589106590106591106592106593106594106595106596106597106598106599106600106601106602106603106604106605106606106607106608106609106610106611106612106613106614106615106616106617106618106619106620106621106622106623106624106625106626106627106628106629106630106631106632106633106634106635106636106637106638106639106640106641106642106643106644106645106646106647106648106649106650106651106652106653106654106655106656106657106658106659106660106661106662106663106664106665106666106667106668106669106670106671106672106673106674106675106676106677106678106679106680106681106682106683106684106685106686106687106688106689106690106691106692106693106694106695106696106697106698106699106700106701106702106703106704106705106706106707106708106709106710106711106712106713106714106715106716106717106718106719106720106721106722106723106724106725106726106727106728106729106730106731106732106733106734106735106736106737106738106739106740106741106742106743106744106745106746106747106748106749106750106751106752106753106754106755106756106757106758106759106760106761106762106763106764106765106766106767106768106769106770106771106772106773106774106775106776106777106778106779106780106781106782106783106784106785106786106787106788106789106790106791106792106793106794106795106796106797106798106799106800106801106802106803106804106805106806106807106808106809106810106811106812106813106814106815106816106817106818106819106820106821106822106823106824106825106826106827106828106829106830106831106832106833106834106835106836106837106838106839106840106841106842106843106844106845106846106847106848106849106850106851106852106853106854106855106856106857106858106859106860106861106862106863106864106865106866106867106868106869106870106871106872106873106874106875106876106877106878106879106880106881106882106883106884106885106886106887106888106889106890106891106892106893106894106895106896106897106898106899106900106901106902106903106904106905106906106907106908106909106910106911106912106913106914106915106916106917106918106919106920106921106922106923106924106925106926106927106928106929106930106931106932106933106934106935106936106937106938106939106940106941106942106943106944106945106946106947106948106949106950106951106952106953106954106955106956106957106958106959106960106961106962106963106964106965106966106967106968106969106970106971106972106973106974106975106976106977106978106979106980106981106982106983106984106985106986106987106988106989106990106991106992106993106994106995106996106997106998106999107000107001107002107003107004107005107006107007107008107009107010107011107012107013107014107015107016107017107018107019107020107021107022107023107024107025107026107027107028107029107030107031107032107033107034107035107036107037107038107039107040107041107042107043107044107045107046107047107048107049107050107051107052107053107054107055107056107057107058107059107060107061107062107063107064107065107066107067107068107069107070107071107072107073107074107075107076107077107078107079107080107081107082107083107084107085107086107087107088107089107090107091107092107093107094107095107096107097107098107099107100107101107102107103107104107105107106107107107108107109107110107111107112107113107114107115107116107117107118107119107120107121107122107123107124107125107126107127107128107129107130107131107132107133107134107135107136107137107138107139107140107141107142107143107144107145107146107147107148107149107150107151107152107153107154107155107156107157107158107159107160107161107162107163107164107165107166107167107168107169107170107171107172107173107174107175107176107177107178107179107180107181107182107183107184107185107186107187107188107189107190107191107192107193107194107195107196107197107198107199107200107201107202107203107204107205107206107207107208107209107210107211107212107213107214107215107216107217107218107219107220107221107222107223107224107225107226107227107228107229107230107231107232107233107234107235107236107237107238107239107240107241107242107243107244107245107246107247107248107249107250107251107252107253107254107255107256107257107258107259107260107261107262107263107264107265107266107267107268107269107270107271107272107273107274107275107276107277107278107279107280107281107282107283107284107285107286107287107288107289107290107291107292107293107294107295107296107297107298107299107300107301107302107303107304107305107306107307107308107309107310107311107312107313107314107315107316107317107318107319107320107321107322107323107324107325107326107327107328107329107330107331107332107333107334107335107336107337107338107339107340107341107342107343107344107345107346107347107348107349107350107351107352107353107354107355107356107357107358107359107360107361107362107363107364107365107366107367107368107369107370107371107372107373107374107375107376107377107378107379107380107381107382107383107384107385107386107387107388107389107390107391107392107393107394107395107396107397107398107399107400107401107402107403107404107405107406107407107408107409107410107411107412107413107414107415107416107417107418107419107420107421107422107423107424107425107426107427107428107429107430107431107432107433107434107435107436107437107438107439107440107441107442107443107444107445107446107447107448107449107450107451107452107453107454107455107456107457107458107459107460107461107462107463107464107465107466107467107468107469107470107471107472107473107474107475107476107477107478107479107480107481107482107483107484107485107486107487107488107489107490107491107492107493107494107495107496107497107498107499107500107501107502107503107504107505107506107507107508107509107510107511107512107513107514107515107516107517107518107519107520107521107522107523107524107525107526107527107528107529107530107531107532107533107534107535107536107537107538107539107540107541107542107543107544107545107546107547107548107549107550107551107552107553107554107555107556107557107558107559107560107561107562107563107564107565107566107567107568107569107570107571107572107573107574107575107576107577107578107579107580107581107582107583107584107585107586107587107588107589107590107591107592107593107594107595107596107597107598107599107600107601107602107603107604107605107606107607107608107609107610107611107612107613107614107615107616107617107618107619107620107621107622107623107624107625107626107627107628107629107630107631107632107633107634107635107636107637107638107639107640107641107642107643107644107645107646107647107648107649107650107651107652107653107654107655107656107657107658107659107660107661107662107663107664107665107666107667107668107669107670107671107672107673107674107675107676107677107678107679107680107681107682107683107684107685107686107687107688107689107690107691107692107693107694107695107696107697107698107699107700107701107702107703107704107705107706107707107708107709107710107711107712107713107714107715107716107717107718107719107720107721107722107723107724107725107726107727107728107729107730107731107732107733107734107735107736107737107738107739107740107741107742107743107744107745107746107747107748107749107750107751107752107753107754107755107756107757107758107759107760107761107762107763107764107765107766107767107768107769107770107771107772107773107774107775107776107777107778107779107780107781107782107783107784107785107786107787107788107789107790107791107792107793107794107795107796107797107798107799107800107801107802107803107804107805107806107807107808107809107810107811107812107813107814107815107816107817107818107819107820107821107822107823107824107825107826107827107828107829107830107831107832107833107834107835107836107837107838107839107840107841107842107843107844107845107846107847107848107849107850107851107852107853107854107855107856107857107858107859107860107861107862107863107864107865107866107867107868107869107870107871107872107873107874107875107876107877107878107879107880107881107882107883107884107885107886107887107888107889107890107891107892107893107894107895107896107897107898107899107900107901107902107903107904107905107906107907107908107909107910107911107912107913107914107915107916107917107918107919107920107921107922107923107924107925107926107927107928107929107930107931107932107933107934107935107936107937107938107939107940107941107942107943107944107945107946107947107948107949107950107951107952107953107954107955107956107957107958107959107960107961107962107963107964107965107966107967107968107969107970107971107972107973107974107975107976107977107978107979107980107981107982107983107984107985107986107987107988107989107990107991107992107993107994107995107996107997107998107999108000108001108002108003108004108005108006108007108008108009108010108011108012108013108014108015108016108017108018108019108020108021108022108023108024108025108026108027108028108029108030108031108032108033108034108035108036108037108038108039108040108041108042108043108044108045108046108047108048108049108050108051108052108053108054108055108056108057108058108059108060108061108062108063108064108065108066108067108068108069108070108071108072108073108074108075108076108077108078108079108080108081108082108083108084108085108086108087108088108089108090108091108092108093108094108095108096108097108098108099108100108101108102108103108104108105108106108107108108108109108110108111108112108113108114108115108116108117108118108119108120108121108122108123108124108125108126108127108128108129108130108131108132108133108134108135108136108137108138108139108140108141108142108143108144108145108146108147108148108149108150108151108152108153108154108155108156108157108158108159108160108161108162108163108164108165108166108167108168108169108170108171108172108173108174108175108176108177108178108179108180108181108182108183108184108185108186108187108188108189108190108191108192108193108194108195108196108197108198108199108200108201108202108203108204108205108206108207108208108209108210108211108212108213108214108215108216108217108218108219108220108221108222108223108224108225108226108227108228108229108230108231108232108233108234108235108236108237108238108239108240108241108242108243108244108245108246108247108248108249108250108251108252108253108254108255108256108257108258108259108260108261108262108263108264108265108266108267108268108269108270108271108272108273108274108275108276108277108278108279108280108281108282108283108284108285108286108287108288108289108290108291108292108293108294108295108296108297108298108299108300108301108302108303108304108305108306108307108308108309108310108311108312108313108314108315108316108317108318108319108320108321108322108323108324108325108326108327108328108329108330108331108332108333108334108335108336108337108338108339108340108341108342108343108344108345108346108347108348108349108350108351108352108353108354108355108356108357108358108359108360108361108362108363108364108365108366108367108368108369108370108371108372108373108374108375108376108377108378108379108380108381108382108383108384108385108386108387108388108389108390108391108392108393108394108395108396108397108398108399108400108401108402108403108404108405108406108407108408108409108410108411108412108413108414108415108416108417108418108419108420108421108422108423108424108425108426108427108428108429108430108431108432108433108434108435108436108437108438108439108440108441108442108443108444108445108446108447108448108449108450108451108452108453108454108455108456108457108458108459108460108461108462108463108464108465108466108467108468108469108470108471108472108473108474108475108476108477108478108479108480108481108482108483108484108485108486108487108488108489108490108491108492108493108494108495108496108497108498108499108500108501108502108503108504108505108506108507108508108509108510108511108512108513108514108515108516108517108518108519108520108521108522108523108524108525108526108527108528108529108530108531108532108533108534108535108536108537108538108539108540108541108542108543108544108545108546108547108548108549108550108551108552108553108554108555108556108557108558108559108560108561108562108563108564108565108566108567108568108569108570108571108572108573108574108575108576108577108578108579108580108581108582108583108584108585108586108587108588108589108590108591108592108593108594108595108596108597108598108599108600108601108602108603108604108605108606108607108608108609108610108611108612108613108614108615108616108617108618108619108620108621108622108623108624108625108626108627108628108629108630108631108632108633108634108635108636108637108638108639108640108641108642108643108644108645108646108647108648108649108650108651108652108653108654108655108656108657108658108659108660108661108662108663108664108665108666108667108668108669108670108671108672108673108674108675108676108677108678108679108680108681108682108683108684108685108686108687108688108689108690108691108692108693108694108695108696108697108698108699108700108701108702108703108704108705108706108707108708108709108710108711108712108713108714108715108716108717108718108719108720108721108722108723108724108725108726108727108728108729108730108731108732108733108734108735108736108737108738108739108740108741108742108743108744108745108746108747108748108749108750108751108752108753108754108755108756108757108758108759108760108761108762108763108764108765108766108767108768108769108770108771108772108773108774108775108776108777108778108779108780108781108782108783108784108785108786108787108788108789108790108791108792108793108794108795108796108797108798108799108800108801108802108803108804108805108806108807108808108809108810108811108812108813108814108815108816108817108818108819108820108821108822108823108824108825108826108827108828108829108830108831108832108833108834108835108836108837108838108839108840108841108842108843108844108845108846108847108848108849108850108851108852108853108854108855108856108857108858108859108860108861108862108863108864108865108866108867108868108869108870108871108872108873108874108875108876108877108878108879108880108881108882108883108884108885108886108887108888108889108890108891108892108893108894108895108896108897108898108899108900108901108902108903108904108905108906108907108908108909108910108911108912108913108914108915108916108917108918108919108920108921108922108923108924108925108926108927108928108929108930108931108932108933108934108935108936108937108938108939108940108941108942108943108944108945108946108947108948108949108950108951108952108953108954108955108956108957108958108959108960108961108962108963108964108965108966108967108968108969108970108971108972108973108974108975108976108977108978108979108980108981108982108983108984108985108986108987108988108989108990108991108992108993108994108995108996108997108998108999109000109001109002109003109004109005109006109007109008109009109010109011109012109013109014109015109016109017109018109019109020109021109022109023109024109025109026109027109028109029109030109031109032109033109034109035109036109037109038109039109040109041109042109043109044109045109046109047109048109049109050109051109052109053109054109055109056109057109058109059109060109061109062109063109064109065109066109067109068109069109070109071109072109073109074109075109076109077109078109079109080109081109082109083109084109085109086109087109088109089109090109091109092109093109094109095109096109097109098109099109100109101109102109103109104109105109106109107109108109109109110109111109112109113109114109115109116109117109118109119109120109121109122109123109124109125109126109127109128109129109130109131109132109133109134109135109136109137109138109139109140109141109142109143109144109145109146109147109148109149109150109151109152109153109154109155109156109157109158109159109160109161109162109163109164109165109166109167109168109169109170109171109172109173109174109175109176109177109178109179109180109181109182109183109184109185109186109187109188109189109190109191109192109193109194109195109196109197109198109199109200109201109202109203109204109205109206109207109208109209109210109211109212109213109214109215109216109217109218109219109220109221109222109223109224109225109226109227109228109229109230109231109232109233109234109235109236109237109238109239109240109241109242109243109244109245109246109247109248109249109250109251109252109253109254109255109256109257109258109259109260109261109262109263109264109265109266109267109268109269109270109271109272109273109274109275109276109277109278109279109280109281109282109283109284109285109286109287109288109289109290109291109292109293109294109295109296109297109298109299109300109301109302109303109304109305109306109307109308109309109310109311109312109313109314109315109316109317109318109319109320109321109322109323109324109325109326109327109328109329109330109331109332109333109334109335109336109337109338109339109340109341109342109343109344109345109346109347109348109349109350109351109352109353109354109355109356109357109358109359109360109361109362109363109364109365109366109367109368109369109370109371109372109373109374109375109376109377109378109379109380109381109382109383109384109385109386109387109388109389109390109391109392109393109394109395109396109397109398109399109400109401109402109403109404109405109406109407109408109409109410109411109412109413109414109415109416109417109418109419109420109421109422109423109424109425109426109427109428109429109430109431109432109433109434109435109436109437109438109439109440109441109442109443109444109445109446109447109448109449109450109451109452109453109454109455109456109457109458109459109460109461109462109463109464109465109466109467109468109469109470109471109472109473109474109475109476109477109478109479109480109481109482109483109484109485109486109487109488109489109490109491109492109493109494109495109496109497109498109499109500109501109502109503109504109505109506109507109508109509109510109511109512109513109514109515109516109517109518109519109520109521109522109523109524109525109526109527109528109529109530109531109532109533109534109535109536109537109538109539109540109541109542109543109544109545109546109547109548109549109550109551109552109553109554109555109556109557109558109559109560109561109562109563109564109565109566109567109568109569109570109571109572109573109574109575109576109577109578109579109580109581109582109583109584109585109586109587109588109589109590109591109592109593109594109595109596109597109598109599109600109601109602109603109604109605109606109607109608109609109610109611109612109613109614109615109616109617109618109619109620109621109622109623109624109625109626109627109628109629109630109631109632109633109634109635109636109637109638109639109640109641109642109643109644109645109646109647109648109649109650109651109652109653109654109655109656109657109658109659109660109661109662109663109664109665109666109667109668109669109670109671109672109673109674109675109676109677109678109679109680109681109682109683109684109685109686109687109688109689109690109691109692109693109694109695109696109697109698109699109700109701109702109703109704109705109706109707109708109709109710109711109712109713109714109715109716109717109718109719109720109721109722109723109724109725109726109727109728109729109730109731109732109733109734109735109736109737109738109739109740109741109742109743109744109745109746109747109748109749109750109751109752109753109754109755109756109757109758109759109760109761109762109763109764109765109766109767109768109769109770109771109772109773109774109775109776109777109778109779109780109781109782109783109784109785109786109787109788109789109790109791109792109793109794109795109796109797109798109799109800109801109802109803109804109805109806109807109808109809109810109811109812109813109814109815109816109817109818109819109820109821109822109823109824109825109826109827109828109829109830109831109832109833109834109835109836109837109838109839109840109841109842109843109844109845109846109847109848109849109850109851109852109853109854109855109856109857109858109859109860109861109862109863109864109865109866109867109868109869109870109871109872109873109874109875109876109877109878109879109880109881109882109883109884109885109886109887109888109889109890109891109892109893109894109895109896109897109898109899109900109901109902109903109904109905109906109907109908109909109910109911109912109913109914109915109916109917109918109919109920109921109922109923109924109925109926109927109928109929109930109931109932109933109934109935109936109937109938109939109940109941109942109943109944109945109946109947109948109949109950109951109952109953109954109955109956109957109958109959109960109961109962109963109964109965109966109967109968109969109970109971109972109973109974109975109976109977109978109979109980109981109982109983109984109985109986109987109988109989109990109991109992109993109994109995109996109997109998109999110000110001110002110003110004110005110006110007110008110009110010110011110012110013110014110015110016110017110018110019110020110021110022110023110024110025110026110027110028110029110030110031110032110033110034110035110036110037110038110039110040110041110042110043110044110045110046110047110048110049110050110051110052110053110054110055110056110057110058110059110060110061110062110063110064110065110066110067110068110069110070110071110072110073110074110075110076110077110078110079110080110081110082110083110084110085110086110087110088110089110090110091110092110093110094110095110096110097110098110099110100110101110102110103110104110105110106110107110108110109110110110111110112110113110114110115110116110117110118110119110120110121110122110123110124110125110126110127110128110129110130110131110132110133110134110135110136110137110138110139110140110141110142110143110144110145110146110147110148110149110150110151110152110153110154110155110156110157110158110159110160110161110162110163110164110165110166110167110168110169110170110171110172110173110174110175110176110177110178110179110180110181110182110183110184110185110186110187110188110189110190110191110192110193110194110195110196110197110198110199110200110201110202110203110204110205110206110207110208110209110210110211110212110213110214110215110216110217110218110219110220110221110222110223110224110225110226110227110228110229110230110231110232110233110234110235110236110237110238110239110240110241110242110243110244110245110246110247110248110249110250110251110252110253110254110255110256110257110258110259110260110261110262110263110264110265110266110267110268110269110270110271110272110273110274110275110276110277110278110279110280110281110282110283110284110285110286110287110288110289110290110291110292110293110294110295110296110297110298110299110300110301110302110303110304110305110306110307110308110309110310110311110312110313110314110315110316110317110318110319110320110321110322110323110324110325110326110327110328110329110330110331110332110333110334110335110336110337110338110339110340110341110342110343110344110345110346110347110348110349110350110351110352110353110354110355110356110357110358110359110360110361110362110363110364110365110366110367110368110369110370110371110372110373110374110375110376110377110378110379110380110381110382110383110384110385110386110387110388110389110390110391110392110393110394110395110396110397110398110399110400110401110402110403110404110405110406110407110408110409110410110411110412110413110414110415110416110417110418110419110420110421110422110423110424110425110426110427110428110429110430110431110432110433110434110435110436110437110438110439110440110441110442110443110444110445110446110447110448110449110450110451110452110453110454110455110456110457110458110459110460110461110462110463110464110465110466110467110468110469110470110471110472110473110474110475110476110477110478110479110480110481110482110483110484110485110486110487110488110489110490110491110492110493110494110495110496110497110498110499110500110501110502110503110504110505110506110507110508110509110510110511110512110513110514110515110516110517110518110519110520110521110522110523110524110525110526110527110528110529110530110531110532110533110534110535110536110537110538110539110540110541110542110543110544110545110546110547110548110549110550110551110552110553110554110555110556110557110558110559110560110561110562110563110564110565110566110567110568110569110570110571110572110573110574110575110576110577110578110579110580110581110582110583110584110585110586110587110588110589110590110591110592110593110594110595110596110597110598110599110600110601110602110603110604110605110606110607110608110609110610110611110612110613110614110615110616110617110618110619110620110621110622110623110624110625110626110627110628110629110630110631110632110633110634110635110636110637110638110639110640110641110642110643110644110645110646110647110648110649110650110651110652110653110654110655110656110657110658110659110660110661110662110663110664110665110666110667110668110669110670110671110672110673110674110675110676110677110678110679110680110681110682110683110684110685110686110687110688110689110690110691110692110693110694110695110696110697110698110699110700110701110702110703110704110705110706110707110708110709110710110711110712110713110714110715110716110717110718110719110720110721110722110723110724110725110726110727110728110729110730110731110732110733110734110735110736110737110738110739110740110741110742110743110744110745110746110747110748110749110750110751110752110753110754110755110756110757110758110759110760110761110762110763110764110765110766110767110768110769110770110771110772110773110774110775110776110777110778110779110780110781110782110783110784110785110786110787110788110789110790110791110792110793110794110795110796110797110798110799110800110801110802110803110804110805110806110807110808110809110810110811110812110813110814110815110816110817110818110819110820110821110822110823110824110825110826110827110828110829110830110831110832110833110834110835110836110837110838110839110840110841110842110843110844110845110846110847110848110849110850110851110852110853110854110855110856110857110858110859110860110861110862110863110864110865110866110867110868110869110870110871110872110873110874110875110876110877110878110879110880110881110882110883110884110885110886110887110888110889110890110891110892110893110894110895110896110897110898110899110900110901110902110903110904110905110906110907110908110909110910110911110912110913110914110915110916110917110918110919110920110921110922110923110924110925110926110927110928110929110930110931110932110933110934110935110936110937110938110939110940110941110942110943110944110945110946110947110948110949110950110951110952110953110954110955110956110957110958110959110960110961110962110963110964110965110966110967110968110969110970110971110972110973110974110975110976110977110978110979110980110981110982110983110984110985110986110987110988110989110990110991110992110993110994110995110996110997110998110999111000111001111002111003111004111005111006111007111008111009111010111011111012111013111014111015111016111017111018111019111020111021111022111023111024111025111026111027111028111029111030111031111032111033111034111035111036111037111038111039111040111041111042111043111044111045111046111047111048111049111050111051111052111053111054111055111056111057111058111059111060111061111062111063111064111065111066111067111068111069111070111071111072111073111074111075111076111077111078111079111080111081111082111083111084111085111086111087111088111089111090111091111092111093111094111095111096111097111098111099111100111101111102111103111104111105111106111107111108111109111110111111111112111113111114111115111116111117111118111119111120111121111122111123111124111125111126111127111128111129111130111131111132111133111134111135111136111137111138111139111140111141111142111143111144111145111146111147111148111149111150111151111152111153111154111155111156111157111158111159111160111161111162111163111164111165111166111167111168111169111170111171111172111173111174111175111176111177111178111179111180111181111182111183111184111185111186111187111188111189111190111191111192111193111194111195111196111197111198111199111200111201111202111203111204111205111206111207111208111209111210111211111212111213111214111215111216111217111218111219111220111221111222111223111224111225111226111227111228111229111230111231111232111233111234111235111236111237111238111239111240111241111242111243111244111245111246111247111248111249111250111251111252111253111254111255111256111257111258111259111260111261111262111263111264111265111266111267111268111269111270111271111272111273111274111275111276111277111278111279111280111281111282111283111284111285111286111287111288111289111290111291111292111293111294111295111296111297111298111299111300111301111302111303111304111305111306111307111308111309111310111311111312111313111314111315111316111317111318111319111320111321111322111323111324111325111326111327111328111329111330111331111332111333111334111335111336111337111338111339111340111341111342111343111344111345111346111347111348111349111350111351111352111353111354111355111356111357111358111359111360111361111362111363111364111365111366111367111368111369111370111371111372111373111374111375111376111377111378111379111380111381111382111383111384111385111386111387111388111389111390111391111392111393111394111395111396111397111398111399111400111401111402111403111404111405111406111407111408111409111410111411111412111413111414111415111416111417111418111419111420111421111422111423111424111425111426111427111428111429111430111431111432111433111434111435111436111437111438111439111440111441111442111443111444111445111446111447111448111449111450111451111452111453111454111455111456111457111458111459111460111461111462111463111464111465111466111467111468111469111470111471111472111473111474111475111476111477111478111479111480111481111482111483111484111485111486111487111488111489111490111491111492111493111494111495111496111497111498111499111500111501111502111503111504111505111506111507111508111509111510111511111512111513111514111515111516111517111518111519111520111521111522111523111524111525111526111527111528111529111530111531111532111533111534111535111536111537111538111539111540111541111542111543111544111545111546111547111548111549111550111551111552111553111554111555111556111557111558111559111560111561111562111563111564111565111566111567111568111569111570111571111572111573111574111575111576111577111578111579111580111581111582111583111584111585111586111587111588111589111590111591111592111593111594111595111596111597111598111599111600111601111602111603111604111605111606111607111608111609111610111611111612111613111614111615111616111617111618111619111620111621111622111623111624111625111626111627111628111629111630111631111632111633111634111635111636111637111638111639111640111641111642111643111644111645111646111647111648111649111650111651111652111653111654111655111656111657111658111659111660111661111662111663111664111665111666111667111668111669111670111671111672111673111674111675111676111677111678111679111680111681111682111683111684111685111686111687111688111689111690111691111692111693111694111695111696111697111698111699111700111701111702111703111704111705111706111707111708111709111710111711111712111713111714111715111716111717111718111719111720111721111722111723111724111725111726111727111728111729111730111731111732111733111734111735111736111737111738111739111740111741111742111743111744111745111746111747111748111749111750111751111752111753111754111755111756111757111758111759111760111761111762111763111764111765111766111767111768111769111770111771111772111773111774111775111776111777111778111779111780111781111782111783111784111785111786111787111788111789111790111791111792111793111794111795111796111797111798111799111800111801111802111803111804111805111806111807111808111809111810111811111812111813111814111815111816111817111818111819111820111821111822111823111824111825111826111827111828111829111830111831111832111833111834111835111836111837111838111839111840111841111842111843111844111845111846111847111848111849111850111851111852111853111854111855111856111857111858111859111860111861111862111863111864111865111866111867111868111869111870111871111872111873111874111875111876111877111878111879111880111881111882111883111884111885111886111887111888111889111890111891111892111893111894111895111896111897111898111899111900111901111902111903111904111905111906111907111908111909111910111911111912111913111914111915111916111917111918111919111920111921111922111923111924111925111926111927111928111929111930111931111932111933111934111935111936111937111938111939111940111941111942111943111944111945111946111947111948111949111950111951111952111953111954111955111956111957111958111959111960111961111962111963111964111965111966111967111968111969111970111971111972111973111974111975111976111977111978111979111980111981111982111983111984111985111986111987111988111989111990111991111992111993111994111995111996111997111998111999112000112001112002112003112004112005112006112007112008112009112010112011112012112013112014112015112016112017112018112019112020112021112022112023112024112025112026112027112028112029112030112031112032112033112034112035112036112037112038112039112040112041112042112043112044112045112046112047112048112049112050112051112052112053112054112055112056112057112058112059112060112061112062112063112064112065112066112067112068112069112070112071112072112073112074112075112076112077112078112079112080112081112082112083112084112085112086112087112088112089112090112091112092112093112094112095112096112097112098112099112100112101112102112103112104112105112106112107112108112109112110112111112112112113112114112115112116112117112118112119112120112121112122112123112124112125112126112127112128112129112130112131112132112133112134112135112136112137112138112139112140112141112142112143112144112145112146112147112148112149112150112151112152112153112154112155112156112157112158112159112160112161112162112163112164112165112166112167112168112169112170112171112172112173112174112175112176112177112178112179112180112181112182112183112184112185112186112187112188112189112190112191112192112193112194112195112196112197112198112199112200112201112202112203112204112205112206112207112208112209112210112211112212112213112214112215112216112217112218112219112220112221112222112223112224112225112226112227112228112229112230112231112232112233112234112235112236112237112238112239112240112241112242112243112244112245112246112247112248112249112250112251112252112253112254112255112256112257112258112259112260112261112262112263112264112265112266112267112268112269112270112271112272112273112274112275112276112277112278112279112280112281112282112283112284112285112286112287112288112289112290112291112292112293112294112295112296112297112298112299112300112301112302112303112304112305112306112307112308112309112310112311112312112313112314112315112316112317112318112319112320112321112322112323112324112325112326112327112328112329112330112331112332112333112334112335112336112337112338112339112340112341112342112343112344112345112346112347112348112349112350112351112352112353112354112355112356112357112358112359112360112361112362112363112364112365112366112367112368112369112370112371112372112373112374112375112376112377112378112379112380112381112382112383112384112385112386112387112388112389112390112391112392112393112394112395112396112397112398112399112400112401112402112403112404112405112406112407112408112409112410112411112412112413112414112415112416112417112418112419112420112421112422112423112424112425112426112427112428112429112430112431112432112433112434112435112436112437112438112439112440112441112442112443112444112445112446112447112448112449112450112451112452112453112454112455112456112457112458112459112460112461112462112463112464112465112466112467112468112469112470112471112472112473112474112475112476112477112478112479112480112481112482112483112484112485112486112487112488112489112490112491112492112493112494112495112496112497112498112499112500112501112502112503112504112505112506112507112508112509112510112511112512112513112514112515112516112517112518112519112520112521112522112523112524112525112526112527112528112529112530112531112532112533112534112535112536112537112538112539112540112541112542112543112544112545112546112547112548112549112550112551112552112553112554112555112556112557112558112559112560112561112562112563112564112565112566112567112568112569112570112571112572112573112574112575112576112577112578112579112580112581112582112583112584112585112586112587112588112589112590112591112592112593112594112595112596112597112598112599112600112601112602112603112604112605112606112607112608112609112610112611112612112613112614112615112616112617112618112619112620112621112622112623112624112625112626112627112628112629112630112631112632112633112634112635112636112637112638112639112640112641112642112643112644112645112646112647112648112649112650112651112652112653112654112655112656112657112658112659112660112661112662112663112664112665112666112667112668112669112670112671112672112673112674112675112676112677112678112679112680112681112682112683112684112685112686112687112688112689112690112691112692112693112694112695112696112697112698112699112700112701112702112703112704112705112706112707112708112709112710112711112712112713112714112715112716112717112718112719112720112721112722112723112724112725112726112727112728112729112730112731112732112733112734112735112736112737112738112739112740112741112742112743112744112745112746112747112748112749112750112751112752112753112754112755112756112757112758112759112760112761112762112763112764112765112766112767112768112769112770112771112772112773112774112775112776112777112778112779112780112781112782112783112784112785112786112787112788112789112790112791112792112793112794112795112796112797112798112799112800112801112802112803112804112805112806112807112808112809112810112811112812112813112814112815112816112817112818112819112820112821112822112823112824112825112826112827112828112829112830112831112832112833112834112835112836112837112838112839112840112841112842112843112844112845112846112847112848112849112850112851112852112853112854112855112856112857112858112859112860112861112862112863112864112865112866112867112868112869112870112871112872112873112874112875112876112877112878112879112880112881112882112883112884112885112886112887112888112889112890112891112892112893112894112895112896112897112898112899112900112901112902112903112904112905112906112907112908112909112910112911112912112913112914112915112916112917112918112919112920112921112922112923112924112925112926112927112928112929112930112931112932112933112934112935112936112937112938112939112940112941112942112943112944112945112946112947112948112949112950112951112952112953112954112955112956112957112958112959112960112961112962112963112964112965112966112967112968112969112970112971112972112973112974112975112976112977112978112979112980112981112982112983112984112985112986112987112988112989112990112991112992112993112994112995112996112997112998112999113000113001113002113003113004113005113006113007113008113009113010113011113012113013113014113015113016113017113018113019113020113021113022113023113024113025113026113027113028113029113030113031113032113033113034113035113036113037113038113039113040113041113042113043113044113045113046113047113048113049113050113051113052113053113054113055113056113057113058113059113060113061113062113063113064113065113066113067113068113069113070113071113072113073113074113075113076113077113078113079113080113081113082113083113084113085113086113087113088113089113090113091113092113093113094113095113096113097113098113099113100113101113102113103113104113105113106113107113108113109113110113111113112113113113114113115113116113117113118113119113120113121113122113123113124113125113126113127113128113129113130113131113132113133113134113135113136113137113138113139113140113141113142113143113144113145113146113147113148113149113150113151113152113153113154113155113156113157113158113159113160113161113162113163113164113165113166113167113168113169113170113171113172113173113174113175113176113177113178113179113180113181113182113183113184113185113186113187113188113189113190113191113192113193113194113195113196113197113198113199113200113201113202113203113204113205113206113207113208113209113210113211113212113213113214113215113216113217113218113219113220113221113222113223113224113225113226113227113228113229113230113231113232113233113234113235113236113237113238113239113240113241113242113243113244113245113246113247113248113249113250113251113252113253113254113255113256113257113258113259113260113261113262113263113264113265113266113267113268113269113270113271113272113273113274113275113276113277113278113279113280113281113282113283113284113285113286113287113288113289113290113291113292113293113294113295113296113297113298113299113300113301113302113303113304113305113306113307113308113309113310113311113312113313113314113315113316113317113318113319113320113321113322113323113324113325113326113327113328113329113330113331113332113333113334113335113336113337113338113339113340113341113342113343113344113345113346113347113348113349113350113351113352113353113354113355113356113357113358113359113360113361113362113363113364113365113366113367113368113369113370113371113372113373113374113375113376113377113378113379113380113381113382113383113384113385113386113387113388113389113390113391113392113393113394113395113396113397113398113399113400113401113402113403113404113405113406113407113408113409113410113411113412113413113414113415113416113417113418113419113420113421113422113423113424113425113426113427113428113429113430113431113432113433113434113435113436113437113438113439113440113441113442113443113444113445113446113447113448113449113450113451113452113453113454113455113456113457113458113459113460113461113462113463113464113465113466113467113468113469113470113471113472113473113474113475113476113477113478113479113480113481113482113483113484113485113486113487113488113489113490113491113492113493113494113495113496113497113498113499113500113501113502113503113504113505113506113507113508113509113510113511113512113513113514113515113516113517113518113519113520113521113522113523113524113525113526113527113528113529113530113531113532113533113534113535113536113537113538113539113540113541113542113543113544113545113546113547113548113549113550113551113552113553113554113555113556113557113558113559113560113561113562113563113564113565113566113567113568113569113570113571113572113573113574113575113576113577113578113579113580113581113582113583113584113585113586113587113588113589113590113591113592113593113594113595113596113597113598113599113600113601113602113603113604113605113606113607113608113609113610113611113612113613113614113615113616113617113618113619113620113621113622113623113624113625113626113627113628113629113630113631113632113633113634113635113636113637113638113639113640113641113642113643113644113645113646113647113648113649113650113651113652113653113654113655113656113657113658113659113660113661113662113663113664113665113666113667113668113669113670113671113672113673113674113675113676113677113678113679113680113681113682113683113684113685113686113687113688113689113690113691113692113693113694113695113696113697113698113699113700113701113702113703113704113705113706113707113708113709113710113711113712113713113714113715113716113717113718113719113720113721113722113723113724113725113726113727113728113729113730113731113732113733113734113735113736113737113738113739113740113741113742113743113744113745113746113747113748113749113750113751113752113753113754113755113756113757113758113759113760113761113762113763113764113765113766113767113768113769113770113771113772113773113774113775113776113777113778113779113780113781113782113783113784113785113786113787113788113789113790113791113792113793113794113795113796113797113798113799113800113801113802113803113804113805113806113807113808113809113810113811113812113813113814113815113816113817113818113819113820113821113822113823113824113825113826113827113828113829113830113831113832113833113834113835113836113837113838113839113840113841113842113843113844113845113846113847113848113849113850113851113852113853113854113855113856113857113858113859113860113861113862113863113864113865113866113867113868113869113870113871113872113873113874113875113876113877113878113879113880113881113882113883113884113885113886113887113888113889113890113891113892113893113894113895113896113897113898113899113900113901113902113903113904113905113906113907113908113909113910113911113912113913113914113915113916113917113918113919113920113921113922113923113924113925113926113927113928113929113930113931113932113933113934113935113936113937113938113939113940113941113942113943113944113945113946113947113948113949113950113951113952113953113954113955113956113957113958113959113960113961113962113963113964113965113966113967113968113969113970113971113972113973113974113975113976113977113978113979113980113981113982113983113984113985113986113987113988113989113990113991113992113993113994113995113996113997113998113999114000114001114002114003114004114005114006114007114008114009114010114011114012114013114014114015114016114017114018114019114020114021114022114023114024114025114026114027114028114029114030114031114032114033114034114035114036114037114038114039114040114041114042114043114044114045114046114047114048114049114050114051114052114053114054114055114056114057114058114059114060114061114062114063114064114065114066114067114068114069114070114071114072114073114074114075114076114077114078114079114080114081114082114083114084114085114086114087114088114089114090114091114092114093114094114095114096114097114098114099114100114101114102114103114104114105114106114107114108114109114110114111114112114113114114114115114116114117114118114119114120114121114122114123114124114125114126114127114128114129114130114131114132114133114134114135114136114137114138114139114140114141114142114143114144114145114146114147114148114149114150114151114152114153114154114155114156114157114158114159114160114161114162114163114164114165114166114167114168114169114170114171114172114173114174114175114176114177114178114179114180114181114182114183114184114185114186114187114188114189114190114191114192114193114194114195114196114197114198114199114200114201114202114203114204114205114206114207114208114209114210114211114212114213114214114215114216114217114218114219114220114221114222114223114224114225114226114227114228114229114230114231114232114233114234114235114236114237114238114239114240114241114242114243114244114245114246114247114248114249114250114251114252114253114254114255114256114257114258114259114260114261114262114263114264114265114266114267114268114269114270114271114272114273114274114275114276114277114278114279114280114281114282114283114284114285114286114287114288114289114290114291114292114293114294114295114296114297114298114299114300114301114302114303114304114305114306114307114308114309114310114311114312114313114314114315114316114317114318114319114320114321114322114323114324114325114326114327114328114329114330114331114332114333114334114335114336114337114338114339114340114341114342114343114344114345114346114347114348114349114350114351114352114353114354114355114356114357114358114359114360114361114362114363114364114365114366114367114368114369114370114371114372114373114374114375114376114377114378114379114380114381114382114383114384114385114386114387114388114389114390114391114392114393114394114395114396114397114398114399114400114401114402114403114404114405114406114407114408114409114410114411114412114413114414114415114416114417114418114419114420114421114422114423114424114425114426114427114428114429114430114431114432114433114434114435114436114437114438114439114440114441114442114443114444114445114446114447114448114449114450114451114452114453114454114455114456114457114458114459114460114461114462114463114464114465114466114467114468114469114470114471114472114473114474114475114476114477114478114479114480114481114482114483114484114485114486114487114488114489114490114491114492114493114494114495114496114497114498114499114500114501114502114503114504114505114506114507114508114509114510114511114512114513114514114515114516114517114518114519114520114521114522114523114524114525114526114527114528114529114530114531114532114533114534114535114536114537114538114539114540114541114542114543114544114545114546114547114548114549114550114551114552114553114554114555114556114557114558114559114560114561114562114563114564114565114566114567114568114569114570114571114572114573114574114575114576114577114578114579114580114581114582114583114584114585114586114587114588114589114590114591114592114593114594114595114596114597114598114599114600114601114602114603114604114605114606114607114608114609114610114611114612114613114614114615114616114617114618114619114620114621114622114623114624114625114626114627114628114629114630114631114632114633114634114635114636114637114638114639114640114641114642114643114644114645114646114647114648114649114650114651114652114653114654114655114656114657114658114659114660114661114662114663114664114665114666114667114668114669114670114671114672114673114674114675114676114677114678114679114680114681114682114683114684114685114686114687114688114689114690114691114692114693114694114695114696114697114698114699114700114701114702114703114704114705114706114707114708114709114710114711114712114713114714114715114716114717114718114719114720114721114722114723114724114725114726114727114728114729114730114731114732114733114734114735114736114737114738114739114740114741114742114743114744114745114746114747114748114749114750114751114752114753114754114755114756114757114758114759114760114761114762114763114764114765114766114767114768114769114770114771114772114773114774114775114776114777114778114779114780114781114782114783114784114785114786114787114788114789114790114791114792114793114794114795114796114797114798114799114800114801114802114803114804114805114806114807114808114809114810114811114812114813114814114815114816114817114818114819114820114821114822114823114824114825114826114827114828114829114830114831114832114833114834114835114836114837114838114839114840114841114842114843114844114845114846114847114848114849114850114851114852114853114854114855114856114857114858114859114860114861114862114863114864114865114866114867114868114869114870114871114872114873114874114875114876114877114878114879114880114881114882114883114884114885114886114887114888114889114890114891114892114893114894114895114896114897114898114899114900114901114902114903114904114905114906114907114908114909114910114911114912114913114914114915114916114917114918114919114920114921114922114923114924114925114926114927114928114929114930114931114932114933114934114935114936114937114938114939114940114941114942114943114944114945114946114947114948114949114950114951114952114953114954114955114956114957114958114959114960114961114962114963114964114965114966114967114968114969114970114971114972114973114974114975114976114977114978114979114980114981114982114983114984114985114986114987114988114989114990114991114992114993114994114995114996114997114998114999115000115001115002115003115004115005115006115007115008115009115010115011115012115013115014115015115016115017115018115019115020115021115022115023115024115025115026115027115028115029115030115031115032115033115034115035115036115037115038115039115040115041115042115043115044115045115046115047115048115049115050115051115052115053115054115055115056115057115058115059115060115061115062115063115064115065115066115067115068115069115070115071115072115073115074115075115076115077115078115079115080115081115082115083115084115085115086115087115088115089115090115091115092115093115094115095115096115097115098115099115100115101115102115103115104115105115106115107115108115109115110115111115112115113115114115115115116115117115118115119115120115121115122115123115124115125115126115127115128115129115130115131115132115133115134115135115136115137115138115139115140115141115142115143115144115145115146115147115148115149115150115151115152115153115154115155115156115157115158115159115160115161115162115163115164115165115166115167115168115169115170115171115172115173115174115175115176115177115178115179115180115181115182115183115184115185115186115187115188115189115190115191115192115193115194115195115196115197115198115199115200115201115202115203115204115205115206115207115208115209115210115211115212115213115214115215115216115217115218115219115220115221115222115223115224115225115226115227115228115229115230115231115232115233115234115235115236115237115238115239115240115241115242115243115244115245115246115247115248115249115250115251115252115253115254115255115256115257115258115259115260115261115262115263115264115265115266115267115268115269115270115271115272115273115274115275115276115277115278115279115280115281115282115283115284115285115286115287115288115289115290115291115292115293115294115295115296115297115298115299115300115301115302115303115304115305115306115307115308115309115310115311115312115313115314115315115316115317115318115319115320115321115322115323115324115325115326115327115328115329115330115331115332115333115334115335115336115337115338115339115340115341115342115343115344115345115346115347115348115349115350115351115352115353115354115355115356115357115358115359115360115361115362115363115364115365115366115367115368115369115370115371115372115373115374115375115376115377115378115379115380115381115382115383115384115385115386115387115388115389115390115391115392115393115394115395115396115397115398115399115400115401115402115403115404115405115406115407115408115409115410115411115412115413115414115415115416115417115418115419115420115421115422115423115424115425115426115427115428115429115430115431115432115433115434115435115436115437115438115439115440115441115442115443115444115445115446115447115448115449115450115451115452115453115454115455115456115457115458115459115460115461115462115463115464115465115466115467115468115469115470115471115472115473115474115475115476115477115478115479115480115481115482115483115484115485115486115487115488115489115490115491115492115493115494115495115496115497115498115499115500115501115502115503115504115505115506115507115508115509115510115511115512115513115514115515115516115517115518115519115520115521115522115523115524115525115526115527115528115529115530115531115532115533115534115535115536115537115538115539115540115541115542115543115544115545115546115547115548115549115550115551115552115553115554115555115556115557115558115559115560115561115562115563115564115565115566115567115568115569115570115571115572115573115574115575115576115577115578115579115580115581115582115583115584115585115586115587115588115589115590115591115592115593115594115595115596115597115598115599115600115601115602115603115604115605115606115607115608115609115610115611115612115613115614115615115616115617115618115619115620115621115622115623115624115625115626115627115628115629115630115631115632115633115634115635115636115637115638115639115640115641115642115643115644115645115646115647115648115649115650115651115652115653115654115655115656115657115658115659115660115661115662115663115664115665115666115667115668115669115670115671115672115673115674115675115676115677115678115679115680115681115682115683115684115685115686115687115688115689115690115691115692115693115694115695115696115697115698115699115700115701115702115703115704115705115706115707115708115709115710115711115712115713115714115715115716115717115718115719115720115721115722115723115724115725115726115727115728115729115730115731115732115733115734115735115736115737115738115739115740115741115742115743115744115745115746115747115748115749115750115751115752115753115754115755115756115757115758115759115760115761115762115763115764115765115766115767115768115769115770115771115772115773115774115775115776115777115778115779115780115781115782115783115784115785115786115787115788115789115790115791115792115793115794115795115796115797115798115799115800115801115802115803115804115805115806115807115808115809115810115811115812115813115814115815115816115817115818115819115820115821115822115823115824115825115826115827115828115829115830115831115832115833115834115835115836115837115838115839115840115841115842115843115844115845115846115847115848115849115850115851115852115853115854115855115856115857115858115859115860115861115862115863115864115865115866115867115868115869115870115871115872115873115874115875115876115877115878115879115880115881115882115883115884115885115886115887115888115889115890115891115892115893115894115895115896115897115898115899115900115901115902115903115904115905115906115907115908115909115910115911115912115913115914115915115916115917115918115919115920115921115922115923115924115925115926115927115928115929115930115931115932115933115934115935115936115937115938115939115940115941115942115943115944115945115946115947115948115949115950115951115952115953115954115955115956115957115958115959115960115961115962115963115964115965115966115967115968115969115970115971115972115973115974115975115976115977115978115979115980115981115982115983115984115985115986115987115988115989115990115991115992115993115994115995115996115997115998115999116000116001116002116003116004116005116006116007116008116009116010116011116012116013116014116015116016116017116018116019116020116021116022116023116024116025116026116027116028116029116030116031116032116033116034116035116036116037116038116039116040116041116042116043116044116045116046116047116048116049116050116051116052116053116054116055116056116057116058116059116060116061116062116063116064116065116066116067116068116069116070116071116072116073116074116075116076116077116078116079116080116081116082116083116084116085116086116087116088116089116090116091116092116093116094116095116096116097116098116099116100116101116102116103116104116105116106116107116108116109116110116111116112116113116114116115116116116117116118116119116120116121116122116123116124116125116126116127116128116129116130116131116132116133116134116135116136116137116138116139116140116141116142116143116144116145116146116147116148116149116150116151116152116153116154116155116156116157116158116159116160116161116162116163116164116165116166116167116168116169116170116171116172116173116174116175116176116177116178116179116180116181116182116183116184116185116186116187116188116189116190116191116192116193116194116195116196116197116198116199116200116201116202116203116204116205116206116207116208116209116210116211116212116213116214116215116216116217116218116219116220116221116222116223116224116225116226116227116228116229116230116231116232116233116234116235116236116237116238116239116240116241116242116243116244116245116246116247116248116249116250116251116252116253116254116255116256116257116258116259116260116261116262116263116264116265116266116267116268116269116270116271116272116273116274116275116276116277116278116279116280116281116282116283116284116285116286116287116288116289116290116291116292116293116294116295116296116297116298116299116300116301116302116303116304116305116306116307116308116309116310116311116312116313116314116315116316116317116318116319116320116321116322116323116324116325116326116327116328116329116330116331116332116333116334116335116336116337116338116339116340116341116342116343116344116345116346116347116348116349116350116351116352116353116354116355116356116357116358116359116360116361116362116363116364116365116366116367116368116369116370116371116372116373116374116375116376116377116378116379116380116381116382116383116384116385116386116387116388116389116390116391116392116393116394116395116396116397116398116399116400116401116402116403116404116405116406116407116408116409116410116411116412116413116414116415116416116417116418116419116420116421116422116423116424116425116426116427116428116429116430116431116432116433116434116435116436116437116438116439116440116441116442116443116444116445116446116447116448116449116450116451116452116453116454116455116456116457116458116459116460116461116462116463116464116465116466116467116468116469116470116471116472116473116474116475116476116477116478116479116480116481116482116483116484116485116486116487116488116489116490116491116492116493116494116495116496116497116498116499116500116501116502116503116504116505116506116507116508116509116510116511116512116513116514116515116516116517116518116519116520116521116522116523116524116525116526116527116528116529116530116531116532116533116534116535116536116537116538116539116540116541116542116543116544116545116546116547116548116549116550116551116552116553116554116555116556116557116558116559116560116561116562116563116564116565116566116567116568116569116570116571116572116573116574116575116576116577116578116579116580116581116582116583116584116585116586116587116588116589116590116591116592116593116594116595116596116597116598116599116600116601116602116603116604116605116606116607116608116609116610116611116612116613116614116615116616116617116618116619116620116621116622116623116624116625116626116627116628116629116630116631116632116633116634116635116636116637116638116639116640116641116642116643116644116645116646116647116648116649116650116651116652116653116654116655116656116657116658116659116660116661116662116663116664116665116666116667116668116669116670116671116672116673116674116675116676116677116678116679116680116681116682116683116684116685116686116687116688116689116690116691116692116693116694116695116696116697116698116699116700116701116702116703116704116705116706116707116708116709116710116711116712116713116714116715116716116717116718116719116720116721116722116723116724116725116726116727116728116729116730116731116732116733116734116735116736116737116738116739116740116741116742116743116744116745116746116747116748116749116750116751116752116753116754116755116756116757116758116759116760116761116762116763116764116765116766116767116768116769116770116771116772116773116774116775116776116777116778116779116780116781116782116783116784116785116786116787116788116789116790116791116792116793116794116795116796116797116798116799116800116801116802116803116804116805116806116807116808116809116810116811116812116813116814116815116816116817116818116819116820116821116822116823116824116825116826116827116828116829116830116831116832116833116834116835116836116837116838116839116840116841116842116843116844116845116846116847116848116849116850116851116852116853116854116855116856116857116858116859116860116861116862116863116864116865116866116867116868116869116870116871116872116873116874116875116876116877116878116879116880116881116882116883116884116885116886116887116888116889116890116891116892116893116894116895116896116897116898116899116900116901116902116903116904116905116906116907116908116909116910116911116912116913116914116915116916116917116918116919116920116921116922116923116924116925116926116927116928116929116930116931116932116933116934116935116936116937116938116939116940116941116942116943116944116945116946116947116948116949116950116951116952116953116954116955116956116957116958116959116960116961116962116963116964116965116966116967116968116969116970116971116972116973116974116975116976116977116978116979116980116981116982116983116984116985116986116987116988116989116990116991116992116993116994116995116996116997116998116999117000117001117002117003117004117005117006117007117008117009117010117011117012117013117014117015117016117017117018117019117020117021117022117023117024117025117026117027117028117029117030117031117032117033117034117035117036117037117038117039117040117041117042117043117044117045117046117047117048117049117050117051117052117053117054117055117056117057117058117059117060117061117062117063117064117065117066117067117068117069117070117071117072117073117074117075117076117077117078117079117080117081117082117083117084117085117086117087117088117089117090117091117092117093117094117095117096117097117098117099117100117101117102117103117104117105117106117107117108117109117110117111117112117113117114117115117116117117117118117119117120117121117122117123117124117125117126117127117128117129117130117131117132117133117134117135117136117137117138117139117140117141117142117143117144117145117146117147117148117149117150117151117152117153117154117155117156117157117158117159117160117161117162117163117164117165117166117167117168117169117170117171117172117173117174117175117176117177117178117179117180117181117182117183117184117185117186117187117188117189117190117191117192117193117194117195117196117197117198117199117200117201117202117203117204117205117206117207117208117209117210117211117212117213117214117215117216117217117218117219117220117221117222117223117224117225117226117227117228117229117230117231117232117233117234117235117236117237117238117239117240117241117242117243117244117245117246117247117248117249117250117251117252117253117254117255117256117257117258117259117260117261117262117263117264117265117266117267117268117269117270117271117272117273117274117275117276117277117278117279117280117281117282117283117284117285117286117287117288117289117290117291117292117293117294117295117296117297117298117299117300117301117302117303117304117305117306117307117308117309117310117311117312117313117314117315117316117317117318117319117320117321117322117323117324117325117326117327117328117329117330117331117332117333117334117335117336117337117338117339117340117341117342117343117344117345117346117347117348117349117350117351117352117353117354117355117356117357117358117359117360117361117362117363117364117365117366117367117368117369117370117371117372117373117374117375117376117377117378117379117380117381117382117383117384117385117386117387117388117389117390117391117392117393117394117395117396117397117398117399117400117401117402117403117404117405117406117407117408117409117410117411117412117413117414117415117416117417117418117419117420117421117422117423117424117425117426117427117428117429117430117431117432117433117434117435117436117437117438117439117440117441117442117443117444117445117446117447117448117449117450117451117452117453117454117455117456117457117458117459117460117461117462117463117464117465117466117467117468117469117470117471117472117473117474117475117476117477117478117479117480117481117482117483117484117485117486117487117488117489117490117491117492117493117494117495117496117497117498117499117500117501117502117503117504117505117506117507117508117509117510117511117512117513117514117515117516117517117518117519117520117521117522117523117524117525117526117527117528117529117530117531117532117533117534117535117536117537117538117539117540117541117542117543117544117545117546117547117548117549117550117551117552117553117554117555117556117557117558117559117560117561117562117563117564117565117566117567117568117569117570117571117572117573117574117575117576117577117578117579117580117581117582117583117584117585117586117587117588117589117590117591117592117593117594117595117596117597117598117599117600117601117602117603117604117605117606117607117608117609117610117611117612117613117614117615117616117617117618117619117620117621117622117623117624117625117626117627117628117629117630117631117632117633117634117635117636117637117638117639117640117641117642117643117644117645117646117647117648117649117650117651117652117653117654117655117656117657117658117659117660117661117662117663117664117665117666117667117668117669117670117671117672117673117674117675117676117677117678117679117680117681117682117683117684117685117686117687117688117689117690117691117692117693117694117695117696117697117698117699117700117701117702117703117704117705117706117707117708117709117710117711117712117713117714117715117716117717117718117719117720117721117722117723117724117725117726117727117728117729117730117731117732117733117734117735117736117737117738117739117740117741117742117743117744117745117746117747117748117749117750117751117752117753117754117755117756117757117758117759117760117761117762117763117764117765117766117767117768117769117770117771117772117773117774117775117776117777117778117779117780117781117782117783117784117785117786117787117788117789117790117791117792117793117794117795117796117797117798117799117800117801117802117803117804117805117806117807117808117809117810117811117812117813117814117815117816117817117818117819117820117821117822117823117824117825117826117827117828117829117830117831117832117833117834117835117836117837117838117839117840117841117842117843117844117845117846117847117848117849117850117851117852117853117854117855117856117857117858117859117860117861117862117863117864117865117866117867117868117869117870117871117872117873117874117875117876117877117878117879117880117881117882117883117884117885117886117887117888117889117890117891117892117893117894117895117896117897117898117899117900117901117902117903117904117905117906117907117908117909117910117911117912117913117914117915117916117917117918117919117920117921117922117923117924117925117926117927117928117929117930117931117932117933117934117935117936117937117938117939117940117941117942117943117944117945117946117947117948117949117950117951117952117953117954117955117956117957117958117959117960117961117962117963117964117965117966117967117968117969117970117971117972117973117974117975117976117977117978117979117980117981117982117983117984117985117986117987117988117989117990117991117992117993117994117995117996117997117998117999118000118001118002118003118004118005118006118007118008118009118010118011118012118013118014118015118016118017118018118019118020118021118022118023118024118025118026118027118028118029118030118031118032118033118034118035118036118037118038118039118040118041118042118043118044118045118046118047118048118049118050118051118052118053118054118055118056118057118058118059118060118061118062118063118064118065118066118067118068118069118070118071118072118073118074118075118076118077118078118079118080118081118082118083118084118085118086118087118088118089118090118091118092118093118094118095118096118097118098118099118100118101118102118103118104118105118106118107118108118109118110118111118112118113118114118115118116118117118118118119118120118121118122118123118124118125118126118127118128118129118130118131118132118133118134118135118136118137118138118139118140118141118142118143118144118145118146118147118148118149118150118151118152118153118154118155118156118157118158118159118160118161118162118163118164118165118166118167118168118169118170118171118172118173118174118175118176118177118178118179118180118181118182118183118184118185118186118187118188118189118190118191118192118193118194118195118196118197118198118199118200118201118202118203118204118205118206118207118208118209118210118211118212118213118214118215118216118217118218118219118220118221118222118223118224118225118226118227118228118229118230118231118232118233118234118235118236118237118238118239118240118241118242118243118244118245118246118247118248118249118250118251118252118253118254118255118256118257118258118259118260118261118262118263118264118265118266118267118268118269118270118271118272118273118274118275118276118277118278118279118280118281118282118283118284118285118286118287118288118289118290118291118292118293118294118295118296118297118298118299118300118301118302118303118304118305118306118307118308118309118310118311118312118313118314118315118316118317118318118319118320118321118322118323118324118325118326118327118328118329118330118331118332118333118334118335118336118337118338118339118340118341118342118343118344118345118346118347118348118349118350118351118352118353118354118355118356118357118358118359118360118361118362118363118364118365118366118367118368118369118370118371118372118373118374118375118376118377118378118379118380118381118382118383118384118385118386118387118388118389118390118391118392118393118394118395118396118397118398118399118400118401118402118403118404118405118406118407118408118409118410118411118412118413118414118415118416118417118418118419118420118421118422118423118424118425118426118427118428118429118430118431118432118433118434118435118436118437118438118439118440118441118442118443118444118445118446118447118448118449118450118451118452118453118454118455118456118457118458118459118460118461118462118463118464118465118466118467118468118469118470118471118472118473118474118475118476118477118478118479118480118481118482118483118484118485118486118487118488118489118490118491118492118493118494118495118496118497118498118499118500118501118502118503118504118505118506118507118508118509118510118511118512118513118514118515118516118517118518118519118520118521118522118523118524118525118526118527118528118529118530118531118532118533118534118535118536118537118538118539118540118541118542118543118544118545118546118547118548118549118550118551118552118553118554118555118556118557118558118559118560118561118562118563118564118565118566118567118568118569118570118571118572118573118574118575118576118577118578118579118580118581118582118583118584118585118586118587118588118589118590118591118592118593118594118595118596118597118598118599118600118601118602118603118604118605118606118607118608118609118610118611118612118613118614118615118616118617118618118619118620118621118622118623118624118625118626118627118628118629118630118631118632118633118634118635118636118637118638118639118640118641118642118643118644118645118646118647118648118649118650118651118652118653118654118655118656118657118658118659118660118661118662118663118664118665118666118667118668118669118670118671118672118673118674118675118676118677118678118679118680118681118682118683118684118685118686118687118688118689118690118691118692118693118694118695118696118697118698118699118700118701118702118703118704118705118706118707118708118709118710118711118712118713118714118715118716118717118718118719118720118721118722118723118724118725118726118727118728118729118730118731118732118733118734118735118736118737118738118739118740118741118742118743118744118745118746118747118748118749118750118751118752118753118754118755118756118757118758118759118760118761118762118763118764118765118766118767118768118769118770118771118772118773118774118775118776118777118778118779118780118781118782118783118784118785118786118787118788118789118790118791118792118793118794118795118796118797118798118799118800118801118802118803118804118805118806118807118808118809118810118811118812118813118814118815118816118817118818118819118820118821118822118823118824118825118826118827118828118829118830118831118832118833118834118835118836118837118838118839118840118841118842118843118844118845118846118847118848118849118850118851118852118853118854118855118856118857118858118859118860118861118862118863118864118865118866118867118868118869118870118871118872118873118874118875118876118877118878118879118880118881118882118883118884118885118886118887118888118889118890118891118892118893118894118895118896118897118898118899118900118901118902118903118904118905118906118907118908118909118910118911118912118913118914118915118916118917118918118919118920118921118922118923118924118925118926118927118928118929118930118931118932118933118934118935118936118937118938118939118940118941118942118943118944118945118946118947118948118949118950118951118952118953118954118955118956118957118958118959118960118961118962118963118964118965118966118967118968118969118970118971118972118973118974118975118976118977118978118979118980118981118982118983118984118985118986118987118988118989118990118991118992118993118994118995118996118997118998118999119000119001119002119003119004119005119006119007119008119009119010119011119012119013119014119015119016119017119018119019119020119021119022119023119024119025119026119027119028119029119030119031119032119033119034119035119036119037119038119039119040119041119042119043119044119045119046119047119048119049119050119051119052119053119054119055119056119057119058119059119060119061119062119063119064119065119066119067119068119069119070119071119072119073119074119075119076119077119078119079119080119081119082119083119084119085119086119087119088119089119090119091119092119093119094119095119096119097119098119099119100119101119102119103119104119105119106119107119108119109119110119111119112119113119114119115119116119117119118119119119120119121119122119123119124119125119126119127119128119129119130119131119132119133119134119135119136119137119138119139119140119141119142119143119144119145119146119147119148119149119150119151119152119153119154119155119156119157119158119159119160119161119162119163119164119165119166119167119168119169119170119171119172119173119174119175119176119177119178119179119180119181119182119183119184119185119186119187119188119189119190119191119192119193119194119195119196119197119198119199119200119201119202119203119204119205119206119207119208119209119210119211119212119213119214119215119216119217119218119219119220119221119222119223119224119225119226119227119228119229119230119231119232119233119234119235119236119237119238119239119240119241119242119243119244119245119246119247119248119249119250119251119252119253119254119255119256119257119258119259119260119261119262119263119264119265119266119267119268119269119270119271119272119273119274119275119276119277119278119279119280119281119282119283119284119285119286119287119288119289119290119291119292119293119294119295119296119297119298119299119300119301119302119303119304119305119306119307119308119309119310119311119312119313119314119315119316119317119318119319119320119321119322119323119324119325119326119327119328119329119330119331119332119333119334119335119336119337119338119339119340119341119342119343119344119345119346119347119348119349119350119351119352119353119354119355119356119357119358119359119360119361119362119363119364119365119366119367119368119369119370119371119372119373119374119375119376119377119378119379119380119381119382119383119384119385119386119387119388119389119390119391119392119393119394119395119396119397119398119399119400119401119402119403119404119405119406119407119408119409119410119411119412119413119414119415119416119417119418119419119420119421119422119423119424119425119426119427119428119429119430119431119432119433119434119435119436119437119438119439119440119441119442119443119444119445119446119447119448119449119450119451119452119453119454119455119456119457119458119459119460119461119462119463119464119465119466119467119468119469119470119471119472119473119474119475119476119477119478119479119480119481119482119483119484119485119486119487119488119489119490119491119492119493119494119495119496119497119498119499119500119501119502119503119504119505119506119507119508119509119510119511119512119513119514119515119516119517119518119519119520119521119522119523119524119525119526119527119528119529119530119531119532119533119534119535119536119537119538119539119540119541119542119543119544119545119546119547119548119549119550119551119552119553119554119555119556119557119558119559119560119561119562119563119564119565119566119567119568119569119570119571119572119573119574119575119576119577119578119579119580119581119582119583119584119585119586119587119588119589119590119591119592119593119594119595119596119597119598119599119600119601119602119603119604119605119606119607119608119609119610119611119612119613119614119615119616119617119618119619119620119621119622119623119624119625119626119627119628119629119630119631119632119633119634119635119636119637119638119639119640119641119642119643119644119645119646119647119648119649119650119651119652119653119654119655119656119657119658119659119660119661119662119663119664119665119666119667119668119669119670119671119672119673119674119675119676119677119678119679119680119681119682119683119684119685119686119687119688119689119690119691119692119693119694119695119696119697119698119699119700119701119702119703119704119705119706119707119708119709119710119711119712119713119714119715119716119717119718119719119720119721119722119723119724119725119726119727119728119729119730119731119732119733119734119735119736119737119738119739119740119741119742119743119744119745119746119747119748119749119750119751119752119753119754119755119756119757119758119759119760119761119762119763119764119765119766119767119768119769119770119771119772119773119774119775119776119777119778119779119780119781119782119783119784119785119786119787119788119789119790119791119792119793119794119795119796119797119798119799119800119801119802119803119804119805119806119807119808119809119810119811119812119813119814119815119816119817119818119819119820119821119822119823119824119825119826119827119828119829119830119831119832119833119834119835119836119837119838119839119840119841119842119843119844119845119846119847119848119849119850119851119852119853119854119855119856119857119858119859119860119861119862119863119864119865119866119867119868119869119870119871119872119873119874119875119876119877119878119879119880119881119882119883119884119885119886119887119888119889119890119891119892119893119894119895119896119897119898119899119900119901119902119903119904119905119906119907119908119909119910119911119912119913119914119915119916119917119918119919119920119921119922119923119924119925119926119927119928119929119930119931119932119933119934119935119936119937119938119939119940119941119942119943119944119945119946119947119948119949119950119951119952119953119954119955119956119957119958119959119960119961119962119963119964119965119966119967119968119969119970119971119972119973119974119975119976119977119978119979119980119981119982119983119984119985119986119987119988119989119990119991119992119993119994119995119996119997119998119999120000120001120002120003120004120005120006120007120008120009120010120011120012120013120014120015120016120017120018120019120020120021120022120023120024120025120026120027120028120029120030120031120032120033120034120035120036120037120038120039120040120041120042120043120044120045120046120047120048120049120050120051120052120053120054120055120056120057120058120059120060120061120062120063120064120065120066120067120068120069120070120071120072120073120074120075120076120077120078120079120080120081120082120083120084120085120086120087120088120089120090120091120092120093120094120095120096120097120098120099120100120101120102120103120104120105120106120107120108120109120110120111120112120113120114120115120116120117120118120119120120120121120122120123120124120125120126120127120128120129120130120131120132120133120134120135120136120137120138120139120140120141120142120143120144120145120146120147120148120149120150120151120152120153120154120155120156120157120158120159120160120161120162120163120164120165120166120167120168120169120170120171120172120173120174120175120176120177120178120179120180120181120182120183120184120185120186120187120188120189120190120191120192120193120194120195120196120197120198120199120200120201120202120203120204120205120206120207120208120209120210120211120212120213120214120215120216120217120218120219120220120221120222120223120224120225120226120227120228120229120230120231120232120233120234120235120236120237120238120239120240120241120242120243120244120245120246120247120248120249120250120251120252120253120254120255120256120257120258120259120260120261120262120263120264120265120266120267120268120269120270120271120272120273120274120275120276120277120278120279120280120281120282120283120284120285120286120287120288120289120290120291120292120293120294120295120296120297120298120299120300120301120302120303120304120305120306120307120308120309120310120311120312120313120314120315120316120317120318120319120320120321120322120323120324120325120326120327120328120329120330120331120332120333120334120335120336120337120338120339120340120341120342120343120344120345120346120347120348120349120350120351120352120353120354120355120356120357120358120359120360120361120362120363120364120365120366120367120368120369120370120371120372120373120374120375120376120377120378120379120380120381120382120383120384120385120386120387120388120389120390120391120392120393120394120395120396120397120398120399120400120401120402120403120404120405120406120407120408120409120410120411120412120413120414120415120416120417120418120419120420120421120422120423120424120425120426120427120428120429120430120431120432120433120434120435120436120437120438120439120440120441120442120443120444120445120446120447120448120449120450120451120452120453120454120455120456120457120458120459120460120461120462120463120464120465120466120467120468120469120470120471120472120473120474120475120476120477120478120479120480120481120482120483120484120485120486120487120488120489120490120491120492120493120494120495120496120497120498120499120500120501120502120503120504120505120506120507120508120509120510120511120512120513120514120515120516120517120518120519120520120521120522120523120524120525120526120527120528120529120530120531120532120533120534120535120536120537120538120539120540120541120542120543120544120545120546120547120548120549120550120551120552120553120554120555120556120557120558120559120560120561120562120563120564120565120566120567120568120569120570120571120572120573120574120575120576120577120578120579120580120581120582120583120584120585120586120587120588120589120590120591120592120593120594120595120596120597120598120599120600120601120602120603120604120605120606120607120608120609120610120611120612120613120614120615120616120617120618120619120620120621120622120623120624120625120626120627120628120629120630120631120632120633120634120635120636120637120638120639120640120641120642120643120644120645120646120647120648120649120650120651120652120653120654120655120656120657120658120659120660120661120662120663120664120665120666120667120668120669120670120671120672120673120674120675120676120677120678120679120680120681120682120683120684120685120686120687120688120689120690120691120692120693120694120695120696120697120698120699120700120701120702120703120704120705120706120707120708120709120710120711120712120713120714120715120716120717120718120719120720120721120722120723120724120725120726120727120728120729120730120731120732120733120734120735120736120737120738120739120740120741120742120743120744120745120746120747120748120749120750120751120752120753120754120755120756120757120758120759120760120761120762120763120764120765120766120767120768120769120770120771120772120773120774120775120776120777120778120779120780120781120782120783120784120785120786120787120788120789120790120791120792120793120794120795120796120797120798120799120800120801120802120803120804120805120806120807120808120809120810120811120812120813120814120815120816120817120818120819120820120821120822120823120824120825120826120827120828120829120830120831120832120833120834120835120836120837120838120839120840120841120842120843120844120845120846120847120848120849120850120851120852120853120854120855120856120857120858120859120860120861120862120863120864120865120866120867120868120869120870120871120872120873120874120875120876120877120878120879120880120881120882120883120884120885120886120887120888120889120890120891120892120893120894120895120896120897120898120899120900120901120902120903120904120905120906120907120908120909120910120911120912120913120914120915120916120917120918120919120920120921120922120923120924120925120926120927120928120929120930120931120932120933120934120935120936120937120938120939120940120941120942120943120944120945120946120947120948120949120950120951120952120953120954120955120956120957120958120959120960120961120962120963120964120965120966120967120968120969120970120971120972120973120974120975120976120977120978120979120980120981120982120983120984120985120986120987120988120989120990120991120992120993120994120995120996120997120998120999121000121001121002121003121004121005121006121007121008121009121010121011121012121013121014121015121016121017121018121019121020121021121022121023121024121025121026121027121028121029121030121031121032121033121034121035121036121037121038121039121040121041121042121043121044121045121046121047121048121049121050121051121052121053121054121055121056121057121058121059121060121061121062121063121064121065121066121067121068121069121070121071121072121073121074121075121076121077121078121079121080121081121082121083121084121085121086121087121088121089121090121091121092121093121094121095121096121097121098121099121100121101121102121103121104121105121106121107121108121109121110121111121112121113121114121115121116121117121118121119121120121121121122121123121124121125121126121127121128121129121130121131121132121133121134121135121136121137121138121139121140121141121142121143121144121145121146121147121148121149121150121151121152121153121154121155121156121157121158121159121160121161121162121163121164121165121166121167121168121169121170121171121172121173121174121175121176121177121178121179121180121181121182121183121184121185121186121187121188121189121190121191121192121193121194121195121196121197121198121199121200121201121202121203121204121205121206121207121208121209121210121211121212121213121214121215121216121217121218121219121220121221121222121223121224121225121226121227121228121229121230121231121232121233121234121235121236121237121238121239121240121241121242121243121244121245121246121247121248121249121250121251121252121253121254121255121256121257121258121259121260121261121262121263121264121265121266121267121268121269121270121271121272121273121274121275121276121277121278121279121280121281121282121283121284121285121286121287121288121289121290121291121292121293121294121295121296121297121298121299121300121301121302121303121304121305121306121307121308121309121310121311121312121313121314121315121316121317121318121319121320121321121322121323121324121325121326121327121328121329121330121331121332121333121334121335121336121337121338121339121340121341121342121343121344121345121346121347121348121349121350121351121352121353121354121355121356121357121358121359121360121361121362121363121364121365121366121367121368121369121370121371121372121373121374121375121376121377121378121379121380121381121382121383121384121385121386121387121388121389121390121391121392121393121394121395121396121397121398121399121400121401121402121403121404121405121406121407121408121409121410121411121412121413121414121415121416121417121418121419121420121421121422121423121424121425121426121427121428121429121430121431121432121433121434121435121436121437121438121439121440121441121442121443121444121445121446121447121448121449121450121451121452121453121454121455121456121457121458121459121460121461121462121463121464121465121466121467121468121469121470121471121472121473121474121475121476121477121478121479121480121481121482121483121484121485121486121487121488121489121490121491121492121493121494121495121496121497121498121499121500121501121502121503121504121505121506121507121508121509121510121511121512121513121514121515121516121517121518121519121520121521121522121523121524121525121526121527121528121529121530121531121532121533121534121535121536121537121538121539121540121541121542121543121544121545121546121547121548121549121550121551121552121553121554121555121556121557121558121559121560121561121562121563121564121565121566121567121568121569121570121571121572121573121574121575121576121577121578121579121580121581121582121583121584121585121586121587121588121589121590121591121592121593121594121595121596121597121598121599121600121601121602121603121604121605121606121607121608121609121610121611121612121613121614121615121616121617121618121619121620121621121622121623121624121625121626121627121628121629121630121631121632121633121634121635121636121637121638121639121640121641121642121643121644121645121646121647121648121649121650121651121652121653121654121655121656121657121658121659121660121661121662121663121664121665121666121667121668121669121670121671121672121673121674121675121676121677121678121679121680121681121682121683121684121685121686121687121688121689121690121691121692121693121694121695121696121697121698121699121700121701121702121703121704121705121706121707121708121709121710121711121712121713121714121715121716121717121718121719121720121721121722121723121724121725121726121727121728121729121730121731121732121733121734121735121736121737121738121739121740121741121742121743121744121745121746121747121748121749121750121751121752121753121754121755121756121757121758121759121760121761121762121763121764121765121766121767121768121769121770121771121772121773121774121775121776121777121778121779121780121781121782121783121784121785121786121787121788121789121790121791121792121793121794121795121796121797121798121799121800121801121802121803121804121805121806121807121808121809121810121811121812121813121814121815121816121817121818121819121820121821121822121823121824121825121826121827121828121829121830121831121832121833121834121835121836121837121838121839121840121841121842121843121844121845121846121847121848121849121850121851121852121853121854121855121856121857121858121859121860121861121862121863121864121865121866121867121868121869121870121871121872121873121874121875121876121877121878121879121880121881121882121883121884121885121886121887121888121889121890121891121892121893121894121895121896121897121898121899121900121901121902121903121904121905121906121907121908121909121910121911121912121913121914121915121916121917121918121919121920121921121922121923121924121925121926121927121928121929121930121931121932121933121934121935121936121937121938121939121940121941121942121943121944121945121946121947121948121949121950121951121952121953121954121955121956121957121958121959121960121961121962121963121964121965121966121967121968121969121970121971121972121973121974121975121976121977121978121979121980121981121982121983121984121985121986121987121988121989121990121991121992121993121994121995121996121997121998121999122000122001122002122003122004122005122006122007122008122009122010122011122012122013122014122015122016122017122018122019122020122021122022122023122024122025122026122027122028122029122030122031122032122033122034122035122036122037122038122039122040122041122042122043122044122045122046122047122048122049122050122051122052122053122054122055122056122057122058122059122060122061122062122063122064122065122066122067122068122069122070122071122072122073122074122075122076122077122078122079122080122081122082122083122084122085122086122087122088122089122090122091122092122093122094122095122096122097122098122099122100122101122102122103122104122105122106122107122108122109122110122111122112122113122114122115122116122117122118122119122120122121122122122123122124122125122126122127122128122129122130122131122132122133122134122135122136122137122138122139122140122141122142122143122144122145122146122147122148122149122150122151122152122153122154122155122156122157122158122159122160122161122162122163122164122165122166122167122168122169122170122171122172122173122174122175122176122177122178122179122180122181122182122183122184122185122186122187122188122189122190122191122192122193122194122195122196122197122198122199122200122201122202122203122204122205122206122207122208122209122210122211122212122213122214122215122216122217122218122219122220122221122222122223122224122225122226122227122228122229122230122231122232122233122234122235122236122237122238122239122240122241122242122243122244122245122246122247122248122249122250122251122252122253122254122255122256122257122258122259122260122261122262122263122264122265122266122267122268122269122270122271122272122273122274122275122276122277122278122279122280122281122282122283122284122285122286122287122288122289122290122291122292122293122294122295122296122297122298122299122300122301122302122303122304122305122306122307122308122309122310122311122312122313122314122315122316122317122318122319122320122321122322122323122324122325122326122327122328122329122330122331122332122333122334122335122336122337122338122339122340122341122342122343122344122345122346122347122348122349122350122351122352122353122354122355122356122357122358122359122360122361122362122363122364122365122366122367122368122369122370122371122372122373122374122375122376122377122378122379122380122381122382122383122384122385122386122387122388122389122390122391122392122393122394122395122396122397122398122399122400122401122402122403122404122405122406122407122408122409122410122411122412122413122414122415122416122417122418122419122420122421122422122423122424122425122426122427122428122429122430122431122432122433122434122435122436122437122438122439122440122441122442122443122444122445122446122447122448122449122450122451122452122453122454122455122456122457122458122459122460122461122462122463122464122465122466122467122468122469122470122471122472122473122474122475122476122477122478122479122480122481122482122483122484122485122486122487122488122489122490122491122492122493122494122495122496122497122498122499122500122501122502122503122504122505122506122507122508122509122510122511122512122513122514122515122516122517122518122519122520122521122522122523122524122525122526122527122528122529122530122531122532122533122534122535122536122537122538122539122540122541122542122543122544122545122546122547122548122549122550122551122552122553122554122555122556122557122558122559122560122561122562122563122564122565122566122567122568122569122570122571122572122573122574122575122576122577122578122579122580122581122582122583122584122585122586122587122588122589122590122591122592122593122594122595122596122597122598122599122600122601122602122603122604122605122606122607122608122609122610122611122612122613122614122615122616122617122618122619122620122621122622122623122624122625122626122627122628122629122630122631122632122633122634122635122636122637122638122639122640122641122642122643122644122645122646122647122648122649122650122651122652122653122654122655122656122657122658122659122660122661122662122663122664122665122666122667122668122669122670122671122672122673122674122675122676122677122678122679122680122681122682122683122684122685122686122687122688122689122690122691122692122693122694122695122696122697122698122699122700122701122702122703122704122705122706122707122708122709122710122711122712122713122714122715122716122717122718122719122720122721122722122723122724122725122726122727122728122729122730122731122732122733122734122735122736122737122738122739122740122741122742122743122744122745122746122747122748122749122750122751122752122753122754122755122756122757122758122759122760122761122762122763122764122765122766122767122768122769122770122771122772122773122774122775122776122777122778122779122780122781122782122783122784122785122786122787122788122789122790122791122792122793122794122795122796122797122798122799122800122801122802122803122804122805122806122807122808122809122810122811122812122813122814122815122816122817122818122819122820122821122822122823122824122825122826122827122828122829122830122831122832122833122834122835122836122837122838122839122840122841122842122843122844122845122846122847122848122849122850122851122852122853122854122855122856122857122858122859122860122861122862122863122864122865122866122867122868122869122870122871122872122873122874122875122876122877122878122879122880122881122882122883122884122885122886122887122888122889122890122891122892122893122894122895122896122897122898122899122900122901122902122903122904122905122906122907122908122909122910122911122912122913122914122915122916122917122918122919122920122921122922122923122924122925122926122927122928122929122930122931122932122933122934122935122936122937122938122939122940122941122942122943122944122945122946122947122948122949122950122951122952122953122954122955122956122957122958122959122960122961122962122963122964122965122966122967122968122969122970122971122972122973122974122975122976122977122978122979122980122981122982122983122984122985122986122987122988122989122990122991122992122993122994122995122996122997122998122999123000123001123002123003123004123005123006123007123008123009123010123011123012123013123014123015123016123017123018123019123020123021123022123023123024123025123026123027123028123029123030123031123032123033123034123035123036123037123038123039123040123041123042123043123044123045123046123047123048123049123050123051123052123053123054123055123056123057123058123059123060123061123062123063123064123065123066123067123068123069123070123071123072123073123074123075123076123077123078123079123080123081123082123083123084123085123086123087123088123089123090123091123092123093123094123095123096123097123098123099123100123101123102123103123104123105123106123107123108123109123110123111123112123113123114123115123116123117123118123119123120123121123122123123123124123125123126123127123128123129123130123131123132123133123134123135123136123137123138123139123140123141123142123143123144123145123146123147123148123149123150123151123152123153123154123155123156123157123158123159123160123161123162123163123164123165123166123167123168123169123170123171123172123173123174123175123176123177123178123179123180123181123182123183123184123185123186123187123188123189123190123191123192123193123194123195123196123197123198123199123200123201123202123203123204123205123206123207123208123209123210123211123212123213123214123215123216123217123218123219123220123221123222123223123224123225123226123227123228123229123230123231123232123233123234123235123236123237123238123239123240123241123242123243123244123245123246123247123248123249123250123251123252123253123254123255123256123257123258123259123260123261123262123263123264123265123266123267123268123269123270123271123272123273123274123275123276123277123278123279123280123281123282123283123284123285123286123287123288123289123290123291123292123293123294123295123296123297123298123299123300123301123302123303123304123305123306123307123308123309123310123311123312123313123314123315123316123317123318123319123320123321123322123323123324123325123326123327123328123329123330123331123332123333123334123335123336123337123338123339123340123341123342123343123344123345123346123347123348123349123350123351123352123353123354123355123356123357123358123359123360123361123362123363123364123365123366123367123368123369123370123371123372123373123374123375123376123377123378123379123380123381123382123383123384123385123386123387123388123389123390123391123392123393123394123395123396123397123398123399123400123401123402123403123404123405123406123407123408123409123410123411123412123413123414123415123416123417123418123419123420123421123422123423123424123425123426123427123428123429123430123431123432123433123434123435123436123437123438123439123440123441123442123443123444123445123446123447123448123449123450123451123452123453123454123455123456123457123458123459123460123461123462123463123464123465123466123467123468123469123470123471123472123473123474123475123476123477123478123479123480123481123482123483123484123485123486123487123488123489123490123491123492123493123494123495123496123497123498123499123500123501123502123503123504123505123506123507123508123509123510123511123512123513123514123515123516123517123518123519123520123521123522123523123524123525123526123527123528123529123530123531123532123533123534123535123536123537123538123539123540123541123542123543123544123545123546123547123548123549123550123551123552123553123554123555123556123557123558123559123560123561123562123563123564123565123566123567123568123569123570123571123572123573123574123575123576123577123578123579123580123581123582123583123584123585123586123587123588123589123590123591123592123593123594123595123596123597123598123599123600123601123602123603123604123605123606123607123608123609123610123611123612123613123614123615123616123617123618123619123620123621123622123623123624123625123626123627123628123629123630123631123632123633123634123635123636123637123638123639123640123641123642123643123644123645123646123647123648123649123650123651123652123653123654123655123656123657123658123659123660123661123662123663123664123665123666123667123668123669123670123671123672123673123674123675123676123677123678123679123680123681123682123683123684123685123686123687123688123689123690123691123692123693123694123695123696123697123698123699123700123701123702123703123704123705123706123707123708123709123710123711123712123713123714123715123716123717123718123719123720123721123722123723123724123725123726123727123728123729123730123731123732123733123734123735123736123737123738123739123740123741123742123743123744123745123746123747123748123749123750123751123752123753123754123755123756123757123758123759123760123761123762123763123764123765123766123767123768123769123770123771123772123773123774123775123776123777123778123779123780123781123782123783123784123785123786123787123788123789123790123791123792123793123794123795123796123797123798123799123800123801123802123803123804123805123806123807123808123809123810123811123812123813123814123815123816123817123818123819123820123821123822123823123824123825123826123827123828123829123830123831123832123833123834123835123836123837123838123839123840123841123842123843123844123845123846123847123848123849123850123851123852123853123854123855123856123857123858123859123860123861123862123863123864123865123866123867123868123869123870123871123872123873123874123875123876123877123878123879123880123881123882123883123884123885123886123887123888123889123890123891123892123893123894123895123896123897123898123899123900123901123902123903123904123905123906123907123908123909123910123911123912123913123914123915123916123917123918123919123920123921123922123923123924123925123926123927123928123929123930123931123932123933123934123935123936123937123938123939123940123941123942123943123944123945123946123947123948123949123950123951123952123953123954123955123956123957123958123959123960123961123962123963123964123965123966123967123968123969123970123971123972123973123974123975123976123977123978123979123980123981123982123983123984123985123986123987123988123989123990123991123992123993123994123995123996123997123998123999124000124001124002124003124004124005124006124007124008124009124010124011124012124013124014124015124016124017124018124019124020124021124022124023124024124025124026124027124028124029124030124031124032124033124034124035124036124037124038124039124040124041124042124043124044124045124046124047124048124049124050124051124052124053124054124055124056124057124058124059124060124061124062124063124064124065124066124067124068124069124070124071124072124073124074124075124076124077124078124079124080124081124082124083124084124085124086124087124088124089124090124091124092124093124094124095124096124097124098124099124100124101124102124103124104124105124106124107124108124109124110124111124112124113124114124115124116124117124118124119124120124121124122124123124124124125124126124127124128124129124130124131124132124133124134124135124136124137124138124139124140124141124142124143124144124145124146124147124148124149124150124151124152124153124154124155124156124157124158124159124160124161124162124163124164124165124166124167124168124169124170124171124172124173124174124175124176124177124178124179124180124181124182124183124184124185124186124187124188124189124190124191124192124193124194124195124196124197124198124199124200124201124202124203124204124205124206124207124208124209124210124211124212124213124214124215124216124217124218124219124220124221124222124223124224124225124226124227124228124229124230124231124232124233124234124235124236124237124238124239124240124241124242124243124244124245124246124247124248124249124250124251124252124253124254124255124256124257124258124259124260124261124262124263124264124265124266124267124268124269124270124271124272124273124274124275124276124277124278124279124280124281124282124283124284124285124286124287124288124289124290124291124292124293124294124295124296124297124298124299124300124301124302124303124304124305124306124307124308124309124310124311124312124313124314124315124316124317124318124319124320124321124322124323124324124325124326124327124328124329124330124331124332124333124334124335124336124337124338124339124340124341124342124343124344124345124346124347124348124349124350124351124352124353124354124355124356124357124358124359124360124361124362124363124364124365124366124367124368124369124370124371124372124373124374124375124376124377124378124379124380124381124382124383124384124385124386124387124388124389124390124391124392124393124394124395124396124397124398124399124400124401124402124403124404124405124406124407124408124409124410124411124412124413124414124415124416124417124418124419124420124421124422124423124424124425124426124427124428124429124430124431124432124433124434124435124436124437124438124439124440124441124442124443124444124445124446124447124448124449124450124451124452124453124454124455124456124457124458124459124460124461124462124463124464124465124466124467124468124469124470124471124472124473124474124475124476124477124478124479124480124481124482124483124484124485124486124487124488124489124490124491124492124493124494124495124496124497124498124499124500124501124502124503124504124505124506124507124508124509124510124511124512124513124514124515124516124517124518124519124520124521124522124523124524124525124526124527124528124529124530124531124532124533124534124535124536124537124538124539124540124541124542124543124544124545124546124547124548124549124550124551124552124553124554124555124556124557124558124559124560124561124562124563124564124565124566124567124568124569124570124571124572124573124574124575124576124577124578124579124580124581124582124583124584124585124586124587124588124589124590124591124592124593124594124595124596124597124598124599124600124601124602124603124604124605124606124607124608124609124610124611124612124613124614124615124616124617124618124619124620124621124622124623124624124625124626124627124628124629124630124631124632124633124634124635124636124637124638124639124640124641124642124643124644124645124646124647124648124649124650124651124652124653124654124655124656124657124658124659124660124661124662124663124664124665124666124667124668124669124670124671124672124673124674124675124676124677124678124679124680124681124682124683124684124685124686124687124688124689124690124691124692124693124694124695124696124697124698124699124700124701124702124703124704124705124706124707124708124709124710124711124712124713124714124715124716124717124718124719124720124721124722124723124724124725124726124727124728124729124730124731124732124733124734124735124736124737124738124739124740124741124742124743124744124745124746124747124748124749124750124751124752124753124754124755124756124757124758124759124760124761124762124763124764124765124766124767124768124769124770124771124772124773124774124775124776124777124778124779124780124781124782124783124784124785124786124787124788124789124790124791124792124793124794124795124796124797124798124799124800124801124802124803124804124805124806124807124808124809124810124811124812124813124814124815124816124817124818124819124820124821124822124823124824124825124826124827124828124829124830124831124832124833124834124835124836124837124838124839124840124841124842124843124844124845124846124847124848124849124850124851124852124853124854124855124856124857124858124859124860124861124862124863124864124865124866124867124868124869124870124871124872124873124874124875124876124877124878124879124880124881124882124883124884124885124886124887124888124889124890124891124892124893124894124895124896124897124898124899124900124901124902124903124904124905124906124907124908124909124910124911124912124913124914124915124916124917124918124919124920124921124922124923124924124925124926124927124928124929124930124931124932124933124934124935124936124937124938124939124940124941124942124943124944124945124946124947124948124949124950124951124952124953124954124955124956124957124958124959124960124961124962124963124964124965124966124967124968124969124970124971124972124973124974124975124976124977124978124979124980124981124982124983124984124985124986124987124988124989124990124991124992124993124994124995124996124997124998124999125000125001125002125003125004125005125006125007125008125009125010125011125012125013125014125015125016125017125018125019125020125021125022125023125024125025125026125027125028125029125030125031125032125033125034125035125036125037125038125039125040125041125042125043125044125045125046125047125048125049125050125051125052125053125054125055125056125057125058125059125060125061125062125063125064125065125066125067125068125069125070125071125072125073125074125075125076125077125078125079125080125081125082125083125084125085125086125087125088125089125090125091125092125093125094125095125096125097125098125099125100125101125102125103125104125105125106125107125108125109125110125111125112125113125114125115125116125117125118125119125120125121125122125123125124125125125126125127125128125129125130125131125132125133125134125135125136125137125138125139125140125141125142125143125144125145125146125147125148125149125150125151125152125153125154125155125156125157125158125159125160125161125162125163125164125165125166125167125168125169125170125171125172125173125174125175125176125177125178125179125180125181125182125183125184125185125186125187125188125189125190125191125192125193125194125195125196125197125198125199125200125201125202125203125204125205125206125207125208125209125210125211125212125213125214125215125216125217125218125219125220125221125222125223125224125225125226125227125228125229125230125231125232125233125234125235125236125237125238125239125240125241125242125243125244125245125246125247125248125249125250125251125252125253125254125255125256125257125258125259125260125261125262125263125264125265125266125267125268125269125270125271125272125273125274125275125276125277125278125279125280125281125282125283125284125285125286125287125288125289125290125291125292125293125294125295125296125297125298125299125300125301125302125303125304125305125306125307125308125309125310125311125312125313125314125315125316125317125318125319125320125321125322125323125324125325125326125327125328125329125330125331125332125333125334125335125336125337125338125339125340125341125342125343125344125345125346125347125348125349125350125351125352125353125354125355125356125357125358125359125360125361125362125363125364125365125366125367125368125369125370125371125372125373125374125375125376125377125378125379125380125381125382125383125384125385125386125387125388125389125390125391125392125393125394125395125396125397125398125399125400125401125402125403125404125405125406125407125408125409125410125411125412125413125414125415125416125417125418125419125420125421125422125423125424125425125426125427125428125429125430125431125432125433125434125435125436125437125438125439125440125441125442125443125444125445125446125447125448125449125450125451125452125453125454125455125456125457125458125459125460125461125462125463125464125465125466125467125468125469125470125471125472125473125474125475125476125477125478125479125480125481125482125483125484125485125486125487125488125489125490125491125492125493125494125495125496125497125498125499125500125501125502125503125504125505125506125507125508125509125510125511125512125513125514125515125516125517125518125519125520125521125522125523125524125525125526125527125528125529125530125531125532125533125534125535125536125537125538125539125540125541125542125543125544125545125546125547125548125549125550125551125552125553125554125555125556125557125558125559125560125561125562125563125564125565125566125567125568125569125570125571125572125573125574125575125576125577125578125579125580125581125582125583125584125585125586125587125588125589125590125591125592125593125594125595125596125597125598125599125600125601125602125603125604125605125606125607125608125609125610125611125612125613125614125615125616125617125618125619125620125621125622125623125624125625125626125627125628125629125630125631125632125633125634125635125636125637125638125639125640125641125642125643125644125645125646125647125648125649125650125651125652125653125654125655125656125657125658125659125660125661125662125663125664125665125666125667125668125669125670125671125672125673125674125675125676125677125678125679125680125681125682125683125684125685125686125687125688125689125690125691125692125693125694125695125696125697125698125699125700125701125702125703125704125705125706125707125708125709125710125711125712125713125714125715125716125717125718125719125720125721125722125723125724125725125726125727125728125729125730125731125732125733125734125735125736125737125738125739125740125741125742125743125744125745125746125747125748125749125750125751125752125753125754125755125756125757125758125759125760125761125762125763125764125765125766125767125768125769125770125771125772125773125774125775125776125777125778125779125780125781125782125783125784125785125786125787125788125789125790125791125792125793125794125795125796125797125798125799125800125801125802125803125804125805125806125807125808125809125810125811125812125813125814125815125816125817125818125819125820125821125822125823125824125825125826125827125828125829125830125831125832125833125834125835125836125837125838125839125840125841125842125843125844125845125846125847125848125849125850125851125852125853125854125855125856125857125858125859125860125861125862125863125864125865125866125867125868125869125870125871125872125873125874125875125876125877125878125879125880125881125882125883125884125885125886125887125888125889125890125891125892125893125894125895125896125897125898125899125900125901125902125903125904125905125906125907125908125909125910125911125912125913125914125915125916125917125918125919125920125921125922125923125924125925125926125927125928125929125930125931125932125933125934125935125936125937125938125939125940125941125942125943125944125945125946125947125948125949125950125951125952125953125954125955125956125957125958125959125960125961125962125963125964125965125966125967125968125969125970125971125972125973125974125975125976125977125978125979125980125981125982125983125984125985125986125987125988125989125990125991125992125993125994125995125996125997125998125999126000126001126002126003126004126005126006126007126008126009126010126011126012126013126014126015126016126017126018126019126020126021126022126023126024126025126026126027126028126029126030126031126032126033126034126035126036126037126038126039126040126041126042126043126044126045126046126047126048126049126050126051126052126053126054126055126056126057126058126059126060126061126062126063126064126065126066126067126068126069126070126071126072126073126074126075126076126077126078126079126080126081126082126083126084126085126086126087126088126089126090126091126092126093126094126095126096126097126098126099126100126101126102126103126104126105126106126107126108126109126110126111126112126113126114126115126116126117126118126119126120126121126122126123126124126125126126126127126128126129126130126131126132126133126134126135126136126137126138126139126140126141126142126143126144126145126146126147126148126149126150126151126152126153126154126155126156126157126158126159126160126161126162126163126164126165126166126167126168126169126170126171126172126173126174126175126176126177126178126179126180126181126182126183126184126185126186126187126188126189126190126191126192126193126194126195126196126197126198126199126200126201126202126203126204126205126206126207126208126209126210126211126212126213126214126215126216126217126218126219126220126221126222126223126224126225126226126227126228126229126230126231126232126233126234126235126236126237126238126239126240126241126242126243126244126245126246126247126248126249126250126251126252126253126254126255126256126257126258126259126260126261126262126263126264126265126266126267126268126269126270126271126272126273126274126275126276126277126278126279126280126281126282126283126284126285126286126287126288126289126290126291126292126293126294126295126296126297126298126299126300126301126302126303126304126305126306126307126308126309126310126311126312126313126314126315126316126317126318126319126320126321126322126323126324126325126326126327126328126329126330126331126332126333126334126335126336126337126338126339126340126341126342126343126344126345126346126347126348126349126350126351126352126353126354126355126356126357126358126359126360126361126362126363126364126365126366126367126368126369126370126371126372126373126374126375126376126377126378126379126380126381126382126383126384126385126386126387126388126389126390126391126392126393126394126395126396126397126398126399126400126401126402126403126404126405126406126407126408126409126410126411126412126413126414126415126416126417126418126419126420126421126422126423126424126425126426126427126428126429126430126431126432126433126434126435126436126437126438126439126440126441126442126443126444126445126446126447126448126449126450126451126452126453126454126455126456126457126458126459126460126461126462126463126464126465126466126467126468126469126470126471126472126473126474126475126476126477126478126479126480126481126482126483126484126485126486126487126488126489126490126491126492126493126494126495126496126497126498126499126500126501126502126503126504126505126506126507126508126509126510126511126512126513126514126515126516126517126518126519126520126521126522126523126524126525126526126527126528126529126530126531126532126533126534126535126536126537126538126539126540126541126542126543126544126545126546126547126548126549126550126551126552126553126554126555126556126557126558126559126560126561126562126563126564126565126566126567126568126569126570126571126572126573126574126575126576126577126578126579126580126581126582126583126584126585126586126587126588126589126590126591126592126593126594126595126596126597126598126599126600126601126602126603126604126605126606126607126608126609126610126611126612126613126614126615126616126617126618126619126620126621126622126623126624126625126626126627126628126629126630126631126632126633126634126635126636126637126638126639126640126641126642126643126644126645126646126647126648126649126650126651126652126653126654126655126656126657126658126659126660126661126662126663126664126665126666126667126668126669126670126671126672126673126674126675126676126677126678126679126680126681126682126683126684126685126686126687126688126689126690126691126692126693126694126695126696126697126698126699126700126701126702126703126704126705126706126707126708126709126710126711126712126713126714126715126716126717126718126719126720126721126722126723126724126725126726126727126728126729126730126731126732126733126734126735126736126737126738126739126740126741126742126743126744126745126746126747126748126749126750126751126752126753126754126755126756126757126758126759126760126761126762126763126764126765126766126767126768126769126770126771126772126773126774126775126776126777126778126779126780126781126782126783126784126785126786126787126788126789126790126791126792126793126794126795126796126797126798126799126800126801126802126803126804126805126806126807126808126809126810126811126812126813126814126815126816126817126818126819126820126821126822126823126824126825126826126827126828126829126830126831126832126833126834126835126836126837126838126839126840126841126842126843126844126845126846126847126848126849126850126851126852126853126854126855126856126857126858126859126860126861126862126863126864126865126866126867126868126869126870126871126872126873126874126875126876126877126878126879126880126881126882126883126884126885126886126887126888126889126890126891126892126893126894126895126896126897126898126899126900126901126902126903126904126905126906126907126908126909126910126911126912126913126914126915126916126917126918126919126920126921126922126923126924126925126926126927126928126929126930126931126932126933126934126935126936126937126938126939126940126941126942126943126944126945126946126947126948126949126950126951126952126953126954126955126956126957126958126959126960126961126962126963126964126965126966126967126968126969126970126971126972126973126974126975126976126977126978126979126980126981126982126983126984126985126986126987126988126989126990126991126992126993126994126995126996126997126998126999127000127001127002127003127004127005127006127007127008127009127010127011127012127013127014127015127016127017127018127019127020127021127022127023127024127025127026127027127028127029127030127031127032127033127034127035127036127037127038127039127040127041127042127043127044127045127046127047127048127049127050127051127052127053127054127055127056127057127058127059127060127061127062127063127064127065127066127067127068127069127070127071127072127073127074127075127076127077127078127079127080127081127082127083127084127085127086127087127088127089127090127091127092127093127094127095127096127097127098127099127100127101127102127103127104127105127106127107127108127109127110127111127112127113127114127115127116127117127118127119127120127121127122127123127124127125127126127127127128127129127130127131127132127133127134127135127136127137127138127139127140127141127142127143127144127145127146127147127148127149127150127151127152127153127154127155127156127157127158127159127160127161127162127163127164127165127166127167127168127169127170127171127172127173127174127175127176127177127178127179127180127181127182127183127184127185127186127187127188127189127190127191127192127193127194127195127196127197127198127199127200127201127202127203127204127205127206127207127208127209127210127211127212127213127214127215127216127217127218127219127220127221127222127223127224127225127226127227127228127229127230127231127232127233127234127235127236127237127238127239127240127241127242127243127244127245127246127247127248127249127250127251127252127253127254127255127256127257127258127259127260127261127262127263127264127265127266127267127268127269127270127271127272127273127274127275127276127277127278127279127280127281127282127283127284127285127286127287127288127289127290127291127292127293127294127295127296127297127298127299127300127301127302127303127304127305127306127307127308127309127310127311127312127313127314127315127316127317127318127319127320127321127322127323127324127325127326127327127328127329127330127331127332127333127334127335127336127337127338127339127340127341127342127343127344127345127346127347127348127349127350127351127352127353127354127355127356127357127358127359127360127361127362127363127364127365127366127367127368127369127370127371127372127373127374127375127376127377127378127379127380127381127382127383127384127385127386127387127388127389127390127391127392127393127394127395127396127397127398127399127400127401127402127403127404127405127406127407127408127409127410127411127412127413127414127415127416127417127418127419127420127421127422127423127424127425127426127427127428127429127430127431127432127433127434127435127436127437127438127439127440127441127442127443127444127445127446127447127448127449127450127451127452127453127454127455127456127457127458127459127460127461127462127463127464127465127466127467127468127469127470127471127472127473127474127475127476127477127478127479127480127481127482127483127484127485127486127487127488127489127490127491127492127493127494127495127496127497127498127499127500127501127502127503127504127505127506127507127508127509127510127511127512127513127514127515127516127517127518127519127520127521127522127523127524127525127526127527127528127529127530127531127532127533127534127535127536127537127538127539127540127541127542127543127544127545127546127547127548127549127550127551127552127553127554127555127556127557127558127559127560127561127562127563127564127565127566127567127568127569127570127571127572127573127574127575127576127577127578127579127580127581127582127583127584127585127586127587127588127589127590127591127592127593127594127595127596127597127598127599127600127601127602127603127604127605127606127607127608127609127610127611127612127613127614127615127616127617127618127619127620127621127622127623127624127625127626127627127628127629127630127631127632127633127634127635127636127637127638127639127640127641127642127643127644127645127646127647127648127649127650127651127652127653127654127655127656127657127658127659127660127661127662127663127664127665127666127667127668127669127670127671127672127673127674127675127676127677127678127679127680127681127682127683127684127685127686127687127688127689127690127691127692127693127694127695127696127697127698127699127700127701127702127703127704127705127706127707127708127709127710127711127712127713127714127715127716127717127718127719127720127721127722127723127724127725127726127727127728127729127730127731127732127733127734127735127736127737127738127739127740127741127742127743127744127745127746127747127748127749127750127751127752127753127754127755127756127757127758127759127760127761127762127763127764127765127766127767127768127769127770127771127772127773127774127775127776127777127778127779127780127781127782127783127784127785127786127787127788127789127790127791127792127793127794127795127796127797127798127799127800127801127802127803127804127805127806127807127808127809127810127811127812127813127814127815127816127817127818127819127820127821127822127823127824127825127826127827127828127829127830127831127832127833127834127835127836127837127838127839127840127841127842127843127844127845127846127847127848127849127850127851127852127853127854127855127856127857127858127859127860127861127862127863127864127865127866127867127868127869127870127871127872127873127874127875127876127877127878127879127880127881127882127883127884127885127886127887127888127889127890127891127892127893127894127895127896127897127898127899127900127901127902127903127904127905127906127907127908127909127910127911127912127913127914127915127916127917127918127919127920127921127922127923127924127925127926127927127928127929127930127931127932127933127934127935127936127937127938127939127940127941127942127943127944127945127946127947127948127949127950127951127952127953127954127955127956127957127958127959127960127961127962127963127964127965127966127967127968127969127970127971127972127973127974127975127976127977127978127979127980127981127982127983127984127985127986127987127988127989127990127991127992127993127994127995127996127997127998127999128000128001128002128003128004128005128006128007128008128009128010128011128012128013128014128015128016128017128018128019128020128021128022128023128024128025128026128027128028128029128030128031128032128033128034128035128036128037128038128039128040128041128042128043128044128045128046128047128048128049128050128051128052128053128054128055128056128057128058128059128060128061128062128063128064128065128066128067128068128069128070128071128072128073128074128075128076128077128078128079128080128081128082128083128084128085128086128087128088128089128090128091128092128093128094128095128096128097128098128099128100128101128102128103128104128105128106128107128108128109128110128111128112128113128114128115128116128117128118128119128120128121128122128123128124128125128126128127128128128129128130128131128132128133128134128135128136128137128138128139128140128141128142128143128144128145128146128147128148128149128150128151128152128153128154128155128156128157128158128159128160128161128162128163128164128165128166128167128168128169128170128171128172128173128174128175128176128177128178128179128180128181128182128183128184128185128186128187128188128189128190128191128192128193128194128195128196128197128198128199128200128201128202128203128204128205128206128207128208128209128210128211128212128213128214128215128216128217128218128219128220128221128222128223128224128225128226128227128228128229128230128231128232128233128234128235128236128237128238128239128240128241128242128243128244128245128246128247128248128249128250128251128252128253128254128255128256128257128258128259128260128261128262128263128264128265128266128267128268128269128270128271128272128273128274128275128276128277128278128279128280128281128282128283128284128285128286128287128288128289128290128291128292128293128294128295128296128297128298128299128300128301128302128303128304128305128306128307128308128309128310128311128312128313128314128315128316128317128318128319128320128321128322128323128324128325128326128327128328128329128330128331128332128333128334128335128336128337128338128339128340128341128342128343128344128345128346128347128348128349128350128351128352128353128354128355128356128357128358128359128360128361128362128363128364128365128366128367128368128369128370128371128372128373128374128375128376128377128378128379128380128381128382128383128384128385128386128387128388128389128390128391128392128393128394128395128396128397128398128399128400128401128402128403128404128405128406128407128408128409128410128411128412128413128414128415128416128417128418128419128420128421128422128423128424128425128426128427128428128429128430128431128432128433128434128435128436128437128438128439128440128441128442128443128444128445128446128447128448128449128450128451128452128453128454128455128456128457128458128459128460128461128462128463128464128465128466128467128468128469128470128471128472128473128474128475128476128477128478128479128480128481128482128483128484128485128486128487128488128489128490128491128492128493128494128495128496128497128498128499128500128501128502128503128504128505128506128507128508128509128510128511128512128513128514128515128516128517128518128519128520128521128522128523128524128525128526128527128528128529128530128531128532128533128534128535128536128537128538128539128540128541128542128543128544128545128546128547128548128549128550128551128552128553128554128555128556128557128558128559128560128561128562128563128564128565128566128567128568128569128570128571128572128573128574128575128576128577128578128579128580128581128582128583128584128585128586128587128588128589128590128591128592128593128594128595128596128597128598128599128600128601128602128603128604128605128606128607128608128609128610128611128612128613128614128615128616128617128618128619128620128621128622128623128624128625128626128627128628128629128630128631128632128633128634128635128636128637128638128639128640128641128642128643128644128645128646128647128648128649128650128651128652128653128654128655128656128657128658128659128660128661128662128663128664128665128666128667128668128669128670128671128672128673128674128675128676128677128678128679128680128681128682128683128684128685128686128687128688128689128690128691128692128693128694128695128696128697128698128699128700128701128702128703128704128705128706128707128708128709128710128711128712128713128714128715128716128717128718128719128720128721128722128723128724128725128726128727128728128729128730128731128732128733128734128735128736128737128738128739128740128741128742128743128744128745128746128747128748128749128750128751128752128753128754128755128756128757128758128759128760128761128762128763128764128765128766128767128768128769128770128771128772128773128774128775128776128777128778128779128780128781128782128783128784128785128786128787128788128789128790128791128792128793128794128795128796128797128798128799128800128801128802128803128804128805128806128807128808128809128810128811128812128813128814128815128816128817128818128819128820128821128822128823128824128825128826128827128828128829128830128831128832128833128834128835128836128837128838128839128840128841128842128843128844128845128846128847128848128849128850128851128852128853128854128855128856128857128858128859128860128861128862128863128864128865128866128867128868128869128870128871128872128873128874128875128876128877128878128879128880128881128882128883128884128885128886128887128888128889128890128891128892128893128894128895128896128897128898128899128900128901128902128903128904128905128906128907128908128909128910128911128912128913128914128915128916128917128918128919128920128921128922128923128924128925128926128927128928128929128930128931128932128933128934128935128936128937128938128939128940128941128942128943128944128945128946128947128948128949128950128951128952128953128954128955128956128957128958128959128960128961128962128963128964128965128966128967128968128969128970128971128972128973128974128975128976128977128978128979128980128981128982128983128984128985128986128987128988128989128990128991128992128993128994128995128996128997128998128999129000129001129002129003129004129005129006129007129008129009129010129011129012129013129014129015129016129017129018129019129020129021129022129023129024129025129026129027129028129029129030129031129032129033129034129035129036129037129038129039129040129041129042129043129044129045129046129047129048129049129050129051129052129053129054129055129056129057129058129059129060129061129062129063129064129065129066129067129068129069129070129071129072129073129074129075129076129077129078129079129080129081129082129083129084129085129086129087129088129089129090129091129092129093129094129095129096129097129098129099129100129101129102129103129104129105129106129107129108129109129110129111129112129113129114129115129116129117129118129119129120129121129122129123129124129125129126129127129128129129129130129131129132129133129134129135129136129137129138129139129140129141129142129143129144129145129146129147129148129149129150129151129152129153129154129155129156129157129158129159129160129161129162129163129164129165129166129167129168129169129170129171129172129173129174129175129176129177129178129179129180129181129182129183129184129185129186129187129188129189129190129191129192129193129194129195129196129197129198129199129200129201129202129203129204129205129206129207129208129209129210129211129212129213129214129215129216129217129218129219129220129221129222129223129224129225129226129227129228129229129230129231129232129233129234129235129236129237129238129239129240129241129242129243129244129245129246129247129248129249129250129251129252129253129254129255129256129257129258129259129260129261129262129263129264129265129266129267129268129269129270129271129272129273129274129275129276129277129278129279129280129281129282129283129284129285129286129287129288129289129290129291129292129293129294129295129296129297129298129299129300129301129302129303129304129305129306129307129308129309129310129311129312129313129314129315129316129317129318129319129320129321129322129323129324129325129326129327129328129329129330129331129332129333129334129335129336129337129338129339129340129341129342129343129344129345129346129347129348129349129350129351129352129353129354129355129356129357129358129359129360129361129362129363129364129365129366129367129368129369129370129371129372129373129374129375129376129377129378129379129380129381129382129383129384129385129386129387129388129389129390129391129392129393129394129395129396129397129398129399129400129401129402129403129404129405129406129407129408129409129410129411129412129413129414129415129416129417129418129419129420129421129422129423129424129425129426129427129428129429129430129431129432129433129434129435129436129437129438129439129440129441129442129443129444129445129446129447129448129449129450129451129452129453129454129455129456129457129458129459129460129461129462129463129464129465129466129467129468129469129470129471129472129473129474129475129476129477129478129479129480129481129482129483129484129485129486129487129488129489129490129491129492129493129494129495129496129497129498129499129500129501129502129503129504129505129506129507129508129509129510129511129512129513129514129515129516129517129518129519129520129521129522129523129524129525129526129527129528129529129530129531129532129533129534129535129536129537129538129539129540129541129542129543129544129545129546129547129548129549129550129551129552129553129554129555129556129557129558129559129560129561129562129563129564129565129566129567129568129569129570129571129572129573129574129575129576129577129578129579129580129581129582129583129584129585129586129587129588129589129590129591129592129593129594129595129596129597129598129599129600129601129602129603129604129605129606129607129608129609129610129611129612129613129614129615129616129617129618129619129620129621129622129623129624129625129626129627129628129629129630129631129632129633129634129635129636129637129638129639129640129641129642129643129644129645129646129647129648129649129650129651129652129653129654129655129656129657129658129659129660129661129662129663129664129665129666129667129668129669129670129671129672129673129674129675129676129677129678129679129680129681129682129683129684129685129686129687129688129689129690129691129692129693129694129695129696129697129698129699129700129701129702129703129704129705129706129707129708129709129710129711129712129713129714129715129716129717129718129719129720129721129722129723129724129725129726129727129728129729129730129731129732129733129734129735129736129737129738129739129740129741129742129743129744129745129746129747129748129749129750129751129752129753129754129755129756129757129758129759129760129761129762129763129764129765129766129767129768129769129770129771129772129773129774129775129776129777129778129779129780129781129782129783129784129785129786129787129788129789129790129791129792129793129794129795129796129797129798129799129800129801129802129803129804129805129806129807129808129809129810129811129812129813129814129815129816129817129818129819129820129821129822129823129824129825129826129827129828129829129830129831129832129833129834129835129836129837129838129839129840129841129842129843129844129845129846129847129848129849129850129851129852129853129854129855129856129857129858129859129860129861129862129863129864129865129866129867129868129869129870129871129872129873129874129875129876129877129878129879129880129881129882129883129884129885129886129887129888129889129890129891129892129893129894129895129896129897129898129899129900129901129902129903129904129905129906129907129908129909129910129911129912129913129914129915129916129917129918129919129920129921129922129923129924129925129926129927129928129929129930129931129932129933129934129935129936129937129938129939129940129941129942129943129944129945129946129947129948129949129950129951129952129953129954129955129956129957129958129959129960129961129962129963129964129965129966129967129968129969129970129971129972129973129974129975129976129977129978129979129980129981129982129983129984129985129986129987129988129989129990129991129992129993129994129995129996129997129998129999130000130001130002130003130004130005130006130007130008130009130010130011130012130013130014130015130016130017130018130019130020130021130022130023130024130025130026130027130028130029130030130031130032130033130034130035130036130037130038130039130040130041130042130043130044130045130046130047130048130049130050130051130052130053130054130055130056130057130058130059130060130061130062130063130064130065130066130067130068130069130070130071130072130073130074130075130076130077130078130079130080130081130082130083130084130085130086130087130088130089130090130091130092130093130094130095130096130097130098130099130100130101130102130103130104130105130106130107130108130109130110130111130112130113130114130115130116130117130118130119130120130121130122130123130124130125130126130127130128130129130130130131130132130133130134130135130136130137130138130139130140130141130142130143130144130145130146130147130148130149130150130151130152130153130154130155130156130157130158130159130160130161130162130163130164130165130166130167130168130169130170130171130172130173130174130175130176130177130178130179130180130181130182130183130184130185130186130187130188130189130190130191130192130193130194130195130196130197130198130199130200130201130202130203130204130205130206130207130208130209130210130211130212130213130214130215130216130217130218130219130220130221130222130223130224130225130226130227130228130229130230130231130232130233130234130235130236130237130238130239130240130241130242130243130244130245130246130247130248130249130250130251130252130253130254130255130256130257130258130259130260130261130262130263130264130265130266130267130268130269130270130271130272130273130274130275130276130277130278130279130280130281130282130283130284130285130286130287130288130289130290130291130292130293130294130295130296130297130298130299130300130301130302130303130304130305130306130307130308130309130310130311130312130313130314130315130316130317130318130319130320130321130322130323130324130325130326130327130328130329130330130331130332130333130334130335130336130337130338130339130340130341130342130343130344130345130346130347130348130349130350130351130352130353130354130355130356130357130358130359130360130361130362130363130364130365130366130367130368130369130370130371130372130373130374130375130376130377130378130379130380130381130382130383130384130385130386130387130388130389130390130391130392130393130394130395130396130397130398130399130400130401130402130403130404130405130406130407130408130409130410130411130412130413130414130415130416130417130418130419130420130421130422130423130424130425130426130427130428130429130430130431130432130433130434130435130436130437130438130439130440130441130442130443130444130445130446130447130448130449130450130451130452130453130454130455130456130457130458130459130460130461130462130463130464130465130466130467130468130469130470130471130472130473130474130475130476130477130478130479130480130481130482130483130484130485130486130487130488130489130490130491130492130493130494130495130496130497130498130499130500130501130502130503130504130505130506130507130508130509130510130511130512130513130514130515130516130517130518130519130520130521130522130523130524130525130526130527130528130529130530130531130532130533130534130535130536130537130538130539130540130541130542130543130544130545130546130547130548130549130550130551130552130553130554130555130556130557130558130559130560130561130562130563130564130565130566130567130568130569130570130571130572130573130574130575130576130577130578130579130580130581130582130583130584130585130586130587130588130589130590130591130592130593130594130595130596130597130598130599130600130601130602130603130604130605130606130607130608130609130610130611130612130613130614130615130616130617130618130619130620130621130622130623130624130625130626130627130628130629130630130631130632130633130634130635130636130637130638130639130640130641130642130643130644130645130646130647130648130649130650130651130652130653130654130655130656130657130658130659130660130661130662130663130664130665130666130667130668130669130670130671130672130673130674130675130676130677130678130679130680130681130682130683130684130685130686130687130688130689130690130691130692130693130694130695130696130697130698130699130700130701130702130703130704130705130706130707130708130709130710130711130712130713130714130715130716130717130718130719130720130721130722130723130724130725130726130727130728130729130730130731130732130733130734130735130736130737130738130739130740130741130742130743130744130745130746130747130748130749130750130751130752130753130754130755130756130757130758130759130760130761130762130763130764130765130766130767130768130769130770130771130772130773130774130775130776130777130778130779130780130781130782130783130784130785130786130787130788130789130790130791130792130793130794130795130796130797130798130799130800130801130802130803130804130805130806130807130808130809130810130811130812130813130814130815130816130817130818130819130820130821130822130823130824130825130826130827130828130829130830130831130832130833130834130835130836130837130838130839130840130841130842130843130844130845130846130847130848130849130850130851130852130853130854130855130856130857130858130859130860130861130862130863130864130865130866130867130868130869130870130871130872130873130874130875130876130877130878130879130880130881130882130883130884130885130886130887130888130889130890130891130892130893130894130895130896130897130898130899130900130901130902130903130904130905130906130907130908130909130910130911130912130913130914130915130916130917130918130919130920130921130922130923130924130925130926130927130928130929130930130931130932130933130934130935130936130937130938130939130940130941130942130943130944130945130946130947130948130949130950130951130952130953130954130955130956130957130958130959130960130961130962130963130964130965130966130967130968130969130970130971130972130973130974130975130976130977130978130979130980130981130982130983130984130985130986130987130988130989130990130991130992130993130994130995130996130997130998130999131000131001131002131003131004131005131006131007131008131009131010131011131012131013131014131015131016131017131018131019131020131021131022131023131024131025131026131027131028131029131030131031131032131033131034131035131036131037131038131039131040131041131042131043131044131045131046131047131048131049131050131051131052131053131054131055131056131057131058131059131060131061131062131063131064131065131066131067131068131069131070131071131072131073131074131075131076131077131078131079131080131081131082131083131084131085131086131087131088131089131090131091131092131093131094131095131096131097131098131099131100131101131102131103131104131105131106131107131108131109131110131111131112131113131114131115131116131117131118131119131120131121131122131123131124131125131126131127131128131129131130131131131132131133131134131135131136131137131138131139131140131141131142131143131144131145131146131147131148131149131150131151131152131153131154131155131156131157131158131159131160131161131162131163131164131165131166131167131168131169131170131171131172131173131174131175131176131177131178131179131180131181131182131183131184131185131186131187131188131189131190131191131192131193131194131195131196131197131198131199131200131201131202131203131204131205131206131207131208131209131210131211131212131213131214131215131216131217131218131219131220131221131222131223131224131225131226131227131228131229131230131231131232131233131234131235131236131237131238131239131240131241131242131243131244131245131246131247131248131249131250131251131252131253131254131255131256131257131258131259131260131261131262131263131264131265131266131267131268131269131270131271131272131273131274131275131276131277131278131279131280131281131282131283131284131285131286131287131288131289131290131291131292131293131294131295131296131297131298131299131300131301131302131303131304131305131306131307131308131309131310131311131312131313131314131315131316131317131318131319131320131321131322131323131324131325131326131327131328131329131330131331131332131333131334131335131336131337131338131339131340131341131342131343131344131345131346131347131348131349131350131351131352131353131354131355131356131357131358131359131360131361131362131363131364131365131366131367131368131369131370131371131372131373131374131375131376131377131378131379131380131381131382131383131384131385131386131387131388131389131390131391131392131393131394131395131396131397131398131399131400131401131402131403131404131405131406131407131408131409131410131411131412131413131414131415131416131417131418131419131420131421131422131423131424131425131426131427131428131429131430131431131432131433131434131435131436131437131438131439131440131441131442131443131444131445131446131447131448131449131450131451131452131453131454131455131456131457131458131459131460131461131462131463131464131465131466131467131468131469131470131471131472131473131474131475131476131477131478131479131480131481131482131483131484131485131486131487131488131489131490131491131492131493131494131495131496131497131498131499131500131501131502131503131504131505131506131507131508131509131510131511131512131513131514131515131516131517131518131519131520131521131522131523131524131525131526131527131528131529131530131531131532131533131534131535131536131537131538131539131540131541131542131543131544131545131546131547131548131549131550131551131552131553131554131555131556131557131558131559131560131561131562131563131564131565131566131567131568131569131570131571131572131573131574131575131576131577131578131579131580131581131582131583131584131585131586131587131588131589131590131591131592131593131594131595131596131597131598131599131600131601131602131603131604131605131606131607131608131609131610131611131612131613131614131615131616131617131618131619131620131621131622131623131624131625131626131627131628131629131630131631131632131633131634131635131636131637131638131639131640131641131642131643131644131645131646131647131648131649131650131651131652131653131654131655131656131657131658131659131660131661131662131663131664131665131666131667131668131669131670131671131672131673131674131675131676131677131678131679131680131681131682131683131684131685131686131687131688131689131690131691131692131693131694131695131696131697131698131699131700131701131702131703131704131705131706131707131708131709131710131711131712131713131714131715131716131717131718131719131720131721131722131723131724131725131726131727131728131729131730131731131732131733131734131735131736131737131738131739131740131741131742131743131744131745131746131747131748131749131750131751131752131753131754131755131756131757131758131759131760131761131762131763131764131765131766131767131768131769131770131771131772131773131774131775131776131777131778131779131780131781131782131783131784131785131786131787131788131789131790131791131792131793131794131795131796131797131798131799131800131801131802131803131804131805131806131807131808131809131810131811131812131813131814131815131816131817131818131819131820131821131822131823131824131825131826131827131828131829131830131831131832131833131834131835131836131837131838131839131840131841131842131843131844131845131846131847131848131849131850131851131852131853131854131855131856131857131858131859131860131861131862131863131864131865131866131867131868131869131870131871131872131873131874131875131876131877131878131879131880131881131882131883131884131885131886131887131888131889131890131891131892131893131894131895131896131897131898131899131900131901131902131903131904131905131906131907131908131909131910131911131912131913131914131915131916131917131918131919131920131921131922131923131924131925131926131927131928131929131930131931131932131933131934131935131936131937131938131939131940131941131942131943131944131945131946131947131948131949131950131951131952131953131954131955131956131957131958131959131960131961131962131963131964131965131966131967131968131969131970131971131972131973131974131975131976131977131978131979131980131981131982131983131984131985131986131987131988131989131990131991131992131993131994131995131996131997131998131999132000132001132002132003132004132005132006132007132008132009132010132011132012132013132014132015132016132017132018132019132020132021132022132023132024132025132026132027132028132029132030132031132032132033132034132035132036132037132038132039132040132041132042132043132044132045132046132047132048132049132050132051132052132053132054132055132056132057132058132059132060132061132062132063132064132065132066132067132068132069132070132071132072132073132074132075132076132077132078132079132080132081132082132083132084132085132086132087132088132089132090132091132092132093132094132095132096132097132098132099132100132101132102132103132104132105132106132107132108132109132110132111132112132113132114132115132116132117132118132119132120132121132122132123132124132125132126132127132128132129132130132131132132132133132134132135132136132137132138132139132140132141132142132143132144132145132146132147132148132149132150132151132152132153132154132155132156132157132158132159132160132161132162132163132164132165132166132167132168132169132170132171132172132173132174132175132176132177132178132179132180132181132182132183132184132185132186132187132188132189132190132191132192132193132194132195132196132197132198132199132200132201132202132203132204132205132206132207132208132209132210132211132212132213132214132215132216132217132218132219132220132221132222132223132224132225132226132227132228132229132230132231132232132233132234132235132236132237132238132239132240132241132242132243132244132245132246132247132248132249132250132251132252132253132254132255132256132257132258132259132260132261132262132263132264132265132266132267132268132269132270132271132272132273132274132275132276132277132278132279132280132281132282132283132284132285132286132287132288132289132290132291132292132293132294132295132296132297132298132299132300132301132302132303132304132305132306132307132308132309132310132311132312132313132314132315132316132317132318132319132320132321132322132323132324132325132326132327132328132329132330132331132332132333132334132335132336132337132338132339132340132341132342132343132344132345132346132347132348132349132350132351132352132353132354132355132356132357132358132359132360132361132362132363132364132365132366132367132368132369132370132371132372132373132374132375132376132377132378132379132380132381132382132383132384132385132386132387132388132389132390132391132392132393132394132395132396132397132398132399132400132401132402132403132404132405132406132407132408132409132410132411132412132413132414132415132416132417132418132419132420132421132422132423132424132425132426132427132428132429132430132431132432132433132434132435132436132437132438132439132440132441132442132443132444132445132446132447132448132449132450132451132452132453132454132455132456132457132458132459132460132461132462132463132464132465132466132467132468132469132470132471132472132473132474132475132476132477132478132479132480132481132482132483132484132485132486132487132488132489132490132491132492132493132494132495132496132497132498132499132500132501132502132503132504132505132506132507132508132509132510132511132512132513132514132515132516132517132518132519132520132521132522132523132524132525132526132527132528132529132530132531132532132533132534132535132536132537132538132539132540132541132542132543132544132545132546132547132548132549132550132551132552132553132554132555132556132557132558132559132560132561132562132563132564132565132566132567132568132569132570132571132572132573132574132575132576132577132578132579132580132581132582132583132584132585132586132587132588132589132590132591132592132593132594132595132596132597132598132599132600132601132602132603132604132605132606132607132608132609132610132611132612132613132614132615132616132617132618132619132620132621132622132623132624132625132626132627132628132629132630132631132632132633132634132635132636132637132638132639132640132641132642132643132644132645132646132647132648132649132650132651132652132653132654132655132656132657132658132659132660132661132662132663132664132665132666132667132668132669132670132671132672132673132674132675132676132677132678132679132680132681132682132683132684132685132686132687132688132689132690132691132692132693132694132695132696132697132698132699132700132701132702132703132704132705132706132707132708132709132710132711132712132713132714132715132716132717132718132719132720132721132722132723132724132725132726132727132728132729132730132731132732132733132734132735132736132737132738132739132740132741132742132743132744132745132746132747132748132749132750132751132752132753132754132755132756132757132758132759132760132761132762132763132764132765132766132767132768132769132770132771132772132773132774132775132776132777132778132779132780132781132782132783132784132785132786132787132788132789132790132791132792132793132794132795132796132797132798132799132800132801132802132803132804132805132806132807132808132809132810132811132812132813132814132815132816132817132818132819132820132821132822132823132824132825132826132827132828132829132830132831132832132833132834132835132836132837132838132839132840132841132842132843132844132845132846132847132848132849132850132851132852132853132854132855132856132857132858132859132860132861132862132863132864132865132866132867132868132869132870132871132872132873132874132875132876132877132878132879132880132881132882132883132884132885132886132887132888132889132890132891132892132893132894132895132896132897132898132899132900132901132902132903132904132905132906132907132908132909132910132911132912132913132914132915132916132917132918132919132920132921132922132923132924132925132926132927132928132929132930132931132932132933132934132935132936132937132938132939132940132941132942132943132944132945132946132947132948132949132950132951132952132953132954132955132956132957132958132959132960132961132962132963132964132965132966132967132968132969132970132971132972132973132974132975132976132977132978132979132980132981132982132983132984132985132986132987132988132989132990132991132992132993132994132995132996132997132998132999133000133001133002133003133004133005133006133007133008133009133010133011133012133013133014133015133016133017133018133019133020133021133022133023133024133025133026133027133028133029133030133031133032133033133034133035133036133037133038133039133040133041133042133043133044133045133046133047133048133049133050133051133052133053133054133055133056133057133058133059133060133061133062133063133064133065133066133067133068133069133070133071133072133073133074133075133076133077133078133079133080133081133082133083133084133085133086133087133088133089133090133091133092133093133094133095133096133097133098133099133100133101133102133103133104133105133106133107133108133109133110133111133112133113133114133115133116133117133118133119133120133121133122133123133124133125133126133127133128133129133130133131133132133133133134133135133136133137133138133139133140133141133142133143133144133145133146133147133148133149133150133151133152133153133154133155133156133157133158133159133160133161133162133163133164133165133166133167133168133169133170133171133172133173133174133175133176133177133178133179133180133181133182133183133184133185133186133187133188133189133190133191133192133193133194133195133196133197133198133199133200133201133202133203133204133205133206133207133208133209133210133211133212133213133214133215133216133217133218133219133220133221133222133223133224133225133226133227133228133229133230133231133232133233133234133235133236133237133238133239133240133241133242133243133244133245133246133247133248133249133250133251133252133253133254133255133256133257133258133259133260133261133262133263133264133265133266133267133268133269133270133271133272133273133274133275133276133277133278133279133280133281133282133283133284133285133286133287133288133289133290133291133292133293133294133295133296133297133298133299133300133301133302133303133304133305133306133307133308133309133310133311133312133313133314133315133316133317133318133319133320133321133322133323133324133325133326133327133328133329133330133331133332133333133334133335133336133337133338133339133340133341133342133343133344133345133346133347133348133349133350133351133352133353133354133355133356133357133358133359133360133361133362133363133364133365133366133367133368133369133370133371133372133373133374133375133376133377133378133379133380133381133382133383133384133385133386133387133388133389133390133391133392133393133394133395133396133397133398133399133400133401133402133403133404133405133406133407133408133409133410133411133412133413133414133415133416133417133418133419133420133421133422133423133424133425133426133427133428133429133430133431133432133433133434133435133436133437133438133439133440133441133442133443133444133445133446133447133448133449133450133451133452133453133454133455133456133457133458133459133460133461133462133463133464133465133466133467133468133469133470133471133472133473133474133475133476133477133478133479133480133481133482133483133484133485133486133487133488133489133490133491133492133493133494133495133496133497133498133499133500133501133502133503133504133505133506133507133508133509133510133511133512133513133514133515133516133517133518133519133520133521133522133523133524133525133526133527133528133529133530133531133532133533133534133535133536133537133538133539133540133541133542133543133544133545133546133547133548133549133550133551133552133553133554133555133556133557133558133559133560133561133562133563133564133565133566133567133568133569133570133571133572133573133574133575133576133577133578133579133580133581133582133583133584133585133586133587133588133589133590133591133592133593133594133595133596133597133598133599133600133601133602133603133604133605133606133607133608133609133610133611133612133613133614133615133616133617133618133619133620133621133622133623133624133625133626133627133628133629133630133631133632133633133634133635133636133637133638133639133640133641133642133643133644133645133646133647133648133649133650133651133652133653133654133655133656133657133658133659133660133661133662133663133664133665133666133667133668133669133670133671133672133673133674133675133676133677133678133679133680133681133682133683133684133685133686133687133688133689133690133691133692133693133694133695133696133697133698133699133700133701133702133703133704133705133706133707133708133709133710133711133712133713133714133715133716133717133718133719133720133721133722133723133724133725133726133727133728133729133730133731133732133733133734133735133736133737133738133739133740133741133742133743133744133745133746133747133748133749133750133751133752133753133754133755133756133757133758133759133760133761133762133763133764133765133766133767133768133769133770133771133772133773133774133775133776133777133778133779133780133781133782133783133784133785133786133787133788133789133790133791133792133793133794133795133796133797133798133799133800133801133802133803133804133805133806133807133808133809133810133811133812133813133814133815133816133817133818133819133820133821133822133823133824133825133826133827133828133829133830133831133832133833133834133835133836133837133838133839133840133841133842133843133844133845133846133847133848133849133850133851133852133853133854133855133856133857133858133859133860133861133862133863133864133865133866133867133868133869133870133871133872133873133874133875133876133877133878133879133880133881133882133883133884133885133886133887133888133889133890133891133892133893133894133895133896133897133898133899133900133901133902133903133904133905133906133907133908133909133910133911133912133913133914133915133916133917133918133919133920133921133922133923133924133925133926133927133928133929133930133931133932133933133934133935133936133937133938133939133940133941133942133943133944133945133946133947133948133949133950133951133952133953133954133955133956133957133958133959133960133961133962133963133964133965133966133967133968133969133970133971133972133973133974133975133976133977133978133979133980133981133982133983133984133985133986133987133988133989133990133991133992133993133994133995133996133997133998133999134000134001134002134003134004134005134006134007134008134009134010134011134012134013134014134015134016134017134018134019134020134021134022134023134024134025134026134027134028134029134030134031134032134033134034134035134036134037134038134039134040134041134042134043134044134045134046134047134048134049134050134051134052134053134054134055134056134057134058134059134060134061134062134063134064134065134066134067134068134069134070134071134072134073134074134075134076134077134078134079134080134081134082134083134084134085134086134087134088134089134090134091134092134093134094134095134096134097134098134099134100134101134102134103134104134105134106134107134108134109134110134111134112134113134114134115134116134117134118134119134120134121134122134123134124134125134126134127134128134129134130134131134132134133134134134135134136134137134138134139134140134141134142134143134144134145134146134147134148134149134150134151134152134153134154134155134156134157134158134159134160134161134162134163134164134165134166134167134168134169134170134171134172134173134174134175134176134177134178134179134180134181134182134183134184134185134186134187134188134189134190134191134192134193134194134195134196134197134198134199134200134201134202134203134204134205134206134207134208134209134210134211134212134213134214134215134216134217134218134219134220134221134222134223134224134225134226134227134228134229134230134231134232134233134234134235134236134237134238134239134240134241134242134243134244134245134246134247134248134249134250134251134252134253134254134255134256134257134258134259134260134261134262134263134264134265134266134267134268134269134270134271134272134273134274134275134276134277134278134279134280134281134282134283134284134285134286134287134288134289134290134291134292134293134294134295134296134297134298134299134300134301134302134303134304134305134306134307134308134309134310134311134312134313134314134315134316134317134318134319134320134321134322134323134324134325134326134327134328134329134330134331134332134333134334134335134336134337134338134339134340134341134342134343134344134345134346134347134348134349134350134351134352134353134354134355134356134357134358134359134360134361134362134363134364134365134366134367134368134369134370134371134372134373134374134375134376134377134378134379134380134381134382134383134384134385134386134387134388134389134390134391134392134393134394134395134396134397134398134399134400134401134402134403134404134405134406134407134408134409134410134411134412134413134414134415134416134417134418134419134420134421134422134423134424134425134426134427134428134429134430134431134432134433134434134435134436134437134438134439134440134441134442134443134444134445134446134447134448134449134450134451134452134453134454134455134456134457134458134459134460134461134462134463134464134465134466134467134468134469134470134471134472134473134474134475134476134477134478134479134480134481134482134483134484134485134486134487134488134489134490134491134492134493134494134495134496134497134498134499134500134501134502134503134504134505134506134507134508134509134510134511134512134513134514134515134516134517134518134519134520134521134522134523134524134525134526134527134528134529134530134531134532134533134534134535134536134537134538134539134540134541134542134543134544134545134546134547134548134549134550134551134552134553134554134555134556134557134558134559134560134561134562134563134564134565134566134567134568134569134570134571134572134573134574134575134576134577134578134579134580134581134582134583134584134585134586134587134588134589134590134591134592134593134594134595134596134597134598134599134600134601134602134603134604134605134606134607134608134609134610134611134612134613134614134615134616134617134618134619134620134621134622134623134624134625134626134627134628134629134630134631134632134633134634134635134636134637134638134639134640134641134642134643134644134645134646134647134648134649134650134651134652134653134654134655134656134657134658134659134660134661134662134663134664134665134666134667134668134669134670134671134672134673134674134675134676134677134678134679134680134681134682134683134684134685134686134687134688134689134690134691134692134693134694134695134696134697134698134699134700134701134702134703134704134705134706134707134708134709134710134711134712134713134714134715134716134717134718134719134720134721134722134723134724134725134726134727134728134729134730134731134732134733134734134735134736134737134738134739134740134741134742134743134744134745134746134747134748134749134750134751134752134753134754134755134756134757134758134759134760134761134762134763134764134765134766134767134768134769134770134771134772134773134774134775134776134777134778134779134780134781134782134783134784134785134786134787134788134789134790134791134792134793134794134795134796134797134798134799134800134801134802134803134804134805134806134807134808134809134810134811134812134813134814134815134816134817134818134819134820134821134822134823134824134825134826134827134828134829134830134831134832134833134834134835134836134837134838134839134840134841134842134843134844134845134846134847134848134849134850134851134852134853134854134855134856134857134858134859134860134861134862134863134864134865134866134867134868134869134870134871134872134873134874134875134876134877134878134879134880134881134882134883134884134885134886134887134888134889134890134891134892134893134894134895134896134897134898134899134900134901134902134903134904134905134906134907134908134909134910134911134912134913134914134915134916134917134918134919134920134921134922134923134924134925134926134927134928134929134930134931134932134933134934134935134936134937134938134939134940134941134942134943134944134945134946134947134948134949134950134951134952134953134954134955134956134957134958134959134960134961134962134963134964134965134966134967134968134969134970134971134972134973134974134975134976134977134978134979134980134981134982134983134984134985134986134987134988134989134990134991134992134993134994134995134996134997134998134999135000135001135002135003135004135005135006135007135008135009135010135011135012135013135014135015135016135017135018135019135020135021135022135023135024135025135026135027135028135029135030135031135032135033135034135035135036135037135038135039135040135041135042135043135044135045135046135047135048135049135050135051135052135053135054135055135056135057135058135059135060135061135062135063135064135065135066135067135068135069135070135071135072135073135074135075135076135077135078135079135080135081135082135083135084135085135086135087135088135089135090135091135092135093135094135095135096135097135098135099135100135101135102135103135104135105135106135107135108135109135110135111135112135113135114135115135116135117135118135119135120135121135122135123135124135125135126135127135128135129135130135131135132135133135134135135135136135137135138135139135140135141135142135143135144135145135146135147135148135149135150135151135152135153135154135155135156135157135158135159135160135161135162135163135164135165135166135167135168135169135170135171135172135173135174135175135176135177135178135179135180135181135182135183135184135185135186135187135188135189135190135191135192135193135194135195135196135197135198135199135200135201135202135203135204135205135206135207135208135209135210135211135212135213135214135215135216135217135218135219135220135221135222135223135224135225135226135227135228135229135230135231135232135233135234135235135236135237135238135239135240135241135242135243135244135245135246135247135248135249135250135251135252135253135254135255135256135257135258135259135260135261135262135263135264135265135266135267135268135269135270135271135272135273135274135275135276135277135278135279135280135281135282135283135284135285135286135287135288135289135290135291135292135293135294135295135296135297135298135299135300135301135302135303135304135305135306135307135308135309135310135311135312135313135314135315135316135317135318135319135320135321135322135323135324135325135326135327135328135329135330135331135332135333135334135335135336135337135338135339135340135341135342135343135344135345135346135347135348135349135350135351135352135353135354135355135356135357135358135359135360135361135362135363135364135365135366135367135368135369135370135371135372135373135374135375135376135377135378135379135380135381135382135383135384135385135386135387135388135389135390135391135392135393135394135395135396135397135398135399135400135401135402135403135404135405135406135407135408135409135410135411135412135413135414135415135416135417135418135419135420135421135422135423135424135425135426135427135428135429135430135431135432135433135434135435135436135437135438135439135440135441135442135443135444135445135446135447135448135449135450135451135452135453135454135455135456135457135458135459135460135461135462135463135464135465135466135467135468135469135470135471135472135473135474135475135476135477135478135479135480135481135482135483135484135485135486135487135488135489135490135491135492135493135494135495135496135497135498135499135500135501135502135503135504135505135506135507135508135509135510135511135512135513135514135515135516135517135518135519135520135521135522135523135524135525135526135527135528135529135530135531135532135533135534135535135536135537135538135539135540135541135542135543135544135545135546135547135548135549135550135551135552135553135554135555135556135557135558135559135560135561135562135563135564135565135566135567135568135569135570135571135572135573135574135575135576135577135578135579135580135581135582135583135584135585135586135587135588135589135590135591135592135593135594135595135596135597135598135599135600135601135602135603135604135605135606135607135608135609135610135611135612135613135614135615135616135617135618135619135620135621135622135623135624135625135626135627135628135629135630135631135632135633135634135635135636135637135638135639135640135641135642135643135644135645135646135647135648135649135650135651135652135653135654135655135656135657135658135659135660135661135662135663135664135665135666135667135668135669135670135671135672135673135674135675135676135677135678135679135680135681135682135683135684135685135686135687135688135689135690135691135692135693135694135695135696135697135698135699135700135701135702135703135704135705135706135707135708135709135710135711135712135713135714135715135716135717135718135719135720135721135722135723135724135725135726135727135728135729135730135731135732135733135734135735135736135737135738135739135740135741135742135743135744135745135746135747135748135749135750135751135752135753135754135755135756135757135758135759135760135761135762135763135764135765135766135767135768135769135770135771135772135773135774135775135776135777135778135779135780135781135782135783135784135785135786135787135788135789135790135791135792135793135794135795135796135797135798135799135800135801135802135803135804135805135806135807135808135809135810135811135812135813135814135815135816135817135818135819135820135821135822135823135824135825135826135827135828135829135830135831135832135833135834135835135836135837135838135839135840135841135842135843135844135845135846135847135848135849135850135851135852135853135854135855135856135857135858135859135860135861135862135863135864135865135866135867135868135869135870135871135872135873135874135875135876135877135878135879135880135881135882135883135884135885135886135887135888135889135890135891135892135893135894135895135896135897135898135899135900135901135902135903135904135905135906135907135908135909135910135911135912135913135914135915135916135917135918135919135920135921135922135923135924135925135926135927135928135929135930135931135932135933135934135935135936135937135938135939135940135941135942135943135944135945135946135947135948135949135950135951135952135953135954135955135956135957135958135959135960135961135962135963135964135965135966135967135968135969135970135971135972135973135974135975135976135977135978135979135980135981135982135983135984135985135986135987135988135989135990135991135992135993135994135995135996135997135998135999136000136001136002136003136004136005136006136007136008136009136010136011136012136013136014136015136016136017136018136019136020136021136022136023136024136025136026136027136028136029136030136031136032136033136034136035136036136037136038136039136040136041136042136043136044136045136046136047136048136049136050136051136052136053136054136055136056136057136058136059136060136061136062136063136064136065136066136067136068136069136070136071136072136073136074136075136076136077136078136079136080136081136082136083136084136085136086136087136088136089136090136091136092136093136094136095136096136097136098136099136100136101136102136103136104136105136106136107136108136109136110136111136112136113136114136115136116136117136118136119136120136121136122136123136124136125136126136127136128136129136130136131136132136133136134136135136136136137136138136139136140136141136142136143136144136145136146136147136148136149136150136151136152136153136154136155136156136157136158136159136160136161136162136163136164136165136166136167136168136169136170136171136172136173136174136175136176136177136178136179136180136181136182136183136184136185136186136187136188136189136190136191136192136193136194136195136196136197136198136199136200136201136202136203136204136205136206136207136208136209136210136211136212136213136214136215136216136217136218136219136220136221136222136223136224136225136226136227136228136229136230136231136232136233136234136235136236136237136238136239136240136241136242136243136244136245136246136247136248136249136250136251136252136253136254136255136256136257136258136259136260136261136262136263136264136265136266136267136268136269136270136271136272136273136274136275136276136277136278136279136280136281136282136283136284136285136286136287136288136289136290136291136292136293136294136295136296136297136298136299136300136301136302136303136304136305136306136307136308136309136310136311136312136313136314136315136316136317136318136319136320136321136322136323136324136325136326136327136328136329136330136331136332136333136334136335136336136337136338136339136340136341136342136343136344136345136346136347136348136349136350136351136352136353136354136355136356136357136358136359136360136361136362136363136364136365136366136367136368136369136370136371136372136373136374136375136376136377136378136379136380136381136382136383136384136385136386136387136388136389136390136391136392136393136394136395136396136397136398136399136400136401136402136403136404136405136406136407136408136409136410136411136412136413136414136415136416136417136418136419136420136421136422136423136424136425136426136427136428136429136430136431136432136433136434136435136436136437136438136439136440136441136442136443136444136445136446136447136448136449136450136451136452136453136454136455136456136457136458136459136460136461136462136463136464136465136466136467136468136469136470136471136472136473136474136475136476136477136478136479136480136481136482136483136484136485136486136487136488136489136490136491136492136493136494136495136496136497136498136499136500136501136502136503136504136505136506136507136508136509136510136511136512136513136514136515136516136517136518136519136520136521136522136523136524136525136526136527136528136529136530136531136532136533136534136535136536136537136538136539136540136541136542136543136544136545136546136547136548136549136550136551136552136553136554136555136556136557136558136559136560136561136562136563136564136565136566136567136568136569136570136571136572136573136574136575136576136577136578136579136580136581136582136583136584136585136586136587136588136589136590136591136592136593136594136595136596136597136598136599136600136601136602136603136604136605136606136607136608136609136610136611136612136613136614136615136616136617136618136619136620136621136622136623136624136625136626136627136628136629136630136631136632136633136634136635136636136637136638136639136640136641136642136643136644136645136646136647136648136649136650136651136652136653136654136655136656136657136658136659136660136661136662136663136664136665136666136667136668136669136670136671136672136673136674136675136676136677136678136679136680136681136682136683136684136685136686136687136688136689136690136691136692136693136694136695136696136697136698136699136700136701136702136703136704136705136706136707136708136709136710136711136712136713136714136715136716136717136718136719136720136721136722136723136724136725136726136727136728136729136730136731136732136733136734136735136736136737136738136739136740136741136742136743136744136745136746136747136748136749136750136751136752136753136754136755136756136757136758136759136760136761136762136763136764136765136766136767136768136769136770136771136772136773136774136775136776136777136778136779136780136781136782136783136784136785136786136787136788136789136790136791136792136793136794136795136796136797136798136799136800136801136802136803136804136805136806136807136808136809136810136811136812136813136814136815136816136817136818136819136820136821136822136823136824136825136826136827136828136829136830136831136832136833136834136835136836136837136838136839136840136841136842136843136844136845136846136847136848136849136850136851136852136853136854136855136856136857136858136859136860136861136862136863136864136865136866136867136868136869136870136871136872136873136874136875136876136877136878136879136880136881136882136883136884136885136886136887136888136889136890136891136892136893136894136895136896136897136898136899136900136901136902136903136904136905136906136907136908136909136910136911136912136913136914136915136916136917136918136919136920136921136922136923136924136925136926136927136928136929136930136931136932136933136934136935136936136937136938136939136940136941136942136943136944136945136946136947136948136949136950136951136952136953136954136955136956136957136958136959136960136961136962136963136964136965136966136967136968136969136970136971136972136973136974136975136976136977136978136979136980136981136982136983136984136985136986136987136988136989136990136991136992136993136994136995136996136997136998136999137000137001137002137003137004137005137006137007137008137009137010137011137012137013137014137015137016137017137018137019137020137021137022137023137024137025137026137027137028137029137030137031137032137033137034137035137036137037137038137039137040137041137042137043137044137045137046137047137048137049137050137051137052137053137054137055137056137057137058137059137060137061137062137063137064137065137066137067137068137069137070137071137072137073137074137075137076137077137078137079137080137081137082137083137084137085137086137087137088137089137090137091137092137093137094137095137096137097137098137099137100137101137102137103137104137105137106137107137108137109137110137111137112137113137114137115137116137117137118137119137120137121137122137123137124137125137126137127137128137129137130137131137132137133137134137135137136137137137138137139137140137141137142137143137144137145137146137147137148137149137150137151137152137153137154137155137156137157137158137159137160137161137162137163137164137165137166137167137168137169137170137171137172137173137174137175137176137177137178137179137180137181137182137183137184137185137186137187137188137189137190137191137192137193137194137195137196137197137198137199137200137201137202137203137204137205137206137207137208137209137210137211137212137213137214137215137216137217137218137219137220137221137222137223137224137225137226137227137228137229137230137231137232137233137234137235137236137237137238137239137240137241137242137243137244137245137246137247137248137249137250137251137252137253137254137255137256137257137258137259137260137261137262137263137264137265137266137267137268137269137270137271137272137273137274137275137276137277137278137279137280137281137282137283137284137285137286137287137288137289137290137291137292137293137294137295137296137297137298137299137300137301137302137303137304137305137306137307137308137309137310137311137312137313137314137315137316137317137318137319137320137321137322137323137324137325137326137327137328137329137330137331137332137333137334137335137336137337137338137339137340137341137342137343137344137345137346137347137348137349137350137351137352137353137354137355137356137357137358137359137360137361137362137363137364137365137366137367137368137369137370137371137372137373137374137375137376137377137378137379137380137381137382137383137384137385137386137387137388137389137390137391137392137393137394137395137396137397137398137399137400137401137402137403137404137405137406137407137408137409137410137411137412137413137414137415137416137417137418137419137420137421137422137423137424137425137426137427137428137429137430137431137432137433137434137435137436137437137438137439137440137441137442137443137444137445137446137447137448137449137450137451137452137453137454137455137456137457137458137459137460137461137462137463137464137465137466137467137468137469137470137471137472137473137474137475137476137477137478137479137480137481137482137483137484137485137486137487137488137489137490137491137492137493137494137495137496137497137498137499137500137501137502137503137504137505137506137507137508137509137510137511137512137513137514137515137516137517137518137519137520137521137522137523137524137525137526137527137528137529137530137531137532137533137534137535137536137537137538137539137540137541137542137543137544137545137546137547137548137549137550137551137552137553137554137555137556137557137558137559137560137561137562137563137564137565137566137567137568137569137570137571137572137573137574137575137576137577137578137579137580137581137582137583137584137585137586137587137588137589137590137591137592137593137594137595137596137597137598137599137600137601137602137603137604137605137606137607137608137609137610137611137612137613137614137615137616137617137618137619137620137621137622137623137624137625137626137627137628137629137630137631137632137633137634137635137636137637137638137639137640137641137642137643137644137645137646137647137648137649137650137651137652137653137654137655137656137657137658137659137660137661137662137663137664137665137666137667137668137669137670137671137672137673137674137675137676137677137678137679137680137681137682137683137684137685137686137687137688137689137690137691137692137693137694137695137696137697137698137699137700137701137702137703137704137705137706137707137708137709137710137711137712137713137714137715137716137717137718137719137720137721137722137723137724137725137726137727137728137729137730137731137732137733137734137735137736137737137738137739137740137741137742137743137744137745137746137747137748137749137750137751137752137753137754137755137756137757137758137759137760137761137762137763137764137765137766137767137768137769137770137771137772137773137774137775137776137777137778137779137780137781137782137783137784137785137786137787137788137789137790137791137792137793137794137795137796137797137798137799137800137801137802137803137804137805137806137807137808137809137810137811137812137813137814137815137816137817137818137819137820137821137822137823137824137825137826137827137828137829137830137831137832137833137834137835137836137837137838137839137840137841137842137843137844137845137846137847137848137849137850137851137852137853137854137855137856137857137858137859137860137861137862137863137864137865137866137867137868137869137870137871137872137873137874137875137876137877137878137879137880137881137882137883137884137885137886137887137888137889137890137891137892137893137894137895137896137897137898137899137900137901137902137903137904137905137906137907137908137909137910137911137912137913137914137915137916137917137918137919137920137921137922137923137924137925137926137927137928137929137930137931137932137933137934137935137936137937137938137939137940137941137942137943137944137945137946137947137948137949137950137951137952137953137954137955137956137957137958137959137960137961137962137963137964137965137966137967137968137969137970137971137972137973137974137975137976137977137978137979137980137981137982137983137984137985137986137987137988137989137990137991137992137993137994137995137996137997137998137999138000138001138002138003138004138005138006138007138008138009138010138011138012138013138014138015138016138017138018138019138020138021138022138023138024138025138026138027138028138029138030138031138032138033138034138035138036138037138038138039138040138041138042138043138044138045138046138047138048138049138050138051138052138053138054138055138056138057138058138059138060138061138062138063138064138065138066138067138068138069138070138071138072138073138074138075138076138077138078138079138080138081138082138083138084138085138086138087138088138089138090138091138092138093138094138095138096138097138098138099138100138101138102138103138104138105138106138107138108138109138110138111138112138113138114138115138116138117138118138119138120138121138122138123138124138125138126138127138128138129138130138131138132138133138134138135138136138137138138138139138140138141138142138143138144138145138146138147138148138149138150138151138152138153138154138155138156138157138158138159138160138161138162138163138164138165138166138167138168138169138170138171138172138173138174138175138176138177138178138179138180138181138182138183138184138185138186138187138188138189138190138191138192138193138194138195138196138197138198138199138200138201138202138203138204138205138206138207138208138209138210138211138212138213138214138215138216138217138218138219138220138221138222138223138224138225138226138227138228138229138230138231138232138233138234138235138236138237138238138239138240138241138242138243138244138245138246138247138248138249138250138251138252138253138254138255138256138257138258138259138260138261138262138263138264138265138266138267138268138269138270138271138272138273138274138275138276138277138278138279138280138281138282138283138284138285138286138287138288138289138290138291138292138293138294138295138296138297138298138299138300138301138302138303138304138305138306138307138308138309138310138311138312138313138314138315138316138317138318138319138320138321138322138323138324138325138326138327138328138329138330138331138332138333138334138335138336138337138338138339138340138341138342138343138344138345138346138347138348138349138350138351138352138353138354138355138356138357138358138359138360138361138362138363138364138365138366138367138368138369138370138371138372138373138374138375138376138377138378138379138380138381138382138383138384138385138386138387138388138389138390138391138392138393138394138395138396138397138398138399138400138401138402138403138404138405138406138407138408138409138410138411138412138413138414138415138416138417138418138419138420138421138422138423138424138425138426138427138428138429138430138431138432138433138434138435138436138437138438138439138440138441138442138443138444138445138446138447138448138449138450138451138452138453138454138455138456138457138458138459138460138461138462138463138464138465138466138467138468138469138470138471138472138473138474138475138476138477138478138479138480138481138482138483138484138485138486138487138488138489138490138491138492138493138494138495138496138497138498138499138500138501138502138503138504138505138506138507138508138509138510138511138512138513138514138515138516138517138518138519138520138521138522138523138524138525138526138527138528138529138530138531138532138533138534138535138536138537138538138539138540138541138542138543138544138545138546138547138548138549138550138551138552138553138554138555138556138557138558138559138560138561138562138563138564138565138566138567138568138569138570138571138572138573138574138575138576138577138578138579138580138581138582138583138584138585138586138587138588138589138590138591138592138593138594138595138596138597138598138599138600138601138602138603138604138605138606138607138608138609138610138611138612138613138614138615138616138617138618138619138620138621138622138623138624138625138626138627138628138629138630138631138632138633138634138635138636138637138638138639138640138641138642138643138644138645138646138647138648138649138650138651138652138653138654138655138656138657138658138659138660138661138662138663138664138665138666138667138668138669138670138671138672138673138674138675138676138677138678138679138680138681138682138683138684138685138686138687138688138689138690138691138692138693138694138695138696138697138698138699138700138701138702138703138704138705138706138707138708138709138710138711138712138713138714138715138716138717138718138719138720138721138722138723138724138725138726138727138728138729138730138731138732138733138734138735138736138737138738138739138740138741138742138743138744138745138746138747138748138749138750138751138752138753138754138755138756138757138758138759138760138761138762138763138764138765138766138767138768138769138770138771138772138773138774138775138776138777138778138779138780138781138782138783138784138785138786138787138788138789138790138791138792138793138794138795138796138797138798138799138800138801138802138803138804138805138806138807138808138809138810138811138812138813138814138815138816138817138818138819138820138821138822138823138824138825138826138827138828138829138830138831138832138833138834138835138836138837138838138839138840138841138842138843138844138845138846138847138848138849138850138851138852138853138854138855138856138857138858138859138860138861138862138863138864138865138866138867138868138869138870138871138872138873138874138875138876138877138878138879138880138881138882138883138884138885138886138887138888138889138890138891138892138893138894138895138896138897138898138899138900138901138902138903138904138905138906138907138908138909138910138911138912138913138914138915138916138917138918138919138920138921138922138923138924138925138926138927138928138929138930138931138932138933138934138935138936138937138938138939138940138941138942138943138944138945138946138947138948138949138950138951138952138953138954138955138956138957138958138959138960138961138962138963138964138965138966138967138968138969138970138971138972138973138974138975138976138977138978138979138980138981138982138983138984138985138986138987138988138989138990138991138992138993138994138995138996138997138998138999139000139001139002139003139004139005139006139007139008139009139010139011139012139013139014139015139016139017139018139019139020139021139022139023139024139025139026139027139028139029139030139031139032139033139034139035139036139037139038139039139040139041139042139043139044139045139046139047139048139049139050139051139052139053139054139055139056139057139058139059139060139061139062139063139064139065139066139067139068139069139070139071139072139073139074139075139076139077139078139079139080139081139082139083139084139085139086139087139088139089139090139091139092139093139094139095139096139097139098139099139100139101139102139103139104139105139106139107139108139109139110139111139112139113139114139115139116139117139118139119139120139121139122139123139124139125139126139127139128139129139130139131139132139133139134139135139136139137139138139139139140139141139142139143139144139145139146139147139148139149139150139151139152139153139154139155139156139157139158139159139160139161139162139163139164139165139166139167139168139169139170139171139172139173139174139175139176139177139178139179139180139181139182139183139184139185139186139187139188139189139190139191139192139193139194139195139196139197139198139199139200139201139202139203139204139205139206139207139208139209139210139211139212139213139214139215139216139217139218139219139220139221139222139223139224139225139226139227139228139229139230139231139232139233139234139235139236139237139238139239139240139241139242139243139244139245139246139247139248139249139250139251139252139253139254139255139256139257139258139259139260139261139262139263139264139265139266139267139268139269139270139271139272139273139274139275139276139277139278139279139280139281139282139283139284139285139286139287139288139289139290139291139292139293139294139295139296139297139298139299139300139301139302139303139304139305139306139307139308139309139310139311139312139313139314139315139316139317139318139319139320139321139322139323139324139325139326139327139328139329139330139331139332139333139334139335139336139337139338139339139340139341139342139343139344139345139346139347139348139349139350139351139352139353139354139355139356139357139358139359139360139361139362139363139364139365139366139367139368139369139370139371139372139373139374139375139376139377139378139379139380139381139382139383139384139385139386139387139388139389139390139391139392139393139394139395139396139397139398139399139400139401139402139403139404139405139406139407139408139409139410139411139412139413139414139415139416139417139418139419139420139421139422139423139424139425139426139427139428139429139430139431139432139433139434139435139436139437139438139439139440139441139442139443139444139445139446139447139448139449139450139451139452139453139454139455139456139457139458139459139460139461139462139463139464139465139466139467139468139469139470139471139472139473139474139475139476139477139478139479139480139481139482139483139484139485139486139487139488139489139490139491139492139493139494139495139496139497139498139499139500139501139502139503139504139505139506139507139508139509139510139511139512139513139514139515139516139517139518139519139520139521139522139523139524139525139526139527139528139529139530139531139532139533139534139535139536139537139538139539139540139541139542139543139544139545139546139547139548139549139550139551139552139553139554139555139556139557139558139559139560139561139562139563139564139565139566139567139568139569139570139571139572139573139574139575139576139577139578139579139580139581139582139583139584139585139586139587139588139589139590139591139592139593139594139595139596139597139598139599139600139601139602139603139604139605139606139607139608139609139610139611139612139613139614139615139616139617139618139619139620139621139622139623139624139625139626139627139628139629139630139631139632139633139634139635139636139637139638139639139640139641139642139643139644139645139646139647139648139649139650139651139652139653139654139655139656139657139658139659139660139661139662139663139664139665139666139667139668139669139670139671139672139673139674139675139676139677139678139679139680139681139682139683139684139685139686139687139688139689139690139691139692139693139694139695139696139697139698139699139700139701139702139703139704139705139706139707139708139709139710139711139712139713139714139715139716139717139718139719139720139721139722139723139724139725139726139727139728139729139730139731139732139733139734139735139736139737139738139739139740139741139742139743139744139745139746139747139748139749139750139751139752139753139754139755139756139757139758139759139760139761139762139763139764139765139766139767139768139769139770139771139772139773139774139775139776139777139778139779139780139781139782139783139784139785139786139787139788139789139790139791139792139793139794139795139796139797139798139799139800139801139802139803139804139805139806139807139808139809139810139811139812139813139814139815139816139817139818139819139820139821139822139823139824139825139826139827139828139829139830139831139832139833139834139835139836139837139838139839139840139841139842139843139844139845139846139847139848139849139850139851139852139853139854139855139856139857139858139859139860139861139862139863139864139865139866139867139868139869139870139871139872139873139874139875139876139877139878139879139880139881139882139883139884139885139886139887139888139889139890139891139892139893139894139895139896139897139898139899139900139901139902139903139904139905139906139907139908139909139910139911139912139913139914139915139916139917139918139919139920139921139922139923139924139925139926139927139928139929139930139931139932139933139934139935139936139937139938139939139940139941139942139943139944139945139946139947139948139949139950139951139952139953139954139955139956139957139958139959139960139961139962139963139964139965139966139967139968139969139970139971139972139973139974139975139976139977139978139979139980139981139982139983139984139985139986139987139988139989139990139991139992139993139994139995139996139997139998139999140000140001140002140003140004140005140006140007140008140009140010140011140012140013140014140015140016140017140018140019140020140021140022140023140024140025140026140027140028140029140030140031140032140033140034140035140036140037140038140039140040140041140042140043140044140045140046140047140048140049140050140051140052140053140054140055140056140057140058140059140060140061140062140063140064140065140066140067140068140069140070140071140072140073140074140075140076140077140078140079140080140081140082140083140084140085140086140087140088140089140090140091140092140093140094140095140096140097140098140099140100140101140102140103140104140105140106140107140108140109140110140111140112140113140114140115140116140117140118140119140120140121140122140123140124140125140126140127140128140129140130140131140132140133140134140135140136140137140138140139140140140141140142140143140144140145140146140147140148140149140150140151140152140153140154140155140156140157140158140159140160140161140162140163140164140165140166140167140168140169140170140171140172140173140174140175140176140177140178140179140180140181140182140183140184140185140186140187140188140189140190140191140192140193140194140195140196140197140198140199140200140201140202140203140204140205140206140207140208140209140210140211140212140213140214140215140216140217140218140219140220140221140222140223140224140225140226140227140228140229140230140231140232140233140234140235140236140237140238140239140240140241140242140243140244140245140246140247140248140249140250140251140252140253140254140255140256140257140258140259140260140261140262140263140264140265140266140267140268140269140270140271140272140273140274140275140276140277140278140279140280140281140282140283140284140285140286140287140288140289140290140291140292140293140294140295140296140297140298140299140300140301140302140303140304140305140306140307140308140309140310140311140312140313140314140315140316140317140318140319140320140321140322140323140324140325140326140327140328140329140330140331140332140333140334140335140336140337140338140339140340140341140342140343140344140345140346140347140348140349140350140351140352140353140354140355140356140357140358140359140360140361140362140363140364140365140366140367140368140369140370140371140372140373140374140375140376140377140378140379140380140381140382140383140384140385140386140387140388140389140390140391140392140393140394140395140396140397140398140399140400140401140402140403140404140405140406140407140408140409140410140411140412140413140414140415140416140417140418140419140420140421140422140423140424140425140426140427140428140429140430140431140432140433140434140435140436140437140438140439140440140441140442140443140444140445140446140447140448140449140450140451140452140453140454140455140456140457140458140459140460140461140462140463140464140465140466140467140468140469140470140471140472140473140474140475140476140477140478140479140480140481140482140483140484140485140486140487140488140489140490140491140492140493140494140495140496140497140498140499140500140501140502140503140504140505140506140507140508140509140510140511140512140513140514140515140516140517140518140519140520140521140522140523140524140525140526140527140528140529140530140531140532140533140534140535140536140537140538140539140540140541140542140543140544140545140546140547140548140549140550140551140552140553140554140555140556140557140558140559140560140561140562140563140564140565140566140567140568140569140570140571140572140573140574140575140576140577140578140579140580140581140582140583140584140585140586140587140588140589140590140591140592140593140594140595140596140597140598140599140600140601140602140603140604140605140606140607140608140609140610140611140612140613140614140615140616140617140618140619140620140621140622140623140624140625140626140627140628140629140630140631140632140633140634140635140636140637140638140639140640140641140642140643140644140645140646140647140648140649140650140651140652140653140654140655140656140657140658140659140660140661140662140663140664140665140666140667140668140669140670140671140672140673140674140675140676140677140678140679140680140681140682140683140684140685140686140687140688140689140690140691140692140693140694140695140696140697140698140699140700140701140702140703140704140705140706140707140708140709140710140711140712140713140714140715140716140717140718140719140720140721140722140723140724140725140726140727140728140729140730140731140732140733140734140735140736140737140738140739140740140741140742140743140744140745140746140747140748140749140750140751140752140753140754140755140756140757140758140759140760140761140762140763140764140765140766140767140768140769140770140771140772140773140774140775140776140777140778140779140780140781140782140783140784140785140786140787140788140789140790140791140792140793140794140795140796140797140798140799140800140801140802140803140804140805140806140807140808140809140810140811140812140813140814140815140816140817140818140819140820140821140822140823140824140825140826140827140828140829140830140831140832140833140834140835140836140837140838140839140840140841140842140843140844140845140846140847140848140849140850140851140852140853140854140855140856140857140858140859140860140861140862140863140864140865140866140867140868140869140870140871140872140873140874140875140876140877140878140879140880140881140882140883140884140885140886140887140888140889140890140891140892140893140894140895140896140897140898140899140900140901140902140903140904140905140906140907140908140909140910140911140912140913140914140915140916140917140918140919140920140921140922140923140924140925140926140927140928140929140930140931140932140933140934140935140936140937140938140939140940140941140942140943140944140945140946140947140948140949140950140951140952140953140954140955140956140957140958140959140960140961140962140963140964140965140966140967140968140969140970140971140972140973140974140975140976140977140978140979140980140981140982140983140984140985140986140987140988140989140990140991140992140993140994140995140996140997140998140999141000141001141002141003141004141005141006141007141008141009141010141011141012141013141014141015141016141017141018141019141020141021141022141023141024141025141026141027141028141029141030141031141032141033141034141035141036141037141038141039141040141041141042141043141044141045141046141047141048141049141050141051141052141053141054141055141056141057141058141059141060141061141062141063141064141065141066141067141068141069141070141071141072141073141074141075141076141077141078141079141080141081141082141083141084141085141086141087141088141089141090141091141092141093141094141095141096141097141098141099141100141101141102141103141104141105141106141107141108141109141110141111141112141113141114141115141116141117141118141119141120141121141122141123141124141125141126141127141128141129141130141131141132141133141134141135141136141137141138141139141140141141141142141143141144141145141146141147141148141149141150141151141152141153141154141155141156141157141158141159141160141161141162141163141164141165141166141167141168141169141170141171141172141173141174141175141176141177141178141179141180141181141182141183141184141185141186141187141188141189141190141191141192141193141194141195141196141197141198141199141200141201141202141203141204141205141206141207141208141209141210141211141212141213141214141215141216141217141218141219141220141221141222141223141224141225141226141227141228141229141230141231141232141233141234141235141236141237141238141239141240141241141242141243141244141245141246141247141248141249141250141251141252141253141254141255141256141257141258141259141260141261141262141263141264141265141266141267141268141269141270141271141272141273141274141275141276141277141278141279141280141281141282141283141284141285141286141287141288141289141290141291141292141293141294141295141296141297141298141299141300141301141302141303141304141305141306141307141308141309141310141311141312141313141314141315141316141317141318141319141320141321141322141323141324141325141326141327141328141329141330141331141332141333141334141335141336141337141338141339141340141341141342141343141344141345141346141347141348141349141350141351141352141353141354141355141356141357141358141359141360141361141362141363141364141365141366141367141368141369141370141371141372141373141374141375141376141377141378141379141380141381141382141383141384141385141386141387141388141389141390141391141392141393141394141395141396141397141398141399141400141401141402141403141404141405141406141407141408141409141410141411141412141413141414141415141416141417141418141419141420141421141422141423141424141425141426141427141428141429141430141431141432141433141434141435141436141437141438141439141440141441141442141443141444141445141446141447141448141449141450141451141452141453141454141455141456141457141458141459141460141461141462141463141464141465141466141467141468141469141470141471141472141473141474141475141476141477141478141479141480141481141482141483141484141485141486141487141488141489141490141491141492141493141494141495141496141497141498141499141500141501141502141503141504141505141506141507141508141509141510141511141512141513141514141515141516141517141518141519141520141521141522141523141524141525141526141527141528141529141530141531141532141533141534141535141536141537141538141539141540141541141542141543141544141545141546141547141548141549141550141551141552141553141554141555141556141557141558141559141560141561141562141563141564141565141566141567141568141569141570141571141572141573141574141575141576141577141578141579141580141581141582141583141584141585141586141587141588141589141590141591141592141593141594141595141596141597141598141599141600141601141602141603141604141605141606141607141608141609141610141611141612141613141614141615141616141617141618141619141620141621141622141623141624141625141626141627141628141629141630141631141632141633141634141635141636141637141638141639141640141641141642141643141644141645141646141647141648141649141650141651141652141653141654141655141656141657141658141659141660141661141662141663141664141665141666141667141668141669141670141671141672141673141674141675141676141677141678141679141680141681141682141683141684141685141686141687141688141689141690141691141692141693141694141695141696141697141698141699141700141701141702141703141704141705141706141707141708141709141710141711141712141713141714141715141716141717141718141719141720141721141722141723141724141725141726141727141728141729141730141731141732141733141734141735141736141737141738141739141740141741141742141743141744141745141746141747141748141749141750141751141752141753141754141755141756141757141758141759141760141761141762141763141764141765141766141767141768141769141770141771141772141773141774141775141776141777141778141779141780141781141782141783141784141785141786141787141788141789141790141791141792141793141794141795141796141797141798141799141800141801141802141803141804141805141806141807141808141809141810141811141812141813141814141815141816141817141818141819141820141821141822141823141824141825141826141827141828141829141830141831141832141833141834141835141836141837141838141839141840141841141842141843141844141845141846141847141848141849141850141851141852141853141854141855141856141857141858141859141860141861141862141863141864141865141866141867141868141869141870141871141872141873141874141875141876141877141878141879141880141881141882141883141884141885141886141887141888141889141890141891141892141893141894141895141896141897141898141899141900141901141902141903141904141905141906141907141908141909141910141911141912141913141914141915141916141917141918141919141920141921141922141923141924141925141926141927141928141929141930141931141932141933141934141935141936141937141938141939141940141941141942141943141944141945141946141947141948141949141950141951141952141953141954141955141956141957141958141959141960141961141962141963141964141965141966141967141968141969141970141971141972141973141974141975141976141977141978141979141980141981141982141983141984141985141986141987141988141989141990141991141992141993141994141995141996141997141998141999142000142001142002142003142004142005142006142007142008142009142010142011142012142013142014142015142016142017142018142019142020142021142022142023142024142025142026142027142028142029142030142031142032142033142034142035142036142037142038142039142040142041142042142043142044142045142046142047142048142049142050142051142052142053142054142055142056142057142058142059142060142061142062142063142064142065142066142067142068142069142070142071142072142073142074142075142076142077142078142079142080142081142082142083142084142085142086142087142088142089142090142091142092142093142094142095142096142097142098142099142100142101142102142103142104142105142106142107142108142109142110142111142112142113142114142115142116142117142118142119142120142121142122142123142124142125142126142127142128142129142130142131142132142133142134142135142136142137142138142139142140142141142142142143142144142145142146142147142148142149142150142151142152142153142154142155142156142157142158142159142160142161142162142163142164142165142166142167142168142169142170142171142172142173142174142175142176142177142178142179142180142181142182142183142184142185142186142187142188142189142190142191142192142193142194142195142196142197142198142199142200142201142202142203142204142205142206142207142208142209142210142211142212142213142214142215142216142217142218142219142220142221142222142223142224142225142226142227142228142229142230142231142232142233142234142235142236142237142238142239142240142241142242142243142244142245142246142247142248142249142250142251142252142253142254142255142256142257142258142259142260142261142262142263142264142265142266142267142268142269142270142271142272142273142274142275142276142277142278142279142280142281142282142283142284142285142286142287142288142289142290142291142292142293142294142295142296142297142298142299142300142301142302142303142304142305142306142307142308142309142310142311142312142313142314142315142316142317142318142319142320142321142322142323142324142325142326142327142328142329142330142331142332142333142334142335142336142337142338142339142340142341142342142343142344142345142346142347142348142349142350142351142352142353142354142355142356142357142358142359142360142361142362142363142364142365142366142367142368142369142370142371142372142373142374142375142376142377142378142379142380142381142382142383142384142385142386142387142388142389142390142391142392142393142394142395142396142397142398142399142400142401142402142403142404142405142406142407142408142409142410142411142412142413142414142415142416142417142418142419142420142421142422142423142424142425142426142427142428142429142430142431142432142433142434142435142436142437142438142439142440142441142442142443142444142445142446142447142448142449142450142451142452142453142454142455142456142457142458142459142460142461142462142463142464142465142466142467142468142469142470142471142472142473142474142475142476142477142478142479142480142481142482142483142484142485142486142487142488142489142490142491142492142493142494142495142496142497142498142499142500142501142502142503142504142505142506142507142508142509142510142511142512142513142514142515142516142517142518142519142520142521142522142523142524142525142526142527142528142529142530142531142532142533142534142535142536142537142538142539142540142541142542142543142544142545142546142547142548142549142550142551142552142553142554142555142556142557142558142559142560142561142562142563142564142565142566142567142568142569142570142571142572142573142574142575142576142577142578142579142580142581142582142583142584142585142586142587142588142589142590142591142592142593142594142595142596142597142598142599142600142601142602142603142604142605142606142607142608142609142610142611142612142613142614142615142616142617142618142619142620142621142622142623142624142625142626142627142628142629142630142631142632142633142634142635142636142637142638142639142640142641142642142643142644142645142646142647142648142649142650142651142652142653142654142655142656142657142658142659142660142661142662142663142664142665142666142667142668142669142670142671142672142673142674142675142676142677142678142679142680142681142682142683142684142685142686142687142688142689142690142691142692142693142694142695142696142697142698142699142700142701142702142703142704142705142706142707142708142709142710142711142712142713142714142715142716142717142718142719142720142721142722142723142724142725142726142727142728142729142730142731142732142733142734142735142736142737142738142739142740142741142742142743142744142745142746142747142748142749142750142751142752142753142754142755142756142757142758142759142760142761142762142763142764142765142766142767142768142769142770142771142772142773142774142775142776142777142778142779142780142781142782142783142784142785142786142787142788142789142790142791142792142793142794142795142796142797142798142799142800142801142802142803142804142805142806142807142808142809142810142811142812142813142814142815142816142817142818142819142820142821142822142823142824142825142826142827142828142829142830142831142832142833142834142835142836142837142838142839142840142841142842142843142844142845142846142847142848142849142850142851142852142853142854142855142856142857142858142859142860142861142862142863142864142865142866142867142868142869142870142871142872142873142874142875142876142877142878142879142880142881142882142883142884142885142886142887142888142889142890142891142892142893142894142895142896142897142898142899142900142901142902142903142904142905142906142907142908142909142910142911142912142913142914142915142916142917142918142919142920142921142922142923142924142925142926142927142928142929142930142931142932142933142934142935142936142937142938142939142940142941142942142943142944142945142946142947142948142949142950142951142952142953142954142955142956142957142958142959142960142961142962142963142964142965142966142967142968142969142970142971142972142973142974142975142976142977142978142979142980142981142982142983142984142985142986142987142988142989142990142991142992142993142994142995142996142997142998142999143000143001143002143003143004143005143006143007143008143009143010143011143012143013143014143015143016143017143018143019143020143021143022143023143024143025143026143027143028143029143030143031143032143033143034143035143036143037143038143039143040143041143042143043143044143045143046143047143048143049143050143051143052143053143054143055143056143057143058143059143060143061143062143063143064143065143066143067143068143069143070143071143072143073143074143075143076143077143078143079143080143081143082143083143084143085143086143087143088143089143090143091143092143093143094143095143096143097143098143099143100143101143102143103143104143105143106143107143108143109143110143111143112143113143114143115143116143117143118143119143120143121143122143123143124143125143126143127143128143129143130143131143132143133143134143135143136143137143138143139143140143141143142143143143144143145143146143147143148143149143150143151143152143153143154143155143156143157143158143159143160143161143162143163143164143165143166143167143168143169143170143171143172143173143174143175143176143177143178143179143180143181143182143183143184143185143186143187143188143189143190143191143192143193143194143195143196143197143198143199143200143201143202143203143204143205143206143207143208143209143210143211143212143213143214143215143216143217143218143219143220143221143222143223143224143225143226143227143228143229143230143231143232143233143234143235143236143237143238143239143240143241143242143243143244143245143246143247143248143249143250143251143252143253143254143255143256143257143258143259143260143261143262143263143264143265143266143267143268143269143270143271143272143273143274143275143276143277143278143279143280143281143282143283143284143285143286143287143288143289143290143291143292143293143294143295143296143297143298143299143300143301143302143303143304143305143306143307143308143309143310143311143312143313143314143315143316143317143318143319143320143321143322143323143324143325143326143327143328143329143330143331143332143333143334143335143336143337143338143339143340143341143342143343143344143345143346143347143348143349143350143351143352143353143354143355143356143357143358143359143360143361143362143363143364143365143366143367143368143369143370143371143372143373143374143375143376143377143378143379143380143381143382143383143384143385143386143387143388143389143390143391143392143393143394143395143396143397143398143399143400143401143402143403143404143405143406143407143408143409143410143411143412143413143414143415143416143417143418143419143420143421143422143423143424143425143426143427143428143429143430143431143432143433143434143435143436143437143438143439143440143441143442143443143444143445143446143447143448143449143450143451143452143453143454143455143456143457143458143459143460143461143462143463143464143465143466143467143468143469143470143471143472143473143474143475143476143477143478143479143480143481143482143483143484143485143486143487143488143489143490143491143492143493143494143495143496143497143498143499143500143501143502143503143504143505143506143507143508143509143510143511143512143513143514143515143516143517143518143519143520143521143522143523143524143525143526143527143528143529143530143531143532143533143534143535143536143537143538143539143540143541143542143543143544143545143546143547143548143549143550143551143552143553143554143555143556143557143558143559143560143561143562143563143564143565143566143567143568143569143570143571143572143573143574143575143576143577143578143579143580143581143582143583143584143585143586143587143588143589143590143591143592143593143594143595143596143597143598143599143600143601143602143603143604143605143606143607143608143609143610143611143612143613143614143615143616143617143618143619143620143621143622143623143624143625143626143627143628143629143630143631143632143633143634143635143636143637143638143639143640143641143642143643143644143645143646143647143648143649143650143651143652143653143654143655143656143657143658143659143660143661143662143663143664143665143666143667143668143669143670143671143672143673143674143675143676143677143678143679143680143681143682143683143684143685143686143687143688143689143690143691143692143693143694143695143696143697143698143699143700143701143702143703143704143705143706143707143708143709143710143711143712143713143714143715143716143717143718143719143720143721143722143723143724143725143726143727143728143729143730143731143732143733143734143735143736143737143738143739143740143741143742143743143744143745143746143747143748143749143750143751143752143753143754143755143756143757143758143759143760143761143762143763143764143765143766143767143768143769143770143771143772143773143774143775143776143777143778143779143780143781143782143783143784143785143786143787143788143789143790143791143792143793143794143795143796143797143798143799143800143801143802143803143804143805143806143807143808143809143810143811143812143813143814143815143816143817143818143819143820143821143822143823143824143825143826143827143828143829143830143831143832143833143834143835143836143837143838143839143840143841143842143843143844143845143846143847143848143849143850143851143852143853143854143855143856143857143858143859143860143861143862143863143864143865143866143867143868143869143870143871143872143873143874143875143876143877143878143879143880143881143882143883143884143885143886143887143888143889143890143891143892143893143894143895143896143897143898143899143900143901143902143903143904143905143906143907143908143909143910143911143912143913143914143915143916143917143918143919143920143921143922143923143924143925143926143927143928143929143930143931143932143933143934143935143936143937143938143939143940143941143942143943143944143945143946143947143948143949143950143951143952143953143954143955143956143957143958143959143960143961143962143963143964143965143966143967143968143969143970143971143972143973143974143975143976143977143978143979143980143981143982143983143984143985143986143987143988143989143990143991143992143993143994143995143996143997143998143999144000144001144002144003144004144005144006144007144008144009144010144011144012144013144014144015144016144017144018144019144020144021144022144023144024144025144026144027144028144029144030144031144032144033144034144035144036144037144038144039144040144041144042144043144044144045144046144047144048144049144050144051144052144053144054144055144056144057144058144059144060144061144062144063144064144065144066144067144068144069144070144071144072144073144074144075144076144077144078144079144080144081144082144083144084144085144086144087144088144089144090144091144092144093144094144095144096144097144098144099144100144101144102144103144104144105144106144107144108144109144110144111144112144113144114144115144116144117144118144119144120144121144122144123144124144125144126144127144128144129144130144131144132144133144134144135144136144137144138144139144140144141144142144143144144144145144146144147144148144149144150144151144152144153144154144155144156144157144158144159144160144161144162144163144164144165144166144167144168144169144170144171144172144173144174144175144176144177144178144179144180144181144182144183144184144185144186144187144188144189144190144191144192144193144194144195144196144197144198144199144200144201144202144203144204144205144206144207144208144209144210144211144212144213144214144215144216144217144218144219144220144221144222144223144224144225144226144227144228144229144230144231144232144233144234144235144236144237144238144239144240144241144242144243144244144245144246144247144248144249144250144251144252144253144254144255144256144257144258144259144260144261144262144263144264144265144266144267144268144269144270144271144272144273144274144275144276144277144278144279144280144281144282144283144284144285144286144287144288144289144290144291144292144293144294144295144296144297144298144299144300144301144302144303144304144305144306144307144308144309144310144311144312144313144314144315144316144317144318144319144320144321144322144323144324144325144326144327144328144329144330144331144332144333144334144335144336144337144338144339144340144341144342144343144344144345144346144347144348144349144350144351144352144353144354144355144356144357144358144359144360144361144362144363144364144365144366144367144368144369144370144371144372144373144374144375144376144377144378144379144380144381144382144383144384144385144386144387144388144389144390144391144392144393144394144395144396144397144398144399144400144401144402144403144404144405144406144407144408144409144410144411144412144413144414144415144416144417144418144419144420144421144422144423144424144425144426144427144428144429144430144431144432144433144434144435144436144437144438144439144440144441144442144443144444144445144446144447144448144449144450144451144452144453144454144455144456144457144458144459144460144461144462144463144464144465144466144467144468144469144470144471144472144473144474144475144476144477144478144479144480144481144482144483144484144485144486144487144488144489144490144491144492144493144494144495144496144497144498144499144500144501144502144503144504144505144506144507144508144509144510144511144512144513144514144515144516144517144518144519144520144521144522144523144524144525144526144527144528144529144530144531144532144533144534144535144536144537144538144539144540144541144542144543144544144545144546144547144548144549144550144551144552144553144554144555144556144557144558144559144560144561144562144563144564144565144566144567144568144569144570144571144572144573144574144575144576144577144578144579144580144581144582144583144584144585144586144587144588144589144590144591144592144593144594144595144596144597144598144599144600144601144602144603144604144605144606144607144608144609144610144611144612144613144614144615144616144617144618144619144620144621144622144623144624144625144626144627144628144629144630144631144632144633144634144635144636144637144638144639144640144641144642144643144644144645144646144647144648144649144650144651144652144653144654144655144656144657144658144659144660144661144662144663144664144665144666144667144668144669144670144671144672144673144674144675144676144677144678144679144680144681144682144683144684144685144686144687144688144689144690144691144692144693144694144695144696144697144698144699144700144701144702144703144704144705144706144707144708144709144710144711144712144713144714144715144716144717144718144719144720144721144722144723144724144725144726144727144728144729144730144731144732144733144734144735144736144737144738144739144740144741144742144743144744144745144746144747144748144749144750144751144752144753144754144755144756144757144758144759144760144761144762144763144764144765144766144767144768144769144770144771144772144773144774144775144776144777144778144779144780144781144782144783144784144785144786144787144788144789144790144791144792144793144794144795144796144797144798144799144800144801144802144803144804144805144806144807144808144809144810144811144812144813144814144815144816144817144818144819144820144821144822144823144824144825144826144827144828144829144830144831144832144833144834144835144836144837144838144839144840144841144842144843144844144845144846144847144848144849144850144851144852144853144854144855144856144857144858144859144860144861144862144863144864144865144866144867144868144869144870144871144872144873144874144875144876144877144878144879144880144881144882144883144884144885144886144887144888144889144890144891144892144893144894144895144896144897144898144899144900144901144902144903144904144905144906144907144908144909144910144911144912144913144914144915144916144917144918144919144920144921144922144923144924144925144926144927144928144929144930144931144932144933144934144935144936144937144938144939144940144941144942144943144944144945144946144947144948144949144950144951144952144953144954144955144956144957144958144959144960144961144962144963144964144965144966144967144968144969144970144971144972144973144974144975144976144977144978144979144980144981144982144983144984144985144986144987144988144989144990144991144992144993144994144995144996144997144998144999145000145001145002145003145004145005145006145007145008145009145010145011145012145013145014145015145016145017145018145019145020145021145022145023145024145025145026145027145028145029145030145031145032145033145034145035145036145037145038145039145040145041145042145043145044145045145046145047145048145049145050145051145052145053145054145055145056145057145058145059145060145061145062145063145064145065145066145067145068145069145070145071145072145073145074145075145076145077145078145079145080145081145082145083145084145085145086145087145088145089145090145091145092145093145094145095145096145097145098145099145100145101145102145103145104145105145106145107145108145109145110145111145112145113145114145115145116145117145118145119145120145121145122145123145124145125145126145127145128145129145130145131145132145133145134145135145136145137145138145139145140145141145142145143145144145145145146145147145148145149145150145151145152145153145154145155145156145157145158145159145160145161145162145163145164145165145166145167145168145169145170145171145172145173145174145175145176145177145178145179145180145181145182145183145184145185145186145187145188145189145190145191145192145193145194145195145196145197145198145199145200145201145202145203145204145205145206145207145208145209145210145211145212145213145214145215145216145217145218145219145220145221145222145223145224145225145226145227145228145229145230145231145232145233145234145235145236145237145238145239145240145241145242145243145244145245145246145247145248145249145250145251145252145253145254145255145256145257145258145259145260145261145262145263145264145265145266145267145268145269145270145271145272145273145274145275145276145277145278145279145280145281145282145283145284145285145286145287145288145289145290145291145292145293145294145295145296145297145298145299145300145301145302145303145304145305145306145307145308145309145310145311145312145313145314145315145316145317145318145319145320145321145322145323145324145325145326145327145328145329145330145331145332145333145334145335145336145337145338145339145340145341145342145343145344145345145346145347145348145349145350145351145352145353145354145355145356145357145358145359145360145361145362145363145364145365145366145367145368145369145370145371145372145373145374145375145376145377145378145379145380145381145382145383145384145385145386145387145388145389145390145391145392145393145394145395145396145397145398145399145400145401145402145403145404145405145406145407145408145409145410145411145412145413145414145415145416145417145418145419145420145421145422145423145424145425145426145427145428145429145430145431145432145433145434145435145436145437145438145439145440145441145442145443145444145445145446145447145448145449145450145451145452145453145454145455145456145457145458145459145460145461145462145463145464145465145466145467145468145469145470145471145472145473145474145475145476145477145478145479145480145481145482145483145484145485145486145487145488145489145490145491145492145493145494145495145496145497145498145499145500145501145502145503145504145505145506145507145508145509145510145511145512145513145514145515145516145517145518145519145520145521145522145523145524145525145526145527145528145529145530145531145532145533145534145535145536145537145538145539145540145541145542145543145544145545145546145547145548145549145550145551145552145553145554145555145556145557145558145559145560145561145562145563145564145565145566145567145568145569145570145571145572145573145574145575145576145577145578145579145580145581145582145583145584145585145586145587145588145589145590145591145592145593145594145595145596145597145598145599145600145601145602145603145604145605145606145607145608145609145610145611145612145613145614145615145616145617145618145619145620145621145622145623145624145625145626145627145628145629145630145631145632145633145634145635145636145637145638145639145640145641145642145643145644145645145646145647145648145649145650145651145652145653145654145655145656145657145658145659145660145661145662145663145664145665145666145667145668145669145670145671145672145673145674145675145676145677145678145679145680145681145682145683145684145685145686145687145688145689145690145691145692145693145694145695145696145697145698145699145700145701145702145703145704145705145706145707145708145709145710145711145712145713145714145715145716145717145718145719145720145721145722145723145724145725145726145727145728145729145730145731145732145733145734145735145736145737145738145739145740145741145742145743145744145745145746145747145748145749145750145751145752145753145754145755145756145757145758145759145760145761145762145763145764145765145766145767145768145769145770145771145772145773145774145775145776145777145778145779145780145781145782145783145784145785145786145787145788145789145790145791145792145793145794145795145796145797145798145799145800145801145802145803145804145805145806145807145808145809145810145811145812145813145814145815145816145817145818145819145820145821145822145823145824145825145826145827145828145829145830145831145832145833145834145835145836145837145838145839145840145841145842145843145844145845145846145847145848145849145850145851145852145853145854145855145856145857145858145859145860145861145862145863145864145865145866145867145868145869145870145871145872145873145874145875145876145877145878145879145880145881145882145883145884145885145886145887145888145889145890145891145892145893145894145895145896145897145898145899145900145901145902145903145904145905145906145907145908145909145910145911145912145913145914145915145916145917145918145919145920145921145922145923145924145925145926145927145928145929145930145931145932145933145934145935145936145937145938145939145940145941145942145943145944145945145946145947145948145949145950145951145952145953145954145955145956145957145958145959145960145961145962145963145964145965145966145967145968145969145970145971145972145973145974145975145976145977145978145979145980145981145982145983145984145985145986145987145988145989145990145991145992145993145994145995145996145997145998145999146000146001146002146003146004146005146006146007146008146009146010146011146012146013146014146015146016146017146018146019146020146021146022146023146024146025146026146027146028146029146030146031146032146033146034146035146036146037146038146039146040146041146042146043146044146045146046146047146048146049146050146051146052146053146054146055146056146057146058146059146060146061146062146063146064146065146066146067146068146069146070146071146072146073146074146075146076146077146078146079146080146081146082146083146084146085146086146087146088146089146090146091146092146093146094146095146096146097146098146099146100146101146102146103146104146105146106146107146108146109146110146111146112146113146114146115146116146117146118146119146120146121146122146123146124146125146126146127146128146129146130146131146132146133146134146135146136146137146138146139146140146141146142146143146144146145146146146147146148146149146150146151146152146153146154146155146156146157146158146159146160146161146162146163146164146165146166146167146168146169146170146171146172146173146174146175146176146177146178146179146180146181146182146183146184146185146186146187146188146189146190146191146192146193146194146195146196146197146198146199146200146201146202146203146204146205146206146207146208146209146210146211146212146213146214146215146216146217146218146219146220146221146222146223146224146225146226146227146228146229146230146231146232146233146234146235146236146237146238146239146240146241146242146243146244146245146246146247146248146249146250146251146252146253146254146255146256146257146258146259146260146261146262146263146264146265146266146267146268146269146270146271146272146273146274146275146276146277146278146279146280146281146282146283146284146285146286146287146288146289146290146291146292146293146294146295146296146297146298146299146300146301146302146303146304146305146306146307146308146309146310146311146312146313146314146315146316146317146318146319146320146321146322146323146324146325146326146327146328146329146330146331146332146333146334146335146336146337146338146339146340146341146342146343146344146345146346146347146348146349146350146351146352146353146354146355146356146357146358146359146360146361146362146363146364146365146366146367146368146369146370146371146372146373146374146375146376146377146378146379146380146381146382146383146384146385146386146387146388146389146390146391146392146393146394146395146396146397146398146399146400146401146402146403146404146405146406146407146408146409146410146411146412146413146414146415146416146417146418146419146420146421146422146423146424146425146426146427146428146429146430146431146432146433146434146435146436146437146438146439146440146441146442146443146444146445146446146447146448146449146450146451146452146453146454146455146456146457146458146459146460146461146462146463146464146465146466146467146468146469146470146471146472146473146474146475146476146477146478146479146480146481146482146483146484146485146486146487146488146489146490146491146492146493146494146495146496146497146498146499146500146501146502146503146504146505146506146507146508146509146510146511146512146513146514146515146516146517146518146519146520146521146522146523146524146525146526146527146528146529146530146531146532146533146534146535146536146537146538146539146540146541146542146543146544146545146546146547146548146549146550146551146552146553146554146555146556146557146558146559146560146561146562146563146564146565146566146567146568146569146570146571146572146573146574146575146576146577146578146579146580146581146582146583146584146585146586146587146588146589146590146591146592146593146594146595146596146597146598146599146600146601146602146603146604146605146606146607146608146609146610146611146612146613146614146615146616146617146618146619146620146621146622146623146624146625146626146627146628146629146630146631146632146633146634146635146636146637146638146639146640146641146642146643146644146645146646146647146648146649146650146651146652146653146654146655146656146657146658146659146660146661146662146663146664146665146666146667146668146669146670146671146672146673146674146675146676146677146678146679146680146681146682146683146684146685146686146687146688146689146690146691146692146693146694146695146696146697146698146699146700146701146702146703146704146705146706146707146708146709146710146711146712146713146714146715146716146717146718146719146720146721146722146723146724146725146726146727146728146729146730146731146732146733146734146735146736146737146738146739146740146741146742146743146744146745146746146747146748146749146750146751146752146753146754146755146756146757146758146759146760146761146762146763146764146765146766146767146768146769146770146771146772146773146774146775146776146777146778146779146780146781146782146783146784146785146786146787146788146789146790146791146792146793146794146795146796146797146798146799146800146801146802146803146804146805146806146807146808146809146810146811146812146813146814146815146816146817146818146819146820146821146822146823146824146825146826146827146828146829146830146831146832146833146834146835146836146837146838146839146840146841146842146843146844146845146846146847146848146849146850146851146852146853146854146855146856146857146858146859146860146861146862146863146864146865146866146867146868146869146870146871146872146873146874146875146876146877146878146879146880146881146882146883146884146885146886146887146888146889146890146891146892146893146894146895146896146897146898146899146900146901146902146903146904146905146906146907146908146909146910146911146912146913146914146915146916146917146918146919146920146921146922146923146924146925146926146927146928146929146930146931146932146933146934146935146936146937146938146939146940146941146942146943146944146945146946146947146948146949146950146951146952146953146954146955146956146957146958146959146960146961146962146963146964146965146966146967146968146969146970146971146972146973146974146975146976146977146978146979146980146981146982146983146984146985146986146987146988146989146990146991146992146993146994146995146996146997146998146999147000147001147002147003147004147005147006147007147008147009147010147011147012147013147014147015147016147017147018147019147020147021147022147023147024147025147026147027147028147029147030147031147032147033147034147035147036147037147038147039147040147041147042147043147044147045147046147047147048147049147050147051147052147053147054147055147056147057147058147059147060147061147062147063147064147065147066147067147068147069147070147071147072147073147074147075147076147077147078147079147080147081147082147083147084147085147086147087147088147089147090147091147092147093147094147095147096147097147098147099147100147101147102147103147104147105147106147107147108147109147110147111147112147113147114147115147116147117147118147119147120147121147122147123147124147125147126147127147128147129147130147131147132147133147134147135147136147137147138147139147140147141147142147143147144147145147146147147147148147149147150147151147152147153147154147155147156147157147158147159147160147161147162147163147164147165147166147167147168147169147170147171147172147173147174147175147176147177147178147179147180147181147182147183147184147185147186147187147188147189147190147191147192147193147194147195147196147197147198147199147200147201147202147203147204147205147206147207147208147209147210147211147212147213147214147215147216147217147218147219147220147221147222147223147224147225147226147227147228147229147230147231147232147233147234147235147236147237147238147239147240147241147242147243147244147245147246147247147248147249147250147251147252147253147254147255147256147257147258147259147260147261147262147263147264147265147266147267147268147269147270147271147272147273147274147275147276147277147278147279147280147281147282147283147284147285147286147287147288147289147290147291147292147293147294147295147296147297147298147299147300147301147302147303147304147305147306147307147308147309147310147311147312147313147314147315147316147317147318147319147320147321147322147323147324147325147326147327147328147329147330147331147332147333147334147335147336147337147338147339147340147341147342147343147344147345147346147347147348147349147350147351147352147353147354147355147356147357147358147359147360147361147362147363147364147365147366147367147368147369147370147371147372147373147374147375147376147377147378147379147380147381147382147383147384147385147386147387147388147389147390147391147392147393147394147395147396147397147398147399147400147401147402147403147404147405147406147407147408147409147410147411147412147413147414147415147416147417147418147419147420147421147422147423147424147425147426147427147428147429147430147431147432147433147434147435147436147437147438147439147440147441147442147443147444147445147446147447147448147449147450147451147452147453147454147455147456147457147458147459147460147461147462147463147464147465147466147467147468147469147470147471147472147473147474147475147476147477147478147479147480147481147482147483147484147485147486147487147488147489147490147491147492147493147494147495147496147497147498147499147500147501147502147503147504147505147506147507147508147509147510147511147512147513147514147515147516147517147518147519147520147521147522147523147524147525147526147527147528147529147530147531147532147533147534147535147536147537147538147539147540147541147542147543147544147545147546147547147548147549147550147551147552147553147554147555147556147557147558147559147560147561147562147563147564147565147566147567147568147569147570147571147572147573147574147575147576147577147578147579147580147581147582147583147584147585147586147587147588147589147590147591147592147593147594147595147596147597147598147599147600147601147602147603147604147605147606147607147608147609147610147611147612147613147614147615147616147617147618147619147620147621147622147623147624147625147626147627147628147629147630147631147632147633147634147635147636147637147638147639147640147641147642147643147644147645147646147647147648147649147650147651147652147653147654147655147656147657147658147659147660147661147662147663147664147665147666147667147668147669147670147671147672147673147674147675147676147677147678147679147680147681147682147683147684147685147686147687147688147689147690147691147692147693147694147695147696147697147698147699147700147701147702147703147704147705147706147707147708147709147710147711147712147713147714147715147716147717147718147719147720147721147722147723147724147725147726147727147728147729147730147731147732147733147734147735147736147737147738147739147740147741147742147743147744147745147746147747147748147749147750147751147752147753147754147755147756147757147758147759147760147761147762147763147764147765147766147767147768147769147770147771147772147773147774147775147776147777147778147779147780147781147782147783147784147785147786147787147788147789147790147791147792147793147794147795147796147797147798147799147800147801147802147803147804147805147806147807147808147809147810147811147812147813147814147815147816147817147818147819147820147821147822147823147824147825147826147827147828147829147830147831147832147833147834147835147836147837147838147839147840147841147842147843147844147845147846147847147848147849147850147851147852147853147854147855147856147857147858147859147860147861147862147863147864147865147866147867147868147869147870147871147872147873147874147875147876147877147878147879147880147881147882147883147884147885147886147887147888147889147890147891147892147893147894147895147896147897147898147899147900147901147902147903147904147905147906147907147908147909147910147911147912147913147914147915147916147917147918147919147920147921147922147923147924147925147926147927147928147929147930147931147932147933147934147935147936147937147938147939147940147941147942147943147944147945147946147947147948147949147950147951147952147953147954147955147956147957147958147959147960147961147962147963147964147965147966147967147968147969147970147971147972147973147974147975147976147977147978147979147980147981147982147983147984147985147986147987147988147989147990147991147992147993147994147995147996147997147998147999148000148001148002148003148004148005148006148007148008148009148010148011148012148013148014148015148016148017148018148019148020148021148022148023148024148025148026148027148028148029148030148031148032148033148034148035148036148037148038148039148040148041148042148043148044148045148046148047148048148049148050148051148052148053148054148055148056148057148058148059148060148061148062148063148064148065148066148067148068148069148070148071148072148073148074148075148076148077148078148079148080148081148082148083148084148085148086148087148088148089148090148091148092148093148094148095148096148097148098148099148100148101148102148103148104148105148106148107148108148109148110148111148112148113148114148115148116148117148118148119148120148121148122148123148124148125148126148127148128148129148130148131148132148133148134148135148136148137148138148139148140148141148142148143148144148145148146148147148148148149148150148151148152148153148154148155148156148157148158148159148160148161148162148163148164148165148166148167148168148169148170148171148172148173148174148175148176148177148178148179148180148181148182148183148184148185148186148187148188148189148190148191148192148193148194148195148196148197148198148199148200148201148202148203148204148205148206148207148208148209148210148211148212148213148214148215148216148217148218148219148220148221148222148223148224148225148226148227148228148229148230148231148232148233148234148235148236148237148238148239148240148241148242148243148244148245148246148247148248148249148250148251148252148253148254148255148256148257148258148259148260148261148262148263148264148265148266148267148268148269148270148271148272148273148274148275148276148277148278148279148280148281148282148283148284148285148286148287148288148289148290148291148292148293148294148295148296148297148298148299148300148301148302148303148304148305148306148307148308148309148310148311148312148313148314148315148316148317148318148319148320148321148322148323148324148325148326148327148328148329148330148331148332148333148334148335148336148337148338148339148340148341148342148343148344148345148346148347148348148349148350148351148352148353148354148355148356148357148358148359148360148361148362148363148364148365148366148367148368148369148370148371148372148373148374148375148376148377148378148379148380148381148382148383148384148385148386148387148388148389148390148391148392148393148394148395148396148397148398148399148400148401148402148403148404148405148406148407148408148409148410148411148412148413148414148415148416148417148418148419148420148421148422148423148424148425148426148427148428148429148430148431148432148433148434148435148436148437148438148439148440148441148442148443148444148445148446148447148448148449148450148451148452148453148454148455148456148457148458148459148460148461148462148463148464148465148466148467148468148469148470148471148472148473148474148475148476148477148478148479148480148481148482148483148484148485148486148487148488148489148490148491148492148493148494148495148496148497148498148499148500148501148502148503148504148505148506148507148508148509148510148511148512148513148514148515148516148517148518148519148520148521148522148523148524148525148526148527148528148529148530148531148532148533148534148535148536148537148538148539148540148541148542148543148544148545148546148547148548148549148550148551148552148553148554148555148556148557148558148559148560148561148562148563148564148565148566148567148568148569148570148571148572148573148574148575148576148577148578148579148580148581148582148583148584148585148586148587148588148589148590148591148592148593148594148595148596148597148598148599148600148601148602148603148604148605148606148607148608148609148610148611148612148613148614148615148616148617148618148619148620148621148622148623148624148625148626148627148628148629148630148631148632148633148634148635148636148637148638148639148640148641148642148643148644148645148646148647148648148649148650148651148652148653148654148655148656148657148658148659148660148661148662148663148664148665148666148667148668148669148670148671148672148673148674148675148676148677148678148679148680148681148682148683148684148685148686148687148688148689148690148691148692148693148694148695148696148697148698148699148700148701148702148703148704148705148706148707148708148709148710148711148712148713148714148715148716148717148718148719148720148721148722148723148724148725148726148727148728148729148730148731148732148733148734148735148736148737148738148739148740148741148742148743148744148745148746148747148748148749148750148751148752148753148754148755148756148757148758148759148760148761148762148763148764148765148766148767148768148769148770148771148772148773148774148775148776148777148778148779148780148781148782148783148784148785148786148787148788148789148790148791148792148793148794148795148796148797148798148799148800148801148802148803148804148805148806148807148808148809148810148811148812148813148814148815148816148817148818148819148820148821148822148823148824148825148826148827148828148829148830148831148832148833148834148835148836148837148838148839148840148841148842148843148844148845148846148847148848148849148850148851148852148853148854148855148856148857148858148859148860148861148862148863148864148865148866148867148868148869148870148871148872148873148874148875148876148877148878148879148880148881148882148883148884148885148886148887148888148889148890148891148892148893148894148895148896148897148898148899148900148901148902148903148904148905148906148907148908148909148910148911148912148913148914148915148916148917148918148919148920148921148922148923148924148925148926148927148928148929148930148931148932148933148934148935148936148937148938148939148940148941148942148943148944148945148946148947148948148949148950148951148952148953148954148955148956148957148958148959148960148961148962148963148964148965148966148967148968148969148970148971148972148973148974148975148976148977148978148979148980148981148982148983148984148985148986148987148988148989148990148991148992148993148994148995148996148997148998148999149000149001149002149003149004149005149006149007149008149009149010149011149012149013149014149015149016149017149018149019149020149021149022149023149024149025149026149027149028149029149030149031149032149033149034149035149036149037149038149039149040149041149042149043149044149045149046149047149048149049149050149051149052149053149054149055149056149057149058149059149060149061149062149063149064149065149066149067149068149069149070149071149072149073149074149075149076149077149078149079149080149081149082149083149084149085149086149087149088149089149090149091149092149093149094149095149096149097149098149099149100149101149102149103149104149105149106149107149108149109149110149111149112149113149114149115149116149117149118149119149120149121149122149123149124149125149126149127149128149129149130149131149132149133149134149135149136149137149138149139149140149141149142149143149144149145149146149147149148149149149150149151149152149153149154149155149156149157149158149159149160149161149162149163149164149165149166149167149168149169149170149171149172149173149174149175149176149177149178149179149180149181149182149183149184149185149186149187149188149189149190149191149192149193149194149195149196149197149198149199149200149201149202149203149204149205149206149207149208149209149210149211149212149213149214149215149216149217149218149219149220149221149222149223149224149225149226149227149228149229149230149231149232149233149234149235149236149237149238149239149240149241149242149243149244149245149246149247149248149249149250149251149252149253149254149255149256149257149258149259149260149261149262149263149264149265149266149267149268149269149270149271149272149273149274149275149276149277149278149279149280149281149282149283149284149285149286149287149288149289149290149291149292149293149294149295149296149297149298149299149300149301149302149303149304149305149306149307149308149309149310149311149312149313149314149315149316149317149318149319149320149321149322149323149324149325149326149327149328149329149330149331149332149333149334149335149336149337149338149339149340149341149342149343149344149345149346149347149348149349149350149351149352149353149354149355149356149357149358149359149360149361149362149363149364149365149366149367149368149369149370149371149372149373149374149375149376149377149378149379149380149381149382149383149384149385149386149387149388149389149390149391149392149393149394149395149396149397149398149399149400149401149402149403149404149405149406149407149408149409149410149411149412149413149414149415149416149417149418149419149420149421149422149423149424149425149426149427149428149429149430149431149432149433149434149435149436149437149438149439149440149441149442149443149444149445149446149447149448149449149450149451149452149453149454149455149456149457149458149459149460149461149462149463149464149465149466149467149468149469149470149471149472149473149474149475149476149477149478149479149480149481149482149483149484149485149486149487149488149489149490149491149492149493149494149495149496149497149498149499149500149501149502149503149504149505149506149507149508149509149510149511149512149513149514149515149516149517149518149519149520149521149522149523149524149525149526149527149528149529149530149531149532149533149534149535149536149537149538149539149540149541149542149543149544149545149546149547149548149549149550149551149552149553149554149555149556149557149558149559149560149561149562149563149564149565149566149567149568149569149570149571149572149573149574149575149576149577149578149579149580149581149582149583149584149585149586149587149588149589149590149591149592149593149594149595149596149597149598149599149600149601149602149603149604149605149606149607149608149609149610149611149612149613149614149615149616149617149618149619149620149621149622149623149624149625149626149627149628149629149630149631149632149633149634149635149636149637149638149639149640149641149642149643149644149645149646149647149648149649149650149651149652149653149654149655149656149657149658149659149660149661149662149663149664149665149666149667149668149669149670149671149672149673149674149675149676149677149678149679149680149681149682149683149684149685149686149687149688149689149690149691149692149693149694149695149696149697149698149699149700149701149702149703149704149705149706149707149708149709149710149711149712149713149714149715149716149717149718149719149720149721149722149723149724149725149726149727149728149729149730149731149732149733149734149735149736149737149738149739149740149741149742149743149744149745149746149747149748149749149750149751149752149753149754149755149756149757149758149759149760149761149762149763149764149765149766149767149768149769149770149771149772149773149774149775149776149777149778149779149780149781149782149783149784149785149786149787149788149789149790149791149792149793149794149795149796149797149798149799149800149801149802149803149804149805149806149807149808149809149810149811149812149813149814149815149816149817149818149819149820149821149822149823149824149825149826149827149828149829149830149831149832149833149834149835149836149837149838149839149840149841149842149843149844149845149846149847149848149849149850149851149852149853149854149855149856149857149858149859149860149861149862149863149864149865149866149867149868149869149870149871149872149873149874149875149876149877149878149879149880149881149882149883149884149885149886149887149888149889149890149891149892149893149894149895149896149897149898149899149900149901149902149903149904149905149906149907149908149909149910149911149912149913149914149915149916149917149918149919149920149921149922149923149924149925149926149927149928149929149930149931149932149933149934149935149936149937149938149939149940149941149942149943149944149945149946149947149948149949149950149951149952149953149954149955149956149957149958149959149960149961149962149963149964149965149966149967149968149969149970149971149972149973149974149975149976149977149978149979149980149981149982149983149984149985149986149987149988149989149990149991149992149993149994149995149996149997149998149999150000150001150002150003150004150005150006150007150008150009150010150011150012150013150014150015150016150017150018150019150020150021150022150023150024150025150026150027150028150029150030150031150032150033150034150035150036150037150038150039150040150041150042150043150044150045150046150047150048150049150050150051150052150053150054150055150056150057150058150059150060150061150062150063150064150065150066150067150068150069150070150071150072150073150074150075150076150077150078150079150080150081150082150083150084150085150086150087150088150089150090150091150092150093150094150095150096150097150098150099150100150101150102150103150104150105150106150107150108150109150110150111150112150113150114150115150116150117150118150119150120150121150122150123150124150125150126150127150128150129150130150131150132150133150134150135150136150137150138150139150140150141150142150143150144150145150146150147150148150149150150150151150152150153150154150155150156150157150158150159150160150161150162150163150164150165150166150167150168150169150170150171150172150173150174150175150176150177150178150179150180150181150182150183150184150185150186150187150188150189150190150191150192150193150194150195150196150197150198150199150200150201150202150203150204150205150206150207150208150209150210150211150212150213150214150215150216150217150218150219150220150221150222150223150224150225150226150227150228150229150230150231150232150233150234150235150236150237150238150239150240150241150242150243150244150245150246150247150248150249150250150251150252150253150254150255150256150257150258150259150260150261150262150263150264150265150266150267150268150269150270150271150272150273150274150275150276150277150278150279150280150281150282150283150284150285150286150287150288150289150290150291150292150293150294150295150296150297150298150299150300150301150302150303150304150305150306150307150308150309150310150311150312150313150314150315150316150317150318150319150320150321150322150323150324150325150326150327150328150329150330150331150332150333150334150335150336150337150338150339150340150341150342150343150344150345150346150347150348150349150350150351150352150353150354150355150356150357150358150359150360150361150362150363150364150365150366150367150368150369150370150371150372150373150374150375150376150377150378150379150380150381150382150383150384150385150386150387150388150389150390150391150392150393150394150395150396150397150398150399150400150401150402150403150404150405150406150407150408150409150410150411150412150413150414150415150416150417150418150419150420150421150422150423150424150425150426150427150428150429150430150431150432150433150434150435150436150437150438150439150440150441150442150443150444150445150446150447150448150449150450150451150452150453150454150455150456150457150458150459150460150461150462150463150464150465150466150467150468150469150470150471150472150473150474150475150476150477150478150479150480150481150482150483150484150485150486150487150488150489150490150491150492150493150494150495150496150497150498150499150500150501150502150503150504150505150506150507150508150509150510150511150512150513150514150515150516150517150518150519150520150521150522150523150524150525150526150527150528150529150530150531150532150533150534150535150536150537150538150539150540150541150542150543150544150545150546150547150548150549150550150551150552150553150554150555150556150557150558150559150560150561150562150563150564150565150566150567150568150569150570150571150572150573150574150575150576150577150578150579150580150581150582150583150584150585150586150587150588150589150590150591150592150593150594150595150596150597150598150599150600150601150602150603150604150605150606150607150608150609150610150611150612150613150614150615150616150617150618150619150620150621150622150623150624150625150626150627150628150629150630150631150632150633150634150635150636150637150638150639150640150641150642150643150644150645150646150647150648150649150650150651150652150653150654150655150656150657150658150659150660150661150662150663150664150665150666150667150668150669150670150671150672150673150674150675150676150677150678150679150680150681150682150683150684150685150686150687150688150689150690150691150692150693150694150695150696150697150698150699150700150701150702150703150704150705150706150707150708150709150710150711150712150713150714150715150716150717150718150719150720150721150722150723150724150725150726150727150728150729150730150731150732150733150734150735150736150737150738150739150740150741150742150743150744150745150746150747150748150749150750150751150752150753150754150755150756150757150758150759150760150761150762150763150764150765150766150767150768150769150770150771150772150773150774150775150776150777150778150779150780150781150782150783150784150785150786150787150788150789150790150791150792150793150794150795150796150797150798150799150800150801150802150803150804150805150806150807150808150809150810150811150812150813150814150815150816150817150818150819150820150821150822150823150824150825150826150827150828150829150830150831150832150833150834150835150836150837150838150839150840150841150842150843150844150845150846150847150848150849150850150851150852150853150854150855150856150857150858150859150860150861150862150863150864150865150866150867150868150869150870150871150872150873150874150875150876150877150878150879150880150881150882150883150884150885150886150887150888150889150890150891150892150893150894150895150896150897150898150899150900150901150902150903150904150905150906150907150908150909150910150911150912150913150914150915150916150917150918150919150920150921150922150923150924150925150926150927150928150929150930150931150932150933150934150935150936150937150938150939150940150941150942150943150944150945150946150947150948150949150950150951150952150953150954150955150956150957150958150959150960150961150962150963150964150965150966150967150968150969150970150971150972150973150974150975150976150977150978150979150980150981150982150983150984150985150986150987150988150989150990150991150992150993150994150995150996150997150998150999151000151001151002151003151004151005151006151007151008151009151010151011151012151013151014151015151016151017151018151019151020151021151022151023151024151025151026151027151028151029151030151031151032151033151034151035151036151037151038151039151040151041151042151043151044151045151046151047151048151049151050151051151052151053151054151055151056151057151058151059151060151061151062151063151064151065151066151067151068151069151070151071151072151073151074151075151076151077151078151079151080151081151082151083151084151085151086151087151088151089151090151091151092151093151094151095151096151097151098151099151100151101151102151103151104151105151106151107151108151109151110151111151112151113151114151115151116151117151118151119151120151121151122151123151124151125151126151127151128151129151130151131151132151133151134151135151136151137151138151139151140151141151142151143151144151145151146151147151148151149151150151151151152151153151154151155151156151157151158151159151160151161151162151163151164151165151166151167151168151169151170151171151172151173151174151175151176151177151178151179151180151181151182151183151184151185151186151187151188151189151190151191151192151193151194151195151196151197151198151199151200151201151202151203151204151205151206151207151208151209151210151211151212151213151214151215151216151217151218151219151220151221151222151223151224151225151226151227151228151229151230151231151232151233151234151235151236151237151238151239151240151241151242151243151244151245151246151247151248151249151250151251151252151253151254151255151256151257151258151259151260151261151262151263151264151265151266151267151268151269151270151271151272151273151274151275151276151277151278151279151280151281151282151283151284151285151286151287151288151289151290151291151292151293151294151295151296151297151298151299151300151301151302151303151304151305151306151307151308151309151310151311151312151313151314151315151316151317151318151319151320151321151322151323151324151325151326151327151328151329151330151331151332151333151334151335151336151337151338151339151340151341151342151343151344151345151346151347151348151349151350151351151352151353151354151355151356151357151358151359151360151361151362151363151364151365151366151367151368151369151370151371151372151373151374151375151376151377151378151379151380151381151382151383151384151385151386151387151388151389151390151391151392151393151394151395151396151397151398151399151400151401151402151403151404151405151406151407151408151409151410151411151412151413151414151415151416151417151418151419151420151421151422151423151424151425151426151427151428151429151430151431151432151433151434151435151436151437151438151439151440151441151442151443151444151445151446151447151448151449151450151451151452151453151454151455151456151457151458151459151460151461151462151463151464151465151466151467151468151469151470151471151472151473151474151475151476151477151478151479151480151481151482151483151484151485151486151487151488151489151490151491151492151493151494151495151496151497151498151499151500151501151502151503151504151505151506151507151508151509151510151511151512151513151514151515151516151517151518151519151520151521151522151523151524151525151526151527151528151529151530151531151532151533151534151535151536151537151538151539151540151541151542151543151544151545151546151547151548151549151550151551151552151553151554151555151556151557151558151559151560151561151562151563151564151565151566151567151568151569151570151571151572151573151574151575151576151577151578151579151580151581151582151583151584151585151586151587151588151589151590151591151592151593151594151595151596151597151598151599151600151601151602151603151604151605151606151607151608151609151610151611151612151613151614151615151616151617151618151619151620151621151622151623151624151625151626151627151628151629151630151631151632151633151634151635151636151637151638151639151640151641151642151643151644151645151646151647151648151649151650151651151652151653151654151655151656151657151658151659151660151661151662151663151664151665151666151667151668151669151670151671151672151673151674151675151676151677151678151679151680151681151682151683151684151685151686151687151688151689151690151691151692151693151694151695151696151697151698151699151700151701151702151703151704151705151706151707151708151709151710151711151712151713151714151715151716151717151718151719151720151721151722151723151724151725151726151727151728151729151730151731151732151733151734151735151736151737151738151739151740151741151742151743151744151745151746151747151748151749151750151751151752151753151754151755151756151757151758151759151760151761151762151763151764151765151766151767151768151769151770151771151772151773151774151775151776151777151778151779151780151781151782151783151784151785151786151787151788151789151790151791151792151793151794151795151796151797151798151799151800151801151802151803151804151805151806151807151808151809151810151811151812151813151814151815151816151817151818151819151820151821151822151823151824151825151826151827151828151829151830151831151832151833151834151835151836151837151838151839151840151841151842151843151844151845151846151847151848151849151850151851151852151853151854151855151856151857151858151859151860151861151862151863151864151865151866151867151868151869151870151871151872151873151874151875151876151877151878151879151880151881151882151883151884151885151886151887151888151889151890151891151892151893151894151895151896151897151898151899151900151901151902151903151904151905151906151907151908151909151910151911151912151913151914151915151916151917151918151919151920151921151922151923151924151925151926151927151928151929151930151931151932151933151934151935151936151937151938151939151940151941151942151943151944151945151946151947151948151949151950151951151952151953151954151955151956151957151958151959151960151961151962151963151964151965151966151967151968151969151970151971151972151973151974151975151976151977151978151979151980151981151982151983151984151985151986151987151988151989151990151991151992151993151994151995151996151997151998151999152000152001152002152003152004152005152006152007152008152009152010152011152012152013152014152015152016152017152018152019152020152021152022152023152024152025152026152027152028152029152030152031152032152033152034152035152036152037152038152039152040152041152042152043152044152045152046152047152048152049152050152051152052152053152054152055152056152057152058152059152060152061152062152063152064152065152066152067152068152069152070152071152072152073152074152075152076152077152078152079152080152081152082152083152084152085152086152087152088152089152090152091152092152093152094152095152096152097152098152099152100152101152102152103152104152105152106152107152108152109152110152111152112152113152114152115152116152117152118152119152120152121152122152123152124152125152126152127152128152129152130152131152132152133152134152135152136152137152138152139152140152141152142152143152144152145152146152147152148152149152150152151152152152153152154152155152156152157152158152159152160152161152162152163152164152165152166152167152168152169152170152171152172152173152174152175152176152177152178152179152180152181152182152183152184152185152186152187152188152189152190152191152192152193152194152195152196152197152198152199152200152201152202152203152204152205152206152207152208152209152210152211152212152213152214152215152216152217152218152219152220152221152222152223152224152225152226152227152228152229152230152231152232152233152234152235152236152237152238152239152240152241152242152243152244152245152246152247152248152249152250152251152252152253152254152255152256152257152258152259152260152261152262152263152264152265152266152267152268152269152270152271152272152273152274152275152276152277152278152279152280152281152282152283152284152285152286152287152288152289152290152291152292152293152294152295152296152297152298152299152300152301152302152303152304152305152306152307152308152309152310152311152312152313152314152315152316152317152318152319152320152321152322152323152324152325152326152327152328152329152330152331152332152333152334152335152336152337152338152339152340152341152342152343152344152345152346152347152348152349152350152351152352152353152354152355152356152357152358152359152360152361152362152363152364152365152366152367152368152369152370152371152372152373152374152375152376152377152378152379152380152381152382152383152384152385152386152387152388152389152390152391152392152393152394152395152396152397152398152399152400152401152402152403152404152405152406152407152408152409152410152411152412152413152414152415152416152417152418152419152420152421152422152423152424152425152426152427152428152429152430152431152432152433152434152435152436152437152438152439152440152441152442152443152444152445152446152447152448152449152450152451152452152453152454152455152456152457152458152459152460152461152462152463152464152465152466152467152468152469152470152471152472152473152474152475152476152477152478152479152480152481152482152483152484152485152486152487152488152489152490152491152492152493152494152495152496152497152498152499152500152501152502152503152504152505152506152507152508152509152510152511152512152513152514152515152516152517152518152519152520152521152522152523152524152525152526152527152528152529152530152531152532152533152534152535152536152537152538152539152540152541152542152543152544152545152546152547152548152549152550152551152552152553152554152555152556152557152558152559152560152561152562152563152564152565152566152567152568152569152570152571152572152573152574152575152576152577152578152579152580152581152582152583152584152585152586152587152588152589152590152591152592152593152594152595152596152597152598152599152600152601152602152603152604152605152606152607152608152609152610152611152612152613152614152615152616152617152618152619152620152621152622152623152624152625152626152627152628152629152630152631152632152633152634152635152636152637152638152639152640152641152642152643152644152645152646152647152648152649152650152651152652152653152654152655152656152657152658152659152660152661152662152663152664152665152666152667152668152669152670152671152672152673152674152675152676152677152678152679152680152681152682152683152684152685152686152687152688152689152690152691152692152693152694152695152696152697152698152699152700152701152702152703152704152705152706152707152708152709152710152711152712152713152714152715152716152717152718152719152720152721152722152723152724152725152726152727152728152729152730152731152732152733152734152735152736152737152738152739152740152741152742152743152744152745152746152747152748152749152750152751152752152753152754152755152756152757152758152759152760152761152762152763152764152765152766152767152768152769152770152771152772152773152774152775152776152777152778152779152780152781152782152783152784152785152786152787152788152789152790152791152792152793152794152795152796152797152798152799152800152801152802152803152804152805152806152807152808152809152810152811152812152813152814152815152816152817152818152819152820152821152822152823152824152825152826152827152828152829152830152831152832152833152834152835152836152837152838152839152840152841152842152843152844152845152846152847152848152849152850152851152852152853152854152855152856152857152858152859152860152861152862152863152864152865152866152867152868152869152870152871152872152873152874152875152876152877152878152879152880152881152882152883152884152885152886152887152888152889152890152891152892152893152894152895152896152897152898152899152900152901152902152903152904152905152906152907152908152909152910152911152912152913152914152915152916152917152918152919152920152921152922152923152924152925152926152927152928152929152930152931152932152933152934152935152936152937152938152939152940152941152942152943152944152945152946152947152948152949152950152951152952152953152954152955152956152957152958152959152960152961152962152963152964152965152966152967152968152969152970152971152972152973152974152975152976152977152978152979152980152981152982152983152984152985152986152987152988152989152990152991152992152993152994152995152996152997152998152999153000153001153002153003153004153005153006153007153008153009153010153011153012153013153014153015153016153017153018153019153020153021153022153023153024153025153026153027153028153029153030153031153032153033153034153035153036153037153038153039153040153041153042153043153044153045153046153047153048153049153050153051153052153053153054153055153056153057153058153059153060153061153062153063153064153065153066153067153068153069153070153071153072153073153074153075153076153077153078153079153080153081153082153083153084153085153086153087153088153089153090153091153092153093153094153095153096153097153098153099153100153101153102153103153104153105153106153107153108153109153110153111153112153113153114153115153116153117153118153119153120153121153122153123153124153125153126153127153128153129153130153131153132153133153134153135153136153137153138153139153140153141153142153143153144153145153146153147153148153149153150153151153152153153153154153155153156153157153158153159153160153161153162153163153164153165153166153167153168153169153170153171153172153173153174153175153176153177153178153179153180153181153182153183153184153185153186153187153188153189153190153191153192153193153194153195153196153197153198153199153200153201153202153203153204153205153206153207153208153209153210153211153212153213153214153215153216153217153218153219153220153221153222153223153224153225153226153227153228153229153230153231153232153233153234153235153236153237153238153239153240153241153242153243153244153245153246153247153248153249153250153251153252153253153254153255153256153257153258153259153260153261153262153263153264153265153266153267153268153269153270153271153272153273153274153275153276153277153278153279153280153281153282153283153284153285153286153287153288153289153290153291153292153293153294153295153296153297153298153299153300153301153302153303153304153305153306153307153308153309153310153311153312153313153314153315153316153317153318153319153320153321153322153323153324153325153326153327153328153329153330153331153332153333153334153335153336153337153338153339153340153341153342153343153344153345153346153347153348153349153350153351153352153353153354153355153356153357153358153359153360153361153362153363153364153365153366153367153368153369153370153371153372153373153374153375153376153377153378153379153380153381153382153383153384153385153386153387153388153389153390153391153392153393153394153395153396153397153398153399153400153401153402153403153404153405153406153407153408153409153410153411153412153413153414153415153416153417153418153419153420153421153422153423153424153425153426153427153428153429153430153431153432153433153434153435153436153437153438153439153440153441153442153443153444153445153446153447153448153449153450153451153452153453153454153455153456153457153458153459153460153461153462153463153464153465153466153467153468153469153470153471153472153473153474153475153476153477153478153479153480153481153482153483153484153485153486153487153488153489153490153491153492153493153494153495153496153497153498153499153500153501153502153503153504153505153506153507153508153509153510153511153512153513153514153515153516153517153518153519153520153521153522153523153524153525153526153527153528153529153530153531153532153533153534153535153536153537153538153539153540153541153542153543153544153545153546153547153548153549153550153551153552153553153554153555153556153557153558153559153560153561153562153563153564153565153566153567153568153569153570153571153572153573153574153575153576153577153578153579153580153581153582153583153584153585153586153587153588153589153590153591153592153593153594153595153596153597153598153599153600153601153602153603153604153605153606153607153608153609153610153611153612153613153614153615153616153617153618153619153620153621153622153623153624153625153626153627153628153629153630153631153632153633153634153635153636153637153638153639153640153641153642153643153644153645153646153647153648153649153650153651153652153653153654153655153656153657153658153659153660153661153662153663153664153665153666153667153668153669153670153671153672153673153674153675153676153677153678153679153680153681153682153683153684153685153686153687153688153689153690153691153692153693153694153695153696153697153698153699153700153701153702153703153704153705153706153707153708153709153710153711153712153713153714153715153716153717153718153719153720153721153722153723153724153725153726153727153728153729153730153731153732153733153734153735153736153737153738153739153740153741153742153743153744153745153746153747153748153749153750153751153752153753153754153755153756153757153758153759153760153761153762153763153764153765153766153767153768153769153770153771153772153773153774153775153776153777153778153779153780153781153782153783153784153785153786153787153788153789153790153791153792153793153794153795153796153797153798153799153800153801153802153803153804153805153806153807153808153809153810153811153812153813153814153815153816153817153818153819153820153821153822153823153824153825153826153827153828153829153830153831153832153833153834153835153836153837153838153839153840153841153842153843153844153845153846153847153848153849153850153851153852153853153854153855153856153857153858153859153860153861153862153863153864153865153866153867153868153869153870153871153872153873153874153875153876153877153878153879153880153881153882153883153884153885153886153887153888153889153890153891153892153893153894153895153896153897153898153899153900153901153902153903153904153905153906153907153908153909153910153911153912153913153914153915153916153917153918153919153920153921153922153923153924153925153926153927153928153929153930153931153932153933153934153935153936153937153938153939153940153941153942153943153944153945153946153947153948153949153950153951153952153953153954153955153956153957153958153959153960153961153962153963153964153965153966153967153968153969153970153971153972153973153974153975153976153977153978153979153980153981153982153983153984153985153986153987153988153989153990153991153992153993153994153995153996153997153998153999154000154001154002154003154004154005154006154007154008154009154010154011154012154013154014154015154016154017154018154019154020154021154022154023154024154025154026154027154028154029154030154031154032154033154034154035154036154037154038154039154040154041154042154043154044154045154046154047154048154049154050154051154052154053154054154055154056154057154058154059154060154061154062154063154064154065154066154067154068154069154070154071154072154073154074154075154076154077154078154079154080154081154082154083154084154085154086154087154088154089154090154091154092154093154094154095154096154097154098154099154100154101154102154103154104154105154106154107154108154109154110154111154112154113154114154115154116154117154118154119154120154121154122154123154124154125154126154127154128154129154130154131154132154133154134154135154136154137154138154139154140154141154142154143154144154145154146154147154148154149154150154151154152154153154154154155154156154157154158154159154160154161154162154163154164154165154166154167154168154169154170154171154172154173154174154175154176154177154178154179154180154181154182154183154184154185154186154187154188154189154190154191154192154193154194154195154196154197154198154199154200154201154202154203154204154205154206154207154208154209154210154211154212154213154214154215154216154217154218154219154220154221154222154223154224154225154226154227154228154229154230154231154232154233154234154235154236154237154238154239154240154241154242154243154244154245154246154247154248154249154250154251154252154253154254154255154256154257154258154259154260154261154262154263154264154265154266154267154268154269154270154271154272154273154274154275154276154277154278154279154280154281154282154283154284154285154286154287154288154289154290154291154292154293154294154295154296154297154298154299154300154301154302154303154304154305154306154307154308154309154310154311154312154313154314154315154316154317154318154319154320154321154322154323154324154325154326154327154328154329154330154331154332154333154334154335154336154337154338154339154340154341154342154343154344154345154346154347154348154349154350154351154352154353154354154355154356154357154358154359154360154361154362154363154364154365154366154367154368154369154370154371154372154373154374154375154376154377154378154379154380154381154382154383154384154385154386154387154388154389154390154391154392154393154394154395154396154397154398154399154400154401154402154403154404154405154406154407154408154409154410154411154412154413154414154415154416154417154418154419154420154421154422154423154424154425154426154427154428154429154430154431154432154433154434154435154436154437154438154439154440154441154442154443154444154445154446154447154448154449154450154451154452154453154454154455154456154457154458154459154460154461154462154463154464154465154466154467154468154469154470154471154472154473154474154475154476154477154478154479154480154481154482154483154484154485154486154487154488154489154490154491154492154493154494154495154496154497154498154499154500154501154502154503154504154505154506154507154508154509154510154511154512154513154514154515154516154517154518154519154520154521154522154523154524154525154526154527154528154529154530154531154532154533154534154535154536154537154538154539154540154541154542154543154544154545154546154547154548154549154550154551154552154553154554154555154556154557154558154559154560154561154562154563154564154565154566154567154568154569154570154571154572154573154574154575154576154577154578154579154580154581154582154583154584154585154586154587154588154589154590154591154592154593154594154595154596154597154598154599154600154601154602154603154604154605154606154607154608154609154610154611154612154613154614154615154616154617154618154619154620154621154622154623154624154625154626154627154628154629154630154631154632154633154634154635154636154637154638154639154640154641154642154643154644154645154646154647154648154649154650154651154652154653154654154655154656154657154658154659154660154661154662154663154664154665154666154667154668154669154670154671154672154673154674154675154676154677154678154679154680154681154682154683154684154685154686154687154688154689154690154691154692154693154694154695154696154697154698154699154700154701154702154703154704154705154706154707154708154709154710154711154712154713154714154715154716154717154718154719154720154721154722154723154724154725154726154727154728154729154730154731154732154733154734154735154736154737154738154739154740154741154742154743154744154745154746154747154748154749154750154751154752154753154754154755154756154757154758154759154760154761154762154763154764154765154766154767154768154769154770154771154772154773154774154775154776154777154778154779154780154781154782154783154784154785154786154787154788154789154790154791154792154793154794154795154796154797154798154799154800154801154802154803154804154805154806154807154808154809154810154811154812154813154814154815154816154817154818154819154820154821154822154823154824154825154826154827154828154829154830154831154832154833154834154835154836154837154838154839154840154841154842154843154844154845154846154847154848154849154850154851154852154853154854154855154856154857154858154859154860154861154862154863154864154865154866154867154868154869154870154871154872154873154874154875154876154877154878154879154880154881154882154883154884154885154886154887154888154889154890154891154892154893154894154895154896154897154898154899154900154901154902154903154904154905154906154907154908154909154910154911154912154913154914154915154916154917154918154919154920154921154922154923154924154925154926154927154928154929154930154931154932154933154934154935154936154937154938154939154940154941154942154943154944154945154946154947154948154949154950154951154952154953154954154955154956154957154958154959154960154961154962154963154964154965154966154967154968154969154970154971154972154973154974154975154976154977154978154979154980154981154982154983154984154985154986154987154988154989154990154991154992154993154994154995154996154997154998154999155000155001155002155003155004155005155006155007155008155009155010155011155012155013155014155015155016155017155018155019155020155021155022155023155024155025155026155027155028155029155030155031155032155033155034155035155036155037155038155039155040155041155042155043155044155045155046155047155048155049155050155051155052155053155054155055155056155057155058155059155060155061155062155063155064155065155066155067155068155069155070155071155072155073155074155075155076155077155078155079155080155081155082155083155084155085155086155087155088155089155090155091155092155093155094155095155096155097155098155099155100155101155102155103155104155105155106155107155108155109155110155111155112155113155114155115155116155117155118155119155120155121155122155123155124155125155126155127155128155129155130155131155132155133155134155135155136155137155138155139155140155141155142155143155144155145155146155147155148155149155150155151155152155153155154155155155156155157155158155159155160155161155162155163155164155165155166155167155168155169155170155171155172155173155174155175155176155177155178155179155180155181155182155183155184155185155186155187155188155189155190155191155192155193155194155195155196155197155198155199155200155201155202155203155204155205155206155207155208155209155210155211155212155213155214155215155216155217155218155219155220155221155222155223155224155225155226155227155228155229155230155231155232155233155234155235155236155237155238155239155240155241155242155243155244155245155246155247155248155249155250155251155252155253155254155255155256155257155258155259155260155261155262155263155264155265155266155267155268155269155270155271155272155273155274155275155276155277155278155279155280155281155282155283155284155285155286155287155288155289155290155291155292155293155294155295155296155297155298155299155300155301155302155303155304155305155306155307155308155309155310155311155312155313155314155315155316155317155318155319155320155321155322155323155324155325155326155327155328155329155330155331155332155333155334155335155336155337155338155339155340155341155342155343155344155345155346155347155348155349155350155351155352155353155354155355155356155357155358155359155360155361155362155363155364155365155366155367155368155369155370155371155372155373155374155375155376155377155378155379155380155381155382155383155384155385155386155387155388155389155390155391155392155393155394155395155396155397155398155399155400155401155402155403155404155405155406155407155408155409155410155411155412155413155414155415155416155417155418155419155420155421155422155423155424155425155426155427155428155429155430155431155432155433155434155435155436155437155438155439155440155441155442155443155444155445155446155447155448155449155450155451155452155453155454155455155456155457155458155459155460155461155462155463155464155465155466155467155468155469155470155471155472155473155474155475155476155477155478155479155480155481155482155483155484155485155486155487155488155489155490155491155492155493155494155495155496155497155498155499155500155501155502155503155504155505155506155507155508155509155510155511155512155513155514155515155516155517155518155519155520155521155522155523155524155525155526155527155528155529155530155531155532155533155534155535155536155537155538155539155540155541155542155543155544155545155546155547155548155549155550155551155552155553155554155555155556155557155558155559155560155561155562155563155564155565155566155567155568155569155570155571155572155573155574155575155576155577155578155579155580155581155582155583155584155585155586155587155588155589155590155591155592155593155594155595155596155597155598155599155600155601155602155603155604155605155606155607155608155609155610155611155612155613155614155615155616155617155618155619155620155621155622155623155624155625155626155627155628155629155630155631155632155633155634155635155636155637155638155639155640155641155642155643155644155645155646155647155648155649155650155651155652155653155654155655155656155657155658155659155660155661155662155663155664155665155666155667155668155669155670155671155672155673155674155675155676155677155678155679155680155681155682155683155684155685155686155687155688155689155690155691155692155693155694155695155696155697155698155699155700155701155702155703155704155705155706155707155708155709155710155711155712155713155714155715155716155717155718155719155720155721155722155723155724155725155726155727155728155729155730155731155732155733155734155735155736155737155738155739155740155741155742155743155744155745155746155747155748155749155750155751155752155753155754155755155756155757155758155759155760155761155762155763155764155765155766155767155768155769155770155771155772155773155774155775155776155777155778155779155780155781155782155783155784155785155786155787155788155789155790155791155792155793155794155795155796155797155798155799155800155801155802155803155804155805155806155807155808155809155810155811155812155813155814155815155816155817155818155819155820155821155822155823155824155825155826155827155828155829155830155831155832155833155834155835155836155837155838155839155840155841155842155843155844155845155846155847155848155849155850155851155852155853155854155855155856155857155858155859155860155861155862155863155864155865155866155867155868155869155870155871155872155873155874155875155876155877155878155879155880155881155882155883155884155885155886155887155888155889155890155891155892155893155894155895155896155897155898155899155900155901155902155903155904155905155906155907155908155909155910155911155912155913155914155915155916155917155918155919155920155921155922155923155924155925155926155927155928155929155930155931155932155933155934155935155936155937155938155939155940155941155942155943155944155945155946155947155948155949155950155951155952155953155954155955155956155957155958155959155960155961155962155963155964155965155966155967155968155969155970155971155972155973155974155975155976155977155978155979155980155981155982155983155984155985155986155987155988155989155990155991155992155993155994155995155996155997155998155999156000156001156002156003156004156005156006156007156008156009156010156011156012156013156014156015156016156017156018156019156020156021156022156023156024156025156026156027156028156029156030156031156032156033156034156035156036156037156038156039156040156041156042156043156044156045156046156047156048156049156050156051156052156053156054156055156056156057156058156059156060156061156062156063156064156065156066156067156068156069156070156071156072156073156074156075156076156077156078156079156080156081156082156083156084156085156086156087156088156089156090156091156092156093156094156095156096156097156098156099156100156101156102156103156104156105156106156107156108156109156110156111156112156113156114156115156116156117156118156119156120156121156122156123156124156125156126156127156128156129156130156131156132156133156134156135156136156137156138156139156140156141156142156143156144156145156146156147156148156149156150156151156152156153156154156155156156156157156158156159156160156161156162156163156164156165156166156167156168156169156170156171156172156173156174156175156176156177156178156179156180156181156182156183156184156185156186156187156188156189156190156191156192156193156194156195156196156197156198156199156200156201156202156203156204156205156206156207156208156209156210156211156212156213156214156215156216156217156218156219156220156221156222156223156224156225156226156227156228156229156230156231156232156233156234156235156236156237156238156239156240156241156242156243156244156245156246156247156248156249156250156251156252156253156254156255156256156257156258156259156260156261156262156263156264156265156266156267156268156269156270156271156272156273156274156275156276156277156278156279156280156281156282156283156284156285156286156287156288156289156290156291156292156293156294156295156296156297156298156299156300156301156302156303156304156305156306156307156308156309156310156311156312156313156314156315156316156317156318156319156320156321156322156323156324156325156326156327156328156329156330156331156332156333156334156335156336156337156338156339156340156341156342156343156344156345156346156347156348156349156350156351156352156353156354156355156356156357156358156359156360156361156362156363156364156365156366156367156368156369156370156371156372156373156374156375156376156377156378156379156380156381156382156383156384156385156386156387156388156389156390156391156392156393156394156395156396156397156398156399156400156401156402156403156404156405156406156407156408156409156410156411156412156413156414156415156416156417156418156419156420156421156422156423156424156425156426156427156428156429156430156431156432156433156434156435156436156437156438156439156440156441156442156443156444156445156446156447156448156449156450156451156452156453156454156455156456156457156458156459156460156461156462156463156464156465156466156467156468156469156470156471156472156473156474156475156476156477156478156479156480156481156482156483156484156485156486156487156488156489156490156491156492156493156494156495156496156497156498156499156500156501156502156503156504156505156506156507156508156509156510156511156512156513156514156515156516156517156518156519156520156521156522156523156524156525156526156527156528156529156530156531156532156533156534156535156536156537156538156539156540156541156542156543156544156545156546156547156548156549156550156551156552156553156554156555156556156557156558156559156560156561156562156563156564156565156566156567156568156569156570156571156572156573156574156575156576156577156578156579156580156581156582156583156584156585156586156587156588156589156590156591156592156593156594156595156596156597156598156599156600156601156602156603156604156605156606156607156608156609156610156611156612156613156614156615156616156617156618156619156620156621156622156623156624156625156626156627156628156629156630156631156632156633156634156635156636156637156638156639156640156641156642156643156644156645156646156647156648156649156650156651156652156653156654156655156656156657156658156659156660156661156662156663156664156665156666156667156668156669156670156671156672156673156674156675156676156677156678156679156680156681156682156683156684156685156686156687156688156689156690156691156692156693156694156695156696156697156698156699156700156701156702156703156704156705156706156707156708156709156710156711156712156713156714156715156716156717156718156719156720156721156722156723156724156725156726156727156728156729156730156731156732156733156734156735156736156737156738156739156740156741156742156743156744156745156746156747156748156749156750156751156752156753156754156755156756156757156758156759156760156761156762156763156764156765156766156767156768156769156770156771156772156773156774156775156776156777156778156779156780156781156782156783156784156785156786156787156788156789156790156791156792156793156794156795156796156797156798156799156800156801156802156803156804156805156806156807156808156809156810156811156812156813156814156815156816156817156818156819156820156821156822156823156824156825156826156827156828156829156830156831156832156833156834156835156836156837156838156839156840156841156842156843156844156845156846156847156848156849156850156851156852156853156854156855156856156857156858156859156860156861156862156863156864156865156866156867156868156869156870156871156872156873156874156875156876156877156878156879156880156881156882156883156884156885156886156887156888156889156890156891156892156893156894156895156896156897156898156899156900156901156902156903156904156905156906156907156908156909156910156911156912156913156914156915156916156917156918156919156920156921156922156923156924156925156926156927156928156929156930156931156932156933156934156935156936156937156938156939156940156941156942156943156944156945156946156947156948156949156950156951156952156953156954156955156956156957156958156959156960156961156962156963156964156965156966156967156968156969156970156971156972156973156974156975156976156977156978156979156980156981156982156983156984156985156986156987156988156989156990156991156992156993156994156995156996156997156998156999157000157001157002157003157004157005157006157007157008157009157010157011157012157013157014157015157016157017157018157019157020157021157022157023157024157025157026157027157028157029157030157031157032157033157034157035157036157037157038157039157040157041157042157043157044157045157046157047157048157049157050157051157052157053157054157055157056157057157058157059157060157061157062157063157064157065157066157067157068157069157070157071157072157073157074157075157076157077157078157079157080157081157082157083157084157085157086157087157088157089157090157091157092157093157094157095157096157097157098157099157100157101157102157103157104157105157106157107157108157109157110157111157112157113157114157115157116157117157118157119157120157121157122157123157124157125157126157127157128157129157130157131157132157133157134157135157136157137157138157139157140157141157142157143157144157145157146157147157148157149157150157151157152157153157154157155157156157157157158157159157160157161157162157163157164157165157166157167157168157169157170157171157172157173157174157175157176157177157178157179157180157181157182157183157184157185157186157187157188157189157190157191157192157193157194157195157196157197157198157199157200157201157202157203157204157205157206157207157208157209157210157211157212157213157214157215157216157217157218157219157220157221157222157223157224157225157226157227157228157229157230157231157232157233157234157235157236157237157238157239157240157241157242157243157244157245157246157247157248157249157250157251157252157253157254157255157256157257157258157259157260157261157262157263157264157265157266157267157268157269157270157271157272157273157274157275157276157277157278157279157280157281157282157283157284157285157286157287157288157289157290157291157292157293157294157295157296157297157298157299157300157301157302157303157304157305157306157307157308157309157310157311157312157313157314157315157316157317157318157319157320157321157322157323157324157325157326157327157328157329157330157331157332157333157334157335157336157337157338157339157340157341157342157343157344157345157346157347157348157349157350157351157352157353157354157355157356157357157358157359157360157361157362157363157364157365157366157367157368157369157370157371157372157373157374157375157376157377157378157379157380157381157382157383157384157385157386157387157388157389157390157391157392157393157394157395157396157397157398157399157400157401157402157403157404157405157406157407157408157409157410157411157412157413157414157415157416157417157418157419157420157421157422157423157424157425157426157427157428157429157430157431157432157433157434157435157436157437157438157439157440157441157442157443157444157445157446157447157448157449157450157451157452157453157454157455157456157457157458157459157460157461157462157463157464157465157466157467157468157469157470157471157472157473157474157475157476157477157478157479157480157481157482157483157484157485157486157487157488157489157490157491157492157493157494157495157496157497157498157499157500157501157502157503157504157505157506157507157508157509157510157511157512157513157514157515157516157517157518157519157520157521157522157523157524157525157526157527157528157529157530157531157532157533157534157535157536157537157538157539157540157541157542157543157544157545157546157547157548157549157550157551157552157553157554157555157556157557157558157559157560157561157562157563157564157565157566157567157568157569157570157571157572157573157574157575157576157577157578157579157580157581157582157583157584157585157586157587157588157589157590157591157592157593157594157595157596157597157598157599157600157601157602157603157604157605157606157607157608157609157610157611157612157613157614157615157616157617157618157619157620157621157622157623157624157625157626157627157628157629157630157631157632157633157634157635157636157637157638157639157640157641157642157643157644157645157646157647157648157649157650157651157652157653157654157655157656157657157658157659157660157661157662157663157664157665157666157667157668157669157670157671157672157673157674157675157676157677157678157679157680157681157682157683157684157685157686157687157688157689157690157691157692157693157694157695157696157697157698157699157700157701157702157703157704157705157706157707157708157709157710157711157712157713157714157715157716157717157718157719157720157721157722157723157724157725157726157727157728157729157730157731157732157733157734157735157736157737157738157739157740157741157742157743157744157745157746157747157748157749157750157751157752157753157754157755157756157757157758157759157760157761157762157763157764157765157766157767157768157769157770157771157772157773157774157775157776157777157778157779157780157781157782157783157784157785157786157787157788157789157790157791157792157793157794157795157796157797157798157799157800157801157802157803157804157805157806157807157808157809157810157811157812157813157814157815157816157817157818157819157820157821157822157823157824157825157826157827157828157829157830157831157832157833157834157835157836157837157838157839157840157841157842157843157844157845157846157847157848157849157850157851157852157853157854157855157856157857157858157859157860157861157862157863157864157865157866157867157868157869157870157871157872157873157874157875157876157877157878157879157880157881157882157883157884157885157886157887157888157889157890157891157892157893157894157895157896157897157898157899157900157901157902157903157904157905157906157907157908157909157910157911157912157913157914157915157916157917157918157919157920157921157922157923157924157925157926157927157928157929157930157931157932157933157934157935157936157937157938157939157940157941157942157943157944157945157946157947157948157949157950157951157952157953157954157955157956157957157958157959157960157961157962157963157964157965157966157967157968157969157970157971157972157973157974157975157976157977157978157979157980157981157982157983157984157985157986157987157988157989157990157991157992157993157994157995157996157997157998157999158000158001158002158003158004158005158006158007158008158009158010158011158012158013158014158015158016158017158018158019158020158021158022158023158024158025158026158027158028158029158030158031158032158033158034158035158036158037158038158039158040158041158042158043158044158045158046158047158048158049158050158051158052158053158054158055158056158057158058158059158060158061158062158063158064158065158066158067158068158069158070158071158072158073158074158075158076158077158078158079158080158081158082158083158084158085158086158087158088158089158090158091158092158093158094158095158096158097158098158099158100158101158102158103158104158105158106158107158108158109158110158111158112158113158114158115158116158117158118158119158120158121158122158123158124158125158126158127158128158129158130158131158132158133158134158135158136158137158138158139158140158141158142158143158144158145158146158147158148158149158150158151158152158153158154158155158156158157158158158159158160158161158162158163158164158165158166158167158168158169158170158171158172158173158174158175158176158177158178158179158180158181158182158183158184158185158186158187158188158189158190158191158192158193158194158195158196158197158198158199158200158201158202158203158204158205158206158207158208158209158210158211158212158213158214158215158216158217158218158219158220158221158222158223158224158225158226158227158228158229158230158231158232158233158234158235158236158237158238158239158240158241158242158243158244158245158246158247158248158249158250158251158252158253158254158255158256158257158258158259158260158261158262158263158264158265158266158267158268158269158270158271158272158273158274158275158276158277158278158279158280158281158282158283158284158285158286158287158288158289158290158291158292158293158294158295158296158297158298158299158300158301158302158303158304158305158306158307158308158309158310158311158312158313158314158315158316158317158318158319158320158321158322158323158324158325158326158327158328158329158330158331158332158333158334158335158336158337158338158339158340158341158342158343158344158345158346158347158348158349158350158351158352158353158354158355158356158357158358158359158360158361158362158363158364158365158366158367158368158369158370158371158372158373158374158375158376158377158378158379158380158381158382158383158384158385158386158387158388158389158390158391158392158393158394158395158396158397158398158399158400158401158402158403158404158405158406158407158408158409158410158411158412158413158414158415158416158417158418158419158420158421158422158423158424158425158426158427158428158429158430158431158432158433158434158435158436158437158438158439158440158441158442158443158444158445158446158447158448158449158450158451158452158453158454158455158456158457158458158459158460158461158462158463158464158465158466158467158468158469158470158471158472158473158474158475158476158477158478158479158480158481158482158483158484158485158486158487158488158489158490158491158492158493158494158495158496158497158498158499158500158501158502158503158504158505158506158507158508158509158510158511158512158513158514158515158516158517158518158519158520158521158522158523158524158525158526158527158528158529158530158531158532158533158534158535158536158537158538158539158540158541158542158543158544158545158546158547158548158549158550158551158552158553158554158555158556158557158558158559158560158561158562158563158564158565158566158567158568158569158570158571158572158573158574158575158576158577158578158579158580158581158582158583158584158585158586158587158588158589158590158591158592158593158594158595158596158597158598158599158600158601158602158603158604158605158606158607158608158609158610158611158612158613158614158615158616158617158618158619158620158621158622158623158624158625158626158627158628158629158630158631158632158633158634158635158636158637158638158639158640158641158642158643158644158645158646158647158648158649158650158651158652158653158654158655158656158657158658158659158660158661158662158663158664158665158666158667158668158669158670158671158672158673158674158675158676158677158678158679158680158681158682158683158684158685158686158687158688158689158690158691158692158693158694158695158696158697158698158699158700158701158702158703158704158705158706158707158708158709158710158711158712158713158714158715158716158717158718158719158720158721158722158723158724158725158726158727158728158729158730158731158732158733158734158735158736158737158738158739158740158741158742158743158744158745158746158747158748158749158750158751158752158753158754158755158756158757158758158759158760158761158762158763158764158765158766158767158768158769158770158771158772158773158774158775158776158777158778158779158780158781158782158783158784158785158786158787158788158789158790158791158792158793158794158795158796158797158798158799158800158801158802158803158804158805158806158807158808158809158810158811158812158813158814158815158816158817158818158819158820158821158822158823158824158825158826158827158828158829158830158831158832158833158834158835158836158837158838158839158840158841158842158843158844158845158846158847158848158849158850158851158852158853158854158855158856158857158858158859158860158861158862158863158864158865158866158867158868158869158870158871158872158873158874158875158876158877158878158879158880158881158882158883158884158885158886158887158888158889158890158891158892158893158894158895158896158897158898158899158900158901158902158903158904158905158906158907158908158909158910158911158912158913158914158915158916158917158918158919158920158921158922158923158924158925158926158927158928158929158930158931158932158933158934158935158936158937158938158939158940158941158942158943158944158945158946158947158948158949158950158951158952158953158954158955158956158957158958158959158960158961158962158963158964158965158966158967158968158969158970158971158972158973158974158975158976158977158978158979158980158981158982158983158984158985158986158987158988158989158990158991158992158993158994158995158996158997158998158999159000159001159002159003159004159005159006159007159008159009159010159011159012159013159014159015159016159017159018159019159020159021159022159023159024159025159026159027159028159029159030159031159032159033159034159035159036159037159038159039159040159041159042159043159044159045159046159047159048159049159050159051159052159053159054159055159056159057159058159059159060159061159062159063159064159065159066159067159068159069159070159071159072159073159074159075159076159077159078159079159080159081159082159083159084159085159086159087159088159089159090159091159092159093159094159095159096159097159098159099159100159101159102159103159104159105159106159107159108159109159110159111159112159113159114159115159116159117159118159119159120159121159122159123159124159125159126159127159128159129159130159131159132159133159134159135159136159137159138159139159140159141159142159143159144159145159146159147159148159149159150159151159152159153159154159155159156159157159158159159159160159161159162159163159164159165159166159167159168159169159170159171159172159173159174159175159176159177159178159179159180159181159182159183159184159185159186159187159188159189159190159191159192159193159194159195159196159197159198159199159200159201159202159203159204159205159206159207159208159209159210159211159212159213159214159215159216159217159218159219159220159221159222159223159224159225159226159227159228159229159230159231159232159233159234159235159236159237159238159239159240159241159242159243159244159245159246159247159248159249159250159251159252159253159254159255159256159257159258159259159260159261159262159263159264159265159266159267159268159269159270159271159272159273159274159275159276159277159278159279159280159281159282159283159284159285159286159287159288159289159290159291159292159293159294159295159296159297159298159299159300159301159302159303159304159305159306159307159308159309159310159311159312159313159314159315159316159317159318159319159320159321159322159323159324159325159326159327159328159329159330159331159332159333159334159335159336159337159338159339159340159341159342159343159344159345159346159347159348159349159350159351159352159353159354159355159356159357159358159359159360159361159362159363159364159365159366159367159368159369159370159371159372159373159374159375159376159377159378159379159380159381159382159383159384159385159386159387159388159389159390159391159392159393159394159395159396159397159398159399159400159401159402159403159404159405159406159407159408159409159410159411159412159413159414159415159416159417159418159419159420159421159422159423159424159425159426159427159428159429159430159431159432159433159434159435159436159437159438159439159440159441159442159443159444159445159446159447159448159449159450159451159452159453159454159455159456159457159458159459159460159461159462159463159464159465159466159467159468159469159470159471159472159473159474159475159476159477159478159479159480159481159482159483159484159485159486159487159488159489159490159491159492159493159494159495159496159497159498159499159500159501159502159503159504159505159506159507159508159509159510159511159512159513159514159515159516159517159518159519159520159521159522159523159524159525159526159527159528159529159530159531159532159533159534159535159536159537159538159539159540159541159542159543159544159545159546159547159548159549159550159551159552159553159554159555159556159557159558159559159560159561159562159563159564159565159566159567159568159569159570159571159572159573159574159575159576159577159578159579159580159581159582159583159584159585159586159587159588159589159590159591159592159593159594159595159596159597159598159599159600159601159602159603159604159605159606159607159608159609159610159611159612159613159614159615159616159617159618159619159620159621159622159623159624159625159626159627159628159629159630159631159632159633159634159635159636159637159638159639159640159641159642159643159644159645159646159647159648159649159650159651159652159653159654159655159656159657159658159659159660159661159662159663159664159665159666159667159668159669159670159671159672159673159674159675159676159677159678159679159680159681159682159683159684159685159686159687159688159689159690159691159692159693159694159695159696159697159698159699159700159701159702159703159704159705159706159707159708159709159710159711159712159713159714159715159716159717159718159719159720159721159722159723159724159725159726159727159728159729159730159731159732159733159734159735159736159737159738159739159740159741159742159743159744159745159746159747159748159749159750159751159752159753159754159755159756159757159758159759159760159761159762159763159764159765159766159767159768159769159770159771159772159773159774159775159776159777159778159779159780159781159782159783159784159785159786159787159788159789159790159791159792159793159794159795159796159797159798159799159800159801159802159803159804159805159806159807159808159809159810159811159812159813159814159815159816159817159818159819159820159821159822159823159824159825159826159827159828159829159830159831159832159833159834159835159836159837159838159839159840159841159842159843159844159845159846159847159848159849159850159851159852159853159854159855159856159857159858159859159860159861159862159863159864159865159866159867159868159869159870159871159872159873159874159875159876159877159878159879159880159881159882159883159884159885159886159887159888159889159890159891159892159893159894159895159896159897159898159899159900159901159902159903159904159905159906159907159908159909159910159911159912159913159914159915159916159917159918159919159920159921159922159923159924159925159926159927159928159929159930159931159932159933159934159935159936159937159938159939159940159941159942159943159944159945159946159947159948159949159950159951159952159953159954159955159956159957159958159959159960159961159962159963159964159965159966159967159968159969159970159971159972159973159974159975159976159977159978159979159980159981159982159983159984159985159986159987159988159989159990159991159992159993159994159995159996159997159998159999160000160001160002160003160004160005160006160007160008160009160010160011160012160013160014160015160016160017160018160019160020160021160022160023160024160025160026160027160028160029160030160031160032160033160034160035160036160037160038160039160040160041160042160043160044160045160046160047160048160049160050160051160052160053160054160055160056160057160058160059160060160061160062160063160064160065160066160067160068160069160070160071160072160073160074160075160076160077160078160079160080160081160082160083160084160085160086160087160088160089160090160091160092160093160094160095160096160097160098160099160100160101160102160103160104160105160106160107160108160109160110160111160112160113160114160115160116160117160118160119160120160121160122160123160124160125160126160127160128160129160130160131160132160133160134160135160136160137160138160139160140160141160142160143160144160145160146160147160148160149160150160151160152160153160154160155160156160157160158160159160160160161160162160163160164160165160166160167160168160169160170160171160172160173160174160175160176160177160178160179160180160181160182160183160184160185160186160187160188160189160190160191160192160193160194160195160196160197160198160199160200160201160202160203160204160205160206160207160208160209160210160211160212160213160214160215160216160217160218160219160220160221160222160223160224160225160226160227160228160229160230160231160232160233160234160235160236160237160238160239160240160241160242160243160244160245160246160247160248160249160250160251160252160253160254160255160256160257160258160259160260160261160262160263160264160265160266160267160268160269160270160271160272160273160274160275160276160277160278160279160280160281160282160283160284160285160286160287160288160289160290160291160292160293160294160295160296160297160298160299160300160301160302160303160304160305160306160307160308160309160310160311160312160313160314160315160316160317160318160319160320160321160322160323160324160325160326160327160328160329160330160331160332160333160334160335160336160337160338160339160340160341160342160343160344160345160346160347160348160349160350160351160352160353160354160355160356160357160358160359160360160361160362160363160364160365160366160367160368160369160370160371160372160373160374160375160376160377160378160379160380160381160382160383160384160385160386160387160388160389160390160391160392160393160394160395160396160397160398160399160400160401160402160403160404160405160406160407160408160409160410160411160412160413160414160415160416160417160418160419160420160421160422160423160424160425160426160427160428160429160430160431160432160433160434160435160436160437160438160439160440160441160442160443160444160445160446160447160448160449160450160451160452160453160454160455160456160457160458160459160460160461160462160463160464160465160466160467160468160469160470160471160472160473160474160475160476160477160478160479160480160481160482160483160484160485160486160487160488160489160490160491160492160493160494160495160496160497160498160499160500160501160502160503160504160505160506160507160508160509160510160511160512160513160514160515160516160517160518160519160520160521160522160523160524160525160526160527160528160529160530160531160532160533160534160535160536160537160538160539160540160541160542160543160544160545160546160547160548160549160550160551160552160553160554160555160556160557160558160559160560160561160562160563160564160565160566160567160568160569160570160571160572160573160574160575160576160577160578160579160580160581160582160583160584160585160586160587160588160589160590160591160592160593160594160595160596160597160598160599160600160601160602160603160604160605160606160607160608160609160610160611160612160613160614160615160616160617160618160619160620160621160622160623160624160625160626160627160628160629160630160631160632160633160634160635160636160637160638160639160640160641160642160643160644160645160646160647160648160649160650160651160652160653160654160655160656160657160658160659160660160661160662160663160664160665160666160667160668160669160670160671160672160673160674160675160676160677160678160679160680160681160682160683160684160685160686160687160688160689160690160691160692160693160694160695160696160697160698160699160700160701160702160703160704160705160706160707160708160709160710160711160712160713160714160715160716160717160718160719160720160721160722160723160724160725160726160727160728160729160730160731160732160733160734160735160736160737160738160739160740160741160742160743160744160745160746160747160748160749160750160751160752160753160754160755160756160757160758160759160760160761160762160763160764160765160766160767160768160769160770160771160772160773160774160775160776160777160778160779160780160781160782160783160784160785160786160787160788160789160790160791160792160793160794160795160796160797160798160799160800160801160802160803160804160805160806160807160808160809160810160811160812160813160814160815160816160817160818160819160820160821160822160823160824160825160826160827160828160829160830160831160832160833160834160835160836160837160838160839160840160841160842160843160844160845160846160847160848160849160850160851160852160853160854160855160856160857160858160859160860160861160862160863160864160865160866160867160868160869160870160871160872160873160874160875160876160877160878160879160880160881160882160883160884160885160886160887160888160889160890160891160892160893160894160895160896160897160898160899160900160901160902160903160904160905160906160907160908160909160910160911160912160913160914160915160916160917160918160919160920160921160922160923160924160925160926160927160928160929160930160931160932160933160934160935160936160937160938160939160940160941160942160943160944160945160946160947160948160949160950160951160952160953160954160955160956160957160958160959160960160961160962160963160964160965160966160967160968160969160970160971160972160973160974160975160976160977160978160979160980160981160982160983160984160985160986160987160988160989160990160991160992160993160994160995160996160997160998160999161000161001161002161003161004161005161006161007161008161009161010161011161012161013161014161015161016161017161018161019161020161021161022161023161024161025161026161027161028161029161030161031161032161033161034161035161036161037161038161039161040161041161042161043161044161045161046161047161048161049161050161051161052161053161054161055161056161057161058161059161060161061161062161063161064161065161066161067161068161069161070161071161072161073161074161075161076161077161078161079161080161081161082161083161084161085161086161087161088161089161090161091161092161093161094161095161096161097161098161099161100161101161102161103161104161105161106161107161108161109161110161111161112161113161114161115161116161117161118161119161120161121161122161123161124161125161126161127161128161129161130161131161132161133161134161135161136161137161138161139161140161141161142161143161144161145161146161147161148161149161150161151161152161153161154161155161156161157161158161159161160161161161162161163161164161165161166161167161168161169161170161171161172161173161174161175161176161177161178161179161180161181161182161183161184161185161186161187161188161189161190161191161192161193161194161195161196161197161198161199161200161201161202161203161204161205161206161207161208161209161210161211161212161213161214161215161216161217161218161219161220161221161222161223161224161225161226161227161228161229161230161231161232161233161234161235161236161237161238161239161240161241161242161243161244161245161246161247161248161249161250161251161252161253161254161255161256161257161258161259161260161261161262161263161264161265161266161267161268161269161270161271161272161273161274161275161276161277161278161279161280161281161282161283161284161285161286161287161288161289161290161291161292161293161294161295161296161297161298161299161300161301161302161303161304161305161306161307161308161309161310161311161312161313161314161315161316161317161318161319161320161321161322161323161324161325161326161327161328161329161330161331161332161333161334161335161336161337161338161339161340161341161342161343161344161345161346161347161348161349161350161351161352161353161354161355161356161357161358161359161360161361161362161363161364161365161366161367161368161369161370161371161372161373161374161375161376161377161378161379161380161381161382161383161384161385161386161387161388161389161390161391161392161393161394161395161396161397161398161399161400161401161402161403161404161405161406161407161408161409161410161411161412161413161414161415161416161417161418161419161420161421161422161423161424161425161426161427161428161429161430161431161432161433161434161435161436161437161438161439161440161441161442161443161444161445161446161447161448161449161450161451161452161453161454161455161456161457161458161459161460161461161462161463161464161465161466161467161468161469161470161471161472161473161474161475161476161477161478161479161480161481161482161483161484161485161486161487161488161489161490161491161492161493161494161495161496161497161498161499161500161501161502161503161504161505161506161507161508161509161510161511161512161513161514161515161516161517161518161519161520161521161522161523161524161525161526161527161528161529161530161531161532161533161534161535161536161537161538161539161540161541161542161543161544161545161546161547161548161549161550161551161552161553161554161555161556161557161558161559161560161561161562161563161564161565161566161567161568161569161570161571161572161573161574161575161576161577161578161579161580161581161582161583161584161585161586161587161588161589161590161591161592161593161594161595161596161597161598161599161600161601161602161603161604161605161606161607161608161609161610161611161612161613161614161615161616161617161618161619161620161621161622161623161624161625161626161627161628161629161630161631161632161633161634161635161636161637161638161639161640161641161642161643161644161645161646161647161648161649161650161651161652161653161654161655161656161657161658161659161660161661161662161663161664161665161666161667161668161669161670161671161672161673161674161675161676161677161678161679161680161681161682161683161684161685161686161687161688161689161690161691161692161693161694161695161696161697161698161699161700161701161702161703161704161705161706161707161708161709161710161711161712161713161714161715161716161717161718161719161720161721161722161723161724161725161726161727161728161729161730161731161732161733161734161735161736161737161738161739161740161741161742161743161744161745161746161747161748161749161750161751161752161753161754161755161756161757161758161759161760161761161762161763161764161765161766161767161768161769161770161771161772161773161774161775161776161777161778161779161780161781161782161783161784161785161786161787161788161789161790161791161792161793161794161795161796161797161798161799161800161801161802161803161804161805161806161807161808161809161810161811161812161813161814161815161816161817161818161819161820161821161822161823161824161825161826161827161828161829161830161831161832161833161834161835161836161837161838161839161840161841161842161843161844161845161846161847161848161849161850161851161852161853161854161855161856161857161858161859161860161861161862161863161864161865161866161867161868161869161870161871161872161873161874161875161876161877161878161879161880161881161882161883161884161885161886161887161888161889161890161891161892161893161894161895161896161897161898161899161900161901161902161903161904161905161906161907161908161909161910161911161912161913161914161915161916161917161918161919161920161921161922161923161924161925161926161927161928161929161930161931161932161933161934161935161936161937161938161939161940161941161942161943161944161945161946161947161948161949161950161951161952161953161954161955161956161957161958161959161960161961161962161963161964161965161966161967161968161969161970161971161972161973161974161975161976161977161978161979161980161981161982161983161984161985161986161987161988161989161990161991161992161993161994161995161996161997161998161999162000162001162002162003162004162005162006162007162008162009162010162011162012162013162014162015162016162017162018162019162020162021162022162023162024162025162026162027162028162029162030162031162032162033162034162035162036162037162038162039162040162041162042162043162044162045162046162047162048162049162050162051162052162053162054162055162056162057162058162059162060162061162062162063162064162065162066162067162068162069162070162071162072162073162074162075162076162077162078162079162080162081162082162083162084162085162086162087162088162089162090162091162092162093162094162095162096162097162098162099162100162101162102162103162104162105162106162107162108162109162110162111162112162113162114162115162116162117162118162119162120162121162122162123162124162125162126162127162128162129162130162131162132162133162134162135162136162137162138162139162140162141162142162143162144162145162146162147162148162149162150162151162152162153162154162155162156162157162158162159162160162161162162162163162164162165162166162167162168162169162170162171162172162173162174162175162176162177162178162179162180162181162182162183162184162185162186162187162188162189162190162191162192162193162194162195162196162197162198162199162200162201162202162203162204162205162206162207162208162209162210162211162212162213162214162215162216162217162218162219162220162221162222162223162224162225162226162227162228162229162230162231162232162233162234162235162236162237162238162239162240162241162242162243162244162245162246162247162248162249162250162251162252162253162254162255162256162257162258162259162260162261162262162263162264162265162266162267162268162269162270162271162272162273162274162275162276162277162278162279162280162281162282162283162284162285162286162287162288162289162290162291162292162293162294162295162296162297162298162299162300162301162302162303162304162305162306162307162308162309162310162311162312162313162314162315162316162317162318162319162320162321162322162323162324162325162326162327162328162329162330162331162332162333162334162335162336162337162338162339162340162341162342162343162344162345162346162347162348162349162350162351162352162353162354162355162356162357162358162359162360162361162362162363162364162365162366162367162368162369162370162371162372162373162374162375162376162377162378162379162380162381162382162383162384162385162386162387162388162389162390162391162392162393162394162395162396162397162398162399162400162401162402162403162404162405162406162407162408162409162410162411162412162413162414162415162416162417162418162419162420162421162422162423162424162425162426162427162428162429162430162431162432162433162434162435162436162437162438162439162440162441162442162443162444162445162446162447162448162449162450162451162452162453162454162455162456162457162458162459162460162461162462162463162464162465162466162467162468162469162470162471162472162473162474162475162476162477162478162479162480162481162482162483162484162485162486162487162488162489162490162491162492162493162494162495162496162497162498162499162500162501162502162503162504162505162506162507162508162509162510162511162512162513162514162515162516162517162518162519162520162521162522162523162524162525162526162527162528162529162530162531162532162533162534162535162536162537162538162539162540162541162542162543162544162545162546162547162548162549162550162551162552162553162554162555162556162557162558162559162560162561162562162563162564162565162566162567162568162569162570162571162572162573162574162575162576162577162578162579162580162581162582162583162584162585162586162587162588162589162590162591162592162593162594162595162596162597162598162599162600162601162602162603162604162605162606162607162608162609162610162611162612162613162614162615162616162617162618162619162620162621162622162623162624162625162626162627162628162629162630162631162632162633162634162635162636162637162638162639162640162641162642162643162644162645162646162647162648162649162650162651162652162653162654162655162656162657162658162659162660162661162662162663162664162665162666162667162668162669162670162671162672162673162674162675162676162677162678162679162680162681162682162683162684162685162686162687162688162689162690162691162692162693162694162695162696162697162698162699162700162701162702162703162704162705162706162707162708162709162710162711162712162713162714162715162716162717162718162719162720162721162722162723162724162725162726162727162728162729162730162731162732162733162734162735162736162737162738162739162740162741162742162743162744162745162746162747162748162749162750162751162752162753162754162755162756162757162758162759162760162761162762162763162764162765162766162767162768162769162770162771162772162773162774162775162776162777162778162779162780162781162782162783162784162785162786162787162788162789162790162791162792162793162794162795162796162797162798162799162800162801162802162803162804162805162806162807162808162809162810162811162812162813162814162815162816162817162818162819162820162821162822162823162824162825162826162827162828162829162830162831162832162833162834162835162836162837162838162839162840162841162842162843162844162845162846162847162848162849162850162851162852162853162854162855162856162857162858162859162860162861162862162863162864162865162866162867162868162869162870162871162872162873162874162875162876162877162878162879162880162881162882162883162884162885162886162887162888162889162890162891162892162893162894162895162896162897162898162899162900162901162902162903162904162905162906162907162908162909162910162911162912162913162914162915162916162917162918162919162920162921162922162923162924162925162926162927162928162929162930162931162932162933162934162935162936162937162938162939162940162941162942162943162944162945162946162947162948162949162950162951162952162953162954162955162956162957162958162959162960162961162962162963162964162965162966162967162968162969162970162971162972162973162974162975162976162977162978162979162980162981162982162983162984162985162986162987162988162989162990162991162992162993162994162995162996162997162998162999163000163001163002163003163004163005163006163007163008163009163010163011163012163013163014163015163016163017163018163019163020163021163022163023163024163025163026163027163028163029163030163031163032163033163034163035163036163037163038163039163040163041163042163043163044163045163046163047163048163049163050163051163052163053163054163055163056163057163058163059163060163061163062163063163064163065163066163067163068163069163070163071163072163073163074163075163076163077163078163079163080163081163082163083163084163085163086163087163088163089163090163091163092163093163094163095163096163097163098163099163100163101163102163103163104163105163106163107163108163109163110163111163112163113163114163115163116163117163118163119163120163121163122163123163124163125163126163127163128163129163130163131163132163133163134163135163136163137163138163139163140163141163142163143163144163145163146163147163148163149163150163151163152163153163154163155163156163157163158163159163160163161163162163163163164163165163166163167163168163169163170163171163172163173163174163175163176163177163178163179163180163181163182163183163184163185163186163187163188163189163190163191163192163193163194163195163196163197163198163199163200163201163202163203163204163205163206163207163208163209163210163211163212163213163214163215163216163217163218163219163220163221163222163223163224163225163226163227163228163229163230163231163232163233163234163235163236163237163238163239163240163241163242163243163244163245163246163247163248163249163250163251163252163253163254163255163256163257163258163259163260163261163262163263163264163265163266163267163268163269163270163271163272163273163274163275163276163277163278163279163280163281163282163283163284163285163286163287163288163289163290163291163292163293163294163295163296163297163298163299163300163301163302163303163304163305163306163307163308163309163310163311163312163313163314163315163316163317163318163319163320163321163322163323163324163325163326163327163328163329163330163331163332163333163334163335163336163337163338163339163340163341163342163343163344163345163346163347163348163349163350163351163352163353163354163355163356163357163358163359163360163361163362163363163364163365163366163367163368163369163370163371163372163373163374163375163376163377163378163379163380163381163382163383163384163385163386163387163388163389163390163391163392163393163394163395163396163397163398163399163400163401163402163403163404163405163406163407163408163409163410163411163412163413163414163415163416163417163418163419163420163421163422163423163424163425163426163427163428163429163430163431163432163433163434163435163436163437163438163439163440163441163442163443163444163445163446163447163448163449163450163451163452163453163454163455163456163457163458163459163460163461163462163463163464163465163466163467163468163469163470163471163472163473163474163475163476163477163478163479163480163481163482163483163484163485163486163487163488163489163490163491163492163493163494163495163496163497163498163499163500163501163502163503163504163505163506163507163508163509163510163511163512163513163514163515163516163517163518163519163520163521163522163523163524163525163526163527163528163529163530163531163532163533163534163535163536163537163538163539163540163541163542163543163544163545163546163547163548163549163550163551163552163553163554163555163556163557163558163559163560163561163562163563163564163565163566163567163568163569163570163571163572163573163574163575163576163577163578163579163580163581163582163583163584163585163586163587163588163589163590163591163592163593163594163595163596163597163598163599163600163601163602163603163604163605163606163607163608163609163610163611163612163613163614163615163616163617163618163619163620163621163622163623163624163625163626163627163628163629163630163631163632163633163634163635163636163637163638163639163640163641163642163643163644163645163646163647163648163649163650163651163652163653163654163655163656163657163658163659163660163661163662163663163664163665163666163667163668163669163670163671163672163673163674163675163676163677163678163679163680163681163682163683163684163685163686163687163688163689163690163691163692163693163694163695163696163697163698163699163700163701163702163703163704163705163706163707163708163709163710163711163712163713163714163715163716163717163718163719163720163721163722163723163724163725163726163727163728163729163730163731163732163733163734163735163736163737163738163739163740163741163742163743163744163745163746163747163748163749163750163751163752163753163754163755163756163757163758163759163760163761163762163763163764163765163766163767163768163769163770163771163772163773163774163775163776163777163778163779163780163781163782163783163784163785163786163787163788163789163790163791163792163793163794163795163796163797163798163799163800163801163802163803163804163805163806163807163808163809163810163811163812163813163814163815163816163817163818163819163820163821163822163823163824163825163826163827163828163829163830163831163832163833163834163835163836163837163838163839163840163841163842163843163844163845163846163847163848163849163850163851163852163853163854163855163856163857163858163859163860163861163862163863163864163865163866163867163868163869163870163871163872163873163874163875163876163877163878163879163880163881163882163883163884163885163886163887163888163889163890163891163892163893163894163895163896163897163898163899163900163901163902163903163904163905163906163907163908163909163910163911163912163913163914163915163916163917163918163919163920163921163922163923163924163925163926163927163928163929163930163931163932163933163934163935163936163937163938163939163940163941163942163943163944163945163946163947163948163949163950163951163952163953163954163955163956163957163958163959163960163961163962163963163964163965163966163967163968163969163970163971163972163973163974163975163976163977163978163979163980163981163982163983163984163985163986163987163988163989163990163991163992163993163994163995163996163997163998163999164000164001164002164003164004164005164006164007164008164009164010164011164012164013164014164015164016164017164018164019164020164021164022164023164024164025164026164027164028164029164030164031164032164033164034164035164036164037164038164039164040164041164042164043164044164045164046164047164048164049164050164051164052164053164054164055164056164057164058164059164060164061164062164063164064164065164066164067164068164069164070164071164072164073164074164075164076164077164078164079164080164081164082164083164084164085164086164087164088164089164090164091164092164093164094164095164096164097164098164099164100164101164102164103164104164105164106164107164108164109164110164111164112164113164114164115164116164117164118164119164120164121164122164123164124164125164126164127164128164129164130164131164132164133164134164135164136164137164138164139164140164141164142164143164144164145164146164147164148164149164150164151164152164153164154164155164156164157164158164159164160164161164162164163164164164165164166164167164168164169164170164171164172164173164174164175164176164177164178164179164180164181164182164183164184164185164186164187164188164189164190164191164192164193164194164195164196164197164198164199164200164201164202164203164204164205164206164207164208164209164210164211164212164213164214164215164216164217164218164219164220164221164222164223164224164225164226164227164228164229164230164231164232164233164234164235164236164237164238164239164240164241164242164243164244164245164246164247164248164249164250164251164252164253164254164255164256164257164258164259164260164261164262164263164264164265164266164267164268164269164270164271164272164273164274164275164276164277164278164279164280164281164282164283164284164285164286164287164288164289164290164291164292164293164294164295164296164297164298164299164300164301164302164303164304164305164306164307164308164309164310164311164312164313164314164315164316164317164318164319164320164321164322164323164324164325164326164327164328164329164330164331164332164333164334164335164336164337164338164339164340164341164342164343164344164345164346164347164348164349164350164351164352164353164354164355164356164357164358164359164360164361164362164363164364164365164366164367164368164369164370164371164372164373164374164375164376164377164378164379164380164381164382164383164384164385164386164387164388164389164390164391164392164393164394164395164396164397164398164399164400164401164402164403164404164405164406164407164408164409164410164411164412164413164414164415164416164417164418164419164420164421164422164423164424164425164426164427164428164429164430164431164432164433164434164435164436164437164438164439164440164441164442164443164444164445164446164447164448164449164450164451164452164453164454164455164456164457164458164459164460164461164462164463164464164465164466164467164468164469164470164471164472164473164474164475164476164477164478164479164480164481164482164483164484164485164486164487164488164489164490164491164492164493164494164495164496164497164498164499164500164501164502164503164504164505164506164507164508164509164510164511164512164513164514164515164516164517164518164519164520164521164522164523164524164525164526164527164528164529164530164531164532164533164534164535164536164537164538164539164540164541164542164543164544164545164546164547164548164549164550164551164552164553164554164555164556164557164558164559164560164561164562164563164564164565164566164567164568164569164570164571164572164573164574164575164576164577164578164579164580164581164582164583164584164585164586164587164588164589164590164591164592164593164594164595164596164597164598164599164600164601164602164603164604164605164606164607164608164609164610164611164612164613164614164615164616164617164618164619164620164621164622164623164624164625164626164627164628164629164630164631164632164633164634164635164636164637164638164639164640164641164642164643164644164645164646164647164648164649164650164651164652164653164654164655164656164657164658164659164660164661164662164663164664164665164666164667164668164669164670164671164672164673164674164675164676164677164678164679164680164681164682164683164684164685164686164687164688164689164690164691164692164693164694164695164696164697164698164699164700164701164702164703164704164705164706164707164708164709164710164711164712164713164714164715164716164717164718164719164720164721164722164723164724164725164726164727164728164729164730164731164732164733164734164735164736164737164738164739164740164741164742164743164744164745164746164747164748164749164750164751164752164753164754164755164756164757164758164759164760164761164762164763164764164765164766164767164768164769164770164771164772164773164774164775164776164777164778164779164780164781164782164783164784164785164786164787164788164789164790164791164792164793164794164795164796164797164798164799164800164801164802164803164804164805164806164807164808164809164810164811164812164813164814164815164816164817164818164819164820164821164822164823164824164825164826164827164828164829164830164831164832164833164834164835164836164837164838164839164840164841164842164843164844164845164846164847164848164849164850164851164852164853164854164855164856164857164858164859164860164861164862164863164864164865164866164867164868164869164870164871164872164873164874164875164876164877164878164879164880164881164882164883164884164885164886164887164888164889164890164891164892164893164894164895164896164897164898164899164900164901164902164903164904164905164906164907164908164909164910164911164912164913164914164915164916164917164918164919164920164921164922164923164924164925164926164927164928164929164930164931164932164933164934164935164936164937164938164939164940164941164942164943164944164945164946164947164948164949164950164951164952164953164954164955164956164957164958164959164960164961164962164963164964164965164966164967164968164969164970164971164972164973164974164975164976164977164978164979164980164981164982164983164984164985164986164987164988164989164990164991164992164993164994164995164996164997164998164999165000165001165002165003165004165005165006165007165008165009165010165011165012165013165014165015165016165017165018165019165020165021165022165023165024165025165026165027165028165029165030165031165032165033165034165035165036165037165038165039165040165041165042165043165044165045165046165047165048165049165050165051165052165053165054165055165056165057165058165059165060165061165062165063165064165065165066165067165068165069165070165071165072165073165074165075165076165077165078165079165080165081165082165083165084165085165086165087165088165089165090165091165092165093165094165095165096165097165098165099165100165101165102165103165104165105165106165107165108165109165110165111165112165113165114165115165116165117165118165119165120165121165122165123165124165125165126165127165128165129165130165131165132165133165134165135165136165137165138165139165140165141165142165143165144165145165146165147165148165149165150165151165152165153165154165155165156165157165158165159165160165161165162165163165164165165165166165167165168165169165170165171165172165173165174165175165176165177165178165179165180165181165182165183165184165185165186165187165188165189165190165191165192165193165194165195165196165197165198165199165200165201165202165203165204165205165206165207165208165209165210165211165212165213165214165215165216165217165218165219165220165221165222165223165224165225165226165227165228165229165230165231165232165233165234165235165236165237165238165239165240165241165242165243165244165245165246165247165248165249165250165251165252165253165254165255165256165257165258165259165260165261165262165263165264165265165266165267165268165269165270165271165272165273165274165275165276165277165278165279165280165281165282165283165284165285165286165287165288165289165290165291165292165293165294165295165296165297165298165299165300165301165302165303165304165305165306165307165308165309165310165311165312165313165314165315165316165317165318165319165320165321165322165323165324165325165326165327165328165329165330165331165332165333165334165335165336165337165338165339165340165341165342165343165344165345165346165347165348165349165350165351165352165353165354165355165356165357165358165359165360165361165362165363165364165365165366165367165368165369165370165371165372165373165374165375165376165377165378165379165380165381165382165383165384165385165386165387165388165389165390165391165392165393165394165395165396165397165398165399165400165401165402165403165404165405165406165407165408165409165410165411165412165413165414165415165416165417165418165419165420165421165422165423165424165425165426165427165428165429165430165431165432165433165434165435165436165437165438165439165440165441165442165443165444165445165446165447165448165449165450165451165452165453165454165455165456165457165458165459165460165461165462165463165464165465165466165467165468165469165470165471165472165473165474165475165476165477165478165479165480165481165482165483165484165485165486165487165488165489165490165491165492165493165494165495165496165497165498165499165500165501165502165503165504165505165506165507165508165509165510165511165512165513165514165515165516165517165518165519165520165521165522165523165524165525165526165527165528165529165530165531165532165533165534165535165536165537165538165539165540165541165542165543165544165545165546165547165548165549165550165551165552165553165554165555165556165557165558165559165560165561165562165563165564165565165566165567165568165569165570165571165572165573165574165575165576165577165578165579165580165581165582165583165584165585165586165587165588165589165590165591165592165593165594165595165596165597165598165599165600165601165602165603165604165605165606165607165608165609165610165611165612165613165614165615165616165617165618165619165620165621165622165623165624165625165626165627165628165629165630165631165632165633165634165635165636165637165638165639165640165641165642165643165644165645165646165647165648165649165650165651165652165653165654165655165656165657165658165659165660165661165662165663165664165665165666165667165668165669165670165671165672165673165674165675165676165677165678165679165680165681165682165683165684165685165686165687165688165689165690165691165692165693165694165695165696165697165698165699165700165701165702165703165704165705165706165707165708165709165710165711165712165713165714165715165716165717165718165719165720165721165722165723165724165725165726165727165728165729165730165731165732165733165734165735165736165737165738165739165740165741165742165743165744165745165746165747165748165749165750165751165752165753165754165755165756165757165758165759165760165761165762165763165764165765165766165767165768165769165770165771165772165773165774165775165776165777165778165779165780165781165782165783165784165785165786165787165788165789165790165791165792165793165794165795165796165797165798165799165800165801165802165803165804165805165806165807165808165809165810165811165812165813165814165815165816165817165818165819165820165821165822165823165824165825165826165827165828165829165830165831165832165833165834165835165836165837165838165839165840165841165842165843165844165845165846165847165848165849165850165851165852165853165854165855165856165857165858165859165860165861165862165863165864165865165866165867165868165869165870165871165872165873165874165875165876165877165878165879165880165881165882165883165884165885165886165887165888165889165890165891165892165893165894165895165896165897165898165899165900165901165902165903165904165905165906165907165908165909165910165911165912165913165914165915165916165917165918165919165920165921165922165923165924165925165926165927165928165929165930165931165932165933165934165935165936165937165938165939165940165941165942165943165944165945165946165947165948165949165950165951165952165953165954165955165956165957165958165959165960165961165962165963165964165965165966165967165968165969165970165971165972165973165974165975165976165977165978165979165980165981165982165983165984165985165986165987165988165989165990165991165992165993165994165995165996165997165998165999166000166001166002166003166004166005166006166007166008166009166010166011166012166013166014166015166016166017166018166019166020166021166022166023166024166025166026166027166028166029166030166031166032166033166034166035166036166037166038166039166040166041166042166043166044166045166046166047166048166049166050166051166052166053166054166055166056166057166058166059166060166061166062166063166064166065166066166067166068166069166070166071166072166073166074166075166076166077166078166079166080166081166082166083166084166085166086166087166088166089166090166091166092166093166094166095166096166097166098166099166100166101166102166103166104166105166106166107166108166109166110166111166112166113166114166115166116166117166118166119166120166121166122166123166124166125166126166127166128166129166130166131166132166133166134166135166136166137166138166139166140166141166142166143166144166145166146166147166148166149166150166151166152166153166154166155166156166157166158166159166160166161166162166163166164166165166166166167166168166169166170166171166172166173166174166175166176166177166178166179166180166181166182166183166184166185166186166187166188166189166190166191166192166193166194166195166196166197166198166199166200166201166202166203166204166205166206166207166208166209166210166211166212166213166214166215166216166217166218166219166220166221166222166223166224166225166226166227166228166229166230166231166232166233166234166235166236166237166238166239166240166241166242166243166244166245166246166247166248166249166250166251166252166253166254166255166256166257166258166259166260166261166262166263166264166265166266166267166268166269166270166271166272166273166274166275166276166277166278166279166280166281166282166283166284166285166286166287166288166289166290166291166292166293166294166295166296166297166298166299166300166301166302166303166304166305166306166307166308166309166310166311166312166313166314166315166316166317166318166319166320166321166322166323166324166325166326166327166328166329166330166331166332166333166334166335166336166337166338166339166340166341166342166343166344166345166346166347166348166349166350166351166352166353166354166355166356166357166358166359166360166361166362166363166364166365166366166367166368166369166370166371166372166373166374166375166376166377166378166379166380166381166382166383166384166385166386166387166388166389166390166391166392166393166394166395166396166397166398166399166400166401166402166403166404166405166406166407166408166409166410166411166412166413166414166415166416166417166418166419166420166421166422166423166424166425166426166427166428166429166430166431166432166433166434166435166436166437166438166439166440166441166442166443166444166445166446166447166448166449166450166451166452166453166454166455166456166457166458166459166460166461166462166463166464166465166466166467166468166469166470166471166472166473166474166475166476166477166478166479166480166481166482166483166484166485166486166487166488166489166490166491166492166493166494166495166496166497166498166499166500166501166502166503166504166505166506166507166508166509166510166511166512166513166514166515166516166517166518166519166520166521166522166523166524166525166526166527166528166529166530166531166532166533166534166535166536166537166538166539166540166541166542166543166544166545166546166547166548166549166550166551166552166553166554166555166556166557166558166559166560166561166562166563166564166565166566166567166568166569166570166571166572166573166574166575166576166577166578166579166580166581166582166583166584166585166586166587166588166589166590166591166592166593166594166595166596166597166598166599166600166601166602166603166604166605166606166607166608166609166610166611166612166613166614166615166616166617166618166619166620166621166622166623166624166625166626166627166628166629166630166631166632166633166634166635166636166637166638166639166640166641166642166643166644166645166646166647166648166649166650166651166652166653166654166655166656166657166658166659166660166661166662166663166664166665166666166667166668166669166670166671166672166673166674166675166676166677166678166679166680166681166682166683166684166685166686166687166688166689166690166691166692166693166694166695166696166697166698166699166700166701166702166703166704166705166706166707166708166709166710166711166712166713166714166715166716166717166718166719166720166721166722166723166724166725166726166727166728166729166730166731166732166733166734166735166736166737166738166739166740166741166742166743166744166745166746166747166748166749166750166751166752166753166754166755166756166757166758166759166760166761166762166763166764166765166766166767166768166769166770166771166772166773166774166775166776166777166778166779166780166781166782166783166784166785166786166787166788166789166790166791166792166793166794166795166796166797166798166799166800166801166802166803166804166805166806166807166808166809166810166811166812166813166814166815166816166817166818166819166820166821166822166823166824166825166826166827166828166829166830166831166832166833166834166835166836166837166838166839166840166841166842166843166844166845166846166847166848166849166850166851166852166853166854166855166856166857166858166859166860166861166862166863166864166865166866166867166868166869166870166871166872166873166874166875166876166877166878166879166880166881166882166883166884166885166886166887166888166889166890166891166892166893166894166895166896166897166898166899166900166901166902166903166904166905166906166907166908166909166910166911166912166913166914166915166916166917166918166919166920166921166922166923166924166925166926166927166928166929166930166931166932166933166934166935166936166937166938166939166940166941166942166943166944166945166946166947166948166949166950166951166952166953166954166955166956166957166958166959166960166961166962166963166964166965166966166967166968166969166970166971166972166973166974166975166976166977166978166979166980166981166982166983166984166985166986166987166988166989166990166991166992166993166994166995166996166997166998166999167000167001167002167003167004167005167006167007167008167009167010167011167012167013167014167015167016167017167018167019167020167021167022167023167024167025167026167027167028167029167030167031167032167033167034167035167036167037167038167039167040167041167042167043167044167045167046167047167048167049167050167051167052167053167054167055167056167057167058167059167060167061167062167063167064167065167066167067167068167069167070167071167072167073167074167075167076167077167078167079167080167081167082167083167084167085167086167087167088167089167090167091167092167093167094167095167096167097167098167099167100167101167102167103167104167105167106167107167108167109167110167111167112167113167114167115167116167117167118167119167120167121167122167123167124167125167126167127167128167129167130167131167132167133167134167135167136167137167138167139167140167141167142167143167144167145167146167147167148167149167150167151167152167153167154167155167156167157167158167159167160167161167162167163167164167165167166167167167168167169167170167171167172167173167174167175167176167177167178167179167180167181167182167183167184167185167186167187167188167189167190167191167192167193167194167195167196167197167198167199167200167201167202167203167204167205167206167207167208167209167210167211167212167213167214167215167216167217167218167219167220167221167222167223167224167225167226167227167228167229167230167231167232167233167234167235167236167237167238167239167240167241167242167243167244167245167246167247167248167249167250167251167252167253167254167255167256167257167258167259167260167261167262167263167264167265167266167267167268167269167270167271167272167273167274167275167276167277167278167279167280167281167282167283167284167285167286167287167288167289167290167291167292167293167294167295167296167297167298167299167300167301167302167303167304167305167306167307167308167309167310167311167312167313167314167315167316167317167318167319167320167321167322167323167324167325167326167327167328167329167330167331167332167333167334167335167336167337167338167339167340167341167342167343167344167345167346167347167348167349167350167351167352167353167354167355167356167357167358167359167360167361167362167363167364167365167366167367167368167369167370167371167372167373167374167375167376167377167378167379167380167381167382167383167384167385167386167387167388167389167390167391167392167393167394167395167396167397167398167399167400167401167402167403167404167405167406167407167408167409167410167411167412167413167414167415167416167417167418167419167420167421167422167423167424167425167426167427167428167429167430167431167432167433167434167435167436167437167438167439167440167441167442167443167444167445167446167447167448167449167450167451167452167453167454167455167456167457167458167459167460167461167462167463167464167465167466167467167468167469167470167471167472167473167474167475167476167477167478167479167480167481167482167483167484167485167486167487167488167489167490167491167492167493167494167495167496167497167498167499167500167501167502167503167504167505167506167507167508167509167510167511167512167513167514167515167516167517167518167519167520167521167522167523167524167525167526167527167528167529167530167531167532167533167534167535167536167537167538167539167540167541167542167543167544167545167546167547167548167549167550167551167552167553167554167555167556167557167558167559167560167561167562167563167564167565167566167567167568167569167570167571167572167573167574167575167576167577167578167579167580167581167582167583167584167585167586167587167588167589167590167591167592167593167594167595167596167597167598167599167600167601167602167603167604167605167606167607167608167609167610167611167612167613167614167615167616167617167618167619167620167621167622167623167624167625167626167627167628167629167630167631167632167633167634167635167636167637167638167639167640167641167642167643167644167645167646167647167648167649167650167651167652167653167654167655167656167657167658167659167660167661167662167663167664167665167666167667167668167669167670167671167672167673167674167675167676167677167678167679167680167681167682167683167684167685167686167687167688167689167690167691167692167693167694167695167696167697167698167699167700167701167702167703167704167705167706167707167708167709167710167711167712167713167714167715167716167717167718167719167720167721167722167723167724167725167726167727167728167729167730167731167732167733167734167735167736167737167738167739167740167741167742167743167744167745167746167747167748167749167750167751167752167753167754167755167756167757167758167759167760167761167762167763167764167765167766167767167768167769167770167771167772167773167774167775167776167777167778167779167780167781167782167783167784167785167786167787167788167789167790167791167792167793167794167795167796167797167798167799167800167801167802167803167804167805167806167807167808167809167810167811167812167813167814167815167816167817167818167819167820167821167822167823167824167825167826167827167828167829167830167831167832167833167834167835167836167837167838167839167840167841167842167843167844167845167846167847167848167849167850167851167852167853167854167855167856167857167858167859167860167861167862167863167864167865167866167867167868167869167870167871167872167873167874167875167876167877167878167879167880167881167882167883167884167885167886167887167888167889167890167891167892167893167894167895167896167897167898167899167900167901167902167903167904167905167906167907167908167909167910167911167912167913167914167915167916167917167918167919167920167921167922167923167924167925167926167927167928167929167930167931167932167933167934167935167936167937167938167939167940167941167942167943167944167945167946167947167948167949167950167951167952167953167954167955167956167957167958167959167960167961167962167963167964167965167966167967167968167969167970167971167972167973167974167975167976167977167978167979167980167981167982167983167984167985167986167987167988167989167990167991167992167993167994167995167996167997167998167999168000168001168002168003168004168005168006168007168008168009168010168011168012168013168014168015168016168017168018168019168020168021168022168023168024168025168026168027168028168029168030168031168032168033168034168035168036168037168038168039168040168041168042168043168044168045168046168047168048168049168050168051168052168053168054168055168056168057168058168059168060168061168062168063168064168065168066168067168068168069168070168071168072168073168074168075168076168077168078168079168080168081168082168083168084168085168086168087168088168089168090168091168092168093168094168095168096168097168098168099168100168101168102168103168104168105168106168107168108168109168110168111168112168113168114168115168116168117168118168119168120168121168122168123168124168125168126168127168128168129168130168131168132168133168134168135168136168137168138168139168140168141168142168143168144168145168146168147168148168149168150168151168152168153168154168155168156168157168158168159168160168161168162168163168164168165168166168167168168168169168170168171168172168173168174168175168176168177168178168179168180168181168182168183168184168185168186168187168188168189168190168191168192168193168194168195168196168197168198168199168200168201168202168203168204168205168206168207168208168209168210168211168212168213168214168215168216168217168218168219168220168221168222168223168224168225168226168227168228168229168230168231168232168233168234168235168236168237168238168239168240168241168242168243168244168245168246168247168248168249168250168251168252168253168254168255168256168257168258168259168260168261168262168263168264168265168266168267168268168269168270168271168272168273168274168275168276168277168278168279168280168281168282168283168284168285168286168287168288168289168290168291168292168293168294168295168296168297168298168299168300168301168302168303168304168305168306168307168308168309168310168311168312168313168314168315168316168317168318168319168320168321168322168323168324168325168326168327168328168329168330168331168332168333168334168335168336168337168338168339168340168341168342168343168344168345168346168347168348168349168350168351168352168353168354168355168356168357168358168359168360168361168362168363168364168365168366168367168368168369168370168371168372168373168374168375168376168377168378168379168380168381168382168383168384168385168386168387168388168389168390168391168392168393168394168395168396168397168398168399168400168401168402168403168404168405168406168407168408168409168410168411168412168413168414168415168416168417168418168419168420168421168422168423168424168425168426168427168428168429168430168431168432168433168434168435168436168437168438168439168440168441168442168443168444168445168446168447168448168449168450168451168452168453168454168455168456168457168458168459168460168461168462168463168464168465168466168467168468168469168470168471168472168473168474168475168476168477168478168479168480168481168482168483168484168485168486168487168488168489168490168491168492168493168494168495168496168497168498168499168500168501168502168503168504168505168506168507168508168509168510168511168512168513168514168515168516168517168518168519168520168521168522168523168524168525168526168527168528168529168530168531168532168533168534168535168536168537168538168539168540168541168542168543168544168545168546168547168548168549168550168551168552168553168554168555168556168557168558168559168560168561168562168563168564168565168566168567168568168569168570168571168572168573168574168575168576168577168578168579168580168581168582168583168584168585168586168587168588168589168590168591168592168593168594168595168596168597168598168599168600168601168602168603168604168605168606168607168608168609168610168611168612168613168614168615168616168617168618168619168620168621168622168623168624168625168626168627168628168629168630168631168632168633168634168635168636168637168638168639168640168641168642168643168644168645168646168647168648168649168650168651168652168653168654168655168656168657168658168659168660168661168662168663168664168665168666168667168668168669168670168671168672168673168674168675168676168677168678168679168680168681168682168683168684168685168686168687168688168689168690168691168692168693168694168695168696168697168698168699168700168701168702168703168704168705168706168707168708168709168710168711168712168713168714168715168716168717168718168719168720168721168722168723168724168725168726168727168728168729168730168731168732168733168734168735168736168737168738168739168740168741168742168743168744168745168746168747168748168749168750168751168752168753168754168755168756168757168758168759168760168761168762168763168764168765168766168767168768168769168770168771168772168773168774168775168776168777168778168779168780168781168782168783168784168785168786168787168788168789168790168791168792168793168794168795168796168797168798168799168800168801168802168803168804168805168806168807168808168809168810168811168812168813168814168815168816168817168818168819168820168821168822168823168824168825168826168827168828168829168830168831168832168833168834168835168836168837168838168839168840168841168842168843168844168845168846168847168848168849168850168851168852168853168854168855168856168857168858168859168860168861168862168863168864168865168866168867168868168869168870168871168872168873168874168875168876168877168878168879168880168881168882168883168884168885168886168887168888168889168890168891168892168893168894168895168896168897168898168899168900168901168902168903168904168905168906168907168908168909168910168911168912168913168914168915168916168917168918168919168920168921168922168923168924168925168926168927168928168929168930168931168932168933168934168935168936168937168938168939168940168941168942168943168944168945168946168947168948168949168950168951168952168953168954168955168956168957168958168959168960168961168962168963168964168965168966168967168968168969168970168971168972168973168974168975168976168977168978168979168980168981168982168983168984168985168986168987168988168989168990168991168992168993168994168995168996168997168998168999169000169001169002169003169004169005169006169007169008169009169010169011169012169013169014169015169016169017169018169019169020169021169022169023169024169025169026169027169028169029169030169031169032169033169034169035169036169037169038169039169040169041169042169043169044169045169046169047169048169049169050169051169052169053169054169055169056169057169058169059169060169061169062169063169064169065169066169067169068169069169070169071169072169073169074169075169076169077169078169079169080169081169082169083169084169085169086169087169088169089169090169091169092169093169094169095169096169097169098169099169100169101169102169103169104169105169106169107169108169109169110169111169112169113169114169115169116169117169118169119169120169121169122169123169124169125169126169127169128169129169130169131169132169133169134169135169136169137169138169139169140169141169142169143169144169145169146169147169148169149169150169151169152169153169154169155169156169157169158169159169160169161169162169163169164169165169166169167169168169169169170169171169172169173169174169175169176169177169178169179169180169181169182169183169184169185169186169187169188169189169190169191169192169193169194169195169196169197169198169199169200169201169202169203169204169205169206169207169208169209169210169211169212169213169214169215169216169217169218169219169220169221169222169223169224169225169226169227169228169229169230169231169232169233169234169235169236169237169238169239169240169241169242169243169244169245169246169247169248169249169250169251169252169253169254169255169256169257169258169259169260169261169262169263169264169265169266169267169268169269169270169271169272169273169274169275169276169277169278169279169280169281169282169283169284169285169286169287169288169289169290169291169292169293169294169295169296169297169298169299169300169301169302169303169304169305169306169307169308169309169310169311169312169313169314169315169316169317169318169319169320169321169322169323169324169325169326169327169328169329169330169331169332169333169334169335169336169337169338169339169340169341169342169343169344169345169346169347169348169349169350169351169352169353169354169355169356169357169358169359169360169361169362169363169364169365169366169367169368169369169370169371169372169373169374169375169376169377169378169379169380169381169382169383169384169385169386169387169388169389169390169391169392169393169394169395169396169397169398169399169400169401169402169403169404169405169406169407169408169409169410169411169412169413169414169415169416169417169418169419169420169421169422169423169424169425169426169427169428169429169430169431169432169433169434169435169436169437169438169439169440169441169442169443169444169445169446169447169448169449169450169451169452169453169454169455169456169457169458169459169460169461169462169463169464169465169466169467169468169469169470169471169472169473169474169475169476169477169478169479169480169481169482169483169484169485169486169487169488169489169490169491169492169493169494169495169496169497169498169499169500169501169502169503169504169505169506169507169508169509169510169511169512169513169514169515169516169517169518169519169520169521169522169523169524169525169526169527169528169529169530169531169532169533169534169535169536169537169538169539169540169541169542169543169544169545169546169547169548169549169550169551169552169553169554169555169556169557169558169559169560169561169562169563169564169565169566169567169568169569169570169571169572169573169574169575169576169577169578169579169580169581169582169583169584169585169586169587169588169589169590169591169592169593169594169595169596169597169598169599169600169601169602169603169604169605169606169607169608169609169610169611169612169613169614169615169616169617169618169619169620169621169622169623169624169625169626169627169628169629169630169631169632169633169634169635169636169637169638169639169640169641169642169643169644169645169646169647169648169649169650169651169652169653169654169655169656169657169658169659169660169661169662169663169664169665169666169667169668169669169670169671169672169673169674169675169676169677169678169679169680169681169682169683169684169685169686169687169688169689169690169691169692169693169694169695169696169697169698169699169700169701169702169703169704169705169706169707169708169709169710169711169712169713169714169715169716169717169718169719169720169721169722169723169724169725169726169727169728169729169730169731169732169733169734169735169736169737169738169739169740169741169742169743169744169745169746169747169748169749169750169751169752169753169754169755169756169757169758169759169760169761169762169763169764169765169766169767169768169769169770169771169772169773169774169775169776169777169778169779169780169781169782169783169784169785169786169787169788169789169790169791169792169793169794169795169796169797169798169799169800169801169802169803169804169805169806169807169808169809169810169811169812169813169814169815169816169817169818169819169820169821169822169823169824169825169826169827169828169829169830169831169832169833169834169835169836169837169838169839169840169841169842169843169844169845169846169847169848169849169850169851169852169853169854169855169856169857169858169859169860169861169862169863169864169865169866169867169868169869169870169871169872169873169874169875169876169877169878169879169880169881169882169883169884169885169886169887169888169889169890169891169892169893169894169895169896169897169898169899169900169901169902169903169904169905169906169907169908169909169910169911169912169913169914169915169916169917169918169919169920169921169922169923169924169925169926169927169928169929169930169931169932169933169934169935169936169937169938169939169940169941169942169943169944169945169946169947169948169949169950169951169952169953169954169955169956169957169958169959169960169961169962169963169964169965169966169967169968169969169970169971169972169973169974169975169976169977169978169979169980169981169982169983169984169985169986169987169988169989169990169991169992169993169994169995169996169997169998169999170000170001170002170003170004170005170006170007170008170009170010170011170012170013170014170015170016170017170018170019170020170021170022170023170024170025170026170027170028170029170030170031170032170033170034170035170036170037170038170039170040170041170042170043170044170045170046170047170048170049170050170051170052170053170054170055170056170057170058170059170060170061170062170063170064170065170066170067170068170069170070170071170072170073170074170075170076170077170078170079170080170081170082170083170084170085170086170087170088170089170090170091170092170093170094170095170096170097170098170099170100170101170102170103170104170105170106170107170108170109170110170111170112170113170114170115170116170117170118170119170120170121170122170123170124170125170126170127170128170129170130170131170132170133170134170135170136170137170138170139170140170141170142170143170144170145170146170147170148170149170150170151170152170153170154170155170156170157170158170159170160170161170162170163170164170165170166170167170168170169170170170171170172170173170174170175170176170177170178170179170180170181170182170183170184170185170186170187170188170189170190170191170192170193170194170195170196170197170198170199170200170201170202170203170204170205170206170207170208170209170210170211170212170213170214170215170216170217170218170219170220170221170222170223170224170225170226170227170228170229170230170231170232170233170234170235170236170237170238170239170240170241170242170243170244170245170246170247170248170249170250170251170252170253170254170255170256170257170258170259170260170261170262170263170264170265170266170267170268170269170270170271170272170273170274170275170276170277170278170279170280170281170282170283170284170285170286170287170288170289170290170291170292170293170294170295170296170297170298170299170300170301170302170303170304170305170306170307170308170309170310170311170312170313170314170315170316170317170318170319170320170321170322170323170324170325170326170327170328170329170330170331170332170333170334170335170336170337170338170339170340170341170342170343170344170345170346170347170348170349170350170351170352170353170354170355170356170357170358170359170360170361170362170363170364170365170366170367170368170369170370170371170372170373170374170375170376170377170378170379170380170381170382170383170384170385170386170387170388170389170390170391170392170393170394170395170396170397170398170399170400170401170402170403170404170405170406170407170408170409170410170411170412170413170414170415170416170417170418170419170420170421170422170423170424170425170426170427170428170429170430170431170432170433170434170435170436170437170438170439170440170441170442170443170444170445170446170447170448170449170450170451170452170453170454170455170456170457170458170459170460170461170462170463170464170465170466170467170468170469170470170471170472170473170474170475170476170477170478170479170480170481170482170483170484170485170486170487170488170489170490170491170492170493170494170495170496170497170498170499170500170501170502170503170504170505170506170507170508170509170510170511170512170513170514170515170516170517170518170519170520170521170522170523170524170525170526170527170528170529170530170531170532170533170534170535170536170537170538170539170540170541170542170543170544170545170546170547170548170549170550170551170552170553170554170555170556170557170558170559170560170561170562170563170564170565170566170567170568170569170570170571170572170573170574170575170576170577170578170579170580170581170582170583170584170585170586170587170588170589170590170591170592170593170594170595170596170597170598170599170600170601170602170603170604170605170606170607170608170609170610170611170612170613170614170615170616170617170618170619170620170621170622170623170624170625170626170627170628170629170630170631170632170633170634170635170636170637170638170639170640170641170642170643170644170645170646170647170648170649170650170651170652170653170654170655170656170657170658170659170660170661170662170663170664170665170666170667170668170669170670170671170672170673170674170675170676170677170678170679170680170681170682170683170684170685170686170687170688170689170690170691170692170693170694170695170696170697170698170699170700170701170702170703170704170705170706170707170708170709170710170711170712170713170714170715170716170717170718170719170720170721170722170723170724170725170726170727170728170729170730170731170732170733170734170735170736170737170738170739170740170741170742170743170744170745170746170747170748170749170750170751170752170753170754170755170756170757170758170759170760170761170762170763170764170765170766170767170768170769170770170771170772170773170774170775170776170777170778170779170780170781170782170783170784170785170786170787170788170789170790170791170792170793170794170795170796170797170798170799170800170801170802170803170804170805170806170807170808170809170810170811170812170813170814170815170816170817170818170819170820170821170822170823170824170825170826170827170828170829170830170831170832170833170834170835170836170837170838170839170840170841170842170843170844170845170846170847170848170849170850170851170852170853170854170855170856170857170858170859170860170861170862170863170864170865170866170867170868170869170870170871170872170873170874170875170876170877170878170879170880170881170882170883170884170885170886170887170888170889170890170891170892170893170894170895170896170897170898170899170900170901170902170903170904170905170906170907170908170909170910170911170912170913170914170915170916170917170918170919170920170921170922170923170924170925170926170927170928170929170930170931170932170933170934170935170936170937170938170939170940170941170942170943170944170945170946170947170948170949170950170951170952170953170954170955170956170957170958170959170960170961170962170963170964170965170966170967170968170969170970170971170972170973170974170975170976170977170978170979170980170981170982170983170984170985170986170987170988170989170990170991170992170993170994170995170996170997170998170999171000171001171002171003171004171005171006171007171008171009171010171011171012171013171014171015171016171017171018171019171020171021171022171023171024171025171026171027171028171029171030171031171032171033171034171035171036171037171038171039171040171041171042171043171044171045171046171047171048171049171050171051171052171053171054171055171056171057171058171059171060171061171062171063171064171065171066171067171068171069171070171071171072171073171074171075171076171077171078171079171080171081171082171083171084171085171086171087171088171089171090171091171092171093171094171095171096171097171098171099171100171101171102171103171104171105171106171107171108171109171110171111171112171113171114171115171116171117171118171119171120171121171122171123171124171125171126171127171128171129171130171131171132171133171134171135171136171137171138171139171140171141171142171143171144171145171146171147171148171149171150171151171152171153171154171155171156171157171158171159171160171161171162171163171164171165171166171167171168171169171170171171171172171173171174171175171176171177171178171179171180171181171182171183171184171185171186171187171188171189171190171191171192171193171194171195171196171197171198171199171200171201171202171203171204171205171206171207171208171209171210171211171212171213171214171215171216171217171218171219171220171221171222171223171224171225171226171227171228171229171230171231171232171233171234171235171236171237171238171239171240171241171242171243171244171245171246171247171248171249171250171251171252171253171254171255171256171257171258171259171260171261171262171263171264171265171266171267171268171269171270171271171272171273171274171275171276171277171278171279171280171281171282171283171284171285171286171287171288171289171290171291171292171293171294171295171296171297171298171299171300171301171302171303171304171305171306171307171308171309171310171311171312171313171314171315171316171317171318171319171320171321171322171323171324171325171326171327171328171329171330171331171332171333171334171335171336171337171338171339171340171341171342171343171344171345171346171347171348171349171350171351171352171353171354171355171356171357171358171359171360171361171362171363171364171365171366171367171368171369171370171371171372171373171374171375171376171377171378171379171380171381171382171383171384171385171386171387171388171389171390171391171392171393171394171395171396171397171398171399171400171401171402171403171404171405171406171407171408171409171410171411171412171413171414171415171416171417171418171419171420171421171422171423171424171425171426171427171428171429171430171431171432171433171434171435171436171437171438171439171440171441171442171443171444171445171446171447171448171449171450171451171452171453171454171455171456171457171458171459171460171461171462171463171464171465171466171467171468171469171470171471171472171473171474171475171476171477171478171479171480171481171482171483171484171485171486171487171488171489171490171491171492171493171494171495171496171497171498171499171500171501171502171503171504171505171506171507171508171509171510171511171512171513171514171515171516171517171518171519171520171521171522171523171524171525171526171527171528171529171530171531171532171533171534171535171536171537171538171539171540171541171542171543171544171545171546171547171548171549171550171551171552171553171554171555171556171557171558171559171560171561171562171563171564171565171566171567171568171569171570171571171572171573171574171575171576171577171578171579171580171581171582171583171584171585171586171587171588171589171590171591171592171593171594171595171596171597171598171599171600171601171602171603171604171605171606171607171608171609171610171611171612171613171614171615171616171617171618171619171620171621171622171623171624171625171626171627171628171629171630171631171632171633171634171635171636171637171638171639171640171641171642171643171644171645171646171647171648171649171650171651171652171653171654171655171656171657171658171659171660171661171662171663171664171665171666171667171668171669171670171671171672171673171674171675171676171677171678171679171680171681171682171683171684171685171686171687171688171689171690171691171692171693171694171695171696171697171698171699171700171701171702171703171704171705171706171707171708171709171710171711171712171713171714171715171716171717171718171719171720171721171722171723171724171725171726171727171728171729171730171731171732171733171734171735171736171737171738171739171740171741171742171743171744171745171746171747171748171749171750171751171752171753171754171755171756171757171758171759171760171761171762171763171764171765171766171767171768171769171770171771171772171773171774171775171776171777171778171779171780171781171782171783171784171785171786171787171788171789171790171791171792171793171794171795171796171797171798171799171800171801171802171803171804171805171806171807171808171809171810171811171812171813171814171815171816171817171818171819171820171821171822171823171824171825171826171827171828171829171830171831171832171833171834171835171836171837171838171839171840171841171842171843171844171845171846171847171848171849171850171851171852171853171854171855171856171857171858171859171860171861171862171863171864171865171866171867171868171869171870171871171872171873171874171875171876171877171878171879171880171881171882171883171884171885171886171887171888171889171890171891171892171893171894171895171896171897171898171899171900171901171902171903171904171905171906171907171908171909171910171911171912171913171914171915171916171917171918171919171920171921171922171923171924171925171926171927171928171929171930171931171932171933171934171935171936171937171938171939171940171941171942171943171944171945171946171947171948171949171950171951171952171953171954171955171956171957171958171959171960171961171962171963171964171965171966171967171968171969171970171971171972171973171974171975171976171977171978171979171980171981171982171983171984171985171986171987171988171989171990171991171992171993171994171995171996171997171998171999172000172001172002172003172004172005172006172007172008172009172010172011172012172013172014172015172016172017172018172019172020172021172022172023172024172025172026172027172028172029172030172031172032172033172034172035172036172037172038172039172040172041172042172043172044172045172046172047172048172049172050172051172052172053172054172055172056172057172058172059172060172061172062172063172064172065172066172067172068172069172070172071172072172073172074172075172076172077172078172079172080172081172082172083172084172085172086172087172088172089172090172091172092172093172094172095172096172097172098172099172100172101172102172103172104172105172106172107172108172109172110172111172112172113172114172115172116172117172118172119172120172121172122172123172124172125172126172127172128172129172130172131172132172133172134172135172136172137172138172139172140172141172142172143172144172145172146172147172148172149172150172151172152172153172154172155172156172157172158172159172160172161172162172163172164172165172166172167172168172169172170172171172172172173172174172175172176172177172178172179172180172181172182172183172184172185172186172187172188172189172190172191172192172193172194172195172196172197172198172199172200172201172202172203172204172205172206172207172208172209172210172211172212172213172214172215172216172217172218172219172220172221172222172223172224172225172226172227172228172229172230172231172232172233172234172235172236172237172238172239172240172241172242172243172244172245172246172247172248172249172250172251172252172253172254172255172256172257172258172259172260172261172262172263172264172265172266172267172268172269172270172271172272172273172274172275172276172277172278172279172280172281172282172283172284172285172286172287172288172289172290172291172292172293172294172295172296172297172298172299172300172301172302172303172304172305172306172307172308172309172310172311172312172313172314172315172316172317172318172319172320172321172322172323172324172325172326172327172328172329172330172331172332172333172334172335172336172337172338172339172340172341172342172343172344172345172346172347172348172349172350172351172352172353172354172355172356172357172358172359172360172361172362172363172364172365172366172367172368172369172370172371172372172373172374172375172376172377172378172379172380172381172382172383172384172385172386172387172388172389172390172391172392172393172394172395172396172397172398172399172400172401172402172403172404172405172406172407172408172409172410172411172412172413172414172415172416172417172418172419172420172421172422172423172424172425172426172427172428172429172430172431172432172433172434172435172436172437172438172439172440172441172442172443172444172445172446172447172448172449172450172451172452172453172454172455172456172457172458172459172460172461172462172463172464172465172466172467172468172469172470172471172472172473172474172475172476172477172478172479172480172481172482172483172484172485172486172487172488172489172490172491172492172493172494172495172496172497172498172499172500172501172502172503172504172505172506172507172508172509172510172511172512172513172514172515172516172517172518172519172520172521172522172523172524172525172526172527172528172529172530172531172532172533172534172535172536172537172538172539172540172541172542172543172544172545172546172547172548172549172550172551172552172553172554172555172556172557172558172559172560172561172562172563172564172565172566172567172568172569172570172571172572172573172574172575172576172577172578172579172580172581172582172583172584172585172586172587172588172589172590172591172592172593172594172595172596172597172598172599172600172601172602172603172604172605172606172607172608172609172610172611172612172613172614172615172616172617172618172619172620172621172622172623172624172625172626172627172628172629172630172631172632172633172634172635172636172637172638172639172640172641172642172643172644172645172646172647172648172649172650172651172652172653172654172655172656172657172658172659172660172661172662172663172664172665172666172667172668172669172670172671172672172673172674172675172676172677172678172679172680172681172682172683172684172685172686172687172688172689172690172691172692172693172694172695172696172697172698172699172700172701172702172703172704172705172706172707172708172709172710172711172712172713172714172715172716172717172718172719172720172721172722172723172724172725172726172727172728172729172730172731172732172733172734172735172736172737172738172739172740172741172742172743172744172745172746172747172748172749172750172751172752172753172754172755172756172757172758172759172760172761172762172763172764172765172766172767172768172769172770172771172772172773172774172775172776172777172778172779172780172781172782172783172784172785172786172787172788172789172790172791172792172793172794172795172796172797172798172799172800172801172802172803172804172805172806172807172808172809172810172811172812172813172814172815172816172817172818172819172820172821172822172823172824172825172826172827172828172829172830172831172832172833172834172835172836172837172838172839172840172841172842172843172844172845172846172847172848172849172850172851172852172853172854172855172856172857172858172859172860172861172862172863172864172865172866172867172868172869172870172871172872172873172874172875172876172877172878172879172880172881172882172883172884172885172886172887172888172889172890172891172892172893172894172895172896172897172898172899172900172901172902172903172904172905172906172907172908172909172910172911172912172913172914172915172916172917172918172919172920172921172922172923172924172925172926172927172928172929172930172931172932172933172934172935172936172937172938172939172940172941172942172943172944172945172946172947172948172949172950172951172952172953172954172955172956172957172958172959172960172961172962172963172964172965172966172967172968172969172970172971172972172973172974172975172976172977172978172979172980172981172982172983172984172985172986172987172988172989172990172991172992172993172994172995172996172997172998172999173000173001173002173003173004173005173006173007173008173009173010173011173012173013173014173015173016173017173018173019173020173021173022173023173024173025173026173027173028173029173030173031173032173033173034173035173036173037173038173039173040173041173042173043173044173045173046173047173048173049173050173051173052173053173054173055173056173057173058173059173060173061173062173063173064173065173066173067173068173069173070173071173072173073173074173075173076173077173078173079173080173081173082173083173084173085173086173087173088173089173090173091173092173093173094173095173096173097173098173099173100173101173102173103173104173105173106173107173108173109173110173111173112173113173114173115173116173117173118173119173120173121173122173123173124173125173126173127173128173129173130173131173132173133173134173135173136173137173138173139173140173141173142173143173144173145173146173147173148173149173150173151173152173153173154173155173156173157173158173159173160173161173162173163173164173165173166173167173168173169173170173171173172173173173174173175173176173177173178173179173180173181173182173183173184173185173186173187173188173189173190173191173192173193173194173195173196173197173198173199173200173201173202173203173204173205173206173207173208173209173210173211173212173213173214173215173216173217173218173219173220173221173222173223173224173225173226173227173228173229173230173231173232173233173234173235173236173237173238173239173240173241173242173243173244173245173246173247173248173249173250173251173252173253173254173255173256173257173258173259173260173261173262173263173264173265173266173267173268173269173270173271173272173273173274173275173276173277173278173279173280173281173282173283173284173285173286173287173288173289173290173291173292173293173294173295173296173297173298173299173300173301173302173303173304173305173306173307173308173309173310173311173312173313173314173315173316173317173318173319173320173321173322173323173324173325173326173327173328173329173330173331173332173333173334173335173336173337173338173339173340173341173342173343173344173345173346173347173348173349173350173351173352173353173354173355173356173357173358173359173360173361173362173363173364173365173366173367173368173369173370173371173372173373173374173375173376173377173378173379173380173381173382173383173384173385173386173387173388173389173390173391173392173393173394173395173396173397173398173399173400173401173402173403173404173405173406173407173408173409173410173411173412173413173414173415173416173417173418173419173420173421173422173423173424173425173426173427173428173429173430173431173432173433173434173435173436173437173438173439173440173441173442173443173444173445173446173447173448173449173450173451173452173453173454173455173456173457173458173459173460173461173462173463173464173465173466173467173468173469173470173471173472173473173474173475173476173477173478173479173480173481173482173483173484173485173486173487173488173489173490173491173492173493173494173495173496173497173498173499173500173501173502173503173504173505173506173507173508173509173510173511173512173513173514173515173516173517173518173519173520173521173522173523173524173525173526173527173528173529173530173531173532173533173534173535173536173537173538173539173540173541173542173543173544173545173546173547173548173549173550173551173552173553173554173555173556173557173558173559173560173561173562173563173564173565173566173567173568173569173570173571173572173573173574173575173576173577173578173579173580173581173582173583173584173585173586173587173588173589173590173591173592173593173594173595173596173597173598173599173600173601173602173603173604173605173606173607173608173609173610173611173612173613173614173615173616173617173618173619173620173621173622173623173624173625173626173627173628173629173630173631173632173633173634173635173636173637173638173639173640173641173642173643173644173645173646173647173648173649173650173651173652173653173654173655173656173657173658173659173660173661173662173663173664173665173666173667173668173669173670173671173672173673173674173675173676173677173678173679173680173681173682173683173684173685173686173687173688173689173690173691173692173693173694173695173696173697173698173699173700173701173702173703173704173705173706173707173708173709173710173711173712173713173714173715173716173717173718173719173720173721173722173723173724173725173726173727173728173729173730173731173732173733173734173735173736173737173738173739173740173741173742173743173744173745173746173747173748173749173750173751173752173753173754173755173756173757173758173759173760173761173762173763173764173765173766173767173768173769173770173771173772173773173774173775173776173777173778173779173780173781173782173783173784173785173786173787173788173789173790173791173792173793173794173795173796173797173798173799173800173801173802173803173804173805173806173807173808173809173810173811173812173813173814173815173816173817173818173819173820173821173822173823173824173825173826173827173828173829173830173831173832173833173834173835173836173837173838173839173840173841173842173843173844173845173846173847173848173849173850173851173852173853173854173855173856173857173858173859173860173861173862173863173864173865173866173867173868173869173870173871173872173873173874173875173876173877173878173879173880173881173882173883173884173885173886173887173888173889173890173891173892173893173894173895173896173897173898173899173900173901173902173903173904173905173906173907173908173909173910173911173912173913173914173915173916173917173918173919173920173921173922173923173924173925173926173927173928173929173930173931173932173933173934173935173936173937173938173939173940173941173942173943173944173945173946173947173948173949173950173951173952173953173954173955173956173957173958173959173960173961173962173963173964173965173966173967173968173969173970173971173972173973173974173975173976173977173978173979173980173981173982173983173984173985173986173987173988173989173990173991173992173993173994173995173996173997173998173999174000174001174002174003174004174005174006174007174008174009174010174011174012174013174014174015174016174017174018174019174020174021174022174023174024174025174026174027174028174029174030174031174032174033174034174035174036174037174038174039174040174041174042174043174044174045174046174047174048174049174050174051174052174053174054174055174056174057174058174059174060174061174062174063174064174065174066174067174068174069174070174071174072174073174074174075174076174077174078174079174080174081174082174083174084174085174086174087174088174089174090174091174092174093174094174095174096174097174098174099174100174101174102174103174104174105174106174107174108174109174110174111174112174113174114174115174116174117174118174119174120174121174122174123174124174125174126174127174128174129174130174131174132174133174134174135174136174137174138174139174140174141174142174143174144174145174146174147174148174149174150174151174152174153174154174155174156174157174158174159174160174161174162174163174164174165174166174167174168174169174170174171174172174173174174174175174176174177174178174179174180174181174182174183174184174185174186174187174188174189174190174191174192174193174194174195174196174197174198174199174200174201174202174203174204174205174206174207174208174209174210174211174212174213174214174215174216174217174218174219174220174221174222174223174224174225174226174227174228174229174230174231174232174233174234174235174236174237174238174239174240174241174242174243174244174245174246174247174248174249174250174251174252174253174254174255174256174257174258174259174260174261174262174263174264174265174266174267174268174269174270174271174272174273174274174275174276174277174278174279174280174281174282174283174284174285174286174287174288174289174290174291174292174293174294174295174296174297174298174299174300174301174302174303174304174305174306174307174308174309174310174311174312174313174314174315174316174317174318174319174320174321174322174323174324174325174326174327174328174329174330174331174332174333174334174335174336174337174338174339174340174341174342174343174344174345174346174347174348174349174350174351174352174353174354174355174356174357174358174359174360174361174362174363174364174365174366174367174368174369174370174371174372174373174374174375174376174377174378174379174380174381174382174383174384174385174386174387174388174389174390174391174392174393174394174395174396174397174398174399174400174401174402174403174404174405174406174407174408174409174410174411174412174413174414174415174416174417174418174419174420174421174422174423174424174425174426174427174428174429174430174431174432174433174434174435174436174437174438174439174440174441174442174443174444174445174446174447174448174449174450174451174452174453174454174455174456174457174458174459174460174461174462174463174464174465174466174467174468174469174470174471174472174473174474174475174476174477174478174479174480174481174482174483174484174485174486174487174488174489174490174491174492174493174494174495174496174497174498174499174500174501174502174503174504174505174506174507174508174509174510174511174512174513174514174515174516174517174518174519174520174521174522174523174524174525174526174527174528174529174530174531174532174533174534174535174536174537174538174539174540174541174542174543174544174545174546174547174548174549174550174551174552174553174554174555174556174557174558174559174560174561174562174563174564174565174566174567174568174569174570174571174572174573174574174575174576174577174578174579174580174581174582174583174584174585174586174587174588174589174590174591174592174593174594174595174596174597174598174599174600174601174602174603174604174605174606174607174608174609174610174611174612174613174614174615174616174617174618174619174620174621174622174623174624174625174626174627174628174629174630174631174632174633174634174635174636174637174638174639174640174641174642174643174644174645174646174647174648174649174650174651174652174653174654174655174656174657174658174659174660174661174662174663174664174665174666174667174668174669174670174671174672174673174674174675174676174677174678174679174680174681174682174683174684174685174686174687174688174689174690174691174692174693174694174695174696174697174698174699174700174701174702174703174704174705174706174707174708174709174710174711174712174713174714174715174716174717174718174719174720174721174722174723174724174725174726174727174728174729174730174731174732174733174734174735174736174737174738174739174740174741174742174743174744174745174746174747174748174749174750174751174752174753174754174755174756174757174758174759174760174761174762174763174764174765174766174767174768174769174770174771174772174773174774174775174776174777174778174779174780174781174782174783174784174785174786174787174788174789174790174791174792174793174794174795174796174797174798174799174800174801174802174803174804174805174806174807174808174809174810174811174812174813174814174815174816174817174818174819174820174821174822174823174824174825174826174827174828174829174830174831174832174833174834174835174836174837174838174839174840174841174842174843174844174845174846174847174848174849174850174851174852174853174854174855174856174857174858174859174860174861174862174863174864174865174866174867174868174869174870174871174872174873174874174875174876174877174878174879174880174881174882174883174884174885174886174887174888174889174890174891174892174893174894174895174896174897174898174899174900174901174902174903174904174905174906174907174908174909174910174911174912174913174914174915174916174917174918174919174920174921174922174923174924174925174926174927174928174929174930174931174932174933174934174935174936174937174938174939174940174941174942174943174944174945174946174947174948174949174950174951174952174953174954174955174956174957174958174959174960174961174962174963174964174965174966174967174968174969174970174971174972174973174974174975174976174977174978174979174980174981174982174983174984174985174986174987174988174989174990174991174992174993174994174995174996174997174998174999175000175001175002175003175004175005175006175007175008175009175010175011175012175013175014175015175016175017175018175019175020175021175022175023175024175025175026175027175028175029175030175031175032175033175034175035175036175037175038175039175040175041175042175043175044175045175046175047175048175049175050175051175052175053175054175055175056175057175058175059175060175061175062175063175064175065175066175067175068175069175070175071175072175073175074175075175076175077175078175079175080175081175082175083175084175085175086175087175088175089175090175091175092175093175094175095175096175097175098175099175100175101175102175103175104175105175106175107175108175109175110175111175112175113175114175115175116175117175118175119175120175121175122175123175124175125175126175127175128175129175130175131175132175133175134175135175136175137175138175139175140175141175142175143175144175145175146175147175148175149175150175151175152175153175154175155175156175157175158175159175160175161175162175163175164175165175166175167175168175169175170175171175172175173175174175175175176175177175178175179175180175181175182175183175184175185175186175187175188175189175190175191175192175193175194175195175196175197175198175199175200175201175202175203175204175205175206175207175208175209175210175211175212175213175214175215175216175217175218175219175220175221175222175223175224175225175226175227175228175229175230175231175232175233175234175235175236175237175238175239175240175241175242175243175244175245175246175247175248175249175250175251175252175253175254175255175256175257175258175259175260175261175262175263175264175265175266175267175268175269175270175271175272175273175274175275175276175277175278175279175280175281175282175283175284175285175286175287175288175289175290175291175292175293175294175295175296175297175298175299175300175301175302175303175304175305175306175307175308175309175310175311175312175313175314175315175316175317175318175319175320175321175322175323175324175325175326175327175328175329175330175331175332175333175334175335175336175337175338175339175340175341175342175343175344175345175346175347175348175349175350175351175352175353175354175355175356175357175358175359175360175361175362175363175364175365175366175367175368175369175370175371175372175373175374175375175376175377175378175379175380175381175382175383175384175385175386175387175388175389175390175391175392175393175394175395175396175397175398175399175400175401175402175403175404175405175406175407175408175409175410175411175412175413175414175415175416175417175418175419175420175421175422175423175424175425175426175427175428175429175430175431175432175433175434175435175436175437175438175439175440175441175442175443175444175445175446175447175448175449175450175451175452175453175454175455175456175457175458175459175460175461175462175463175464175465175466175467175468175469175470175471175472175473175474175475175476175477175478175479175480175481175482175483175484175485175486175487175488175489175490175491175492175493175494175495175496175497175498175499175500175501175502175503175504175505175506175507175508175509175510175511175512175513175514175515175516175517175518175519175520175521175522175523175524175525175526175527175528175529175530175531175532175533175534175535175536175537175538175539175540175541175542175543175544175545175546175547175548175549175550175551175552175553175554175555175556175557175558175559175560175561175562175563175564175565175566175567175568175569175570175571175572175573175574175575175576175577175578175579175580175581175582175583175584175585175586175587175588175589175590175591175592175593175594175595175596175597175598175599175600175601175602175603175604175605175606175607175608175609175610175611175612175613175614175615175616175617175618175619175620175621175622175623175624175625175626175627175628175629175630175631175632175633175634175635175636175637175638175639175640175641175642175643175644175645175646175647175648175649175650175651175652175653175654175655175656175657175658175659175660175661175662175663175664175665175666175667175668175669175670175671175672175673175674175675175676175677175678175679175680175681175682175683175684175685175686175687175688175689175690175691175692175693175694175695175696175697175698175699175700175701175702175703175704175705175706175707175708175709175710175711175712175713175714175715175716175717175718175719175720175721175722175723175724175725175726175727175728175729175730175731175732175733175734175735175736175737175738175739175740175741175742175743175744175745175746175747175748175749175750175751175752175753175754175755175756175757175758175759175760175761175762175763175764175765175766175767175768175769175770175771175772175773175774175775175776175777175778175779175780175781175782175783175784175785175786175787175788175789175790175791175792175793175794175795175796175797175798175799175800175801175802175803175804175805175806175807175808175809175810175811175812175813175814175815175816175817175818175819175820175821175822175823175824175825175826175827175828175829175830175831175832175833175834175835175836175837175838175839175840175841175842175843175844175845175846175847175848175849175850175851175852175853175854175855175856175857175858175859175860175861175862175863175864175865175866175867175868175869175870175871175872175873175874175875175876175877175878175879175880175881175882175883175884175885175886175887175888175889175890175891175892175893175894175895175896175897175898175899175900175901175902175903175904175905175906175907175908175909175910175911175912175913175914175915175916175917175918175919175920175921175922175923175924175925175926175927175928175929175930175931175932175933175934175935175936175937175938175939175940175941175942175943175944175945175946175947175948175949175950175951175952175953175954175955175956175957175958175959175960175961175962175963175964175965175966175967175968175969175970175971175972175973175974175975175976175977175978175979175980175981175982175983175984175985175986175987175988175989175990175991175992175993175994175995175996175997175998175999176000176001176002176003176004176005176006176007176008176009176010176011176012176013176014176015176016176017176018176019176020176021176022176023176024176025176026176027176028176029176030176031176032176033176034176035176036176037176038176039176040176041176042176043176044176045176046176047176048176049176050176051176052176053176054176055176056176057176058176059176060176061176062176063176064176065176066176067176068176069176070176071176072176073176074176075176076176077176078176079176080176081176082176083176084176085176086176087176088176089176090176091176092176093176094176095176096176097176098176099176100176101176102176103176104176105176106176107176108176109176110176111176112176113176114176115176116176117176118176119176120176121176122176123176124176125176126176127176128176129176130176131176132176133176134176135176136176137176138176139176140176141176142176143176144176145176146176147176148176149176150176151176152176153176154176155176156176157176158176159176160176161176162176163176164176165176166176167176168176169176170176171176172176173176174176175176176176177176178176179176180176181176182176183176184176185176186176187176188176189176190176191176192176193176194176195176196176197176198176199176200176201176202176203176204176205176206176207176208176209176210176211176212176213176214176215176216176217176218176219176220176221176222176223176224176225176226176227176228176229176230176231176232176233176234176235176236176237176238176239176240176241176242176243176244176245176246176247176248176249176250176251176252176253176254176255176256176257176258176259176260176261176262176263176264176265176266176267176268176269176270176271176272176273176274176275176276176277176278176279176280176281176282176283176284176285176286176287176288176289176290176291176292176293176294176295176296176297176298176299176300176301176302176303176304176305176306176307176308176309176310176311176312176313176314176315176316176317176318176319176320176321176322176323176324176325176326176327176328176329176330176331176332176333176334176335176336176337176338176339176340176341176342176343176344176345176346176347176348176349176350176351176352176353176354176355176356176357176358176359176360176361176362176363176364176365176366176367176368176369176370176371176372176373176374176375176376176377176378176379176380176381176382176383176384176385176386176387176388176389176390176391176392176393176394176395176396176397176398176399176400176401176402176403176404176405176406176407176408176409176410176411176412176413176414176415176416176417176418176419176420176421176422176423176424176425176426176427176428176429176430176431176432176433176434176435176436176437176438176439176440176441176442176443176444176445176446176447176448176449176450176451176452176453176454176455176456176457176458176459176460176461176462176463176464176465176466176467176468176469176470176471176472176473176474176475176476176477176478176479176480176481176482176483176484176485176486176487176488176489176490176491176492176493176494176495176496176497176498176499176500176501176502176503176504176505176506176507176508176509176510176511176512176513176514176515176516176517176518176519176520176521176522176523176524176525176526176527176528176529176530176531176532176533176534176535176536176537176538176539176540176541176542176543176544176545176546176547176548176549176550176551176552176553176554176555176556176557176558176559176560176561176562176563176564176565176566176567176568176569176570176571176572176573176574176575176576176577176578176579176580176581176582176583176584176585176586176587176588176589176590176591176592176593176594176595176596176597176598176599176600176601176602176603176604176605176606176607176608176609176610176611176612176613176614176615176616176617176618176619176620176621176622176623176624176625176626176627176628176629176630176631176632176633176634176635176636176637176638176639176640176641176642176643176644176645176646176647176648176649176650176651176652176653176654176655176656176657176658176659176660176661176662176663176664176665176666176667176668176669176670176671176672176673176674176675176676176677176678176679176680176681176682176683176684176685176686176687176688176689176690176691176692176693176694176695176696176697176698176699176700176701176702176703176704176705176706176707176708176709176710176711176712176713176714176715176716176717176718176719176720176721176722176723176724176725176726176727176728176729176730176731176732176733176734176735176736176737176738176739176740176741176742176743176744176745176746176747176748176749176750176751176752176753176754176755176756176757176758176759176760176761176762176763176764176765176766176767176768176769176770176771176772176773176774176775176776176777176778176779176780176781176782176783176784176785176786176787176788176789176790176791176792176793176794176795176796176797176798176799176800176801176802176803176804176805176806176807176808176809176810176811176812176813176814176815176816176817176818176819176820176821176822176823176824176825176826176827176828176829176830176831176832176833176834176835176836176837176838176839176840176841176842176843176844176845176846176847176848176849176850176851176852176853176854176855176856176857176858176859176860176861176862176863176864176865176866176867176868176869176870176871176872176873176874176875176876176877176878176879176880176881176882176883176884176885176886176887176888176889176890176891176892176893176894176895176896176897176898176899176900176901176902176903176904176905176906176907176908176909176910176911176912176913176914176915176916176917176918176919176920176921176922176923176924176925176926176927176928176929176930176931176932176933176934176935176936176937176938176939176940176941176942176943176944176945176946176947176948176949176950176951176952176953176954176955176956176957176958176959176960176961176962176963176964176965176966176967176968176969176970176971176972176973176974176975176976176977176978176979176980176981176982176983176984176985176986176987176988176989176990176991176992176993176994176995176996176997176998176999177000177001177002177003177004177005177006177007177008177009177010177011177012177013177014177015177016177017177018177019177020177021177022177023177024177025177026177027177028177029177030177031177032177033177034177035177036177037177038177039177040177041177042177043177044177045177046177047177048177049177050177051177052177053177054177055177056177057177058177059177060177061177062177063177064177065177066177067177068177069177070177071177072177073177074177075177076177077177078177079177080177081177082177083177084177085177086177087177088177089177090177091177092177093177094177095177096177097177098177099177100177101177102177103177104177105177106177107177108177109177110177111177112177113177114177115177116177117177118177119177120177121177122177123177124177125177126177127177128177129177130177131177132177133177134177135177136177137177138177139177140177141177142177143177144177145177146177147177148177149177150177151177152177153177154177155177156177157177158177159177160177161177162177163177164177165177166177167177168177169177170177171177172177173177174177175177176177177177178177179177180177181177182177183177184177185177186177187177188177189177190177191177192177193177194177195177196177197177198177199177200177201177202177203177204177205177206177207177208177209177210177211177212177213177214177215177216177217177218177219177220177221177222177223177224177225177226177227177228177229177230177231177232177233177234177235177236177237177238177239177240177241177242177243177244177245177246177247177248177249177250177251177252177253177254177255177256177257177258177259177260177261177262177263177264177265177266177267177268177269177270177271177272177273177274177275177276177277177278177279177280177281177282177283177284177285177286177287177288177289177290177291177292177293177294177295177296177297177298177299177300177301177302177303177304177305177306177307177308177309177310177311177312177313177314177315177316177317177318177319177320177321177322177323177324177325177326177327177328177329177330177331177332177333177334177335177336177337177338177339177340177341177342177343177344177345177346177347177348177349177350177351177352177353177354177355177356177357177358177359177360177361177362177363177364177365177366177367177368177369177370177371177372177373177374177375177376177377177378177379177380177381177382177383177384177385177386177387177388177389177390177391177392177393177394177395177396177397177398177399177400177401177402177403177404177405177406177407177408177409177410177411177412177413177414177415177416177417177418177419177420177421177422177423177424177425177426177427177428177429177430177431177432177433177434177435177436177437177438177439177440177441177442177443177444177445177446177447177448177449177450177451177452177453177454177455177456177457177458177459177460177461177462177463177464177465177466177467177468177469177470177471177472177473177474177475177476177477177478177479177480177481177482177483177484177485177486177487177488177489177490177491177492177493177494177495177496177497177498177499177500177501177502177503177504177505177506177507177508177509177510177511177512177513177514177515177516177517177518177519177520177521177522177523177524177525177526177527177528177529177530177531177532177533177534177535177536177537177538177539177540177541177542177543177544177545177546177547177548177549177550177551177552177553177554177555177556177557177558177559177560177561177562177563177564177565177566177567177568177569177570177571177572177573177574177575177576177577177578177579177580177581177582177583177584177585177586177587177588177589177590177591177592177593177594177595177596177597177598177599177600177601177602177603177604177605177606177607177608177609177610177611177612177613177614177615177616177617177618177619177620177621177622177623177624177625177626177627177628177629177630177631177632177633177634177635177636177637177638177639177640177641177642177643177644177645177646177647177648177649177650177651177652177653177654177655177656177657177658177659177660177661177662177663177664177665177666177667177668177669177670177671177672177673177674177675177676177677177678177679177680177681177682177683177684177685177686177687177688177689177690177691177692177693177694177695177696177697177698177699177700177701177702177703177704177705177706177707177708177709177710177711177712177713177714177715177716177717177718177719177720177721177722177723177724177725177726177727177728177729177730177731177732177733177734177735177736177737177738177739177740177741177742177743177744177745177746177747177748177749177750177751177752177753177754177755177756177757177758177759177760177761177762177763177764177765177766177767177768177769177770177771177772177773177774177775177776177777177778177779177780177781177782177783177784177785177786177787177788177789177790177791177792177793177794177795177796177797177798177799177800177801177802177803177804177805177806177807177808177809177810177811177812177813177814177815177816177817177818177819177820177821177822177823177824177825177826177827177828177829177830177831177832177833177834177835177836177837177838177839177840177841177842177843177844177845177846177847177848177849177850177851177852177853177854177855177856177857177858177859177860177861177862177863177864177865177866177867177868177869177870177871177872177873177874177875177876177877177878177879177880177881177882177883177884177885177886177887177888177889177890177891177892177893177894177895177896177897177898177899177900177901177902177903177904177905177906177907177908177909177910177911177912177913177914177915177916177917177918177919177920177921177922177923177924177925177926177927177928177929177930177931177932177933177934177935177936177937177938177939177940177941177942177943177944177945177946177947177948177949177950177951177952177953177954177955177956177957177958177959177960177961177962177963177964177965177966177967177968177969177970177971177972177973177974177975177976177977177978177979177980177981177982177983177984177985177986177987177988177989177990177991177992177993177994177995177996177997177998177999178000178001178002178003178004178005178006178007178008178009178010178011178012178013178014178015178016178017178018178019178020178021178022178023178024178025178026178027178028178029178030178031178032178033178034178035178036178037178038178039178040178041178042178043178044178045178046178047178048178049178050178051178052178053178054178055178056178057178058178059178060178061178062178063178064178065178066178067178068178069178070178071178072178073178074178075178076178077178078178079178080178081178082178083178084178085178086178087178088178089178090178091178092178093178094178095178096178097178098178099178100178101178102178103178104178105178106178107178108178109178110178111178112178113178114178115178116178117178118178119178120178121178122178123178124178125178126178127178128178129178130178131178132178133178134178135178136178137178138178139178140178141178142178143178144178145178146178147178148178149178150178151178152178153178154178155178156178157178158178159178160178161178162178163178164178165178166178167178168178169178170178171178172178173178174178175178176178177178178178179178180178181178182178183178184178185178186178187178188178189178190178191178192178193178194178195178196178197178198178199178200178201178202178203178204178205178206178207178208178209178210178211178212178213178214178215178216178217178218178219178220178221178222178223178224178225178226178227178228178229178230178231178232178233178234178235178236178237178238178239178240178241178242178243178244178245178246178247178248178249178250178251178252178253178254178255178256178257178258178259178260178261178262178263178264178265178266178267178268178269178270178271178272178273178274178275178276178277178278178279178280178281178282178283178284178285178286178287178288178289178290178291178292178293178294178295178296178297178298178299178300178301178302178303178304178305178306178307178308178309178310178311178312178313178314178315178316178317178318178319178320178321178322178323178324178325178326178327178328178329178330178331178332178333178334178335178336178337178338178339178340178341178342178343178344178345178346178347178348178349178350178351178352178353178354178355178356178357178358178359178360178361178362178363178364178365178366178367178368178369178370178371178372178373178374178375178376178377178378178379178380178381178382178383178384178385178386178387178388178389178390178391178392178393178394178395178396178397178398178399178400178401178402178403178404178405178406178407178408178409178410178411178412178413178414178415178416178417178418178419178420178421178422178423178424178425178426178427178428178429178430178431178432178433178434178435178436178437178438178439178440178441178442178443178444178445178446178447178448178449178450178451178452178453178454178455178456178457178458178459178460178461178462178463178464178465178466178467178468178469178470178471178472178473178474178475178476178477178478178479178480178481178482178483178484178485178486178487178488178489178490178491178492178493178494178495178496178497178498178499178500178501178502178503178504178505178506178507178508178509178510178511178512178513178514178515178516178517178518178519178520178521178522178523178524178525178526178527178528178529178530178531178532178533178534178535178536178537178538178539178540178541178542178543178544178545178546178547178548178549178550178551178552178553178554178555178556178557178558178559178560178561178562178563178564178565178566178567178568178569178570178571178572178573178574178575178576178577178578178579178580178581178582178583178584178585178586178587178588178589178590178591178592178593178594178595178596178597178598178599178600178601178602178603178604178605178606178607178608178609178610178611178612178613178614178615178616178617178618178619178620178621178622178623178624178625178626178627178628178629178630178631178632178633178634178635178636178637178638178639178640178641178642178643178644178645178646178647178648178649178650178651178652178653178654178655178656178657178658178659178660178661178662178663178664178665178666178667178668178669178670178671178672178673178674178675178676178677178678178679178680178681178682178683178684178685178686178687178688178689178690178691178692178693178694178695178696178697178698178699178700178701178702178703178704178705178706178707178708178709178710178711178712178713178714178715178716178717178718178719178720178721178722178723178724178725178726178727178728178729178730178731178732178733178734178735178736178737178738178739178740178741178742178743178744178745178746178747178748178749178750178751178752178753178754178755178756178757178758178759178760178761178762178763178764178765178766178767178768178769178770178771178772178773178774178775178776178777178778178779178780178781178782178783178784178785178786178787178788178789178790178791178792178793178794178795178796178797178798178799178800178801178802178803178804178805178806178807178808178809178810178811178812178813178814178815178816178817178818178819178820178821178822178823178824178825178826178827178828178829178830178831178832178833178834178835178836178837178838178839178840178841178842178843178844178845178846178847178848178849178850178851178852178853178854178855178856178857178858178859178860178861178862178863178864178865178866178867178868178869178870178871178872178873178874178875178876178877178878178879178880178881178882178883178884178885178886178887178888178889178890178891178892178893178894178895178896178897178898178899178900178901178902178903178904178905178906178907178908178909178910178911178912178913178914178915178916178917178918178919178920178921178922178923178924178925178926178927178928178929178930178931178932178933178934178935178936178937178938178939178940178941178942178943178944178945178946178947178948178949178950178951178952178953178954178955178956178957178958178959178960178961178962178963178964178965178966178967178968178969178970178971178972178973178974178975178976178977178978178979178980178981178982178983178984178985178986178987178988178989178990178991178992178993178994178995178996178997178998178999179000179001179002179003179004179005179006179007179008179009179010179011179012179013179014179015179016179017179018179019179020179021179022179023179024179025179026179027179028179029179030179031179032179033179034179035179036179037179038179039179040179041179042179043179044179045179046179047179048179049179050179051179052179053179054179055179056179057179058179059179060179061179062179063179064179065179066179067179068179069179070179071179072179073179074179075179076179077179078179079179080179081179082179083179084179085179086179087179088179089179090179091179092179093179094179095179096179097179098179099179100179101179102179103179104179105179106179107179108179109179110179111179112179113179114179115179116179117179118179119179120179121179122179123179124179125179126179127179128179129179130179131179132179133179134179135179136179137179138179139179140179141179142179143179144179145179146179147179148179149179150179151179152179153179154179155179156179157179158179159179160179161179162179163179164179165179166179167179168179169179170179171179172179173179174179175179176179177179178179179179180179181179182179183179184179185179186179187179188179189179190179191179192179193179194179195179196179197179198179199179200179201179202179203179204179205179206179207179208179209179210179211179212179213179214179215179216179217179218179219179220179221179222179223179224179225179226179227179228179229179230179231179232179233179234179235179236179237179238179239179240179241179242179243179244179245179246179247179248179249179250179251179252179253179254179255179256179257179258179259179260179261179262179263179264179265179266179267179268179269179270179271179272179273179274179275179276179277179278179279179280179281179282179283179284179285179286179287179288179289179290179291179292179293179294179295179296179297179298179299179300179301179302179303179304179305179306179307179308179309179310179311179312179313179314179315179316179317179318179319179320179321179322179323179324179325179326179327179328179329179330179331179332179333179334179335179336179337179338179339179340179341179342179343179344179345179346179347179348179349179350179351179352179353179354179355179356179357179358179359179360179361179362179363179364179365179366179367179368179369179370179371179372179373179374179375179376179377179378179379179380179381179382179383179384179385179386179387179388179389179390179391179392179393179394179395179396179397179398179399179400179401179402179403179404179405179406179407179408179409179410179411179412179413179414179415179416179417179418179419179420179421179422179423179424179425179426179427179428179429179430179431179432179433179434179435179436179437179438179439179440179441179442179443179444179445179446179447179448179449179450179451179452179453179454179455179456179457179458179459179460179461179462179463179464179465179466179467179468179469179470179471179472179473179474179475179476179477179478179479179480179481179482179483179484179485179486179487179488179489179490179491179492179493179494179495179496179497179498179499179500179501179502179503179504179505179506179507179508179509179510179511179512179513179514179515179516179517179518179519179520179521179522179523179524179525179526179527179528179529179530179531179532179533179534179535179536179537179538179539179540179541179542179543179544179545179546179547179548179549179550179551179552179553179554179555179556179557179558179559179560179561179562179563179564179565179566179567179568179569179570179571179572179573179574179575179576179577179578179579179580179581179582179583179584179585179586179587179588179589179590179591179592179593179594179595179596179597179598179599179600179601179602179603179604179605179606179607179608179609179610179611179612179613179614179615179616179617179618179619179620179621179622179623179624179625179626179627179628179629179630179631179632179633179634179635179636179637179638179639179640179641179642179643179644179645179646179647179648179649179650179651179652179653179654179655179656179657179658179659179660179661179662179663179664179665179666179667179668179669179670179671179672179673179674179675179676179677179678179679179680179681179682179683179684179685179686179687179688179689179690179691179692179693179694179695179696179697179698179699179700179701179702179703179704179705179706179707179708179709179710179711179712179713179714179715179716179717179718179719179720179721179722179723179724179725179726179727179728179729179730179731179732179733179734179735179736179737179738179739179740179741179742179743179744179745179746179747179748179749179750179751179752179753179754179755179756179757179758179759179760179761179762179763179764179765179766179767179768179769179770179771179772179773179774179775179776179777179778179779179780179781179782179783179784179785179786179787179788179789179790179791179792179793179794179795179796179797179798179799179800179801179802179803179804179805179806179807179808179809179810179811179812179813179814179815179816179817179818179819179820179821179822179823179824179825179826179827179828179829179830179831179832179833179834179835179836179837179838179839179840179841179842179843179844179845179846179847179848179849179850179851179852179853179854179855179856179857179858179859179860179861179862179863179864179865179866179867179868179869179870179871179872179873179874179875179876179877179878179879179880179881179882179883179884179885179886179887179888179889179890179891179892179893179894179895179896179897179898179899179900179901179902179903179904179905179906179907179908179909179910179911179912179913179914179915179916179917179918179919179920179921179922179923179924179925179926179927179928179929179930179931179932179933179934179935179936179937179938179939179940179941179942179943179944179945179946179947179948179949179950179951179952179953179954179955179956179957179958179959179960179961179962179963179964179965179966179967179968179969179970179971179972179973179974179975179976179977179978179979179980179981179982179983179984179985179986179987179988179989179990179991179992179993179994179995179996179997179998179999180000180001180002180003180004180005180006180007180008180009180010180011180012180013180014180015180016180017180018180019180020180021180022180023180024180025180026180027180028180029180030180031180032180033180034180035180036180037180038180039180040180041180042180043180044180045180046180047180048180049180050180051180052180053180054180055180056180057180058180059180060180061180062180063180064180065180066180067180068180069180070180071180072180073180074180075180076180077180078180079180080180081180082180083180084180085180086180087180088180089180090180091180092180093180094180095180096180097180098180099180100180101180102180103180104180105180106180107180108180109180110180111180112180113180114180115180116180117180118180119180120180121180122180123180124180125180126180127180128180129180130180131180132180133180134180135180136180137180138180139180140180141180142180143180144180145180146180147180148180149180150180151180152180153180154180155180156180157180158180159180160180161180162180163180164180165180166180167180168180169180170180171180172180173180174180175180176180177180178180179180180180181180182180183180184180185180186180187180188180189180190180191180192180193180194180195180196180197180198180199180200180201180202180203180204180205180206180207180208180209180210180211180212180213180214180215180216180217180218180219180220180221180222180223180224180225180226180227180228180229180230180231180232180233180234180235180236180237180238180239180240180241180242180243180244180245180246180247180248180249180250180251180252180253180254180255180256180257180258180259180260180261180262180263180264180265180266180267180268180269180270180271180272180273180274180275180276180277180278180279180280180281180282180283180284180285180286180287180288180289180290180291180292180293180294180295180296180297180298180299180300180301180302180303180304180305180306180307180308180309180310180311180312180313180314180315180316180317180318180319180320180321180322180323180324180325180326180327180328180329180330180331180332180333180334180335180336180337180338180339180340180341180342180343180344180345180346180347180348180349180350180351180352180353180354180355180356180357180358180359180360180361180362180363180364180365180366180367180368180369180370180371180372180373180374180375180376180377180378180379180380180381180382180383180384180385180386180387180388180389180390180391180392180393180394180395180396180397180398180399180400180401180402180403180404180405180406180407180408180409180410180411180412180413180414180415180416180417180418180419180420180421180422180423180424180425180426180427180428180429180430180431180432180433180434180435180436180437180438180439180440180441180442180443180444180445180446180447180448180449180450180451180452180453180454180455180456180457180458180459180460180461180462180463180464180465180466180467180468180469180470180471180472180473180474180475180476180477180478180479180480180481180482180483180484180485180486180487180488180489180490180491180492180493180494180495180496180497180498180499180500180501180502180503180504180505180506180507180508180509180510180511180512180513180514180515180516180517180518180519180520180521180522180523180524180525180526180527180528180529180530180531180532180533180534180535180536180537180538180539180540180541180542180543180544180545180546180547180548180549180550180551180552180553180554180555180556180557180558180559180560180561180562180563180564180565180566180567180568180569180570180571180572180573180574180575180576180577180578180579180580180581180582180583180584180585180586180587180588180589180590180591180592180593180594180595180596180597180598180599180600180601180602180603180604180605180606180607180608180609180610180611180612180613180614180615180616180617180618180619180620180621180622180623180624180625180626180627180628180629180630180631180632180633180634180635180636180637180638180639180640180641180642180643180644180645180646180647180648180649180650180651180652180653180654180655180656180657180658180659180660180661180662180663180664180665180666180667180668180669180670180671180672180673180674180675180676180677180678180679180680180681180682180683180684180685180686180687180688180689180690180691180692180693180694180695180696180697180698180699180700180701180702180703180704180705180706180707180708180709180710180711180712180713180714180715180716180717180718180719180720180721180722180723180724180725180726180727180728180729180730180731180732180733180734180735180736180737180738180739180740180741180742180743180744180745180746180747180748180749180750180751180752180753180754180755180756180757180758180759180760180761180762180763180764180765180766180767180768180769180770180771180772180773180774180775180776180777180778180779180780180781180782180783180784180785180786180787180788180789180790180791180792180793180794180795180796180797180798180799180800180801180802180803180804180805180806180807180808180809180810180811180812180813180814180815180816180817180818180819180820180821180822180823180824180825180826180827180828180829180830180831180832180833180834180835180836180837180838180839180840180841180842180843180844180845180846180847180848180849180850180851180852180853180854180855180856180857180858180859180860180861180862180863180864180865180866180867180868180869180870180871180872180873180874180875180876180877180878180879180880180881180882180883180884180885180886180887180888180889180890180891180892180893180894180895180896180897180898180899180900180901180902180903180904180905180906180907180908180909180910180911180912180913180914180915180916180917180918180919180920180921180922180923180924180925180926180927180928180929180930180931180932180933180934180935180936180937180938180939180940180941180942180943180944180945180946180947180948180949180950180951180952180953180954180955180956180957180958180959180960180961180962180963180964180965180966180967180968180969180970180971180972180973180974180975180976180977180978180979180980180981180982180983180984180985180986180987180988180989180990180991180992180993180994180995180996180997180998180999181000181001181002181003181004181005181006181007181008181009181010181011181012181013181014181015181016181017181018181019181020181021181022181023181024181025181026181027181028181029181030181031181032181033181034181035181036181037181038181039181040181041181042181043181044181045181046181047181048181049181050181051181052181053181054181055181056181057181058181059181060181061181062181063181064181065181066181067181068181069181070181071181072181073181074181075181076181077181078181079181080181081181082181083181084181085181086181087181088181089181090181091181092181093181094181095181096181097181098181099181100181101181102181103181104181105181106181107181108181109181110181111181112181113181114181115181116181117181118181119181120181121181122181123181124181125181126181127181128181129181130181131181132181133181134181135181136181137181138181139181140181141181142181143181144181145181146181147181148181149181150181151181152181153181154181155181156181157181158181159181160181161181162181163181164181165181166181167181168181169181170181171181172181173181174181175181176181177181178181179181180181181181182181183181184181185181186181187181188181189181190181191181192181193181194181195181196181197181198181199181200181201181202181203181204181205181206181207181208181209181210181211181212181213181214181215181216181217181218181219181220181221181222181223181224181225181226181227181228181229181230181231181232181233181234181235181236181237181238181239181240181241181242181243181244181245181246181247181248181249181250181251181252181253181254181255181256181257181258181259181260181261181262181263181264181265181266181267181268181269181270181271181272181273181274181275181276181277181278181279181280181281181282181283181284181285181286181287181288181289181290181291181292181293181294181295181296181297181298181299181300181301181302181303181304181305181306181307181308181309181310181311181312181313181314181315181316181317181318181319181320181321181322181323181324181325181326181327181328181329181330181331181332181333181334181335181336181337181338181339181340181341181342181343181344181345181346181347181348181349181350181351181352181353181354181355181356181357181358181359181360181361181362181363181364181365181366181367181368181369181370181371181372181373181374181375181376181377181378181379181380181381181382181383181384181385181386181387181388181389181390181391181392181393181394181395181396181397181398181399181400181401181402181403181404181405181406181407181408181409181410181411181412181413181414181415181416181417181418181419181420181421181422181423181424181425181426181427181428181429181430181431181432181433181434181435181436181437181438181439181440181441181442181443181444181445181446181447181448181449181450181451181452181453181454181455181456181457181458181459181460181461181462181463181464181465181466181467181468181469181470181471181472181473181474181475181476181477181478181479181480181481181482181483181484181485181486181487181488181489181490181491181492181493181494181495181496181497181498181499181500181501181502181503181504181505181506181507181508181509181510181511181512181513181514181515181516181517181518181519181520181521181522181523181524181525181526181527181528181529181530181531181532181533181534181535181536181537181538181539181540181541181542181543181544181545181546181547181548181549181550181551181552181553181554181555181556181557181558181559181560181561181562181563181564181565181566181567181568181569181570181571181572181573181574181575181576181577181578181579181580181581181582181583181584181585181586181587181588181589181590181591181592181593181594181595181596181597181598181599181600181601181602181603181604181605181606181607181608181609181610181611181612181613181614181615181616181617181618181619181620181621181622181623181624181625181626181627181628181629181630181631181632181633181634181635181636181637181638181639181640181641181642181643181644181645181646181647181648181649181650181651181652181653181654181655181656181657181658181659181660181661181662181663181664181665181666181667181668181669181670181671181672181673181674181675181676181677181678181679181680181681181682181683181684181685181686181687181688181689181690181691181692181693181694181695181696181697181698181699181700181701181702181703181704181705181706181707181708181709181710181711181712181713181714181715181716181717181718181719181720181721181722181723181724181725181726181727181728181729181730181731181732181733181734181735181736181737181738181739181740181741181742181743181744181745181746181747181748181749181750181751181752181753181754181755181756181757181758181759181760181761181762181763181764181765181766181767181768181769181770181771181772181773181774181775181776181777181778181779181780181781181782181783181784181785181786181787181788181789181790181791181792181793181794181795181796181797181798181799181800181801181802181803181804181805181806181807181808181809181810181811181812181813181814181815181816181817181818181819181820181821181822181823181824181825181826181827181828181829181830181831181832181833181834181835181836181837181838181839181840181841181842181843181844181845181846181847181848181849181850181851181852181853181854181855181856181857181858181859181860181861181862181863181864181865181866181867181868181869181870181871181872181873181874181875181876181877181878181879181880181881181882181883181884181885181886181887181888181889181890181891181892181893181894181895181896181897181898181899181900181901181902181903181904181905181906181907181908181909181910181911181912181913181914181915181916181917181918181919181920181921181922181923181924181925181926181927181928181929181930181931181932181933181934181935181936181937181938181939181940181941181942181943181944181945181946181947181948181949181950181951181952181953181954181955181956181957181958181959181960181961181962181963181964181965181966181967181968181969181970181971181972181973181974181975181976181977181978181979181980181981181982181983181984181985181986181987181988181989181990181991181992181993181994181995181996181997181998181999182000182001182002182003182004182005182006182007182008182009182010182011182012182013182014182015182016182017182018182019182020182021182022182023182024182025182026182027182028182029182030182031182032182033182034182035182036182037182038182039182040182041182042182043182044182045182046182047182048182049182050182051182052182053182054182055182056182057182058182059182060182061182062182063182064182065182066182067182068182069182070182071182072182073182074182075182076182077182078182079182080182081182082182083182084182085182086182087182088182089182090182091182092182093182094182095182096182097182098182099182100182101182102182103182104182105182106182107182108182109182110182111182112182113182114182115182116182117182118182119182120182121182122182123182124182125182126182127182128182129182130182131182132182133182134182135182136182137182138182139182140182141182142182143182144182145182146182147182148182149182150182151182152182153182154182155182156182157182158182159182160182161182162182163182164182165182166182167182168182169182170182171182172182173182174182175182176182177182178182179182180182181182182182183182184182185182186182187182188182189182190182191182192182193182194182195182196182197182198182199182200182201182202182203182204182205182206182207182208182209182210182211182212182213182214182215182216182217182218182219182220182221182222182223182224182225182226182227182228182229182230182231182232182233182234182235182236182237182238182239182240182241182242182243182244182245182246182247182248182249182250182251182252182253182254182255182256182257182258182259182260182261182262182263182264182265182266182267182268182269182270182271182272182273182274182275182276182277182278182279182280182281182282182283182284182285182286182287182288182289182290182291182292182293182294182295182296182297182298182299182300182301182302182303182304182305182306182307182308182309182310182311182312182313182314182315182316182317182318182319182320182321182322182323182324182325182326182327182328182329182330182331182332182333182334182335182336182337182338182339182340182341182342182343182344182345182346182347182348182349182350182351182352182353182354182355182356182357182358182359182360182361182362182363182364182365182366182367182368182369182370182371182372182373182374182375182376182377182378182379182380182381182382182383182384182385182386182387182388182389182390182391182392182393182394182395182396182397182398182399182400182401182402182403182404182405182406182407182408182409182410182411182412182413182414182415182416182417182418182419182420182421182422182423182424182425182426182427182428182429182430182431182432182433182434182435182436182437182438182439182440182441182442182443182444182445182446182447182448182449182450182451182452182453182454182455182456182457182458182459182460182461182462182463182464182465182466182467182468182469182470182471182472182473182474182475182476182477182478182479182480182481182482182483182484182485182486182487182488182489182490182491182492182493182494182495182496182497182498182499182500182501182502182503182504182505182506182507182508182509182510182511182512182513182514182515182516182517182518182519182520182521182522182523182524182525182526182527182528182529182530182531182532182533182534182535182536182537182538182539182540182541182542182543182544182545182546182547182548182549182550182551182552182553182554182555182556182557182558182559182560182561182562182563182564182565182566182567182568182569182570182571182572182573182574182575182576182577182578182579182580182581182582182583182584182585182586182587182588182589182590182591182592182593182594182595182596182597182598182599182600182601182602182603182604182605182606182607182608182609182610182611182612182613182614182615182616182617182618182619182620182621182622182623182624182625182626182627182628182629182630182631182632182633182634182635182636182637182638182639182640182641182642182643182644182645182646182647182648182649182650182651182652182653182654182655182656182657182658182659182660182661182662182663182664182665182666182667182668182669182670182671182672182673182674182675182676182677182678182679182680182681182682182683182684182685182686182687182688182689182690182691182692182693182694182695182696182697182698182699182700182701182702182703182704182705182706182707182708182709182710182711182712182713182714182715182716182717182718182719182720182721182722182723182724182725182726182727182728182729182730182731182732182733182734182735182736182737182738182739182740182741182742182743182744182745182746182747182748182749182750182751182752182753182754182755182756182757182758182759182760182761182762182763182764182765182766182767182768182769182770182771182772182773182774182775182776182777182778182779182780182781182782182783182784182785182786182787182788182789182790182791182792182793182794182795182796182797182798182799182800182801182802182803182804182805182806182807182808182809182810182811182812182813182814182815182816182817182818182819182820182821182822182823182824182825182826182827182828182829182830182831182832182833182834182835182836182837182838182839182840182841182842182843182844182845182846182847182848182849182850182851182852182853182854182855182856182857182858182859182860182861182862182863182864182865182866182867182868182869182870182871182872182873182874182875182876182877182878182879182880182881182882182883182884182885182886182887182888182889182890182891182892182893182894182895182896182897182898182899182900182901182902182903182904182905182906182907182908182909182910182911182912182913182914182915182916182917182918182919182920182921182922182923182924182925182926182927182928182929182930182931182932182933182934182935182936182937182938182939182940182941182942182943182944182945182946182947182948182949182950182951182952182953182954182955182956182957182958182959182960182961182962182963182964182965182966182967182968182969182970182971182972182973182974182975182976182977182978182979182980182981182982182983182984182985182986182987182988182989182990182991182992182993182994182995182996182997182998182999183000183001183002183003183004183005183006183007183008183009183010183011183012183013183014183015183016183017183018183019183020183021183022183023183024183025183026183027183028183029183030183031183032183033183034183035183036183037183038183039183040183041183042183043183044183045183046183047183048183049183050183051183052183053183054183055183056183057183058183059183060183061183062183063183064183065183066183067183068183069183070183071183072183073183074183075183076183077183078183079183080183081183082183083183084183085183086183087183088183089183090183091183092183093183094183095183096183097183098183099183100183101183102183103183104183105183106183107183108183109183110183111183112183113183114183115183116183117183118183119183120183121183122183123183124183125183126183127183128183129183130183131183132183133183134183135183136183137183138183139183140183141183142183143183144183145183146183147183148183149183150183151183152183153183154183155183156183157183158183159183160183161183162183163183164183165183166183167183168183169183170183171183172183173183174183175183176183177183178183179183180183181183182183183183184183185183186183187183188183189183190183191183192183193183194183195183196183197183198183199183200183201183202183203183204183205183206183207183208183209183210183211183212183213183214183215183216183217183218183219183220183221183222183223183224183225183226183227183228183229183230183231183232183233183234183235183236183237183238183239183240183241183242183243183244183245183246183247183248183249183250183251183252183253183254183255183256183257183258183259183260183261183262183263183264183265183266183267183268183269183270183271183272183273183274183275183276183277183278183279183280183281183282183283183284183285183286183287183288183289183290183291183292183293183294183295183296183297183298183299183300183301183302183303183304183305183306183307183308183309183310183311183312183313183314183315183316183317183318183319183320183321183322183323183324183325183326183327183328183329183330183331183332183333183334183335183336183337183338183339183340183341183342183343183344183345183346183347183348183349183350183351183352183353183354183355183356183357183358183359183360183361183362183363183364183365183366183367183368183369183370183371183372183373183374183375183376183377183378183379183380183381183382183383183384183385183386183387183388183389183390183391183392183393183394183395183396183397183398183399183400183401183402183403183404183405183406183407183408183409183410183411183412183413183414183415183416183417183418183419183420183421183422183423183424183425183426183427183428183429183430183431183432183433183434183435183436183437183438183439183440183441183442183443183444183445183446183447183448183449183450183451183452183453183454183455183456183457183458183459183460183461183462183463183464183465183466183467183468183469183470183471183472183473183474183475183476183477183478183479183480183481183482183483183484183485183486183487183488183489183490183491183492183493183494183495183496183497183498183499183500183501183502183503183504183505183506183507183508183509183510183511183512183513183514183515183516183517183518183519183520183521183522183523183524183525183526183527183528183529183530183531183532183533183534183535183536183537183538183539183540183541183542183543183544183545183546183547183548183549183550183551183552183553183554183555183556183557183558183559183560183561183562183563183564183565183566183567183568183569183570183571183572183573183574183575183576183577183578183579183580183581183582183583183584183585183586183587183588183589183590183591183592183593183594183595183596183597183598183599183600183601183602183603183604183605183606183607183608183609183610183611183612183613183614183615183616183617183618183619183620183621183622183623183624183625183626183627183628183629183630183631183632183633183634183635183636183637183638183639183640183641183642183643183644183645183646183647183648183649183650183651183652183653183654183655183656183657183658183659183660183661183662183663183664183665183666183667183668183669183670183671183672183673183674183675183676183677183678183679183680183681183682183683183684183685183686183687183688183689183690183691183692183693183694183695183696183697183698183699183700183701183702183703183704183705183706183707183708183709183710183711183712183713183714183715183716183717183718183719183720183721183722183723183724183725183726183727183728183729183730183731183732183733183734183735183736183737183738183739183740183741183742183743183744183745183746183747183748183749183750183751183752183753183754183755183756183757183758183759183760183761183762183763183764183765183766183767183768183769183770183771183772183773183774183775183776183777183778183779183780183781183782183783183784183785183786183787183788183789183790183791183792183793183794183795183796183797183798183799183800183801183802183803183804183805183806183807183808183809183810183811183812183813183814183815183816183817183818183819183820183821183822183823183824183825183826183827183828183829183830183831183832183833183834183835183836183837183838183839183840183841183842183843183844183845183846183847183848183849183850183851183852183853183854183855183856183857183858183859183860183861183862183863183864183865183866183867183868183869183870183871183872183873183874183875183876183877183878183879183880183881183882183883183884183885183886183887183888183889183890183891183892183893183894183895183896183897183898183899183900183901183902183903183904183905183906183907183908183909183910183911183912183913183914183915183916183917183918183919183920183921183922183923183924183925183926183927183928183929183930183931183932183933183934183935183936183937183938183939183940183941183942183943183944183945183946183947183948183949183950183951183952183953183954183955183956183957183958183959183960183961183962183963183964183965183966183967183968183969183970183971183972183973183974183975183976183977183978183979183980183981183982183983183984183985183986183987183988183989183990183991183992183993183994183995183996183997183998183999184000184001184002184003184004184005184006184007184008184009184010184011184012184013184014184015184016184017184018184019184020184021184022184023184024184025184026184027184028184029184030184031184032184033184034184035184036184037184038184039184040184041184042184043184044184045184046184047184048184049184050184051184052184053184054184055184056184057184058184059184060184061184062184063184064184065184066184067184068184069184070184071184072184073184074184075184076184077184078184079184080184081184082184083184084184085184086184087184088184089184090184091184092184093184094184095184096184097184098184099184100184101184102184103184104184105184106184107184108184109184110184111184112184113184114184115184116184117184118184119184120184121184122184123184124184125184126184127184128184129184130184131184132184133184134184135184136184137184138184139184140184141184142184143184144184145184146184147184148184149184150184151184152184153184154184155184156184157184158184159184160184161184162184163184164184165184166184167184168184169184170184171184172184173184174184175184176184177184178184179184180184181184182184183184184184185184186184187184188184189184190184191184192184193184194184195184196184197184198184199184200184201184202184203184204184205184206184207184208184209184210184211184212184213184214184215184216184217184218184219184220184221184222184223184224184225184226184227184228184229184230184231184232184233184234184235184236184237184238184239184240184241184242184243184244184245184246184247184248184249184250184251184252184253184254184255184256184257184258184259184260184261184262184263184264184265184266184267184268184269184270184271184272184273184274184275184276184277184278184279184280184281184282184283184284184285184286184287184288184289184290184291184292184293184294184295184296184297184298184299184300184301184302184303184304184305184306184307184308184309184310184311184312184313184314184315184316184317184318184319184320184321184322184323184324184325184326184327184328184329184330184331184332184333184334184335184336184337184338184339184340184341184342184343184344184345184346184347184348184349184350184351184352184353184354184355184356184357184358184359184360184361184362184363184364184365184366184367184368184369184370184371184372184373184374184375184376184377184378184379184380184381184382184383184384184385184386184387184388184389184390184391184392184393184394184395184396184397184398184399184400184401184402184403184404184405184406184407184408184409184410184411184412184413184414184415184416184417184418184419184420184421184422184423184424184425184426184427184428184429184430184431184432184433184434184435184436184437184438184439184440184441184442184443184444184445184446184447184448184449184450184451184452184453184454184455184456184457184458184459184460184461184462184463184464184465184466184467184468184469184470184471184472184473184474184475184476184477184478184479184480184481184482184483184484184485184486184487184488184489184490184491184492184493184494184495184496184497184498184499184500184501184502184503184504184505184506184507184508184509184510184511184512184513184514184515184516184517184518184519184520184521184522184523184524184525184526184527184528184529184530184531184532184533184534184535184536184537184538184539184540184541184542184543184544184545184546184547184548184549184550184551184552184553184554184555184556184557184558184559184560184561184562184563184564184565184566184567184568184569184570184571184572184573184574184575184576184577184578184579184580184581184582184583184584184585184586184587184588184589184590184591184592184593184594184595184596184597184598184599184600184601184602184603184604184605184606184607184608184609184610184611184612184613184614184615184616184617184618184619184620184621184622184623184624184625184626184627184628184629184630184631184632184633184634184635184636184637184638184639184640184641184642184643184644184645184646184647184648184649184650184651184652184653184654184655184656184657184658184659184660184661184662184663184664184665184666184667184668184669184670184671184672184673184674184675184676184677184678184679184680184681184682184683184684184685184686184687184688184689184690184691184692184693184694184695184696184697184698184699184700184701184702184703184704184705184706184707184708184709184710184711184712184713184714184715184716184717184718184719184720184721184722184723184724184725184726184727184728184729184730184731184732184733184734184735184736184737184738184739184740184741184742184743184744184745184746184747184748184749184750184751184752184753184754184755184756184757184758184759184760184761184762184763184764184765184766184767184768184769184770184771184772184773184774184775184776184777184778184779184780184781184782184783184784184785184786184787184788184789184790184791184792184793184794184795184796184797184798184799184800184801184802184803184804184805184806184807184808184809184810184811184812184813184814184815184816184817184818184819184820184821184822184823184824184825184826184827184828184829184830184831184832184833184834184835184836184837184838184839184840184841184842184843184844184845184846184847184848184849184850184851184852184853184854184855184856184857184858184859184860184861184862184863184864184865184866184867184868184869184870184871184872184873184874184875184876184877184878184879184880184881184882184883184884184885184886184887184888184889184890184891184892184893184894184895184896184897184898184899184900184901184902184903184904184905184906184907184908184909184910184911184912184913184914184915184916184917184918184919184920184921184922184923184924184925184926184927184928184929184930184931184932184933184934184935184936184937184938184939184940184941184942184943184944184945184946184947184948184949184950184951184952184953184954184955184956184957184958184959184960184961184962184963184964184965184966184967184968184969184970184971184972184973184974184975184976184977184978184979184980184981184982184983184984184985184986184987184988184989184990184991184992184993184994184995184996184997184998184999185000185001185002185003185004185005185006185007185008185009185010185011185012185013185014185015185016185017185018185019185020185021185022185023185024185025185026185027185028185029185030185031185032185033185034185035185036185037185038185039185040185041185042185043185044185045185046185047185048185049185050185051185052185053185054185055185056185057185058185059185060185061185062185063185064185065185066185067185068185069185070185071185072185073185074185075185076185077185078185079185080185081185082185083185084185085185086185087185088185089185090185091185092185093185094185095185096185097185098185099185100185101185102185103185104185105185106185107185108185109185110185111185112185113185114185115185116185117185118185119185120185121185122185123185124185125185126185127185128185129185130185131185132185133185134185135185136185137185138185139185140185141185142185143185144185145185146185147185148185149185150185151185152185153185154185155185156185157185158185159185160185161185162185163185164185165185166185167185168185169185170185171185172185173185174185175185176185177185178185179185180185181185182185183185184185185185186185187185188185189185190185191185192185193185194185195185196185197185198185199185200185201185202185203185204185205185206185207185208185209185210185211185212185213185214185215185216185217185218185219185220185221185222185223185224185225185226185227185228185229185230185231185232185233185234185235185236185237185238185239185240185241185242185243185244185245185246185247185248185249185250185251185252185253185254185255185256185257185258185259185260185261185262185263185264185265185266185267185268185269185270185271185272185273185274185275185276185277185278185279185280185281185282185283185284185285185286185287185288185289185290185291185292185293185294185295185296185297185298185299185300185301185302185303185304185305185306185307185308185309185310185311185312185313185314185315185316185317185318185319185320185321185322185323185324185325185326185327185328185329185330185331185332185333185334185335185336185337185338185339185340185341185342185343185344185345185346185347185348185349185350185351185352185353185354185355185356185357185358185359185360185361185362185363185364185365185366185367185368185369185370185371185372185373185374185375185376185377185378185379185380185381185382185383185384185385185386185387185388185389185390185391185392185393185394185395185396185397185398185399185400185401185402185403185404185405185406185407185408185409185410185411185412185413185414185415185416185417185418185419185420185421185422185423185424185425185426185427185428185429185430185431185432185433185434185435185436185437185438185439185440185441185442185443185444185445185446185447185448185449185450185451185452185453185454185455185456185457185458185459185460185461185462185463185464185465185466185467185468185469185470185471185472185473185474185475185476185477185478185479185480185481185482185483185484185485185486185487185488185489185490185491185492185493185494185495185496185497185498185499185500185501185502185503185504185505185506185507185508185509185510185511185512185513185514185515185516185517185518185519185520185521185522185523185524185525185526185527185528185529185530185531185532185533185534185535185536185537185538185539185540185541185542185543185544185545185546185547185548185549185550185551185552185553185554185555185556185557185558185559185560185561185562185563185564185565185566185567185568185569185570185571185572185573185574185575185576185577185578185579185580185581185582185583185584185585185586185587185588185589185590185591185592185593185594185595185596185597185598185599185600185601185602185603185604185605185606185607185608185609185610185611185612185613185614185615185616185617185618185619185620185621185622185623185624185625185626185627185628185629185630185631185632185633185634185635185636185637185638185639185640185641185642185643185644185645185646185647185648185649185650185651185652185653185654185655185656185657185658185659185660185661185662185663185664185665185666185667185668185669185670185671185672185673185674185675185676185677185678185679185680185681185682185683185684185685185686185687185688185689185690185691185692185693185694185695185696185697185698185699185700185701185702185703185704185705185706185707185708185709185710185711185712185713185714185715185716185717185718185719185720185721185722185723185724185725185726185727185728185729185730185731185732185733185734185735185736185737185738185739185740185741185742185743185744185745185746185747185748185749185750185751185752185753185754185755185756185757185758185759185760185761185762185763185764185765185766185767185768185769185770185771185772185773185774185775185776185777185778185779185780185781185782185783185784185785185786185787185788185789185790185791185792185793185794185795185796185797185798185799185800185801185802185803185804185805185806185807185808185809185810185811185812185813185814185815185816185817185818185819185820185821185822185823185824185825185826185827185828185829185830185831185832185833185834185835185836185837185838185839185840185841185842185843185844185845185846185847185848185849185850185851185852185853185854185855185856185857185858185859185860185861185862185863185864185865185866185867185868185869185870185871185872185873185874185875185876185877185878185879185880185881185882185883185884185885185886185887185888185889185890185891185892185893185894185895185896185897185898185899185900185901185902185903185904185905185906185907185908185909185910185911185912185913185914185915185916185917185918185919185920185921185922185923185924185925185926185927185928185929185930185931185932185933185934185935185936185937185938185939185940185941185942185943185944185945185946185947185948185949185950185951185952185953185954185955185956185957185958185959185960185961185962185963185964185965185966185967185968185969185970185971185972185973185974185975185976185977185978185979185980185981185982185983185984185985185986185987185988185989185990185991185992185993185994185995185996185997185998185999186000186001186002186003186004186005186006186007186008186009186010186011186012186013186014186015186016186017186018186019186020186021186022186023186024186025186026186027186028186029186030186031186032186033186034186035186036186037186038186039186040186041186042186043186044186045186046186047186048186049186050186051186052186053186054186055186056186057186058186059186060186061186062186063186064186065186066186067186068186069186070186071186072186073186074186075186076186077186078186079186080186081186082186083186084186085186086186087186088186089186090186091186092186093186094186095186096186097186098186099186100186101186102186103186104186105186106186107186108186109186110186111186112186113186114186115186116186117186118186119186120186121186122186123186124186125186126186127186128186129186130186131186132186133186134186135186136186137186138186139186140186141186142186143186144186145186146186147186148186149186150186151186152186153186154186155186156186157186158186159186160186161186162186163186164186165186166186167186168186169186170186171186172186173186174186175186176186177186178186179186180186181186182186183186184186185186186186187186188186189186190186191186192186193186194186195186196186197186198186199186200186201186202186203186204186205186206186207186208186209186210186211186212186213186214186215186216186217186218186219186220186221186222186223186224186225186226186227186228186229186230186231186232186233186234186235186236186237186238186239186240186241186242186243186244186245186246186247186248186249186250186251186252186253186254186255186256186257186258186259186260186261186262186263186264186265186266186267186268186269186270186271186272186273186274186275186276186277186278186279186280186281186282186283186284186285186286186287186288186289186290186291186292186293186294186295186296186297186298186299186300186301186302186303186304186305186306186307186308186309186310186311186312186313186314186315186316186317186318186319186320186321186322186323186324186325186326186327186328186329186330186331186332186333186334186335186336186337186338186339186340186341186342186343186344186345186346186347186348186349186350186351186352186353186354186355186356186357186358186359186360186361186362186363186364186365186366186367186368186369186370186371186372186373186374186375186376186377186378186379186380186381186382186383186384186385186386186387186388186389186390186391186392186393186394186395186396186397186398186399186400186401186402186403186404186405186406186407186408186409186410186411186412186413186414186415186416186417186418186419186420186421186422186423186424186425186426186427186428186429186430186431186432186433186434186435186436186437186438186439186440186441186442186443186444186445186446186447186448186449186450186451186452186453186454186455186456186457186458186459186460186461186462186463186464186465186466186467186468186469186470186471186472186473186474186475186476186477186478186479186480186481186482186483186484186485186486186487186488186489186490186491186492186493186494186495186496186497186498186499186500186501186502186503186504186505186506186507186508186509186510186511186512186513186514186515186516186517186518186519186520186521186522186523186524186525186526186527186528186529186530186531186532186533186534186535186536186537186538186539186540186541186542186543186544186545186546186547186548186549186550186551186552186553186554186555186556186557186558186559186560186561186562186563186564186565186566186567186568186569186570186571186572186573186574186575186576186577186578186579186580186581186582186583186584186585186586186587186588186589186590186591186592186593186594186595186596186597186598186599186600186601186602186603186604186605186606186607186608186609186610186611186612186613186614186615186616186617186618186619186620186621186622186623186624186625186626186627186628186629186630186631186632186633186634186635186636186637186638186639186640186641186642186643186644186645186646186647186648186649186650186651186652186653186654186655186656186657186658186659186660186661186662186663186664186665186666186667186668186669186670186671186672186673186674186675186676186677186678186679186680186681186682186683186684186685186686186687186688186689186690186691186692186693186694186695186696186697186698186699186700186701186702186703186704186705186706186707186708186709186710186711186712186713186714186715186716186717186718186719186720186721186722186723186724186725186726186727186728186729186730186731186732186733186734186735186736186737186738186739186740186741186742186743186744186745186746186747186748186749186750186751186752186753186754186755186756186757186758186759186760186761186762186763186764186765186766186767186768186769186770186771186772186773186774186775186776186777186778186779186780186781186782186783186784186785186786186787186788186789186790186791186792186793186794186795186796186797186798186799186800186801186802186803186804186805186806186807186808186809186810186811186812186813186814186815186816186817186818186819186820186821186822186823186824186825186826186827186828186829186830186831186832186833186834186835186836186837186838186839186840186841186842186843186844186845186846186847186848186849186850186851186852186853186854186855186856186857186858186859186860186861186862186863186864186865186866186867186868186869186870186871186872186873186874186875186876186877186878186879186880186881186882186883186884186885186886186887186888186889186890186891186892186893186894186895186896186897186898186899186900186901186902186903186904186905186906186907186908186909186910186911186912186913186914186915186916186917186918186919186920186921186922186923186924186925186926186927186928186929186930186931186932186933186934186935186936186937186938186939186940186941186942186943186944186945186946186947186948186949186950186951186952186953186954186955186956186957186958186959186960186961186962186963186964186965186966186967186968186969186970186971186972186973186974186975186976186977186978186979186980186981186982186983186984186985186986186987186988186989186990186991186992186993186994186995186996186997186998186999187000187001187002187003187004187005187006187007187008187009187010187011187012187013187014187015187016187017187018187019187020187021187022187023187024187025187026187027187028187029187030187031187032187033187034187035187036187037187038187039187040187041187042187043187044187045187046187047187048187049187050187051187052187053187054187055187056187057187058187059187060187061187062187063187064187065187066187067187068187069187070187071187072187073187074187075187076187077187078187079187080187081187082187083187084187085187086187087187088187089187090187091187092187093187094187095187096187097187098187099187100187101187102187103187104187105187106187107187108187109187110187111187112187113187114187115187116187117187118187119187120187121187122187123187124187125187126187127187128187129187130187131187132187133187134187135187136187137187138187139187140187141187142187143187144187145187146187147187148187149187150187151187152187153187154187155187156187157187158187159187160187161187162187163187164187165187166187167187168187169187170187171187172187173187174187175187176187177187178187179187180187181187182187183187184187185187186187187187188187189187190187191187192187193187194187195187196187197187198187199187200187201187202187203187204187205187206187207187208187209187210187211187212187213187214187215187216187217187218187219187220187221187222187223187224187225187226187227187228187229187230187231187232187233187234187235187236187237187238187239187240187241187242187243187244187245187246187247187248187249187250187251187252187253187254187255187256187257187258187259187260187261187262187263187264187265187266187267187268187269187270187271187272187273187274187275187276187277187278187279187280187281187282187283187284187285187286187287187288187289187290187291187292187293187294187295187296187297187298187299187300187301187302187303187304187305187306187307187308187309187310187311187312187313187314187315187316187317187318187319187320187321187322187323187324187325187326187327187328187329187330187331187332187333187334187335187336187337187338187339187340187341187342187343187344187345187346187347187348187349187350187351187352187353187354187355187356187357187358187359187360187361187362187363187364187365187366187367187368187369187370187371187372187373187374187375187376187377187378187379187380187381187382187383187384187385187386187387187388187389187390187391187392187393187394187395187396187397187398187399187400187401187402187403187404187405187406187407187408187409187410187411187412187413187414187415187416187417187418187419187420187421187422187423187424187425187426187427187428187429187430187431187432187433187434187435187436187437187438187439187440187441187442187443187444187445187446187447187448187449187450187451187452187453187454187455187456187457187458187459187460187461187462187463187464187465187466187467187468187469187470187471187472187473187474187475187476187477187478187479187480187481187482187483187484187485187486187487187488187489187490187491187492187493187494187495187496187497187498187499187500187501187502187503187504187505187506187507187508187509187510187511187512187513187514187515187516187517187518187519187520187521187522187523187524187525187526187527187528187529187530187531187532187533187534187535187536187537187538187539187540187541187542187543187544187545187546187547187548187549187550187551187552187553187554187555187556187557187558187559187560187561187562187563187564187565187566187567187568187569187570187571187572187573187574187575187576187577187578187579187580187581187582187583187584187585187586187587187588187589187590187591187592187593187594187595187596187597187598187599187600187601187602187603187604187605187606187607187608187609187610187611187612187613187614187615187616187617187618187619187620187621187622187623187624187625187626187627187628187629187630187631187632187633187634187635187636187637187638187639187640187641187642187643187644187645187646187647187648187649187650187651187652187653187654187655187656187657187658187659187660187661187662187663187664187665187666187667187668187669187670187671187672187673187674187675187676187677187678187679187680187681187682187683187684187685187686187687187688187689187690187691187692187693187694187695187696187697187698187699187700187701187702187703187704187705187706187707187708187709187710187711187712187713187714187715187716187717187718187719187720187721187722187723187724187725187726187727187728187729187730187731187732187733187734187735187736187737187738187739187740187741187742187743187744187745187746187747187748187749187750187751187752187753187754187755187756187757187758187759187760187761187762187763187764187765187766187767187768187769187770187771187772187773187774187775187776187777187778187779187780187781187782187783187784187785187786187787187788187789187790187791187792187793187794187795187796187797187798187799187800187801187802187803187804187805187806187807187808187809187810187811187812187813187814187815187816187817187818187819187820187821187822187823187824187825187826187827187828187829187830187831187832187833187834187835187836187837187838187839187840187841187842187843187844187845187846187847187848187849187850187851187852187853187854187855187856187857187858187859187860187861187862187863187864187865187866187867187868187869187870187871187872187873187874187875187876187877187878187879187880187881187882187883187884187885187886187887187888187889187890187891187892187893187894187895187896187897187898187899187900187901187902187903187904187905187906187907187908187909187910187911187912187913187914187915187916187917187918187919187920187921187922187923187924187925187926187927187928187929187930187931187932187933187934187935187936187937187938187939187940187941187942187943187944187945187946187947187948187949187950187951187952187953187954187955187956187957187958187959187960187961187962187963187964187965187966187967187968187969187970187971187972187973187974187975187976187977187978187979187980187981187982187983187984187985187986187987187988187989187990187991187992187993187994187995187996187997187998187999188000188001188002188003188004188005188006188007188008188009188010188011188012188013188014188015188016188017188018188019188020188021188022188023188024188025188026188027188028188029188030188031188032188033188034188035188036188037188038188039188040188041188042188043188044188045188046188047188048188049188050188051188052188053188054188055188056188057188058188059188060188061188062188063188064188065188066188067188068188069188070188071188072188073188074188075188076188077188078188079188080188081188082188083188084188085188086188087188088188089188090188091188092188093188094188095188096188097188098188099188100188101188102188103188104188105188106188107188108188109188110188111188112188113188114188115188116188117188118188119188120188121188122188123188124188125188126188127188128188129188130188131188132188133188134188135188136188137188138188139188140188141188142188143188144188145188146188147188148188149188150188151188152188153188154188155188156188157188158188159188160188161188162188163188164188165188166188167188168188169188170188171188172188173188174188175188176188177188178188179188180188181188182188183188184188185188186188187188188188189188190188191188192188193188194188195188196188197188198188199188200188201188202188203188204188205188206188207188208188209188210188211188212188213188214188215188216188217188218188219188220188221188222188223188224188225188226188227188228188229188230188231188232188233188234188235188236188237188238188239188240188241188242188243188244188245188246188247188248188249188250188251188252188253188254188255188256188257188258188259188260188261188262188263188264188265188266188267188268188269188270188271188272188273188274188275188276188277188278188279188280188281188282188283188284188285188286188287188288188289188290188291188292188293188294188295188296188297188298188299188300188301188302188303188304188305188306188307188308188309188310188311188312188313188314188315188316188317188318188319188320188321188322188323188324188325188326188327188328188329188330188331188332188333188334188335188336188337188338188339188340188341188342188343188344188345188346188347188348188349188350188351188352188353188354188355188356188357188358188359188360188361188362188363188364188365188366188367188368188369188370188371188372188373188374188375188376188377188378188379188380188381188382188383188384188385188386188387188388188389188390188391188392188393188394188395188396188397188398188399188400188401188402188403188404188405188406188407188408188409188410188411188412188413188414188415188416188417188418188419188420188421188422188423188424188425188426188427188428188429188430188431188432188433188434188435188436188437188438188439188440188441188442188443188444188445188446188447188448188449188450188451188452188453188454188455188456188457188458188459188460188461188462188463188464188465188466188467188468188469188470188471188472188473188474188475188476188477188478188479188480188481188482188483188484188485188486188487188488188489188490188491188492188493188494188495188496188497188498188499188500188501188502188503188504188505188506188507188508188509188510188511188512188513188514188515188516188517188518188519188520188521188522188523188524188525188526188527188528188529188530188531188532188533188534188535188536188537188538188539188540188541188542188543188544188545188546188547188548188549188550188551188552188553188554188555188556188557188558188559188560188561188562188563188564188565188566188567188568188569188570188571188572188573188574188575188576188577188578188579188580188581188582188583188584188585188586188587188588188589188590188591188592188593188594188595188596188597188598188599188600188601188602188603188604188605188606188607188608188609188610188611188612188613188614188615188616188617188618188619188620188621188622188623188624188625188626188627188628188629188630188631188632188633188634188635188636188637188638188639188640188641188642188643188644188645188646188647188648188649188650188651188652188653188654188655188656188657188658188659188660188661188662188663188664188665188666188667188668188669188670188671188672188673188674188675188676188677188678188679188680188681188682188683188684188685188686188687188688188689188690188691188692188693188694188695188696188697188698188699188700188701188702188703188704188705188706188707188708188709188710188711188712188713188714188715188716188717188718188719188720188721188722188723188724188725188726188727188728188729188730188731188732188733188734188735188736188737188738188739188740188741188742188743188744188745188746188747188748188749188750188751188752188753188754188755188756188757188758188759188760188761188762188763188764188765188766188767188768188769188770188771188772188773188774188775188776188777188778188779188780188781188782188783188784188785188786188787188788188789188790188791188792188793188794188795188796188797188798188799188800188801188802188803188804188805188806188807188808188809188810188811188812188813188814188815188816188817188818188819188820188821188822188823188824188825188826188827188828188829188830188831188832188833188834188835188836188837188838188839188840188841188842188843188844188845188846188847188848188849188850188851188852188853188854188855188856188857188858188859188860188861188862188863188864188865188866188867188868188869188870188871188872188873188874188875188876188877188878188879188880188881188882188883188884188885188886188887188888188889188890188891188892188893188894188895188896188897188898188899188900188901188902188903188904188905188906188907188908188909188910188911188912188913188914188915188916188917188918188919188920188921188922188923188924188925188926188927188928188929188930188931188932188933188934188935188936188937188938188939188940188941188942188943188944188945188946188947188948188949188950188951188952188953188954188955188956188957188958188959188960188961188962188963188964188965188966188967188968188969188970188971188972188973188974188975188976188977188978188979188980188981188982188983188984188985188986188987188988188989188990188991188992188993188994188995188996188997188998188999189000189001189002189003189004189005189006189007189008189009189010189011189012189013189014189015189016189017189018189019189020189021189022189023189024189025189026189027189028189029189030189031189032189033189034189035189036189037189038189039189040189041189042189043189044189045189046189047189048189049189050189051189052189053189054189055189056189057189058189059189060189061189062189063189064189065189066189067189068189069189070189071189072189073189074189075189076189077189078189079189080189081189082189083189084189085189086189087189088189089189090189091189092189093189094189095189096189097189098189099189100189101189102189103189104189105189106189107189108189109189110189111189112189113189114189115189116189117189118189119189120189121189122189123189124189125189126189127189128189129189130189131189132189133189134189135189136189137189138189139189140189141189142189143189144189145189146189147189148189149189150189151189152189153189154189155189156189157189158189159189160189161189162189163189164189165189166189167189168189169189170189171189172189173189174189175189176189177189178189179189180189181189182189183189184189185189186189187189188189189189190189191189192189193189194189195189196189197189198189199189200189201189202189203189204189205189206189207189208189209189210189211189212189213189214189215189216189217189218189219189220189221189222189223189224189225189226189227189228189229189230189231189232189233189234189235189236189237189238189239189240189241189242189243189244189245189246189247189248189249189250189251189252189253189254189255189256189257189258189259189260189261189262189263189264189265189266189267189268189269189270189271189272189273189274189275189276189277189278189279189280189281189282189283189284189285189286189287189288189289189290189291189292189293189294189295189296189297189298189299189300189301189302189303189304189305189306189307189308189309189310189311189312189313189314189315189316189317189318189319189320189321189322189323189324189325189326189327189328189329189330189331189332189333189334189335189336189337189338189339189340189341189342189343189344189345189346189347189348189349189350189351189352189353189354189355189356189357189358189359189360189361189362189363189364189365189366189367189368189369189370189371189372189373189374189375189376189377189378189379189380189381189382189383189384189385189386189387189388189389189390189391189392189393189394189395189396189397189398189399189400189401189402189403189404189405189406189407189408189409189410189411189412189413189414189415189416189417189418189419189420189421189422189423189424189425189426189427189428189429189430189431189432189433189434189435189436189437189438189439189440189441189442189443189444189445189446189447189448189449189450189451189452189453189454189455189456189457189458189459189460189461189462189463189464189465189466189467189468189469189470189471189472189473189474189475189476189477189478189479189480189481189482189483189484189485189486189487189488189489189490189491189492189493189494189495189496189497189498189499189500189501189502189503189504189505189506189507189508189509189510189511189512189513189514189515189516189517189518189519189520189521189522189523189524189525189526189527189528189529189530189531189532189533189534189535189536189537189538189539189540189541189542189543189544189545189546189547189548189549189550189551189552189553189554189555189556189557189558189559189560189561189562189563189564189565189566189567189568189569189570189571189572189573189574189575189576189577189578189579189580189581189582189583189584189585189586189587189588189589189590189591189592189593189594189595189596189597189598189599189600189601189602189603189604189605189606189607189608189609189610189611189612189613189614189615189616189617189618189619189620189621189622189623189624189625189626189627189628189629189630189631189632189633189634189635189636189637189638189639189640189641189642189643189644189645189646189647189648189649189650189651189652189653189654189655189656189657189658189659189660189661189662189663189664189665189666189667189668189669189670189671189672189673189674189675189676189677189678189679189680189681189682189683189684189685189686189687189688189689189690189691189692189693189694189695189696189697189698189699189700189701189702189703189704189705189706189707189708189709189710189711189712189713189714189715189716189717189718189719189720189721189722189723189724189725189726189727189728189729189730189731189732189733189734189735189736189737189738189739189740189741189742189743189744189745189746189747189748189749189750189751189752189753189754189755189756189757189758189759189760189761189762189763189764189765189766189767189768189769189770189771189772189773189774189775189776189777189778189779189780189781189782189783189784189785189786189787189788189789189790189791189792189793189794189795189796189797189798189799189800189801189802189803189804189805189806189807189808189809189810189811189812189813189814189815189816189817189818189819189820189821189822189823189824189825189826189827189828189829189830189831189832189833189834189835189836189837189838189839189840189841189842189843189844189845189846189847189848189849189850189851189852189853189854189855189856189857189858189859189860189861189862189863189864189865189866189867189868189869189870189871189872189873189874189875189876189877189878189879189880189881189882189883189884189885189886189887189888189889189890189891189892189893189894189895189896189897189898189899189900189901189902189903189904189905189906189907189908189909189910189911189912189913189914189915189916189917189918189919189920189921189922189923189924189925189926189927189928189929189930189931189932189933189934189935189936189937189938189939189940189941189942189943189944189945189946189947189948189949189950189951189952189953189954189955189956189957189958189959189960189961189962189963189964189965189966189967189968189969189970189971189972189973189974189975189976189977189978189979189980189981189982189983189984189985189986189987189988189989189990189991189992189993189994189995189996189997189998189999190000190001190002190003190004190005190006190007190008190009190010190011190012190013190014190015190016190017190018190019190020190021190022190023190024190025190026190027190028190029190030190031190032190033190034190035190036190037190038190039190040190041190042190043190044190045190046190047190048190049190050190051190052190053190054190055190056190057190058190059190060190061190062190063190064190065190066190067190068190069190070190071190072190073190074190075190076190077190078190079190080190081190082190083190084190085190086190087190088190089190090190091190092190093190094190095190096190097190098190099190100190101190102190103190104190105190106190107190108190109190110190111190112190113190114190115190116190117190118190119190120190121190122190123190124190125190126190127190128190129190130190131190132190133190134190135190136190137190138190139190140190141190142190143190144190145190146190147190148190149190150190151190152190153190154190155190156190157190158190159190160190161190162190163190164190165190166190167190168190169190170190171190172190173190174190175190176190177190178190179190180190181190182190183190184190185190186190187190188190189190190190191190192190193190194190195190196190197190198190199190200190201190202190203190204190205190206190207190208190209190210190211190212190213190214190215190216190217190218190219190220190221190222190223190224190225190226190227190228190229190230190231190232190233190234190235190236190237190238190239190240190241190242190243190244190245190246190247190248190249190250190251190252190253190254190255190256190257190258190259190260190261190262190263190264190265190266190267190268190269190270190271190272190273190274190275190276190277190278190279190280190281190282190283190284190285190286190287190288190289190290190291190292190293190294190295190296190297190298190299190300190301190302190303190304190305190306190307190308190309190310190311190312190313190314190315190316190317190318190319190320190321190322190323190324190325190326190327190328190329190330190331190332190333190334190335190336190337190338190339190340190341190342190343190344190345190346190347190348190349190350190351190352190353190354190355190356190357190358190359190360190361190362190363190364190365190366190367190368190369190370190371190372190373190374190375190376190377190378190379190380190381190382190383190384190385190386190387190388190389190390190391190392190393190394190395190396190397190398190399190400190401190402190403190404190405190406190407190408190409190410190411190412190413190414190415190416190417190418190419190420190421190422190423190424190425190426190427190428190429190430190431190432190433190434190435190436190437190438190439190440190441190442190443190444190445190446190447190448190449190450190451190452190453190454190455190456190457190458190459190460190461190462190463190464190465190466190467190468190469190470190471190472190473190474190475190476190477190478190479190480190481190482190483190484190485190486190487190488190489190490190491190492190493190494190495190496190497190498190499190500190501190502190503190504190505190506190507190508190509190510190511190512190513190514190515190516190517190518190519190520190521190522190523190524190525190526190527190528190529190530190531190532190533190534190535190536190537190538190539190540190541190542190543190544190545190546190547190548190549190550190551190552190553190554190555190556190557190558190559190560190561190562190563190564190565190566190567190568190569190570190571190572190573190574190575190576190577190578190579190580190581190582190583190584190585190586190587190588190589190590190591190592190593190594190595190596190597190598190599190600190601190602190603190604190605190606190607190608190609190610190611190612190613190614190615190616190617190618190619190620190621190622190623190624190625190626190627190628190629190630190631190632190633190634190635190636190637190638190639190640190641190642190643190644190645190646190647190648190649190650190651190652190653190654190655190656190657190658190659190660190661190662190663190664190665190666190667190668190669190670190671190672190673190674190675190676190677190678190679190680190681190682190683190684190685190686190687190688190689190690190691190692190693190694190695190696190697190698190699190700190701190702190703190704190705190706190707190708190709190710190711190712190713190714190715190716190717190718190719190720190721190722190723190724190725190726190727190728190729190730190731190732190733190734190735190736190737190738190739190740190741190742190743190744190745190746190747190748190749190750190751190752190753190754190755190756190757190758190759190760190761190762190763190764190765190766190767190768190769190770190771190772190773190774190775190776190777190778190779190780190781190782190783190784190785190786190787190788190789190790190791190792190793190794190795190796190797190798190799190800190801190802190803190804190805190806190807190808190809190810190811190812190813190814190815190816190817190818190819190820190821190822190823190824190825190826190827190828190829190830190831190832190833190834190835190836190837190838190839190840190841190842190843190844190845190846190847190848190849190850190851190852190853190854190855190856190857190858190859190860190861190862190863190864190865190866190867190868190869190870190871190872190873190874190875190876190877190878190879190880190881190882190883190884190885190886190887190888190889190890190891190892190893190894190895190896190897190898190899190900190901190902190903190904190905190906190907190908190909190910190911190912190913190914190915190916190917190918190919190920190921190922190923190924190925190926190927190928190929190930190931190932190933190934190935190936190937190938190939190940190941190942190943190944190945190946190947190948190949190950190951190952190953190954190955190956190957190958190959190960190961190962190963190964190965190966190967190968190969190970190971190972190973190974190975190976190977190978190979190980190981190982190983190984190985190986190987190988190989190990190991190992190993190994190995190996190997190998190999191000191001191002191003191004191005191006191007191008191009191010191011191012191013191014191015191016191017191018191019191020191021191022191023191024191025191026191027191028191029191030191031191032191033191034191035191036191037191038191039191040191041191042191043191044191045191046191047191048191049191050191051191052191053191054191055191056191057191058191059191060191061191062191063191064191065191066191067191068191069191070191071191072191073191074191075191076191077191078191079191080191081191082191083191084191085191086191087191088191089191090191091191092191093191094191095191096191097191098191099191100191101191102191103191104191105191106191107191108191109191110191111191112191113191114191115191116191117191118191119191120191121191122191123191124191125191126191127191128191129191130191131191132191133191134191135191136191137191138191139191140191141191142191143191144191145191146191147191148191149191150191151191152191153191154191155191156191157191158191159191160191161191162191163191164191165191166191167191168191169191170191171191172191173191174191175191176191177191178191179191180191181191182191183191184191185191186191187191188191189191190191191191192191193191194191195191196191197191198191199191200191201191202191203191204191205191206191207191208191209191210191211191212191213191214191215191216191217191218191219191220191221191222191223191224191225191226191227191228191229191230191231191232191233191234191235191236191237191238191239191240191241191242191243191244191245191246191247191248191249191250191251191252191253191254191255191256191257191258191259191260191261191262191263191264191265191266191267191268191269191270191271191272191273191274191275191276191277191278191279191280191281191282191283191284191285191286191287191288191289191290191291191292191293191294191295191296191297191298191299191300191301191302191303191304191305191306191307191308191309191310191311191312191313191314191315191316191317191318191319191320191321191322191323191324191325191326191327191328191329191330191331191332191333191334191335191336191337191338191339191340191341191342191343191344191345191346191347191348191349191350191351191352191353191354191355191356191357191358191359191360191361191362191363191364191365191366191367191368191369191370191371191372191373191374191375191376191377191378191379191380191381191382191383191384191385191386191387191388191389191390191391191392191393191394191395191396191397191398191399191400191401191402191403191404191405191406191407191408191409191410191411191412191413191414191415191416191417191418191419191420191421191422191423191424191425191426191427191428191429191430191431191432191433191434191435191436191437191438191439191440191441191442191443191444191445191446191447191448191449191450191451191452191453191454191455191456191457191458191459191460191461191462191463191464191465191466191467191468191469191470191471191472191473191474191475191476191477191478191479191480191481191482191483191484191485191486191487191488191489191490191491191492191493191494191495191496191497191498191499191500191501191502191503191504191505191506191507191508191509191510191511191512191513191514191515191516191517191518191519191520191521191522191523191524191525191526191527191528191529191530191531191532191533191534191535191536191537191538191539191540191541191542191543191544191545191546191547191548191549191550191551191552191553191554191555191556191557191558191559191560191561191562191563191564191565191566191567191568191569191570191571191572191573191574191575191576191577191578191579191580191581191582191583191584191585191586191587191588191589191590191591191592191593191594191595191596191597191598191599191600191601191602191603191604191605191606191607191608191609191610191611191612191613191614191615191616191617191618191619191620191621191622191623191624191625191626191627191628191629191630191631191632191633191634191635191636191637191638191639191640191641191642191643191644191645191646191647191648191649191650191651191652191653191654191655191656191657191658191659191660191661191662191663191664191665191666191667191668191669191670191671191672191673191674191675191676191677191678191679191680191681191682191683191684191685191686191687191688191689191690191691191692191693191694191695191696191697191698191699191700191701191702191703191704191705191706191707191708191709191710191711191712191713191714191715191716191717191718191719191720191721191722191723191724191725191726191727191728191729191730191731191732191733191734191735191736191737191738191739191740191741191742191743191744191745191746191747191748191749191750191751191752191753191754191755191756191757191758191759191760191761191762191763191764191765191766191767191768191769191770191771191772191773191774191775191776191777191778191779191780191781191782191783191784191785191786191787191788191789191790191791191792191793191794191795191796191797191798191799191800191801191802191803191804191805191806191807191808191809191810191811191812191813191814191815191816191817191818191819191820191821191822191823191824191825191826191827191828191829191830191831191832191833191834191835191836191837191838191839191840191841191842191843191844191845191846191847191848191849191850191851191852191853191854191855191856191857191858191859191860191861191862191863191864191865191866191867191868191869191870191871191872191873191874191875191876191877191878191879191880191881191882191883191884191885191886191887191888191889191890191891191892191893191894191895191896191897191898191899191900191901191902191903191904191905191906191907191908191909191910191911191912191913191914191915191916191917191918191919191920191921191922191923191924191925191926191927191928191929191930191931191932191933191934191935191936191937191938191939191940191941191942191943191944191945191946191947191948191949191950191951191952191953191954191955191956191957191958191959191960191961191962191963191964191965191966191967191968191969191970191971191972191973191974191975191976191977191978191979191980191981191982191983191984191985191986191987191988191989191990191991191992191993191994191995191996191997191998191999192000192001192002192003192004192005192006192007192008192009192010192011192012192013192014192015192016192017192018192019192020192021192022192023192024192025192026192027192028192029192030192031192032192033192034192035192036192037192038192039192040192041192042192043192044192045192046192047192048192049192050192051192052192053192054192055192056192057192058192059192060192061192062192063192064192065192066192067192068192069192070192071192072192073192074192075192076192077192078192079192080192081192082192083192084192085192086192087192088192089192090192091192092192093192094192095192096192097192098192099192100192101192102192103192104192105192106192107192108192109192110192111192112192113192114192115192116192117192118192119192120192121192122192123192124192125192126192127192128192129192130192131192132192133192134192135192136192137192138192139192140192141192142192143192144192145192146192147192148192149192150192151192152192153192154192155192156192157192158192159192160192161192162192163192164192165192166192167192168192169192170192171192172192173192174192175192176192177192178192179192180192181192182192183192184192185192186192187192188192189192190192191192192192193192194192195192196192197192198192199192200192201192202192203192204192205192206192207192208192209192210192211192212192213192214192215192216192217192218192219192220192221192222192223192224192225192226192227192228192229192230192231192232192233192234192235192236192237192238192239192240192241192242192243192244192245192246192247192248192249192250192251192252192253192254192255192256192257192258192259192260192261192262192263192264192265192266192267192268192269192270192271192272192273192274192275192276192277192278192279192280192281192282192283192284192285192286192287192288192289192290192291192292192293192294192295192296192297192298192299192300192301192302192303192304192305192306192307192308192309192310192311192312192313192314192315192316192317192318192319192320192321192322192323192324192325192326192327192328192329192330192331192332192333192334192335192336192337192338192339192340192341192342192343192344192345192346192347192348192349192350192351192352192353192354192355192356192357192358192359192360192361192362192363192364192365192366192367192368192369192370192371192372192373192374192375192376192377192378192379192380192381192382192383192384192385192386192387192388192389192390192391192392192393192394192395192396192397192398192399192400192401192402192403192404192405192406192407192408192409192410192411192412192413192414192415192416192417192418192419192420192421192422192423192424192425192426192427192428192429192430192431192432192433192434192435192436192437192438192439192440192441192442192443192444192445192446192447192448192449192450192451192452192453192454192455192456192457192458192459192460192461192462192463192464192465192466192467192468192469192470192471192472192473192474192475192476192477192478192479192480192481192482192483192484192485192486192487192488192489192490192491192492192493192494192495192496192497192498192499192500192501192502192503192504192505192506192507192508192509192510192511192512192513192514192515192516192517192518192519192520192521192522192523192524192525192526192527192528192529192530192531192532192533192534192535192536192537192538192539192540192541192542192543192544192545192546192547192548192549192550192551192552192553192554192555192556192557192558192559192560192561192562192563192564192565192566192567192568192569192570192571192572192573192574192575192576192577192578192579192580192581192582192583192584192585192586192587192588192589192590192591192592192593192594192595192596192597192598192599192600192601192602192603192604192605192606192607192608192609192610192611192612192613192614192615192616192617192618192619192620192621192622192623192624192625192626192627192628192629192630192631192632192633192634192635192636192637192638192639192640192641192642192643192644192645192646192647192648192649192650192651192652192653192654192655192656192657192658192659192660192661192662192663192664192665192666192667192668192669192670192671192672192673192674192675192676192677192678192679192680192681192682192683192684192685192686192687192688192689192690192691192692192693192694192695192696192697192698192699192700192701192702192703192704192705192706192707192708192709192710192711192712192713192714192715192716192717192718192719192720192721192722192723192724192725192726192727192728192729192730192731192732192733192734192735192736192737192738192739192740192741192742192743192744192745192746192747192748192749192750192751192752192753192754192755192756192757192758192759192760192761192762192763192764192765192766192767192768192769192770192771192772192773192774192775192776192777192778192779192780192781192782192783192784192785192786192787192788192789192790192791192792192793192794192795192796192797192798192799192800192801192802192803192804192805192806192807192808192809192810192811192812192813192814192815192816192817192818192819192820192821192822192823192824192825192826192827192828192829192830192831192832192833192834192835192836192837192838192839192840192841192842192843192844192845192846192847192848192849192850192851192852192853192854192855192856192857192858192859192860192861192862192863192864192865192866192867192868192869192870192871192872192873192874192875192876192877192878192879192880192881192882192883192884192885192886192887192888192889192890192891192892192893192894192895192896192897192898192899192900192901192902192903192904192905192906192907192908192909192910192911192912192913192914192915192916192917192918192919192920192921192922192923192924192925192926192927192928192929192930192931192932192933192934192935192936192937192938192939192940192941192942192943192944192945192946192947192948192949192950192951192952192953192954192955192956192957192958192959192960192961192962192963192964192965192966192967192968192969192970192971192972192973192974192975192976192977192978192979192980192981192982192983192984192985192986192987192988192989192990192991192992192993192994192995192996192997192998192999193000193001193002193003193004193005193006193007193008193009193010193011193012193013193014193015193016193017193018193019193020193021193022193023193024193025193026193027193028193029193030193031193032193033193034193035193036193037193038193039193040193041193042193043193044193045193046193047193048193049193050193051193052193053193054193055193056193057193058193059193060193061193062193063193064193065193066193067193068193069193070193071193072193073193074193075193076193077193078193079193080193081193082193083193084193085193086193087193088193089193090193091193092193093193094193095193096193097193098193099193100193101193102193103193104193105193106193107193108193109193110193111193112193113193114193115193116193117193118193119193120193121193122193123193124193125193126193127193128193129193130193131193132193133193134193135193136193137193138193139193140193141193142193143193144193145193146193147193148193149193150193151193152193153193154193155193156193157193158193159193160193161193162193163193164193165193166193167193168193169193170193171193172193173193174193175193176193177193178193179193180193181193182193183193184193185193186193187193188193189193190193191193192193193193194193195193196193197193198193199193200193201193202193203193204193205193206193207193208193209193210193211193212193213193214193215193216193217193218193219193220193221193222193223193224193225193226193227193228193229193230193231193232193233193234193235193236193237193238193239193240193241193242193243193244193245193246193247193248193249193250193251193252193253193254193255193256193257193258193259193260193261193262193263193264193265193266193267193268193269193270193271193272193273193274193275193276193277193278193279193280193281193282193283193284193285193286193287193288193289193290193291193292193293193294193295193296193297193298193299193300193301193302193303193304193305193306193307193308193309193310193311193312193313193314193315193316193317193318193319193320193321193322193323193324193325193326193327193328193329193330193331193332193333193334193335193336193337193338193339193340193341193342193343193344193345193346193347193348193349193350193351193352193353193354193355193356193357193358193359193360193361193362193363193364193365193366193367193368193369193370193371193372193373193374193375193376193377193378193379193380193381193382193383193384193385193386193387193388193389193390193391193392193393193394193395193396193397193398193399193400193401193402193403193404193405193406193407193408193409193410193411193412193413193414193415193416193417193418193419193420193421193422193423193424193425193426193427193428193429193430193431193432193433193434193435193436193437193438193439193440193441193442193443193444193445193446193447193448193449193450193451193452193453193454193455193456193457193458193459193460193461193462193463193464193465193466193467193468193469193470193471193472193473193474193475193476193477193478193479193480193481193482193483193484193485193486193487193488193489193490193491193492193493193494193495193496193497193498193499193500193501193502193503193504193505193506193507193508193509193510193511193512193513193514193515193516193517193518193519193520193521193522193523193524193525193526193527193528193529193530193531193532193533193534193535193536193537193538193539193540193541193542193543193544193545193546193547193548193549193550193551193552193553193554193555193556193557193558193559193560193561193562193563193564193565193566193567193568193569193570193571193572193573193574193575193576193577193578193579193580193581193582193583193584193585193586193587193588193589193590193591193592193593193594193595193596193597193598193599193600193601193602193603193604193605193606193607193608193609193610193611193612193613193614193615193616193617193618193619193620193621193622193623193624193625193626193627193628193629193630193631193632193633193634193635193636193637193638193639193640193641193642193643193644193645193646193647193648193649193650193651193652193653193654193655193656193657193658193659193660193661193662193663193664193665193666193667193668193669193670193671193672193673193674193675193676193677193678193679193680193681193682193683193684193685193686193687193688193689193690193691193692193693193694193695193696193697193698193699193700193701193702193703193704193705193706193707193708193709193710193711193712193713193714193715193716193717193718193719193720193721193722193723193724193725193726193727193728193729193730193731193732193733193734193735193736193737193738193739193740193741193742193743193744193745193746193747193748193749193750193751193752193753193754193755193756193757193758193759193760193761193762193763193764193765193766193767193768193769193770193771193772193773193774193775193776193777193778193779193780193781193782193783193784193785193786193787193788193789193790193791193792193793193794193795193796193797193798193799193800193801193802193803193804193805193806193807193808193809193810193811193812193813193814193815193816193817193818193819193820193821193822193823193824193825193826193827193828193829193830193831193832193833193834193835193836193837193838193839193840193841193842193843193844193845193846193847193848193849193850193851193852193853193854193855193856193857193858193859193860193861193862193863193864193865193866193867193868193869193870193871193872193873193874193875193876193877193878193879193880193881193882193883193884193885193886193887193888193889193890193891193892193893193894193895193896193897193898193899193900193901193902193903193904193905193906193907193908193909193910193911193912193913193914193915193916193917193918193919193920193921193922193923193924193925193926193927193928193929193930193931193932193933193934193935193936193937193938193939193940193941193942193943193944193945193946193947193948193949193950193951193952193953193954193955193956193957193958193959193960193961193962193963193964193965193966193967193968193969193970193971193972193973193974193975193976193977193978193979193980193981193982193983193984193985193986193987193988193989193990193991193992193993193994193995193996193997193998193999194000194001194002194003194004194005194006194007194008194009194010194011194012194013194014194015194016194017194018194019194020194021194022194023194024194025194026194027194028194029194030194031194032194033194034194035194036194037194038194039194040194041194042194043194044194045194046194047194048194049194050194051194052194053194054194055194056194057194058194059194060194061194062194063194064194065194066194067194068194069194070194071194072194073194074194075194076194077194078194079194080194081194082194083194084194085194086194087194088194089194090194091194092194093194094194095194096194097194098194099194100194101194102194103194104194105194106194107194108194109194110194111194112194113194114194115194116194117194118194119194120194121194122194123194124194125194126194127194128194129194130194131194132194133194134194135194136194137194138194139194140194141194142194143194144194145194146194147194148194149194150194151194152194153194154194155194156194157194158194159194160194161194162194163194164194165194166194167194168194169194170194171194172194173194174194175194176194177194178194179194180194181194182194183194184194185194186194187194188194189194190194191194192194193194194194195194196194197194198194199194200194201194202194203194204194205194206194207194208194209194210194211194212194213194214194215194216194217194218194219194220194221194222194223194224194225194226194227194228194229194230194231194232194233194234194235194236194237194238194239194240194241194242194243194244194245194246194247194248194249194250194251194252194253194254194255194256194257194258194259194260194261194262194263194264194265194266194267194268194269194270194271194272194273194274194275194276194277194278194279194280194281194282194283194284194285194286194287194288194289194290194291194292194293194294194295194296194297194298194299194300194301194302194303194304194305194306194307194308194309194310194311194312194313194314194315194316194317194318194319194320194321194322194323194324194325194326194327194328194329194330194331194332194333194334194335194336194337194338194339194340194341194342194343194344194345194346194347194348194349194350194351194352194353194354194355194356194357194358194359194360194361194362194363194364194365194366194367194368194369194370194371194372194373194374194375194376194377194378194379194380194381194382194383194384194385194386194387194388194389194390194391194392194393194394194395194396194397194398194399194400194401194402194403194404194405194406194407194408194409194410194411194412194413194414194415194416194417194418194419194420194421194422194423194424194425194426194427194428194429194430194431194432194433194434194435194436194437194438194439194440194441194442194443194444194445194446194447194448194449194450194451194452194453194454194455194456194457194458194459194460194461194462194463194464194465194466194467194468194469194470194471194472194473194474194475194476194477194478194479194480194481194482194483194484194485194486194487194488194489194490194491194492194493194494194495194496194497194498194499194500194501194502194503194504194505194506194507194508194509194510194511194512194513194514194515194516194517194518194519194520194521194522194523194524194525194526194527194528194529194530194531194532194533194534194535194536194537194538194539194540194541194542194543194544194545194546194547194548194549194550194551194552194553194554194555194556194557194558194559194560194561194562194563194564194565194566194567194568194569194570194571194572194573194574194575194576194577194578194579194580194581194582194583194584194585194586194587194588194589194590194591194592194593194594194595194596194597194598194599194600194601194602194603194604194605194606194607194608194609194610194611194612194613194614194615194616194617194618194619194620194621194622194623194624194625194626194627194628194629194630194631194632194633194634194635194636194637194638194639194640194641194642194643194644194645194646194647194648194649194650194651194652194653194654194655194656194657194658194659194660194661194662194663194664194665194666194667194668194669194670194671194672194673194674194675194676194677194678194679194680194681194682194683194684194685194686194687194688194689194690194691194692194693194694194695194696194697194698194699194700194701194702194703194704194705194706194707194708194709194710194711194712194713194714194715194716194717194718194719194720194721194722194723194724194725194726194727194728194729194730194731194732194733194734194735194736194737194738194739194740194741194742194743194744194745194746194747194748194749194750194751194752194753194754194755194756194757194758194759194760194761194762194763194764194765194766194767194768194769194770194771194772194773194774194775194776194777194778194779194780194781194782194783194784194785194786194787194788194789194790194791194792194793194794194795194796194797194798194799194800194801194802194803194804194805194806194807194808194809194810194811194812194813194814194815194816194817194818194819194820194821194822194823194824194825194826194827194828194829194830194831194832194833194834194835194836194837194838194839194840194841194842194843194844194845194846194847194848194849194850194851194852194853194854194855194856194857194858194859194860194861194862194863194864194865194866194867194868194869194870194871194872194873194874194875194876194877194878194879194880194881194882194883194884194885194886194887194888194889194890194891194892194893194894194895194896194897194898194899194900194901194902194903194904194905194906194907194908194909194910194911194912194913194914194915194916194917194918194919194920194921194922194923194924194925194926194927194928194929194930194931194932194933194934194935194936194937194938194939194940194941194942194943194944194945194946194947194948194949194950194951194952194953194954194955194956194957194958194959194960194961194962194963194964194965194966194967194968194969194970194971194972194973194974194975194976194977194978194979194980194981194982194983194984194985194986194987194988194989194990194991194992194993194994194995194996194997194998194999195000195001195002195003195004195005195006195007195008195009195010195011195012195013195014195015195016195017195018195019195020195021195022195023195024195025195026195027195028195029195030195031195032195033195034195035195036195037195038195039195040195041195042195043195044195045195046195047195048195049195050195051195052195053195054195055195056195057195058195059195060195061195062195063195064195065195066195067195068195069195070195071195072195073195074195075195076195077195078195079195080195081195082195083195084195085195086195087195088195089195090195091195092195093195094195095195096195097195098195099195100195101195102195103195104195105195106195107195108195109195110195111195112195113195114195115195116195117195118195119195120195121195122195123195124195125195126195127195128195129195130195131195132195133195134195135195136195137195138195139195140195141195142195143195144195145195146195147195148195149195150195151195152195153195154195155195156195157195158195159195160195161195162195163195164195165195166195167195168195169195170195171195172195173195174195175195176195177195178195179195180195181195182195183195184195185195186195187195188195189195190195191195192195193195194195195195196195197195198195199195200195201195202195203195204195205195206195207195208195209195210195211195212195213195214195215195216195217195218195219195220195221195222195223195224195225195226195227195228195229195230195231195232195233195234195235195236195237195238195239195240195241195242195243195244195245195246195247195248195249195250195251195252195253195254195255195256195257195258195259195260195261195262195263195264195265195266195267195268195269195270195271195272195273195274195275195276195277195278195279195280195281195282195283195284195285195286195287195288195289195290195291195292195293195294195295195296195297195298195299195300195301195302195303195304195305195306195307195308195309195310195311195312195313195314195315195316195317195318195319195320195321195322195323195324195325195326195327195328195329195330195331195332195333195334195335195336195337195338195339195340195341195342195343195344195345195346195347195348195349195350195351195352195353195354195355195356195357195358195359195360195361195362195363195364195365195366195367195368195369195370195371195372195373195374195375195376195377195378195379195380195381195382195383195384195385195386195387195388195389195390195391195392195393195394195395195396195397195398195399195400195401195402195403195404195405195406195407195408195409195410195411195412195413195414195415195416195417195418195419195420195421195422195423195424195425195426195427195428195429195430195431195432195433195434195435195436195437195438195439195440195441195442195443195444195445195446195447195448195449195450195451195452195453195454195455195456195457195458195459195460195461195462195463195464195465195466195467195468195469195470195471195472195473195474195475195476195477195478195479195480195481195482195483195484195485195486195487195488195489195490195491195492195493195494195495195496195497195498195499195500195501195502195503195504195505195506195507195508195509195510195511195512195513195514195515195516195517195518195519195520195521195522195523195524195525195526195527195528195529195530195531195532195533195534195535195536195537195538195539195540195541195542195543195544195545195546195547195548195549195550195551195552195553195554195555195556195557195558195559195560195561195562195563195564195565195566195567195568195569195570195571195572195573195574195575195576195577195578195579195580195581195582195583195584195585195586195587195588195589195590195591195592195593195594195595195596195597195598195599195600195601195602195603195604195605195606195607195608195609195610195611195612195613195614195615195616195617195618195619195620195621195622195623195624195625195626195627195628195629195630195631195632195633195634195635195636195637195638195639195640195641195642195643195644195645195646195647195648195649195650195651195652195653195654195655195656195657195658195659195660195661195662195663195664195665195666195667195668195669195670195671195672195673195674195675195676195677195678195679195680195681195682195683195684195685195686195687195688195689195690195691195692195693195694195695195696195697195698195699195700195701195702195703195704195705195706195707195708195709195710195711195712195713195714195715195716195717195718195719195720195721195722195723195724195725195726195727195728195729195730195731195732195733195734195735195736195737195738195739195740195741195742195743195744195745195746195747195748195749195750195751195752195753195754195755195756195757195758195759195760195761195762195763195764195765195766195767195768195769195770195771195772195773195774195775195776195777195778195779195780195781195782195783195784195785195786195787195788195789195790195791195792195793195794195795195796195797195798195799195800195801195802195803195804195805195806195807195808195809195810195811195812195813195814195815195816195817195818195819195820195821195822195823195824195825195826195827195828195829195830195831195832195833195834195835195836195837195838195839195840195841195842195843195844195845195846195847195848195849195850195851195852195853195854195855195856195857195858195859195860195861195862195863195864195865195866195867195868195869195870195871195872195873195874195875195876195877195878195879195880195881195882195883195884195885195886195887195888195889195890195891195892195893195894195895195896195897195898195899195900195901195902195903195904195905195906195907195908195909195910195911195912195913195914195915195916195917195918195919195920195921195922195923195924195925195926195927195928195929195930195931195932195933195934195935195936195937195938195939195940195941195942195943195944195945195946195947195948195949195950195951195952195953195954195955195956195957195958195959195960195961195962195963195964195965195966195967195968195969195970195971195972195973195974195975195976195977195978195979195980195981195982195983195984195985195986195987195988195989195990195991195992195993195994195995195996195997195998195999196000196001196002196003196004196005196006196007196008196009196010196011196012196013196014196015196016196017196018196019196020196021196022196023196024196025196026196027196028196029196030196031196032196033196034196035196036196037196038196039196040196041196042196043196044196045196046196047196048196049196050196051196052196053196054196055196056196057196058196059196060196061196062196063196064196065196066196067196068196069196070196071196072196073196074196075196076196077196078196079196080196081196082196083196084196085196086196087196088196089196090196091196092196093196094196095196096196097196098196099196100196101196102196103196104196105196106196107196108196109196110196111196112196113196114196115196116196117196118196119196120196121196122196123196124196125196126196127196128196129196130196131196132196133196134196135196136196137196138196139196140196141196142196143196144196145196146196147196148196149196150196151196152196153196154196155196156196157196158196159196160196161196162196163196164196165196166196167196168196169196170196171196172196173196174196175196176196177196178196179196180196181196182196183196184196185196186196187196188196189196190196191196192196193196194196195196196196197196198196199196200196201196202196203196204196205196206196207196208196209196210196211196212196213196214196215196216196217196218196219196220196221196222196223196224196225196226196227196228196229196230196231196232196233196234196235196236196237196238196239196240196241196242196243196244196245196246196247196248196249196250196251196252196253196254196255196256196257196258196259196260196261196262196263196264196265196266196267196268196269196270196271196272196273196274196275196276196277196278196279196280196281196282196283196284196285196286196287196288196289196290196291196292196293196294196295196296196297196298196299196300196301196302196303196304196305196306196307196308196309196310196311196312196313196314196315196316196317196318196319196320196321196322196323196324196325196326196327196328196329196330196331196332196333196334196335196336196337196338196339196340196341196342196343196344196345196346196347196348196349196350196351196352196353196354196355196356196357196358196359196360196361196362196363196364196365196366196367196368196369196370196371196372196373196374196375196376196377196378196379196380196381196382196383196384196385196386196387196388196389196390196391196392196393196394196395196396196397196398196399196400196401196402196403196404196405196406196407196408196409196410196411196412196413196414196415196416196417196418196419196420196421196422196423196424196425196426196427196428196429196430196431196432196433196434196435196436196437196438196439196440196441196442196443196444196445196446196447196448196449196450196451196452196453196454196455196456196457196458196459196460196461196462196463196464196465196466196467196468196469196470196471196472196473196474196475196476196477196478196479196480196481196482196483196484196485196486196487196488196489196490196491196492196493196494196495196496196497196498196499196500196501196502196503196504196505196506196507196508196509196510196511196512196513196514196515196516196517196518196519196520196521196522196523196524196525196526196527196528196529196530196531196532196533196534196535196536196537196538196539196540196541196542196543196544196545196546196547196548196549196550196551196552196553196554196555196556196557196558196559196560196561196562196563196564196565196566196567196568196569196570196571196572196573196574196575196576196577196578196579196580196581196582196583196584196585196586196587196588196589196590196591196592196593196594196595196596196597196598196599196600196601196602196603196604196605196606196607196608196609196610196611196612196613196614196615196616196617196618196619196620196621196622196623196624196625196626196627196628196629196630196631196632196633196634196635196636196637196638196639196640196641196642196643196644196645196646196647196648196649196650196651196652196653196654196655196656196657196658196659196660196661196662196663196664196665196666196667196668196669196670196671196672196673196674196675196676196677196678196679196680196681196682196683196684196685196686196687196688196689196690196691196692196693196694196695196696196697196698196699196700196701196702196703196704196705196706196707196708196709196710196711196712196713196714196715196716196717196718196719196720196721196722196723196724196725196726196727196728196729196730196731196732196733196734196735196736196737196738196739196740196741196742196743196744196745196746196747196748196749196750196751196752196753196754196755196756196757196758196759196760196761196762196763196764196765196766196767196768196769196770196771196772196773196774196775196776196777196778196779196780196781196782196783196784196785196786196787196788196789196790196791196792196793196794196795196796196797196798196799196800196801196802196803196804196805196806196807196808196809196810196811196812196813196814196815196816196817196818196819196820196821196822196823196824196825196826196827196828196829196830196831196832196833196834196835196836196837196838196839196840196841196842196843196844196845196846196847196848196849196850196851196852196853196854196855196856196857196858196859196860196861196862196863196864196865196866196867196868196869196870196871196872196873196874196875196876196877196878196879196880196881196882196883196884196885196886196887196888196889196890196891196892196893196894196895196896196897196898196899196900196901196902196903196904196905196906196907196908196909196910196911196912196913196914196915196916196917196918196919196920196921196922196923196924196925196926196927196928196929196930196931196932196933196934196935196936196937196938196939196940196941196942196943196944196945196946196947196948196949196950196951196952196953196954196955196956196957196958196959196960196961196962196963196964196965196966196967196968196969196970196971196972196973196974196975196976196977196978196979196980196981196982196983196984196985196986196987196988196989196990196991196992196993196994196995196996196997196998196999197000197001197002197003197004197005197006197007197008197009197010197011197012197013197014197015197016197017197018197019197020197021197022197023197024197025197026197027197028197029197030197031197032197033197034197035197036197037197038197039197040197041197042197043197044197045197046197047197048197049197050197051197052197053197054197055197056197057197058197059197060197061197062197063197064197065197066197067197068197069197070197071197072197073197074197075197076197077197078197079197080197081197082197083197084197085197086197087197088197089197090197091197092197093197094197095197096197097197098197099197100197101197102197103197104197105197106197107197108197109197110197111197112197113197114197115197116197117197118197119197120197121197122197123197124197125197126197127197128197129197130197131197132197133197134197135197136197137197138197139197140197141197142197143197144197145197146197147197148197149197150197151197152197153197154197155197156197157197158197159197160197161197162197163197164197165197166197167197168197169197170197171197172197173197174197175197176197177197178197179197180197181197182197183197184197185197186197187197188197189197190197191197192197193197194197195197196197197197198197199197200197201197202197203197204197205197206197207197208197209197210197211197212197213197214197215197216197217197218197219197220197221197222197223197224197225197226197227197228197229197230197231197232197233197234197235197236197237197238197239197240197241197242197243197244197245197246197247197248197249197250197251197252197253197254197255197256197257197258197259197260197261197262197263197264197265197266197267197268197269197270197271197272197273197274197275197276197277197278197279197280197281197282197283197284197285197286197287197288197289197290197291197292197293197294197295197296197297197298197299197300197301197302197303197304197305197306197307197308197309197310197311197312197313197314197315197316197317197318197319197320197321197322197323197324197325197326197327197328197329197330197331197332197333197334197335197336197337197338197339197340197341197342197343197344197345197346197347197348197349197350197351197352197353197354197355197356197357197358197359197360197361197362197363197364197365197366197367197368197369197370197371197372197373197374197375197376197377197378197379197380197381197382197383197384197385197386197387197388197389197390197391197392197393197394197395197396197397197398197399197400197401197402197403197404197405197406197407197408197409197410197411197412197413197414197415197416197417197418197419197420197421197422197423197424197425197426197427197428197429197430197431197432197433197434197435197436197437197438197439197440197441197442197443197444197445197446197447197448197449197450197451197452197453197454197455197456197457197458197459197460197461197462197463197464197465197466197467197468197469197470197471197472197473197474197475197476197477197478197479197480197481197482197483197484197485197486197487197488197489197490197491197492197493197494197495197496197497197498197499197500197501197502197503197504197505197506197507197508197509197510197511197512197513197514197515197516197517197518197519197520197521197522197523197524197525197526197527197528197529197530197531197532197533197534197535197536197537197538197539197540197541197542197543197544197545197546197547197548197549197550197551197552197553197554197555197556197557197558197559197560197561197562197563197564197565197566197567197568197569197570197571197572197573197574197575197576197577197578197579197580197581197582197583197584197585197586197587197588197589197590197591197592197593197594197595197596197597197598197599197600197601197602197603197604197605197606197607197608197609197610197611197612197613197614197615197616197617197618197619197620197621197622197623197624197625197626197627197628197629197630197631197632197633197634197635197636197637197638197639197640197641197642197643197644197645197646197647197648197649197650197651197652197653197654197655197656197657197658197659197660197661197662197663197664197665197666197667197668197669197670197671197672197673197674197675197676197677197678197679197680197681197682197683197684197685197686197687197688197689197690197691197692197693197694197695197696197697197698197699197700197701197702197703197704197705197706197707197708197709197710197711197712197713197714197715197716197717197718197719197720197721197722197723197724197725197726197727197728197729197730197731197732197733197734197735197736197737197738197739197740197741197742197743197744197745197746197747197748197749197750197751197752197753197754197755197756197757197758197759197760197761197762197763197764197765197766197767197768197769197770197771197772197773197774197775197776197777197778197779197780197781197782197783197784197785197786197787197788197789197790197791197792197793197794197795197796197797197798197799197800197801197802197803197804197805197806197807197808197809197810197811197812197813197814197815197816197817197818197819197820197821197822197823197824197825197826197827197828197829197830197831197832197833197834197835197836197837197838197839197840197841197842197843197844197845197846197847197848197849197850197851197852197853197854197855197856197857197858197859197860197861197862197863197864197865197866197867197868197869197870197871197872197873197874197875197876197877197878197879197880197881197882197883197884197885197886197887197888197889197890197891197892197893197894197895197896197897197898197899197900197901197902197903197904197905197906197907197908197909197910197911197912197913197914197915197916197917197918197919197920197921197922197923197924197925197926197927197928197929197930197931197932197933197934197935197936197937197938197939197940197941197942197943197944197945197946197947197948197949197950197951197952197953197954197955197956197957197958197959197960197961197962197963197964197965197966197967197968197969197970197971197972197973197974197975197976197977197978197979197980197981197982197983197984197985197986197987197988197989197990197991197992197993197994197995197996197997197998197999198000198001198002198003198004198005198006198007198008198009198010198011198012198013198014198015198016198017198018198019198020198021198022198023198024198025198026198027198028198029198030198031198032198033198034198035198036198037198038198039198040198041198042198043198044198045198046198047198048198049198050198051198052198053198054198055198056198057198058198059198060198061198062198063198064198065198066198067198068198069198070198071198072198073198074198075198076198077198078198079198080198081198082198083198084198085198086198087198088198089198090198091198092198093198094198095198096198097198098198099198100198101198102198103198104198105198106198107198108198109198110198111198112198113198114198115198116198117198118198119198120198121198122198123198124198125198126198127198128198129198130198131198132198133198134198135198136198137198138198139198140198141198142198143198144198145198146198147198148198149198150198151198152198153198154198155198156198157198158198159198160198161198162198163198164198165198166198167198168198169198170198171198172198173198174198175198176198177198178198179198180198181198182198183198184198185198186198187198188198189198190198191198192198193198194198195198196198197198198198199198200198201198202198203198204198205198206198207198208198209198210198211198212198213198214198215198216198217198218198219198220198221198222198223198224198225198226198227198228198229198230198231198232198233198234198235198236198237198238198239198240198241198242198243198244198245198246198247198248198249198250198251198252198253198254198255198256198257198258198259198260198261198262198263198264198265198266198267198268198269198270198271198272198273198274198275198276198277198278198279198280198281198282198283198284198285198286198287198288198289198290198291198292198293198294198295198296198297198298198299198300198301198302198303198304198305198306198307198308198309198310198311198312198313198314198315198316198317198318198319198320198321198322198323198324198325198326198327198328198329198330198331198332198333198334198335198336198337198338198339198340198341198342198343198344198345198346198347198348198349198350198351198352198353198354198355198356198357198358198359198360198361198362198363198364198365198366198367198368198369198370198371198372198373198374198375198376198377198378198379198380198381198382198383198384198385198386198387198388198389198390198391198392198393198394198395198396198397198398198399198400198401198402198403198404198405198406198407198408198409198410198411198412198413198414198415198416198417198418198419198420198421198422198423198424198425198426198427198428198429198430198431198432198433198434198435198436198437198438198439198440198441198442198443198444198445198446198447198448198449198450198451198452198453198454198455198456198457198458198459198460198461198462198463198464198465198466198467198468198469198470198471198472198473198474198475198476198477198478198479198480198481198482198483198484198485198486198487198488198489198490198491198492198493198494198495198496198497198498198499198500198501198502198503198504198505198506198507198508198509198510198511198512198513198514198515198516198517198518198519198520198521198522198523198524198525198526198527198528198529198530198531198532198533198534198535198536198537198538198539198540198541198542198543198544198545198546198547198548198549198550198551198552198553198554198555198556198557198558198559198560198561198562198563198564198565198566198567198568198569198570198571198572198573198574198575198576198577198578198579198580198581198582198583198584198585198586198587198588198589198590198591198592198593198594198595198596198597198598198599198600198601198602198603198604198605198606198607198608198609198610198611198612198613198614198615198616198617198618198619198620198621198622198623198624198625198626198627198628198629198630198631198632198633198634198635198636198637198638198639198640198641198642198643198644198645198646198647198648198649198650198651198652198653198654198655198656198657198658198659198660198661198662198663198664198665198666198667198668198669198670198671198672198673198674198675198676198677198678198679198680198681198682198683198684198685198686198687198688198689198690198691198692198693198694198695198696198697198698198699198700198701198702198703198704198705198706198707198708198709198710198711198712198713198714198715198716198717198718198719198720198721198722198723198724198725198726198727198728198729198730198731198732198733198734198735198736198737198738198739198740198741198742198743198744198745198746198747198748198749198750198751198752198753198754198755198756198757198758198759198760198761198762198763198764198765198766198767198768198769198770198771198772198773198774198775198776198777198778198779198780198781198782198783198784198785198786198787198788198789198790198791198792198793198794198795198796198797198798198799198800198801198802198803198804198805198806198807198808198809198810198811198812198813198814198815198816198817198818198819198820198821198822198823198824198825198826198827198828198829198830198831198832198833198834198835198836198837198838198839198840198841198842198843198844198845198846198847198848198849198850198851198852198853198854198855198856198857198858198859198860198861198862198863198864198865198866198867198868198869198870198871198872198873198874198875198876198877198878198879198880198881198882198883198884198885198886198887198888198889198890198891198892198893198894198895198896198897198898198899198900198901198902198903198904198905198906198907198908198909198910198911198912198913198914198915198916198917198918198919198920198921198922198923198924198925198926198927198928198929198930198931198932198933198934198935198936198937198938198939198940198941198942198943198944198945198946198947198948198949198950198951198952198953198954198955198956198957198958198959198960198961198962198963198964198965198966198967198968198969198970198971198972198973198974198975198976198977198978198979198980198981198982198983198984198985198986198987198988198989198990198991198992198993198994198995198996198997198998198999199000199001199002199003199004199005199006199007199008199009199010199011199012199013199014199015199016199017199018199019199020199021199022199023199024199025199026199027199028199029199030199031199032199033199034199035199036199037199038199039199040199041199042199043199044199045199046199047199048199049199050199051199052199053199054199055199056199057199058199059199060199061199062199063199064199065199066199067199068199069199070199071199072199073199074199075199076199077199078199079199080199081199082199083199084199085199086199087199088199089199090199091199092199093199094199095199096199097199098199099199100199101199102199103199104199105199106199107199108199109199110199111199112199113199114199115199116199117199118199119199120199121199122199123199124199125199126199127199128199129199130199131199132199133199134199135199136199137199138199139199140199141199142199143199144199145199146199147199148199149199150199151199152199153199154199155199156199157199158199159199160199161199162199163199164199165199166199167199168199169199170199171199172199173199174199175199176199177199178199179199180199181199182199183199184199185199186199187199188199189199190199191199192199193199194199195199196199197199198199199199200199201199202199203199204199205199206199207199208199209199210199211199212199213199214199215199216199217199218199219199220199221199222199223199224199225199226199227199228199229199230199231199232199233199234199235199236199237199238199239199240199241199242199243199244199245199246199247199248199249199250199251199252199253199254199255199256199257199258199259199260199261199262199263199264199265199266199267199268199269199270199271199272199273199274199275199276199277199278199279199280199281199282199283199284199285199286199287199288199289199290199291199292199293199294199295199296199297199298199299199300199301199302199303199304199305199306199307199308199309199310199311199312199313199314199315199316199317199318199319199320199321199322199323199324199325199326199327199328199329199330199331199332199333199334199335199336199337199338199339199340199341199342199343199344199345199346199347199348199349199350199351199352199353199354199355199356199357199358199359199360199361199362199363199364199365199366199367199368199369199370199371199372199373199374199375199376199377199378199379199380199381199382199383199384199385199386199387199388199389199390199391199392199393199394199395199396199397199398199399199400199401199402199403199404199405199406199407199408199409199410199411199412199413199414199415199416199417199418199419199420199421199422199423199424199425199426199427199428199429199430199431199432199433199434199435199436199437199438199439199440199441199442199443199444199445199446199447199448199449199450199451199452199453199454199455199456199457199458199459199460199461199462199463199464199465199466199467199468199469199470199471199472199473199474199475199476199477199478199479199480199481199482199483199484199485199486199487199488199489199490199491199492199493199494199495199496199497199498199499199500199501199502199503199504199505199506199507199508199509199510199511199512199513199514199515199516199517199518199519199520199521199522199523199524199525199526199527199528199529199530199531199532199533199534199535199536199537199538199539199540199541199542199543199544199545199546199547199548199549199550199551199552199553199554199555199556199557199558199559199560199561199562199563199564199565199566199567199568199569199570199571199572199573199574199575199576199577199578199579199580199581199582199583199584199585199586199587199588199589199590199591199592199593199594199595199596199597199598199599199600199601199602199603199604199605199606199607199608199609199610199611199612199613199614199615199616199617199618199619199620199621199622199623199624199625199626199627199628199629199630199631199632199633199634199635199636199637199638199639199640199641199642199643199644199645199646199647199648199649199650199651199652199653199654199655199656199657199658199659199660199661199662199663199664199665199666199667199668199669199670199671199672199673199674199675199676199677199678199679199680199681199682199683199684199685199686199687199688199689199690199691199692199693199694199695199696199697199698199699199700199701199702199703199704199705199706199707199708199709199710199711199712199713199714199715199716199717199718199719199720199721199722199723199724199725199726199727199728199729199730199731199732199733199734199735199736199737199738199739199740199741199742199743199744199745199746199747199748199749199750199751199752199753199754199755199756199757199758199759199760199761199762199763199764199765199766199767199768199769199770199771199772199773199774199775199776199777199778199779199780199781199782199783199784199785199786199787199788199789199790199791199792199793199794199795199796199797199798199799199800199801199802199803199804199805199806199807199808199809199810199811199812199813199814199815199816199817199818199819199820199821199822199823199824199825199826199827199828199829199830199831199832199833199834199835199836199837199838199839199840199841199842199843199844199845199846199847199848199849199850199851199852199853199854199855199856199857199858199859199860199861199862199863199864199865199866199867199868199869199870199871199872199873199874199875199876199877199878199879199880199881199882199883199884199885199886199887199888199889199890199891199892199893199894199895199896199897199898199899199900199901199902199903199904199905199906199907199908199909199910199911199912199913199914199915199916199917199918199919199920199921199922199923199924199925199926199927199928199929199930199931199932199933199934199935199936199937199938199939199940199941199942199943199944199945199946199947199948199949199950199951199952199953199954199955199956199957199958199959199960199961199962199963199964199965199966199967199968199969199970199971199972199973199974199975199976199977199978199979199980199981199982199983199984199985199986199987199988199989199990199991199992199993199994199995199996199997199998199999200000200001200002200003200004200005200006200007200008200009200010200011200012200013200014200015200016200017200018200019200020200021200022200023200024200025200026200027200028200029200030200031200032200033200034200035200036200037200038200039200040200041200042200043200044200045200046200047200048200049200050200051200052200053200054200055200056200057200058200059200060200061200062200063200064200065200066200067200068200069200070200071200072200073200074200075200076200077200078200079200080200081200082200083200084200085200086200087200088200089200090200091200092200093200094200095200096200097200098200099200100200101200102200103200104200105200106200107200108200109200110200111200112200113200114200115200116200117200118200119200120200121200122200123200124200125200126200127200128200129200130200131200132200133200134200135200136200137200138200139200140200141200142200143200144200145200146200147200148200149200150200151200152200153200154200155200156200157200158200159200160200161200162200163200164200165200166200167200168200169200170200171200172200173200174200175200176200177200178200179200180200181200182200183200184200185200186200187200188200189200190200191200192200193200194200195200196200197200198200199200200200201200202200203200204200205200206200207200208200209200210200211200212200213200214200215200216200217200218200219200220200221200222200223200224200225200226200227200228200229200230200231200232200233200234200235200236200237200238200239200240200241200242200243200244200245200246200247200248200249200250200251200252200253200254200255200256200257200258200259200260200261200262200263200264200265200266200267200268200269200270200271200272200273200274200275200276200277200278200279200280200281200282200283200284200285200286200287200288200289200290200291200292200293200294200295200296200297200298200299200300200301200302200303200304200305200306200307200308200309200310200311200312200313200314200315200316200317200318200319200320200321200322200323200324200325200326200327200328200329200330200331200332200333200334200335200336200337200338200339200340200341200342200343200344200345200346200347200348200349200350200351200352200353200354200355200356200357200358200359200360200361200362200363200364200365200366200367200368200369200370200371200372200373200374200375200376200377200378200379200380200381200382200383200384200385200386200387200388200389200390200391200392200393200394200395200396200397200398200399200400200401200402200403200404200405200406200407200408200409200410200411200412200413200414200415200416200417200418200419200420200421200422200423200424200425200426200427200428200429200430200431200432200433200434200435200436200437200438200439200440200441200442200443200444200445200446200447200448200449200450200451200452200453200454200455200456200457200458200459200460200461200462200463200464200465200466200467200468200469200470200471200472200473200474200475200476200477200478200479200480200481200482200483200484200485200486200487200488200489200490200491200492200493200494200495200496200497200498200499200500200501200502200503200504200505200506200507200508200509200510200511200512200513200514200515200516200517200518200519200520200521200522200523200524200525200526200527200528200529200530200531200532200533200534200535200536200537200538200539200540200541200542200543200544200545200546200547200548200549200550200551200552200553200554200555200556200557200558200559200560200561200562200563200564200565200566200567200568200569200570200571200572200573200574200575200576200577200578200579200580200581200582200583200584200585200586200587200588200589200590200591200592200593200594200595200596200597200598200599200600200601200602200603200604200605200606200607200608200609200610200611200612200613200614200615200616200617200618200619200620200621200622200623200624200625200626200627200628200629200630200631200632200633200634200635200636200637200638200639200640200641200642200643200644200645200646200647200648200649200650200651200652200653200654200655200656200657200658200659200660200661200662200663200664200665200666200667200668200669200670200671200672200673200674200675200676200677200678200679200680200681200682200683200684200685200686200687200688200689200690200691200692200693200694200695200696200697200698200699200700200701200702200703200704200705200706200707200708200709200710200711200712200713200714200715200716200717200718200719200720200721200722200723200724200725200726200727200728200729200730200731200732200733200734200735200736200737200738200739200740200741200742200743200744200745200746200747200748200749200750200751200752200753200754200755200756200757200758200759200760200761200762200763200764200765200766200767200768200769200770200771200772200773200774200775200776200777200778200779200780200781200782200783200784200785200786200787200788200789200790200791200792200793200794200795200796200797200798200799200800200801200802200803200804200805200806200807200808200809200810200811200812200813200814200815200816200817200818200819200820200821200822200823200824200825200826200827200828200829200830200831200832200833200834200835200836200837200838200839200840200841200842200843200844200845200846200847200848200849200850200851200852200853200854200855200856200857200858200859200860200861200862200863200864200865200866200867200868200869200870200871200872200873200874200875200876200877200878200879200880200881200882200883200884200885200886200887200888200889200890200891200892200893200894200895200896200897200898200899200900200901200902200903200904200905200906200907200908200909200910200911200912200913200914200915200916200917200918200919200920200921200922200923200924200925200926200927200928200929200930200931200932200933200934200935200936200937200938200939200940200941200942200943200944200945200946200947200948200949200950200951200952200953200954200955200956200957200958200959200960200961200962200963200964200965200966200967200968200969200970200971200972200973200974200975200976200977200978200979200980200981200982200983200984200985200986200987200988200989200990200991200992200993200994200995200996200997200998200999201000201001201002201003201004201005201006201007201008201009201010201011201012201013201014201015201016201017201018201019201020201021201022201023201024201025201026201027201028201029201030201031201032201033201034201035201036201037201038201039201040201041201042201043201044201045201046201047201048201049201050201051201052201053201054201055201056201057201058201059201060201061201062201063201064201065201066201067201068201069201070201071201072201073201074201075201076201077201078201079201080201081201082201083201084201085201086201087201088201089201090201091201092201093201094201095201096201097201098201099201100201101201102201103201104201105201106201107201108201109201110201111201112201113201114201115201116201117201118201119201120201121201122201123201124201125201126201127201128201129201130201131201132201133201134201135201136201137201138201139201140201141201142201143201144201145201146201147201148201149201150201151201152201153201154201155201156201157201158201159201160201161201162201163201164201165201166201167201168201169201170201171201172201173201174201175201176201177201178201179201180201181201182201183201184201185201186201187201188201189201190201191201192201193201194201195201196201197201198201199201200201201201202201203201204201205201206201207201208201209201210201211201212201213201214201215201216201217201218201219201220201221201222201223201224201225201226201227201228201229201230201231201232201233201234201235201236201237201238201239201240201241201242201243201244201245201246201247201248201249201250201251201252201253201254201255201256201257201258201259201260201261201262201263201264201265201266201267201268201269201270201271201272201273201274201275201276201277201278201279201280201281201282201283201284201285201286201287201288201289201290201291201292201293201294201295201296201297201298201299201300201301201302201303201304201305201306201307201308201309201310201311201312201313201314201315201316201317201318201319201320201321201322201323201324201325201326201327201328201329201330201331201332201333201334201335201336201337201338201339201340201341201342201343201344201345201346201347201348201349201350201351201352201353201354201355201356201357201358201359201360201361201362201363201364201365201366201367201368201369201370201371201372201373201374201375201376201377201378201379201380201381201382201383201384201385201386201387201388201389201390201391201392201393201394201395201396201397201398201399201400201401201402201403201404201405201406201407201408201409201410201411201412201413201414201415201416201417201418201419201420201421201422201423201424201425201426201427201428201429201430201431201432201433201434201435201436201437201438201439201440201441201442201443201444201445201446201447201448201449201450201451201452201453201454201455201456201457201458201459201460201461201462201463201464201465201466201467201468201469201470201471201472201473201474201475201476201477201478201479201480201481201482201483201484201485201486201487201488201489201490201491201492201493201494201495201496201497201498201499201500201501201502201503201504201505201506201507201508201509201510201511201512201513201514201515201516201517201518201519201520201521201522201523201524201525201526201527201528201529201530201531201532201533201534201535201536201537201538201539201540201541201542201543201544201545201546201547201548201549201550201551201552201553201554201555201556201557201558201559201560201561201562201563201564201565201566201567201568201569201570201571201572201573201574201575201576201577201578201579201580201581201582201583201584201585201586201587201588201589201590201591201592201593201594201595201596201597201598201599201600201601201602201603201604201605201606201607201608201609201610201611201612201613201614201615201616201617201618201619201620201621201622201623201624201625201626201627201628201629201630201631201632201633201634201635201636201637201638201639201640201641201642201643201644201645201646201647201648201649201650201651201652201653201654201655201656201657201658201659201660201661201662201663201664201665201666201667201668201669201670201671201672201673201674201675201676201677201678201679201680201681201682201683201684201685201686201687201688201689201690201691201692201693201694201695201696201697201698201699201700201701201702201703201704201705201706201707201708201709201710201711201712201713201714201715201716201717201718201719201720201721201722201723201724201725201726201727201728201729201730201731201732201733201734201735201736201737201738201739201740201741201742201743201744201745201746201747201748201749201750201751201752201753201754201755201756201757201758201759201760201761201762201763201764201765201766201767201768201769201770201771201772201773201774201775201776201777201778201779201780201781201782201783201784201785201786201787201788201789201790201791201792201793201794201795201796201797201798201799201800201801201802201803201804201805201806201807201808201809201810201811201812201813201814201815201816201817201818201819201820201821201822201823201824201825201826201827201828201829201830201831201832201833201834201835201836201837201838201839201840201841201842201843201844201845201846201847201848201849201850201851201852201853201854201855201856201857201858201859201860201861201862201863201864201865201866201867201868201869201870201871201872201873201874201875201876201877201878201879201880201881201882201883201884201885201886201887201888201889201890201891201892201893201894201895201896201897201898201899201900201901201902201903201904201905201906201907201908201909201910201911201912201913201914201915201916201917201918201919201920201921201922201923201924201925201926201927201928201929201930201931201932201933201934201935201936201937201938201939201940201941201942201943201944201945201946201947201948201949201950201951201952201953201954201955201956201957201958201959201960201961201962201963201964201965201966201967201968201969201970201971201972201973201974201975201976201977201978201979201980201981201982201983201984201985201986201987201988201989201990201991201992201993201994201995201996201997201998201999202000202001202002202003202004202005202006202007202008202009202010202011202012202013202014202015202016202017202018202019202020202021202022202023202024202025202026202027202028202029202030202031202032202033202034202035202036202037202038202039202040202041202042202043202044202045202046202047202048202049202050202051202052202053202054202055202056202057202058202059202060202061202062202063202064202065202066202067202068202069202070202071202072202073202074202075202076202077202078202079202080202081202082202083202084202085202086202087202088202089202090202091202092202093202094202095202096202097202098202099202100202101202102202103202104202105202106202107202108202109202110202111202112202113202114202115202116202117202118202119202120202121202122202123202124202125202126202127202128202129202130202131202132202133202134202135202136202137202138202139202140202141202142202143202144202145202146202147202148202149202150202151202152202153202154202155202156202157202158202159202160202161202162202163202164202165202166202167202168202169202170202171202172202173202174202175202176202177202178202179202180202181202182202183202184202185202186202187202188202189202190202191202192202193202194202195202196202197202198202199202200202201202202202203202204202205202206202207202208202209202210202211202212202213202214202215202216202217202218202219202220202221202222202223202224202225202226202227202228202229202230202231202232202233202234202235202236202237202238202239202240202241202242202243202244202245202246202247202248202249202250202251202252202253202254202255202256202257202258202259202260202261202262202263202264202265202266202267202268202269202270202271202272202273202274202275202276202277202278202279202280202281202282202283202284202285202286202287202288202289202290202291202292202293202294202295202296202297202298202299202300202301202302202303202304202305202306202307202308202309202310202311202312202313202314202315202316202317202318202319202320202321202322202323202324202325202326202327202328202329202330202331202332202333202334202335202336202337202338202339202340202341202342202343202344202345202346202347202348202349202350202351202352202353202354202355202356202357202358202359202360202361202362202363202364202365202366202367202368202369202370202371202372202373202374202375202376202377202378202379202380202381202382202383202384202385202386202387202388202389202390202391202392202393202394202395202396202397202398202399202400202401202402202403202404202405202406202407202408202409202410202411202412202413202414202415202416202417202418202419202420202421202422202423202424202425202426202427202428202429202430202431202432202433202434202435202436202437202438202439202440202441202442202443202444202445202446202447202448202449202450202451202452202453202454202455202456202457202458202459202460202461202462202463202464202465202466202467202468202469202470202471202472202473202474202475202476202477202478202479202480202481202482202483202484202485202486202487202488202489202490202491202492202493202494202495202496202497202498202499202500202501202502202503202504202505202506202507202508202509202510202511202512202513202514202515202516202517202518202519202520202521202522202523202524202525202526202527202528202529202530202531202532202533202534202535202536202537202538202539202540202541202542202543202544202545202546202547202548202549202550202551202552202553202554202555202556202557202558202559202560202561202562202563202564202565202566202567202568202569202570202571202572202573202574202575202576202577202578202579202580202581202582202583202584202585202586202587202588202589202590202591202592202593202594202595202596202597202598202599202600202601202602202603202604202605202606202607202608202609202610202611202612202613202614202615202616202617202618202619202620202621202622202623202624202625202626202627202628202629202630202631202632202633202634202635202636202637202638202639202640202641202642202643202644202645202646202647202648202649202650202651202652202653202654202655202656202657202658202659202660202661202662202663202664202665202666202667202668202669202670202671202672202673202674202675202676202677202678202679202680202681202682202683202684202685202686202687202688202689202690202691202692202693202694202695202696202697202698202699202700202701202702202703202704202705202706202707202708202709202710202711202712202713202714202715202716202717202718202719202720202721202722202723202724202725202726202727202728202729202730202731202732202733202734202735202736202737202738202739202740202741202742202743202744202745202746202747202748202749202750202751202752202753202754202755202756202757202758202759202760202761202762202763202764202765202766202767202768202769202770202771202772202773202774202775202776202777202778202779202780202781202782202783202784202785202786202787202788202789202790202791202792202793202794202795202796202797202798202799202800202801202802202803202804202805202806202807202808202809202810202811202812202813202814202815202816202817202818202819202820202821202822202823202824202825202826202827202828202829202830202831202832202833202834202835202836202837202838202839202840202841202842202843202844202845202846202847202848202849202850202851202852202853202854202855202856202857202858202859202860202861202862202863202864202865202866202867202868202869202870202871202872202873202874202875202876202877202878202879202880202881202882202883202884202885202886202887202888202889202890202891202892202893202894202895202896202897202898202899202900202901202902202903202904202905202906202907202908202909202910202911202912202913202914202915202916202917202918202919202920202921202922202923202924202925202926202927202928202929202930202931202932202933202934202935202936202937202938202939202940202941202942202943202944202945202946202947202948202949202950202951202952202953202954202955202956202957202958202959202960202961202962202963202964202965202966202967202968202969202970202971202972202973202974202975202976202977202978202979202980202981202982202983202984202985202986202987202988202989202990202991202992202993202994202995202996202997202998202999203000203001203002203003203004203005203006203007203008203009203010203011203012203013203014203015203016203017203018203019203020203021203022203023203024203025203026203027203028203029203030203031203032203033203034203035203036203037203038203039203040203041203042203043203044203045203046203047203048203049203050203051203052203053203054203055203056203057203058203059203060203061203062203063203064203065203066203067203068203069203070203071203072203073203074203075203076203077203078203079203080203081203082203083203084203085203086203087203088203089203090203091203092203093203094203095203096203097203098203099203100203101203102203103203104203105203106203107203108203109203110203111203112203113203114203115203116203117203118203119203120203121203122203123203124203125203126203127203128203129203130203131203132203133203134203135203136203137203138203139203140203141203142203143203144203145203146203147203148203149203150203151203152203153203154203155203156203157203158203159203160203161203162203163203164203165203166203167203168203169203170203171203172203173203174203175203176203177203178203179203180203181203182203183203184203185203186203187203188203189203190203191203192203193203194203195203196203197203198203199203200203201203202203203203204203205203206203207203208203209203210203211203212203213203214203215203216203217203218203219203220203221203222203223203224203225203226203227203228203229203230203231203232203233203234203235203236203237203238203239203240203241203242203243203244203245203246203247203248203249203250203251203252203253203254203255203256203257203258203259203260203261203262203263203264203265203266203267203268203269203270203271203272203273203274203275203276203277203278203279203280203281203282203283203284203285203286203287203288203289203290203291203292203293203294203295203296203297203298203299203300203301203302203303203304203305203306203307203308203309203310203311203312203313203314203315203316203317203318203319203320203321203322203323203324203325203326203327203328203329203330203331203332203333203334203335203336203337203338203339203340203341203342203343203344203345203346203347203348203349203350203351203352203353203354203355203356203357203358203359203360203361203362203363203364203365203366203367203368203369203370203371203372203373203374203375203376203377203378203379203380203381203382203383203384203385203386203387203388203389203390203391203392203393203394203395203396203397203398203399203400203401203402203403203404203405203406203407203408203409203410203411203412203413203414203415203416203417203418203419203420203421203422203423203424203425203426203427203428203429203430203431203432203433203434203435203436203437203438203439203440203441203442203443203444203445203446203447203448203449203450203451203452203453203454203455203456203457203458203459203460203461203462203463203464203465203466203467203468203469203470203471203472203473203474203475203476203477203478203479203480203481203482203483203484203485203486203487203488203489203490203491203492203493203494203495203496203497203498203499203500203501203502203503203504203505203506203507203508203509203510203511203512203513203514203515203516203517203518203519203520203521203522203523203524203525203526203527203528203529203530203531203532203533203534203535203536203537203538203539203540203541203542203543203544203545203546203547203548203549203550203551203552203553203554203555203556203557203558203559203560203561203562203563203564203565203566203567203568203569203570203571203572203573203574203575203576203577203578203579203580203581203582203583203584203585203586203587203588203589203590203591203592203593203594203595203596203597203598203599203600203601203602203603203604203605203606203607203608203609203610203611203612203613203614203615203616203617203618203619203620203621203622203623203624203625203626203627203628203629203630203631203632203633203634203635203636203637203638203639203640203641203642203643203644203645203646203647203648203649203650203651203652203653203654203655203656203657203658203659203660203661203662203663203664203665203666203667203668203669203670203671203672203673203674203675203676203677203678203679203680203681203682203683203684203685203686203687203688203689203690203691203692203693203694203695203696203697203698203699203700203701203702203703203704203705203706203707203708203709203710203711203712203713203714203715203716203717203718203719203720203721203722203723203724203725203726203727203728203729203730203731203732203733203734203735203736203737203738203739203740203741203742203743203744203745203746203747203748203749203750203751203752203753203754203755203756203757203758203759203760203761203762203763203764203765203766203767203768203769203770203771203772203773203774203775203776203777203778203779203780203781203782203783203784203785203786203787203788203789203790203791203792203793203794203795203796203797203798203799203800203801203802203803203804203805203806203807203808203809203810203811203812203813203814203815203816203817203818203819203820203821203822203823203824203825203826203827203828203829203830203831203832203833203834203835203836203837203838203839203840203841203842203843203844203845203846203847203848203849203850203851203852203853203854203855203856203857203858203859203860203861203862203863203864203865203866203867203868203869203870203871203872203873203874203875203876203877203878203879203880203881203882203883203884203885203886203887203888203889203890203891203892203893203894203895203896203897203898203899203900203901203902203903203904203905203906203907203908203909203910203911203912203913203914203915203916203917203918203919203920203921203922203923203924203925203926203927203928203929203930203931203932203933203934203935203936203937203938203939203940203941203942203943203944203945203946203947203948203949203950203951203952203953203954203955203956203957203958203959203960203961203962203963203964203965203966203967203968203969203970203971203972203973203974203975203976203977203978203979203980203981203982203983203984203985203986203987203988203989203990203991203992203993203994203995203996203997203998203999204000204001204002204003204004204005204006204007204008204009204010204011204012204013204014204015204016204017204018204019204020204021204022204023204024204025204026204027204028204029204030204031204032204033204034204035204036204037204038204039204040204041204042204043204044204045204046204047204048204049204050204051204052204053204054204055204056204057204058204059204060204061204062204063204064204065204066204067204068204069204070204071204072204073204074204075204076204077204078204079204080204081204082204083204084204085204086204087204088204089204090204091204092204093204094204095204096204097204098204099204100204101204102204103204104204105204106204107204108204109204110204111204112204113204114204115204116204117204118204119204120204121204122204123204124204125204126204127204128204129204130204131204132204133204134204135204136204137204138204139204140204141204142204143204144204145204146204147204148204149204150204151204152204153204154204155204156204157204158204159204160204161204162204163204164204165204166204167204168204169204170204171204172204173204174204175204176204177204178204179204180204181204182204183204184204185204186204187204188204189204190204191204192204193204194204195204196204197204198204199204200204201204202204203204204204205204206204207204208204209204210204211204212204213204214204215204216204217204218204219204220204221204222204223204224204225204226204227204228204229204230204231204232204233204234204235204236204237204238204239204240204241204242204243204244204245204246204247204248204249204250204251204252204253204254204255204256204257204258204259204260204261204262204263204264204265204266204267204268204269204270204271204272204273204274204275204276204277204278204279204280204281204282204283204284204285204286204287204288204289204290204291204292204293204294204295204296204297204298204299204300204301204302204303204304204305204306204307204308204309204310204311204312204313204314204315204316204317204318204319204320204321204322204323204324204325204326204327204328204329204330204331204332204333204334204335204336204337204338204339204340204341204342204343204344204345204346204347204348204349204350204351204352204353204354204355204356204357204358204359204360204361204362204363204364204365204366204367204368204369204370204371204372204373204374204375204376204377204378204379204380204381204382204383204384204385204386204387204388204389204390204391204392204393204394204395204396204397204398204399204400204401204402204403204404204405204406204407204408204409204410204411204412204413204414204415204416204417204418204419204420204421204422204423204424204425204426204427204428204429204430204431204432204433204434204435204436204437204438204439204440204441204442204443204444204445204446204447204448204449204450204451204452204453204454204455204456204457204458204459204460204461204462204463204464204465204466204467204468204469204470204471204472204473204474204475204476204477204478204479204480204481204482204483204484204485204486204487204488204489204490204491204492204493204494204495204496204497204498204499204500204501204502204503204504204505204506204507204508204509204510204511204512204513204514204515204516204517204518204519204520204521204522204523204524204525204526204527204528204529204530204531204532204533204534204535204536204537204538204539204540204541204542204543204544204545204546204547204548204549204550204551204552204553204554204555204556204557204558204559204560204561204562204563204564204565204566204567204568204569204570204571204572204573204574204575204576204577204578204579204580204581204582204583204584204585204586204587204588204589204590204591204592204593204594204595204596204597204598204599204600204601204602204603204604204605204606204607204608204609204610204611204612204613204614204615204616204617204618204619204620204621204622204623204624204625204626204627204628204629204630204631204632204633204634204635204636204637204638204639204640204641204642204643204644204645204646204647204648204649204650204651204652204653204654204655204656204657204658204659204660204661204662204663204664204665204666204667204668204669204670204671204672204673204674204675204676204677204678204679204680204681204682204683204684204685204686204687204688204689204690204691204692204693204694204695204696204697204698204699204700204701204702204703204704204705204706204707204708204709204710204711204712204713204714204715204716204717204718204719204720204721204722204723204724204725204726204727204728204729204730204731204732204733204734204735204736204737204738204739204740204741204742204743204744204745204746204747204748204749204750204751204752204753204754204755204756204757204758204759204760204761204762204763204764204765204766204767204768204769204770204771204772204773204774204775204776204777204778204779204780204781204782204783204784204785204786204787204788204789204790204791204792204793204794204795204796204797204798204799204800204801204802204803204804204805204806204807204808204809204810204811204812204813204814204815204816204817204818204819204820204821204822204823204824204825204826204827204828204829204830204831204832204833204834204835204836204837204838204839204840204841204842204843204844204845204846204847204848204849204850204851204852204853204854204855204856204857204858204859204860204861204862204863204864204865204866204867204868204869204870204871204872204873204874204875204876204877204878204879204880204881204882204883204884204885204886204887204888204889204890204891204892204893204894204895204896204897204898204899204900204901204902204903204904204905204906204907204908204909204910204911204912204913204914204915204916204917204918204919204920204921204922204923204924204925204926204927204928204929204930204931204932204933204934204935204936204937204938204939204940204941204942204943204944204945204946204947204948204949204950204951204952204953204954204955204956204957204958204959204960204961204962204963204964204965204966204967204968204969204970204971204972204973204974204975204976204977204978204979204980204981204982204983204984204985204986204987204988204989204990204991204992204993204994204995204996204997204998204999205000205001205002205003205004205005205006205007205008205009205010205011205012205013205014205015205016205017205018205019205020205021205022205023205024205025205026205027205028205029205030205031205032205033205034205035205036205037205038205039205040205041205042205043205044205045205046205047205048205049205050205051205052205053205054205055205056205057205058205059205060205061205062205063205064205065205066205067205068205069205070205071205072205073205074205075205076205077205078205079205080205081205082205083205084205085205086205087205088205089205090205091205092205093205094205095205096205097205098205099205100205101205102205103205104205105205106205107205108205109205110205111205112205113205114205115205116205117205118205119205120205121205122205123205124205125205126205127205128205129205130205131205132205133205134205135205136205137205138205139205140205141205142205143205144205145205146205147205148205149205150205151205152205153205154205155205156205157205158205159205160205161205162205163205164205165205166205167205168205169205170205171205172205173205174205175205176205177205178205179205180205181205182205183205184205185205186205187205188205189205190205191205192205193205194205195205196205197205198205199205200205201205202205203205204205205205206205207205208205209205210205211205212205213205214205215205216205217205218205219205220205221205222205223205224205225205226205227205228205229205230205231205232205233205234205235205236205237205238205239205240205241205242205243205244205245205246205247205248205249205250205251205252205253205254205255205256205257205258205259205260205261205262205263205264205265205266205267205268205269205270205271205272205273205274205275205276205277205278205279205280205281205282205283205284205285205286205287205288205289205290205291205292205293205294205295205296205297205298205299205300205301205302205303205304205305205306205307205308205309205310205311205312205313205314205315205316205317205318205319205320205321205322205323205324205325205326205327205328205329205330205331205332205333205334205335205336205337205338205339205340205341205342205343205344205345205346205347205348205349205350205351205352205353205354205355205356205357205358205359205360205361205362205363205364205365205366205367205368205369205370205371205372205373205374205375205376205377205378205379205380205381205382205383205384205385205386205387205388205389205390205391205392205393205394205395205396205397205398205399205400205401205402205403205404205405205406205407205408205409205410205411205412205413205414205415205416205417205418205419205420205421205422205423205424205425205426205427205428205429205430205431205432205433205434205435205436205437205438205439205440205441205442205443205444205445205446205447205448205449205450205451205452205453205454205455205456205457205458205459205460205461205462205463205464205465205466205467205468205469205470205471205472205473205474205475205476205477205478205479205480205481205482205483205484205485205486205487205488205489205490205491205492205493205494205495205496205497205498205499205500205501205502205503205504205505205506205507205508205509205510205511205512205513205514205515205516205517205518205519205520205521205522205523205524205525205526205527205528205529205530205531205532205533205534205535205536205537205538205539205540205541205542205543205544205545205546205547205548205549205550205551205552205553205554205555205556205557205558205559205560205561205562205563205564205565205566205567205568205569205570205571205572205573205574205575205576205577205578205579205580205581205582205583205584205585205586205587205588205589205590205591205592205593205594205595205596205597205598205599205600205601205602205603205604205605205606205607205608205609205610205611205612205613205614205615205616205617205618205619205620205621205622205623205624205625205626205627205628205629205630205631205632205633205634205635205636205637205638205639205640205641205642205643205644205645205646205647205648205649205650205651205652205653205654205655205656205657205658205659205660205661205662205663205664205665205666205667205668205669205670205671205672205673205674205675205676205677205678205679205680205681205682205683205684205685205686205687205688205689205690205691205692205693205694205695205696205697205698205699205700205701205702205703205704205705205706205707205708205709205710205711205712205713205714205715205716205717205718205719205720205721205722205723205724205725205726205727205728205729205730205731205732205733205734205735205736205737205738205739205740205741205742205743205744205745205746205747205748205749205750205751205752205753205754205755205756205757205758205759205760205761205762205763205764205765205766205767205768205769205770205771205772205773205774205775205776205777205778205779205780205781205782205783205784205785205786205787205788205789205790205791205792205793205794205795205796205797205798205799205800205801205802205803205804205805205806205807205808205809205810205811205812205813205814205815205816205817205818205819205820205821205822205823205824205825205826205827205828205829205830205831205832205833205834205835205836205837205838205839205840205841205842205843205844205845205846205847205848205849205850205851205852205853205854205855205856205857205858205859205860205861205862205863205864205865205866205867205868205869205870205871205872205873205874205875205876205877205878205879205880205881205882205883205884205885205886205887205888205889205890205891205892205893205894205895205896205897205898205899205900205901205902205903205904205905205906205907205908205909205910205911205912205913205914205915205916205917205918205919205920205921205922205923205924205925205926205927205928205929205930205931205932205933205934205935205936205937205938205939205940205941205942205943205944205945205946205947205948205949205950205951205952205953205954205955205956205957205958205959205960205961205962205963205964205965205966205967205968205969205970205971205972205973205974205975205976205977205978205979205980205981205982205983205984205985205986205987205988205989205990205991205992205993205994205995205996205997205998205999206000206001206002206003206004206005206006206007206008206009206010206011206012206013206014206015206016206017206018206019206020206021206022206023206024206025206026206027206028206029206030206031206032206033206034206035206036206037206038206039206040206041206042206043206044206045206046206047206048206049206050206051206052206053206054206055206056206057206058206059206060206061206062206063206064206065206066206067206068206069206070206071206072206073206074206075206076206077206078206079206080206081206082206083206084206085206086206087206088206089206090206091206092206093206094206095206096206097206098206099206100206101206102206103206104206105206106206107206108206109206110206111206112206113206114206115206116206117206118206119206120206121206122206123206124206125206126206127206128206129206130206131206132206133206134206135206136206137206138206139206140206141206142206143206144206145206146206147206148206149206150206151206152206153206154206155206156206157206158206159206160206161206162206163206164206165206166206167206168206169206170206171206172206173206174206175206176206177206178206179206180206181206182206183206184206185206186206187206188206189206190206191206192206193206194206195206196206197206198206199206200206201206202206203206204206205206206206207206208206209206210206211206212206213206214206215206216206217206218206219206220206221206222206223206224206225206226206227206228206229206230206231206232206233206234206235206236206237206238206239206240206241206242206243206244206245206246206247206248206249206250206251206252206253206254206255206256206257206258206259206260206261206262206263206264206265206266206267206268206269206270206271206272206273206274206275206276206277206278206279206280206281206282206283206284206285206286206287206288206289206290206291206292206293206294206295206296206297206298206299206300206301206302206303206304206305206306206307206308206309206310206311206312206313206314206315206316206317206318206319206320206321206322206323206324206325206326206327206328206329206330206331206332206333206334206335206336206337206338206339206340206341206342206343206344206345206346206347206348206349206350206351206352206353206354206355206356206357206358206359206360206361206362206363206364206365206366206367206368206369206370206371206372206373206374206375206376206377206378206379206380206381206382206383206384206385206386206387206388206389206390206391206392206393206394206395206396206397206398206399206400206401206402206403206404206405206406206407206408206409206410206411206412206413206414206415206416206417206418206419206420206421206422206423206424206425206426206427206428206429206430206431206432206433206434206435206436206437206438206439206440206441206442206443206444206445206446206447206448206449206450206451206452206453206454206455206456206457206458206459206460206461206462206463206464206465206466206467206468206469206470206471206472206473206474206475206476206477206478206479206480206481206482206483206484206485206486206487206488206489206490206491206492206493206494206495206496206497206498206499206500206501206502206503206504206505206506206507206508206509206510206511206512206513206514206515206516206517206518206519206520206521206522206523206524206525206526206527206528206529206530206531206532206533206534206535206536206537206538206539206540206541206542206543206544206545206546206547206548206549206550206551206552206553206554206555206556206557206558206559206560206561206562206563206564206565206566206567206568206569206570206571206572206573206574206575206576206577206578206579206580206581206582206583206584206585206586206587206588206589206590206591206592206593206594206595206596206597206598206599206600206601206602206603206604206605206606206607206608206609206610206611206612206613206614206615206616206617206618206619206620206621206622206623206624206625206626206627206628206629206630206631206632206633206634206635206636206637206638206639206640206641206642206643206644206645206646206647206648206649206650206651206652206653206654206655206656206657206658206659206660206661206662206663206664206665206666206667206668206669206670206671206672206673206674206675206676206677206678206679206680206681206682206683206684206685206686206687206688206689206690206691206692206693206694206695206696206697206698206699206700206701206702206703206704206705206706206707206708206709206710206711206712206713206714206715206716206717206718206719206720206721206722206723206724206725206726206727206728206729206730206731206732206733206734206735206736206737206738206739206740206741206742206743206744206745206746206747206748206749206750206751206752206753206754206755206756206757206758206759206760206761206762206763206764206765206766206767206768206769206770206771206772206773206774206775206776206777206778206779206780206781206782206783206784206785206786206787206788206789206790206791206792206793206794206795206796206797206798206799206800206801206802206803206804206805206806206807206808206809206810206811206812206813206814206815206816206817206818206819206820206821206822206823206824206825206826206827206828206829206830206831206832206833206834206835206836206837206838206839206840206841206842206843206844206845206846206847206848206849206850206851206852206853206854206855206856206857206858206859206860206861206862206863206864206865206866206867206868206869206870206871206872206873206874206875206876206877206878206879206880206881206882206883206884206885206886206887206888206889206890206891206892206893206894206895206896206897206898206899206900206901206902206903206904206905206906206907206908206909206910206911206912206913206914206915206916206917206918206919206920206921206922206923206924206925206926206927206928206929206930206931206932206933206934206935206936206937206938206939206940206941206942206943206944206945206946206947206948206949206950206951206952206953206954206955206956206957206958206959206960206961206962206963206964206965206966206967206968206969206970206971206972206973206974206975206976206977206978206979206980206981206982206983206984206985206986206987206988206989206990206991206992206993206994206995206996206997206998206999207000207001207002207003207004207005207006207007207008207009207010207011207012207013207014207015207016207017207018207019207020207021207022207023207024207025207026207027207028207029207030207031207032207033207034207035207036207037207038207039207040207041207042207043207044207045207046207047207048207049207050207051207052207053207054207055207056207057207058207059207060207061207062207063207064207065207066207067207068207069207070207071207072207073207074207075207076207077207078207079207080207081207082207083207084207085207086207087207088207089207090207091207092207093207094207095207096207097207098207099207100207101207102207103207104207105207106207107207108207109207110207111207112207113207114207115207116207117207118207119207120207121207122207123207124207125207126207127207128207129207130207131207132207133207134207135207136207137207138207139207140207141207142207143207144207145207146207147207148207149207150207151207152207153207154207155207156207157207158207159207160207161207162207163207164207165207166207167207168207169207170207171207172207173207174207175207176207177207178207179207180207181207182207183207184207185207186207187207188207189207190207191207192207193207194207195207196207197207198207199207200207201207202207203207204207205207206207207207208207209207210207211207212207213207214207215207216207217207218207219207220207221207222207223207224207225207226207227207228207229207230207231207232207233207234207235207236207237207238207239207240207241207242207243207244207245207246207247207248207249207250207251207252207253207254207255207256207257207258207259207260207261207262207263207264207265207266207267207268207269207270207271207272207273207274207275207276207277207278207279207280207281207282207283207284207285207286207287207288207289207290207291207292207293207294207295207296207297207298207299207300207301207302207303207304207305207306207307207308207309207310207311207312207313207314207315207316207317207318207319207320207321207322207323207324207325207326207327207328207329207330207331207332207333207334207335207336207337207338207339207340207341207342207343207344207345207346207347207348207349207350207351207352207353207354207355207356207357207358207359207360207361207362207363207364207365207366207367207368207369207370207371207372207373207374207375207376207377207378207379207380207381207382207383207384207385207386207387207388207389207390207391207392207393207394207395207396207397207398207399207400207401207402207403207404207405207406207407207408207409207410207411207412207413207414207415207416207417207418207419207420207421207422207423207424207425207426207427207428207429207430207431207432207433207434207435207436207437207438207439207440207441207442207443207444207445207446207447207448207449207450207451207452207453207454207455207456207457207458207459207460207461207462207463207464207465207466207467207468207469207470207471207472207473207474207475207476207477207478207479207480207481207482207483207484207485207486207487207488207489207490207491207492207493207494207495207496207497207498207499207500207501207502207503207504207505207506207507207508207509207510207511207512207513207514207515207516207517207518207519207520207521207522207523207524207525207526207527207528207529207530207531207532207533207534207535207536207537207538207539207540207541207542207543207544207545207546207547207548207549207550207551207552207553207554207555207556207557207558207559207560207561207562207563207564207565207566207567207568207569207570207571207572207573207574207575207576207577207578207579207580207581207582207583207584207585207586207587207588207589207590207591207592207593207594207595207596207597207598207599207600207601207602207603207604207605207606207607207608207609207610207611207612207613207614207615207616207617207618207619207620207621207622207623207624207625207626207627207628207629207630207631207632207633207634207635207636207637207638207639207640207641207642207643207644207645207646207647207648207649207650207651207652207653207654207655207656207657207658207659207660207661207662207663207664207665207666207667207668207669207670207671207672207673207674207675207676207677207678207679207680207681207682207683207684207685207686207687207688207689207690207691207692207693207694207695207696207697207698207699207700207701207702207703207704207705207706207707207708207709207710207711207712207713207714207715207716207717207718207719207720207721207722207723207724207725207726207727207728207729207730207731207732207733207734207735207736207737207738207739207740207741207742207743207744207745207746207747207748207749207750207751207752207753207754207755207756207757207758207759207760207761207762207763207764207765207766207767207768207769207770207771207772207773207774207775207776207777207778207779207780207781207782207783207784207785207786207787207788207789207790207791207792207793207794207795207796207797207798207799207800207801207802207803207804207805207806207807207808207809207810207811207812207813207814207815207816207817207818207819207820207821207822207823207824207825207826207827207828207829207830207831207832207833207834207835207836207837207838207839207840207841207842207843207844207845207846207847207848207849207850207851207852207853207854207855207856207857207858207859207860207861207862207863207864207865207866207867207868207869207870207871207872207873207874207875207876207877207878207879207880207881207882207883207884207885207886207887207888207889207890207891207892207893207894207895207896207897207898207899207900207901207902207903207904207905207906207907207908207909207910207911207912207913207914207915207916207917207918207919207920207921207922207923207924207925207926207927207928207929207930207931207932207933207934207935207936207937207938207939207940207941207942207943207944207945207946207947207948207949207950207951207952207953207954207955207956207957207958207959207960207961207962207963207964207965207966207967207968207969207970207971207972207973207974207975207976207977207978207979207980207981207982207983207984207985207986207987207988207989207990207991207992207993207994207995207996207997207998207999208000208001208002208003208004208005208006208007208008208009208010208011208012208013208014208015208016208017208018208019208020208021208022208023208024208025208026208027208028208029208030208031208032208033208034208035208036208037208038208039208040208041208042208043208044208045208046208047208048208049208050208051208052208053208054208055208056208057208058208059208060208061208062208063208064208065208066208067208068208069208070208071208072208073208074208075208076208077208078208079208080208081208082208083208084208085208086208087208088208089208090208091208092208093208094208095208096208097208098208099208100208101208102208103208104208105208106208107208108208109208110208111208112208113208114208115208116208117208118208119208120208121208122208123208124208125208126208127208128208129208130208131208132208133208134208135208136208137208138208139208140208141208142208143208144208145208146208147208148208149208150208151208152208153208154208155208156208157208158208159208160208161208162208163208164208165208166208167208168208169208170208171208172208173208174208175208176208177208178208179208180208181208182208183208184208185208186208187208188208189208190208191208192208193208194208195208196208197208198208199208200208201208202208203208204208205208206208207208208208209208210208211208212208213208214208215208216208217208218208219208220208221208222208223208224208225208226208227208228208229208230208231208232208233208234208235208236208237208238208239208240208241208242208243208244208245208246208247208248208249208250208251208252208253208254208255208256208257208258208259208260208261208262208263208264208265208266208267208268208269208270208271208272208273208274208275208276208277208278208279208280208281208282208283208284208285208286208287208288208289208290208291208292208293208294208295208296208297208298208299208300208301208302208303208304208305208306208307208308208309208310208311208312208313208314208315208316208317208318208319208320208321208322208323208324208325208326208327208328208329208330208331208332208333208334208335208336208337208338208339208340208341208342208343208344208345208346208347208348208349208350208351208352208353208354208355208356208357208358208359208360208361208362208363208364208365208366208367208368208369208370208371208372208373208374208375208376208377208378208379208380208381208382208383208384208385208386208387208388208389208390208391208392208393208394208395208396208397208398208399208400208401208402208403208404208405208406208407208408208409208410208411208412208413208414208415208416208417208418208419208420208421208422208423208424208425208426208427208428208429208430208431208432208433208434208435208436208437208438208439208440208441208442208443208444208445208446208447208448208449208450208451208452208453208454208455208456208457208458208459208460208461208462208463208464208465208466208467208468208469208470208471208472208473208474208475208476208477208478208479208480208481208482208483208484208485208486208487208488208489208490208491208492208493208494208495208496208497208498208499208500208501208502208503208504208505208506208507208508208509208510208511208512208513208514208515208516208517208518208519208520208521208522208523208524208525208526208527208528208529208530208531208532208533208534208535208536208537208538208539208540208541208542208543208544208545208546208547208548208549208550208551208552208553208554208555208556208557208558208559208560208561208562208563208564208565208566208567208568208569208570208571208572208573208574208575208576208577208578208579208580208581208582208583208584208585208586208587208588208589208590208591208592208593208594208595208596208597208598208599208600208601208602208603208604208605208606208607208608208609208610208611208612208613208614208615208616208617208618208619208620208621208622208623208624208625208626208627208628208629208630208631208632208633208634208635208636208637208638208639208640208641208642208643208644208645208646208647208648208649208650208651208652208653208654208655208656208657208658208659208660208661208662208663208664208665208666208667208668208669208670208671208672208673208674208675208676208677208678208679208680208681208682208683208684208685208686208687208688208689208690208691208692208693208694208695208696208697208698208699208700208701208702208703208704208705208706208707208708208709208710208711208712208713208714208715208716208717208718208719208720208721208722208723208724208725208726208727208728208729208730208731208732208733208734208735208736208737208738208739208740208741208742208743208744208745208746208747208748208749208750208751208752208753208754208755208756208757208758208759208760208761208762208763208764208765208766208767208768208769208770208771208772208773208774208775208776208777208778208779208780208781208782208783208784208785208786208787208788208789208790208791208792208793208794208795208796208797208798208799208800208801208802208803208804208805208806208807208808208809208810208811208812208813208814208815208816208817208818208819208820208821208822208823208824208825208826208827208828208829208830208831208832208833208834208835208836208837208838208839208840208841208842208843208844208845208846208847208848208849208850208851208852208853208854208855208856208857208858208859208860208861208862208863208864208865208866208867208868208869208870208871208872208873208874208875208876208877208878208879208880208881208882208883208884208885208886208887208888208889208890208891208892208893208894208895208896208897208898208899208900208901208902208903208904208905208906208907208908208909208910208911208912208913208914208915208916208917208918208919208920208921208922208923208924208925208926208927208928208929208930208931208932208933208934208935208936208937208938208939208940208941208942208943208944208945208946208947208948208949208950208951208952208953208954208955208956208957208958208959208960208961208962208963208964208965208966208967208968208969208970208971208972208973208974208975208976208977208978208979208980208981208982208983208984208985208986208987208988208989208990208991208992208993208994208995208996208997208998208999209000209001209002209003209004209005209006209007209008209009209010209011209012209013209014209015209016209017209018209019209020209021209022209023209024209025209026209027209028209029209030209031209032209033209034209035209036209037209038209039209040209041209042209043209044209045209046209047209048209049209050209051209052209053209054209055209056209057209058209059209060209061209062209063209064209065209066209067209068209069209070209071209072209073209074209075209076209077209078209079209080209081209082209083209084209085209086209087209088209089209090209091209092209093209094209095209096209097209098209099209100209101209102209103209104209105209106209107209108209109209110209111209112209113209114209115209116209117209118209119209120209121209122209123209124209125209126209127209128209129209130209131209132209133209134209135209136209137209138209139209140209141209142209143209144209145209146209147209148209149209150209151209152209153209154209155209156209157209158209159209160209161209162209163209164209165209166209167209168209169209170209171209172209173209174209175209176209177209178209179209180209181209182209183209184209185209186209187209188209189209190209191209192209193209194209195209196209197209198209199209200209201209202209203209204209205209206209207209208209209209210209211209212209213209214209215209216209217209218209219209220209221209222209223209224209225209226209227209228209229209230209231209232209233209234209235209236209237209238209239209240209241209242209243209244209245209246209247209248209249209250209251209252209253209254209255209256209257209258209259209260209261209262209263209264209265209266209267209268209269209270209271209272209273209274209275209276209277209278209279209280209281209282209283209284209285209286209287209288209289209290209291209292209293209294209295209296209297209298209299209300209301209302209303209304209305209306209307209308209309209310209311209312209313209314209315209316209317209318209319209320209321209322209323209324209325209326209327209328209329209330209331209332209333209334209335209336209337209338209339209340209341209342209343209344209345209346209347209348209349209350209351209352209353209354209355209356209357209358209359209360209361209362209363209364209365209366209367209368209369209370209371209372209373209374209375209376209377209378209379209380209381209382209383209384209385209386209387209388209389209390209391209392209393209394209395209396209397209398209399209400209401209402209403209404209405209406209407209408209409209410209411209412209413209414209415209416209417209418209419209420209421209422209423209424209425209426209427209428209429209430209431209432209433209434209435209436209437209438209439209440209441209442209443209444209445209446209447209448209449209450209451209452209453209454209455209456209457209458209459209460209461209462209463209464209465209466209467209468209469209470209471209472209473209474209475209476209477209478209479209480209481209482209483209484209485209486209487209488209489209490209491209492209493209494209495209496209497209498209499209500209501209502209503209504209505209506209507209508209509209510209511209512209513209514209515209516209517209518209519209520209521209522209523209524209525209526209527209528209529209530209531209532209533209534209535209536209537209538209539209540209541209542209543209544209545209546209547209548209549209550209551209552209553209554209555209556209557209558209559209560209561209562209563209564209565209566209567209568209569209570209571209572209573209574209575209576209577209578209579209580209581209582209583209584209585209586209587209588209589209590209591209592209593209594209595209596209597209598209599209600209601209602209603209604209605209606209607209608209609209610209611209612209613209614209615209616209617209618209619209620209621209622209623209624209625209626209627209628209629209630209631209632209633209634209635209636209637209638209639209640209641209642209643209644209645209646209647209648209649209650209651209652209653209654209655209656209657209658209659209660209661209662209663209664209665209666209667209668209669209670209671209672209673209674209675209676209677209678209679209680209681209682209683209684209685209686209687209688209689209690209691209692209693209694209695209696209697209698209699209700209701209702209703209704209705209706209707209708209709209710209711209712209713209714209715209716209717209718209719209720209721209722209723209724209725209726209727209728209729209730209731209732209733209734209735209736209737209738209739209740209741209742209743209744209745209746209747209748209749209750209751209752209753209754209755209756209757209758209759209760209761209762209763209764209765209766209767209768209769209770209771209772209773209774209775209776209777209778209779209780209781209782209783209784209785209786209787209788209789209790209791209792209793209794209795209796209797209798209799209800209801209802209803209804209805209806209807209808209809209810209811209812209813209814209815209816209817209818209819209820209821209822209823209824209825209826209827209828209829209830209831209832209833209834209835209836209837209838209839209840209841209842209843209844209845209846209847209848209849209850209851209852209853209854209855209856209857209858209859209860209861209862209863209864209865209866209867209868209869209870209871209872209873209874209875209876209877209878209879209880209881209882209883209884209885209886209887209888209889209890209891209892209893209894209895209896209897209898209899209900209901209902209903209904209905209906209907209908209909209910209911209912209913209914209915209916209917209918209919209920209921209922209923209924209925209926209927209928209929209930209931209932209933209934209935209936209937209938209939209940209941209942209943209944209945209946209947209948209949209950209951209952209953209954209955209956209957209958209959209960209961209962209963209964209965209966209967209968209969209970209971209972209973209974209975209976209977209978209979209980209981209982209983209984209985209986209987209988209989209990209991209992209993209994209995209996209997209998209999210000210001210002210003210004210005210006210007210008210009210010210011210012210013210014210015210016210017210018210019210020210021210022210023210024210025210026210027210028210029210030210031210032210033210034210035210036210037210038210039210040210041210042210043210044210045210046210047210048210049210050210051210052210053210054210055210056210057210058210059210060210061210062210063210064210065210066210067210068210069210070210071210072210073210074210075210076210077210078210079210080210081210082210083210084210085210086210087210088210089210090210091210092210093210094210095210096210097210098210099210100210101210102210103210104210105210106210107210108210109210110210111210112210113210114210115210116210117210118210119210120210121210122210123210124210125210126210127210128210129210130210131210132210133210134210135210136210137210138210139210140210141210142210143210144210145210146210147210148210149210150210151210152210153210154210155210156210157210158210159210160210161210162210163210164210165210166210167210168210169210170210171210172210173210174210175210176210177210178210179210180210181210182210183210184210185210186210187210188210189210190210191210192210193210194210195210196210197210198210199210200210201210202210203210204210205210206210207210208210209210210210211210212210213210214210215210216210217210218210219210220210221210222210223210224210225210226210227210228210229210230210231210232210233210234210235210236210237210238210239210240210241210242210243210244210245210246210247210248210249210250210251210252210253210254210255210256210257210258210259210260210261210262210263210264210265210266210267210268210269210270210271210272210273210274210275210276210277210278210279210280210281210282210283210284210285210286210287210288210289210290210291210292210293210294210295210296210297210298210299210300210301210302210303210304210305210306210307210308210309210310210311210312210313210314210315210316210317210318210319210320210321210322210323210324210325210326210327210328210329210330210331210332210333210334210335210336210337210338210339210340210341210342210343210344210345210346210347210348210349210350210351210352210353210354210355210356210357210358210359210360210361210362210363210364210365210366210367210368210369210370210371210372210373210374210375210376210377210378210379210380210381210382210383210384210385210386210387210388210389210390210391210392210393210394210395210396210397210398210399210400210401210402210403210404210405210406210407210408210409210410210411210412210413210414210415210416210417210418210419210420210421210422210423210424210425210426210427210428210429210430210431210432210433210434210435210436210437210438210439210440210441210442210443210444210445210446210447210448210449210450210451210452210453210454210455210456210457210458210459210460210461210462210463210464210465210466210467210468210469210470210471210472210473210474210475210476210477210478210479210480210481210482210483210484210485210486210487210488210489210490210491210492210493210494210495210496210497210498210499210500210501210502210503210504210505210506210507210508210509210510210511210512210513210514210515210516210517210518210519210520210521210522210523210524210525210526210527210528210529210530210531210532210533210534210535210536210537210538210539210540210541210542210543210544210545210546210547210548210549210550210551210552210553210554210555210556210557210558210559210560210561210562210563210564210565210566210567210568210569210570210571210572210573210574210575210576210577210578210579210580210581210582210583210584210585210586210587210588210589210590210591210592210593210594210595210596210597210598210599210600210601210602210603210604210605210606210607210608210609210610210611210612210613210614210615210616210617210618210619210620210621210622210623210624210625210626210627210628210629210630210631210632210633210634210635210636210637210638210639210640210641210642210643210644210645210646210647210648210649210650210651210652210653210654210655210656210657210658210659210660210661210662210663210664210665210666210667210668210669210670210671210672210673210674210675210676210677210678210679210680210681210682210683210684210685210686210687210688210689210690210691210692210693210694210695210696210697210698210699210700210701210702210703210704210705210706210707210708210709210710210711210712210713210714210715210716210717210718210719210720210721210722210723210724210725210726210727210728210729210730210731210732210733210734210735210736210737210738210739210740210741210742210743210744210745210746210747210748210749210750210751210752210753210754210755210756210757210758210759210760210761210762210763210764210765210766210767210768210769210770210771210772210773210774210775210776210777210778210779210780210781210782210783210784210785210786210787210788210789210790210791210792210793210794210795210796210797210798210799210800210801210802210803210804210805210806210807210808210809210810210811210812210813210814210815210816210817210818210819210820210821210822210823210824210825210826210827210828210829210830210831210832210833210834210835210836210837210838210839210840210841210842210843210844210845210846210847210848210849210850210851210852210853210854210855210856210857210858210859210860210861210862210863210864210865210866210867210868210869210870210871210872210873210874210875210876210877210878210879210880210881210882210883210884210885210886210887210888210889210890210891210892210893210894210895210896210897210898210899210900210901210902210903210904210905210906210907210908210909210910210911210912210913210914210915210916210917210918210919210920210921210922210923210924210925210926210927210928210929210930210931210932210933210934210935210936210937210938210939210940210941210942210943210944210945210946210947210948210949210950210951210952210953210954210955210956210957210958210959210960210961210962210963210964210965210966210967210968210969210970210971210972210973210974210975210976210977210978210979210980210981210982210983210984210985210986210987210988210989210990210991210992210993210994210995210996210997210998210999211000211001211002211003211004211005211006211007211008211009211010211011211012211013211014211015211016211017211018211019211020211021211022211023211024211025211026211027211028211029211030211031211032211033211034211035211036211037211038211039211040211041211042211043211044211045211046211047211048211049211050211051211052211053211054211055211056211057211058211059211060211061211062211063211064211065211066211067211068211069211070211071211072211073211074211075211076211077211078211079211080211081211082211083211084211085211086211087211088211089211090211091211092211093211094211095211096211097211098211099211100211101211102211103211104211105211106211107211108211109211110211111211112211113211114211115211116211117211118211119211120211121211122211123211124211125211126211127211128211129211130211131211132211133211134211135211136211137211138211139211140211141211142211143211144211145211146211147211148211149211150211151211152211153211154211155211156211157211158211159211160211161211162211163211164211165211166211167211168211169211170211171211172211173211174211175211176211177211178211179211180211181211182211183211184211185211186211187211188211189211190211191211192211193211194211195211196211197211198211199211200211201211202211203211204211205211206211207211208211209211210211211211212211213211214211215211216211217211218211219211220211221211222211223211224211225211226211227211228211229211230211231211232211233211234211235211236211237211238211239211240211241211242211243211244211245211246211247211248211249211250211251211252211253211254211255211256211257211258211259211260211261211262211263211264211265211266211267211268211269211270211271211272211273211274211275211276211277211278211279211280211281211282211283211284211285211286211287211288211289211290211291211292211293211294211295211296211297211298211299211300211301211302211303211304211305211306211307211308211309211310211311211312211313211314211315211316211317211318211319211320211321211322211323211324211325211326211327211328211329211330211331211332211333211334211335211336211337211338211339211340211341211342211343211344211345211346211347211348211349211350211351211352211353211354211355211356211357211358211359211360211361211362211363211364211365211366211367211368211369211370211371211372211373211374211375211376211377211378211379211380211381211382211383211384211385211386211387211388211389211390211391211392211393211394211395211396211397211398211399211400211401211402211403211404211405211406211407211408211409211410211411211412211413211414211415211416211417211418211419211420211421211422211423211424211425211426211427211428211429211430211431211432211433211434211435211436211437211438211439211440211441211442211443211444211445211446211447211448211449211450211451211452211453211454211455211456211457211458211459211460211461211462211463211464211465211466211467211468211469211470211471211472211473211474211475211476211477211478211479211480211481211482211483211484211485211486211487211488211489211490211491211492211493211494211495211496211497211498211499211500211501211502211503211504211505211506211507211508211509211510211511211512211513211514211515211516211517211518211519211520211521211522211523211524211525211526211527211528211529211530211531211532211533211534211535211536211537211538211539211540211541211542211543211544211545211546211547211548211549211550211551211552211553211554211555211556211557211558211559211560211561211562211563211564211565211566211567211568211569211570211571211572211573211574211575211576211577211578211579211580211581211582211583211584211585211586211587211588211589211590211591211592211593211594211595211596211597211598211599211600211601211602211603211604211605211606211607211608211609211610211611211612211613211614211615211616211617211618211619211620211621211622211623211624211625211626211627211628211629211630211631211632211633211634211635211636211637211638211639211640211641211642211643211644211645211646211647211648211649211650211651211652211653211654211655211656211657211658211659211660211661211662211663211664211665211666211667211668211669211670211671211672211673211674211675211676211677211678211679211680211681211682211683211684211685211686211687211688211689211690211691211692211693211694211695211696211697211698211699211700211701211702211703211704211705211706211707211708211709211710211711211712211713211714211715211716211717211718211719211720211721211722211723211724211725211726211727211728211729211730211731211732211733211734211735211736211737211738211739211740211741211742211743211744211745211746211747211748211749211750211751211752211753211754211755211756211757211758211759211760211761211762211763211764211765211766211767211768211769211770211771211772211773211774211775211776211777211778211779211780211781211782211783211784211785211786211787211788211789211790211791211792211793211794211795211796211797211798211799211800211801211802211803211804211805211806211807211808211809211810211811211812211813211814211815211816211817211818211819211820211821211822211823211824211825211826211827211828211829211830211831211832211833211834211835211836211837211838211839211840211841211842211843211844211845211846211847211848211849211850211851211852211853211854211855211856211857211858211859211860211861211862211863211864211865211866211867211868211869211870211871211872211873211874211875211876211877211878211879211880211881211882211883211884211885211886211887211888211889211890211891211892211893211894211895211896211897211898211899211900211901211902211903211904211905211906211907211908211909211910211911211912211913211914211915211916211917211918211919211920211921211922211923211924211925211926211927211928211929211930211931211932211933211934211935211936211937211938211939211940211941211942211943211944211945211946211947211948211949211950211951211952211953211954211955211956211957211958211959211960211961211962211963211964211965211966211967211968211969211970211971211972211973211974211975211976211977211978211979211980211981211982211983211984211985211986211987211988211989211990211991211992211993211994211995211996211997211998211999212000212001212002212003212004212005212006212007212008212009212010212011212012212013212014212015212016212017212018212019212020212021212022212023212024212025212026212027212028212029212030212031212032212033212034212035212036212037212038212039212040212041212042212043212044212045212046212047212048212049212050212051212052212053212054212055212056212057212058212059212060212061212062212063212064212065212066212067212068212069212070212071212072212073212074212075212076212077212078212079212080212081212082212083212084212085212086212087212088212089212090212091212092212093212094212095212096212097212098212099212100212101212102212103212104212105212106212107212108212109212110212111212112212113212114212115212116212117212118212119212120212121212122212123212124212125212126212127212128212129212130212131212132212133212134212135212136212137212138212139212140212141212142212143212144212145212146212147212148212149212150212151212152212153212154212155212156212157212158212159212160212161212162212163212164212165212166212167212168212169212170212171212172212173212174212175212176212177212178212179212180212181212182212183212184212185212186212187212188212189212190212191212192212193212194212195212196212197212198212199212200212201212202212203212204212205212206212207212208212209212210212211212212212213212214212215212216212217212218212219212220212221212222212223212224212225212226212227212228212229212230212231212232212233212234212235212236212237212238212239212240212241212242212243212244212245212246212247212248212249212250212251212252212253212254212255212256212257212258212259212260212261212262212263212264212265212266212267212268212269212270212271212272212273212274212275212276212277212278212279212280212281212282212283212284212285212286212287212288212289212290212291212292212293212294212295212296212297212298212299212300212301212302212303212304212305212306212307212308212309212310212311212312212313212314212315212316212317212318212319212320212321212322212323212324212325212326212327212328212329212330212331212332212333212334212335212336212337212338212339212340212341212342212343212344212345212346212347212348212349212350212351212352212353212354212355212356212357212358212359212360212361212362212363212364212365212366212367212368212369212370212371212372212373212374212375212376212377212378212379212380212381212382212383212384212385212386212387212388212389212390212391212392212393212394212395212396212397212398212399212400212401212402212403212404212405212406212407212408212409212410212411212412212413212414212415212416212417212418212419212420212421212422212423212424212425212426212427212428212429212430212431212432212433212434212435212436212437212438212439212440212441212442212443212444212445212446212447212448212449212450212451212452212453212454212455212456212457212458212459212460212461212462212463212464212465212466212467212468212469212470212471212472212473212474212475212476212477212478212479212480212481212482212483212484212485212486212487212488212489212490212491212492212493212494212495212496212497212498212499212500212501212502212503212504212505212506212507212508212509212510212511212512212513212514212515212516212517212518212519212520212521212522212523212524212525212526212527212528212529212530212531212532212533212534212535212536212537212538212539212540212541212542212543212544212545212546212547212548212549212550212551212552212553212554212555212556212557212558212559212560212561212562212563212564212565212566212567212568212569212570212571212572212573212574212575212576212577212578212579212580212581212582212583212584212585212586212587212588212589212590212591212592212593212594212595212596212597212598212599212600212601212602212603212604212605212606212607212608212609212610212611212612212613212614212615212616212617212618212619212620212621212622212623212624212625212626212627212628212629212630212631212632212633212634212635212636212637212638212639212640212641212642212643212644212645212646212647212648212649212650212651212652212653212654212655212656212657212658212659212660212661212662212663212664212665212666212667212668212669212670212671212672212673212674212675212676212677212678212679212680212681212682212683212684212685212686212687212688212689212690212691212692212693212694212695212696212697212698212699212700212701212702212703212704212705212706212707212708212709212710212711212712212713212714212715212716212717212718212719212720212721212722212723212724212725212726212727212728212729212730212731212732212733212734212735212736212737212738212739212740212741212742212743212744212745212746212747212748212749212750212751212752212753212754212755212756212757212758212759212760212761212762212763212764212765212766212767212768212769212770212771212772212773212774212775212776212777212778212779212780212781212782212783212784212785212786212787212788212789212790212791212792212793212794212795212796212797212798212799212800212801212802212803212804212805212806212807212808212809212810212811212812212813212814212815212816212817212818212819212820212821212822212823212824212825212826212827212828212829212830212831212832212833212834212835212836212837212838212839212840212841212842212843212844212845212846212847212848212849212850212851212852212853212854212855212856212857212858212859212860212861212862212863212864212865212866212867212868212869212870212871212872212873212874212875212876212877212878212879212880212881212882212883212884212885212886212887212888212889212890212891212892212893212894212895212896212897212898212899212900212901212902212903212904212905212906212907212908212909212910212911212912212913212914212915212916212917212918212919212920212921212922212923212924212925212926212927212928212929212930212931212932212933212934212935212936212937212938212939212940212941212942212943212944212945212946212947212948212949212950212951212952212953212954212955212956212957212958212959212960212961212962212963212964212965212966212967212968212969212970212971212972212973212974212975212976212977212978212979212980212981212982212983212984212985212986212987212988212989212990212991212992212993212994212995212996212997212998212999213000213001213002213003213004213005213006213007213008213009213010213011213012213013213014213015213016213017213018213019213020213021213022213023213024213025213026213027213028213029213030213031213032213033213034213035213036213037213038213039213040213041213042213043213044213045213046213047213048213049213050213051213052213053213054213055213056213057213058213059213060213061213062213063213064213065213066213067213068213069213070213071213072213073213074213075213076213077213078213079213080213081213082213083213084213085213086213087213088213089213090213091213092213093213094213095213096213097213098213099213100213101213102213103213104213105213106213107213108213109213110213111213112213113213114213115213116213117213118213119213120213121213122213123213124213125213126213127213128213129213130213131213132213133213134213135213136213137213138213139213140213141213142213143213144213145213146213147213148213149213150213151213152213153213154213155213156213157213158213159213160213161213162213163213164213165213166213167213168213169213170213171213172213173213174213175213176213177213178213179213180213181213182213183213184213185213186213187213188213189213190213191213192213193213194213195213196213197213198213199213200213201213202213203213204213205213206213207213208213209213210213211213212213213213214213215213216213217213218213219213220213221213222213223213224213225213226213227213228213229213230213231213232213233213234213235213236213237213238213239213240213241213242213243213244213245213246213247213248213249213250213251213252213253213254213255213256213257213258213259213260213261213262213263213264213265213266213267213268213269213270213271213272213273213274213275213276213277213278213279213280213281213282213283213284213285213286213287213288213289213290213291213292213293213294213295213296213297213298213299213300213301213302213303213304213305213306213307213308213309213310213311213312213313213314213315213316213317213318213319213320213321213322213323213324213325213326213327213328213329213330213331213332213333213334213335213336213337213338213339213340213341213342213343213344213345213346213347213348213349213350213351213352213353213354213355213356213357213358213359213360213361213362213363213364213365213366213367213368213369213370213371213372213373213374213375213376213377213378213379213380213381213382213383213384213385213386213387213388213389213390213391213392213393213394213395213396213397213398213399213400213401213402213403213404213405213406213407213408213409213410213411213412213413213414213415213416213417213418213419213420213421213422213423213424213425213426213427213428213429213430213431213432213433213434213435213436213437213438213439213440213441213442213443213444213445213446213447213448213449213450213451213452213453213454213455213456213457213458213459213460213461213462213463213464213465213466213467213468213469213470213471213472213473213474213475213476213477213478213479213480213481213482213483213484213485213486213487213488213489213490213491213492213493213494213495213496213497213498213499213500213501213502213503213504213505213506213507213508213509213510213511213512213513213514213515213516213517213518213519213520213521213522213523213524213525213526213527213528213529213530213531213532213533213534213535213536213537213538213539213540213541213542213543213544213545213546213547213548213549213550213551213552213553213554213555213556213557213558213559213560213561213562213563213564213565213566213567213568213569213570213571213572213573213574213575213576213577213578213579213580213581213582213583213584213585213586213587213588213589213590213591213592213593213594213595213596213597213598213599213600213601213602213603213604213605213606213607213608213609213610213611213612213613213614213615213616213617213618213619213620213621213622213623213624213625213626213627213628213629213630213631213632213633213634213635213636213637213638213639213640213641213642213643213644213645213646213647213648213649213650213651213652213653213654213655213656213657213658213659213660213661213662213663213664213665213666213667213668213669213670213671213672213673213674213675213676213677213678213679213680213681213682213683213684213685213686213687213688213689213690213691213692213693213694213695213696213697213698213699213700213701213702213703213704213705213706213707213708213709213710213711213712213713213714213715213716213717213718213719213720213721213722213723213724213725213726213727213728213729213730213731213732213733213734213735213736213737213738213739213740213741213742213743213744213745213746213747213748213749213750213751213752213753213754213755213756213757213758213759213760213761213762213763213764213765213766213767213768213769213770213771213772213773213774213775213776213777213778213779213780213781213782213783213784213785213786213787213788213789213790213791213792213793213794213795213796213797213798213799213800213801213802213803213804213805213806213807213808213809213810213811213812213813213814213815213816213817213818213819213820213821213822213823213824213825213826213827213828213829213830213831213832213833213834213835213836213837213838213839213840213841213842213843213844213845213846213847213848213849213850213851213852213853213854213855213856213857213858213859213860213861213862213863213864213865213866213867213868213869213870213871213872213873213874213875213876213877213878213879213880213881213882213883213884213885213886213887213888213889213890213891213892213893213894213895213896213897213898213899213900213901213902213903213904213905213906213907213908213909213910213911213912213913213914213915213916213917213918213919213920213921213922213923213924213925213926213927213928213929213930213931213932213933213934213935213936213937213938213939213940213941213942213943213944213945213946213947213948213949213950213951213952213953213954213955213956213957213958213959213960213961213962213963213964213965213966213967213968213969213970213971213972213973213974213975213976213977213978213979213980213981213982213983213984213985213986213987213988213989213990213991213992213993213994213995213996213997213998213999214000214001214002214003214004214005214006214007214008214009214010214011214012214013214014214015214016214017214018214019214020214021214022214023214024214025214026214027214028214029214030214031214032214033214034214035214036214037214038214039214040214041214042214043214044214045214046214047214048214049214050214051214052214053214054214055214056214057214058214059214060214061214062214063214064214065214066214067214068214069214070214071214072214073214074214075214076214077214078214079214080214081214082214083214084214085214086214087214088214089214090214091214092214093214094214095214096214097214098214099214100214101214102214103214104214105214106214107214108214109214110214111214112214113214114214115214116214117214118214119214120214121214122214123214124214125214126214127214128214129214130214131214132214133214134214135214136214137214138214139214140214141214142214143214144214145214146214147214148214149214150214151214152214153214154214155214156214157214158214159214160214161214162214163214164214165214166214167214168214169214170214171214172214173214174214175214176214177214178214179214180214181214182214183214184214185214186214187214188214189214190214191214192214193214194214195214196214197214198214199214200214201214202214203214204214205214206214207214208214209214210214211214212214213214214214215214216214217214218214219214220214221214222214223214224214225214226214227214228214229214230214231214232214233214234214235214236214237214238214239214240214241214242214243214244214245214246214247214248214249214250214251214252214253214254214255214256214257214258214259214260214261214262214263214264214265214266214267214268214269214270214271214272214273214274214275214276214277214278214279214280214281214282214283214284214285214286214287214288214289214290214291214292214293214294214295214296214297214298214299214300214301214302214303214304214305214306214307214308214309214310214311214312214313214314214315214316214317214318214319214320214321214322214323214324214325214326214327214328214329214330214331214332214333214334214335214336214337214338214339214340214341214342214343214344214345214346214347214348214349214350214351214352214353214354214355214356214357214358214359214360214361214362214363214364214365214366214367214368214369214370214371214372214373214374214375214376214377214378214379214380214381214382214383214384214385214386214387214388214389214390214391214392214393214394214395214396214397214398214399214400214401214402214403214404214405214406214407214408214409214410214411214412214413214414214415214416214417214418214419214420214421214422214423214424214425214426214427214428214429214430214431214432214433214434214435214436214437214438214439214440214441214442214443214444214445214446214447214448214449214450214451214452214453214454214455214456214457214458214459214460214461214462214463214464214465214466214467214468214469214470214471214472214473214474214475214476214477214478214479214480214481214482214483214484214485214486214487214488214489214490214491214492214493214494214495214496214497214498214499214500214501214502214503214504214505214506214507214508214509214510214511214512214513214514214515214516214517214518214519214520214521214522214523214524214525214526214527214528214529214530214531214532214533214534214535214536214537214538214539214540214541214542214543214544214545214546214547214548214549214550214551214552214553214554214555214556214557214558214559214560214561214562214563214564214565214566214567214568214569214570214571214572214573214574214575214576214577214578214579214580214581214582214583214584214585214586214587214588214589214590214591214592214593214594214595214596214597214598214599214600214601214602214603214604214605214606214607214608214609214610214611214612214613214614214615214616214617214618214619214620214621214622214623214624214625214626214627214628214629214630214631214632214633214634214635214636214637214638214639214640214641214642214643214644214645214646214647214648214649214650214651214652214653214654214655214656214657214658214659214660214661214662214663214664214665214666214667214668214669214670214671214672214673214674214675214676214677214678214679214680214681214682214683214684214685214686214687214688214689214690214691214692214693214694214695214696214697214698214699214700214701214702214703214704214705214706214707214708214709214710214711214712214713214714214715214716214717214718214719214720214721214722214723214724214725214726214727214728214729214730214731214732214733214734214735214736214737214738214739214740214741214742214743214744214745214746214747214748214749214750214751214752214753214754214755214756214757214758214759214760214761214762214763214764214765214766214767214768214769214770214771214772214773214774214775214776214777214778214779214780214781214782214783214784214785214786214787214788214789214790214791214792214793214794214795214796214797214798214799214800214801214802214803214804214805214806214807214808214809214810214811214812214813214814214815214816214817214818214819214820214821214822214823214824214825214826214827214828214829214830214831214832214833214834214835214836214837214838214839214840214841214842214843214844214845214846214847214848214849214850214851214852214853214854214855214856214857214858214859214860214861214862214863214864214865214866214867214868214869214870214871214872214873214874214875214876214877214878214879214880214881214882214883214884214885214886214887214888214889214890214891214892214893214894214895214896214897214898214899214900214901214902214903214904214905214906214907214908214909214910214911214912214913214914214915214916214917214918214919214920214921214922214923214924214925214926214927214928214929214930214931214932214933214934214935214936214937214938214939214940214941214942214943214944214945214946214947214948214949214950214951214952214953214954214955214956214957214958214959214960214961214962214963214964214965214966214967214968214969214970214971214972214973214974214975214976214977214978214979214980214981214982214983214984214985214986214987214988214989214990214991214992214993214994214995214996214997214998214999215000215001215002215003215004215005215006215007215008215009215010215011215012215013215014215015215016215017215018215019215020215021215022215023215024215025215026215027215028215029215030215031215032215033215034215035215036215037215038215039215040215041215042215043215044215045215046215047215048215049215050215051215052215053215054215055215056215057215058215059215060215061215062215063215064215065215066215067215068215069215070215071215072215073215074215075215076215077215078215079215080215081215082215083215084215085215086215087215088215089215090215091215092215093215094215095215096215097215098215099215100215101215102215103215104215105215106215107215108215109215110215111215112215113215114215115215116215117215118215119215120215121215122215123215124215125215126215127215128215129215130215131215132215133215134215135215136215137215138215139215140215141215142215143215144215145215146215147215148215149215150215151215152215153215154215155215156215157215158215159215160215161215162215163215164215165215166215167215168215169215170215171215172215173215174215175215176215177215178215179215180215181215182215183215184215185215186215187215188215189215190215191215192215193215194215195215196215197215198215199215200215201215202215203215204215205215206215207215208215209215210215211215212215213215214215215215216215217215218215219215220215221215222215223215224215225215226215227215228215229215230215231215232215233215234215235215236215237215238215239215240215241215242215243215244215245215246215247215248215249215250215251215252215253215254215255215256215257215258215259215260215261215262215263215264215265215266215267215268215269215270215271215272215273215274215275215276215277215278215279215280215281215282215283215284215285215286215287215288215289215290215291215292215293215294215295215296215297215298215299215300215301215302215303215304215305215306215307215308215309215310215311215312215313215314215315215316215317215318215319215320215321215322215323215324215325215326215327215328215329215330215331215332215333215334215335215336215337215338215339215340215341215342215343215344215345215346215347215348215349215350215351215352215353215354215355215356215357215358215359215360215361215362215363215364215365215366215367215368215369215370215371215372215373215374215375215376215377215378215379215380215381215382215383215384215385215386215387215388215389215390215391215392215393215394215395215396215397215398215399215400215401215402215403215404215405215406215407215408215409215410215411215412215413215414215415215416215417215418215419215420215421215422215423215424215425215426215427215428215429215430215431215432215433215434215435215436215437215438215439215440215441215442215443215444215445215446215447215448215449215450215451215452215453215454215455215456215457215458215459215460215461215462215463215464215465215466215467215468215469215470215471215472215473215474215475215476215477215478215479215480215481215482215483215484215485215486215487215488215489215490215491215492215493215494215495215496215497215498215499215500215501215502215503215504215505215506215507215508215509215510215511215512215513215514215515215516215517215518215519215520215521215522215523215524215525215526215527215528215529215530215531215532215533215534215535215536215537215538215539215540215541215542215543215544215545215546215547215548215549215550215551215552215553215554215555215556215557215558215559215560215561215562215563215564215565215566215567215568215569215570215571215572215573215574215575215576215577215578215579215580215581215582215583215584215585215586215587215588215589215590215591215592215593215594215595215596215597215598215599215600215601215602215603215604215605215606215607215608215609215610215611215612215613215614215615215616215617215618215619215620215621215622215623215624215625215626215627215628215629215630215631215632215633215634215635215636215637215638215639215640215641215642215643215644215645215646215647215648215649215650215651215652215653215654215655215656215657215658215659215660215661215662215663215664215665215666215667215668215669215670215671215672215673215674215675215676215677215678215679215680215681215682215683215684215685215686215687215688215689215690215691215692215693215694215695215696215697215698215699215700215701215702215703215704215705215706215707215708215709215710215711215712215713215714215715215716215717215718215719215720215721215722215723215724215725215726215727215728215729215730215731215732215733215734215735215736215737215738215739215740215741215742215743215744215745215746215747215748215749215750215751215752215753215754215755215756215757215758215759215760215761215762215763215764215765215766215767215768215769215770215771215772215773215774215775215776215777215778215779215780215781215782215783215784215785215786215787215788215789215790215791215792215793215794215795215796215797215798215799215800215801215802215803215804215805215806215807215808215809215810215811215812215813215814215815215816215817215818215819215820215821215822215823215824215825215826215827215828215829215830215831215832215833215834215835215836215837215838215839215840215841215842215843215844215845215846215847215848215849215850215851215852215853215854215855215856215857215858215859215860215861215862215863215864215865215866215867215868215869215870215871215872215873215874215875215876215877215878215879215880215881215882215883215884215885215886215887215888215889215890215891215892215893215894215895215896215897215898215899215900215901215902215903215904215905215906215907215908215909215910215911215912215913215914215915215916215917215918215919215920215921215922215923215924215925215926215927215928215929215930215931215932215933215934215935215936215937215938215939215940215941215942215943215944215945215946215947215948215949215950215951215952215953215954215955215956215957215958215959215960215961215962215963215964215965215966215967215968215969215970215971215972215973215974215975215976215977215978215979215980215981215982215983215984215985215986215987215988215989215990215991215992215993215994215995215996215997215998215999216000216001216002216003216004216005216006216007216008216009216010216011216012216013216014216015216016216017216018216019216020216021216022216023216024216025216026216027216028216029216030216031216032216033216034216035216036216037216038216039216040216041216042216043216044216045216046216047216048216049216050216051216052216053216054216055216056216057216058216059216060216061216062216063216064216065216066216067216068216069216070216071216072216073216074216075216076216077216078216079216080216081216082216083216084216085216086216087216088216089216090216091216092216093216094216095216096216097216098216099216100216101216102216103216104216105216106216107216108216109216110216111216112216113216114216115216116216117216118216119216120216121216122216123216124216125216126216127216128216129216130216131216132216133216134216135216136216137216138216139216140216141216142216143216144216145216146216147216148216149216150216151216152216153216154216155216156216157216158216159216160216161216162216163216164216165216166216167216168216169216170216171216172216173216174216175216176216177216178216179216180216181216182216183216184216185216186216187216188216189216190216191216192216193216194216195216196216197216198216199216200216201216202216203216204216205216206216207216208216209216210216211216212216213216214216215216216216217216218216219216220216221216222216223216224216225216226216227216228216229216230216231216232216233216234216235216236216237216238216239216240216241216242216243216244216245216246216247216248216249216250216251216252216253216254216255216256216257216258216259216260216261216262216263216264216265216266216267216268216269216270216271216272216273216274216275216276216277216278216279216280216281216282216283216284216285216286216287216288216289216290216291216292216293216294216295216296216297216298216299216300216301216302216303216304216305216306216307216308216309216310216311216312216313216314216315216316216317216318216319216320216321216322216323216324216325216326216327216328216329216330216331216332216333216334216335216336216337216338216339216340216341216342216343216344216345216346216347216348216349216350216351216352216353216354216355216356216357216358216359216360216361216362216363216364216365216366216367216368216369216370216371216372216373216374216375216376216377216378216379216380216381216382216383216384216385216386216387216388216389216390216391216392216393216394216395216396216397216398216399216400216401216402216403216404216405216406216407216408216409216410216411216412216413216414216415216416216417216418216419216420216421216422216423216424216425216426216427216428216429216430216431216432216433216434216435216436216437216438216439216440216441216442216443216444216445216446216447216448216449216450216451216452216453216454216455216456216457216458216459216460216461216462216463216464216465216466216467216468216469216470216471216472216473216474216475216476216477216478216479216480216481216482216483216484216485216486216487216488216489216490216491216492216493216494216495216496216497216498216499216500216501216502216503216504216505216506216507216508216509216510216511216512216513216514216515216516216517216518216519216520216521216522216523216524216525216526216527216528216529216530216531216532216533216534216535216536216537216538216539216540216541216542216543216544216545216546216547216548216549216550216551216552216553216554216555216556216557216558216559216560216561216562216563216564216565216566216567216568216569216570216571216572216573216574216575216576216577216578216579216580216581216582216583216584216585216586216587216588216589216590216591216592216593216594216595216596216597216598216599216600216601216602216603216604216605216606216607216608216609216610216611216612216613216614216615216616216617216618216619216620216621216622216623216624216625216626216627216628216629216630216631216632216633216634216635216636216637216638216639216640216641216642216643216644216645216646216647216648216649216650216651216652216653216654216655216656216657216658216659216660216661216662216663216664216665216666216667216668216669216670216671216672216673216674216675216676216677216678216679216680216681216682216683216684216685216686216687216688216689216690216691216692216693216694216695216696216697216698216699216700216701216702216703216704216705216706216707216708216709216710216711216712216713216714216715216716216717216718216719216720216721216722216723216724216725216726216727216728216729216730216731216732216733216734216735216736216737216738216739216740216741216742216743216744216745216746216747216748216749216750216751216752216753216754216755216756216757216758216759216760216761216762216763216764216765216766216767216768216769216770216771216772216773216774216775216776216777216778216779216780216781216782216783216784216785216786216787216788216789216790216791216792216793216794216795216796216797216798216799216800216801216802216803216804216805216806216807216808216809216810216811216812216813216814216815216816216817216818216819216820216821216822216823216824216825216826216827216828216829216830216831216832216833216834216835216836216837216838216839216840216841216842216843216844216845216846216847216848216849216850216851216852216853216854216855216856216857216858216859216860216861216862216863216864216865216866216867216868216869216870216871216872216873216874216875216876216877216878216879216880216881216882216883216884216885216886216887216888216889216890216891216892216893216894216895216896216897216898216899216900216901216902216903216904216905216906216907216908216909216910216911216912216913216914216915216916216917216918216919216920216921216922216923216924216925216926216927216928216929216930216931216932216933216934216935216936216937216938216939216940216941216942216943216944216945216946216947216948216949216950216951216952216953216954216955216956216957216958216959216960216961216962216963216964216965216966216967216968216969216970216971216972216973216974216975216976216977216978216979216980216981216982216983216984216985216986216987216988216989216990216991216992216993216994216995216996216997216998216999217000217001217002217003217004217005217006217007217008217009217010217011217012217013217014217015217016217017217018217019217020217021217022217023217024217025217026217027217028217029217030217031217032217033217034217035217036217037217038217039217040217041217042217043217044217045217046217047217048217049217050217051217052217053217054217055217056217057217058217059217060217061217062217063217064217065217066217067217068217069217070217071217072217073217074217075217076217077217078217079217080217081217082217083217084217085217086217087217088217089217090217091217092217093217094217095217096217097217098217099217100217101217102217103217104217105217106217107217108217109217110217111217112217113217114217115217116217117217118217119217120217121217122217123217124217125217126217127217128217129217130217131217132217133217134217135217136217137217138217139217140217141217142217143217144217145217146217147217148217149217150217151217152217153217154217155217156217157217158217159217160217161217162217163217164217165217166217167217168217169217170217171217172217173217174217175217176217177217178217179217180217181217182217183217184217185217186217187217188217189217190217191217192217193217194217195217196217197217198217199217200217201217202217203217204217205217206217207217208217209217210217211217212217213217214217215217216217217217218217219217220217221217222217223217224217225217226217227217228217229217230217231217232217233217234217235217236217237217238217239217240217241217242217243217244217245217246217247217248217249217250217251217252217253217254217255217256217257217258217259217260217261217262217263217264217265217266217267217268217269217270217271217272217273217274217275217276217277217278217279217280217281217282217283217284217285217286217287217288217289217290217291217292217293217294217295217296217297217298217299217300217301217302217303217304217305217306217307217308217309217310217311217312217313217314217315217316217317217318217319217320217321217322217323217324217325217326217327217328217329217330217331217332217333217334217335217336217337217338217339217340217341217342217343217344217345217346217347217348217349217350217351217352217353217354217355217356217357217358217359217360217361217362217363217364217365217366217367217368217369217370217371217372217373217374217375217376217377217378217379217380217381217382217383217384217385217386217387217388217389217390217391217392217393217394217395217396217397217398217399217400217401217402217403217404217405217406217407217408217409217410217411217412217413217414217415217416217417217418217419217420217421217422217423217424217425217426217427217428217429217430217431217432217433217434217435217436217437217438217439217440217441217442217443217444217445217446217447217448217449217450217451217452217453217454217455217456217457217458217459217460217461217462217463217464217465217466217467217468217469217470217471217472217473217474217475217476217477217478217479217480217481217482217483217484217485217486217487217488217489217490217491217492217493217494217495217496217497217498217499217500217501217502217503217504217505217506217507217508217509217510217511217512217513217514217515217516217517217518217519217520217521217522217523217524217525217526217527217528217529217530217531217532217533217534217535217536217537217538217539217540217541217542217543217544217545217546217547217548217549217550217551217552217553217554217555217556217557217558217559217560217561217562217563217564217565217566217567217568217569217570217571217572217573217574217575217576217577217578217579217580217581217582217583217584217585217586217587217588217589217590217591217592217593217594217595217596217597217598217599217600217601217602217603217604217605217606217607217608217609217610217611217612217613217614217615217616217617217618217619217620217621217622217623217624217625217626217627217628217629217630217631217632217633217634217635217636217637217638217639217640217641217642217643217644217645217646217647217648217649217650217651217652217653217654217655217656217657217658217659217660217661217662217663217664217665217666217667217668217669217670217671217672217673217674217675217676217677217678217679217680217681217682217683217684217685217686217687217688217689217690217691217692217693217694217695217696217697217698217699217700217701217702217703217704217705217706217707217708217709217710217711217712217713217714217715217716217717217718217719217720217721217722217723217724217725217726217727217728217729217730217731217732217733217734217735217736217737217738217739217740217741217742217743217744217745217746217747217748217749217750217751217752217753217754217755217756217757217758217759217760217761217762217763217764217765217766217767217768217769217770217771217772217773217774217775217776217777217778217779217780217781217782217783217784217785217786217787217788217789217790217791217792217793217794217795217796217797217798217799217800217801217802217803217804217805217806217807217808217809217810217811217812217813217814217815217816217817217818217819217820217821217822217823217824217825217826217827217828217829217830217831217832217833217834217835217836217837217838217839217840217841217842217843217844217845217846217847217848217849217850217851217852217853217854217855217856217857217858217859217860217861217862217863217864217865217866217867217868217869217870217871217872217873217874217875217876217877217878217879217880217881217882217883217884217885217886217887217888217889217890217891217892217893217894217895217896217897217898217899217900217901217902217903217904217905217906217907217908217909217910217911217912217913217914217915217916217917217918217919217920217921217922217923217924217925217926217927217928217929217930217931217932217933217934217935217936217937217938217939217940217941217942217943217944217945217946217947217948217949217950217951217952217953217954217955217956217957217958217959217960217961217962217963217964217965217966217967217968217969217970217971217972217973217974217975217976217977217978217979217980217981217982217983217984217985217986217987217988217989217990217991217992217993217994217995217996217997217998217999218000218001218002218003218004218005218006218007218008218009218010218011218012218013218014218015218016218017218018218019218020218021218022218023218024218025218026218027218028218029218030218031218032218033218034218035218036218037218038218039218040218041218042218043218044218045218046218047218048218049218050218051218052218053218054218055218056218057218058218059218060218061218062218063218064218065218066218067218068218069218070218071218072218073218074218075218076218077218078218079218080218081218082218083218084218085218086218087218088218089218090218091218092218093218094218095218096218097218098218099218100218101218102218103218104218105218106218107218108218109218110218111218112218113218114218115218116218117218118218119218120218121218122218123218124218125218126218127218128218129218130218131218132218133218134218135218136218137218138218139218140218141218142218143218144218145218146218147218148218149218150218151218152218153218154218155218156218157218158218159218160218161218162218163218164218165218166218167218168218169218170218171218172218173218174218175218176218177218178218179218180218181218182218183218184218185218186218187218188218189218190218191218192218193218194218195218196218197218198218199218200218201218202218203218204218205218206218207218208218209218210218211218212218213218214218215218216218217218218218219218220218221218222218223218224218225218226218227218228218229218230218231218232218233218234218235218236218237218238218239218240218241218242218243218244218245218246218247218248218249218250218251218252218253218254218255218256218257218258218259218260218261218262218263218264218265218266218267218268218269218270218271218272218273218274218275218276218277218278218279218280218281218282218283218284218285218286218287218288218289218290218291218292218293218294218295218296218297218298218299218300218301218302218303218304218305218306218307218308218309218310218311218312218313218314218315218316218317218318218319218320218321218322218323218324218325218326218327218328218329218330218331218332218333218334218335218336218337218338218339218340218341218342218343218344218345218346218347218348218349218350218351218352218353218354218355218356218357218358218359218360218361218362218363218364218365218366218367218368218369218370218371218372218373218374218375218376218377218378218379218380218381218382218383218384218385218386218387218388218389218390218391218392218393218394218395218396218397218398218399218400218401218402218403218404218405218406218407218408218409218410218411218412218413218414218415218416218417218418218419218420218421218422218423218424218425218426218427218428218429218430218431218432218433218434218435218436218437218438218439218440218441218442218443218444218445218446218447218448218449218450218451218452218453218454218455218456218457218458218459218460218461218462218463218464218465218466218467218468218469218470218471218472218473218474218475218476218477218478218479218480218481218482218483218484218485218486218487218488218489218490218491218492218493218494218495218496218497218498218499218500218501218502218503218504218505218506218507218508218509218510218511218512218513218514218515218516218517218518218519218520218521218522218523218524218525218526218527218528218529218530218531218532218533218534218535218536218537218538218539218540218541218542218543218544218545218546218547218548218549218550218551218552218553218554218555218556218557218558218559218560218561218562218563218564218565218566218567218568218569218570218571218572218573218574218575218576218577218578218579218580218581218582218583218584218585218586218587218588218589218590218591218592218593218594218595218596218597218598218599218600218601218602218603218604218605218606218607218608218609218610218611218612218613218614218615218616218617218618218619218620218621218622218623218624218625218626218627218628218629218630218631218632218633218634218635218636218637218638218639218640218641218642218643218644218645218646218647218648218649218650218651218652218653218654218655218656218657218658218659218660218661218662218663218664218665218666218667218668218669218670218671218672218673218674218675218676218677218678218679218680218681218682218683218684218685218686218687218688218689218690218691218692218693218694218695218696218697218698218699218700218701218702218703218704218705218706218707218708218709218710218711218712218713218714218715218716218717218718218719218720218721218722218723218724218725218726218727218728218729218730218731218732218733218734218735218736218737218738218739218740218741218742218743218744218745218746218747218748218749218750218751218752218753218754218755218756218757218758218759218760218761218762218763218764218765218766218767218768218769218770218771218772218773218774218775218776218777218778218779218780218781218782218783218784218785218786218787218788218789218790218791218792218793218794218795218796218797218798218799
  1. /* sp.c
  2. *
  3. * Copyright (C) 2006-2023 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. /* Implementation by Sean Parkinson. */
  22. #ifdef HAVE_CONFIG_H
  23. #include <config.h>
  24. #endif
  25. #include <wolfssl/wolfcrypt/settings.h>
  26. #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH) || \
  27. defined(WOLFSSL_HAVE_SP_ECC)
  28. #include <wolfssl/wolfcrypt/error-crypt.h>
  29. #include <wolfssl/wolfcrypt/cpuid.h>
  30. #ifdef NO_INLINE
  31. #include <wolfssl/wolfcrypt/misc.h>
  32. #else
  33. #define WOLFSSL_MISC_INCLUDED
  34. #include <wolfcrypt/src/misc.c>
  35. #endif
  36. #ifdef RSA_LOW_MEM
  37. #ifndef WOLFSSL_SP_SMALL
  38. #define WOLFSSL_SP_SMALL
  39. #endif
  40. #endif
  41. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  42. #undef WOLFSSL_SP_SMALL_STACK
  43. #define WOLFSSL_SP_SMALL_STACK
  44. #endif
  45. #include <wolfssl/wolfcrypt/sp.h>
  46. #ifdef __IAR_SYSTEMS_ICC__
  47. #define __asm__ asm
  48. #define __volatile__ volatile
  49. #define WOLFSSL_NO_VAR_ASSIGN_REG
  50. #endif /* __IAR_SYSTEMS_ICC__ */
  51. #ifdef __KEIL__
  52. #define __asm__ __asm
  53. #define __volatile__ volatile
  54. #endif
  55. #ifdef WOLFSSL_SP_ARM_THUMB_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. #ifndef WOLFSSL_SP_LARGE_CODE
  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. SP_NOINLINE static void sp_2048_mul_8(sp_digit* r, const sp_digit* a,
  223. const sp_digit* b)
  224. {
  225. sp_digit t[8 * 2];
  226. sp_digit* tmp = t;
  227. __asm__ __volatile__ (
  228. "movs r3, #0\n\t"
  229. "movs r4, #0\n\t"
  230. "mov r8, r3\n\t"
  231. "mov r11, %[tmp]\n\t"
  232. "mov r9, %[a]\n\t"
  233. "mov r10, %[b]\n\t"
  234. "movs r6, #32\n\t"
  235. "add r6, r6, r9\n\t"
  236. "mov r12, r6\n\t"
  237. "\n"
  238. "L_sp_2048_mul_8_words_%=:\n\t"
  239. "movs %[tmp], #0\n\t"
  240. "movs r5, #0\n\t"
  241. "movs r6, #28\n\t"
  242. "mov %[a], r8\n\t"
  243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  244. "subs %[a], %[a], r6\n\t"
  245. #else
  246. "sub %[a], %[a], r6\n\t"
  247. #endif
  248. #ifdef WOLFSSL_KEIL
  249. "sbcs r6, r6, r6\n\t"
  250. #elif defined(__clang__)
  251. "sbcs r6, r6\n\t"
  252. #else
  253. "sbc r6, r6\n\t"
  254. #endif
  255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  256. "mvns r6, r6\n\t"
  257. #else
  258. "mvn r6, r6\n\t"
  259. #endif
  260. #ifdef WOLFSSL_KEIL
  261. "ands %[a], %[a], r6\n\t"
  262. #elif defined(__clang__)
  263. "ands %[a], r6\n\t"
  264. #else
  265. "and %[a], r6\n\t"
  266. #endif
  267. "mov %[b], r8\n\t"
  268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  269. "subs %[b], %[b], %[a]\n\t"
  270. #else
  271. "sub %[b], %[b], %[a]\n\t"
  272. #endif
  273. "add %[a], %[a], r9\n\t"
  274. "add %[b], %[b], r10\n\t"
  275. "\n"
  276. "L_sp_2048_mul_8_mul_%=:\n\t"
  277. "# Multiply Start\n\t"
  278. "ldrh r6, [%[a]]\n\t"
  279. "ldrh r7, [%[b]]\n\t"
  280. #ifdef WOLFSSL_KEIL
  281. "muls r7, r6, r7\n\t"
  282. #elif defined(__clang__)
  283. "muls r7, r6\n\t"
  284. #else
  285. "mul r7, r6\n\t"
  286. #endif
  287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  288. "adds r3, r3, r7\n\t"
  289. #else
  290. "add r3, r3, r7\n\t"
  291. #endif
  292. #ifdef WOLFSSL_KEIL
  293. "adcs r4, r4, %[tmp]\n\t"
  294. #elif defined(__clang__)
  295. "adcs r4, %[tmp]\n\t"
  296. #else
  297. "adc r4, %[tmp]\n\t"
  298. #endif
  299. #ifdef WOLFSSL_KEIL
  300. "adcs r5, r5, %[tmp]\n\t"
  301. #elif defined(__clang__)
  302. "adcs r5, %[tmp]\n\t"
  303. #else
  304. "adc r5, %[tmp]\n\t"
  305. #endif
  306. "ldr r7, [%[b]]\n\t"
  307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  308. "lsrs r7, r7, #16\n\t"
  309. #else
  310. "lsr r7, r7, #16\n\t"
  311. #endif
  312. #ifdef WOLFSSL_KEIL
  313. "muls r6, r7, r6\n\t"
  314. #elif defined(__clang__)
  315. "muls r6, r7\n\t"
  316. #else
  317. "mul r6, r7\n\t"
  318. #endif
  319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  320. "lsrs r7, r6, #16\n\t"
  321. #else
  322. "lsr r7, r6, #16\n\t"
  323. #endif
  324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  325. "lsls r6, r6, #16\n\t"
  326. #else
  327. "lsl r6, r6, #16\n\t"
  328. #endif
  329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  330. "adds r3, r3, r6\n\t"
  331. #else
  332. "add r3, r3, r6\n\t"
  333. #endif
  334. #ifdef WOLFSSL_KEIL
  335. "adcs r4, r4, r7\n\t"
  336. #elif defined(__clang__)
  337. "adcs r4, r7\n\t"
  338. #else
  339. "adc r4, r7\n\t"
  340. #endif
  341. #ifdef WOLFSSL_KEIL
  342. "adcs r5, r5, %[tmp]\n\t"
  343. #elif defined(__clang__)
  344. "adcs r5, %[tmp]\n\t"
  345. #else
  346. "adc r5, %[tmp]\n\t"
  347. #endif
  348. "ldr r6, [%[a]]\n\t"
  349. "ldr r7, [%[b]]\n\t"
  350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  351. "lsrs r6, r6, #16\n\t"
  352. #else
  353. "lsr r6, r6, #16\n\t"
  354. #endif
  355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  356. "lsrs r7, r7, #16\n\t"
  357. #else
  358. "lsr r7, r7, #16\n\t"
  359. #endif
  360. #ifdef WOLFSSL_KEIL
  361. "muls r7, r6, r7\n\t"
  362. #elif defined(__clang__)
  363. "muls r7, r6\n\t"
  364. #else
  365. "mul r7, r6\n\t"
  366. #endif
  367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  368. "adds r4, r4, r7\n\t"
  369. #else
  370. "add r4, r4, r7\n\t"
  371. #endif
  372. #ifdef WOLFSSL_KEIL
  373. "adcs r5, r5, %[tmp]\n\t"
  374. #elif defined(__clang__)
  375. "adcs r5, %[tmp]\n\t"
  376. #else
  377. "adc r5, %[tmp]\n\t"
  378. #endif
  379. "ldrh r7, [%[b]]\n\t"
  380. #ifdef WOLFSSL_KEIL
  381. "muls r6, r7, r6\n\t"
  382. #elif defined(__clang__)
  383. "muls r6, r7\n\t"
  384. #else
  385. "mul r6, r7\n\t"
  386. #endif
  387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  388. "lsrs r7, r6, #16\n\t"
  389. #else
  390. "lsr r7, r6, #16\n\t"
  391. #endif
  392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  393. "lsls r6, r6, #16\n\t"
  394. #else
  395. "lsl r6, r6, #16\n\t"
  396. #endif
  397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  398. "adds r3, r3, r6\n\t"
  399. #else
  400. "add r3, r3, r6\n\t"
  401. #endif
  402. #ifdef WOLFSSL_KEIL
  403. "adcs r4, r4, r7\n\t"
  404. #elif defined(__clang__)
  405. "adcs r4, r7\n\t"
  406. #else
  407. "adc r4, r7\n\t"
  408. #endif
  409. #ifdef WOLFSSL_KEIL
  410. "adcs r5, r5, %[tmp]\n\t"
  411. #elif defined(__clang__)
  412. "adcs r5, %[tmp]\n\t"
  413. #else
  414. "adc r5, %[tmp]\n\t"
  415. #endif
  416. "# Multiply Done\n\t"
  417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  418. "adds %[a], %[a], #4\n\t"
  419. #else
  420. "add %[a], %[a], #4\n\t"
  421. #endif
  422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  423. "subs %[b], %[b], #4\n\t"
  424. #else
  425. "sub %[b], %[b], #4\n\t"
  426. #endif
  427. "cmp %[a], r12\n\t"
  428. "beq L_sp_2048_mul_8_done_mul_%=\n\t"
  429. "mov r6, r8\n\t"
  430. "add r6, r6, r9\n\t"
  431. "cmp %[a], r6\n\t"
  432. "ble L_sp_2048_mul_8_mul_%=\n\t"
  433. "\n"
  434. "L_sp_2048_mul_8_done_mul_%=:\n\t"
  435. "mov %[tmp], r11\n\t"
  436. "mov r7, r8\n\t"
  437. "str r3, [%[tmp], r7]\n\t"
  438. "movs r3, r4\n\t"
  439. "movs r4, r5\n\t"
  440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  441. "adds r7, r7, #4\n\t"
  442. #else
  443. "add r7, r7, #4\n\t"
  444. #endif
  445. "mov r8, r7\n\t"
  446. "movs r6, #56\n\t"
  447. "cmp r7, r6\n\t"
  448. "ble L_sp_2048_mul_8_words_%=\n\t"
  449. "str r3, [%[tmp], r7]\n\t"
  450. "mov %[a], r9\n\t"
  451. "mov %[b], r10\n\t"
  452. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  453. :
  454. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  455. );
  456. XMEMCPY(r, t, sizeof(t));
  457. }
  458. #else
  459. /* Multiply a and b into r. (r = a * b)
  460. *
  461. * r A single precision integer.
  462. * a A single precision integer.
  463. * b A single precision integer.
  464. */
  465. SP_NOINLINE static void sp_2048_mul_8(sp_digit* r, const sp_digit* a,
  466. const sp_digit* b)
  467. {
  468. __asm__ __volatile__ (
  469. "sub sp, sp, #32\n\t"
  470. "mov r8, %[r]\n\t"
  471. "mov r9, %[a]\n\t"
  472. "mov r10, %[b]\n\t"
  473. "movs %[r], #0\n\t"
  474. "# A[0] * B[0]\n\t"
  475. "ldr %[a], [%[a]]\n\t"
  476. "ldr %[b], [%[b]]\n\t"
  477. "uxth r6, %[a]\n\t"
  478. "uxth r3, %[b]\n\t"
  479. #ifdef WOLFSSL_KEIL
  480. "muls r3, r6, r3\n\t"
  481. #elif defined(__clang__)
  482. "muls r3, r6\n\t"
  483. #else
  484. "mul r3, r6\n\t"
  485. #endif
  486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  487. "lsrs r7, %[b], #16\n\t"
  488. #else
  489. "lsr r7, %[b], #16\n\t"
  490. #endif
  491. #ifdef WOLFSSL_KEIL
  492. "muls r6, r7, r6\n\t"
  493. #elif defined(__clang__)
  494. "muls r6, r7\n\t"
  495. #else
  496. "mul r6, r7\n\t"
  497. #endif
  498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  499. "lsrs r4, r6, #16\n\t"
  500. #else
  501. "lsr r4, r6, #16\n\t"
  502. #endif
  503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  504. "lsls r6, r6, #16\n\t"
  505. #else
  506. "lsl r6, r6, #16\n\t"
  507. #endif
  508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  509. "adds r3, r3, r6\n\t"
  510. #else
  511. "add r3, r3, r6\n\t"
  512. #endif
  513. #ifdef WOLFSSL_KEIL
  514. "adcs r4, r4, %[r]\n\t"
  515. #elif defined(__clang__)
  516. "adcs r4, %[r]\n\t"
  517. #else
  518. "adc r4, %[r]\n\t"
  519. #endif
  520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  521. "lsrs r6, %[a], #16\n\t"
  522. #else
  523. "lsr r6, %[a], #16\n\t"
  524. #endif
  525. #ifdef WOLFSSL_KEIL
  526. "muls r7, r6, r7\n\t"
  527. #elif defined(__clang__)
  528. "muls r7, r6\n\t"
  529. #else
  530. "mul r7, r6\n\t"
  531. #endif
  532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  533. "adds r4, r4, r7\n\t"
  534. #else
  535. "add r4, r4, r7\n\t"
  536. #endif
  537. "uxth r7, %[b]\n\t"
  538. #ifdef WOLFSSL_KEIL
  539. "muls r6, r7, r6\n\t"
  540. #elif defined(__clang__)
  541. "muls r6, r7\n\t"
  542. #else
  543. "mul r6, r7\n\t"
  544. #endif
  545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  546. "lsrs r7, r6, #16\n\t"
  547. #else
  548. "lsr r7, r6, #16\n\t"
  549. #endif
  550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  551. "lsls r6, r6, #16\n\t"
  552. #else
  553. "lsl r6, r6, #16\n\t"
  554. #endif
  555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  556. "adds r3, r3, r6\n\t"
  557. #else
  558. "add r3, r3, r6\n\t"
  559. #endif
  560. #ifdef WOLFSSL_KEIL
  561. "adcs r4, r4, r7\n\t"
  562. #elif defined(__clang__)
  563. "adcs r4, r7\n\t"
  564. #else
  565. "adc r4, r7\n\t"
  566. #endif
  567. "movs r5, #0\n\t"
  568. "str r3, [sp]\n\t"
  569. "# A[0] * B[1]\n\t"
  570. "movs r3, #0\n\t"
  571. "mov %[a], r9\n\t"
  572. "mov %[b], r10\n\t"
  573. "ldr %[a], [%[a]]\n\t"
  574. "ldr %[b], [%[b], #4]\n\t"
  575. "uxth r6, %[a]\n\t"
  576. "uxth r7, %[b]\n\t"
  577. #ifdef WOLFSSL_KEIL
  578. "muls r7, r6, r7\n\t"
  579. #elif defined(__clang__)
  580. "muls r7, r6\n\t"
  581. #else
  582. "mul r7, r6\n\t"
  583. #endif
  584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  585. "adds r4, r4, r7\n\t"
  586. #else
  587. "add r4, r4, r7\n\t"
  588. #endif
  589. #ifdef WOLFSSL_KEIL
  590. "adcs r5, r5, %[r]\n\t"
  591. #elif defined(__clang__)
  592. "adcs r5, %[r]\n\t"
  593. #else
  594. "adc r5, %[r]\n\t"
  595. #endif
  596. #ifdef WOLFSSL_KEIL
  597. "adcs r3, r3, %[r]\n\t"
  598. #elif defined(__clang__)
  599. "adcs r3, %[r]\n\t"
  600. #else
  601. "adc r3, %[r]\n\t"
  602. #endif
  603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  604. "lsrs r7, %[b], #16\n\t"
  605. #else
  606. "lsr r7, %[b], #16\n\t"
  607. #endif
  608. #ifdef WOLFSSL_KEIL
  609. "muls r6, r7, r6\n\t"
  610. #elif defined(__clang__)
  611. "muls r6, r7\n\t"
  612. #else
  613. "mul r6, r7\n\t"
  614. #endif
  615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  616. "lsrs r7, r6, #16\n\t"
  617. #else
  618. "lsr r7, r6, #16\n\t"
  619. #endif
  620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  621. "lsls r6, r6, #16\n\t"
  622. #else
  623. "lsl r6, r6, #16\n\t"
  624. #endif
  625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  626. "adds r4, r4, r6\n\t"
  627. #else
  628. "add r4, r4, r6\n\t"
  629. #endif
  630. #ifdef WOLFSSL_KEIL
  631. "adcs r5, r5, r7\n\t"
  632. #elif defined(__clang__)
  633. "adcs r5, r7\n\t"
  634. #else
  635. "adc r5, r7\n\t"
  636. #endif
  637. #ifdef WOLFSSL_KEIL
  638. "adcs r3, r3, %[r]\n\t"
  639. #elif defined(__clang__)
  640. "adcs r3, %[r]\n\t"
  641. #else
  642. "adc r3, %[r]\n\t"
  643. #endif
  644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  645. "lsrs r6, %[a], #16\n\t"
  646. #else
  647. "lsr r6, %[a], #16\n\t"
  648. #endif
  649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  650. "lsrs r7, %[b], #16\n\t"
  651. #else
  652. "lsr r7, %[b], #16\n\t"
  653. #endif
  654. #ifdef WOLFSSL_KEIL
  655. "muls r7, r6, r7\n\t"
  656. #elif defined(__clang__)
  657. "muls r7, r6\n\t"
  658. #else
  659. "mul r7, r6\n\t"
  660. #endif
  661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  662. "adds r5, r5, r7\n\t"
  663. #else
  664. "add r5, r5, r7\n\t"
  665. #endif
  666. #ifdef WOLFSSL_KEIL
  667. "adcs r3, r3, %[r]\n\t"
  668. #elif defined(__clang__)
  669. "adcs r3, %[r]\n\t"
  670. #else
  671. "adc r3, %[r]\n\t"
  672. #endif
  673. "uxth r7, %[b]\n\t"
  674. #ifdef WOLFSSL_KEIL
  675. "muls r6, r7, r6\n\t"
  676. #elif defined(__clang__)
  677. "muls r6, r7\n\t"
  678. #else
  679. "mul r6, r7\n\t"
  680. #endif
  681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  682. "lsrs r7, r6, #16\n\t"
  683. #else
  684. "lsr r7, r6, #16\n\t"
  685. #endif
  686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  687. "lsls r6, r6, #16\n\t"
  688. #else
  689. "lsl r6, r6, #16\n\t"
  690. #endif
  691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  692. "adds r4, r4, r6\n\t"
  693. #else
  694. "add r4, r4, r6\n\t"
  695. #endif
  696. #ifdef WOLFSSL_KEIL
  697. "adcs r5, r5, r7\n\t"
  698. #elif defined(__clang__)
  699. "adcs r5, r7\n\t"
  700. #else
  701. "adc r5, r7\n\t"
  702. #endif
  703. #ifdef WOLFSSL_KEIL
  704. "adcs r3, r3, %[r]\n\t"
  705. #elif defined(__clang__)
  706. "adcs r3, %[r]\n\t"
  707. #else
  708. "adc r3, %[r]\n\t"
  709. #endif
  710. "# A[1] * B[0]\n\t"
  711. "mov %[a], r9\n\t"
  712. "mov %[b], r10\n\t"
  713. "ldr %[a], [%[a], #4]\n\t"
  714. "ldr %[b], [%[b]]\n\t"
  715. "uxth r6, %[a]\n\t"
  716. "uxth r7, %[b]\n\t"
  717. #ifdef WOLFSSL_KEIL
  718. "muls r7, r6, r7\n\t"
  719. #elif defined(__clang__)
  720. "muls r7, r6\n\t"
  721. #else
  722. "mul r7, r6\n\t"
  723. #endif
  724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  725. "adds r4, r4, r7\n\t"
  726. #else
  727. "add r4, r4, r7\n\t"
  728. #endif
  729. #ifdef WOLFSSL_KEIL
  730. "adcs r5, r5, %[r]\n\t"
  731. #elif defined(__clang__)
  732. "adcs r5, %[r]\n\t"
  733. #else
  734. "adc r5, %[r]\n\t"
  735. #endif
  736. #ifdef WOLFSSL_KEIL
  737. "adcs r3, r3, %[r]\n\t"
  738. #elif defined(__clang__)
  739. "adcs r3, %[r]\n\t"
  740. #else
  741. "adc r3, %[r]\n\t"
  742. #endif
  743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  744. "lsrs r7, %[b], #16\n\t"
  745. #else
  746. "lsr r7, %[b], #16\n\t"
  747. #endif
  748. #ifdef WOLFSSL_KEIL
  749. "muls r6, r7, r6\n\t"
  750. #elif defined(__clang__)
  751. "muls r6, r7\n\t"
  752. #else
  753. "mul r6, r7\n\t"
  754. #endif
  755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  756. "lsrs r7, r6, #16\n\t"
  757. #else
  758. "lsr r7, r6, #16\n\t"
  759. #endif
  760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  761. "lsls r6, r6, #16\n\t"
  762. #else
  763. "lsl r6, r6, #16\n\t"
  764. #endif
  765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  766. "adds r4, r4, r6\n\t"
  767. #else
  768. "add r4, r4, r6\n\t"
  769. #endif
  770. #ifdef WOLFSSL_KEIL
  771. "adcs r5, r5, r7\n\t"
  772. #elif defined(__clang__)
  773. "adcs r5, r7\n\t"
  774. #else
  775. "adc r5, r7\n\t"
  776. #endif
  777. #ifdef WOLFSSL_KEIL
  778. "adcs r3, r3, %[r]\n\t"
  779. #elif defined(__clang__)
  780. "adcs r3, %[r]\n\t"
  781. #else
  782. "adc r3, %[r]\n\t"
  783. #endif
  784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  785. "lsrs r6, %[a], #16\n\t"
  786. #else
  787. "lsr r6, %[a], #16\n\t"
  788. #endif
  789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  790. "lsrs r7, %[b], #16\n\t"
  791. #else
  792. "lsr r7, %[b], #16\n\t"
  793. #endif
  794. #ifdef WOLFSSL_KEIL
  795. "muls r7, r6, r7\n\t"
  796. #elif defined(__clang__)
  797. "muls r7, r6\n\t"
  798. #else
  799. "mul r7, r6\n\t"
  800. #endif
  801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  802. "adds r5, r5, r7\n\t"
  803. #else
  804. "add r5, r5, r7\n\t"
  805. #endif
  806. #ifdef WOLFSSL_KEIL
  807. "adcs r3, r3, %[r]\n\t"
  808. #elif defined(__clang__)
  809. "adcs r3, %[r]\n\t"
  810. #else
  811. "adc r3, %[r]\n\t"
  812. #endif
  813. "uxth r7, %[b]\n\t"
  814. #ifdef WOLFSSL_KEIL
  815. "muls r6, r7, r6\n\t"
  816. #elif defined(__clang__)
  817. "muls r6, r7\n\t"
  818. #else
  819. "mul r6, r7\n\t"
  820. #endif
  821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  822. "lsrs r7, r6, #16\n\t"
  823. #else
  824. "lsr r7, r6, #16\n\t"
  825. #endif
  826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  827. "lsls r6, r6, #16\n\t"
  828. #else
  829. "lsl r6, r6, #16\n\t"
  830. #endif
  831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  832. "adds r4, r4, r6\n\t"
  833. #else
  834. "add r4, r4, r6\n\t"
  835. #endif
  836. #ifdef WOLFSSL_KEIL
  837. "adcs r5, r5, r7\n\t"
  838. #elif defined(__clang__)
  839. "adcs r5, r7\n\t"
  840. #else
  841. "adc r5, r7\n\t"
  842. #endif
  843. #ifdef WOLFSSL_KEIL
  844. "adcs r3, r3, %[r]\n\t"
  845. #elif defined(__clang__)
  846. "adcs r3, %[r]\n\t"
  847. #else
  848. "adc r3, %[r]\n\t"
  849. #endif
  850. "str r4, [sp, #4]\n\t"
  851. "# A[2] * B[0]\n\t"
  852. "movs r4, #0\n\t"
  853. "mov %[a], r9\n\t"
  854. "mov %[b], r10\n\t"
  855. "ldr %[a], [%[a], #8]\n\t"
  856. "ldr %[b], [%[b]]\n\t"
  857. "uxth r6, %[a]\n\t"
  858. "uxth r7, %[b]\n\t"
  859. #ifdef WOLFSSL_KEIL
  860. "muls r7, r6, r7\n\t"
  861. #elif defined(__clang__)
  862. "muls r7, r6\n\t"
  863. #else
  864. "mul r7, r6\n\t"
  865. #endif
  866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  867. "adds r5, r5, r7\n\t"
  868. #else
  869. "add r5, r5, r7\n\t"
  870. #endif
  871. #ifdef WOLFSSL_KEIL
  872. "adcs r3, r3, %[r]\n\t"
  873. #elif defined(__clang__)
  874. "adcs r3, %[r]\n\t"
  875. #else
  876. "adc r3, %[r]\n\t"
  877. #endif
  878. #ifdef WOLFSSL_KEIL
  879. "adcs r4, r4, %[r]\n\t"
  880. #elif defined(__clang__)
  881. "adcs r4, %[r]\n\t"
  882. #else
  883. "adc r4, %[r]\n\t"
  884. #endif
  885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  886. "lsrs r7, %[b], #16\n\t"
  887. #else
  888. "lsr r7, %[b], #16\n\t"
  889. #endif
  890. #ifdef WOLFSSL_KEIL
  891. "muls r6, r7, r6\n\t"
  892. #elif defined(__clang__)
  893. "muls r6, r7\n\t"
  894. #else
  895. "mul r6, r7\n\t"
  896. #endif
  897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  898. "lsrs r7, r6, #16\n\t"
  899. #else
  900. "lsr r7, r6, #16\n\t"
  901. #endif
  902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  903. "lsls r6, r6, #16\n\t"
  904. #else
  905. "lsl r6, r6, #16\n\t"
  906. #endif
  907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  908. "adds r5, r5, r6\n\t"
  909. #else
  910. "add r5, r5, r6\n\t"
  911. #endif
  912. #ifdef WOLFSSL_KEIL
  913. "adcs r3, r3, r7\n\t"
  914. #elif defined(__clang__)
  915. "adcs r3, r7\n\t"
  916. #else
  917. "adc r3, r7\n\t"
  918. #endif
  919. #ifdef WOLFSSL_KEIL
  920. "adcs r4, r4, %[r]\n\t"
  921. #elif defined(__clang__)
  922. "adcs r4, %[r]\n\t"
  923. #else
  924. "adc r4, %[r]\n\t"
  925. #endif
  926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  927. "lsrs r6, %[a], #16\n\t"
  928. #else
  929. "lsr r6, %[a], #16\n\t"
  930. #endif
  931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  932. "lsrs r7, %[b], #16\n\t"
  933. #else
  934. "lsr r7, %[b], #16\n\t"
  935. #endif
  936. #ifdef WOLFSSL_KEIL
  937. "muls r7, r6, r7\n\t"
  938. #elif defined(__clang__)
  939. "muls r7, r6\n\t"
  940. #else
  941. "mul r7, r6\n\t"
  942. #endif
  943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  944. "adds r3, r3, r7\n\t"
  945. #else
  946. "add r3, r3, r7\n\t"
  947. #endif
  948. #ifdef WOLFSSL_KEIL
  949. "adcs r4, r4, %[r]\n\t"
  950. #elif defined(__clang__)
  951. "adcs r4, %[r]\n\t"
  952. #else
  953. "adc r4, %[r]\n\t"
  954. #endif
  955. "uxth r7, %[b]\n\t"
  956. #ifdef WOLFSSL_KEIL
  957. "muls r6, r7, r6\n\t"
  958. #elif defined(__clang__)
  959. "muls r6, r7\n\t"
  960. #else
  961. "mul r6, r7\n\t"
  962. #endif
  963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  964. "lsrs r7, r6, #16\n\t"
  965. #else
  966. "lsr r7, r6, #16\n\t"
  967. #endif
  968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  969. "lsls r6, r6, #16\n\t"
  970. #else
  971. "lsl r6, r6, #16\n\t"
  972. #endif
  973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  974. "adds r5, r5, r6\n\t"
  975. #else
  976. "add r5, r5, r6\n\t"
  977. #endif
  978. #ifdef WOLFSSL_KEIL
  979. "adcs r3, r3, r7\n\t"
  980. #elif defined(__clang__)
  981. "adcs r3, r7\n\t"
  982. #else
  983. "adc r3, r7\n\t"
  984. #endif
  985. #ifdef WOLFSSL_KEIL
  986. "adcs r4, r4, %[r]\n\t"
  987. #elif defined(__clang__)
  988. "adcs r4, %[r]\n\t"
  989. #else
  990. "adc r4, %[r]\n\t"
  991. #endif
  992. "# A[1] * B[1]\n\t"
  993. "mov %[a], r9\n\t"
  994. "mov %[b], r10\n\t"
  995. "ldr %[a], [%[a], #4]\n\t"
  996. "ldr %[b], [%[b], #4]\n\t"
  997. "uxth r6, %[a]\n\t"
  998. "uxth r7, %[b]\n\t"
  999. #ifdef WOLFSSL_KEIL
  1000. "muls r7, r6, r7\n\t"
  1001. #elif defined(__clang__)
  1002. "muls r7, r6\n\t"
  1003. #else
  1004. "mul r7, r6\n\t"
  1005. #endif
  1006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1007. "adds r5, r5, r7\n\t"
  1008. #else
  1009. "add r5, r5, r7\n\t"
  1010. #endif
  1011. #ifdef WOLFSSL_KEIL
  1012. "adcs r3, r3, %[r]\n\t"
  1013. #elif defined(__clang__)
  1014. "adcs r3, %[r]\n\t"
  1015. #else
  1016. "adc r3, %[r]\n\t"
  1017. #endif
  1018. #ifdef WOLFSSL_KEIL
  1019. "adcs r4, r4, %[r]\n\t"
  1020. #elif defined(__clang__)
  1021. "adcs r4, %[r]\n\t"
  1022. #else
  1023. "adc r4, %[r]\n\t"
  1024. #endif
  1025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1026. "lsrs r7, %[b], #16\n\t"
  1027. #else
  1028. "lsr r7, %[b], #16\n\t"
  1029. #endif
  1030. #ifdef WOLFSSL_KEIL
  1031. "muls r6, r7, r6\n\t"
  1032. #elif defined(__clang__)
  1033. "muls r6, r7\n\t"
  1034. #else
  1035. "mul r6, r7\n\t"
  1036. #endif
  1037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1038. "lsrs r7, r6, #16\n\t"
  1039. #else
  1040. "lsr r7, r6, #16\n\t"
  1041. #endif
  1042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1043. "lsls r6, r6, #16\n\t"
  1044. #else
  1045. "lsl r6, r6, #16\n\t"
  1046. #endif
  1047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1048. "adds r5, r5, r6\n\t"
  1049. #else
  1050. "add r5, r5, r6\n\t"
  1051. #endif
  1052. #ifdef WOLFSSL_KEIL
  1053. "adcs r3, r3, r7\n\t"
  1054. #elif defined(__clang__)
  1055. "adcs r3, r7\n\t"
  1056. #else
  1057. "adc r3, r7\n\t"
  1058. #endif
  1059. #ifdef WOLFSSL_KEIL
  1060. "adcs r4, r4, %[r]\n\t"
  1061. #elif defined(__clang__)
  1062. "adcs r4, %[r]\n\t"
  1063. #else
  1064. "adc r4, %[r]\n\t"
  1065. #endif
  1066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1067. "lsrs r6, %[a], #16\n\t"
  1068. #else
  1069. "lsr r6, %[a], #16\n\t"
  1070. #endif
  1071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1072. "lsrs r7, %[b], #16\n\t"
  1073. #else
  1074. "lsr r7, %[b], #16\n\t"
  1075. #endif
  1076. #ifdef WOLFSSL_KEIL
  1077. "muls r7, r6, r7\n\t"
  1078. #elif defined(__clang__)
  1079. "muls r7, r6\n\t"
  1080. #else
  1081. "mul r7, r6\n\t"
  1082. #endif
  1083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1084. "adds r3, r3, r7\n\t"
  1085. #else
  1086. "add r3, r3, r7\n\t"
  1087. #endif
  1088. #ifdef WOLFSSL_KEIL
  1089. "adcs r4, r4, %[r]\n\t"
  1090. #elif defined(__clang__)
  1091. "adcs r4, %[r]\n\t"
  1092. #else
  1093. "adc r4, %[r]\n\t"
  1094. #endif
  1095. "uxth r7, %[b]\n\t"
  1096. #ifdef WOLFSSL_KEIL
  1097. "muls r6, r7, r6\n\t"
  1098. #elif defined(__clang__)
  1099. "muls r6, r7\n\t"
  1100. #else
  1101. "mul r6, r7\n\t"
  1102. #endif
  1103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1104. "lsrs r7, r6, #16\n\t"
  1105. #else
  1106. "lsr r7, r6, #16\n\t"
  1107. #endif
  1108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1109. "lsls r6, r6, #16\n\t"
  1110. #else
  1111. "lsl r6, r6, #16\n\t"
  1112. #endif
  1113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1114. "adds r5, r5, r6\n\t"
  1115. #else
  1116. "add r5, r5, r6\n\t"
  1117. #endif
  1118. #ifdef WOLFSSL_KEIL
  1119. "adcs r3, r3, r7\n\t"
  1120. #elif defined(__clang__)
  1121. "adcs r3, r7\n\t"
  1122. #else
  1123. "adc r3, r7\n\t"
  1124. #endif
  1125. #ifdef WOLFSSL_KEIL
  1126. "adcs r4, r4, %[r]\n\t"
  1127. #elif defined(__clang__)
  1128. "adcs r4, %[r]\n\t"
  1129. #else
  1130. "adc r4, %[r]\n\t"
  1131. #endif
  1132. "# A[0] * B[2]\n\t"
  1133. "mov %[a], r9\n\t"
  1134. "mov %[b], r10\n\t"
  1135. "ldr %[a], [%[a]]\n\t"
  1136. "ldr %[b], [%[b], #8]\n\t"
  1137. "uxth r6, %[a]\n\t"
  1138. "uxth r7, %[b]\n\t"
  1139. #ifdef WOLFSSL_KEIL
  1140. "muls r7, r6, r7\n\t"
  1141. #elif defined(__clang__)
  1142. "muls r7, r6\n\t"
  1143. #else
  1144. "mul r7, r6\n\t"
  1145. #endif
  1146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1147. "adds r5, r5, r7\n\t"
  1148. #else
  1149. "add r5, r5, r7\n\t"
  1150. #endif
  1151. #ifdef WOLFSSL_KEIL
  1152. "adcs r3, r3, %[r]\n\t"
  1153. #elif defined(__clang__)
  1154. "adcs r3, %[r]\n\t"
  1155. #else
  1156. "adc r3, %[r]\n\t"
  1157. #endif
  1158. #ifdef WOLFSSL_KEIL
  1159. "adcs r4, r4, %[r]\n\t"
  1160. #elif defined(__clang__)
  1161. "adcs r4, %[r]\n\t"
  1162. #else
  1163. "adc r4, %[r]\n\t"
  1164. #endif
  1165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1166. "lsrs r7, %[b], #16\n\t"
  1167. #else
  1168. "lsr r7, %[b], #16\n\t"
  1169. #endif
  1170. #ifdef WOLFSSL_KEIL
  1171. "muls r6, r7, r6\n\t"
  1172. #elif defined(__clang__)
  1173. "muls r6, r7\n\t"
  1174. #else
  1175. "mul r6, r7\n\t"
  1176. #endif
  1177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1178. "lsrs r7, r6, #16\n\t"
  1179. #else
  1180. "lsr r7, r6, #16\n\t"
  1181. #endif
  1182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1183. "lsls r6, r6, #16\n\t"
  1184. #else
  1185. "lsl r6, r6, #16\n\t"
  1186. #endif
  1187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1188. "adds r5, r5, r6\n\t"
  1189. #else
  1190. "add r5, r5, r6\n\t"
  1191. #endif
  1192. #ifdef WOLFSSL_KEIL
  1193. "adcs r3, r3, r7\n\t"
  1194. #elif defined(__clang__)
  1195. "adcs r3, r7\n\t"
  1196. #else
  1197. "adc r3, r7\n\t"
  1198. #endif
  1199. #ifdef WOLFSSL_KEIL
  1200. "adcs r4, r4, %[r]\n\t"
  1201. #elif defined(__clang__)
  1202. "adcs r4, %[r]\n\t"
  1203. #else
  1204. "adc r4, %[r]\n\t"
  1205. #endif
  1206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1207. "lsrs r6, %[a], #16\n\t"
  1208. #else
  1209. "lsr r6, %[a], #16\n\t"
  1210. #endif
  1211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1212. "lsrs r7, %[b], #16\n\t"
  1213. #else
  1214. "lsr r7, %[b], #16\n\t"
  1215. #endif
  1216. #ifdef WOLFSSL_KEIL
  1217. "muls r7, r6, r7\n\t"
  1218. #elif defined(__clang__)
  1219. "muls r7, r6\n\t"
  1220. #else
  1221. "mul r7, r6\n\t"
  1222. #endif
  1223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1224. "adds r3, r3, r7\n\t"
  1225. #else
  1226. "add r3, r3, r7\n\t"
  1227. #endif
  1228. #ifdef WOLFSSL_KEIL
  1229. "adcs r4, r4, %[r]\n\t"
  1230. #elif defined(__clang__)
  1231. "adcs r4, %[r]\n\t"
  1232. #else
  1233. "adc r4, %[r]\n\t"
  1234. #endif
  1235. "uxth r7, %[b]\n\t"
  1236. #ifdef WOLFSSL_KEIL
  1237. "muls r6, r7, r6\n\t"
  1238. #elif defined(__clang__)
  1239. "muls r6, r7\n\t"
  1240. #else
  1241. "mul r6, r7\n\t"
  1242. #endif
  1243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1244. "lsrs r7, r6, #16\n\t"
  1245. #else
  1246. "lsr r7, r6, #16\n\t"
  1247. #endif
  1248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1249. "lsls r6, r6, #16\n\t"
  1250. #else
  1251. "lsl r6, r6, #16\n\t"
  1252. #endif
  1253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1254. "adds r5, r5, r6\n\t"
  1255. #else
  1256. "add r5, r5, r6\n\t"
  1257. #endif
  1258. #ifdef WOLFSSL_KEIL
  1259. "adcs r3, r3, r7\n\t"
  1260. #elif defined(__clang__)
  1261. "adcs r3, r7\n\t"
  1262. #else
  1263. "adc r3, r7\n\t"
  1264. #endif
  1265. #ifdef WOLFSSL_KEIL
  1266. "adcs r4, r4, %[r]\n\t"
  1267. #elif defined(__clang__)
  1268. "adcs r4, %[r]\n\t"
  1269. #else
  1270. "adc r4, %[r]\n\t"
  1271. #endif
  1272. "str r5, [sp, #8]\n\t"
  1273. "# A[0] * B[3]\n\t"
  1274. "movs r5, #0\n\t"
  1275. "mov %[a], r9\n\t"
  1276. "mov %[b], r10\n\t"
  1277. "ldr %[a], [%[a]]\n\t"
  1278. "ldr %[b], [%[b], #12]\n\t"
  1279. "uxth r6, %[a]\n\t"
  1280. "uxth r7, %[b]\n\t"
  1281. #ifdef WOLFSSL_KEIL
  1282. "muls r7, r6, r7\n\t"
  1283. #elif defined(__clang__)
  1284. "muls r7, r6\n\t"
  1285. #else
  1286. "mul r7, r6\n\t"
  1287. #endif
  1288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1289. "adds r3, r3, r7\n\t"
  1290. #else
  1291. "add r3, r3, r7\n\t"
  1292. #endif
  1293. #ifdef WOLFSSL_KEIL
  1294. "adcs r4, r4, %[r]\n\t"
  1295. #elif defined(__clang__)
  1296. "adcs r4, %[r]\n\t"
  1297. #else
  1298. "adc r4, %[r]\n\t"
  1299. #endif
  1300. #ifdef WOLFSSL_KEIL
  1301. "adcs r5, r5, %[r]\n\t"
  1302. #elif defined(__clang__)
  1303. "adcs r5, %[r]\n\t"
  1304. #else
  1305. "adc r5, %[r]\n\t"
  1306. #endif
  1307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1308. "lsrs r7, %[b], #16\n\t"
  1309. #else
  1310. "lsr r7, %[b], #16\n\t"
  1311. #endif
  1312. #ifdef WOLFSSL_KEIL
  1313. "muls r6, r7, r6\n\t"
  1314. #elif defined(__clang__)
  1315. "muls r6, r7\n\t"
  1316. #else
  1317. "mul r6, r7\n\t"
  1318. #endif
  1319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1320. "lsrs r7, r6, #16\n\t"
  1321. #else
  1322. "lsr r7, r6, #16\n\t"
  1323. #endif
  1324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1325. "lsls r6, r6, #16\n\t"
  1326. #else
  1327. "lsl r6, r6, #16\n\t"
  1328. #endif
  1329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1330. "adds r3, r3, r6\n\t"
  1331. #else
  1332. "add r3, r3, r6\n\t"
  1333. #endif
  1334. #ifdef WOLFSSL_KEIL
  1335. "adcs r4, r4, r7\n\t"
  1336. #elif defined(__clang__)
  1337. "adcs r4, r7\n\t"
  1338. #else
  1339. "adc r4, r7\n\t"
  1340. #endif
  1341. #ifdef WOLFSSL_KEIL
  1342. "adcs r5, r5, %[r]\n\t"
  1343. #elif defined(__clang__)
  1344. "adcs r5, %[r]\n\t"
  1345. #else
  1346. "adc r5, %[r]\n\t"
  1347. #endif
  1348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1349. "lsrs r6, %[a], #16\n\t"
  1350. #else
  1351. "lsr r6, %[a], #16\n\t"
  1352. #endif
  1353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1354. "lsrs r7, %[b], #16\n\t"
  1355. #else
  1356. "lsr r7, %[b], #16\n\t"
  1357. #endif
  1358. #ifdef WOLFSSL_KEIL
  1359. "muls r7, r6, r7\n\t"
  1360. #elif defined(__clang__)
  1361. "muls r7, r6\n\t"
  1362. #else
  1363. "mul r7, r6\n\t"
  1364. #endif
  1365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1366. "adds r4, r4, r7\n\t"
  1367. #else
  1368. "add r4, r4, r7\n\t"
  1369. #endif
  1370. #ifdef WOLFSSL_KEIL
  1371. "adcs r5, r5, %[r]\n\t"
  1372. #elif defined(__clang__)
  1373. "adcs r5, %[r]\n\t"
  1374. #else
  1375. "adc r5, %[r]\n\t"
  1376. #endif
  1377. "uxth r7, %[b]\n\t"
  1378. #ifdef WOLFSSL_KEIL
  1379. "muls r6, r7, r6\n\t"
  1380. #elif defined(__clang__)
  1381. "muls r6, r7\n\t"
  1382. #else
  1383. "mul r6, r7\n\t"
  1384. #endif
  1385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1386. "lsrs r7, r6, #16\n\t"
  1387. #else
  1388. "lsr r7, r6, #16\n\t"
  1389. #endif
  1390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1391. "lsls r6, r6, #16\n\t"
  1392. #else
  1393. "lsl r6, r6, #16\n\t"
  1394. #endif
  1395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1396. "adds r3, r3, r6\n\t"
  1397. #else
  1398. "add r3, r3, r6\n\t"
  1399. #endif
  1400. #ifdef WOLFSSL_KEIL
  1401. "adcs r4, r4, r7\n\t"
  1402. #elif defined(__clang__)
  1403. "adcs r4, r7\n\t"
  1404. #else
  1405. "adc r4, r7\n\t"
  1406. #endif
  1407. #ifdef WOLFSSL_KEIL
  1408. "adcs r5, r5, %[r]\n\t"
  1409. #elif defined(__clang__)
  1410. "adcs r5, %[r]\n\t"
  1411. #else
  1412. "adc r5, %[r]\n\t"
  1413. #endif
  1414. "# A[1] * B[2]\n\t"
  1415. "mov %[a], r9\n\t"
  1416. "mov %[b], r10\n\t"
  1417. "ldr %[a], [%[a], #4]\n\t"
  1418. "ldr %[b], [%[b], #8]\n\t"
  1419. "uxth r6, %[a]\n\t"
  1420. "uxth r7, %[b]\n\t"
  1421. #ifdef WOLFSSL_KEIL
  1422. "muls r7, r6, r7\n\t"
  1423. #elif defined(__clang__)
  1424. "muls r7, r6\n\t"
  1425. #else
  1426. "mul r7, r6\n\t"
  1427. #endif
  1428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1429. "adds r3, r3, r7\n\t"
  1430. #else
  1431. "add r3, r3, r7\n\t"
  1432. #endif
  1433. #ifdef WOLFSSL_KEIL
  1434. "adcs r4, r4, %[r]\n\t"
  1435. #elif defined(__clang__)
  1436. "adcs r4, %[r]\n\t"
  1437. #else
  1438. "adc r4, %[r]\n\t"
  1439. #endif
  1440. #ifdef WOLFSSL_KEIL
  1441. "adcs r5, r5, %[r]\n\t"
  1442. #elif defined(__clang__)
  1443. "adcs r5, %[r]\n\t"
  1444. #else
  1445. "adc r5, %[r]\n\t"
  1446. #endif
  1447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1448. "lsrs r7, %[b], #16\n\t"
  1449. #else
  1450. "lsr r7, %[b], #16\n\t"
  1451. #endif
  1452. #ifdef WOLFSSL_KEIL
  1453. "muls r6, r7, r6\n\t"
  1454. #elif defined(__clang__)
  1455. "muls r6, r7\n\t"
  1456. #else
  1457. "mul r6, r7\n\t"
  1458. #endif
  1459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1460. "lsrs r7, r6, #16\n\t"
  1461. #else
  1462. "lsr r7, r6, #16\n\t"
  1463. #endif
  1464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1465. "lsls r6, r6, #16\n\t"
  1466. #else
  1467. "lsl r6, r6, #16\n\t"
  1468. #endif
  1469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1470. "adds r3, r3, r6\n\t"
  1471. #else
  1472. "add r3, r3, r6\n\t"
  1473. #endif
  1474. #ifdef WOLFSSL_KEIL
  1475. "adcs r4, r4, r7\n\t"
  1476. #elif defined(__clang__)
  1477. "adcs r4, r7\n\t"
  1478. #else
  1479. "adc r4, r7\n\t"
  1480. #endif
  1481. #ifdef WOLFSSL_KEIL
  1482. "adcs r5, r5, %[r]\n\t"
  1483. #elif defined(__clang__)
  1484. "adcs r5, %[r]\n\t"
  1485. #else
  1486. "adc r5, %[r]\n\t"
  1487. #endif
  1488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1489. "lsrs r6, %[a], #16\n\t"
  1490. #else
  1491. "lsr r6, %[a], #16\n\t"
  1492. #endif
  1493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1494. "lsrs r7, %[b], #16\n\t"
  1495. #else
  1496. "lsr r7, %[b], #16\n\t"
  1497. #endif
  1498. #ifdef WOLFSSL_KEIL
  1499. "muls r7, r6, r7\n\t"
  1500. #elif defined(__clang__)
  1501. "muls r7, r6\n\t"
  1502. #else
  1503. "mul r7, r6\n\t"
  1504. #endif
  1505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1506. "adds r4, r4, r7\n\t"
  1507. #else
  1508. "add r4, r4, r7\n\t"
  1509. #endif
  1510. #ifdef WOLFSSL_KEIL
  1511. "adcs r5, r5, %[r]\n\t"
  1512. #elif defined(__clang__)
  1513. "adcs r5, %[r]\n\t"
  1514. #else
  1515. "adc r5, %[r]\n\t"
  1516. #endif
  1517. "uxth r7, %[b]\n\t"
  1518. #ifdef WOLFSSL_KEIL
  1519. "muls r6, r7, r6\n\t"
  1520. #elif defined(__clang__)
  1521. "muls r6, r7\n\t"
  1522. #else
  1523. "mul r6, r7\n\t"
  1524. #endif
  1525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1526. "lsrs r7, r6, #16\n\t"
  1527. #else
  1528. "lsr r7, r6, #16\n\t"
  1529. #endif
  1530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1531. "lsls r6, r6, #16\n\t"
  1532. #else
  1533. "lsl r6, r6, #16\n\t"
  1534. #endif
  1535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1536. "adds r3, r3, r6\n\t"
  1537. #else
  1538. "add r3, r3, r6\n\t"
  1539. #endif
  1540. #ifdef WOLFSSL_KEIL
  1541. "adcs r4, r4, r7\n\t"
  1542. #elif defined(__clang__)
  1543. "adcs r4, r7\n\t"
  1544. #else
  1545. "adc r4, r7\n\t"
  1546. #endif
  1547. #ifdef WOLFSSL_KEIL
  1548. "adcs r5, r5, %[r]\n\t"
  1549. #elif defined(__clang__)
  1550. "adcs r5, %[r]\n\t"
  1551. #else
  1552. "adc r5, %[r]\n\t"
  1553. #endif
  1554. "# A[2] * B[1]\n\t"
  1555. "mov %[a], r9\n\t"
  1556. "mov %[b], r10\n\t"
  1557. "ldr %[a], [%[a], #8]\n\t"
  1558. "ldr %[b], [%[b], #4]\n\t"
  1559. "uxth r6, %[a]\n\t"
  1560. "uxth r7, %[b]\n\t"
  1561. #ifdef WOLFSSL_KEIL
  1562. "muls r7, r6, r7\n\t"
  1563. #elif defined(__clang__)
  1564. "muls r7, r6\n\t"
  1565. #else
  1566. "mul r7, r6\n\t"
  1567. #endif
  1568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1569. "adds r3, r3, r7\n\t"
  1570. #else
  1571. "add r3, r3, r7\n\t"
  1572. #endif
  1573. #ifdef WOLFSSL_KEIL
  1574. "adcs r4, r4, %[r]\n\t"
  1575. #elif defined(__clang__)
  1576. "adcs r4, %[r]\n\t"
  1577. #else
  1578. "adc r4, %[r]\n\t"
  1579. #endif
  1580. #ifdef WOLFSSL_KEIL
  1581. "adcs r5, r5, %[r]\n\t"
  1582. #elif defined(__clang__)
  1583. "adcs r5, %[r]\n\t"
  1584. #else
  1585. "adc r5, %[r]\n\t"
  1586. #endif
  1587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1588. "lsrs r7, %[b], #16\n\t"
  1589. #else
  1590. "lsr r7, %[b], #16\n\t"
  1591. #endif
  1592. #ifdef WOLFSSL_KEIL
  1593. "muls r6, r7, r6\n\t"
  1594. #elif defined(__clang__)
  1595. "muls r6, r7\n\t"
  1596. #else
  1597. "mul r6, r7\n\t"
  1598. #endif
  1599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1600. "lsrs r7, r6, #16\n\t"
  1601. #else
  1602. "lsr r7, r6, #16\n\t"
  1603. #endif
  1604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1605. "lsls r6, r6, #16\n\t"
  1606. #else
  1607. "lsl r6, r6, #16\n\t"
  1608. #endif
  1609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1610. "adds r3, r3, r6\n\t"
  1611. #else
  1612. "add r3, r3, r6\n\t"
  1613. #endif
  1614. #ifdef WOLFSSL_KEIL
  1615. "adcs r4, r4, r7\n\t"
  1616. #elif defined(__clang__)
  1617. "adcs r4, r7\n\t"
  1618. #else
  1619. "adc r4, r7\n\t"
  1620. #endif
  1621. #ifdef WOLFSSL_KEIL
  1622. "adcs r5, r5, %[r]\n\t"
  1623. #elif defined(__clang__)
  1624. "adcs r5, %[r]\n\t"
  1625. #else
  1626. "adc r5, %[r]\n\t"
  1627. #endif
  1628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1629. "lsrs r6, %[a], #16\n\t"
  1630. #else
  1631. "lsr r6, %[a], #16\n\t"
  1632. #endif
  1633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1634. "lsrs r7, %[b], #16\n\t"
  1635. #else
  1636. "lsr r7, %[b], #16\n\t"
  1637. #endif
  1638. #ifdef WOLFSSL_KEIL
  1639. "muls r7, r6, r7\n\t"
  1640. #elif defined(__clang__)
  1641. "muls r7, r6\n\t"
  1642. #else
  1643. "mul r7, r6\n\t"
  1644. #endif
  1645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1646. "adds r4, r4, r7\n\t"
  1647. #else
  1648. "add r4, r4, r7\n\t"
  1649. #endif
  1650. #ifdef WOLFSSL_KEIL
  1651. "adcs r5, r5, %[r]\n\t"
  1652. #elif defined(__clang__)
  1653. "adcs r5, %[r]\n\t"
  1654. #else
  1655. "adc r5, %[r]\n\t"
  1656. #endif
  1657. "uxth r7, %[b]\n\t"
  1658. #ifdef WOLFSSL_KEIL
  1659. "muls r6, r7, r6\n\t"
  1660. #elif defined(__clang__)
  1661. "muls r6, r7\n\t"
  1662. #else
  1663. "mul r6, r7\n\t"
  1664. #endif
  1665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1666. "lsrs r7, r6, #16\n\t"
  1667. #else
  1668. "lsr r7, r6, #16\n\t"
  1669. #endif
  1670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1671. "lsls r6, r6, #16\n\t"
  1672. #else
  1673. "lsl r6, r6, #16\n\t"
  1674. #endif
  1675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1676. "adds r3, r3, r6\n\t"
  1677. #else
  1678. "add r3, r3, r6\n\t"
  1679. #endif
  1680. #ifdef WOLFSSL_KEIL
  1681. "adcs r4, r4, r7\n\t"
  1682. #elif defined(__clang__)
  1683. "adcs r4, r7\n\t"
  1684. #else
  1685. "adc r4, r7\n\t"
  1686. #endif
  1687. #ifdef WOLFSSL_KEIL
  1688. "adcs r5, r5, %[r]\n\t"
  1689. #elif defined(__clang__)
  1690. "adcs r5, %[r]\n\t"
  1691. #else
  1692. "adc r5, %[r]\n\t"
  1693. #endif
  1694. "# A[3] * B[0]\n\t"
  1695. "mov %[a], r9\n\t"
  1696. "mov %[b], r10\n\t"
  1697. "ldr %[a], [%[a], #12]\n\t"
  1698. "ldr %[b], [%[b]]\n\t"
  1699. "uxth r6, %[a]\n\t"
  1700. "uxth r7, %[b]\n\t"
  1701. #ifdef WOLFSSL_KEIL
  1702. "muls r7, r6, r7\n\t"
  1703. #elif defined(__clang__)
  1704. "muls r7, r6\n\t"
  1705. #else
  1706. "mul r7, r6\n\t"
  1707. #endif
  1708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1709. "adds r3, r3, r7\n\t"
  1710. #else
  1711. "add r3, r3, r7\n\t"
  1712. #endif
  1713. #ifdef WOLFSSL_KEIL
  1714. "adcs r4, r4, %[r]\n\t"
  1715. #elif defined(__clang__)
  1716. "adcs r4, %[r]\n\t"
  1717. #else
  1718. "adc r4, %[r]\n\t"
  1719. #endif
  1720. #ifdef WOLFSSL_KEIL
  1721. "adcs r5, r5, %[r]\n\t"
  1722. #elif defined(__clang__)
  1723. "adcs r5, %[r]\n\t"
  1724. #else
  1725. "adc r5, %[r]\n\t"
  1726. #endif
  1727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1728. "lsrs r7, %[b], #16\n\t"
  1729. #else
  1730. "lsr r7, %[b], #16\n\t"
  1731. #endif
  1732. #ifdef WOLFSSL_KEIL
  1733. "muls r6, r7, r6\n\t"
  1734. #elif defined(__clang__)
  1735. "muls r6, r7\n\t"
  1736. #else
  1737. "mul r6, r7\n\t"
  1738. #endif
  1739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1740. "lsrs r7, r6, #16\n\t"
  1741. #else
  1742. "lsr r7, r6, #16\n\t"
  1743. #endif
  1744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1745. "lsls r6, r6, #16\n\t"
  1746. #else
  1747. "lsl r6, r6, #16\n\t"
  1748. #endif
  1749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1750. "adds r3, r3, r6\n\t"
  1751. #else
  1752. "add r3, r3, r6\n\t"
  1753. #endif
  1754. #ifdef WOLFSSL_KEIL
  1755. "adcs r4, r4, r7\n\t"
  1756. #elif defined(__clang__)
  1757. "adcs r4, r7\n\t"
  1758. #else
  1759. "adc r4, r7\n\t"
  1760. #endif
  1761. #ifdef WOLFSSL_KEIL
  1762. "adcs r5, r5, %[r]\n\t"
  1763. #elif defined(__clang__)
  1764. "adcs r5, %[r]\n\t"
  1765. #else
  1766. "adc r5, %[r]\n\t"
  1767. #endif
  1768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1769. "lsrs r6, %[a], #16\n\t"
  1770. #else
  1771. "lsr r6, %[a], #16\n\t"
  1772. #endif
  1773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1774. "lsrs r7, %[b], #16\n\t"
  1775. #else
  1776. "lsr r7, %[b], #16\n\t"
  1777. #endif
  1778. #ifdef WOLFSSL_KEIL
  1779. "muls r7, r6, r7\n\t"
  1780. #elif defined(__clang__)
  1781. "muls r7, r6\n\t"
  1782. #else
  1783. "mul r7, r6\n\t"
  1784. #endif
  1785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1786. "adds r4, r4, r7\n\t"
  1787. #else
  1788. "add r4, r4, r7\n\t"
  1789. #endif
  1790. #ifdef WOLFSSL_KEIL
  1791. "adcs r5, r5, %[r]\n\t"
  1792. #elif defined(__clang__)
  1793. "adcs r5, %[r]\n\t"
  1794. #else
  1795. "adc r5, %[r]\n\t"
  1796. #endif
  1797. "uxth r7, %[b]\n\t"
  1798. #ifdef WOLFSSL_KEIL
  1799. "muls r6, r7, r6\n\t"
  1800. #elif defined(__clang__)
  1801. "muls r6, r7\n\t"
  1802. #else
  1803. "mul r6, r7\n\t"
  1804. #endif
  1805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1806. "lsrs r7, r6, #16\n\t"
  1807. #else
  1808. "lsr r7, r6, #16\n\t"
  1809. #endif
  1810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1811. "lsls r6, r6, #16\n\t"
  1812. #else
  1813. "lsl r6, r6, #16\n\t"
  1814. #endif
  1815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1816. "adds r3, r3, r6\n\t"
  1817. #else
  1818. "add r3, r3, r6\n\t"
  1819. #endif
  1820. #ifdef WOLFSSL_KEIL
  1821. "adcs r4, r4, r7\n\t"
  1822. #elif defined(__clang__)
  1823. "adcs r4, r7\n\t"
  1824. #else
  1825. "adc r4, r7\n\t"
  1826. #endif
  1827. #ifdef WOLFSSL_KEIL
  1828. "adcs r5, r5, %[r]\n\t"
  1829. #elif defined(__clang__)
  1830. "adcs r5, %[r]\n\t"
  1831. #else
  1832. "adc r5, %[r]\n\t"
  1833. #endif
  1834. "str r3, [sp, #12]\n\t"
  1835. "# A[4] * B[0]\n\t"
  1836. "movs r3, #0\n\t"
  1837. "mov %[a], r9\n\t"
  1838. "mov %[b], r10\n\t"
  1839. "ldr %[a], [%[a], #16]\n\t"
  1840. "ldr %[b], [%[b]]\n\t"
  1841. "uxth r6, %[a]\n\t"
  1842. "uxth r7, %[b]\n\t"
  1843. #ifdef WOLFSSL_KEIL
  1844. "muls r7, r6, r7\n\t"
  1845. #elif defined(__clang__)
  1846. "muls r7, r6\n\t"
  1847. #else
  1848. "mul r7, r6\n\t"
  1849. #endif
  1850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1851. "adds r4, r4, r7\n\t"
  1852. #else
  1853. "add r4, r4, r7\n\t"
  1854. #endif
  1855. #ifdef WOLFSSL_KEIL
  1856. "adcs r5, r5, %[r]\n\t"
  1857. #elif defined(__clang__)
  1858. "adcs r5, %[r]\n\t"
  1859. #else
  1860. "adc r5, %[r]\n\t"
  1861. #endif
  1862. #ifdef WOLFSSL_KEIL
  1863. "adcs r3, r3, %[r]\n\t"
  1864. #elif defined(__clang__)
  1865. "adcs r3, %[r]\n\t"
  1866. #else
  1867. "adc r3, %[r]\n\t"
  1868. #endif
  1869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1870. "lsrs r7, %[b], #16\n\t"
  1871. #else
  1872. "lsr r7, %[b], #16\n\t"
  1873. #endif
  1874. #ifdef WOLFSSL_KEIL
  1875. "muls r6, r7, r6\n\t"
  1876. #elif defined(__clang__)
  1877. "muls r6, r7\n\t"
  1878. #else
  1879. "mul r6, r7\n\t"
  1880. #endif
  1881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1882. "lsrs r7, r6, #16\n\t"
  1883. #else
  1884. "lsr r7, r6, #16\n\t"
  1885. #endif
  1886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1887. "lsls r6, r6, #16\n\t"
  1888. #else
  1889. "lsl r6, r6, #16\n\t"
  1890. #endif
  1891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1892. "adds r4, r4, r6\n\t"
  1893. #else
  1894. "add r4, r4, r6\n\t"
  1895. #endif
  1896. #ifdef WOLFSSL_KEIL
  1897. "adcs r5, r5, r7\n\t"
  1898. #elif defined(__clang__)
  1899. "adcs r5, r7\n\t"
  1900. #else
  1901. "adc r5, r7\n\t"
  1902. #endif
  1903. #ifdef WOLFSSL_KEIL
  1904. "adcs r3, r3, %[r]\n\t"
  1905. #elif defined(__clang__)
  1906. "adcs r3, %[r]\n\t"
  1907. #else
  1908. "adc r3, %[r]\n\t"
  1909. #endif
  1910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1911. "lsrs r6, %[a], #16\n\t"
  1912. #else
  1913. "lsr r6, %[a], #16\n\t"
  1914. #endif
  1915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1916. "lsrs r7, %[b], #16\n\t"
  1917. #else
  1918. "lsr r7, %[b], #16\n\t"
  1919. #endif
  1920. #ifdef WOLFSSL_KEIL
  1921. "muls r7, r6, r7\n\t"
  1922. #elif defined(__clang__)
  1923. "muls r7, r6\n\t"
  1924. #else
  1925. "mul r7, r6\n\t"
  1926. #endif
  1927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1928. "adds r5, r5, r7\n\t"
  1929. #else
  1930. "add r5, r5, r7\n\t"
  1931. #endif
  1932. #ifdef WOLFSSL_KEIL
  1933. "adcs r3, r3, %[r]\n\t"
  1934. #elif defined(__clang__)
  1935. "adcs r3, %[r]\n\t"
  1936. #else
  1937. "adc r3, %[r]\n\t"
  1938. #endif
  1939. "uxth r7, %[b]\n\t"
  1940. #ifdef WOLFSSL_KEIL
  1941. "muls r6, r7, r6\n\t"
  1942. #elif defined(__clang__)
  1943. "muls r6, r7\n\t"
  1944. #else
  1945. "mul r6, r7\n\t"
  1946. #endif
  1947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1948. "lsrs r7, r6, #16\n\t"
  1949. #else
  1950. "lsr r7, r6, #16\n\t"
  1951. #endif
  1952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1953. "lsls r6, r6, #16\n\t"
  1954. #else
  1955. "lsl r6, r6, #16\n\t"
  1956. #endif
  1957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1958. "adds r4, r4, r6\n\t"
  1959. #else
  1960. "add r4, r4, r6\n\t"
  1961. #endif
  1962. #ifdef WOLFSSL_KEIL
  1963. "adcs r5, r5, r7\n\t"
  1964. #elif defined(__clang__)
  1965. "adcs r5, r7\n\t"
  1966. #else
  1967. "adc r5, r7\n\t"
  1968. #endif
  1969. #ifdef WOLFSSL_KEIL
  1970. "adcs r3, r3, %[r]\n\t"
  1971. #elif defined(__clang__)
  1972. "adcs r3, %[r]\n\t"
  1973. #else
  1974. "adc r3, %[r]\n\t"
  1975. #endif
  1976. "# A[3] * B[1]\n\t"
  1977. "mov %[a], r9\n\t"
  1978. "mov %[b], r10\n\t"
  1979. "ldr %[a], [%[a], #12]\n\t"
  1980. "ldr %[b], [%[b], #4]\n\t"
  1981. "uxth r6, %[a]\n\t"
  1982. "uxth r7, %[b]\n\t"
  1983. #ifdef WOLFSSL_KEIL
  1984. "muls r7, r6, r7\n\t"
  1985. #elif defined(__clang__)
  1986. "muls r7, r6\n\t"
  1987. #else
  1988. "mul r7, r6\n\t"
  1989. #endif
  1990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1991. "adds r4, r4, r7\n\t"
  1992. #else
  1993. "add r4, r4, r7\n\t"
  1994. #endif
  1995. #ifdef WOLFSSL_KEIL
  1996. "adcs r5, r5, %[r]\n\t"
  1997. #elif defined(__clang__)
  1998. "adcs r5, %[r]\n\t"
  1999. #else
  2000. "adc r5, %[r]\n\t"
  2001. #endif
  2002. #ifdef WOLFSSL_KEIL
  2003. "adcs r3, r3, %[r]\n\t"
  2004. #elif defined(__clang__)
  2005. "adcs r3, %[r]\n\t"
  2006. #else
  2007. "adc r3, %[r]\n\t"
  2008. #endif
  2009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2010. "lsrs r7, %[b], #16\n\t"
  2011. #else
  2012. "lsr r7, %[b], #16\n\t"
  2013. #endif
  2014. #ifdef WOLFSSL_KEIL
  2015. "muls r6, r7, r6\n\t"
  2016. #elif defined(__clang__)
  2017. "muls r6, r7\n\t"
  2018. #else
  2019. "mul r6, r7\n\t"
  2020. #endif
  2021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2022. "lsrs r7, r6, #16\n\t"
  2023. #else
  2024. "lsr r7, r6, #16\n\t"
  2025. #endif
  2026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2027. "lsls r6, r6, #16\n\t"
  2028. #else
  2029. "lsl r6, r6, #16\n\t"
  2030. #endif
  2031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2032. "adds r4, r4, r6\n\t"
  2033. #else
  2034. "add r4, r4, r6\n\t"
  2035. #endif
  2036. #ifdef WOLFSSL_KEIL
  2037. "adcs r5, r5, r7\n\t"
  2038. #elif defined(__clang__)
  2039. "adcs r5, r7\n\t"
  2040. #else
  2041. "adc r5, r7\n\t"
  2042. #endif
  2043. #ifdef WOLFSSL_KEIL
  2044. "adcs r3, r3, %[r]\n\t"
  2045. #elif defined(__clang__)
  2046. "adcs r3, %[r]\n\t"
  2047. #else
  2048. "adc r3, %[r]\n\t"
  2049. #endif
  2050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2051. "lsrs r6, %[a], #16\n\t"
  2052. #else
  2053. "lsr r6, %[a], #16\n\t"
  2054. #endif
  2055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2056. "lsrs r7, %[b], #16\n\t"
  2057. #else
  2058. "lsr r7, %[b], #16\n\t"
  2059. #endif
  2060. #ifdef WOLFSSL_KEIL
  2061. "muls r7, r6, r7\n\t"
  2062. #elif defined(__clang__)
  2063. "muls r7, r6\n\t"
  2064. #else
  2065. "mul r7, r6\n\t"
  2066. #endif
  2067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2068. "adds r5, r5, r7\n\t"
  2069. #else
  2070. "add r5, r5, r7\n\t"
  2071. #endif
  2072. #ifdef WOLFSSL_KEIL
  2073. "adcs r3, r3, %[r]\n\t"
  2074. #elif defined(__clang__)
  2075. "adcs r3, %[r]\n\t"
  2076. #else
  2077. "adc r3, %[r]\n\t"
  2078. #endif
  2079. "uxth r7, %[b]\n\t"
  2080. #ifdef WOLFSSL_KEIL
  2081. "muls r6, r7, r6\n\t"
  2082. #elif defined(__clang__)
  2083. "muls r6, r7\n\t"
  2084. #else
  2085. "mul r6, r7\n\t"
  2086. #endif
  2087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2088. "lsrs r7, r6, #16\n\t"
  2089. #else
  2090. "lsr r7, r6, #16\n\t"
  2091. #endif
  2092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2093. "lsls r6, r6, #16\n\t"
  2094. #else
  2095. "lsl r6, r6, #16\n\t"
  2096. #endif
  2097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2098. "adds r4, r4, r6\n\t"
  2099. #else
  2100. "add r4, r4, r6\n\t"
  2101. #endif
  2102. #ifdef WOLFSSL_KEIL
  2103. "adcs r5, r5, r7\n\t"
  2104. #elif defined(__clang__)
  2105. "adcs r5, r7\n\t"
  2106. #else
  2107. "adc r5, r7\n\t"
  2108. #endif
  2109. #ifdef WOLFSSL_KEIL
  2110. "adcs r3, r3, %[r]\n\t"
  2111. #elif defined(__clang__)
  2112. "adcs r3, %[r]\n\t"
  2113. #else
  2114. "adc r3, %[r]\n\t"
  2115. #endif
  2116. "# A[2] * B[2]\n\t"
  2117. "mov %[a], r9\n\t"
  2118. "mov %[b], r10\n\t"
  2119. "ldr %[a], [%[a], #8]\n\t"
  2120. "ldr %[b], [%[b], #8]\n\t"
  2121. "uxth r6, %[a]\n\t"
  2122. "uxth r7, %[b]\n\t"
  2123. #ifdef WOLFSSL_KEIL
  2124. "muls r7, r6, r7\n\t"
  2125. #elif defined(__clang__)
  2126. "muls r7, r6\n\t"
  2127. #else
  2128. "mul r7, r6\n\t"
  2129. #endif
  2130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2131. "adds r4, r4, r7\n\t"
  2132. #else
  2133. "add r4, r4, r7\n\t"
  2134. #endif
  2135. #ifdef WOLFSSL_KEIL
  2136. "adcs r5, r5, %[r]\n\t"
  2137. #elif defined(__clang__)
  2138. "adcs r5, %[r]\n\t"
  2139. #else
  2140. "adc r5, %[r]\n\t"
  2141. #endif
  2142. #ifdef WOLFSSL_KEIL
  2143. "adcs r3, r3, %[r]\n\t"
  2144. #elif defined(__clang__)
  2145. "adcs r3, %[r]\n\t"
  2146. #else
  2147. "adc r3, %[r]\n\t"
  2148. #endif
  2149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2150. "lsrs r7, %[b], #16\n\t"
  2151. #else
  2152. "lsr r7, %[b], #16\n\t"
  2153. #endif
  2154. #ifdef WOLFSSL_KEIL
  2155. "muls r6, r7, r6\n\t"
  2156. #elif defined(__clang__)
  2157. "muls r6, r7\n\t"
  2158. #else
  2159. "mul r6, r7\n\t"
  2160. #endif
  2161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2162. "lsrs r7, r6, #16\n\t"
  2163. #else
  2164. "lsr r7, r6, #16\n\t"
  2165. #endif
  2166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2167. "lsls r6, r6, #16\n\t"
  2168. #else
  2169. "lsl r6, r6, #16\n\t"
  2170. #endif
  2171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2172. "adds r4, r4, r6\n\t"
  2173. #else
  2174. "add r4, r4, r6\n\t"
  2175. #endif
  2176. #ifdef WOLFSSL_KEIL
  2177. "adcs r5, r5, r7\n\t"
  2178. #elif defined(__clang__)
  2179. "adcs r5, r7\n\t"
  2180. #else
  2181. "adc r5, r7\n\t"
  2182. #endif
  2183. #ifdef WOLFSSL_KEIL
  2184. "adcs r3, r3, %[r]\n\t"
  2185. #elif defined(__clang__)
  2186. "adcs r3, %[r]\n\t"
  2187. #else
  2188. "adc r3, %[r]\n\t"
  2189. #endif
  2190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2191. "lsrs r6, %[a], #16\n\t"
  2192. #else
  2193. "lsr r6, %[a], #16\n\t"
  2194. #endif
  2195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2196. "lsrs r7, %[b], #16\n\t"
  2197. #else
  2198. "lsr r7, %[b], #16\n\t"
  2199. #endif
  2200. #ifdef WOLFSSL_KEIL
  2201. "muls r7, r6, r7\n\t"
  2202. #elif defined(__clang__)
  2203. "muls r7, r6\n\t"
  2204. #else
  2205. "mul r7, r6\n\t"
  2206. #endif
  2207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2208. "adds r5, r5, r7\n\t"
  2209. #else
  2210. "add r5, r5, r7\n\t"
  2211. #endif
  2212. #ifdef WOLFSSL_KEIL
  2213. "adcs r3, r3, %[r]\n\t"
  2214. #elif defined(__clang__)
  2215. "adcs r3, %[r]\n\t"
  2216. #else
  2217. "adc r3, %[r]\n\t"
  2218. #endif
  2219. "uxth r7, %[b]\n\t"
  2220. #ifdef WOLFSSL_KEIL
  2221. "muls r6, r7, r6\n\t"
  2222. #elif defined(__clang__)
  2223. "muls r6, r7\n\t"
  2224. #else
  2225. "mul r6, r7\n\t"
  2226. #endif
  2227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2228. "lsrs r7, r6, #16\n\t"
  2229. #else
  2230. "lsr r7, r6, #16\n\t"
  2231. #endif
  2232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2233. "lsls r6, r6, #16\n\t"
  2234. #else
  2235. "lsl r6, r6, #16\n\t"
  2236. #endif
  2237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2238. "adds r4, r4, r6\n\t"
  2239. #else
  2240. "add r4, r4, r6\n\t"
  2241. #endif
  2242. #ifdef WOLFSSL_KEIL
  2243. "adcs r5, r5, r7\n\t"
  2244. #elif defined(__clang__)
  2245. "adcs r5, r7\n\t"
  2246. #else
  2247. "adc r5, r7\n\t"
  2248. #endif
  2249. #ifdef WOLFSSL_KEIL
  2250. "adcs r3, r3, %[r]\n\t"
  2251. #elif defined(__clang__)
  2252. "adcs r3, %[r]\n\t"
  2253. #else
  2254. "adc r3, %[r]\n\t"
  2255. #endif
  2256. "# A[1] * B[3]\n\t"
  2257. "mov %[a], r9\n\t"
  2258. "mov %[b], r10\n\t"
  2259. "ldr %[a], [%[a], #4]\n\t"
  2260. "ldr %[b], [%[b], #12]\n\t"
  2261. "uxth r6, %[a]\n\t"
  2262. "uxth r7, %[b]\n\t"
  2263. #ifdef WOLFSSL_KEIL
  2264. "muls r7, r6, r7\n\t"
  2265. #elif defined(__clang__)
  2266. "muls r7, r6\n\t"
  2267. #else
  2268. "mul r7, r6\n\t"
  2269. #endif
  2270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2271. "adds r4, r4, r7\n\t"
  2272. #else
  2273. "add r4, r4, r7\n\t"
  2274. #endif
  2275. #ifdef WOLFSSL_KEIL
  2276. "adcs r5, r5, %[r]\n\t"
  2277. #elif defined(__clang__)
  2278. "adcs r5, %[r]\n\t"
  2279. #else
  2280. "adc r5, %[r]\n\t"
  2281. #endif
  2282. #ifdef WOLFSSL_KEIL
  2283. "adcs r3, r3, %[r]\n\t"
  2284. #elif defined(__clang__)
  2285. "adcs r3, %[r]\n\t"
  2286. #else
  2287. "adc r3, %[r]\n\t"
  2288. #endif
  2289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2290. "lsrs r7, %[b], #16\n\t"
  2291. #else
  2292. "lsr r7, %[b], #16\n\t"
  2293. #endif
  2294. #ifdef WOLFSSL_KEIL
  2295. "muls r6, r7, r6\n\t"
  2296. #elif defined(__clang__)
  2297. "muls r6, r7\n\t"
  2298. #else
  2299. "mul r6, r7\n\t"
  2300. #endif
  2301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2302. "lsrs r7, r6, #16\n\t"
  2303. #else
  2304. "lsr r7, r6, #16\n\t"
  2305. #endif
  2306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2307. "lsls r6, r6, #16\n\t"
  2308. #else
  2309. "lsl r6, r6, #16\n\t"
  2310. #endif
  2311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2312. "adds r4, r4, r6\n\t"
  2313. #else
  2314. "add r4, r4, r6\n\t"
  2315. #endif
  2316. #ifdef WOLFSSL_KEIL
  2317. "adcs r5, r5, r7\n\t"
  2318. #elif defined(__clang__)
  2319. "adcs r5, r7\n\t"
  2320. #else
  2321. "adc r5, r7\n\t"
  2322. #endif
  2323. #ifdef WOLFSSL_KEIL
  2324. "adcs r3, r3, %[r]\n\t"
  2325. #elif defined(__clang__)
  2326. "adcs r3, %[r]\n\t"
  2327. #else
  2328. "adc r3, %[r]\n\t"
  2329. #endif
  2330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2331. "lsrs r6, %[a], #16\n\t"
  2332. #else
  2333. "lsr r6, %[a], #16\n\t"
  2334. #endif
  2335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2336. "lsrs r7, %[b], #16\n\t"
  2337. #else
  2338. "lsr r7, %[b], #16\n\t"
  2339. #endif
  2340. #ifdef WOLFSSL_KEIL
  2341. "muls r7, r6, r7\n\t"
  2342. #elif defined(__clang__)
  2343. "muls r7, r6\n\t"
  2344. #else
  2345. "mul r7, r6\n\t"
  2346. #endif
  2347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2348. "adds r5, r5, r7\n\t"
  2349. #else
  2350. "add r5, r5, r7\n\t"
  2351. #endif
  2352. #ifdef WOLFSSL_KEIL
  2353. "adcs r3, r3, %[r]\n\t"
  2354. #elif defined(__clang__)
  2355. "adcs r3, %[r]\n\t"
  2356. #else
  2357. "adc r3, %[r]\n\t"
  2358. #endif
  2359. "uxth r7, %[b]\n\t"
  2360. #ifdef WOLFSSL_KEIL
  2361. "muls r6, r7, r6\n\t"
  2362. #elif defined(__clang__)
  2363. "muls r6, r7\n\t"
  2364. #else
  2365. "mul r6, r7\n\t"
  2366. #endif
  2367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2368. "lsrs r7, r6, #16\n\t"
  2369. #else
  2370. "lsr r7, r6, #16\n\t"
  2371. #endif
  2372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2373. "lsls r6, r6, #16\n\t"
  2374. #else
  2375. "lsl r6, r6, #16\n\t"
  2376. #endif
  2377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2378. "adds r4, r4, r6\n\t"
  2379. #else
  2380. "add r4, r4, r6\n\t"
  2381. #endif
  2382. #ifdef WOLFSSL_KEIL
  2383. "adcs r5, r5, r7\n\t"
  2384. #elif defined(__clang__)
  2385. "adcs r5, r7\n\t"
  2386. #else
  2387. "adc r5, r7\n\t"
  2388. #endif
  2389. #ifdef WOLFSSL_KEIL
  2390. "adcs r3, r3, %[r]\n\t"
  2391. #elif defined(__clang__)
  2392. "adcs r3, %[r]\n\t"
  2393. #else
  2394. "adc r3, %[r]\n\t"
  2395. #endif
  2396. "# A[0] * B[4]\n\t"
  2397. "mov %[a], r9\n\t"
  2398. "mov %[b], r10\n\t"
  2399. "ldr %[a], [%[a]]\n\t"
  2400. "ldr %[b], [%[b], #16]\n\t"
  2401. "uxth r6, %[a]\n\t"
  2402. "uxth r7, %[b]\n\t"
  2403. #ifdef WOLFSSL_KEIL
  2404. "muls r7, r6, r7\n\t"
  2405. #elif defined(__clang__)
  2406. "muls r7, r6\n\t"
  2407. #else
  2408. "mul r7, r6\n\t"
  2409. #endif
  2410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2411. "adds r4, r4, r7\n\t"
  2412. #else
  2413. "add r4, r4, r7\n\t"
  2414. #endif
  2415. #ifdef WOLFSSL_KEIL
  2416. "adcs r5, r5, %[r]\n\t"
  2417. #elif defined(__clang__)
  2418. "adcs r5, %[r]\n\t"
  2419. #else
  2420. "adc r5, %[r]\n\t"
  2421. #endif
  2422. #ifdef WOLFSSL_KEIL
  2423. "adcs r3, r3, %[r]\n\t"
  2424. #elif defined(__clang__)
  2425. "adcs r3, %[r]\n\t"
  2426. #else
  2427. "adc r3, %[r]\n\t"
  2428. #endif
  2429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2430. "lsrs r7, %[b], #16\n\t"
  2431. #else
  2432. "lsr r7, %[b], #16\n\t"
  2433. #endif
  2434. #ifdef WOLFSSL_KEIL
  2435. "muls r6, r7, r6\n\t"
  2436. #elif defined(__clang__)
  2437. "muls r6, r7\n\t"
  2438. #else
  2439. "mul r6, r7\n\t"
  2440. #endif
  2441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2442. "lsrs r7, r6, #16\n\t"
  2443. #else
  2444. "lsr r7, r6, #16\n\t"
  2445. #endif
  2446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2447. "lsls r6, r6, #16\n\t"
  2448. #else
  2449. "lsl r6, r6, #16\n\t"
  2450. #endif
  2451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2452. "adds r4, r4, r6\n\t"
  2453. #else
  2454. "add r4, r4, r6\n\t"
  2455. #endif
  2456. #ifdef WOLFSSL_KEIL
  2457. "adcs r5, r5, r7\n\t"
  2458. #elif defined(__clang__)
  2459. "adcs r5, r7\n\t"
  2460. #else
  2461. "adc r5, r7\n\t"
  2462. #endif
  2463. #ifdef WOLFSSL_KEIL
  2464. "adcs r3, r3, %[r]\n\t"
  2465. #elif defined(__clang__)
  2466. "adcs r3, %[r]\n\t"
  2467. #else
  2468. "adc r3, %[r]\n\t"
  2469. #endif
  2470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2471. "lsrs r6, %[a], #16\n\t"
  2472. #else
  2473. "lsr r6, %[a], #16\n\t"
  2474. #endif
  2475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2476. "lsrs r7, %[b], #16\n\t"
  2477. #else
  2478. "lsr r7, %[b], #16\n\t"
  2479. #endif
  2480. #ifdef WOLFSSL_KEIL
  2481. "muls r7, r6, r7\n\t"
  2482. #elif defined(__clang__)
  2483. "muls r7, r6\n\t"
  2484. #else
  2485. "mul r7, r6\n\t"
  2486. #endif
  2487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2488. "adds r5, r5, r7\n\t"
  2489. #else
  2490. "add r5, r5, r7\n\t"
  2491. #endif
  2492. #ifdef WOLFSSL_KEIL
  2493. "adcs r3, r3, %[r]\n\t"
  2494. #elif defined(__clang__)
  2495. "adcs r3, %[r]\n\t"
  2496. #else
  2497. "adc r3, %[r]\n\t"
  2498. #endif
  2499. "uxth r7, %[b]\n\t"
  2500. #ifdef WOLFSSL_KEIL
  2501. "muls r6, r7, r6\n\t"
  2502. #elif defined(__clang__)
  2503. "muls r6, r7\n\t"
  2504. #else
  2505. "mul r6, r7\n\t"
  2506. #endif
  2507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2508. "lsrs r7, r6, #16\n\t"
  2509. #else
  2510. "lsr r7, r6, #16\n\t"
  2511. #endif
  2512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2513. "lsls r6, r6, #16\n\t"
  2514. #else
  2515. "lsl r6, r6, #16\n\t"
  2516. #endif
  2517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2518. "adds r4, r4, r6\n\t"
  2519. #else
  2520. "add r4, r4, r6\n\t"
  2521. #endif
  2522. #ifdef WOLFSSL_KEIL
  2523. "adcs r5, r5, r7\n\t"
  2524. #elif defined(__clang__)
  2525. "adcs r5, r7\n\t"
  2526. #else
  2527. "adc r5, r7\n\t"
  2528. #endif
  2529. #ifdef WOLFSSL_KEIL
  2530. "adcs r3, r3, %[r]\n\t"
  2531. #elif defined(__clang__)
  2532. "adcs r3, %[r]\n\t"
  2533. #else
  2534. "adc r3, %[r]\n\t"
  2535. #endif
  2536. "str r4, [sp, #16]\n\t"
  2537. "# A[0] * B[5]\n\t"
  2538. "movs r4, #0\n\t"
  2539. "mov %[a], r9\n\t"
  2540. "mov %[b], r10\n\t"
  2541. "ldr %[a], [%[a]]\n\t"
  2542. "ldr %[b], [%[b], #20]\n\t"
  2543. "uxth r6, %[a]\n\t"
  2544. "uxth r7, %[b]\n\t"
  2545. #ifdef WOLFSSL_KEIL
  2546. "muls r7, r6, r7\n\t"
  2547. #elif defined(__clang__)
  2548. "muls r7, r6\n\t"
  2549. #else
  2550. "mul r7, r6\n\t"
  2551. #endif
  2552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2553. "adds r5, r5, r7\n\t"
  2554. #else
  2555. "add r5, r5, r7\n\t"
  2556. #endif
  2557. #ifdef WOLFSSL_KEIL
  2558. "adcs r3, r3, %[r]\n\t"
  2559. #elif defined(__clang__)
  2560. "adcs r3, %[r]\n\t"
  2561. #else
  2562. "adc r3, %[r]\n\t"
  2563. #endif
  2564. #ifdef WOLFSSL_KEIL
  2565. "adcs r4, r4, %[r]\n\t"
  2566. #elif defined(__clang__)
  2567. "adcs r4, %[r]\n\t"
  2568. #else
  2569. "adc r4, %[r]\n\t"
  2570. #endif
  2571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2572. "lsrs r7, %[b], #16\n\t"
  2573. #else
  2574. "lsr r7, %[b], #16\n\t"
  2575. #endif
  2576. #ifdef WOLFSSL_KEIL
  2577. "muls r6, r7, r6\n\t"
  2578. #elif defined(__clang__)
  2579. "muls r6, r7\n\t"
  2580. #else
  2581. "mul r6, r7\n\t"
  2582. #endif
  2583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2584. "lsrs r7, r6, #16\n\t"
  2585. #else
  2586. "lsr r7, r6, #16\n\t"
  2587. #endif
  2588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2589. "lsls r6, r6, #16\n\t"
  2590. #else
  2591. "lsl r6, r6, #16\n\t"
  2592. #endif
  2593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2594. "adds r5, r5, r6\n\t"
  2595. #else
  2596. "add r5, r5, r6\n\t"
  2597. #endif
  2598. #ifdef WOLFSSL_KEIL
  2599. "adcs r3, r3, r7\n\t"
  2600. #elif defined(__clang__)
  2601. "adcs r3, r7\n\t"
  2602. #else
  2603. "adc r3, r7\n\t"
  2604. #endif
  2605. #ifdef WOLFSSL_KEIL
  2606. "adcs r4, r4, %[r]\n\t"
  2607. #elif defined(__clang__)
  2608. "adcs r4, %[r]\n\t"
  2609. #else
  2610. "adc r4, %[r]\n\t"
  2611. #endif
  2612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2613. "lsrs r6, %[a], #16\n\t"
  2614. #else
  2615. "lsr r6, %[a], #16\n\t"
  2616. #endif
  2617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2618. "lsrs r7, %[b], #16\n\t"
  2619. #else
  2620. "lsr r7, %[b], #16\n\t"
  2621. #endif
  2622. #ifdef WOLFSSL_KEIL
  2623. "muls r7, r6, r7\n\t"
  2624. #elif defined(__clang__)
  2625. "muls r7, r6\n\t"
  2626. #else
  2627. "mul r7, r6\n\t"
  2628. #endif
  2629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2630. "adds r3, r3, r7\n\t"
  2631. #else
  2632. "add r3, r3, r7\n\t"
  2633. #endif
  2634. #ifdef WOLFSSL_KEIL
  2635. "adcs r4, r4, %[r]\n\t"
  2636. #elif defined(__clang__)
  2637. "adcs r4, %[r]\n\t"
  2638. #else
  2639. "adc r4, %[r]\n\t"
  2640. #endif
  2641. "uxth r7, %[b]\n\t"
  2642. #ifdef WOLFSSL_KEIL
  2643. "muls r6, r7, r6\n\t"
  2644. #elif defined(__clang__)
  2645. "muls r6, r7\n\t"
  2646. #else
  2647. "mul r6, r7\n\t"
  2648. #endif
  2649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2650. "lsrs r7, r6, #16\n\t"
  2651. #else
  2652. "lsr r7, r6, #16\n\t"
  2653. #endif
  2654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2655. "lsls r6, r6, #16\n\t"
  2656. #else
  2657. "lsl r6, r6, #16\n\t"
  2658. #endif
  2659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2660. "adds r5, r5, r6\n\t"
  2661. #else
  2662. "add r5, r5, r6\n\t"
  2663. #endif
  2664. #ifdef WOLFSSL_KEIL
  2665. "adcs r3, r3, r7\n\t"
  2666. #elif defined(__clang__)
  2667. "adcs r3, r7\n\t"
  2668. #else
  2669. "adc r3, r7\n\t"
  2670. #endif
  2671. #ifdef WOLFSSL_KEIL
  2672. "adcs r4, r4, %[r]\n\t"
  2673. #elif defined(__clang__)
  2674. "adcs r4, %[r]\n\t"
  2675. #else
  2676. "adc r4, %[r]\n\t"
  2677. #endif
  2678. "# A[1] * B[4]\n\t"
  2679. "mov %[a], r9\n\t"
  2680. "mov %[b], r10\n\t"
  2681. "ldr %[a], [%[a], #4]\n\t"
  2682. "ldr %[b], [%[b], #16]\n\t"
  2683. "uxth r6, %[a]\n\t"
  2684. "uxth r7, %[b]\n\t"
  2685. #ifdef WOLFSSL_KEIL
  2686. "muls r7, r6, r7\n\t"
  2687. #elif defined(__clang__)
  2688. "muls r7, r6\n\t"
  2689. #else
  2690. "mul r7, r6\n\t"
  2691. #endif
  2692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2693. "adds r5, r5, r7\n\t"
  2694. #else
  2695. "add r5, r5, r7\n\t"
  2696. #endif
  2697. #ifdef WOLFSSL_KEIL
  2698. "adcs r3, r3, %[r]\n\t"
  2699. #elif defined(__clang__)
  2700. "adcs r3, %[r]\n\t"
  2701. #else
  2702. "adc r3, %[r]\n\t"
  2703. #endif
  2704. #ifdef WOLFSSL_KEIL
  2705. "adcs r4, r4, %[r]\n\t"
  2706. #elif defined(__clang__)
  2707. "adcs r4, %[r]\n\t"
  2708. #else
  2709. "adc r4, %[r]\n\t"
  2710. #endif
  2711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2712. "lsrs r7, %[b], #16\n\t"
  2713. #else
  2714. "lsr r7, %[b], #16\n\t"
  2715. #endif
  2716. #ifdef WOLFSSL_KEIL
  2717. "muls r6, r7, r6\n\t"
  2718. #elif defined(__clang__)
  2719. "muls r6, r7\n\t"
  2720. #else
  2721. "mul r6, r7\n\t"
  2722. #endif
  2723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2724. "lsrs r7, r6, #16\n\t"
  2725. #else
  2726. "lsr r7, r6, #16\n\t"
  2727. #endif
  2728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2729. "lsls r6, r6, #16\n\t"
  2730. #else
  2731. "lsl r6, r6, #16\n\t"
  2732. #endif
  2733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2734. "adds r5, r5, r6\n\t"
  2735. #else
  2736. "add r5, r5, r6\n\t"
  2737. #endif
  2738. #ifdef WOLFSSL_KEIL
  2739. "adcs r3, r3, r7\n\t"
  2740. #elif defined(__clang__)
  2741. "adcs r3, r7\n\t"
  2742. #else
  2743. "adc r3, r7\n\t"
  2744. #endif
  2745. #ifdef WOLFSSL_KEIL
  2746. "adcs r4, r4, %[r]\n\t"
  2747. #elif defined(__clang__)
  2748. "adcs r4, %[r]\n\t"
  2749. #else
  2750. "adc r4, %[r]\n\t"
  2751. #endif
  2752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2753. "lsrs r6, %[a], #16\n\t"
  2754. #else
  2755. "lsr r6, %[a], #16\n\t"
  2756. #endif
  2757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2758. "lsrs r7, %[b], #16\n\t"
  2759. #else
  2760. "lsr r7, %[b], #16\n\t"
  2761. #endif
  2762. #ifdef WOLFSSL_KEIL
  2763. "muls r7, r6, r7\n\t"
  2764. #elif defined(__clang__)
  2765. "muls r7, r6\n\t"
  2766. #else
  2767. "mul r7, r6\n\t"
  2768. #endif
  2769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2770. "adds r3, r3, r7\n\t"
  2771. #else
  2772. "add r3, r3, r7\n\t"
  2773. #endif
  2774. #ifdef WOLFSSL_KEIL
  2775. "adcs r4, r4, %[r]\n\t"
  2776. #elif defined(__clang__)
  2777. "adcs r4, %[r]\n\t"
  2778. #else
  2779. "adc r4, %[r]\n\t"
  2780. #endif
  2781. "uxth r7, %[b]\n\t"
  2782. #ifdef WOLFSSL_KEIL
  2783. "muls r6, r7, r6\n\t"
  2784. #elif defined(__clang__)
  2785. "muls r6, r7\n\t"
  2786. #else
  2787. "mul r6, r7\n\t"
  2788. #endif
  2789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2790. "lsrs r7, r6, #16\n\t"
  2791. #else
  2792. "lsr r7, r6, #16\n\t"
  2793. #endif
  2794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2795. "lsls r6, r6, #16\n\t"
  2796. #else
  2797. "lsl r6, r6, #16\n\t"
  2798. #endif
  2799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2800. "adds r5, r5, r6\n\t"
  2801. #else
  2802. "add r5, r5, r6\n\t"
  2803. #endif
  2804. #ifdef WOLFSSL_KEIL
  2805. "adcs r3, r3, r7\n\t"
  2806. #elif defined(__clang__)
  2807. "adcs r3, r7\n\t"
  2808. #else
  2809. "adc r3, r7\n\t"
  2810. #endif
  2811. #ifdef WOLFSSL_KEIL
  2812. "adcs r4, r4, %[r]\n\t"
  2813. #elif defined(__clang__)
  2814. "adcs r4, %[r]\n\t"
  2815. #else
  2816. "adc r4, %[r]\n\t"
  2817. #endif
  2818. "# A[2] * B[3]\n\t"
  2819. "mov %[a], r9\n\t"
  2820. "mov %[b], r10\n\t"
  2821. "ldr %[a], [%[a], #8]\n\t"
  2822. "ldr %[b], [%[b], #12]\n\t"
  2823. "uxth r6, %[a]\n\t"
  2824. "uxth r7, %[b]\n\t"
  2825. #ifdef WOLFSSL_KEIL
  2826. "muls r7, r6, r7\n\t"
  2827. #elif defined(__clang__)
  2828. "muls r7, r6\n\t"
  2829. #else
  2830. "mul r7, r6\n\t"
  2831. #endif
  2832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2833. "adds r5, r5, r7\n\t"
  2834. #else
  2835. "add r5, r5, r7\n\t"
  2836. #endif
  2837. #ifdef WOLFSSL_KEIL
  2838. "adcs r3, r3, %[r]\n\t"
  2839. #elif defined(__clang__)
  2840. "adcs r3, %[r]\n\t"
  2841. #else
  2842. "adc r3, %[r]\n\t"
  2843. #endif
  2844. #ifdef WOLFSSL_KEIL
  2845. "adcs r4, r4, %[r]\n\t"
  2846. #elif defined(__clang__)
  2847. "adcs r4, %[r]\n\t"
  2848. #else
  2849. "adc r4, %[r]\n\t"
  2850. #endif
  2851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2852. "lsrs r7, %[b], #16\n\t"
  2853. #else
  2854. "lsr r7, %[b], #16\n\t"
  2855. #endif
  2856. #ifdef WOLFSSL_KEIL
  2857. "muls r6, r7, r6\n\t"
  2858. #elif defined(__clang__)
  2859. "muls r6, r7\n\t"
  2860. #else
  2861. "mul r6, r7\n\t"
  2862. #endif
  2863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2864. "lsrs r7, r6, #16\n\t"
  2865. #else
  2866. "lsr r7, r6, #16\n\t"
  2867. #endif
  2868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2869. "lsls r6, r6, #16\n\t"
  2870. #else
  2871. "lsl r6, r6, #16\n\t"
  2872. #endif
  2873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2874. "adds r5, r5, r6\n\t"
  2875. #else
  2876. "add r5, r5, r6\n\t"
  2877. #endif
  2878. #ifdef WOLFSSL_KEIL
  2879. "adcs r3, r3, r7\n\t"
  2880. #elif defined(__clang__)
  2881. "adcs r3, r7\n\t"
  2882. #else
  2883. "adc r3, r7\n\t"
  2884. #endif
  2885. #ifdef WOLFSSL_KEIL
  2886. "adcs r4, r4, %[r]\n\t"
  2887. #elif defined(__clang__)
  2888. "adcs r4, %[r]\n\t"
  2889. #else
  2890. "adc r4, %[r]\n\t"
  2891. #endif
  2892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2893. "lsrs r6, %[a], #16\n\t"
  2894. #else
  2895. "lsr r6, %[a], #16\n\t"
  2896. #endif
  2897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2898. "lsrs r7, %[b], #16\n\t"
  2899. #else
  2900. "lsr r7, %[b], #16\n\t"
  2901. #endif
  2902. #ifdef WOLFSSL_KEIL
  2903. "muls r7, r6, r7\n\t"
  2904. #elif defined(__clang__)
  2905. "muls r7, r6\n\t"
  2906. #else
  2907. "mul r7, r6\n\t"
  2908. #endif
  2909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2910. "adds r3, r3, r7\n\t"
  2911. #else
  2912. "add r3, r3, r7\n\t"
  2913. #endif
  2914. #ifdef WOLFSSL_KEIL
  2915. "adcs r4, r4, %[r]\n\t"
  2916. #elif defined(__clang__)
  2917. "adcs r4, %[r]\n\t"
  2918. #else
  2919. "adc r4, %[r]\n\t"
  2920. #endif
  2921. "uxth r7, %[b]\n\t"
  2922. #ifdef WOLFSSL_KEIL
  2923. "muls r6, r7, r6\n\t"
  2924. #elif defined(__clang__)
  2925. "muls r6, r7\n\t"
  2926. #else
  2927. "mul r6, r7\n\t"
  2928. #endif
  2929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2930. "lsrs r7, r6, #16\n\t"
  2931. #else
  2932. "lsr r7, r6, #16\n\t"
  2933. #endif
  2934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2935. "lsls r6, r6, #16\n\t"
  2936. #else
  2937. "lsl r6, r6, #16\n\t"
  2938. #endif
  2939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2940. "adds r5, r5, r6\n\t"
  2941. #else
  2942. "add r5, r5, r6\n\t"
  2943. #endif
  2944. #ifdef WOLFSSL_KEIL
  2945. "adcs r3, r3, r7\n\t"
  2946. #elif defined(__clang__)
  2947. "adcs r3, r7\n\t"
  2948. #else
  2949. "adc r3, r7\n\t"
  2950. #endif
  2951. #ifdef WOLFSSL_KEIL
  2952. "adcs r4, r4, %[r]\n\t"
  2953. #elif defined(__clang__)
  2954. "adcs r4, %[r]\n\t"
  2955. #else
  2956. "adc r4, %[r]\n\t"
  2957. #endif
  2958. "# A[3] * B[2]\n\t"
  2959. "mov %[a], r9\n\t"
  2960. "mov %[b], r10\n\t"
  2961. "ldr %[a], [%[a], #12]\n\t"
  2962. "ldr %[b], [%[b], #8]\n\t"
  2963. "uxth r6, %[a]\n\t"
  2964. "uxth r7, %[b]\n\t"
  2965. #ifdef WOLFSSL_KEIL
  2966. "muls r7, r6, r7\n\t"
  2967. #elif defined(__clang__)
  2968. "muls r7, r6\n\t"
  2969. #else
  2970. "mul r7, r6\n\t"
  2971. #endif
  2972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2973. "adds r5, r5, r7\n\t"
  2974. #else
  2975. "add r5, r5, r7\n\t"
  2976. #endif
  2977. #ifdef WOLFSSL_KEIL
  2978. "adcs r3, r3, %[r]\n\t"
  2979. #elif defined(__clang__)
  2980. "adcs r3, %[r]\n\t"
  2981. #else
  2982. "adc r3, %[r]\n\t"
  2983. #endif
  2984. #ifdef WOLFSSL_KEIL
  2985. "adcs r4, r4, %[r]\n\t"
  2986. #elif defined(__clang__)
  2987. "adcs r4, %[r]\n\t"
  2988. #else
  2989. "adc r4, %[r]\n\t"
  2990. #endif
  2991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2992. "lsrs r7, %[b], #16\n\t"
  2993. #else
  2994. "lsr r7, %[b], #16\n\t"
  2995. #endif
  2996. #ifdef WOLFSSL_KEIL
  2997. "muls r6, r7, r6\n\t"
  2998. #elif defined(__clang__)
  2999. "muls r6, r7\n\t"
  3000. #else
  3001. "mul r6, r7\n\t"
  3002. #endif
  3003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3004. "lsrs r7, r6, #16\n\t"
  3005. #else
  3006. "lsr r7, r6, #16\n\t"
  3007. #endif
  3008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3009. "lsls r6, r6, #16\n\t"
  3010. #else
  3011. "lsl r6, r6, #16\n\t"
  3012. #endif
  3013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3014. "adds r5, r5, r6\n\t"
  3015. #else
  3016. "add r5, r5, r6\n\t"
  3017. #endif
  3018. #ifdef WOLFSSL_KEIL
  3019. "adcs r3, r3, r7\n\t"
  3020. #elif defined(__clang__)
  3021. "adcs r3, r7\n\t"
  3022. #else
  3023. "adc r3, r7\n\t"
  3024. #endif
  3025. #ifdef WOLFSSL_KEIL
  3026. "adcs r4, r4, %[r]\n\t"
  3027. #elif defined(__clang__)
  3028. "adcs r4, %[r]\n\t"
  3029. #else
  3030. "adc r4, %[r]\n\t"
  3031. #endif
  3032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3033. "lsrs r6, %[a], #16\n\t"
  3034. #else
  3035. "lsr r6, %[a], #16\n\t"
  3036. #endif
  3037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3038. "lsrs r7, %[b], #16\n\t"
  3039. #else
  3040. "lsr r7, %[b], #16\n\t"
  3041. #endif
  3042. #ifdef WOLFSSL_KEIL
  3043. "muls r7, r6, r7\n\t"
  3044. #elif defined(__clang__)
  3045. "muls r7, r6\n\t"
  3046. #else
  3047. "mul r7, r6\n\t"
  3048. #endif
  3049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3050. "adds r3, r3, r7\n\t"
  3051. #else
  3052. "add r3, r3, r7\n\t"
  3053. #endif
  3054. #ifdef WOLFSSL_KEIL
  3055. "adcs r4, r4, %[r]\n\t"
  3056. #elif defined(__clang__)
  3057. "adcs r4, %[r]\n\t"
  3058. #else
  3059. "adc r4, %[r]\n\t"
  3060. #endif
  3061. "uxth r7, %[b]\n\t"
  3062. #ifdef WOLFSSL_KEIL
  3063. "muls r6, r7, r6\n\t"
  3064. #elif defined(__clang__)
  3065. "muls r6, r7\n\t"
  3066. #else
  3067. "mul r6, r7\n\t"
  3068. #endif
  3069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3070. "lsrs r7, r6, #16\n\t"
  3071. #else
  3072. "lsr r7, r6, #16\n\t"
  3073. #endif
  3074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3075. "lsls r6, r6, #16\n\t"
  3076. #else
  3077. "lsl r6, r6, #16\n\t"
  3078. #endif
  3079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3080. "adds r5, r5, r6\n\t"
  3081. #else
  3082. "add r5, r5, r6\n\t"
  3083. #endif
  3084. #ifdef WOLFSSL_KEIL
  3085. "adcs r3, r3, r7\n\t"
  3086. #elif defined(__clang__)
  3087. "adcs r3, r7\n\t"
  3088. #else
  3089. "adc r3, r7\n\t"
  3090. #endif
  3091. #ifdef WOLFSSL_KEIL
  3092. "adcs r4, r4, %[r]\n\t"
  3093. #elif defined(__clang__)
  3094. "adcs r4, %[r]\n\t"
  3095. #else
  3096. "adc r4, %[r]\n\t"
  3097. #endif
  3098. "# A[4] * B[1]\n\t"
  3099. "mov %[a], r9\n\t"
  3100. "mov %[b], r10\n\t"
  3101. "ldr %[a], [%[a], #16]\n\t"
  3102. "ldr %[b], [%[b], #4]\n\t"
  3103. "uxth r6, %[a]\n\t"
  3104. "uxth r7, %[b]\n\t"
  3105. #ifdef WOLFSSL_KEIL
  3106. "muls r7, r6, r7\n\t"
  3107. #elif defined(__clang__)
  3108. "muls r7, r6\n\t"
  3109. #else
  3110. "mul r7, r6\n\t"
  3111. #endif
  3112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3113. "adds r5, r5, r7\n\t"
  3114. #else
  3115. "add r5, r5, r7\n\t"
  3116. #endif
  3117. #ifdef WOLFSSL_KEIL
  3118. "adcs r3, r3, %[r]\n\t"
  3119. #elif defined(__clang__)
  3120. "adcs r3, %[r]\n\t"
  3121. #else
  3122. "adc r3, %[r]\n\t"
  3123. #endif
  3124. #ifdef WOLFSSL_KEIL
  3125. "adcs r4, r4, %[r]\n\t"
  3126. #elif defined(__clang__)
  3127. "adcs r4, %[r]\n\t"
  3128. #else
  3129. "adc r4, %[r]\n\t"
  3130. #endif
  3131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3132. "lsrs r7, %[b], #16\n\t"
  3133. #else
  3134. "lsr r7, %[b], #16\n\t"
  3135. #endif
  3136. #ifdef WOLFSSL_KEIL
  3137. "muls r6, r7, r6\n\t"
  3138. #elif defined(__clang__)
  3139. "muls r6, r7\n\t"
  3140. #else
  3141. "mul r6, r7\n\t"
  3142. #endif
  3143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3144. "lsrs r7, r6, #16\n\t"
  3145. #else
  3146. "lsr r7, r6, #16\n\t"
  3147. #endif
  3148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3149. "lsls r6, r6, #16\n\t"
  3150. #else
  3151. "lsl r6, r6, #16\n\t"
  3152. #endif
  3153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3154. "adds r5, r5, r6\n\t"
  3155. #else
  3156. "add r5, r5, r6\n\t"
  3157. #endif
  3158. #ifdef WOLFSSL_KEIL
  3159. "adcs r3, r3, r7\n\t"
  3160. #elif defined(__clang__)
  3161. "adcs r3, r7\n\t"
  3162. #else
  3163. "adc r3, r7\n\t"
  3164. #endif
  3165. #ifdef WOLFSSL_KEIL
  3166. "adcs r4, r4, %[r]\n\t"
  3167. #elif defined(__clang__)
  3168. "adcs r4, %[r]\n\t"
  3169. #else
  3170. "adc r4, %[r]\n\t"
  3171. #endif
  3172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3173. "lsrs r6, %[a], #16\n\t"
  3174. #else
  3175. "lsr r6, %[a], #16\n\t"
  3176. #endif
  3177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3178. "lsrs r7, %[b], #16\n\t"
  3179. #else
  3180. "lsr r7, %[b], #16\n\t"
  3181. #endif
  3182. #ifdef WOLFSSL_KEIL
  3183. "muls r7, r6, r7\n\t"
  3184. #elif defined(__clang__)
  3185. "muls r7, r6\n\t"
  3186. #else
  3187. "mul r7, r6\n\t"
  3188. #endif
  3189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3190. "adds r3, r3, r7\n\t"
  3191. #else
  3192. "add r3, r3, r7\n\t"
  3193. #endif
  3194. #ifdef WOLFSSL_KEIL
  3195. "adcs r4, r4, %[r]\n\t"
  3196. #elif defined(__clang__)
  3197. "adcs r4, %[r]\n\t"
  3198. #else
  3199. "adc r4, %[r]\n\t"
  3200. #endif
  3201. "uxth r7, %[b]\n\t"
  3202. #ifdef WOLFSSL_KEIL
  3203. "muls r6, r7, r6\n\t"
  3204. #elif defined(__clang__)
  3205. "muls r6, r7\n\t"
  3206. #else
  3207. "mul r6, r7\n\t"
  3208. #endif
  3209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3210. "lsrs r7, r6, #16\n\t"
  3211. #else
  3212. "lsr r7, r6, #16\n\t"
  3213. #endif
  3214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3215. "lsls r6, r6, #16\n\t"
  3216. #else
  3217. "lsl r6, r6, #16\n\t"
  3218. #endif
  3219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3220. "adds r5, r5, r6\n\t"
  3221. #else
  3222. "add r5, r5, r6\n\t"
  3223. #endif
  3224. #ifdef WOLFSSL_KEIL
  3225. "adcs r3, r3, r7\n\t"
  3226. #elif defined(__clang__)
  3227. "adcs r3, r7\n\t"
  3228. #else
  3229. "adc r3, r7\n\t"
  3230. #endif
  3231. #ifdef WOLFSSL_KEIL
  3232. "adcs r4, r4, %[r]\n\t"
  3233. #elif defined(__clang__)
  3234. "adcs r4, %[r]\n\t"
  3235. #else
  3236. "adc r4, %[r]\n\t"
  3237. #endif
  3238. "# A[5] * B[0]\n\t"
  3239. "mov %[a], r9\n\t"
  3240. "mov %[b], r10\n\t"
  3241. "ldr %[a], [%[a], #20]\n\t"
  3242. "ldr %[b], [%[b]]\n\t"
  3243. "uxth r6, %[a]\n\t"
  3244. "uxth r7, %[b]\n\t"
  3245. #ifdef WOLFSSL_KEIL
  3246. "muls r7, r6, r7\n\t"
  3247. #elif defined(__clang__)
  3248. "muls r7, r6\n\t"
  3249. #else
  3250. "mul r7, r6\n\t"
  3251. #endif
  3252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3253. "adds r5, r5, r7\n\t"
  3254. #else
  3255. "add r5, r5, r7\n\t"
  3256. #endif
  3257. #ifdef WOLFSSL_KEIL
  3258. "adcs r3, r3, %[r]\n\t"
  3259. #elif defined(__clang__)
  3260. "adcs r3, %[r]\n\t"
  3261. #else
  3262. "adc r3, %[r]\n\t"
  3263. #endif
  3264. #ifdef WOLFSSL_KEIL
  3265. "adcs r4, r4, %[r]\n\t"
  3266. #elif defined(__clang__)
  3267. "adcs r4, %[r]\n\t"
  3268. #else
  3269. "adc r4, %[r]\n\t"
  3270. #endif
  3271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3272. "lsrs r7, %[b], #16\n\t"
  3273. #else
  3274. "lsr r7, %[b], #16\n\t"
  3275. #endif
  3276. #ifdef WOLFSSL_KEIL
  3277. "muls r6, r7, r6\n\t"
  3278. #elif defined(__clang__)
  3279. "muls r6, r7\n\t"
  3280. #else
  3281. "mul r6, r7\n\t"
  3282. #endif
  3283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3284. "lsrs r7, r6, #16\n\t"
  3285. #else
  3286. "lsr r7, r6, #16\n\t"
  3287. #endif
  3288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3289. "lsls r6, r6, #16\n\t"
  3290. #else
  3291. "lsl r6, r6, #16\n\t"
  3292. #endif
  3293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3294. "adds r5, r5, r6\n\t"
  3295. #else
  3296. "add r5, r5, r6\n\t"
  3297. #endif
  3298. #ifdef WOLFSSL_KEIL
  3299. "adcs r3, r3, r7\n\t"
  3300. #elif defined(__clang__)
  3301. "adcs r3, r7\n\t"
  3302. #else
  3303. "adc r3, r7\n\t"
  3304. #endif
  3305. #ifdef WOLFSSL_KEIL
  3306. "adcs r4, r4, %[r]\n\t"
  3307. #elif defined(__clang__)
  3308. "adcs r4, %[r]\n\t"
  3309. #else
  3310. "adc r4, %[r]\n\t"
  3311. #endif
  3312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3313. "lsrs r6, %[a], #16\n\t"
  3314. #else
  3315. "lsr r6, %[a], #16\n\t"
  3316. #endif
  3317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3318. "lsrs r7, %[b], #16\n\t"
  3319. #else
  3320. "lsr r7, %[b], #16\n\t"
  3321. #endif
  3322. #ifdef WOLFSSL_KEIL
  3323. "muls r7, r6, r7\n\t"
  3324. #elif defined(__clang__)
  3325. "muls r7, r6\n\t"
  3326. #else
  3327. "mul r7, r6\n\t"
  3328. #endif
  3329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3330. "adds r3, r3, r7\n\t"
  3331. #else
  3332. "add r3, r3, r7\n\t"
  3333. #endif
  3334. #ifdef WOLFSSL_KEIL
  3335. "adcs r4, r4, %[r]\n\t"
  3336. #elif defined(__clang__)
  3337. "adcs r4, %[r]\n\t"
  3338. #else
  3339. "adc r4, %[r]\n\t"
  3340. #endif
  3341. "uxth r7, %[b]\n\t"
  3342. #ifdef WOLFSSL_KEIL
  3343. "muls r6, r7, r6\n\t"
  3344. #elif defined(__clang__)
  3345. "muls r6, r7\n\t"
  3346. #else
  3347. "mul r6, r7\n\t"
  3348. #endif
  3349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3350. "lsrs r7, r6, #16\n\t"
  3351. #else
  3352. "lsr r7, r6, #16\n\t"
  3353. #endif
  3354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3355. "lsls r6, r6, #16\n\t"
  3356. #else
  3357. "lsl r6, r6, #16\n\t"
  3358. #endif
  3359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3360. "adds r5, r5, r6\n\t"
  3361. #else
  3362. "add r5, r5, r6\n\t"
  3363. #endif
  3364. #ifdef WOLFSSL_KEIL
  3365. "adcs r3, r3, r7\n\t"
  3366. #elif defined(__clang__)
  3367. "adcs r3, r7\n\t"
  3368. #else
  3369. "adc r3, r7\n\t"
  3370. #endif
  3371. #ifdef WOLFSSL_KEIL
  3372. "adcs r4, r4, %[r]\n\t"
  3373. #elif defined(__clang__)
  3374. "adcs r4, %[r]\n\t"
  3375. #else
  3376. "adc r4, %[r]\n\t"
  3377. #endif
  3378. "str r5, [sp, #20]\n\t"
  3379. "# A[6] * B[0]\n\t"
  3380. "movs r5, #0\n\t"
  3381. "mov %[a], r9\n\t"
  3382. "mov %[b], r10\n\t"
  3383. "ldr %[a], [%[a], #24]\n\t"
  3384. "ldr %[b], [%[b]]\n\t"
  3385. "uxth r6, %[a]\n\t"
  3386. "uxth r7, %[b]\n\t"
  3387. #ifdef WOLFSSL_KEIL
  3388. "muls r7, r6, r7\n\t"
  3389. #elif defined(__clang__)
  3390. "muls r7, r6\n\t"
  3391. #else
  3392. "mul r7, r6\n\t"
  3393. #endif
  3394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3395. "adds r3, r3, r7\n\t"
  3396. #else
  3397. "add r3, r3, r7\n\t"
  3398. #endif
  3399. #ifdef WOLFSSL_KEIL
  3400. "adcs r4, r4, %[r]\n\t"
  3401. #elif defined(__clang__)
  3402. "adcs r4, %[r]\n\t"
  3403. #else
  3404. "adc r4, %[r]\n\t"
  3405. #endif
  3406. #ifdef WOLFSSL_KEIL
  3407. "adcs r5, r5, %[r]\n\t"
  3408. #elif defined(__clang__)
  3409. "adcs r5, %[r]\n\t"
  3410. #else
  3411. "adc r5, %[r]\n\t"
  3412. #endif
  3413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3414. "lsrs r7, %[b], #16\n\t"
  3415. #else
  3416. "lsr r7, %[b], #16\n\t"
  3417. #endif
  3418. #ifdef WOLFSSL_KEIL
  3419. "muls r6, r7, r6\n\t"
  3420. #elif defined(__clang__)
  3421. "muls r6, r7\n\t"
  3422. #else
  3423. "mul r6, r7\n\t"
  3424. #endif
  3425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3426. "lsrs r7, r6, #16\n\t"
  3427. #else
  3428. "lsr r7, r6, #16\n\t"
  3429. #endif
  3430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3431. "lsls r6, r6, #16\n\t"
  3432. #else
  3433. "lsl r6, r6, #16\n\t"
  3434. #endif
  3435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3436. "adds r3, r3, r6\n\t"
  3437. #else
  3438. "add r3, r3, r6\n\t"
  3439. #endif
  3440. #ifdef WOLFSSL_KEIL
  3441. "adcs r4, r4, r7\n\t"
  3442. #elif defined(__clang__)
  3443. "adcs r4, r7\n\t"
  3444. #else
  3445. "adc r4, r7\n\t"
  3446. #endif
  3447. #ifdef WOLFSSL_KEIL
  3448. "adcs r5, r5, %[r]\n\t"
  3449. #elif defined(__clang__)
  3450. "adcs r5, %[r]\n\t"
  3451. #else
  3452. "adc r5, %[r]\n\t"
  3453. #endif
  3454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3455. "lsrs r6, %[a], #16\n\t"
  3456. #else
  3457. "lsr r6, %[a], #16\n\t"
  3458. #endif
  3459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3460. "lsrs r7, %[b], #16\n\t"
  3461. #else
  3462. "lsr r7, %[b], #16\n\t"
  3463. #endif
  3464. #ifdef WOLFSSL_KEIL
  3465. "muls r7, r6, r7\n\t"
  3466. #elif defined(__clang__)
  3467. "muls r7, r6\n\t"
  3468. #else
  3469. "mul r7, r6\n\t"
  3470. #endif
  3471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3472. "adds r4, r4, r7\n\t"
  3473. #else
  3474. "add r4, r4, r7\n\t"
  3475. #endif
  3476. #ifdef WOLFSSL_KEIL
  3477. "adcs r5, r5, %[r]\n\t"
  3478. #elif defined(__clang__)
  3479. "adcs r5, %[r]\n\t"
  3480. #else
  3481. "adc r5, %[r]\n\t"
  3482. #endif
  3483. "uxth r7, %[b]\n\t"
  3484. #ifdef WOLFSSL_KEIL
  3485. "muls r6, r7, r6\n\t"
  3486. #elif defined(__clang__)
  3487. "muls r6, r7\n\t"
  3488. #else
  3489. "mul r6, r7\n\t"
  3490. #endif
  3491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3492. "lsrs r7, r6, #16\n\t"
  3493. #else
  3494. "lsr r7, r6, #16\n\t"
  3495. #endif
  3496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3497. "lsls r6, r6, #16\n\t"
  3498. #else
  3499. "lsl r6, r6, #16\n\t"
  3500. #endif
  3501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3502. "adds r3, r3, r6\n\t"
  3503. #else
  3504. "add r3, r3, r6\n\t"
  3505. #endif
  3506. #ifdef WOLFSSL_KEIL
  3507. "adcs r4, r4, r7\n\t"
  3508. #elif defined(__clang__)
  3509. "adcs r4, r7\n\t"
  3510. #else
  3511. "adc r4, r7\n\t"
  3512. #endif
  3513. #ifdef WOLFSSL_KEIL
  3514. "adcs r5, r5, %[r]\n\t"
  3515. #elif defined(__clang__)
  3516. "adcs r5, %[r]\n\t"
  3517. #else
  3518. "adc r5, %[r]\n\t"
  3519. #endif
  3520. "# A[5] * B[1]\n\t"
  3521. "mov %[a], r9\n\t"
  3522. "mov %[b], r10\n\t"
  3523. "ldr %[a], [%[a], #20]\n\t"
  3524. "ldr %[b], [%[b], #4]\n\t"
  3525. "uxth r6, %[a]\n\t"
  3526. "uxth r7, %[b]\n\t"
  3527. #ifdef WOLFSSL_KEIL
  3528. "muls r7, r6, r7\n\t"
  3529. #elif defined(__clang__)
  3530. "muls r7, r6\n\t"
  3531. #else
  3532. "mul r7, r6\n\t"
  3533. #endif
  3534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3535. "adds r3, r3, r7\n\t"
  3536. #else
  3537. "add r3, r3, r7\n\t"
  3538. #endif
  3539. #ifdef WOLFSSL_KEIL
  3540. "adcs r4, r4, %[r]\n\t"
  3541. #elif defined(__clang__)
  3542. "adcs r4, %[r]\n\t"
  3543. #else
  3544. "adc r4, %[r]\n\t"
  3545. #endif
  3546. #ifdef WOLFSSL_KEIL
  3547. "adcs r5, r5, %[r]\n\t"
  3548. #elif defined(__clang__)
  3549. "adcs r5, %[r]\n\t"
  3550. #else
  3551. "adc r5, %[r]\n\t"
  3552. #endif
  3553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3554. "lsrs r7, %[b], #16\n\t"
  3555. #else
  3556. "lsr r7, %[b], #16\n\t"
  3557. #endif
  3558. #ifdef WOLFSSL_KEIL
  3559. "muls r6, r7, r6\n\t"
  3560. #elif defined(__clang__)
  3561. "muls r6, r7\n\t"
  3562. #else
  3563. "mul r6, r7\n\t"
  3564. #endif
  3565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3566. "lsrs r7, r6, #16\n\t"
  3567. #else
  3568. "lsr r7, r6, #16\n\t"
  3569. #endif
  3570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3571. "lsls r6, r6, #16\n\t"
  3572. #else
  3573. "lsl r6, r6, #16\n\t"
  3574. #endif
  3575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3576. "adds r3, r3, r6\n\t"
  3577. #else
  3578. "add r3, r3, r6\n\t"
  3579. #endif
  3580. #ifdef WOLFSSL_KEIL
  3581. "adcs r4, r4, r7\n\t"
  3582. #elif defined(__clang__)
  3583. "adcs r4, r7\n\t"
  3584. #else
  3585. "adc r4, r7\n\t"
  3586. #endif
  3587. #ifdef WOLFSSL_KEIL
  3588. "adcs r5, r5, %[r]\n\t"
  3589. #elif defined(__clang__)
  3590. "adcs r5, %[r]\n\t"
  3591. #else
  3592. "adc r5, %[r]\n\t"
  3593. #endif
  3594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3595. "lsrs r6, %[a], #16\n\t"
  3596. #else
  3597. "lsr r6, %[a], #16\n\t"
  3598. #endif
  3599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3600. "lsrs r7, %[b], #16\n\t"
  3601. #else
  3602. "lsr r7, %[b], #16\n\t"
  3603. #endif
  3604. #ifdef WOLFSSL_KEIL
  3605. "muls r7, r6, r7\n\t"
  3606. #elif defined(__clang__)
  3607. "muls r7, r6\n\t"
  3608. #else
  3609. "mul r7, r6\n\t"
  3610. #endif
  3611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3612. "adds r4, r4, r7\n\t"
  3613. #else
  3614. "add r4, r4, r7\n\t"
  3615. #endif
  3616. #ifdef WOLFSSL_KEIL
  3617. "adcs r5, r5, %[r]\n\t"
  3618. #elif defined(__clang__)
  3619. "adcs r5, %[r]\n\t"
  3620. #else
  3621. "adc r5, %[r]\n\t"
  3622. #endif
  3623. "uxth r7, %[b]\n\t"
  3624. #ifdef WOLFSSL_KEIL
  3625. "muls r6, r7, r6\n\t"
  3626. #elif defined(__clang__)
  3627. "muls r6, r7\n\t"
  3628. #else
  3629. "mul r6, r7\n\t"
  3630. #endif
  3631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3632. "lsrs r7, r6, #16\n\t"
  3633. #else
  3634. "lsr r7, r6, #16\n\t"
  3635. #endif
  3636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3637. "lsls r6, r6, #16\n\t"
  3638. #else
  3639. "lsl r6, r6, #16\n\t"
  3640. #endif
  3641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3642. "adds r3, r3, r6\n\t"
  3643. #else
  3644. "add r3, r3, r6\n\t"
  3645. #endif
  3646. #ifdef WOLFSSL_KEIL
  3647. "adcs r4, r4, r7\n\t"
  3648. #elif defined(__clang__)
  3649. "adcs r4, r7\n\t"
  3650. #else
  3651. "adc r4, r7\n\t"
  3652. #endif
  3653. #ifdef WOLFSSL_KEIL
  3654. "adcs r5, r5, %[r]\n\t"
  3655. #elif defined(__clang__)
  3656. "adcs r5, %[r]\n\t"
  3657. #else
  3658. "adc r5, %[r]\n\t"
  3659. #endif
  3660. "# A[4] * B[2]\n\t"
  3661. "mov %[a], r9\n\t"
  3662. "mov %[b], r10\n\t"
  3663. "ldr %[a], [%[a], #16]\n\t"
  3664. "ldr %[b], [%[b], #8]\n\t"
  3665. "uxth r6, %[a]\n\t"
  3666. "uxth r7, %[b]\n\t"
  3667. #ifdef WOLFSSL_KEIL
  3668. "muls r7, r6, r7\n\t"
  3669. #elif defined(__clang__)
  3670. "muls r7, r6\n\t"
  3671. #else
  3672. "mul r7, r6\n\t"
  3673. #endif
  3674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3675. "adds r3, r3, r7\n\t"
  3676. #else
  3677. "add r3, r3, r7\n\t"
  3678. #endif
  3679. #ifdef WOLFSSL_KEIL
  3680. "adcs r4, r4, %[r]\n\t"
  3681. #elif defined(__clang__)
  3682. "adcs r4, %[r]\n\t"
  3683. #else
  3684. "adc r4, %[r]\n\t"
  3685. #endif
  3686. #ifdef WOLFSSL_KEIL
  3687. "adcs r5, r5, %[r]\n\t"
  3688. #elif defined(__clang__)
  3689. "adcs r5, %[r]\n\t"
  3690. #else
  3691. "adc r5, %[r]\n\t"
  3692. #endif
  3693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3694. "lsrs r7, %[b], #16\n\t"
  3695. #else
  3696. "lsr r7, %[b], #16\n\t"
  3697. #endif
  3698. #ifdef WOLFSSL_KEIL
  3699. "muls r6, r7, r6\n\t"
  3700. #elif defined(__clang__)
  3701. "muls r6, r7\n\t"
  3702. #else
  3703. "mul r6, r7\n\t"
  3704. #endif
  3705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3706. "lsrs r7, r6, #16\n\t"
  3707. #else
  3708. "lsr r7, r6, #16\n\t"
  3709. #endif
  3710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3711. "lsls r6, r6, #16\n\t"
  3712. #else
  3713. "lsl r6, r6, #16\n\t"
  3714. #endif
  3715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3716. "adds r3, r3, r6\n\t"
  3717. #else
  3718. "add r3, r3, r6\n\t"
  3719. #endif
  3720. #ifdef WOLFSSL_KEIL
  3721. "adcs r4, r4, r7\n\t"
  3722. #elif defined(__clang__)
  3723. "adcs r4, r7\n\t"
  3724. #else
  3725. "adc r4, r7\n\t"
  3726. #endif
  3727. #ifdef WOLFSSL_KEIL
  3728. "adcs r5, r5, %[r]\n\t"
  3729. #elif defined(__clang__)
  3730. "adcs r5, %[r]\n\t"
  3731. #else
  3732. "adc r5, %[r]\n\t"
  3733. #endif
  3734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3735. "lsrs r6, %[a], #16\n\t"
  3736. #else
  3737. "lsr r6, %[a], #16\n\t"
  3738. #endif
  3739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3740. "lsrs r7, %[b], #16\n\t"
  3741. #else
  3742. "lsr r7, %[b], #16\n\t"
  3743. #endif
  3744. #ifdef WOLFSSL_KEIL
  3745. "muls r7, r6, r7\n\t"
  3746. #elif defined(__clang__)
  3747. "muls r7, r6\n\t"
  3748. #else
  3749. "mul r7, r6\n\t"
  3750. #endif
  3751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3752. "adds r4, r4, r7\n\t"
  3753. #else
  3754. "add r4, r4, r7\n\t"
  3755. #endif
  3756. #ifdef WOLFSSL_KEIL
  3757. "adcs r5, r5, %[r]\n\t"
  3758. #elif defined(__clang__)
  3759. "adcs r5, %[r]\n\t"
  3760. #else
  3761. "adc r5, %[r]\n\t"
  3762. #endif
  3763. "uxth r7, %[b]\n\t"
  3764. #ifdef WOLFSSL_KEIL
  3765. "muls r6, r7, r6\n\t"
  3766. #elif defined(__clang__)
  3767. "muls r6, r7\n\t"
  3768. #else
  3769. "mul r6, r7\n\t"
  3770. #endif
  3771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3772. "lsrs r7, r6, #16\n\t"
  3773. #else
  3774. "lsr r7, r6, #16\n\t"
  3775. #endif
  3776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3777. "lsls r6, r6, #16\n\t"
  3778. #else
  3779. "lsl r6, r6, #16\n\t"
  3780. #endif
  3781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3782. "adds r3, r3, r6\n\t"
  3783. #else
  3784. "add r3, r3, r6\n\t"
  3785. #endif
  3786. #ifdef WOLFSSL_KEIL
  3787. "adcs r4, r4, r7\n\t"
  3788. #elif defined(__clang__)
  3789. "adcs r4, r7\n\t"
  3790. #else
  3791. "adc r4, r7\n\t"
  3792. #endif
  3793. #ifdef WOLFSSL_KEIL
  3794. "adcs r5, r5, %[r]\n\t"
  3795. #elif defined(__clang__)
  3796. "adcs r5, %[r]\n\t"
  3797. #else
  3798. "adc r5, %[r]\n\t"
  3799. #endif
  3800. "# A[3] * B[3]\n\t"
  3801. "mov %[a], r9\n\t"
  3802. "mov %[b], r10\n\t"
  3803. "ldr %[a], [%[a], #12]\n\t"
  3804. "ldr %[b], [%[b], #12]\n\t"
  3805. "uxth r6, %[a]\n\t"
  3806. "uxth r7, %[b]\n\t"
  3807. #ifdef WOLFSSL_KEIL
  3808. "muls r7, r6, r7\n\t"
  3809. #elif defined(__clang__)
  3810. "muls r7, r6\n\t"
  3811. #else
  3812. "mul r7, r6\n\t"
  3813. #endif
  3814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3815. "adds r3, r3, r7\n\t"
  3816. #else
  3817. "add r3, r3, r7\n\t"
  3818. #endif
  3819. #ifdef WOLFSSL_KEIL
  3820. "adcs r4, r4, %[r]\n\t"
  3821. #elif defined(__clang__)
  3822. "adcs r4, %[r]\n\t"
  3823. #else
  3824. "adc r4, %[r]\n\t"
  3825. #endif
  3826. #ifdef WOLFSSL_KEIL
  3827. "adcs r5, r5, %[r]\n\t"
  3828. #elif defined(__clang__)
  3829. "adcs r5, %[r]\n\t"
  3830. #else
  3831. "adc r5, %[r]\n\t"
  3832. #endif
  3833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3834. "lsrs r7, %[b], #16\n\t"
  3835. #else
  3836. "lsr r7, %[b], #16\n\t"
  3837. #endif
  3838. #ifdef WOLFSSL_KEIL
  3839. "muls r6, r7, r6\n\t"
  3840. #elif defined(__clang__)
  3841. "muls r6, r7\n\t"
  3842. #else
  3843. "mul r6, r7\n\t"
  3844. #endif
  3845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3846. "lsrs r7, r6, #16\n\t"
  3847. #else
  3848. "lsr r7, r6, #16\n\t"
  3849. #endif
  3850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3851. "lsls r6, r6, #16\n\t"
  3852. #else
  3853. "lsl r6, r6, #16\n\t"
  3854. #endif
  3855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3856. "adds r3, r3, r6\n\t"
  3857. #else
  3858. "add r3, r3, r6\n\t"
  3859. #endif
  3860. #ifdef WOLFSSL_KEIL
  3861. "adcs r4, r4, r7\n\t"
  3862. #elif defined(__clang__)
  3863. "adcs r4, r7\n\t"
  3864. #else
  3865. "adc r4, r7\n\t"
  3866. #endif
  3867. #ifdef WOLFSSL_KEIL
  3868. "adcs r5, r5, %[r]\n\t"
  3869. #elif defined(__clang__)
  3870. "adcs r5, %[r]\n\t"
  3871. #else
  3872. "adc r5, %[r]\n\t"
  3873. #endif
  3874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3875. "lsrs r6, %[a], #16\n\t"
  3876. #else
  3877. "lsr r6, %[a], #16\n\t"
  3878. #endif
  3879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3880. "lsrs r7, %[b], #16\n\t"
  3881. #else
  3882. "lsr r7, %[b], #16\n\t"
  3883. #endif
  3884. #ifdef WOLFSSL_KEIL
  3885. "muls r7, r6, r7\n\t"
  3886. #elif defined(__clang__)
  3887. "muls r7, r6\n\t"
  3888. #else
  3889. "mul r7, r6\n\t"
  3890. #endif
  3891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3892. "adds r4, r4, r7\n\t"
  3893. #else
  3894. "add r4, r4, r7\n\t"
  3895. #endif
  3896. #ifdef WOLFSSL_KEIL
  3897. "adcs r5, r5, %[r]\n\t"
  3898. #elif defined(__clang__)
  3899. "adcs r5, %[r]\n\t"
  3900. #else
  3901. "adc r5, %[r]\n\t"
  3902. #endif
  3903. "uxth r7, %[b]\n\t"
  3904. #ifdef WOLFSSL_KEIL
  3905. "muls r6, r7, r6\n\t"
  3906. #elif defined(__clang__)
  3907. "muls r6, r7\n\t"
  3908. #else
  3909. "mul r6, r7\n\t"
  3910. #endif
  3911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3912. "lsrs r7, r6, #16\n\t"
  3913. #else
  3914. "lsr r7, r6, #16\n\t"
  3915. #endif
  3916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3917. "lsls r6, r6, #16\n\t"
  3918. #else
  3919. "lsl r6, r6, #16\n\t"
  3920. #endif
  3921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3922. "adds r3, r3, r6\n\t"
  3923. #else
  3924. "add r3, r3, r6\n\t"
  3925. #endif
  3926. #ifdef WOLFSSL_KEIL
  3927. "adcs r4, r4, r7\n\t"
  3928. #elif defined(__clang__)
  3929. "adcs r4, r7\n\t"
  3930. #else
  3931. "adc r4, r7\n\t"
  3932. #endif
  3933. #ifdef WOLFSSL_KEIL
  3934. "adcs r5, r5, %[r]\n\t"
  3935. #elif defined(__clang__)
  3936. "adcs r5, %[r]\n\t"
  3937. #else
  3938. "adc r5, %[r]\n\t"
  3939. #endif
  3940. "# A[2] * B[4]\n\t"
  3941. "mov %[a], r9\n\t"
  3942. "mov %[b], r10\n\t"
  3943. "ldr %[a], [%[a], #8]\n\t"
  3944. "ldr %[b], [%[b], #16]\n\t"
  3945. "uxth r6, %[a]\n\t"
  3946. "uxth r7, %[b]\n\t"
  3947. #ifdef WOLFSSL_KEIL
  3948. "muls r7, r6, r7\n\t"
  3949. #elif defined(__clang__)
  3950. "muls r7, r6\n\t"
  3951. #else
  3952. "mul r7, r6\n\t"
  3953. #endif
  3954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3955. "adds r3, r3, r7\n\t"
  3956. #else
  3957. "add r3, r3, r7\n\t"
  3958. #endif
  3959. #ifdef WOLFSSL_KEIL
  3960. "adcs r4, r4, %[r]\n\t"
  3961. #elif defined(__clang__)
  3962. "adcs r4, %[r]\n\t"
  3963. #else
  3964. "adc r4, %[r]\n\t"
  3965. #endif
  3966. #ifdef WOLFSSL_KEIL
  3967. "adcs r5, r5, %[r]\n\t"
  3968. #elif defined(__clang__)
  3969. "adcs r5, %[r]\n\t"
  3970. #else
  3971. "adc r5, %[r]\n\t"
  3972. #endif
  3973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3974. "lsrs r7, %[b], #16\n\t"
  3975. #else
  3976. "lsr r7, %[b], #16\n\t"
  3977. #endif
  3978. #ifdef WOLFSSL_KEIL
  3979. "muls r6, r7, r6\n\t"
  3980. #elif defined(__clang__)
  3981. "muls r6, r7\n\t"
  3982. #else
  3983. "mul r6, r7\n\t"
  3984. #endif
  3985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3986. "lsrs r7, r6, #16\n\t"
  3987. #else
  3988. "lsr r7, r6, #16\n\t"
  3989. #endif
  3990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3991. "lsls r6, r6, #16\n\t"
  3992. #else
  3993. "lsl r6, r6, #16\n\t"
  3994. #endif
  3995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3996. "adds r3, r3, r6\n\t"
  3997. #else
  3998. "add r3, r3, r6\n\t"
  3999. #endif
  4000. #ifdef WOLFSSL_KEIL
  4001. "adcs r4, r4, r7\n\t"
  4002. #elif defined(__clang__)
  4003. "adcs r4, r7\n\t"
  4004. #else
  4005. "adc r4, r7\n\t"
  4006. #endif
  4007. #ifdef WOLFSSL_KEIL
  4008. "adcs r5, r5, %[r]\n\t"
  4009. #elif defined(__clang__)
  4010. "adcs r5, %[r]\n\t"
  4011. #else
  4012. "adc r5, %[r]\n\t"
  4013. #endif
  4014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4015. "lsrs r6, %[a], #16\n\t"
  4016. #else
  4017. "lsr r6, %[a], #16\n\t"
  4018. #endif
  4019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4020. "lsrs r7, %[b], #16\n\t"
  4021. #else
  4022. "lsr r7, %[b], #16\n\t"
  4023. #endif
  4024. #ifdef WOLFSSL_KEIL
  4025. "muls r7, r6, r7\n\t"
  4026. #elif defined(__clang__)
  4027. "muls r7, r6\n\t"
  4028. #else
  4029. "mul r7, r6\n\t"
  4030. #endif
  4031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4032. "adds r4, r4, r7\n\t"
  4033. #else
  4034. "add r4, r4, r7\n\t"
  4035. #endif
  4036. #ifdef WOLFSSL_KEIL
  4037. "adcs r5, r5, %[r]\n\t"
  4038. #elif defined(__clang__)
  4039. "adcs r5, %[r]\n\t"
  4040. #else
  4041. "adc r5, %[r]\n\t"
  4042. #endif
  4043. "uxth r7, %[b]\n\t"
  4044. #ifdef WOLFSSL_KEIL
  4045. "muls r6, r7, r6\n\t"
  4046. #elif defined(__clang__)
  4047. "muls r6, r7\n\t"
  4048. #else
  4049. "mul r6, r7\n\t"
  4050. #endif
  4051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4052. "lsrs r7, r6, #16\n\t"
  4053. #else
  4054. "lsr r7, r6, #16\n\t"
  4055. #endif
  4056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4057. "lsls r6, r6, #16\n\t"
  4058. #else
  4059. "lsl r6, r6, #16\n\t"
  4060. #endif
  4061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4062. "adds r3, r3, r6\n\t"
  4063. #else
  4064. "add r3, r3, r6\n\t"
  4065. #endif
  4066. #ifdef WOLFSSL_KEIL
  4067. "adcs r4, r4, r7\n\t"
  4068. #elif defined(__clang__)
  4069. "adcs r4, r7\n\t"
  4070. #else
  4071. "adc r4, r7\n\t"
  4072. #endif
  4073. #ifdef WOLFSSL_KEIL
  4074. "adcs r5, r5, %[r]\n\t"
  4075. #elif defined(__clang__)
  4076. "adcs r5, %[r]\n\t"
  4077. #else
  4078. "adc r5, %[r]\n\t"
  4079. #endif
  4080. "# A[1] * B[5]\n\t"
  4081. "mov %[a], r9\n\t"
  4082. "mov %[b], r10\n\t"
  4083. "ldr %[a], [%[a], #4]\n\t"
  4084. "ldr %[b], [%[b], #20]\n\t"
  4085. "uxth r6, %[a]\n\t"
  4086. "uxth r7, %[b]\n\t"
  4087. #ifdef WOLFSSL_KEIL
  4088. "muls r7, r6, r7\n\t"
  4089. #elif defined(__clang__)
  4090. "muls r7, r6\n\t"
  4091. #else
  4092. "mul r7, r6\n\t"
  4093. #endif
  4094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4095. "adds r3, r3, r7\n\t"
  4096. #else
  4097. "add r3, r3, r7\n\t"
  4098. #endif
  4099. #ifdef WOLFSSL_KEIL
  4100. "adcs r4, r4, %[r]\n\t"
  4101. #elif defined(__clang__)
  4102. "adcs r4, %[r]\n\t"
  4103. #else
  4104. "adc r4, %[r]\n\t"
  4105. #endif
  4106. #ifdef WOLFSSL_KEIL
  4107. "adcs r5, r5, %[r]\n\t"
  4108. #elif defined(__clang__)
  4109. "adcs r5, %[r]\n\t"
  4110. #else
  4111. "adc r5, %[r]\n\t"
  4112. #endif
  4113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4114. "lsrs r7, %[b], #16\n\t"
  4115. #else
  4116. "lsr r7, %[b], #16\n\t"
  4117. #endif
  4118. #ifdef WOLFSSL_KEIL
  4119. "muls r6, r7, r6\n\t"
  4120. #elif defined(__clang__)
  4121. "muls r6, r7\n\t"
  4122. #else
  4123. "mul r6, r7\n\t"
  4124. #endif
  4125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4126. "lsrs r7, r6, #16\n\t"
  4127. #else
  4128. "lsr r7, r6, #16\n\t"
  4129. #endif
  4130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4131. "lsls r6, r6, #16\n\t"
  4132. #else
  4133. "lsl r6, r6, #16\n\t"
  4134. #endif
  4135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4136. "adds r3, r3, r6\n\t"
  4137. #else
  4138. "add r3, r3, r6\n\t"
  4139. #endif
  4140. #ifdef WOLFSSL_KEIL
  4141. "adcs r4, r4, r7\n\t"
  4142. #elif defined(__clang__)
  4143. "adcs r4, r7\n\t"
  4144. #else
  4145. "adc r4, r7\n\t"
  4146. #endif
  4147. #ifdef WOLFSSL_KEIL
  4148. "adcs r5, r5, %[r]\n\t"
  4149. #elif defined(__clang__)
  4150. "adcs r5, %[r]\n\t"
  4151. #else
  4152. "adc r5, %[r]\n\t"
  4153. #endif
  4154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4155. "lsrs r6, %[a], #16\n\t"
  4156. #else
  4157. "lsr r6, %[a], #16\n\t"
  4158. #endif
  4159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4160. "lsrs r7, %[b], #16\n\t"
  4161. #else
  4162. "lsr r7, %[b], #16\n\t"
  4163. #endif
  4164. #ifdef WOLFSSL_KEIL
  4165. "muls r7, r6, r7\n\t"
  4166. #elif defined(__clang__)
  4167. "muls r7, r6\n\t"
  4168. #else
  4169. "mul r7, r6\n\t"
  4170. #endif
  4171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4172. "adds r4, r4, r7\n\t"
  4173. #else
  4174. "add r4, r4, r7\n\t"
  4175. #endif
  4176. #ifdef WOLFSSL_KEIL
  4177. "adcs r5, r5, %[r]\n\t"
  4178. #elif defined(__clang__)
  4179. "adcs r5, %[r]\n\t"
  4180. #else
  4181. "adc r5, %[r]\n\t"
  4182. #endif
  4183. "uxth r7, %[b]\n\t"
  4184. #ifdef WOLFSSL_KEIL
  4185. "muls r6, r7, r6\n\t"
  4186. #elif defined(__clang__)
  4187. "muls r6, r7\n\t"
  4188. #else
  4189. "mul r6, r7\n\t"
  4190. #endif
  4191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4192. "lsrs r7, r6, #16\n\t"
  4193. #else
  4194. "lsr r7, r6, #16\n\t"
  4195. #endif
  4196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4197. "lsls r6, r6, #16\n\t"
  4198. #else
  4199. "lsl r6, r6, #16\n\t"
  4200. #endif
  4201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4202. "adds r3, r3, r6\n\t"
  4203. #else
  4204. "add r3, r3, r6\n\t"
  4205. #endif
  4206. #ifdef WOLFSSL_KEIL
  4207. "adcs r4, r4, r7\n\t"
  4208. #elif defined(__clang__)
  4209. "adcs r4, r7\n\t"
  4210. #else
  4211. "adc r4, r7\n\t"
  4212. #endif
  4213. #ifdef WOLFSSL_KEIL
  4214. "adcs r5, r5, %[r]\n\t"
  4215. #elif defined(__clang__)
  4216. "adcs r5, %[r]\n\t"
  4217. #else
  4218. "adc r5, %[r]\n\t"
  4219. #endif
  4220. "# A[0] * B[6]\n\t"
  4221. "mov %[a], r9\n\t"
  4222. "mov %[b], r10\n\t"
  4223. "ldr %[a], [%[a]]\n\t"
  4224. "ldr %[b], [%[b], #24]\n\t"
  4225. "uxth r6, %[a]\n\t"
  4226. "uxth r7, %[b]\n\t"
  4227. #ifdef WOLFSSL_KEIL
  4228. "muls r7, r6, r7\n\t"
  4229. #elif defined(__clang__)
  4230. "muls r7, r6\n\t"
  4231. #else
  4232. "mul r7, r6\n\t"
  4233. #endif
  4234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4235. "adds r3, r3, r7\n\t"
  4236. #else
  4237. "add r3, r3, r7\n\t"
  4238. #endif
  4239. #ifdef WOLFSSL_KEIL
  4240. "adcs r4, r4, %[r]\n\t"
  4241. #elif defined(__clang__)
  4242. "adcs r4, %[r]\n\t"
  4243. #else
  4244. "adc r4, %[r]\n\t"
  4245. #endif
  4246. #ifdef WOLFSSL_KEIL
  4247. "adcs r5, r5, %[r]\n\t"
  4248. #elif defined(__clang__)
  4249. "adcs r5, %[r]\n\t"
  4250. #else
  4251. "adc r5, %[r]\n\t"
  4252. #endif
  4253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4254. "lsrs r7, %[b], #16\n\t"
  4255. #else
  4256. "lsr r7, %[b], #16\n\t"
  4257. #endif
  4258. #ifdef WOLFSSL_KEIL
  4259. "muls r6, r7, r6\n\t"
  4260. #elif defined(__clang__)
  4261. "muls r6, r7\n\t"
  4262. #else
  4263. "mul r6, r7\n\t"
  4264. #endif
  4265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4266. "lsrs r7, r6, #16\n\t"
  4267. #else
  4268. "lsr r7, r6, #16\n\t"
  4269. #endif
  4270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4271. "lsls r6, r6, #16\n\t"
  4272. #else
  4273. "lsl r6, r6, #16\n\t"
  4274. #endif
  4275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4276. "adds r3, r3, r6\n\t"
  4277. #else
  4278. "add r3, r3, r6\n\t"
  4279. #endif
  4280. #ifdef WOLFSSL_KEIL
  4281. "adcs r4, r4, r7\n\t"
  4282. #elif defined(__clang__)
  4283. "adcs r4, r7\n\t"
  4284. #else
  4285. "adc r4, r7\n\t"
  4286. #endif
  4287. #ifdef WOLFSSL_KEIL
  4288. "adcs r5, r5, %[r]\n\t"
  4289. #elif defined(__clang__)
  4290. "adcs r5, %[r]\n\t"
  4291. #else
  4292. "adc r5, %[r]\n\t"
  4293. #endif
  4294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4295. "lsrs r6, %[a], #16\n\t"
  4296. #else
  4297. "lsr r6, %[a], #16\n\t"
  4298. #endif
  4299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4300. "lsrs r7, %[b], #16\n\t"
  4301. #else
  4302. "lsr r7, %[b], #16\n\t"
  4303. #endif
  4304. #ifdef WOLFSSL_KEIL
  4305. "muls r7, r6, r7\n\t"
  4306. #elif defined(__clang__)
  4307. "muls r7, r6\n\t"
  4308. #else
  4309. "mul r7, r6\n\t"
  4310. #endif
  4311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4312. "adds r4, r4, r7\n\t"
  4313. #else
  4314. "add r4, r4, r7\n\t"
  4315. #endif
  4316. #ifdef WOLFSSL_KEIL
  4317. "adcs r5, r5, %[r]\n\t"
  4318. #elif defined(__clang__)
  4319. "adcs r5, %[r]\n\t"
  4320. #else
  4321. "adc r5, %[r]\n\t"
  4322. #endif
  4323. "uxth r7, %[b]\n\t"
  4324. #ifdef WOLFSSL_KEIL
  4325. "muls r6, r7, r6\n\t"
  4326. #elif defined(__clang__)
  4327. "muls r6, r7\n\t"
  4328. #else
  4329. "mul r6, r7\n\t"
  4330. #endif
  4331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4332. "lsrs r7, r6, #16\n\t"
  4333. #else
  4334. "lsr r7, r6, #16\n\t"
  4335. #endif
  4336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4337. "lsls r6, r6, #16\n\t"
  4338. #else
  4339. "lsl r6, r6, #16\n\t"
  4340. #endif
  4341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4342. "adds r3, r3, r6\n\t"
  4343. #else
  4344. "add r3, r3, r6\n\t"
  4345. #endif
  4346. #ifdef WOLFSSL_KEIL
  4347. "adcs r4, r4, r7\n\t"
  4348. #elif defined(__clang__)
  4349. "adcs r4, r7\n\t"
  4350. #else
  4351. "adc r4, r7\n\t"
  4352. #endif
  4353. #ifdef WOLFSSL_KEIL
  4354. "adcs r5, r5, %[r]\n\t"
  4355. #elif defined(__clang__)
  4356. "adcs r5, %[r]\n\t"
  4357. #else
  4358. "adc r5, %[r]\n\t"
  4359. #endif
  4360. "str r3, [sp, #24]\n\t"
  4361. "# A[0] * B[7]\n\t"
  4362. "movs r3, #0\n\t"
  4363. "mov %[a], r9\n\t"
  4364. "mov %[b], r10\n\t"
  4365. "ldr %[a], [%[a]]\n\t"
  4366. "ldr %[b], [%[b], #28]\n\t"
  4367. "uxth r6, %[a]\n\t"
  4368. "uxth r7, %[b]\n\t"
  4369. #ifdef WOLFSSL_KEIL
  4370. "muls r7, r6, r7\n\t"
  4371. #elif defined(__clang__)
  4372. "muls r7, r6\n\t"
  4373. #else
  4374. "mul r7, r6\n\t"
  4375. #endif
  4376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4377. "adds r4, r4, r7\n\t"
  4378. #else
  4379. "add r4, r4, r7\n\t"
  4380. #endif
  4381. #ifdef WOLFSSL_KEIL
  4382. "adcs r5, r5, %[r]\n\t"
  4383. #elif defined(__clang__)
  4384. "adcs r5, %[r]\n\t"
  4385. #else
  4386. "adc r5, %[r]\n\t"
  4387. #endif
  4388. #ifdef WOLFSSL_KEIL
  4389. "adcs r3, r3, %[r]\n\t"
  4390. #elif defined(__clang__)
  4391. "adcs r3, %[r]\n\t"
  4392. #else
  4393. "adc r3, %[r]\n\t"
  4394. #endif
  4395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4396. "lsrs r7, %[b], #16\n\t"
  4397. #else
  4398. "lsr r7, %[b], #16\n\t"
  4399. #endif
  4400. #ifdef WOLFSSL_KEIL
  4401. "muls r6, r7, r6\n\t"
  4402. #elif defined(__clang__)
  4403. "muls r6, r7\n\t"
  4404. #else
  4405. "mul r6, r7\n\t"
  4406. #endif
  4407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4408. "lsrs r7, r6, #16\n\t"
  4409. #else
  4410. "lsr r7, r6, #16\n\t"
  4411. #endif
  4412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4413. "lsls r6, r6, #16\n\t"
  4414. #else
  4415. "lsl r6, r6, #16\n\t"
  4416. #endif
  4417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4418. "adds r4, r4, r6\n\t"
  4419. #else
  4420. "add r4, r4, r6\n\t"
  4421. #endif
  4422. #ifdef WOLFSSL_KEIL
  4423. "adcs r5, r5, r7\n\t"
  4424. #elif defined(__clang__)
  4425. "adcs r5, r7\n\t"
  4426. #else
  4427. "adc r5, r7\n\t"
  4428. #endif
  4429. #ifdef WOLFSSL_KEIL
  4430. "adcs r3, r3, %[r]\n\t"
  4431. #elif defined(__clang__)
  4432. "adcs r3, %[r]\n\t"
  4433. #else
  4434. "adc r3, %[r]\n\t"
  4435. #endif
  4436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4437. "lsrs r6, %[a], #16\n\t"
  4438. #else
  4439. "lsr r6, %[a], #16\n\t"
  4440. #endif
  4441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4442. "lsrs r7, %[b], #16\n\t"
  4443. #else
  4444. "lsr r7, %[b], #16\n\t"
  4445. #endif
  4446. #ifdef WOLFSSL_KEIL
  4447. "muls r7, r6, r7\n\t"
  4448. #elif defined(__clang__)
  4449. "muls r7, r6\n\t"
  4450. #else
  4451. "mul r7, r6\n\t"
  4452. #endif
  4453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4454. "adds r5, r5, r7\n\t"
  4455. #else
  4456. "add r5, r5, r7\n\t"
  4457. #endif
  4458. #ifdef WOLFSSL_KEIL
  4459. "adcs r3, r3, %[r]\n\t"
  4460. #elif defined(__clang__)
  4461. "adcs r3, %[r]\n\t"
  4462. #else
  4463. "adc r3, %[r]\n\t"
  4464. #endif
  4465. "uxth r7, %[b]\n\t"
  4466. #ifdef WOLFSSL_KEIL
  4467. "muls r6, r7, r6\n\t"
  4468. #elif defined(__clang__)
  4469. "muls r6, r7\n\t"
  4470. #else
  4471. "mul r6, r7\n\t"
  4472. #endif
  4473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4474. "lsrs r7, r6, #16\n\t"
  4475. #else
  4476. "lsr r7, r6, #16\n\t"
  4477. #endif
  4478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4479. "lsls r6, r6, #16\n\t"
  4480. #else
  4481. "lsl r6, r6, #16\n\t"
  4482. #endif
  4483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4484. "adds r4, r4, r6\n\t"
  4485. #else
  4486. "add r4, r4, r6\n\t"
  4487. #endif
  4488. #ifdef WOLFSSL_KEIL
  4489. "adcs r5, r5, r7\n\t"
  4490. #elif defined(__clang__)
  4491. "adcs r5, r7\n\t"
  4492. #else
  4493. "adc r5, r7\n\t"
  4494. #endif
  4495. #ifdef WOLFSSL_KEIL
  4496. "adcs r3, r3, %[r]\n\t"
  4497. #elif defined(__clang__)
  4498. "adcs r3, %[r]\n\t"
  4499. #else
  4500. "adc r3, %[r]\n\t"
  4501. #endif
  4502. "# A[1] * B[6]\n\t"
  4503. "mov %[a], r9\n\t"
  4504. "mov %[b], r10\n\t"
  4505. "ldr %[a], [%[a], #4]\n\t"
  4506. "ldr %[b], [%[b], #24]\n\t"
  4507. "uxth r6, %[a]\n\t"
  4508. "uxth r7, %[b]\n\t"
  4509. #ifdef WOLFSSL_KEIL
  4510. "muls r7, r6, r7\n\t"
  4511. #elif defined(__clang__)
  4512. "muls r7, r6\n\t"
  4513. #else
  4514. "mul r7, r6\n\t"
  4515. #endif
  4516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4517. "adds r4, r4, r7\n\t"
  4518. #else
  4519. "add r4, r4, r7\n\t"
  4520. #endif
  4521. #ifdef WOLFSSL_KEIL
  4522. "adcs r5, r5, %[r]\n\t"
  4523. #elif defined(__clang__)
  4524. "adcs r5, %[r]\n\t"
  4525. #else
  4526. "adc r5, %[r]\n\t"
  4527. #endif
  4528. #ifdef WOLFSSL_KEIL
  4529. "adcs r3, r3, %[r]\n\t"
  4530. #elif defined(__clang__)
  4531. "adcs r3, %[r]\n\t"
  4532. #else
  4533. "adc r3, %[r]\n\t"
  4534. #endif
  4535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4536. "lsrs r7, %[b], #16\n\t"
  4537. #else
  4538. "lsr r7, %[b], #16\n\t"
  4539. #endif
  4540. #ifdef WOLFSSL_KEIL
  4541. "muls r6, r7, r6\n\t"
  4542. #elif defined(__clang__)
  4543. "muls r6, r7\n\t"
  4544. #else
  4545. "mul r6, r7\n\t"
  4546. #endif
  4547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4548. "lsrs r7, r6, #16\n\t"
  4549. #else
  4550. "lsr r7, r6, #16\n\t"
  4551. #endif
  4552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4553. "lsls r6, r6, #16\n\t"
  4554. #else
  4555. "lsl r6, r6, #16\n\t"
  4556. #endif
  4557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4558. "adds r4, r4, r6\n\t"
  4559. #else
  4560. "add r4, r4, r6\n\t"
  4561. #endif
  4562. #ifdef WOLFSSL_KEIL
  4563. "adcs r5, r5, r7\n\t"
  4564. #elif defined(__clang__)
  4565. "adcs r5, r7\n\t"
  4566. #else
  4567. "adc r5, r7\n\t"
  4568. #endif
  4569. #ifdef WOLFSSL_KEIL
  4570. "adcs r3, r3, %[r]\n\t"
  4571. #elif defined(__clang__)
  4572. "adcs r3, %[r]\n\t"
  4573. #else
  4574. "adc r3, %[r]\n\t"
  4575. #endif
  4576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4577. "lsrs r6, %[a], #16\n\t"
  4578. #else
  4579. "lsr r6, %[a], #16\n\t"
  4580. #endif
  4581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4582. "lsrs r7, %[b], #16\n\t"
  4583. #else
  4584. "lsr r7, %[b], #16\n\t"
  4585. #endif
  4586. #ifdef WOLFSSL_KEIL
  4587. "muls r7, r6, r7\n\t"
  4588. #elif defined(__clang__)
  4589. "muls r7, r6\n\t"
  4590. #else
  4591. "mul r7, r6\n\t"
  4592. #endif
  4593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4594. "adds r5, r5, r7\n\t"
  4595. #else
  4596. "add r5, r5, r7\n\t"
  4597. #endif
  4598. #ifdef WOLFSSL_KEIL
  4599. "adcs r3, r3, %[r]\n\t"
  4600. #elif defined(__clang__)
  4601. "adcs r3, %[r]\n\t"
  4602. #else
  4603. "adc r3, %[r]\n\t"
  4604. #endif
  4605. "uxth r7, %[b]\n\t"
  4606. #ifdef WOLFSSL_KEIL
  4607. "muls r6, r7, r6\n\t"
  4608. #elif defined(__clang__)
  4609. "muls r6, r7\n\t"
  4610. #else
  4611. "mul r6, r7\n\t"
  4612. #endif
  4613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4614. "lsrs r7, r6, #16\n\t"
  4615. #else
  4616. "lsr r7, r6, #16\n\t"
  4617. #endif
  4618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4619. "lsls r6, r6, #16\n\t"
  4620. #else
  4621. "lsl r6, r6, #16\n\t"
  4622. #endif
  4623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4624. "adds r4, r4, r6\n\t"
  4625. #else
  4626. "add r4, r4, r6\n\t"
  4627. #endif
  4628. #ifdef WOLFSSL_KEIL
  4629. "adcs r5, r5, r7\n\t"
  4630. #elif defined(__clang__)
  4631. "adcs r5, r7\n\t"
  4632. #else
  4633. "adc r5, r7\n\t"
  4634. #endif
  4635. #ifdef WOLFSSL_KEIL
  4636. "adcs r3, r3, %[r]\n\t"
  4637. #elif defined(__clang__)
  4638. "adcs r3, %[r]\n\t"
  4639. #else
  4640. "adc r3, %[r]\n\t"
  4641. #endif
  4642. "# A[2] * B[5]\n\t"
  4643. "mov %[a], r9\n\t"
  4644. "mov %[b], r10\n\t"
  4645. "ldr %[a], [%[a], #8]\n\t"
  4646. "ldr %[b], [%[b], #20]\n\t"
  4647. "uxth r6, %[a]\n\t"
  4648. "uxth r7, %[b]\n\t"
  4649. #ifdef WOLFSSL_KEIL
  4650. "muls r7, r6, r7\n\t"
  4651. #elif defined(__clang__)
  4652. "muls r7, r6\n\t"
  4653. #else
  4654. "mul r7, r6\n\t"
  4655. #endif
  4656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4657. "adds r4, r4, r7\n\t"
  4658. #else
  4659. "add r4, r4, r7\n\t"
  4660. #endif
  4661. #ifdef WOLFSSL_KEIL
  4662. "adcs r5, r5, %[r]\n\t"
  4663. #elif defined(__clang__)
  4664. "adcs r5, %[r]\n\t"
  4665. #else
  4666. "adc r5, %[r]\n\t"
  4667. #endif
  4668. #ifdef WOLFSSL_KEIL
  4669. "adcs r3, r3, %[r]\n\t"
  4670. #elif defined(__clang__)
  4671. "adcs r3, %[r]\n\t"
  4672. #else
  4673. "adc r3, %[r]\n\t"
  4674. #endif
  4675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4676. "lsrs r7, %[b], #16\n\t"
  4677. #else
  4678. "lsr r7, %[b], #16\n\t"
  4679. #endif
  4680. #ifdef WOLFSSL_KEIL
  4681. "muls r6, r7, r6\n\t"
  4682. #elif defined(__clang__)
  4683. "muls r6, r7\n\t"
  4684. #else
  4685. "mul r6, r7\n\t"
  4686. #endif
  4687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4688. "lsrs r7, r6, #16\n\t"
  4689. #else
  4690. "lsr r7, r6, #16\n\t"
  4691. #endif
  4692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4693. "lsls r6, r6, #16\n\t"
  4694. #else
  4695. "lsl r6, r6, #16\n\t"
  4696. #endif
  4697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4698. "adds r4, r4, r6\n\t"
  4699. #else
  4700. "add r4, r4, r6\n\t"
  4701. #endif
  4702. #ifdef WOLFSSL_KEIL
  4703. "adcs r5, r5, r7\n\t"
  4704. #elif defined(__clang__)
  4705. "adcs r5, r7\n\t"
  4706. #else
  4707. "adc r5, r7\n\t"
  4708. #endif
  4709. #ifdef WOLFSSL_KEIL
  4710. "adcs r3, r3, %[r]\n\t"
  4711. #elif defined(__clang__)
  4712. "adcs r3, %[r]\n\t"
  4713. #else
  4714. "adc r3, %[r]\n\t"
  4715. #endif
  4716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4717. "lsrs r6, %[a], #16\n\t"
  4718. #else
  4719. "lsr r6, %[a], #16\n\t"
  4720. #endif
  4721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4722. "lsrs r7, %[b], #16\n\t"
  4723. #else
  4724. "lsr r7, %[b], #16\n\t"
  4725. #endif
  4726. #ifdef WOLFSSL_KEIL
  4727. "muls r7, r6, r7\n\t"
  4728. #elif defined(__clang__)
  4729. "muls r7, r6\n\t"
  4730. #else
  4731. "mul r7, r6\n\t"
  4732. #endif
  4733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4734. "adds r5, r5, r7\n\t"
  4735. #else
  4736. "add r5, r5, r7\n\t"
  4737. #endif
  4738. #ifdef WOLFSSL_KEIL
  4739. "adcs r3, r3, %[r]\n\t"
  4740. #elif defined(__clang__)
  4741. "adcs r3, %[r]\n\t"
  4742. #else
  4743. "adc r3, %[r]\n\t"
  4744. #endif
  4745. "uxth r7, %[b]\n\t"
  4746. #ifdef WOLFSSL_KEIL
  4747. "muls r6, r7, r6\n\t"
  4748. #elif defined(__clang__)
  4749. "muls r6, r7\n\t"
  4750. #else
  4751. "mul r6, r7\n\t"
  4752. #endif
  4753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4754. "lsrs r7, r6, #16\n\t"
  4755. #else
  4756. "lsr r7, r6, #16\n\t"
  4757. #endif
  4758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4759. "lsls r6, r6, #16\n\t"
  4760. #else
  4761. "lsl r6, r6, #16\n\t"
  4762. #endif
  4763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4764. "adds r4, r4, r6\n\t"
  4765. #else
  4766. "add r4, r4, r6\n\t"
  4767. #endif
  4768. #ifdef WOLFSSL_KEIL
  4769. "adcs r5, r5, r7\n\t"
  4770. #elif defined(__clang__)
  4771. "adcs r5, r7\n\t"
  4772. #else
  4773. "adc r5, r7\n\t"
  4774. #endif
  4775. #ifdef WOLFSSL_KEIL
  4776. "adcs r3, r3, %[r]\n\t"
  4777. #elif defined(__clang__)
  4778. "adcs r3, %[r]\n\t"
  4779. #else
  4780. "adc r3, %[r]\n\t"
  4781. #endif
  4782. "# A[3] * B[4]\n\t"
  4783. "mov %[a], r9\n\t"
  4784. "mov %[b], r10\n\t"
  4785. "ldr %[a], [%[a], #12]\n\t"
  4786. "ldr %[b], [%[b], #16]\n\t"
  4787. "uxth r6, %[a]\n\t"
  4788. "uxth r7, %[b]\n\t"
  4789. #ifdef WOLFSSL_KEIL
  4790. "muls r7, r6, r7\n\t"
  4791. #elif defined(__clang__)
  4792. "muls r7, r6\n\t"
  4793. #else
  4794. "mul r7, r6\n\t"
  4795. #endif
  4796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4797. "adds r4, r4, r7\n\t"
  4798. #else
  4799. "add r4, r4, r7\n\t"
  4800. #endif
  4801. #ifdef WOLFSSL_KEIL
  4802. "adcs r5, r5, %[r]\n\t"
  4803. #elif defined(__clang__)
  4804. "adcs r5, %[r]\n\t"
  4805. #else
  4806. "adc r5, %[r]\n\t"
  4807. #endif
  4808. #ifdef WOLFSSL_KEIL
  4809. "adcs r3, r3, %[r]\n\t"
  4810. #elif defined(__clang__)
  4811. "adcs r3, %[r]\n\t"
  4812. #else
  4813. "adc r3, %[r]\n\t"
  4814. #endif
  4815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4816. "lsrs r7, %[b], #16\n\t"
  4817. #else
  4818. "lsr r7, %[b], #16\n\t"
  4819. #endif
  4820. #ifdef WOLFSSL_KEIL
  4821. "muls r6, r7, r6\n\t"
  4822. #elif defined(__clang__)
  4823. "muls r6, r7\n\t"
  4824. #else
  4825. "mul r6, r7\n\t"
  4826. #endif
  4827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4828. "lsrs r7, r6, #16\n\t"
  4829. #else
  4830. "lsr r7, r6, #16\n\t"
  4831. #endif
  4832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4833. "lsls r6, r6, #16\n\t"
  4834. #else
  4835. "lsl r6, r6, #16\n\t"
  4836. #endif
  4837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4838. "adds r4, r4, r6\n\t"
  4839. #else
  4840. "add r4, r4, r6\n\t"
  4841. #endif
  4842. #ifdef WOLFSSL_KEIL
  4843. "adcs r5, r5, r7\n\t"
  4844. #elif defined(__clang__)
  4845. "adcs r5, r7\n\t"
  4846. #else
  4847. "adc r5, r7\n\t"
  4848. #endif
  4849. #ifdef WOLFSSL_KEIL
  4850. "adcs r3, r3, %[r]\n\t"
  4851. #elif defined(__clang__)
  4852. "adcs r3, %[r]\n\t"
  4853. #else
  4854. "adc r3, %[r]\n\t"
  4855. #endif
  4856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4857. "lsrs r6, %[a], #16\n\t"
  4858. #else
  4859. "lsr r6, %[a], #16\n\t"
  4860. #endif
  4861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4862. "lsrs r7, %[b], #16\n\t"
  4863. #else
  4864. "lsr r7, %[b], #16\n\t"
  4865. #endif
  4866. #ifdef WOLFSSL_KEIL
  4867. "muls r7, r6, r7\n\t"
  4868. #elif defined(__clang__)
  4869. "muls r7, r6\n\t"
  4870. #else
  4871. "mul r7, r6\n\t"
  4872. #endif
  4873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4874. "adds r5, r5, r7\n\t"
  4875. #else
  4876. "add r5, r5, r7\n\t"
  4877. #endif
  4878. #ifdef WOLFSSL_KEIL
  4879. "adcs r3, r3, %[r]\n\t"
  4880. #elif defined(__clang__)
  4881. "adcs r3, %[r]\n\t"
  4882. #else
  4883. "adc r3, %[r]\n\t"
  4884. #endif
  4885. "uxth r7, %[b]\n\t"
  4886. #ifdef WOLFSSL_KEIL
  4887. "muls r6, r7, r6\n\t"
  4888. #elif defined(__clang__)
  4889. "muls r6, r7\n\t"
  4890. #else
  4891. "mul r6, r7\n\t"
  4892. #endif
  4893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4894. "lsrs r7, r6, #16\n\t"
  4895. #else
  4896. "lsr r7, r6, #16\n\t"
  4897. #endif
  4898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4899. "lsls r6, r6, #16\n\t"
  4900. #else
  4901. "lsl r6, r6, #16\n\t"
  4902. #endif
  4903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4904. "adds r4, r4, r6\n\t"
  4905. #else
  4906. "add r4, r4, r6\n\t"
  4907. #endif
  4908. #ifdef WOLFSSL_KEIL
  4909. "adcs r5, r5, r7\n\t"
  4910. #elif defined(__clang__)
  4911. "adcs r5, r7\n\t"
  4912. #else
  4913. "adc r5, r7\n\t"
  4914. #endif
  4915. #ifdef WOLFSSL_KEIL
  4916. "adcs r3, r3, %[r]\n\t"
  4917. #elif defined(__clang__)
  4918. "adcs r3, %[r]\n\t"
  4919. #else
  4920. "adc r3, %[r]\n\t"
  4921. #endif
  4922. "# A[4] * B[3]\n\t"
  4923. "mov %[a], r9\n\t"
  4924. "mov %[b], r10\n\t"
  4925. "ldr %[a], [%[a], #16]\n\t"
  4926. "ldr %[b], [%[b], #12]\n\t"
  4927. "uxth r6, %[a]\n\t"
  4928. "uxth r7, %[b]\n\t"
  4929. #ifdef WOLFSSL_KEIL
  4930. "muls r7, r6, r7\n\t"
  4931. #elif defined(__clang__)
  4932. "muls r7, r6\n\t"
  4933. #else
  4934. "mul r7, r6\n\t"
  4935. #endif
  4936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4937. "adds r4, r4, r7\n\t"
  4938. #else
  4939. "add r4, r4, r7\n\t"
  4940. #endif
  4941. #ifdef WOLFSSL_KEIL
  4942. "adcs r5, r5, %[r]\n\t"
  4943. #elif defined(__clang__)
  4944. "adcs r5, %[r]\n\t"
  4945. #else
  4946. "adc r5, %[r]\n\t"
  4947. #endif
  4948. #ifdef WOLFSSL_KEIL
  4949. "adcs r3, r3, %[r]\n\t"
  4950. #elif defined(__clang__)
  4951. "adcs r3, %[r]\n\t"
  4952. #else
  4953. "adc r3, %[r]\n\t"
  4954. #endif
  4955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4956. "lsrs r7, %[b], #16\n\t"
  4957. #else
  4958. "lsr r7, %[b], #16\n\t"
  4959. #endif
  4960. #ifdef WOLFSSL_KEIL
  4961. "muls r6, r7, r6\n\t"
  4962. #elif defined(__clang__)
  4963. "muls r6, r7\n\t"
  4964. #else
  4965. "mul r6, r7\n\t"
  4966. #endif
  4967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4968. "lsrs r7, r6, #16\n\t"
  4969. #else
  4970. "lsr r7, r6, #16\n\t"
  4971. #endif
  4972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4973. "lsls r6, r6, #16\n\t"
  4974. #else
  4975. "lsl r6, r6, #16\n\t"
  4976. #endif
  4977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4978. "adds r4, r4, r6\n\t"
  4979. #else
  4980. "add r4, r4, r6\n\t"
  4981. #endif
  4982. #ifdef WOLFSSL_KEIL
  4983. "adcs r5, r5, r7\n\t"
  4984. #elif defined(__clang__)
  4985. "adcs r5, r7\n\t"
  4986. #else
  4987. "adc r5, r7\n\t"
  4988. #endif
  4989. #ifdef WOLFSSL_KEIL
  4990. "adcs r3, r3, %[r]\n\t"
  4991. #elif defined(__clang__)
  4992. "adcs r3, %[r]\n\t"
  4993. #else
  4994. "adc r3, %[r]\n\t"
  4995. #endif
  4996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4997. "lsrs r6, %[a], #16\n\t"
  4998. #else
  4999. "lsr r6, %[a], #16\n\t"
  5000. #endif
  5001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5002. "lsrs r7, %[b], #16\n\t"
  5003. #else
  5004. "lsr r7, %[b], #16\n\t"
  5005. #endif
  5006. #ifdef WOLFSSL_KEIL
  5007. "muls r7, r6, r7\n\t"
  5008. #elif defined(__clang__)
  5009. "muls r7, r6\n\t"
  5010. #else
  5011. "mul r7, r6\n\t"
  5012. #endif
  5013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5014. "adds r5, r5, r7\n\t"
  5015. #else
  5016. "add r5, r5, r7\n\t"
  5017. #endif
  5018. #ifdef WOLFSSL_KEIL
  5019. "adcs r3, r3, %[r]\n\t"
  5020. #elif defined(__clang__)
  5021. "adcs r3, %[r]\n\t"
  5022. #else
  5023. "adc r3, %[r]\n\t"
  5024. #endif
  5025. "uxth r7, %[b]\n\t"
  5026. #ifdef WOLFSSL_KEIL
  5027. "muls r6, r7, r6\n\t"
  5028. #elif defined(__clang__)
  5029. "muls r6, r7\n\t"
  5030. #else
  5031. "mul r6, r7\n\t"
  5032. #endif
  5033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5034. "lsrs r7, r6, #16\n\t"
  5035. #else
  5036. "lsr r7, r6, #16\n\t"
  5037. #endif
  5038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5039. "lsls r6, r6, #16\n\t"
  5040. #else
  5041. "lsl r6, r6, #16\n\t"
  5042. #endif
  5043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5044. "adds r4, r4, r6\n\t"
  5045. #else
  5046. "add r4, r4, r6\n\t"
  5047. #endif
  5048. #ifdef WOLFSSL_KEIL
  5049. "adcs r5, r5, r7\n\t"
  5050. #elif defined(__clang__)
  5051. "adcs r5, r7\n\t"
  5052. #else
  5053. "adc r5, r7\n\t"
  5054. #endif
  5055. #ifdef WOLFSSL_KEIL
  5056. "adcs r3, r3, %[r]\n\t"
  5057. #elif defined(__clang__)
  5058. "adcs r3, %[r]\n\t"
  5059. #else
  5060. "adc r3, %[r]\n\t"
  5061. #endif
  5062. "# A[5] * B[2]\n\t"
  5063. "mov %[a], r9\n\t"
  5064. "mov %[b], r10\n\t"
  5065. "ldr %[a], [%[a], #20]\n\t"
  5066. "ldr %[b], [%[b], #8]\n\t"
  5067. "uxth r6, %[a]\n\t"
  5068. "uxth r7, %[b]\n\t"
  5069. #ifdef WOLFSSL_KEIL
  5070. "muls r7, r6, r7\n\t"
  5071. #elif defined(__clang__)
  5072. "muls r7, r6\n\t"
  5073. #else
  5074. "mul r7, r6\n\t"
  5075. #endif
  5076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5077. "adds r4, r4, r7\n\t"
  5078. #else
  5079. "add r4, r4, r7\n\t"
  5080. #endif
  5081. #ifdef WOLFSSL_KEIL
  5082. "adcs r5, r5, %[r]\n\t"
  5083. #elif defined(__clang__)
  5084. "adcs r5, %[r]\n\t"
  5085. #else
  5086. "adc r5, %[r]\n\t"
  5087. #endif
  5088. #ifdef WOLFSSL_KEIL
  5089. "adcs r3, r3, %[r]\n\t"
  5090. #elif defined(__clang__)
  5091. "adcs r3, %[r]\n\t"
  5092. #else
  5093. "adc r3, %[r]\n\t"
  5094. #endif
  5095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5096. "lsrs r7, %[b], #16\n\t"
  5097. #else
  5098. "lsr r7, %[b], #16\n\t"
  5099. #endif
  5100. #ifdef WOLFSSL_KEIL
  5101. "muls r6, r7, r6\n\t"
  5102. #elif defined(__clang__)
  5103. "muls r6, r7\n\t"
  5104. #else
  5105. "mul r6, r7\n\t"
  5106. #endif
  5107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5108. "lsrs r7, r6, #16\n\t"
  5109. #else
  5110. "lsr r7, r6, #16\n\t"
  5111. #endif
  5112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5113. "lsls r6, r6, #16\n\t"
  5114. #else
  5115. "lsl r6, r6, #16\n\t"
  5116. #endif
  5117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5118. "adds r4, r4, r6\n\t"
  5119. #else
  5120. "add r4, r4, r6\n\t"
  5121. #endif
  5122. #ifdef WOLFSSL_KEIL
  5123. "adcs r5, r5, r7\n\t"
  5124. #elif defined(__clang__)
  5125. "adcs r5, r7\n\t"
  5126. #else
  5127. "adc r5, r7\n\t"
  5128. #endif
  5129. #ifdef WOLFSSL_KEIL
  5130. "adcs r3, r3, %[r]\n\t"
  5131. #elif defined(__clang__)
  5132. "adcs r3, %[r]\n\t"
  5133. #else
  5134. "adc r3, %[r]\n\t"
  5135. #endif
  5136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5137. "lsrs r6, %[a], #16\n\t"
  5138. #else
  5139. "lsr r6, %[a], #16\n\t"
  5140. #endif
  5141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5142. "lsrs r7, %[b], #16\n\t"
  5143. #else
  5144. "lsr r7, %[b], #16\n\t"
  5145. #endif
  5146. #ifdef WOLFSSL_KEIL
  5147. "muls r7, r6, r7\n\t"
  5148. #elif defined(__clang__)
  5149. "muls r7, r6\n\t"
  5150. #else
  5151. "mul r7, r6\n\t"
  5152. #endif
  5153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5154. "adds r5, r5, r7\n\t"
  5155. #else
  5156. "add r5, r5, r7\n\t"
  5157. #endif
  5158. #ifdef WOLFSSL_KEIL
  5159. "adcs r3, r3, %[r]\n\t"
  5160. #elif defined(__clang__)
  5161. "adcs r3, %[r]\n\t"
  5162. #else
  5163. "adc r3, %[r]\n\t"
  5164. #endif
  5165. "uxth r7, %[b]\n\t"
  5166. #ifdef WOLFSSL_KEIL
  5167. "muls r6, r7, r6\n\t"
  5168. #elif defined(__clang__)
  5169. "muls r6, r7\n\t"
  5170. #else
  5171. "mul r6, r7\n\t"
  5172. #endif
  5173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5174. "lsrs r7, r6, #16\n\t"
  5175. #else
  5176. "lsr r7, r6, #16\n\t"
  5177. #endif
  5178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5179. "lsls r6, r6, #16\n\t"
  5180. #else
  5181. "lsl r6, r6, #16\n\t"
  5182. #endif
  5183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5184. "adds r4, r4, r6\n\t"
  5185. #else
  5186. "add r4, r4, r6\n\t"
  5187. #endif
  5188. #ifdef WOLFSSL_KEIL
  5189. "adcs r5, r5, r7\n\t"
  5190. #elif defined(__clang__)
  5191. "adcs r5, r7\n\t"
  5192. #else
  5193. "adc r5, r7\n\t"
  5194. #endif
  5195. #ifdef WOLFSSL_KEIL
  5196. "adcs r3, r3, %[r]\n\t"
  5197. #elif defined(__clang__)
  5198. "adcs r3, %[r]\n\t"
  5199. #else
  5200. "adc r3, %[r]\n\t"
  5201. #endif
  5202. "# A[6] * B[1]\n\t"
  5203. "mov %[a], r9\n\t"
  5204. "mov %[b], r10\n\t"
  5205. "ldr %[a], [%[a], #24]\n\t"
  5206. "ldr %[b], [%[b], #4]\n\t"
  5207. "uxth r6, %[a]\n\t"
  5208. "uxth r7, %[b]\n\t"
  5209. #ifdef WOLFSSL_KEIL
  5210. "muls r7, r6, r7\n\t"
  5211. #elif defined(__clang__)
  5212. "muls r7, r6\n\t"
  5213. #else
  5214. "mul r7, r6\n\t"
  5215. #endif
  5216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5217. "adds r4, r4, r7\n\t"
  5218. #else
  5219. "add r4, r4, r7\n\t"
  5220. #endif
  5221. #ifdef WOLFSSL_KEIL
  5222. "adcs r5, r5, %[r]\n\t"
  5223. #elif defined(__clang__)
  5224. "adcs r5, %[r]\n\t"
  5225. #else
  5226. "adc r5, %[r]\n\t"
  5227. #endif
  5228. #ifdef WOLFSSL_KEIL
  5229. "adcs r3, r3, %[r]\n\t"
  5230. #elif defined(__clang__)
  5231. "adcs r3, %[r]\n\t"
  5232. #else
  5233. "adc r3, %[r]\n\t"
  5234. #endif
  5235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5236. "lsrs r7, %[b], #16\n\t"
  5237. #else
  5238. "lsr r7, %[b], #16\n\t"
  5239. #endif
  5240. #ifdef WOLFSSL_KEIL
  5241. "muls r6, r7, r6\n\t"
  5242. #elif defined(__clang__)
  5243. "muls r6, r7\n\t"
  5244. #else
  5245. "mul r6, r7\n\t"
  5246. #endif
  5247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5248. "lsrs r7, r6, #16\n\t"
  5249. #else
  5250. "lsr r7, r6, #16\n\t"
  5251. #endif
  5252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5253. "lsls r6, r6, #16\n\t"
  5254. #else
  5255. "lsl r6, r6, #16\n\t"
  5256. #endif
  5257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5258. "adds r4, r4, r6\n\t"
  5259. #else
  5260. "add r4, r4, r6\n\t"
  5261. #endif
  5262. #ifdef WOLFSSL_KEIL
  5263. "adcs r5, r5, r7\n\t"
  5264. #elif defined(__clang__)
  5265. "adcs r5, r7\n\t"
  5266. #else
  5267. "adc r5, r7\n\t"
  5268. #endif
  5269. #ifdef WOLFSSL_KEIL
  5270. "adcs r3, r3, %[r]\n\t"
  5271. #elif defined(__clang__)
  5272. "adcs r3, %[r]\n\t"
  5273. #else
  5274. "adc r3, %[r]\n\t"
  5275. #endif
  5276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5277. "lsrs r6, %[a], #16\n\t"
  5278. #else
  5279. "lsr r6, %[a], #16\n\t"
  5280. #endif
  5281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5282. "lsrs r7, %[b], #16\n\t"
  5283. #else
  5284. "lsr r7, %[b], #16\n\t"
  5285. #endif
  5286. #ifdef WOLFSSL_KEIL
  5287. "muls r7, r6, r7\n\t"
  5288. #elif defined(__clang__)
  5289. "muls r7, r6\n\t"
  5290. #else
  5291. "mul r7, r6\n\t"
  5292. #endif
  5293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5294. "adds r5, r5, r7\n\t"
  5295. #else
  5296. "add r5, r5, r7\n\t"
  5297. #endif
  5298. #ifdef WOLFSSL_KEIL
  5299. "adcs r3, r3, %[r]\n\t"
  5300. #elif defined(__clang__)
  5301. "adcs r3, %[r]\n\t"
  5302. #else
  5303. "adc r3, %[r]\n\t"
  5304. #endif
  5305. "uxth r7, %[b]\n\t"
  5306. #ifdef WOLFSSL_KEIL
  5307. "muls r6, r7, r6\n\t"
  5308. #elif defined(__clang__)
  5309. "muls r6, r7\n\t"
  5310. #else
  5311. "mul r6, r7\n\t"
  5312. #endif
  5313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5314. "lsrs r7, r6, #16\n\t"
  5315. #else
  5316. "lsr r7, r6, #16\n\t"
  5317. #endif
  5318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5319. "lsls r6, r6, #16\n\t"
  5320. #else
  5321. "lsl r6, r6, #16\n\t"
  5322. #endif
  5323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5324. "adds r4, r4, r6\n\t"
  5325. #else
  5326. "add r4, r4, r6\n\t"
  5327. #endif
  5328. #ifdef WOLFSSL_KEIL
  5329. "adcs r5, r5, r7\n\t"
  5330. #elif defined(__clang__)
  5331. "adcs r5, r7\n\t"
  5332. #else
  5333. "adc r5, r7\n\t"
  5334. #endif
  5335. #ifdef WOLFSSL_KEIL
  5336. "adcs r3, r3, %[r]\n\t"
  5337. #elif defined(__clang__)
  5338. "adcs r3, %[r]\n\t"
  5339. #else
  5340. "adc r3, %[r]\n\t"
  5341. #endif
  5342. "# A[7] * B[0]\n\t"
  5343. "mov %[a], r9\n\t"
  5344. "mov %[b], r10\n\t"
  5345. "ldr %[a], [%[a], #28]\n\t"
  5346. "ldr %[b], [%[b]]\n\t"
  5347. "uxth r6, %[a]\n\t"
  5348. "uxth r7, %[b]\n\t"
  5349. #ifdef WOLFSSL_KEIL
  5350. "muls r7, r6, r7\n\t"
  5351. #elif defined(__clang__)
  5352. "muls r7, r6\n\t"
  5353. #else
  5354. "mul r7, r6\n\t"
  5355. #endif
  5356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5357. "adds r4, r4, r7\n\t"
  5358. #else
  5359. "add r4, r4, r7\n\t"
  5360. #endif
  5361. #ifdef WOLFSSL_KEIL
  5362. "adcs r5, r5, %[r]\n\t"
  5363. #elif defined(__clang__)
  5364. "adcs r5, %[r]\n\t"
  5365. #else
  5366. "adc r5, %[r]\n\t"
  5367. #endif
  5368. #ifdef WOLFSSL_KEIL
  5369. "adcs r3, r3, %[r]\n\t"
  5370. #elif defined(__clang__)
  5371. "adcs r3, %[r]\n\t"
  5372. #else
  5373. "adc r3, %[r]\n\t"
  5374. #endif
  5375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5376. "lsrs r7, %[b], #16\n\t"
  5377. #else
  5378. "lsr r7, %[b], #16\n\t"
  5379. #endif
  5380. #ifdef WOLFSSL_KEIL
  5381. "muls r6, r7, r6\n\t"
  5382. #elif defined(__clang__)
  5383. "muls r6, r7\n\t"
  5384. #else
  5385. "mul r6, r7\n\t"
  5386. #endif
  5387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5388. "lsrs r7, r6, #16\n\t"
  5389. #else
  5390. "lsr r7, r6, #16\n\t"
  5391. #endif
  5392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5393. "lsls r6, r6, #16\n\t"
  5394. #else
  5395. "lsl r6, r6, #16\n\t"
  5396. #endif
  5397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5398. "adds r4, r4, r6\n\t"
  5399. #else
  5400. "add r4, r4, r6\n\t"
  5401. #endif
  5402. #ifdef WOLFSSL_KEIL
  5403. "adcs r5, r5, r7\n\t"
  5404. #elif defined(__clang__)
  5405. "adcs r5, r7\n\t"
  5406. #else
  5407. "adc r5, r7\n\t"
  5408. #endif
  5409. #ifdef WOLFSSL_KEIL
  5410. "adcs r3, r3, %[r]\n\t"
  5411. #elif defined(__clang__)
  5412. "adcs r3, %[r]\n\t"
  5413. #else
  5414. "adc r3, %[r]\n\t"
  5415. #endif
  5416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5417. "lsrs r6, %[a], #16\n\t"
  5418. #else
  5419. "lsr r6, %[a], #16\n\t"
  5420. #endif
  5421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5422. "lsrs r7, %[b], #16\n\t"
  5423. #else
  5424. "lsr r7, %[b], #16\n\t"
  5425. #endif
  5426. #ifdef WOLFSSL_KEIL
  5427. "muls r7, r6, r7\n\t"
  5428. #elif defined(__clang__)
  5429. "muls r7, r6\n\t"
  5430. #else
  5431. "mul r7, r6\n\t"
  5432. #endif
  5433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5434. "adds r5, r5, r7\n\t"
  5435. #else
  5436. "add r5, r5, r7\n\t"
  5437. #endif
  5438. #ifdef WOLFSSL_KEIL
  5439. "adcs r3, r3, %[r]\n\t"
  5440. #elif defined(__clang__)
  5441. "adcs r3, %[r]\n\t"
  5442. #else
  5443. "adc r3, %[r]\n\t"
  5444. #endif
  5445. "uxth r7, %[b]\n\t"
  5446. #ifdef WOLFSSL_KEIL
  5447. "muls r6, r7, r6\n\t"
  5448. #elif defined(__clang__)
  5449. "muls r6, r7\n\t"
  5450. #else
  5451. "mul r6, r7\n\t"
  5452. #endif
  5453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5454. "lsrs r7, r6, #16\n\t"
  5455. #else
  5456. "lsr r7, r6, #16\n\t"
  5457. #endif
  5458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5459. "lsls r6, r6, #16\n\t"
  5460. #else
  5461. "lsl r6, r6, #16\n\t"
  5462. #endif
  5463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5464. "adds r4, r4, r6\n\t"
  5465. #else
  5466. "add r4, r4, r6\n\t"
  5467. #endif
  5468. #ifdef WOLFSSL_KEIL
  5469. "adcs r5, r5, r7\n\t"
  5470. #elif defined(__clang__)
  5471. "adcs r5, r7\n\t"
  5472. #else
  5473. "adc r5, r7\n\t"
  5474. #endif
  5475. #ifdef WOLFSSL_KEIL
  5476. "adcs r3, r3, %[r]\n\t"
  5477. #elif defined(__clang__)
  5478. "adcs r3, %[r]\n\t"
  5479. #else
  5480. "adc r3, %[r]\n\t"
  5481. #endif
  5482. "str r4, [sp, #28]\n\t"
  5483. "# A[7] * B[1]\n\t"
  5484. "movs r4, #0\n\t"
  5485. "mov %[a], r9\n\t"
  5486. "mov %[b], r10\n\t"
  5487. "ldr %[a], [%[a], #28]\n\t"
  5488. "ldr %[b], [%[b], #4]\n\t"
  5489. "uxth r6, %[a]\n\t"
  5490. "uxth r7, %[b]\n\t"
  5491. #ifdef WOLFSSL_KEIL
  5492. "muls r7, r6, r7\n\t"
  5493. #elif defined(__clang__)
  5494. "muls r7, r6\n\t"
  5495. #else
  5496. "mul r7, r6\n\t"
  5497. #endif
  5498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5499. "adds r5, r5, r7\n\t"
  5500. #else
  5501. "add r5, r5, r7\n\t"
  5502. #endif
  5503. #ifdef WOLFSSL_KEIL
  5504. "adcs r3, r3, %[r]\n\t"
  5505. #elif defined(__clang__)
  5506. "adcs r3, %[r]\n\t"
  5507. #else
  5508. "adc r3, %[r]\n\t"
  5509. #endif
  5510. #ifdef WOLFSSL_KEIL
  5511. "adcs r4, r4, %[r]\n\t"
  5512. #elif defined(__clang__)
  5513. "adcs r4, %[r]\n\t"
  5514. #else
  5515. "adc r4, %[r]\n\t"
  5516. #endif
  5517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5518. "lsrs r7, %[b], #16\n\t"
  5519. #else
  5520. "lsr r7, %[b], #16\n\t"
  5521. #endif
  5522. #ifdef WOLFSSL_KEIL
  5523. "muls r6, r7, r6\n\t"
  5524. #elif defined(__clang__)
  5525. "muls r6, r7\n\t"
  5526. #else
  5527. "mul r6, r7\n\t"
  5528. #endif
  5529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5530. "lsrs r7, r6, #16\n\t"
  5531. #else
  5532. "lsr r7, r6, #16\n\t"
  5533. #endif
  5534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5535. "lsls r6, r6, #16\n\t"
  5536. #else
  5537. "lsl r6, r6, #16\n\t"
  5538. #endif
  5539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5540. "adds r5, r5, r6\n\t"
  5541. #else
  5542. "add r5, r5, r6\n\t"
  5543. #endif
  5544. #ifdef WOLFSSL_KEIL
  5545. "adcs r3, r3, r7\n\t"
  5546. #elif defined(__clang__)
  5547. "adcs r3, r7\n\t"
  5548. #else
  5549. "adc r3, r7\n\t"
  5550. #endif
  5551. #ifdef WOLFSSL_KEIL
  5552. "adcs r4, r4, %[r]\n\t"
  5553. #elif defined(__clang__)
  5554. "adcs r4, %[r]\n\t"
  5555. #else
  5556. "adc r4, %[r]\n\t"
  5557. #endif
  5558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5559. "lsrs r6, %[a], #16\n\t"
  5560. #else
  5561. "lsr r6, %[a], #16\n\t"
  5562. #endif
  5563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5564. "lsrs r7, %[b], #16\n\t"
  5565. #else
  5566. "lsr r7, %[b], #16\n\t"
  5567. #endif
  5568. #ifdef WOLFSSL_KEIL
  5569. "muls r7, r6, r7\n\t"
  5570. #elif defined(__clang__)
  5571. "muls r7, r6\n\t"
  5572. #else
  5573. "mul r7, r6\n\t"
  5574. #endif
  5575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5576. "adds r3, r3, r7\n\t"
  5577. #else
  5578. "add r3, r3, r7\n\t"
  5579. #endif
  5580. #ifdef WOLFSSL_KEIL
  5581. "adcs r4, r4, %[r]\n\t"
  5582. #elif defined(__clang__)
  5583. "adcs r4, %[r]\n\t"
  5584. #else
  5585. "adc r4, %[r]\n\t"
  5586. #endif
  5587. "uxth r7, %[b]\n\t"
  5588. #ifdef WOLFSSL_KEIL
  5589. "muls r6, r7, r6\n\t"
  5590. #elif defined(__clang__)
  5591. "muls r6, r7\n\t"
  5592. #else
  5593. "mul r6, r7\n\t"
  5594. #endif
  5595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5596. "lsrs r7, r6, #16\n\t"
  5597. #else
  5598. "lsr r7, r6, #16\n\t"
  5599. #endif
  5600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5601. "lsls r6, r6, #16\n\t"
  5602. #else
  5603. "lsl r6, r6, #16\n\t"
  5604. #endif
  5605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5606. "adds r5, r5, r6\n\t"
  5607. #else
  5608. "add r5, r5, r6\n\t"
  5609. #endif
  5610. #ifdef WOLFSSL_KEIL
  5611. "adcs r3, r3, r7\n\t"
  5612. #elif defined(__clang__)
  5613. "adcs r3, r7\n\t"
  5614. #else
  5615. "adc r3, r7\n\t"
  5616. #endif
  5617. #ifdef WOLFSSL_KEIL
  5618. "adcs r4, r4, %[r]\n\t"
  5619. #elif defined(__clang__)
  5620. "adcs r4, %[r]\n\t"
  5621. #else
  5622. "adc r4, %[r]\n\t"
  5623. #endif
  5624. "# A[6] * B[2]\n\t"
  5625. "mov %[a], r9\n\t"
  5626. "mov %[b], r10\n\t"
  5627. "ldr %[a], [%[a], #24]\n\t"
  5628. "ldr %[b], [%[b], #8]\n\t"
  5629. "uxth r6, %[a]\n\t"
  5630. "uxth r7, %[b]\n\t"
  5631. #ifdef WOLFSSL_KEIL
  5632. "muls r7, r6, r7\n\t"
  5633. #elif defined(__clang__)
  5634. "muls r7, r6\n\t"
  5635. #else
  5636. "mul r7, r6\n\t"
  5637. #endif
  5638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5639. "adds r5, r5, r7\n\t"
  5640. #else
  5641. "add r5, r5, r7\n\t"
  5642. #endif
  5643. #ifdef WOLFSSL_KEIL
  5644. "adcs r3, r3, %[r]\n\t"
  5645. #elif defined(__clang__)
  5646. "adcs r3, %[r]\n\t"
  5647. #else
  5648. "adc r3, %[r]\n\t"
  5649. #endif
  5650. #ifdef WOLFSSL_KEIL
  5651. "adcs r4, r4, %[r]\n\t"
  5652. #elif defined(__clang__)
  5653. "adcs r4, %[r]\n\t"
  5654. #else
  5655. "adc r4, %[r]\n\t"
  5656. #endif
  5657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5658. "lsrs r7, %[b], #16\n\t"
  5659. #else
  5660. "lsr r7, %[b], #16\n\t"
  5661. #endif
  5662. #ifdef WOLFSSL_KEIL
  5663. "muls r6, r7, r6\n\t"
  5664. #elif defined(__clang__)
  5665. "muls r6, r7\n\t"
  5666. #else
  5667. "mul r6, r7\n\t"
  5668. #endif
  5669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5670. "lsrs r7, r6, #16\n\t"
  5671. #else
  5672. "lsr r7, r6, #16\n\t"
  5673. #endif
  5674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5675. "lsls r6, r6, #16\n\t"
  5676. #else
  5677. "lsl r6, r6, #16\n\t"
  5678. #endif
  5679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5680. "adds r5, r5, r6\n\t"
  5681. #else
  5682. "add r5, r5, r6\n\t"
  5683. #endif
  5684. #ifdef WOLFSSL_KEIL
  5685. "adcs r3, r3, r7\n\t"
  5686. #elif defined(__clang__)
  5687. "adcs r3, r7\n\t"
  5688. #else
  5689. "adc r3, r7\n\t"
  5690. #endif
  5691. #ifdef WOLFSSL_KEIL
  5692. "adcs r4, r4, %[r]\n\t"
  5693. #elif defined(__clang__)
  5694. "adcs r4, %[r]\n\t"
  5695. #else
  5696. "adc r4, %[r]\n\t"
  5697. #endif
  5698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5699. "lsrs r6, %[a], #16\n\t"
  5700. #else
  5701. "lsr r6, %[a], #16\n\t"
  5702. #endif
  5703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5704. "lsrs r7, %[b], #16\n\t"
  5705. #else
  5706. "lsr r7, %[b], #16\n\t"
  5707. #endif
  5708. #ifdef WOLFSSL_KEIL
  5709. "muls r7, r6, r7\n\t"
  5710. #elif defined(__clang__)
  5711. "muls r7, r6\n\t"
  5712. #else
  5713. "mul r7, r6\n\t"
  5714. #endif
  5715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5716. "adds r3, r3, r7\n\t"
  5717. #else
  5718. "add r3, r3, r7\n\t"
  5719. #endif
  5720. #ifdef WOLFSSL_KEIL
  5721. "adcs r4, r4, %[r]\n\t"
  5722. #elif defined(__clang__)
  5723. "adcs r4, %[r]\n\t"
  5724. #else
  5725. "adc r4, %[r]\n\t"
  5726. #endif
  5727. "uxth r7, %[b]\n\t"
  5728. #ifdef WOLFSSL_KEIL
  5729. "muls r6, r7, r6\n\t"
  5730. #elif defined(__clang__)
  5731. "muls r6, r7\n\t"
  5732. #else
  5733. "mul r6, r7\n\t"
  5734. #endif
  5735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5736. "lsrs r7, r6, #16\n\t"
  5737. #else
  5738. "lsr r7, r6, #16\n\t"
  5739. #endif
  5740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5741. "lsls r6, r6, #16\n\t"
  5742. #else
  5743. "lsl r6, r6, #16\n\t"
  5744. #endif
  5745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5746. "adds r5, r5, r6\n\t"
  5747. #else
  5748. "add r5, r5, r6\n\t"
  5749. #endif
  5750. #ifdef WOLFSSL_KEIL
  5751. "adcs r3, r3, r7\n\t"
  5752. #elif defined(__clang__)
  5753. "adcs r3, r7\n\t"
  5754. #else
  5755. "adc r3, r7\n\t"
  5756. #endif
  5757. #ifdef WOLFSSL_KEIL
  5758. "adcs r4, r4, %[r]\n\t"
  5759. #elif defined(__clang__)
  5760. "adcs r4, %[r]\n\t"
  5761. #else
  5762. "adc r4, %[r]\n\t"
  5763. #endif
  5764. "# A[5] * B[3]\n\t"
  5765. "mov %[a], r9\n\t"
  5766. "mov %[b], r10\n\t"
  5767. "ldr %[a], [%[a], #20]\n\t"
  5768. "ldr %[b], [%[b], #12]\n\t"
  5769. "uxth r6, %[a]\n\t"
  5770. "uxth r7, %[b]\n\t"
  5771. #ifdef WOLFSSL_KEIL
  5772. "muls r7, r6, r7\n\t"
  5773. #elif defined(__clang__)
  5774. "muls r7, r6\n\t"
  5775. #else
  5776. "mul r7, r6\n\t"
  5777. #endif
  5778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5779. "adds r5, r5, r7\n\t"
  5780. #else
  5781. "add r5, r5, r7\n\t"
  5782. #endif
  5783. #ifdef WOLFSSL_KEIL
  5784. "adcs r3, r3, %[r]\n\t"
  5785. #elif defined(__clang__)
  5786. "adcs r3, %[r]\n\t"
  5787. #else
  5788. "adc r3, %[r]\n\t"
  5789. #endif
  5790. #ifdef WOLFSSL_KEIL
  5791. "adcs r4, r4, %[r]\n\t"
  5792. #elif defined(__clang__)
  5793. "adcs r4, %[r]\n\t"
  5794. #else
  5795. "adc r4, %[r]\n\t"
  5796. #endif
  5797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5798. "lsrs r7, %[b], #16\n\t"
  5799. #else
  5800. "lsr r7, %[b], #16\n\t"
  5801. #endif
  5802. #ifdef WOLFSSL_KEIL
  5803. "muls r6, r7, r6\n\t"
  5804. #elif defined(__clang__)
  5805. "muls r6, r7\n\t"
  5806. #else
  5807. "mul r6, r7\n\t"
  5808. #endif
  5809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5810. "lsrs r7, r6, #16\n\t"
  5811. #else
  5812. "lsr r7, r6, #16\n\t"
  5813. #endif
  5814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5815. "lsls r6, r6, #16\n\t"
  5816. #else
  5817. "lsl r6, r6, #16\n\t"
  5818. #endif
  5819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5820. "adds r5, r5, r6\n\t"
  5821. #else
  5822. "add r5, r5, r6\n\t"
  5823. #endif
  5824. #ifdef WOLFSSL_KEIL
  5825. "adcs r3, r3, r7\n\t"
  5826. #elif defined(__clang__)
  5827. "adcs r3, r7\n\t"
  5828. #else
  5829. "adc r3, r7\n\t"
  5830. #endif
  5831. #ifdef WOLFSSL_KEIL
  5832. "adcs r4, r4, %[r]\n\t"
  5833. #elif defined(__clang__)
  5834. "adcs r4, %[r]\n\t"
  5835. #else
  5836. "adc r4, %[r]\n\t"
  5837. #endif
  5838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5839. "lsrs r6, %[a], #16\n\t"
  5840. #else
  5841. "lsr r6, %[a], #16\n\t"
  5842. #endif
  5843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5844. "lsrs r7, %[b], #16\n\t"
  5845. #else
  5846. "lsr r7, %[b], #16\n\t"
  5847. #endif
  5848. #ifdef WOLFSSL_KEIL
  5849. "muls r7, r6, r7\n\t"
  5850. #elif defined(__clang__)
  5851. "muls r7, r6\n\t"
  5852. #else
  5853. "mul r7, r6\n\t"
  5854. #endif
  5855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5856. "adds r3, r3, r7\n\t"
  5857. #else
  5858. "add r3, r3, r7\n\t"
  5859. #endif
  5860. #ifdef WOLFSSL_KEIL
  5861. "adcs r4, r4, %[r]\n\t"
  5862. #elif defined(__clang__)
  5863. "adcs r4, %[r]\n\t"
  5864. #else
  5865. "adc r4, %[r]\n\t"
  5866. #endif
  5867. "uxth r7, %[b]\n\t"
  5868. #ifdef WOLFSSL_KEIL
  5869. "muls r6, r7, r6\n\t"
  5870. #elif defined(__clang__)
  5871. "muls r6, r7\n\t"
  5872. #else
  5873. "mul r6, r7\n\t"
  5874. #endif
  5875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5876. "lsrs r7, r6, #16\n\t"
  5877. #else
  5878. "lsr r7, r6, #16\n\t"
  5879. #endif
  5880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5881. "lsls r6, r6, #16\n\t"
  5882. #else
  5883. "lsl r6, r6, #16\n\t"
  5884. #endif
  5885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5886. "adds r5, r5, r6\n\t"
  5887. #else
  5888. "add r5, r5, r6\n\t"
  5889. #endif
  5890. #ifdef WOLFSSL_KEIL
  5891. "adcs r3, r3, r7\n\t"
  5892. #elif defined(__clang__)
  5893. "adcs r3, r7\n\t"
  5894. #else
  5895. "adc r3, r7\n\t"
  5896. #endif
  5897. #ifdef WOLFSSL_KEIL
  5898. "adcs r4, r4, %[r]\n\t"
  5899. #elif defined(__clang__)
  5900. "adcs r4, %[r]\n\t"
  5901. #else
  5902. "adc r4, %[r]\n\t"
  5903. #endif
  5904. "# A[4] * B[4]\n\t"
  5905. "mov %[a], r9\n\t"
  5906. "mov %[b], r10\n\t"
  5907. "ldr %[a], [%[a], #16]\n\t"
  5908. "ldr %[b], [%[b], #16]\n\t"
  5909. "uxth r6, %[a]\n\t"
  5910. "uxth r7, %[b]\n\t"
  5911. #ifdef WOLFSSL_KEIL
  5912. "muls r7, r6, r7\n\t"
  5913. #elif defined(__clang__)
  5914. "muls r7, r6\n\t"
  5915. #else
  5916. "mul r7, r6\n\t"
  5917. #endif
  5918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5919. "adds r5, r5, r7\n\t"
  5920. #else
  5921. "add r5, r5, r7\n\t"
  5922. #endif
  5923. #ifdef WOLFSSL_KEIL
  5924. "adcs r3, r3, %[r]\n\t"
  5925. #elif defined(__clang__)
  5926. "adcs r3, %[r]\n\t"
  5927. #else
  5928. "adc r3, %[r]\n\t"
  5929. #endif
  5930. #ifdef WOLFSSL_KEIL
  5931. "adcs r4, r4, %[r]\n\t"
  5932. #elif defined(__clang__)
  5933. "adcs r4, %[r]\n\t"
  5934. #else
  5935. "adc r4, %[r]\n\t"
  5936. #endif
  5937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5938. "lsrs r7, %[b], #16\n\t"
  5939. #else
  5940. "lsr r7, %[b], #16\n\t"
  5941. #endif
  5942. #ifdef WOLFSSL_KEIL
  5943. "muls r6, r7, r6\n\t"
  5944. #elif defined(__clang__)
  5945. "muls r6, r7\n\t"
  5946. #else
  5947. "mul r6, r7\n\t"
  5948. #endif
  5949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5950. "lsrs r7, r6, #16\n\t"
  5951. #else
  5952. "lsr r7, r6, #16\n\t"
  5953. #endif
  5954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5955. "lsls r6, r6, #16\n\t"
  5956. #else
  5957. "lsl r6, r6, #16\n\t"
  5958. #endif
  5959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5960. "adds r5, r5, r6\n\t"
  5961. #else
  5962. "add r5, r5, r6\n\t"
  5963. #endif
  5964. #ifdef WOLFSSL_KEIL
  5965. "adcs r3, r3, r7\n\t"
  5966. #elif defined(__clang__)
  5967. "adcs r3, r7\n\t"
  5968. #else
  5969. "adc r3, r7\n\t"
  5970. #endif
  5971. #ifdef WOLFSSL_KEIL
  5972. "adcs r4, r4, %[r]\n\t"
  5973. #elif defined(__clang__)
  5974. "adcs r4, %[r]\n\t"
  5975. #else
  5976. "adc r4, %[r]\n\t"
  5977. #endif
  5978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5979. "lsrs r6, %[a], #16\n\t"
  5980. #else
  5981. "lsr r6, %[a], #16\n\t"
  5982. #endif
  5983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5984. "lsrs r7, %[b], #16\n\t"
  5985. #else
  5986. "lsr r7, %[b], #16\n\t"
  5987. #endif
  5988. #ifdef WOLFSSL_KEIL
  5989. "muls r7, r6, r7\n\t"
  5990. #elif defined(__clang__)
  5991. "muls r7, r6\n\t"
  5992. #else
  5993. "mul r7, r6\n\t"
  5994. #endif
  5995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5996. "adds r3, r3, r7\n\t"
  5997. #else
  5998. "add r3, r3, r7\n\t"
  5999. #endif
  6000. #ifdef WOLFSSL_KEIL
  6001. "adcs r4, r4, %[r]\n\t"
  6002. #elif defined(__clang__)
  6003. "adcs r4, %[r]\n\t"
  6004. #else
  6005. "adc r4, %[r]\n\t"
  6006. #endif
  6007. "uxth r7, %[b]\n\t"
  6008. #ifdef WOLFSSL_KEIL
  6009. "muls r6, r7, r6\n\t"
  6010. #elif defined(__clang__)
  6011. "muls r6, r7\n\t"
  6012. #else
  6013. "mul r6, r7\n\t"
  6014. #endif
  6015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6016. "lsrs r7, r6, #16\n\t"
  6017. #else
  6018. "lsr r7, r6, #16\n\t"
  6019. #endif
  6020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6021. "lsls r6, r6, #16\n\t"
  6022. #else
  6023. "lsl r6, r6, #16\n\t"
  6024. #endif
  6025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6026. "adds r5, r5, r6\n\t"
  6027. #else
  6028. "add r5, r5, r6\n\t"
  6029. #endif
  6030. #ifdef WOLFSSL_KEIL
  6031. "adcs r3, r3, r7\n\t"
  6032. #elif defined(__clang__)
  6033. "adcs r3, r7\n\t"
  6034. #else
  6035. "adc r3, r7\n\t"
  6036. #endif
  6037. #ifdef WOLFSSL_KEIL
  6038. "adcs r4, r4, %[r]\n\t"
  6039. #elif defined(__clang__)
  6040. "adcs r4, %[r]\n\t"
  6041. #else
  6042. "adc r4, %[r]\n\t"
  6043. #endif
  6044. "# A[3] * B[5]\n\t"
  6045. "mov %[a], r9\n\t"
  6046. "mov %[b], r10\n\t"
  6047. "ldr %[a], [%[a], #12]\n\t"
  6048. "ldr %[b], [%[b], #20]\n\t"
  6049. "uxth r6, %[a]\n\t"
  6050. "uxth r7, %[b]\n\t"
  6051. #ifdef WOLFSSL_KEIL
  6052. "muls r7, r6, r7\n\t"
  6053. #elif defined(__clang__)
  6054. "muls r7, r6\n\t"
  6055. #else
  6056. "mul r7, r6\n\t"
  6057. #endif
  6058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6059. "adds r5, r5, r7\n\t"
  6060. #else
  6061. "add r5, r5, r7\n\t"
  6062. #endif
  6063. #ifdef WOLFSSL_KEIL
  6064. "adcs r3, r3, %[r]\n\t"
  6065. #elif defined(__clang__)
  6066. "adcs r3, %[r]\n\t"
  6067. #else
  6068. "adc r3, %[r]\n\t"
  6069. #endif
  6070. #ifdef WOLFSSL_KEIL
  6071. "adcs r4, r4, %[r]\n\t"
  6072. #elif defined(__clang__)
  6073. "adcs r4, %[r]\n\t"
  6074. #else
  6075. "adc r4, %[r]\n\t"
  6076. #endif
  6077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6078. "lsrs r7, %[b], #16\n\t"
  6079. #else
  6080. "lsr r7, %[b], #16\n\t"
  6081. #endif
  6082. #ifdef WOLFSSL_KEIL
  6083. "muls r6, r7, r6\n\t"
  6084. #elif defined(__clang__)
  6085. "muls r6, r7\n\t"
  6086. #else
  6087. "mul r6, r7\n\t"
  6088. #endif
  6089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6090. "lsrs r7, r6, #16\n\t"
  6091. #else
  6092. "lsr r7, r6, #16\n\t"
  6093. #endif
  6094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6095. "lsls r6, r6, #16\n\t"
  6096. #else
  6097. "lsl r6, r6, #16\n\t"
  6098. #endif
  6099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6100. "adds r5, r5, r6\n\t"
  6101. #else
  6102. "add r5, r5, r6\n\t"
  6103. #endif
  6104. #ifdef WOLFSSL_KEIL
  6105. "adcs r3, r3, r7\n\t"
  6106. #elif defined(__clang__)
  6107. "adcs r3, r7\n\t"
  6108. #else
  6109. "adc r3, r7\n\t"
  6110. #endif
  6111. #ifdef WOLFSSL_KEIL
  6112. "adcs r4, r4, %[r]\n\t"
  6113. #elif defined(__clang__)
  6114. "adcs r4, %[r]\n\t"
  6115. #else
  6116. "adc r4, %[r]\n\t"
  6117. #endif
  6118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6119. "lsrs r6, %[a], #16\n\t"
  6120. #else
  6121. "lsr r6, %[a], #16\n\t"
  6122. #endif
  6123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6124. "lsrs r7, %[b], #16\n\t"
  6125. #else
  6126. "lsr r7, %[b], #16\n\t"
  6127. #endif
  6128. #ifdef WOLFSSL_KEIL
  6129. "muls r7, r6, r7\n\t"
  6130. #elif defined(__clang__)
  6131. "muls r7, r6\n\t"
  6132. #else
  6133. "mul r7, r6\n\t"
  6134. #endif
  6135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6136. "adds r3, r3, r7\n\t"
  6137. #else
  6138. "add r3, r3, r7\n\t"
  6139. #endif
  6140. #ifdef WOLFSSL_KEIL
  6141. "adcs r4, r4, %[r]\n\t"
  6142. #elif defined(__clang__)
  6143. "adcs r4, %[r]\n\t"
  6144. #else
  6145. "adc r4, %[r]\n\t"
  6146. #endif
  6147. "uxth r7, %[b]\n\t"
  6148. #ifdef WOLFSSL_KEIL
  6149. "muls r6, r7, r6\n\t"
  6150. #elif defined(__clang__)
  6151. "muls r6, r7\n\t"
  6152. #else
  6153. "mul r6, r7\n\t"
  6154. #endif
  6155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6156. "lsrs r7, r6, #16\n\t"
  6157. #else
  6158. "lsr r7, r6, #16\n\t"
  6159. #endif
  6160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6161. "lsls r6, r6, #16\n\t"
  6162. #else
  6163. "lsl r6, r6, #16\n\t"
  6164. #endif
  6165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6166. "adds r5, r5, r6\n\t"
  6167. #else
  6168. "add r5, r5, r6\n\t"
  6169. #endif
  6170. #ifdef WOLFSSL_KEIL
  6171. "adcs r3, r3, r7\n\t"
  6172. #elif defined(__clang__)
  6173. "adcs r3, r7\n\t"
  6174. #else
  6175. "adc r3, r7\n\t"
  6176. #endif
  6177. #ifdef WOLFSSL_KEIL
  6178. "adcs r4, r4, %[r]\n\t"
  6179. #elif defined(__clang__)
  6180. "adcs r4, %[r]\n\t"
  6181. #else
  6182. "adc r4, %[r]\n\t"
  6183. #endif
  6184. "# A[2] * B[6]\n\t"
  6185. "mov %[a], r9\n\t"
  6186. "mov %[b], r10\n\t"
  6187. "ldr %[a], [%[a], #8]\n\t"
  6188. "ldr %[b], [%[b], #24]\n\t"
  6189. "uxth r6, %[a]\n\t"
  6190. "uxth r7, %[b]\n\t"
  6191. #ifdef WOLFSSL_KEIL
  6192. "muls r7, r6, r7\n\t"
  6193. #elif defined(__clang__)
  6194. "muls r7, r6\n\t"
  6195. #else
  6196. "mul r7, r6\n\t"
  6197. #endif
  6198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6199. "adds r5, r5, r7\n\t"
  6200. #else
  6201. "add r5, r5, r7\n\t"
  6202. #endif
  6203. #ifdef WOLFSSL_KEIL
  6204. "adcs r3, r3, %[r]\n\t"
  6205. #elif defined(__clang__)
  6206. "adcs r3, %[r]\n\t"
  6207. #else
  6208. "adc r3, %[r]\n\t"
  6209. #endif
  6210. #ifdef WOLFSSL_KEIL
  6211. "adcs r4, r4, %[r]\n\t"
  6212. #elif defined(__clang__)
  6213. "adcs r4, %[r]\n\t"
  6214. #else
  6215. "adc r4, %[r]\n\t"
  6216. #endif
  6217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6218. "lsrs r7, %[b], #16\n\t"
  6219. #else
  6220. "lsr r7, %[b], #16\n\t"
  6221. #endif
  6222. #ifdef WOLFSSL_KEIL
  6223. "muls r6, r7, r6\n\t"
  6224. #elif defined(__clang__)
  6225. "muls r6, r7\n\t"
  6226. #else
  6227. "mul r6, r7\n\t"
  6228. #endif
  6229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6230. "lsrs r7, r6, #16\n\t"
  6231. #else
  6232. "lsr r7, r6, #16\n\t"
  6233. #endif
  6234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6235. "lsls r6, r6, #16\n\t"
  6236. #else
  6237. "lsl r6, r6, #16\n\t"
  6238. #endif
  6239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6240. "adds r5, r5, r6\n\t"
  6241. #else
  6242. "add r5, r5, r6\n\t"
  6243. #endif
  6244. #ifdef WOLFSSL_KEIL
  6245. "adcs r3, r3, r7\n\t"
  6246. #elif defined(__clang__)
  6247. "adcs r3, r7\n\t"
  6248. #else
  6249. "adc r3, r7\n\t"
  6250. #endif
  6251. #ifdef WOLFSSL_KEIL
  6252. "adcs r4, r4, %[r]\n\t"
  6253. #elif defined(__clang__)
  6254. "adcs r4, %[r]\n\t"
  6255. #else
  6256. "adc r4, %[r]\n\t"
  6257. #endif
  6258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6259. "lsrs r6, %[a], #16\n\t"
  6260. #else
  6261. "lsr r6, %[a], #16\n\t"
  6262. #endif
  6263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6264. "lsrs r7, %[b], #16\n\t"
  6265. #else
  6266. "lsr r7, %[b], #16\n\t"
  6267. #endif
  6268. #ifdef WOLFSSL_KEIL
  6269. "muls r7, r6, r7\n\t"
  6270. #elif defined(__clang__)
  6271. "muls r7, r6\n\t"
  6272. #else
  6273. "mul r7, r6\n\t"
  6274. #endif
  6275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6276. "adds r3, r3, r7\n\t"
  6277. #else
  6278. "add r3, r3, r7\n\t"
  6279. #endif
  6280. #ifdef WOLFSSL_KEIL
  6281. "adcs r4, r4, %[r]\n\t"
  6282. #elif defined(__clang__)
  6283. "adcs r4, %[r]\n\t"
  6284. #else
  6285. "adc r4, %[r]\n\t"
  6286. #endif
  6287. "uxth r7, %[b]\n\t"
  6288. #ifdef WOLFSSL_KEIL
  6289. "muls r6, r7, r6\n\t"
  6290. #elif defined(__clang__)
  6291. "muls r6, r7\n\t"
  6292. #else
  6293. "mul r6, r7\n\t"
  6294. #endif
  6295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6296. "lsrs r7, r6, #16\n\t"
  6297. #else
  6298. "lsr r7, r6, #16\n\t"
  6299. #endif
  6300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6301. "lsls r6, r6, #16\n\t"
  6302. #else
  6303. "lsl r6, r6, #16\n\t"
  6304. #endif
  6305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6306. "adds r5, r5, r6\n\t"
  6307. #else
  6308. "add r5, r5, r6\n\t"
  6309. #endif
  6310. #ifdef WOLFSSL_KEIL
  6311. "adcs r3, r3, r7\n\t"
  6312. #elif defined(__clang__)
  6313. "adcs r3, r7\n\t"
  6314. #else
  6315. "adc r3, r7\n\t"
  6316. #endif
  6317. #ifdef WOLFSSL_KEIL
  6318. "adcs r4, r4, %[r]\n\t"
  6319. #elif defined(__clang__)
  6320. "adcs r4, %[r]\n\t"
  6321. #else
  6322. "adc r4, %[r]\n\t"
  6323. #endif
  6324. "# A[1] * B[7]\n\t"
  6325. "mov %[a], r9\n\t"
  6326. "mov %[b], r10\n\t"
  6327. "ldr %[a], [%[a], #4]\n\t"
  6328. "ldr %[b], [%[b], #28]\n\t"
  6329. "uxth r6, %[a]\n\t"
  6330. "uxth r7, %[b]\n\t"
  6331. #ifdef WOLFSSL_KEIL
  6332. "muls r7, r6, r7\n\t"
  6333. #elif defined(__clang__)
  6334. "muls r7, r6\n\t"
  6335. #else
  6336. "mul r7, r6\n\t"
  6337. #endif
  6338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6339. "adds r5, r5, r7\n\t"
  6340. #else
  6341. "add r5, r5, r7\n\t"
  6342. #endif
  6343. #ifdef WOLFSSL_KEIL
  6344. "adcs r3, r3, %[r]\n\t"
  6345. #elif defined(__clang__)
  6346. "adcs r3, %[r]\n\t"
  6347. #else
  6348. "adc r3, %[r]\n\t"
  6349. #endif
  6350. #ifdef WOLFSSL_KEIL
  6351. "adcs r4, r4, %[r]\n\t"
  6352. #elif defined(__clang__)
  6353. "adcs r4, %[r]\n\t"
  6354. #else
  6355. "adc r4, %[r]\n\t"
  6356. #endif
  6357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6358. "lsrs r7, %[b], #16\n\t"
  6359. #else
  6360. "lsr r7, %[b], #16\n\t"
  6361. #endif
  6362. #ifdef WOLFSSL_KEIL
  6363. "muls r6, r7, r6\n\t"
  6364. #elif defined(__clang__)
  6365. "muls r6, r7\n\t"
  6366. #else
  6367. "mul r6, r7\n\t"
  6368. #endif
  6369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6370. "lsrs r7, r6, #16\n\t"
  6371. #else
  6372. "lsr r7, r6, #16\n\t"
  6373. #endif
  6374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6375. "lsls r6, r6, #16\n\t"
  6376. #else
  6377. "lsl r6, r6, #16\n\t"
  6378. #endif
  6379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6380. "adds r5, r5, r6\n\t"
  6381. #else
  6382. "add r5, r5, r6\n\t"
  6383. #endif
  6384. #ifdef WOLFSSL_KEIL
  6385. "adcs r3, r3, r7\n\t"
  6386. #elif defined(__clang__)
  6387. "adcs r3, r7\n\t"
  6388. #else
  6389. "adc r3, r7\n\t"
  6390. #endif
  6391. #ifdef WOLFSSL_KEIL
  6392. "adcs r4, r4, %[r]\n\t"
  6393. #elif defined(__clang__)
  6394. "adcs r4, %[r]\n\t"
  6395. #else
  6396. "adc r4, %[r]\n\t"
  6397. #endif
  6398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6399. "lsrs r6, %[a], #16\n\t"
  6400. #else
  6401. "lsr r6, %[a], #16\n\t"
  6402. #endif
  6403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6404. "lsrs r7, %[b], #16\n\t"
  6405. #else
  6406. "lsr r7, %[b], #16\n\t"
  6407. #endif
  6408. #ifdef WOLFSSL_KEIL
  6409. "muls r7, r6, r7\n\t"
  6410. #elif defined(__clang__)
  6411. "muls r7, r6\n\t"
  6412. #else
  6413. "mul r7, r6\n\t"
  6414. #endif
  6415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6416. "adds r3, r3, r7\n\t"
  6417. #else
  6418. "add r3, r3, r7\n\t"
  6419. #endif
  6420. #ifdef WOLFSSL_KEIL
  6421. "adcs r4, r4, %[r]\n\t"
  6422. #elif defined(__clang__)
  6423. "adcs r4, %[r]\n\t"
  6424. #else
  6425. "adc r4, %[r]\n\t"
  6426. #endif
  6427. "uxth r7, %[b]\n\t"
  6428. #ifdef WOLFSSL_KEIL
  6429. "muls r6, r7, r6\n\t"
  6430. #elif defined(__clang__)
  6431. "muls r6, r7\n\t"
  6432. #else
  6433. "mul r6, r7\n\t"
  6434. #endif
  6435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6436. "lsrs r7, r6, #16\n\t"
  6437. #else
  6438. "lsr r7, r6, #16\n\t"
  6439. #endif
  6440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6441. "lsls r6, r6, #16\n\t"
  6442. #else
  6443. "lsl r6, r6, #16\n\t"
  6444. #endif
  6445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6446. "adds r5, r5, r6\n\t"
  6447. #else
  6448. "add r5, r5, r6\n\t"
  6449. #endif
  6450. #ifdef WOLFSSL_KEIL
  6451. "adcs r3, r3, r7\n\t"
  6452. #elif defined(__clang__)
  6453. "adcs r3, r7\n\t"
  6454. #else
  6455. "adc r3, r7\n\t"
  6456. #endif
  6457. #ifdef WOLFSSL_KEIL
  6458. "adcs r4, r4, %[r]\n\t"
  6459. #elif defined(__clang__)
  6460. "adcs r4, %[r]\n\t"
  6461. #else
  6462. "adc r4, %[r]\n\t"
  6463. #endif
  6464. "mov %[r], r8\n\t"
  6465. "str r5, [%[r], #32]\n\t"
  6466. "movs %[r], #0\n\t"
  6467. "# A[2] * B[7]\n\t"
  6468. "movs r5, #0\n\t"
  6469. "mov %[a], r9\n\t"
  6470. "mov %[b], r10\n\t"
  6471. "ldr %[a], [%[a], #8]\n\t"
  6472. "ldr %[b], [%[b], #28]\n\t"
  6473. "uxth r6, %[a]\n\t"
  6474. "uxth r7, %[b]\n\t"
  6475. #ifdef WOLFSSL_KEIL
  6476. "muls r7, r6, r7\n\t"
  6477. #elif defined(__clang__)
  6478. "muls r7, r6\n\t"
  6479. #else
  6480. "mul r7, r6\n\t"
  6481. #endif
  6482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6483. "adds r3, r3, r7\n\t"
  6484. #else
  6485. "add r3, r3, r7\n\t"
  6486. #endif
  6487. #ifdef WOLFSSL_KEIL
  6488. "adcs r4, r4, %[r]\n\t"
  6489. #elif defined(__clang__)
  6490. "adcs r4, %[r]\n\t"
  6491. #else
  6492. "adc r4, %[r]\n\t"
  6493. #endif
  6494. #ifdef WOLFSSL_KEIL
  6495. "adcs r5, r5, %[r]\n\t"
  6496. #elif defined(__clang__)
  6497. "adcs r5, %[r]\n\t"
  6498. #else
  6499. "adc r5, %[r]\n\t"
  6500. #endif
  6501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6502. "lsrs r7, %[b], #16\n\t"
  6503. #else
  6504. "lsr r7, %[b], #16\n\t"
  6505. #endif
  6506. #ifdef WOLFSSL_KEIL
  6507. "muls r6, r7, r6\n\t"
  6508. #elif defined(__clang__)
  6509. "muls r6, r7\n\t"
  6510. #else
  6511. "mul r6, r7\n\t"
  6512. #endif
  6513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6514. "lsrs r7, r6, #16\n\t"
  6515. #else
  6516. "lsr r7, r6, #16\n\t"
  6517. #endif
  6518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6519. "lsls r6, r6, #16\n\t"
  6520. #else
  6521. "lsl r6, r6, #16\n\t"
  6522. #endif
  6523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6524. "adds r3, r3, r6\n\t"
  6525. #else
  6526. "add r3, r3, r6\n\t"
  6527. #endif
  6528. #ifdef WOLFSSL_KEIL
  6529. "adcs r4, r4, r7\n\t"
  6530. #elif defined(__clang__)
  6531. "adcs r4, r7\n\t"
  6532. #else
  6533. "adc r4, r7\n\t"
  6534. #endif
  6535. #ifdef WOLFSSL_KEIL
  6536. "adcs r5, r5, %[r]\n\t"
  6537. #elif defined(__clang__)
  6538. "adcs r5, %[r]\n\t"
  6539. #else
  6540. "adc r5, %[r]\n\t"
  6541. #endif
  6542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6543. "lsrs r6, %[a], #16\n\t"
  6544. #else
  6545. "lsr r6, %[a], #16\n\t"
  6546. #endif
  6547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6548. "lsrs r7, %[b], #16\n\t"
  6549. #else
  6550. "lsr r7, %[b], #16\n\t"
  6551. #endif
  6552. #ifdef WOLFSSL_KEIL
  6553. "muls r7, r6, r7\n\t"
  6554. #elif defined(__clang__)
  6555. "muls r7, r6\n\t"
  6556. #else
  6557. "mul r7, r6\n\t"
  6558. #endif
  6559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6560. "adds r4, r4, r7\n\t"
  6561. #else
  6562. "add r4, r4, r7\n\t"
  6563. #endif
  6564. #ifdef WOLFSSL_KEIL
  6565. "adcs r5, r5, %[r]\n\t"
  6566. #elif defined(__clang__)
  6567. "adcs r5, %[r]\n\t"
  6568. #else
  6569. "adc r5, %[r]\n\t"
  6570. #endif
  6571. "uxth r7, %[b]\n\t"
  6572. #ifdef WOLFSSL_KEIL
  6573. "muls r6, r7, r6\n\t"
  6574. #elif defined(__clang__)
  6575. "muls r6, r7\n\t"
  6576. #else
  6577. "mul r6, r7\n\t"
  6578. #endif
  6579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6580. "lsrs r7, r6, #16\n\t"
  6581. #else
  6582. "lsr r7, r6, #16\n\t"
  6583. #endif
  6584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6585. "lsls r6, r6, #16\n\t"
  6586. #else
  6587. "lsl r6, r6, #16\n\t"
  6588. #endif
  6589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6590. "adds r3, r3, r6\n\t"
  6591. #else
  6592. "add r3, r3, r6\n\t"
  6593. #endif
  6594. #ifdef WOLFSSL_KEIL
  6595. "adcs r4, r4, r7\n\t"
  6596. #elif defined(__clang__)
  6597. "adcs r4, r7\n\t"
  6598. #else
  6599. "adc r4, r7\n\t"
  6600. #endif
  6601. #ifdef WOLFSSL_KEIL
  6602. "adcs r5, r5, %[r]\n\t"
  6603. #elif defined(__clang__)
  6604. "adcs r5, %[r]\n\t"
  6605. #else
  6606. "adc r5, %[r]\n\t"
  6607. #endif
  6608. "# A[3] * B[6]\n\t"
  6609. "mov %[a], r9\n\t"
  6610. "mov %[b], r10\n\t"
  6611. "ldr %[a], [%[a], #12]\n\t"
  6612. "ldr %[b], [%[b], #24]\n\t"
  6613. "uxth r6, %[a]\n\t"
  6614. "uxth r7, %[b]\n\t"
  6615. #ifdef WOLFSSL_KEIL
  6616. "muls r7, r6, r7\n\t"
  6617. #elif defined(__clang__)
  6618. "muls r7, r6\n\t"
  6619. #else
  6620. "mul r7, r6\n\t"
  6621. #endif
  6622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6623. "adds r3, r3, r7\n\t"
  6624. #else
  6625. "add r3, r3, r7\n\t"
  6626. #endif
  6627. #ifdef WOLFSSL_KEIL
  6628. "adcs r4, r4, %[r]\n\t"
  6629. #elif defined(__clang__)
  6630. "adcs r4, %[r]\n\t"
  6631. #else
  6632. "adc r4, %[r]\n\t"
  6633. #endif
  6634. #ifdef WOLFSSL_KEIL
  6635. "adcs r5, r5, %[r]\n\t"
  6636. #elif defined(__clang__)
  6637. "adcs r5, %[r]\n\t"
  6638. #else
  6639. "adc r5, %[r]\n\t"
  6640. #endif
  6641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6642. "lsrs r7, %[b], #16\n\t"
  6643. #else
  6644. "lsr r7, %[b], #16\n\t"
  6645. #endif
  6646. #ifdef WOLFSSL_KEIL
  6647. "muls r6, r7, r6\n\t"
  6648. #elif defined(__clang__)
  6649. "muls r6, r7\n\t"
  6650. #else
  6651. "mul r6, r7\n\t"
  6652. #endif
  6653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6654. "lsrs r7, r6, #16\n\t"
  6655. #else
  6656. "lsr r7, r6, #16\n\t"
  6657. #endif
  6658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6659. "lsls r6, r6, #16\n\t"
  6660. #else
  6661. "lsl r6, r6, #16\n\t"
  6662. #endif
  6663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6664. "adds r3, r3, r6\n\t"
  6665. #else
  6666. "add r3, r3, r6\n\t"
  6667. #endif
  6668. #ifdef WOLFSSL_KEIL
  6669. "adcs r4, r4, r7\n\t"
  6670. #elif defined(__clang__)
  6671. "adcs r4, r7\n\t"
  6672. #else
  6673. "adc r4, r7\n\t"
  6674. #endif
  6675. #ifdef WOLFSSL_KEIL
  6676. "adcs r5, r5, %[r]\n\t"
  6677. #elif defined(__clang__)
  6678. "adcs r5, %[r]\n\t"
  6679. #else
  6680. "adc r5, %[r]\n\t"
  6681. #endif
  6682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6683. "lsrs r6, %[a], #16\n\t"
  6684. #else
  6685. "lsr r6, %[a], #16\n\t"
  6686. #endif
  6687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6688. "lsrs r7, %[b], #16\n\t"
  6689. #else
  6690. "lsr r7, %[b], #16\n\t"
  6691. #endif
  6692. #ifdef WOLFSSL_KEIL
  6693. "muls r7, r6, r7\n\t"
  6694. #elif defined(__clang__)
  6695. "muls r7, r6\n\t"
  6696. #else
  6697. "mul r7, r6\n\t"
  6698. #endif
  6699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6700. "adds r4, r4, r7\n\t"
  6701. #else
  6702. "add r4, r4, r7\n\t"
  6703. #endif
  6704. #ifdef WOLFSSL_KEIL
  6705. "adcs r5, r5, %[r]\n\t"
  6706. #elif defined(__clang__)
  6707. "adcs r5, %[r]\n\t"
  6708. #else
  6709. "adc r5, %[r]\n\t"
  6710. #endif
  6711. "uxth r7, %[b]\n\t"
  6712. #ifdef WOLFSSL_KEIL
  6713. "muls r6, r7, r6\n\t"
  6714. #elif defined(__clang__)
  6715. "muls r6, r7\n\t"
  6716. #else
  6717. "mul r6, r7\n\t"
  6718. #endif
  6719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6720. "lsrs r7, r6, #16\n\t"
  6721. #else
  6722. "lsr r7, r6, #16\n\t"
  6723. #endif
  6724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6725. "lsls r6, r6, #16\n\t"
  6726. #else
  6727. "lsl r6, r6, #16\n\t"
  6728. #endif
  6729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6730. "adds r3, r3, r6\n\t"
  6731. #else
  6732. "add r3, r3, r6\n\t"
  6733. #endif
  6734. #ifdef WOLFSSL_KEIL
  6735. "adcs r4, r4, r7\n\t"
  6736. #elif defined(__clang__)
  6737. "adcs r4, r7\n\t"
  6738. #else
  6739. "adc r4, r7\n\t"
  6740. #endif
  6741. #ifdef WOLFSSL_KEIL
  6742. "adcs r5, r5, %[r]\n\t"
  6743. #elif defined(__clang__)
  6744. "adcs r5, %[r]\n\t"
  6745. #else
  6746. "adc r5, %[r]\n\t"
  6747. #endif
  6748. "# A[4] * B[5]\n\t"
  6749. "mov %[a], r9\n\t"
  6750. "mov %[b], r10\n\t"
  6751. "ldr %[a], [%[a], #16]\n\t"
  6752. "ldr %[b], [%[b], #20]\n\t"
  6753. "uxth r6, %[a]\n\t"
  6754. "uxth r7, %[b]\n\t"
  6755. #ifdef WOLFSSL_KEIL
  6756. "muls r7, r6, r7\n\t"
  6757. #elif defined(__clang__)
  6758. "muls r7, r6\n\t"
  6759. #else
  6760. "mul r7, r6\n\t"
  6761. #endif
  6762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6763. "adds r3, r3, r7\n\t"
  6764. #else
  6765. "add r3, r3, r7\n\t"
  6766. #endif
  6767. #ifdef WOLFSSL_KEIL
  6768. "adcs r4, r4, %[r]\n\t"
  6769. #elif defined(__clang__)
  6770. "adcs r4, %[r]\n\t"
  6771. #else
  6772. "adc r4, %[r]\n\t"
  6773. #endif
  6774. #ifdef WOLFSSL_KEIL
  6775. "adcs r5, r5, %[r]\n\t"
  6776. #elif defined(__clang__)
  6777. "adcs r5, %[r]\n\t"
  6778. #else
  6779. "adc r5, %[r]\n\t"
  6780. #endif
  6781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6782. "lsrs r7, %[b], #16\n\t"
  6783. #else
  6784. "lsr r7, %[b], #16\n\t"
  6785. #endif
  6786. #ifdef WOLFSSL_KEIL
  6787. "muls r6, r7, r6\n\t"
  6788. #elif defined(__clang__)
  6789. "muls r6, r7\n\t"
  6790. #else
  6791. "mul r6, r7\n\t"
  6792. #endif
  6793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6794. "lsrs r7, r6, #16\n\t"
  6795. #else
  6796. "lsr r7, r6, #16\n\t"
  6797. #endif
  6798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6799. "lsls r6, r6, #16\n\t"
  6800. #else
  6801. "lsl r6, r6, #16\n\t"
  6802. #endif
  6803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6804. "adds r3, r3, r6\n\t"
  6805. #else
  6806. "add r3, r3, r6\n\t"
  6807. #endif
  6808. #ifdef WOLFSSL_KEIL
  6809. "adcs r4, r4, r7\n\t"
  6810. #elif defined(__clang__)
  6811. "adcs r4, r7\n\t"
  6812. #else
  6813. "adc r4, r7\n\t"
  6814. #endif
  6815. #ifdef WOLFSSL_KEIL
  6816. "adcs r5, r5, %[r]\n\t"
  6817. #elif defined(__clang__)
  6818. "adcs r5, %[r]\n\t"
  6819. #else
  6820. "adc r5, %[r]\n\t"
  6821. #endif
  6822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6823. "lsrs r6, %[a], #16\n\t"
  6824. #else
  6825. "lsr r6, %[a], #16\n\t"
  6826. #endif
  6827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6828. "lsrs r7, %[b], #16\n\t"
  6829. #else
  6830. "lsr r7, %[b], #16\n\t"
  6831. #endif
  6832. #ifdef WOLFSSL_KEIL
  6833. "muls r7, r6, r7\n\t"
  6834. #elif defined(__clang__)
  6835. "muls r7, r6\n\t"
  6836. #else
  6837. "mul r7, r6\n\t"
  6838. #endif
  6839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6840. "adds r4, r4, r7\n\t"
  6841. #else
  6842. "add r4, r4, r7\n\t"
  6843. #endif
  6844. #ifdef WOLFSSL_KEIL
  6845. "adcs r5, r5, %[r]\n\t"
  6846. #elif defined(__clang__)
  6847. "adcs r5, %[r]\n\t"
  6848. #else
  6849. "adc r5, %[r]\n\t"
  6850. #endif
  6851. "uxth r7, %[b]\n\t"
  6852. #ifdef WOLFSSL_KEIL
  6853. "muls r6, r7, r6\n\t"
  6854. #elif defined(__clang__)
  6855. "muls r6, r7\n\t"
  6856. #else
  6857. "mul r6, r7\n\t"
  6858. #endif
  6859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6860. "lsrs r7, r6, #16\n\t"
  6861. #else
  6862. "lsr r7, r6, #16\n\t"
  6863. #endif
  6864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6865. "lsls r6, r6, #16\n\t"
  6866. #else
  6867. "lsl r6, r6, #16\n\t"
  6868. #endif
  6869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6870. "adds r3, r3, r6\n\t"
  6871. #else
  6872. "add r3, r3, r6\n\t"
  6873. #endif
  6874. #ifdef WOLFSSL_KEIL
  6875. "adcs r4, r4, r7\n\t"
  6876. #elif defined(__clang__)
  6877. "adcs r4, r7\n\t"
  6878. #else
  6879. "adc r4, r7\n\t"
  6880. #endif
  6881. #ifdef WOLFSSL_KEIL
  6882. "adcs r5, r5, %[r]\n\t"
  6883. #elif defined(__clang__)
  6884. "adcs r5, %[r]\n\t"
  6885. #else
  6886. "adc r5, %[r]\n\t"
  6887. #endif
  6888. "# A[5] * B[4]\n\t"
  6889. "mov %[a], r9\n\t"
  6890. "mov %[b], r10\n\t"
  6891. "ldr %[a], [%[a], #20]\n\t"
  6892. "ldr %[b], [%[b], #16]\n\t"
  6893. "uxth r6, %[a]\n\t"
  6894. "uxth r7, %[b]\n\t"
  6895. #ifdef WOLFSSL_KEIL
  6896. "muls r7, r6, r7\n\t"
  6897. #elif defined(__clang__)
  6898. "muls r7, r6\n\t"
  6899. #else
  6900. "mul r7, r6\n\t"
  6901. #endif
  6902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6903. "adds r3, r3, r7\n\t"
  6904. #else
  6905. "add r3, r3, r7\n\t"
  6906. #endif
  6907. #ifdef WOLFSSL_KEIL
  6908. "adcs r4, r4, %[r]\n\t"
  6909. #elif defined(__clang__)
  6910. "adcs r4, %[r]\n\t"
  6911. #else
  6912. "adc r4, %[r]\n\t"
  6913. #endif
  6914. #ifdef WOLFSSL_KEIL
  6915. "adcs r5, r5, %[r]\n\t"
  6916. #elif defined(__clang__)
  6917. "adcs r5, %[r]\n\t"
  6918. #else
  6919. "adc r5, %[r]\n\t"
  6920. #endif
  6921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6922. "lsrs r7, %[b], #16\n\t"
  6923. #else
  6924. "lsr r7, %[b], #16\n\t"
  6925. #endif
  6926. #ifdef WOLFSSL_KEIL
  6927. "muls r6, r7, r6\n\t"
  6928. #elif defined(__clang__)
  6929. "muls r6, r7\n\t"
  6930. #else
  6931. "mul r6, r7\n\t"
  6932. #endif
  6933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6934. "lsrs r7, r6, #16\n\t"
  6935. #else
  6936. "lsr r7, r6, #16\n\t"
  6937. #endif
  6938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6939. "lsls r6, r6, #16\n\t"
  6940. #else
  6941. "lsl r6, r6, #16\n\t"
  6942. #endif
  6943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6944. "adds r3, r3, r6\n\t"
  6945. #else
  6946. "add r3, r3, r6\n\t"
  6947. #endif
  6948. #ifdef WOLFSSL_KEIL
  6949. "adcs r4, r4, r7\n\t"
  6950. #elif defined(__clang__)
  6951. "adcs r4, r7\n\t"
  6952. #else
  6953. "adc r4, r7\n\t"
  6954. #endif
  6955. #ifdef WOLFSSL_KEIL
  6956. "adcs r5, r5, %[r]\n\t"
  6957. #elif defined(__clang__)
  6958. "adcs r5, %[r]\n\t"
  6959. #else
  6960. "adc r5, %[r]\n\t"
  6961. #endif
  6962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6963. "lsrs r6, %[a], #16\n\t"
  6964. #else
  6965. "lsr r6, %[a], #16\n\t"
  6966. #endif
  6967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6968. "lsrs r7, %[b], #16\n\t"
  6969. #else
  6970. "lsr r7, %[b], #16\n\t"
  6971. #endif
  6972. #ifdef WOLFSSL_KEIL
  6973. "muls r7, r6, r7\n\t"
  6974. #elif defined(__clang__)
  6975. "muls r7, r6\n\t"
  6976. #else
  6977. "mul r7, r6\n\t"
  6978. #endif
  6979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6980. "adds r4, r4, r7\n\t"
  6981. #else
  6982. "add r4, r4, r7\n\t"
  6983. #endif
  6984. #ifdef WOLFSSL_KEIL
  6985. "adcs r5, r5, %[r]\n\t"
  6986. #elif defined(__clang__)
  6987. "adcs r5, %[r]\n\t"
  6988. #else
  6989. "adc r5, %[r]\n\t"
  6990. #endif
  6991. "uxth r7, %[b]\n\t"
  6992. #ifdef WOLFSSL_KEIL
  6993. "muls r6, r7, r6\n\t"
  6994. #elif defined(__clang__)
  6995. "muls r6, r7\n\t"
  6996. #else
  6997. "mul r6, r7\n\t"
  6998. #endif
  6999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7000. "lsrs r7, r6, #16\n\t"
  7001. #else
  7002. "lsr r7, r6, #16\n\t"
  7003. #endif
  7004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7005. "lsls r6, r6, #16\n\t"
  7006. #else
  7007. "lsl r6, r6, #16\n\t"
  7008. #endif
  7009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7010. "adds r3, r3, r6\n\t"
  7011. #else
  7012. "add r3, r3, r6\n\t"
  7013. #endif
  7014. #ifdef WOLFSSL_KEIL
  7015. "adcs r4, r4, r7\n\t"
  7016. #elif defined(__clang__)
  7017. "adcs r4, r7\n\t"
  7018. #else
  7019. "adc r4, r7\n\t"
  7020. #endif
  7021. #ifdef WOLFSSL_KEIL
  7022. "adcs r5, r5, %[r]\n\t"
  7023. #elif defined(__clang__)
  7024. "adcs r5, %[r]\n\t"
  7025. #else
  7026. "adc r5, %[r]\n\t"
  7027. #endif
  7028. "# A[6] * B[3]\n\t"
  7029. "mov %[a], r9\n\t"
  7030. "mov %[b], r10\n\t"
  7031. "ldr %[a], [%[a], #24]\n\t"
  7032. "ldr %[b], [%[b], #12]\n\t"
  7033. "uxth r6, %[a]\n\t"
  7034. "uxth r7, %[b]\n\t"
  7035. #ifdef WOLFSSL_KEIL
  7036. "muls r7, r6, r7\n\t"
  7037. #elif defined(__clang__)
  7038. "muls r7, r6\n\t"
  7039. #else
  7040. "mul r7, r6\n\t"
  7041. #endif
  7042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7043. "adds r3, r3, r7\n\t"
  7044. #else
  7045. "add r3, r3, r7\n\t"
  7046. #endif
  7047. #ifdef WOLFSSL_KEIL
  7048. "adcs r4, r4, %[r]\n\t"
  7049. #elif defined(__clang__)
  7050. "adcs r4, %[r]\n\t"
  7051. #else
  7052. "adc r4, %[r]\n\t"
  7053. #endif
  7054. #ifdef WOLFSSL_KEIL
  7055. "adcs r5, r5, %[r]\n\t"
  7056. #elif defined(__clang__)
  7057. "adcs r5, %[r]\n\t"
  7058. #else
  7059. "adc r5, %[r]\n\t"
  7060. #endif
  7061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7062. "lsrs r7, %[b], #16\n\t"
  7063. #else
  7064. "lsr r7, %[b], #16\n\t"
  7065. #endif
  7066. #ifdef WOLFSSL_KEIL
  7067. "muls r6, r7, r6\n\t"
  7068. #elif defined(__clang__)
  7069. "muls r6, r7\n\t"
  7070. #else
  7071. "mul r6, r7\n\t"
  7072. #endif
  7073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7074. "lsrs r7, r6, #16\n\t"
  7075. #else
  7076. "lsr r7, r6, #16\n\t"
  7077. #endif
  7078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7079. "lsls r6, r6, #16\n\t"
  7080. #else
  7081. "lsl r6, r6, #16\n\t"
  7082. #endif
  7083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7084. "adds r3, r3, r6\n\t"
  7085. #else
  7086. "add r3, r3, r6\n\t"
  7087. #endif
  7088. #ifdef WOLFSSL_KEIL
  7089. "adcs r4, r4, r7\n\t"
  7090. #elif defined(__clang__)
  7091. "adcs r4, r7\n\t"
  7092. #else
  7093. "adc r4, r7\n\t"
  7094. #endif
  7095. #ifdef WOLFSSL_KEIL
  7096. "adcs r5, r5, %[r]\n\t"
  7097. #elif defined(__clang__)
  7098. "adcs r5, %[r]\n\t"
  7099. #else
  7100. "adc r5, %[r]\n\t"
  7101. #endif
  7102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7103. "lsrs r6, %[a], #16\n\t"
  7104. #else
  7105. "lsr r6, %[a], #16\n\t"
  7106. #endif
  7107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7108. "lsrs r7, %[b], #16\n\t"
  7109. #else
  7110. "lsr r7, %[b], #16\n\t"
  7111. #endif
  7112. #ifdef WOLFSSL_KEIL
  7113. "muls r7, r6, r7\n\t"
  7114. #elif defined(__clang__)
  7115. "muls r7, r6\n\t"
  7116. #else
  7117. "mul r7, r6\n\t"
  7118. #endif
  7119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7120. "adds r4, r4, r7\n\t"
  7121. #else
  7122. "add r4, r4, r7\n\t"
  7123. #endif
  7124. #ifdef WOLFSSL_KEIL
  7125. "adcs r5, r5, %[r]\n\t"
  7126. #elif defined(__clang__)
  7127. "adcs r5, %[r]\n\t"
  7128. #else
  7129. "adc r5, %[r]\n\t"
  7130. #endif
  7131. "uxth r7, %[b]\n\t"
  7132. #ifdef WOLFSSL_KEIL
  7133. "muls r6, r7, r6\n\t"
  7134. #elif defined(__clang__)
  7135. "muls r6, r7\n\t"
  7136. #else
  7137. "mul r6, r7\n\t"
  7138. #endif
  7139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7140. "lsrs r7, r6, #16\n\t"
  7141. #else
  7142. "lsr r7, r6, #16\n\t"
  7143. #endif
  7144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7145. "lsls r6, r6, #16\n\t"
  7146. #else
  7147. "lsl r6, r6, #16\n\t"
  7148. #endif
  7149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7150. "adds r3, r3, r6\n\t"
  7151. #else
  7152. "add r3, r3, r6\n\t"
  7153. #endif
  7154. #ifdef WOLFSSL_KEIL
  7155. "adcs r4, r4, r7\n\t"
  7156. #elif defined(__clang__)
  7157. "adcs r4, r7\n\t"
  7158. #else
  7159. "adc r4, r7\n\t"
  7160. #endif
  7161. #ifdef WOLFSSL_KEIL
  7162. "adcs r5, r5, %[r]\n\t"
  7163. #elif defined(__clang__)
  7164. "adcs r5, %[r]\n\t"
  7165. #else
  7166. "adc r5, %[r]\n\t"
  7167. #endif
  7168. "# A[7] * B[2]\n\t"
  7169. "mov %[a], r9\n\t"
  7170. "mov %[b], r10\n\t"
  7171. "ldr %[a], [%[a], #28]\n\t"
  7172. "ldr %[b], [%[b], #8]\n\t"
  7173. "uxth r6, %[a]\n\t"
  7174. "uxth r7, %[b]\n\t"
  7175. #ifdef WOLFSSL_KEIL
  7176. "muls r7, r6, r7\n\t"
  7177. #elif defined(__clang__)
  7178. "muls r7, r6\n\t"
  7179. #else
  7180. "mul r7, r6\n\t"
  7181. #endif
  7182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7183. "adds r3, r3, r7\n\t"
  7184. #else
  7185. "add r3, r3, r7\n\t"
  7186. #endif
  7187. #ifdef WOLFSSL_KEIL
  7188. "adcs r4, r4, %[r]\n\t"
  7189. #elif defined(__clang__)
  7190. "adcs r4, %[r]\n\t"
  7191. #else
  7192. "adc r4, %[r]\n\t"
  7193. #endif
  7194. #ifdef WOLFSSL_KEIL
  7195. "adcs r5, r5, %[r]\n\t"
  7196. #elif defined(__clang__)
  7197. "adcs r5, %[r]\n\t"
  7198. #else
  7199. "adc r5, %[r]\n\t"
  7200. #endif
  7201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7202. "lsrs r7, %[b], #16\n\t"
  7203. #else
  7204. "lsr r7, %[b], #16\n\t"
  7205. #endif
  7206. #ifdef WOLFSSL_KEIL
  7207. "muls r6, r7, r6\n\t"
  7208. #elif defined(__clang__)
  7209. "muls r6, r7\n\t"
  7210. #else
  7211. "mul r6, r7\n\t"
  7212. #endif
  7213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7214. "lsrs r7, r6, #16\n\t"
  7215. #else
  7216. "lsr r7, r6, #16\n\t"
  7217. #endif
  7218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7219. "lsls r6, r6, #16\n\t"
  7220. #else
  7221. "lsl r6, r6, #16\n\t"
  7222. #endif
  7223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7224. "adds r3, r3, r6\n\t"
  7225. #else
  7226. "add r3, r3, r6\n\t"
  7227. #endif
  7228. #ifdef WOLFSSL_KEIL
  7229. "adcs r4, r4, r7\n\t"
  7230. #elif defined(__clang__)
  7231. "adcs r4, r7\n\t"
  7232. #else
  7233. "adc r4, r7\n\t"
  7234. #endif
  7235. #ifdef WOLFSSL_KEIL
  7236. "adcs r5, r5, %[r]\n\t"
  7237. #elif defined(__clang__)
  7238. "adcs r5, %[r]\n\t"
  7239. #else
  7240. "adc r5, %[r]\n\t"
  7241. #endif
  7242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7243. "lsrs r6, %[a], #16\n\t"
  7244. #else
  7245. "lsr r6, %[a], #16\n\t"
  7246. #endif
  7247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7248. "lsrs r7, %[b], #16\n\t"
  7249. #else
  7250. "lsr r7, %[b], #16\n\t"
  7251. #endif
  7252. #ifdef WOLFSSL_KEIL
  7253. "muls r7, r6, r7\n\t"
  7254. #elif defined(__clang__)
  7255. "muls r7, r6\n\t"
  7256. #else
  7257. "mul r7, r6\n\t"
  7258. #endif
  7259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7260. "adds r4, r4, r7\n\t"
  7261. #else
  7262. "add r4, r4, r7\n\t"
  7263. #endif
  7264. #ifdef WOLFSSL_KEIL
  7265. "adcs r5, r5, %[r]\n\t"
  7266. #elif defined(__clang__)
  7267. "adcs r5, %[r]\n\t"
  7268. #else
  7269. "adc r5, %[r]\n\t"
  7270. #endif
  7271. "uxth r7, %[b]\n\t"
  7272. #ifdef WOLFSSL_KEIL
  7273. "muls r6, r7, r6\n\t"
  7274. #elif defined(__clang__)
  7275. "muls r6, r7\n\t"
  7276. #else
  7277. "mul r6, r7\n\t"
  7278. #endif
  7279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7280. "lsrs r7, r6, #16\n\t"
  7281. #else
  7282. "lsr r7, r6, #16\n\t"
  7283. #endif
  7284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7285. "lsls r6, r6, #16\n\t"
  7286. #else
  7287. "lsl r6, r6, #16\n\t"
  7288. #endif
  7289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7290. "adds r3, r3, r6\n\t"
  7291. #else
  7292. "add r3, r3, r6\n\t"
  7293. #endif
  7294. #ifdef WOLFSSL_KEIL
  7295. "adcs r4, r4, r7\n\t"
  7296. #elif defined(__clang__)
  7297. "adcs r4, r7\n\t"
  7298. #else
  7299. "adc r4, r7\n\t"
  7300. #endif
  7301. #ifdef WOLFSSL_KEIL
  7302. "adcs r5, r5, %[r]\n\t"
  7303. #elif defined(__clang__)
  7304. "adcs r5, %[r]\n\t"
  7305. #else
  7306. "adc r5, %[r]\n\t"
  7307. #endif
  7308. "mov %[r], r8\n\t"
  7309. "str r3, [%[r], #36]\n\t"
  7310. "movs %[r], #0\n\t"
  7311. "# A[7] * B[3]\n\t"
  7312. "movs r3, #0\n\t"
  7313. "mov %[a], r9\n\t"
  7314. "mov %[b], r10\n\t"
  7315. "ldr %[a], [%[a], #28]\n\t"
  7316. "ldr %[b], [%[b], #12]\n\t"
  7317. "uxth r6, %[a]\n\t"
  7318. "uxth r7, %[b]\n\t"
  7319. #ifdef WOLFSSL_KEIL
  7320. "muls r7, r6, r7\n\t"
  7321. #elif defined(__clang__)
  7322. "muls r7, r6\n\t"
  7323. #else
  7324. "mul r7, r6\n\t"
  7325. #endif
  7326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7327. "adds r4, r4, r7\n\t"
  7328. #else
  7329. "add r4, r4, r7\n\t"
  7330. #endif
  7331. #ifdef WOLFSSL_KEIL
  7332. "adcs r5, r5, %[r]\n\t"
  7333. #elif defined(__clang__)
  7334. "adcs r5, %[r]\n\t"
  7335. #else
  7336. "adc r5, %[r]\n\t"
  7337. #endif
  7338. #ifdef WOLFSSL_KEIL
  7339. "adcs r3, r3, %[r]\n\t"
  7340. #elif defined(__clang__)
  7341. "adcs r3, %[r]\n\t"
  7342. #else
  7343. "adc r3, %[r]\n\t"
  7344. #endif
  7345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7346. "lsrs r7, %[b], #16\n\t"
  7347. #else
  7348. "lsr r7, %[b], #16\n\t"
  7349. #endif
  7350. #ifdef WOLFSSL_KEIL
  7351. "muls r6, r7, r6\n\t"
  7352. #elif defined(__clang__)
  7353. "muls r6, r7\n\t"
  7354. #else
  7355. "mul r6, r7\n\t"
  7356. #endif
  7357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7358. "lsrs r7, r6, #16\n\t"
  7359. #else
  7360. "lsr r7, r6, #16\n\t"
  7361. #endif
  7362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7363. "lsls r6, r6, #16\n\t"
  7364. #else
  7365. "lsl r6, r6, #16\n\t"
  7366. #endif
  7367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7368. "adds r4, r4, r6\n\t"
  7369. #else
  7370. "add r4, r4, r6\n\t"
  7371. #endif
  7372. #ifdef WOLFSSL_KEIL
  7373. "adcs r5, r5, r7\n\t"
  7374. #elif defined(__clang__)
  7375. "adcs r5, r7\n\t"
  7376. #else
  7377. "adc r5, r7\n\t"
  7378. #endif
  7379. #ifdef WOLFSSL_KEIL
  7380. "adcs r3, r3, %[r]\n\t"
  7381. #elif defined(__clang__)
  7382. "adcs r3, %[r]\n\t"
  7383. #else
  7384. "adc r3, %[r]\n\t"
  7385. #endif
  7386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7387. "lsrs r6, %[a], #16\n\t"
  7388. #else
  7389. "lsr r6, %[a], #16\n\t"
  7390. #endif
  7391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7392. "lsrs r7, %[b], #16\n\t"
  7393. #else
  7394. "lsr r7, %[b], #16\n\t"
  7395. #endif
  7396. #ifdef WOLFSSL_KEIL
  7397. "muls r7, r6, r7\n\t"
  7398. #elif defined(__clang__)
  7399. "muls r7, r6\n\t"
  7400. #else
  7401. "mul r7, r6\n\t"
  7402. #endif
  7403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7404. "adds r5, r5, r7\n\t"
  7405. #else
  7406. "add r5, r5, r7\n\t"
  7407. #endif
  7408. #ifdef WOLFSSL_KEIL
  7409. "adcs r3, r3, %[r]\n\t"
  7410. #elif defined(__clang__)
  7411. "adcs r3, %[r]\n\t"
  7412. #else
  7413. "adc r3, %[r]\n\t"
  7414. #endif
  7415. "uxth r7, %[b]\n\t"
  7416. #ifdef WOLFSSL_KEIL
  7417. "muls r6, r7, r6\n\t"
  7418. #elif defined(__clang__)
  7419. "muls r6, r7\n\t"
  7420. #else
  7421. "mul r6, r7\n\t"
  7422. #endif
  7423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7424. "lsrs r7, r6, #16\n\t"
  7425. #else
  7426. "lsr r7, r6, #16\n\t"
  7427. #endif
  7428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7429. "lsls r6, r6, #16\n\t"
  7430. #else
  7431. "lsl r6, r6, #16\n\t"
  7432. #endif
  7433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7434. "adds r4, r4, r6\n\t"
  7435. #else
  7436. "add r4, r4, r6\n\t"
  7437. #endif
  7438. #ifdef WOLFSSL_KEIL
  7439. "adcs r5, r5, r7\n\t"
  7440. #elif defined(__clang__)
  7441. "adcs r5, r7\n\t"
  7442. #else
  7443. "adc r5, r7\n\t"
  7444. #endif
  7445. #ifdef WOLFSSL_KEIL
  7446. "adcs r3, r3, %[r]\n\t"
  7447. #elif defined(__clang__)
  7448. "adcs r3, %[r]\n\t"
  7449. #else
  7450. "adc r3, %[r]\n\t"
  7451. #endif
  7452. "# A[6] * B[4]\n\t"
  7453. "mov %[a], r9\n\t"
  7454. "mov %[b], r10\n\t"
  7455. "ldr %[a], [%[a], #24]\n\t"
  7456. "ldr %[b], [%[b], #16]\n\t"
  7457. "uxth r6, %[a]\n\t"
  7458. "uxth r7, %[b]\n\t"
  7459. #ifdef WOLFSSL_KEIL
  7460. "muls r7, r6, r7\n\t"
  7461. #elif defined(__clang__)
  7462. "muls r7, r6\n\t"
  7463. #else
  7464. "mul r7, r6\n\t"
  7465. #endif
  7466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7467. "adds r4, r4, r7\n\t"
  7468. #else
  7469. "add r4, r4, r7\n\t"
  7470. #endif
  7471. #ifdef WOLFSSL_KEIL
  7472. "adcs r5, r5, %[r]\n\t"
  7473. #elif defined(__clang__)
  7474. "adcs r5, %[r]\n\t"
  7475. #else
  7476. "adc r5, %[r]\n\t"
  7477. #endif
  7478. #ifdef WOLFSSL_KEIL
  7479. "adcs r3, r3, %[r]\n\t"
  7480. #elif defined(__clang__)
  7481. "adcs r3, %[r]\n\t"
  7482. #else
  7483. "adc r3, %[r]\n\t"
  7484. #endif
  7485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7486. "lsrs r7, %[b], #16\n\t"
  7487. #else
  7488. "lsr r7, %[b], #16\n\t"
  7489. #endif
  7490. #ifdef WOLFSSL_KEIL
  7491. "muls r6, r7, r6\n\t"
  7492. #elif defined(__clang__)
  7493. "muls r6, r7\n\t"
  7494. #else
  7495. "mul r6, r7\n\t"
  7496. #endif
  7497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7498. "lsrs r7, r6, #16\n\t"
  7499. #else
  7500. "lsr r7, r6, #16\n\t"
  7501. #endif
  7502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7503. "lsls r6, r6, #16\n\t"
  7504. #else
  7505. "lsl r6, r6, #16\n\t"
  7506. #endif
  7507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7508. "adds r4, r4, r6\n\t"
  7509. #else
  7510. "add r4, r4, r6\n\t"
  7511. #endif
  7512. #ifdef WOLFSSL_KEIL
  7513. "adcs r5, r5, r7\n\t"
  7514. #elif defined(__clang__)
  7515. "adcs r5, r7\n\t"
  7516. #else
  7517. "adc r5, r7\n\t"
  7518. #endif
  7519. #ifdef WOLFSSL_KEIL
  7520. "adcs r3, r3, %[r]\n\t"
  7521. #elif defined(__clang__)
  7522. "adcs r3, %[r]\n\t"
  7523. #else
  7524. "adc r3, %[r]\n\t"
  7525. #endif
  7526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7527. "lsrs r6, %[a], #16\n\t"
  7528. #else
  7529. "lsr r6, %[a], #16\n\t"
  7530. #endif
  7531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7532. "lsrs r7, %[b], #16\n\t"
  7533. #else
  7534. "lsr r7, %[b], #16\n\t"
  7535. #endif
  7536. #ifdef WOLFSSL_KEIL
  7537. "muls r7, r6, r7\n\t"
  7538. #elif defined(__clang__)
  7539. "muls r7, r6\n\t"
  7540. #else
  7541. "mul r7, r6\n\t"
  7542. #endif
  7543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7544. "adds r5, r5, r7\n\t"
  7545. #else
  7546. "add r5, r5, r7\n\t"
  7547. #endif
  7548. #ifdef WOLFSSL_KEIL
  7549. "adcs r3, r3, %[r]\n\t"
  7550. #elif defined(__clang__)
  7551. "adcs r3, %[r]\n\t"
  7552. #else
  7553. "adc r3, %[r]\n\t"
  7554. #endif
  7555. "uxth r7, %[b]\n\t"
  7556. #ifdef WOLFSSL_KEIL
  7557. "muls r6, r7, r6\n\t"
  7558. #elif defined(__clang__)
  7559. "muls r6, r7\n\t"
  7560. #else
  7561. "mul r6, r7\n\t"
  7562. #endif
  7563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7564. "lsrs r7, r6, #16\n\t"
  7565. #else
  7566. "lsr r7, r6, #16\n\t"
  7567. #endif
  7568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7569. "lsls r6, r6, #16\n\t"
  7570. #else
  7571. "lsl r6, r6, #16\n\t"
  7572. #endif
  7573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7574. "adds r4, r4, r6\n\t"
  7575. #else
  7576. "add r4, r4, r6\n\t"
  7577. #endif
  7578. #ifdef WOLFSSL_KEIL
  7579. "adcs r5, r5, r7\n\t"
  7580. #elif defined(__clang__)
  7581. "adcs r5, r7\n\t"
  7582. #else
  7583. "adc r5, r7\n\t"
  7584. #endif
  7585. #ifdef WOLFSSL_KEIL
  7586. "adcs r3, r3, %[r]\n\t"
  7587. #elif defined(__clang__)
  7588. "adcs r3, %[r]\n\t"
  7589. #else
  7590. "adc r3, %[r]\n\t"
  7591. #endif
  7592. "# A[5] * B[5]\n\t"
  7593. "mov %[a], r9\n\t"
  7594. "mov %[b], r10\n\t"
  7595. "ldr %[a], [%[a], #20]\n\t"
  7596. "ldr %[b], [%[b], #20]\n\t"
  7597. "uxth r6, %[a]\n\t"
  7598. "uxth r7, %[b]\n\t"
  7599. #ifdef WOLFSSL_KEIL
  7600. "muls r7, r6, r7\n\t"
  7601. #elif defined(__clang__)
  7602. "muls r7, r6\n\t"
  7603. #else
  7604. "mul r7, r6\n\t"
  7605. #endif
  7606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7607. "adds r4, r4, r7\n\t"
  7608. #else
  7609. "add r4, r4, r7\n\t"
  7610. #endif
  7611. #ifdef WOLFSSL_KEIL
  7612. "adcs r5, r5, %[r]\n\t"
  7613. #elif defined(__clang__)
  7614. "adcs r5, %[r]\n\t"
  7615. #else
  7616. "adc r5, %[r]\n\t"
  7617. #endif
  7618. #ifdef WOLFSSL_KEIL
  7619. "adcs r3, r3, %[r]\n\t"
  7620. #elif defined(__clang__)
  7621. "adcs r3, %[r]\n\t"
  7622. #else
  7623. "adc r3, %[r]\n\t"
  7624. #endif
  7625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7626. "lsrs r7, %[b], #16\n\t"
  7627. #else
  7628. "lsr r7, %[b], #16\n\t"
  7629. #endif
  7630. #ifdef WOLFSSL_KEIL
  7631. "muls r6, r7, r6\n\t"
  7632. #elif defined(__clang__)
  7633. "muls r6, r7\n\t"
  7634. #else
  7635. "mul r6, r7\n\t"
  7636. #endif
  7637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7638. "lsrs r7, r6, #16\n\t"
  7639. #else
  7640. "lsr r7, r6, #16\n\t"
  7641. #endif
  7642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7643. "lsls r6, r6, #16\n\t"
  7644. #else
  7645. "lsl r6, r6, #16\n\t"
  7646. #endif
  7647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7648. "adds r4, r4, r6\n\t"
  7649. #else
  7650. "add r4, r4, r6\n\t"
  7651. #endif
  7652. #ifdef WOLFSSL_KEIL
  7653. "adcs r5, r5, r7\n\t"
  7654. #elif defined(__clang__)
  7655. "adcs r5, r7\n\t"
  7656. #else
  7657. "adc r5, r7\n\t"
  7658. #endif
  7659. #ifdef WOLFSSL_KEIL
  7660. "adcs r3, r3, %[r]\n\t"
  7661. #elif defined(__clang__)
  7662. "adcs r3, %[r]\n\t"
  7663. #else
  7664. "adc r3, %[r]\n\t"
  7665. #endif
  7666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7667. "lsrs r6, %[a], #16\n\t"
  7668. #else
  7669. "lsr r6, %[a], #16\n\t"
  7670. #endif
  7671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7672. "lsrs r7, %[b], #16\n\t"
  7673. #else
  7674. "lsr r7, %[b], #16\n\t"
  7675. #endif
  7676. #ifdef WOLFSSL_KEIL
  7677. "muls r7, r6, r7\n\t"
  7678. #elif defined(__clang__)
  7679. "muls r7, r6\n\t"
  7680. #else
  7681. "mul r7, r6\n\t"
  7682. #endif
  7683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7684. "adds r5, r5, r7\n\t"
  7685. #else
  7686. "add r5, r5, r7\n\t"
  7687. #endif
  7688. #ifdef WOLFSSL_KEIL
  7689. "adcs r3, r3, %[r]\n\t"
  7690. #elif defined(__clang__)
  7691. "adcs r3, %[r]\n\t"
  7692. #else
  7693. "adc r3, %[r]\n\t"
  7694. #endif
  7695. "uxth r7, %[b]\n\t"
  7696. #ifdef WOLFSSL_KEIL
  7697. "muls r6, r7, r6\n\t"
  7698. #elif defined(__clang__)
  7699. "muls r6, r7\n\t"
  7700. #else
  7701. "mul r6, r7\n\t"
  7702. #endif
  7703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7704. "lsrs r7, r6, #16\n\t"
  7705. #else
  7706. "lsr r7, r6, #16\n\t"
  7707. #endif
  7708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7709. "lsls r6, r6, #16\n\t"
  7710. #else
  7711. "lsl r6, r6, #16\n\t"
  7712. #endif
  7713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7714. "adds r4, r4, r6\n\t"
  7715. #else
  7716. "add r4, r4, r6\n\t"
  7717. #endif
  7718. #ifdef WOLFSSL_KEIL
  7719. "adcs r5, r5, r7\n\t"
  7720. #elif defined(__clang__)
  7721. "adcs r5, r7\n\t"
  7722. #else
  7723. "adc r5, r7\n\t"
  7724. #endif
  7725. #ifdef WOLFSSL_KEIL
  7726. "adcs r3, r3, %[r]\n\t"
  7727. #elif defined(__clang__)
  7728. "adcs r3, %[r]\n\t"
  7729. #else
  7730. "adc r3, %[r]\n\t"
  7731. #endif
  7732. "# A[4] * B[6]\n\t"
  7733. "mov %[a], r9\n\t"
  7734. "mov %[b], r10\n\t"
  7735. "ldr %[a], [%[a], #16]\n\t"
  7736. "ldr %[b], [%[b], #24]\n\t"
  7737. "uxth r6, %[a]\n\t"
  7738. "uxth r7, %[b]\n\t"
  7739. #ifdef WOLFSSL_KEIL
  7740. "muls r7, r6, r7\n\t"
  7741. #elif defined(__clang__)
  7742. "muls r7, r6\n\t"
  7743. #else
  7744. "mul r7, r6\n\t"
  7745. #endif
  7746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7747. "adds r4, r4, r7\n\t"
  7748. #else
  7749. "add r4, r4, r7\n\t"
  7750. #endif
  7751. #ifdef WOLFSSL_KEIL
  7752. "adcs r5, r5, %[r]\n\t"
  7753. #elif defined(__clang__)
  7754. "adcs r5, %[r]\n\t"
  7755. #else
  7756. "adc r5, %[r]\n\t"
  7757. #endif
  7758. #ifdef WOLFSSL_KEIL
  7759. "adcs r3, r3, %[r]\n\t"
  7760. #elif defined(__clang__)
  7761. "adcs r3, %[r]\n\t"
  7762. #else
  7763. "adc r3, %[r]\n\t"
  7764. #endif
  7765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7766. "lsrs r7, %[b], #16\n\t"
  7767. #else
  7768. "lsr r7, %[b], #16\n\t"
  7769. #endif
  7770. #ifdef WOLFSSL_KEIL
  7771. "muls r6, r7, r6\n\t"
  7772. #elif defined(__clang__)
  7773. "muls r6, r7\n\t"
  7774. #else
  7775. "mul r6, r7\n\t"
  7776. #endif
  7777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7778. "lsrs r7, r6, #16\n\t"
  7779. #else
  7780. "lsr r7, r6, #16\n\t"
  7781. #endif
  7782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7783. "lsls r6, r6, #16\n\t"
  7784. #else
  7785. "lsl r6, r6, #16\n\t"
  7786. #endif
  7787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7788. "adds r4, r4, r6\n\t"
  7789. #else
  7790. "add r4, r4, r6\n\t"
  7791. #endif
  7792. #ifdef WOLFSSL_KEIL
  7793. "adcs r5, r5, r7\n\t"
  7794. #elif defined(__clang__)
  7795. "adcs r5, r7\n\t"
  7796. #else
  7797. "adc r5, r7\n\t"
  7798. #endif
  7799. #ifdef WOLFSSL_KEIL
  7800. "adcs r3, r3, %[r]\n\t"
  7801. #elif defined(__clang__)
  7802. "adcs r3, %[r]\n\t"
  7803. #else
  7804. "adc r3, %[r]\n\t"
  7805. #endif
  7806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7807. "lsrs r6, %[a], #16\n\t"
  7808. #else
  7809. "lsr r6, %[a], #16\n\t"
  7810. #endif
  7811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7812. "lsrs r7, %[b], #16\n\t"
  7813. #else
  7814. "lsr r7, %[b], #16\n\t"
  7815. #endif
  7816. #ifdef WOLFSSL_KEIL
  7817. "muls r7, r6, r7\n\t"
  7818. #elif defined(__clang__)
  7819. "muls r7, r6\n\t"
  7820. #else
  7821. "mul r7, r6\n\t"
  7822. #endif
  7823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7824. "adds r5, r5, r7\n\t"
  7825. #else
  7826. "add r5, r5, r7\n\t"
  7827. #endif
  7828. #ifdef WOLFSSL_KEIL
  7829. "adcs r3, r3, %[r]\n\t"
  7830. #elif defined(__clang__)
  7831. "adcs r3, %[r]\n\t"
  7832. #else
  7833. "adc r3, %[r]\n\t"
  7834. #endif
  7835. "uxth r7, %[b]\n\t"
  7836. #ifdef WOLFSSL_KEIL
  7837. "muls r6, r7, r6\n\t"
  7838. #elif defined(__clang__)
  7839. "muls r6, r7\n\t"
  7840. #else
  7841. "mul r6, r7\n\t"
  7842. #endif
  7843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7844. "lsrs r7, r6, #16\n\t"
  7845. #else
  7846. "lsr r7, r6, #16\n\t"
  7847. #endif
  7848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7849. "lsls r6, r6, #16\n\t"
  7850. #else
  7851. "lsl r6, r6, #16\n\t"
  7852. #endif
  7853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7854. "adds r4, r4, r6\n\t"
  7855. #else
  7856. "add r4, r4, r6\n\t"
  7857. #endif
  7858. #ifdef WOLFSSL_KEIL
  7859. "adcs r5, r5, r7\n\t"
  7860. #elif defined(__clang__)
  7861. "adcs r5, r7\n\t"
  7862. #else
  7863. "adc r5, r7\n\t"
  7864. #endif
  7865. #ifdef WOLFSSL_KEIL
  7866. "adcs r3, r3, %[r]\n\t"
  7867. #elif defined(__clang__)
  7868. "adcs r3, %[r]\n\t"
  7869. #else
  7870. "adc r3, %[r]\n\t"
  7871. #endif
  7872. "# A[3] * B[7]\n\t"
  7873. "mov %[a], r9\n\t"
  7874. "mov %[b], r10\n\t"
  7875. "ldr %[a], [%[a], #12]\n\t"
  7876. "ldr %[b], [%[b], #28]\n\t"
  7877. "uxth r6, %[a]\n\t"
  7878. "uxth r7, %[b]\n\t"
  7879. #ifdef WOLFSSL_KEIL
  7880. "muls r7, r6, r7\n\t"
  7881. #elif defined(__clang__)
  7882. "muls r7, r6\n\t"
  7883. #else
  7884. "mul r7, r6\n\t"
  7885. #endif
  7886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7887. "adds r4, r4, r7\n\t"
  7888. #else
  7889. "add r4, r4, r7\n\t"
  7890. #endif
  7891. #ifdef WOLFSSL_KEIL
  7892. "adcs r5, r5, %[r]\n\t"
  7893. #elif defined(__clang__)
  7894. "adcs r5, %[r]\n\t"
  7895. #else
  7896. "adc r5, %[r]\n\t"
  7897. #endif
  7898. #ifdef WOLFSSL_KEIL
  7899. "adcs r3, r3, %[r]\n\t"
  7900. #elif defined(__clang__)
  7901. "adcs r3, %[r]\n\t"
  7902. #else
  7903. "adc r3, %[r]\n\t"
  7904. #endif
  7905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7906. "lsrs r7, %[b], #16\n\t"
  7907. #else
  7908. "lsr r7, %[b], #16\n\t"
  7909. #endif
  7910. #ifdef WOLFSSL_KEIL
  7911. "muls r6, r7, r6\n\t"
  7912. #elif defined(__clang__)
  7913. "muls r6, r7\n\t"
  7914. #else
  7915. "mul r6, r7\n\t"
  7916. #endif
  7917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7918. "lsrs r7, r6, #16\n\t"
  7919. #else
  7920. "lsr r7, r6, #16\n\t"
  7921. #endif
  7922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7923. "lsls r6, r6, #16\n\t"
  7924. #else
  7925. "lsl r6, r6, #16\n\t"
  7926. #endif
  7927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7928. "adds r4, r4, r6\n\t"
  7929. #else
  7930. "add r4, r4, r6\n\t"
  7931. #endif
  7932. #ifdef WOLFSSL_KEIL
  7933. "adcs r5, r5, r7\n\t"
  7934. #elif defined(__clang__)
  7935. "adcs r5, r7\n\t"
  7936. #else
  7937. "adc r5, r7\n\t"
  7938. #endif
  7939. #ifdef WOLFSSL_KEIL
  7940. "adcs r3, r3, %[r]\n\t"
  7941. #elif defined(__clang__)
  7942. "adcs r3, %[r]\n\t"
  7943. #else
  7944. "adc r3, %[r]\n\t"
  7945. #endif
  7946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7947. "lsrs r6, %[a], #16\n\t"
  7948. #else
  7949. "lsr r6, %[a], #16\n\t"
  7950. #endif
  7951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7952. "lsrs r7, %[b], #16\n\t"
  7953. #else
  7954. "lsr r7, %[b], #16\n\t"
  7955. #endif
  7956. #ifdef WOLFSSL_KEIL
  7957. "muls r7, r6, r7\n\t"
  7958. #elif defined(__clang__)
  7959. "muls r7, r6\n\t"
  7960. #else
  7961. "mul r7, r6\n\t"
  7962. #endif
  7963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7964. "adds r5, r5, r7\n\t"
  7965. #else
  7966. "add r5, r5, r7\n\t"
  7967. #endif
  7968. #ifdef WOLFSSL_KEIL
  7969. "adcs r3, r3, %[r]\n\t"
  7970. #elif defined(__clang__)
  7971. "adcs r3, %[r]\n\t"
  7972. #else
  7973. "adc r3, %[r]\n\t"
  7974. #endif
  7975. "uxth r7, %[b]\n\t"
  7976. #ifdef WOLFSSL_KEIL
  7977. "muls r6, r7, r6\n\t"
  7978. #elif defined(__clang__)
  7979. "muls r6, r7\n\t"
  7980. #else
  7981. "mul r6, r7\n\t"
  7982. #endif
  7983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7984. "lsrs r7, r6, #16\n\t"
  7985. #else
  7986. "lsr r7, r6, #16\n\t"
  7987. #endif
  7988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7989. "lsls r6, r6, #16\n\t"
  7990. #else
  7991. "lsl r6, r6, #16\n\t"
  7992. #endif
  7993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7994. "adds r4, r4, r6\n\t"
  7995. #else
  7996. "add r4, r4, r6\n\t"
  7997. #endif
  7998. #ifdef WOLFSSL_KEIL
  7999. "adcs r5, r5, r7\n\t"
  8000. #elif defined(__clang__)
  8001. "adcs r5, r7\n\t"
  8002. #else
  8003. "adc r5, r7\n\t"
  8004. #endif
  8005. #ifdef WOLFSSL_KEIL
  8006. "adcs r3, r3, %[r]\n\t"
  8007. #elif defined(__clang__)
  8008. "adcs r3, %[r]\n\t"
  8009. #else
  8010. "adc r3, %[r]\n\t"
  8011. #endif
  8012. "mov %[r], r8\n\t"
  8013. "str r4, [%[r], #40]\n\t"
  8014. "movs %[r], #0\n\t"
  8015. "# A[4] * B[7]\n\t"
  8016. "movs r4, #0\n\t"
  8017. "mov %[a], r9\n\t"
  8018. "mov %[b], r10\n\t"
  8019. "ldr %[a], [%[a], #16]\n\t"
  8020. "ldr %[b], [%[b], #28]\n\t"
  8021. "uxth r6, %[a]\n\t"
  8022. "uxth r7, %[b]\n\t"
  8023. #ifdef WOLFSSL_KEIL
  8024. "muls r7, r6, r7\n\t"
  8025. #elif defined(__clang__)
  8026. "muls r7, r6\n\t"
  8027. #else
  8028. "mul r7, r6\n\t"
  8029. #endif
  8030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8031. "adds r5, r5, r7\n\t"
  8032. #else
  8033. "add r5, r5, r7\n\t"
  8034. #endif
  8035. #ifdef WOLFSSL_KEIL
  8036. "adcs r3, r3, %[r]\n\t"
  8037. #elif defined(__clang__)
  8038. "adcs r3, %[r]\n\t"
  8039. #else
  8040. "adc r3, %[r]\n\t"
  8041. #endif
  8042. #ifdef WOLFSSL_KEIL
  8043. "adcs r4, r4, %[r]\n\t"
  8044. #elif defined(__clang__)
  8045. "adcs r4, %[r]\n\t"
  8046. #else
  8047. "adc r4, %[r]\n\t"
  8048. #endif
  8049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8050. "lsrs r7, %[b], #16\n\t"
  8051. #else
  8052. "lsr r7, %[b], #16\n\t"
  8053. #endif
  8054. #ifdef WOLFSSL_KEIL
  8055. "muls r6, r7, r6\n\t"
  8056. #elif defined(__clang__)
  8057. "muls r6, r7\n\t"
  8058. #else
  8059. "mul r6, r7\n\t"
  8060. #endif
  8061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8062. "lsrs r7, r6, #16\n\t"
  8063. #else
  8064. "lsr r7, r6, #16\n\t"
  8065. #endif
  8066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8067. "lsls r6, r6, #16\n\t"
  8068. #else
  8069. "lsl r6, r6, #16\n\t"
  8070. #endif
  8071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8072. "adds r5, r5, r6\n\t"
  8073. #else
  8074. "add r5, r5, r6\n\t"
  8075. #endif
  8076. #ifdef WOLFSSL_KEIL
  8077. "adcs r3, r3, r7\n\t"
  8078. #elif defined(__clang__)
  8079. "adcs r3, r7\n\t"
  8080. #else
  8081. "adc r3, r7\n\t"
  8082. #endif
  8083. #ifdef WOLFSSL_KEIL
  8084. "adcs r4, r4, %[r]\n\t"
  8085. #elif defined(__clang__)
  8086. "adcs r4, %[r]\n\t"
  8087. #else
  8088. "adc r4, %[r]\n\t"
  8089. #endif
  8090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8091. "lsrs r6, %[a], #16\n\t"
  8092. #else
  8093. "lsr r6, %[a], #16\n\t"
  8094. #endif
  8095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8096. "lsrs r7, %[b], #16\n\t"
  8097. #else
  8098. "lsr r7, %[b], #16\n\t"
  8099. #endif
  8100. #ifdef WOLFSSL_KEIL
  8101. "muls r7, r6, r7\n\t"
  8102. #elif defined(__clang__)
  8103. "muls r7, r6\n\t"
  8104. #else
  8105. "mul r7, r6\n\t"
  8106. #endif
  8107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8108. "adds r3, r3, r7\n\t"
  8109. #else
  8110. "add r3, r3, r7\n\t"
  8111. #endif
  8112. #ifdef WOLFSSL_KEIL
  8113. "adcs r4, r4, %[r]\n\t"
  8114. #elif defined(__clang__)
  8115. "adcs r4, %[r]\n\t"
  8116. #else
  8117. "adc r4, %[r]\n\t"
  8118. #endif
  8119. "uxth r7, %[b]\n\t"
  8120. #ifdef WOLFSSL_KEIL
  8121. "muls r6, r7, r6\n\t"
  8122. #elif defined(__clang__)
  8123. "muls r6, r7\n\t"
  8124. #else
  8125. "mul r6, r7\n\t"
  8126. #endif
  8127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8128. "lsrs r7, r6, #16\n\t"
  8129. #else
  8130. "lsr r7, r6, #16\n\t"
  8131. #endif
  8132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8133. "lsls r6, r6, #16\n\t"
  8134. #else
  8135. "lsl r6, r6, #16\n\t"
  8136. #endif
  8137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8138. "adds r5, r5, r6\n\t"
  8139. #else
  8140. "add r5, r5, r6\n\t"
  8141. #endif
  8142. #ifdef WOLFSSL_KEIL
  8143. "adcs r3, r3, r7\n\t"
  8144. #elif defined(__clang__)
  8145. "adcs r3, r7\n\t"
  8146. #else
  8147. "adc r3, r7\n\t"
  8148. #endif
  8149. #ifdef WOLFSSL_KEIL
  8150. "adcs r4, r4, %[r]\n\t"
  8151. #elif defined(__clang__)
  8152. "adcs r4, %[r]\n\t"
  8153. #else
  8154. "adc r4, %[r]\n\t"
  8155. #endif
  8156. "# A[5] * B[6]\n\t"
  8157. "mov %[a], r9\n\t"
  8158. "mov %[b], r10\n\t"
  8159. "ldr %[a], [%[a], #20]\n\t"
  8160. "ldr %[b], [%[b], #24]\n\t"
  8161. "uxth r6, %[a]\n\t"
  8162. "uxth r7, %[b]\n\t"
  8163. #ifdef WOLFSSL_KEIL
  8164. "muls r7, r6, r7\n\t"
  8165. #elif defined(__clang__)
  8166. "muls r7, r6\n\t"
  8167. #else
  8168. "mul r7, r6\n\t"
  8169. #endif
  8170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8171. "adds r5, r5, r7\n\t"
  8172. #else
  8173. "add r5, r5, r7\n\t"
  8174. #endif
  8175. #ifdef WOLFSSL_KEIL
  8176. "adcs r3, r3, %[r]\n\t"
  8177. #elif defined(__clang__)
  8178. "adcs r3, %[r]\n\t"
  8179. #else
  8180. "adc r3, %[r]\n\t"
  8181. #endif
  8182. #ifdef WOLFSSL_KEIL
  8183. "adcs r4, r4, %[r]\n\t"
  8184. #elif defined(__clang__)
  8185. "adcs r4, %[r]\n\t"
  8186. #else
  8187. "adc r4, %[r]\n\t"
  8188. #endif
  8189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8190. "lsrs r7, %[b], #16\n\t"
  8191. #else
  8192. "lsr r7, %[b], #16\n\t"
  8193. #endif
  8194. #ifdef WOLFSSL_KEIL
  8195. "muls r6, r7, r6\n\t"
  8196. #elif defined(__clang__)
  8197. "muls r6, r7\n\t"
  8198. #else
  8199. "mul r6, r7\n\t"
  8200. #endif
  8201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8202. "lsrs r7, r6, #16\n\t"
  8203. #else
  8204. "lsr r7, r6, #16\n\t"
  8205. #endif
  8206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8207. "lsls r6, r6, #16\n\t"
  8208. #else
  8209. "lsl r6, r6, #16\n\t"
  8210. #endif
  8211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8212. "adds r5, r5, r6\n\t"
  8213. #else
  8214. "add r5, r5, r6\n\t"
  8215. #endif
  8216. #ifdef WOLFSSL_KEIL
  8217. "adcs r3, r3, r7\n\t"
  8218. #elif defined(__clang__)
  8219. "adcs r3, r7\n\t"
  8220. #else
  8221. "adc r3, r7\n\t"
  8222. #endif
  8223. #ifdef WOLFSSL_KEIL
  8224. "adcs r4, r4, %[r]\n\t"
  8225. #elif defined(__clang__)
  8226. "adcs r4, %[r]\n\t"
  8227. #else
  8228. "adc r4, %[r]\n\t"
  8229. #endif
  8230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8231. "lsrs r6, %[a], #16\n\t"
  8232. #else
  8233. "lsr r6, %[a], #16\n\t"
  8234. #endif
  8235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8236. "lsrs r7, %[b], #16\n\t"
  8237. #else
  8238. "lsr r7, %[b], #16\n\t"
  8239. #endif
  8240. #ifdef WOLFSSL_KEIL
  8241. "muls r7, r6, r7\n\t"
  8242. #elif defined(__clang__)
  8243. "muls r7, r6\n\t"
  8244. #else
  8245. "mul r7, r6\n\t"
  8246. #endif
  8247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8248. "adds r3, r3, r7\n\t"
  8249. #else
  8250. "add r3, r3, r7\n\t"
  8251. #endif
  8252. #ifdef WOLFSSL_KEIL
  8253. "adcs r4, r4, %[r]\n\t"
  8254. #elif defined(__clang__)
  8255. "adcs r4, %[r]\n\t"
  8256. #else
  8257. "adc r4, %[r]\n\t"
  8258. #endif
  8259. "uxth r7, %[b]\n\t"
  8260. #ifdef WOLFSSL_KEIL
  8261. "muls r6, r7, r6\n\t"
  8262. #elif defined(__clang__)
  8263. "muls r6, r7\n\t"
  8264. #else
  8265. "mul r6, r7\n\t"
  8266. #endif
  8267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8268. "lsrs r7, r6, #16\n\t"
  8269. #else
  8270. "lsr r7, r6, #16\n\t"
  8271. #endif
  8272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8273. "lsls r6, r6, #16\n\t"
  8274. #else
  8275. "lsl r6, r6, #16\n\t"
  8276. #endif
  8277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8278. "adds r5, r5, r6\n\t"
  8279. #else
  8280. "add r5, r5, r6\n\t"
  8281. #endif
  8282. #ifdef WOLFSSL_KEIL
  8283. "adcs r3, r3, r7\n\t"
  8284. #elif defined(__clang__)
  8285. "adcs r3, r7\n\t"
  8286. #else
  8287. "adc r3, r7\n\t"
  8288. #endif
  8289. #ifdef WOLFSSL_KEIL
  8290. "adcs r4, r4, %[r]\n\t"
  8291. #elif defined(__clang__)
  8292. "adcs r4, %[r]\n\t"
  8293. #else
  8294. "adc r4, %[r]\n\t"
  8295. #endif
  8296. "# A[6] * B[5]\n\t"
  8297. "mov %[a], r9\n\t"
  8298. "mov %[b], r10\n\t"
  8299. "ldr %[a], [%[a], #24]\n\t"
  8300. "ldr %[b], [%[b], #20]\n\t"
  8301. "uxth r6, %[a]\n\t"
  8302. "uxth r7, %[b]\n\t"
  8303. #ifdef WOLFSSL_KEIL
  8304. "muls r7, r6, r7\n\t"
  8305. #elif defined(__clang__)
  8306. "muls r7, r6\n\t"
  8307. #else
  8308. "mul r7, r6\n\t"
  8309. #endif
  8310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8311. "adds r5, r5, r7\n\t"
  8312. #else
  8313. "add r5, r5, r7\n\t"
  8314. #endif
  8315. #ifdef WOLFSSL_KEIL
  8316. "adcs r3, r3, %[r]\n\t"
  8317. #elif defined(__clang__)
  8318. "adcs r3, %[r]\n\t"
  8319. #else
  8320. "adc r3, %[r]\n\t"
  8321. #endif
  8322. #ifdef WOLFSSL_KEIL
  8323. "adcs r4, r4, %[r]\n\t"
  8324. #elif defined(__clang__)
  8325. "adcs r4, %[r]\n\t"
  8326. #else
  8327. "adc r4, %[r]\n\t"
  8328. #endif
  8329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8330. "lsrs r7, %[b], #16\n\t"
  8331. #else
  8332. "lsr r7, %[b], #16\n\t"
  8333. #endif
  8334. #ifdef WOLFSSL_KEIL
  8335. "muls r6, r7, r6\n\t"
  8336. #elif defined(__clang__)
  8337. "muls r6, r7\n\t"
  8338. #else
  8339. "mul r6, r7\n\t"
  8340. #endif
  8341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8342. "lsrs r7, r6, #16\n\t"
  8343. #else
  8344. "lsr r7, r6, #16\n\t"
  8345. #endif
  8346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8347. "lsls r6, r6, #16\n\t"
  8348. #else
  8349. "lsl r6, r6, #16\n\t"
  8350. #endif
  8351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8352. "adds r5, r5, r6\n\t"
  8353. #else
  8354. "add r5, r5, r6\n\t"
  8355. #endif
  8356. #ifdef WOLFSSL_KEIL
  8357. "adcs r3, r3, r7\n\t"
  8358. #elif defined(__clang__)
  8359. "adcs r3, r7\n\t"
  8360. #else
  8361. "adc r3, r7\n\t"
  8362. #endif
  8363. #ifdef WOLFSSL_KEIL
  8364. "adcs r4, r4, %[r]\n\t"
  8365. #elif defined(__clang__)
  8366. "adcs r4, %[r]\n\t"
  8367. #else
  8368. "adc r4, %[r]\n\t"
  8369. #endif
  8370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8371. "lsrs r6, %[a], #16\n\t"
  8372. #else
  8373. "lsr r6, %[a], #16\n\t"
  8374. #endif
  8375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8376. "lsrs r7, %[b], #16\n\t"
  8377. #else
  8378. "lsr r7, %[b], #16\n\t"
  8379. #endif
  8380. #ifdef WOLFSSL_KEIL
  8381. "muls r7, r6, r7\n\t"
  8382. #elif defined(__clang__)
  8383. "muls r7, r6\n\t"
  8384. #else
  8385. "mul r7, r6\n\t"
  8386. #endif
  8387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8388. "adds r3, r3, r7\n\t"
  8389. #else
  8390. "add r3, r3, r7\n\t"
  8391. #endif
  8392. #ifdef WOLFSSL_KEIL
  8393. "adcs r4, r4, %[r]\n\t"
  8394. #elif defined(__clang__)
  8395. "adcs r4, %[r]\n\t"
  8396. #else
  8397. "adc r4, %[r]\n\t"
  8398. #endif
  8399. "uxth r7, %[b]\n\t"
  8400. #ifdef WOLFSSL_KEIL
  8401. "muls r6, r7, r6\n\t"
  8402. #elif defined(__clang__)
  8403. "muls r6, r7\n\t"
  8404. #else
  8405. "mul r6, r7\n\t"
  8406. #endif
  8407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8408. "lsrs r7, r6, #16\n\t"
  8409. #else
  8410. "lsr r7, r6, #16\n\t"
  8411. #endif
  8412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8413. "lsls r6, r6, #16\n\t"
  8414. #else
  8415. "lsl r6, r6, #16\n\t"
  8416. #endif
  8417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8418. "adds r5, r5, r6\n\t"
  8419. #else
  8420. "add r5, r5, r6\n\t"
  8421. #endif
  8422. #ifdef WOLFSSL_KEIL
  8423. "adcs r3, r3, r7\n\t"
  8424. #elif defined(__clang__)
  8425. "adcs r3, r7\n\t"
  8426. #else
  8427. "adc r3, r7\n\t"
  8428. #endif
  8429. #ifdef WOLFSSL_KEIL
  8430. "adcs r4, r4, %[r]\n\t"
  8431. #elif defined(__clang__)
  8432. "adcs r4, %[r]\n\t"
  8433. #else
  8434. "adc r4, %[r]\n\t"
  8435. #endif
  8436. "# A[7] * B[4]\n\t"
  8437. "mov %[a], r9\n\t"
  8438. "mov %[b], r10\n\t"
  8439. "ldr %[a], [%[a], #28]\n\t"
  8440. "ldr %[b], [%[b], #16]\n\t"
  8441. "uxth r6, %[a]\n\t"
  8442. "uxth r7, %[b]\n\t"
  8443. #ifdef WOLFSSL_KEIL
  8444. "muls r7, r6, r7\n\t"
  8445. #elif defined(__clang__)
  8446. "muls r7, r6\n\t"
  8447. #else
  8448. "mul r7, r6\n\t"
  8449. #endif
  8450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8451. "adds r5, r5, r7\n\t"
  8452. #else
  8453. "add r5, r5, r7\n\t"
  8454. #endif
  8455. #ifdef WOLFSSL_KEIL
  8456. "adcs r3, r3, %[r]\n\t"
  8457. #elif defined(__clang__)
  8458. "adcs r3, %[r]\n\t"
  8459. #else
  8460. "adc r3, %[r]\n\t"
  8461. #endif
  8462. #ifdef WOLFSSL_KEIL
  8463. "adcs r4, r4, %[r]\n\t"
  8464. #elif defined(__clang__)
  8465. "adcs r4, %[r]\n\t"
  8466. #else
  8467. "adc r4, %[r]\n\t"
  8468. #endif
  8469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8470. "lsrs r7, %[b], #16\n\t"
  8471. #else
  8472. "lsr r7, %[b], #16\n\t"
  8473. #endif
  8474. #ifdef WOLFSSL_KEIL
  8475. "muls r6, r7, r6\n\t"
  8476. #elif defined(__clang__)
  8477. "muls r6, r7\n\t"
  8478. #else
  8479. "mul r6, r7\n\t"
  8480. #endif
  8481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8482. "lsrs r7, r6, #16\n\t"
  8483. #else
  8484. "lsr r7, r6, #16\n\t"
  8485. #endif
  8486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8487. "lsls r6, r6, #16\n\t"
  8488. #else
  8489. "lsl r6, r6, #16\n\t"
  8490. #endif
  8491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8492. "adds r5, r5, r6\n\t"
  8493. #else
  8494. "add r5, r5, r6\n\t"
  8495. #endif
  8496. #ifdef WOLFSSL_KEIL
  8497. "adcs r3, r3, r7\n\t"
  8498. #elif defined(__clang__)
  8499. "adcs r3, r7\n\t"
  8500. #else
  8501. "adc r3, r7\n\t"
  8502. #endif
  8503. #ifdef WOLFSSL_KEIL
  8504. "adcs r4, r4, %[r]\n\t"
  8505. #elif defined(__clang__)
  8506. "adcs r4, %[r]\n\t"
  8507. #else
  8508. "adc r4, %[r]\n\t"
  8509. #endif
  8510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8511. "lsrs r6, %[a], #16\n\t"
  8512. #else
  8513. "lsr r6, %[a], #16\n\t"
  8514. #endif
  8515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8516. "lsrs r7, %[b], #16\n\t"
  8517. #else
  8518. "lsr r7, %[b], #16\n\t"
  8519. #endif
  8520. #ifdef WOLFSSL_KEIL
  8521. "muls r7, r6, r7\n\t"
  8522. #elif defined(__clang__)
  8523. "muls r7, r6\n\t"
  8524. #else
  8525. "mul r7, r6\n\t"
  8526. #endif
  8527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8528. "adds r3, r3, r7\n\t"
  8529. #else
  8530. "add r3, r3, r7\n\t"
  8531. #endif
  8532. #ifdef WOLFSSL_KEIL
  8533. "adcs r4, r4, %[r]\n\t"
  8534. #elif defined(__clang__)
  8535. "adcs r4, %[r]\n\t"
  8536. #else
  8537. "adc r4, %[r]\n\t"
  8538. #endif
  8539. "uxth r7, %[b]\n\t"
  8540. #ifdef WOLFSSL_KEIL
  8541. "muls r6, r7, r6\n\t"
  8542. #elif defined(__clang__)
  8543. "muls r6, r7\n\t"
  8544. #else
  8545. "mul r6, r7\n\t"
  8546. #endif
  8547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8548. "lsrs r7, r6, #16\n\t"
  8549. #else
  8550. "lsr r7, r6, #16\n\t"
  8551. #endif
  8552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8553. "lsls r6, r6, #16\n\t"
  8554. #else
  8555. "lsl r6, r6, #16\n\t"
  8556. #endif
  8557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8558. "adds r5, r5, r6\n\t"
  8559. #else
  8560. "add r5, r5, r6\n\t"
  8561. #endif
  8562. #ifdef WOLFSSL_KEIL
  8563. "adcs r3, r3, r7\n\t"
  8564. #elif defined(__clang__)
  8565. "adcs r3, r7\n\t"
  8566. #else
  8567. "adc r3, r7\n\t"
  8568. #endif
  8569. #ifdef WOLFSSL_KEIL
  8570. "adcs r4, r4, %[r]\n\t"
  8571. #elif defined(__clang__)
  8572. "adcs r4, %[r]\n\t"
  8573. #else
  8574. "adc r4, %[r]\n\t"
  8575. #endif
  8576. "mov %[r], r8\n\t"
  8577. "str r5, [%[r], #44]\n\t"
  8578. "movs %[r], #0\n\t"
  8579. "# A[7] * B[5]\n\t"
  8580. "movs r5, #0\n\t"
  8581. "mov %[a], r9\n\t"
  8582. "mov %[b], r10\n\t"
  8583. "ldr %[a], [%[a], #28]\n\t"
  8584. "ldr %[b], [%[b], #20]\n\t"
  8585. "uxth r6, %[a]\n\t"
  8586. "uxth r7, %[b]\n\t"
  8587. #ifdef WOLFSSL_KEIL
  8588. "muls r7, r6, r7\n\t"
  8589. #elif defined(__clang__)
  8590. "muls r7, r6\n\t"
  8591. #else
  8592. "mul r7, r6\n\t"
  8593. #endif
  8594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8595. "adds r3, r3, r7\n\t"
  8596. #else
  8597. "add r3, r3, r7\n\t"
  8598. #endif
  8599. #ifdef WOLFSSL_KEIL
  8600. "adcs r4, r4, %[r]\n\t"
  8601. #elif defined(__clang__)
  8602. "adcs r4, %[r]\n\t"
  8603. #else
  8604. "adc r4, %[r]\n\t"
  8605. #endif
  8606. #ifdef WOLFSSL_KEIL
  8607. "adcs r5, r5, %[r]\n\t"
  8608. #elif defined(__clang__)
  8609. "adcs r5, %[r]\n\t"
  8610. #else
  8611. "adc r5, %[r]\n\t"
  8612. #endif
  8613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8614. "lsrs r7, %[b], #16\n\t"
  8615. #else
  8616. "lsr r7, %[b], #16\n\t"
  8617. #endif
  8618. #ifdef WOLFSSL_KEIL
  8619. "muls r6, r7, r6\n\t"
  8620. #elif defined(__clang__)
  8621. "muls r6, r7\n\t"
  8622. #else
  8623. "mul r6, r7\n\t"
  8624. #endif
  8625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8626. "lsrs r7, r6, #16\n\t"
  8627. #else
  8628. "lsr r7, r6, #16\n\t"
  8629. #endif
  8630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8631. "lsls r6, r6, #16\n\t"
  8632. #else
  8633. "lsl r6, r6, #16\n\t"
  8634. #endif
  8635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8636. "adds r3, r3, r6\n\t"
  8637. #else
  8638. "add r3, r3, r6\n\t"
  8639. #endif
  8640. #ifdef WOLFSSL_KEIL
  8641. "adcs r4, r4, r7\n\t"
  8642. #elif defined(__clang__)
  8643. "adcs r4, r7\n\t"
  8644. #else
  8645. "adc r4, r7\n\t"
  8646. #endif
  8647. #ifdef WOLFSSL_KEIL
  8648. "adcs r5, r5, %[r]\n\t"
  8649. #elif defined(__clang__)
  8650. "adcs r5, %[r]\n\t"
  8651. #else
  8652. "adc r5, %[r]\n\t"
  8653. #endif
  8654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8655. "lsrs r6, %[a], #16\n\t"
  8656. #else
  8657. "lsr r6, %[a], #16\n\t"
  8658. #endif
  8659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8660. "lsrs r7, %[b], #16\n\t"
  8661. #else
  8662. "lsr r7, %[b], #16\n\t"
  8663. #endif
  8664. #ifdef WOLFSSL_KEIL
  8665. "muls r7, r6, r7\n\t"
  8666. #elif defined(__clang__)
  8667. "muls r7, r6\n\t"
  8668. #else
  8669. "mul r7, r6\n\t"
  8670. #endif
  8671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8672. "adds r4, r4, r7\n\t"
  8673. #else
  8674. "add r4, r4, r7\n\t"
  8675. #endif
  8676. #ifdef WOLFSSL_KEIL
  8677. "adcs r5, r5, %[r]\n\t"
  8678. #elif defined(__clang__)
  8679. "adcs r5, %[r]\n\t"
  8680. #else
  8681. "adc r5, %[r]\n\t"
  8682. #endif
  8683. "uxth r7, %[b]\n\t"
  8684. #ifdef WOLFSSL_KEIL
  8685. "muls r6, r7, r6\n\t"
  8686. #elif defined(__clang__)
  8687. "muls r6, r7\n\t"
  8688. #else
  8689. "mul r6, r7\n\t"
  8690. #endif
  8691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8692. "lsrs r7, r6, #16\n\t"
  8693. #else
  8694. "lsr r7, r6, #16\n\t"
  8695. #endif
  8696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8697. "lsls r6, r6, #16\n\t"
  8698. #else
  8699. "lsl r6, r6, #16\n\t"
  8700. #endif
  8701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8702. "adds r3, r3, r6\n\t"
  8703. #else
  8704. "add r3, r3, r6\n\t"
  8705. #endif
  8706. #ifdef WOLFSSL_KEIL
  8707. "adcs r4, r4, r7\n\t"
  8708. #elif defined(__clang__)
  8709. "adcs r4, r7\n\t"
  8710. #else
  8711. "adc r4, r7\n\t"
  8712. #endif
  8713. #ifdef WOLFSSL_KEIL
  8714. "adcs r5, r5, %[r]\n\t"
  8715. #elif defined(__clang__)
  8716. "adcs r5, %[r]\n\t"
  8717. #else
  8718. "adc r5, %[r]\n\t"
  8719. #endif
  8720. "# A[6] * B[6]\n\t"
  8721. "mov %[a], r9\n\t"
  8722. "mov %[b], r10\n\t"
  8723. "ldr %[a], [%[a], #24]\n\t"
  8724. "ldr %[b], [%[b], #24]\n\t"
  8725. "uxth r6, %[a]\n\t"
  8726. "uxth r7, %[b]\n\t"
  8727. #ifdef WOLFSSL_KEIL
  8728. "muls r7, r6, r7\n\t"
  8729. #elif defined(__clang__)
  8730. "muls r7, r6\n\t"
  8731. #else
  8732. "mul r7, r6\n\t"
  8733. #endif
  8734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8735. "adds r3, r3, r7\n\t"
  8736. #else
  8737. "add r3, r3, r7\n\t"
  8738. #endif
  8739. #ifdef WOLFSSL_KEIL
  8740. "adcs r4, r4, %[r]\n\t"
  8741. #elif defined(__clang__)
  8742. "adcs r4, %[r]\n\t"
  8743. #else
  8744. "adc r4, %[r]\n\t"
  8745. #endif
  8746. #ifdef WOLFSSL_KEIL
  8747. "adcs r5, r5, %[r]\n\t"
  8748. #elif defined(__clang__)
  8749. "adcs r5, %[r]\n\t"
  8750. #else
  8751. "adc r5, %[r]\n\t"
  8752. #endif
  8753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8754. "lsrs r7, %[b], #16\n\t"
  8755. #else
  8756. "lsr r7, %[b], #16\n\t"
  8757. #endif
  8758. #ifdef WOLFSSL_KEIL
  8759. "muls r6, r7, r6\n\t"
  8760. #elif defined(__clang__)
  8761. "muls r6, r7\n\t"
  8762. #else
  8763. "mul r6, r7\n\t"
  8764. #endif
  8765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8766. "lsrs r7, r6, #16\n\t"
  8767. #else
  8768. "lsr r7, r6, #16\n\t"
  8769. #endif
  8770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8771. "lsls r6, r6, #16\n\t"
  8772. #else
  8773. "lsl r6, r6, #16\n\t"
  8774. #endif
  8775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8776. "adds r3, r3, r6\n\t"
  8777. #else
  8778. "add r3, r3, r6\n\t"
  8779. #endif
  8780. #ifdef WOLFSSL_KEIL
  8781. "adcs r4, r4, r7\n\t"
  8782. #elif defined(__clang__)
  8783. "adcs r4, r7\n\t"
  8784. #else
  8785. "adc r4, r7\n\t"
  8786. #endif
  8787. #ifdef WOLFSSL_KEIL
  8788. "adcs r5, r5, %[r]\n\t"
  8789. #elif defined(__clang__)
  8790. "adcs r5, %[r]\n\t"
  8791. #else
  8792. "adc r5, %[r]\n\t"
  8793. #endif
  8794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8795. "lsrs r6, %[a], #16\n\t"
  8796. #else
  8797. "lsr r6, %[a], #16\n\t"
  8798. #endif
  8799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8800. "lsrs r7, %[b], #16\n\t"
  8801. #else
  8802. "lsr r7, %[b], #16\n\t"
  8803. #endif
  8804. #ifdef WOLFSSL_KEIL
  8805. "muls r7, r6, r7\n\t"
  8806. #elif defined(__clang__)
  8807. "muls r7, r6\n\t"
  8808. #else
  8809. "mul r7, r6\n\t"
  8810. #endif
  8811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8812. "adds r4, r4, r7\n\t"
  8813. #else
  8814. "add r4, r4, r7\n\t"
  8815. #endif
  8816. #ifdef WOLFSSL_KEIL
  8817. "adcs r5, r5, %[r]\n\t"
  8818. #elif defined(__clang__)
  8819. "adcs r5, %[r]\n\t"
  8820. #else
  8821. "adc r5, %[r]\n\t"
  8822. #endif
  8823. "uxth r7, %[b]\n\t"
  8824. #ifdef WOLFSSL_KEIL
  8825. "muls r6, r7, r6\n\t"
  8826. #elif defined(__clang__)
  8827. "muls r6, r7\n\t"
  8828. #else
  8829. "mul r6, r7\n\t"
  8830. #endif
  8831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8832. "lsrs r7, r6, #16\n\t"
  8833. #else
  8834. "lsr r7, r6, #16\n\t"
  8835. #endif
  8836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8837. "lsls r6, r6, #16\n\t"
  8838. #else
  8839. "lsl r6, r6, #16\n\t"
  8840. #endif
  8841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8842. "adds r3, r3, r6\n\t"
  8843. #else
  8844. "add r3, r3, r6\n\t"
  8845. #endif
  8846. #ifdef WOLFSSL_KEIL
  8847. "adcs r4, r4, r7\n\t"
  8848. #elif defined(__clang__)
  8849. "adcs r4, r7\n\t"
  8850. #else
  8851. "adc r4, r7\n\t"
  8852. #endif
  8853. #ifdef WOLFSSL_KEIL
  8854. "adcs r5, r5, %[r]\n\t"
  8855. #elif defined(__clang__)
  8856. "adcs r5, %[r]\n\t"
  8857. #else
  8858. "adc r5, %[r]\n\t"
  8859. #endif
  8860. "# A[5] * B[7]\n\t"
  8861. "mov %[a], r9\n\t"
  8862. "mov %[b], r10\n\t"
  8863. "ldr %[a], [%[a], #20]\n\t"
  8864. "ldr %[b], [%[b], #28]\n\t"
  8865. "uxth r6, %[a]\n\t"
  8866. "uxth r7, %[b]\n\t"
  8867. #ifdef WOLFSSL_KEIL
  8868. "muls r7, r6, r7\n\t"
  8869. #elif defined(__clang__)
  8870. "muls r7, r6\n\t"
  8871. #else
  8872. "mul r7, r6\n\t"
  8873. #endif
  8874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8875. "adds r3, r3, r7\n\t"
  8876. #else
  8877. "add r3, r3, r7\n\t"
  8878. #endif
  8879. #ifdef WOLFSSL_KEIL
  8880. "adcs r4, r4, %[r]\n\t"
  8881. #elif defined(__clang__)
  8882. "adcs r4, %[r]\n\t"
  8883. #else
  8884. "adc r4, %[r]\n\t"
  8885. #endif
  8886. #ifdef WOLFSSL_KEIL
  8887. "adcs r5, r5, %[r]\n\t"
  8888. #elif defined(__clang__)
  8889. "adcs r5, %[r]\n\t"
  8890. #else
  8891. "adc r5, %[r]\n\t"
  8892. #endif
  8893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8894. "lsrs r7, %[b], #16\n\t"
  8895. #else
  8896. "lsr r7, %[b], #16\n\t"
  8897. #endif
  8898. #ifdef WOLFSSL_KEIL
  8899. "muls r6, r7, r6\n\t"
  8900. #elif defined(__clang__)
  8901. "muls r6, r7\n\t"
  8902. #else
  8903. "mul r6, r7\n\t"
  8904. #endif
  8905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8906. "lsrs r7, r6, #16\n\t"
  8907. #else
  8908. "lsr r7, r6, #16\n\t"
  8909. #endif
  8910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8911. "lsls r6, r6, #16\n\t"
  8912. #else
  8913. "lsl r6, r6, #16\n\t"
  8914. #endif
  8915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8916. "adds r3, r3, r6\n\t"
  8917. #else
  8918. "add r3, r3, r6\n\t"
  8919. #endif
  8920. #ifdef WOLFSSL_KEIL
  8921. "adcs r4, r4, r7\n\t"
  8922. #elif defined(__clang__)
  8923. "adcs r4, r7\n\t"
  8924. #else
  8925. "adc r4, r7\n\t"
  8926. #endif
  8927. #ifdef WOLFSSL_KEIL
  8928. "adcs r5, r5, %[r]\n\t"
  8929. #elif defined(__clang__)
  8930. "adcs r5, %[r]\n\t"
  8931. #else
  8932. "adc r5, %[r]\n\t"
  8933. #endif
  8934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8935. "lsrs r6, %[a], #16\n\t"
  8936. #else
  8937. "lsr r6, %[a], #16\n\t"
  8938. #endif
  8939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8940. "lsrs r7, %[b], #16\n\t"
  8941. #else
  8942. "lsr r7, %[b], #16\n\t"
  8943. #endif
  8944. #ifdef WOLFSSL_KEIL
  8945. "muls r7, r6, r7\n\t"
  8946. #elif defined(__clang__)
  8947. "muls r7, r6\n\t"
  8948. #else
  8949. "mul r7, r6\n\t"
  8950. #endif
  8951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8952. "adds r4, r4, r7\n\t"
  8953. #else
  8954. "add r4, r4, r7\n\t"
  8955. #endif
  8956. #ifdef WOLFSSL_KEIL
  8957. "adcs r5, r5, %[r]\n\t"
  8958. #elif defined(__clang__)
  8959. "adcs r5, %[r]\n\t"
  8960. #else
  8961. "adc r5, %[r]\n\t"
  8962. #endif
  8963. "uxth r7, %[b]\n\t"
  8964. #ifdef WOLFSSL_KEIL
  8965. "muls r6, r7, r6\n\t"
  8966. #elif defined(__clang__)
  8967. "muls r6, r7\n\t"
  8968. #else
  8969. "mul r6, r7\n\t"
  8970. #endif
  8971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8972. "lsrs r7, r6, #16\n\t"
  8973. #else
  8974. "lsr r7, r6, #16\n\t"
  8975. #endif
  8976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8977. "lsls r6, r6, #16\n\t"
  8978. #else
  8979. "lsl r6, r6, #16\n\t"
  8980. #endif
  8981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8982. "adds r3, r3, r6\n\t"
  8983. #else
  8984. "add r3, r3, r6\n\t"
  8985. #endif
  8986. #ifdef WOLFSSL_KEIL
  8987. "adcs r4, r4, r7\n\t"
  8988. #elif defined(__clang__)
  8989. "adcs r4, r7\n\t"
  8990. #else
  8991. "adc r4, r7\n\t"
  8992. #endif
  8993. #ifdef WOLFSSL_KEIL
  8994. "adcs r5, r5, %[r]\n\t"
  8995. #elif defined(__clang__)
  8996. "adcs r5, %[r]\n\t"
  8997. #else
  8998. "adc r5, %[r]\n\t"
  8999. #endif
  9000. "mov %[r], r8\n\t"
  9001. "str r3, [%[r], #48]\n\t"
  9002. "movs %[r], #0\n\t"
  9003. "# A[6] * B[7]\n\t"
  9004. "movs r3, #0\n\t"
  9005. "mov %[a], r9\n\t"
  9006. "mov %[b], r10\n\t"
  9007. "ldr %[a], [%[a], #24]\n\t"
  9008. "ldr %[b], [%[b], #28]\n\t"
  9009. "uxth r6, %[a]\n\t"
  9010. "uxth r7, %[b]\n\t"
  9011. #ifdef WOLFSSL_KEIL
  9012. "muls r7, r6, r7\n\t"
  9013. #elif defined(__clang__)
  9014. "muls r7, r6\n\t"
  9015. #else
  9016. "mul r7, r6\n\t"
  9017. #endif
  9018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9019. "adds r4, r4, r7\n\t"
  9020. #else
  9021. "add r4, r4, r7\n\t"
  9022. #endif
  9023. #ifdef WOLFSSL_KEIL
  9024. "adcs r5, r5, %[r]\n\t"
  9025. #elif defined(__clang__)
  9026. "adcs r5, %[r]\n\t"
  9027. #else
  9028. "adc r5, %[r]\n\t"
  9029. #endif
  9030. #ifdef WOLFSSL_KEIL
  9031. "adcs r3, r3, %[r]\n\t"
  9032. #elif defined(__clang__)
  9033. "adcs r3, %[r]\n\t"
  9034. #else
  9035. "adc r3, %[r]\n\t"
  9036. #endif
  9037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9038. "lsrs r7, %[b], #16\n\t"
  9039. #else
  9040. "lsr r7, %[b], #16\n\t"
  9041. #endif
  9042. #ifdef WOLFSSL_KEIL
  9043. "muls r6, r7, r6\n\t"
  9044. #elif defined(__clang__)
  9045. "muls r6, r7\n\t"
  9046. #else
  9047. "mul r6, r7\n\t"
  9048. #endif
  9049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9050. "lsrs r7, r6, #16\n\t"
  9051. #else
  9052. "lsr r7, r6, #16\n\t"
  9053. #endif
  9054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9055. "lsls r6, r6, #16\n\t"
  9056. #else
  9057. "lsl r6, r6, #16\n\t"
  9058. #endif
  9059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9060. "adds r4, r4, r6\n\t"
  9061. #else
  9062. "add r4, r4, r6\n\t"
  9063. #endif
  9064. #ifdef WOLFSSL_KEIL
  9065. "adcs r5, r5, r7\n\t"
  9066. #elif defined(__clang__)
  9067. "adcs r5, r7\n\t"
  9068. #else
  9069. "adc r5, r7\n\t"
  9070. #endif
  9071. #ifdef WOLFSSL_KEIL
  9072. "adcs r3, r3, %[r]\n\t"
  9073. #elif defined(__clang__)
  9074. "adcs r3, %[r]\n\t"
  9075. #else
  9076. "adc r3, %[r]\n\t"
  9077. #endif
  9078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9079. "lsrs r6, %[a], #16\n\t"
  9080. #else
  9081. "lsr r6, %[a], #16\n\t"
  9082. #endif
  9083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9084. "lsrs r7, %[b], #16\n\t"
  9085. #else
  9086. "lsr r7, %[b], #16\n\t"
  9087. #endif
  9088. #ifdef WOLFSSL_KEIL
  9089. "muls r7, r6, r7\n\t"
  9090. #elif defined(__clang__)
  9091. "muls r7, r6\n\t"
  9092. #else
  9093. "mul r7, r6\n\t"
  9094. #endif
  9095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9096. "adds r5, r5, r7\n\t"
  9097. #else
  9098. "add r5, r5, r7\n\t"
  9099. #endif
  9100. #ifdef WOLFSSL_KEIL
  9101. "adcs r3, r3, %[r]\n\t"
  9102. #elif defined(__clang__)
  9103. "adcs r3, %[r]\n\t"
  9104. #else
  9105. "adc r3, %[r]\n\t"
  9106. #endif
  9107. "uxth r7, %[b]\n\t"
  9108. #ifdef WOLFSSL_KEIL
  9109. "muls r6, r7, r6\n\t"
  9110. #elif defined(__clang__)
  9111. "muls r6, r7\n\t"
  9112. #else
  9113. "mul r6, r7\n\t"
  9114. #endif
  9115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9116. "lsrs r7, r6, #16\n\t"
  9117. #else
  9118. "lsr r7, r6, #16\n\t"
  9119. #endif
  9120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9121. "lsls r6, r6, #16\n\t"
  9122. #else
  9123. "lsl r6, r6, #16\n\t"
  9124. #endif
  9125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9126. "adds r4, r4, r6\n\t"
  9127. #else
  9128. "add r4, r4, r6\n\t"
  9129. #endif
  9130. #ifdef WOLFSSL_KEIL
  9131. "adcs r5, r5, r7\n\t"
  9132. #elif defined(__clang__)
  9133. "adcs r5, r7\n\t"
  9134. #else
  9135. "adc r5, r7\n\t"
  9136. #endif
  9137. #ifdef WOLFSSL_KEIL
  9138. "adcs r3, r3, %[r]\n\t"
  9139. #elif defined(__clang__)
  9140. "adcs r3, %[r]\n\t"
  9141. #else
  9142. "adc r3, %[r]\n\t"
  9143. #endif
  9144. "# A[7] * B[6]\n\t"
  9145. "mov %[a], r9\n\t"
  9146. "mov %[b], r10\n\t"
  9147. "ldr %[a], [%[a], #28]\n\t"
  9148. "ldr %[b], [%[b], #24]\n\t"
  9149. "uxth r6, %[a]\n\t"
  9150. "uxth r7, %[b]\n\t"
  9151. #ifdef WOLFSSL_KEIL
  9152. "muls r7, r6, r7\n\t"
  9153. #elif defined(__clang__)
  9154. "muls r7, r6\n\t"
  9155. #else
  9156. "mul r7, r6\n\t"
  9157. #endif
  9158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9159. "adds r4, r4, r7\n\t"
  9160. #else
  9161. "add r4, r4, r7\n\t"
  9162. #endif
  9163. #ifdef WOLFSSL_KEIL
  9164. "adcs r5, r5, %[r]\n\t"
  9165. #elif defined(__clang__)
  9166. "adcs r5, %[r]\n\t"
  9167. #else
  9168. "adc r5, %[r]\n\t"
  9169. #endif
  9170. #ifdef WOLFSSL_KEIL
  9171. "adcs r3, r3, %[r]\n\t"
  9172. #elif defined(__clang__)
  9173. "adcs r3, %[r]\n\t"
  9174. #else
  9175. "adc r3, %[r]\n\t"
  9176. #endif
  9177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9178. "lsrs r7, %[b], #16\n\t"
  9179. #else
  9180. "lsr r7, %[b], #16\n\t"
  9181. #endif
  9182. #ifdef WOLFSSL_KEIL
  9183. "muls r6, r7, r6\n\t"
  9184. #elif defined(__clang__)
  9185. "muls r6, r7\n\t"
  9186. #else
  9187. "mul r6, r7\n\t"
  9188. #endif
  9189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9190. "lsrs r7, r6, #16\n\t"
  9191. #else
  9192. "lsr r7, r6, #16\n\t"
  9193. #endif
  9194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9195. "lsls r6, r6, #16\n\t"
  9196. #else
  9197. "lsl r6, r6, #16\n\t"
  9198. #endif
  9199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9200. "adds r4, r4, r6\n\t"
  9201. #else
  9202. "add r4, r4, r6\n\t"
  9203. #endif
  9204. #ifdef WOLFSSL_KEIL
  9205. "adcs r5, r5, r7\n\t"
  9206. #elif defined(__clang__)
  9207. "adcs r5, r7\n\t"
  9208. #else
  9209. "adc r5, r7\n\t"
  9210. #endif
  9211. #ifdef WOLFSSL_KEIL
  9212. "adcs r3, r3, %[r]\n\t"
  9213. #elif defined(__clang__)
  9214. "adcs r3, %[r]\n\t"
  9215. #else
  9216. "adc r3, %[r]\n\t"
  9217. #endif
  9218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9219. "lsrs r6, %[a], #16\n\t"
  9220. #else
  9221. "lsr r6, %[a], #16\n\t"
  9222. #endif
  9223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9224. "lsrs r7, %[b], #16\n\t"
  9225. #else
  9226. "lsr r7, %[b], #16\n\t"
  9227. #endif
  9228. #ifdef WOLFSSL_KEIL
  9229. "muls r7, r6, r7\n\t"
  9230. #elif defined(__clang__)
  9231. "muls r7, r6\n\t"
  9232. #else
  9233. "mul r7, r6\n\t"
  9234. #endif
  9235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9236. "adds r5, r5, r7\n\t"
  9237. #else
  9238. "add r5, r5, r7\n\t"
  9239. #endif
  9240. #ifdef WOLFSSL_KEIL
  9241. "adcs r3, r3, %[r]\n\t"
  9242. #elif defined(__clang__)
  9243. "adcs r3, %[r]\n\t"
  9244. #else
  9245. "adc r3, %[r]\n\t"
  9246. #endif
  9247. "uxth r7, %[b]\n\t"
  9248. #ifdef WOLFSSL_KEIL
  9249. "muls r6, r7, r6\n\t"
  9250. #elif defined(__clang__)
  9251. "muls r6, r7\n\t"
  9252. #else
  9253. "mul r6, r7\n\t"
  9254. #endif
  9255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9256. "lsrs r7, r6, #16\n\t"
  9257. #else
  9258. "lsr r7, r6, #16\n\t"
  9259. #endif
  9260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9261. "lsls r6, r6, #16\n\t"
  9262. #else
  9263. "lsl r6, r6, #16\n\t"
  9264. #endif
  9265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9266. "adds r4, r4, r6\n\t"
  9267. #else
  9268. "add r4, r4, r6\n\t"
  9269. #endif
  9270. #ifdef WOLFSSL_KEIL
  9271. "adcs r5, r5, r7\n\t"
  9272. #elif defined(__clang__)
  9273. "adcs r5, r7\n\t"
  9274. #else
  9275. "adc r5, r7\n\t"
  9276. #endif
  9277. #ifdef WOLFSSL_KEIL
  9278. "adcs r3, r3, %[r]\n\t"
  9279. #elif defined(__clang__)
  9280. "adcs r3, %[r]\n\t"
  9281. #else
  9282. "adc r3, %[r]\n\t"
  9283. #endif
  9284. "mov %[r], r8\n\t"
  9285. "str r4, [%[r], #52]\n\t"
  9286. "movs %[r], #0\n\t"
  9287. "# A[7] * B[7]\n\t"
  9288. "mov %[a], r9\n\t"
  9289. "mov %[b], r10\n\t"
  9290. "ldr %[a], [%[a], #28]\n\t"
  9291. "ldr %[b], [%[b], #28]\n\t"
  9292. "uxth r6, %[a]\n\t"
  9293. "uxth r7, %[b]\n\t"
  9294. #ifdef WOLFSSL_KEIL
  9295. "muls r7, r6, r7\n\t"
  9296. #elif defined(__clang__)
  9297. "muls r7, r6\n\t"
  9298. #else
  9299. "mul r7, r6\n\t"
  9300. #endif
  9301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9302. "adds r5, r5, r7\n\t"
  9303. #else
  9304. "add r5, r5, r7\n\t"
  9305. #endif
  9306. #ifdef WOLFSSL_KEIL
  9307. "adcs r3, r3, %[r]\n\t"
  9308. #elif defined(__clang__)
  9309. "adcs r3, %[r]\n\t"
  9310. #else
  9311. "adc r3, %[r]\n\t"
  9312. #endif
  9313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9314. "lsrs r7, %[b], #16\n\t"
  9315. #else
  9316. "lsr r7, %[b], #16\n\t"
  9317. #endif
  9318. #ifdef WOLFSSL_KEIL
  9319. "muls r6, r7, r6\n\t"
  9320. #elif defined(__clang__)
  9321. "muls r6, r7\n\t"
  9322. #else
  9323. "mul r6, r7\n\t"
  9324. #endif
  9325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9326. "lsrs r7, r6, #16\n\t"
  9327. #else
  9328. "lsr r7, r6, #16\n\t"
  9329. #endif
  9330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9331. "lsls r6, r6, #16\n\t"
  9332. #else
  9333. "lsl r6, r6, #16\n\t"
  9334. #endif
  9335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9336. "adds r5, r5, r6\n\t"
  9337. #else
  9338. "add r5, r5, r6\n\t"
  9339. #endif
  9340. #ifdef WOLFSSL_KEIL
  9341. "adcs r3, r3, r7\n\t"
  9342. #elif defined(__clang__)
  9343. "adcs r3, r7\n\t"
  9344. #else
  9345. "adc r3, r7\n\t"
  9346. #endif
  9347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9348. "lsrs r6, %[a], #16\n\t"
  9349. #else
  9350. "lsr r6, %[a], #16\n\t"
  9351. #endif
  9352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9353. "lsrs r7, %[b], #16\n\t"
  9354. #else
  9355. "lsr r7, %[b], #16\n\t"
  9356. #endif
  9357. #ifdef WOLFSSL_KEIL
  9358. "muls r7, r6, r7\n\t"
  9359. #elif defined(__clang__)
  9360. "muls r7, r6\n\t"
  9361. #else
  9362. "mul r7, r6\n\t"
  9363. #endif
  9364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9365. "adds r3, r3, r7\n\t"
  9366. #else
  9367. "add r3, r3, r7\n\t"
  9368. #endif
  9369. "uxth r7, %[b]\n\t"
  9370. #ifdef WOLFSSL_KEIL
  9371. "muls r6, r7, r6\n\t"
  9372. #elif defined(__clang__)
  9373. "muls r6, r7\n\t"
  9374. #else
  9375. "mul r6, r7\n\t"
  9376. #endif
  9377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9378. "lsrs r7, r6, #16\n\t"
  9379. #else
  9380. "lsr r7, r6, #16\n\t"
  9381. #endif
  9382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9383. "lsls r6, r6, #16\n\t"
  9384. #else
  9385. "lsl r6, r6, #16\n\t"
  9386. #endif
  9387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9388. "adds r5, r5, r6\n\t"
  9389. #else
  9390. "add r5, r5, r6\n\t"
  9391. #endif
  9392. #ifdef WOLFSSL_KEIL
  9393. "adcs r3, r3, r7\n\t"
  9394. #elif defined(__clang__)
  9395. "adcs r3, r7\n\t"
  9396. #else
  9397. "adc r3, r7\n\t"
  9398. #endif
  9399. "mov %[r], r8\n\t"
  9400. "str r5, [%[r], #56]\n\t"
  9401. "str r3, [%[r], #60]\n\t"
  9402. "pop {r3, r4, r5, r6}\n\t"
  9403. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  9404. "pop {r3, r4, r5, r6}\n\t"
  9405. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  9406. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  9407. :
  9408. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  9409. );
  9410. }
  9411. #endif /* !WOLFSSL_SP_LARGE_CODE */
  9412. /* Add b to a into r. (r = a + b)
  9413. *
  9414. * r A single precision integer.
  9415. * a A single precision integer.
  9416. * b A single precision integer.
  9417. */
  9418. SP_NOINLINE static sp_digit sp_2048_add_8(sp_digit* r, const sp_digit* a,
  9419. const sp_digit* b)
  9420. {
  9421. __asm__ __volatile__ (
  9422. "ldm %[b]!, {r5, r6}\n\t"
  9423. "ldm %[a]!, {r3, r4}\n\t"
  9424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9425. "adds r3, r3, r5\n\t"
  9426. #else
  9427. "add r3, r3, r5\n\t"
  9428. #endif
  9429. #ifdef WOLFSSL_KEIL
  9430. "adcs r4, r4, r6\n\t"
  9431. #elif defined(__clang__)
  9432. "adcs r4, r6\n\t"
  9433. #else
  9434. "adc r4, r6\n\t"
  9435. #endif
  9436. "stm %[r]!, {r3, r4}\n\t"
  9437. "ldm %[b]!, {r5, r6}\n\t"
  9438. "ldm %[a]!, {r3, r4}\n\t"
  9439. #ifdef WOLFSSL_KEIL
  9440. "adcs r3, r3, r5\n\t"
  9441. #elif defined(__clang__)
  9442. "adcs r3, r5\n\t"
  9443. #else
  9444. "adc r3, r5\n\t"
  9445. #endif
  9446. #ifdef WOLFSSL_KEIL
  9447. "adcs r4, r4, r6\n\t"
  9448. #elif defined(__clang__)
  9449. "adcs r4, r6\n\t"
  9450. #else
  9451. "adc r4, r6\n\t"
  9452. #endif
  9453. "stm %[r]!, {r3, r4}\n\t"
  9454. "ldm %[b]!, {r5, r6}\n\t"
  9455. "ldm %[a]!, {r3, r4}\n\t"
  9456. #ifdef WOLFSSL_KEIL
  9457. "adcs r3, r3, r5\n\t"
  9458. #elif defined(__clang__)
  9459. "adcs r3, r5\n\t"
  9460. #else
  9461. "adc r3, r5\n\t"
  9462. #endif
  9463. #ifdef WOLFSSL_KEIL
  9464. "adcs r4, r4, r6\n\t"
  9465. #elif defined(__clang__)
  9466. "adcs r4, r6\n\t"
  9467. #else
  9468. "adc r4, r6\n\t"
  9469. #endif
  9470. "stm %[r]!, {r3, r4}\n\t"
  9471. "ldm %[b]!, {r5, r6}\n\t"
  9472. "ldm %[a]!, {r3, r4}\n\t"
  9473. #ifdef WOLFSSL_KEIL
  9474. "adcs r3, r3, r5\n\t"
  9475. #elif defined(__clang__)
  9476. "adcs r3, r5\n\t"
  9477. #else
  9478. "adc r3, r5\n\t"
  9479. #endif
  9480. #ifdef WOLFSSL_KEIL
  9481. "adcs r4, r4, r6\n\t"
  9482. #elif defined(__clang__)
  9483. "adcs r4, r6\n\t"
  9484. #else
  9485. "adc r4, r6\n\t"
  9486. #endif
  9487. "stm %[r]!, {r3, r4}\n\t"
  9488. "movs %[r], #0\n\t"
  9489. #ifdef WOLFSSL_KEIL
  9490. "adcs %[r], %[r], %[r]\n\t"
  9491. #elif defined(__clang__)
  9492. "adcs %[r], %[r]\n\t"
  9493. #else
  9494. "adc %[r], %[r]\n\t"
  9495. #endif
  9496. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  9497. :
  9498. : "memory", "r3", "r4", "r5", "r6"
  9499. );
  9500. return (uint32_t)(size_t)r;
  9501. }
  9502. /* Add b to a into r. (r = a + b)
  9503. *
  9504. * r A single precision integer.
  9505. * a A single precision integer.
  9506. * b A single precision integer.
  9507. */
  9508. SP_NOINLINE static sp_digit sp_2048_add_word_8(sp_digit* r, const sp_digit* a,
  9509. sp_digit b)
  9510. {
  9511. __asm__ __volatile__ (
  9512. "movs r5, #0\n\t"
  9513. "ldm %[a]!, {r3, r4}\n\t"
  9514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9515. "adds r3, r3, %[b]\n\t"
  9516. #else
  9517. "add r3, r3, %[b]\n\t"
  9518. #endif
  9519. #ifdef WOLFSSL_KEIL
  9520. "adcs r4, r4, r5\n\t"
  9521. #elif defined(__clang__)
  9522. "adcs r4, r5\n\t"
  9523. #else
  9524. "adc r4, r5\n\t"
  9525. #endif
  9526. "stm %[r]!, {r3, r4}\n\t"
  9527. "ldm %[a]!, {r3, r4}\n\t"
  9528. #ifdef WOLFSSL_KEIL
  9529. "adcs r3, r3, r5\n\t"
  9530. #elif defined(__clang__)
  9531. "adcs r3, r5\n\t"
  9532. #else
  9533. "adc r3, r5\n\t"
  9534. #endif
  9535. #ifdef WOLFSSL_KEIL
  9536. "adcs r4, r4, r5\n\t"
  9537. #elif defined(__clang__)
  9538. "adcs r4, r5\n\t"
  9539. #else
  9540. "adc r4, r5\n\t"
  9541. #endif
  9542. "stm %[r]!, {r3, r4}\n\t"
  9543. "ldm %[a]!, {r3, r4}\n\t"
  9544. #ifdef WOLFSSL_KEIL
  9545. "adcs r3, r3, r5\n\t"
  9546. #elif defined(__clang__)
  9547. "adcs r3, r5\n\t"
  9548. #else
  9549. "adc r3, r5\n\t"
  9550. #endif
  9551. #ifdef WOLFSSL_KEIL
  9552. "adcs r4, r4, r5\n\t"
  9553. #elif defined(__clang__)
  9554. "adcs r4, r5\n\t"
  9555. #else
  9556. "adc r4, r5\n\t"
  9557. #endif
  9558. "stm %[r]!, {r3, r4}\n\t"
  9559. "ldm %[a]!, {r3, r4}\n\t"
  9560. #ifdef WOLFSSL_KEIL
  9561. "adcs r3, r3, r5\n\t"
  9562. #elif defined(__clang__)
  9563. "adcs r3, r5\n\t"
  9564. #else
  9565. "adc r3, r5\n\t"
  9566. #endif
  9567. #ifdef WOLFSSL_KEIL
  9568. "adcs r4, r4, r5\n\t"
  9569. #elif defined(__clang__)
  9570. "adcs r4, r5\n\t"
  9571. #else
  9572. "adc r4, r5\n\t"
  9573. #endif
  9574. "stm %[r]!, {r3, r4}\n\t"
  9575. "movs %[r], #0\n\t"
  9576. #ifdef WOLFSSL_KEIL
  9577. "adcs %[r], %[r], %[r]\n\t"
  9578. #elif defined(__clang__)
  9579. "adcs %[r], %[r]\n\t"
  9580. #else
  9581. "adc %[r], %[r]\n\t"
  9582. #endif
  9583. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  9584. :
  9585. : "memory", "r3", "r4", "r5"
  9586. );
  9587. return (uint32_t)(size_t)r;
  9588. }
  9589. /* Sub b from a into a. (a -= b)
  9590. *
  9591. * a A single precision integer.
  9592. * b A single precision integer.
  9593. */
  9594. SP_NOINLINE static sp_digit sp_2048_sub_in_place_16(sp_digit* a,
  9595. const sp_digit* b)
  9596. {
  9597. __asm__ __volatile__ (
  9598. "ldm %[b]!, {r4, r5}\n\t"
  9599. "ldr r2, [%[a]]\n\t"
  9600. "ldr r3, [%[a], #4]\n\t"
  9601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9602. "subs r2, r2, r4\n\t"
  9603. #else
  9604. "sub r2, r2, r4\n\t"
  9605. #endif
  9606. #ifdef WOLFSSL_KEIL
  9607. "sbcs r3, r3, r5\n\t"
  9608. #elif defined(__clang__)
  9609. "sbcs r3, r5\n\t"
  9610. #else
  9611. "sbc r3, r5\n\t"
  9612. #endif
  9613. "stm %[a]!, {r2, r3}\n\t"
  9614. "ldm %[b]!, {r4, r5}\n\t"
  9615. "ldr r2, [%[a]]\n\t"
  9616. "ldr r3, [%[a], #4]\n\t"
  9617. #ifdef WOLFSSL_KEIL
  9618. "sbcs r2, r2, r4\n\t"
  9619. #elif defined(__clang__)
  9620. "sbcs r2, r4\n\t"
  9621. #else
  9622. "sbc r2, r4\n\t"
  9623. #endif
  9624. #ifdef WOLFSSL_KEIL
  9625. "sbcs r3, r3, r5\n\t"
  9626. #elif defined(__clang__)
  9627. "sbcs r3, r5\n\t"
  9628. #else
  9629. "sbc r3, r5\n\t"
  9630. #endif
  9631. "stm %[a]!, {r2, r3}\n\t"
  9632. "ldm %[b]!, {r4, r5}\n\t"
  9633. "ldr r2, [%[a]]\n\t"
  9634. "ldr r3, [%[a], #4]\n\t"
  9635. #ifdef WOLFSSL_KEIL
  9636. "sbcs r2, r2, r4\n\t"
  9637. #elif defined(__clang__)
  9638. "sbcs r2, r4\n\t"
  9639. #else
  9640. "sbc r2, r4\n\t"
  9641. #endif
  9642. #ifdef WOLFSSL_KEIL
  9643. "sbcs r3, r3, r5\n\t"
  9644. #elif defined(__clang__)
  9645. "sbcs r3, r5\n\t"
  9646. #else
  9647. "sbc r3, r5\n\t"
  9648. #endif
  9649. "stm %[a]!, {r2, r3}\n\t"
  9650. "ldm %[b]!, {r4, r5}\n\t"
  9651. "ldr r2, [%[a]]\n\t"
  9652. "ldr r3, [%[a], #4]\n\t"
  9653. #ifdef WOLFSSL_KEIL
  9654. "sbcs r2, r2, r4\n\t"
  9655. #elif defined(__clang__)
  9656. "sbcs r2, r4\n\t"
  9657. #else
  9658. "sbc r2, r4\n\t"
  9659. #endif
  9660. #ifdef WOLFSSL_KEIL
  9661. "sbcs r3, r3, r5\n\t"
  9662. #elif defined(__clang__)
  9663. "sbcs r3, r5\n\t"
  9664. #else
  9665. "sbc r3, r5\n\t"
  9666. #endif
  9667. "stm %[a]!, {r2, r3}\n\t"
  9668. "ldm %[b]!, {r4, r5}\n\t"
  9669. "ldr r2, [%[a]]\n\t"
  9670. "ldr r3, [%[a], #4]\n\t"
  9671. #ifdef WOLFSSL_KEIL
  9672. "sbcs r2, r2, r4\n\t"
  9673. #elif defined(__clang__)
  9674. "sbcs r2, r4\n\t"
  9675. #else
  9676. "sbc r2, r4\n\t"
  9677. #endif
  9678. #ifdef WOLFSSL_KEIL
  9679. "sbcs r3, r3, r5\n\t"
  9680. #elif defined(__clang__)
  9681. "sbcs r3, r5\n\t"
  9682. #else
  9683. "sbc r3, r5\n\t"
  9684. #endif
  9685. "stm %[a]!, {r2, r3}\n\t"
  9686. "ldm %[b]!, {r4, r5}\n\t"
  9687. "ldr r2, [%[a]]\n\t"
  9688. "ldr r3, [%[a], #4]\n\t"
  9689. #ifdef WOLFSSL_KEIL
  9690. "sbcs r2, r2, r4\n\t"
  9691. #elif defined(__clang__)
  9692. "sbcs r2, r4\n\t"
  9693. #else
  9694. "sbc r2, r4\n\t"
  9695. #endif
  9696. #ifdef WOLFSSL_KEIL
  9697. "sbcs r3, r3, r5\n\t"
  9698. #elif defined(__clang__)
  9699. "sbcs r3, r5\n\t"
  9700. #else
  9701. "sbc r3, r5\n\t"
  9702. #endif
  9703. "stm %[a]!, {r2, r3}\n\t"
  9704. "ldm %[b]!, {r4, r5}\n\t"
  9705. "ldr r2, [%[a]]\n\t"
  9706. "ldr r3, [%[a], #4]\n\t"
  9707. #ifdef WOLFSSL_KEIL
  9708. "sbcs r2, r2, r4\n\t"
  9709. #elif defined(__clang__)
  9710. "sbcs r2, r4\n\t"
  9711. #else
  9712. "sbc r2, r4\n\t"
  9713. #endif
  9714. #ifdef WOLFSSL_KEIL
  9715. "sbcs r3, r3, r5\n\t"
  9716. #elif defined(__clang__)
  9717. "sbcs r3, r5\n\t"
  9718. #else
  9719. "sbc r3, r5\n\t"
  9720. #endif
  9721. "stm %[a]!, {r2, r3}\n\t"
  9722. "ldm %[b]!, {r4, r5}\n\t"
  9723. "ldr r2, [%[a]]\n\t"
  9724. "ldr r3, [%[a], #4]\n\t"
  9725. #ifdef WOLFSSL_KEIL
  9726. "sbcs r2, r2, r4\n\t"
  9727. #elif defined(__clang__)
  9728. "sbcs r2, r4\n\t"
  9729. #else
  9730. "sbc r2, r4\n\t"
  9731. #endif
  9732. #ifdef WOLFSSL_KEIL
  9733. "sbcs r3, r3, r5\n\t"
  9734. #elif defined(__clang__)
  9735. "sbcs r3, r5\n\t"
  9736. #else
  9737. "sbc r3, r5\n\t"
  9738. #endif
  9739. "stm %[a]!, {r2, r3}\n\t"
  9740. #ifdef WOLFSSL_KEIL
  9741. "sbcs %[a], %[a], %[a]\n\t"
  9742. #elif defined(__clang__)
  9743. "sbcs %[a], %[a]\n\t"
  9744. #else
  9745. "sbc %[a], %[a]\n\t"
  9746. #endif
  9747. : [a] "+l" (a), [b] "+l" (b)
  9748. :
  9749. : "memory", "r2", "r3", "r4", "r5"
  9750. );
  9751. return (uint32_t)(size_t)a;
  9752. }
  9753. /* Add b to a into r. (r = a + b)
  9754. *
  9755. * r A single precision integer.
  9756. * a A single precision integer.
  9757. * b A single precision integer.
  9758. */
  9759. SP_NOINLINE static sp_digit sp_2048_add_16(sp_digit* r, const sp_digit* a,
  9760. const sp_digit* b)
  9761. {
  9762. __asm__ __volatile__ (
  9763. "ldm %[b]!, {r5, r6}\n\t"
  9764. "ldm %[a]!, {r3, r4}\n\t"
  9765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9766. "adds r3, r3, r5\n\t"
  9767. #else
  9768. "add r3, r3, r5\n\t"
  9769. #endif
  9770. #ifdef WOLFSSL_KEIL
  9771. "adcs r4, r4, r6\n\t"
  9772. #elif defined(__clang__)
  9773. "adcs r4, r6\n\t"
  9774. #else
  9775. "adc r4, r6\n\t"
  9776. #endif
  9777. "stm %[r]!, {r3, r4}\n\t"
  9778. "ldm %[b]!, {r5, r6}\n\t"
  9779. "ldm %[a]!, {r3, r4}\n\t"
  9780. #ifdef WOLFSSL_KEIL
  9781. "adcs r3, r3, r5\n\t"
  9782. #elif defined(__clang__)
  9783. "adcs r3, r5\n\t"
  9784. #else
  9785. "adc r3, r5\n\t"
  9786. #endif
  9787. #ifdef WOLFSSL_KEIL
  9788. "adcs r4, r4, r6\n\t"
  9789. #elif defined(__clang__)
  9790. "adcs r4, r6\n\t"
  9791. #else
  9792. "adc r4, r6\n\t"
  9793. #endif
  9794. "stm %[r]!, {r3, r4}\n\t"
  9795. "ldm %[b]!, {r5, r6}\n\t"
  9796. "ldm %[a]!, {r3, r4}\n\t"
  9797. #ifdef WOLFSSL_KEIL
  9798. "adcs r3, r3, r5\n\t"
  9799. #elif defined(__clang__)
  9800. "adcs r3, r5\n\t"
  9801. #else
  9802. "adc r3, r5\n\t"
  9803. #endif
  9804. #ifdef WOLFSSL_KEIL
  9805. "adcs r4, r4, r6\n\t"
  9806. #elif defined(__clang__)
  9807. "adcs r4, r6\n\t"
  9808. #else
  9809. "adc r4, r6\n\t"
  9810. #endif
  9811. "stm %[r]!, {r3, r4}\n\t"
  9812. "ldm %[b]!, {r5, r6}\n\t"
  9813. "ldm %[a]!, {r3, r4}\n\t"
  9814. #ifdef WOLFSSL_KEIL
  9815. "adcs r3, r3, r5\n\t"
  9816. #elif defined(__clang__)
  9817. "adcs r3, r5\n\t"
  9818. #else
  9819. "adc r3, r5\n\t"
  9820. #endif
  9821. #ifdef WOLFSSL_KEIL
  9822. "adcs r4, r4, r6\n\t"
  9823. #elif defined(__clang__)
  9824. "adcs r4, r6\n\t"
  9825. #else
  9826. "adc r4, r6\n\t"
  9827. #endif
  9828. "stm %[r]!, {r3, r4}\n\t"
  9829. "ldm %[b]!, {r5, r6}\n\t"
  9830. "ldm %[a]!, {r3, r4}\n\t"
  9831. #ifdef WOLFSSL_KEIL
  9832. "adcs r3, r3, r5\n\t"
  9833. #elif defined(__clang__)
  9834. "adcs r3, r5\n\t"
  9835. #else
  9836. "adc r3, r5\n\t"
  9837. #endif
  9838. #ifdef WOLFSSL_KEIL
  9839. "adcs r4, r4, r6\n\t"
  9840. #elif defined(__clang__)
  9841. "adcs r4, r6\n\t"
  9842. #else
  9843. "adc r4, r6\n\t"
  9844. #endif
  9845. "stm %[r]!, {r3, r4}\n\t"
  9846. "ldm %[b]!, {r5, r6}\n\t"
  9847. "ldm %[a]!, {r3, r4}\n\t"
  9848. #ifdef WOLFSSL_KEIL
  9849. "adcs r3, r3, r5\n\t"
  9850. #elif defined(__clang__)
  9851. "adcs r3, r5\n\t"
  9852. #else
  9853. "adc r3, r5\n\t"
  9854. #endif
  9855. #ifdef WOLFSSL_KEIL
  9856. "adcs r4, r4, r6\n\t"
  9857. #elif defined(__clang__)
  9858. "adcs r4, r6\n\t"
  9859. #else
  9860. "adc r4, r6\n\t"
  9861. #endif
  9862. "stm %[r]!, {r3, r4}\n\t"
  9863. "ldm %[b]!, {r5, r6}\n\t"
  9864. "ldm %[a]!, {r3, r4}\n\t"
  9865. #ifdef WOLFSSL_KEIL
  9866. "adcs r3, r3, r5\n\t"
  9867. #elif defined(__clang__)
  9868. "adcs r3, r5\n\t"
  9869. #else
  9870. "adc r3, r5\n\t"
  9871. #endif
  9872. #ifdef WOLFSSL_KEIL
  9873. "adcs r4, r4, r6\n\t"
  9874. #elif defined(__clang__)
  9875. "adcs r4, r6\n\t"
  9876. #else
  9877. "adc r4, r6\n\t"
  9878. #endif
  9879. "stm %[r]!, {r3, r4}\n\t"
  9880. "ldm %[b]!, {r5, r6}\n\t"
  9881. "ldm %[a]!, {r3, r4}\n\t"
  9882. #ifdef WOLFSSL_KEIL
  9883. "adcs r3, r3, r5\n\t"
  9884. #elif defined(__clang__)
  9885. "adcs r3, r5\n\t"
  9886. #else
  9887. "adc r3, r5\n\t"
  9888. #endif
  9889. #ifdef WOLFSSL_KEIL
  9890. "adcs r4, r4, r6\n\t"
  9891. #elif defined(__clang__)
  9892. "adcs r4, r6\n\t"
  9893. #else
  9894. "adc r4, r6\n\t"
  9895. #endif
  9896. "stm %[r]!, {r3, r4}\n\t"
  9897. "movs %[r], #0\n\t"
  9898. #ifdef WOLFSSL_KEIL
  9899. "adcs %[r], %[r], %[r]\n\t"
  9900. #elif defined(__clang__)
  9901. "adcs %[r], %[r]\n\t"
  9902. #else
  9903. "adc %[r], %[r]\n\t"
  9904. #endif
  9905. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  9906. :
  9907. : "memory", "r3", "r4", "r5", "r6"
  9908. );
  9909. return (uint32_t)(size_t)r;
  9910. }
  9911. /* AND m into each word of a and store in r.
  9912. *
  9913. * r A single precision integer.
  9914. * a A single precision integer.
  9915. * m Mask to AND against each digit.
  9916. */
  9917. static void sp_2048_mask_8(sp_digit* r, const sp_digit* a, sp_digit m)
  9918. {
  9919. #ifdef WOLFSSL_SP_SMALL
  9920. int i;
  9921. for (i=0; i<8; i++) {
  9922. r[i] = a[i] & m;
  9923. }
  9924. #else
  9925. r[0] = a[0] & m;
  9926. r[1] = a[1] & m;
  9927. r[2] = a[2] & m;
  9928. r[3] = a[3] & m;
  9929. r[4] = a[4] & m;
  9930. r[5] = a[5] & m;
  9931. r[6] = a[6] & m;
  9932. r[7] = a[7] & m;
  9933. #endif
  9934. }
  9935. /* Multiply a and b into r. (r = a * b)
  9936. *
  9937. * r A single precision integer.
  9938. * a A single precision integer.
  9939. * b A single precision integer.
  9940. */
  9941. SP_NOINLINE static void sp_2048_mul_16(sp_digit* r, const sp_digit* a,
  9942. const sp_digit* b)
  9943. {
  9944. sp_digit* z0 = r;
  9945. sp_digit z1[16];
  9946. sp_digit a1[8];
  9947. sp_digit b1[8];
  9948. sp_digit* z2 = r + 16;
  9949. sp_digit u;
  9950. sp_digit ca;
  9951. sp_digit cb;
  9952. ca = sp_2048_add_8(a1, a, &a[8]);
  9953. cb = sp_2048_add_8(b1, b, &b[8]);
  9954. u = ca & cb;
  9955. sp_2048_mul_8(z2, &a[8], &b[8]);
  9956. sp_2048_mul_8(z0, a, b);
  9957. sp_2048_mul_8(z1, a1, b1);
  9958. u += sp_2048_sub_in_place_16(z1, z0);
  9959. u += sp_2048_sub_in_place_16(z1, z2);
  9960. sp_2048_mask_8(a1, a1, 0 - cb);
  9961. u += sp_2048_add_8(z1 + 8, z1 + 8, a1);
  9962. sp_2048_mask_8(b1, b1, 0 - ca);
  9963. u += sp_2048_add_8(z1 + 8, z1 + 8, b1);
  9964. u += sp_2048_add_16(r + 8, r + 8, z1);
  9965. (void)sp_2048_add_word_8(r + 24, r + 24, u);
  9966. }
  9967. /* Add b to a into r. (r = a + b)
  9968. *
  9969. * r A single precision integer.
  9970. * a A single precision integer.
  9971. * b A single precision integer.
  9972. */
  9973. SP_NOINLINE static sp_digit sp_2048_add_word_16(sp_digit* r, const sp_digit* a,
  9974. sp_digit b)
  9975. {
  9976. __asm__ __volatile__ (
  9977. "movs r5, #0\n\t"
  9978. "ldm %[a]!, {r3, r4}\n\t"
  9979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9980. "adds r3, r3, %[b]\n\t"
  9981. #else
  9982. "add r3, r3, %[b]\n\t"
  9983. #endif
  9984. #ifdef WOLFSSL_KEIL
  9985. "adcs r4, r4, r5\n\t"
  9986. #elif defined(__clang__)
  9987. "adcs r4, r5\n\t"
  9988. #else
  9989. "adc r4, r5\n\t"
  9990. #endif
  9991. "stm %[r]!, {r3, r4}\n\t"
  9992. "ldm %[a]!, {r3, r4}\n\t"
  9993. #ifdef WOLFSSL_KEIL
  9994. "adcs r3, r3, r5\n\t"
  9995. #elif defined(__clang__)
  9996. "adcs r3, r5\n\t"
  9997. #else
  9998. "adc r3, r5\n\t"
  9999. #endif
  10000. #ifdef WOLFSSL_KEIL
  10001. "adcs r4, r4, r5\n\t"
  10002. #elif defined(__clang__)
  10003. "adcs r4, r5\n\t"
  10004. #else
  10005. "adc r4, r5\n\t"
  10006. #endif
  10007. "stm %[r]!, {r3, r4}\n\t"
  10008. "ldm %[a]!, {r3, r4}\n\t"
  10009. #ifdef WOLFSSL_KEIL
  10010. "adcs r3, r3, r5\n\t"
  10011. #elif defined(__clang__)
  10012. "adcs r3, r5\n\t"
  10013. #else
  10014. "adc r3, r5\n\t"
  10015. #endif
  10016. #ifdef WOLFSSL_KEIL
  10017. "adcs r4, r4, r5\n\t"
  10018. #elif defined(__clang__)
  10019. "adcs r4, r5\n\t"
  10020. #else
  10021. "adc r4, r5\n\t"
  10022. #endif
  10023. "stm %[r]!, {r3, r4}\n\t"
  10024. "ldm %[a]!, {r3, r4}\n\t"
  10025. #ifdef WOLFSSL_KEIL
  10026. "adcs r3, r3, r5\n\t"
  10027. #elif defined(__clang__)
  10028. "adcs r3, r5\n\t"
  10029. #else
  10030. "adc r3, r5\n\t"
  10031. #endif
  10032. #ifdef WOLFSSL_KEIL
  10033. "adcs r4, r4, r5\n\t"
  10034. #elif defined(__clang__)
  10035. "adcs r4, r5\n\t"
  10036. #else
  10037. "adc r4, r5\n\t"
  10038. #endif
  10039. "stm %[r]!, {r3, r4}\n\t"
  10040. "ldm %[a]!, {r3, r4}\n\t"
  10041. #ifdef WOLFSSL_KEIL
  10042. "adcs r3, r3, r5\n\t"
  10043. #elif defined(__clang__)
  10044. "adcs r3, r5\n\t"
  10045. #else
  10046. "adc r3, r5\n\t"
  10047. #endif
  10048. #ifdef WOLFSSL_KEIL
  10049. "adcs r4, r4, r5\n\t"
  10050. #elif defined(__clang__)
  10051. "adcs r4, r5\n\t"
  10052. #else
  10053. "adc r4, r5\n\t"
  10054. #endif
  10055. "stm %[r]!, {r3, r4}\n\t"
  10056. "ldm %[a]!, {r3, r4}\n\t"
  10057. #ifdef WOLFSSL_KEIL
  10058. "adcs r3, r3, r5\n\t"
  10059. #elif defined(__clang__)
  10060. "adcs r3, r5\n\t"
  10061. #else
  10062. "adc r3, r5\n\t"
  10063. #endif
  10064. #ifdef WOLFSSL_KEIL
  10065. "adcs r4, r4, r5\n\t"
  10066. #elif defined(__clang__)
  10067. "adcs r4, r5\n\t"
  10068. #else
  10069. "adc r4, r5\n\t"
  10070. #endif
  10071. "stm %[r]!, {r3, r4}\n\t"
  10072. "ldm %[a]!, {r3, r4}\n\t"
  10073. #ifdef WOLFSSL_KEIL
  10074. "adcs r3, r3, r5\n\t"
  10075. #elif defined(__clang__)
  10076. "adcs r3, r5\n\t"
  10077. #else
  10078. "adc r3, r5\n\t"
  10079. #endif
  10080. #ifdef WOLFSSL_KEIL
  10081. "adcs r4, r4, r5\n\t"
  10082. #elif defined(__clang__)
  10083. "adcs r4, r5\n\t"
  10084. #else
  10085. "adc r4, r5\n\t"
  10086. #endif
  10087. "stm %[r]!, {r3, r4}\n\t"
  10088. "ldm %[a]!, {r3, r4}\n\t"
  10089. #ifdef WOLFSSL_KEIL
  10090. "adcs r3, r3, r5\n\t"
  10091. #elif defined(__clang__)
  10092. "adcs r3, r5\n\t"
  10093. #else
  10094. "adc r3, r5\n\t"
  10095. #endif
  10096. #ifdef WOLFSSL_KEIL
  10097. "adcs r4, r4, r5\n\t"
  10098. #elif defined(__clang__)
  10099. "adcs r4, r5\n\t"
  10100. #else
  10101. "adc r4, r5\n\t"
  10102. #endif
  10103. "stm %[r]!, {r3, r4}\n\t"
  10104. "movs %[r], #0\n\t"
  10105. #ifdef WOLFSSL_KEIL
  10106. "adcs %[r], %[r], %[r]\n\t"
  10107. #elif defined(__clang__)
  10108. "adcs %[r], %[r]\n\t"
  10109. #else
  10110. "adc %[r], %[r]\n\t"
  10111. #endif
  10112. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  10113. :
  10114. : "memory", "r3", "r4", "r5"
  10115. );
  10116. return (uint32_t)(size_t)r;
  10117. }
  10118. /* Sub b from a into a. (a -= b)
  10119. *
  10120. * a A single precision integer.
  10121. * b A single precision integer.
  10122. */
  10123. SP_NOINLINE static sp_digit sp_2048_sub_in_place_32(sp_digit* a,
  10124. const sp_digit* b)
  10125. {
  10126. __asm__ __volatile__ (
  10127. "ldm %[b]!, {r4, r5}\n\t"
  10128. "ldr r2, [%[a]]\n\t"
  10129. "ldr r3, [%[a], #4]\n\t"
  10130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10131. "subs r2, r2, r4\n\t"
  10132. #else
  10133. "sub r2, r2, r4\n\t"
  10134. #endif
  10135. #ifdef WOLFSSL_KEIL
  10136. "sbcs r3, r3, r5\n\t"
  10137. #elif defined(__clang__)
  10138. "sbcs r3, r5\n\t"
  10139. #else
  10140. "sbc r3, r5\n\t"
  10141. #endif
  10142. "stm %[a]!, {r2, r3}\n\t"
  10143. "ldm %[b]!, {r4, r5}\n\t"
  10144. "ldr r2, [%[a]]\n\t"
  10145. "ldr r3, [%[a], #4]\n\t"
  10146. #ifdef WOLFSSL_KEIL
  10147. "sbcs r2, r2, r4\n\t"
  10148. #elif defined(__clang__)
  10149. "sbcs r2, r4\n\t"
  10150. #else
  10151. "sbc r2, r4\n\t"
  10152. #endif
  10153. #ifdef WOLFSSL_KEIL
  10154. "sbcs r3, r3, r5\n\t"
  10155. #elif defined(__clang__)
  10156. "sbcs r3, r5\n\t"
  10157. #else
  10158. "sbc r3, r5\n\t"
  10159. #endif
  10160. "stm %[a]!, {r2, r3}\n\t"
  10161. "ldm %[b]!, {r4, r5}\n\t"
  10162. "ldr r2, [%[a]]\n\t"
  10163. "ldr r3, [%[a], #4]\n\t"
  10164. #ifdef WOLFSSL_KEIL
  10165. "sbcs r2, r2, r4\n\t"
  10166. #elif defined(__clang__)
  10167. "sbcs r2, r4\n\t"
  10168. #else
  10169. "sbc r2, r4\n\t"
  10170. #endif
  10171. #ifdef WOLFSSL_KEIL
  10172. "sbcs r3, r3, r5\n\t"
  10173. #elif defined(__clang__)
  10174. "sbcs r3, r5\n\t"
  10175. #else
  10176. "sbc r3, r5\n\t"
  10177. #endif
  10178. "stm %[a]!, {r2, r3}\n\t"
  10179. "ldm %[b]!, {r4, r5}\n\t"
  10180. "ldr r2, [%[a]]\n\t"
  10181. "ldr r3, [%[a], #4]\n\t"
  10182. #ifdef WOLFSSL_KEIL
  10183. "sbcs r2, r2, r4\n\t"
  10184. #elif defined(__clang__)
  10185. "sbcs r2, r4\n\t"
  10186. #else
  10187. "sbc r2, r4\n\t"
  10188. #endif
  10189. #ifdef WOLFSSL_KEIL
  10190. "sbcs r3, r3, r5\n\t"
  10191. #elif defined(__clang__)
  10192. "sbcs r3, r5\n\t"
  10193. #else
  10194. "sbc r3, r5\n\t"
  10195. #endif
  10196. "stm %[a]!, {r2, r3}\n\t"
  10197. "ldm %[b]!, {r4, r5}\n\t"
  10198. "ldr r2, [%[a]]\n\t"
  10199. "ldr r3, [%[a], #4]\n\t"
  10200. #ifdef WOLFSSL_KEIL
  10201. "sbcs r2, r2, r4\n\t"
  10202. #elif defined(__clang__)
  10203. "sbcs r2, r4\n\t"
  10204. #else
  10205. "sbc r2, r4\n\t"
  10206. #endif
  10207. #ifdef WOLFSSL_KEIL
  10208. "sbcs r3, r3, r5\n\t"
  10209. #elif defined(__clang__)
  10210. "sbcs r3, r5\n\t"
  10211. #else
  10212. "sbc r3, r5\n\t"
  10213. #endif
  10214. "stm %[a]!, {r2, r3}\n\t"
  10215. "ldm %[b]!, {r4, r5}\n\t"
  10216. "ldr r2, [%[a]]\n\t"
  10217. "ldr r3, [%[a], #4]\n\t"
  10218. #ifdef WOLFSSL_KEIL
  10219. "sbcs r2, r2, r4\n\t"
  10220. #elif defined(__clang__)
  10221. "sbcs r2, r4\n\t"
  10222. #else
  10223. "sbc r2, r4\n\t"
  10224. #endif
  10225. #ifdef WOLFSSL_KEIL
  10226. "sbcs r3, r3, r5\n\t"
  10227. #elif defined(__clang__)
  10228. "sbcs r3, r5\n\t"
  10229. #else
  10230. "sbc r3, r5\n\t"
  10231. #endif
  10232. "stm %[a]!, {r2, r3}\n\t"
  10233. "ldm %[b]!, {r4, r5}\n\t"
  10234. "ldr r2, [%[a]]\n\t"
  10235. "ldr r3, [%[a], #4]\n\t"
  10236. #ifdef WOLFSSL_KEIL
  10237. "sbcs r2, r2, r4\n\t"
  10238. #elif defined(__clang__)
  10239. "sbcs r2, r4\n\t"
  10240. #else
  10241. "sbc r2, r4\n\t"
  10242. #endif
  10243. #ifdef WOLFSSL_KEIL
  10244. "sbcs r3, r3, r5\n\t"
  10245. #elif defined(__clang__)
  10246. "sbcs r3, r5\n\t"
  10247. #else
  10248. "sbc r3, r5\n\t"
  10249. #endif
  10250. "stm %[a]!, {r2, r3}\n\t"
  10251. "ldm %[b]!, {r4, r5}\n\t"
  10252. "ldr r2, [%[a]]\n\t"
  10253. "ldr r3, [%[a], #4]\n\t"
  10254. #ifdef WOLFSSL_KEIL
  10255. "sbcs r2, r2, r4\n\t"
  10256. #elif defined(__clang__)
  10257. "sbcs r2, r4\n\t"
  10258. #else
  10259. "sbc r2, r4\n\t"
  10260. #endif
  10261. #ifdef WOLFSSL_KEIL
  10262. "sbcs r3, r3, r5\n\t"
  10263. #elif defined(__clang__)
  10264. "sbcs r3, r5\n\t"
  10265. #else
  10266. "sbc r3, r5\n\t"
  10267. #endif
  10268. "stm %[a]!, {r2, r3}\n\t"
  10269. "ldm %[b]!, {r4, r5}\n\t"
  10270. "ldr r2, [%[a]]\n\t"
  10271. "ldr r3, [%[a], #4]\n\t"
  10272. #ifdef WOLFSSL_KEIL
  10273. "sbcs r2, r2, r4\n\t"
  10274. #elif defined(__clang__)
  10275. "sbcs r2, r4\n\t"
  10276. #else
  10277. "sbc r2, r4\n\t"
  10278. #endif
  10279. #ifdef WOLFSSL_KEIL
  10280. "sbcs r3, r3, r5\n\t"
  10281. #elif defined(__clang__)
  10282. "sbcs r3, r5\n\t"
  10283. #else
  10284. "sbc r3, r5\n\t"
  10285. #endif
  10286. "stm %[a]!, {r2, r3}\n\t"
  10287. "ldm %[b]!, {r4, r5}\n\t"
  10288. "ldr r2, [%[a]]\n\t"
  10289. "ldr r3, [%[a], #4]\n\t"
  10290. #ifdef WOLFSSL_KEIL
  10291. "sbcs r2, r2, r4\n\t"
  10292. #elif defined(__clang__)
  10293. "sbcs r2, r4\n\t"
  10294. #else
  10295. "sbc r2, r4\n\t"
  10296. #endif
  10297. #ifdef WOLFSSL_KEIL
  10298. "sbcs r3, r3, r5\n\t"
  10299. #elif defined(__clang__)
  10300. "sbcs r3, r5\n\t"
  10301. #else
  10302. "sbc r3, r5\n\t"
  10303. #endif
  10304. "stm %[a]!, {r2, r3}\n\t"
  10305. "ldm %[b]!, {r4, r5}\n\t"
  10306. "ldr r2, [%[a]]\n\t"
  10307. "ldr r3, [%[a], #4]\n\t"
  10308. #ifdef WOLFSSL_KEIL
  10309. "sbcs r2, r2, r4\n\t"
  10310. #elif defined(__clang__)
  10311. "sbcs r2, r4\n\t"
  10312. #else
  10313. "sbc r2, r4\n\t"
  10314. #endif
  10315. #ifdef WOLFSSL_KEIL
  10316. "sbcs r3, r3, r5\n\t"
  10317. #elif defined(__clang__)
  10318. "sbcs r3, r5\n\t"
  10319. #else
  10320. "sbc r3, r5\n\t"
  10321. #endif
  10322. "stm %[a]!, {r2, r3}\n\t"
  10323. "ldm %[b]!, {r4, r5}\n\t"
  10324. "ldr r2, [%[a]]\n\t"
  10325. "ldr r3, [%[a], #4]\n\t"
  10326. #ifdef WOLFSSL_KEIL
  10327. "sbcs r2, r2, r4\n\t"
  10328. #elif defined(__clang__)
  10329. "sbcs r2, r4\n\t"
  10330. #else
  10331. "sbc r2, r4\n\t"
  10332. #endif
  10333. #ifdef WOLFSSL_KEIL
  10334. "sbcs r3, r3, r5\n\t"
  10335. #elif defined(__clang__)
  10336. "sbcs r3, r5\n\t"
  10337. #else
  10338. "sbc r3, r5\n\t"
  10339. #endif
  10340. "stm %[a]!, {r2, r3}\n\t"
  10341. "ldm %[b]!, {r4, r5}\n\t"
  10342. "ldr r2, [%[a]]\n\t"
  10343. "ldr r3, [%[a], #4]\n\t"
  10344. #ifdef WOLFSSL_KEIL
  10345. "sbcs r2, r2, r4\n\t"
  10346. #elif defined(__clang__)
  10347. "sbcs r2, r4\n\t"
  10348. #else
  10349. "sbc r2, r4\n\t"
  10350. #endif
  10351. #ifdef WOLFSSL_KEIL
  10352. "sbcs r3, r3, r5\n\t"
  10353. #elif defined(__clang__)
  10354. "sbcs r3, r5\n\t"
  10355. #else
  10356. "sbc r3, r5\n\t"
  10357. #endif
  10358. "stm %[a]!, {r2, r3}\n\t"
  10359. "ldm %[b]!, {r4, r5}\n\t"
  10360. "ldr r2, [%[a]]\n\t"
  10361. "ldr r3, [%[a], #4]\n\t"
  10362. #ifdef WOLFSSL_KEIL
  10363. "sbcs r2, r2, r4\n\t"
  10364. #elif defined(__clang__)
  10365. "sbcs r2, r4\n\t"
  10366. #else
  10367. "sbc r2, r4\n\t"
  10368. #endif
  10369. #ifdef WOLFSSL_KEIL
  10370. "sbcs r3, r3, r5\n\t"
  10371. #elif defined(__clang__)
  10372. "sbcs r3, r5\n\t"
  10373. #else
  10374. "sbc r3, r5\n\t"
  10375. #endif
  10376. "stm %[a]!, {r2, r3}\n\t"
  10377. "ldm %[b]!, {r4, r5}\n\t"
  10378. "ldr r2, [%[a]]\n\t"
  10379. "ldr r3, [%[a], #4]\n\t"
  10380. #ifdef WOLFSSL_KEIL
  10381. "sbcs r2, r2, r4\n\t"
  10382. #elif defined(__clang__)
  10383. "sbcs r2, r4\n\t"
  10384. #else
  10385. "sbc r2, r4\n\t"
  10386. #endif
  10387. #ifdef WOLFSSL_KEIL
  10388. "sbcs r3, r3, r5\n\t"
  10389. #elif defined(__clang__)
  10390. "sbcs r3, r5\n\t"
  10391. #else
  10392. "sbc r3, r5\n\t"
  10393. #endif
  10394. "stm %[a]!, {r2, r3}\n\t"
  10395. "ldm %[b]!, {r4, r5}\n\t"
  10396. "ldr r2, [%[a]]\n\t"
  10397. "ldr r3, [%[a], #4]\n\t"
  10398. #ifdef WOLFSSL_KEIL
  10399. "sbcs r2, r2, r4\n\t"
  10400. #elif defined(__clang__)
  10401. "sbcs r2, r4\n\t"
  10402. #else
  10403. "sbc r2, r4\n\t"
  10404. #endif
  10405. #ifdef WOLFSSL_KEIL
  10406. "sbcs r3, r3, r5\n\t"
  10407. #elif defined(__clang__)
  10408. "sbcs r3, r5\n\t"
  10409. #else
  10410. "sbc r3, r5\n\t"
  10411. #endif
  10412. "stm %[a]!, {r2, r3}\n\t"
  10413. #ifdef WOLFSSL_KEIL
  10414. "sbcs %[a], %[a], %[a]\n\t"
  10415. #elif defined(__clang__)
  10416. "sbcs %[a], %[a]\n\t"
  10417. #else
  10418. "sbc %[a], %[a]\n\t"
  10419. #endif
  10420. : [a] "+l" (a), [b] "+l" (b)
  10421. :
  10422. : "memory", "r2", "r3", "r4", "r5"
  10423. );
  10424. return (uint32_t)(size_t)a;
  10425. }
  10426. /* Add b to a into r. (r = a + b)
  10427. *
  10428. * r A single precision integer.
  10429. * a A single precision integer.
  10430. * b A single precision integer.
  10431. */
  10432. SP_NOINLINE static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a,
  10433. const sp_digit* b)
  10434. {
  10435. __asm__ __volatile__ (
  10436. "ldm %[b]!, {r5, r6}\n\t"
  10437. "ldm %[a]!, {r3, r4}\n\t"
  10438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10439. "adds r3, r3, r5\n\t"
  10440. #else
  10441. "add r3, r3, r5\n\t"
  10442. #endif
  10443. #ifdef WOLFSSL_KEIL
  10444. "adcs r4, r4, r6\n\t"
  10445. #elif defined(__clang__)
  10446. "adcs r4, r6\n\t"
  10447. #else
  10448. "adc r4, r6\n\t"
  10449. #endif
  10450. "stm %[r]!, {r3, r4}\n\t"
  10451. "ldm %[b]!, {r5, r6}\n\t"
  10452. "ldm %[a]!, {r3, r4}\n\t"
  10453. #ifdef WOLFSSL_KEIL
  10454. "adcs r3, r3, r5\n\t"
  10455. #elif defined(__clang__)
  10456. "adcs r3, r5\n\t"
  10457. #else
  10458. "adc r3, r5\n\t"
  10459. #endif
  10460. #ifdef WOLFSSL_KEIL
  10461. "adcs r4, r4, r6\n\t"
  10462. #elif defined(__clang__)
  10463. "adcs r4, r6\n\t"
  10464. #else
  10465. "adc r4, r6\n\t"
  10466. #endif
  10467. "stm %[r]!, {r3, r4}\n\t"
  10468. "ldm %[b]!, {r5, r6}\n\t"
  10469. "ldm %[a]!, {r3, r4}\n\t"
  10470. #ifdef WOLFSSL_KEIL
  10471. "adcs r3, r3, r5\n\t"
  10472. #elif defined(__clang__)
  10473. "adcs r3, r5\n\t"
  10474. #else
  10475. "adc r3, r5\n\t"
  10476. #endif
  10477. #ifdef WOLFSSL_KEIL
  10478. "adcs r4, r4, r6\n\t"
  10479. #elif defined(__clang__)
  10480. "adcs r4, r6\n\t"
  10481. #else
  10482. "adc r4, r6\n\t"
  10483. #endif
  10484. "stm %[r]!, {r3, r4}\n\t"
  10485. "ldm %[b]!, {r5, r6}\n\t"
  10486. "ldm %[a]!, {r3, r4}\n\t"
  10487. #ifdef WOLFSSL_KEIL
  10488. "adcs r3, r3, r5\n\t"
  10489. #elif defined(__clang__)
  10490. "adcs r3, r5\n\t"
  10491. #else
  10492. "adc r3, r5\n\t"
  10493. #endif
  10494. #ifdef WOLFSSL_KEIL
  10495. "adcs r4, r4, r6\n\t"
  10496. #elif defined(__clang__)
  10497. "adcs r4, r6\n\t"
  10498. #else
  10499. "adc r4, r6\n\t"
  10500. #endif
  10501. "stm %[r]!, {r3, r4}\n\t"
  10502. "ldm %[b]!, {r5, r6}\n\t"
  10503. "ldm %[a]!, {r3, r4}\n\t"
  10504. #ifdef WOLFSSL_KEIL
  10505. "adcs r3, r3, r5\n\t"
  10506. #elif defined(__clang__)
  10507. "adcs r3, r5\n\t"
  10508. #else
  10509. "adc r3, r5\n\t"
  10510. #endif
  10511. #ifdef WOLFSSL_KEIL
  10512. "adcs r4, r4, r6\n\t"
  10513. #elif defined(__clang__)
  10514. "adcs r4, r6\n\t"
  10515. #else
  10516. "adc r4, r6\n\t"
  10517. #endif
  10518. "stm %[r]!, {r3, r4}\n\t"
  10519. "ldm %[b]!, {r5, r6}\n\t"
  10520. "ldm %[a]!, {r3, r4}\n\t"
  10521. #ifdef WOLFSSL_KEIL
  10522. "adcs r3, r3, r5\n\t"
  10523. #elif defined(__clang__)
  10524. "adcs r3, r5\n\t"
  10525. #else
  10526. "adc r3, r5\n\t"
  10527. #endif
  10528. #ifdef WOLFSSL_KEIL
  10529. "adcs r4, r4, r6\n\t"
  10530. #elif defined(__clang__)
  10531. "adcs r4, r6\n\t"
  10532. #else
  10533. "adc r4, r6\n\t"
  10534. #endif
  10535. "stm %[r]!, {r3, r4}\n\t"
  10536. "ldm %[b]!, {r5, r6}\n\t"
  10537. "ldm %[a]!, {r3, r4}\n\t"
  10538. #ifdef WOLFSSL_KEIL
  10539. "adcs r3, r3, r5\n\t"
  10540. #elif defined(__clang__)
  10541. "adcs r3, r5\n\t"
  10542. #else
  10543. "adc r3, r5\n\t"
  10544. #endif
  10545. #ifdef WOLFSSL_KEIL
  10546. "adcs r4, r4, r6\n\t"
  10547. #elif defined(__clang__)
  10548. "adcs r4, r6\n\t"
  10549. #else
  10550. "adc r4, r6\n\t"
  10551. #endif
  10552. "stm %[r]!, {r3, r4}\n\t"
  10553. "ldm %[b]!, {r5, r6}\n\t"
  10554. "ldm %[a]!, {r3, r4}\n\t"
  10555. #ifdef WOLFSSL_KEIL
  10556. "adcs r3, r3, r5\n\t"
  10557. #elif defined(__clang__)
  10558. "adcs r3, r5\n\t"
  10559. #else
  10560. "adc r3, r5\n\t"
  10561. #endif
  10562. #ifdef WOLFSSL_KEIL
  10563. "adcs r4, r4, r6\n\t"
  10564. #elif defined(__clang__)
  10565. "adcs r4, r6\n\t"
  10566. #else
  10567. "adc r4, r6\n\t"
  10568. #endif
  10569. "stm %[r]!, {r3, r4}\n\t"
  10570. "ldm %[b]!, {r5, r6}\n\t"
  10571. "ldm %[a]!, {r3, r4}\n\t"
  10572. #ifdef WOLFSSL_KEIL
  10573. "adcs r3, r3, r5\n\t"
  10574. #elif defined(__clang__)
  10575. "adcs r3, r5\n\t"
  10576. #else
  10577. "adc r3, r5\n\t"
  10578. #endif
  10579. #ifdef WOLFSSL_KEIL
  10580. "adcs r4, r4, r6\n\t"
  10581. #elif defined(__clang__)
  10582. "adcs r4, r6\n\t"
  10583. #else
  10584. "adc r4, r6\n\t"
  10585. #endif
  10586. "stm %[r]!, {r3, r4}\n\t"
  10587. "ldm %[b]!, {r5, r6}\n\t"
  10588. "ldm %[a]!, {r3, r4}\n\t"
  10589. #ifdef WOLFSSL_KEIL
  10590. "adcs r3, r3, r5\n\t"
  10591. #elif defined(__clang__)
  10592. "adcs r3, r5\n\t"
  10593. #else
  10594. "adc r3, r5\n\t"
  10595. #endif
  10596. #ifdef WOLFSSL_KEIL
  10597. "adcs r4, r4, r6\n\t"
  10598. #elif defined(__clang__)
  10599. "adcs r4, r6\n\t"
  10600. #else
  10601. "adc r4, r6\n\t"
  10602. #endif
  10603. "stm %[r]!, {r3, r4}\n\t"
  10604. "ldm %[b]!, {r5, r6}\n\t"
  10605. "ldm %[a]!, {r3, r4}\n\t"
  10606. #ifdef WOLFSSL_KEIL
  10607. "adcs r3, r3, r5\n\t"
  10608. #elif defined(__clang__)
  10609. "adcs r3, r5\n\t"
  10610. #else
  10611. "adc r3, r5\n\t"
  10612. #endif
  10613. #ifdef WOLFSSL_KEIL
  10614. "adcs r4, r4, r6\n\t"
  10615. #elif defined(__clang__)
  10616. "adcs r4, r6\n\t"
  10617. #else
  10618. "adc r4, r6\n\t"
  10619. #endif
  10620. "stm %[r]!, {r3, r4}\n\t"
  10621. "ldm %[b]!, {r5, r6}\n\t"
  10622. "ldm %[a]!, {r3, r4}\n\t"
  10623. #ifdef WOLFSSL_KEIL
  10624. "adcs r3, r3, r5\n\t"
  10625. #elif defined(__clang__)
  10626. "adcs r3, r5\n\t"
  10627. #else
  10628. "adc r3, r5\n\t"
  10629. #endif
  10630. #ifdef WOLFSSL_KEIL
  10631. "adcs r4, r4, r6\n\t"
  10632. #elif defined(__clang__)
  10633. "adcs r4, r6\n\t"
  10634. #else
  10635. "adc r4, r6\n\t"
  10636. #endif
  10637. "stm %[r]!, {r3, r4}\n\t"
  10638. "ldm %[b]!, {r5, r6}\n\t"
  10639. "ldm %[a]!, {r3, r4}\n\t"
  10640. #ifdef WOLFSSL_KEIL
  10641. "adcs r3, r3, r5\n\t"
  10642. #elif defined(__clang__)
  10643. "adcs r3, r5\n\t"
  10644. #else
  10645. "adc r3, r5\n\t"
  10646. #endif
  10647. #ifdef WOLFSSL_KEIL
  10648. "adcs r4, r4, r6\n\t"
  10649. #elif defined(__clang__)
  10650. "adcs r4, r6\n\t"
  10651. #else
  10652. "adc r4, r6\n\t"
  10653. #endif
  10654. "stm %[r]!, {r3, r4}\n\t"
  10655. "ldm %[b]!, {r5, r6}\n\t"
  10656. "ldm %[a]!, {r3, r4}\n\t"
  10657. #ifdef WOLFSSL_KEIL
  10658. "adcs r3, r3, r5\n\t"
  10659. #elif defined(__clang__)
  10660. "adcs r3, r5\n\t"
  10661. #else
  10662. "adc r3, r5\n\t"
  10663. #endif
  10664. #ifdef WOLFSSL_KEIL
  10665. "adcs r4, r4, r6\n\t"
  10666. #elif defined(__clang__)
  10667. "adcs r4, r6\n\t"
  10668. #else
  10669. "adc r4, r6\n\t"
  10670. #endif
  10671. "stm %[r]!, {r3, r4}\n\t"
  10672. "ldm %[b]!, {r5, r6}\n\t"
  10673. "ldm %[a]!, {r3, r4}\n\t"
  10674. #ifdef WOLFSSL_KEIL
  10675. "adcs r3, r3, r5\n\t"
  10676. #elif defined(__clang__)
  10677. "adcs r3, r5\n\t"
  10678. #else
  10679. "adc r3, r5\n\t"
  10680. #endif
  10681. #ifdef WOLFSSL_KEIL
  10682. "adcs r4, r4, r6\n\t"
  10683. #elif defined(__clang__)
  10684. "adcs r4, r6\n\t"
  10685. #else
  10686. "adc r4, r6\n\t"
  10687. #endif
  10688. "stm %[r]!, {r3, r4}\n\t"
  10689. "ldm %[b]!, {r5, r6}\n\t"
  10690. "ldm %[a]!, {r3, r4}\n\t"
  10691. #ifdef WOLFSSL_KEIL
  10692. "adcs r3, r3, r5\n\t"
  10693. #elif defined(__clang__)
  10694. "adcs r3, r5\n\t"
  10695. #else
  10696. "adc r3, r5\n\t"
  10697. #endif
  10698. #ifdef WOLFSSL_KEIL
  10699. "adcs r4, r4, r6\n\t"
  10700. #elif defined(__clang__)
  10701. "adcs r4, r6\n\t"
  10702. #else
  10703. "adc r4, r6\n\t"
  10704. #endif
  10705. "stm %[r]!, {r3, r4}\n\t"
  10706. "movs %[r], #0\n\t"
  10707. #ifdef WOLFSSL_KEIL
  10708. "adcs %[r], %[r], %[r]\n\t"
  10709. #elif defined(__clang__)
  10710. "adcs %[r], %[r]\n\t"
  10711. #else
  10712. "adc %[r], %[r]\n\t"
  10713. #endif
  10714. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  10715. :
  10716. : "memory", "r3", "r4", "r5", "r6"
  10717. );
  10718. return (uint32_t)(size_t)r;
  10719. }
  10720. /* AND m into each word of a and store in r.
  10721. *
  10722. * r A single precision integer.
  10723. * a A single precision integer.
  10724. * m Mask to AND against each digit.
  10725. */
  10726. static void sp_2048_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
  10727. {
  10728. #ifdef WOLFSSL_SP_SMALL
  10729. int i;
  10730. for (i=0; i<16; i++) {
  10731. r[i] = a[i] & m;
  10732. }
  10733. #else
  10734. int i;
  10735. for (i = 0; i < 16; i += 8) {
  10736. r[i+0] = a[i+0] & m;
  10737. r[i+1] = a[i+1] & m;
  10738. r[i+2] = a[i+2] & m;
  10739. r[i+3] = a[i+3] & m;
  10740. r[i+4] = a[i+4] & m;
  10741. r[i+5] = a[i+5] & m;
  10742. r[i+6] = a[i+6] & m;
  10743. r[i+7] = a[i+7] & m;
  10744. }
  10745. #endif
  10746. }
  10747. /* Multiply a and b into r. (r = a * b)
  10748. *
  10749. * r A single precision integer.
  10750. * a A single precision integer.
  10751. * b A single precision integer.
  10752. */
  10753. SP_NOINLINE static void sp_2048_mul_32(sp_digit* r, const sp_digit* a,
  10754. const sp_digit* b)
  10755. {
  10756. sp_digit* z0 = r;
  10757. sp_digit z1[32];
  10758. sp_digit a1[16];
  10759. sp_digit b1[16];
  10760. sp_digit* z2 = r + 32;
  10761. sp_digit u;
  10762. sp_digit ca;
  10763. sp_digit cb;
  10764. ca = sp_2048_add_16(a1, a, &a[16]);
  10765. cb = sp_2048_add_16(b1, b, &b[16]);
  10766. u = ca & cb;
  10767. sp_2048_mul_16(z2, &a[16], &b[16]);
  10768. sp_2048_mul_16(z0, a, b);
  10769. sp_2048_mul_16(z1, a1, b1);
  10770. u += sp_2048_sub_in_place_32(z1, z0);
  10771. u += sp_2048_sub_in_place_32(z1, z2);
  10772. sp_2048_mask_16(a1, a1, 0 - cb);
  10773. u += sp_2048_add_16(z1 + 16, z1 + 16, a1);
  10774. sp_2048_mask_16(b1, b1, 0 - ca);
  10775. u += sp_2048_add_16(z1 + 16, z1 + 16, b1);
  10776. u += sp_2048_add_32(r + 16, r + 16, z1);
  10777. (void)sp_2048_add_word_16(r + 48, r + 48, u);
  10778. }
  10779. /* Add b to a into r. (r = a + b)
  10780. *
  10781. * r A single precision integer.
  10782. * a A single precision integer.
  10783. * b A single precision integer.
  10784. */
  10785. SP_NOINLINE static sp_digit sp_2048_add_word_32(sp_digit* r, const sp_digit* a,
  10786. sp_digit b)
  10787. {
  10788. __asm__ __volatile__ (
  10789. "movs r5, #0\n\t"
  10790. "ldm %[a]!, {r3, r4}\n\t"
  10791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10792. "adds r3, r3, %[b]\n\t"
  10793. #else
  10794. "add r3, r3, %[b]\n\t"
  10795. #endif
  10796. #ifdef WOLFSSL_KEIL
  10797. "adcs r4, r4, r5\n\t"
  10798. #elif defined(__clang__)
  10799. "adcs r4, r5\n\t"
  10800. #else
  10801. "adc r4, r5\n\t"
  10802. #endif
  10803. "stm %[r]!, {r3, r4}\n\t"
  10804. "ldm %[a]!, {r3, r4}\n\t"
  10805. #ifdef WOLFSSL_KEIL
  10806. "adcs r3, r3, r5\n\t"
  10807. #elif defined(__clang__)
  10808. "adcs r3, r5\n\t"
  10809. #else
  10810. "adc r3, r5\n\t"
  10811. #endif
  10812. #ifdef WOLFSSL_KEIL
  10813. "adcs r4, r4, r5\n\t"
  10814. #elif defined(__clang__)
  10815. "adcs r4, r5\n\t"
  10816. #else
  10817. "adc r4, r5\n\t"
  10818. #endif
  10819. "stm %[r]!, {r3, r4}\n\t"
  10820. "ldm %[a]!, {r3, r4}\n\t"
  10821. #ifdef WOLFSSL_KEIL
  10822. "adcs r3, r3, r5\n\t"
  10823. #elif defined(__clang__)
  10824. "adcs r3, r5\n\t"
  10825. #else
  10826. "adc r3, r5\n\t"
  10827. #endif
  10828. #ifdef WOLFSSL_KEIL
  10829. "adcs r4, r4, r5\n\t"
  10830. #elif defined(__clang__)
  10831. "adcs r4, r5\n\t"
  10832. #else
  10833. "adc r4, r5\n\t"
  10834. #endif
  10835. "stm %[r]!, {r3, r4}\n\t"
  10836. "ldm %[a]!, {r3, r4}\n\t"
  10837. #ifdef WOLFSSL_KEIL
  10838. "adcs r3, r3, r5\n\t"
  10839. #elif defined(__clang__)
  10840. "adcs r3, r5\n\t"
  10841. #else
  10842. "adc r3, r5\n\t"
  10843. #endif
  10844. #ifdef WOLFSSL_KEIL
  10845. "adcs r4, r4, r5\n\t"
  10846. #elif defined(__clang__)
  10847. "adcs r4, r5\n\t"
  10848. #else
  10849. "adc r4, r5\n\t"
  10850. #endif
  10851. "stm %[r]!, {r3, r4}\n\t"
  10852. "ldm %[a]!, {r3, r4}\n\t"
  10853. #ifdef WOLFSSL_KEIL
  10854. "adcs r3, r3, r5\n\t"
  10855. #elif defined(__clang__)
  10856. "adcs r3, r5\n\t"
  10857. #else
  10858. "adc r3, r5\n\t"
  10859. #endif
  10860. #ifdef WOLFSSL_KEIL
  10861. "adcs r4, r4, r5\n\t"
  10862. #elif defined(__clang__)
  10863. "adcs r4, r5\n\t"
  10864. #else
  10865. "adc r4, r5\n\t"
  10866. #endif
  10867. "stm %[r]!, {r3, r4}\n\t"
  10868. "ldm %[a]!, {r3, r4}\n\t"
  10869. #ifdef WOLFSSL_KEIL
  10870. "adcs r3, r3, r5\n\t"
  10871. #elif defined(__clang__)
  10872. "adcs r3, r5\n\t"
  10873. #else
  10874. "adc r3, r5\n\t"
  10875. #endif
  10876. #ifdef WOLFSSL_KEIL
  10877. "adcs r4, r4, r5\n\t"
  10878. #elif defined(__clang__)
  10879. "adcs r4, r5\n\t"
  10880. #else
  10881. "adc r4, r5\n\t"
  10882. #endif
  10883. "stm %[r]!, {r3, r4}\n\t"
  10884. "ldm %[a]!, {r3, r4}\n\t"
  10885. #ifdef WOLFSSL_KEIL
  10886. "adcs r3, r3, r5\n\t"
  10887. #elif defined(__clang__)
  10888. "adcs r3, r5\n\t"
  10889. #else
  10890. "adc r3, r5\n\t"
  10891. #endif
  10892. #ifdef WOLFSSL_KEIL
  10893. "adcs r4, r4, r5\n\t"
  10894. #elif defined(__clang__)
  10895. "adcs r4, r5\n\t"
  10896. #else
  10897. "adc r4, r5\n\t"
  10898. #endif
  10899. "stm %[r]!, {r3, r4}\n\t"
  10900. "ldm %[a]!, {r3, r4}\n\t"
  10901. #ifdef WOLFSSL_KEIL
  10902. "adcs r3, r3, r5\n\t"
  10903. #elif defined(__clang__)
  10904. "adcs r3, r5\n\t"
  10905. #else
  10906. "adc r3, r5\n\t"
  10907. #endif
  10908. #ifdef WOLFSSL_KEIL
  10909. "adcs r4, r4, r5\n\t"
  10910. #elif defined(__clang__)
  10911. "adcs r4, r5\n\t"
  10912. #else
  10913. "adc r4, r5\n\t"
  10914. #endif
  10915. "stm %[r]!, {r3, r4}\n\t"
  10916. "ldm %[a]!, {r3, r4}\n\t"
  10917. #ifdef WOLFSSL_KEIL
  10918. "adcs r3, r3, r5\n\t"
  10919. #elif defined(__clang__)
  10920. "adcs r3, r5\n\t"
  10921. #else
  10922. "adc r3, r5\n\t"
  10923. #endif
  10924. #ifdef WOLFSSL_KEIL
  10925. "adcs r4, r4, r5\n\t"
  10926. #elif defined(__clang__)
  10927. "adcs r4, r5\n\t"
  10928. #else
  10929. "adc r4, r5\n\t"
  10930. #endif
  10931. "stm %[r]!, {r3, r4}\n\t"
  10932. "ldm %[a]!, {r3, r4}\n\t"
  10933. #ifdef WOLFSSL_KEIL
  10934. "adcs r3, r3, r5\n\t"
  10935. #elif defined(__clang__)
  10936. "adcs r3, r5\n\t"
  10937. #else
  10938. "adc r3, r5\n\t"
  10939. #endif
  10940. #ifdef WOLFSSL_KEIL
  10941. "adcs r4, r4, r5\n\t"
  10942. #elif defined(__clang__)
  10943. "adcs r4, r5\n\t"
  10944. #else
  10945. "adc r4, r5\n\t"
  10946. #endif
  10947. "stm %[r]!, {r3, r4}\n\t"
  10948. "ldm %[a]!, {r3, r4}\n\t"
  10949. #ifdef WOLFSSL_KEIL
  10950. "adcs r3, r3, r5\n\t"
  10951. #elif defined(__clang__)
  10952. "adcs r3, r5\n\t"
  10953. #else
  10954. "adc r3, r5\n\t"
  10955. #endif
  10956. #ifdef WOLFSSL_KEIL
  10957. "adcs r4, r4, r5\n\t"
  10958. #elif defined(__clang__)
  10959. "adcs r4, r5\n\t"
  10960. #else
  10961. "adc r4, r5\n\t"
  10962. #endif
  10963. "stm %[r]!, {r3, r4}\n\t"
  10964. "ldm %[a]!, {r3, r4}\n\t"
  10965. #ifdef WOLFSSL_KEIL
  10966. "adcs r3, r3, r5\n\t"
  10967. #elif defined(__clang__)
  10968. "adcs r3, r5\n\t"
  10969. #else
  10970. "adc r3, r5\n\t"
  10971. #endif
  10972. #ifdef WOLFSSL_KEIL
  10973. "adcs r4, r4, r5\n\t"
  10974. #elif defined(__clang__)
  10975. "adcs r4, r5\n\t"
  10976. #else
  10977. "adc r4, r5\n\t"
  10978. #endif
  10979. "stm %[r]!, {r3, r4}\n\t"
  10980. "ldm %[a]!, {r3, r4}\n\t"
  10981. #ifdef WOLFSSL_KEIL
  10982. "adcs r3, r3, r5\n\t"
  10983. #elif defined(__clang__)
  10984. "adcs r3, r5\n\t"
  10985. #else
  10986. "adc r3, r5\n\t"
  10987. #endif
  10988. #ifdef WOLFSSL_KEIL
  10989. "adcs r4, r4, r5\n\t"
  10990. #elif defined(__clang__)
  10991. "adcs r4, r5\n\t"
  10992. #else
  10993. "adc r4, r5\n\t"
  10994. #endif
  10995. "stm %[r]!, {r3, r4}\n\t"
  10996. "ldm %[a]!, {r3, r4}\n\t"
  10997. #ifdef WOLFSSL_KEIL
  10998. "adcs r3, r3, r5\n\t"
  10999. #elif defined(__clang__)
  11000. "adcs r3, r5\n\t"
  11001. #else
  11002. "adc r3, r5\n\t"
  11003. #endif
  11004. #ifdef WOLFSSL_KEIL
  11005. "adcs r4, r4, r5\n\t"
  11006. #elif defined(__clang__)
  11007. "adcs r4, r5\n\t"
  11008. #else
  11009. "adc r4, r5\n\t"
  11010. #endif
  11011. "stm %[r]!, {r3, r4}\n\t"
  11012. "ldm %[a]!, {r3, r4}\n\t"
  11013. #ifdef WOLFSSL_KEIL
  11014. "adcs r3, r3, r5\n\t"
  11015. #elif defined(__clang__)
  11016. "adcs r3, r5\n\t"
  11017. #else
  11018. "adc r3, r5\n\t"
  11019. #endif
  11020. #ifdef WOLFSSL_KEIL
  11021. "adcs r4, r4, r5\n\t"
  11022. #elif defined(__clang__)
  11023. "adcs r4, r5\n\t"
  11024. #else
  11025. "adc r4, r5\n\t"
  11026. #endif
  11027. "stm %[r]!, {r3, r4}\n\t"
  11028. "ldm %[a]!, {r3, r4}\n\t"
  11029. #ifdef WOLFSSL_KEIL
  11030. "adcs r3, r3, r5\n\t"
  11031. #elif defined(__clang__)
  11032. "adcs r3, r5\n\t"
  11033. #else
  11034. "adc r3, r5\n\t"
  11035. #endif
  11036. #ifdef WOLFSSL_KEIL
  11037. "adcs r4, r4, r5\n\t"
  11038. #elif defined(__clang__)
  11039. "adcs r4, r5\n\t"
  11040. #else
  11041. "adc r4, r5\n\t"
  11042. #endif
  11043. "stm %[r]!, {r3, r4}\n\t"
  11044. "movs %[r], #0\n\t"
  11045. #ifdef WOLFSSL_KEIL
  11046. "adcs %[r], %[r], %[r]\n\t"
  11047. #elif defined(__clang__)
  11048. "adcs %[r], %[r]\n\t"
  11049. #else
  11050. "adc %[r], %[r]\n\t"
  11051. #endif
  11052. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  11053. :
  11054. : "memory", "r3", "r4", "r5"
  11055. );
  11056. return (uint32_t)(size_t)r;
  11057. }
  11058. /* Sub b from a into a. (a -= b)
  11059. *
  11060. * a A single precision integer.
  11061. * b A single precision integer.
  11062. */
  11063. SP_NOINLINE static sp_digit sp_2048_sub_in_place_64(sp_digit* a,
  11064. const sp_digit* b)
  11065. {
  11066. __asm__ __volatile__ (
  11067. "ldm %[b]!, {r4, r5}\n\t"
  11068. "ldr r2, [%[a]]\n\t"
  11069. "ldr r3, [%[a], #4]\n\t"
  11070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11071. "subs r2, r2, r4\n\t"
  11072. #else
  11073. "sub r2, r2, r4\n\t"
  11074. #endif
  11075. #ifdef WOLFSSL_KEIL
  11076. "sbcs r3, r3, r5\n\t"
  11077. #elif defined(__clang__)
  11078. "sbcs r3, r5\n\t"
  11079. #else
  11080. "sbc r3, r5\n\t"
  11081. #endif
  11082. "stm %[a]!, {r2, r3}\n\t"
  11083. "ldm %[b]!, {r4, r5}\n\t"
  11084. "ldr r2, [%[a]]\n\t"
  11085. "ldr r3, [%[a], #4]\n\t"
  11086. #ifdef WOLFSSL_KEIL
  11087. "sbcs r2, r2, r4\n\t"
  11088. #elif defined(__clang__)
  11089. "sbcs r2, r4\n\t"
  11090. #else
  11091. "sbc r2, r4\n\t"
  11092. #endif
  11093. #ifdef WOLFSSL_KEIL
  11094. "sbcs r3, r3, r5\n\t"
  11095. #elif defined(__clang__)
  11096. "sbcs r3, r5\n\t"
  11097. #else
  11098. "sbc r3, r5\n\t"
  11099. #endif
  11100. "stm %[a]!, {r2, r3}\n\t"
  11101. "ldm %[b]!, {r4, r5}\n\t"
  11102. "ldr r2, [%[a]]\n\t"
  11103. "ldr r3, [%[a], #4]\n\t"
  11104. #ifdef WOLFSSL_KEIL
  11105. "sbcs r2, r2, r4\n\t"
  11106. #elif defined(__clang__)
  11107. "sbcs r2, r4\n\t"
  11108. #else
  11109. "sbc r2, r4\n\t"
  11110. #endif
  11111. #ifdef WOLFSSL_KEIL
  11112. "sbcs r3, r3, r5\n\t"
  11113. #elif defined(__clang__)
  11114. "sbcs r3, r5\n\t"
  11115. #else
  11116. "sbc r3, r5\n\t"
  11117. #endif
  11118. "stm %[a]!, {r2, r3}\n\t"
  11119. "ldm %[b]!, {r4, r5}\n\t"
  11120. "ldr r2, [%[a]]\n\t"
  11121. "ldr r3, [%[a], #4]\n\t"
  11122. #ifdef WOLFSSL_KEIL
  11123. "sbcs r2, r2, r4\n\t"
  11124. #elif defined(__clang__)
  11125. "sbcs r2, r4\n\t"
  11126. #else
  11127. "sbc r2, r4\n\t"
  11128. #endif
  11129. #ifdef WOLFSSL_KEIL
  11130. "sbcs r3, r3, r5\n\t"
  11131. #elif defined(__clang__)
  11132. "sbcs r3, r5\n\t"
  11133. #else
  11134. "sbc r3, r5\n\t"
  11135. #endif
  11136. "stm %[a]!, {r2, r3}\n\t"
  11137. "ldm %[b]!, {r4, r5}\n\t"
  11138. "ldr r2, [%[a]]\n\t"
  11139. "ldr r3, [%[a], #4]\n\t"
  11140. #ifdef WOLFSSL_KEIL
  11141. "sbcs r2, r2, r4\n\t"
  11142. #elif defined(__clang__)
  11143. "sbcs r2, r4\n\t"
  11144. #else
  11145. "sbc r2, r4\n\t"
  11146. #endif
  11147. #ifdef WOLFSSL_KEIL
  11148. "sbcs r3, r3, r5\n\t"
  11149. #elif defined(__clang__)
  11150. "sbcs r3, r5\n\t"
  11151. #else
  11152. "sbc r3, r5\n\t"
  11153. #endif
  11154. "stm %[a]!, {r2, r3}\n\t"
  11155. "ldm %[b]!, {r4, r5}\n\t"
  11156. "ldr r2, [%[a]]\n\t"
  11157. "ldr r3, [%[a], #4]\n\t"
  11158. #ifdef WOLFSSL_KEIL
  11159. "sbcs r2, r2, r4\n\t"
  11160. #elif defined(__clang__)
  11161. "sbcs r2, r4\n\t"
  11162. #else
  11163. "sbc r2, r4\n\t"
  11164. #endif
  11165. #ifdef WOLFSSL_KEIL
  11166. "sbcs r3, r3, r5\n\t"
  11167. #elif defined(__clang__)
  11168. "sbcs r3, r5\n\t"
  11169. #else
  11170. "sbc r3, r5\n\t"
  11171. #endif
  11172. "stm %[a]!, {r2, r3}\n\t"
  11173. "ldm %[b]!, {r4, r5}\n\t"
  11174. "ldr r2, [%[a]]\n\t"
  11175. "ldr r3, [%[a], #4]\n\t"
  11176. #ifdef WOLFSSL_KEIL
  11177. "sbcs r2, r2, r4\n\t"
  11178. #elif defined(__clang__)
  11179. "sbcs r2, r4\n\t"
  11180. #else
  11181. "sbc r2, r4\n\t"
  11182. #endif
  11183. #ifdef WOLFSSL_KEIL
  11184. "sbcs r3, r3, r5\n\t"
  11185. #elif defined(__clang__)
  11186. "sbcs r3, r5\n\t"
  11187. #else
  11188. "sbc r3, r5\n\t"
  11189. #endif
  11190. "stm %[a]!, {r2, r3}\n\t"
  11191. "ldm %[b]!, {r4, r5}\n\t"
  11192. "ldr r2, [%[a]]\n\t"
  11193. "ldr r3, [%[a], #4]\n\t"
  11194. #ifdef WOLFSSL_KEIL
  11195. "sbcs r2, r2, r4\n\t"
  11196. #elif defined(__clang__)
  11197. "sbcs r2, r4\n\t"
  11198. #else
  11199. "sbc r2, r4\n\t"
  11200. #endif
  11201. #ifdef WOLFSSL_KEIL
  11202. "sbcs r3, r3, r5\n\t"
  11203. #elif defined(__clang__)
  11204. "sbcs r3, r5\n\t"
  11205. #else
  11206. "sbc r3, r5\n\t"
  11207. #endif
  11208. "stm %[a]!, {r2, r3}\n\t"
  11209. "ldm %[b]!, {r4, r5}\n\t"
  11210. "ldr r2, [%[a]]\n\t"
  11211. "ldr r3, [%[a], #4]\n\t"
  11212. #ifdef WOLFSSL_KEIL
  11213. "sbcs r2, r2, r4\n\t"
  11214. #elif defined(__clang__)
  11215. "sbcs r2, r4\n\t"
  11216. #else
  11217. "sbc r2, r4\n\t"
  11218. #endif
  11219. #ifdef WOLFSSL_KEIL
  11220. "sbcs r3, r3, r5\n\t"
  11221. #elif defined(__clang__)
  11222. "sbcs r3, r5\n\t"
  11223. #else
  11224. "sbc r3, r5\n\t"
  11225. #endif
  11226. "stm %[a]!, {r2, r3}\n\t"
  11227. "ldm %[b]!, {r4, r5}\n\t"
  11228. "ldr r2, [%[a]]\n\t"
  11229. "ldr r3, [%[a], #4]\n\t"
  11230. #ifdef WOLFSSL_KEIL
  11231. "sbcs r2, r2, r4\n\t"
  11232. #elif defined(__clang__)
  11233. "sbcs r2, r4\n\t"
  11234. #else
  11235. "sbc r2, r4\n\t"
  11236. #endif
  11237. #ifdef WOLFSSL_KEIL
  11238. "sbcs r3, r3, r5\n\t"
  11239. #elif defined(__clang__)
  11240. "sbcs r3, r5\n\t"
  11241. #else
  11242. "sbc r3, r5\n\t"
  11243. #endif
  11244. "stm %[a]!, {r2, r3}\n\t"
  11245. "ldm %[b]!, {r4, r5}\n\t"
  11246. "ldr r2, [%[a]]\n\t"
  11247. "ldr r3, [%[a], #4]\n\t"
  11248. #ifdef WOLFSSL_KEIL
  11249. "sbcs r2, r2, r4\n\t"
  11250. #elif defined(__clang__)
  11251. "sbcs r2, r4\n\t"
  11252. #else
  11253. "sbc r2, r4\n\t"
  11254. #endif
  11255. #ifdef WOLFSSL_KEIL
  11256. "sbcs r3, r3, r5\n\t"
  11257. #elif defined(__clang__)
  11258. "sbcs r3, r5\n\t"
  11259. #else
  11260. "sbc r3, r5\n\t"
  11261. #endif
  11262. "stm %[a]!, {r2, r3}\n\t"
  11263. "ldm %[b]!, {r4, r5}\n\t"
  11264. "ldr r2, [%[a]]\n\t"
  11265. "ldr r3, [%[a], #4]\n\t"
  11266. #ifdef WOLFSSL_KEIL
  11267. "sbcs r2, r2, r4\n\t"
  11268. #elif defined(__clang__)
  11269. "sbcs r2, r4\n\t"
  11270. #else
  11271. "sbc r2, r4\n\t"
  11272. #endif
  11273. #ifdef WOLFSSL_KEIL
  11274. "sbcs r3, r3, r5\n\t"
  11275. #elif defined(__clang__)
  11276. "sbcs r3, r5\n\t"
  11277. #else
  11278. "sbc r3, r5\n\t"
  11279. #endif
  11280. "stm %[a]!, {r2, r3}\n\t"
  11281. "ldm %[b]!, {r4, r5}\n\t"
  11282. "ldr r2, [%[a]]\n\t"
  11283. "ldr r3, [%[a], #4]\n\t"
  11284. #ifdef WOLFSSL_KEIL
  11285. "sbcs r2, r2, r4\n\t"
  11286. #elif defined(__clang__)
  11287. "sbcs r2, r4\n\t"
  11288. #else
  11289. "sbc r2, r4\n\t"
  11290. #endif
  11291. #ifdef WOLFSSL_KEIL
  11292. "sbcs r3, r3, r5\n\t"
  11293. #elif defined(__clang__)
  11294. "sbcs r3, r5\n\t"
  11295. #else
  11296. "sbc r3, r5\n\t"
  11297. #endif
  11298. "stm %[a]!, {r2, r3}\n\t"
  11299. "ldm %[b]!, {r4, r5}\n\t"
  11300. "ldr r2, [%[a]]\n\t"
  11301. "ldr r3, [%[a], #4]\n\t"
  11302. #ifdef WOLFSSL_KEIL
  11303. "sbcs r2, r2, r4\n\t"
  11304. #elif defined(__clang__)
  11305. "sbcs r2, r4\n\t"
  11306. #else
  11307. "sbc r2, r4\n\t"
  11308. #endif
  11309. #ifdef WOLFSSL_KEIL
  11310. "sbcs r3, r3, r5\n\t"
  11311. #elif defined(__clang__)
  11312. "sbcs r3, r5\n\t"
  11313. #else
  11314. "sbc r3, r5\n\t"
  11315. #endif
  11316. "stm %[a]!, {r2, r3}\n\t"
  11317. "ldm %[b]!, {r4, r5}\n\t"
  11318. "ldr r2, [%[a]]\n\t"
  11319. "ldr r3, [%[a], #4]\n\t"
  11320. #ifdef WOLFSSL_KEIL
  11321. "sbcs r2, r2, r4\n\t"
  11322. #elif defined(__clang__)
  11323. "sbcs r2, r4\n\t"
  11324. #else
  11325. "sbc r2, r4\n\t"
  11326. #endif
  11327. #ifdef WOLFSSL_KEIL
  11328. "sbcs r3, r3, r5\n\t"
  11329. #elif defined(__clang__)
  11330. "sbcs r3, r5\n\t"
  11331. #else
  11332. "sbc r3, r5\n\t"
  11333. #endif
  11334. "stm %[a]!, {r2, r3}\n\t"
  11335. "ldm %[b]!, {r4, r5}\n\t"
  11336. "ldr r2, [%[a]]\n\t"
  11337. "ldr r3, [%[a], #4]\n\t"
  11338. #ifdef WOLFSSL_KEIL
  11339. "sbcs r2, r2, r4\n\t"
  11340. #elif defined(__clang__)
  11341. "sbcs r2, r4\n\t"
  11342. #else
  11343. "sbc r2, r4\n\t"
  11344. #endif
  11345. #ifdef WOLFSSL_KEIL
  11346. "sbcs r3, r3, r5\n\t"
  11347. #elif defined(__clang__)
  11348. "sbcs r3, r5\n\t"
  11349. #else
  11350. "sbc r3, r5\n\t"
  11351. #endif
  11352. "stm %[a]!, {r2, r3}\n\t"
  11353. "ldm %[b]!, {r4, r5}\n\t"
  11354. "ldr r2, [%[a]]\n\t"
  11355. "ldr r3, [%[a], #4]\n\t"
  11356. #ifdef WOLFSSL_KEIL
  11357. "sbcs r2, r2, r4\n\t"
  11358. #elif defined(__clang__)
  11359. "sbcs r2, r4\n\t"
  11360. #else
  11361. "sbc r2, r4\n\t"
  11362. #endif
  11363. #ifdef WOLFSSL_KEIL
  11364. "sbcs r3, r3, r5\n\t"
  11365. #elif defined(__clang__)
  11366. "sbcs r3, r5\n\t"
  11367. #else
  11368. "sbc r3, r5\n\t"
  11369. #endif
  11370. "stm %[a]!, {r2, r3}\n\t"
  11371. "ldm %[b]!, {r4, r5}\n\t"
  11372. "ldr r2, [%[a]]\n\t"
  11373. "ldr r3, [%[a], #4]\n\t"
  11374. #ifdef WOLFSSL_KEIL
  11375. "sbcs r2, r2, r4\n\t"
  11376. #elif defined(__clang__)
  11377. "sbcs r2, r4\n\t"
  11378. #else
  11379. "sbc r2, r4\n\t"
  11380. #endif
  11381. #ifdef WOLFSSL_KEIL
  11382. "sbcs r3, r3, r5\n\t"
  11383. #elif defined(__clang__)
  11384. "sbcs r3, r5\n\t"
  11385. #else
  11386. "sbc r3, r5\n\t"
  11387. #endif
  11388. "stm %[a]!, {r2, r3}\n\t"
  11389. "ldm %[b]!, {r4, r5}\n\t"
  11390. "ldr r2, [%[a]]\n\t"
  11391. "ldr r3, [%[a], #4]\n\t"
  11392. #ifdef WOLFSSL_KEIL
  11393. "sbcs r2, r2, r4\n\t"
  11394. #elif defined(__clang__)
  11395. "sbcs r2, r4\n\t"
  11396. #else
  11397. "sbc r2, r4\n\t"
  11398. #endif
  11399. #ifdef WOLFSSL_KEIL
  11400. "sbcs r3, r3, r5\n\t"
  11401. #elif defined(__clang__)
  11402. "sbcs r3, r5\n\t"
  11403. #else
  11404. "sbc r3, r5\n\t"
  11405. #endif
  11406. "stm %[a]!, {r2, r3}\n\t"
  11407. "ldm %[b]!, {r4, r5}\n\t"
  11408. "ldr r2, [%[a]]\n\t"
  11409. "ldr r3, [%[a], #4]\n\t"
  11410. #ifdef WOLFSSL_KEIL
  11411. "sbcs r2, r2, r4\n\t"
  11412. #elif defined(__clang__)
  11413. "sbcs r2, r4\n\t"
  11414. #else
  11415. "sbc r2, r4\n\t"
  11416. #endif
  11417. #ifdef WOLFSSL_KEIL
  11418. "sbcs r3, r3, r5\n\t"
  11419. #elif defined(__clang__)
  11420. "sbcs r3, r5\n\t"
  11421. #else
  11422. "sbc r3, r5\n\t"
  11423. #endif
  11424. "stm %[a]!, {r2, r3}\n\t"
  11425. "ldm %[b]!, {r4, r5}\n\t"
  11426. "ldr r2, [%[a]]\n\t"
  11427. "ldr r3, [%[a], #4]\n\t"
  11428. #ifdef WOLFSSL_KEIL
  11429. "sbcs r2, r2, r4\n\t"
  11430. #elif defined(__clang__)
  11431. "sbcs r2, r4\n\t"
  11432. #else
  11433. "sbc r2, r4\n\t"
  11434. #endif
  11435. #ifdef WOLFSSL_KEIL
  11436. "sbcs r3, r3, r5\n\t"
  11437. #elif defined(__clang__)
  11438. "sbcs r3, r5\n\t"
  11439. #else
  11440. "sbc r3, r5\n\t"
  11441. #endif
  11442. "stm %[a]!, {r2, r3}\n\t"
  11443. "ldm %[b]!, {r4, r5}\n\t"
  11444. "ldr r2, [%[a]]\n\t"
  11445. "ldr r3, [%[a], #4]\n\t"
  11446. #ifdef WOLFSSL_KEIL
  11447. "sbcs r2, r2, r4\n\t"
  11448. #elif defined(__clang__)
  11449. "sbcs r2, r4\n\t"
  11450. #else
  11451. "sbc r2, r4\n\t"
  11452. #endif
  11453. #ifdef WOLFSSL_KEIL
  11454. "sbcs r3, r3, r5\n\t"
  11455. #elif defined(__clang__)
  11456. "sbcs r3, r5\n\t"
  11457. #else
  11458. "sbc r3, r5\n\t"
  11459. #endif
  11460. "stm %[a]!, {r2, r3}\n\t"
  11461. "ldm %[b]!, {r4, r5}\n\t"
  11462. "ldr r2, [%[a]]\n\t"
  11463. "ldr r3, [%[a], #4]\n\t"
  11464. #ifdef WOLFSSL_KEIL
  11465. "sbcs r2, r2, r4\n\t"
  11466. #elif defined(__clang__)
  11467. "sbcs r2, r4\n\t"
  11468. #else
  11469. "sbc r2, r4\n\t"
  11470. #endif
  11471. #ifdef WOLFSSL_KEIL
  11472. "sbcs r3, r3, r5\n\t"
  11473. #elif defined(__clang__)
  11474. "sbcs r3, r5\n\t"
  11475. #else
  11476. "sbc r3, r5\n\t"
  11477. #endif
  11478. "stm %[a]!, {r2, r3}\n\t"
  11479. "ldm %[b]!, {r4, r5}\n\t"
  11480. "ldr r2, [%[a]]\n\t"
  11481. "ldr r3, [%[a], #4]\n\t"
  11482. #ifdef WOLFSSL_KEIL
  11483. "sbcs r2, r2, r4\n\t"
  11484. #elif defined(__clang__)
  11485. "sbcs r2, r4\n\t"
  11486. #else
  11487. "sbc r2, r4\n\t"
  11488. #endif
  11489. #ifdef WOLFSSL_KEIL
  11490. "sbcs r3, r3, r5\n\t"
  11491. #elif defined(__clang__)
  11492. "sbcs r3, r5\n\t"
  11493. #else
  11494. "sbc r3, r5\n\t"
  11495. #endif
  11496. "stm %[a]!, {r2, r3}\n\t"
  11497. "ldm %[b]!, {r4, r5}\n\t"
  11498. "ldr r2, [%[a]]\n\t"
  11499. "ldr r3, [%[a], #4]\n\t"
  11500. #ifdef WOLFSSL_KEIL
  11501. "sbcs r2, r2, r4\n\t"
  11502. #elif defined(__clang__)
  11503. "sbcs r2, r4\n\t"
  11504. #else
  11505. "sbc r2, r4\n\t"
  11506. #endif
  11507. #ifdef WOLFSSL_KEIL
  11508. "sbcs r3, r3, r5\n\t"
  11509. #elif defined(__clang__)
  11510. "sbcs r3, r5\n\t"
  11511. #else
  11512. "sbc r3, r5\n\t"
  11513. #endif
  11514. "stm %[a]!, {r2, r3}\n\t"
  11515. "ldm %[b]!, {r4, r5}\n\t"
  11516. "ldr r2, [%[a]]\n\t"
  11517. "ldr r3, [%[a], #4]\n\t"
  11518. #ifdef WOLFSSL_KEIL
  11519. "sbcs r2, r2, r4\n\t"
  11520. #elif defined(__clang__)
  11521. "sbcs r2, r4\n\t"
  11522. #else
  11523. "sbc r2, r4\n\t"
  11524. #endif
  11525. #ifdef WOLFSSL_KEIL
  11526. "sbcs r3, r3, r5\n\t"
  11527. #elif defined(__clang__)
  11528. "sbcs r3, r5\n\t"
  11529. #else
  11530. "sbc r3, r5\n\t"
  11531. #endif
  11532. "stm %[a]!, {r2, r3}\n\t"
  11533. "ldm %[b]!, {r4, r5}\n\t"
  11534. "ldr r2, [%[a]]\n\t"
  11535. "ldr r3, [%[a], #4]\n\t"
  11536. #ifdef WOLFSSL_KEIL
  11537. "sbcs r2, r2, r4\n\t"
  11538. #elif defined(__clang__)
  11539. "sbcs r2, r4\n\t"
  11540. #else
  11541. "sbc r2, r4\n\t"
  11542. #endif
  11543. #ifdef WOLFSSL_KEIL
  11544. "sbcs r3, r3, r5\n\t"
  11545. #elif defined(__clang__)
  11546. "sbcs r3, r5\n\t"
  11547. #else
  11548. "sbc r3, r5\n\t"
  11549. #endif
  11550. "stm %[a]!, {r2, r3}\n\t"
  11551. "ldm %[b]!, {r4, r5}\n\t"
  11552. "ldr r2, [%[a]]\n\t"
  11553. "ldr r3, [%[a], #4]\n\t"
  11554. #ifdef WOLFSSL_KEIL
  11555. "sbcs r2, r2, r4\n\t"
  11556. #elif defined(__clang__)
  11557. "sbcs r2, r4\n\t"
  11558. #else
  11559. "sbc r2, r4\n\t"
  11560. #endif
  11561. #ifdef WOLFSSL_KEIL
  11562. "sbcs r3, r3, r5\n\t"
  11563. #elif defined(__clang__)
  11564. "sbcs r3, r5\n\t"
  11565. #else
  11566. "sbc r3, r5\n\t"
  11567. #endif
  11568. "stm %[a]!, {r2, r3}\n\t"
  11569. "ldm %[b]!, {r4, r5}\n\t"
  11570. "ldr r2, [%[a]]\n\t"
  11571. "ldr r3, [%[a], #4]\n\t"
  11572. #ifdef WOLFSSL_KEIL
  11573. "sbcs r2, r2, r4\n\t"
  11574. #elif defined(__clang__)
  11575. "sbcs r2, r4\n\t"
  11576. #else
  11577. "sbc r2, r4\n\t"
  11578. #endif
  11579. #ifdef WOLFSSL_KEIL
  11580. "sbcs r3, r3, r5\n\t"
  11581. #elif defined(__clang__)
  11582. "sbcs r3, r5\n\t"
  11583. #else
  11584. "sbc r3, r5\n\t"
  11585. #endif
  11586. "stm %[a]!, {r2, r3}\n\t"
  11587. "ldm %[b]!, {r4, r5}\n\t"
  11588. "ldr r2, [%[a]]\n\t"
  11589. "ldr r3, [%[a], #4]\n\t"
  11590. #ifdef WOLFSSL_KEIL
  11591. "sbcs r2, r2, r4\n\t"
  11592. #elif defined(__clang__)
  11593. "sbcs r2, r4\n\t"
  11594. #else
  11595. "sbc r2, r4\n\t"
  11596. #endif
  11597. #ifdef WOLFSSL_KEIL
  11598. "sbcs r3, r3, r5\n\t"
  11599. #elif defined(__clang__)
  11600. "sbcs r3, r5\n\t"
  11601. #else
  11602. "sbc r3, r5\n\t"
  11603. #endif
  11604. "stm %[a]!, {r2, r3}\n\t"
  11605. "ldm %[b]!, {r4, r5}\n\t"
  11606. "ldr r2, [%[a]]\n\t"
  11607. "ldr r3, [%[a], #4]\n\t"
  11608. #ifdef WOLFSSL_KEIL
  11609. "sbcs r2, r2, r4\n\t"
  11610. #elif defined(__clang__)
  11611. "sbcs r2, r4\n\t"
  11612. #else
  11613. "sbc r2, r4\n\t"
  11614. #endif
  11615. #ifdef WOLFSSL_KEIL
  11616. "sbcs r3, r3, r5\n\t"
  11617. #elif defined(__clang__)
  11618. "sbcs r3, r5\n\t"
  11619. #else
  11620. "sbc r3, r5\n\t"
  11621. #endif
  11622. "stm %[a]!, {r2, r3}\n\t"
  11623. "ldm %[b]!, {r4, r5}\n\t"
  11624. "ldr r2, [%[a]]\n\t"
  11625. "ldr r3, [%[a], #4]\n\t"
  11626. #ifdef WOLFSSL_KEIL
  11627. "sbcs r2, r2, r4\n\t"
  11628. #elif defined(__clang__)
  11629. "sbcs r2, r4\n\t"
  11630. #else
  11631. "sbc r2, r4\n\t"
  11632. #endif
  11633. #ifdef WOLFSSL_KEIL
  11634. "sbcs r3, r3, r5\n\t"
  11635. #elif defined(__clang__)
  11636. "sbcs r3, r5\n\t"
  11637. #else
  11638. "sbc r3, r5\n\t"
  11639. #endif
  11640. "stm %[a]!, {r2, r3}\n\t"
  11641. #ifdef WOLFSSL_KEIL
  11642. "sbcs %[a], %[a], %[a]\n\t"
  11643. #elif defined(__clang__)
  11644. "sbcs %[a], %[a]\n\t"
  11645. #else
  11646. "sbc %[a], %[a]\n\t"
  11647. #endif
  11648. : [a] "+l" (a), [b] "+l" (b)
  11649. :
  11650. : "memory", "r2", "r3", "r4", "r5"
  11651. );
  11652. return (uint32_t)(size_t)a;
  11653. }
  11654. /* Add b to a into r. (r = a + b)
  11655. *
  11656. * r A single precision integer.
  11657. * a A single precision integer.
  11658. * b A single precision integer.
  11659. */
  11660. SP_NOINLINE static sp_digit sp_2048_add_64(sp_digit* r, const sp_digit* a,
  11661. const sp_digit* b)
  11662. {
  11663. __asm__ __volatile__ (
  11664. "ldm %[b]!, {r5, r6}\n\t"
  11665. "ldm %[a]!, {r3, r4}\n\t"
  11666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11667. "adds r3, r3, r5\n\t"
  11668. #else
  11669. "add r3, r3, r5\n\t"
  11670. #endif
  11671. #ifdef WOLFSSL_KEIL
  11672. "adcs r4, r4, r6\n\t"
  11673. #elif defined(__clang__)
  11674. "adcs r4, r6\n\t"
  11675. #else
  11676. "adc r4, r6\n\t"
  11677. #endif
  11678. "stm %[r]!, {r3, r4}\n\t"
  11679. "ldm %[b]!, {r5, r6}\n\t"
  11680. "ldm %[a]!, {r3, r4}\n\t"
  11681. #ifdef WOLFSSL_KEIL
  11682. "adcs r3, r3, r5\n\t"
  11683. #elif defined(__clang__)
  11684. "adcs r3, r5\n\t"
  11685. #else
  11686. "adc r3, r5\n\t"
  11687. #endif
  11688. #ifdef WOLFSSL_KEIL
  11689. "adcs r4, r4, r6\n\t"
  11690. #elif defined(__clang__)
  11691. "adcs r4, r6\n\t"
  11692. #else
  11693. "adc r4, r6\n\t"
  11694. #endif
  11695. "stm %[r]!, {r3, r4}\n\t"
  11696. "ldm %[b]!, {r5, r6}\n\t"
  11697. "ldm %[a]!, {r3, r4}\n\t"
  11698. #ifdef WOLFSSL_KEIL
  11699. "adcs r3, r3, r5\n\t"
  11700. #elif defined(__clang__)
  11701. "adcs r3, r5\n\t"
  11702. #else
  11703. "adc r3, r5\n\t"
  11704. #endif
  11705. #ifdef WOLFSSL_KEIL
  11706. "adcs r4, r4, r6\n\t"
  11707. #elif defined(__clang__)
  11708. "adcs r4, r6\n\t"
  11709. #else
  11710. "adc r4, r6\n\t"
  11711. #endif
  11712. "stm %[r]!, {r3, r4}\n\t"
  11713. "ldm %[b]!, {r5, r6}\n\t"
  11714. "ldm %[a]!, {r3, r4}\n\t"
  11715. #ifdef WOLFSSL_KEIL
  11716. "adcs r3, r3, r5\n\t"
  11717. #elif defined(__clang__)
  11718. "adcs r3, r5\n\t"
  11719. #else
  11720. "adc r3, r5\n\t"
  11721. #endif
  11722. #ifdef WOLFSSL_KEIL
  11723. "adcs r4, r4, r6\n\t"
  11724. #elif defined(__clang__)
  11725. "adcs r4, r6\n\t"
  11726. #else
  11727. "adc r4, r6\n\t"
  11728. #endif
  11729. "stm %[r]!, {r3, r4}\n\t"
  11730. "ldm %[b]!, {r5, r6}\n\t"
  11731. "ldm %[a]!, {r3, r4}\n\t"
  11732. #ifdef WOLFSSL_KEIL
  11733. "adcs r3, r3, r5\n\t"
  11734. #elif defined(__clang__)
  11735. "adcs r3, r5\n\t"
  11736. #else
  11737. "adc r3, r5\n\t"
  11738. #endif
  11739. #ifdef WOLFSSL_KEIL
  11740. "adcs r4, r4, r6\n\t"
  11741. #elif defined(__clang__)
  11742. "adcs r4, r6\n\t"
  11743. #else
  11744. "adc r4, r6\n\t"
  11745. #endif
  11746. "stm %[r]!, {r3, r4}\n\t"
  11747. "ldm %[b]!, {r5, r6}\n\t"
  11748. "ldm %[a]!, {r3, r4}\n\t"
  11749. #ifdef WOLFSSL_KEIL
  11750. "adcs r3, r3, r5\n\t"
  11751. #elif defined(__clang__)
  11752. "adcs r3, r5\n\t"
  11753. #else
  11754. "adc r3, r5\n\t"
  11755. #endif
  11756. #ifdef WOLFSSL_KEIL
  11757. "adcs r4, r4, r6\n\t"
  11758. #elif defined(__clang__)
  11759. "adcs r4, r6\n\t"
  11760. #else
  11761. "adc r4, r6\n\t"
  11762. #endif
  11763. "stm %[r]!, {r3, r4}\n\t"
  11764. "ldm %[b]!, {r5, r6}\n\t"
  11765. "ldm %[a]!, {r3, r4}\n\t"
  11766. #ifdef WOLFSSL_KEIL
  11767. "adcs r3, r3, r5\n\t"
  11768. #elif defined(__clang__)
  11769. "adcs r3, r5\n\t"
  11770. #else
  11771. "adc r3, r5\n\t"
  11772. #endif
  11773. #ifdef WOLFSSL_KEIL
  11774. "adcs r4, r4, r6\n\t"
  11775. #elif defined(__clang__)
  11776. "adcs r4, r6\n\t"
  11777. #else
  11778. "adc r4, r6\n\t"
  11779. #endif
  11780. "stm %[r]!, {r3, r4}\n\t"
  11781. "ldm %[b]!, {r5, r6}\n\t"
  11782. "ldm %[a]!, {r3, r4}\n\t"
  11783. #ifdef WOLFSSL_KEIL
  11784. "adcs r3, r3, r5\n\t"
  11785. #elif defined(__clang__)
  11786. "adcs r3, r5\n\t"
  11787. #else
  11788. "adc r3, r5\n\t"
  11789. #endif
  11790. #ifdef WOLFSSL_KEIL
  11791. "adcs r4, r4, r6\n\t"
  11792. #elif defined(__clang__)
  11793. "adcs r4, r6\n\t"
  11794. #else
  11795. "adc r4, r6\n\t"
  11796. #endif
  11797. "stm %[r]!, {r3, r4}\n\t"
  11798. "ldm %[b]!, {r5, r6}\n\t"
  11799. "ldm %[a]!, {r3, r4}\n\t"
  11800. #ifdef WOLFSSL_KEIL
  11801. "adcs r3, r3, r5\n\t"
  11802. #elif defined(__clang__)
  11803. "adcs r3, r5\n\t"
  11804. #else
  11805. "adc r3, r5\n\t"
  11806. #endif
  11807. #ifdef WOLFSSL_KEIL
  11808. "adcs r4, r4, r6\n\t"
  11809. #elif defined(__clang__)
  11810. "adcs r4, r6\n\t"
  11811. #else
  11812. "adc r4, r6\n\t"
  11813. #endif
  11814. "stm %[r]!, {r3, r4}\n\t"
  11815. "ldm %[b]!, {r5, r6}\n\t"
  11816. "ldm %[a]!, {r3, r4}\n\t"
  11817. #ifdef WOLFSSL_KEIL
  11818. "adcs r3, r3, r5\n\t"
  11819. #elif defined(__clang__)
  11820. "adcs r3, r5\n\t"
  11821. #else
  11822. "adc r3, r5\n\t"
  11823. #endif
  11824. #ifdef WOLFSSL_KEIL
  11825. "adcs r4, r4, r6\n\t"
  11826. #elif defined(__clang__)
  11827. "adcs r4, r6\n\t"
  11828. #else
  11829. "adc r4, r6\n\t"
  11830. #endif
  11831. "stm %[r]!, {r3, r4}\n\t"
  11832. "ldm %[b]!, {r5, r6}\n\t"
  11833. "ldm %[a]!, {r3, r4}\n\t"
  11834. #ifdef WOLFSSL_KEIL
  11835. "adcs r3, r3, r5\n\t"
  11836. #elif defined(__clang__)
  11837. "adcs r3, r5\n\t"
  11838. #else
  11839. "adc r3, r5\n\t"
  11840. #endif
  11841. #ifdef WOLFSSL_KEIL
  11842. "adcs r4, r4, r6\n\t"
  11843. #elif defined(__clang__)
  11844. "adcs r4, r6\n\t"
  11845. #else
  11846. "adc r4, r6\n\t"
  11847. #endif
  11848. "stm %[r]!, {r3, r4}\n\t"
  11849. "ldm %[b]!, {r5, r6}\n\t"
  11850. "ldm %[a]!, {r3, r4}\n\t"
  11851. #ifdef WOLFSSL_KEIL
  11852. "adcs r3, r3, r5\n\t"
  11853. #elif defined(__clang__)
  11854. "adcs r3, r5\n\t"
  11855. #else
  11856. "adc r3, r5\n\t"
  11857. #endif
  11858. #ifdef WOLFSSL_KEIL
  11859. "adcs r4, r4, r6\n\t"
  11860. #elif defined(__clang__)
  11861. "adcs r4, r6\n\t"
  11862. #else
  11863. "adc r4, r6\n\t"
  11864. #endif
  11865. "stm %[r]!, {r3, r4}\n\t"
  11866. "ldm %[b]!, {r5, r6}\n\t"
  11867. "ldm %[a]!, {r3, r4}\n\t"
  11868. #ifdef WOLFSSL_KEIL
  11869. "adcs r3, r3, r5\n\t"
  11870. #elif defined(__clang__)
  11871. "adcs r3, r5\n\t"
  11872. #else
  11873. "adc r3, r5\n\t"
  11874. #endif
  11875. #ifdef WOLFSSL_KEIL
  11876. "adcs r4, r4, r6\n\t"
  11877. #elif defined(__clang__)
  11878. "adcs r4, r6\n\t"
  11879. #else
  11880. "adc r4, r6\n\t"
  11881. #endif
  11882. "stm %[r]!, {r3, r4}\n\t"
  11883. "ldm %[b]!, {r5, r6}\n\t"
  11884. "ldm %[a]!, {r3, r4}\n\t"
  11885. #ifdef WOLFSSL_KEIL
  11886. "adcs r3, r3, r5\n\t"
  11887. #elif defined(__clang__)
  11888. "adcs r3, r5\n\t"
  11889. #else
  11890. "adc r3, r5\n\t"
  11891. #endif
  11892. #ifdef WOLFSSL_KEIL
  11893. "adcs r4, r4, r6\n\t"
  11894. #elif defined(__clang__)
  11895. "adcs r4, r6\n\t"
  11896. #else
  11897. "adc r4, r6\n\t"
  11898. #endif
  11899. "stm %[r]!, {r3, r4}\n\t"
  11900. "ldm %[b]!, {r5, r6}\n\t"
  11901. "ldm %[a]!, {r3, r4}\n\t"
  11902. #ifdef WOLFSSL_KEIL
  11903. "adcs r3, r3, r5\n\t"
  11904. #elif defined(__clang__)
  11905. "adcs r3, r5\n\t"
  11906. #else
  11907. "adc r3, r5\n\t"
  11908. #endif
  11909. #ifdef WOLFSSL_KEIL
  11910. "adcs r4, r4, r6\n\t"
  11911. #elif defined(__clang__)
  11912. "adcs r4, r6\n\t"
  11913. #else
  11914. "adc r4, r6\n\t"
  11915. #endif
  11916. "stm %[r]!, {r3, r4}\n\t"
  11917. "ldm %[b]!, {r5, r6}\n\t"
  11918. "ldm %[a]!, {r3, r4}\n\t"
  11919. #ifdef WOLFSSL_KEIL
  11920. "adcs r3, r3, r5\n\t"
  11921. #elif defined(__clang__)
  11922. "adcs r3, r5\n\t"
  11923. #else
  11924. "adc r3, r5\n\t"
  11925. #endif
  11926. #ifdef WOLFSSL_KEIL
  11927. "adcs r4, r4, r6\n\t"
  11928. #elif defined(__clang__)
  11929. "adcs r4, r6\n\t"
  11930. #else
  11931. "adc r4, r6\n\t"
  11932. #endif
  11933. "stm %[r]!, {r3, r4}\n\t"
  11934. "ldm %[b]!, {r5, r6}\n\t"
  11935. "ldm %[a]!, {r3, r4}\n\t"
  11936. #ifdef WOLFSSL_KEIL
  11937. "adcs r3, r3, r5\n\t"
  11938. #elif defined(__clang__)
  11939. "adcs r3, r5\n\t"
  11940. #else
  11941. "adc r3, r5\n\t"
  11942. #endif
  11943. #ifdef WOLFSSL_KEIL
  11944. "adcs r4, r4, r6\n\t"
  11945. #elif defined(__clang__)
  11946. "adcs r4, r6\n\t"
  11947. #else
  11948. "adc r4, r6\n\t"
  11949. #endif
  11950. "stm %[r]!, {r3, r4}\n\t"
  11951. "ldm %[b]!, {r5, r6}\n\t"
  11952. "ldm %[a]!, {r3, r4}\n\t"
  11953. #ifdef WOLFSSL_KEIL
  11954. "adcs r3, r3, r5\n\t"
  11955. #elif defined(__clang__)
  11956. "adcs r3, r5\n\t"
  11957. #else
  11958. "adc r3, r5\n\t"
  11959. #endif
  11960. #ifdef WOLFSSL_KEIL
  11961. "adcs r4, r4, r6\n\t"
  11962. #elif defined(__clang__)
  11963. "adcs r4, r6\n\t"
  11964. #else
  11965. "adc r4, r6\n\t"
  11966. #endif
  11967. "stm %[r]!, {r3, r4}\n\t"
  11968. "ldm %[b]!, {r5, r6}\n\t"
  11969. "ldm %[a]!, {r3, r4}\n\t"
  11970. #ifdef WOLFSSL_KEIL
  11971. "adcs r3, r3, r5\n\t"
  11972. #elif defined(__clang__)
  11973. "adcs r3, r5\n\t"
  11974. #else
  11975. "adc r3, r5\n\t"
  11976. #endif
  11977. #ifdef WOLFSSL_KEIL
  11978. "adcs r4, r4, r6\n\t"
  11979. #elif defined(__clang__)
  11980. "adcs r4, r6\n\t"
  11981. #else
  11982. "adc r4, r6\n\t"
  11983. #endif
  11984. "stm %[r]!, {r3, r4}\n\t"
  11985. "ldm %[b]!, {r5, r6}\n\t"
  11986. "ldm %[a]!, {r3, r4}\n\t"
  11987. #ifdef WOLFSSL_KEIL
  11988. "adcs r3, r3, r5\n\t"
  11989. #elif defined(__clang__)
  11990. "adcs r3, r5\n\t"
  11991. #else
  11992. "adc r3, r5\n\t"
  11993. #endif
  11994. #ifdef WOLFSSL_KEIL
  11995. "adcs r4, r4, r6\n\t"
  11996. #elif defined(__clang__)
  11997. "adcs r4, r6\n\t"
  11998. #else
  11999. "adc r4, r6\n\t"
  12000. #endif
  12001. "stm %[r]!, {r3, r4}\n\t"
  12002. "ldm %[b]!, {r5, r6}\n\t"
  12003. "ldm %[a]!, {r3, r4}\n\t"
  12004. #ifdef WOLFSSL_KEIL
  12005. "adcs r3, r3, r5\n\t"
  12006. #elif defined(__clang__)
  12007. "adcs r3, r5\n\t"
  12008. #else
  12009. "adc r3, r5\n\t"
  12010. #endif
  12011. #ifdef WOLFSSL_KEIL
  12012. "adcs r4, r4, r6\n\t"
  12013. #elif defined(__clang__)
  12014. "adcs r4, r6\n\t"
  12015. #else
  12016. "adc r4, r6\n\t"
  12017. #endif
  12018. "stm %[r]!, {r3, r4}\n\t"
  12019. "ldm %[b]!, {r5, r6}\n\t"
  12020. "ldm %[a]!, {r3, r4}\n\t"
  12021. #ifdef WOLFSSL_KEIL
  12022. "adcs r3, r3, r5\n\t"
  12023. #elif defined(__clang__)
  12024. "adcs r3, r5\n\t"
  12025. #else
  12026. "adc r3, r5\n\t"
  12027. #endif
  12028. #ifdef WOLFSSL_KEIL
  12029. "adcs r4, r4, r6\n\t"
  12030. #elif defined(__clang__)
  12031. "adcs r4, r6\n\t"
  12032. #else
  12033. "adc r4, r6\n\t"
  12034. #endif
  12035. "stm %[r]!, {r3, r4}\n\t"
  12036. "ldm %[b]!, {r5, r6}\n\t"
  12037. "ldm %[a]!, {r3, r4}\n\t"
  12038. #ifdef WOLFSSL_KEIL
  12039. "adcs r3, r3, r5\n\t"
  12040. #elif defined(__clang__)
  12041. "adcs r3, r5\n\t"
  12042. #else
  12043. "adc r3, r5\n\t"
  12044. #endif
  12045. #ifdef WOLFSSL_KEIL
  12046. "adcs r4, r4, r6\n\t"
  12047. #elif defined(__clang__)
  12048. "adcs r4, r6\n\t"
  12049. #else
  12050. "adc r4, r6\n\t"
  12051. #endif
  12052. "stm %[r]!, {r3, r4}\n\t"
  12053. "ldm %[b]!, {r5, r6}\n\t"
  12054. "ldm %[a]!, {r3, r4}\n\t"
  12055. #ifdef WOLFSSL_KEIL
  12056. "adcs r3, r3, r5\n\t"
  12057. #elif defined(__clang__)
  12058. "adcs r3, r5\n\t"
  12059. #else
  12060. "adc r3, r5\n\t"
  12061. #endif
  12062. #ifdef WOLFSSL_KEIL
  12063. "adcs r4, r4, r6\n\t"
  12064. #elif defined(__clang__)
  12065. "adcs r4, r6\n\t"
  12066. #else
  12067. "adc r4, r6\n\t"
  12068. #endif
  12069. "stm %[r]!, {r3, r4}\n\t"
  12070. "ldm %[b]!, {r5, r6}\n\t"
  12071. "ldm %[a]!, {r3, r4}\n\t"
  12072. #ifdef WOLFSSL_KEIL
  12073. "adcs r3, r3, r5\n\t"
  12074. #elif defined(__clang__)
  12075. "adcs r3, r5\n\t"
  12076. #else
  12077. "adc r3, r5\n\t"
  12078. #endif
  12079. #ifdef WOLFSSL_KEIL
  12080. "adcs r4, r4, r6\n\t"
  12081. #elif defined(__clang__)
  12082. "adcs r4, r6\n\t"
  12083. #else
  12084. "adc r4, r6\n\t"
  12085. #endif
  12086. "stm %[r]!, {r3, r4}\n\t"
  12087. "ldm %[b]!, {r5, r6}\n\t"
  12088. "ldm %[a]!, {r3, r4}\n\t"
  12089. #ifdef WOLFSSL_KEIL
  12090. "adcs r3, r3, r5\n\t"
  12091. #elif defined(__clang__)
  12092. "adcs r3, r5\n\t"
  12093. #else
  12094. "adc r3, r5\n\t"
  12095. #endif
  12096. #ifdef WOLFSSL_KEIL
  12097. "adcs r4, r4, r6\n\t"
  12098. #elif defined(__clang__)
  12099. "adcs r4, r6\n\t"
  12100. #else
  12101. "adc r4, r6\n\t"
  12102. #endif
  12103. "stm %[r]!, {r3, r4}\n\t"
  12104. "ldm %[b]!, {r5, r6}\n\t"
  12105. "ldm %[a]!, {r3, r4}\n\t"
  12106. #ifdef WOLFSSL_KEIL
  12107. "adcs r3, r3, r5\n\t"
  12108. #elif defined(__clang__)
  12109. "adcs r3, r5\n\t"
  12110. #else
  12111. "adc r3, r5\n\t"
  12112. #endif
  12113. #ifdef WOLFSSL_KEIL
  12114. "adcs r4, r4, r6\n\t"
  12115. #elif defined(__clang__)
  12116. "adcs r4, r6\n\t"
  12117. #else
  12118. "adc r4, r6\n\t"
  12119. #endif
  12120. "stm %[r]!, {r3, r4}\n\t"
  12121. "ldm %[b]!, {r5, r6}\n\t"
  12122. "ldm %[a]!, {r3, r4}\n\t"
  12123. #ifdef WOLFSSL_KEIL
  12124. "adcs r3, r3, r5\n\t"
  12125. #elif defined(__clang__)
  12126. "adcs r3, r5\n\t"
  12127. #else
  12128. "adc r3, r5\n\t"
  12129. #endif
  12130. #ifdef WOLFSSL_KEIL
  12131. "adcs r4, r4, r6\n\t"
  12132. #elif defined(__clang__)
  12133. "adcs r4, r6\n\t"
  12134. #else
  12135. "adc r4, r6\n\t"
  12136. #endif
  12137. "stm %[r]!, {r3, r4}\n\t"
  12138. "ldm %[b]!, {r5, r6}\n\t"
  12139. "ldm %[a]!, {r3, r4}\n\t"
  12140. #ifdef WOLFSSL_KEIL
  12141. "adcs r3, r3, r5\n\t"
  12142. #elif defined(__clang__)
  12143. "adcs r3, r5\n\t"
  12144. #else
  12145. "adc r3, r5\n\t"
  12146. #endif
  12147. #ifdef WOLFSSL_KEIL
  12148. "adcs r4, r4, r6\n\t"
  12149. #elif defined(__clang__)
  12150. "adcs r4, r6\n\t"
  12151. #else
  12152. "adc r4, r6\n\t"
  12153. #endif
  12154. "stm %[r]!, {r3, r4}\n\t"
  12155. "ldm %[b]!, {r5, r6}\n\t"
  12156. "ldm %[a]!, {r3, r4}\n\t"
  12157. #ifdef WOLFSSL_KEIL
  12158. "adcs r3, r3, r5\n\t"
  12159. #elif defined(__clang__)
  12160. "adcs r3, r5\n\t"
  12161. #else
  12162. "adc r3, r5\n\t"
  12163. #endif
  12164. #ifdef WOLFSSL_KEIL
  12165. "adcs r4, r4, r6\n\t"
  12166. #elif defined(__clang__)
  12167. "adcs r4, r6\n\t"
  12168. #else
  12169. "adc r4, r6\n\t"
  12170. #endif
  12171. "stm %[r]!, {r3, r4}\n\t"
  12172. "ldm %[b]!, {r5, r6}\n\t"
  12173. "ldm %[a]!, {r3, r4}\n\t"
  12174. #ifdef WOLFSSL_KEIL
  12175. "adcs r3, r3, r5\n\t"
  12176. #elif defined(__clang__)
  12177. "adcs r3, r5\n\t"
  12178. #else
  12179. "adc r3, r5\n\t"
  12180. #endif
  12181. #ifdef WOLFSSL_KEIL
  12182. "adcs r4, r4, r6\n\t"
  12183. #elif defined(__clang__)
  12184. "adcs r4, r6\n\t"
  12185. #else
  12186. "adc r4, r6\n\t"
  12187. #endif
  12188. "stm %[r]!, {r3, r4}\n\t"
  12189. "ldm %[b]!, {r5, r6}\n\t"
  12190. "ldm %[a]!, {r3, r4}\n\t"
  12191. #ifdef WOLFSSL_KEIL
  12192. "adcs r3, r3, r5\n\t"
  12193. #elif defined(__clang__)
  12194. "adcs r3, r5\n\t"
  12195. #else
  12196. "adc r3, r5\n\t"
  12197. #endif
  12198. #ifdef WOLFSSL_KEIL
  12199. "adcs r4, r4, r6\n\t"
  12200. #elif defined(__clang__)
  12201. "adcs r4, r6\n\t"
  12202. #else
  12203. "adc r4, r6\n\t"
  12204. #endif
  12205. "stm %[r]!, {r3, r4}\n\t"
  12206. "movs %[r], #0\n\t"
  12207. #ifdef WOLFSSL_KEIL
  12208. "adcs %[r], %[r], %[r]\n\t"
  12209. #elif defined(__clang__)
  12210. "adcs %[r], %[r]\n\t"
  12211. #else
  12212. "adc %[r], %[r]\n\t"
  12213. #endif
  12214. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  12215. :
  12216. : "memory", "r3", "r4", "r5", "r6"
  12217. );
  12218. return (uint32_t)(size_t)r;
  12219. }
  12220. /* AND m into each word of a and store in r.
  12221. *
  12222. * r A single precision integer.
  12223. * a A single precision integer.
  12224. * m Mask to AND against each digit.
  12225. */
  12226. static void sp_2048_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  12227. {
  12228. #ifdef WOLFSSL_SP_SMALL
  12229. int i;
  12230. for (i=0; i<32; i++) {
  12231. r[i] = a[i] & m;
  12232. }
  12233. #else
  12234. int i;
  12235. for (i = 0; i < 32; i += 8) {
  12236. r[i+0] = a[i+0] & m;
  12237. r[i+1] = a[i+1] & m;
  12238. r[i+2] = a[i+2] & m;
  12239. r[i+3] = a[i+3] & m;
  12240. r[i+4] = a[i+4] & m;
  12241. r[i+5] = a[i+5] & m;
  12242. r[i+6] = a[i+6] & m;
  12243. r[i+7] = a[i+7] & m;
  12244. }
  12245. #endif
  12246. }
  12247. /* Multiply a and b into r. (r = a * b)
  12248. *
  12249. * r A single precision integer.
  12250. * a A single precision integer.
  12251. * b A single precision integer.
  12252. */
  12253. SP_NOINLINE static void sp_2048_mul_64(sp_digit* r, const sp_digit* a,
  12254. const sp_digit* b)
  12255. {
  12256. sp_digit* z0 = r;
  12257. sp_digit z1[64];
  12258. sp_digit a1[32];
  12259. sp_digit b1[32];
  12260. sp_digit* z2 = r + 64;
  12261. sp_digit u;
  12262. sp_digit ca;
  12263. sp_digit cb;
  12264. ca = sp_2048_add_32(a1, a, &a[32]);
  12265. cb = sp_2048_add_32(b1, b, &b[32]);
  12266. u = ca & cb;
  12267. sp_2048_mul_32(z2, &a[32], &b[32]);
  12268. sp_2048_mul_32(z0, a, b);
  12269. sp_2048_mul_32(z1, a1, b1);
  12270. u += sp_2048_sub_in_place_64(z1, z0);
  12271. u += sp_2048_sub_in_place_64(z1, z2);
  12272. sp_2048_mask_32(a1, a1, 0 - cb);
  12273. u += sp_2048_add_32(z1 + 32, z1 + 32, a1);
  12274. sp_2048_mask_32(b1, b1, 0 - ca);
  12275. u += sp_2048_add_32(z1 + 32, z1 + 32, b1);
  12276. u += sp_2048_add_64(r + 32, r + 32, z1);
  12277. (void)sp_2048_add_word_32(r + 96, r + 96, u);
  12278. }
  12279. #ifndef WOLFSSL_SP_LARGE_CODE
  12280. /* Square a and put result in r. (r = a * a)
  12281. *
  12282. * r A single precision integer.
  12283. * a A single precision integer.
  12284. */
  12285. SP_NOINLINE static void sp_2048_sqr_8(sp_digit* r, const sp_digit* a)
  12286. {
  12287. __asm__ __volatile__ (
  12288. "movs r3, #0\n\t"
  12289. "movs r4, #0\n\t"
  12290. "movs r5, #0\n\t"
  12291. "mov r8, r3\n\t"
  12292. "mov r11, %[r]\n\t"
  12293. "movs r6, #0x40\n\t"
  12294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12295. "negs r6, r6\n\t"
  12296. #else
  12297. "neg r6, r6\n\t"
  12298. #endif
  12299. "add sp, sp, r6\n\t"
  12300. "mov r10, sp\n\t"
  12301. "mov r9, %[a]\n\t"
  12302. "\n"
  12303. "L_sp_2048_sqr_8_words_%=:\n\t"
  12304. "movs %[r], #0\n\t"
  12305. "movs r6, #28\n\t"
  12306. "mov %[a], r8\n\t"
  12307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12308. "subs %[a], %[a], r6\n\t"
  12309. #else
  12310. "sub %[a], %[a], r6\n\t"
  12311. #endif
  12312. #ifdef WOLFSSL_KEIL
  12313. "sbcs r6, r6, r6\n\t"
  12314. #elif defined(__clang__)
  12315. "sbcs r6, r6\n\t"
  12316. #else
  12317. "sbc r6, r6\n\t"
  12318. #endif
  12319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12320. "mvns r6, r6\n\t"
  12321. #else
  12322. "mvn r6, r6\n\t"
  12323. #endif
  12324. #ifdef WOLFSSL_KEIL
  12325. "ands %[a], %[a], r6\n\t"
  12326. #elif defined(__clang__)
  12327. "ands %[a], r6\n\t"
  12328. #else
  12329. "and %[a], r6\n\t"
  12330. #endif
  12331. "mov r2, r8\n\t"
  12332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12333. "subs r2, r2, %[a]\n\t"
  12334. #else
  12335. "sub r2, r2, %[a]\n\t"
  12336. #endif
  12337. "add %[a], %[a], r9\n\t"
  12338. "add r2, r2, r9\n\t"
  12339. "\n"
  12340. "L_sp_2048_sqr_8_mul_%=:\n\t"
  12341. "cmp r2, %[a]\n\t"
  12342. "beq L_sp_2048_sqr_8_sqr_%=\n\t"
  12343. "# Multiply * 2: Start\n\t"
  12344. "ldrh r6, [%[a]]\n\t"
  12345. "ldrh r7, [r2]\n\t"
  12346. #ifdef WOLFSSL_KEIL
  12347. "muls r7, r6, r7\n\t"
  12348. #elif defined(__clang__)
  12349. "muls r7, r6\n\t"
  12350. #else
  12351. "mul r7, r6\n\t"
  12352. #endif
  12353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12354. "adds r3, r3, r7\n\t"
  12355. #else
  12356. "add r3, r3, r7\n\t"
  12357. #endif
  12358. #ifdef WOLFSSL_KEIL
  12359. "adcs r4, r4, %[r]\n\t"
  12360. #elif defined(__clang__)
  12361. "adcs r4, %[r]\n\t"
  12362. #else
  12363. "adc r4, %[r]\n\t"
  12364. #endif
  12365. #ifdef WOLFSSL_KEIL
  12366. "adcs r5, r5, %[r]\n\t"
  12367. #elif defined(__clang__)
  12368. "adcs r5, %[r]\n\t"
  12369. #else
  12370. "adc r5, %[r]\n\t"
  12371. #endif
  12372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12373. "adds r3, r3, r7\n\t"
  12374. #else
  12375. "add r3, r3, r7\n\t"
  12376. #endif
  12377. #ifdef WOLFSSL_KEIL
  12378. "adcs r4, r4, %[r]\n\t"
  12379. #elif defined(__clang__)
  12380. "adcs r4, %[r]\n\t"
  12381. #else
  12382. "adc r4, %[r]\n\t"
  12383. #endif
  12384. #ifdef WOLFSSL_KEIL
  12385. "adcs r5, r5, %[r]\n\t"
  12386. #elif defined(__clang__)
  12387. "adcs r5, %[r]\n\t"
  12388. #else
  12389. "adc r5, %[r]\n\t"
  12390. #endif
  12391. "ldr r7, [r2]\n\t"
  12392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12393. "lsrs r7, r7, #16\n\t"
  12394. #else
  12395. "lsr r7, r7, #16\n\t"
  12396. #endif
  12397. #ifdef WOLFSSL_KEIL
  12398. "muls r6, r7, r6\n\t"
  12399. #elif defined(__clang__)
  12400. "muls r6, r7\n\t"
  12401. #else
  12402. "mul r6, r7\n\t"
  12403. #endif
  12404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12405. "lsrs r7, r6, #16\n\t"
  12406. #else
  12407. "lsr r7, r6, #16\n\t"
  12408. #endif
  12409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12410. "lsls r6, r6, #16\n\t"
  12411. #else
  12412. "lsl r6, r6, #16\n\t"
  12413. #endif
  12414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12415. "adds r3, r3, r6\n\t"
  12416. #else
  12417. "add r3, r3, r6\n\t"
  12418. #endif
  12419. #ifdef WOLFSSL_KEIL
  12420. "adcs r4, r4, r7\n\t"
  12421. #elif defined(__clang__)
  12422. "adcs r4, r7\n\t"
  12423. #else
  12424. "adc r4, r7\n\t"
  12425. #endif
  12426. #ifdef WOLFSSL_KEIL
  12427. "adcs r5, r5, %[r]\n\t"
  12428. #elif defined(__clang__)
  12429. "adcs r5, %[r]\n\t"
  12430. #else
  12431. "adc r5, %[r]\n\t"
  12432. #endif
  12433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12434. "adds r3, r3, r6\n\t"
  12435. #else
  12436. "add r3, r3, r6\n\t"
  12437. #endif
  12438. #ifdef WOLFSSL_KEIL
  12439. "adcs r4, r4, r7\n\t"
  12440. #elif defined(__clang__)
  12441. "adcs r4, r7\n\t"
  12442. #else
  12443. "adc r4, r7\n\t"
  12444. #endif
  12445. #ifdef WOLFSSL_KEIL
  12446. "adcs r5, r5, %[r]\n\t"
  12447. #elif defined(__clang__)
  12448. "adcs r5, %[r]\n\t"
  12449. #else
  12450. "adc r5, %[r]\n\t"
  12451. #endif
  12452. "ldr r6, [%[a]]\n\t"
  12453. "ldr r7, [r2]\n\t"
  12454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12455. "lsrs r6, r6, #16\n\t"
  12456. #else
  12457. "lsr r6, r6, #16\n\t"
  12458. #endif
  12459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12460. "lsrs r7, r7, #16\n\t"
  12461. #else
  12462. "lsr r7, r7, #16\n\t"
  12463. #endif
  12464. #ifdef WOLFSSL_KEIL
  12465. "muls r7, r6, r7\n\t"
  12466. #elif defined(__clang__)
  12467. "muls r7, r6\n\t"
  12468. #else
  12469. "mul r7, r6\n\t"
  12470. #endif
  12471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12472. "adds r4, r4, r7\n\t"
  12473. #else
  12474. "add r4, r4, r7\n\t"
  12475. #endif
  12476. #ifdef WOLFSSL_KEIL
  12477. "adcs r5, r5, %[r]\n\t"
  12478. #elif defined(__clang__)
  12479. "adcs r5, %[r]\n\t"
  12480. #else
  12481. "adc r5, %[r]\n\t"
  12482. #endif
  12483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12484. "adds r4, r4, r7\n\t"
  12485. #else
  12486. "add r4, r4, r7\n\t"
  12487. #endif
  12488. #ifdef WOLFSSL_KEIL
  12489. "adcs r5, r5, %[r]\n\t"
  12490. #elif defined(__clang__)
  12491. "adcs r5, %[r]\n\t"
  12492. #else
  12493. "adc r5, %[r]\n\t"
  12494. #endif
  12495. "ldrh r7, [r2]\n\t"
  12496. #ifdef WOLFSSL_KEIL
  12497. "muls r6, r7, r6\n\t"
  12498. #elif defined(__clang__)
  12499. "muls r6, r7\n\t"
  12500. #else
  12501. "mul r6, r7\n\t"
  12502. #endif
  12503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12504. "lsrs r7, r6, #16\n\t"
  12505. #else
  12506. "lsr r7, r6, #16\n\t"
  12507. #endif
  12508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12509. "lsls r6, r6, #16\n\t"
  12510. #else
  12511. "lsl r6, r6, #16\n\t"
  12512. #endif
  12513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12514. "adds r3, r3, r6\n\t"
  12515. #else
  12516. "add r3, r3, r6\n\t"
  12517. #endif
  12518. #ifdef WOLFSSL_KEIL
  12519. "adcs r4, r4, r7\n\t"
  12520. #elif defined(__clang__)
  12521. "adcs r4, r7\n\t"
  12522. #else
  12523. "adc r4, r7\n\t"
  12524. #endif
  12525. #ifdef WOLFSSL_KEIL
  12526. "adcs r5, r5, %[r]\n\t"
  12527. #elif defined(__clang__)
  12528. "adcs r5, %[r]\n\t"
  12529. #else
  12530. "adc r5, %[r]\n\t"
  12531. #endif
  12532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12533. "adds r3, r3, r6\n\t"
  12534. #else
  12535. "add r3, r3, r6\n\t"
  12536. #endif
  12537. #ifdef WOLFSSL_KEIL
  12538. "adcs r4, r4, r7\n\t"
  12539. #elif defined(__clang__)
  12540. "adcs r4, r7\n\t"
  12541. #else
  12542. "adc r4, r7\n\t"
  12543. #endif
  12544. #ifdef WOLFSSL_KEIL
  12545. "adcs r5, r5, %[r]\n\t"
  12546. #elif defined(__clang__)
  12547. "adcs r5, %[r]\n\t"
  12548. #else
  12549. "adc r5, %[r]\n\t"
  12550. #endif
  12551. "# Multiply * 2: Done\n\t"
  12552. "bal L_sp_2048_sqr_8_done_sqr_%=\n\t"
  12553. "\n"
  12554. "L_sp_2048_sqr_8_sqr_%=:\n\t"
  12555. "mov r12, r2\n\t"
  12556. "ldr r2, [%[a]]\n\t"
  12557. "# Square: Start\n\t"
  12558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12559. "lsrs r7, r2, #16\n\t"
  12560. #else
  12561. "lsr r7, r2, #16\n\t"
  12562. #endif
  12563. "uxth r6, r2\n\t"
  12564. #ifdef WOLFSSL_KEIL
  12565. "muls r6, r6, r6\n\t"
  12566. #elif defined(__clang__)
  12567. "muls r6, r6\n\t"
  12568. #else
  12569. "mul r6, r6\n\t"
  12570. #endif
  12571. #ifdef WOLFSSL_KEIL
  12572. "muls r7, r7, r7\n\t"
  12573. #elif defined(__clang__)
  12574. "muls r7, r7\n\t"
  12575. #else
  12576. "mul r7, r7\n\t"
  12577. #endif
  12578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12579. "adds r3, r3, r6\n\t"
  12580. #else
  12581. "add r3, r3, r6\n\t"
  12582. #endif
  12583. #ifdef WOLFSSL_KEIL
  12584. "adcs r4, r4, r7\n\t"
  12585. #elif defined(__clang__)
  12586. "adcs r4, r7\n\t"
  12587. #else
  12588. "adc r4, r7\n\t"
  12589. #endif
  12590. #ifdef WOLFSSL_KEIL
  12591. "adcs r5, r5, %[r]\n\t"
  12592. #elif defined(__clang__)
  12593. "adcs r5, %[r]\n\t"
  12594. #else
  12595. "adc r5, %[r]\n\t"
  12596. #endif
  12597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12598. "lsrs r7, r2, #16\n\t"
  12599. #else
  12600. "lsr r7, r2, #16\n\t"
  12601. #endif
  12602. "uxth r6, r2\n\t"
  12603. #ifdef WOLFSSL_KEIL
  12604. "muls r6, r7, r6\n\t"
  12605. #elif defined(__clang__)
  12606. "muls r6, r7\n\t"
  12607. #else
  12608. "mul r6, r7\n\t"
  12609. #endif
  12610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12611. "lsrs r7, r6, #15\n\t"
  12612. #else
  12613. "lsr r7, r6, #15\n\t"
  12614. #endif
  12615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12616. "lsls r6, r6, #17\n\t"
  12617. #else
  12618. "lsl r6, r6, #17\n\t"
  12619. #endif
  12620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12621. "adds r3, r3, r6\n\t"
  12622. #else
  12623. "add r3, r3, r6\n\t"
  12624. #endif
  12625. #ifdef WOLFSSL_KEIL
  12626. "adcs r4, r4, r7\n\t"
  12627. #elif defined(__clang__)
  12628. "adcs r4, r7\n\t"
  12629. #else
  12630. "adc r4, r7\n\t"
  12631. #endif
  12632. #ifdef WOLFSSL_KEIL
  12633. "adcs r5, r5, %[r]\n\t"
  12634. #elif defined(__clang__)
  12635. "adcs r5, %[r]\n\t"
  12636. #else
  12637. "adc r5, %[r]\n\t"
  12638. #endif
  12639. "# Square: Done\n\t"
  12640. "mov r2, r12\n\t"
  12641. "\n"
  12642. "L_sp_2048_sqr_8_done_sqr_%=:\n\t"
  12643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12644. "adds %[a], %[a], #4\n\t"
  12645. #else
  12646. "add %[a], %[a], #4\n\t"
  12647. #endif
  12648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12649. "subs r2, r2, #4\n\t"
  12650. #else
  12651. "sub r2, r2, #4\n\t"
  12652. #endif
  12653. "movs r6, #32\n\t"
  12654. "add r6, r6, r9\n\t"
  12655. "cmp %[a], r6\n\t"
  12656. "beq L_sp_2048_sqr_8_done_mul_%=\n\t"
  12657. "cmp %[a], r2\n\t"
  12658. "bgt L_sp_2048_sqr_8_done_mul_%=\n\t"
  12659. "mov r7, r8\n\t"
  12660. "add r7, r7, r9\n\t"
  12661. "cmp %[a], r7\n\t"
  12662. "ble L_sp_2048_sqr_8_mul_%=\n\t"
  12663. "\n"
  12664. "L_sp_2048_sqr_8_done_mul_%=:\n\t"
  12665. "mov %[r], r10\n\t"
  12666. "mov r7, r8\n\t"
  12667. "str r3, [%[r], r7]\n\t"
  12668. "movs r3, r4\n\t"
  12669. "movs r4, r5\n\t"
  12670. "movs r5, #0\n\t"
  12671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12672. "adds r7, r7, #4\n\t"
  12673. #else
  12674. "add r7, r7, #4\n\t"
  12675. #endif
  12676. "mov r8, r7\n\t"
  12677. "movs r6, #56\n\t"
  12678. "cmp r7, r6\n\t"
  12679. "ble L_sp_2048_sqr_8_words_%=\n\t"
  12680. "mov %[a], r9\n\t"
  12681. "str r3, [%[r], r7]\n\t"
  12682. "mov %[r], r11\n\t"
  12683. "mov %[a], r10\n\t"
  12684. "movs r3, #60\n\t"
  12685. "\n"
  12686. "L_sp_2048_sqr_8_store_%=:\n\t"
  12687. "ldr r6, [%[a], r3]\n\t"
  12688. "str r6, [%[r], r3]\n\t"
  12689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12690. "subs r3, r3, #4\n\t"
  12691. #else
  12692. "sub r3, r3, #4\n\t"
  12693. #endif
  12694. "bge L_sp_2048_sqr_8_store_%=\n\t"
  12695. "movs r6, #0x40\n\t"
  12696. "add sp, sp, r6\n\t"
  12697. : [r] "+l" (r), [a] "+l" (a)
  12698. :
  12699. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  12700. );
  12701. }
  12702. #else
  12703. /* Square a and put result in r. (r = a * a)
  12704. *
  12705. * r A single precision integer.
  12706. * a A single precision integer.
  12707. */
  12708. SP_NOINLINE static void sp_2048_sqr_8(sp_digit* r, const sp_digit* a)
  12709. {
  12710. __asm__ __volatile__ (
  12711. "sub sp, sp, #32\n\t"
  12712. "mov r8, %[r]\n\t"
  12713. "mov r9, %[a]\n\t"
  12714. "movs %[r], #0\n\t"
  12715. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  12716. "mov r10, r2\n\t"
  12717. "mov r11, r3\n\t"
  12718. "mov r12, r4\n\t"
  12719. "mov lr, r5\n\t"
  12720. "mov %[a], r9\n\t"
  12721. "# A[0] * A[0]\n\t"
  12722. "movs r4, #0\n\t"
  12723. "mov r7, r10\n\t"
  12724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12725. "lsrs r6, r7, #16\n\t"
  12726. #else
  12727. "lsr r6, r7, #16\n\t"
  12728. #endif
  12729. "uxth r5, r7\n\t"
  12730. "movs r2, r5\n\t"
  12731. "movs r3, r6\n\t"
  12732. #ifdef WOLFSSL_KEIL
  12733. "muls r2, r2, r2\n\t"
  12734. #elif defined(__clang__)
  12735. "muls r2, r2\n\t"
  12736. #else
  12737. "mul r2, r2\n\t"
  12738. #endif
  12739. #ifdef WOLFSSL_KEIL
  12740. "muls r3, r3, r3\n\t"
  12741. #elif defined(__clang__)
  12742. "muls r3, r3\n\t"
  12743. #else
  12744. "mul r3, r3\n\t"
  12745. #endif
  12746. #ifdef WOLFSSL_KEIL
  12747. "muls r5, r6, r5\n\t"
  12748. #elif defined(__clang__)
  12749. "muls r5, r6\n\t"
  12750. #else
  12751. "mul r5, r6\n\t"
  12752. #endif
  12753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12754. "lsrs r6, r5, #15\n\t"
  12755. #else
  12756. "lsr r6, r5, #15\n\t"
  12757. #endif
  12758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12759. "lsls r5, r5, #17\n\t"
  12760. #else
  12761. "lsl r5, r5, #17\n\t"
  12762. #endif
  12763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12764. "adds r2, r2, r5\n\t"
  12765. #else
  12766. "add r2, r2, r5\n\t"
  12767. #endif
  12768. #ifdef WOLFSSL_KEIL
  12769. "adcs r3, r3, r6\n\t"
  12770. #elif defined(__clang__)
  12771. "adcs r3, r6\n\t"
  12772. #else
  12773. "adc r3, r6\n\t"
  12774. #endif
  12775. "str r2, [sp]\n\t"
  12776. "# A[1] * A[0]\n\t"
  12777. "movs r2, #0\n\t"
  12778. "mov %[a], r11\n\t"
  12779. "uxth r5, %[a]\n\t"
  12780. "uxth r6, r7\n\t"
  12781. #ifdef WOLFSSL_KEIL
  12782. "muls r6, r5, r6\n\t"
  12783. #elif defined(__clang__)
  12784. "muls r6, r5\n\t"
  12785. #else
  12786. "mul r6, r5\n\t"
  12787. #endif
  12788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12789. "adds r3, r3, r6\n\t"
  12790. #else
  12791. "add r3, r3, r6\n\t"
  12792. #endif
  12793. #ifdef WOLFSSL_KEIL
  12794. "adcs r4, r4, %[r]\n\t"
  12795. #elif defined(__clang__)
  12796. "adcs r4, %[r]\n\t"
  12797. #else
  12798. "adc r4, %[r]\n\t"
  12799. #endif
  12800. #ifdef WOLFSSL_KEIL
  12801. "adcs r2, r2, %[r]\n\t"
  12802. #elif defined(__clang__)
  12803. "adcs r2, %[r]\n\t"
  12804. #else
  12805. "adc r2, %[r]\n\t"
  12806. #endif
  12807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12808. "adds r3, r3, r6\n\t"
  12809. #else
  12810. "add r3, r3, r6\n\t"
  12811. #endif
  12812. #ifdef WOLFSSL_KEIL
  12813. "adcs r4, r4, %[r]\n\t"
  12814. #elif defined(__clang__)
  12815. "adcs r4, %[r]\n\t"
  12816. #else
  12817. "adc r4, %[r]\n\t"
  12818. #endif
  12819. #ifdef WOLFSSL_KEIL
  12820. "adcs r2, r2, %[r]\n\t"
  12821. #elif defined(__clang__)
  12822. "adcs r2, %[r]\n\t"
  12823. #else
  12824. "adc r2, %[r]\n\t"
  12825. #endif
  12826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12827. "lsrs r6, r7, #16\n\t"
  12828. #else
  12829. "lsr r6, r7, #16\n\t"
  12830. #endif
  12831. #ifdef WOLFSSL_KEIL
  12832. "muls r5, r6, r5\n\t"
  12833. #elif defined(__clang__)
  12834. "muls r5, r6\n\t"
  12835. #else
  12836. "mul r5, r6\n\t"
  12837. #endif
  12838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12839. "lsrs r6, r5, #16\n\t"
  12840. #else
  12841. "lsr r6, r5, #16\n\t"
  12842. #endif
  12843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12844. "lsls r5, r5, #16\n\t"
  12845. #else
  12846. "lsl r5, r5, #16\n\t"
  12847. #endif
  12848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12849. "adds r3, r3, r5\n\t"
  12850. #else
  12851. "add r3, r3, r5\n\t"
  12852. #endif
  12853. #ifdef WOLFSSL_KEIL
  12854. "adcs r4, r4, r6\n\t"
  12855. #elif defined(__clang__)
  12856. "adcs r4, r6\n\t"
  12857. #else
  12858. "adc r4, r6\n\t"
  12859. #endif
  12860. #ifdef WOLFSSL_KEIL
  12861. "adcs r2, r2, %[r]\n\t"
  12862. #elif defined(__clang__)
  12863. "adcs r2, %[r]\n\t"
  12864. #else
  12865. "adc r2, %[r]\n\t"
  12866. #endif
  12867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12868. "adds r3, r3, r5\n\t"
  12869. #else
  12870. "add r3, r3, r5\n\t"
  12871. #endif
  12872. #ifdef WOLFSSL_KEIL
  12873. "adcs r4, r4, r6\n\t"
  12874. #elif defined(__clang__)
  12875. "adcs r4, r6\n\t"
  12876. #else
  12877. "adc r4, r6\n\t"
  12878. #endif
  12879. #ifdef WOLFSSL_KEIL
  12880. "adcs r2, r2, %[r]\n\t"
  12881. #elif defined(__clang__)
  12882. "adcs r2, %[r]\n\t"
  12883. #else
  12884. "adc r2, %[r]\n\t"
  12885. #endif
  12886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12887. "lsrs r5, %[a], #16\n\t"
  12888. #else
  12889. "lsr r5, %[a], #16\n\t"
  12890. #endif
  12891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12892. "lsrs r6, r7, #16\n\t"
  12893. #else
  12894. "lsr r6, r7, #16\n\t"
  12895. #endif
  12896. #ifdef WOLFSSL_KEIL
  12897. "muls r6, r5, r6\n\t"
  12898. #elif defined(__clang__)
  12899. "muls r6, r5\n\t"
  12900. #else
  12901. "mul r6, r5\n\t"
  12902. #endif
  12903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12904. "adds r4, r4, r6\n\t"
  12905. #else
  12906. "add r4, r4, r6\n\t"
  12907. #endif
  12908. #ifdef WOLFSSL_KEIL
  12909. "adcs r2, r2, %[r]\n\t"
  12910. #elif defined(__clang__)
  12911. "adcs r2, %[r]\n\t"
  12912. #else
  12913. "adc r2, %[r]\n\t"
  12914. #endif
  12915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12916. "adds r4, r4, r6\n\t"
  12917. #else
  12918. "add r4, r4, r6\n\t"
  12919. #endif
  12920. #ifdef WOLFSSL_KEIL
  12921. "adcs r2, r2, %[r]\n\t"
  12922. #elif defined(__clang__)
  12923. "adcs r2, %[r]\n\t"
  12924. #else
  12925. "adc r2, %[r]\n\t"
  12926. #endif
  12927. "uxth r6, r7\n\t"
  12928. #ifdef WOLFSSL_KEIL
  12929. "muls r5, r6, r5\n\t"
  12930. #elif defined(__clang__)
  12931. "muls r5, r6\n\t"
  12932. #else
  12933. "mul r5, r6\n\t"
  12934. #endif
  12935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12936. "lsrs r6, r5, #16\n\t"
  12937. #else
  12938. "lsr r6, r5, #16\n\t"
  12939. #endif
  12940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12941. "lsls r5, r5, #16\n\t"
  12942. #else
  12943. "lsl r5, r5, #16\n\t"
  12944. #endif
  12945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12946. "adds r3, r3, r5\n\t"
  12947. #else
  12948. "add r3, r3, r5\n\t"
  12949. #endif
  12950. #ifdef WOLFSSL_KEIL
  12951. "adcs r4, r4, r6\n\t"
  12952. #elif defined(__clang__)
  12953. "adcs r4, r6\n\t"
  12954. #else
  12955. "adc r4, r6\n\t"
  12956. #endif
  12957. #ifdef WOLFSSL_KEIL
  12958. "adcs r2, r2, %[r]\n\t"
  12959. #elif defined(__clang__)
  12960. "adcs r2, %[r]\n\t"
  12961. #else
  12962. "adc r2, %[r]\n\t"
  12963. #endif
  12964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12965. "adds r3, r3, r5\n\t"
  12966. #else
  12967. "add r3, r3, r5\n\t"
  12968. #endif
  12969. #ifdef WOLFSSL_KEIL
  12970. "adcs r4, r4, r6\n\t"
  12971. #elif defined(__clang__)
  12972. "adcs r4, r6\n\t"
  12973. #else
  12974. "adc r4, r6\n\t"
  12975. #endif
  12976. #ifdef WOLFSSL_KEIL
  12977. "adcs r2, r2, %[r]\n\t"
  12978. #elif defined(__clang__)
  12979. "adcs r2, %[r]\n\t"
  12980. #else
  12981. "adc r2, %[r]\n\t"
  12982. #endif
  12983. "str r3, [sp, #4]\n\t"
  12984. "# A[2] * A[0]\n\t"
  12985. "movs r3, #0\n\t"
  12986. "mov %[a], r9\n\t"
  12987. "mov %[a], r12\n\t"
  12988. "uxth r5, %[a]\n\t"
  12989. "uxth r6, r7\n\t"
  12990. #ifdef WOLFSSL_KEIL
  12991. "muls r6, r5, r6\n\t"
  12992. #elif defined(__clang__)
  12993. "muls r6, r5\n\t"
  12994. #else
  12995. "mul r6, r5\n\t"
  12996. #endif
  12997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12998. "adds r4, r4, r6\n\t"
  12999. #else
  13000. "add r4, r4, r6\n\t"
  13001. #endif
  13002. #ifdef WOLFSSL_KEIL
  13003. "adcs r2, r2, %[r]\n\t"
  13004. #elif defined(__clang__)
  13005. "adcs r2, %[r]\n\t"
  13006. #else
  13007. "adc r2, %[r]\n\t"
  13008. #endif
  13009. #ifdef WOLFSSL_KEIL
  13010. "adcs r3, r3, %[r]\n\t"
  13011. #elif defined(__clang__)
  13012. "adcs r3, %[r]\n\t"
  13013. #else
  13014. "adc r3, %[r]\n\t"
  13015. #endif
  13016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13017. "adds r4, r4, r6\n\t"
  13018. #else
  13019. "add r4, r4, r6\n\t"
  13020. #endif
  13021. #ifdef WOLFSSL_KEIL
  13022. "adcs r2, r2, %[r]\n\t"
  13023. #elif defined(__clang__)
  13024. "adcs r2, %[r]\n\t"
  13025. #else
  13026. "adc r2, %[r]\n\t"
  13027. #endif
  13028. #ifdef WOLFSSL_KEIL
  13029. "adcs r3, r3, %[r]\n\t"
  13030. #elif defined(__clang__)
  13031. "adcs r3, %[r]\n\t"
  13032. #else
  13033. "adc r3, %[r]\n\t"
  13034. #endif
  13035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13036. "lsrs r6, r7, #16\n\t"
  13037. #else
  13038. "lsr r6, r7, #16\n\t"
  13039. #endif
  13040. #ifdef WOLFSSL_KEIL
  13041. "muls r5, r6, r5\n\t"
  13042. #elif defined(__clang__)
  13043. "muls r5, r6\n\t"
  13044. #else
  13045. "mul r5, r6\n\t"
  13046. #endif
  13047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13048. "lsrs r6, r5, #16\n\t"
  13049. #else
  13050. "lsr r6, r5, #16\n\t"
  13051. #endif
  13052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13053. "lsls r5, r5, #16\n\t"
  13054. #else
  13055. "lsl r5, r5, #16\n\t"
  13056. #endif
  13057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13058. "adds r4, r4, r5\n\t"
  13059. #else
  13060. "add r4, r4, r5\n\t"
  13061. #endif
  13062. #ifdef WOLFSSL_KEIL
  13063. "adcs r2, r2, r6\n\t"
  13064. #elif defined(__clang__)
  13065. "adcs r2, r6\n\t"
  13066. #else
  13067. "adc r2, r6\n\t"
  13068. #endif
  13069. #ifdef WOLFSSL_KEIL
  13070. "adcs r3, r3, %[r]\n\t"
  13071. #elif defined(__clang__)
  13072. "adcs r3, %[r]\n\t"
  13073. #else
  13074. "adc r3, %[r]\n\t"
  13075. #endif
  13076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13077. "adds r4, r4, r5\n\t"
  13078. #else
  13079. "add r4, r4, r5\n\t"
  13080. #endif
  13081. #ifdef WOLFSSL_KEIL
  13082. "adcs r2, r2, r6\n\t"
  13083. #elif defined(__clang__)
  13084. "adcs r2, r6\n\t"
  13085. #else
  13086. "adc r2, r6\n\t"
  13087. #endif
  13088. #ifdef WOLFSSL_KEIL
  13089. "adcs r3, r3, %[r]\n\t"
  13090. #elif defined(__clang__)
  13091. "adcs r3, %[r]\n\t"
  13092. #else
  13093. "adc r3, %[r]\n\t"
  13094. #endif
  13095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13096. "lsrs r5, %[a], #16\n\t"
  13097. #else
  13098. "lsr r5, %[a], #16\n\t"
  13099. #endif
  13100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13101. "lsrs r6, r7, #16\n\t"
  13102. #else
  13103. "lsr r6, r7, #16\n\t"
  13104. #endif
  13105. #ifdef WOLFSSL_KEIL
  13106. "muls r6, r5, r6\n\t"
  13107. #elif defined(__clang__)
  13108. "muls r6, r5\n\t"
  13109. #else
  13110. "mul r6, r5\n\t"
  13111. #endif
  13112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13113. "adds r2, r2, r6\n\t"
  13114. #else
  13115. "add r2, r2, r6\n\t"
  13116. #endif
  13117. #ifdef WOLFSSL_KEIL
  13118. "adcs r3, r3, %[r]\n\t"
  13119. #elif defined(__clang__)
  13120. "adcs r3, %[r]\n\t"
  13121. #else
  13122. "adc r3, %[r]\n\t"
  13123. #endif
  13124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13125. "adds r2, r2, r6\n\t"
  13126. #else
  13127. "add r2, r2, r6\n\t"
  13128. #endif
  13129. #ifdef WOLFSSL_KEIL
  13130. "adcs r3, r3, %[r]\n\t"
  13131. #elif defined(__clang__)
  13132. "adcs r3, %[r]\n\t"
  13133. #else
  13134. "adc r3, %[r]\n\t"
  13135. #endif
  13136. "uxth r6, r7\n\t"
  13137. #ifdef WOLFSSL_KEIL
  13138. "muls r5, r6, r5\n\t"
  13139. #elif defined(__clang__)
  13140. "muls r5, r6\n\t"
  13141. #else
  13142. "mul r5, r6\n\t"
  13143. #endif
  13144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13145. "lsrs r6, r5, #16\n\t"
  13146. #else
  13147. "lsr r6, r5, #16\n\t"
  13148. #endif
  13149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13150. "lsls r5, r5, #16\n\t"
  13151. #else
  13152. "lsl r5, r5, #16\n\t"
  13153. #endif
  13154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13155. "adds r4, r4, r5\n\t"
  13156. #else
  13157. "add r4, r4, r5\n\t"
  13158. #endif
  13159. #ifdef WOLFSSL_KEIL
  13160. "adcs r2, r2, r6\n\t"
  13161. #elif defined(__clang__)
  13162. "adcs r2, r6\n\t"
  13163. #else
  13164. "adc r2, r6\n\t"
  13165. #endif
  13166. #ifdef WOLFSSL_KEIL
  13167. "adcs r3, r3, %[r]\n\t"
  13168. #elif defined(__clang__)
  13169. "adcs r3, %[r]\n\t"
  13170. #else
  13171. "adc r3, %[r]\n\t"
  13172. #endif
  13173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13174. "adds r4, r4, r5\n\t"
  13175. #else
  13176. "add r4, r4, r5\n\t"
  13177. #endif
  13178. #ifdef WOLFSSL_KEIL
  13179. "adcs r2, r2, r6\n\t"
  13180. #elif defined(__clang__)
  13181. "adcs r2, r6\n\t"
  13182. #else
  13183. "adc r2, r6\n\t"
  13184. #endif
  13185. #ifdef WOLFSSL_KEIL
  13186. "adcs r3, r3, %[r]\n\t"
  13187. #elif defined(__clang__)
  13188. "adcs r3, %[r]\n\t"
  13189. #else
  13190. "adc r3, %[r]\n\t"
  13191. #endif
  13192. "# A[1] * A[1]\n\t"
  13193. "mov r7, r11\n\t"
  13194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13195. "lsrs r6, r7, #16\n\t"
  13196. #else
  13197. "lsr r6, r7, #16\n\t"
  13198. #endif
  13199. "uxth r5, r7\n\t"
  13200. #ifdef WOLFSSL_KEIL
  13201. "muls r5, r5, r5\n\t"
  13202. #elif defined(__clang__)
  13203. "muls r5, r5\n\t"
  13204. #else
  13205. "mul r5, r5\n\t"
  13206. #endif
  13207. #ifdef WOLFSSL_KEIL
  13208. "muls r6, r6, r6\n\t"
  13209. #elif defined(__clang__)
  13210. "muls r6, r6\n\t"
  13211. #else
  13212. "mul r6, r6\n\t"
  13213. #endif
  13214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13215. "adds r4, r4, r5\n\t"
  13216. #else
  13217. "add r4, r4, r5\n\t"
  13218. #endif
  13219. #ifdef WOLFSSL_KEIL
  13220. "adcs r2, r2, r6\n\t"
  13221. #elif defined(__clang__)
  13222. "adcs r2, r6\n\t"
  13223. #else
  13224. "adc r2, r6\n\t"
  13225. #endif
  13226. #ifdef WOLFSSL_KEIL
  13227. "adcs r3, r3, %[r]\n\t"
  13228. #elif defined(__clang__)
  13229. "adcs r3, %[r]\n\t"
  13230. #else
  13231. "adc r3, %[r]\n\t"
  13232. #endif
  13233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13234. "lsrs r6, r7, #16\n\t"
  13235. #else
  13236. "lsr r6, r7, #16\n\t"
  13237. #endif
  13238. "uxth r5, r7\n\t"
  13239. #ifdef WOLFSSL_KEIL
  13240. "muls r5, r6, r5\n\t"
  13241. #elif defined(__clang__)
  13242. "muls r5, r6\n\t"
  13243. #else
  13244. "mul r5, r6\n\t"
  13245. #endif
  13246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13247. "lsrs r6, r5, #15\n\t"
  13248. #else
  13249. "lsr r6, r5, #15\n\t"
  13250. #endif
  13251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13252. "lsls r5, r5, #17\n\t"
  13253. #else
  13254. "lsl r5, r5, #17\n\t"
  13255. #endif
  13256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13257. "adds r4, r4, r5\n\t"
  13258. #else
  13259. "add r4, r4, r5\n\t"
  13260. #endif
  13261. #ifdef WOLFSSL_KEIL
  13262. "adcs r2, r2, r6\n\t"
  13263. #elif defined(__clang__)
  13264. "adcs r2, r6\n\t"
  13265. #else
  13266. "adc r2, r6\n\t"
  13267. #endif
  13268. #ifdef WOLFSSL_KEIL
  13269. "adcs r3, r3, %[r]\n\t"
  13270. #elif defined(__clang__)
  13271. "adcs r3, %[r]\n\t"
  13272. #else
  13273. "adc r3, %[r]\n\t"
  13274. #endif
  13275. "str r4, [sp, #8]\n\t"
  13276. "# A[2] * A[1]\n\t"
  13277. "movs r4, #0\n\t"
  13278. "mov %[a], r9\n\t"
  13279. "mov %[a], r12\n\t"
  13280. "uxth r5, %[a]\n\t"
  13281. "uxth r6, r7\n\t"
  13282. #ifdef WOLFSSL_KEIL
  13283. "muls r6, r5, r6\n\t"
  13284. #elif defined(__clang__)
  13285. "muls r6, r5\n\t"
  13286. #else
  13287. "mul r6, r5\n\t"
  13288. #endif
  13289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13290. "adds r2, r2, r6\n\t"
  13291. #else
  13292. "add r2, r2, r6\n\t"
  13293. #endif
  13294. #ifdef WOLFSSL_KEIL
  13295. "adcs r3, r3, %[r]\n\t"
  13296. #elif defined(__clang__)
  13297. "adcs r3, %[r]\n\t"
  13298. #else
  13299. "adc r3, %[r]\n\t"
  13300. #endif
  13301. #ifdef WOLFSSL_KEIL
  13302. "adcs r4, r4, %[r]\n\t"
  13303. #elif defined(__clang__)
  13304. "adcs r4, %[r]\n\t"
  13305. #else
  13306. "adc r4, %[r]\n\t"
  13307. #endif
  13308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13309. "adds r2, r2, r6\n\t"
  13310. #else
  13311. "add r2, r2, r6\n\t"
  13312. #endif
  13313. #ifdef WOLFSSL_KEIL
  13314. "adcs r3, r3, %[r]\n\t"
  13315. #elif defined(__clang__)
  13316. "adcs r3, %[r]\n\t"
  13317. #else
  13318. "adc r3, %[r]\n\t"
  13319. #endif
  13320. #ifdef WOLFSSL_KEIL
  13321. "adcs r4, r4, %[r]\n\t"
  13322. #elif defined(__clang__)
  13323. "adcs r4, %[r]\n\t"
  13324. #else
  13325. "adc r4, %[r]\n\t"
  13326. #endif
  13327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13328. "lsrs r6, r7, #16\n\t"
  13329. #else
  13330. "lsr r6, r7, #16\n\t"
  13331. #endif
  13332. #ifdef WOLFSSL_KEIL
  13333. "muls r5, r6, r5\n\t"
  13334. #elif defined(__clang__)
  13335. "muls r5, r6\n\t"
  13336. #else
  13337. "mul r5, r6\n\t"
  13338. #endif
  13339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13340. "lsrs r6, r5, #16\n\t"
  13341. #else
  13342. "lsr r6, r5, #16\n\t"
  13343. #endif
  13344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13345. "lsls r5, r5, #16\n\t"
  13346. #else
  13347. "lsl r5, r5, #16\n\t"
  13348. #endif
  13349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13350. "adds r2, r2, r5\n\t"
  13351. #else
  13352. "add r2, r2, r5\n\t"
  13353. #endif
  13354. #ifdef WOLFSSL_KEIL
  13355. "adcs r3, r3, r6\n\t"
  13356. #elif defined(__clang__)
  13357. "adcs r3, r6\n\t"
  13358. #else
  13359. "adc r3, r6\n\t"
  13360. #endif
  13361. #ifdef WOLFSSL_KEIL
  13362. "adcs r4, r4, %[r]\n\t"
  13363. #elif defined(__clang__)
  13364. "adcs r4, %[r]\n\t"
  13365. #else
  13366. "adc r4, %[r]\n\t"
  13367. #endif
  13368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13369. "adds r2, r2, r5\n\t"
  13370. #else
  13371. "add r2, r2, r5\n\t"
  13372. #endif
  13373. #ifdef WOLFSSL_KEIL
  13374. "adcs r3, r3, r6\n\t"
  13375. #elif defined(__clang__)
  13376. "adcs r3, r6\n\t"
  13377. #else
  13378. "adc r3, r6\n\t"
  13379. #endif
  13380. #ifdef WOLFSSL_KEIL
  13381. "adcs r4, r4, %[r]\n\t"
  13382. #elif defined(__clang__)
  13383. "adcs r4, %[r]\n\t"
  13384. #else
  13385. "adc r4, %[r]\n\t"
  13386. #endif
  13387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13388. "lsrs r5, %[a], #16\n\t"
  13389. #else
  13390. "lsr r5, %[a], #16\n\t"
  13391. #endif
  13392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13393. "lsrs r6, r7, #16\n\t"
  13394. #else
  13395. "lsr r6, r7, #16\n\t"
  13396. #endif
  13397. #ifdef WOLFSSL_KEIL
  13398. "muls r6, r5, r6\n\t"
  13399. #elif defined(__clang__)
  13400. "muls r6, r5\n\t"
  13401. #else
  13402. "mul r6, r5\n\t"
  13403. #endif
  13404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13405. "adds r3, r3, r6\n\t"
  13406. #else
  13407. "add r3, r3, r6\n\t"
  13408. #endif
  13409. #ifdef WOLFSSL_KEIL
  13410. "adcs r4, r4, %[r]\n\t"
  13411. #elif defined(__clang__)
  13412. "adcs r4, %[r]\n\t"
  13413. #else
  13414. "adc r4, %[r]\n\t"
  13415. #endif
  13416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13417. "adds r3, r3, r6\n\t"
  13418. #else
  13419. "add r3, r3, r6\n\t"
  13420. #endif
  13421. #ifdef WOLFSSL_KEIL
  13422. "adcs r4, r4, %[r]\n\t"
  13423. #elif defined(__clang__)
  13424. "adcs r4, %[r]\n\t"
  13425. #else
  13426. "adc r4, %[r]\n\t"
  13427. #endif
  13428. "uxth r6, r7\n\t"
  13429. #ifdef WOLFSSL_KEIL
  13430. "muls r5, r6, r5\n\t"
  13431. #elif defined(__clang__)
  13432. "muls r5, r6\n\t"
  13433. #else
  13434. "mul r5, r6\n\t"
  13435. #endif
  13436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13437. "lsrs r6, r5, #16\n\t"
  13438. #else
  13439. "lsr r6, r5, #16\n\t"
  13440. #endif
  13441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13442. "lsls r5, r5, #16\n\t"
  13443. #else
  13444. "lsl r5, r5, #16\n\t"
  13445. #endif
  13446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13447. "adds r2, r2, r5\n\t"
  13448. #else
  13449. "add r2, r2, r5\n\t"
  13450. #endif
  13451. #ifdef WOLFSSL_KEIL
  13452. "adcs r3, r3, r6\n\t"
  13453. #elif defined(__clang__)
  13454. "adcs r3, r6\n\t"
  13455. #else
  13456. "adc r3, r6\n\t"
  13457. #endif
  13458. #ifdef WOLFSSL_KEIL
  13459. "adcs r4, r4, %[r]\n\t"
  13460. #elif defined(__clang__)
  13461. "adcs r4, %[r]\n\t"
  13462. #else
  13463. "adc r4, %[r]\n\t"
  13464. #endif
  13465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13466. "adds r2, r2, r5\n\t"
  13467. #else
  13468. "add r2, r2, r5\n\t"
  13469. #endif
  13470. #ifdef WOLFSSL_KEIL
  13471. "adcs r3, r3, r6\n\t"
  13472. #elif defined(__clang__)
  13473. "adcs r3, r6\n\t"
  13474. #else
  13475. "adc r3, r6\n\t"
  13476. #endif
  13477. #ifdef WOLFSSL_KEIL
  13478. "adcs r4, r4, %[r]\n\t"
  13479. #elif defined(__clang__)
  13480. "adcs r4, %[r]\n\t"
  13481. #else
  13482. "adc r4, %[r]\n\t"
  13483. #endif
  13484. "# A[3] * A[0]\n\t"
  13485. "mov %[a], r9\n\t"
  13486. "mov r7, r10\n\t"
  13487. "mov %[a], lr\n\t"
  13488. "uxth r5, %[a]\n\t"
  13489. "uxth r6, r7\n\t"
  13490. #ifdef WOLFSSL_KEIL
  13491. "muls r6, r5, r6\n\t"
  13492. #elif defined(__clang__)
  13493. "muls r6, r5\n\t"
  13494. #else
  13495. "mul r6, r5\n\t"
  13496. #endif
  13497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13498. "adds r2, r2, r6\n\t"
  13499. #else
  13500. "add r2, r2, r6\n\t"
  13501. #endif
  13502. #ifdef WOLFSSL_KEIL
  13503. "adcs r3, r3, %[r]\n\t"
  13504. #elif defined(__clang__)
  13505. "adcs r3, %[r]\n\t"
  13506. #else
  13507. "adc r3, %[r]\n\t"
  13508. #endif
  13509. #ifdef WOLFSSL_KEIL
  13510. "adcs r4, r4, %[r]\n\t"
  13511. #elif defined(__clang__)
  13512. "adcs r4, %[r]\n\t"
  13513. #else
  13514. "adc r4, %[r]\n\t"
  13515. #endif
  13516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13517. "adds r2, r2, r6\n\t"
  13518. #else
  13519. "add r2, r2, r6\n\t"
  13520. #endif
  13521. #ifdef WOLFSSL_KEIL
  13522. "adcs r3, r3, %[r]\n\t"
  13523. #elif defined(__clang__)
  13524. "adcs r3, %[r]\n\t"
  13525. #else
  13526. "adc r3, %[r]\n\t"
  13527. #endif
  13528. #ifdef WOLFSSL_KEIL
  13529. "adcs r4, r4, %[r]\n\t"
  13530. #elif defined(__clang__)
  13531. "adcs r4, %[r]\n\t"
  13532. #else
  13533. "adc r4, %[r]\n\t"
  13534. #endif
  13535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13536. "lsrs r6, r7, #16\n\t"
  13537. #else
  13538. "lsr r6, r7, #16\n\t"
  13539. #endif
  13540. #ifdef WOLFSSL_KEIL
  13541. "muls r5, r6, r5\n\t"
  13542. #elif defined(__clang__)
  13543. "muls r5, r6\n\t"
  13544. #else
  13545. "mul r5, r6\n\t"
  13546. #endif
  13547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13548. "lsrs r6, r5, #16\n\t"
  13549. #else
  13550. "lsr r6, r5, #16\n\t"
  13551. #endif
  13552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13553. "lsls r5, r5, #16\n\t"
  13554. #else
  13555. "lsl r5, r5, #16\n\t"
  13556. #endif
  13557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13558. "adds r2, r2, r5\n\t"
  13559. #else
  13560. "add r2, r2, r5\n\t"
  13561. #endif
  13562. #ifdef WOLFSSL_KEIL
  13563. "adcs r3, r3, r6\n\t"
  13564. #elif defined(__clang__)
  13565. "adcs r3, r6\n\t"
  13566. #else
  13567. "adc r3, r6\n\t"
  13568. #endif
  13569. #ifdef WOLFSSL_KEIL
  13570. "adcs r4, r4, %[r]\n\t"
  13571. #elif defined(__clang__)
  13572. "adcs r4, %[r]\n\t"
  13573. #else
  13574. "adc r4, %[r]\n\t"
  13575. #endif
  13576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13577. "adds r2, r2, r5\n\t"
  13578. #else
  13579. "add r2, r2, r5\n\t"
  13580. #endif
  13581. #ifdef WOLFSSL_KEIL
  13582. "adcs r3, r3, r6\n\t"
  13583. #elif defined(__clang__)
  13584. "adcs r3, r6\n\t"
  13585. #else
  13586. "adc r3, r6\n\t"
  13587. #endif
  13588. #ifdef WOLFSSL_KEIL
  13589. "adcs r4, r4, %[r]\n\t"
  13590. #elif defined(__clang__)
  13591. "adcs r4, %[r]\n\t"
  13592. #else
  13593. "adc r4, %[r]\n\t"
  13594. #endif
  13595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13596. "lsrs r5, %[a], #16\n\t"
  13597. #else
  13598. "lsr r5, %[a], #16\n\t"
  13599. #endif
  13600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13601. "lsrs r6, r7, #16\n\t"
  13602. #else
  13603. "lsr r6, r7, #16\n\t"
  13604. #endif
  13605. #ifdef WOLFSSL_KEIL
  13606. "muls r6, r5, r6\n\t"
  13607. #elif defined(__clang__)
  13608. "muls r6, r5\n\t"
  13609. #else
  13610. "mul r6, r5\n\t"
  13611. #endif
  13612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13613. "adds r3, r3, r6\n\t"
  13614. #else
  13615. "add r3, r3, r6\n\t"
  13616. #endif
  13617. #ifdef WOLFSSL_KEIL
  13618. "adcs r4, r4, %[r]\n\t"
  13619. #elif defined(__clang__)
  13620. "adcs r4, %[r]\n\t"
  13621. #else
  13622. "adc r4, %[r]\n\t"
  13623. #endif
  13624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13625. "adds r3, r3, r6\n\t"
  13626. #else
  13627. "add r3, r3, r6\n\t"
  13628. #endif
  13629. #ifdef WOLFSSL_KEIL
  13630. "adcs r4, r4, %[r]\n\t"
  13631. #elif defined(__clang__)
  13632. "adcs r4, %[r]\n\t"
  13633. #else
  13634. "adc r4, %[r]\n\t"
  13635. #endif
  13636. "uxth r6, r7\n\t"
  13637. #ifdef WOLFSSL_KEIL
  13638. "muls r5, r6, r5\n\t"
  13639. #elif defined(__clang__)
  13640. "muls r5, r6\n\t"
  13641. #else
  13642. "mul r5, r6\n\t"
  13643. #endif
  13644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13645. "lsrs r6, r5, #16\n\t"
  13646. #else
  13647. "lsr r6, r5, #16\n\t"
  13648. #endif
  13649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13650. "lsls r5, r5, #16\n\t"
  13651. #else
  13652. "lsl r5, r5, #16\n\t"
  13653. #endif
  13654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13655. "adds r2, r2, r5\n\t"
  13656. #else
  13657. "add r2, r2, r5\n\t"
  13658. #endif
  13659. #ifdef WOLFSSL_KEIL
  13660. "adcs r3, r3, r6\n\t"
  13661. #elif defined(__clang__)
  13662. "adcs r3, r6\n\t"
  13663. #else
  13664. "adc r3, r6\n\t"
  13665. #endif
  13666. #ifdef WOLFSSL_KEIL
  13667. "adcs r4, r4, %[r]\n\t"
  13668. #elif defined(__clang__)
  13669. "adcs r4, %[r]\n\t"
  13670. #else
  13671. "adc r4, %[r]\n\t"
  13672. #endif
  13673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13674. "adds r2, r2, r5\n\t"
  13675. #else
  13676. "add r2, r2, r5\n\t"
  13677. #endif
  13678. #ifdef WOLFSSL_KEIL
  13679. "adcs r3, r3, r6\n\t"
  13680. #elif defined(__clang__)
  13681. "adcs r3, r6\n\t"
  13682. #else
  13683. "adc r3, r6\n\t"
  13684. #endif
  13685. #ifdef WOLFSSL_KEIL
  13686. "adcs r4, r4, %[r]\n\t"
  13687. #elif defined(__clang__)
  13688. "adcs r4, %[r]\n\t"
  13689. #else
  13690. "adc r4, %[r]\n\t"
  13691. #endif
  13692. "str r2, [sp, #12]\n\t"
  13693. "# A[4] * A[0]\n\t"
  13694. "movs r2, #0\n\t"
  13695. "mov %[a], r9\n\t"
  13696. "ldr %[a], [%[a], #16]\n\t"
  13697. "uxth r5, %[a]\n\t"
  13698. "uxth r6, r7\n\t"
  13699. #ifdef WOLFSSL_KEIL
  13700. "muls r6, r5, r6\n\t"
  13701. #elif defined(__clang__)
  13702. "muls r6, r5\n\t"
  13703. #else
  13704. "mul r6, r5\n\t"
  13705. #endif
  13706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13707. "adds r3, r3, r6\n\t"
  13708. #else
  13709. "add r3, r3, r6\n\t"
  13710. #endif
  13711. #ifdef WOLFSSL_KEIL
  13712. "adcs r4, r4, %[r]\n\t"
  13713. #elif defined(__clang__)
  13714. "adcs r4, %[r]\n\t"
  13715. #else
  13716. "adc r4, %[r]\n\t"
  13717. #endif
  13718. #ifdef WOLFSSL_KEIL
  13719. "adcs r2, r2, %[r]\n\t"
  13720. #elif defined(__clang__)
  13721. "adcs r2, %[r]\n\t"
  13722. #else
  13723. "adc r2, %[r]\n\t"
  13724. #endif
  13725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13726. "adds r3, r3, r6\n\t"
  13727. #else
  13728. "add r3, r3, r6\n\t"
  13729. #endif
  13730. #ifdef WOLFSSL_KEIL
  13731. "adcs r4, r4, %[r]\n\t"
  13732. #elif defined(__clang__)
  13733. "adcs r4, %[r]\n\t"
  13734. #else
  13735. "adc r4, %[r]\n\t"
  13736. #endif
  13737. #ifdef WOLFSSL_KEIL
  13738. "adcs r2, r2, %[r]\n\t"
  13739. #elif defined(__clang__)
  13740. "adcs r2, %[r]\n\t"
  13741. #else
  13742. "adc r2, %[r]\n\t"
  13743. #endif
  13744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13745. "lsrs r6, r7, #16\n\t"
  13746. #else
  13747. "lsr r6, r7, #16\n\t"
  13748. #endif
  13749. #ifdef WOLFSSL_KEIL
  13750. "muls r5, r6, r5\n\t"
  13751. #elif defined(__clang__)
  13752. "muls r5, r6\n\t"
  13753. #else
  13754. "mul r5, r6\n\t"
  13755. #endif
  13756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13757. "lsrs r6, r5, #16\n\t"
  13758. #else
  13759. "lsr r6, r5, #16\n\t"
  13760. #endif
  13761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13762. "lsls r5, r5, #16\n\t"
  13763. #else
  13764. "lsl r5, r5, #16\n\t"
  13765. #endif
  13766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13767. "adds r3, r3, r5\n\t"
  13768. #else
  13769. "add r3, r3, r5\n\t"
  13770. #endif
  13771. #ifdef WOLFSSL_KEIL
  13772. "adcs r4, r4, r6\n\t"
  13773. #elif defined(__clang__)
  13774. "adcs r4, r6\n\t"
  13775. #else
  13776. "adc r4, r6\n\t"
  13777. #endif
  13778. #ifdef WOLFSSL_KEIL
  13779. "adcs r2, r2, %[r]\n\t"
  13780. #elif defined(__clang__)
  13781. "adcs r2, %[r]\n\t"
  13782. #else
  13783. "adc r2, %[r]\n\t"
  13784. #endif
  13785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13786. "adds r3, r3, r5\n\t"
  13787. #else
  13788. "add r3, r3, r5\n\t"
  13789. #endif
  13790. #ifdef WOLFSSL_KEIL
  13791. "adcs r4, r4, r6\n\t"
  13792. #elif defined(__clang__)
  13793. "adcs r4, r6\n\t"
  13794. #else
  13795. "adc r4, r6\n\t"
  13796. #endif
  13797. #ifdef WOLFSSL_KEIL
  13798. "adcs r2, r2, %[r]\n\t"
  13799. #elif defined(__clang__)
  13800. "adcs r2, %[r]\n\t"
  13801. #else
  13802. "adc r2, %[r]\n\t"
  13803. #endif
  13804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13805. "lsrs r5, %[a], #16\n\t"
  13806. #else
  13807. "lsr r5, %[a], #16\n\t"
  13808. #endif
  13809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13810. "lsrs r6, r7, #16\n\t"
  13811. #else
  13812. "lsr r6, r7, #16\n\t"
  13813. #endif
  13814. #ifdef WOLFSSL_KEIL
  13815. "muls r6, r5, r6\n\t"
  13816. #elif defined(__clang__)
  13817. "muls r6, r5\n\t"
  13818. #else
  13819. "mul r6, r5\n\t"
  13820. #endif
  13821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13822. "adds r4, r4, r6\n\t"
  13823. #else
  13824. "add r4, r4, r6\n\t"
  13825. #endif
  13826. #ifdef WOLFSSL_KEIL
  13827. "adcs r2, r2, %[r]\n\t"
  13828. #elif defined(__clang__)
  13829. "adcs r2, %[r]\n\t"
  13830. #else
  13831. "adc r2, %[r]\n\t"
  13832. #endif
  13833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13834. "adds r4, r4, r6\n\t"
  13835. #else
  13836. "add r4, r4, r6\n\t"
  13837. #endif
  13838. #ifdef WOLFSSL_KEIL
  13839. "adcs r2, r2, %[r]\n\t"
  13840. #elif defined(__clang__)
  13841. "adcs r2, %[r]\n\t"
  13842. #else
  13843. "adc r2, %[r]\n\t"
  13844. #endif
  13845. "uxth r6, r7\n\t"
  13846. #ifdef WOLFSSL_KEIL
  13847. "muls r5, r6, r5\n\t"
  13848. #elif defined(__clang__)
  13849. "muls r5, r6\n\t"
  13850. #else
  13851. "mul r5, r6\n\t"
  13852. #endif
  13853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13854. "lsrs r6, r5, #16\n\t"
  13855. #else
  13856. "lsr r6, r5, #16\n\t"
  13857. #endif
  13858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13859. "lsls r5, r5, #16\n\t"
  13860. #else
  13861. "lsl r5, r5, #16\n\t"
  13862. #endif
  13863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13864. "adds r3, r3, r5\n\t"
  13865. #else
  13866. "add r3, r3, r5\n\t"
  13867. #endif
  13868. #ifdef WOLFSSL_KEIL
  13869. "adcs r4, r4, r6\n\t"
  13870. #elif defined(__clang__)
  13871. "adcs r4, r6\n\t"
  13872. #else
  13873. "adc r4, r6\n\t"
  13874. #endif
  13875. #ifdef WOLFSSL_KEIL
  13876. "adcs r2, r2, %[r]\n\t"
  13877. #elif defined(__clang__)
  13878. "adcs r2, %[r]\n\t"
  13879. #else
  13880. "adc r2, %[r]\n\t"
  13881. #endif
  13882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13883. "adds r3, r3, r5\n\t"
  13884. #else
  13885. "add r3, r3, r5\n\t"
  13886. #endif
  13887. #ifdef WOLFSSL_KEIL
  13888. "adcs r4, r4, r6\n\t"
  13889. #elif defined(__clang__)
  13890. "adcs r4, r6\n\t"
  13891. #else
  13892. "adc r4, r6\n\t"
  13893. #endif
  13894. #ifdef WOLFSSL_KEIL
  13895. "adcs r2, r2, %[r]\n\t"
  13896. #elif defined(__clang__)
  13897. "adcs r2, %[r]\n\t"
  13898. #else
  13899. "adc r2, %[r]\n\t"
  13900. #endif
  13901. "# A[3] * A[1]\n\t"
  13902. "mov %[a], r9\n\t"
  13903. "mov r7, r11\n\t"
  13904. "mov %[a], lr\n\t"
  13905. "uxth r5, %[a]\n\t"
  13906. "uxth r6, r7\n\t"
  13907. #ifdef WOLFSSL_KEIL
  13908. "muls r6, r5, r6\n\t"
  13909. #elif defined(__clang__)
  13910. "muls r6, r5\n\t"
  13911. #else
  13912. "mul r6, r5\n\t"
  13913. #endif
  13914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13915. "adds r3, r3, r6\n\t"
  13916. #else
  13917. "add r3, r3, r6\n\t"
  13918. #endif
  13919. #ifdef WOLFSSL_KEIL
  13920. "adcs r4, r4, %[r]\n\t"
  13921. #elif defined(__clang__)
  13922. "adcs r4, %[r]\n\t"
  13923. #else
  13924. "adc r4, %[r]\n\t"
  13925. #endif
  13926. #ifdef WOLFSSL_KEIL
  13927. "adcs r2, r2, %[r]\n\t"
  13928. #elif defined(__clang__)
  13929. "adcs r2, %[r]\n\t"
  13930. #else
  13931. "adc r2, %[r]\n\t"
  13932. #endif
  13933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13934. "adds r3, r3, r6\n\t"
  13935. #else
  13936. "add r3, r3, r6\n\t"
  13937. #endif
  13938. #ifdef WOLFSSL_KEIL
  13939. "adcs r4, r4, %[r]\n\t"
  13940. #elif defined(__clang__)
  13941. "adcs r4, %[r]\n\t"
  13942. #else
  13943. "adc r4, %[r]\n\t"
  13944. #endif
  13945. #ifdef WOLFSSL_KEIL
  13946. "adcs r2, r2, %[r]\n\t"
  13947. #elif defined(__clang__)
  13948. "adcs r2, %[r]\n\t"
  13949. #else
  13950. "adc r2, %[r]\n\t"
  13951. #endif
  13952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13953. "lsrs r6, r7, #16\n\t"
  13954. #else
  13955. "lsr r6, r7, #16\n\t"
  13956. #endif
  13957. #ifdef WOLFSSL_KEIL
  13958. "muls r5, r6, r5\n\t"
  13959. #elif defined(__clang__)
  13960. "muls r5, r6\n\t"
  13961. #else
  13962. "mul r5, r6\n\t"
  13963. #endif
  13964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13965. "lsrs r6, r5, #16\n\t"
  13966. #else
  13967. "lsr r6, r5, #16\n\t"
  13968. #endif
  13969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13970. "lsls r5, r5, #16\n\t"
  13971. #else
  13972. "lsl r5, r5, #16\n\t"
  13973. #endif
  13974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13975. "adds r3, r3, r5\n\t"
  13976. #else
  13977. "add r3, r3, r5\n\t"
  13978. #endif
  13979. #ifdef WOLFSSL_KEIL
  13980. "adcs r4, r4, r6\n\t"
  13981. #elif defined(__clang__)
  13982. "adcs r4, r6\n\t"
  13983. #else
  13984. "adc r4, r6\n\t"
  13985. #endif
  13986. #ifdef WOLFSSL_KEIL
  13987. "adcs r2, r2, %[r]\n\t"
  13988. #elif defined(__clang__)
  13989. "adcs r2, %[r]\n\t"
  13990. #else
  13991. "adc r2, %[r]\n\t"
  13992. #endif
  13993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13994. "adds r3, r3, r5\n\t"
  13995. #else
  13996. "add r3, r3, r5\n\t"
  13997. #endif
  13998. #ifdef WOLFSSL_KEIL
  13999. "adcs r4, r4, r6\n\t"
  14000. #elif defined(__clang__)
  14001. "adcs r4, r6\n\t"
  14002. #else
  14003. "adc r4, r6\n\t"
  14004. #endif
  14005. #ifdef WOLFSSL_KEIL
  14006. "adcs r2, r2, %[r]\n\t"
  14007. #elif defined(__clang__)
  14008. "adcs r2, %[r]\n\t"
  14009. #else
  14010. "adc r2, %[r]\n\t"
  14011. #endif
  14012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14013. "lsrs r5, %[a], #16\n\t"
  14014. #else
  14015. "lsr r5, %[a], #16\n\t"
  14016. #endif
  14017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14018. "lsrs r6, r7, #16\n\t"
  14019. #else
  14020. "lsr r6, r7, #16\n\t"
  14021. #endif
  14022. #ifdef WOLFSSL_KEIL
  14023. "muls r6, r5, r6\n\t"
  14024. #elif defined(__clang__)
  14025. "muls r6, r5\n\t"
  14026. #else
  14027. "mul r6, r5\n\t"
  14028. #endif
  14029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14030. "adds r4, r4, r6\n\t"
  14031. #else
  14032. "add r4, r4, r6\n\t"
  14033. #endif
  14034. #ifdef WOLFSSL_KEIL
  14035. "adcs r2, r2, %[r]\n\t"
  14036. #elif defined(__clang__)
  14037. "adcs r2, %[r]\n\t"
  14038. #else
  14039. "adc r2, %[r]\n\t"
  14040. #endif
  14041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14042. "adds r4, r4, r6\n\t"
  14043. #else
  14044. "add r4, r4, r6\n\t"
  14045. #endif
  14046. #ifdef WOLFSSL_KEIL
  14047. "adcs r2, r2, %[r]\n\t"
  14048. #elif defined(__clang__)
  14049. "adcs r2, %[r]\n\t"
  14050. #else
  14051. "adc r2, %[r]\n\t"
  14052. #endif
  14053. "uxth r6, r7\n\t"
  14054. #ifdef WOLFSSL_KEIL
  14055. "muls r5, r6, r5\n\t"
  14056. #elif defined(__clang__)
  14057. "muls r5, r6\n\t"
  14058. #else
  14059. "mul r5, r6\n\t"
  14060. #endif
  14061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14062. "lsrs r6, r5, #16\n\t"
  14063. #else
  14064. "lsr r6, r5, #16\n\t"
  14065. #endif
  14066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14067. "lsls r5, r5, #16\n\t"
  14068. #else
  14069. "lsl r5, r5, #16\n\t"
  14070. #endif
  14071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14072. "adds r3, r3, r5\n\t"
  14073. #else
  14074. "add r3, r3, r5\n\t"
  14075. #endif
  14076. #ifdef WOLFSSL_KEIL
  14077. "adcs r4, r4, r6\n\t"
  14078. #elif defined(__clang__)
  14079. "adcs r4, r6\n\t"
  14080. #else
  14081. "adc r4, r6\n\t"
  14082. #endif
  14083. #ifdef WOLFSSL_KEIL
  14084. "adcs r2, r2, %[r]\n\t"
  14085. #elif defined(__clang__)
  14086. "adcs r2, %[r]\n\t"
  14087. #else
  14088. "adc r2, %[r]\n\t"
  14089. #endif
  14090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14091. "adds r3, r3, r5\n\t"
  14092. #else
  14093. "add r3, r3, r5\n\t"
  14094. #endif
  14095. #ifdef WOLFSSL_KEIL
  14096. "adcs r4, r4, r6\n\t"
  14097. #elif defined(__clang__)
  14098. "adcs r4, r6\n\t"
  14099. #else
  14100. "adc r4, r6\n\t"
  14101. #endif
  14102. #ifdef WOLFSSL_KEIL
  14103. "adcs r2, r2, %[r]\n\t"
  14104. #elif defined(__clang__)
  14105. "adcs r2, %[r]\n\t"
  14106. #else
  14107. "adc r2, %[r]\n\t"
  14108. #endif
  14109. "# A[2] * A[2]\n\t"
  14110. "mov r7, r12\n\t"
  14111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14112. "lsrs r6, r7, #16\n\t"
  14113. #else
  14114. "lsr r6, r7, #16\n\t"
  14115. #endif
  14116. "uxth r5, r7\n\t"
  14117. #ifdef WOLFSSL_KEIL
  14118. "muls r5, r5, r5\n\t"
  14119. #elif defined(__clang__)
  14120. "muls r5, r5\n\t"
  14121. #else
  14122. "mul r5, r5\n\t"
  14123. #endif
  14124. #ifdef WOLFSSL_KEIL
  14125. "muls r6, r6, r6\n\t"
  14126. #elif defined(__clang__)
  14127. "muls r6, r6\n\t"
  14128. #else
  14129. "mul r6, r6\n\t"
  14130. #endif
  14131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14132. "adds r3, r3, r5\n\t"
  14133. #else
  14134. "add r3, r3, r5\n\t"
  14135. #endif
  14136. #ifdef WOLFSSL_KEIL
  14137. "adcs r4, r4, r6\n\t"
  14138. #elif defined(__clang__)
  14139. "adcs r4, r6\n\t"
  14140. #else
  14141. "adc r4, r6\n\t"
  14142. #endif
  14143. #ifdef WOLFSSL_KEIL
  14144. "adcs r2, r2, %[r]\n\t"
  14145. #elif defined(__clang__)
  14146. "adcs r2, %[r]\n\t"
  14147. #else
  14148. "adc r2, %[r]\n\t"
  14149. #endif
  14150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14151. "lsrs r6, r7, #16\n\t"
  14152. #else
  14153. "lsr r6, r7, #16\n\t"
  14154. #endif
  14155. "uxth r5, r7\n\t"
  14156. #ifdef WOLFSSL_KEIL
  14157. "muls r5, r6, r5\n\t"
  14158. #elif defined(__clang__)
  14159. "muls r5, r6\n\t"
  14160. #else
  14161. "mul r5, r6\n\t"
  14162. #endif
  14163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14164. "lsrs r6, r5, #15\n\t"
  14165. #else
  14166. "lsr r6, r5, #15\n\t"
  14167. #endif
  14168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14169. "lsls r5, r5, #17\n\t"
  14170. #else
  14171. "lsl r5, r5, #17\n\t"
  14172. #endif
  14173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14174. "adds r3, r3, r5\n\t"
  14175. #else
  14176. "add r3, r3, r5\n\t"
  14177. #endif
  14178. #ifdef WOLFSSL_KEIL
  14179. "adcs r4, r4, r6\n\t"
  14180. #elif defined(__clang__)
  14181. "adcs r4, r6\n\t"
  14182. #else
  14183. "adc r4, r6\n\t"
  14184. #endif
  14185. #ifdef WOLFSSL_KEIL
  14186. "adcs r2, r2, %[r]\n\t"
  14187. #elif defined(__clang__)
  14188. "adcs r2, %[r]\n\t"
  14189. #else
  14190. "adc r2, %[r]\n\t"
  14191. #endif
  14192. "str r3, [sp, #16]\n\t"
  14193. "# A[3] * A[2]\n\t"
  14194. "movs r3, #0\n\t"
  14195. "mov %[a], r9\n\t"
  14196. "mov %[a], lr\n\t"
  14197. "uxth r5, %[a]\n\t"
  14198. "uxth r6, r7\n\t"
  14199. #ifdef WOLFSSL_KEIL
  14200. "muls r6, r5, r6\n\t"
  14201. #elif defined(__clang__)
  14202. "muls r6, r5\n\t"
  14203. #else
  14204. "mul r6, r5\n\t"
  14205. #endif
  14206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14207. "adds r4, r4, r6\n\t"
  14208. #else
  14209. "add r4, r4, r6\n\t"
  14210. #endif
  14211. #ifdef WOLFSSL_KEIL
  14212. "adcs r2, r2, %[r]\n\t"
  14213. #elif defined(__clang__)
  14214. "adcs r2, %[r]\n\t"
  14215. #else
  14216. "adc r2, %[r]\n\t"
  14217. #endif
  14218. #ifdef WOLFSSL_KEIL
  14219. "adcs r3, r3, %[r]\n\t"
  14220. #elif defined(__clang__)
  14221. "adcs r3, %[r]\n\t"
  14222. #else
  14223. "adc r3, %[r]\n\t"
  14224. #endif
  14225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14226. "adds r4, r4, r6\n\t"
  14227. #else
  14228. "add r4, r4, r6\n\t"
  14229. #endif
  14230. #ifdef WOLFSSL_KEIL
  14231. "adcs r2, r2, %[r]\n\t"
  14232. #elif defined(__clang__)
  14233. "adcs r2, %[r]\n\t"
  14234. #else
  14235. "adc r2, %[r]\n\t"
  14236. #endif
  14237. #ifdef WOLFSSL_KEIL
  14238. "adcs r3, r3, %[r]\n\t"
  14239. #elif defined(__clang__)
  14240. "adcs r3, %[r]\n\t"
  14241. #else
  14242. "adc r3, %[r]\n\t"
  14243. #endif
  14244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14245. "lsrs r6, r7, #16\n\t"
  14246. #else
  14247. "lsr r6, r7, #16\n\t"
  14248. #endif
  14249. #ifdef WOLFSSL_KEIL
  14250. "muls r5, r6, r5\n\t"
  14251. #elif defined(__clang__)
  14252. "muls r5, r6\n\t"
  14253. #else
  14254. "mul r5, r6\n\t"
  14255. #endif
  14256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14257. "lsrs r6, r5, #16\n\t"
  14258. #else
  14259. "lsr r6, r5, #16\n\t"
  14260. #endif
  14261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14262. "lsls r5, r5, #16\n\t"
  14263. #else
  14264. "lsl r5, r5, #16\n\t"
  14265. #endif
  14266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14267. "adds r4, r4, r5\n\t"
  14268. #else
  14269. "add r4, r4, r5\n\t"
  14270. #endif
  14271. #ifdef WOLFSSL_KEIL
  14272. "adcs r2, r2, r6\n\t"
  14273. #elif defined(__clang__)
  14274. "adcs r2, r6\n\t"
  14275. #else
  14276. "adc r2, r6\n\t"
  14277. #endif
  14278. #ifdef WOLFSSL_KEIL
  14279. "adcs r3, r3, %[r]\n\t"
  14280. #elif defined(__clang__)
  14281. "adcs r3, %[r]\n\t"
  14282. #else
  14283. "adc r3, %[r]\n\t"
  14284. #endif
  14285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14286. "adds r4, r4, r5\n\t"
  14287. #else
  14288. "add r4, r4, r5\n\t"
  14289. #endif
  14290. #ifdef WOLFSSL_KEIL
  14291. "adcs r2, r2, r6\n\t"
  14292. #elif defined(__clang__)
  14293. "adcs r2, r6\n\t"
  14294. #else
  14295. "adc r2, r6\n\t"
  14296. #endif
  14297. #ifdef WOLFSSL_KEIL
  14298. "adcs r3, r3, %[r]\n\t"
  14299. #elif defined(__clang__)
  14300. "adcs r3, %[r]\n\t"
  14301. #else
  14302. "adc r3, %[r]\n\t"
  14303. #endif
  14304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14305. "lsrs r5, %[a], #16\n\t"
  14306. #else
  14307. "lsr r5, %[a], #16\n\t"
  14308. #endif
  14309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14310. "lsrs r6, r7, #16\n\t"
  14311. #else
  14312. "lsr r6, r7, #16\n\t"
  14313. #endif
  14314. #ifdef WOLFSSL_KEIL
  14315. "muls r6, r5, r6\n\t"
  14316. #elif defined(__clang__)
  14317. "muls r6, r5\n\t"
  14318. #else
  14319. "mul r6, r5\n\t"
  14320. #endif
  14321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14322. "adds r2, r2, r6\n\t"
  14323. #else
  14324. "add r2, r2, r6\n\t"
  14325. #endif
  14326. #ifdef WOLFSSL_KEIL
  14327. "adcs r3, r3, %[r]\n\t"
  14328. #elif defined(__clang__)
  14329. "adcs r3, %[r]\n\t"
  14330. #else
  14331. "adc r3, %[r]\n\t"
  14332. #endif
  14333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14334. "adds r2, r2, r6\n\t"
  14335. #else
  14336. "add r2, r2, r6\n\t"
  14337. #endif
  14338. #ifdef WOLFSSL_KEIL
  14339. "adcs r3, r3, %[r]\n\t"
  14340. #elif defined(__clang__)
  14341. "adcs r3, %[r]\n\t"
  14342. #else
  14343. "adc r3, %[r]\n\t"
  14344. #endif
  14345. "uxth r6, r7\n\t"
  14346. #ifdef WOLFSSL_KEIL
  14347. "muls r5, r6, r5\n\t"
  14348. #elif defined(__clang__)
  14349. "muls r5, r6\n\t"
  14350. #else
  14351. "mul r5, r6\n\t"
  14352. #endif
  14353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14354. "lsrs r6, r5, #16\n\t"
  14355. #else
  14356. "lsr r6, r5, #16\n\t"
  14357. #endif
  14358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14359. "lsls r5, r5, #16\n\t"
  14360. #else
  14361. "lsl r5, r5, #16\n\t"
  14362. #endif
  14363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14364. "adds r4, r4, r5\n\t"
  14365. #else
  14366. "add r4, r4, r5\n\t"
  14367. #endif
  14368. #ifdef WOLFSSL_KEIL
  14369. "adcs r2, r2, r6\n\t"
  14370. #elif defined(__clang__)
  14371. "adcs r2, r6\n\t"
  14372. #else
  14373. "adc r2, r6\n\t"
  14374. #endif
  14375. #ifdef WOLFSSL_KEIL
  14376. "adcs r3, r3, %[r]\n\t"
  14377. #elif defined(__clang__)
  14378. "adcs r3, %[r]\n\t"
  14379. #else
  14380. "adc r3, %[r]\n\t"
  14381. #endif
  14382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14383. "adds r4, r4, r5\n\t"
  14384. #else
  14385. "add r4, r4, r5\n\t"
  14386. #endif
  14387. #ifdef WOLFSSL_KEIL
  14388. "adcs r2, r2, r6\n\t"
  14389. #elif defined(__clang__)
  14390. "adcs r2, r6\n\t"
  14391. #else
  14392. "adc r2, r6\n\t"
  14393. #endif
  14394. #ifdef WOLFSSL_KEIL
  14395. "adcs r3, r3, %[r]\n\t"
  14396. #elif defined(__clang__)
  14397. "adcs r3, %[r]\n\t"
  14398. #else
  14399. "adc r3, %[r]\n\t"
  14400. #endif
  14401. "# A[4] * A[1]\n\t"
  14402. "mov %[a], r9\n\t"
  14403. "mov r7, r11\n\t"
  14404. "ldr %[a], [%[a], #16]\n\t"
  14405. "uxth r5, %[a]\n\t"
  14406. "uxth r6, r7\n\t"
  14407. #ifdef WOLFSSL_KEIL
  14408. "muls r6, r5, r6\n\t"
  14409. #elif defined(__clang__)
  14410. "muls r6, r5\n\t"
  14411. #else
  14412. "mul r6, r5\n\t"
  14413. #endif
  14414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14415. "adds r4, r4, r6\n\t"
  14416. #else
  14417. "add r4, r4, r6\n\t"
  14418. #endif
  14419. #ifdef WOLFSSL_KEIL
  14420. "adcs r2, r2, %[r]\n\t"
  14421. #elif defined(__clang__)
  14422. "adcs r2, %[r]\n\t"
  14423. #else
  14424. "adc r2, %[r]\n\t"
  14425. #endif
  14426. #ifdef WOLFSSL_KEIL
  14427. "adcs r3, r3, %[r]\n\t"
  14428. #elif defined(__clang__)
  14429. "adcs r3, %[r]\n\t"
  14430. #else
  14431. "adc r3, %[r]\n\t"
  14432. #endif
  14433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14434. "adds r4, r4, r6\n\t"
  14435. #else
  14436. "add r4, r4, r6\n\t"
  14437. #endif
  14438. #ifdef WOLFSSL_KEIL
  14439. "adcs r2, r2, %[r]\n\t"
  14440. #elif defined(__clang__)
  14441. "adcs r2, %[r]\n\t"
  14442. #else
  14443. "adc r2, %[r]\n\t"
  14444. #endif
  14445. #ifdef WOLFSSL_KEIL
  14446. "adcs r3, r3, %[r]\n\t"
  14447. #elif defined(__clang__)
  14448. "adcs r3, %[r]\n\t"
  14449. #else
  14450. "adc r3, %[r]\n\t"
  14451. #endif
  14452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14453. "lsrs r6, r7, #16\n\t"
  14454. #else
  14455. "lsr r6, r7, #16\n\t"
  14456. #endif
  14457. #ifdef WOLFSSL_KEIL
  14458. "muls r5, r6, r5\n\t"
  14459. #elif defined(__clang__)
  14460. "muls r5, r6\n\t"
  14461. #else
  14462. "mul r5, r6\n\t"
  14463. #endif
  14464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14465. "lsrs r6, r5, #16\n\t"
  14466. #else
  14467. "lsr r6, r5, #16\n\t"
  14468. #endif
  14469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14470. "lsls r5, r5, #16\n\t"
  14471. #else
  14472. "lsl r5, r5, #16\n\t"
  14473. #endif
  14474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14475. "adds r4, r4, r5\n\t"
  14476. #else
  14477. "add r4, r4, r5\n\t"
  14478. #endif
  14479. #ifdef WOLFSSL_KEIL
  14480. "adcs r2, r2, r6\n\t"
  14481. #elif defined(__clang__)
  14482. "adcs r2, r6\n\t"
  14483. #else
  14484. "adc r2, r6\n\t"
  14485. #endif
  14486. #ifdef WOLFSSL_KEIL
  14487. "adcs r3, r3, %[r]\n\t"
  14488. #elif defined(__clang__)
  14489. "adcs r3, %[r]\n\t"
  14490. #else
  14491. "adc r3, %[r]\n\t"
  14492. #endif
  14493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14494. "adds r4, r4, r5\n\t"
  14495. #else
  14496. "add r4, r4, r5\n\t"
  14497. #endif
  14498. #ifdef WOLFSSL_KEIL
  14499. "adcs r2, r2, r6\n\t"
  14500. #elif defined(__clang__)
  14501. "adcs r2, r6\n\t"
  14502. #else
  14503. "adc r2, r6\n\t"
  14504. #endif
  14505. #ifdef WOLFSSL_KEIL
  14506. "adcs r3, r3, %[r]\n\t"
  14507. #elif defined(__clang__)
  14508. "adcs r3, %[r]\n\t"
  14509. #else
  14510. "adc r3, %[r]\n\t"
  14511. #endif
  14512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14513. "lsrs r5, %[a], #16\n\t"
  14514. #else
  14515. "lsr r5, %[a], #16\n\t"
  14516. #endif
  14517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14518. "lsrs r6, r7, #16\n\t"
  14519. #else
  14520. "lsr r6, r7, #16\n\t"
  14521. #endif
  14522. #ifdef WOLFSSL_KEIL
  14523. "muls r6, r5, r6\n\t"
  14524. #elif defined(__clang__)
  14525. "muls r6, r5\n\t"
  14526. #else
  14527. "mul r6, r5\n\t"
  14528. #endif
  14529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14530. "adds r2, r2, r6\n\t"
  14531. #else
  14532. "add r2, r2, r6\n\t"
  14533. #endif
  14534. #ifdef WOLFSSL_KEIL
  14535. "adcs r3, r3, %[r]\n\t"
  14536. #elif defined(__clang__)
  14537. "adcs r3, %[r]\n\t"
  14538. #else
  14539. "adc r3, %[r]\n\t"
  14540. #endif
  14541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14542. "adds r2, r2, r6\n\t"
  14543. #else
  14544. "add r2, r2, r6\n\t"
  14545. #endif
  14546. #ifdef WOLFSSL_KEIL
  14547. "adcs r3, r3, %[r]\n\t"
  14548. #elif defined(__clang__)
  14549. "adcs r3, %[r]\n\t"
  14550. #else
  14551. "adc r3, %[r]\n\t"
  14552. #endif
  14553. "uxth r6, r7\n\t"
  14554. #ifdef WOLFSSL_KEIL
  14555. "muls r5, r6, r5\n\t"
  14556. #elif defined(__clang__)
  14557. "muls r5, r6\n\t"
  14558. #else
  14559. "mul r5, r6\n\t"
  14560. #endif
  14561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14562. "lsrs r6, r5, #16\n\t"
  14563. #else
  14564. "lsr r6, r5, #16\n\t"
  14565. #endif
  14566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14567. "lsls r5, r5, #16\n\t"
  14568. #else
  14569. "lsl r5, r5, #16\n\t"
  14570. #endif
  14571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14572. "adds r4, r4, r5\n\t"
  14573. #else
  14574. "add r4, r4, r5\n\t"
  14575. #endif
  14576. #ifdef WOLFSSL_KEIL
  14577. "adcs r2, r2, r6\n\t"
  14578. #elif defined(__clang__)
  14579. "adcs r2, r6\n\t"
  14580. #else
  14581. "adc r2, r6\n\t"
  14582. #endif
  14583. #ifdef WOLFSSL_KEIL
  14584. "adcs r3, r3, %[r]\n\t"
  14585. #elif defined(__clang__)
  14586. "adcs r3, %[r]\n\t"
  14587. #else
  14588. "adc r3, %[r]\n\t"
  14589. #endif
  14590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14591. "adds r4, r4, r5\n\t"
  14592. #else
  14593. "add r4, r4, r5\n\t"
  14594. #endif
  14595. #ifdef WOLFSSL_KEIL
  14596. "adcs r2, r2, r6\n\t"
  14597. #elif defined(__clang__)
  14598. "adcs r2, r6\n\t"
  14599. #else
  14600. "adc r2, r6\n\t"
  14601. #endif
  14602. #ifdef WOLFSSL_KEIL
  14603. "adcs r3, r3, %[r]\n\t"
  14604. #elif defined(__clang__)
  14605. "adcs r3, %[r]\n\t"
  14606. #else
  14607. "adc r3, %[r]\n\t"
  14608. #endif
  14609. "# A[5] * A[0]\n\t"
  14610. "mov %[a], r9\n\t"
  14611. "mov r7, r10\n\t"
  14612. "ldr %[a], [%[a], #20]\n\t"
  14613. "uxth r5, %[a]\n\t"
  14614. "uxth r6, r7\n\t"
  14615. #ifdef WOLFSSL_KEIL
  14616. "muls r6, r5, r6\n\t"
  14617. #elif defined(__clang__)
  14618. "muls r6, r5\n\t"
  14619. #else
  14620. "mul r6, r5\n\t"
  14621. #endif
  14622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14623. "adds r4, r4, r6\n\t"
  14624. #else
  14625. "add r4, r4, r6\n\t"
  14626. #endif
  14627. #ifdef WOLFSSL_KEIL
  14628. "adcs r2, r2, %[r]\n\t"
  14629. #elif defined(__clang__)
  14630. "adcs r2, %[r]\n\t"
  14631. #else
  14632. "adc r2, %[r]\n\t"
  14633. #endif
  14634. #ifdef WOLFSSL_KEIL
  14635. "adcs r3, r3, %[r]\n\t"
  14636. #elif defined(__clang__)
  14637. "adcs r3, %[r]\n\t"
  14638. #else
  14639. "adc r3, %[r]\n\t"
  14640. #endif
  14641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14642. "adds r4, r4, r6\n\t"
  14643. #else
  14644. "add r4, r4, r6\n\t"
  14645. #endif
  14646. #ifdef WOLFSSL_KEIL
  14647. "adcs r2, r2, %[r]\n\t"
  14648. #elif defined(__clang__)
  14649. "adcs r2, %[r]\n\t"
  14650. #else
  14651. "adc r2, %[r]\n\t"
  14652. #endif
  14653. #ifdef WOLFSSL_KEIL
  14654. "adcs r3, r3, %[r]\n\t"
  14655. #elif defined(__clang__)
  14656. "adcs r3, %[r]\n\t"
  14657. #else
  14658. "adc r3, %[r]\n\t"
  14659. #endif
  14660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14661. "lsrs r6, r7, #16\n\t"
  14662. #else
  14663. "lsr r6, r7, #16\n\t"
  14664. #endif
  14665. #ifdef WOLFSSL_KEIL
  14666. "muls r5, r6, r5\n\t"
  14667. #elif defined(__clang__)
  14668. "muls r5, r6\n\t"
  14669. #else
  14670. "mul r5, r6\n\t"
  14671. #endif
  14672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14673. "lsrs r6, r5, #16\n\t"
  14674. #else
  14675. "lsr r6, r5, #16\n\t"
  14676. #endif
  14677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14678. "lsls r5, r5, #16\n\t"
  14679. #else
  14680. "lsl r5, r5, #16\n\t"
  14681. #endif
  14682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14683. "adds r4, r4, r5\n\t"
  14684. #else
  14685. "add r4, r4, r5\n\t"
  14686. #endif
  14687. #ifdef WOLFSSL_KEIL
  14688. "adcs r2, r2, r6\n\t"
  14689. #elif defined(__clang__)
  14690. "adcs r2, r6\n\t"
  14691. #else
  14692. "adc r2, r6\n\t"
  14693. #endif
  14694. #ifdef WOLFSSL_KEIL
  14695. "adcs r3, r3, %[r]\n\t"
  14696. #elif defined(__clang__)
  14697. "adcs r3, %[r]\n\t"
  14698. #else
  14699. "adc r3, %[r]\n\t"
  14700. #endif
  14701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14702. "adds r4, r4, r5\n\t"
  14703. #else
  14704. "add r4, r4, r5\n\t"
  14705. #endif
  14706. #ifdef WOLFSSL_KEIL
  14707. "adcs r2, r2, r6\n\t"
  14708. #elif defined(__clang__)
  14709. "adcs r2, r6\n\t"
  14710. #else
  14711. "adc r2, r6\n\t"
  14712. #endif
  14713. #ifdef WOLFSSL_KEIL
  14714. "adcs r3, r3, %[r]\n\t"
  14715. #elif defined(__clang__)
  14716. "adcs r3, %[r]\n\t"
  14717. #else
  14718. "adc r3, %[r]\n\t"
  14719. #endif
  14720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14721. "lsrs r5, %[a], #16\n\t"
  14722. #else
  14723. "lsr r5, %[a], #16\n\t"
  14724. #endif
  14725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14726. "lsrs r6, r7, #16\n\t"
  14727. #else
  14728. "lsr r6, r7, #16\n\t"
  14729. #endif
  14730. #ifdef WOLFSSL_KEIL
  14731. "muls r6, r5, r6\n\t"
  14732. #elif defined(__clang__)
  14733. "muls r6, r5\n\t"
  14734. #else
  14735. "mul r6, r5\n\t"
  14736. #endif
  14737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14738. "adds r2, r2, r6\n\t"
  14739. #else
  14740. "add r2, r2, r6\n\t"
  14741. #endif
  14742. #ifdef WOLFSSL_KEIL
  14743. "adcs r3, r3, %[r]\n\t"
  14744. #elif defined(__clang__)
  14745. "adcs r3, %[r]\n\t"
  14746. #else
  14747. "adc r3, %[r]\n\t"
  14748. #endif
  14749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14750. "adds r2, r2, r6\n\t"
  14751. #else
  14752. "add r2, r2, r6\n\t"
  14753. #endif
  14754. #ifdef WOLFSSL_KEIL
  14755. "adcs r3, r3, %[r]\n\t"
  14756. #elif defined(__clang__)
  14757. "adcs r3, %[r]\n\t"
  14758. #else
  14759. "adc r3, %[r]\n\t"
  14760. #endif
  14761. "uxth r6, r7\n\t"
  14762. #ifdef WOLFSSL_KEIL
  14763. "muls r5, r6, r5\n\t"
  14764. #elif defined(__clang__)
  14765. "muls r5, r6\n\t"
  14766. #else
  14767. "mul r5, r6\n\t"
  14768. #endif
  14769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14770. "lsrs r6, r5, #16\n\t"
  14771. #else
  14772. "lsr r6, r5, #16\n\t"
  14773. #endif
  14774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14775. "lsls r5, r5, #16\n\t"
  14776. #else
  14777. "lsl r5, r5, #16\n\t"
  14778. #endif
  14779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14780. "adds r4, r4, r5\n\t"
  14781. #else
  14782. "add r4, r4, r5\n\t"
  14783. #endif
  14784. #ifdef WOLFSSL_KEIL
  14785. "adcs r2, r2, r6\n\t"
  14786. #elif defined(__clang__)
  14787. "adcs r2, r6\n\t"
  14788. #else
  14789. "adc r2, r6\n\t"
  14790. #endif
  14791. #ifdef WOLFSSL_KEIL
  14792. "adcs r3, r3, %[r]\n\t"
  14793. #elif defined(__clang__)
  14794. "adcs r3, %[r]\n\t"
  14795. #else
  14796. "adc r3, %[r]\n\t"
  14797. #endif
  14798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14799. "adds r4, r4, r5\n\t"
  14800. #else
  14801. "add r4, r4, r5\n\t"
  14802. #endif
  14803. #ifdef WOLFSSL_KEIL
  14804. "adcs r2, r2, r6\n\t"
  14805. #elif defined(__clang__)
  14806. "adcs r2, r6\n\t"
  14807. #else
  14808. "adc r2, r6\n\t"
  14809. #endif
  14810. #ifdef WOLFSSL_KEIL
  14811. "adcs r3, r3, %[r]\n\t"
  14812. #elif defined(__clang__)
  14813. "adcs r3, %[r]\n\t"
  14814. #else
  14815. "adc r3, %[r]\n\t"
  14816. #endif
  14817. "str r4, [sp, #20]\n\t"
  14818. "# A[6] * A[0]\n\t"
  14819. "movs r4, #0\n\t"
  14820. "mov %[a], r9\n\t"
  14821. "ldr %[a], [%[a], #24]\n\t"
  14822. "uxth r5, %[a]\n\t"
  14823. "uxth r6, r7\n\t"
  14824. #ifdef WOLFSSL_KEIL
  14825. "muls r6, r5, r6\n\t"
  14826. #elif defined(__clang__)
  14827. "muls r6, r5\n\t"
  14828. #else
  14829. "mul r6, r5\n\t"
  14830. #endif
  14831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14832. "adds r2, r2, r6\n\t"
  14833. #else
  14834. "add r2, r2, r6\n\t"
  14835. #endif
  14836. #ifdef WOLFSSL_KEIL
  14837. "adcs r3, r3, %[r]\n\t"
  14838. #elif defined(__clang__)
  14839. "adcs r3, %[r]\n\t"
  14840. #else
  14841. "adc r3, %[r]\n\t"
  14842. #endif
  14843. #ifdef WOLFSSL_KEIL
  14844. "adcs r4, r4, %[r]\n\t"
  14845. #elif defined(__clang__)
  14846. "adcs r4, %[r]\n\t"
  14847. #else
  14848. "adc r4, %[r]\n\t"
  14849. #endif
  14850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14851. "adds r2, r2, r6\n\t"
  14852. #else
  14853. "add r2, r2, r6\n\t"
  14854. #endif
  14855. #ifdef WOLFSSL_KEIL
  14856. "adcs r3, r3, %[r]\n\t"
  14857. #elif defined(__clang__)
  14858. "adcs r3, %[r]\n\t"
  14859. #else
  14860. "adc r3, %[r]\n\t"
  14861. #endif
  14862. #ifdef WOLFSSL_KEIL
  14863. "adcs r4, r4, %[r]\n\t"
  14864. #elif defined(__clang__)
  14865. "adcs r4, %[r]\n\t"
  14866. #else
  14867. "adc r4, %[r]\n\t"
  14868. #endif
  14869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14870. "lsrs r6, r7, #16\n\t"
  14871. #else
  14872. "lsr r6, r7, #16\n\t"
  14873. #endif
  14874. #ifdef WOLFSSL_KEIL
  14875. "muls r5, r6, r5\n\t"
  14876. #elif defined(__clang__)
  14877. "muls r5, r6\n\t"
  14878. #else
  14879. "mul r5, r6\n\t"
  14880. #endif
  14881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14882. "lsrs r6, r5, #16\n\t"
  14883. #else
  14884. "lsr r6, r5, #16\n\t"
  14885. #endif
  14886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14887. "lsls r5, r5, #16\n\t"
  14888. #else
  14889. "lsl r5, r5, #16\n\t"
  14890. #endif
  14891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14892. "adds r2, r2, r5\n\t"
  14893. #else
  14894. "add r2, r2, r5\n\t"
  14895. #endif
  14896. #ifdef WOLFSSL_KEIL
  14897. "adcs r3, r3, r6\n\t"
  14898. #elif defined(__clang__)
  14899. "adcs r3, r6\n\t"
  14900. #else
  14901. "adc r3, r6\n\t"
  14902. #endif
  14903. #ifdef WOLFSSL_KEIL
  14904. "adcs r4, r4, %[r]\n\t"
  14905. #elif defined(__clang__)
  14906. "adcs r4, %[r]\n\t"
  14907. #else
  14908. "adc r4, %[r]\n\t"
  14909. #endif
  14910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14911. "adds r2, r2, r5\n\t"
  14912. #else
  14913. "add r2, r2, r5\n\t"
  14914. #endif
  14915. #ifdef WOLFSSL_KEIL
  14916. "adcs r3, r3, r6\n\t"
  14917. #elif defined(__clang__)
  14918. "adcs r3, r6\n\t"
  14919. #else
  14920. "adc r3, r6\n\t"
  14921. #endif
  14922. #ifdef WOLFSSL_KEIL
  14923. "adcs r4, r4, %[r]\n\t"
  14924. #elif defined(__clang__)
  14925. "adcs r4, %[r]\n\t"
  14926. #else
  14927. "adc r4, %[r]\n\t"
  14928. #endif
  14929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14930. "lsrs r5, %[a], #16\n\t"
  14931. #else
  14932. "lsr r5, %[a], #16\n\t"
  14933. #endif
  14934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14935. "lsrs r6, r7, #16\n\t"
  14936. #else
  14937. "lsr r6, r7, #16\n\t"
  14938. #endif
  14939. #ifdef WOLFSSL_KEIL
  14940. "muls r6, r5, r6\n\t"
  14941. #elif defined(__clang__)
  14942. "muls r6, r5\n\t"
  14943. #else
  14944. "mul r6, r5\n\t"
  14945. #endif
  14946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14947. "adds r3, r3, r6\n\t"
  14948. #else
  14949. "add r3, r3, r6\n\t"
  14950. #endif
  14951. #ifdef WOLFSSL_KEIL
  14952. "adcs r4, r4, %[r]\n\t"
  14953. #elif defined(__clang__)
  14954. "adcs r4, %[r]\n\t"
  14955. #else
  14956. "adc r4, %[r]\n\t"
  14957. #endif
  14958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14959. "adds r3, r3, r6\n\t"
  14960. #else
  14961. "add r3, r3, r6\n\t"
  14962. #endif
  14963. #ifdef WOLFSSL_KEIL
  14964. "adcs r4, r4, %[r]\n\t"
  14965. #elif defined(__clang__)
  14966. "adcs r4, %[r]\n\t"
  14967. #else
  14968. "adc r4, %[r]\n\t"
  14969. #endif
  14970. "uxth r6, r7\n\t"
  14971. #ifdef WOLFSSL_KEIL
  14972. "muls r5, r6, r5\n\t"
  14973. #elif defined(__clang__)
  14974. "muls r5, r6\n\t"
  14975. #else
  14976. "mul r5, r6\n\t"
  14977. #endif
  14978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14979. "lsrs r6, r5, #16\n\t"
  14980. #else
  14981. "lsr r6, r5, #16\n\t"
  14982. #endif
  14983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14984. "lsls r5, r5, #16\n\t"
  14985. #else
  14986. "lsl r5, r5, #16\n\t"
  14987. #endif
  14988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14989. "adds r2, r2, r5\n\t"
  14990. #else
  14991. "add r2, r2, r5\n\t"
  14992. #endif
  14993. #ifdef WOLFSSL_KEIL
  14994. "adcs r3, r3, r6\n\t"
  14995. #elif defined(__clang__)
  14996. "adcs r3, r6\n\t"
  14997. #else
  14998. "adc r3, r6\n\t"
  14999. #endif
  15000. #ifdef WOLFSSL_KEIL
  15001. "adcs r4, r4, %[r]\n\t"
  15002. #elif defined(__clang__)
  15003. "adcs r4, %[r]\n\t"
  15004. #else
  15005. "adc r4, %[r]\n\t"
  15006. #endif
  15007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15008. "adds r2, r2, r5\n\t"
  15009. #else
  15010. "add r2, r2, r5\n\t"
  15011. #endif
  15012. #ifdef WOLFSSL_KEIL
  15013. "adcs r3, r3, r6\n\t"
  15014. #elif defined(__clang__)
  15015. "adcs r3, r6\n\t"
  15016. #else
  15017. "adc r3, r6\n\t"
  15018. #endif
  15019. #ifdef WOLFSSL_KEIL
  15020. "adcs r4, r4, %[r]\n\t"
  15021. #elif defined(__clang__)
  15022. "adcs r4, %[r]\n\t"
  15023. #else
  15024. "adc r4, %[r]\n\t"
  15025. #endif
  15026. "# A[5] * A[1]\n\t"
  15027. "mov %[a], r9\n\t"
  15028. "mov r7, r11\n\t"
  15029. "ldr %[a], [%[a], #20]\n\t"
  15030. "uxth r5, %[a]\n\t"
  15031. "uxth r6, r7\n\t"
  15032. #ifdef WOLFSSL_KEIL
  15033. "muls r6, r5, r6\n\t"
  15034. #elif defined(__clang__)
  15035. "muls r6, r5\n\t"
  15036. #else
  15037. "mul r6, r5\n\t"
  15038. #endif
  15039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15040. "adds r2, r2, r6\n\t"
  15041. #else
  15042. "add r2, r2, r6\n\t"
  15043. #endif
  15044. #ifdef WOLFSSL_KEIL
  15045. "adcs r3, r3, %[r]\n\t"
  15046. #elif defined(__clang__)
  15047. "adcs r3, %[r]\n\t"
  15048. #else
  15049. "adc r3, %[r]\n\t"
  15050. #endif
  15051. #ifdef WOLFSSL_KEIL
  15052. "adcs r4, r4, %[r]\n\t"
  15053. #elif defined(__clang__)
  15054. "adcs r4, %[r]\n\t"
  15055. #else
  15056. "adc r4, %[r]\n\t"
  15057. #endif
  15058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15059. "adds r2, r2, r6\n\t"
  15060. #else
  15061. "add r2, r2, r6\n\t"
  15062. #endif
  15063. #ifdef WOLFSSL_KEIL
  15064. "adcs r3, r3, %[r]\n\t"
  15065. #elif defined(__clang__)
  15066. "adcs r3, %[r]\n\t"
  15067. #else
  15068. "adc r3, %[r]\n\t"
  15069. #endif
  15070. #ifdef WOLFSSL_KEIL
  15071. "adcs r4, r4, %[r]\n\t"
  15072. #elif defined(__clang__)
  15073. "adcs r4, %[r]\n\t"
  15074. #else
  15075. "adc r4, %[r]\n\t"
  15076. #endif
  15077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15078. "lsrs r6, r7, #16\n\t"
  15079. #else
  15080. "lsr r6, r7, #16\n\t"
  15081. #endif
  15082. #ifdef WOLFSSL_KEIL
  15083. "muls r5, r6, r5\n\t"
  15084. #elif defined(__clang__)
  15085. "muls r5, r6\n\t"
  15086. #else
  15087. "mul r5, r6\n\t"
  15088. #endif
  15089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15090. "lsrs r6, r5, #16\n\t"
  15091. #else
  15092. "lsr r6, r5, #16\n\t"
  15093. #endif
  15094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15095. "lsls r5, r5, #16\n\t"
  15096. #else
  15097. "lsl r5, r5, #16\n\t"
  15098. #endif
  15099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15100. "adds r2, r2, r5\n\t"
  15101. #else
  15102. "add r2, r2, r5\n\t"
  15103. #endif
  15104. #ifdef WOLFSSL_KEIL
  15105. "adcs r3, r3, r6\n\t"
  15106. #elif defined(__clang__)
  15107. "adcs r3, r6\n\t"
  15108. #else
  15109. "adc r3, r6\n\t"
  15110. #endif
  15111. #ifdef WOLFSSL_KEIL
  15112. "adcs r4, r4, %[r]\n\t"
  15113. #elif defined(__clang__)
  15114. "adcs r4, %[r]\n\t"
  15115. #else
  15116. "adc r4, %[r]\n\t"
  15117. #endif
  15118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15119. "adds r2, r2, r5\n\t"
  15120. #else
  15121. "add r2, r2, r5\n\t"
  15122. #endif
  15123. #ifdef WOLFSSL_KEIL
  15124. "adcs r3, r3, r6\n\t"
  15125. #elif defined(__clang__)
  15126. "adcs r3, r6\n\t"
  15127. #else
  15128. "adc r3, r6\n\t"
  15129. #endif
  15130. #ifdef WOLFSSL_KEIL
  15131. "adcs r4, r4, %[r]\n\t"
  15132. #elif defined(__clang__)
  15133. "adcs r4, %[r]\n\t"
  15134. #else
  15135. "adc r4, %[r]\n\t"
  15136. #endif
  15137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15138. "lsrs r5, %[a], #16\n\t"
  15139. #else
  15140. "lsr r5, %[a], #16\n\t"
  15141. #endif
  15142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15143. "lsrs r6, r7, #16\n\t"
  15144. #else
  15145. "lsr r6, r7, #16\n\t"
  15146. #endif
  15147. #ifdef WOLFSSL_KEIL
  15148. "muls r6, r5, r6\n\t"
  15149. #elif defined(__clang__)
  15150. "muls r6, r5\n\t"
  15151. #else
  15152. "mul r6, r5\n\t"
  15153. #endif
  15154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15155. "adds r3, r3, r6\n\t"
  15156. #else
  15157. "add r3, r3, r6\n\t"
  15158. #endif
  15159. #ifdef WOLFSSL_KEIL
  15160. "adcs r4, r4, %[r]\n\t"
  15161. #elif defined(__clang__)
  15162. "adcs r4, %[r]\n\t"
  15163. #else
  15164. "adc r4, %[r]\n\t"
  15165. #endif
  15166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15167. "adds r3, r3, r6\n\t"
  15168. #else
  15169. "add r3, r3, r6\n\t"
  15170. #endif
  15171. #ifdef WOLFSSL_KEIL
  15172. "adcs r4, r4, %[r]\n\t"
  15173. #elif defined(__clang__)
  15174. "adcs r4, %[r]\n\t"
  15175. #else
  15176. "adc r4, %[r]\n\t"
  15177. #endif
  15178. "uxth r6, r7\n\t"
  15179. #ifdef WOLFSSL_KEIL
  15180. "muls r5, r6, r5\n\t"
  15181. #elif defined(__clang__)
  15182. "muls r5, r6\n\t"
  15183. #else
  15184. "mul r5, r6\n\t"
  15185. #endif
  15186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15187. "lsrs r6, r5, #16\n\t"
  15188. #else
  15189. "lsr r6, r5, #16\n\t"
  15190. #endif
  15191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15192. "lsls r5, r5, #16\n\t"
  15193. #else
  15194. "lsl r5, r5, #16\n\t"
  15195. #endif
  15196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15197. "adds r2, r2, r5\n\t"
  15198. #else
  15199. "add r2, r2, r5\n\t"
  15200. #endif
  15201. #ifdef WOLFSSL_KEIL
  15202. "adcs r3, r3, r6\n\t"
  15203. #elif defined(__clang__)
  15204. "adcs r3, r6\n\t"
  15205. #else
  15206. "adc r3, r6\n\t"
  15207. #endif
  15208. #ifdef WOLFSSL_KEIL
  15209. "adcs r4, r4, %[r]\n\t"
  15210. #elif defined(__clang__)
  15211. "adcs r4, %[r]\n\t"
  15212. #else
  15213. "adc r4, %[r]\n\t"
  15214. #endif
  15215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15216. "adds r2, r2, r5\n\t"
  15217. #else
  15218. "add r2, r2, r5\n\t"
  15219. #endif
  15220. #ifdef WOLFSSL_KEIL
  15221. "adcs r3, r3, r6\n\t"
  15222. #elif defined(__clang__)
  15223. "adcs r3, r6\n\t"
  15224. #else
  15225. "adc r3, r6\n\t"
  15226. #endif
  15227. #ifdef WOLFSSL_KEIL
  15228. "adcs r4, r4, %[r]\n\t"
  15229. #elif defined(__clang__)
  15230. "adcs r4, %[r]\n\t"
  15231. #else
  15232. "adc r4, %[r]\n\t"
  15233. #endif
  15234. "# A[4] * A[2]\n\t"
  15235. "mov %[a], r9\n\t"
  15236. "mov r7, r12\n\t"
  15237. "ldr %[a], [%[a], #16]\n\t"
  15238. "uxth r5, %[a]\n\t"
  15239. "uxth r6, r7\n\t"
  15240. #ifdef WOLFSSL_KEIL
  15241. "muls r6, r5, r6\n\t"
  15242. #elif defined(__clang__)
  15243. "muls r6, r5\n\t"
  15244. #else
  15245. "mul r6, r5\n\t"
  15246. #endif
  15247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15248. "adds r2, r2, r6\n\t"
  15249. #else
  15250. "add r2, r2, r6\n\t"
  15251. #endif
  15252. #ifdef WOLFSSL_KEIL
  15253. "adcs r3, r3, %[r]\n\t"
  15254. #elif defined(__clang__)
  15255. "adcs r3, %[r]\n\t"
  15256. #else
  15257. "adc r3, %[r]\n\t"
  15258. #endif
  15259. #ifdef WOLFSSL_KEIL
  15260. "adcs r4, r4, %[r]\n\t"
  15261. #elif defined(__clang__)
  15262. "adcs r4, %[r]\n\t"
  15263. #else
  15264. "adc r4, %[r]\n\t"
  15265. #endif
  15266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15267. "adds r2, r2, r6\n\t"
  15268. #else
  15269. "add r2, r2, r6\n\t"
  15270. #endif
  15271. #ifdef WOLFSSL_KEIL
  15272. "adcs r3, r3, %[r]\n\t"
  15273. #elif defined(__clang__)
  15274. "adcs r3, %[r]\n\t"
  15275. #else
  15276. "adc r3, %[r]\n\t"
  15277. #endif
  15278. #ifdef WOLFSSL_KEIL
  15279. "adcs r4, r4, %[r]\n\t"
  15280. #elif defined(__clang__)
  15281. "adcs r4, %[r]\n\t"
  15282. #else
  15283. "adc r4, %[r]\n\t"
  15284. #endif
  15285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15286. "lsrs r6, r7, #16\n\t"
  15287. #else
  15288. "lsr r6, r7, #16\n\t"
  15289. #endif
  15290. #ifdef WOLFSSL_KEIL
  15291. "muls r5, r6, r5\n\t"
  15292. #elif defined(__clang__)
  15293. "muls r5, r6\n\t"
  15294. #else
  15295. "mul r5, r6\n\t"
  15296. #endif
  15297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15298. "lsrs r6, r5, #16\n\t"
  15299. #else
  15300. "lsr r6, r5, #16\n\t"
  15301. #endif
  15302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15303. "lsls r5, r5, #16\n\t"
  15304. #else
  15305. "lsl r5, r5, #16\n\t"
  15306. #endif
  15307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15308. "adds r2, r2, r5\n\t"
  15309. #else
  15310. "add r2, r2, r5\n\t"
  15311. #endif
  15312. #ifdef WOLFSSL_KEIL
  15313. "adcs r3, r3, r6\n\t"
  15314. #elif defined(__clang__)
  15315. "adcs r3, r6\n\t"
  15316. #else
  15317. "adc r3, r6\n\t"
  15318. #endif
  15319. #ifdef WOLFSSL_KEIL
  15320. "adcs r4, r4, %[r]\n\t"
  15321. #elif defined(__clang__)
  15322. "adcs r4, %[r]\n\t"
  15323. #else
  15324. "adc r4, %[r]\n\t"
  15325. #endif
  15326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15327. "adds r2, r2, r5\n\t"
  15328. #else
  15329. "add r2, r2, r5\n\t"
  15330. #endif
  15331. #ifdef WOLFSSL_KEIL
  15332. "adcs r3, r3, r6\n\t"
  15333. #elif defined(__clang__)
  15334. "adcs r3, r6\n\t"
  15335. #else
  15336. "adc r3, r6\n\t"
  15337. #endif
  15338. #ifdef WOLFSSL_KEIL
  15339. "adcs r4, r4, %[r]\n\t"
  15340. #elif defined(__clang__)
  15341. "adcs r4, %[r]\n\t"
  15342. #else
  15343. "adc r4, %[r]\n\t"
  15344. #endif
  15345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15346. "lsrs r5, %[a], #16\n\t"
  15347. #else
  15348. "lsr r5, %[a], #16\n\t"
  15349. #endif
  15350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15351. "lsrs r6, r7, #16\n\t"
  15352. #else
  15353. "lsr r6, r7, #16\n\t"
  15354. #endif
  15355. #ifdef WOLFSSL_KEIL
  15356. "muls r6, r5, r6\n\t"
  15357. #elif defined(__clang__)
  15358. "muls r6, r5\n\t"
  15359. #else
  15360. "mul r6, r5\n\t"
  15361. #endif
  15362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15363. "adds r3, r3, r6\n\t"
  15364. #else
  15365. "add r3, r3, r6\n\t"
  15366. #endif
  15367. #ifdef WOLFSSL_KEIL
  15368. "adcs r4, r4, %[r]\n\t"
  15369. #elif defined(__clang__)
  15370. "adcs r4, %[r]\n\t"
  15371. #else
  15372. "adc r4, %[r]\n\t"
  15373. #endif
  15374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15375. "adds r3, r3, r6\n\t"
  15376. #else
  15377. "add r3, r3, r6\n\t"
  15378. #endif
  15379. #ifdef WOLFSSL_KEIL
  15380. "adcs r4, r4, %[r]\n\t"
  15381. #elif defined(__clang__)
  15382. "adcs r4, %[r]\n\t"
  15383. #else
  15384. "adc r4, %[r]\n\t"
  15385. #endif
  15386. "uxth r6, r7\n\t"
  15387. #ifdef WOLFSSL_KEIL
  15388. "muls r5, r6, r5\n\t"
  15389. #elif defined(__clang__)
  15390. "muls r5, r6\n\t"
  15391. #else
  15392. "mul r5, r6\n\t"
  15393. #endif
  15394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15395. "lsrs r6, r5, #16\n\t"
  15396. #else
  15397. "lsr r6, r5, #16\n\t"
  15398. #endif
  15399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15400. "lsls r5, r5, #16\n\t"
  15401. #else
  15402. "lsl r5, r5, #16\n\t"
  15403. #endif
  15404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15405. "adds r2, r2, r5\n\t"
  15406. #else
  15407. "add r2, r2, r5\n\t"
  15408. #endif
  15409. #ifdef WOLFSSL_KEIL
  15410. "adcs r3, r3, r6\n\t"
  15411. #elif defined(__clang__)
  15412. "adcs r3, r6\n\t"
  15413. #else
  15414. "adc r3, r6\n\t"
  15415. #endif
  15416. #ifdef WOLFSSL_KEIL
  15417. "adcs r4, r4, %[r]\n\t"
  15418. #elif defined(__clang__)
  15419. "adcs r4, %[r]\n\t"
  15420. #else
  15421. "adc r4, %[r]\n\t"
  15422. #endif
  15423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15424. "adds r2, r2, r5\n\t"
  15425. #else
  15426. "add r2, r2, r5\n\t"
  15427. #endif
  15428. #ifdef WOLFSSL_KEIL
  15429. "adcs r3, r3, r6\n\t"
  15430. #elif defined(__clang__)
  15431. "adcs r3, r6\n\t"
  15432. #else
  15433. "adc r3, r6\n\t"
  15434. #endif
  15435. #ifdef WOLFSSL_KEIL
  15436. "adcs r4, r4, %[r]\n\t"
  15437. #elif defined(__clang__)
  15438. "adcs r4, %[r]\n\t"
  15439. #else
  15440. "adc r4, %[r]\n\t"
  15441. #endif
  15442. "# A[3] * A[3]\n\t"
  15443. "mov r7, lr\n\t"
  15444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15445. "lsrs r6, r7, #16\n\t"
  15446. #else
  15447. "lsr r6, r7, #16\n\t"
  15448. #endif
  15449. "uxth r5, r7\n\t"
  15450. #ifdef WOLFSSL_KEIL
  15451. "muls r5, r5, r5\n\t"
  15452. #elif defined(__clang__)
  15453. "muls r5, r5\n\t"
  15454. #else
  15455. "mul r5, r5\n\t"
  15456. #endif
  15457. #ifdef WOLFSSL_KEIL
  15458. "muls r6, r6, r6\n\t"
  15459. #elif defined(__clang__)
  15460. "muls r6, r6\n\t"
  15461. #else
  15462. "mul r6, r6\n\t"
  15463. #endif
  15464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15465. "adds r2, r2, r5\n\t"
  15466. #else
  15467. "add r2, r2, r5\n\t"
  15468. #endif
  15469. #ifdef WOLFSSL_KEIL
  15470. "adcs r3, r3, r6\n\t"
  15471. #elif defined(__clang__)
  15472. "adcs r3, r6\n\t"
  15473. #else
  15474. "adc r3, r6\n\t"
  15475. #endif
  15476. #ifdef WOLFSSL_KEIL
  15477. "adcs r4, r4, %[r]\n\t"
  15478. #elif defined(__clang__)
  15479. "adcs r4, %[r]\n\t"
  15480. #else
  15481. "adc r4, %[r]\n\t"
  15482. #endif
  15483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15484. "lsrs r6, r7, #16\n\t"
  15485. #else
  15486. "lsr r6, r7, #16\n\t"
  15487. #endif
  15488. "uxth r5, r7\n\t"
  15489. #ifdef WOLFSSL_KEIL
  15490. "muls r5, r6, r5\n\t"
  15491. #elif defined(__clang__)
  15492. "muls r5, r6\n\t"
  15493. #else
  15494. "mul r5, r6\n\t"
  15495. #endif
  15496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15497. "lsrs r6, r5, #15\n\t"
  15498. #else
  15499. "lsr r6, r5, #15\n\t"
  15500. #endif
  15501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15502. "lsls r5, r5, #17\n\t"
  15503. #else
  15504. "lsl r5, r5, #17\n\t"
  15505. #endif
  15506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15507. "adds r2, r2, r5\n\t"
  15508. #else
  15509. "add r2, r2, r5\n\t"
  15510. #endif
  15511. #ifdef WOLFSSL_KEIL
  15512. "adcs r3, r3, r6\n\t"
  15513. #elif defined(__clang__)
  15514. "adcs r3, r6\n\t"
  15515. #else
  15516. "adc r3, r6\n\t"
  15517. #endif
  15518. #ifdef WOLFSSL_KEIL
  15519. "adcs r4, r4, %[r]\n\t"
  15520. #elif defined(__clang__)
  15521. "adcs r4, %[r]\n\t"
  15522. #else
  15523. "adc r4, %[r]\n\t"
  15524. #endif
  15525. "str r2, [sp, #24]\n\t"
  15526. "# A[4] * A[3]\n\t"
  15527. "movs r2, #0\n\t"
  15528. "mov %[a], r9\n\t"
  15529. "ldr %[a], [%[a], #16]\n\t"
  15530. "uxth r5, %[a]\n\t"
  15531. "uxth r6, r7\n\t"
  15532. #ifdef WOLFSSL_KEIL
  15533. "muls r6, r5, r6\n\t"
  15534. #elif defined(__clang__)
  15535. "muls r6, r5\n\t"
  15536. #else
  15537. "mul r6, r5\n\t"
  15538. #endif
  15539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15540. "adds r3, r3, r6\n\t"
  15541. #else
  15542. "add r3, r3, r6\n\t"
  15543. #endif
  15544. #ifdef WOLFSSL_KEIL
  15545. "adcs r4, r4, %[r]\n\t"
  15546. #elif defined(__clang__)
  15547. "adcs r4, %[r]\n\t"
  15548. #else
  15549. "adc r4, %[r]\n\t"
  15550. #endif
  15551. #ifdef WOLFSSL_KEIL
  15552. "adcs r2, r2, %[r]\n\t"
  15553. #elif defined(__clang__)
  15554. "adcs r2, %[r]\n\t"
  15555. #else
  15556. "adc r2, %[r]\n\t"
  15557. #endif
  15558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15559. "adds r3, r3, r6\n\t"
  15560. #else
  15561. "add r3, r3, r6\n\t"
  15562. #endif
  15563. #ifdef WOLFSSL_KEIL
  15564. "adcs r4, r4, %[r]\n\t"
  15565. #elif defined(__clang__)
  15566. "adcs r4, %[r]\n\t"
  15567. #else
  15568. "adc r4, %[r]\n\t"
  15569. #endif
  15570. #ifdef WOLFSSL_KEIL
  15571. "adcs r2, r2, %[r]\n\t"
  15572. #elif defined(__clang__)
  15573. "adcs r2, %[r]\n\t"
  15574. #else
  15575. "adc r2, %[r]\n\t"
  15576. #endif
  15577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15578. "lsrs r6, r7, #16\n\t"
  15579. #else
  15580. "lsr r6, r7, #16\n\t"
  15581. #endif
  15582. #ifdef WOLFSSL_KEIL
  15583. "muls r5, r6, r5\n\t"
  15584. #elif defined(__clang__)
  15585. "muls r5, r6\n\t"
  15586. #else
  15587. "mul r5, r6\n\t"
  15588. #endif
  15589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15590. "lsrs r6, r5, #16\n\t"
  15591. #else
  15592. "lsr r6, r5, #16\n\t"
  15593. #endif
  15594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15595. "lsls r5, r5, #16\n\t"
  15596. #else
  15597. "lsl r5, r5, #16\n\t"
  15598. #endif
  15599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15600. "adds r3, r3, r5\n\t"
  15601. #else
  15602. "add r3, r3, r5\n\t"
  15603. #endif
  15604. #ifdef WOLFSSL_KEIL
  15605. "adcs r4, r4, r6\n\t"
  15606. #elif defined(__clang__)
  15607. "adcs r4, r6\n\t"
  15608. #else
  15609. "adc r4, r6\n\t"
  15610. #endif
  15611. #ifdef WOLFSSL_KEIL
  15612. "adcs r2, r2, %[r]\n\t"
  15613. #elif defined(__clang__)
  15614. "adcs r2, %[r]\n\t"
  15615. #else
  15616. "adc r2, %[r]\n\t"
  15617. #endif
  15618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15619. "adds r3, r3, r5\n\t"
  15620. #else
  15621. "add r3, r3, r5\n\t"
  15622. #endif
  15623. #ifdef WOLFSSL_KEIL
  15624. "adcs r4, r4, r6\n\t"
  15625. #elif defined(__clang__)
  15626. "adcs r4, r6\n\t"
  15627. #else
  15628. "adc r4, r6\n\t"
  15629. #endif
  15630. #ifdef WOLFSSL_KEIL
  15631. "adcs r2, r2, %[r]\n\t"
  15632. #elif defined(__clang__)
  15633. "adcs r2, %[r]\n\t"
  15634. #else
  15635. "adc r2, %[r]\n\t"
  15636. #endif
  15637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15638. "lsrs r5, %[a], #16\n\t"
  15639. #else
  15640. "lsr r5, %[a], #16\n\t"
  15641. #endif
  15642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15643. "lsrs r6, r7, #16\n\t"
  15644. #else
  15645. "lsr r6, r7, #16\n\t"
  15646. #endif
  15647. #ifdef WOLFSSL_KEIL
  15648. "muls r6, r5, r6\n\t"
  15649. #elif defined(__clang__)
  15650. "muls r6, r5\n\t"
  15651. #else
  15652. "mul r6, r5\n\t"
  15653. #endif
  15654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15655. "adds r4, r4, r6\n\t"
  15656. #else
  15657. "add r4, r4, r6\n\t"
  15658. #endif
  15659. #ifdef WOLFSSL_KEIL
  15660. "adcs r2, r2, %[r]\n\t"
  15661. #elif defined(__clang__)
  15662. "adcs r2, %[r]\n\t"
  15663. #else
  15664. "adc r2, %[r]\n\t"
  15665. #endif
  15666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15667. "adds r4, r4, r6\n\t"
  15668. #else
  15669. "add r4, r4, r6\n\t"
  15670. #endif
  15671. #ifdef WOLFSSL_KEIL
  15672. "adcs r2, r2, %[r]\n\t"
  15673. #elif defined(__clang__)
  15674. "adcs r2, %[r]\n\t"
  15675. #else
  15676. "adc r2, %[r]\n\t"
  15677. #endif
  15678. "uxth r6, r7\n\t"
  15679. #ifdef WOLFSSL_KEIL
  15680. "muls r5, r6, r5\n\t"
  15681. #elif defined(__clang__)
  15682. "muls r5, r6\n\t"
  15683. #else
  15684. "mul r5, r6\n\t"
  15685. #endif
  15686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15687. "lsrs r6, r5, #16\n\t"
  15688. #else
  15689. "lsr r6, r5, #16\n\t"
  15690. #endif
  15691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15692. "lsls r5, r5, #16\n\t"
  15693. #else
  15694. "lsl r5, r5, #16\n\t"
  15695. #endif
  15696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15697. "adds r3, r3, r5\n\t"
  15698. #else
  15699. "add r3, r3, r5\n\t"
  15700. #endif
  15701. #ifdef WOLFSSL_KEIL
  15702. "adcs r4, r4, r6\n\t"
  15703. #elif defined(__clang__)
  15704. "adcs r4, r6\n\t"
  15705. #else
  15706. "adc r4, r6\n\t"
  15707. #endif
  15708. #ifdef WOLFSSL_KEIL
  15709. "adcs r2, r2, %[r]\n\t"
  15710. #elif defined(__clang__)
  15711. "adcs r2, %[r]\n\t"
  15712. #else
  15713. "adc r2, %[r]\n\t"
  15714. #endif
  15715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15716. "adds r3, r3, r5\n\t"
  15717. #else
  15718. "add r3, r3, r5\n\t"
  15719. #endif
  15720. #ifdef WOLFSSL_KEIL
  15721. "adcs r4, r4, r6\n\t"
  15722. #elif defined(__clang__)
  15723. "adcs r4, r6\n\t"
  15724. #else
  15725. "adc r4, r6\n\t"
  15726. #endif
  15727. #ifdef WOLFSSL_KEIL
  15728. "adcs r2, r2, %[r]\n\t"
  15729. #elif defined(__clang__)
  15730. "adcs r2, %[r]\n\t"
  15731. #else
  15732. "adc r2, %[r]\n\t"
  15733. #endif
  15734. "# A[5] * A[2]\n\t"
  15735. "mov %[a], r9\n\t"
  15736. "mov r7, r12\n\t"
  15737. "ldr %[a], [%[a], #20]\n\t"
  15738. "uxth r5, %[a]\n\t"
  15739. "uxth r6, r7\n\t"
  15740. #ifdef WOLFSSL_KEIL
  15741. "muls r6, r5, r6\n\t"
  15742. #elif defined(__clang__)
  15743. "muls r6, r5\n\t"
  15744. #else
  15745. "mul r6, r5\n\t"
  15746. #endif
  15747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15748. "adds r3, r3, r6\n\t"
  15749. #else
  15750. "add r3, r3, r6\n\t"
  15751. #endif
  15752. #ifdef WOLFSSL_KEIL
  15753. "adcs r4, r4, %[r]\n\t"
  15754. #elif defined(__clang__)
  15755. "adcs r4, %[r]\n\t"
  15756. #else
  15757. "adc r4, %[r]\n\t"
  15758. #endif
  15759. #ifdef WOLFSSL_KEIL
  15760. "adcs r2, r2, %[r]\n\t"
  15761. #elif defined(__clang__)
  15762. "adcs r2, %[r]\n\t"
  15763. #else
  15764. "adc r2, %[r]\n\t"
  15765. #endif
  15766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15767. "adds r3, r3, r6\n\t"
  15768. #else
  15769. "add r3, r3, r6\n\t"
  15770. #endif
  15771. #ifdef WOLFSSL_KEIL
  15772. "adcs r4, r4, %[r]\n\t"
  15773. #elif defined(__clang__)
  15774. "adcs r4, %[r]\n\t"
  15775. #else
  15776. "adc r4, %[r]\n\t"
  15777. #endif
  15778. #ifdef WOLFSSL_KEIL
  15779. "adcs r2, r2, %[r]\n\t"
  15780. #elif defined(__clang__)
  15781. "adcs r2, %[r]\n\t"
  15782. #else
  15783. "adc r2, %[r]\n\t"
  15784. #endif
  15785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15786. "lsrs r6, r7, #16\n\t"
  15787. #else
  15788. "lsr r6, r7, #16\n\t"
  15789. #endif
  15790. #ifdef WOLFSSL_KEIL
  15791. "muls r5, r6, r5\n\t"
  15792. #elif defined(__clang__)
  15793. "muls r5, r6\n\t"
  15794. #else
  15795. "mul r5, r6\n\t"
  15796. #endif
  15797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15798. "lsrs r6, r5, #16\n\t"
  15799. #else
  15800. "lsr r6, r5, #16\n\t"
  15801. #endif
  15802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15803. "lsls r5, r5, #16\n\t"
  15804. #else
  15805. "lsl r5, r5, #16\n\t"
  15806. #endif
  15807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15808. "adds r3, r3, r5\n\t"
  15809. #else
  15810. "add r3, r3, r5\n\t"
  15811. #endif
  15812. #ifdef WOLFSSL_KEIL
  15813. "adcs r4, r4, r6\n\t"
  15814. #elif defined(__clang__)
  15815. "adcs r4, r6\n\t"
  15816. #else
  15817. "adc r4, r6\n\t"
  15818. #endif
  15819. #ifdef WOLFSSL_KEIL
  15820. "adcs r2, r2, %[r]\n\t"
  15821. #elif defined(__clang__)
  15822. "adcs r2, %[r]\n\t"
  15823. #else
  15824. "adc r2, %[r]\n\t"
  15825. #endif
  15826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15827. "adds r3, r3, r5\n\t"
  15828. #else
  15829. "add r3, r3, r5\n\t"
  15830. #endif
  15831. #ifdef WOLFSSL_KEIL
  15832. "adcs r4, r4, r6\n\t"
  15833. #elif defined(__clang__)
  15834. "adcs r4, r6\n\t"
  15835. #else
  15836. "adc r4, r6\n\t"
  15837. #endif
  15838. #ifdef WOLFSSL_KEIL
  15839. "adcs r2, r2, %[r]\n\t"
  15840. #elif defined(__clang__)
  15841. "adcs r2, %[r]\n\t"
  15842. #else
  15843. "adc r2, %[r]\n\t"
  15844. #endif
  15845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15846. "lsrs r5, %[a], #16\n\t"
  15847. #else
  15848. "lsr r5, %[a], #16\n\t"
  15849. #endif
  15850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15851. "lsrs r6, r7, #16\n\t"
  15852. #else
  15853. "lsr r6, r7, #16\n\t"
  15854. #endif
  15855. #ifdef WOLFSSL_KEIL
  15856. "muls r6, r5, r6\n\t"
  15857. #elif defined(__clang__)
  15858. "muls r6, r5\n\t"
  15859. #else
  15860. "mul r6, r5\n\t"
  15861. #endif
  15862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15863. "adds r4, r4, r6\n\t"
  15864. #else
  15865. "add r4, r4, r6\n\t"
  15866. #endif
  15867. #ifdef WOLFSSL_KEIL
  15868. "adcs r2, r2, %[r]\n\t"
  15869. #elif defined(__clang__)
  15870. "adcs r2, %[r]\n\t"
  15871. #else
  15872. "adc r2, %[r]\n\t"
  15873. #endif
  15874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15875. "adds r4, r4, r6\n\t"
  15876. #else
  15877. "add r4, r4, r6\n\t"
  15878. #endif
  15879. #ifdef WOLFSSL_KEIL
  15880. "adcs r2, r2, %[r]\n\t"
  15881. #elif defined(__clang__)
  15882. "adcs r2, %[r]\n\t"
  15883. #else
  15884. "adc r2, %[r]\n\t"
  15885. #endif
  15886. "uxth r6, r7\n\t"
  15887. #ifdef WOLFSSL_KEIL
  15888. "muls r5, r6, r5\n\t"
  15889. #elif defined(__clang__)
  15890. "muls r5, r6\n\t"
  15891. #else
  15892. "mul r5, r6\n\t"
  15893. #endif
  15894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15895. "lsrs r6, r5, #16\n\t"
  15896. #else
  15897. "lsr r6, r5, #16\n\t"
  15898. #endif
  15899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15900. "lsls r5, r5, #16\n\t"
  15901. #else
  15902. "lsl r5, r5, #16\n\t"
  15903. #endif
  15904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15905. "adds r3, r3, r5\n\t"
  15906. #else
  15907. "add r3, r3, r5\n\t"
  15908. #endif
  15909. #ifdef WOLFSSL_KEIL
  15910. "adcs r4, r4, r6\n\t"
  15911. #elif defined(__clang__)
  15912. "adcs r4, r6\n\t"
  15913. #else
  15914. "adc r4, r6\n\t"
  15915. #endif
  15916. #ifdef WOLFSSL_KEIL
  15917. "adcs r2, r2, %[r]\n\t"
  15918. #elif defined(__clang__)
  15919. "adcs r2, %[r]\n\t"
  15920. #else
  15921. "adc r2, %[r]\n\t"
  15922. #endif
  15923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15924. "adds r3, r3, r5\n\t"
  15925. #else
  15926. "add r3, r3, r5\n\t"
  15927. #endif
  15928. #ifdef WOLFSSL_KEIL
  15929. "adcs r4, r4, r6\n\t"
  15930. #elif defined(__clang__)
  15931. "adcs r4, r6\n\t"
  15932. #else
  15933. "adc r4, r6\n\t"
  15934. #endif
  15935. #ifdef WOLFSSL_KEIL
  15936. "adcs r2, r2, %[r]\n\t"
  15937. #elif defined(__clang__)
  15938. "adcs r2, %[r]\n\t"
  15939. #else
  15940. "adc r2, %[r]\n\t"
  15941. #endif
  15942. "# A[6] * A[1]\n\t"
  15943. "mov %[a], r9\n\t"
  15944. "mov r7, r11\n\t"
  15945. "ldr %[a], [%[a], #24]\n\t"
  15946. "uxth r5, %[a]\n\t"
  15947. "uxth r6, r7\n\t"
  15948. #ifdef WOLFSSL_KEIL
  15949. "muls r6, r5, r6\n\t"
  15950. #elif defined(__clang__)
  15951. "muls r6, r5\n\t"
  15952. #else
  15953. "mul r6, r5\n\t"
  15954. #endif
  15955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15956. "adds r3, r3, r6\n\t"
  15957. #else
  15958. "add r3, r3, r6\n\t"
  15959. #endif
  15960. #ifdef WOLFSSL_KEIL
  15961. "adcs r4, r4, %[r]\n\t"
  15962. #elif defined(__clang__)
  15963. "adcs r4, %[r]\n\t"
  15964. #else
  15965. "adc r4, %[r]\n\t"
  15966. #endif
  15967. #ifdef WOLFSSL_KEIL
  15968. "adcs r2, r2, %[r]\n\t"
  15969. #elif defined(__clang__)
  15970. "adcs r2, %[r]\n\t"
  15971. #else
  15972. "adc r2, %[r]\n\t"
  15973. #endif
  15974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15975. "adds r3, r3, r6\n\t"
  15976. #else
  15977. "add r3, r3, r6\n\t"
  15978. #endif
  15979. #ifdef WOLFSSL_KEIL
  15980. "adcs r4, r4, %[r]\n\t"
  15981. #elif defined(__clang__)
  15982. "adcs r4, %[r]\n\t"
  15983. #else
  15984. "adc r4, %[r]\n\t"
  15985. #endif
  15986. #ifdef WOLFSSL_KEIL
  15987. "adcs r2, r2, %[r]\n\t"
  15988. #elif defined(__clang__)
  15989. "adcs r2, %[r]\n\t"
  15990. #else
  15991. "adc r2, %[r]\n\t"
  15992. #endif
  15993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15994. "lsrs r6, r7, #16\n\t"
  15995. #else
  15996. "lsr r6, r7, #16\n\t"
  15997. #endif
  15998. #ifdef WOLFSSL_KEIL
  15999. "muls r5, r6, r5\n\t"
  16000. #elif defined(__clang__)
  16001. "muls r5, r6\n\t"
  16002. #else
  16003. "mul r5, r6\n\t"
  16004. #endif
  16005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16006. "lsrs r6, r5, #16\n\t"
  16007. #else
  16008. "lsr r6, r5, #16\n\t"
  16009. #endif
  16010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16011. "lsls r5, r5, #16\n\t"
  16012. #else
  16013. "lsl r5, r5, #16\n\t"
  16014. #endif
  16015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16016. "adds r3, r3, r5\n\t"
  16017. #else
  16018. "add r3, r3, r5\n\t"
  16019. #endif
  16020. #ifdef WOLFSSL_KEIL
  16021. "adcs r4, r4, r6\n\t"
  16022. #elif defined(__clang__)
  16023. "adcs r4, r6\n\t"
  16024. #else
  16025. "adc r4, r6\n\t"
  16026. #endif
  16027. #ifdef WOLFSSL_KEIL
  16028. "adcs r2, r2, %[r]\n\t"
  16029. #elif defined(__clang__)
  16030. "adcs r2, %[r]\n\t"
  16031. #else
  16032. "adc r2, %[r]\n\t"
  16033. #endif
  16034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16035. "adds r3, r3, r5\n\t"
  16036. #else
  16037. "add r3, r3, r5\n\t"
  16038. #endif
  16039. #ifdef WOLFSSL_KEIL
  16040. "adcs r4, r4, r6\n\t"
  16041. #elif defined(__clang__)
  16042. "adcs r4, r6\n\t"
  16043. #else
  16044. "adc r4, r6\n\t"
  16045. #endif
  16046. #ifdef WOLFSSL_KEIL
  16047. "adcs r2, r2, %[r]\n\t"
  16048. #elif defined(__clang__)
  16049. "adcs r2, %[r]\n\t"
  16050. #else
  16051. "adc r2, %[r]\n\t"
  16052. #endif
  16053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16054. "lsrs r5, %[a], #16\n\t"
  16055. #else
  16056. "lsr r5, %[a], #16\n\t"
  16057. #endif
  16058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16059. "lsrs r6, r7, #16\n\t"
  16060. #else
  16061. "lsr r6, r7, #16\n\t"
  16062. #endif
  16063. #ifdef WOLFSSL_KEIL
  16064. "muls r6, r5, r6\n\t"
  16065. #elif defined(__clang__)
  16066. "muls r6, r5\n\t"
  16067. #else
  16068. "mul r6, r5\n\t"
  16069. #endif
  16070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16071. "adds r4, r4, r6\n\t"
  16072. #else
  16073. "add r4, r4, r6\n\t"
  16074. #endif
  16075. #ifdef WOLFSSL_KEIL
  16076. "adcs r2, r2, %[r]\n\t"
  16077. #elif defined(__clang__)
  16078. "adcs r2, %[r]\n\t"
  16079. #else
  16080. "adc r2, %[r]\n\t"
  16081. #endif
  16082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16083. "adds r4, r4, r6\n\t"
  16084. #else
  16085. "add r4, r4, r6\n\t"
  16086. #endif
  16087. #ifdef WOLFSSL_KEIL
  16088. "adcs r2, r2, %[r]\n\t"
  16089. #elif defined(__clang__)
  16090. "adcs r2, %[r]\n\t"
  16091. #else
  16092. "adc r2, %[r]\n\t"
  16093. #endif
  16094. "uxth r6, r7\n\t"
  16095. #ifdef WOLFSSL_KEIL
  16096. "muls r5, r6, r5\n\t"
  16097. #elif defined(__clang__)
  16098. "muls r5, r6\n\t"
  16099. #else
  16100. "mul r5, r6\n\t"
  16101. #endif
  16102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16103. "lsrs r6, r5, #16\n\t"
  16104. #else
  16105. "lsr r6, r5, #16\n\t"
  16106. #endif
  16107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16108. "lsls r5, r5, #16\n\t"
  16109. #else
  16110. "lsl r5, r5, #16\n\t"
  16111. #endif
  16112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16113. "adds r3, r3, r5\n\t"
  16114. #else
  16115. "add r3, r3, r5\n\t"
  16116. #endif
  16117. #ifdef WOLFSSL_KEIL
  16118. "adcs r4, r4, r6\n\t"
  16119. #elif defined(__clang__)
  16120. "adcs r4, r6\n\t"
  16121. #else
  16122. "adc r4, r6\n\t"
  16123. #endif
  16124. #ifdef WOLFSSL_KEIL
  16125. "adcs r2, r2, %[r]\n\t"
  16126. #elif defined(__clang__)
  16127. "adcs r2, %[r]\n\t"
  16128. #else
  16129. "adc r2, %[r]\n\t"
  16130. #endif
  16131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16132. "adds r3, r3, r5\n\t"
  16133. #else
  16134. "add r3, r3, r5\n\t"
  16135. #endif
  16136. #ifdef WOLFSSL_KEIL
  16137. "adcs r4, r4, r6\n\t"
  16138. #elif defined(__clang__)
  16139. "adcs r4, r6\n\t"
  16140. #else
  16141. "adc r4, r6\n\t"
  16142. #endif
  16143. #ifdef WOLFSSL_KEIL
  16144. "adcs r2, r2, %[r]\n\t"
  16145. #elif defined(__clang__)
  16146. "adcs r2, %[r]\n\t"
  16147. #else
  16148. "adc r2, %[r]\n\t"
  16149. #endif
  16150. "# A[7] * A[0]\n\t"
  16151. "mov %[a], r9\n\t"
  16152. "mov r7, r10\n\t"
  16153. "ldr %[a], [%[a], #28]\n\t"
  16154. "uxth r5, %[a]\n\t"
  16155. "uxth r6, r7\n\t"
  16156. #ifdef WOLFSSL_KEIL
  16157. "muls r6, r5, r6\n\t"
  16158. #elif defined(__clang__)
  16159. "muls r6, r5\n\t"
  16160. #else
  16161. "mul r6, r5\n\t"
  16162. #endif
  16163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16164. "adds r3, r3, r6\n\t"
  16165. #else
  16166. "add r3, r3, r6\n\t"
  16167. #endif
  16168. #ifdef WOLFSSL_KEIL
  16169. "adcs r4, r4, %[r]\n\t"
  16170. #elif defined(__clang__)
  16171. "adcs r4, %[r]\n\t"
  16172. #else
  16173. "adc r4, %[r]\n\t"
  16174. #endif
  16175. #ifdef WOLFSSL_KEIL
  16176. "adcs r2, r2, %[r]\n\t"
  16177. #elif defined(__clang__)
  16178. "adcs r2, %[r]\n\t"
  16179. #else
  16180. "adc r2, %[r]\n\t"
  16181. #endif
  16182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16183. "adds r3, r3, r6\n\t"
  16184. #else
  16185. "add r3, r3, r6\n\t"
  16186. #endif
  16187. #ifdef WOLFSSL_KEIL
  16188. "adcs r4, r4, %[r]\n\t"
  16189. #elif defined(__clang__)
  16190. "adcs r4, %[r]\n\t"
  16191. #else
  16192. "adc r4, %[r]\n\t"
  16193. #endif
  16194. #ifdef WOLFSSL_KEIL
  16195. "adcs r2, r2, %[r]\n\t"
  16196. #elif defined(__clang__)
  16197. "adcs r2, %[r]\n\t"
  16198. #else
  16199. "adc r2, %[r]\n\t"
  16200. #endif
  16201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16202. "lsrs r6, r7, #16\n\t"
  16203. #else
  16204. "lsr r6, r7, #16\n\t"
  16205. #endif
  16206. #ifdef WOLFSSL_KEIL
  16207. "muls r5, r6, r5\n\t"
  16208. #elif defined(__clang__)
  16209. "muls r5, r6\n\t"
  16210. #else
  16211. "mul r5, r6\n\t"
  16212. #endif
  16213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16214. "lsrs r6, r5, #16\n\t"
  16215. #else
  16216. "lsr r6, r5, #16\n\t"
  16217. #endif
  16218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16219. "lsls r5, r5, #16\n\t"
  16220. #else
  16221. "lsl r5, r5, #16\n\t"
  16222. #endif
  16223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16224. "adds r3, r3, r5\n\t"
  16225. #else
  16226. "add r3, r3, r5\n\t"
  16227. #endif
  16228. #ifdef WOLFSSL_KEIL
  16229. "adcs r4, r4, r6\n\t"
  16230. #elif defined(__clang__)
  16231. "adcs r4, r6\n\t"
  16232. #else
  16233. "adc r4, r6\n\t"
  16234. #endif
  16235. #ifdef WOLFSSL_KEIL
  16236. "adcs r2, r2, %[r]\n\t"
  16237. #elif defined(__clang__)
  16238. "adcs r2, %[r]\n\t"
  16239. #else
  16240. "adc r2, %[r]\n\t"
  16241. #endif
  16242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16243. "adds r3, r3, r5\n\t"
  16244. #else
  16245. "add r3, r3, r5\n\t"
  16246. #endif
  16247. #ifdef WOLFSSL_KEIL
  16248. "adcs r4, r4, r6\n\t"
  16249. #elif defined(__clang__)
  16250. "adcs r4, r6\n\t"
  16251. #else
  16252. "adc r4, r6\n\t"
  16253. #endif
  16254. #ifdef WOLFSSL_KEIL
  16255. "adcs r2, r2, %[r]\n\t"
  16256. #elif defined(__clang__)
  16257. "adcs r2, %[r]\n\t"
  16258. #else
  16259. "adc r2, %[r]\n\t"
  16260. #endif
  16261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16262. "lsrs r5, %[a], #16\n\t"
  16263. #else
  16264. "lsr r5, %[a], #16\n\t"
  16265. #endif
  16266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16267. "lsrs r6, r7, #16\n\t"
  16268. #else
  16269. "lsr r6, r7, #16\n\t"
  16270. #endif
  16271. #ifdef WOLFSSL_KEIL
  16272. "muls r6, r5, r6\n\t"
  16273. #elif defined(__clang__)
  16274. "muls r6, r5\n\t"
  16275. #else
  16276. "mul r6, r5\n\t"
  16277. #endif
  16278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16279. "adds r4, r4, r6\n\t"
  16280. #else
  16281. "add r4, r4, r6\n\t"
  16282. #endif
  16283. #ifdef WOLFSSL_KEIL
  16284. "adcs r2, r2, %[r]\n\t"
  16285. #elif defined(__clang__)
  16286. "adcs r2, %[r]\n\t"
  16287. #else
  16288. "adc r2, %[r]\n\t"
  16289. #endif
  16290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16291. "adds r4, r4, r6\n\t"
  16292. #else
  16293. "add r4, r4, r6\n\t"
  16294. #endif
  16295. #ifdef WOLFSSL_KEIL
  16296. "adcs r2, r2, %[r]\n\t"
  16297. #elif defined(__clang__)
  16298. "adcs r2, %[r]\n\t"
  16299. #else
  16300. "adc r2, %[r]\n\t"
  16301. #endif
  16302. "uxth r6, r7\n\t"
  16303. #ifdef WOLFSSL_KEIL
  16304. "muls r5, r6, r5\n\t"
  16305. #elif defined(__clang__)
  16306. "muls r5, r6\n\t"
  16307. #else
  16308. "mul r5, r6\n\t"
  16309. #endif
  16310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16311. "lsrs r6, r5, #16\n\t"
  16312. #else
  16313. "lsr r6, r5, #16\n\t"
  16314. #endif
  16315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16316. "lsls r5, r5, #16\n\t"
  16317. #else
  16318. "lsl r5, r5, #16\n\t"
  16319. #endif
  16320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16321. "adds r3, r3, r5\n\t"
  16322. #else
  16323. "add r3, r3, r5\n\t"
  16324. #endif
  16325. #ifdef WOLFSSL_KEIL
  16326. "adcs r4, r4, r6\n\t"
  16327. #elif defined(__clang__)
  16328. "adcs r4, r6\n\t"
  16329. #else
  16330. "adc r4, r6\n\t"
  16331. #endif
  16332. #ifdef WOLFSSL_KEIL
  16333. "adcs r2, r2, %[r]\n\t"
  16334. #elif defined(__clang__)
  16335. "adcs r2, %[r]\n\t"
  16336. #else
  16337. "adc r2, %[r]\n\t"
  16338. #endif
  16339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16340. "adds r3, r3, r5\n\t"
  16341. #else
  16342. "add r3, r3, r5\n\t"
  16343. #endif
  16344. #ifdef WOLFSSL_KEIL
  16345. "adcs r4, r4, r6\n\t"
  16346. #elif defined(__clang__)
  16347. "adcs r4, r6\n\t"
  16348. #else
  16349. "adc r4, r6\n\t"
  16350. #endif
  16351. #ifdef WOLFSSL_KEIL
  16352. "adcs r2, r2, %[r]\n\t"
  16353. #elif defined(__clang__)
  16354. "adcs r2, %[r]\n\t"
  16355. #else
  16356. "adc r2, %[r]\n\t"
  16357. #endif
  16358. "str r3, [sp, #28]\n\t"
  16359. "# A[7] * A[1]\n\t"
  16360. "movs r3, #0\n\t"
  16361. "mov %[a], r9\n\t"
  16362. "mov r7, r11\n\t"
  16363. "ldr %[a], [%[a], #28]\n\t"
  16364. "uxth r5, %[a]\n\t"
  16365. "uxth r6, r7\n\t"
  16366. #ifdef WOLFSSL_KEIL
  16367. "muls r6, r5, r6\n\t"
  16368. #elif defined(__clang__)
  16369. "muls r6, r5\n\t"
  16370. #else
  16371. "mul r6, r5\n\t"
  16372. #endif
  16373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16374. "adds r4, r4, r6\n\t"
  16375. #else
  16376. "add r4, r4, r6\n\t"
  16377. #endif
  16378. #ifdef WOLFSSL_KEIL
  16379. "adcs r2, r2, %[r]\n\t"
  16380. #elif defined(__clang__)
  16381. "adcs r2, %[r]\n\t"
  16382. #else
  16383. "adc r2, %[r]\n\t"
  16384. #endif
  16385. #ifdef WOLFSSL_KEIL
  16386. "adcs r3, r3, %[r]\n\t"
  16387. #elif defined(__clang__)
  16388. "adcs r3, %[r]\n\t"
  16389. #else
  16390. "adc r3, %[r]\n\t"
  16391. #endif
  16392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16393. "adds r4, r4, r6\n\t"
  16394. #else
  16395. "add r4, r4, r6\n\t"
  16396. #endif
  16397. #ifdef WOLFSSL_KEIL
  16398. "adcs r2, r2, %[r]\n\t"
  16399. #elif defined(__clang__)
  16400. "adcs r2, %[r]\n\t"
  16401. #else
  16402. "adc r2, %[r]\n\t"
  16403. #endif
  16404. #ifdef WOLFSSL_KEIL
  16405. "adcs r3, r3, %[r]\n\t"
  16406. #elif defined(__clang__)
  16407. "adcs r3, %[r]\n\t"
  16408. #else
  16409. "adc r3, %[r]\n\t"
  16410. #endif
  16411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16412. "lsrs r6, r7, #16\n\t"
  16413. #else
  16414. "lsr r6, r7, #16\n\t"
  16415. #endif
  16416. #ifdef WOLFSSL_KEIL
  16417. "muls r5, r6, r5\n\t"
  16418. #elif defined(__clang__)
  16419. "muls r5, r6\n\t"
  16420. #else
  16421. "mul r5, r6\n\t"
  16422. #endif
  16423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16424. "lsrs r6, r5, #16\n\t"
  16425. #else
  16426. "lsr r6, r5, #16\n\t"
  16427. #endif
  16428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16429. "lsls r5, r5, #16\n\t"
  16430. #else
  16431. "lsl r5, r5, #16\n\t"
  16432. #endif
  16433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16434. "adds r4, r4, r5\n\t"
  16435. #else
  16436. "add r4, r4, r5\n\t"
  16437. #endif
  16438. #ifdef WOLFSSL_KEIL
  16439. "adcs r2, r2, r6\n\t"
  16440. #elif defined(__clang__)
  16441. "adcs r2, r6\n\t"
  16442. #else
  16443. "adc r2, r6\n\t"
  16444. #endif
  16445. #ifdef WOLFSSL_KEIL
  16446. "adcs r3, r3, %[r]\n\t"
  16447. #elif defined(__clang__)
  16448. "adcs r3, %[r]\n\t"
  16449. #else
  16450. "adc r3, %[r]\n\t"
  16451. #endif
  16452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16453. "adds r4, r4, r5\n\t"
  16454. #else
  16455. "add r4, r4, r5\n\t"
  16456. #endif
  16457. #ifdef WOLFSSL_KEIL
  16458. "adcs r2, r2, r6\n\t"
  16459. #elif defined(__clang__)
  16460. "adcs r2, r6\n\t"
  16461. #else
  16462. "adc r2, r6\n\t"
  16463. #endif
  16464. #ifdef WOLFSSL_KEIL
  16465. "adcs r3, r3, %[r]\n\t"
  16466. #elif defined(__clang__)
  16467. "adcs r3, %[r]\n\t"
  16468. #else
  16469. "adc r3, %[r]\n\t"
  16470. #endif
  16471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16472. "lsrs r5, %[a], #16\n\t"
  16473. #else
  16474. "lsr r5, %[a], #16\n\t"
  16475. #endif
  16476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16477. "lsrs r6, r7, #16\n\t"
  16478. #else
  16479. "lsr r6, r7, #16\n\t"
  16480. #endif
  16481. #ifdef WOLFSSL_KEIL
  16482. "muls r6, r5, r6\n\t"
  16483. #elif defined(__clang__)
  16484. "muls r6, r5\n\t"
  16485. #else
  16486. "mul r6, r5\n\t"
  16487. #endif
  16488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16489. "adds r2, r2, r6\n\t"
  16490. #else
  16491. "add r2, r2, r6\n\t"
  16492. #endif
  16493. #ifdef WOLFSSL_KEIL
  16494. "adcs r3, r3, %[r]\n\t"
  16495. #elif defined(__clang__)
  16496. "adcs r3, %[r]\n\t"
  16497. #else
  16498. "adc r3, %[r]\n\t"
  16499. #endif
  16500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16501. "adds r2, r2, r6\n\t"
  16502. #else
  16503. "add r2, r2, r6\n\t"
  16504. #endif
  16505. #ifdef WOLFSSL_KEIL
  16506. "adcs r3, r3, %[r]\n\t"
  16507. #elif defined(__clang__)
  16508. "adcs r3, %[r]\n\t"
  16509. #else
  16510. "adc r3, %[r]\n\t"
  16511. #endif
  16512. "uxth r6, r7\n\t"
  16513. #ifdef WOLFSSL_KEIL
  16514. "muls r5, r6, r5\n\t"
  16515. #elif defined(__clang__)
  16516. "muls r5, r6\n\t"
  16517. #else
  16518. "mul r5, r6\n\t"
  16519. #endif
  16520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16521. "lsrs r6, r5, #16\n\t"
  16522. #else
  16523. "lsr r6, r5, #16\n\t"
  16524. #endif
  16525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16526. "lsls r5, r5, #16\n\t"
  16527. #else
  16528. "lsl r5, r5, #16\n\t"
  16529. #endif
  16530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16531. "adds r4, r4, r5\n\t"
  16532. #else
  16533. "add r4, r4, r5\n\t"
  16534. #endif
  16535. #ifdef WOLFSSL_KEIL
  16536. "adcs r2, r2, r6\n\t"
  16537. #elif defined(__clang__)
  16538. "adcs r2, r6\n\t"
  16539. #else
  16540. "adc r2, r6\n\t"
  16541. #endif
  16542. #ifdef WOLFSSL_KEIL
  16543. "adcs r3, r3, %[r]\n\t"
  16544. #elif defined(__clang__)
  16545. "adcs r3, %[r]\n\t"
  16546. #else
  16547. "adc r3, %[r]\n\t"
  16548. #endif
  16549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16550. "adds r4, r4, r5\n\t"
  16551. #else
  16552. "add r4, r4, r5\n\t"
  16553. #endif
  16554. #ifdef WOLFSSL_KEIL
  16555. "adcs r2, r2, r6\n\t"
  16556. #elif defined(__clang__)
  16557. "adcs r2, r6\n\t"
  16558. #else
  16559. "adc r2, r6\n\t"
  16560. #endif
  16561. #ifdef WOLFSSL_KEIL
  16562. "adcs r3, r3, %[r]\n\t"
  16563. #elif defined(__clang__)
  16564. "adcs r3, %[r]\n\t"
  16565. #else
  16566. "adc r3, %[r]\n\t"
  16567. #endif
  16568. "# A[6] * A[2]\n\t"
  16569. "mov %[a], r9\n\t"
  16570. "mov r7, r12\n\t"
  16571. "ldr %[a], [%[a], #24]\n\t"
  16572. "uxth r5, %[a]\n\t"
  16573. "uxth r6, r7\n\t"
  16574. #ifdef WOLFSSL_KEIL
  16575. "muls r6, r5, r6\n\t"
  16576. #elif defined(__clang__)
  16577. "muls r6, r5\n\t"
  16578. #else
  16579. "mul r6, r5\n\t"
  16580. #endif
  16581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16582. "adds r4, r4, r6\n\t"
  16583. #else
  16584. "add r4, r4, r6\n\t"
  16585. #endif
  16586. #ifdef WOLFSSL_KEIL
  16587. "adcs r2, r2, %[r]\n\t"
  16588. #elif defined(__clang__)
  16589. "adcs r2, %[r]\n\t"
  16590. #else
  16591. "adc r2, %[r]\n\t"
  16592. #endif
  16593. #ifdef WOLFSSL_KEIL
  16594. "adcs r3, r3, %[r]\n\t"
  16595. #elif defined(__clang__)
  16596. "adcs r3, %[r]\n\t"
  16597. #else
  16598. "adc r3, %[r]\n\t"
  16599. #endif
  16600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16601. "adds r4, r4, r6\n\t"
  16602. #else
  16603. "add r4, r4, r6\n\t"
  16604. #endif
  16605. #ifdef WOLFSSL_KEIL
  16606. "adcs r2, r2, %[r]\n\t"
  16607. #elif defined(__clang__)
  16608. "adcs r2, %[r]\n\t"
  16609. #else
  16610. "adc r2, %[r]\n\t"
  16611. #endif
  16612. #ifdef WOLFSSL_KEIL
  16613. "adcs r3, r3, %[r]\n\t"
  16614. #elif defined(__clang__)
  16615. "adcs r3, %[r]\n\t"
  16616. #else
  16617. "adc r3, %[r]\n\t"
  16618. #endif
  16619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16620. "lsrs r6, r7, #16\n\t"
  16621. #else
  16622. "lsr r6, r7, #16\n\t"
  16623. #endif
  16624. #ifdef WOLFSSL_KEIL
  16625. "muls r5, r6, r5\n\t"
  16626. #elif defined(__clang__)
  16627. "muls r5, r6\n\t"
  16628. #else
  16629. "mul r5, r6\n\t"
  16630. #endif
  16631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16632. "lsrs r6, r5, #16\n\t"
  16633. #else
  16634. "lsr r6, r5, #16\n\t"
  16635. #endif
  16636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16637. "lsls r5, r5, #16\n\t"
  16638. #else
  16639. "lsl r5, r5, #16\n\t"
  16640. #endif
  16641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16642. "adds r4, r4, r5\n\t"
  16643. #else
  16644. "add r4, r4, r5\n\t"
  16645. #endif
  16646. #ifdef WOLFSSL_KEIL
  16647. "adcs r2, r2, r6\n\t"
  16648. #elif defined(__clang__)
  16649. "adcs r2, r6\n\t"
  16650. #else
  16651. "adc r2, r6\n\t"
  16652. #endif
  16653. #ifdef WOLFSSL_KEIL
  16654. "adcs r3, r3, %[r]\n\t"
  16655. #elif defined(__clang__)
  16656. "adcs r3, %[r]\n\t"
  16657. #else
  16658. "adc r3, %[r]\n\t"
  16659. #endif
  16660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16661. "adds r4, r4, r5\n\t"
  16662. #else
  16663. "add r4, r4, r5\n\t"
  16664. #endif
  16665. #ifdef WOLFSSL_KEIL
  16666. "adcs r2, r2, r6\n\t"
  16667. #elif defined(__clang__)
  16668. "adcs r2, r6\n\t"
  16669. #else
  16670. "adc r2, r6\n\t"
  16671. #endif
  16672. #ifdef WOLFSSL_KEIL
  16673. "adcs r3, r3, %[r]\n\t"
  16674. #elif defined(__clang__)
  16675. "adcs r3, %[r]\n\t"
  16676. #else
  16677. "adc r3, %[r]\n\t"
  16678. #endif
  16679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16680. "lsrs r5, %[a], #16\n\t"
  16681. #else
  16682. "lsr r5, %[a], #16\n\t"
  16683. #endif
  16684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16685. "lsrs r6, r7, #16\n\t"
  16686. #else
  16687. "lsr r6, r7, #16\n\t"
  16688. #endif
  16689. #ifdef WOLFSSL_KEIL
  16690. "muls r6, r5, r6\n\t"
  16691. #elif defined(__clang__)
  16692. "muls r6, r5\n\t"
  16693. #else
  16694. "mul r6, r5\n\t"
  16695. #endif
  16696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16697. "adds r2, r2, r6\n\t"
  16698. #else
  16699. "add r2, r2, r6\n\t"
  16700. #endif
  16701. #ifdef WOLFSSL_KEIL
  16702. "adcs r3, r3, %[r]\n\t"
  16703. #elif defined(__clang__)
  16704. "adcs r3, %[r]\n\t"
  16705. #else
  16706. "adc r3, %[r]\n\t"
  16707. #endif
  16708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16709. "adds r2, r2, r6\n\t"
  16710. #else
  16711. "add r2, r2, r6\n\t"
  16712. #endif
  16713. #ifdef WOLFSSL_KEIL
  16714. "adcs r3, r3, %[r]\n\t"
  16715. #elif defined(__clang__)
  16716. "adcs r3, %[r]\n\t"
  16717. #else
  16718. "adc r3, %[r]\n\t"
  16719. #endif
  16720. "uxth r6, r7\n\t"
  16721. #ifdef WOLFSSL_KEIL
  16722. "muls r5, r6, r5\n\t"
  16723. #elif defined(__clang__)
  16724. "muls r5, r6\n\t"
  16725. #else
  16726. "mul r5, r6\n\t"
  16727. #endif
  16728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16729. "lsrs r6, r5, #16\n\t"
  16730. #else
  16731. "lsr r6, r5, #16\n\t"
  16732. #endif
  16733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16734. "lsls r5, r5, #16\n\t"
  16735. #else
  16736. "lsl r5, r5, #16\n\t"
  16737. #endif
  16738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16739. "adds r4, r4, r5\n\t"
  16740. #else
  16741. "add r4, r4, r5\n\t"
  16742. #endif
  16743. #ifdef WOLFSSL_KEIL
  16744. "adcs r2, r2, r6\n\t"
  16745. #elif defined(__clang__)
  16746. "adcs r2, r6\n\t"
  16747. #else
  16748. "adc r2, r6\n\t"
  16749. #endif
  16750. #ifdef WOLFSSL_KEIL
  16751. "adcs r3, r3, %[r]\n\t"
  16752. #elif defined(__clang__)
  16753. "adcs r3, %[r]\n\t"
  16754. #else
  16755. "adc r3, %[r]\n\t"
  16756. #endif
  16757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16758. "adds r4, r4, r5\n\t"
  16759. #else
  16760. "add r4, r4, r5\n\t"
  16761. #endif
  16762. #ifdef WOLFSSL_KEIL
  16763. "adcs r2, r2, r6\n\t"
  16764. #elif defined(__clang__)
  16765. "adcs r2, r6\n\t"
  16766. #else
  16767. "adc r2, r6\n\t"
  16768. #endif
  16769. #ifdef WOLFSSL_KEIL
  16770. "adcs r3, r3, %[r]\n\t"
  16771. #elif defined(__clang__)
  16772. "adcs r3, %[r]\n\t"
  16773. #else
  16774. "adc r3, %[r]\n\t"
  16775. #endif
  16776. "# A[5] * A[3]\n\t"
  16777. "mov %[a], r9\n\t"
  16778. "mov r7, lr\n\t"
  16779. "ldr %[a], [%[a], #20]\n\t"
  16780. "uxth r5, %[a]\n\t"
  16781. "uxth r6, r7\n\t"
  16782. #ifdef WOLFSSL_KEIL
  16783. "muls r6, r5, r6\n\t"
  16784. #elif defined(__clang__)
  16785. "muls r6, r5\n\t"
  16786. #else
  16787. "mul r6, r5\n\t"
  16788. #endif
  16789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16790. "adds r4, r4, r6\n\t"
  16791. #else
  16792. "add r4, r4, r6\n\t"
  16793. #endif
  16794. #ifdef WOLFSSL_KEIL
  16795. "adcs r2, r2, %[r]\n\t"
  16796. #elif defined(__clang__)
  16797. "adcs r2, %[r]\n\t"
  16798. #else
  16799. "adc r2, %[r]\n\t"
  16800. #endif
  16801. #ifdef WOLFSSL_KEIL
  16802. "adcs r3, r3, %[r]\n\t"
  16803. #elif defined(__clang__)
  16804. "adcs r3, %[r]\n\t"
  16805. #else
  16806. "adc r3, %[r]\n\t"
  16807. #endif
  16808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16809. "adds r4, r4, r6\n\t"
  16810. #else
  16811. "add r4, r4, r6\n\t"
  16812. #endif
  16813. #ifdef WOLFSSL_KEIL
  16814. "adcs r2, r2, %[r]\n\t"
  16815. #elif defined(__clang__)
  16816. "adcs r2, %[r]\n\t"
  16817. #else
  16818. "adc r2, %[r]\n\t"
  16819. #endif
  16820. #ifdef WOLFSSL_KEIL
  16821. "adcs r3, r3, %[r]\n\t"
  16822. #elif defined(__clang__)
  16823. "adcs r3, %[r]\n\t"
  16824. #else
  16825. "adc r3, %[r]\n\t"
  16826. #endif
  16827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16828. "lsrs r6, r7, #16\n\t"
  16829. #else
  16830. "lsr r6, r7, #16\n\t"
  16831. #endif
  16832. #ifdef WOLFSSL_KEIL
  16833. "muls r5, r6, r5\n\t"
  16834. #elif defined(__clang__)
  16835. "muls r5, r6\n\t"
  16836. #else
  16837. "mul r5, r6\n\t"
  16838. #endif
  16839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16840. "lsrs r6, r5, #16\n\t"
  16841. #else
  16842. "lsr r6, r5, #16\n\t"
  16843. #endif
  16844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16845. "lsls r5, r5, #16\n\t"
  16846. #else
  16847. "lsl r5, r5, #16\n\t"
  16848. #endif
  16849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16850. "adds r4, r4, r5\n\t"
  16851. #else
  16852. "add r4, r4, r5\n\t"
  16853. #endif
  16854. #ifdef WOLFSSL_KEIL
  16855. "adcs r2, r2, r6\n\t"
  16856. #elif defined(__clang__)
  16857. "adcs r2, r6\n\t"
  16858. #else
  16859. "adc r2, r6\n\t"
  16860. #endif
  16861. #ifdef WOLFSSL_KEIL
  16862. "adcs r3, r3, %[r]\n\t"
  16863. #elif defined(__clang__)
  16864. "adcs r3, %[r]\n\t"
  16865. #else
  16866. "adc r3, %[r]\n\t"
  16867. #endif
  16868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16869. "adds r4, r4, r5\n\t"
  16870. #else
  16871. "add r4, r4, r5\n\t"
  16872. #endif
  16873. #ifdef WOLFSSL_KEIL
  16874. "adcs r2, r2, r6\n\t"
  16875. #elif defined(__clang__)
  16876. "adcs r2, r6\n\t"
  16877. #else
  16878. "adc r2, r6\n\t"
  16879. #endif
  16880. #ifdef WOLFSSL_KEIL
  16881. "adcs r3, r3, %[r]\n\t"
  16882. #elif defined(__clang__)
  16883. "adcs r3, %[r]\n\t"
  16884. #else
  16885. "adc r3, %[r]\n\t"
  16886. #endif
  16887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16888. "lsrs r5, %[a], #16\n\t"
  16889. #else
  16890. "lsr r5, %[a], #16\n\t"
  16891. #endif
  16892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16893. "lsrs r6, r7, #16\n\t"
  16894. #else
  16895. "lsr r6, r7, #16\n\t"
  16896. #endif
  16897. #ifdef WOLFSSL_KEIL
  16898. "muls r6, r5, r6\n\t"
  16899. #elif defined(__clang__)
  16900. "muls r6, r5\n\t"
  16901. #else
  16902. "mul r6, r5\n\t"
  16903. #endif
  16904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16905. "adds r2, r2, r6\n\t"
  16906. #else
  16907. "add r2, r2, r6\n\t"
  16908. #endif
  16909. #ifdef WOLFSSL_KEIL
  16910. "adcs r3, r3, %[r]\n\t"
  16911. #elif defined(__clang__)
  16912. "adcs r3, %[r]\n\t"
  16913. #else
  16914. "adc r3, %[r]\n\t"
  16915. #endif
  16916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16917. "adds r2, r2, r6\n\t"
  16918. #else
  16919. "add r2, r2, r6\n\t"
  16920. #endif
  16921. #ifdef WOLFSSL_KEIL
  16922. "adcs r3, r3, %[r]\n\t"
  16923. #elif defined(__clang__)
  16924. "adcs r3, %[r]\n\t"
  16925. #else
  16926. "adc r3, %[r]\n\t"
  16927. #endif
  16928. "uxth r6, r7\n\t"
  16929. #ifdef WOLFSSL_KEIL
  16930. "muls r5, r6, r5\n\t"
  16931. #elif defined(__clang__)
  16932. "muls r5, r6\n\t"
  16933. #else
  16934. "mul r5, r6\n\t"
  16935. #endif
  16936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16937. "lsrs r6, r5, #16\n\t"
  16938. #else
  16939. "lsr r6, r5, #16\n\t"
  16940. #endif
  16941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16942. "lsls r5, r5, #16\n\t"
  16943. #else
  16944. "lsl r5, r5, #16\n\t"
  16945. #endif
  16946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16947. "adds r4, r4, r5\n\t"
  16948. #else
  16949. "add r4, r4, r5\n\t"
  16950. #endif
  16951. #ifdef WOLFSSL_KEIL
  16952. "adcs r2, r2, r6\n\t"
  16953. #elif defined(__clang__)
  16954. "adcs r2, r6\n\t"
  16955. #else
  16956. "adc r2, r6\n\t"
  16957. #endif
  16958. #ifdef WOLFSSL_KEIL
  16959. "adcs r3, r3, %[r]\n\t"
  16960. #elif defined(__clang__)
  16961. "adcs r3, %[r]\n\t"
  16962. #else
  16963. "adc r3, %[r]\n\t"
  16964. #endif
  16965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16966. "adds r4, r4, r5\n\t"
  16967. #else
  16968. "add r4, r4, r5\n\t"
  16969. #endif
  16970. #ifdef WOLFSSL_KEIL
  16971. "adcs r2, r2, r6\n\t"
  16972. #elif defined(__clang__)
  16973. "adcs r2, r6\n\t"
  16974. #else
  16975. "adc r2, r6\n\t"
  16976. #endif
  16977. #ifdef WOLFSSL_KEIL
  16978. "adcs r3, r3, %[r]\n\t"
  16979. #elif defined(__clang__)
  16980. "adcs r3, %[r]\n\t"
  16981. #else
  16982. "adc r3, %[r]\n\t"
  16983. #endif
  16984. "# A[4] * A[4]\n\t"
  16985. "mov %[a], r9\n\t"
  16986. "ldr r7, [%[a], #16]\n\t"
  16987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16988. "lsrs r6, r7, #16\n\t"
  16989. #else
  16990. "lsr r6, r7, #16\n\t"
  16991. #endif
  16992. "uxth r5, r7\n\t"
  16993. #ifdef WOLFSSL_KEIL
  16994. "muls r5, r5, r5\n\t"
  16995. #elif defined(__clang__)
  16996. "muls r5, r5\n\t"
  16997. #else
  16998. "mul r5, r5\n\t"
  16999. #endif
  17000. #ifdef WOLFSSL_KEIL
  17001. "muls r6, r6, r6\n\t"
  17002. #elif defined(__clang__)
  17003. "muls r6, r6\n\t"
  17004. #else
  17005. "mul r6, r6\n\t"
  17006. #endif
  17007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17008. "adds r4, r4, r5\n\t"
  17009. #else
  17010. "add r4, r4, r5\n\t"
  17011. #endif
  17012. #ifdef WOLFSSL_KEIL
  17013. "adcs r2, r2, r6\n\t"
  17014. #elif defined(__clang__)
  17015. "adcs r2, r6\n\t"
  17016. #else
  17017. "adc r2, r6\n\t"
  17018. #endif
  17019. #ifdef WOLFSSL_KEIL
  17020. "adcs r3, r3, %[r]\n\t"
  17021. #elif defined(__clang__)
  17022. "adcs r3, %[r]\n\t"
  17023. #else
  17024. "adc r3, %[r]\n\t"
  17025. #endif
  17026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17027. "lsrs r6, r7, #16\n\t"
  17028. #else
  17029. "lsr r6, r7, #16\n\t"
  17030. #endif
  17031. "uxth r5, r7\n\t"
  17032. #ifdef WOLFSSL_KEIL
  17033. "muls r5, r6, r5\n\t"
  17034. #elif defined(__clang__)
  17035. "muls r5, r6\n\t"
  17036. #else
  17037. "mul r5, r6\n\t"
  17038. #endif
  17039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17040. "lsrs r6, r5, #15\n\t"
  17041. #else
  17042. "lsr r6, r5, #15\n\t"
  17043. #endif
  17044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17045. "lsls r5, r5, #17\n\t"
  17046. #else
  17047. "lsl r5, r5, #17\n\t"
  17048. #endif
  17049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17050. "adds r4, r4, r5\n\t"
  17051. #else
  17052. "add r4, r4, r5\n\t"
  17053. #endif
  17054. #ifdef WOLFSSL_KEIL
  17055. "adcs r2, r2, r6\n\t"
  17056. #elif defined(__clang__)
  17057. "adcs r2, r6\n\t"
  17058. #else
  17059. "adc r2, r6\n\t"
  17060. #endif
  17061. #ifdef WOLFSSL_KEIL
  17062. "adcs r3, r3, %[r]\n\t"
  17063. #elif defined(__clang__)
  17064. "adcs r3, %[r]\n\t"
  17065. #else
  17066. "adc r3, %[r]\n\t"
  17067. #endif
  17068. "mov %[r], r8\n\t"
  17069. "str r4, [%[r], #32]\n\t"
  17070. "movs %[r], #0\n\t"
  17071. "movs %[a], #16\n\t"
  17072. "add %[a], %[a], r9\n\t"
  17073. "ldm %[a]!, {r5, r6}\n\t"
  17074. "mov r10, r5\n\t"
  17075. "mov r11, r6\n\t"
  17076. "ldm %[a]!, {r5, r6}\n\t"
  17077. "mov r12, r5\n\t"
  17078. "mov lr, r6\n\t"
  17079. "mov %[a], r9\n\t"
  17080. "# A[5] * A[4]\n\t"
  17081. "movs r4, #0\n\t"
  17082. "mov %[a], r11\n\t"
  17083. "uxth r5, %[a]\n\t"
  17084. "uxth r6, r7\n\t"
  17085. #ifdef WOLFSSL_KEIL
  17086. "muls r6, r5, r6\n\t"
  17087. #elif defined(__clang__)
  17088. "muls r6, r5\n\t"
  17089. #else
  17090. "mul r6, r5\n\t"
  17091. #endif
  17092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17093. "adds r2, r2, r6\n\t"
  17094. #else
  17095. "add r2, r2, r6\n\t"
  17096. #endif
  17097. #ifdef WOLFSSL_KEIL
  17098. "adcs r3, r3, %[r]\n\t"
  17099. #elif defined(__clang__)
  17100. "adcs r3, %[r]\n\t"
  17101. #else
  17102. "adc r3, %[r]\n\t"
  17103. #endif
  17104. #ifdef WOLFSSL_KEIL
  17105. "adcs r4, r4, %[r]\n\t"
  17106. #elif defined(__clang__)
  17107. "adcs r4, %[r]\n\t"
  17108. #else
  17109. "adc r4, %[r]\n\t"
  17110. #endif
  17111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17112. "adds r2, r2, r6\n\t"
  17113. #else
  17114. "add r2, r2, r6\n\t"
  17115. #endif
  17116. #ifdef WOLFSSL_KEIL
  17117. "adcs r3, r3, %[r]\n\t"
  17118. #elif defined(__clang__)
  17119. "adcs r3, %[r]\n\t"
  17120. #else
  17121. "adc r3, %[r]\n\t"
  17122. #endif
  17123. #ifdef WOLFSSL_KEIL
  17124. "adcs r4, r4, %[r]\n\t"
  17125. #elif defined(__clang__)
  17126. "adcs r4, %[r]\n\t"
  17127. #else
  17128. "adc r4, %[r]\n\t"
  17129. #endif
  17130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17131. "lsrs r6, r7, #16\n\t"
  17132. #else
  17133. "lsr r6, r7, #16\n\t"
  17134. #endif
  17135. #ifdef WOLFSSL_KEIL
  17136. "muls r5, r6, r5\n\t"
  17137. #elif defined(__clang__)
  17138. "muls r5, r6\n\t"
  17139. #else
  17140. "mul r5, r6\n\t"
  17141. #endif
  17142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17143. "lsrs r6, r5, #16\n\t"
  17144. #else
  17145. "lsr r6, r5, #16\n\t"
  17146. #endif
  17147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17148. "lsls r5, r5, #16\n\t"
  17149. #else
  17150. "lsl r5, r5, #16\n\t"
  17151. #endif
  17152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17153. "adds r2, r2, r5\n\t"
  17154. #else
  17155. "add r2, r2, r5\n\t"
  17156. #endif
  17157. #ifdef WOLFSSL_KEIL
  17158. "adcs r3, r3, r6\n\t"
  17159. #elif defined(__clang__)
  17160. "adcs r3, r6\n\t"
  17161. #else
  17162. "adc r3, r6\n\t"
  17163. #endif
  17164. #ifdef WOLFSSL_KEIL
  17165. "adcs r4, r4, %[r]\n\t"
  17166. #elif defined(__clang__)
  17167. "adcs r4, %[r]\n\t"
  17168. #else
  17169. "adc r4, %[r]\n\t"
  17170. #endif
  17171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17172. "adds r2, r2, r5\n\t"
  17173. #else
  17174. "add r2, r2, r5\n\t"
  17175. #endif
  17176. #ifdef WOLFSSL_KEIL
  17177. "adcs r3, r3, r6\n\t"
  17178. #elif defined(__clang__)
  17179. "adcs r3, r6\n\t"
  17180. #else
  17181. "adc r3, r6\n\t"
  17182. #endif
  17183. #ifdef WOLFSSL_KEIL
  17184. "adcs r4, r4, %[r]\n\t"
  17185. #elif defined(__clang__)
  17186. "adcs r4, %[r]\n\t"
  17187. #else
  17188. "adc r4, %[r]\n\t"
  17189. #endif
  17190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17191. "lsrs r5, %[a], #16\n\t"
  17192. #else
  17193. "lsr r5, %[a], #16\n\t"
  17194. #endif
  17195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17196. "lsrs r6, r7, #16\n\t"
  17197. #else
  17198. "lsr r6, r7, #16\n\t"
  17199. #endif
  17200. #ifdef WOLFSSL_KEIL
  17201. "muls r6, r5, r6\n\t"
  17202. #elif defined(__clang__)
  17203. "muls r6, r5\n\t"
  17204. #else
  17205. "mul r6, r5\n\t"
  17206. #endif
  17207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17208. "adds r3, r3, r6\n\t"
  17209. #else
  17210. "add r3, r3, r6\n\t"
  17211. #endif
  17212. #ifdef WOLFSSL_KEIL
  17213. "adcs r4, r4, %[r]\n\t"
  17214. #elif defined(__clang__)
  17215. "adcs r4, %[r]\n\t"
  17216. #else
  17217. "adc r4, %[r]\n\t"
  17218. #endif
  17219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17220. "adds r3, r3, r6\n\t"
  17221. #else
  17222. "add r3, r3, r6\n\t"
  17223. #endif
  17224. #ifdef WOLFSSL_KEIL
  17225. "adcs r4, r4, %[r]\n\t"
  17226. #elif defined(__clang__)
  17227. "adcs r4, %[r]\n\t"
  17228. #else
  17229. "adc r4, %[r]\n\t"
  17230. #endif
  17231. "uxth r6, r7\n\t"
  17232. #ifdef WOLFSSL_KEIL
  17233. "muls r5, r6, r5\n\t"
  17234. #elif defined(__clang__)
  17235. "muls r5, r6\n\t"
  17236. #else
  17237. "mul r5, r6\n\t"
  17238. #endif
  17239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17240. "lsrs r6, r5, #16\n\t"
  17241. #else
  17242. "lsr r6, r5, #16\n\t"
  17243. #endif
  17244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17245. "lsls r5, r5, #16\n\t"
  17246. #else
  17247. "lsl r5, r5, #16\n\t"
  17248. #endif
  17249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17250. "adds r2, r2, r5\n\t"
  17251. #else
  17252. "add r2, r2, r5\n\t"
  17253. #endif
  17254. #ifdef WOLFSSL_KEIL
  17255. "adcs r3, r3, r6\n\t"
  17256. #elif defined(__clang__)
  17257. "adcs r3, r6\n\t"
  17258. #else
  17259. "adc r3, r6\n\t"
  17260. #endif
  17261. #ifdef WOLFSSL_KEIL
  17262. "adcs r4, r4, %[r]\n\t"
  17263. #elif defined(__clang__)
  17264. "adcs r4, %[r]\n\t"
  17265. #else
  17266. "adc r4, %[r]\n\t"
  17267. #endif
  17268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17269. "adds r2, r2, r5\n\t"
  17270. #else
  17271. "add r2, r2, r5\n\t"
  17272. #endif
  17273. #ifdef WOLFSSL_KEIL
  17274. "adcs r3, r3, r6\n\t"
  17275. #elif defined(__clang__)
  17276. "adcs r3, r6\n\t"
  17277. #else
  17278. "adc r3, r6\n\t"
  17279. #endif
  17280. #ifdef WOLFSSL_KEIL
  17281. "adcs r4, r4, %[r]\n\t"
  17282. #elif defined(__clang__)
  17283. "adcs r4, %[r]\n\t"
  17284. #else
  17285. "adc r4, %[r]\n\t"
  17286. #endif
  17287. "# A[6] * A[3]\n\t"
  17288. "mov %[a], r9\n\t"
  17289. "ldr r7, [%[a], #12]\n\t"
  17290. "mov %[a], r12\n\t"
  17291. "uxth r5, %[a]\n\t"
  17292. "uxth r6, r7\n\t"
  17293. #ifdef WOLFSSL_KEIL
  17294. "muls r6, r5, r6\n\t"
  17295. #elif defined(__clang__)
  17296. "muls r6, r5\n\t"
  17297. #else
  17298. "mul r6, r5\n\t"
  17299. #endif
  17300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17301. "adds r2, r2, r6\n\t"
  17302. #else
  17303. "add r2, r2, r6\n\t"
  17304. #endif
  17305. #ifdef WOLFSSL_KEIL
  17306. "adcs r3, r3, %[r]\n\t"
  17307. #elif defined(__clang__)
  17308. "adcs r3, %[r]\n\t"
  17309. #else
  17310. "adc r3, %[r]\n\t"
  17311. #endif
  17312. #ifdef WOLFSSL_KEIL
  17313. "adcs r4, r4, %[r]\n\t"
  17314. #elif defined(__clang__)
  17315. "adcs r4, %[r]\n\t"
  17316. #else
  17317. "adc r4, %[r]\n\t"
  17318. #endif
  17319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17320. "adds r2, r2, r6\n\t"
  17321. #else
  17322. "add r2, r2, r6\n\t"
  17323. #endif
  17324. #ifdef WOLFSSL_KEIL
  17325. "adcs r3, r3, %[r]\n\t"
  17326. #elif defined(__clang__)
  17327. "adcs r3, %[r]\n\t"
  17328. #else
  17329. "adc r3, %[r]\n\t"
  17330. #endif
  17331. #ifdef WOLFSSL_KEIL
  17332. "adcs r4, r4, %[r]\n\t"
  17333. #elif defined(__clang__)
  17334. "adcs r4, %[r]\n\t"
  17335. #else
  17336. "adc r4, %[r]\n\t"
  17337. #endif
  17338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17339. "lsrs r6, r7, #16\n\t"
  17340. #else
  17341. "lsr r6, r7, #16\n\t"
  17342. #endif
  17343. #ifdef WOLFSSL_KEIL
  17344. "muls r5, r6, r5\n\t"
  17345. #elif defined(__clang__)
  17346. "muls r5, r6\n\t"
  17347. #else
  17348. "mul r5, r6\n\t"
  17349. #endif
  17350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17351. "lsrs r6, r5, #16\n\t"
  17352. #else
  17353. "lsr r6, r5, #16\n\t"
  17354. #endif
  17355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17356. "lsls r5, r5, #16\n\t"
  17357. #else
  17358. "lsl r5, r5, #16\n\t"
  17359. #endif
  17360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17361. "adds r2, r2, r5\n\t"
  17362. #else
  17363. "add r2, r2, r5\n\t"
  17364. #endif
  17365. #ifdef WOLFSSL_KEIL
  17366. "adcs r3, r3, r6\n\t"
  17367. #elif defined(__clang__)
  17368. "adcs r3, r6\n\t"
  17369. #else
  17370. "adc r3, r6\n\t"
  17371. #endif
  17372. #ifdef WOLFSSL_KEIL
  17373. "adcs r4, r4, %[r]\n\t"
  17374. #elif defined(__clang__)
  17375. "adcs r4, %[r]\n\t"
  17376. #else
  17377. "adc r4, %[r]\n\t"
  17378. #endif
  17379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17380. "adds r2, r2, r5\n\t"
  17381. #else
  17382. "add r2, r2, r5\n\t"
  17383. #endif
  17384. #ifdef WOLFSSL_KEIL
  17385. "adcs r3, r3, r6\n\t"
  17386. #elif defined(__clang__)
  17387. "adcs r3, r6\n\t"
  17388. #else
  17389. "adc r3, r6\n\t"
  17390. #endif
  17391. #ifdef WOLFSSL_KEIL
  17392. "adcs r4, r4, %[r]\n\t"
  17393. #elif defined(__clang__)
  17394. "adcs r4, %[r]\n\t"
  17395. #else
  17396. "adc r4, %[r]\n\t"
  17397. #endif
  17398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17399. "lsrs r5, %[a], #16\n\t"
  17400. #else
  17401. "lsr r5, %[a], #16\n\t"
  17402. #endif
  17403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17404. "lsrs r6, r7, #16\n\t"
  17405. #else
  17406. "lsr r6, r7, #16\n\t"
  17407. #endif
  17408. #ifdef WOLFSSL_KEIL
  17409. "muls r6, r5, r6\n\t"
  17410. #elif defined(__clang__)
  17411. "muls r6, r5\n\t"
  17412. #else
  17413. "mul r6, r5\n\t"
  17414. #endif
  17415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17416. "adds r3, r3, r6\n\t"
  17417. #else
  17418. "add r3, r3, r6\n\t"
  17419. #endif
  17420. #ifdef WOLFSSL_KEIL
  17421. "adcs r4, r4, %[r]\n\t"
  17422. #elif defined(__clang__)
  17423. "adcs r4, %[r]\n\t"
  17424. #else
  17425. "adc r4, %[r]\n\t"
  17426. #endif
  17427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17428. "adds r3, r3, r6\n\t"
  17429. #else
  17430. "add r3, r3, r6\n\t"
  17431. #endif
  17432. #ifdef WOLFSSL_KEIL
  17433. "adcs r4, r4, %[r]\n\t"
  17434. #elif defined(__clang__)
  17435. "adcs r4, %[r]\n\t"
  17436. #else
  17437. "adc r4, %[r]\n\t"
  17438. #endif
  17439. "uxth r6, r7\n\t"
  17440. #ifdef WOLFSSL_KEIL
  17441. "muls r5, r6, r5\n\t"
  17442. #elif defined(__clang__)
  17443. "muls r5, r6\n\t"
  17444. #else
  17445. "mul r5, r6\n\t"
  17446. #endif
  17447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17448. "lsrs r6, r5, #16\n\t"
  17449. #else
  17450. "lsr r6, r5, #16\n\t"
  17451. #endif
  17452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17453. "lsls r5, r5, #16\n\t"
  17454. #else
  17455. "lsl r5, r5, #16\n\t"
  17456. #endif
  17457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17458. "adds r2, r2, r5\n\t"
  17459. #else
  17460. "add r2, r2, r5\n\t"
  17461. #endif
  17462. #ifdef WOLFSSL_KEIL
  17463. "adcs r3, r3, r6\n\t"
  17464. #elif defined(__clang__)
  17465. "adcs r3, r6\n\t"
  17466. #else
  17467. "adc r3, r6\n\t"
  17468. #endif
  17469. #ifdef WOLFSSL_KEIL
  17470. "adcs r4, r4, %[r]\n\t"
  17471. #elif defined(__clang__)
  17472. "adcs r4, %[r]\n\t"
  17473. #else
  17474. "adc r4, %[r]\n\t"
  17475. #endif
  17476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17477. "adds r2, r2, r5\n\t"
  17478. #else
  17479. "add r2, r2, r5\n\t"
  17480. #endif
  17481. #ifdef WOLFSSL_KEIL
  17482. "adcs r3, r3, r6\n\t"
  17483. #elif defined(__clang__)
  17484. "adcs r3, r6\n\t"
  17485. #else
  17486. "adc r3, r6\n\t"
  17487. #endif
  17488. #ifdef WOLFSSL_KEIL
  17489. "adcs r4, r4, %[r]\n\t"
  17490. #elif defined(__clang__)
  17491. "adcs r4, %[r]\n\t"
  17492. #else
  17493. "adc r4, %[r]\n\t"
  17494. #endif
  17495. "# A[7] * A[2]\n\t"
  17496. "mov %[a], r9\n\t"
  17497. "ldr r7, [%[a], #8]\n\t"
  17498. "mov %[a], lr\n\t"
  17499. "uxth r5, %[a]\n\t"
  17500. "uxth r6, r7\n\t"
  17501. #ifdef WOLFSSL_KEIL
  17502. "muls r6, r5, r6\n\t"
  17503. #elif defined(__clang__)
  17504. "muls r6, r5\n\t"
  17505. #else
  17506. "mul r6, r5\n\t"
  17507. #endif
  17508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17509. "adds r2, r2, r6\n\t"
  17510. #else
  17511. "add r2, r2, r6\n\t"
  17512. #endif
  17513. #ifdef WOLFSSL_KEIL
  17514. "adcs r3, r3, %[r]\n\t"
  17515. #elif defined(__clang__)
  17516. "adcs r3, %[r]\n\t"
  17517. #else
  17518. "adc r3, %[r]\n\t"
  17519. #endif
  17520. #ifdef WOLFSSL_KEIL
  17521. "adcs r4, r4, %[r]\n\t"
  17522. #elif defined(__clang__)
  17523. "adcs r4, %[r]\n\t"
  17524. #else
  17525. "adc r4, %[r]\n\t"
  17526. #endif
  17527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17528. "adds r2, r2, r6\n\t"
  17529. #else
  17530. "add r2, r2, r6\n\t"
  17531. #endif
  17532. #ifdef WOLFSSL_KEIL
  17533. "adcs r3, r3, %[r]\n\t"
  17534. #elif defined(__clang__)
  17535. "adcs r3, %[r]\n\t"
  17536. #else
  17537. "adc r3, %[r]\n\t"
  17538. #endif
  17539. #ifdef WOLFSSL_KEIL
  17540. "adcs r4, r4, %[r]\n\t"
  17541. #elif defined(__clang__)
  17542. "adcs r4, %[r]\n\t"
  17543. #else
  17544. "adc r4, %[r]\n\t"
  17545. #endif
  17546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17547. "lsrs r6, r7, #16\n\t"
  17548. #else
  17549. "lsr r6, r7, #16\n\t"
  17550. #endif
  17551. #ifdef WOLFSSL_KEIL
  17552. "muls r5, r6, r5\n\t"
  17553. #elif defined(__clang__)
  17554. "muls r5, r6\n\t"
  17555. #else
  17556. "mul r5, r6\n\t"
  17557. #endif
  17558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17559. "lsrs r6, r5, #16\n\t"
  17560. #else
  17561. "lsr r6, r5, #16\n\t"
  17562. #endif
  17563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17564. "lsls r5, r5, #16\n\t"
  17565. #else
  17566. "lsl r5, r5, #16\n\t"
  17567. #endif
  17568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17569. "adds r2, r2, r5\n\t"
  17570. #else
  17571. "add r2, r2, r5\n\t"
  17572. #endif
  17573. #ifdef WOLFSSL_KEIL
  17574. "adcs r3, r3, r6\n\t"
  17575. #elif defined(__clang__)
  17576. "adcs r3, r6\n\t"
  17577. #else
  17578. "adc r3, r6\n\t"
  17579. #endif
  17580. #ifdef WOLFSSL_KEIL
  17581. "adcs r4, r4, %[r]\n\t"
  17582. #elif defined(__clang__)
  17583. "adcs r4, %[r]\n\t"
  17584. #else
  17585. "adc r4, %[r]\n\t"
  17586. #endif
  17587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17588. "adds r2, r2, r5\n\t"
  17589. #else
  17590. "add r2, r2, r5\n\t"
  17591. #endif
  17592. #ifdef WOLFSSL_KEIL
  17593. "adcs r3, r3, r6\n\t"
  17594. #elif defined(__clang__)
  17595. "adcs r3, r6\n\t"
  17596. #else
  17597. "adc r3, r6\n\t"
  17598. #endif
  17599. #ifdef WOLFSSL_KEIL
  17600. "adcs r4, r4, %[r]\n\t"
  17601. #elif defined(__clang__)
  17602. "adcs r4, %[r]\n\t"
  17603. #else
  17604. "adc r4, %[r]\n\t"
  17605. #endif
  17606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17607. "lsrs r5, %[a], #16\n\t"
  17608. #else
  17609. "lsr r5, %[a], #16\n\t"
  17610. #endif
  17611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17612. "lsrs r6, r7, #16\n\t"
  17613. #else
  17614. "lsr r6, r7, #16\n\t"
  17615. #endif
  17616. #ifdef WOLFSSL_KEIL
  17617. "muls r6, r5, r6\n\t"
  17618. #elif defined(__clang__)
  17619. "muls r6, r5\n\t"
  17620. #else
  17621. "mul r6, r5\n\t"
  17622. #endif
  17623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17624. "adds r3, r3, r6\n\t"
  17625. #else
  17626. "add r3, r3, r6\n\t"
  17627. #endif
  17628. #ifdef WOLFSSL_KEIL
  17629. "adcs r4, r4, %[r]\n\t"
  17630. #elif defined(__clang__)
  17631. "adcs r4, %[r]\n\t"
  17632. #else
  17633. "adc r4, %[r]\n\t"
  17634. #endif
  17635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17636. "adds r3, r3, r6\n\t"
  17637. #else
  17638. "add r3, r3, r6\n\t"
  17639. #endif
  17640. #ifdef WOLFSSL_KEIL
  17641. "adcs r4, r4, %[r]\n\t"
  17642. #elif defined(__clang__)
  17643. "adcs r4, %[r]\n\t"
  17644. #else
  17645. "adc r4, %[r]\n\t"
  17646. #endif
  17647. "uxth r6, r7\n\t"
  17648. #ifdef WOLFSSL_KEIL
  17649. "muls r5, r6, r5\n\t"
  17650. #elif defined(__clang__)
  17651. "muls r5, r6\n\t"
  17652. #else
  17653. "mul r5, r6\n\t"
  17654. #endif
  17655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17656. "lsrs r6, r5, #16\n\t"
  17657. #else
  17658. "lsr r6, r5, #16\n\t"
  17659. #endif
  17660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17661. "lsls r5, r5, #16\n\t"
  17662. #else
  17663. "lsl r5, r5, #16\n\t"
  17664. #endif
  17665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17666. "adds r2, r2, r5\n\t"
  17667. #else
  17668. "add r2, r2, r5\n\t"
  17669. #endif
  17670. #ifdef WOLFSSL_KEIL
  17671. "adcs r3, r3, r6\n\t"
  17672. #elif defined(__clang__)
  17673. "adcs r3, r6\n\t"
  17674. #else
  17675. "adc r3, r6\n\t"
  17676. #endif
  17677. #ifdef WOLFSSL_KEIL
  17678. "adcs r4, r4, %[r]\n\t"
  17679. #elif defined(__clang__)
  17680. "adcs r4, %[r]\n\t"
  17681. #else
  17682. "adc r4, %[r]\n\t"
  17683. #endif
  17684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17685. "adds r2, r2, r5\n\t"
  17686. #else
  17687. "add r2, r2, r5\n\t"
  17688. #endif
  17689. #ifdef WOLFSSL_KEIL
  17690. "adcs r3, r3, r6\n\t"
  17691. #elif defined(__clang__)
  17692. "adcs r3, r6\n\t"
  17693. #else
  17694. "adc r3, r6\n\t"
  17695. #endif
  17696. #ifdef WOLFSSL_KEIL
  17697. "adcs r4, r4, %[r]\n\t"
  17698. #elif defined(__clang__)
  17699. "adcs r4, %[r]\n\t"
  17700. #else
  17701. "adc r4, %[r]\n\t"
  17702. #endif
  17703. "mov %[r], r8\n\t"
  17704. "str r2, [%[r], #36]\n\t"
  17705. "movs %[r], #0\n\t"
  17706. "# A[7] * A[3]\n\t"
  17707. "movs r2, #0\n\t"
  17708. "mov %[a], r9\n\t"
  17709. "ldr r7, [%[a], #12]\n\t"
  17710. "mov %[a], lr\n\t"
  17711. "uxth r5, %[a]\n\t"
  17712. "uxth r6, r7\n\t"
  17713. #ifdef WOLFSSL_KEIL
  17714. "muls r6, r5, r6\n\t"
  17715. #elif defined(__clang__)
  17716. "muls r6, r5\n\t"
  17717. #else
  17718. "mul r6, r5\n\t"
  17719. #endif
  17720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17721. "adds r3, r3, r6\n\t"
  17722. #else
  17723. "add r3, r3, r6\n\t"
  17724. #endif
  17725. #ifdef WOLFSSL_KEIL
  17726. "adcs r4, r4, %[r]\n\t"
  17727. #elif defined(__clang__)
  17728. "adcs r4, %[r]\n\t"
  17729. #else
  17730. "adc r4, %[r]\n\t"
  17731. #endif
  17732. #ifdef WOLFSSL_KEIL
  17733. "adcs r2, r2, %[r]\n\t"
  17734. #elif defined(__clang__)
  17735. "adcs r2, %[r]\n\t"
  17736. #else
  17737. "adc r2, %[r]\n\t"
  17738. #endif
  17739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17740. "adds r3, r3, r6\n\t"
  17741. #else
  17742. "add r3, r3, r6\n\t"
  17743. #endif
  17744. #ifdef WOLFSSL_KEIL
  17745. "adcs r4, r4, %[r]\n\t"
  17746. #elif defined(__clang__)
  17747. "adcs r4, %[r]\n\t"
  17748. #else
  17749. "adc r4, %[r]\n\t"
  17750. #endif
  17751. #ifdef WOLFSSL_KEIL
  17752. "adcs r2, r2, %[r]\n\t"
  17753. #elif defined(__clang__)
  17754. "adcs r2, %[r]\n\t"
  17755. #else
  17756. "adc r2, %[r]\n\t"
  17757. #endif
  17758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17759. "lsrs r6, r7, #16\n\t"
  17760. #else
  17761. "lsr r6, r7, #16\n\t"
  17762. #endif
  17763. #ifdef WOLFSSL_KEIL
  17764. "muls r5, r6, r5\n\t"
  17765. #elif defined(__clang__)
  17766. "muls r5, r6\n\t"
  17767. #else
  17768. "mul r5, r6\n\t"
  17769. #endif
  17770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17771. "lsrs r6, r5, #16\n\t"
  17772. #else
  17773. "lsr r6, r5, #16\n\t"
  17774. #endif
  17775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17776. "lsls r5, r5, #16\n\t"
  17777. #else
  17778. "lsl r5, r5, #16\n\t"
  17779. #endif
  17780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17781. "adds r3, r3, r5\n\t"
  17782. #else
  17783. "add r3, r3, r5\n\t"
  17784. #endif
  17785. #ifdef WOLFSSL_KEIL
  17786. "adcs r4, r4, r6\n\t"
  17787. #elif defined(__clang__)
  17788. "adcs r4, r6\n\t"
  17789. #else
  17790. "adc r4, r6\n\t"
  17791. #endif
  17792. #ifdef WOLFSSL_KEIL
  17793. "adcs r2, r2, %[r]\n\t"
  17794. #elif defined(__clang__)
  17795. "adcs r2, %[r]\n\t"
  17796. #else
  17797. "adc r2, %[r]\n\t"
  17798. #endif
  17799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17800. "adds r3, r3, r5\n\t"
  17801. #else
  17802. "add r3, r3, r5\n\t"
  17803. #endif
  17804. #ifdef WOLFSSL_KEIL
  17805. "adcs r4, r4, r6\n\t"
  17806. #elif defined(__clang__)
  17807. "adcs r4, r6\n\t"
  17808. #else
  17809. "adc r4, r6\n\t"
  17810. #endif
  17811. #ifdef WOLFSSL_KEIL
  17812. "adcs r2, r2, %[r]\n\t"
  17813. #elif defined(__clang__)
  17814. "adcs r2, %[r]\n\t"
  17815. #else
  17816. "adc r2, %[r]\n\t"
  17817. #endif
  17818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17819. "lsrs r5, %[a], #16\n\t"
  17820. #else
  17821. "lsr r5, %[a], #16\n\t"
  17822. #endif
  17823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17824. "lsrs r6, r7, #16\n\t"
  17825. #else
  17826. "lsr r6, r7, #16\n\t"
  17827. #endif
  17828. #ifdef WOLFSSL_KEIL
  17829. "muls r6, r5, r6\n\t"
  17830. #elif defined(__clang__)
  17831. "muls r6, r5\n\t"
  17832. #else
  17833. "mul r6, r5\n\t"
  17834. #endif
  17835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17836. "adds r4, r4, r6\n\t"
  17837. #else
  17838. "add r4, r4, r6\n\t"
  17839. #endif
  17840. #ifdef WOLFSSL_KEIL
  17841. "adcs r2, r2, %[r]\n\t"
  17842. #elif defined(__clang__)
  17843. "adcs r2, %[r]\n\t"
  17844. #else
  17845. "adc r2, %[r]\n\t"
  17846. #endif
  17847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17848. "adds r4, r4, r6\n\t"
  17849. #else
  17850. "add r4, r4, r6\n\t"
  17851. #endif
  17852. #ifdef WOLFSSL_KEIL
  17853. "adcs r2, r2, %[r]\n\t"
  17854. #elif defined(__clang__)
  17855. "adcs r2, %[r]\n\t"
  17856. #else
  17857. "adc r2, %[r]\n\t"
  17858. #endif
  17859. "uxth r6, r7\n\t"
  17860. #ifdef WOLFSSL_KEIL
  17861. "muls r5, r6, r5\n\t"
  17862. #elif defined(__clang__)
  17863. "muls r5, r6\n\t"
  17864. #else
  17865. "mul r5, r6\n\t"
  17866. #endif
  17867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17868. "lsrs r6, r5, #16\n\t"
  17869. #else
  17870. "lsr r6, r5, #16\n\t"
  17871. #endif
  17872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17873. "lsls r5, r5, #16\n\t"
  17874. #else
  17875. "lsl r5, r5, #16\n\t"
  17876. #endif
  17877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17878. "adds r3, r3, r5\n\t"
  17879. #else
  17880. "add r3, r3, r5\n\t"
  17881. #endif
  17882. #ifdef WOLFSSL_KEIL
  17883. "adcs r4, r4, r6\n\t"
  17884. #elif defined(__clang__)
  17885. "adcs r4, r6\n\t"
  17886. #else
  17887. "adc r4, r6\n\t"
  17888. #endif
  17889. #ifdef WOLFSSL_KEIL
  17890. "adcs r2, r2, %[r]\n\t"
  17891. #elif defined(__clang__)
  17892. "adcs r2, %[r]\n\t"
  17893. #else
  17894. "adc r2, %[r]\n\t"
  17895. #endif
  17896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17897. "adds r3, r3, r5\n\t"
  17898. #else
  17899. "add r3, r3, r5\n\t"
  17900. #endif
  17901. #ifdef WOLFSSL_KEIL
  17902. "adcs r4, r4, r6\n\t"
  17903. #elif defined(__clang__)
  17904. "adcs r4, r6\n\t"
  17905. #else
  17906. "adc r4, r6\n\t"
  17907. #endif
  17908. #ifdef WOLFSSL_KEIL
  17909. "adcs r2, r2, %[r]\n\t"
  17910. #elif defined(__clang__)
  17911. "adcs r2, %[r]\n\t"
  17912. #else
  17913. "adc r2, %[r]\n\t"
  17914. #endif
  17915. "# A[6] * A[4]\n\t"
  17916. "mov %[a], r9\n\t"
  17917. "mov r7, r10\n\t"
  17918. "mov %[a], r12\n\t"
  17919. "uxth r5, %[a]\n\t"
  17920. "uxth r6, r7\n\t"
  17921. #ifdef WOLFSSL_KEIL
  17922. "muls r6, r5, r6\n\t"
  17923. #elif defined(__clang__)
  17924. "muls r6, r5\n\t"
  17925. #else
  17926. "mul r6, r5\n\t"
  17927. #endif
  17928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17929. "adds r3, r3, r6\n\t"
  17930. #else
  17931. "add r3, r3, r6\n\t"
  17932. #endif
  17933. #ifdef WOLFSSL_KEIL
  17934. "adcs r4, r4, %[r]\n\t"
  17935. #elif defined(__clang__)
  17936. "adcs r4, %[r]\n\t"
  17937. #else
  17938. "adc r4, %[r]\n\t"
  17939. #endif
  17940. #ifdef WOLFSSL_KEIL
  17941. "adcs r2, r2, %[r]\n\t"
  17942. #elif defined(__clang__)
  17943. "adcs r2, %[r]\n\t"
  17944. #else
  17945. "adc r2, %[r]\n\t"
  17946. #endif
  17947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17948. "adds r3, r3, r6\n\t"
  17949. #else
  17950. "add r3, r3, r6\n\t"
  17951. #endif
  17952. #ifdef WOLFSSL_KEIL
  17953. "adcs r4, r4, %[r]\n\t"
  17954. #elif defined(__clang__)
  17955. "adcs r4, %[r]\n\t"
  17956. #else
  17957. "adc r4, %[r]\n\t"
  17958. #endif
  17959. #ifdef WOLFSSL_KEIL
  17960. "adcs r2, r2, %[r]\n\t"
  17961. #elif defined(__clang__)
  17962. "adcs r2, %[r]\n\t"
  17963. #else
  17964. "adc r2, %[r]\n\t"
  17965. #endif
  17966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17967. "lsrs r6, r7, #16\n\t"
  17968. #else
  17969. "lsr r6, r7, #16\n\t"
  17970. #endif
  17971. #ifdef WOLFSSL_KEIL
  17972. "muls r5, r6, r5\n\t"
  17973. #elif defined(__clang__)
  17974. "muls r5, r6\n\t"
  17975. #else
  17976. "mul r5, r6\n\t"
  17977. #endif
  17978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17979. "lsrs r6, r5, #16\n\t"
  17980. #else
  17981. "lsr r6, r5, #16\n\t"
  17982. #endif
  17983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17984. "lsls r5, r5, #16\n\t"
  17985. #else
  17986. "lsl r5, r5, #16\n\t"
  17987. #endif
  17988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17989. "adds r3, r3, r5\n\t"
  17990. #else
  17991. "add r3, r3, r5\n\t"
  17992. #endif
  17993. #ifdef WOLFSSL_KEIL
  17994. "adcs r4, r4, r6\n\t"
  17995. #elif defined(__clang__)
  17996. "adcs r4, r6\n\t"
  17997. #else
  17998. "adc r4, r6\n\t"
  17999. #endif
  18000. #ifdef WOLFSSL_KEIL
  18001. "adcs r2, r2, %[r]\n\t"
  18002. #elif defined(__clang__)
  18003. "adcs r2, %[r]\n\t"
  18004. #else
  18005. "adc r2, %[r]\n\t"
  18006. #endif
  18007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18008. "adds r3, r3, r5\n\t"
  18009. #else
  18010. "add r3, r3, r5\n\t"
  18011. #endif
  18012. #ifdef WOLFSSL_KEIL
  18013. "adcs r4, r4, r6\n\t"
  18014. #elif defined(__clang__)
  18015. "adcs r4, r6\n\t"
  18016. #else
  18017. "adc r4, r6\n\t"
  18018. #endif
  18019. #ifdef WOLFSSL_KEIL
  18020. "adcs r2, r2, %[r]\n\t"
  18021. #elif defined(__clang__)
  18022. "adcs r2, %[r]\n\t"
  18023. #else
  18024. "adc r2, %[r]\n\t"
  18025. #endif
  18026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18027. "lsrs r5, %[a], #16\n\t"
  18028. #else
  18029. "lsr r5, %[a], #16\n\t"
  18030. #endif
  18031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18032. "lsrs r6, r7, #16\n\t"
  18033. #else
  18034. "lsr r6, r7, #16\n\t"
  18035. #endif
  18036. #ifdef WOLFSSL_KEIL
  18037. "muls r6, r5, r6\n\t"
  18038. #elif defined(__clang__)
  18039. "muls r6, r5\n\t"
  18040. #else
  18041. "mul r6, r5\n\t"
  18042. #endif
  18043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18044. "adds r4, r4, r6\n\t"
  18045. #else
  18046. "add r4, r4, r6\n\t"
  18047. #endif
  18048. #ifdef WOLFSSL_KEIL
  18049. "adcs r2, r2, %[r]\n\t"
  18050. #elif defined(__clang__)
  18051. "adcs r2, %[r]\n\t"
  18052. #else
  18053. "adc r2, %[r]\n\t"
  18054. #endif
  18055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18056. "adds r4, r4, r6\n\t"
  18057. #else
  18058. "add r4, r4, r6\n\t"
  18059. #endif
  18060. #ifdef WOLFSSL_KEIL
  18061. "adcs r2, r2, %[r]\n\t"
  18062. #elif defined(__clang__)
  18063. "adcs r2, %[r]\n\t"
  18064. #else
  18065. "adc r2, %[r]\n\t"
  18066. #endif
  18067. "uxth r6, r7\n\t"
  18068. #ifdef WOLFSSL_KEIL
  18069. "muls r5, r6, r5\n\t"
  18070. #elif defined(__clang__)
  18071. "muls r5, r6\n\t"
  18072. #else
  18073. "mul r5, r6\n\t"
  18074. #endif
  18075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18076. "lsrs r6, r5, #16\n\t"
  18077. #else
  18078. "lsr r6, r5, #16\n\t"
  18079. #endif
  18080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18081. "lsls r5, r5, #16\n\t"
  18082. #else
  18083. "lsl r5, r5, #16\n\t"
  18084. #endif
  18085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18086. "adds r3, r3, r5\n\t"
  18087. #else
  18088. "add r3, r3, r5\n\t"
  18089. #endif
  18090. #ifdef WOLFSSL_KEIL
  18091. "adcs r4, r4, r6\n\t"
  18092. #elif defined(__clang__)
  18093. "adcs r4, r6\n\t"
  18094. #else
  18095. "adc r4, r6\n\t"
  18096. #endif
  18097. #ifdef WOLFSSL_KEIL
  18098. "adcs r2, r2, %[r]\n\t"
  18099. #elif defined(__clang__)
  18100. "adcs r2, %[r]\n\t"
  18101. #else
  18102. "adc r2, %[r]\n\t"
  18103. #endif
  18104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18105. "adds r3, r3, r5\n\t"
  18106. #else
  18107. "add r3, r3, r5\n\t"
  18108. #endif
  18109. #ifdef WOLFSSL_KEIL
  18110. "adcs r4, r4, r6\n\t"
  18111. #elif defined(__clang__)
  18112. "adcs r4, r6\n\t"
  18113. #else
  18114. "adc r4, r6\n\t"
  18115. #endif
  18116. #ifdef WOLFSSL_KEIL
  18117. "adcs r2, r2, %[r]\n\t"
  18118. #elif defined(__clang__)
  18119. "adcs r2, %[r]\n\t"
  18120. #else
  18121. "adc r2, %[r]\n\t"
  18122. #endif
  18123. "# A[5] * A[5]\n\t"
  18124. "mov r7, r11\n\t"
  18125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18126. "lsrs r6, r7, #16\n\t"
  18127. #else
  18128. "lsr r6, r7, #16\n\t"
  18129. #endif
  18130. "uxth r5, r7\n\t"
  18131. #ifdef WOLFSSL_KEIL
  18132. "muls r5, r5, r5\n\t"
  18133. #elif defined(__clang__)
  18134. "muls r5, r5\n\t"
  18135. #else
  18136. "mul r5, r5\n\t"
  18137. #endif
  18138. #ifdef WOLFSSL_KEIL
  18139. "muls r6, r6, r6\n\t"
  18140. #elif defined(__clang__)
  18141. "muls r6, r6\n\t"
  18142. #else
  18143. "mul r6, r6\n\t"
  18144. #endif
  18145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18146. "adds r3, r3, r5\n\t"
  18147. #else
  18148. "add r3, r3, r5\n\t"
  18149. #endif
  18150. #ifdef WOLFSSL_KEIL
  18151. "adcs r4, r4, r6\n\t"
  18152. #elif defined(__clang__)
  18153. "adcs r4, r6\n\t"
  18154. #else
  18155. "adc r4, r6\n\t"
  18156. #endif
  18157. #ifdef WOLFSSL_KEIL
  18158. "adcs r2, r2, %[r]\n\t"
  18159. #elif defined(__clang__)
  18160. "adcs r2, %[r]\n\t"
  18161. #else
  18162. "adc r2, %[r]\n\t"
  18163. #endif
  18164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18165. "lsrs r6, r7, #16\n\t"
  18166. #else
  18167. "lsr r6, r7, #16\n\t"
  18168. #endif
  18169. "uxth r5, r7\n\t"
  18170. #ifdef WOLFSSL_KEIL
  18171. "muls r5, r6, r5\n\t"
  18172. #elif defined(__clang__)
  18173. "muls r5, r6\n\t"
  18174. #else
  18175. "mul r5, r6\n\t"
  18176. #endif
  18177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18178. "lsrs r6, r5, #15\n\t"
  18179. #else
  18180. "lsr r6, r5, #15\n\t"
  18181. #endif
  18182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18183. "lsls r5, r5, #17\n\t"
  18184. #else
  18185. "lsl r5, r5, #17\n\t"
  18186. #endif
  18187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18188. "adds r3, r3, r5\n\t"
  18189. #else
  18190. "add r3, r3, r5\n\t"
  18191. #endif
  18192. #ifdef WOLFSSL_KEIL
  18193. "adcs r4, r4, r6\n\t"
  18194. #elif defined(__clang__)
  18195. "adcs r4, r6\n\t"
  18196. #else
  18197. "adc r4, r6\n\t"
  18198. #endif
  18199. #ifdef WOLFSSL_KEIL
  18200. "adcs r2, r2, %[r]\n\t"
  18201. #elif defined(__clang__)
  18202. "adcs r2, %[r]\n\t"
  18203. #else
  18204. "adc r2, %[r]\n\t"
  18205. #endif
  18206. "mov %[r], r8\n\t"
  18207. "str r3, [%[r], #40]\n\t"
  18208. "movs %[r], #0\n\t"
  18209. "# A[6] * A[5]\n\t"
  18210. "movs r3, #0\n\t"
  18211. "mov %[a], r9\n\t"
  18212. "mov %[a], r12\n\t"
  18213. "uxth r5, %[a]\n\t"
  18214. "uxth r6, r7\n\t"
  18215. #ifdef WOLFSSL_KEIL
  18216. "muls r6, r5, r6\n\t"
  18217. #elif defined(__clang__)
  18218. "muls r6, r5\n\t"
  18219. #else
  18220. "mul r6, r5\n\t"
  18221. #endif
  18222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18223. "adds r4, r4, r6\n\t"
  18224. #else
  18225. "add r4, r4, r6\n\t"
  18226. #endif
  18227. #ifdef WOLFSSL_KEIL
  18228. "adcs r2, r2, %[r]\n\t"
  18229. #elif defined(__clang__)
  18230. "adcs r2, %[r]\n\t"
  18231. #else
  18232. "adc r2, %[r]\n\t"
  18233. #endif
  18234. #ifdef WOLFSSL_KEIL
  18235. "adcs r3, r3, %[r]\n\t"
  18236. #elif defined(__clang__)
  18237. "adcs r3, %[r]\n\t"
  18238. #else
  18239. "adc r3, %[r]\n\t"
  18240. #endif
  18241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18242. "adds r4, r4, r6\n\t"
  18243. #else
  18244. "add r4, r4, r6\n\t"
  18245. #endif
  18246. #ifdef WOLFSSL_KEIL
  18247. "adcs r2, r2, %[r]\n\t"
  18248. #elif defined(__clang__)
  18249. "adcs r2, %[r]\n\t"
  18250. #else
  18251. "adc r2, %[r]\n\t"
  18252. #endif
  18253. #ifdef WOLFSSL_KEIL
  18254. "adcs r3, r3, %[r]\n\t"
  18255. #elif defined(__clang__)
  18256. "adcs r3, %[r]\n\t"
  18257. #else
  18258. "adc r3, %[r]\n\t"
  18259. #endif
  18260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18261. "lsrs r6, r7, #16\n\t"
  18262. #else
  18263. "lsr r6, r7, #16\n\t"
  18264. #endif
  18265. #ifdef WOLFSSL_KEIL
  18266. "muls r5, r6, r5\n\t"
  18267. #elif defined(__clang__)
  18268. "muls r5, r6\n\t"
  18269. #else
  18270. "mul r5, r6\n\t"
  18271. #endif
  18272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18273. "lsrs r6, r5, #16\n\t"
  18274. #else
  18275. "lsr r6, r5, #16\n\t"
  18276. #endif
  18277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18278. "lsls r5, r5, #16\n\t"
  18279. #else
  18280. "lsl r5, r5, #16\n\t"
  18281. #endif
  18282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18283. "adds r4, r4, r5\n\t"
  18284. #else
  18285. "add r4, r4, r5\n\t"
  18286. #endif
  18287. #ifdef WOLFSSL_KEIL
  18288. "adcs r2, r2, r6\n\t"
  18289. #elif defined(__clang__)
  18290. "adcs r2, r6\n\t"
  18291. #else
  18292. "adc r2, r6\n\t"
  18293. #endif
  18294. #ifdef WOLFSSL_KEIL
  18295. "adcs r3, r3, %[r]\n\t"
  18296. #elif defined(__clang__)
  18297. "adcs r3, %[r]\n\t"
  18298. #else
  18299. "adc r3, %[r]\n\t"
  18300. #endif
  18301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18302. "adds r4, r4, r5\n\t"
  18303. #else
  18304. "add r4, r4, r5\n\t"
  18305. #endif
  18306. #ifdef WOLFSSL_KEIL
  18307. "adcs r2, r2, r6\n\t"
  18308. #elif defined(__clang__)
  18309. "adcs r2, r6\n\t"
  18310. #else
  18311. "adc r2, r6\n\t"
  18312. #endif
  18313. #ifdef WOLFSSL_KEIL
  18314. "adcs r3, r3, %[r]\n\t"
  18315. #elif defined(__clang__)
  18316. "adcs r3, %[r]\n\t"
  18317. #else
  18318. "adc r3, %[r]\n\t"
  18319. #endif
  18320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18321. "lsrs r5, %[a], #16\n\t"
  18322. #else
  18323. "lsr r5, %[a], #16\n\t"
  18324. #endif
  18325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18326. "lsrs r6, r7, #16\n\t"
  18327. #else
  18328. "lsr r6, r7, #16\n\t"
  18329. #endif
  18330. #ifdef WOLFSSL_KEIL
  18331. "muls r6, r5, r6\n\t"
  18332. #elif defined(__clang__)
  18333. "muls r6, r5\n\t"
  18334. #else
  18335. "mul r6, r5\n\t"
  18336. #endif
  18337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18338. "adds r2, r2, r6\n\t"
  18339. #else
  18340. "add r2, r2, r6\n\t"
  18341. #endif
  18342. #ifdef WOLFSSL_KEIL
  18343. "adcs r3, r3, %[r]\n\t"
  18344. #elif defined(__clang__)
  18345. "adcs r3, %[r]\n\t"
  18346. #else
  18347. "adc r3, %[r]\n\t"
  18348. #endif
  18349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18350. "adds r2, r2, r6\n\t"
  18351. #else
  18352. "add r2, r2, r6\n\t"
  18353. #endif
  18354. #ifdef WOLFSSL_KEIL
  18355. "adcs r3, r3, %[r]\n\t"
  18356. #elif defined(__clang__)
  18357. "adcs r3, %[r]\n\t"
  18358. #else
  18359. "adc r3, %[r]\n\t"
  18360. #endif
  18361. "uxth r6, r7\n\t"
  18362. #ifdef WOLFSSL_KEIL
  18363. "muls r5, r6, r5\n\t"
  18364. #elif defined(__clang__)
  18365. "muls r5, r6\n\t"
  18366. #else
  18367. "mul r5, r6\n\t"
  18368. #endif
  18369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18370. "lsrs r6, r5, #16\n\t"
  18371. #else
  18372. "lsr r6, r5, #16\n\t"
  18373. #endif
  18374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18375. "lsls r5, r5, #16\n\t"
  18376. #else
  18377. "lsl r5, r5, #16\n\t"
  18378. #endif
  18379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18380. "adds r4, r4, r5\n\t"
  18381. #else
  18382. "add r4, r4, r5\n\t"
  18383. #endif
  18384. #ifdef WOLFSSL_KEIL
  18385. "adcs r2, r2, r6\n\t"
  18386. #elif defined(__clang__)
  18387. "adcs r2, r6\n\t"
  18388. #else
  18389. "adc r2, r6\n\t"
  18390. #endif
  18391. #ifdef WOLFSSL_KEIL
  18392. "adcs r3, r3, %[r]\n\t"
  18393. #elif defined(__clang__)
  18394. "adcs r3, %[r]\n\t"
  18395. #else
  18396. "adc r3, %[r]\n\t"
  18397. #endif
  18398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18399. "adds r4, r4, r5\n\t"
  18400. #else
  18401. "add r4, r4, r5\n\t"
  18402. #endif
  18403. #ifdef WOLFSSL_KEIL
  18404. "adcs r2, r2, r6\n\t"
  18405. #elif defined(__clang__)
  18406. "adcs r2, r6\n\t"
  18407. #else
  18408. "adc r2, r6\n\t"
  18409. #endif
  18410. #ifdef WOLFSSL_KEIL
  18411. "adcs r3, r3, %[r]\n\t"
  18412. #elif defined(__clang__)
  18413. "adcs r3, %[r]\n\t"
  18414. #else
  18415. "adc r3, %[r]\n\t"
  18416. #endif
  18417. "# A[7] * A[4]\n\t"
  18418. "mov %[a], r9\n\t"
  18419. "mov r7, r10\n\t"
  18420. "mov %[a], lr\n\t"
  18421. "uxth r5, %[a]\n\t"
  18422. "uxth r6, r7\n\t"
  18423. #ifdef WOLFSSL_KEIL
  18424. "muls r6, r5, r6\n\t"
  18425. #elif defined(__clang__)
  18426. "muls r6, r5\n\t"
  18427. #else
  18428. "mul r6, r5\n\t"
  18429. #endif
  18430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18431. "adds r4, r4, r6\n\t"
  18432. #else
  18433. "add r4, r4, r6\n\t"
  18434. #endif
  18435. #ifdef WOLFSSL_KEIL
  18436. "adcs r2, r2, %[r]\n\t"
  18437. #elif defined(__clang__)
  18438. "adcs r2, %[r]\n\t"
  18439. #else
  18440. "adc r2, %[r]\n\t"
  18441. #endif
  18442. #ifdef WOLFSSL_KEIL
  18443. "adcs r3, r3, %[r]\n\t"
  18444. #elif defined(__clang__)
  18445. "adcs r3, %[r]\n\t"
  18446. #else
  18447. "adc r3, %[r]\n\t"
  18448. #endif
  18449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18450. "adds r4, r4, r6\n\t"
  18451. #else
  18452. "add r4, r4, r6\n\t"
  18453. #endif
  18454. #ifdef WOLFSSL_KEIL
  18455. "adcs r2, r2, %[r]\n\t"
  18456. #elif defined(__clang__)
  18457. "adcs r2, %[r]\n\t"
  18458. #else
  18459. "adc r2, %[r]\n\t"
  18460. #endif
  18461. #ifdef WOLFSSL_KEIL
  18462. "adcs r3, r3, %[r]\n\t"
  18463. #elif defined(__clang__)
  18464. "adcs r3, %[r]\n\t"
  18465. #else
  18466. "adc r3, %[r]\n\t"
  18467. #endif
  18468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18469. "lsrs r6, r7, #16\n\t"
  18470. #else
  18471. "lsr r6, r7, #16\n\t"
  18472. #endif
  18473. #ifdef WOLFSSL_KEIL
  18474. "muls r5, r6, r5\n\t"
  18475. #elif defined(__clang__)
  18476. "muls r5, r6\n\t"
  18477. #else
  18478. "mul r5, r6\n\t"
  18479. #endif
  18480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18481. "lsrs r6, r5, #16\n\t"
  18482. #else
  18483. "lsr r6, r5, #16\n\t"
  18484. #endif
  18485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18486. "lsls r5, r5, #16\n\t"
  18487. #else
  18488. "lsl r5, r5, #16\n\t"
  18489. #endif
  18490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18491. "adds r4, r4, r5\n\t"
  18492. #else
  18493. "add r4, r4, r5\n\t"
  18494. #endif
  18495. #ifdef WOLFSSL_KEIL
  18496. "adcs r2, r2, r6\n\t"
  18497. #elif defined(__clang__)
  18498. "adcs r2, r6\n\t"
  18499. #else
  18500. "adc r2, r6\n\t"
  18501. #endif
  18502. #ifdef WOLFSSL_KEIL
  18503. "adcs r3, r3, %[r]\n\t"
  18504. #elif defined(__clang__)
  18505. "adcs r3, %[r]\n\t"
  18506. #else
  18507. "adc r3, %[r]\n\t"
  18508. #endif
  18509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18510. "adds r4, r4, r5\n\t"
  18511. #else
  18512. "add r4, r4, r5\n\t"
  18513. #endif
  18514. #ifdef WOLFSSL_KEIL
  18515. "adcs r2, r2, r6\n\t"
  18516. #elif defined(__clang__)
  18517. "adcs r2, r6\n\t"
  18518. #else
  18519. "adc r2, r6\n\t"
  18520. #endif
  18521. #ifdef WOLFSSL_KEIL
  18522. "adcs r3, r3, %[r]\n\t"
  18523. #elif defined(__clang__)
  18524. "adcs r3, %[r]\n\t"
  18525. #else
  18526. "adc r3, %[r]\n\t"
  18527. #endif
  18528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18529. "lsrs r5, %[a], #16\n\t"
  18530. #else
  18531. "lsr r5, %[a], #16\n\t"
  18532. #endif
  18533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18534. "lsrs r6, r7, #16\n\t"
  18535. #else
  18536. "lsr r6, r7, #16\n\t"
  18537. #endif
  18538. #ifdef WOLFSSL_KEIL
  18539. "muls r6, r5, r6\n\t"
  18540. #elif defined(__clang__)
  18541. "muls r6, r5\n\t"
  18542. #else
  18543. "mul r6, r5\n\t"
  18544. #endif
  18545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18546. "adds r2, r2, r6\n\t"
  18547. #else
  18548. "add r2, r2, r6\n\t"
  18549. #endif
  18550. #ifdef WOLFSSL_KEIL
  18551. "adcs r3, r3, %[r]\n\t"
  18552. #elif defined(__clang__)
  18553. "adcs r3, %[r]\n\t"
  18554. #else
  18555. "adc r3, %[r]\n\t"
  18556. #endif
  18557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18558. "adds r2, r2, r6\n\t"
  18559. #else
  18560. "add r2, r2, r6\n\t"
  18561. #endif
  18562. #ifdef WOLFSSL_KEIL
  18563. "adcs r3, r3, %[r]\n\t"
  18564. #elif defined(__clang__)
  18565. "adcs r3, %[r]\n\t"
  18566. #else
  18567. "adc r3, %[r]\n\t"
  18568. #endif
  18569. "uxth r6, r7\n\t"
  18570. #ifdef WOLFSSL_KEIL
  18571. "muls r5, r6, r5\n\t"
  18572. #elif defined(__clang__)
  18573. "muls r5, r6\n\t"
  18574. #else
  18575. "mul r5, r6\n\t"
  18576. #endif
  18577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18578. "lsrs r6, r5, #16\n\t"
  18579. #else
  18580. "lsr r6, r5, #16\n\t"
  18581. #endif
  18582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18583. "lsls r5, r5, #16\n\t"
  18584. #else
  18585. "lsl r5, r5, #16\n\t"
  18586. #endif
  18587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18588. "adds r4, r4, r5\n\t"
  18589. #else
  18590. "add r4, r4, r5\n\t"
  18591. #endif
  18592. #ifdef WOLFSSL_KEIL
  18593. "adcs r2, r2, r6\n\t"
  18594. #elif defined(__clang__)
  18595. "adcs r2, r6\n\t"
  18596. #else
  18597. "adc r2, r6\n\t"
  18598. #endif
  18599. #ifdef WOLFSSL_KEIL
  18600. "adcs r3, r3, %[r]\n\t"
  18601. #elif defined(__clang__)
  18602. "adcs r3, %[r]\n\t"
  18603. #else
  18604. "adc r3, %[r]\n\t"
  18605. #endif
  18606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18607. "adds r4, r4, r5\n\t"
  18608. #else
  18609. "add r4, r4, r5\n\t"
  18610. #endif
  18611. #ifdef WOLFSSL_KEIL
  18612. "adcs r2, r2, r6\n\t"
  18613. #elif defined(__clang__)
  18614. "adcs r2, r6\n\t"
  18615. #else
  18616. "adc r2, r6\n\t"
  18617. #endif
  18618. #ifdef WOLFSSL_KEIL
  18619. "adcs r3, r3, %[r]\n\t"
  18620. #elif defined(__clang__)
  18621. "adcs r3, %[r]\n\t"
  18622. #else
  18623. "adc r3, %[r]\n\t"
  18624. #endif
  18625. "mov %[r], r8\n\t"
  18626. "str r4, [%[r], #44]\n\t"
  18627. "movs %[r], #0\n\t"
  18628. "# A[7] * A[5]\n\t"
  18629. "movs r4, #0\n\t"
  18630. "mov %[a], r9\n\t"
  18631. "mov r7, r11\n\t"
  18632. "mov %[a], lr\n\t"
  18633. "uxth r5, %[a]\n\t"
  18634. "uxth r6, r7\n\t"
  18635. #ifdef WOLFSSL_KEIL
  18636. "muls r6, r5, r6\n\t"
  18637. #elif defined(__clang__)
  18638. "muls r6, r5\n\t"
  18639. #else
  18640. "mul r6, r5\n\t"
  18641. #endif
  18642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18643. "adds r2, r2, r6\n\t"
  18644. #else
  18645. "add r2, r2, r6\n\t"
  18646. #endif
  18647. #ifdef WOLFSSL_KEIL
  18648. "adcs r3, r3, %[r]\n\t"
  18649. #elif defined(__clang__)
  18650. "adcs r3, %[r]\n\t"
  18651. #else
  18652. "adc r3, %[r]\n\t"
  18653. #endif
  18654. #ifdef WOLFSSL_KEIL
  18655. "adcs r4, r4, %[r]\n\t"
  18656. #elif defined(__clang__)
  18657. "adcs r4, %[r]\n\t"
  18658. #else
  18659. "adc r4, %[r]\n\t"
  18660. #endif
  18661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18662. "adds r2, r2, r6\n\t"
  18663. #else
  18664. "add r2, r2, r6\n\t"
  18665. #endif
  18666. #ifdef WOLFSSL_KEIL
  18667. "adcs r3, r3, %[r]\n\t"
  18668. #elif defined(__clang__)
  18669. "adcs r3, %[r]\n\t"
  18670. #else
  18671. "adc r3, %[r]\n\t"
  18672. #endif
  18673. #ifdef WOLFSSL_KEIL
  18674. "adcs r4, r4, %[r]\n\t"
  18675. #elif defined(__clang__)
  18676. "adcs r4, %[r]\n\t"
  18677. #else
  18678. "adc r4, %[r]\n\t"
  18679. #endif
  18680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18681. "lsrs r6, r7, #16\n\t"
  18682. #else
  18683. "lsr r6, r7, #16\n\t"
  18684. #endif
  18685. #ifdef WOLFSSL_KEIL
  18686. "muls r5, r6, r5\n\t"
  18687. #elif defined(__clang__)
  18688. "muls r5, r6\n\t"
  18689. #else
  18690. "mul r5, r6\n\t"
  18691. #endif
  18692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18693. "lsrs r6, r5, #16\n\t"
  18694. #else
  18695. "lsr r6, r5, #16\n\t"
  18696. #endif
  18697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18698. "lsls r5, r5, #16\n\t"
  18699. #else
  18700. "lsl r5, r5, #16\n\t"
  18701. #endif
  18702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18703. "adds r2, r2, r5\n\t"
  18704. #else
  18705. "add r2, r2, r5\n\t"
  18706. #endif
  18707. #ifdef WOLFSSL_KEIL
  18708. "adcs r3, r3, r6\n\t"
  18709. #elif defined(__clang__)
  18710. "adcs r3, r6\n\t"
  18711. #else
  18712. "adc r3, r6\n\t"
  18713. #endif
  18714. #ifdef WOLFSSL_KEIL
  18715. "adcs r4, r4, %[r]\n\t"
  18716. #elif defined(__clang__)
  18717. "adcs r4, %[r]\n\t"
  18718. #else
  18719. "adc r4, %[r]\n\t"
  18720. #endif
  18721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18722. "adds r2, r2, r5\n\t"
  18723. #else
  18724. "add r2, r2, r5\n\t"
  18725. #endif
  18726. #ifdef WOLFSSL_KEIL
  18727. "adcs r3, r3, r6\n\t"
  18728. #elif defined(__clang__)
  18729. "adcs r3, r6\n\t"
  18730. #else
  18731. "adc r3, r6\n\t"
  18732. #endif
  18733. #ifdef WOLFSSL_KEIL
  18734. "adcs r4, r4, %[r]\n\t"
  18735. #elif defined(__clang__)
  18736. "adcs r4, %[r]\n\t"
  18737. #else
  18738. "adc r4, %[r]\n\t"
  18739. #endif
  18740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18741. "lsrs r5, %[a], #16\n\t"
  18742. #else
  18743. "lsr r5, %[a], #16\n\t"
  18744. #endif
  18745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18746. "lsrs r6, r7, #16\n\t"
  18747. #else
  18748. "lsr r6, r7, #16\n\t"
  18749. #endif
  18750. #ifdef WOLFSSL_KEIL
  18751. "muls r6, r5, r6\n\t"
  18752. #elif defined(__clang__)
  18753. "muls r6, r5\n\t"
  18754. #else
  18755. "mul r6, r5\n\t"
  18756. #endif
  18757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18758. "adds r3, r3, r6\n\t"
  18759. #else
  18760. "add r3, r3, r6\n\t"
  18761. #endif
  18762. #ifdef WOLFSSL_KEIL
  18763. "adcs r4, r4, %[r]\n\t"
  18764. #elif defined(__clang__)
  18765. "adcs r4, %[r]\n\t"
  18766. #else
  18767. "adc r4, %[r]\n\t"
  18768. #endif
  18769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18770. "adds r3, r3, r6\n\t"
  18771. #else
  18772. "add r3, r3, r6\n\t"
  18773. #endif
  18774. #ifdef WOLFSSL_KEIL
  18775. "adcs r4, r4, %[r]\n\t"
  18776. #elif defined(__clang__)
  18777. "adcs r4, %[r]\n\t"
  18778. #else
  18779. "adc r4, %[r]\n\t"
  18780. #endif
  18781. "uxth r6, r7\n\t"
  18782. #ifdef WOLFSSL_KEIL
  18783. "muls r5, r6, r5\n\t"
  18784. #elif defined(__clang__)
  18785. "muls r5, r6\n\t"
  18786. #else
  18787. "mul r5, r6\n\t"
  18788. #endif
  18789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18790. "lsrs r6, r5, #16\n\t"
  18791. #else
  18792. "lsr r6, r5, #16\n\t"
  18793. #endif
  18794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18795. "lsls r5, r5, #16\n\t"
  18796. #else
  18797. "lsl r5, r5, #16\n\t"
  18798. #endif
  18799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18800. "adds r2, r2, r5\n\t"
  18801. #else
  18802. "add r2, r2, r5\n\t"
  18803. #endif
  18804. #ifdef WOLFSSL_KEIL
  18805. "adcs r3, r3, r6\n\t"
  18806. #elif defined(__clang__)
  18807. "adcs r3, r6\n\t"
  18808. #else
  18809. "adc r3, r6\n\t"
  18810. #endif
  18811. #ifdef WOLFSSL_KEIL
  18812. "adcs r4, r4, %[r]\n\t"
  18813. #elif defined(__clang__)
  18814. "adcs r4, %[r]\n\t"
  18815. #else
  18816. "adc r4, %[r]\n\t"
  18817. #endif
  18818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18819. "adds r2, r2, r5\n\t"
  18820. #else
  18821. "add r2, r2, r5\n\t"
  18822. #endif
  18823. #ifdef WOLFSSL_KEIL
  18824. "adcs r3, r3, r6\n\t"
  18825. #elif defined(__clang__)
  18826. "adcs r3, r6\n\t"
  18827. #else
  18828. "adc r3, r6\n\t"
  18829. #endif
  18830. #ifdef WOLFSSL_KEIL
  18831. "adcs r4, r4, %[r]\n\t"
  18832. #elif defined(__clang__)
  18833. "adcs r4, %[r]\n\t"
  18834. #else
  18835. "adc r4, %[r]\n\t"
  18836. #endif
  18837. "# A[6] * A[6]\n\t"
  18838. "mov r7, r12\n\t"
  18839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18840. "lsrs r6, r7, #16\n\t"
  18841. #else
  18842. "lsr r6, r7, #16\n\t"
  18843. #endif
  18844. "uxth r5, r7\n\t"
  18845. #ifdef WOLFSSL_KEIL
  18846. "muls r5, r5, r5\n\t"
  18847. #elif defined(__clang__)
  18848. "muls r5, r5\n\t"
  18849. #else
  18850. "mul r5, r5\n\t"
  18851. #endif
  18852. #ifdef WOLFSSL_KEIL
  18853. "muls r6, r6, r6\n\t"
  18854. #elif defined(__clang__)
  18855. "muls r6, r6\n\t"
  18856. #else
  18857. "mul r6, r6\n\t"
  18858. #endif
  18859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18860. "adds r2, r2, r5\n\t"
  18861. #else
  18862. "add r2, r2, r5\n\t"
  18863. #endif
  18864. #ifdef WOLFSSL_KEIL
  18865. "adcs r3, r3, r6\n\t"
  18866. #elif defined(__clang__)
  18867. "adcs r3, r6\n\t"
  18868. #else
  18869. "adc r3, r6\n\t"
  18870. #endif
  18871. #ifdef WOLFSSL_KEIL
  18872. "adcs r4, r4, %[r]\n\t"
  18873. #elif defined(__clang__)
  18874. "adcs r4, %[r]\n\t"
  18875. #else
  18876. "adc r4, %[r]\n\t"
  18877. #endif
  18878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18879. "lsrs r6, r7, #16\n\t"
  18880. #else
  18881. "lsr r6, r7, #16\n\t"
  18882. #endif
  18883. "uxth r5, r7\n\t"
  18884. #ifdef WOLFSSL_KEIL
  18885. "muls r5, r6, r5\n\t"
  18886. #elif defined(__clang__)
  18887. "muls r5, r6\n\t"
  18888. #else
  18889. "mul r5, r6\n\t"
  18890. #endif
  18891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18892. "lsrs r6, r5, #15\n\t"
  18893. #else
  18894. "lsr r6, r5, #15\n\t"
  18895. #endif
  18896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18897. "lsls r5, r5, #17\n\t"
  18898. #else
  18899. "lsl r5, r5, #17\n\t"
  18900. #endif
  18901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18902. "adds r2, r2, r5\n\t"
  18903. #else
  18904. "add r2, r2, r5\n\t"
  18905. #endif
  18906. #ifdef WOLFSSL_KEIL
  18907. "adcs r3, r3, r6\n\t"
  18908. #elif defined(__clang__)
  18909. "adcs r3, r6\n\t"
  18910. #else
  18911. "adc r3, r6\n\t"
  18912. #endif
  18913. #ifdef WOLFSSL_KEIL
  18914. "adcs r4, r4, %[r]\n\t"
  18915. #elif defined(__clang__)
  18916. "adcs r4, %[r]\n\t"
  18917. #else
  18918. "adc r4, %[r]\n\t"
  18919. #endif
  18920. "mov %[r], r8\n\t"
  18921. "str r2, [%[r], #48]\n\t"
  18922. "movs %[r], #0\n\t"
  18923. "# A[7] * A[6]\n\t"
  18924. "movs r2, #0\n\t"
  18925. "mov %[a], r9\n\t"
  18926. "mov %[a], lr\n\t"
  18927. "uxth r5, %[a]\n\t"
  18928. "uxth r6, r7\n\t"
  18929. #ifdef WOLFSSL_KEIL
  18930. "muls r6, r5, r6\n\t"
  18931. #elif defined(__clang__)
  18932. "muls r6, r5\n\t"
  18933. #else
  18934. "mul r6, r5\n\t"
  18935. #endif
  18936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18937. "adds r3, r3, r6\n\t"
  18938. #else
  18939. "add r3, r3, r6\n\t"
  18940. #endif
  18941. #ifdef WOLFSSL_KEIL
  18942. "adcs r4, r4, %[r]\n\t"
  18943. #elif defined(__clang__)
  18944. "adcs r4, %[r]\n\t"
  18945. #else
  18946. "adc r4, %[r]\n\t"
  18947. #endif
  18948. #ifdef WOLFSSL_KEIL
  18949. "adcs r2, r2, %[r]\n\t"
  18950. #elif defined(__clang__)
  18951. "adcs r2, %[r]\n\t"
  18952. #else
  18953. "adc r2, %[r]\n\t"
  18954. #endif
  18955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18956. "adds r3, r3, r6\n\t"
  18957. #else
  18958. "add r3, r3, r6\n\t"
  18959. #endif
  18960. #ifdef WOLFSSL_KEIL
  18961. "adcs r4, r4, %[r]\n\t"
  18962. #elif defined(__clang__)
  18963. "adcs r4, %[r]\n\t"
  18964. #else
  18965. "adc r4, %[r]\n\t"
  18966. #endif
  18967. #ifdef WOLFSSL_KEIL
  18968. "adcs r2, r2, %[r]\n\t"
  18969. #elif defined(__clang__)
  18970. "adcs r2, %[r]\n\t"
  18971. #else
  18972. "adc r2, %[r]\n\t"
  18973. #endif
  18974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18975. "lsrs r6, r7, #16\n\t"
  18976. #else
  18977. "lsr r6, r7, #16\n\t"
  18978. #endif
  18979. #ifdef WOLFSSL_KEIL
  18980. "muls r5, r6, r5\n\t"
  18981. #elif defined(__clang__)
  18982. "muls r5, r6\n\t"
  18983. #else
  18984. "mul r5, r6\n\t"
  18985. #endif
  18986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18987. "lsrs r6, r5, #16\n\t"
  18988. #else
  18989. "lsr r6, r5, #16\n\t"
  18990. #endif
  18991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18992. "lsls r5, r5, #16\n\t"
  18993. #else
  18994. "lsl r5, r5, #16\n\t"
  18995. #endif
  18996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18997. "adds r3, r3, r5\n\t"
  18998. #else
  18999. "add r3, r3, r5\n\t"
  19000. #endif
  19001. #ifdef WOLFSSL_KEIL
  19002. "adcs r4, r4, r6\n\t"
  19003. #elif defined(__clang__)
  19004. "adcs r4, r6\n\t"
  19005. #else
  19006. "adc r4, r6\n\t"
  19007. #endif
  19008. #ifdef WOLFSSL_KEIL
  19009. "adcs r2, r2, %[r]\n\t"
  19010. #elif defined(__clang__)
  19011. "adcs r2, %[r]\n\t"
  19012. #else
  19013. "adc r2, %[r]\n\t"
  19014. #endif
  19015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19016. "adds r3, r3, r5\n\t"
  19017. #else
  19018. "add r3, r3, r5\n\t"
  19019. #endif
  19020. #ifdef WOLFSSL_KEIL
  19021. "adcs r4, r4, r6\n\t"
  19022. #elif defined(__clang__)
  19023. "adcs r4, r6\n\t"
  19024. #else
  19025. "adc r4, r6\n\t"
  19026. #endif
  19027. #ifdef WOLFSSL_KEIL
  19028. "adcs r2, r2, %[r]\n\t"
  19029. #elif defined(__clang__)
  19030. "adcs r2, %[r]\n\t"
  19031. #else
  19032. "adc r2, %[r]\n\t"
  19033. #endif
  19034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19035. "lsrs r5, %[a], #16\n\t"
  19036. #else
  19037. "lsr r5, %[a], #16\n\t"
  19038. #endif
  19039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19040. "lsrs r6, r7, #16\n\t"
  19041. #else
  19042. "lsr r6, r7, #16\n\t"
  19043. #endif
  19044. #ifdef WOLFSSL_KEIL
  19045. "muls r6, r5, r6\n\t"
  19046. #elif defined(__clang__)
  19047. "muls r6, r5\n\t"
  19048. #else
  19049. "mul r6, r5\n\t"
  19050. #endif
  19051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19052. "adds r4, r4, r6\n\t"
  19053. #else
  19054. "add r4, r4, r6\n\t"
  19055. #endif
  19056. #ifdef WOLFSSL_KEIL
  19057. "adcs r2, r2, %[r]\n\t"
  19058. #elif defined(__clang__)
  19059. "adcs r2, %[r]\n\t"
  19060. #else
  19061. "adc r2, %[r]\n\t"
  19062. #endif
  19063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19064. "adds r4, r4, r6\n\t"
  19065. #else
  19066. "add r4, r4, r6\n\t"
  19067. #endif
  19068. #ifdef WOLFSSL_KEIL
  19069. "adcs r2, r2, %[r]\n\t"
  19070. #elif defined(__clang__)
  19071. "adcs r2, %[r]\n\t"
  19072. #else
  19073. "adc r2, %[r]\n\t"
  19074. #endif
  19075. "uxth r6, r7\n\t"
  19076. #ifdef WOLFSSL_KEIL
  19077. "muls r5, r6, r5\n\t"
  19078. #elif defined(__clang__)
  19079. "muls r5, r6\n\t"
  19080. #else
  19081. "mul r5, r6\n\t"
  19082. #endif
  19083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19084. "lsrs r6, r5, #16\n\t"
  19085. #else
  19086. "lsr r6, r5, #16\n\t"
  19087. #endif
  19088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19089. "lsls r5, r5, #16\n\t"
  19090. #else
  19091. "lsl r5, r5, #16\n\t"
  19092. #endif
  19093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19094. "adds r3, r3, r5\n\t"
  19095. #else
  19096. "add r3, r3, r5\n\t"
  19097. #endif
  19098. #ifdef WOLFSSL_KEIL
  19099. "adcs r4, r4, r6\n\t"
  19100. #elif defined(__clang__)
  19101. "adcs r4, r6\n\t"
  19102. #else
  19103. "adc r4, r6\n\t"
  19104. #endif
  19105. #ifdef WOLFSSL_KEIL
  19106. "adcs r2, r2, %[r]\n\t"
  19107. #elif defined(__clang__)
  19108. "adcs r2, %[r]\n\t"
  19109. #else
  19110. "adc r2, %[r]\n\t"
  19111. #endif
  19112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19113. "adds r3, r3, r5\n\t"
  19114. #else
  19115. "add r3, r3, r5\n\t"
  19116. #endif
  19117. #ifdef WOLFSSL_KEIL
  19118. "adcs r4, r4, r6\n\t"
  19119. #elif defined(__clang__)
  19120. "adcs r4, r6\n\t"
  19121. #else
  19122. "adc r4, r6\n\t"
  19123. #endif
  19124. #ifdef WOLFSSL_KEIL
  19125. "adcs r2, r2, %[r]\n\t"
  19126. #elif defined(__clang__)
  19127. "adcs r2, %[r]\n\t"
  19128. #else
  19129. "adc r2, %[r]\n\t"
  19130. #endif
  19131. "mov %[r], r8\n\t"
  19132. "str r3, [%[r], #52]\n\t"
  19133. "movs %[r], #0\n\t"
  19134. "# A[7] * A[7]\n\t"
  19135. "mov %[a], r9\n\t"
  19136. "mov r7, lr\n\t"
  19137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19138. "lsrs r6, r7, #16\n\t"
  19139. #else
  19140. "lsr r6, r7, #16\n\t"
  19141. #endif
  19142. "uxth r5, r7\n\t"
  19143. #ifdef WOLFSSL_KEIL
  19144. "muls r5, r5, r5\n\t"
  19145. #elif defined(__clang__)
  19146. "muls r5, r5\n\t"
  19147. #else
  19148. "mul r5, r5\n\t"
  19149. #endif
  19150. #ifdef WOLFSSL_KEIL
  19151. "muls r6, r6, r6\n\t"
  19152. #elif defined(__clang__)
  19153. "muls r6, r6\n\t"
  19154. #else
  19155. "mul r6, r6\n\t"
  19156. #endif
  19157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19158. "adds r4, r4, r5\n\t"
  19159. #else
  19160. "add r4, r4, r5\n\t"
  19161. #endif
  19162. #ifdef WOLFSSL_KEIL
  19163. "adcs r2, r2, r6\n\t"
  19164. #elif defined(__clang__)
  19165. "adcs r2, r6\n\t"
  19166. #else
  19167. "adc r2, r6\n\t"
  19168. #endif
  19169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19170. "lsrs r6, r7, #16\n\t"
  19171. #else
  19172. "lsr r6, r7, #16\n\t"
  19173. #endif
  19174. "uxth r5, r7\n\t"
  19175. #ifdef WOLFSSL_KEIL
  19176. "muls r5, r6, r5\n\t"
  19177. #elif defined(__clang__)
  19178. "muls r5, r6\n\t"
  19179. #else
  19180. "mul r5, r6\n\t"
  19181. #endif
  19182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19183. "lsrs r6, r5, #15\n\t"
  19184. #else
  19185. "lsr r6, r5, #15\n\t"
  19186. #endif
  19187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19188. "lsls r5, r5, #17\n\t"
  19189. #else
  19190. "lsl r5, r5, #17\n\t"
  19191. #endif
  19192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19193. "adds r4, r4, r5\n\t"
  19194. #else
  19195. "add r4, r4, r5\n\t"
  19196. #endif
  19197. #ifdef WOLFSSL_KEIL
  19198. "adcs r2, r2, r6\n\t"
  19199. #elif defined(__clang__)
  19200. "adcs r2, r6\n\t"
  19201. #else
  19202. "adc r2, r6\n\t"
  19203. #endif
  19204. "mov %[r], r8\n\t"
  19205. "str r4, [%[r], #56]\n\t"
  19206. "str r2, [%[r], #60]\n\t"
  19207. "pop {r2, r3, r4, r5}\n\t"
  19208. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  19209. "pop {r2, r3, r4, r5}\n\t"
  19210. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  19211. : [r] "+l" (r), [a] "+l" (a)
  19212. :
  19213. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  19214. );
  19215. }
  19216. #endif /* !WOLFSSL_SP_LARGE_CODE */
  19217. /* Sub b from a into r. (r = a - b)
  19218. *
  19219. * r A single precision integer.
  19220. * a A single precision integer.
  19221. * b A single precision integer.
  19222. */
  19223. SP_NOINLINE static sp_digit sp_2048_sub_8(sp_digit* r, const sp_digit* a,
  19224. const sp_digit* b)
  19225. {
  19226. __asm__ __volatile__ (
  19227. "ldm %[b]!, {r5, r6}\n\t"
  19228. "ldm %[a]!, {r3, r4}\n\t"
  19229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19230. "subs r3, r3, r5\n\t"
  19231. #else
  19232. "sub r3, r3, r5\n\t"
  19233. #endif
  19234. #ifdef WOLFSSL_KEIL
  19235. "sbcs r4, r4, r6\n\t"
  19236. #elif defined(__clang__)
  19237. "sbcs r4, r6\n\t"
  19238. #else
  19239. "sbc r4, r6\n\t"
  19240. #endif
  19241. "stm %[r]!, {r3, r4}\n\t"
  19242. "ldm %[b]!, {r5, r6}\n\t"
  19243. "ldm %[a]!, {r3, r4}\n\t"
  19244. #ifdef WOLFSSL_KEIL
  19245. "sbcs r3, r3, r5\n\t"
  19246. #elif defined(__clang__)
  19247. "sbcs r3, r5\n\t"
  19248. #else
  19249. "sbc r3, r5\n\t"
  19250. #endif
  19251. #ifdef WOLFSSL_KEIL
  19252. "sbcs r4, r4, r6\n\t"
  19253. #elif defined(__clang__)
  19254. "sbcs r4, r6\n\t"
  19255. #else
  19256. "sbc r4, r6\n\t"
  19257. #endif
  19258. "stm %[r]!, {r3, r4}\n\t"
  19259. "ldm %[b]!, {r5, r6}\n\t"
  19260. "ldm %[a]!, {r3, r4}\n\t"
  19261. #ifdef WOLFSSL_KEIL
  19262. "sbcs r3, r3, r5\n\t"
  19263. #elif defined(__clang__)
  19264. "sbcs r3, r5\n\t"
  19265. #else
  19266. "sbc r3, r5\n\t"
  19267. #endif
  19268. #ifdef WOLFSSL_KEIL
  19269. "sbcs r4, r4, r6\n\t"
  19270. #elif defined(__clang__)
  19271. "sbcs r4, r6\n\t"
  19272. #else
  19273. "sbc r4, r6\n\t"
  19274. #endif
  19275. "stm %[r]!, {r3, r4}\n\t"
  19276. "ldm %[b]!, {r5, r6}\n\t"
  19277. "ldm %[a]!, {r3, r4}\n\t"
  19278. #ifdef WOLFSSL_KEIL
  19279. "sbcs r3, r3, r5\n\t"
  19280. #elif defined(__clang__)
  19281. "sbcs r3, r5\n\t"
  19282. #else
  19283. "sbc r3, r5\n\t"
  19284. #endif
  19285. #ifdef WOLFSSL_KEIL
  19286. "sbcs r4, r4, r6\n\t"
  19287. #elif defined(__clang__)
  19288. "sbcs r4, r6\n\t"
  19289. #else
  19290. "sbc r4, r6\n\t"
  19291. #endif
  19292. "stm %[r]!, {r3, r4}\n\t"
  19293. #ifdef WOLFSSL_KEIL
  19294. "sbcs %[r], %[r], %[r]\n\t"
  19295. #elif defined(__clang__)
  19296. "sbcs %[r], %[r]\n\t"
  19297. #else
  19298. "sbc %[r], %[r]\n\t"
  19299. #endif
  19300. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  19301. :
  19302. : "memory", "r3", "r4", "r5", "r6"
  19303. );
  19304. return (uint32_t)(size_t)r;
  19305. }
  19306. /* Square a and put result in r. (r = a * a)
  19307. *
  19308. * r A single precision integer.
  19309. * a A single precision integer.
  19310. */
  19311. SP_NOINLINE static void sp_2048_sqr_16(sp_digit* r, const sp_digit* a)
  19312. {
  19313. sp_digit* z0 = r;
  19314. sp_digit* z2 = r + 16;
  19315. sp_digit z1[16];
  19316. sp_digit* a1 = z1;
  19317. sp_digit* zero = z1 + 8;
  19318. sp_digit u;
  19319. sp_digit mask;
  19320. sp_digit* p1;
  19321. sp_digit* p2;
  19322. XMEMSET(zero, 0, sizeof(sp_digit) * 8);
  19323. mask = sp_2048_sub_8(a1, a, &a[8]);
  19324. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  19325. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  19326. (void)sp_2048_sub_8(a1, p1, p2);
  19327. sp_2048_sqr_8(z2, &a[8]);
  19328. sp_2048_sqr_8(z0, a);
  19329. sp_2048_sqr_8(z1, a1);
  19330. u = 0;
  19331. u -= sp_2048_sub_in_place_16(z1, z2);
  19332. u -= sp_2048_sub_in_place_16(z1, z0);
  19333. u += sp_2048_sub_in_place_16(r + 8, z1);
  19334. sp_2048_add_word_8(r + 24, r + 24, u);
  19335. }
  19336. /* Sub b from a into r. (r = a - b)
  19337. *
  19338. * r A single precision integer.
  19339. * a A single precision integer.
  19340. * b A single precision integer.
  19341. */
  19342. SP_NOINLINE static sp_digit sp_2048_sub_16(sp_digit* r, const sp_digit* a,
  19343. const sp_digit* b)
  19344. {
  19345. __asm__ __volatile__ (
  19346. "ldm %[b]!, {r5, r6}\n\t"
  19347. "ldm %[a]!, {r3, r4}\n\t"
  19348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19349. "subs r3, r3, r5\n\t"
  19350. #else
  19351. "sub r3, r3, r5\n\t"
  19352. #endif
  19353. #ifdef WOLFSSL_KEIL
  19354. "sbcs r4, r4, r6\n\t"
  19355. #elif defined(__clang__)
  19356. "sbcs r4, r6\n\t"
  19357. #else
  19358. "sbc r4, r6\n\t"
  19359. #endif
  19360. "stm %[r]!, {r3, r4}\n\t"
  19361. "ldm %[b]!, {r5, r6}\n\t"
  19362. "ldm %[a]!, {r3, r4}\n\t"
  19363. #ifdef WOLFSSL_KEIL
  19364. "sbcs r3, r3, r5\n\t"
  19365. #elif defined(__clang__)
  19366. "sbcs r3, r5\n\t"
  19367. #else
  19368. "sbc r3, r5\n\t"
  19369. #endif
  19370. #ifdef WOLFSSL_KEIL
  19371. "sbcs r4, r4, r6\n\t"
  19372. #elif defined(__clang__)
  19373. "sbcs r4, r6\n\t"
  19374. #else
  19375. "sbc r4, r6\n\t"
  19376. #endif
  19377. "stm %[r]!, {r3, r4}\n\t"
  19378. "ldm %[b]!, {r5, r6}\n\t"
  19379. "ldm %[a]!, {r3, r4}\n\t"
  19380. #ifdef WOLFSSL_KEIL
  19381. "sbcs r3, r3, r5\n\t"
  19382. #elif defined(__clang__)
  19383. "sbcs r3, r5\n\t"
  19384. #else
  19385. "sbc r3, r5\n\t"
  19386. #endif
  19387. #ifdef WOLFSSL_KEIL
  19388. "sbcs r4, r4, r6\n\t"
  19389. #elif defined(__clang__)
  19390. "sbcs r4, r6\n\t"
  19391. #else
  19392. "sbc r4, r6\n\t"
  19393. #endif
  19394. "stm %[r]!, {r3, r4}\n\t"
  19395. "ldm %[b]!, {r5, r6}\n\t"
  19396. "ldm %[a]!, {r3, r4}\n\t"
  19397. #ifdef WOLFSSL_KEIL
  19398. "sbcs r3, r3, r5\n\t"
  19399. #elif defined(__clang__)
  19400. "sbcs r3, r5\n\t"
  19401. #else
  19402. "sbc r3, r5\n\t"
  19403. #endif
  19404. #ifdef WOLFSSL_KEIL
  19405. "sbcs r4, r4, r6\n\t"
  19406. #elif defined(__clang__)
  19407. "sbcs r4, r6\n\t"
  19408. #else
  19409. "sbc r4, r6\n\t"
  19410. #endif
  19411. "stm %[r]!, {r3, r4}\n\t"
  19412. "ldm %[b]!, {r5, r6}\n\t"
  19413. "ldm %[a]!, {r3, r4}\n\t"
  19414. #ifdef WOLFSSL_KEIL
  19415. "sbcs r3, r3, r5\n\t"
  19416. #elif defined(__clang__)
  19417. "sbcs r3, r5\n\t"
  19418. #else
  19419. "sbc r3, r5\n\t"
  19420. #endif
  19421. #ifdef WOLFSSL_KEIL
  19422. "sbcs r4, r4, r6\n\t"
  19423. #elif defined(__clang__)
  19424. "sbcs r4, r6\n\t"
  19425. #else
  19426. "sbc r4, r6\n\t"
  19427. #endif
  19428. "stm %[r]!, {r3, r4}\n\t"
  19429. "ldm %[b]!, {r5, r6}\n\t"
  19430. "ldm %[a]!, {r3, r4}\n\t"
  19431. #ifdef WOLFSSL_KEIL
  19432. "sbcs r3, r3, r5\n\t"
  19433. #elif defined(__clang__)
  19434. "sbcs r3, r5\n\t"
  19435. #else
  19436. "sbc r3, r5\n\t"
  19437. #endif
  19438. #ifdef WOLFSSL_KEIL
  19439. "sbcs r4, r4, r6\n\t"
  19440. #elif defined(__clang__)
  19441. "sbcs r4, r6\n\t"
  19442. #else
  19443. "sbc r4, r6\n\t"
  19444. #endif
  19445. "stm %[r]!, {r3, r4}\n\t"
  19446. "ldm %[b]!, {r5, r6}\n\t"
  19447. "ldm %[a]!, {r3, r4}\n\t"
  19448. #ifdef WOLFSSL_KEIL
  19449. "sbcs r3, r3, r5\n\t"
  19450. #elif defined(__clang__)
  19451. "sbcs r3, r5\n\t"
  19452. #else
  19453. "sbc r3, r5\n\t"
  19454. #endif
  19455. #ifdef WOLFSSL_KEIL
  19456. "sbcs r4, r4, r6\n\t"
  19457. #elif defined(__clang__)
  19458. "sbcs r4, r6\n\t"
  19459. #else
  19460. "sbc r4, r6\n\t"
  19461. #endif
  19462. "stm %[r]!, {r3, r4}\n\t"
  19463. "ldm %[b]!, {r5, r6}\n\t"
  19464. "ldm %[a]!, {r3, r4}\n\t"
  19465. #ifdef WOLFSSL_KEIL
  19466. "sbcs r3, r3, r5\n\t"
  19467. #elif defined(__clang__)
  19468. "sbcs r3, r5\n\t"
  19469. #else
  19470. "sbc r3, r5\n\t"
  19471. #endif
  19472. #ifdef WOLFSSL_KEIL
  19473. "sbcs r4, r4, r6\n\t"
  19474. #elif defined(__clang__)
  19475. "sbcs r4, r6\n\t"
  19476. #else
  19477. "sbc r4, r6\n\t"
  19478. #endif
  19479. "stm %[r]!, {r3, r4}\n\t"
  19480. #ifdef WOLFSSL_KEIL
  19481. "sbcs %[r], %[r], %[r]\n\t"
  19482. #elif defined(__clang__)
  19483. "sbcs %[r], %[r]\n\t"
  19484. #else
  19485. "sbc %[r], %[r]\n\t"
  19486. #endif
  19487. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  19488. :
  19489. : "memory", "r3", "r4", "r5", "r6"
  19490. );
  19491. return (uint32_t)(size_t)r;
  19492. }
  19493. /* Square a and put result in r. (r = a * a)
  19494. *
  19495. * r A single precision integer.
  19496. * a A single precision integer.
  19497. */
  19498. SP_NOINLINE static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a)
  19499. {
  19500. sp_digit* z0 = r;
  19501. sp_digit* z2 = r + 32;
  19502. sp_digit z1[32];
  19503. sp_digit* a1 = z1;
  19504. sp_digit* zero = z1 + 16;
  19505. sp_digit u;
  19506. sp_digit mask;
  19507. sp_digit* p1;
  19508. sp_digit* p2;
  19509. XMEMSET(zero, 0, sizeof(sp_digit) * 16);
  19510. mask = sp_2048_sub_16(a1, a, &a[16]);
  19511. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  19512. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  19513. (void)sp_2048_sub_16(a1, p1, p2);
  19514. sp_2048_sqr_16(z2, &a[16]);
  19515. sp_2048_sqr_16(z0, a);
  19516. sp_2048_sqr_16(z1, a1);
  19517. u = 0;
  19518. u -= sp_2048_sub_in_place_32(z1, z2);
  19519. u -= sp_2048_sub_in_place_32(z1, z0);
  19520. u += sp_2048_sub_in_place_32(r + 16, z1);
  19521. sp_2048_add_word_16(r + 48, r + 48, u);
  19522. }
  19523. /* Sub b from a into r. (r = a - b)
  19524. *
  19525. * r A single precision integer.
  19526. * a A single precision integer.
  19527. * b A single precision integer.
  19528. */
  19529. SP_NOINLINE static sp_digit sp_2048_sub_32(sp_digit* r, const sp_digit* a,
  19530. const sp_digit* b)
  19531. {
  19532. __asm__ __volatile__ (
  19533. "ldm %[b]!, {r5, r6}\n\t"
  19534. "ldm %[a]!, {r3, r4}\n\t"
  19535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19536. "subs r3, r3, r5\n\t"
  19537. #else
  19538. "sub r3, r3, r5\n\t"
  19539. #endif
  19540. #ifdef WOLFSSL_KEIL
  19541. "sbcs r4, r4, r6\n\t"
  19542. #elif defined(__clang__)
  19543. "sbcs r4, r6\n\t"
  19544. #else
  19545. "sbc r4, r6\n\t"
  19546. #endif
  19547. "stm %[r]!, {r3, r4}\n\t"
  19548. "ldm %[b]!, {r5, r6}\n\t"
  19549. "ldm %[a]!, {r3, r4}\n\t"
  19550. #ifdef WOLFSSL_KEIL
  19551. "sbcs r3, r3, r5\n\t"
  19552. #elif defined(__clang__)
  19553. "sbcs r3, r5\n\t"
  19554. #else
  19555. "sbc r3, r5\n\t"
  19556. #endif
  19557. #ifdef WOLFSSL_KEIL
  19558. "sbcs r4, r4, r6\n\t"
  19559. #elif defined(__clang__)
  19560. "sbcs r4, r6\n\t"
  19561. #else
  19562. "sbc r4, r6\n\t"
  19563. #endif
  19564. "stm %[r]!, {r3, r4}\n\t"
  19565. "ldm %[b]!, {r5, r6}\n\t"
  19566. "ldm %[a]!, {r3, r4}\n\t"
  19567. #ifdef WOLFSSL_KEIL
  19568. "sbcs r3, r3, r5\n\t"
  19569. #elif defined(__clang__)
  19570. "sbcs r3, r5\n\t"
  19571. #else
  19572. "sbc r3, r5\n\t"
  19573. #endif
  19574. #ifdef WOLFSSL_KEIL
  19575. "sbcs r4, r4, r6\n\t"
  19576. #elif defined(__clang__)
  19577. "sbcs r4, r6\n\t"
  19578. #else
  19579. "sbc r4, r6\n\t"
  19580. #endif
  19581. "stm %[r]!, {r3, r4}\n\t"
  19582. "ldm %[b]!, {r5, r6}\n\t"
  19583. "ldm %[a]!, {r3, r4}\n\t"
  19584. #ifdef WOLFSSL_KEIL
  19585. "sbcs r3, r3, r5\n\t"
  19586. #elif defined(__clang__)
  19587. "sbcs r3, r5\n\t"
  19588. #else
  19589. "sbc r3, r5\n\t"
  19590. #endif
  19591. #ifdef WOLFSSL_KEIL
  19592. "sbcs r4, r4, r6\n\t"
  19593. #elif defined(__clang__)
  19594. "sbcs r4, r6\n\t"
  19595. #else
  19596. "sbc r4, r6\n\t"
  19597. #endif
  19598. "stm %[r]!, {r3, r4}\n\t"
  19599. "ldm %[b]!, {r5, r6}\n\t"
  19600. "ldm %[a]!, {r3, r4}\n\t"
  19601. #ifdef WOLFSSL_KEIL
  19602. "sbcs r3, r3, r5\n\t"
  19603. #elif defined(__clang__)
  19604. "sbcs r3, r5\n\t"
  19605. #else
  19606. "sbc r3, r5\n\t"
  19607. #endif
  19608. #ifdef WOLFSSL_KEIL
  19609. "sbcs r4, r4, r6\n\t"
  19610. #elif defined(__clang__)
  19611. "sbcs r4, r6\n\t"
  19612. #else
  19613. "sbc r4, r6\n\t"
  19614. #endif
  19615. "stm %[r]!, {r3, r4}\n\t"
  19616. "ldm %[b]!, {r5, r6}\n\t"
  19617. "ldm %[a]!, {r3, r4}\n\t"
  19618. #ifdef WOLFSSL_KEIL
  19619. "sbcs r3, r3, r5\n\t"
  19620. #elif defined(__clang__)
  19621. "sbcs r3, r5\n\t"
  19622. #else
  19623. "sbc r3, r5\n\t"
  19624. #endif
  19625. #ifdef WOLFSSL_KEIL
  19626. "sbcs r4, r4, r6\n\t"
  19627. #elif defined(__clang__)
  19628. "sbcs r4, r6\n\t"
  19629. #else
  19630. "sbc r4, r6\n\t"
  19631. #endif
  19632. "stm %[r]!, {r3, r4}\n\t"
  19633. "ldm %[b]!, {r5, r6}\n\t"
  19634. "ldm %[a]!, {r3, r4}\n\t"
  19635. #ifdef WOLFSSL_KEIL
  19636. "sbcs r3, r3, r5\n\t"
  19637. #elif defined(__clang__)
  19638. "sbcs r3, r5\n\t"
  19639. #else
  19640. "sbc r3, r5\n\t"
  19641. #endif
  19642. #ifdef WOLFSSL_KEIL
  19643. "sbcs r4, r4, r6\n\t"
  19644. #elif defined(__clang__)
  19645. "sbcs r4, r6\n\t"
  19646. #else
  19647. "sbc r4, r6\n\t"
  19648. #endif
  19649. "stm %[r]!, {r3, r4}\n\t"
  19650. "ldm %[b]!, {r5, r6}\n\t"
  19651. "ldm %[a]!, {r3, r4}\n\t"
  19652. #ifdef WOLFSSL_KEIL
  19653. "sbcs r3, r3, r5\n\t"
  19654. #elif defined(__clang__)
  19655. "sbcs r3, r5\n\t"
  19656. #else
  19657. "sbc r3, r5\n\t"
  19658. #endif
  19659. #ifdef WOLFSSL_KEIL
  19660. "sbcs r4, r4, r6\n\t"
  19661. #elif defined(__clang__)
  19662. "sbcs r4, r6\n\t"
  19663. #else
  19664. "sbc r4, r6\n\t"
  19665. #endif
  19666. "stm %[r]!, {r3, r4}\n\t"
  19667. "ldm %[b]!, {r5, r6}\n\t"
  19668. "ldm %[a]!, {r3, r4}\n\t"
  19669. #ifdef WOLFSSL_KEIL
  19670. "sbcs r3, r3, r5\n\t"
  19671. #elif defined(__clang__)
  19672. "sbcs r3, r5\n\t"
  19673. #else
  19674. "sbc r3, r5\n\t"
  19675. #endif
  19676. #ifdef WOLFSSL_KEIL
  19677. "sbcs r4, r4, r6\n\t"
  19678. #elif defined(__clang__)
  19679. "sbcs r4, r6\n\t"
  19680. #else
  19681. "sbc r4, r6\n\t"
  19682. #endif
  19683. "stm %[r]!, {r3, r4}\n\t"
  19684. "ldm %[b]!, {r5, r6}\n\t"
  19685. "ldm %[a]!, {r3, r4}\n\t"
  19686. #ifdef WOLFSSL_KEIL
  19687. "sbcs r3, r3, r5\n\t"
  19688. #elif defined(__clang__)
  19689. "sbcs r3, r5\n\t"
  19690. #else
  19691. "sbc r3, r5\n\t"
  19692. #endif
  19693. #ifdef WOLFSSL_KEIL
  19694. "sbcs r4, r4, r6\n\t"
  19695. #elif defined(__clang__)
  19696. "sbcs r4, r6\n\t"
  19697. #else
  19698. "sbc r4, r6\n\t"
  19699. #endif
  19700. "stm %[r]!, {r3, r4}\n\t"
  19701. "ldm %[b]!, {r5, r6}\n\t"
  19702. "ldm %[a]!, {r3, r4}\n\t"
  19703. #ifdef WOLFSSL_KEIL
  19704. "sbcs r3, r3, r5\n\t"
  19705. #elif defined(__clang__)
  19706. "sbcs r3, r5\n\t"
  19707. #else
  19708. "sbc r3, r5\n\t"
  19709. #endif
  19710. #ifdef WOLFSSL_KEIL
  19711. "sbcs r4, r4, r6\n\t"
  19712. #elif defined(__clang__)
  19713. "sbcs r4, r6\n\t"
  19714. #else
  19715. "sbc r4, r6\n\t"
  19716. #endif
  19717. "stm %[r]!, {r3, r4}\n\t"
  19718. "ldm %[b]!, {r5, r6}\n\t"
  19719. "ldm %[a]!, {r3, r4}\n\t"
  19720. #ifdef WOLFSSL_KEIL
  19721. "sbcs r3, r3, r5\n\t"
  19722. #elif defined(__clang__)
  19723. "sbcs r3, r5\n\t"
  19724. #else
  19725. "sbc r3, r5\n\t"
  19726. #endif
  19727. #ifdef WOLFSSL_KEIL
  19728. "sbcs r4, r4, r6\n\t"
  19729. #elif defined(__clang__)
  19730. "sbcs r4, r6\n\t"
  19731. #else
  19732. "sbc r4, r6\n\t"
  19733. #endif
  19734. "stm %[r]!, {r3, r4}\n\t"
  19735. "ldm %[b]!, {r5, r6}\n\t"
  19736. "ldm %[a]!, {r3, r4}\n\t"
  19737. #ifdef WOLFSSL_KEIL
  19738. "sbcs r3, r3, r5\n\t"
  19739. #elif defined(__clang__)
  19740. "sbcs r3, r5\n\t"
  19741. #else
  19742. "sbc r3, r5\n\t"
  19743. #endif
  19744. #ifdef WOLFSSL_KEIL
  19745. "sbcs r4, r4, r6\n\t"
  19746. #elif defined(__clang__)
  19747. "sbcs r4, r6\n\t"
  19748. #else
  19749. "sbc r4, r6\n\t"
  19750. #endif
  19751. "stm %[r]!, {r3, r4}\n\t"
  19752. "ldm %[b]!, {r5, r6}\n\t"
  19753. "ldm %[a]!, {r3, r4}\n\t"
  19754. #ifdef WOLFSSL_KEIL
  19755. "sbcs r3, r3, r5\n\t"
  19756. #elif defined(__clang__)
  19757. "sbcs r3, r5\n\t"
  19758. #else
  19759. "sbc r3, r5\n\t"
  19760. #endif
  19761. #ifdef WOLFSSL_KEIL
  19762. "sbcs r4, r4, r6\n\t"
  19763. #elif defined(__clang__)
  19764. "sbcs r4, r6\n\t"
  19765. #else
  19766. "sbc r4, r6\n\t"
  19767. #endif
  19768. "stm %[r]!, {r3, r4}\n\t"
  19769. "ldm %[b]!, {r5, r6}\n\t"
  19770. "ldm %[a]!, {r3, r4}\n\t"
  19771. #ifdef WOLFSSL_KEIL
  19772. "sbcs r3, r3, r5\n\t"
  19773. #elif defined(__clang__)
  19774. "sbcs r3, r5\n\t"
  19775. #else
  19776. "sbc r3, r5\n\t"
  19777. #endif
  19778. #ifdef WOLFSSL_KEIL
  19779. "sbcs r4, r4, r6\n\t"
  19780. #elif defined(__clang__)
  19781. "sbcs r4, r6\n\t"
  19782. #else
  19783. "sbc r4, r6\n\t"
  19784. #endif
  19785. "stm %[r]!, {r3, r4}\n\t"
  19786. "ldm %[b]!, {r5, r6}\n\t"
  19787. "ldm %[a]!, {r3, r4}\n\t"
  19788. #ifdef WOLFSSL_KEIL
  19789. "sbcs r3, r3, r5\n\t"
  19790. #elif defined(__clang__)
  19791. "sbcs r3, r5\n\t"
  19792. #else
  19793. "sbc r3, r5\n\t"
  19794. #endif
  19795. #ifdef WOLFSSL_KEIL
  19796. "sbcs r4, r4, r6\n\t"
  19797. #elif defined(__clang__)
  19798. "sbcs r4, r6\n\t"
  19799. #else
  19800. "sbc r4, r6\n\t"
  19801. #endif
  19802. "stm %[r]!, {r3, r4}\n\t"
  19803. #ifdef WOLFSSL_KEIL
  19804. "sbcs %[r], %[r], %[r]\n\t"
  19805. #elif defined(__clang__)
  19806. "sbcs %[r], %[r]\n\t"
  19807. #else
  19808. "sbc %[r], %[r]\n\t"
  19809. #endif
  19810. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  19811. :
  19812. : "memory", "r3", "r4", "r5", "r6"
  19813. );
  19814. return (uint32_t)(size_t)r;
  19815. }
  19816. /* Square a and put result in r. (r = a * a)
  19817. *
  19818. * r A single precision integer.
  19819. * a A single precision integer.
  19820. */
  19821. SP_NOINLINE static void sp_2048_sqr_64(sp_digit* r, const sp_digit* a)
  19822. {
  19823. sp_digit* z0 = r;
  19824. sp_digit* z2 = r + 64;
  19825. sp_digit z1[64];
  19826. sp_digit* a1 = z1;
  19827. sp_digit* zero = z1 + 32;
  19828. sp_digit u;
  19829. sp_digit mask;
  19830. sp_digit* p1;
  19831. sp_digit* p2;
  19832. XMEMSET(zero, 0, sizeof(sp_digit) * 32);
  19833. mask = sp_2048_sub_32(a1, a, &a[32]);
  19834. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  19835. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  19836. (void)sp_2048_sub_32(a1, p1, p2);
  19837. sp_2048_sqr_32(z2, &a[32]);
  19838. sp_2048_sqr_32(z0, a);
  19839. sp_2048_sqr_32(z1, a1);
  19840. u = 0;
  19841. u -= sp_2048_sub_in_place_64(z1, z2);
  19842. u -= sp_2048_sub_in_place_64(z1, z0);
  19843. u += sp_2048_sub_in_place_64(r + 32, z1);
  19844. sp_2048_add_word_32(r + 96, r + 96, u);
  19845. }
  19846. #endif /* !WOLFSSL_SP_SMALL */
  19847. #ifdef WOLFSSL_SP_SMALL
  19848. /* Add b to a into r. (r = a + b)
  19849. *
  19850. * r A single precision integer.
  19851. * a A single precision integer.
  19852. * b A single precision integer.
  19853. */
  19854. SP_NOINLINE static sp_digit sp_2048_add_64(sp_digit* r, const sp_digit* a,
  19855. const sp_digit* b)
  19856. {
  19857. __asm__ __volatile__ (
  19858. "movs r6, %[a]\n\t"
  19859. "movs r7, #0\n\t"
  19860. "movs r3, #0\n\t"
  19861. "movs r4, #0xff\n\t"
  19862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19863. "adds r4, r4, #1\n\t"
  19864. #else
  19865. "add r4, r4, #1\n\t"
  19866. #endif
  19867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19868. "subs r7, r7, #1\n\t"
  19869. #else
  19870. "sub r7, r7, #1\n\t"
  19871. #endif
  19872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19873. "adds r6, r6, r4\n\t"
  19874. #else
  19875. "add r6, r6, r4\n\t"
  19876. #endif
  19877. "\n"
  19878. "L_sp_2048_add_64_word_%=:\n\t"
  19879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19880. "adds r3, r3, r7\n\t"
  19881. #else
  19882. "add r3, r3, r7\n\t"
  19883. #endif
  19884. "ldr r4, [%[a]]\n\t"
  19885. "ldr r5, [%[b]]\n\t"
  19886. #ifdef WOLFSSL_KEIL
  19887. "adcs r4, r4, r5\n\t"
  19888. #elif defined(__clang__)
  19889. "adcs r4, r5\n\t"
  19890. #else
  19891. "adc r4, r5\n\t"
  19892. #endif
  19893. "str r4, [%[r]]\n\t"
  19894. "movs r3, #0\n\t"
  19895. #ifdef WOLFSSL_KEIL
  19896. "adcs r3, r3, r3\n\t"
  19897. #elif defined(__clang__)
  19898. "adcs r3, r3\n\t"
  19899. #else
  19900. "adc r3, r3\n\t"
  19901. #endif
  19902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19903. "adds %[a], %[a], #4\n\t"
  19904. #else
  19905. "add %[a], %[a], #4\n\t"
  19906. #endif
  19907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19908. "adds %[b], %[b], #4\n\t"
  19909. #else
  19910. "add %[b], %[b], #4\n\t"
  19911. #endif
  19912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19913. "adds %[r], %[r], #4\n\t"
  19914. #else
  19915. "add %[r], %[r], #4\n\t"
  19916. #endif
  19917. "cmp %[a], r6\n\t"
  19918. "bne L_sp_2048_add_64_word_%=\n\t"
  19919. "movs %[r], r3\n\t"
  19920. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  19921. :
  19922. : "memory", "r3", "r4", "r5", "r6", "r7"
  19923. );
  19924. return (uint32_t)(size_t)r;
  19925. }
  19926. #endif /* WOLFSSL_SP_SMALL */
  19927. #ifdef WOLFSSL_SP_SMALL
  19928. /* Sub b from a into a. (a -= b)
  19929. *
  19930. * a A single precision integer.
  19931. * b A single precision integer.
  19932. */
  19933. SP_NOINLINE static sp_digit sp_2048_sub_in_place_64(sp_digit* a,
  19934. const sp_digit* b)
  19935. {
  19936. __asm__ __volatile__ (
  19937. "movs r7, %[a]\n\t"
  19938. "movs r2, #0\n\t"
  19939. "movs r5, #0xff\n\t"
  19940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19941. "adds r5, r5, #1\n\t"
  19942. #else
  19943. "add r5, r5, #1\n\t"
  19944. #endif
  19945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19946. "adds r7, r7, r5\n\t"
  19947. #else
  19948. "add r7, r7, r5\n\t"
  19949. #endif
  19950. "\n"
  19951. "L_sp_2048_sub_in_place_64_words_%=:\n\t"
  19952. "movs r5, #0\n\t"
  19953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19954. "subs r5, r5, r2\n\t"
  19955. #else
  19956. "sub r5, r5, r2\n\t"
  19957. #endif
  19958. "ldr r3, [%[a]]\n\t"
  19959. "ldr r4, [%[a], #4]\n\t"
  19960. "ldr r5, [%[b]]\n\t"
  19961. "ldr r6, [%[b], #4]\n\t"
  19962. #ifdef WOLFSSL_KEIL
  19963. "sbcs r3, r3, r5\n\t"
  19964. #elif defined(__clang__)
  19965. "sbcs r3, r5\n\t"
  19966. #else
  19967. "sbc r3, r5\n\t"
  19968. #endif
  19969. #ifdef WOLFSSL_KEIL
  19970. "sbcs r4, r4, r6\n\t"
  19971. #elif defined(__clang__)
  19972. "sbcs r4, r6\n\t"
  19973. #else
  19974. "sbc r4, r6\n\t"
  19975. #endif
  19976. "str r3, [%[a]]\n\t"
  19977. "str r4, [%[a], #4]\n\t"
  19978. #ifdef WOLFSSL_KEIL
  19979. "sbcs r2, r2, r2\n\t"
  19980. #elif defined(__clang__)
  19981. "sbcs r2, r2\n\t"
  19982. #else
  19983. "sbc r2, r2\n\t"
  19984. #endif
  19985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19986. "adds %[a], %[a], #8\n\t"
  19987. #else
  19988. "add %[a], %[a], #8\n\t"
  19989. #endif
  19990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19991. "adds %[b], %[b], #8\n\t"
  19992. #else
  19993. "add %[b], %[b], #8\n\t"
  19994. #endif
  19995. "cmp %[a], r7\n\t"
  19996. "bne L_sp_2048_sub_in_place_64_words_%=\n\t"
  19997. "movs %[a], r2\n\t"
  19998. : [a] "+l" (a), [b] "+l" (b)
  19999. :
  20000. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  20001. );
  20002. return (uint32_t)(size_t)a;
  20003. }
  20004. #endif /* WOLFSSL_SP_SMALL */
  20005. #ifdef WOLFSSL_SP_SMALL
  20006. /* Multiply a and b into r. (r = a * b)
  20007. *
  20008. * r A single precision integer.
  20009. * a A single precision integer.
  20010. * b A single precision integer.
  20011. */
  20012. SP_NOINLINE static void sp_2048_mul_64(sp_digit* r, const sp_digit* a,
  20013. const sp_digit* b)
  20014. {
  20015. sp_digit t[64 * 2];
  20016. sp_digit* tmp = t;
  20017. __asm__ __volatile__ (
  20018. "movs r3, #0\n\t"
  20019. "movs r4, #0\n\t"
  20020. "mov r8, r3\n\t"
  20021. "mov r11, %[tmp]\n\t"
  20022. "mov r9, %[a]\n\t"
  20023. "mov r10, %[b]\n\t"
  20024. "movs r6, #0xff\n\t"
  20025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20026. "adds r6, r6, #1\n\t"
  20027. #else
  20028. "add r6, r6, #1\n\t"
  20029. #endif
  20030. "add r6, r6, r9\n\t"
  20031. "mov r12, r6\n\t"
  20032. "\n"
  20033. "L_sp_2048_mul_64_words_%=:\n\t"
  20034. "movs %[tmp], #0\n\t"
  20035. "movs r5, #0\n\t"
  20036. "movs r6, #0xfc\n\t"
  20037. "mov %[a], r8\n\t"
  20038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20039. "subs %[a], %[a], r6\n\t"
  20040. #else
  20041. "sub %[a], %[a], r6\n\t"
  20042. #endif
  20043. #ifdef WOLFSSL_KEIL
  20044. "sbcs r6, r6, r6\n\t"
  20045. #elif defined(__clang__)
  20046. "sbcs r6, r6\n\t"
  20047. #else
  20048. "sbc r6, r6\n\t"
  20049. #endif
  20050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20051. "mvns r6, r6\n\t"
  20052. #else
  20053. "mvn r6, r6\n\t"
  20054. #endif
  20055. #ifdef WOLFSSL_KEIL
  20056. "ands %[a], %[a], r6\n\t"
  20057. #elif defined(__clang__)
  20058. "ands %[a], r6\n\t"
  20059. #else
  20060. "and %[a], r6\n\t"
  20061. #endif
  20062. "mov %[b], r8\n\t"
  20063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20064. "subs %[b], %[b], %[a]\n\t"
  20065. #else
  20066. "sub %[b], %[b], %[a]\n\t"
  20067. #endif
  20068. "add %[a], %[a], r9\n\t"
  20069. "add %[b], %[b], r10\n\t"
  20070. "\n"
  20071. "L_sp_2048_mul_64_mul_%=:\n\t"
  20072. "# Multiply Start\n\t"
  20073. "ldrh r6, [%[a]]\n\t"
  20074. "ldrh r7, [%[b]]\n\t"
  20075. #ifdef WOLFSSL_KEIL
  20076. "muls r7, r6, r7\n\t"
  20077. #elif defined(__clang__)
  20078. "muls r7, r6\n\t"
  20079. #else
  20080. "mul r7, r6\n\t"
  20081. #endif
  20082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20083. "adds r3, r3, r7\n\t"
  20084. #else
  20085. "add r3, r3, r7\n\t"
  20086. #endif
  20087. #ifdef WOLFSSL_KEIL
  20088. "adcs r4, r4, %[tmp]\n\t"
  20089. #elif defined(__clang__)
  20090. "adcs r4, %[tmp]\n\t"
  20091. #else
  20092. "adc r4, %[tmp]\n\t"
  20093. #endif
  20094. #ifdef WOLFSSL_KEIL
  20095. "adcs r5, r5, %[tmp]\n\t"
  20096. #elif defined(__clang__)
  20097. "adcs r5, %[tmp]\n\t"
  20098. #else
  20099. "adc r5, %[tmp]\n\t"
  20100. #endif
  20101. "ldr r7, [%[b]]\n\t"
  20102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20103. "lsrs r7, r7, #16\n\t"
  20104. #else
  20105. "lsr r7, r7, #16\n\t"
  20106. #endif
  20107. #ifdef WOLFSSL_KEIL
  20108. "muls r6, r7, r6\n\t"
  20109. #elif defined(__clang__)
  20110. "muls r6, r7\n\t"
  20111. #else
  20112. "mul r6, r7\n\t"
  20113. #endif
  20114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20115. "lsrs r7, r6, #16\n\t"
  20116. #else
  20117. "lsr r7, r6, #16\n\t"
  20118. #endif
  20119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20120. "lsls r6, r6, #16\n\t"
  20121. #else
  20122. "lsl r6, r6, #16\n\t"
  20123. #endif
  20124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20125. "adds r3, r3, r6\n\t"
  20126. #else
  20127. "add r3, r3, r6\n\t"
  20128. #endif
  20129. #ifdef WOLFSSL_KEIL
  20130. "adcs r4, r4, r7\n\t"
  20131. #elif defined(__clang__)
  20132. "adcs r4, r7\n\t"
  20133. #else
  20134. "adc r4, r7\n\t"
  20135. #endif
  20136. #ifdef WOLFSSL_KEIL
  20137. "adcs r5, r5, %[tmp]\n\t"
  20138. #elif defined(__clang__)
  20139. "adcs r5, %[tmp]\n\t"
  20140. #else
  20141. "adc r5, %[tmp]\n\t"
  20142. #endif
  20143. "ldr r6, [%[a]]\n\t"
  20144. "ldr r7, [%[b]]\n\t"
  20145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20146. "lsrs r6, r6, #16\n\t"
  20147. #else
  20148. "lsr r6, r6, #16\n\t"
  20149. #endif
  20150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20151. "lsrs r7, r7, #16\n\t"
  20152. #else
  20153. "lsr r7, r7, #16\n\t"
  20154. #endif
  20155. #ifdef WOLFSSL_KEIL
  20156. "muls r7, r6, r7\n\t"
  20157. #elif defined(__clang__)
  20158. "muls r7, r6\n\t"
  20159. #else
  20160. "mul r7, r6\n\t"
  20161. #endif
  20162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20163. "adds r4, r4, r7\n\t"
  20164. #else
  20165. "add r4, r4, r7\n\t"
  20166. #endif
  20167. #ifdef WOLFSSL_KEIL
  20168. "adcs r5, r5, %[tmp]\n\t"
  20169. #elif defined(__clang__)
  20170. "adcs r5, %[tmp]\n\t"
  20171. #else
  20172. "adc r5, %[tmp]\n\t"
  20173. #endif
  20174. "ldrh r7, [%[b]]\n\t"
  20175. #ifdef WOLFSSL_KEIL
  20176. "muls r6, r7, r6\n\t"
  20177. #elif defined(__clang__)
  20178. "muls r6, r7\n\t"
  20179. #else
  20180. "mul r6, r7\n\t"
  20181. #endif
  20182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20183. "lsrs r7, r6, #16\n\t"
  20184. #else
  20185. "lsr r7, r6, #16\n\t"
  20186. #endif
  20187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20188. "lsls r6, r6, #16\n\t"
  20189. #else
  20190. "lsl r6, r6, #16\n\t"
  20191. #endif
  20192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20193. "adds r3, r3, r6\n\t"
  20194. #else
  20195. "add r3, r3, r6\n\t"
  20196. #endif
  20197. #ifdef WOLFSSL_KEIL
  20198. "adcs r4, r4, r7\n\t"
  20199. #elif defined(__clang__)
  20200. "adcs r4, r7\n\t"
  20201. #else
  20202. "adc r4, r7\n\t"
  20203. #endif
  20204. #ifdef WOLFSSL_KEIL
  20205. "adcs r5, r5, %[tmp]\n\t"
  20206. #elif defined(__clang__)
  20207. "adcs r5, %[tmp]\n\t"
  20208. #else
  20209. "adc r5, %[tmp]\n\t"
  20210. #endif
  20211. "# Multiply Done\n\t"
  20212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20213. "adds %[a], %[a], #4\n\t"
  20214. #else
  20215. "add %[a], %[a], #4\n\t"
  20216. #endif
  20217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20218. "subs %[b], %[b], #4\n\t"
  20219. #else
  20220. "sub %[b], %[b], #4\n\t"
  20221. #endif
  20222. "cmp %[a], r12\n\t"
  20223. "beq L_sp_2048_mul_64_done_mul_%=\n\t"
  20224. "mov r6, r8\n\t"
  20225. "add r6, r6, r9\n\t"
  20226. "cmp %[a], r6\n\t"
  20227. "ble L_sp_2048_mul_64_mul_%=\n\t"
  20228. "\n"
  20229. "L_sp_2048_mul_64_done_mul_%=:\n\t"
  20230. "mov %[tmp], r11\n\t"
  20231. "mov r7, r8\n\t"
  20232. "str r3, [%[tmp], r7]\n\t"
  20233. "movs r3, r4\n\t"
  20234. "movs r4, r5\n\t"
  20235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20236. "adds r7, r7, #4\n\t"
  20237. #else
  20238. "add r7, r7, #4\n\t"
  20239. #endif
  20240. "mov r8, r7\n\t"
  20241. "movs r6, #0xff\n\t"
  20242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20243. "adds r6, r6, #0xf9\n\t"
  20244. #else
  20245. "add r6, r6, #0xf9\n\t"
  20246. #endif
  20247. "cmp r7, r6\n\t"
  20248. "ble L_sp_2048_mul_64_words_%=\n\t"
  20249. "str r3, [%[tmp], r7]\n\t"
  20250. "mov %[a], r9\n\t"
  20251. "mov %[b], r10\n\t"
  20252. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  20253. :
  20254. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  20255. );
  20256. XMEMCPY(r, t, sizeof(t));
  20257. }
  20258. /* Square a and put result in r. (r = a * a)
  20259. *
  20260. * r A single precision integer.
  20261. * a A single precision integer.
  20262. */
  20263. SP_NOINLINE static void sp_2048_sqr_64(sp_digit* r, const sp_digit* a)
  20264. {
  20265. __asm__ __volatile__ (
  20266. "movs r3, #0\n\t"
  20267. "movs r4, #0\n\t"
  20268. "movs r5, #0\n\t"
  20269. "mov r8, r3\n\t"
  20270. "mov r11, %[r]\n\t"
  20271. "movs r6, #2\n\t"
  20272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20273. "lsls r6, r6, #8\n\t"
  20274. #else
  20275. "lsl r6, r6, #8\n\t"
  20276. #endif
  20277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20278. "negs r6, r6\n\t"
  20279. #else
  20280. "neg r6, r6\n\t"
  20281. #endif
  20282. "add sp, sp, r6\n\t"
  20283. "mov r10, sp\n\t"
  20284. "mov r9, %[a]\n\t"
  20285. "\n"
  20286. "L_sp_2048_sqr_64_words_%=:\n\t"
  20287. "movs %[r], #0\n\t"
  20288. "movs r6, #0xfc\n\t"
  20289. "mov %[a], r8\n\t"
  20290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20291. "subs %[a], %[a], r6\n\t"
  20292. #else
  20293. "sub %[a], %[a], r6\n\t"
  20294. #endif
  20295. #ifdef WOLFSSL_KEIL
  20296. "sbcs r6, r6, r6\n\t"
  20297. #elif defined(__clang__)
  20298. "sbcs r6, r6\n\t"
  20299. #else
  20300. "sbc r6, r6\n\t"
  20301. #endif
  20302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20303. "mvns r6, r6\n\t"
  20304. #else
  20305. "mvn r6, r6\n\t"
  20306. #endif
  20307. #ifdef WOLFSSL_KEIL
  20308. "ands %[a], %[a], r6\n\t"
  20309. #elif defined(__clang__)
  20310. "ands %[a], r6\n\t"
  20311. #else
  20312. "and %[a], r6\n\t"
  20313. #endif
  20314. "mov r2, r8\n\t"
  20315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20316. "subs r2, r2, %[a]\n\t"
  20317. #else
  20318. "sub r2, r2, %[a]\n\t"
  20319. #endif
  20320. "add %[a], %[a], r9\n\t"
  20321. "add r2, r2, r9\n\t"
  20322. "\n"
  20323. "L_sp_2048_sqr_64_mul_%=:\n\t"
  20324. "cmp r2, %[a]\n\t"
  20325. "beq L_sp_2048_sqr_64_sqr_%=\n\t"
  20326. "# Multiply * 2: Start\n\t"
  20327. "ldrh r6, [%[a]]\n\t"
  20328. "ldrh r7, [r2]\n\t"
  20329. #ifdef WOLFSSL_KEIL
  20330. "muls r7, r6, r7\n\t"
  20331. #elif defined(__clang__)
  20332. "muls r7, r6\n\t"
  20333. #else
  20334. "mul r7, r6\n\t"
  20335. #endif
  20336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20337. "adds r3, r3, r7\n\t"
  20338. #else
  20339. "add r3, r3, r7\n\t"
  20340. #endif
  20341. #ifdef WOLFSSL_KEIL
  20342. "adcs r4, r4, %[r]\n\t"
  20343. #elif defined(__clang__)
  20344. "adcs r4, %[r]\n\t"
  20345. #else
  20346. "adc r4, %[r]\n\t"
  20347. #endif
  20348. #ifdef WOLFSSL_KEIL
  20349. "adcs r5, r5, %[r]\n\t"
  20350. #elif defined(__clang__)
  20351. "adcs r5, %[r]\n\t"
  20352. #else
  20353. "adc r5, %[r]\n\t"
  20354. #endif
  20355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20356. "adds r3, r3, r7\n\t"
  20357. #else
  20358. "add r3, r3, r7\n\t"
  20359. #endif
  20360. #ifdef WOLFSSL_KEIL
  20361. "adcs r4, r4, %[r]\n\t"
  20362. #elif defined(__clang__)
  20363. "adcs r4, %[r]\n\t"
  20364. #else
  20365. "adc r4, %[r]\n\t"
  20366. #endif
  20367. #ifdef WOLFSSL_KEIL
  20368. "adcs r5, r5, %[r]\n\t"
  20369. #elif defined(__clang__)
  20370. "adcs r5, %[r]\n\t"
  20371. #else
  20372. "adc r5, %[r]\n\t"
  20373. #endif
  20374. "ldr r7, [r2]\n\t"
  20375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20376. "lsrs r7, r7, #16\n\t"
  20377. #else
  20378. "lsr r7, r7, #16\n\t"
  20379. #endif
  20380. #ifdef WOLFSSL_KEIL
  20381. "muls r6, r7, r6\n\t"
  20382. #elif defined(__clang__)
  20383. "muls r6, r7\n\t"
  20384. #else
  20385. "mul r6, r7\n\t"
  20386. #endif
  20387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20388. "lsrs r7, r6, #16\n\t"
  20389. #else
  20390. "lsr r7, r6, #16\n\t"
  20391. #endif
  20392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20393. "lsls r6, r6, #16\n\t"
  20394. #else
  20395. "lsl r6, r6, #16\n\t"
  20396. #endif
  20397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20398. "adds r3, r3, r6\n\t"
  20399. #else
  20400. "add r3, r3, r6\n\t"
  20401. #endif
  20402. #ifdef WOLFSSL_KEIL
  20403. "adcs r4, r4, r7\n\t"
  20404. #elif defined(__clang__)
  20405. "adcs r4, r7\n\t"
  20406. #else
  20407. "adc r4, r7\n\t"
  20408. #endif
  20409. #ifdef WOLFSSL_KEIL
  20410. "adcs r5, r5, %[r]\n\t"
  20411. #elif defined(__clang__)
  20412. "adcs r5, %[r]\n\t"
  20413. #else
  20414. "adc r5, %[r]\n\t"
  20415. #endif
  20416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20417. "adds r3, r3, r6\n\t"
  20418. #else
  20419. "add r3, r3, r6\n\t"
  20420. #endif
  20421. #ifdef WOLFSSL_KEIL
  20422. "adcs r4, r4, r7\n\t"
  20423. #elif defined(__clang__)
  20424. "adcs r4, r7\n\t"
  20425. #else
  20426. "adc r4, r7\n\t"
  20427. #endif
  20428. #ifdef WOLFSSL_KEIL
  20429. "adcs r5, r5, %[r]\n\t"
  20430. #elif defined(__clang__)
  20431. "adcs r5, %[r]\n\t"
  20432. #else
  20433. "adc r5, %[r]\n\t"
  20434. #endif
  20435. "ldr r6, [%[a]]\n\t"
  20436. "ldr r7, [r2]\n\t"
  20437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20438. "lsrs r6, r6, #16\n\t"
  20439. #else
  20440. "lsr r6, r6, #16\n\t"
  20441. #endif
  20442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20443. "lsrs r7, r7, #16\n\t"
  20444. #else
  20445. "lsr r7, r7, #16\n\t"
  20446. #endif
  20447. #ifdef WOLFSSL_KEIL
  20448. "muls r7, r6, r7\n\t"
  20449. #elif defined(__clang__)
  20450. "muls r7, r6\n\t"
  20451. #else
  20452. "mul r7, r6\n\t"
  20453. #endif
  20454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20455. "adds r4, r4, r7\n\t"
  20456. #else
  20457. "add r4, r4, r7\n\t"
  20458. #endif
  20459. #ifdef WOLFSSL_KEIL
  20460. "adcs r5, r5, %[r]\n\t"
  20461. #elif defined(__clang__)
  20462. "adcs r5, %[r]\n\t"
  20463. #else
  20464. "adc r5, %[r]\n\t"
  20465. #endif
  20466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20467. "adds r4, r4, r7\n\t"
  20468. #else
  20469. "add r4, r4, r7\n\t"
  20470. #endif
  20471. #ifdef WOLFSSL_KEIL
  20472. "adcs r5, r5, %[r]\n\t"
  20473. #elif defined(__clang__)
  20474. "adcs r5, %[r]\n\t"
  20475. #else
  20476. "adc r5, %[r]\n\t"
  20477. #endif
  20478. "ldrh r7, [r2]\n\t"
  20479. #ifdef WOLFSSL_KEIL
  20480. "muls r6, r7, r6\n\t"
  20481. #elif defined(__clang__)
  20482. "muls r6, r7\n\t"
  20483. #else
  20484. "mul r6, r7\n\t"
  20485. #endif
  20486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20487. "lsrs r7, r6, #16\n\t"
  20488. #else
  20489. "lsr r7, r6, #16\n\t"
  20490. #endif
  20491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20492. "lsls r6, r6, #16\n\t"
  20493. #else
  20494. "lsl r6, r6, #16\n\t"
  20495. #endif
  20496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20497. "adds r3, r3, r6\n\t"
  20498. #else
  20499. "add r3, r3, r6\n\t"
  20500. #endif
  20501. #ifdef WOLFSSL_KEIL
  20502. "adcs r4, r4, r7\n\t"
  20503. #elif defined(__clang__)
  20504. "adcs r4, r7\n\t"
  20505. #else
  20506. "adc r4, r7\n\t"
  20507. #endif
  20508. #ifdef WOLFSSL_KEIL
  20509. "adcs r5, r5, %[r]\n\t"
  20510. #elif defined(__clang__)
  20511. "adcs r5, %[r]\n\t"
  20512. #else
  20513. "adc r5, %[r]\n\t"
  20514. #endif
  20515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20516. "adds r3, r3, r6\n\t"
  20517. #else
  20518. "add r3, r3, r6\n\t"
  20519. #endif
  20520. #ifdef WOLFSSL_KEIL
  20521. "adcs r4, r4, r7\n\t"
  20522. #elif defined(__clang__)
  20523. "adcs r4, r7\n\t"
  20524. #else
  20525. "adc r4, r7\n\t"
  20526. #endif
  20527. #ifdef WOLFSSL_KEIL
  20528. "adcs r5, r5, %[r]\n\t"
  20529. #elif defined(__clang__)
  20530. "adcs r5, %[r]\n\t"
  20531. #else
  20532. "adc r5, %[r]\n\t"
  20533. #endif
  20534. "# Multiply * 2: Done\n\t"
  20535. "bal L_sp_2048_sqr_64_done_sqr_%=\n\t"
  20536. "\n"
  20537. "L_sp_2048_sqr_64_sqr_%=:\n\t"
  20538. "mov r12, r2\n\t"
  20539. "ldr r2, [%[a]]\n\t"
  20540. "# Square: Start\n\t"
  20541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20542. "lsrs r7, r2, #16\n\t"
  20543. #else
  20544. "lsr r7, r2, #16\n\t"
  20545. #endif
  20546. "uxth r6, r2\n\t"
  20547. #ifdef WOLFSSL_KEIL
  20548. "muls r6, r6, r6\n\t"
  20549. #elif defined(__clang__)
  20550. "muls r6, r6\n\t"
  20551. #else
  20552. "mul r6, r6\n\t"
  20553. #endif
  20554. #ifdef WOLFSSL_KEIL
  20555. "muls r7, r7, r7\n\t"
  20556. #elif defined(__clang__)
  20557. "muls r7, r7\n\t"
  20558. #else
  20559. "mul r7, r7\n\t"
  20560. #endif
  20561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20562. "adds r3, r3, r6\n\t"
  20563. #else
  20564. "add r3, r3, r6\n\t"
  20565. #endif
  20566. #ifdef WOLFSSL_KEIL
  20567. "adcs r4, r4, r7\n\t"
  20568. #elif defined(__clang__)
  20569. "adcs r4, r7\n\t"
  20570. #else
  20571. "adc r4, r7\n\t"
  20572. #endif
  20573. #ifdef WOLFSSL_KEIL
  20574. "adcs r5, r5, %[r]\n\t"
  20575. #elif defined(__clang__)
  20576. "adcs r5, %[r]\n\t"
  20577. #else
  20578. "adc r5, %[r]\n\t"
  20579. #endif
  20580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20581. "lsrs r7, r2, #16\n\t"
  20582. #else
  20583. "lsr r7, r2, #16\n\t"
  20584. #endif
  20585. "uxth r6, r2\n\t"
  20586. #ifdef WOLFSSL_KEIL
  20587. "muls r6, r7, r6\n\t"
  20588. #elif defined(__clang__)
  20589. "muls r6, r7\n\t"
  20590. #else
  20591. "mul r6, r7\n\t"
  20592. #endif
  20593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20594. "lsrs r7, r6, #15\n\t"
  20595. #else
  20596. "lsr r7, r6, #15\n\t"
  20597. #endif
  20598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20599. "lsls r6, r6, #17\n\t"
  20600. #else
  20601. "lsl r6, r6, #17\n\t"
  20602. #endif
  20603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20604. "adds r3, r3, r6\n\t"
  20605. #else
  20606. "add r3, r3, r6\n\t"
  20607. #endif
  20608. #ifdef WOLFSSL_KEIL
  20609. "adcs r4, r4, r7\n\t"
  20610. #elif defined(__clang__)
  20611. "adcs r4, r7\n\t"
  20612. #else
  20613. "adc r4, r7\n\t"
  20614. #endif
  20615. #ifdef WOLFSSL_KEIL
  20616. "adcs r5, r5, %[r]\n\t"
  20617. #elif defined(__clang__)
  20618. "adcs r5, %[r]\n\t"
  20619. #else
  20620. "adc r5, %[r]\n\t"
  20621. #endif
  20622. "# Square: Done\n\t"
  20623. "mov r2, r12\n\t"
  20624. "\n"
  20625. "L_sp_2048_sqr_64_done_sqr_%=:\n\t"
  20626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20627. "adds %[a], %[a], #4\n\t"
  20628. #else
  20629. "add %[a], %[a], #4\n\t"
  20630. #endif
  20631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20632. "subs r2, r2, #4\n\t"
  20633. #else
  20634. "sub r2, r2, #4\n\t"
  20635. #endif
  20636. "movs r6, #0xff\n\t"
  20637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20638. "adds r6, r6, #1\n\t"
  20639. #else
  20640. "add r6, r6, #1\n\t"
  20641. #endif
  20642. "add r6, r6, r9\n\t"
  20643. "cmp %[a], r6\n\t"
  20644. "beq L_sp_2048_sqr_64_done_mul_%=\n\t"
  20645. "cmp %[a], r2\n\t"
  20646. "bgt L_sp_2048_sqr_64_done_mul_%=\n\t"
  20647. "mov r7, r8\n\t"
  20648. "add r7, r7, r9\n\t"
  20649. "cmp %[a], r7\n\t"
  20650. "ble L_sp_2048_sqr_64_mul_%=\n\t"
  20651. "\n"
  20652. "L_sp_2048_sqr_64_done_mul_%=:\n\t"
  20653. "mov %[r], r10\n\t"
  20654. "mov r7, r8\n\t"
  20655. "str r3, [%[r], r7]\n\t"
  20656. "movs r3, r4\n\t"
  20657. "movs r4, r5\n\t"
  20658. "movs r5, #0\n\t"
  20659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20660. "adds r7, r7, #4\n\t"
  20661. #else
  20662. "add r7, r7, #4\n\t"
  20663. #endif
  20664. "mov r8, r7\n\t"
  20665. "movs r6, #0xff\n\t"
  20666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20667. "adds r6, r6, #0xf9\n\t"
  20668. #else
  20669. "add r6, r6, #0xf9\n\t"
  20670. #endif
  20671. "cmp r7, r6\n\t"
  20672. "ble L_sp_2048_sqr_64_words_%=\n\t"
  20673. "mov %[a], r9\n\t"
  20674. "str r3, [%[r], r7]\n\t"
  20675. "mov %[r], r11\n\t"
  20676. "mov %[a], r10\n\t"
  20677. "movs r3, #0xff\n\t"
  20678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20679. "adds r3, r3, #0xfd\n\t"
  20680. #else
  20681. "add r3, r3, #0xfd\n\t"
  20682. #endif
  20683. "\n"
  20684. "L_sp_2048_sqr_64_store_%=:\n\t"
  20685. "ldr r6, [%[a], r3]\n\t"
  20686. "str r6, [%[r], r3]\n\t"
  20687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20688. "subs r3, r3, #4\n\t"
  20689. #else
  20690. "sub r3, r3, #4\n\t"
  20691. #endif
  20692. "bge L_sp_2048_sqr_64_store_%=\n\t"
  20693. "movs r6, #2\n\t"
  20694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20695. "lsls r6, r6, #8\n\t"
  20696. #else
  20697. "lsl r6, r6, #8\n\t"
  20698. #endif
  20699. "add sp, sp, r6\n\t"
  20700. : [r] "+l" (r), [a] "+l" (a)
  20701. :
  20702. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  20703. );
  20704. }
  20705. #endif /* WOLFSSL_SP_SMALL */
  20706. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  20707. #ifdef WOLFSSL_SP_SMALL
  20708. /* AND m into each word of a and store in r.
  20709. *
  20710. * r A single precision integer.
  20711. * a A single precision integer.
  20712. * m Mask to AND against each digit.
  20713. */
  20714. static void sp_2048_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  20715. {
  20716. int i;
  20717. for (i=0; i<32; i++) {
  20718. r[i] = a[i] & m;
  20719. }
  20720. }
  20721. #endif /* WOLFSSL_SP_SMALL */
  20722. #ifdef WOLFSSL_SP_SMALL
  20723. /* Add b to a into r. (r = a + b)
  20724. *
  20725. * r A single precision integer.
  20726. * a A single precision integer.
  20727. * b A single precision integer.
  20728. */
  20729. SP_NOINLINE static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a,
  20730. const sp_digit* b)
  20731. {
  20732. __asm__ __volatile__ (
  20733. "movs r6, %[a]\n\t"
  20734. "movs r7, #0\n\t"
  20735. "movs r3, #0\n\t"
  20736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20737. "adds r6, r6, #0x80\n\t"
  20738. #else
  20739. "add r6, r6, #0x80\n\t"
  20740. #endif
  20741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20742. "subs r7, r7, #1\n\t"
  20743. #else
  20744. "sub r7, r7, #1\n\t"
  20745. #endif
  20746. "\n"
  20747. "L_sp_2048_add_32_word_%=:\n\t"
  20748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20749. "adds r3, r3, r7\n\t"
  20750. #else
  20751. "add r3, r3, r7\n\t"
  20752. #endif
  20753. "ldr r4, [%[a]]\n\t"
  20754. "ldr r5, [%[b]]\n\t"
  20755. #ifdef WOLFSSL_KEIL
  20756. "adcs r4, r4, r5\n\t"
  20757. #elif defined(__clang__)
  20758. "adcs r4, r5\n\t"
  20759. #else
  20760. "adc r4, r5\n\t"
  20761. #endif
  20762. "str r4, [%[r]]\n\t"
  20763. "movs r3, #0\n\t"
  20764. #ifdef WOLFSSL_KEIL
  20765. "adcs r3, r3, r3\n\t"
  20766. #elif defined(__clang__)
  20767. "adcs r3, r3\n\t"
  20768. #else
  20769. "adc r3, r3\n\t"
  20770. #endif
  20771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20772. "adds %[a], %[a], #4\n\t"
  20773. #else
  20774. "add %[a], %[a], #4\n\t"
  20775. #endif
  20776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20777. "adds %[b], %[b], #4\n\t"
  20778. #else
  20779. "add %[b], %[b], #4\n\t"
  20780. #endif
  20781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20782. "adds %[r], %[r], #4\n\t"
  20783. #else
  20784. "add %[r], %[r], #4\n\t"
  20785. #endif
  20786. "cmp %[a], r6\n\t"
  20787. "bne L_sp_2048_add_32_word_%=\n\t"
  20788. "movs %[r], r3\n\t"
  20789. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  20790. :
  20791. : "memory", "r3", "r4", "r5", "r6", "r7"
  20792. );
  20793. return (uint32_t)(size_t)r;
  20794. }
  20795. #endif /* WOLFSSL_SP_SMALL */
  20796. #ifdef WOLFSSL_SP_SMALL
  20797. /* Sub b from a into a. (a -= b)
  20798. *
  20799. * a A single precision integer.
  20800. * b A single precision integer.
  20801. */
  20802. SP_NOINLINE static sp_digit sp_2048_sub_in_place_32(sp_digit* a,
  20803. const sp_digit* b)
  20804. {
  20805. __asm__ __volatile__ (
  20806. "movs r7, %[a]\n\t"
  20807. "movs r2, #0\n\t"
  20808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20809. "adds r7, r7, #0x80\n\t"
  20810. #else
  20811. "add r7, r7, #0x80\n\t"
  20812. #endif
  20813. "\n"
  20814. "L_sp_2048_sub_in_place_32_words_%=:\n\t"
  20815. "movs r5, #0\n\t"
  20816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20817. "subs r5, r5, r2\n\t"
  20818. #else
  20819. "sub r5, r5, r2\n\t"
  20820. #endif
  20821. "ldr r3, [%[a]]\n\t"
  20822. "ldr r4, [%[a], #4]\n\t"
  20823. "ldr r5, [%[b]]\n\t"
  20824. "ldr r6, [%[b], #4]\n\t"
  20825. #ifdef WOLFSSL_KEIL
  20826. "sbcs r3, r3, r5\n\t"
  20827. #elif defined(__clang__)
  20828. "sbcs r3, r5\n\t"
  20829. #else
  20830. "sbc r3, r5\n\t"
  20831. #endif
  20832. #ifdef WOLFSSL_KEIL
  20833. "sbcs r4, r4, r6\n\t"
  20834. #elif defined(__clang__)
  20835. "sbcs r4, r6\n\t"
  20836. #else
  20837. "sbc r4, r6\n\t"
  20838. #endif
  20839. "str r3, [%[a]]\n\t"
  20840. "str r4, [%[a], #4]\n\t"
  20841. #ifdef WOLFSSL_KEIL
  20842. "sbcs r2, r2, r2\n\t"
  20843. #elif defined(__clang__)
  20844. "sbcs r2, r2\n\t"
  20845. #else
  20846. "sbc r2, r2\n\t"
  20847. #endif
  20848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20849. "adds %[a], %[a], #8\n\t"
  20850. #else
  20851. "add %[a], %[a], #8\n\t"
  20852. #endif
  20853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20854. "adds %[b], %[b], #8\n\t"
  20855. #else
  20856. "add %[b], %[b], #8\n\t"
  20857. #endif
  20858. "cmp %[a], r7\n\t"
  20859. "bne L_sp_2048_sub_in_place_32_words_%=\n\t"
  20860. "movs %[a], r2\n\t"
  20861. : [a] "+l" (a), [b] "+l" (b)
  20862. :
  20863. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  20864. );
  20865. return (uint32_t)(size_t)a;
  20866. }
  20867. #endif /* WOLFSSL_SP_SMALL */
  20868. #ifdef WOLFSSL_SP_SMALL
  20869. /* Multiply a and b into r. (r = a * b)
  20870. *
  20871. * r A single precision integer.
  20872. * a A single precision integer.
  20873. * b A single precision integer.
  20874. */
  20875. SP_NOINLINE static void sp_2048_mul_32(sp_digit* r, const sp_digit* a,
  20876. const sp_digit* b)
  20877. {
  20878. sp_digit t[32 * 2];
  20879. sp_digit* tmp = t;
  20880. __asm__ __volatile__ (
  20881. "movs r3, #0\n\t"
  20882. "movs r4, #0\n\t"
  20883. "mov r8, r3\n\t"
  20884. "mov r11, %[tmp]\n\t"
  20885. "mov r9, %[a]\n\t"
  20886. "mov r10, %[b]\n\t"
  20887. "movs r6, #0x80\n\t"
  20888. "add r6, r6, r9\n\t"
  20889. "mov r12, r6\n\t"
  20890. "\n"
  20891. "L_sp_2048_mul_32_words_%=:\n\t"
  20892. "movs %[tmp], #0\n\t"
  20893. "movs r5, #0\n\t"
  20894. "movs r6, #0x7c\n\t"
  20895. "mov %[a], r8\n\t"
  20896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20897. "subs %[a], %[a], r6\n\t"
  20898. #else
  20899. "sub %[a], %[a], r6\n\t"
  20900. #endif
  20901. #ifdef WOLFSSL_KEIL
  20902. "sbcs r6, r6, r6\n\t"
  20903. #elif defined(__clang__)
  20904. "sbcs r6, r6\n\t"
  20905. #else
  20906. "sbc r6, r6\n\t"
  20907. #endif
  20908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20909. "mvns r6, r6\n\t"
  20910. #else
  20911. "mvn r6, r6\n\t"
  20912. #endif
  20913. #ifdef WOLFSSL_KEIL
  20914. "ands %[a], %[a], r6\n\t"
  20915. #elif defined(__clang__)
  20916. "ands %[a], r6\n\t"
  20917. #else
  20918. "and %[a], r6\n\t"
  20919. #endif
  20920. "mov %[b], r8\n\t"
  20921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20922. "subs %[b], %[b], %[a]\n\t"
  20923. #else
  20924. "sub %[b], %[b], %[a]\n\t"
  20925. #endif
  20926. "add %[a], %[a], r9\n\t"
  20927. "add %[b], %[b], r10\n\t"
  20928. "\n"
  20929. "L_sp_2048_mul_32_mul_%=:\n\t"
  20930. "# Multiply Start\n\t"
  20931. "ldrh r6, [%[a]]\n\t"
  20932. "ldrh r7, [%[b]]\n\t"
  20933. #ifdef WOLFSSL_KEIL
  20934. "muls r7, r6, r7\n\t"
  20935. #elif defined(__clang__)
  20936. "muls r7, r6\n\t"
  20937. #else
  20938. "mul r7, r6\n\t"
  20939. #endif
  20940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20941. "adds r3, r3, r7\n\t"
  20942. #else
  20943. "add r3, r3, r7\n\t"
  20944. #endif
  20945. #ifdef WOLFSSL_KEIL
  20946. "adcs r4, r4, %[tmp]\n\t"
  20947. #elif defined(__clang__)
  20948. "adcs r4, %[tmp]\n\t"
  20949. #else
  20950. "adc r4, %[tmp]\n\t"
  20951. #endif
  20952. #ifdef WOLFSSL_KEIL
  20953. "adcs r5, r5, %[tmp]\n\t"
  20954. #elif defined(__clang__)
  20955. "adcs r5, %[tmp]\n\t"
  20956. #else
  20957. "adc r5, %[tmp]\n\t"
  20958. #endif
  20959. "ldr r7, [%[b]]\n\t"
  20960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20961. "lsrs r7, r7, #16\n\t"
  20962. #else
  20963. "lsr r7, r7, #16\n\t"
  20964. #endif
  20965. #ifdef WOLFSSL_KEIL
  20966. "muls r6, r7, r6\n\t"
  20967. #elif defined(__clang__)
  20968. "muls r6, r7\n\t"
  20969. #else
  20970. "mul r6, r7\n\t"
  20971. #endif
  20972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20973. "lsrs r7, r6, #16\n\t"
  20974. #else
  20975. "lsr r7, r6, #16\n\t"
  20976. #endif
  20977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20978. "lsls r6, r6, #16\n\t"
  20979. #else
  20980. "lsl r6, r6, #16\n\t"
  20981. #endif
  20982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20983. "adds r3, r3, r6\n\t"
  20984. #else
  20985. "add r3, r3, r6\n\t"
  20986. #endif
  20987. #ifdef WOLFSSL_KEIL
  20988. "adcs r4, r4, r7\n\t"
  20989. #elif defined(__clang__)
  20990. "adcs r4, r7\n\t"
  20991. #else
  20992. "adc r4, r7\n\t"
  20993. #endif
  20994. #ifdef WOLFSSL_KEIL
  20995. "adcs r5, r5, %[tmp]\n\t"
  20996. #elif defined(__clang__)
  20997. "adcs r5, %[tmp]\n\t"
  20998. #else
  20999. "adc r5, %[tmp]\n\t"
  21000. #endif
  21001. "ldr r6, [%[a]]\n\t"
  21002. "ldr r7, [%[b]]\n\t"
  21003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21004. "lsrs r6, r6, #16\n\t"
  21005. #else
  21006. "lsr r6, r6, #16\n\t"
  21007. #endif
  21008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21009. "lsrs r7, r7, #16\n\t"
  21010. #else
  21011. "lsr r7, r7, #16\n\t"
  21012. #endif
  21013. #ifdef WOLFSSL_KEIL
  21014. "muls r7, r6, r7\n\t"
  21015. #elif defined(__clang__)
  21016. "muls r7, r6\n\t"
  21017. #else
  21018. "mul r7, r6\n\t"
  21019. #endif
  21020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21021. "adds r4, r4, r7\n\t"
  21022. #else
  21023. "add r4, r4, r7\n\t"
  21024. #endif
  21025. #ifdef WOLFSSL_KEIL
  21026. "adcs r5, r5, %[tmp]\n\t"
  21027. #elif defined(__clang__)
  21028. "adcs r5, %[tmp]\n\t"
  21029. #else
  21030. "adc r5, %[tmp]\n\t"
  21031. #endif
  21032. "ldrh r7, [%[b]]\n\t"
  21033. #ifdef WOLFSSL_KEIL
  21034. "muls r6, r7, r6\n\t"
  21035. #elif defined(__clang__)
  21036. "muls r6, r7\n\t"
  21037. #else
  21038. "mul r6, r7\n\t"
  21039. #endif
  21040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21041. "lsrs r7, r6, #16\n\t"
  21042. #else
  21043. "lsr r7, r6, #16\n\t"
  21044. #endif
  21045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21046. "lsls r6, r6, #16\n\t"
  21047. #else
  21048. "lsl r6, r6, #16\n\t"
  21049. #endif
  21050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21051. "adds r3, r3, r6\n\t"
  21052. #else
  21053. "add r3, r3, r6\n\t"
  21054. #endif
  21055. #ifdef WOLFSSL_KEIL
  21056. "adcs r4, r4, r7\n\t"
  21057. #elif defined(__clang__)
  21058. "adcs r4, r7\n\t"
  21059. #else
  21060. "adc r4, r7\n\t"
  21061. #endif
  21062. #ifdef WOLFSSL_KEIL
  21063. "adcs r5, r5, %[tmp]\n\t"
  21064. #elif defined(__clang__)
  21065. "adcs r5, %[tmp]\n\t"
  21066. #else
  21067. "adc r5, %[tmp]\n\t"
  21068. #endif
  21069. "# Multiply Done\n\t"
  21070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21071. "adds %[a], %[a], #4\n\t"
  21072. #else
  21073. "add %[a], %[a], #4\n\t"
  21074. #endif
  21075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21076. "subs %[b], %[b], #4\n\t"
  21077. #else
  21078. "sub %[b], %[b], #4\n\t"
  21079. #endif
  21080. "cmp %[a], r12\n\t"
  21081. "beq L_sp_2048_mul_32_done_mul_%=\n\t"
  21082. "mov r6, r8\n\t"
  21083. "add r6, r6, r9\n\t"
  21084. "cmp %[a], r6\n\t"
  21085. "ble L_sp_2048_mul_32_mul_%=\n\t"
  21086. "\n"
  21087. "L_sp_2048_mul_32_done_mul_%=:\n\t"
  21088. "mov %[tmp], r11\n\t"
  21089. "mov r7, r8\n\t"
  21090. "str r3, [%[tmp], r7]\n\t"
  21091. "movs r3, r4\n\t"
  21092. "movs r4, r5\n\t"
  21093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21094. "adds r7, r7, #4\n\t"
  21095. #else
  21096. "add r7, r7, #4\n\t"
  21097. #endif
  21098. "mov r8, r7\n\t"
  21099. "movs r6, #0xf8\n\t"
  21100. "cmp r7, r6\n\t"
  21101. "ble L_sp_2048_mul_32_words_%=\n\t"
  21102. "str r3, [%[tmp], r7]\n\t"
  21103. "mov %[a], r9\n\t"
  21104. "mov %[b], r10\n\t"
  21105. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  21106. :
  21107. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  21108. );
  21109. XMEMCPY(r, t, sizeof(t));
  21110. }
  21111. /* Square a and put result in r. (r = a * a)
  21112. *
  21113. * r A single precision integer.
  21114. * a A single precision integer.
  21115. */
  21116. SP_NOINLINE static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a)
  21117. {
  21118. __asm__ __volatile__ (
  21119. "movs r3, #0\n\t"
  21120. "movs r4, #0\n\t"
  21121. "movs r5, #0\n\t"
  21122. "mov r8, r3\n\t"
  21123. "mov r11, %[r]\n\t"
  21124. "movs r6, #0xff\n\t"
  21125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21126. "adds r6, r6, #1\n\t"
  21127. #else
  21128. "add r6, r6, #1\n\t"
  21129. #endif
  21130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21131. "negs r6, r6\n\t"
  21132. #else
  21133. "neg r6, r6\n\t"
  21134. #endif
  21135. "add sp, sp, r6\n\t"
  21136. "mov r10, sp\n\t"
  21137. "mov r9, %[a]\n\t"
  21138. "\n"
  21139. "L_sp_2048_sqr_32_words_%=:\n\t"
  21140. "movs %[r], #0\n\t"
  21141. "movs r6, #0x7c\n\t"
  21142. "mov %[a], r8\n\t"
  21143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21144. "subs %[a], %[a], r6\n\t"
  21145. #else
  21146. "sub %[a], %[a], r6\n\t"
  21147. #endif
  21148. #ifdef WOLFSSL_KEIL
  21149. "sbcs r6, r6, r6\n\t"
  21150. #elif defined(__clang__)
  21151. "sbcs r6, r6\n\t"
  21152. #else
  21153. "sbc r6, r6\n\t"
  21154. #endif
  21155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21156. "mvns r6, r6\n\t"
  21157. #else
  21158. "mvn r6, r6\n\t"
  21159. #endif
  21160. #ifdef WOLFSSL_KEIL
  21161. "ands %[a], %[a], r6\n\t"
  21162. #elif defined(__clang__)
  21163. "ands %[a], r6\n\t"
  21164. #else
  21165. "and %[a], r6\n\t"
  21166. #endif
  21167. "mov r2, r8\n\t"
  21168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21169. "subs r2, r2, %[a]\n\t"
  21170. #else
  21171. "sub r2, r2, %[a]\n\t"
  21172. #endif
  21173. "add %[a], %[a], r9\n\t"
  21174. "add r2, r2, r9\n\t"
  21175. "\n"
  21176. "L_sp_2048_sqr_32_mul_%=:\n\t"
  21177. "cmp r2, %[a]\n\t"
  21178. "beq L_sp_2048_sqr_32_sqr_%=\n\t"
  21179. "# Multiply * 2: Start\n\t"
  21180. "ldrh r6, [%[a]]\n\t"
  21181. "ldrh r7, [r2]\n\t"
  21182. #ifdef WOLFSSL_KEIL
  21183. "muls r7, r6, r7\n\t"
  21184. #elif defined(__clang__)
  21185. "muls r7, r6\n\t"
  21186. #else
  21187. "mul r7, r6\n\t"
  21188. #endif
  21189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21190. "adds r3, r3, r7\n\t"
  21191. #else
  21192. "add r3, r3, r7\n\t"
  21193. #endif
  21194. #ifdef WOLFSSL_KEIL
  21195. "adcs r4, r4, %[r]\n\t"
  21196. #elif defined(__clang__)
  21197. "adcs r4, %[r]\n\t"
  21198. #else
  21199. "adc r4, %[r]\n\t"
  21200. #endif
  21201. #ifdef WOLFSSL_KEIL
  21202. "adcs r5, r5, %[r]\n\t"
  21203. #elif defined(__clang__)
  21204. "adcs r5, %[r]\n\t"
  21205. #else
  21206. "adc r5, %[r]\n\t"
  21207. #endif
  21208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21209. "adds r3, r3, r7\n\t"
  21210. #else
  21211. "add r3, r3, r7\n\t"
  21212. #endif
  21213. #ifdef WOLFSSL_KEIL
  21214. "adcs r4, r4, %[r]\n\t"
  21215. #elif defined(__clang__)
  21216. "adcs r4, %[r]\n\t"
  21217. #else
  21218. "adc r4, %[r]\n\t"
  21219. #endif
  21220. #ifdef WOLFSSL_KEIL
  21221. "adcs r5, r5, %[r]\n\t"
  21222. #elif defined(__clang__)
  21223. "adcs r5, %[r]\n\t"
  21224. #else
  21225. "adc r5, %[r]\n\t"
  21226. #endif
  21227. "ldr r7, [r2]\n\t"
  21228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21229. "lsrs r7, r7, #16\n\t"
  21230. #else
  21231. "lsr r7, r7, #16\n\t"
  21232. #endif
  21233. #ifdef WOLFSSL_KEIL
  21234. "muls r6, r7, r6\n\t"
  21235. #elif defined(__clang__)
  21236. "muls r6, r7\n\t"
  21237. #else
  21238. "mul r6, r7\n\t"
  21239. #endif
  21240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21241. "lsrs r7, r6, #16\n\t"
  21242. #else
  21243. "lsr r7, r6, #16\n\t"
  21244. #endif
  21245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21246. "lsls r6, r6, #16\n\t"
  21247. #else
  21248. "lsl r6, r6, #16\n\t"
  21249. #endif
  21250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21251. "adds r3, r3, r6\n\t"
  21252. #else
  21253. "add r3, r3, r6\n\t"
  21254. #endif
  21255. #ifdef WOLFSSL_KEIL
  21256. "adcs r4, r4, r7\n\t"
  21257. #elif defined(__clang__)
  21258. "adcs r4, r7\n\t"
  21259. #else
  21260. "adc r4, r7\n\t"
  21261. #endif
  21262. #ifdef WOLFSSL_KEIL
  21263. "adcs r5, r5, %[r]\n\t"
  21264. #elif defined(__clang__)
  21265. "adcs r5, %[r]\n\t"
  21266. #else
  21267. "adc r5, %[r]\n\t"
  21268. #endif
  21269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21270. "adds r3, r3, r6\n\t"
  21271. #else
  21272. "add r3, r3, r6\n\t"
  21273. #endif
  21274. #ifdef WOLFSSL_KEIL
  21275. "adcs r4, r4, r7\n\t"
  21276. #elif defined(__clang__)
  21277. "adcs r4, r7\n\t"
  21278. #else
  21279. "adc r4, r7\n\t"
  21280. #endif
  21281. #ifdef WOLFSSL_KEIL
  21282. "adcs r5, r5, %[r]\n\t"
  21283. #elif defined(__clang__)
  21284. "adcs r5, %[r]\n\t"
  21285. #else
  21286. "adc r5, %[r]\n\t"
  21287. #endif
  21288. "ldr r6, [%[a]]\n\t"
  21289. "ldr r7, [r2]\n\t"
  21290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21291. "lsrs r6, r6, #16\n\t"
  21292. #else
  21293. "lsr r6, r6, #16\n\t"
  21294. #endif
  21295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21296. "lsrs r7, r7, #16\n\t"
  21297. #else
  21298. "lsr r7, r7, #16\n\t"
  21299. #endif
  21300. #ifdef WOLFSSL_KEIL
  21301. "muls r7, r6, r7\n\t"
  21302. #elif defined(__clang__)
  21303. "muls r7, r6\n\t"
  21304. #else
  21305. "mul r7, r6\n\t"
  21306. #endif
  21307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21308. "adds r4, r4, r7\n\t"
  21309. #else
  21310. "add r4, r4, r7\n\t"
  21311. #endif
  21312. #ifdef WOLFSSL_KEIL
  21313. "adcs r5, r5, %[r]\n\t"
  21314. #elif defined(__clang__)
  21315. "adcs r5, %[r]\n\t"
  21316. #else
  21317. "adc r5, %[r]\n\t"
  21318. #endif
  21319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21320. "adds r4, r4, r7\n\t"
  21321. #else
  21322. "add r4, r4, r7\n\t"
  21323. #endif
  21324. #ifdef WOLFSSL_KEIL
  21325. "adcs r5, r5, %[r]\n\t"
  21326. #elif defined(__clang__)
  21327. "adcs r5, %[r]\n\t"
  21328. #else
  21329. "adc r5, %[r]\n\t"
  21330. #endif
  21331. "ldrh r7, [r2]\n\t"
  21332. #ifdef WOLFSSL_KEIL
  21333. "muls r6, r7, r6\n\t"
  21334. #elif defined(__clang__)
  21335. "muls r6, r7\n\t"
  21336. #else
  21337. "mul r6, r7\n\t"
  21338. #endif
  21339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21340. "lsrs r7, r6, #16\n\t"
  21341. #else
  21342. "lsr r7, r6, #16\n\t"
  21343. #endif
  21344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21345. "lsls r6, r6, #16\n\t"
  21346. #else
  21347. "lsl r6, r6, #16\n\t"
  21348. #endif
  21349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21350. "adds r3, r3, r6\n\t"
  21351. #else
  21352. "add r3, r3, r6\n\t"
  21353. #endif
  21354. #ifdef WOLFSSL_KEIL
  21355. "adcs r4, r4, r7\n\t"
  21356. #elif defined(__clang__)
  21357. "adcs r4, r7\n\t"
  21358. #else
  21359. "adc r4, r7\n\t"
  21360. #endif
  21361. #ifdef WOLFSSL_KEIL
  21362. "adcs r5, r5, %[r]\n\t"
  21363. #elif defined(__clang__)
  21364. "adcs r5, %[r]\n\t"
  21365. #else
  21366. "adc r5, %[r]\n\t"
  21367. #endif
  21368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21369. "adds r3, r3, r6\n\t"
  21370. #else
  21371. "add r3, r3, r6\n\t"
  21372. #endif
  21373. #ifdef WOLFSSL_KEIL
  21374. "adcs r4, r4, r7\n\t"
  21375. #elif defined(__clang__)
  21376. "adcs r4, r7\n\t"
  21377. #else
  21378. "adc r4, r7\n\t"
  21379. #endif
  21380. #ifdef WOLFSSL_KEIL
  21381. "adcs r5, r5, %[r]\n\t"
  21382. #elif defined(__clang__)
  21383. "adcs r5, %[r]\n\t"
  21384. #else
  21385. "adc r5, %[r]\n\t"
  21386. #endif
  21387. "# Multiply * 2: Done\n\t"
  21388. "bal L_sp_2048_sqr_32_done_sqr_%=\n\t"
  21389. "\n"
  21390. "L_sp_2048_sqr_32_sqr_%=:\n\t"
  21391. "mov r12, r2\n\t"
  21392. "ldr r2, [%[a]]\n\t"
  21393. "# Square: Start\n\t"
  21394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21395. "lsrs r7, r2, #16\n\t"
  21396. #else
  21397. "lsr r7, r2, #16\n\t"
  21398. #endif
  21399. "uxth r6, r2\n\t"
  21400. #ifdef WOLFSSL_KEIL
  21401. "muls r6, r6, r6\n\t"
  21402. #elif defined(__clang__)
  21403. "muls r6, r6\n\t"
  21404. #else
  21405. "mul r6, r6\n\t"
  21406. #endif
  21407. #ifdef WOLFSSL_KEIL
  21408. "muls r7, r7, r7\n\t"
  21409. #elif defined(__clang__)
  21410. "muls r7, r7\n\t"
  21411. #else
  21412. "mul r7, r7\n\t"
  21413. #endif
  21414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21415. "adds r3, r3, r6\n\t"
  21416. #else
  21417. "add r3, r3, r6\n\t"
  21418. #endif
  21419. #ifdef WOLFSSL_KEIL
  21420. "adcs r4, r4, r7\n\t"
  21421. #elif defined(__clang__)
  21422. "adcs r4, r7\n\t"
  21423. #else
  21424. "adc r4, r7\n\t"
  21425. #endif
  21426. #ifdef WOLFSSL_KEIL
  21427. "adcs r5, r5, %[r]\n\t"
  21428. #elif defined(__clang__)
  21429. "adcs r5, %[r]\n\t"
  21430. #else
  21431. "adc r5, %[r]\n\t"
  21432. #endif
  21433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21434. "lsrs r7, r2, #16\n\t"
  21435. #else
  21436. "lsr r7, r2, #16\n\t"
  21437. #endif
  21438. "uxth r6, r2\n\t"
  21439. #ifdef WOLFSSL_KEIL
  21440. "muls r6, r7, r6\n\t"
  21441. #elif defined(__clang__)
  21442. "muls r6, r7\n\t"
  21443. #else
  21444. "mul r6, r7\n\t"
  21445. #endif
  21446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21447. "lsrs r7, r6, #15\n\t"
  21448. #else
  21449. "lsr r7, r6, #15\n\t"
  21450. #endif
  21451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21452. "lsls r6, r6, #17\n\t"
  21453. #else
  21454. "lsl r6, r6, #17\n\t"
  21455. #endif
  21456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21457. "adds r3, r3, r6\n\t"
  21458. #else
  21459. "add r3, r3, r6\n\t"
  21460. #endif
  21461. #ifdef WOLFSSL_KEIL
  21462. "adcs r4, r4, r7\n\t"
  21463. #elif defined(__clang__)
  21464. "adcs r4, r7\n\t"
  21465. #else
  21466. "adc r4, r7\n\t"
  21467. #endif
  21468. #ifdef WOLFSSL_KEIL
  21469. "adcs r5, r5, %[r]\n\t"
  21470. #elif defined(__clang__)
  21471. "adcs r5, %[r]\n\t"
  21472. #else
  21473. "adc r5, %[r]\n\t"
  21474. #endif
  21475. "# Square: Done\n\t"
  21476. "mov r2, r12\n\t"
  21477. "\n"
  21478. "L_sp_2048_sqr_32_done_sqr_%=:\n\t"
  21479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21480. "adds %[a], %[a], #4\n\t"
  21481. #else
  21482. "add %[a], %[a], #4\n\t"
  21483. #endif
  21484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21485. "subs r2, r2, #4\n\t"
  21486. #else
  21487. "sub r2, r2, #4\n\t"
  21488. #endif
  21489. "movs r6, #0x80\n\t"
  21490. "add r6, r6, r9\n\t"
  21491. "cmp %[a], r6\n\t"
  21492. "beq L_sp_2048_sqr_32_done_mul_%=\n\t"
  21493. "cmp %[a], r2\n\t"
  21494. "bgt L_sp_2048_sqr_32_done_mul_%=\n\t"
  21495. "mov r7, r8\n\t"
  21496. "add r7, r7, r9\n\t"
  21497. "cmp %[a], r7\n\t"
  21498. "ble L_sp_2048_sqr_32_mul_%=\n\t"
  21499. "\n"
  21500. "L_sp_2048_sqr_32_done_mul_%=:\n\t"
  21501. "mov %[r], r10\n\t"
  21502. "mov r7, r8\n\t"
  21503. "str r3, [%[r], r7]\n\t"
  21504. "movs r3, r4\n\t"
  21505. "movs r4, r5\n\t"
  21506. "movs r5, #0\n\t"
  21507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21508. "adds r7, r7, #4\n\t"
  21509. #else
  21510. "add r7, r7, #4\n\t"
  21511. #endif
  21512. "mov r8, r7\n\t"
  21513. "movs r6, #0xf8\n\t"
  21514. "cmp r7, r6\n\t"
  21515. "ble L_sp_2048_sqr_32_words_%=\n\t"
  21516. "mov %[a], r9\n\t"
  21517. "str r3, [%[r], r7]\n\t"
  21518. "mov %[r], r11\n\t"
  21519. "mov %[a], r10\n\t"
  21520. "movs r3, #0xfc\n\t"
  21521. "\n"
  21522. "L_sp_2048_sqr_32_store_%=:\n\t"
  21523. "ldr r6, [%[a], r3]\n\t"
  21524. "str r6, [%[r], r3]\n\t"
  21525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21526. "subs r3, r3, #4\n\t"
  21527. #else
  21528. "sub r3, r3, #4\n\t"
  21529. #endif
  21530. "bge L_sp_2048_sqr_32_store_%=\n\t"
  21531. "movs r6, #0xff\n\t"
  21532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21533. "adds r6, r6, #1\n\t"
  21534. #else
  21535. "add r6, r6, #1\n\t"
  21536. #endif
  21537. "add sp, sp, r6\n\t"
  21538. : [r] "+l" (r), [a] "+l" (a)
  21539. :
  21540. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  21541. );
  21542. }
  21543. #endif /* WOLFSSL_SP_SMALL */
  21544. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  21545. /* Calculate the bottom digit of -1/a mod 2^n.
  21546. *
  21547. * a A single precision number.
  21548. * rho Bottom word of inverse.
  21549. */
  21550. static void sp_2048_mont_setup(const sp_digit* a, sp_digit* rho)
  21551. {
  21552. sp_digit x;
  21553. sp_digit b;
  21554. b = a[0];
  21555. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  21556. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  21557. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  21558. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  21559. /* rho = -1/m mod b */
  21560. *rho = (sp_digit)0 - x;
  21561. }
  21562. /* Mul a by digit b into r. (r = a * b)
  21563. *
  21564. * r A single precision integer.
  21565. * a A single precision integer.
  21566. * b A single precision digit.
  21567. */
  21568. SP_NOINLINE static void sp_2048_mul_d_64(sp_digit* r, const sp_digit* a,
  21569. sp_digit b)
  21570. {
  21571. __asm__ __volatile__ (
  21572. "movs r6, #0xff\n\t"
  21573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21574. "adds r6, r6, #1\n\t"
  21575. #else
  21576. "add r6, r6, #1\n\t"
  21577. #endif
  21578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21579. "adds r6, r6, %[a]\n\t"
  21580. #else
  21581. "add r6, r6, %[a]\n\t"
  21582. #endif
  21583. "mov r8, %[r]\n\t"
  21584. "mov r9, r6\n\t"
  21585. "movs r3, #0\n\t"
  21586. "movs r4, #0\n\t"
  21587. "\n"
  21588. "L_sp_2048_mul_d_64_%=:\n\t"
  21589. "movs %[r], #0\n\t"
  21590. "movs r5, #0\n\t"
  21591. "# A[] * B\n\t"
  21592. "ldrh r6, [%[a]]\n\t"
  21593. "uxth r7, %[b]\n\t"
  21594. #ifdef WOLFSSL_KEIL
  21595. "muls r7, r6, r7\n\t"
  21596. #elif defined(__clang__)
  21597. "muls r7, r6\n\t"
  21598. #else
  21599. "mul r7, r6\n\t"
  21600. #endif
  21601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21602. "adds r3, r3, r7\n\t"
  21603. #else
  21604. "add r3, r3, r7\n\t"
  21605. #endif
  21606. #ifdef WOLFSSL_KEIL
  21607. "adcs r4, r4, %[r]\n\t"
  21608. #elif defined(__clang__)
  21609. "adcs r4, %[r]\n\t"
  21610. #else
  21611. "adc r4, %[r]\n\t"
  21612. #endif
  21613. #ifdef WOLFSSL_KEIL
  21614. "adcs r5, r5, %[r]\n\t"
  21615. #elif defined(__clang__)
  21616. "adcs r5, %[r]\n\t"
  21617. #else
  21618. "adc r5, %[r]\n\t"
  21619. #endif
  21620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21621. "lsrs r7, %[b], #16\n\t"
  21622. #else
  21623. "lsr r7, %[b], #16\n\t"
  21624. #endif
  21625. #ifdef WOLFSSL_KEIL
  21626. "muls r6, r7, r6\n\t"
  21627. #elif defined(__clang__)
  21628. "muls r6, r7\n\t"
  21629. #else
  21630. "mul r6, r7\n\t"
  21631. #endif
  21632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21633. "lsrs r7, r6, #16\n\t"
  21634. #else
  21635. "lsr r7, r6, #16\n\t"
  21636. #endif
  21637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21638. "lsls r6, r6, #16\n\t"
  21639. #else
  21640. "lsl r6, r6, #16\n\t"
  21641. #endif
  21642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21643. "adds r3, r3, r6\n\t"
  21644. #else
  21645. "add r3, r3, r6\n\t"
  21646. #endif
  21647. #ifdef WOLFSSL_KEIL
  21648. "adcs r4, r4, r7\n\t"
  21649. #elif defined(__clang__)
  21650. "adcs r4, r7\n\t"
  21651. #else
  21652. "adc r4, r7\n\t"
  21653. #endif
  21654. #ifdef WOLFSSL_KEIL
  21655. "adcs r5, r5, %[r]\n\t"
  21656. #elif defined(__clang__)
  21657. "adcs r5, %[r]\n\t"
  21658. #else
  21659. "adc r5, %[r]\n\t"
  21660. #endif
  21661. "ldr r6, [%[a]]\n\t"
  21662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21663. "lsrs r6, r6, #16\n\t"
  21664. #else
  21665. "lsr r6, r6, #16\n\t"
  21666. #endif
  21667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21668. "lsrs r7, %[b], #16\n\t"
  21669. #else
  21670. "lsr r7, %[b], #16\n\t"
  21671. #endif
  21672. #ifdef WOLFSSL_KEIL
  21673. "muls r7, r6, r7\n\t"
  21674. #elif defined(__clang__)
  21675. "muls r7, r6\n\t"
  21676. #else
  21677. "mul r7, r6\n\t"
  21678. #endif
  21679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21680. "adds r4, r4, r7\n\t"
  21681. #else
  21682. "add r4, r4, r7\n\t"
  21683. #endif
  21684. #ifdef WOLFSSL_KEIL
  21685. "adcs r5, r5, %[r]\n\t"
  21686. #elif defined(__clang__)
  21687. "adcs r5, %[r]\n\t"
  21688. #else
  21689. "adc r5, %[r]\n\t"
  21690. #endif
  21691. "uxth r7, %[b]\n\t"
  21692. #ifdef WOLFSSL_KEIL
  21693. "muls r6, r7, r6\n\t"
  21694. #elif defined(__clang__)
  21695. "muls r6, r7\n\t"
  21696. #else
  21697. "mul r6, r7\n\t"
  21698. #endif
  21699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21700. "lsrs r7, r6, #16\n\t"
  21701. #else
  21702. "lsr r7, r6, #16\n\t"
  21703. #endif
  21704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21705. "lsls r6, r6, #16\n\t"
  21706. #else
  21707. "lsl r6, r6, #16\n\t"
  21708. #endif
  21709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21710. "adds r3, r3, r6\n\t"
  21711. #else
  21712. "add r3, r3, r6\n\t"
  21713. #endif
  21714. #ifdef WOLFSSL_KEIL
  21715. "adcs r4, r4, r7\n\t"
  21716. #elif defined(__clang__)
  21717. "adcs r4, r7\n\t"
  21718. #else
  21719. "adc r4, r7\n\t"
  21720. #endif
  21721. #ifdef WOLFSSL_KEIL
  21722. "adcs r5, r5, %[r]\n\t"
  21723. #elif defined(__clang__)
  21724. "adcs r5, %[r]\n\t"
  21725. #else
  21726. "adc r5, %[r]\n\t"
  21727. #endif
  21728. "# A[] * B - Done\n\t"
  21729. "mov %[r], r8\n\t"
  21730. "str r3, [%[r]]\n\t"
  21731. "movs r3, r4\n\t"
  21732. "movs r4, r5\n\t"
  21733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21734. "adds %[r], %[r], #4\n\t"
  21735. #else
  21736. "add %[r], %[r], #4\n\t"
  21737. #endif
  21738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21739. "adds %[a], %[a], #4\n\t"
  21740. #else
  21741. "add %[a], %[a], #4\n\t"
  21742. #endif
  21743. "mov r8, %[r]\n\t"
  21744. "cmp %[a], r9\n\t"
  21745. "blt L_sp_2048_mul_d_64_%=\n\t"
  21746. "str r3, [%[r]]\n\t"
  21747. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  21748. :
  21749. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  21750. );
  21751. }
  21752. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  21753. /* r = 2^n mod m where n is the number of bits to reduce by.
  21754. * Given m must be 2048 bits, just need to subtract.
  21755. *
  21756. * r A single precision number.
  21757. * m A single precision number.
  21758. */
  21759. static void sp_2048_mont_norm_32(sp_digit* r, const sp_digit* m)
  21760. {
  21761. XMEMSET(r, 0, sizeof(sp_digit) * 32);
  21762. /* r = 2^n mod m */
  21763. sp_2048_sub_in_place_32(r, m);
  21764. }
  21765. /* Conditionally subtract b from a using the mask m.
  21766. * m is -1 to subtract and 0 when not copying.
  21767. *
  21768. * r A single precision number representing condition subtract result.
  21769. * a A single precision number to subtract from.
  21770. * b A single precision number to subtract.
  21771. * m Mask value to apply.
  21772. */
  21773. SP_NOINLINE static sp_digit sp_2048_cond_sub_32(sp_digit* r, const sp_digit* a,
  21774. const sp_digit* b, sp_digit m)
  21775. {
  21776. __asm__ __volatile__ (
  21777. "movs r4, #0\n\t"
  21778. "movs r5, #0x80\n\t"
  21779. "mov r8, r5\n\t"
  21780. "movs r7, #0\n\t"
  21781. "\n"
  21782. "L_sp_2048_cond_sub_32_words_%=:\n\t"
  21783. "ldr r6, [%[b], r7]\n\t"
  21784. #ifdef WOLFSSL_KEIL
  21785. "ands r6, r6, %[m]\n\t"
  21786. #elif defined(__clang__)
  21787. "ands r6, %[m]\n\t"
  21788. #else
  21789. "and r6, %[m]\n\t"
  21790. #endif
  21791. "movs r5, #0\n\t"
  21792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21793. "subs r5, r5, r4\n\t"
  21794. #else
  21795. "sub r5, r5, r4\n\t"
  21796. #endif
  21797. "ldr r5, [%[a], r7]\n\t"
  21798. #ifdef WOLFSSL_KEIL
  21799. "sbcs r5, r5, r6\n\t"
  21800. #elif defined(__clang__)
  21801. "sbcs r5, r6\n\t"
  21802. #else
  21803. "sbc r5, r6\n\t"
  21804. #endif
  21805. #ifdef WOLFSSL_KEIL
  21806. "sbcs r4, r4, r4\n\t"
  21807. #elif defined(__clang__)
  21808. "sbcs r4, r4\n\t"
  21809. #else
  21810. "sbc r4, r4\n\t"
  21811. #endif
  21812. "str r5, [%[r], r7]\n\t"
  21813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21814. "adds r7, r7, #4\n\t"
  21815. #else
  21816. "add r7, r7, #4\n\t"
  21817. #endif
  21818. "cmp r7, r8\n\t"
  21819. "blt L_sp_2048_cond_sub_32_words_%=\n\t"
  21820. "movs %[r], r4\n\t"
  21821. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  21822. :
  21823. : "memory", "r4", "r5", "r6", "r7", "r8"
  21824. );
  21825. return (uint32_t)(size_t)r;
  21826. }
  21827. #define sp_2048_mont_reduce_order_64 sp_2048_mont_reduce_64
  21828. /* Reduce the number back to 2048 bits using Montgomery reduction.
  21829. *
  21830. * a A single precision number to reduce in place.
  21831. * m The single precision number representing the modulus.
  21832. * mp The digit representing the negative inverse of m mod 2^n.
  21833. */
  21834. SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a, const sp_digit* m,
  21835. sp_digit mp)
  21836. {
  21837. __asm__ __volatile__ (
  21838. "movs r7, #0\n\t"
  21839. "mov r8, %[mp]\n\t"
  21840. "mov r12, r7\n\t"
  21841. "mov lr, %[m]\n\t"
  21842. "mov r9, %[a]\n\t"
  21843. "mov r11, %[a]\n\t"
  21844. "movs r5, #0x7c\n\t"
  21845. "movs r6, #0x80\n\t"
  21846. "add r9, r9, r5\n\t"
  21847. "add r11, r11, r6\n\t"
  21848. "\n"
  21849. "L_sp_2048_mont_reduce_32_mod_%=:\n\t"
  21850. "movs r7, #0\n\t"
  21851. "movs r4, #0\n\t"
  21852. "# a[i] += m[0] * mu\n\t"
  21853. "ldm %[m]!, {%[mp]}\n\t"
  21854. "ldm %[a]!, {r3}\n\t"
  21855. "# mu = a[i] * mp\n\t"
  21856. "mov r5, r8\n\t"
  21857. #ifdef WOLFSSL_KEIL
  21858. "muls r5, r3, r5\n\t"
  21859. #elif defined(__clang__)
  21860. "muls r5, r3\n\t"
  21861. #else
  21862. "mul r5, r3\n\t"
  21863. #endif
  21864. "mov r10, r5\n\t"
  21865. "# Multiply m[0] and mu - Start\n\t"
  21866. "mov r5, r10\n\t"
  21867. "uxth r6, %[mp]\n\t"
  21868. "uxth r5, r5\n\t"
  21869. #ifdef WOLFSSL_KEIL
  21870. "muls r6, r5, r6\n\t"
  21871. #elif defined(__clang__)
  21872. "muls r6, r5\n\t"
  21873. #else
  21874. "mul r6, r5\n\t"
  21875. #endif
  21876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21877. "adds r3, r3, r6\n\t"
  21878. #else
  21879. "add r3, r3, r6\n\t"
  21880. #endif
  21881. #ifdef WOLFSSL_KEIL
  21882. "adcs r4, r4, r7\n\t"
  21883. #elif defined(__clang__)
  21884. "adcs r4, r7\n\t"
  21885. #else
  21886. "adc r4, r7\n\t"
  21887. #endif
  21888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21889. "lsrs r6, %[mp], #16\n\t"
  21890. #else
  21891. "lsr r6, %[mp], #16\n\t"
  21892. #endif
  21893. #ifdef WOLFSSL_KEIL
  21894. "muls r5, r6, r5\n\t"
  21895. #elif defined(__clang__)
  21896. "muls r5, r6\n\t"
  21897. #else
  21898. "mul r5, r6\n\t"
  21899. #endif
  21900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21901. "lsrs r6, r5, #16\n\t"
  21902. #else
  21903. "lsr r6, r5, #16\n\t"
  21904. #endif
  21905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21906. "lsls r5, r5, #16\n\t"
  21907. #else
  21908. "lsl r5, r5, #16\n\t"
  21909. #endif
  21910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21911. "adds r3, r3, r5\n\t"
  21912. #else
  21913. "add r3, r3, r5\n\t"
  21914. #endif
  21915. #ifdef WOLFSSL_KEIL
  21916. "adcs r4, r4, r6\n\t"
  21917. #elif defined(__clang__)
  21918. "adcs r4, r6\n\t"
  21919. #else
  21920. "adc r4, r6\n\t"
  21921. #endif
  21922. "mov r5, r10\n\t"
  21923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21924. "lsrs r6, %[mp], #16\n\t"
  21925. #else
  21926. "lsr r6, %[mp], #16\n\t"
  21927. #endif
  21928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21929. "lsrs r5, r5, #16\n\t"
  21930. #else
  21931. "lsr r5, r5, #16\n\t"
  21932. #endif
  21933. #ifdef WOLFSSL_KEIL
  21934. "muls r6, r5, r6\n\t"
  21935. #elif defined(__clang__)
  21936. "muls r6, r5\n\t"
  21937. #else
  21938. "mul r6, r5\n\t"
  21939. #endif
  21940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21941. "adds r4, r4, r6\n\t"
  21942. #else
  21943. "add r4, r4, r6\n\t"
  21944. #endif
  21945. "uxth r6, %[mp]\n\t"
  21946. #ifdef WOLFSSL_KEIL
  21947. "muls r5, r6, r5\n\t"
  21948. #elif defined(__clang__)
  21949. "muls r5, r6\n\t"
  21950. #else
  21951. "mul r5, r6\n\t"
  21952. #endif
  21953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21954. "lsrs r6, r5, #16\n\t"
  21955. #else
  21956. "lsr r6, r5, #16\n\t"
  21957. #endif
  21958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21959. "lsls r5, r5, #16\n\t"
  21960. #else
  21961. "lsl r5, r5, #16\n\t"
  21962. #endif
  21963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21964. "adds r3, r3, r5\n\t"
  21965. #else
  21966. "add r3, r3, r5\n\t"
  21967. #endif
  21968. #ifdef WOLFSSL_KEIL
  21969. "adcs r4, r4, r6\n\t"
  21970. #elif defined(__clang__)
  21971. "adcs r4, r6\n\t"
  21972. #else
  21973. "adc r4, r6\n\t"
  21974. #endif
  21975. "# Multiply m[0] and mu - Done\n\t"
  21976. "\n"
  21977. "L_sp_2048_mont_reduce_32_word_%=:\n\t"
  21978. "# a[i+j] += m[j] * mu\n\t"
  21979. "ldr r3, [%[a]]\n\t"
  21980. "ldm %[m]!, {%[mp]}\n\t"
  21981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21982. "adds r3, r3, r4\n\t"
  21983. #else
  21984. "add r3, r3, r4\n\t"
  21985. #endif
  21986. "movs r4, #0\n\t"
  21987. #ifdef WOLFSSL_KEIL
  21988. "adcs r4, r4, r7\n\t"
  21989. #elif defined(__clang__)
  21990. "adcs r4, r7\n\t"
  21991. #else
  21992. "adc r4, r7\n\t"
  21993. #endif
  21994. "# Multiply m[j] and mu - Start\n\t"
  21995. "mov r5, r10\n\t"
  21996. "uxth r6, %[mp]\n\t"
  21997. "uxth r5, r5\n\t"
  21998. #ifdef WOLFSSL_KEIL
  21999. "muls r6, r5, r6\n\t"
  22000. #elif defined(__clang__)
  22001. "muls r6, r5\n\t"
  22002. #else
  22003. "mul r6, r5\n\t"
  22004. #endif
  22005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22006. "adds r3, r3, r6\n\t"
  22007. #else
  22008. "add r3, r3, r6\n\t"
  22009. #endif
  22010. #ifdef WOLFSSL_KEIL
  22011. "adcs r4, r4, r7\n\t"
  22012. #elif defined(__clang__)
  22013. "adcs r4, r7\n\t"
  22014. #else
  22015. "adc r4, r7\n\t"
  22016. #endif
  22017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22018. "lsrs r6, %[mp], #16\n\t"
  22019. #else
  22020. "lsr r6, %[mp], #16\n\t"
  22021. #endif
  22022. #ifdef WOLFSSL_KEIL
  22023. "muls r5, r6, r5\n\t"
  22024. #elif defined(__clang__)
  22025. "muls r5, r6\n\t"
  22026. #else
  22027. "mul r5, r6\n\t"
  22028. #endif
  22029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22030. "lsrs r6, r5, #16\n\t"
  22031. #else
  22032. "lsr r6, r5, #16\n\t"
  22033. #endif
  22034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22035. "lsls r5, r5, #16\n\t"
  22036. #else
  22037. "lsl r5, r5, #16\n\t"
  22038. #endif
  22039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22040. "adds r3, r3, r5\n\t"
  22041. #else
  22042. "add r3, r3, r5\n\t"
  22043. #endif
  22044. #ifdef WOLFSSL_KEIL
  22045. "adcs r4, r4, r6\n\t"
  22046. #elif defined(__clang__)
  22047. "adcs r4, r6\n\t"
  22048. #else
  22049. "adc r4, r6\n\t"
  22050. #endif
  22051. "mov r5, r10\n\t"
  22052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22053. "lsrs r6, %[mp], #16\n\t"
  22054. #else
  22055. "lsr r6, %[mp], #16\n\t"
  22056. #endif
  22057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22058. "lsrs r5, r5, #16\n\t"
  22059. #else
  22060. "lsr r5, r5, #16\n\t"
  22061. #endif
  22062. #ifdef WOLFSSL_KEIL
  22063. "muls r6, r5, r6\n\t"
  22064. #elif defined(__clang__)
  22065. "muls r6, r5\n\t"
  22066. #else
  22067. "mul r6, r5\n\t"
  22068. #endif
  22069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22070. "adds r4, r4, r6\n\t"
  22071. #else
  22072. "add r4, r4, r6\n\t"
  22073. #endif
  22074. "uxth r6, %[mp]\n\t"
  22075. #ifdef WOLFSSL_KEIL
  22076. "muls r5, r6, r5\n\t"
  22077. #elif defined(__clang__)
  22078. "muls r5, r6\n\t"
  22079. #else
  22080. "mul r5, r6\n\t"
  22081. #endif
  22082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22083. "lsrs r6, r5, #16\n\t"
  22084. #else
  22085. "lsr r6, r5, #16\n\t"
  22086. #endif
  22087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22088. "lsls r5, r5, #16\n\t"
  22089. #else
  22090. "lsl r5, r5, #16\n\t"
  22091. #endif
  22092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22093. "adds r3, r3, r5\n\t"
  22094. #else
  22095. "add r3, r3, r5\n\t"
  22096. #endif
  22097. #ifdef WOLFSSL_KEIL
  22098. "adcs r4, r4, r6\n\t"
  22099. #elif defined(__clang__)
  22100. "adcs r4, r6\n\t"
  22101. #else
  22102. "adc r4, r6\n\t"
  22103. #endif
  22104. "# Multiply m[j] and mu - Done\n\t"
  22105. "stm %[a]!, {r3}\n\t"
  22106. "cmp %[a], r9\n\t"
  22107. "blt L_sp_2048_mont_reduce_32_word_%=\n\t"
  22108. "# a[i+31] += m[31] * mu\n\t"
  22109. "ldr %[mp], [%[m]]\n\t"
  22110. "mov r3, r12\n\t"
  22111. "# Multiply m[31] and mu - Start\n\t"
  22112. "mov r5, r10\n\t"
  22113. "uxth r6, %[mp]\n\t"
  22114. "uxth r5, r5\n\t"
  22115. #ifdef WOLFSSL_KEIL
  22116. "muls r6, r5, r6\n\t"
  22117. #elif defined(__clang__)
  22118. "muls r6, r5\n\t"
  22119. #else
  22120. "mul r6, r5\n\t"
  22121. #endif
  22122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22123. "adds r4, r4, r6\n\t"
  22124. #else
  22125. "add r4, r4, r6\n\t"
  22126. #endif
  22127. #ifdef WOLFSSL_KEIL
  22128. "adcs r3, r3, r7\n\t"
  22129. #elif defined(__clang__)
  22130. "adcs r3, r7\n\t"
  22131. #else
  22132. "adc r3, r7\n\t"
  22133. #endif
  22134. #ifdef WOLFSSL_KEIL
  22135. "adcs r7, r7, r7\n\t"
  22136. #elif defined(__clang__)
  22137. "adcs r7, r7\n\t"
  22138. #else
  22139. "adc r7, r7\n\t"
  22140. #endif
  22141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22142. "lsrs r6, %[mp], #16\n\t"
  22143. #else
  22144. "lsr r6, %[mp], #16\n\t"
  22145. #endif
  22146. #ifdef WOLFSSL_KEIL
  22147. "muls r5, r6, r5\n\t"
  22148. #elif defined(__clang__)
  22149. "muls r5, r6\n\t"
  22150. #else
  22151. "mul r5, r6\n\t"
  22152. #endif
  22153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22154. "lsrs r6, r5, #16\n\t"
  22155. #else
  22156. "lsr r6, r5, #16\n\t"
  22157. #endif
  22158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22159. "lsls r5, r5, #16\n\t"
  22160. #else
  22161. "lsl r5, r5, #16\n\t"
  22162. #endif
  22163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22164. "adds r4, r4, r5\n\t"
  22165. #else
  22166. "add r4, r4, r5\n\t"
  22167. #endif
  22168. #ifdef WOLFSSL_KEIL
  22169. "adcs r3, r3, r6\n\t"
  22170. #elif defined(__clang__)
  22171. "adcs r3, r6\n\t"
  22172. #else
  22173. "adc r3, r6\n\t"
  22174. #endif
  22175. #ifdef WOLFSSL_KEIL
  22176. "adcs r7, r7, r7\n\t"
  22177. #elif defined(__clang__)
  22178. "adcs r7, r7\n\t"
  22179. #else
  22180. "adc r7, r7\n\t"
  22181. #endif
  22182. "mov r5, r10\n\t"
  22183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22184. "lsrs r6, %[mp], #16\n\t"
  22185. #else
  22186. "lsr r6, %[mp], #16\n\t"
  22187. #endif
  22188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22189. "lsrs r5, r5, #16\n\t"
  22190. #else
  22191. "lsr r5, r5, #16\n\t"
  22192. #endif
  22193. #ifdef WOLFSSL_KEIL
  22194. "muls r6, r5, r6\n\t"
  22195. #elif defined(__clang__)
  22196. "muls r6, r5\n\t"
  22197. #else
  22198. "mul r6, r5\n\t"
  22199. #endif
  22200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22201. "adds r3, r3, r6\n\t"
  22202. #else
  22203. "add r3, r3, r6\n\t"
  22204. #endif
  22205. #ifdef WOLFSSL_KEIL
  22206. "adcs r7, r7, r7\n\t"
  22207. #elif defined(__clang__)
  22208. "adcs r7, r7\n\t"
  22209. #else
  22210. "adc r7, r7\n\t"
  22211. #endif
  22212. "uxth r6, %[mp]\n\t"
  22213. #ifdef WOLFSSL_KEIL
  22214. "muls r5, r6, r5\n\t"
  22215. #elif defined(__clang__)
  22216. "muls r5, r6\n\t"
  22217. #else
  22218. "mul r5, r6\n\t"
  22219. #endif
  22220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22221. "lsrs r6, r5, #16\n\t"
  22222. #else
  22223. "lsr r6, r5, #16\n\t"
  22224. #endif
  22225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22226. "lsls r5, r5, #16\n\t"
  22227. #else
  22228. "lsl r5, r5, #16\n\t"
  22229. #endif
  22230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22231. "adds r4, r4, r5\n\t"
  22232. #else
  22233. "add r4, r4, r5\n\t"
  22234. #endif
  22235. #ifdef WOLFSSL_KEIL
  22236. "adcs r3, r3, r6\n\t"
  22237. #elif defined(__clang__)
  22238. "adcs r3, r6\n\t"
  22239. #else
  22240. "adc r3, r6\n\t"
  22241. #endif
  22242. #ifdef WOLFSSL_KEIL
  22243. "adcs r7, r7, r7\n\t"
  22244. #elif defined(__clang__)
  22245. "adcs r7, r7\n\t"
  22246. #else
  22247. "adc r7, r7\n\t"
  22248. #endif
  22249. "# Multiply m[31] and mu - Done\n\t"
  22250. "ldr r5, [%[a]]\n\t"
  22251. "ldr r6, [%[a], #4]\n\t"
  22252. "movs %[mp], #0\n\t"
  22253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22254. "adds r5, r5, r4\n\t"
  22255. #else
  22256. "add r5, r5, r4\n\t"
  22257. #endif
  22258. #ifdef WOLFSSL_KEIL
  22259. "adcs r6, r6, r3\n\t"
  22260. #elif defined(__clang__)
  22261. "adcs r6, r3\n\t"
  22262. #else
  22263. "adc r6, r3\n\t"
  22264. #endif
  22265. #ifdef WOLFSSL_KEIL
  22266. "adcs r7, r7, %[mp]\n\t"
  22267. #elif defined(__clang__)
  22268. "adcs r7, %[mp]\n\t"
  22269. #else
  22270. "adc r7, %[mp]\n\t"
  22271. #endif
  22272. "stm %[a]!, {r5, r6}\n\t"
  22273. "# i += 1\n\t"
  22274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22275. "subs %[a], %[a], #4\n\t"
  22276. #else
  22277. "sub %[a], %[a], #4\n\t"
  22278. #endif
  22279. "movs r3, #0x7c\n\t"
  22280. "mov r9, %[a]\n\t"
  22281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22282. "subs %[a], %[a], r3\n\t"
  22283. #else
  22284. "sub %[a], %[a], r3\n\t"
  22285. #endif
  22286. "mov r12, r7\n\t"
  22287. "mov %[m], lr\n\t"
  22288. "cmp r11, %[a]\n\t"
  22289. "bgt L_sp_2048_mont_reduce_32_mod_%=\n\t"
  22290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22291. "negs r7, r7\n\t"
  22292. #else
  22293. "neg r7, r7\n\t"
  22294. #endif
  22295. "# Subtract masked modulus\n\t"
  22296. "movs r4, #0x80\n\t"
  22297. "movs %[mp], #0\n\t"
  22298. "movs r3, #0\n\t"
  22299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22300. "subs %[a], %[a], r4\n\t"
  22301. #else
  22302. "sub %[a], %[a], r4\n\t"
  22303. #endif
  22304. #ifndef WOLFSSL_SP_LARGE_CODE
  22305. "\n"
  22306. "L_sp_2048_mont_reduce_32_sub_mask_%=:\n\t"
  22307. "ldm %[m]!, {r6}\n\t"
  22308. "movs r5, #0\n\t"
  22309. #ifdef WOLFSSL_KEIL
  22310. "ands r6, r6, r7\n\t"
  22311. #elif defined(__clang__)
  22312. "ands r6, r7\n\t"
  22313. #else
  22314. "and r6, r7\n\t"
  22315. #endif
  22316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22317. "subs r5, r5, %[mp]\n\t"
  22318. #else
  22319. "sub r5, r5, %[mp]\n\t"
  22320. #endif
  22321. "ldr r5, [%[a], r4]\n\t"
  22322. #ifdef WOLFSSL_KEIL
  22323. "sbcs r5, r5, r6\n\t"
  22324. #elif defined(__clang__)
  22325. "sbcs r5, r6\n\t"
  22326. #else
  22327. "sbc r5, r6\n\t"
  22328. #endif
  22329. #ifdef WOLFSSL_KEIL
  22330. "sbcs %[mp], %[mp], %[mp]\n\t"
  22331. #elif defined(__clang__)
  22332. "sbcs %[mp], %[mp]\n\t"
  22333. #else
  22334. "sbc %[mp], %[mp]\n\t"
  22335. #endif
  22336. "stm %[a]!, {r5}\n\t"
  22337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22338. "adds r3, r3, #4\n\t"
  22339. #else
  22340. "add r3, r3, #4\n\t"
  22341. #endif
  22342. "cmp r3, r4\n\t"
  22343. "blt L_sp_2048_mont_reduce_32_sub_mask_%=\n\t"
  22344. #else /* WOLFSSL_SP_LARGE_CODE */
  22345. "ldm %[m]!, {r6}\n\t"
  22346. #ifdef WOLFSSL_KEIL
  22347. "ands r6, r6, r7\n\t"
  22348. #elif defined(__clang__)
  22349. "ands r6, r7\n\t"
  22350. #else
  22351. "and r6, r7\n\t"
  22352. #endif
  22353. "ldr r5, [%[a], r4]\n\t"
  22354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22355. "subs r5, r5, r6\n\t"
  22356. #else
  22357. "sub r5, r5, r6\n\t"
  22358. #endif
  22359. "stm %[a]!, {r5}\n\t"
  22360. "ldm %[m]!, {r6}\n\t"
  22361. #ifdef WOLFSSL_KEIL
  22362. "ands r6, r6, r7\n\t"
  22363. #elif defined(__clang__)
  22364. "ands r6, r7\n\t"
  22365. #else
  22366. "and r6, r7\n\t"
  22367. #endif
  22368. "ldr r5, [%[a], r4]\n\t"
  22369. #ifdef WOLFSSL_KEIL
  22370. "sbcs r5, r5, r6\n\t"
  22371. #elif defined(__clang__)
  22372. "sbcs r5, r6\n\t"
  22373. #else
  22374. "sbc r5, r6\n\t"
  22375. #endif
  22376. "stm %[a]!, {r5}\n\t"
  22377. "ldm %[m]!, {r6}\n\t"
  22378. #ifdef WOLFSSL_KEIL
  22379. "ands r6, r6, r7\n\t"
  22380. #elif defined(__clang__)
  22381. "ands r6, r7\n\t"
  22382. #else
  22383. "and r6, r7\n\t"
  22384. #endif
  22385. "ldr r5, [%[a], r4]\n\t"
  22386. #ifdef WOLFSSL_KEIL
  22387. "sbcs r5, r5, r6\n\t"
  22388. #elif defined(__clang__)
  22389. "sbcs r5, r6\n\t"
  22390. #else
  22391. "sbc r5, r6\n\t"
  22392. #endif
  22393. "stm %[a]!, {r5}\n\t"
  22394. "ldm %[m]!, {r6}\n\t"
  22395. #ifdef WOLFSSL_KEIL
  22396. "ands r6, r6, r7\n\t"
  22397. #elif defined(__clang__)
  22398. "ands r6, r7\n\t"
  22399. #else
  22400. "and r6, r7\n\t"
  22401. #endif
  22402. "ldr r5, [%[a], r4]\n\t"
  22403. #ifdef WOLFSSL_KEIL
  22404. "sbcs r5, r5, r6\n\t"
  22405. #elif defined(__clang__)
  22406. "sbcs r5, r6\n\t"
  22407. #else
  22408. "sbc r5, r6\n\t"
  22409. #endif
  22410. "stm %[a]!, {r5}\n\t"
  22411. "ldm %[m]!, {r6}\n\t"
  22412. #ifdef WOLFSSL_KEIL
  22413. "ands r6, r6, r7\n\t"
  22414. #elif defined(__clang__)
  22415. "ands r6, r7\n\t"
  22416. #else
  22417. "and r6, r7\n\t"
  22418. #endif
  22419. "ldr r5, [%[a], r4]\n\t"
  22420. #ifdef WOLFSSL_KEIL
  22421. "sbcs r5, r5, r6\n\t"
  22422. #elif defined(__clang__)
  22423. "sbcs r5, r6\n\t"
  22424. #else
  22425. "sbc r5, r6\n\t"
  22426. #endif
  22427. "stm %[a]!, {r5}\n\t"
  22428. "ldm %[m]!, {r6}\n\t"
  22429. #ifdef WOLFSSL_KEIL
  22430. "ands r6, r6, r7\n\t"
  22431. #elif defined(__clang__)
  22432. "ands r6, r7\n\t"
  22433. #else
  22434. "and r6, r7\n\t"
  22435. #endif
  22436. "ldr r5, [%[a], r4]\n\t"
  22437. #ifdef WOLFSSL_KEIL
  22438. "sbcs r5, r5, r6\n\t"
  22439. #elif defined(__clang__)
  22440. "sbcs r5, r6\n\t"
  22441. #else
  22442. "sbc r5, r6\n\t"
  22443. #endif
  22444. "stm %[a]!, {r5}\n\t"
  22445. "ldm %[m]!, {r6}\n\t"
  22446. #ifdef WOLFSSL_KEIL
  22447. "ands r6, r6, r7\n\t"
  22448. #elif defined(__clang__)
  22449. "ands r6, r7\n\t"
  22450. #else
  22451. "and r6, r7\n\t"
  22452. #endif
  22453. "ldr r5, [%[a], r4]\n\t"
  22454. #ifdef WOLFSSL_KEIL
  22455. "sbcs r5, r5, r6\n\t"
  22456. #elif defined(__clang__)
  22457. "sbcs r5, r6\n\t"
  22458. #else
  22459. "sbc r5, r6\n\t"
  22460. #endif
  22461. "stm %[a]!, {r5}\n\t"
  22462. "ldm %[m]!, {r6}\n\t"
  22463. #ifdef WOLFSSL_KEIL
  22464. "ands r6, r6, r7\n\t"
  22465. #elif defined(__clang__)
  22466. "ands r6, r7\n\t"
  22467. #else
  22468. "and r6, r7\n\t"
  22469. #endif
  22470. "ldr r5, [%[a], r4]\n\t"
  22471. #ifdef WOLFSSL_KEIL
  22472. "sbcs r5, r5, r6\n\t"
  22473. #elif defined(__clang__)
  22474. "sbcs r5, r6\n\t"
  22475. #else
  22476. "sbc r5, r6\n\t"
  22477. #endif
  22478. "stm %[a]!, {r5}\n\t"
  22479. "ldm %[m]!, {r6}\n\t"
  22480. #ifdef WOLFSSL_KEIL
  22481. "ands r6, r6, r7\n\t"
  22482. #elif defined(__clang__)
  22483. "ands r6, r7\n\t"
  22484. #else
  22485. "and r6, r7\n\t"
  22486. #endif
  22487. "ldr r5, [%[a], r4]\n\t"
  22488. #ifdef WOLFSSL_KEIL
  22489. "sbcs r5, r5, r6\n\t"
  22490. #elif defined(__clang__)
  22491. "sbcs r5, r6\n\t"
  22492. #else
  22493. "sbc r5, r6\n\t"
  22494. #endif
  22495. "stm %[a]!, {r5}\n\t"
  22496. "ldm %[m]!, {r6}\n\t"
  22497. #ifdef WOLFSSL_KEIL
  22498. "ands r6, r6, r7\n\t"
  22499. #elif defined(__clang__)
  22500. "ands r6, r7\n\t"
  22501. #else
  22502. "and r6, r7\n\t"
  22503. #endif
  22504. "ldr r5, [%[a], r4]\n\t"
  22505. #ifdef WOLFSSL_KEIL
  22506. "sbcs r5, r5, r6\n\t"
  22507. #elif defined(__clang__)
  22508. "sbcs r5, r6\n\t"
  22509. #else
  22510. "sbc r5, r6\n\t"
  22511. #endif
  22512. "stm %[a]!, {r5}\n\t"
  22513. "ldm %[m]!, {r6}\n\t"
  22514. #ifdef WOLFSSL_KEIL
  22515. "ands r6, r6, r7\n\t"
  22516. #elif defined(__clang__)
  22517. "ands r6, r7\n\t"
  22518. #else
  22519. "and r6, r7\n\t"
  22520. #endif
  22521. "ldr r5, [%[a], r4]\n\t"
  22522. #ifdef WOLFSSL_KEIL
  22523. "sbcs r5, r5, r6\n\t"
  22524. #elif defined(__clang__)
  22525. "sbcs r5, r6\n\t"
  22526. #else
  22527. "sbc r5, r6\n\t"
  22528. #endif
  22529. "stm %[a]!, {r5}\n\t"
  22530. "ldm %[m]!, {r6}\n\t"
  22531. #ifdef WOLFSSL_KEIL
  22532. "ands r6, r6, r7\n\t"
  22533. #elif defined(__clang__)
  22534. "ands r6, r7\n\t"
  22535. #else
  22536. "and r6, r7\n\t"
  22537. #endif
  22538. "ldr r5, [%[a], r4]\n\t"
  22539. #ifdef WOLFSSL_KEIL
  22540. "sbcs r5, r5, r6\n\t"
  22541. #elif defined(__clang__)
  22542. "sbcs r5, r6\n\t"
  22543. #else
  22544. "sbc r5, r6\n\t"
  22545. #endif
  22546. "stm %[a]!, {r5}\n\t"
  22547. "ldm %[m]!, {r6}\n\t"
  22548. #ifdef WOLFSSL_KEIL
  22549. "ands r6, r6, r7\n\t"
  22550. #elif defined(__clang__)
  22551. "ands r6, r7\n\t"
  22552. #else
  22553. "and r6, r7\n\t"
  22554. #endif
  22555. "ldr r5, [%[a], r4]\n\t"
  22556. #ifdef WOLFSSL_KEIL
  22557. "sbcs r5, r5, r6\n\t"
  22558. #elif defined(__clang__)
  22559. "sbcs r5, r6\n\t"
  22560. #else
  22561. "sbc r5, r6\n\t"
  22562. #endif
  22563. "stm %[a]!, {r5}\n\t"
  22564. "ldm %[m]!, {r6}\n\t"
  22565. #ifdef WOLFSSL_KEIL
  22566. "ands r6, r6, r7\n\t"
  22567. #elif defined(__clang__)
  22568. "ands r6, r7\n\t"
  22569. #else
  22570. "and r6, r7\n\t"
  22571. #endif
  22572. "ldr r5, [%[a], r4]\n\t"
  22573. #ifdef WOLFSSL_KEIL
  22574. "sbcs r5, r5, r6\n\t"
  22575. #elif defined(__clang__)
  22576. "sbcs r5, r6\n\t"
  22577. #else
  22578. "sbc r5, r6\n\t"
  22579. #endif
  22580. "stm %[a]!, {r5}\n\t"
  22581. "ldm %[m]!, {r6}\n\t"
  22582. #ifdef WOLFSSL_KEIL
  22583. "ands r6, r6, r7\n\t"
  22584. #elif defined(__clang__)
  22585. "ands r6, r7\n\t"
  22586. #else
  22587. "and r6, r7\n\t"
  22588. #endif
  22589. "ldr r5, [%[a], r4]\n\t"
  22590. #ifdef WOLFSSL_KEIL
  22591. "sbcs r5, r5, r6\n\t"
  22592. #elif defined(__clang__)
  22593. "sbcs r5, r6\n\t"
  22594. #else
  22595. "sbc r5, r6\n\t"
  22596. #endif
  22597. "stm %[a]!, {r5}\n\t"
  22598. "ldm %[m]!, {r6}\n\t"
  22599. #ifdef WOLFSSL_KEIL
  22600. "ands r6, r6, r7\n\t"
  22601. #elif defined(__clang__)
  22602. "ands r6, r7\n\t"
  22603. #else
  22604. "and r6, r7\n\t"
  22605. #endif
  22606. "ldr r5, [%[a], r4]\n\t"
  22607. #ifdef WOLFSSL_KEIL
  22608. "sbcs r5, r5, r6\n\t"
  22609. #elif defined(__clang__)
  22610. "sbcs r5, r6\n\t"
  22611. #else
  22612. "sbc r5, r6\n\t"
  22613. #endif
  22614. "stm %[a]!, {r5}\n\t"
  22615. "ldm %[m]!, {r6}\n\t"
  22616. #ifdef WOLFSSL_KEIL
  22617. "ands r6, r6, r7\n\t"
  22618. #elif defined(__clang__)
  22619. "ands r6, r7\n\t"
  22620. #else
  22621. "and r6, r7\n\t"
  22622. #endif
  22623. "ldr r5, [%[a], r4]\n\t"
  22624. #ifdef WOLFSSL_KEIL
  22625. "sbcs r5, r5, r6\n\t"
  22626. #elif defined(__clang__)
  22627. "sbcs r5, r6\n\t"
  22628. #else
  22629. "sbc r5, r6\n\t"
  22630. #endif
  22631. "stm %[a]!, {r5}\n\t"
  22632. "ldm %[m]!, {r6}\n\t"
  22633. #ifdef WOLFSSL_KEIL
  22634. "ands r6, r6, r7\n\t"
  22635. #elif defined(__clang__)
  22636. "ands r6, r7\n\t"
  22637. #else
  22638. "and r6, r7\n\t"
  22639. #endif
  22640. "ldr r5, [%[a], r4]\n\t"
  22641. #ifdef WOLFSSL_KEIL
  22642. "sbcs r5, r5, r6\n\t"
  22643. #elif defined(__clang__)
  22644. "sbcs r5, r6\n\t"
  22645. #else
  22646. "sbc r5, r6\n\t"
  22647. #endif
  22648. "stm %[a]!, {r5}\n\t"
  22649. "ldm %[m]!, {r6}\n\t"
  22650. #ifdef WOLFSSL_KEIL
  22651. "ands r6, r6, r7\n\t"
  22652. #elif defined(__clang__)
  22653. "ands r6, r7\n\t"
  22654. #else
  22655. "and r6, r7\n\t"
  22656. #endif
  22657. "ldr r5, [%[a], r4]\n\t"
  22658. #ifdef WOLFSSL_KEIL
  22659. "sbcs r5, r5, r6\n\t"
  22660. #elif defined(__clang__)
  22661. "sbcs r5, r6\n\t"
  22662. #else
  22663. "sbc r5, r6\n\t"
  22664. #endif
  22665. "stm %[a]!, {r5}\n\t"
  22666. "ldm %[m]!, {r6}\n\t"
  22667. #ifdef WOLFSSL_KEIL
  22668. "ands r6, r6, r7\n\t"
  22669. #elif defined(__clang__)
  22670. "ands r6, r7\n\t"
  22671. #else
  22672. "and r6, r7\n\t"
  22673. #endif
  22674. "ldr r5, [%[a], r4]\n\t"
  22675. #ifdef WOLFSSL_KEIL
  22676. "sbcs r5, r5, r6\n\t"
  22677. #elif defined(__clang__)
  22678. "sbcs r5, r6\n\t"
  22679. #else
  22680. "sbc r5, r6\n\t"
  22681. #endif
  22682. "stm %[a]!, {r5}\n\t"
  22683. "ldm %[m]!, {r6}\n\t"
  22684. #ifdef WOLFSSL_KEIL
  22685. "ands r6, r6, r7\n\t"
  22686. #elif defined(__clang__)
  22687. "ands r6, r7\n\t"
  22688. #else
  22689. "and r6, r7\n\t"
  22690. #endif
  22691. "ldr r5, [%[a], r4]\n\t"
  22692. #ifdef WOLFSSL_KEIL
  22693. "sbcs r5, r5, r6\n\t"
  22694. #elif defined(__clang__)
  22695. "sbcs r5, r6\n\t"
  22696. #else
  22697. "sbc r5, r6\n\t"
  22698. #endif
  22699. "stm %[a]!, {r5}\n\t"
  22700. "ldm %[m]!, {r6}\n\t"
  22701. #ifdef WOLFSSL_KEIL
  22702. "ands r6, r6, r7\n\t"
  22703. #elif defined(__clang__)
  22704. "ands r6, r7\n\t"
  22705. #else
  22706. "and r6, r7\n\t"
  22707. #endif
  22708. "ldr r5, [%[a], r4]\n\t"
  22709. #ifdef WOLFSSL_KEIL
  22710. "sbcs r5, r5, r6\n\t"
  22711. #elif defined(__clang__)
  22712. "sbcs r5, r6\n\t"
  22713. #else
  22714. "sbc r5, r6\n\t"
  22715. #endif
  22716. "stm %[a]!, {r5}\n\t"
  22717. "ldm %[m]!, {r6}\n\t"
  22718. #ifdef WOLFSSL_KEIL
  22719. "ands r6, r6, r7\n\t"
  22720. #elif defined(__clang__)
  22721. "ands r6, r7\n\t"
  22722. #else
  22723. "and r6, r7\n\t"
  22724. #endif
  22725. "ldr r5, [%[a], r4]\n\t"
  22726. #ifdef WOLFSSL_KEIL
  22727. "sbcs r5, r5, r6\n\t"
  22728. #elif defined(__clang__)
  22729. "sbcs r5, r6\n\t"
  22730. #else
  22731. "sbc r5, r6\n\t"
  22732. #endif
  22733. "stm %[a]!, {r5}\n\t"
  22734. "ldm %[m]!, {r6}\n\t"
  22735. #ifdef WOLFSSL_KEIL
  22736. "ands r6, r6, r7\n\t"
  22737. #elif defined(__clang__)
  22738. "ands r6, r7\n\t"
  22739. #else
  22740. "and r6, r7\n\t"
  22741. #endif
  22742. "ldr r5, [%[a], r4]\n\t"
  22743. #ifdef WOLFSSL_KEIL
  22744. "sbcs r5, r5, r6\n\t"
  22745. #elif defined(__clang__)
  22746. "sbcs r5, r6\n\t"
  22747. #else
  22748. "sbc r5, r6\n\t"
  22749. #endif
  22750. "stm %[a]!, {r5}\n\t"
  22751. "ldm %[m]!, {r6}\n\t"
  22752. #ifdef WOLFSSL_KEIL
  22753. "ands r6, r6, r7\n\t"
  22754. #elif defined(__clang__)
  22755. "ands r6, r7\n\t"
  22756. #else
  22757. "and r6, r7\n\t"
  22758. #endif
  22759. "ldr r5, [%[a], r4]\n\t"
  22760. #ifdef WOLFSSL_KEIL
  22761. "sbcs r5, r5, r6\n\t"
  22762. #elif defined(__clang__)
  22763. "sbcs r5, r6\n\t"
  22764. #else
  22765. "sbc r5, r6\n\t"
  22766. #endif
  22767. "stm %[a]!, {r5}\n\t"
  22768. "ldm %[m]!, {r6}\n\t"
  22769. #ifdef WOLFSSL_KEIL
  22770. "ands r6, r6, r7\n\t"
  22771. #elif defined(__clang__)
  22772. "ands r6, r7\n\t"
  22773. #else
  22774. "and r6, r7\n\t"
  22775. #endif
  22776. "ldr r5, [%[a], r4]\n\t"
  22777. #ifdef WOLFSSL_KEIL
  22778. "sbcs r5, r5, r6\n\t"
  22779. #elif defined(__clang__)
  22780. "sbcs r5, r6\n\t"
  22781. #else
  22782. "sbc r5, r6\n\t"
  22783. #endif
  22784. "stm %[a]!, {r5}\n\t"
  22785. "ldm %[m]!, {r6}\n\t"
  22786. #ifdef WOLFSSL_KEIL
  22787. "ands r6, r6, r7\n\t"
  22788. #elif defined(__clang__)
  22789. "ands r6, r7\n\t"
  22790. #else
  22791. "and r6, r7\n\t"
  22792. #endif
  22793. "ldr r5, [%[a], r4]\n\t"
  22794. #ifdef WOLFSSL_KEIL
  22795. "sbcs r5, r5, r6\n\t"
  22796. #elif defined(__clang__)
  22797. "sbcs r5, r6\n\t"
  22798. #else
  22799. "sbc r5, r6\n\t"
  22800. #endif
  22801. "stm %[a]!, {r5}\n\t"
  22802. "ldm %[m]!, {r6}\n\t"
  22803. #ifdef WOLFSSL_KEIL
  22804. "ands r6, r6, r7\n\t"
  22805. #elif defined(__clang__)
  22806. "ands r6, r7\n\t"
  22807. #else
  22808. "and r6, r7\n\t"
  22809. #endif
  22810. "ldr r5, [%[a], r4]\n\t"
  22811. #ifdef WOLFSSL_KEIL
  22812. "sbcs r5, r5, r6\n\t"
  22813. #elif defined(__clang__)
  22814. "sbcs r5, r6\n\t"
  22815. #else
  22816. "sbc r5, r6\n\t"
  22817. #endif
  22818. "stm %[a]!, {r5}\n\t"
  22819. "ldm %[m]!, {r6}\n\t"
  22820. #ifdef WOLFSSL_KEIL
  22821. "ands r6, r6, r7\n\t"
  22822. #elif defined(__clang__)
  22823. "ands r6, r7\n\t"
  22824. #else
  22825. "and r6, r7\n\t"
  22826. #endif
  22827. "ldr r5, [%[a], r4]\n\t"
  22828. #ifdef WOLFSSL_KEIL
  22829. "sbcs r5, r5, r6\n\t"
  22830. #elif defined(__clang__)
  22831. "sbcs r5, r6\n\t"
  22832. #else
  22833. "sbc r5, r6\n\t"
  22834. #endif
  22835. "stm %[a]!, {r5}\n\t"
  22836. "ldm %[m]!, {r6}\n\t"
  22837. #ifdef WOLFSSL_KEIL
  22838. "ands r6, r6, r7\n\t"
  22839. #elif defined(__clang__)
  22840. "ands r6, r7\n\t"
  22841. #else
  22842. "and r6, r7\n\t"
  22843. #endif
  22844. "ldr r5, [%[a], r4]\n\t"
  22845. #ifdef WOLFSSL_KEIL
  22846. "sbcs r5, r5, r6\n\t"
  22847. #elif defined(__clang__)
  22848. "sbcs r5, r6\n\t"
  22849. #else
  22850. "sbc r5, r6\n\t"
  22851. #endif
  22852. "stm %[a]!, {r5}\n\t"
  22853. "ldm %[m]!, {r6}\n\t"
  22854. #ifdef WOLFSSL_KEIL
  22855. "ands r6, r6, r7\n\t"
  22856. #elif defined(__clang__)
  22857. "ands r6, r7\n\t"
  22858. #else
  22859. "and r6, r7\n\t"
  22860. #endif
  22861. "ldr r5, [%[a], r4]\n\t"
  22862. #ifdef WOLFSSL_KEIL
  22863. "sbcs r5, r5, r6\n\t"
  22864. #elif defined(__clang__)
  22865. "sbcs r5, r6\n\t"
  22866. #else
  22867. "sbc r5, r6\n\t"
  22868. #endif
  22869. "stm %[a]!, {r5}\n\t"
  22870. "ldm %[m]!, {r6}\n\t"
  22871. #ifdef WOLFSSL_KEIL
  22872. "ands r6, r6, r7\n\t"
  22873. #elif defined(__clang__)
  22874. "ands r6, r7\n\t"
  22875. #else
  22876. "and r6, r7\n\t"
  22877. #endif
  22878. "ldr r5, [%[a], r4]\n\t"
  22879. #ifdef WOLFSSL_KEIL
  22880. "sbcs r5, r5, r6\n\t"
  22881. #elif defined(__clang__)
  22882. "sbcs r5, r6\n\t"
  22883. #else
  22884. "sbc r5, r6\n\t"
  22885. #endif
  22886. "stm %[a]!, {r5}\n\t"
  22887. #endif /* WOLFSSL_SP_LARGE_CODE */
  22888. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  22889. :
  22890. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  22891. );
  22892. }
  22893. /* Multiply two Montgomery form numbers mod the modulus (prime).
  22894. * (r = a * b mod m)
  22895. *
  22896. * r Result of multiplication.
  22897. * a First number to multiply in Montgomery form.
  22898. * b Second number to multiply in Montgomery form.
  22899. * m Modulus (prime).
  22900. * mp Montgomery multiplier.
  22901. */
  22902. SP_NOINLINE static void sp_2048_mont_mul_32(sp_digit* r, const sp_digit* a,
  22903. const sp_digit* b, const sp_digit* m, sp_digit mp)
  22904. {
  22905. sp_2048_mul_32(r, a, b);
  22906. sp_2048_mont_reduce_32(r, m, mp);
  22907. }
  22908. /* Square the Montgomery form number. (r = a * a mod m)
  22909. *
  22910. * r Result of squaring.
  22911. * a Number to square in Montgomery form.
  22912. * m Modulus (prime).
  22913. * mp Montgomery multiplier.
  22914. */
  22915. SP_NOINLINE static void sp_2048_mont_sqr_32(sp_digit* r, const sp_digit* a,
  22916. const sp_digit* m, sp_digit mp)
  22917. {
  22918. sp_2048_sqr_32(r, a);
  22919. sp_2048_mont_reduce_32(r, m, mp);
  22920. }
  22921. /* Mul a by digit b into r. (r = a * b)
  22922. *
  22923. * r A single precision integer.
  22924. * a A single precision integer.
  22925. * b A single precision digit.
  22926. */
  22927. SP_NOINLINE static void sp_2048_mul_d_32(sp_digit* r, const sp_digit* a,
  22928. sp_digit b)
  22929. {
  22930. __asm__ __volatile__ (
  22931. "movs r6, #0x80\n\t"
  22932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22933. "adds r6, r6, %[a]\n\t"
  22934. #else
  22935. "add r6, r6, %[a]\n\t"
  22936. #endif
  22937. "mov r8, %[r]\n\t"
  22938. "mov r9, r6\n\t"
  22939. "movs r3, #0\n\t"
  22940. "movs r4, #0\n\t"
  22941. "\n"
  22942. "L_sp_2048_mul_d_32_%=:\n\t"
  22943. "movs %[r], #0\n\t"
  22944. "movs r5, #0\n\t"
  22945. "# A[] * B\n\t"
  22946. "ldrh r6, [%[a]]\n\t"
  22947. "uxth r7, %[b]\n\t"
  22948. #ifdef WOLFSSL_KEIL
  22949. "muls r7, r6, r7\n\t"
  22950. #elif defined(__clang__)
  22951. "muls r7, r6\n\t"
  22952. #else
  22953. "mul r7, r6\n\t"
  22954. #endif
  22955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22956. "adds r3, r3, r7\n\t"
  22957. #else
  22958. "add r3, r3, r7\n\t"
  22959. #endif
  22960. #ifdef WOLFSSL_KEIL
  22961. "adcs r4, r4, %[r]\n\t"
  22962. #elif defined(__clang__)
  22963. "adcs r4, %[r]\n\t"
  22964. #else
  22965. "adc r4, %[r]\n\t"
  22966. #endif
  22967. #ifdef WOLFSSL_KEIL
  22968. "adcs r5, r5, %[r]\n\t"
  22969. #elif defined(__clang__)
  22970. "adcs r5, %[r]\n\t"
  22971. #else
  22972. "adc r5, %[r]\n\t"
  22973. #endif
  22974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22975. "lsrs r7, %[b], #16\n\t"
  22976. #else
  22977. "lsr r7, %[b], #16\n\t"
  22978. #endif
  22979. #ifdef WOLFSSL_KEIL
  22980. "muls r6, r7, r6\n\t"
  22981. #elif defined(__clang__)
  22982. "muls r6, r7\n\t"
  22983. #else
  22984. "mul r6, r7\n\t"
  22985. #endif
  22986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22987. "lsrs r7, r6, #16\n\t"
  22988. #else
  22989. "lsr r7, r6, #16\n\t"
  22990. #endif
  22991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22992. "lsls r6, r6, #16\n\t"
  22993. #else
  22994. "lsl r6, r6, #16\n\t"
  22995. #endif
  22996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22997. "adds r3, r3, r6\n\t"
  22998. #else
  22999. "add r3, r3, r6\n\t"
  23000. #endif
  23001. #ifdef WOLFSSL_KEIL
  23002. "adcs r4, r4, r7\n\t"
  23003. #elif defined(__clang__)
  23004. "adcs r4, r7\n\t"
  23005. #else
  23006. "adc r4, r7\n\t"
  23007. #endif
  23008. #ifdef WOLFSSL_KEIL
  23009. "adcs r5, r5, %[r]\n\t"
  23010. #elif defined(__clang__)
  23011. "adcs r5, %[r]\n\t"
  23012. #else
  23013. "adc r5, %[r]\n\t"
  23014. #endif
  23015. "ldr r6, [%[a]]\n\t"
  23016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23017. "lsrs r6, r6, #16\n\t"
  23018. #else
  23019. "lsr r6, r6, #16\n\t"
  23020. #endif
  23021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23022. "lsrs r7, %[b], #16\n\t"
  23023. #else
  23024. "lsr r7, %[b], #16\n\t"
  23025. #endif
  23026. #ifdef WOLFSSL_KEIL
  23027. "muls r7, r6, r7\n\t"
  23028. #elif defined(__clang__)
  23029. "muls r7, r6\n\t"
  23030. #else
  23031. "mul r7, r6\n\t"
  23032. #endif
  23033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23034. "adds r4, r4, r7\n\t"
  23035. #else
  23036. "add r4, r4, r7\n\t"
  23037. #endif
  23038. #ifdef WOLFSSL_KEIL
  23039. "adcs r5, r5, %[r]\n\t"
  23040. #elif defined(__clang__)
  23041. "adcs r5, %[r]\n\t"
  23042. #else
  23043. "adc r5, %[r]\n\t"
  23044. #endif
  23045. "uxth r7, %[b]\n\t"
  23046. #ifdef WOLFSSL_KEIL
  23047. "muls r6, r7, r6\n\t"
  23048. #elif defined(__clang__)
  23049. "muls r6, r7\n\t"
  23050. #else
  23051. "mul r6, r7\n\t"
  23052. #endif
  23053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23054. "lsrs r7, r6, #16\n\t"
  23055. #else
  23056. "lsr r7, r6, #16\n\t"
  23057. #endif
  23058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23059. "lsls r6, r6, #16\n\t"
  23060. #else
  23061. "lsl r6, r6, #16\n\t"
  23062. #endif
  23063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23064. "adds r3, r3, r6\n\t"
  23065. #else
  23066. "add r3, r3, r6\n\t"
  23067. #endif
  23068. #ifdef WOLFSSL_KEIL
  23069. "adcs r4, r4, r7\n\t"
  23070. #elif defined(__clang__)
  23071. "adcs r4, r7\n\t"
  23072. #else
  23073. "adc r4, r7\n\t"
  23074. #endif
  23075. #ifdef WOLFSSL_KEIL
  23076. "adcs r5, r5, %[r]\n\t"
  23077. #elif defined(__clang__)
  23078. "adcs r5, %[r]\n\t"
  23079. #else
  23080. "adc r5, %[r]\n\t"
  23081. #endif
  23082. "# A[] * B - Done\n\t"
  23083. "mov %[r], r8\n\t"
  23084. "str r3, [%[r]]\n\t"
  23085. "movs r3, r4\n\t"
  23086. "movs r4, r5\n\t"
  23087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23088. "adds %[r], %[r], #4\n\t"
  23089. #else
  23090. "add %[r], %[r], #4\n\t"
  23091. #endif
  23092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23093. "adds %[a], %[a], #4\n\t"
  23094. #else
  23095. "add %[a], %[a], #4\n\t"
  23096. #endif
  23097. "mov r8, %[r]\n\t"
  23098. "cmp %[a], r9\n\t"
  23099. "blt L_sp_2048_mul_d_32_%=\n\t"
  23100. "str r3, [%[r]]\n\t"
  23101. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  23102. :
  23103. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  23104. );
  23105. }
  23106. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  23107. *
  23108. * d1 The high order half of the number to divide.
  23109. * d0 The low order half of the number to divide.
  23110. * div The divisor.
  23111. * returns the result of the division.
  23112. *
  23113. * Note that this is an approximate div. It may give an answer 1 larger.
  23114. */
  23115. SP_NOINLINE static sp_digit div_2048_word_32(sp_digit d1, sp_digit d0,
  23116. sp_digit div)
  23117. {
  23118. __asm__ __volatile__ (
  23119. "movs r3, #0\n\t"
  23120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23121. "lsrs r5, %[div], #1\n\t"
  23122. #else
  23123. "lsr r5, %[div], #1\n\t"
  23124. #endif
  23125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23126. "adds r5, r5, #1\n\t"
  23127. #else
  23128. "add r5, r5, #1\n\t"
  23129. #endif
  23130. "mov r8, %[d0]\n\t"
  23131. "mov r9, %[d1]\n\t"
  23132. "# Do top 32\n\t"
  23133. "movs r6, r5\n\t"
  23134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23135. "subs r6, r6, %[d1]\n\t"
  23136. #else
  23137. "sub r6, r6, %[d1]\n\t"
  23138. #endif
  23139. #ifdef WOLFSSL_KEIL
  23140. "sbcs r6, r6, r6\n\t"
  23141. #elif defined(__clang__)
  23142. "sbcs r6, r6\n\t"
  23143. #else
  23144. "sbc r6, r6\n\t"
  23145. #endif
  23146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23147. "adds r3, r3, r3\n\t"
  23148. #else
  23149. "add r3, r3, r3\n\t"
  23150. #endif
  23151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23152. "subs r3, r3, r6\n\t"
  23153. #else
  23154. "sub r3, r3, r6\n\t"
  23155. #endif
  23156. #ifdef WOLFSSL_KEIL
  23157. "ands r6, r6, r5\n\t"
  23158. #elif defined(__clang__)
  23159. "ands r6, r5\n\t"
  23160. #else
  23161. "and r6, r5\n\t"
  23162. #endif
  23163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23164. "subs %[d1], %[d1], r6\n\t"
  23165. #else
  23166. "sub %[d1], %[d1], r6\n\t"
  23167. #endif
  23168. "movs r4, #29\n\t"
  23169. "\n"
  23170. "L_div_2048_word_32_loop_%=:\n\t"
  23171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23172. "lsls %[d0], %[d0], #1\n\t"
  23173. #else
  23174. "lsl %[d0], %[d0], #1\n\t"
  23175. #endif
  23176. #ifdef WOLFSSL_KEIL
  23177. "adcs %[d1], %[d1], %[d1]\n\t"
  23178. #elif defined(__clang__)
  23179. "adcs %[d1], %[d1]\n\t"
  23180. #else
  23181. "adc %[d1], %[d1]\n\t"
  23182. #endif
  23183. "movs r6, r5\n\t"
  23184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23185. "subs r6, r6, %[d1]\n\t"
  23186. #else
  23187. "sub r6, r6, %[d1]\n\t"
  23188. #endif
  23189. #ifdef WOLFSSL_KEIL
  23190. "sbcs r6, r6, r6\n\t"
  23191. #elif defined(__clang__)
  23192. "sbcs r6, r6\n\t"
  23193. #else
  23194. "sbc r6, r6\n\t"
  23195. #endif
  23196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23197. "adds r3, r3, r3\n\t"
  23198. #else
  23199. "add r3, r3, r3\n\t"
  23200. #endif
  23201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23202. "subs r3, r3, r6\n\t"
  23203. #else
  23204. "sub r3, r3, r6\n\t"
  23205. #endif
  23206. #ifdef WOLFSSL_KEIL
  23207. "ands r6, r6, r5\n\t"
  23208. #elif defined(__clang__)
  23209. "ands r6, r5\n\t"
  23210. #else
  23211. "and r6, r5\n\t"
  23212. #endif
  23213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23214. "subs %[d1], %[d1], r6\n\t"
  23215. #else
  23216. "sub %[d1], %[d1], r6\n\t"
  23217. #endif
  23218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23219. "subs r4, r4, #1\n\t"
  23220. #else
  23221. "sub r4, r4, #1\n\t"
  23222. #endif
  23223. "bpl L_div_2048_word_32_loop_%=\n\t"
  23224. "movs r7, #0\n\t"
  23225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23226. "adds r3, r3, r3\n\t"
  23227. #else
  23228. "add r3, r3, r3\n\t"
  23229. #endif
  23230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23231. "adds r3, r3, #1\n\t"
  23232. #else
  23233. "add r3, r3, #1\n\t"
  23234. #endif
  23235. "# r * div - Start\n\t"
  23236. "uxth %[d1], r3\n\t"
  23237. "uxth r4, %[div]\n\t"
  23238. #ifdef WOLFSSL_KEIL
  23239. "muls r4, %[d1], r4\n\t"
  23240. #elif defined(__clang__)
  23241. "muls r4, %[d1]\n\t"
  23242. #else
  23243. "mul r4, %[d1]\n\t"
  23244. #endif
  23245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23246. "lsrs r6, %[div], #16\n\t"
  23247. #else
  23248. "lsr r6, %[div], #16\n\t"
  23249. #endif
  23250. #ifdef WOLFSSL_KEIL
  23251. "muls %[d1], r6, %[d1]\n\t"
  23252. #elif defined(__clang__)
  23253. "muls %[d1], r6\n\t"
  23254. #else
  23255. "mul %[d1], r6\n\t"
  23256. #endif
  23257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23258. "lsrs r5, %[d1], #16\n\t"
  23259. #else
  23260. "lsr r5, %[d1], #16\n\t"
  23261. #endif
  23262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23263. "lsls %[d1], %[d1], #16\n\t"
  23264. #else
  23265. "lsl %[d1], %[d1], #16\n\t"
  23266. #endif
  23267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23268. "adds r4, r4, %[d1]\n\t"
  23269. #else
  23270. "add r4, r4, %[d1]\n\t"
  23271. #endif
  23272. #ifdef WOLFSSL_KEIL
  23273. "adcs r5, r5, r7\n\t"
  23274. #elif defined(__clang__)
  23275. "adcs r5, r7\n\t"
  23276. #else
  23277. "adc r5, r7\n\t"
  23278. #endif
  23279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23280. "lsrs %[d1], r3, #16\n\t"
  23281. #else
  23282. "lsr %[d1], r3, #16\n\t"
  23283. #endif
  23284. #ifdef WOLFSSL_KEIL
  23285. "muls r6, %[d1], r6\n\t"
  23286. #elif defined(__clang__)
  23287. "muls r6, %[d1]\n\t"
  23288. #else
  23289. "mul r6, %[d1]\n\t"
  23290. #endif
  23291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23292. "adds r5, r5, r6\n\t"
  23293. #else
  23294. "add r5, r5, r6\n\t"
  23295. #endif
  23296. "uxth r6, %[div]\n\t"
  23297. #ifdef WOLFSSL_KEIL
  23298. "muls %[d1], r6, %[d1]\n\t"
  23299. #elif defined(__clang__)
  23300. "muls %[d1], r6\n\t"
  23301. #else
  23302. "mul %[d1], r6\n\t"
  23303. #endif
  23304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23305. "lsrs r6, %[d1], #16\n\t"
  23306. #else
  23307. "lsr r6, %[d1], #16\n\t"
  23308. #endif
  23309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23310. "lsls %[d1], %[d1], #16\n\t"
  23311. #else
  23312. "lsl %[d1], %[d1], #16\n\t"
  23313. #endif
  23314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23315. "adds r4, r4, %[d1]\n\t"
  23316. #else
  23317. "add r4, r4, %[d1]\n\t"
  23318. #endif
  23319. #ifdef WOLFSSL_KEIL
  23320. "adcs r5, r5, r6\n\t"
  23321. #elif defined(__clang__)
  23322. "adcs r5, r6\n\t"
  23323. #else
  23324. "adc r5, r6\n\t"
  23325. #endif
  23326. "# r * div - Done\n\t"
  23327. "mov %[d1], r8\n\t"
  23328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23329. "subs %[d1], %[d1], r4\n\t"
  23330. #else
  23331. "sub %[d1], %[d1], r4\n\t"
  23332. #endif
  23333. "movs r4, %[d1]\n\t"
  23334. "mov %[d1], r9\n\t"
  23335. #ifdef WOLFSSL_KEIL
  23336. "sbcs %[d1], %[d1], r5\n\t"
  23337. #elif defined(__clang__)
  23338. "sbcs %[d1], r5\n\t"
  23339. #else
  23340. "sbc %[d1], r5\n\t"
  23341. #endif
  23342. "movs r5, %[d1]\n\t"
  23343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23344. "adds r3, r3, r5\n\t"
  23345. #else
  23346. "add r3, r3, r5\n\t"
  23347. #endif
  23348. "# r * div - Start\n\t"
  23349. "uxth %[d1], r3\n\t"
  23350. "uxth r4, %[div]\n\t"
  23351. #ifdef WOLFSSL_KEIL
  23352. "muls r4, %[d1], r4\n\t"
  23353. #elif defined(__clang__)
  23354. "muls r4, %[d1]\n\t"
  23355. #else
  23356. "mul r4, %[d1]\n\t"
  23357. #endif
  23358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23359. "lsrs r6, %[div], #16\n\t"
  23360. #else
  23361. "lsr r6, %[div], #16\n\t"
  23362. #endif
  23363. #ifdef WOLFSSL_KEIL
  23364. "muls %[d1], r6, %[d1]\n\t"
  23365. #elif defined(__clang__)
  23366. "muls %[d1], r6\n\t"
  23367. #else
  23368. "mul %[d1], r6\n\t"
  23369. #endif
  23370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23371. "lsrs r5, %[d1], #16\n\t"
  23372. #else
  23373. "lsr r5, %[d1], #16\n\t"
  23374. #endif
  23375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23376. "lsls %[d1], %[d1], #16\n\t"
  23377. #else
  23378. "lsl %[d1], %[d1], #16\n\t"
  23379. #endif
  23380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23381. "adds r4, r4, %[d1]\n\t"
  23382. #else
  23383. "add r4, r4, %[d1]\n\t"
  23384. #endif
  23385. #ifdef WOLFSSL_KEIL
  23386. "adcs r5, r5, r7\n\t"
  23387. #elif defined(__clang__)
  23388. "adcs r5, r7\n\t"
  23389. #else
  23390. "adc r5, r7\n\t"
  23391. #endif
  23392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23393. "lsrs %[d1], r3, #16\n\t"
  23394. #else
  23395. "lsr %[d1], r3, #16\n\t"
  23396. #endif
  23397. #ifdef WOLFSSL_KEIL
  23398. "muls r6, %[d1], r6\n\t"
  23399. #elif defined(__clang__)
  23400. "muls r6, %[d1]\n\t"
  23401. #else
  23402. "mul r6, %[d1]\n\t"
  23403. #endif
  23404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23405. "adds r5, r5, r6\n\t"
  23406. #else
  23407. "add r5, r5, r6\n\t"
  23408. #endif
  23409. "uxth r6, %[div]\n\t"
  23410. #ifdef WOLFSSL_KEIL
  23411. "muls %[d1], r6, %[d1]\n\t"
  23412. #elif defined(__clang__)
  23413. "muls %[d1], r6\n\t"
  23414. #else
  23415. "mul %[d1], r6\n\t"
  23416. #endif
  23417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23418. "lsrs r6, %[d1], #16\n\t"
  23419. #else
  23420. "lsr r6, %[d1], #16\n\t"
  23421. #endif
  23422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23423. "lsls %[d1], %[d1], #16\n\t"
  23424. #else
  23425. "lsl %[d1], %[d1], #16\n\t"
  23426. #endif
  23427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23428. "adds r4, r4, %[d1]\n\t"
  23429. #else
  23430. "add r4, r4, %[d1]\n\t"
  23431. #endif
  23432. #ifdef WOLFSSL_KEIL
  23433. "adcs r5, r5, r6\n\t"
  23434. #elif defined(__clang__)
  23435. "adcs r5, r6\n\t"
  23436. #else
  23437. "adc r5, r6\n\t"
  23438. #endif
  23439. "# r * div - Done\n\t"
  23440. "mov %[d1], r8\n\t"
  23441. "mov r6, r9\n\t"
  23442. #ifdef WOLFSSL_KEIL
  23443. "subs r4, %[d1], r4\n\t"
  23444. #else
  23445. #ifdef __clang__
  23446. "subs r4, %[d1], r4\n\t"
  23447. #else
  23448. "sub r4, %[d1], r4\n\t"
  23449. #endif
  23450. #endif
  23451. #ifdef WOLFSSL_KEIL
  23452. "sbcs r6, r6, r5\n\t"
  23453. #elif defined(__clang__)
  23454. "sbcs r6, r5\n\t"
  23455. #else
  23456. "sbc r6, r5\n\t"
  23457. #endif
  23458. "movs r5, r6\n\t"
  23459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23460. "adds r3, r3, r5\n\t"
  23461. #else
  23462. "add r3, r3, r5\n\t"
  23463. #endif
  23464. "# r * div - Start\n\t"
  23465. "uxth %[d1], r3\n\t"
  23466. "uxth r4, %[div]\n\t"
  23467. #ifdef WOLFSSL_KEIL
  23468. "muls r4, %[d1], r4\n\t"
  23469. #elif defined(__clang__)
  23470. "muls r4, %[d1]\n\t"
  23471. #else
  23472. "mul r4, %[d1]\n\t"
  23473. #endif
  23474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23475. "lsrs r6, %[div], #16\n\t"
  23476. #else
  23477. "lsr r6, %[div], #16\n\t"
  23478. #endif
  23479. #ifdef WOLFSSL_KEIL
  23480. "muls %[d1], r6, %[d1]\n\t"
  23481. #elif defined(__clang__)
  23482. "muls %[d1], r6\n\t"
  23483. #else
  23484. "mul %[d1], r6\n\t"
  23485. #endif
  23486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23487. "lsrs r5, %[d1], #16\n\t"
  23488. #else
  23489. "lsr r5, %[d1], #16\n\t"
  23490. #endif
  23491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23492. "lsls %[d1], %[d1], #16\n\t"
  23493. #else
  23494. "lsl %[d1], %[d1], #16\n\t"
  23495. #endif
  23496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23497. "adds r4, r4, %[d1]\n\t"
  23498. #else
  23499. "add r4, r4, %[d1]\n\t"
  23500. #endif
  23501. #ifdef WOLFSSL_KEIL
  23502. "adcs r5, r5, r7\n\t"
  23503. #elif defined(__clang__)
  23504. "adcs r5, r7\n\t"
  23505. #else
  23506. "adc r5, r7\n\t"
  23507. #endif
  23508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23509. "lsrs %[d1], r3, #16\n\t"
  23510. #else
  23511. "lsr %[d1], r3, #16\n\t"
  23512. #endif
  23513. #ifdef WOLFSSL_KEIL
  23514. "muls r6, %[d1], r6\n\t"
  23515. #elif defined(__clang__)
  23516. "muls r6, %[d1]\n\t"
  23517. #else
  23518. "mul r6, %[d1]\n\t"
  23519. #endif
  23520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23521. "adds r5, r5, r6\n\t"
  23522. #else
  23523. "add r5, r5, r6\n\t"
  23524. #endif
  23525. "uxth r6, %[div]\n\t"
  23526. #ifdef WOLFSSL_KEIL
  23527. "muls %[d1], r6, %[d1]\n\t"
  23528. #elif defined(__clang__)
  23529. "muls %[d1], r6\n\t"
  23530. #else
  23531. "mul %[d1], r6\n\t"
  23532. #endif
  23533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23534. "lsrs r6, %[d1], #16\n\t"
  23535. #else
  23536. "lsr r6, %[d1], #16\n\t"
  23537. #endif
  23538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23539. "lsls %[d1], %[d1], #16\n\t"
  23540. #else
  23541. "lsl %[d1], %[d1], #16\n\t"
  23542. #endif
  23543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23544. "adds r4, r4, %[d1]\n\t"
  23545. #else
  23546. "add r4, r4, %[d1]\n\t"
  23547. #endif
  23548. #ifdef WOLFSSL_KEIL
  23549. "adcs r5, r5, r6\n\t"
  23550. #elif defined(__clang__)
  23551. "adcs r5, r6\n\t"
  23552. #else
  23553. "adc r5, r6\n\t"
  23554. #endif
  23555. "# r * div - Done\n\t"
  23556. "mov %[d1], r8\n\t"
  23557. "mov r6, r9\n\t"
  23558. #ifdef WOLFSSL_KEIL
  23559. "subs r4, %[d1], r4\n\t"
  23560. #else
  23561. #ifdef __clang__
  23562. "subs r4, %[d1], r4\n\t"
  23563. #else
  23564. "sub r4, %[d1], r4\n\t"
  23565. #endif
  23566. #endif
  23567. #ifdef WOLFSSL_KEIL
  23568. "sbcs r6, r6, r5\n\t"
  23569. #elif defined(__clang__)
  23570. "sbcs r6, r5\n\t"
  23571. #else
  23572. "sbc r6, r5\n\t"
  23573. #endif
  23574. "movs r5, r6\n\t"
  23575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23576. "adds r3, r3, r5\n\t"
  23577. #else
  23578. "add r3, r3, r5\n\t"
  23579. #endif
  23580. "# r * div - Start\n\t"
  23581. "uxth %[d1], r3\n\t"
  23582. "uxth r4, %[div]\n\t"
  23583. #ifdef WOLFSSL_KEIL
  23584. "muls r4, %[d1], r4\n\t"
  23585. #elif defined(__clang__)
  23586. "muls r4, %[d1]\n\t"
  23587. #else
  23588. "mul r4, %[d1]\n\t"
  23589. #endif
  23590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23591. "lsrs r6, %[div], #16\n\t"
  23592. #else
  23593. "lsr r6, %[div], #16\n\t"
  23594. #endif
  23595. #ifdef WOLFSSL_KEIL
  23596. "muls %[d1], r6, %[d1]\n\t"
  23597. #elif defined(__clang__)
  23598. "muls %[d1], r6\n\t"
  23599. #else
  23600. "mul %[d1], r6\n\t"
  23601. #endif
  23602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23603. "lsrs r5, %[d1], #16\n\t"
  23604. #else
  23605. "lsr r5, %[d1], #16\n\t"
  23606. #endif
  23607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23608. "lsls %[d1], %[d1], #16\n\t"
  23609. #else
  23610. "lsl %[d1], %[d1], #16\n\t"
  23611. #endif
  23612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23613. "adds r4, r4, %[d1]\n\t"
  23614. #else
  23615. "add r4, r4, %[d1]\n\t"
  23616. #endif
  23617. #ifdef WOLFSSL_KEIL
  23618. "adcs r5, r5, r7\n\t"
  23619. #elif defined(__clang__)
  23620. "adcs r5, r7\n\t"
  23621. #else
  23622. "adc r5, r7\n\t"
  23623. #endif
  23624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23625. "lsrs %[d1], r3, #16\n\t"
  23626. #else
  23627. "lsr %[d1], r3, #16\n\t"
  23628. #endif
  23629. #ifdef WOLFSSL_KEIL
  23630. "muls r6, %[d1], r6\n\t"
  23631. #elif defined(__clang__)
  23632. "muls r6, %[d1]\n\t"
  23633. #else
  23634. "mul r6, %[d1]\n\t"
  23635. #endif
  23636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23637. "adds r5, r5, r6\n\t"
  23638. #else
  23639. "add r5, r5, r6\n\t"
  23640. #endif
  23641. "uxth r6, %[div]\n\t"
  23642. #ifdef WOLFSSL_KEIL
  23643. "muls %[d1], r6, %[d1]\n\t"
  23644. #elif defined(__clang__)
  23645. "muls %[d1], r6\n\t"
  23646. #else
  23647. "mul %[d1], r6\n\t"
  23648. #endif
  23649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23650. "lsrs r6, %[d1], #16\n\t"
  23651. #else
  23652. "lsr r6, %[d1], #16\n\t"
  23653. #endif
  23654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23655. "lsls %[d1], %[d1], #16\n\t"
  23656. #else
  23657. "lsl %[d1], %[d1], #16\n\t"
  23658. #endif
  23659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23660. "adds r4, r4, %[d1]\n\t"
  23661. #else
  23662. "add r4, r4, %[d1]\n\t"
  23663. #endif
  23664. #ifdef WOLFSSL_KEIL
  23665. "adcs r5, r5, r6\n\t"
  23666. #elif defined(__clang__)
  23667. "adcs r5, r6\n\t"
  23668. #else
  23669. "adc r5, r6\n\t"
  23670. #endif
  23671. "# r * div - Done\n\t"
  23672. "mov %[d1], r8\n\t"
  23673. "mov r6, r9\n\t"
  23674. #ifdef WOLFSSL_KEIL
  23675. "subs r4, %[d1], r4\n\t"
  23676. #else
  23677. #ifdef __clang__
  23678. "subs r4, %[d1], r4\n\t"
  23679. #else
  23680. "sub r4, %[d1], r4\n\t"
  23681. #endif
  23682. #endif
  23683. #ifdef WOLFSSL_KEIL
  23684. "sbcs r6, r6, r5\n\t"
  23685. #elif defined(__clang__)
  23686. "sbcs r6, r5\n\t"
  23687. #else
  23688. "sbc r6, r5\n\t"
  23689. #endif
  23690. "movs r5, r6\n\t"
  23691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23692. "adds r3, r3, r5\n\t"
  23693. #else
  23694. "add r3, r3, r5\n\t"
  23695. #endif
  23696. "movs r6, %[div]\n\t"
  23697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23698. "subs r6, r6, r4\n\t"
  23699. #else
  23700. "sub r6, r6, r4\n\t"
  23701. #endif
  23702. #ifdef WOLFSSL_KEIL
  23703. "sbcs r6, r6, r6\n\t"
  23704. #elif defined(__clang__)
  23705. "sbcs r6, r6\n\t"
  23706. #else
  23707. "sbc r6, r6\n\t"
  23708. #endif
  23709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23710. "subs r3, r3, r6\n\t"
  23711. #else
  23712. "sub r3, r3, r6\n\t"
  23713. #endif
  23714. "movs %[d1], r3\n\t"
  23715. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  23716. :
  23717. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  23718. );
  23719. return (uint32_t)(size_t)d1;
  23720. }
  23721. /* Compare a with b in constant time.
  23722. *
  23723. * a A single precision integer.
  23724. * b A single precision integer.
  23725. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  23726. * respectively.
  23727. */
  23728. SP_NOINLINE static sp_int32 sp_2048_cmp_32(const sp_digit* a, const sp_digit* b)
  23729. {
  23730. __asm__ __volatile__ (
  23731. "movs r2, #0\n\t"
  23732. "movs r3, #0\n\t"
  23733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23734. "mvns r3, r3\n\t"
  23735. #else
  23736. "mvn r3, r3\n\t"
  23737. #endif
  23738. "movs r6, #0x7c\n\t"
  23739. "\n"
  23740. "L_sp_2048_cmp_32_words_%=:\n\t"
  23741. "ldr r7, [%[a], r6]\n\t"
  23742. "ldr r5, [%[b], r6]\n\t"
  23743. #ifdef WOLFSSL_KEIL
  23744. "ands r7, r7, r3\n\t"
  23745. #elif defined(__clang__)
  23746. "ands r7, r3\n\t"
  23747. #else
  23748. "and r7, r3\n\t"
  23749. #endif
  23750. #ifdef WOLFSSL_KEIL
  23751. "ands r5, r5, r3\n\t"
  23752. #elif defined(__clang__)
  23753. "ands r5, r3\n\t"
  23754. #else
  23755. "and r5, r3\n\t"
  23756. #endif
  23757. "movs r4, r7\n\t"
  23758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23759. "subs r7, r7, r5\n\t"
  23760. #else
  23761. "sub r7, r7, r5\n\t"
  23762. #endif
  23763. #ifdef WOLFSSL_KEIL
  23764. "sbcs r7, r7, r7\n\t"
  23765. #elif defined(__clang__)
  23766. "sbcs r7, r7\n\t"
  23767. #else
  23768. "sbc r7, r7\n\t"
  23769. #endif
  23770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23771. "adds r2, r2, r7\n\t"
  23772. #else
  23773. "add r2, r2, r7\n\t"
  23774. #endif
  23775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23776. "mvns r7, r7\n\t"
  23777. #else
  23778. "mvn r7, r7\n\t"
  23779. #endif
  23780. #ifdef WOLFSSL_KEIL
  23781. "ands r3, r3, r7\n\t"
  23782. #elif defined(__clang__)
  23783. "ands r3, r7\n\t"
  23784. #else
  23785. "and r3, r7\n\t"
  23786. #endif
  23787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23788. "subs r5, r5, r4\n\t"
  23789. #else
  23790. "sub r5, r5, r4\n\t"
  23791. #endif
  23792. #ifdef WOLFSSL_KEIL
  23793. "sbcs r7, r7, r7\n\t"
  23794. #elif defined(__clang__)
  23795. "sbcs r7, r7\n\t"
  23796. #else
  23797. "sbc r7, r7\n\t"
  23798. #endif
  23799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23800. "subs r2, r2, r7\n\t"
  23801. #else
  23802. "sub r2, r2, r7\n\t"
  23803. #endif
  23804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23805. "mvns r7, r7\n\t"
  23806. #else
  23807. "mvn r7, r7\n\t"
  23808. #endif
  23809. #ifdef WOLFSSL_KEIL
  23810. "ands r3, r3, r7\n\t"
  23811. #elif defined(__clang__)
  23812. "ands r3, r7\n\t"
  23813. #else
  23814. "and r3, r7\n\t"
  23815. #endif
  23816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23817. "subs r6, r6, #4\n\t"
  23818. #else
  23819. "sub r6, r6, #4\n\t"
  23820. #endif
  23821. "bge L_sp_2048_cmp_32_words_%=\n\t"
  23822. "movs %[a], r2\n\t"
  23823. : [a] "+l" (a), [b] "+l" (b)
  23824. :
  23825. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  23826. );
  23827. return (uint32_t)(size_t)a;
  23828. }
  23829. /* Divide d in a and put remainder into r (m*d + r = a)
  23830. * m is not calculated as it is not needed at this time.
  23831. *
  23832. * a Number to be divided.
  23833. * d Number to divide with.
  23834. * m Multiplier result.
  23835. * r Remainder from the division.
  23836. * returns MP_OKAY indicating success.
  23837. */
  23838. static WC_INLINE int sp_2048_div_32(const sp_digit* a, const sp_digit* d,
  23839. sp_digit* m, sp_digit* r)
  23840. {
  23841. sp_digit t1[64], t2[33];
  23842. sp_digit div, r1;
  23843. int i;
  23844. (void)m;
  23845. div = d[31];
  23846. XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
  23847. r1 = sp_2048_cmp_32(&t1[32], d) >= 0;
  23848. sp_2048_cond_sub_32(&t1[32], &t1[32], d, (sp_digit)0 - r1);
  23849. for (i = 31; i >= 0; i--) {
  23850. volatile sp_digit mask = (sp_digit)0 - (t1[32 + i] == div);
  23851. sp_digit hi = t1[32 + i] + mask;
  23852. r1 = div_2048_word_32(hi, t1[32 + i - 1], div);
  23853. r1 |= mask;
  23854. sp_2048_mul_d_32(t2, d, r1);
  23855. t1[32 + i] += sp_2048_sub_in_place_32(&t1[i], t2);
  23856. t1[32 + i] -= t2[32];
  23857. sp_2048_mask_32(t2, d, t1[32 + i]);
  23858. t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
  23859. sp_2048_mask_32(t2, d, t1[32 + i]);
  23860. t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
  23861. }
  23862. r1 = sp_2048_cmp_32(t1, d) >= 0;
  23863. sp_2048_cond_sub_32(r, t1, d, (sp_digit)0 - r1);
  23864. return MP_OKAY;
  23865. }
  23866. /* Reduce a modulo m into r. (r = a mod m)
  23867. *
  23868. * r A single precision number that is the reduced result.
  23869. * a A single precision number that is to be reduced.
  23870. * m A single precision number that is the modulus to reduce with.
  23871. * returns MP_OKAY indicating success.
  23872. */
  23873. static WC_INLINE int sp_2048_mod_32(sp_digit* r, const sp_digit* a, const sp_digit* m)
  23874. {
  23875. int ret;
  23876. ret = sp_2048_div_32(a, m, NULL, r);
  23877. return ret;
  23878. }
  23879. #ifdef WOLFSSL_SP_SMALL
  23880. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  23881. *
  23882. * r A single precision number that is the result of the operation.
  23883. * a A single precision number being exponentiated.
  23884. * e A single precision number that is the exponent.
  23885. * bits The number of bits in the exponent.
  23886. * m A single precision number that is the modulus.
  23887. * returns 0 on success.
  23888. * returns MEMORY_E on dynamic memory allocation failure.
  23889. * returns MP_VAL when base is even or exponent is 0.
  23890. */
  23891. static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e,
  23892. int bits, const sp_digit* m, int reduceA)
  23893. {
  23894. #ifdef WOLFSSL_SP_SMALL_STACK
  23895. sp_digit* td = NULL;
  23896. #else
  23897. sp_digit td[16 * 64];
  23898. #endif
  23899. sp_digit* t[16];
  23900. sp_digit* norm = NULL;
  23901. sp_digit mp = 1;
  23902. sp_digit n;
  23903. sp_digit mask;
  23904. int i;
  23905. int c;
  23906. byte y;
  23907. int err = MP_OKAY;
  23908. if (bits == 0) {
  23909. err = MP_VAL;
  23910. }
  23911. #ifdef WOLFSSL_SP_SMALL_STACK
  23912. if (err == MP_OKAY) {
  23913. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 64), NULL,
  23914. DYNAMIC_TYPE_TMP_BUFFER);
  23915. if (td == NULL)
  23916. err = MEMORY_E;
  23917. }
  23918. #endif
  23919. if (err == MP_OKAY) {
  23920. norm = td;
  23921. for (i=0; i<16; i++) {
  23922. t[i] = td + i * 64;
  23923. }
  23924. sp_2048_mont_setup(m, &mp);
  23925. sp_2048_mont_norm_32(norm, m);
  23926. XMEMSET(t[1], 0, sizeof(sp_digit) * 32U);
  23927. if (reduceA != 0) {
  23928. err = sp_2048_mod_32(t[1] + 32, a, m);
  23929. if (err == MP_OKAY) {
  23930. err = sp_2048_mod_32(t[1], t[1], m);
  23931. }
  23932. }
  23933. else {
  23934. XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
  23935. err = sp_2048_mod_32(t[1], t[1], m);
  23936. }
  23937. }
  23938. if (err == MP_OKAY) {
  23939. sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
  23940. sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
  23941. sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
  23942. sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
  23943. sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
  23944. sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
  23945. sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
  23946. sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
  23947. sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
  23948. sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
  23949. sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
  23950. sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
  23951. sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
  23952. sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
  23953. i = (bits - 1) / 32;
  23954. n = e[i--];
  23955. c = bits & 31;
  23956. if (c == 0) {
  23957. c = 32;
  23958. }
  23959. c -= bits % 4;
  23960. if (c == 32) {
  23961. c = 28;
  23962. }
  23963. if (c < 0) {
  23964. /* Number of bits in top word is less than number needed. */
  23965. c = -c;
  23966. y = (byte)(n << c);
  23967. n = e[i--];
  23968. y |= (byte)(n >> (64 - c));
  23969. n <<= c;
  23970. c = 64 - c;
  23971. }
  23972. else if (c == 0) {
  23973. /* All bits in top word used. */
  23974. y = (byte)n;
  23975. }
  23976. else {
  23977. y = (byte)(n >> c);
  23978. n <<= 32 - c;
  23979. }
  23980. XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
  23981. for (; i>=0 || c>=4; ) {
  23982. if (c == 0) {
  23983. n = e[i--];
  23984. y = (byte)(n >> 28);
  23985. n <<= 4;
  23986. c = 28;
  23987. }
  23988. else if (c < 4) {
  23989. y = (byte)(n >> 28);
  23990. n = e[i--];
  23991. c = 4 - c;
  23992. y |= (byte)(n >> (32 - c));
  23993. n <<= c;
  23994. c = 32 - c;
  23995. }
  23996. else {
  23997. y = (byte)((n >> 28) & 0xf);
  23998. n <<= 4;
  23999. c -= 4;
  24000. }
  24001. sp_2048_mont_sqr_32(r, r, m, mp);
  24002. sp_2048_mont_sqr_32(r, r, m, mp);
  24003. sp_2048_mont_sqr_32(r, r, m, mp);
  24004. sp_2048_mont_sqr_32(r, r, m, mp);
  24005. sp_2048_mont_mul_32(r, r, t[y], m, mp);
  24006. }
  24007. XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
  24008. sp_2048_mont_reduce_32(r, m, mp);
  24009. mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
  24010. sp_2048_cond_sub_32(r, r, m, mask);
  24011. }
  24012. #ifdef WOLFSSL_SP_SMALL_STACK
  24013. if (td != NULL)
  24014. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  24015. #endif
  24016. return err;
  24017. }
  24018. #else
  24019. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  24020. *
  24021. * r A single precision number that is the result of the operation.
  24022. * a A single precision number being exponentiated.
  24023. * e A single precision number that is the exponent.
  24024. * bits The number of bits in the exponent.
  24025. * m A single precision number that is the modulus.
  24026. * returns 0 on success.
  24027. * returns MEMORY_E on dynamic memory allocation failure.
  24028. * returns MP_VAL when base is even or exponent is 0.
  24029. */
  24030. static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e,
  24031. int bits, const sp_digit* m, int reduceA)
  24032. {
  24033. #ifdef WOLFSSL_SP_SMALL_STACK
  24034. sp_digit* td = NULL;
  24035. #else
  24036. sp_digit td[32 * 64];
  24037. #endif
  24038. sp_digit* t[32];
  24039. sp_digit* norm = NULL;
  24040. sp_digit mp = 1;
  24041. sp_digit n;
  24042. sp_digit mask;
  24043. int i;
  24044. int c;
  24045. byte y;
  24046. int err = MP_OKAY;
  24047. if (bits == 0) {
  24048. err = MP_VAL;
  24049. }
  24050. #ifdef WOLFSSL_SP_SMALL_STACK
  24051. if (err == MP_OKAY) {
  24052. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 64), NULL,
  24053. DYNAMIC_TYPE_TMP_BUFFER);
  24054. if (td == NULL)
  24055. err = MEMORY_E;
  24056. }
  24057. #endif
  24058. if (err == MP_OKAY) {
  24059. norm = td;
  24060. for (i=0; i<32; i++) {
  24061. t[i] = td + i * 64;
  24062. }
  24063. sp_2048_mont_setup(m, &mp);
  24064. sp_2048_mont_norm_32(norm, m);
  24065. XMEMSET(t[1], 0, sizeof(sp_digit) * 32U);
  24066. if (reduceA != 0) {
  24067. err = sp_2048_mod_32(t[1] + 32, a, m);
  24068. if (err == MP_OKAY) {
  24069. err = sp_2048_mod_32(t[1], t[1], m);
  24070. }
  24071. }
  24072. else {
  24073. XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
  24074. err = sp_2048_mod_32(t[1], t[1], m);
  24075. }
  24076. }
  24077. if (err == MP_OKAY) {
  24078. sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
  24079. sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
  24080. sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
  24081. sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
  24082. sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
  24083. sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
  24084. sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
  24085. sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
  24086. sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
  24087. sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
  24088. sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
  24089. sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
  24090. sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
  24091. sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
  24092. sp_2048_mont_sqr_32(t[16], t[ 8], m, mp);
  24093. sp_2048_mont_mul_32(t[17], t[ 9], t[ 8], m, mp);
  24094. sp_2048_mont_sqr_32(t[18], t[ 9], m, mp);
  24095. sp_2048_mont_mul_32(t[19], t[10], t[ 9], m, mp);
  24096. sp_2048_mont_sqr_32(t[20], t[10], m, mp);
  24097. sp_2048_mont_mul_32(t[21], t[11], t[10], m, mp);
  24098. sp_2048_mont_sqr_32(t[22], t[11], m, mp);
  24099. sp_2048_mont_mul_32(t[23], t[12], t[11], m, mp);
  24100. sp_2048_mont_sqr_32(t[24], t[12], m, mp);
  24101. sp_2048_mont_mul_32(t[25], t[13], t[12], m, mp);
  24102. sp_2048_mont_sqr_32(t[26], t[13], m, mp);
  24103. sp_2048_mont_mul_32(t[27], t[14], t[13], m, mp);
  24104. sp_2048_mont_sqr_32(t[28], t[14], m, mp);
  24105. sp_2048_mont_mul_32(t[29], t[15], t[14], m, mp);
  24106. sp_2048_mont_sqr_32(t[30], t[15], m, mp);
  24107. sp_2048_mont_mul_32(t[31], t[16], t[15], m, mp);
  24108. i = (bits - 1) / 32;
  24109. n = e[i--];
  24110. c = bits & 31;
  24111. if (c == 0) {
  24112. c = 32;
  24113. }
  24114. c -= bits % 5;
  24115. if (c == 32) {
  24116. c = 27;
  24117. }
  24118. if (c < 0) {
  24119. /* Number of bits in top word is less than number needed. */
  24120. c = -c;
  24121. y = (byte)(n << c);
  24122. n = e[i--];
  24123. y |= (byte)(n >> (64 - c));
  24124. n <<= c;
  24125. c = 64 - c;
  24126. }
  24127. else if (c == 0) {
  24128. /* All bits in top word used. */
  24129. y = (byte)n;
  24130. }
  24131. else {
  24132. y = (byte)(n >> c);
  24133. n <<= 32 - c;
  24134. }
  24135. XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
  24136. for (; i>=0 || c>=5; ) {
  24137. if (c == 0) {
  24138. n = e[i--];
  24139. y = (byte)(n >> 27);
  24140. n <<= 5;
  24141. c = 27;
  24142. }
  24143. else if (c < 5) {
  24144. y = (byte)(n >> 27);
  24145. n = e[i--];
  24146. c = 5 - c;
  24147. y |= (byte)(n >> (32 - c));
  24148. n <<= c;
  24149. c = 32 - c;
  24150. }
  24151. else {
  24152. y = (byte)((n >> 27) & 0x1f);
  24153. n <<= 5;
  24154. c -= 5;
  24155. }
  24156. sp_2048_mont_sqr_32(r, r, m, mp);
  24157. sp_2048_mont_sqr_32(r, r, m, mp);
  24158. sp_2048_mont_sqr_32(r, r, m, mp);
  24159. sp_2048_mont_sqr_32(r, r, m, mp);
  24160. sp_2048_mont_sqr_32(r, r, m, mp);
  24161. sp_2048_mont_mul_32(r, r, t[y], m, mp);
  24162. }
  24163. XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
  24164. sp_2048_mont_reduce_32(r, m, mp);
  24165. mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
  24166. sp_2048_cond_sub_32(r, r, m, mask);
  24167. }
  24168. #ifdef WOLFSSL_SP_SMALL_STACK
  24169. if (td != NULL)
  24170. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  24171. #endif
  24172. return err;
  24173. }
  24174. #endif /* WOLFSSL_SP_SMALL */
  24175. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  24176. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  24177. /* r = 2^n mod m where n is the number of bits to reduce by.
  24178. * Given m must be 2048 bits, just need to subtract.
  24179. *
  24180. * r A single precision number.
  24181. * m A single precision number.
  24182. */
  24183. static void sp_2048_mont_norm_64(sp_digit* r, const sp_digit* m)
  24184. {
  24185. XMEMSET(r, 0, sizeof(sp_digit) * 64);
  24186. /* r = 2^n mod m */
  24187. sp_2048_sub_in_place_64(r, m);
  24188. }
  24189. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  24190. /* Conditionally subtract b from a using the mask m.
  24191. * m is -1 to subtract and 0 when not copying.
  24192. *
  24193. * r A single precision number representing condition subtract result.
  24194. * a A single precision number to subtract from.
  24195. * b A single precision number to subtract.
  24196. * m Mask value to apply.
  24197. */
  24198. SP_NOINLINE static sp_digit sp_2048_cond_sub_64(sp_digit* r, const sp_digit* a,
  24199. const sp_digit* b, sp_digit m)
  24200. {
  24201. __asm__ __volatile__ (
  24202. "movs r4, #0\n\t"
  24203. "movs r5, #0xff\n\t"
  24204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24205. "adds r5, r5, #1\n\t"
  24206. #else
  24207. "add r5, r5, #1\n\t"
  24208. #endif
  24209. "mov r8, r5\n\t"
  24210. "movs r7, #0\n\t"
  24211. "\n"
  24212. "L_sp_2048_cond_sub_64_words_%=:\n\t"
  24213. "ldr r6, [%[b], r7]\n\t"
  24214. #ifdef WOLFSSL_KEIL
  24215. "ands r6, r6, %[m]\n\t"
  24216. #elif defined(__clang__)
  24217. "ands r6, %[m]\n\t"
  24218. #else
  24219. "and r6, %[m]\n\t"
  24220. #endif
  24221. "movs r5, #0\n\t"
  24222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24223. "subs r5, r5, r4\n\t"
  24224. #else
  24225. "sub r5, r5, r4\n\t"
  24226. #endif
  24227. "ldr r5, [%[a], r7]\n\t"
  24228. #ifdef WOLFSSL_KEIL
  24229. "sbcs r5, r5, r6\n\t"
  24230. #elif defined(__clang__)
  24231. "sbcs r5, r6\n\t"
  24232. #else
  24233. "sbc r5, r6\n\t"
  24234. #endif
  24235. #ifdef WOLFSSL_KEIL
  24236. "sbcs r4, r4, r4\n\t"
  24237. #elif defined(__clang__)
  24238. "sbcs r4, r4\n\t"
  24239. #else
  24240. "sbc r4, r4\n\t"
  24241. #endif
  24242. "str r5, [%[r], r7]\n\t"
  24243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24244. "adds r7, r7, #4\n\t"
  24245. #else
  24246. "add r7, r7, #4\n\t"
  24247. #endif
  24248. "cmp r7, r8\n\t"
  24249. "blt L_sp_2048_cond_sub_64_words_%=\n\t"
  24250. "movs %[r], r4\n\t"
  24251. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  24252. :
  24253. : "memory", "r4", "r5", "r6", "r7", "r8"
  24254. );
  24255. return (uint32_t)(size_t)r;
  24256. }
  24257. #define sp_2048_mont_reduce_order_64 sp_2048_mont_reduce_64
  24258. /* Reduce the number back to 2048 bits using Montgomery reduction.
  24259. *
  24260. * a A single precision number to reduce in place.
  24261. * m The single precision number representing the modulus.
  24262. * mp The digit representing the negative inverse of m mod 2^n.
  24263. */
  24264. SP_NOINLINE static void sp_2048_mont_reduce_64(sp_digit* a, const sp_digit* m,
  24265. sp_digit mp)
  24266. {
  24267. __asm__ __volatile__ (
  24268. "movs r7, #0\n\t"
  24269. "mov r8, %[mp]\n\t"
  24270. "mov r12, r7\n\t"
  24271. "mov lr, %[m]\n\t"
  24272. "mov r9, %[a]\n\t"
  24273. "mov r11, %[a]\n\t"
  24274. "movs r5, #0xfc\n\t"
  24275. "movs r6, #0xff\n\t"
  24276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24277. "adds r6, r6, #1\n\t"
  24278. #else
  24279. "add r6, r6, #1\n\t"
  24280. #endif
  24281. "add r9, r9, r5\n\t"
  24282. "add r11, r11, r6\n\t"
  24283. "\n"
  24284. "L_sp_2048_mont_reduce_64_mod_%=:\n\t"
  24285. "movs r7, #0\n\t"
  24286. "movs r4, #0\n\t"
  24287. "# a[i] += m[0] * mu\n\t"
  24288. "ldm %[m]!, {%[mp]}\n\t"
  24289. "ldm %[a]!, {r3}\n\t"
  24290. "# mu = a[i] * mp\n\t"
  24291. "mov r5, r8\n\t"
  24292. #ifdef WOLFSSL_KEIL
  24293. "muls r5, r3, r5\n\t"
  24294. #elif defined(__clang__)
  24295. "muls r5, r3\n\t"
  24296. #else
  24297. "mul r5, r3\n\t"
  24298. #endif
  24299. "mov r10, r5\n\t"
  24300. "# Multiply m[0] and mu - Start\n\t"
  24301. "mov r5, r10\n\t"
  24302. "uxth r6, %[mp]\n\t"
  24303. "uxth r5, r5\n\t"
  24304. #ifdef WOLFSSL_KEIL
  24305. "muls r6, r5, r6\n\t"
  24306. #elif defined(__clang__)
  24307. "muls r6, r5\n\t"
  24308. #else
  24309. "mul r6, r5\n\t"
  24310. #endif
  24311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24312. "adds r3, r3, r6\n\t"
  24313. #else
  24314. "add r3, r3, r6\n\t"
  24315. #endif
  24316. #ifdef WOLFSSL_KEIL
  24317. "adcs r4, r4, r7\n\t"
  24318. #elif defined(__clang__)
  24319. "adcs r4, r7\n\t"
  24320. #else
  24321. "adc r4, r7\n\t"
  24322. #endif
  24323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24324. "lsrs r6, %[mp], #16\n\t"
  24325. #else
  24326. "lsr r6, %[mp], #16\n\t"
  24327. #endif
  24328. #ifdef WOLFSSL_KEIL
  24329. "muls r5, r6, r5\n\t"
  24330. #elif defined(__clang__)
  24331. "muls r5, r6\n\t"
  24332. #else
  24333. "mul r5, r6\n\t"
  24334. #endif
  24335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24336. "lsrs r6, r5, #16\n\t"
  24337. #else
  24338. "lsr r6, r5, #16\n\t"
  24339. #endif
  24340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24341. "lsls r5, r5, #16\n\t"
  24342. #else
  24343. "lsl r5, r5, #16\n\t"
  24344. #endif
  24345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24346. "adds r3, r3, r5\n\t"
  24347. #else
  24348. "add r3, r3, r5\n\t"
  24349. #endif
  24350. #ifdef WOLFSSL_KEIL
  24351. "adcs r4, r4, r6\n\t"
  24352. #elif defined(__clang__)
  24353. "adcs r4, r6\n\t"
  24354. #else
  24355. "adc r4, r6\n\t"
  24356. #endif
  24357. "mov r5, r10\n\t"
  24358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24359. "lsrs r6, %[mp], #16\n\t"
  24360. #else
  24361. "lsr r6, %[mp], #16\n\t"
  24362. #endif
  24363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24364. "lsrs r5, r5, #16\n\t"
  24365. #else
  24366. "lsr r5, r5, #16\n\t"
  24367. #endif
  24368. #ifdef WOLFSSL_KEIL
  24369. "muls r6, r5, r6\n\t"
  24370. #elif defined(__clang__)
  24371. "muls r6, r5\n\t"
  24372. #else
  24373. "mul r6, r5\n\t"
  24374. #endif
  24375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24376. "adds r4, r4, r6\n\t"
  24377. #else
  24378. "add r4, r4, r6\n\t"
  24379. #endif
  24380. "uxth r6, %[mp]\n\t"
  24381. #ifdef WOLFSSL_KEIL
  24382. "muls r5, r6, r5\n\t"
  24383. #elif defined(__clang__)
  24384. "muls r5, r6\n\t"
  24385. #else
  24386. "mul r5, r6\n\t"
  24387. #endif
  24388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24389. "lsrs r6, r5, #16\n\t"
  24390. #else
  24391. "lsr r6, r5, #16\n\t"
  24392. #endif
  24393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24394. "lsls r5, r5, #16\n\t"
  24395. #else
  24396. "lsl r5, r5, #16\n\t"
  24397. #endif
  24398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24399. "adds r3, r3, r5\n\t"
  24400. #else
  24401. "add r3, r3, r5\n\t"
  24402. #endif
  24403. #ifdef WOLFSSL_KEIL
  24404. "adcs r4, r4, r6\n\t"
  24405. #elif defined(__clang__)
  24406. "adcs r4, r6\n\t"
  24407. #else
  24408. "adc r4, r6\n\t"
  24409. #endif
  24410. "# Multiply m[0] and mu - Done\n\t"
  24411. "\n"
  24412. "L_sp_2048_mont_reduce_64_word_%=:\n\t"
  24413. "# a[i+j] += m[j] * mu\n\t"
  24414. "ldr r3, [%[a]]\n\t"
  24415. "ldm %[m]!, {%[mp]}\n\t"
  24416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24417. "adds r3, r3, r4\n\t"
  24418. #else
  24419. "add r3, r3, r4\n\t"
  24420. #endif
  24421. "movs r4, #0\n\t"
  24422. #ifdef WOLFSSL_KEIL
  24423. "adcs r4, r4, r7\n\t"
  24424. #elif defined(__clang__)
  24425. "adcs r4, r7\n\t"
  24426. #else
  24427. "adc r4, r7\n\t"
  24428. #endif
  24429. "# Multiply m[j] and mu - Start\n\t"
  24430. "mov r5, r10\n\t"
  24431. "uxth r6, %[mp]\n\t"
  24432. "uxth r5, r5\n\t"
  24433. #ifdef WOLFSSL_KEIL
  24434. "muls r6, r5, r6\n\t"
  24435. #elif defined(__clang__)
  24436. "muls r6, r5\n\t"
  24437. #else
  24438. "mul r6, r5\n\t"
  24439. #endif
  24440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24441. "adds r3, r3, r6\n\t"
  24442. #else
  24443. "add r3, r3, r6\n\t"
  24444. #endif
  24445. #ifdef WOLFSSL_KEIL
  24446. "adcs r4, r4, r7\n\t"
  24447. #elif defined(__clang__)
  24448. "adcs r4, r7\n\t"
  24449. #else
  24450. "adc r4, r7\n\t"
  24451. #endif
  24452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24453. "lsrs r6, %[mp], #16\n\t"
  24454. #else
  24455. "lsr r6, %[mp], #16\n\t"
  24456. #endif
  24457. #ifdef WOLFSSL_KEIL
  24458. "muls r5, r6, r5\n\t"
  24459. #elif defined(__clang__)
  24460. "muls r5, r6\n\t"
  24461. #else
  24462. "mul r5, r6\n\t"
  24463. #endif
  24464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24465. "lsrs r6, r5, #16\n\t"
  24466. #else
  24467. "lsr r6, r5, #16\n\t"
  24468. #endif
  24469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24470. "lsls r5, r5, #16\n\t"
  24471. #else
  24472. "lsl r5, r5, #16\n\t"
  24473. #endif
  24474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24475. "adds r3, r3, r5\n\t"
  24476. #else
  24477. "add r3, r3, r5\n\t"
  24478. #endif
  24479. #ifdef WOLFSSL_KEIL
  24480. "adcs r4, r4, r6\n\t"
  24481. #elif defined(__clang__)
  24482. "adcs r4, r6\n\t"
  24483. #else
  24484. "adc r4, r6\n\t"
  24485. #endif
  24486. "mov r5, r10\n\t"
  24487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24488. "lsrs r6, %[mp], #16\n\t"
  24489. #else
  24490. "lsr r6, %[mp], #16\n\t"
  24491. #endif
  24492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24493. "lsrs r5, r5, #16\n\t"
  24494. #else
  24495. "lsr r5, r5, #16\n\t"
  24496. #endif
  24497. #ifdef WOLFSSL_KEIL
  24498. "muls r6, r5, r6\n\t"
  24499. #elif defined(__clang__)
  24500. "muls r6, r5\n\t"
  24501. #else
  24502. "mul r6, r5\n\t"
  24503. #endif
  24504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24505. "adds r4, r4, r6\n\t"
  24506. #else
  24507. "add r4, r4, r6\n\t"
  24508. #endif
  24509. "uxth r6, %[mp]\n\t"
  24510. #ifdef WOLFSSL_KEIL
  24511. "muls r5, r6, r5\n\t"
  24512. #elif defined(__clang__)
  24513. "muls r5, r6\n\t"
  24514. #else
  24515. "mul r5, r6\n\t"
  24516. #endif
  24517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24518. "lsrs r6, r5, #16\n\t"
  24519. #else
  24520. "lsr r6, r5, #16\n\t"
  24521. #endif
  24522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24523. "lsls r5, r5, #16\n\t"
  24524. #else
  24525. "lsl r5, r5, #16\n\t"
  24526. #endif
  24527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24528. "adds r3, r3, r5\n\t"
  24529. #else
  24530. "add r3, r3, r5\n\t"
  24531. #endif
  24532. #ifdef WOLFSSL_KEIL
  24533. "adcs r4, r4, r6\n\t"
  24534. #elif defined(__clang__)
  24535. "adcs r4, r6\n\t"
  24536. #else
  24537. "adc r4, r6\n\t"
  24538. #endif
  24539. "# Multiply m[j] and mu - Done\n\t"
  24540. "stm %[a]!, {r3}\n\t"
  24541. "cmp %[a], r9\n\t"
  24542. "blt L_sp_2048_mont_reduce_64_word_%=\n\t"
  24543. "# a[i+63] += m[63] * mu\n\t"
  24544. "ldr %[mp], [%[m]]\n\t"
  24545. "mov r3, r12\n\t"
  24546. "# Multiply m[63] and mu - Start\n\t"
  24547. "mov r5, r10\n\t"
  24548. "uxth r6, %[mp]\n\t"
  24549. "uxth r5, r5\n\t"
  24550. #ifdef WOLFSSL_KEIL
  24551. "muls r6, r5, r6\n\t"
  24552. #elif defined(__clang__)
  24553. "muls r6, r5\n\t"
  24554. #else
  24555. "mul r6, r5\n\t"
  24556. #endif
  24557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24558. "adds r4, r4, r6\n\t"
  24559. #else
  24560. "add r4, r4, r6\n\t"
  24561. #endif
  24562. #ifdef WOLFSSL_KEIL
  24563. "adcs r3, r3, r7\n\t"
  24564. #elif defined(__clang__)
  24565. "adcs r3, r7\n\t"
  24566. #else
  24567. "adc r3, r7\n\t"
  24568. #endif
  24569. #ifdef WOLFSSL_KEIL
  24570. "adcs r7, r7, r7\n\t"
  24571. #elif defined(__clang__)
  24572. "adcs r7, r7\n\t"
  24573. #else
  24574. "adc r7, r7\n\t"
  24575. #endif
  24576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24577. "lsrs r6, %[mp], #16\n\t"
  24578. #else
  24579. "lsr r6, %[mp], #16\n\t"
  24580. #endif
  24581. #ifdef WOLFSSL_KEIL
  24582. "muls r5, r6, r5\n\t"
  24583. #elif defined(__clang__)
  24584. "muls r5, r6\n\t"
  24585. #else
  24586. "mul r5, r6\n\t"
  24587. #endif
  24588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24589. "lsrs r6, r5, #16\n\t"
  24590. #else
  24591. "lsr r6, r5, #16\n\t"
  24592. #endif
  24593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24594. "lsls r5, r5, #16\n\t"
  24595. #else
  24596. "lsl r5, r5, #16\n\t"
  24597. #endif
  24598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24599. "adds r4, r4, r5\n\t"
  24600. #else
  24601. "add r4, r4, r5\n\t"
  24602. #endif
  24603. #ifdef WOLFSSL_KEIL
  24604. "adcs r3, r3, r6\n\t"
  24605. #elif defined(__clang__)
  24606. "adcs r3, r6\n\t"
  24607. #else
  24608. "adc r3, r6\n\t"
  24609. #endif
  24610. #ifdef WOLFSSL_KEIL
  24611. "adcs r7, r7, r7\n\t"
  24612. #elif defined(__clang__)
  24613. "adcs r7, r7\n\t"
  24614. #else
  24615. "adc r7, r7\n\t"
  24616. #endif
  24617. "mov r5, r10\n\t"
  24618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24619. "lsrs r6, %[mp], #16\n\t"
  24620. #else
  24621. "lsr r6, %[mp], #16\n\t"
  24622. #endif
  24623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24624. "lsrs r5, r5, #16\n\t"
  24625. #else
  24626. "lsr r5, r5, #16\n\t"
  24627. #endif
  24628. #ifdef WOLFSSL_KEIL
  24629. "muls r6, r5, r6\n\t"
  24630. #elif defined(__clang__)
  24631. "muls r6, r5\n\t"
  24632. #else
  24633. "mul r6, r5\n\t"
  24634. #endif
  24635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24636. "adds r3, r3, r6\n\t"
  24637. #else
  24638. "add r3, r3, r6\n\t"
  24639. #endif
  24640. #ifdef WOLFSSL_KEIL
  24641. "adcs r7, r7, r7\n\t"
  24642. #elif defined(__clang__)
  24643. "adcs r7, r7\n\t"
  24644. #else
  24645. "adc r7, r7\n\t"
  24646. #endif
  24647. "uxth r6, %[mp]\n\t"
  24648. #ifdef WOLFSSL_KEIL
  24649. "muls r5, r6, r5\n\t"
  24650. #elif defined(__clang__)
  24651. "muls r5, r6\n\t"
  24652. #else
  24653. "mul r5, r6\n\t"
  24654. #endif
  24655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24656. "lsrs r6, r5, #16\n\t"
  24657. #else
  24658. "lsr r6, r5, #16\n\t"
  24659. #endif
  24660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24661. "lsls r5, r5, #16\n\t"
  24662. #else
  24663. "lsl r5, r5, #16\n\t"
  24664. #endif
  24665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24666. "adds r4, r4, r5\n\t"
  24667. #else
  24668. "add r4, r4, r5\n\t"
  24669. #endif
  24670. #ifdef WOLFSSL_KEIL
  24671. "adcs r3, r3, r6\n\t"
  24672. #elif defined(__clang__)
  24673. "adcs r3, r6\n\t"
  24674. #else
  24675. "adc r3, r6\n\t"
  24676. #endif
  24677. #ifdef WOLFSSL_KEIL
  24678. "adcs r7, r7, r7\n\t"
  24679. #elif defined(__clang__)
  24680. "adcs r7, r7\n\t"
  24681. #else
  24682. "adc r7, r7\n\t"
  24683. #endif
  24684. "# Multiply m[63] and mu - Done\n\t"
  24685. "ldr r5, [%[a]]\n\t"
  24686. "ldr r6, [%[a], #4]\n\t"
  24687. "movs %[mp], #0\n\t"
  24688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24689. "adds r5, r5, r4\n\t"
  24690. #else
  24691. "add r5, r5, r4\n\t"
  24692. #endif
  24693. #ifdef WOLFSSL_KEIL
  24694. "adcs r6, r6, r3\n\t"
  24695. #elif defined(__clang__)
  24696. "adcs r6, r3\n\t"
  24697. #else
  24698. "adc r6, r3\n\t"
  24699. #endif
  24700. #ifdef WOLFSSL_KEIL
  24701. "adcs r7, r7, %[mp]\n\t"
  24702. #elif defined(__clang__)
  24703. "adcs r7, %[mp]\n\t"
  24704. #else
  24705. "adc r7, %[mp]\n\t"
  24706. #endif
  24707. "stm %[a]!, {r5, r6}\n\t"
  24708. "# i += 1\n\t"
  24709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24710. "subs %[a], %[a], #4\n\t"
  24711. #else
  24712. "sub %[a], %[a], #4\n\t"
  24713. #endif
  24714. "movs r3, #0xfc\n\t"
  24715. "mov r9, %[a]\n\t"
  24716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24717. "subs %[a], %[a], r3\n\t"
  24718. #else
  24719. "sub %[a], %[a], r3\n\t"
  24720. #endif
  24721. "mov r12, r7\n\t"
  24722. "mov %[m], lr\n\t"
  24723. "cmp r11, %[a]\n\t"
  24724. "bgt L_sp_2048_mont_reduce_64_mod_%=\n\t"
  24725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24726. "negs r7, r7\n\t"
  24727. #else
  24728. "neg r7, r7\n\t"
  24729. #endif
  24730. "# Subtract masked modulus\n\t"
  24731. "movs r4, #0xff\n\t"
  24732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24733. "adds r4, r4, #1\n\t"
  24734. #else
  24735. "add r4, r4, #1\n\t"
  24736. #endif
  24737. "movs %[mp], #0\n\t"
  24738. "movs r3, #0\n\t"
  24739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24740. "subs %[a], %[a], r4\n\t"
  24741. #else
  24742. "sub %[a], %[a], r4\n\t"
  24743. #endif
  24744. #ifndef WOLFSSL_SP_LARGE_CODE
  24745. "\n"
  24746. "L_sp_2048_mont_reduce_64_sub_mask_%=:\n\t"
  24747. "ldm %[m]!, {r6}\n\t"
  24748. "movs r5, #0\n\t"
  24749. #ifdef WOLFSSL_KEIL
  24750. "ands r6, r6, r7\n\t"
  24751. #elif defined(__clang__)
  24752. "ands r6, r7\n\t"
  24753. #else
  24754. "and r6, r7\n\t"
  24755. #endif
  24756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24757. "subs r5, r5, %[mp]\n\t"
  24758. #else
  24759. "sub r5, r5, %[mp]\n\t"
  24760. #endif
  24761. "ldr r5, [%[a], r4]\n\t"
  24762. #ifdef WOLFSSL_KEIL
  24763. "sbcs r5, r5, r6\n\t"
  24764. #elif defined(__clang__)
  24765. "sbcs r5, r6\n\t"
  24766. #else
  24767. "sbc r5, r6\n\t"
  24768. #endif
  24769. #ifdef WOLFSSL_KEIL
  24770. "sbcs %[mp], %[mp], %[mp]\n\t"
  24771. #elif defined(__clang__)
  24772. "sbcs %[mp], %[mp]\n\t"
  24773. #else
  24774. "sbc %[mp], %[mp]\n\t"
  24775. #endif
  24776. "stm %[a]!, {r5}\n\t"
  24777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24778. "adds r3, r3, #4\n\t"
  24779. #else
  24780. "add r3, r3, #4\n\t"
  24781. #endif
  24782. "cmp r3, r4\n\t"
  24783. "blt L_sp_2048_mont_reduce_64_sub_mask_%=\n\t"
  24784. #else /* WOLFSSL_SP_LARGE_CODE */
  24785. "ldm %[m]!, {r6}\n\t"
  24786. #ifdef WOLFSSL_KEIL
  24787. "ands r6, r6, r7\n\t"
  24788. #elif defined(__clang__)
  24789. "ands r6, r7\n\t"
  24790. #else
  24791. "and r6, r7\n\t"
  24792. #endif
  24793. "ldr r5, [%[a], r4]\n\t"
  24794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24795. "subs r5, r5, r6\n\t"
  24796. #else
  24797. "sub r5, r5, r6\n\t"
  24798. #endif
  24799. "stm %[a]!, {r5}\n\t"
  24800. "ldm %[m]!, {r6}\n\t"
  24801. #ifdef WOLFSSL_KEIL
  24802. "ands r6, r6, r7\n\t"
  24803. #elif defined(__clang__)
  24804. "ands r6, r7\n\t"
  24805. #else
  24806. "and r6, r7\n\t"
  24807. #endif
  24808. "ldr r5, [%[a], r4]\n\t"
  24809. #ifdef WOLFSSL_KEIL
  24810. "sbcs r5, r5, r6\n\t"
  24811. #elif defined(__clang__)
  24812. "sbcs r5, r6\n\t"
  24813. #else
  24814. "sbc r5, r6\n\t"
  24815. #endif
  24816. "stm %[a]!, {r5}\n\t"
  24817. "ldm %[m]!, {r6}\n\t"
  24818. #ifdef WOLFSSL_KEIL
  24819. "ands r6, r6, r7\n\t"
  24820. #elif defined(__clang__)
  24821. "ands r6, r7\n\t"
  24822. #else
  24823. "and r6, r7\n\t"
  24824. #endif
  24825. "ldr r5, [%[a], r4]\n\t"
  24826. #ifdef WOLFSSL_KEIL
  24827. "sbcs r5, r5, r6\n\t"
  24828. #elif defined(__clang__)
  24829. "sbcs r5, r6\n\t"
  24830. #else
  24831. "sbc r5, r6\n\t"
  24832. #endif
  24833. "stm %[a]!, {r5}\n\t"
  24834. "ldm %[m]!, {r6}\n\t"
  24835. #ifdef WOLFSSL_KEIL
  24836. "ands r6, r6, r7\n\t"
  24837. #elif defined(__clang__)
  24838. "ands r6, r7\n\t"
  24839. #else
  24840. "and r6, r7\n\t"
  24841. #endif
  24842. "ldr r5, [%[a], r4]\n\t"
  24843. #ifdef WOLFSSL_KEIL
  24844. "sbcs r5, r5, r6\n\t"
  24845. #elif defined(__clang__)
  24846. "sbcs r5, r6\n\t"
  24847. #else
  24848. "sbc r5, r6\n\t"
  24849. #endif
  24850. "stm %[a]!, {r5}\n\t"
  24851. "ldm %[m]!, {r6}\n\t"
  24852. #ifdef WOLFSSL_KEIL
  24853. "ands r6, r6, r7\n\t"
  24854. #elif defined(__clang__)
  24855. "ands r6, r7\n\t"
  24856. #else
  24857. "and r6, r7\n\t"
  24858. #endif
  24859. "ldr r5, [%[a], r4]\n\t"
  24860. #ifdef WOLFSSL_KEIL
  24861. "sbcs r5, r5, r6\n\t"
  24862. #elif defined(__clang__)
  24863. "sbcs r5, r6\n\t"
  24864. #else
  24865. "sbc r5, r6\n\t"
  24866. #endif
  24867. "stm %[a]!, {r5}\n\t"
  24868. "ldm %[m]!, {r6}\n\t"
  24869. #ifdef WOLFSSL_KEIL
  24870. "ands r6, r6, r7\n\t"
  24871. #elif defined(__clang__)
  24872. "ands r6, r7\n\t"
  24873. #else
  24874. "and r6, r7\n\t"
  24875. #endif
  24876. "ldr r5, [%[a], r4]\n\t"
  24877. #ifdef WOLFSSL_KEIL
  24878. "sbcs r5, r5, r6\n\t"
  24879. #elif defined(__clang__)
  24880. "sbcs r5, r6\n\t"
  24881. #else
  24882. "sbc r5, r6\n\t"
  24883. #endif
  24884. "stm %[a]!, {r5}\n\t"
  24885. "ldm %[m]!, {r6}\n\t"
  24886. #ifdef WOLFSSL_KEIL
  24887. "ands r6, r6, r7\n\t"
  24888. #elif defined(__clang__)
  24889. "ands r6, r7\n\t"
  24890. #else
  24891. "and r6, r7\n\t"
  24892. #endif
  24893. "ldr r5, [%[a], r4]\n\t"
  24894. #ifdef WOLFSSL_KEIL
  24895. "sbcs r5, r5, r6\n\t"
  24896. #elif defined(__clang__)
  24897. "sbcs r5, r6\n\t"
  24898. #else
  24899. "sbc r5, r6\n\t"
  24900. #endif
  24901. "stm %[a]!, {r5}\n\t"
  24902. "ldm %[m]!, {r6}\n\t"
  24903. #ifdef WOLFSSL_KEIL
  24904. "ands r6, r6, r7\n\t"
  24905. #elif defined(__clang__)
  24906. "ands r6, r7\n\t"
  24907. #else
  24908. "and r6, r7\n\t"
  24909. #endif
  24910. "ldr r5, [%[a], r4]\n\t"
  24911. #ifdef WOLFSSL_KEIL
  24912. "sbcs r5, r5, r6\n\t"
  24913. #elif defined(__clang__)
  24914. "sbcs r5, r6\n\t"
  24915. #else
  24916. "sbc r5, r6\n\t"
  24917. #endif
  24918. "stm %[a]!, {r5}\n\t"
  24919. "ldm %[m]!, {r6}\n\t"
  24920. #ifdef WOLFSSL_KEIL
  24921. "ands r6, r6, r7\n\t"
  24922. #elif defined(__clang__)
  24923. "ands r6, r7\n\t"
  24924. #else
  24925. "and r6, r7\n\t"
  24926. #endif
  24927. "ldr r5, [%[a], r4]\n\t"
  24928. #ifdef WOLFSSL_KEIL
  24929. "sbcs r5, r5, r6\n\t"
  24930. #elif defined(__clang__)
  24931. "sbcs r5, r6\n\t"
  24932. #else
  24933. "sbc r5, r6\n\t"
  24934. #endif
  24935. "stm %[a]!, {r5}\n\t"
  24936. "ldm %[m]!, {r6}\n\t"
  24937. #ifdef WOLFSSL_KEIL
  24938. "ands r6, r6, r7\n\t"
  24939. #elif defined(__clang__)
  24940. "ands r6, r7\n\t"
  24941. #else
  24942. "and r6, r7\n\t"
  24943. #endif
  24944. "ldr r5, [%[a], r4]\n\t"
  24945. #ifdef WOLFSSL_KEIL
  24946. "sbcs r5, r5, r6\n\t"
  24947. #elif defined(__clang__)
  24948. "sbcs r5, r6\n\t"
  24949. #else
  24950. "sbc r5, r6\n\t"
  24951. #endif
  24952. "stm %[a]!, {r5}\n\t"
  24953. "ldm %[m]!, {r6}\n\t"
  24954. #ifdef WOLFSSL_KEIL
  24955. "ands r6, r6, r7\n\t"
  24956. #elif defined(__clang__)
  24957. "ands r6, r7\n\t"
  24958. #else
  24959. "and r6, r7\n\t"
  24960. #endif
  24961. "ldr r5, [%[a], r4]\n\t"
  24962. #ifdef WOLFSSL_KEIL
  24963. "sbcs r5, r5, r6\n\t"
  24964. #elif defined(__clang__)
  24965. "sbcs r5, r6\n\t"
  24966. #else
  24967. "sbc r5, r6\n\t"
  24968. #endif
  24969. "stm %[a]!, {r5}\n\t"
  24970. "ldm %[m]!, {r6}\n\t"
  24971. #ifdef WOLFSSL_KEIL
  24972. "ands r6, r6, r7\n\t"
  24973. #elif defined(__clang__)
  24974. "ands r6, r7\n\t"
  24975. #else
  24976. "and r6, r7\n\t"
  24977. #endif
  24978. "ldr r5, [%[a], r4]\n\t"
  24979. #ifdef WOLFSSL_KEIL
  24980. "sbcs r5, r5, r6\n\t"
  24981. #elif defined(__clang__)
  24982. "sbcs r5, r6\n\t"
  24983. #else
  24984. "sbc r5, r6\n\t"
  24985. #endif
  24986. "stm %[a]!, {r5}\n\t"
  24987. "ldm %[m]!, {r6}\n\t"
  24988. #ifdef WOLFSSL_KEIL
  24989. "ands r6, r6, r7\n\t"
  24990. #elif defined(__clang__)
  24991. "ands r6, r7\n\t"
  24992. #else
  24993. "and r6, r7\n\t"
  24994. #endif
  24995. "ldr r5, [%[a], r4]\n\t"
  24996. #ifdef WOLFSSL_KEIL
  24997. "sbcs r5, r5, r6\n\t"
  24998. #elif defined(__clang__)
  24999. "sbcs r5, r6\n\t"
  25000. #else
  25001. "sbc r5, r6\n\t"
  25002. #endif
  25003. "stm %[a]!, {r5}\n\t"
  25004. "ldm %[m]!, {r6}\n\t"
  25005. #ifdef WOLFSSL_KEIL
  25006. "ands r6, r6, r7\n\t"
  25007. #elif defined(__clang__)
  25008. "ands r6, r7\n\t"
  25009. #else
  25010. "and r6, r7\n\t"
  25011. #endif
  25012. "ldr r5, [%[a], r4]\n\t"
  25013. #ifdef WOLFSSL_KEIL
  25014. "sbcs r5, r5, r6\n\t"
  25015. #elif defined(__clang__)
  25016. "sbcs r5, r6\n\t"
  25017. #else
  25018. "sbc r5, r6\n\t"
  25019. #endif
  25020. "stm %[a]!, {r5}\n\t"
  25021. "ldm %[m]!, {r6}\n\t"
  25022. #ifdef WOLFSSL_KEIL
  25023. "ands r6, r6, r7\n\t"
  25024. #elif defined(__clang__)
  25025. "ands r6, r7\n\t"
  25026. #else
  25027. "and r6, r7\n\t"
  25028. #endif
  25029. "ldr r5, [%[a], r4]\n\t"
  25030. #ifdef WOLFSSL_KEIL
  25031. "sbcs r5, r5, r6\n\t"
  25032. #elif defined(__clang__)
  25033. "sbcs r5, r6\n\t"
  25034. #else
  25035. "sbc r5, r6\n\t"
  25036. #endif
  25037. "stm %[a]!, {r5}\n\t"
  25038. "ldm %[m]!, {r6}\n\t"
  25039. #ifdef WOLFSSL_KEIL
  25040. "ands r6, r6, r7\n\t"
  25041. #elif defined(__clang__)
  25042. "ands r6, r7\n\t"
  25043. #else
  25044. "and r6, r7\n\t"
  25045. #endif
  25046. "ldr r5, [%[a], r4]\n\t"
  25047. #ifdef WOLFSSL_KEIL
  25048. "sbcs r5, r5, r6\n\t"
  25049. #elif defined(__clang__)
  25050. "sbcs r5, r6\n\t"
  25051. #else
  25052. "sbc r5, r6\n\t"
  25053. #endif
  25054. "stm %[a]!, {r5}\n\t"
  25055. "ldm %[m]!, {r6}\n\t"
  25056. #ifdef WOLFSSL_KEIL
  25057. "ands r6, r6, r7\n\t"
  25058. #elif defined(__clang__)
  25059. "ands r6, r7\n\t"
  25060. #else
  25061. "and r6, r7\n\t"
  25062. #endif
  25063. "ldr r5, [%[a], r4]\n\t"
  25064. #ifdef WOLFSSL_KEIL
  25065. "sbcs r5, r5, r6\n\t"
  25066. #elif defined(__clang__)
  25067. "sbcs r5, r6\n\t"
  25068. #else
  25069. "sbc r5, r6\n\t"
  25070. #endif
  25071. "stm %[a]!, {r5}\n\t"
  25072. "ldm %[m]!, {r6}\n\t"
  25073. #ifdef WOLFSSL_KEIL
  25074. "ands r6, r6, r7\n\t"
  25075. #elif defined(__clang__)
  25076. "ands r6, r7\n\t"
  25077. #else
  25078. "and r6, r7\n\t"
  25079. #endif
  25080. "ldr r5, [%[a], r4]\n\t"
  25081. #ifdef WOLFSSL_KEIL
  25082. "sbcs r5, r5, r6\n\t"
  25083. #elif defined(__clang__)
  25084. "sbcs r5, r6\n\t"
  25085. #else
  25086. "sbc r5, r6\n\t"
  25087. #endif
  25088. "stm %[a]!, {r5}\n\t"
  25089. "ldm %[m]!, {r6}\n\t"
  25090. #ifdef WOLFSSL_KEIL
  25091. "ands r6, r6, r7\n\t"
  25092. #elif defined(__clang__)
  25093. "ands r6, r7\n\t"
  25094. #else
  25095. "and r6, r7\n\t"
  25096. #endif
  25097. "ldr r5, [%[a], r4]\n\t"
  25098. #ifdef WOLFSSL_KEIL
  25099. "sbcs r5, r5, r6\n\t"
  25100. #elif defined(__clang__)
  25101. "sbcs r5, r6\n\t"
  25102. #else
  25103. "sbc r5, r6\n\t"
  25104. #endif
  25105. "stm %[a]!, {r5}\n\t"
  25106. "ldm %[m]!, {r6}\n\t"
  25107. #ifdef WOLFSSL_KEIL
  25108. "ands r6, r6, r7\n\t"
  25109. #elif defined(__clang__)
  25110. "ands r6, r7\n\t"
  25111. #else
  25112. "and r6, r7\n\t"
  25113. #endif
  25114. "ldr r5, [%[a], r4]\n\t"
  25115. #ifdef WOLFSSL_KEIL
  25116. "sbcs r5, r5, r6\n\t"
  25117. #elif defined(__clang__)
  25118. "sbcs r5, r6\n\t"
  25119. #else
  25120. "sbc r5, r6\n\t"
  25121. #endif
  25122. "stm %[a]!, {r5}\n\t"
  25123. "ldm %[m]!, {r6}\n\t"
  25124. #ifdef WOLFSSL_KEIL
  25125. "ands r6, r6, r7\n\t"
  25126. #elif defined(__clang__)
  25127. "ands r6, r7\n\t"
  25128. #else
  25129. "and r6, r7\n\t"
  25130. #endif
  25131. "ldr r5, [%[a], r4]\n\t"
  25132. #ifdef WOLFSSL_KEIL
  25133. "sbcs r5, r5, r6\n\t"
  25134. #elif defined(__clang__)
  25135. "sbcs r5, r6\n\t"
  25136. #else
  25137. "sbc r5, r6\n\t"
  25138. #endif
  25139. "stm %[a]!, {r5}\n\t"
  25140. "ldm %[m]!, {r6}\n\t"
  25141. #ifdef WOLFSSL_KEIL
  25142. "ands r6, r6, r7\n\t"
  25143. #elif defined(__clang__)
  25144. "ands r6, r7\n\t"
  25145. #else
  25146. "and r6, r7\n\t"
  25147. #endif
  25148. "ldr r5, [%[a], r4]\n\t"
  25149. #ifdef WOLFSSL_KEIL
  25150. "sbcs r5, r5, r6\n\t"
  25151. #elif defined(__clang__)
  25152. "sbcs r5, r6\n\t"
  25153. #else
  25154. "sbc r5, r6\n\t"
  25155. #endif
  25156. "stm %[a]!, {r5}\n\t"
  25157. "ldm %[m]!, {r6}\n\t"
  25158. #ifdef WOLFSSL_KEIL
  25159. "ands r6, r6, r7\n\t"
  25160. #elif defined(__clang__)
  25161. "ands r6, r7\n\t"
  25162. #else
  25163. "and r6, r7\n\t"
  25164. #endif
  25165. "ldr r5, [%[a], r4]\n\t"
  25166. #ifdef WOLFSSL_KEIL
  25167. "sbcs r5, r5, r6\n\t"
  25168. #elif defined(__clang__)
  25169. "sbcs r5, r6\n\t"
  25170. #else
  25171. "sbc r5, r6\n\t"
  25172. #endif
  25173. "stm %[a]!, {r5}\n\t"
  25174. "ldm %[m]!, {r6}\n\t"
  25175. #ifdef WOLFSSL_KEIL
  25176. "ands r6, r6, r7\n\t"
  25177. #elif defined(__clang__)
  25178. "ands r6, r7\n\t"
  25179. #else
  25180. "and r6, r7\n\t"
  25181. #endif
  25182. "ldr r5, [%[a], r4]\n\t"
  25183. #ifdef WOLFSSL_KEIL
  25184. "sbcs r5, r5, r6\n\t"
  25185. #elif defined(__clang__)
  25186. "sbcs r5, r6\n\t"
  25187. #else
  25188. "sbc r5, r6\n\t"
  25189. #endif
  25190. "stm %[a]!, {r5}\n\t"
  25191. "ldm %[m]!, {r6}\n\t"
  25192. #ifdef WOLFSSL_KEIL
  25193. "ands r6, r6, r7\n\t"
  25194. #elif defined(__clang__)
  25195. "ands r6, r7\n\t"
  25196. #else
  25197. "and r6, r7\n\t"
  25198. #endif
  25199. "ldr r5, [%[a], r4]\n\t"
  25200. #ifdef WOLFSSL_KEIL
  25201. "sbcs r5, r5, r6\n\t"
  25202. #elif defined(__clang__)
  25203. "sbcs r5, r6\n\t"
  25204. #else
  25205. "sbc r5, r6\n\t"
  25206. #endif
  25207. "stm %[a]!, {r5}\n\t"
  25208. "ldm %[m]!, {r6}\n\t"
  25209. #ifdef WOLFSSL_KEIL
  25210. "ands r6, r6, r7\n\t"
  25211. #elif defined(__clang__)
  25212. "ands r6, r7\n\t"
  25213. #else
  25214. "and r6, r7\n\t"
  25215. #endif
  25216. "ldr r5, [%[a], r4]\n\t"
  25217. #ifdef WOLFSSL_KEIL
  25218. "sbcs r5, r5, r6\n\t"
  25219. #elif defined(__clang__)
  25220. "sbcs r5, r6\n\t"
  25221. #else
  25222. "sbc r5, r6\n\t"
  25223. #endif
  25224. "stm %[a]!, {r5}\n\t"
  25225. "ldm %[m]!, {r6}\n\t"
  25226. #ifdef WOLFSSL_KEIL
  25227. "ands r6, r6, r7\n\t"
  25228. #elif defined(__clang__)
  25229. "ands r6, r7\n\t"
  25230. #else
  25231. "and r6, r7\n\t"
  25232. #endif
  25233. "ldr r5, [%[a], r4]\n\t"
  25234. #ifdef WOLFSSL_KEIL
  25235. "sbcs r5, r5, r6\n\t"
  25236. #elif defined(__clang__)
  25237. "sbcs r5, r6\n\t"
  25238. #else
  25239. "sbc r5, r6\n\t"
  25240. #endif
  25241. "stm %[a]!, {r5}\n\t"
  25242. "ldm %[m]!, {r6}\n\t"
  25243. #ifdef WOLFSSL_KEIL
  25244. "ands r6, r6, r7\n\t"
  25245. #elif defined(__clang__)
  25246. "ands r6, r7\n\t"
  25247. #else
  25248. "and r6, r7\n\t"
  25249. #endif
  25250. "ldr r5, [%[a], r4]\n\t"
  25251. #ifdef WOLFSSL_KEIL
  25252. "sbcs r5, r5, r6\n\t"
  25253. #elif defined(__clang__)
  25254. "sbcs r5, r6\n\t"
  25255. #else
  25256. "sbc r5, r6\n\t"
  25257. #endif
  25258. "stm %[a]!, {r5}\n\t"
  25259. "ldm %[m]!, {r6}\n\t"
  25260. #ifdef WOLFSSL_KEIL
  25261. "ands r6, r6, r7\n\t"
  25262. #elif defined(__clang__)
  25263. "ands r6, r7\n\t"
  25264. #else
  25265. "and r6, r7\n\t"
  25266. #endif
  25267. "ldr r5, [%[a], r4]\n\t"
  25268. #ifdef WOLFSSL_KEIL
  25269. "sbcs r5, r5, r6\n\t"
  25270. #elif defined(__clang__)
  25271. "sbcs r5, r6\n\t"
  25272. #else
  25273. "sbc r5, r6\n\t"
  25274. #endif
  25275. "stm %[a]!, {r5}\n\t"
  25276. "ldm %[m]!, {r6}\n\t"
  25277. #ifdef WOLFSSL_KEIL
  25278. "ands r6, r6, r7\n\t"
  25279. #elif defined(__clang__)
  25280. "ands r6, r7\n\t"
  25281. #else
  25282. "and r6, r7\n\t"
  25283. #endif
  25284. "ldr r5, [%[a], r4]\n\t"
  25285. #ifdef WOLFSSL_KEIL
  25286. "sbcs r5, r5, r6\n\t"
  25287. #elif defined(__clang__)
  25288. "sbcs r5, r6\n\t"
  25289. #else
  25290. "sbc r5, r6\n\t"
  25291. #endif
  25292. "stm %[a]!, {r5}\n\t"
  25293. "ldm %[m]!, {r6}\n\t"
  25294. #ifdef WOLFSSL_KEIL
  25295. "ands r6, r6, r7\n\t"
  25296. #elif defined(__clang__)
  25297. "ands r6, r7\n\t"
  25298. #else
  25299. "and r6, r7\n\t"
  25300. #endif
  25301. "ldr r5, [%[a], r4]\n\t"
  25302. #ifdef WOLFSSL_KEIL
  25303. "sbcs r5, r5, r6\n\t"
  25304. #elif defined(__clang__)
  25305. "sbcs r5, r6\n\t"
  25306. #else
  25307. "sbc r5, r6\n\t"
  25308. #endif
  25309. "stm %[a]!, {r5}\n\t"
  25310. "ldm %[m]!, {r6}\n\t"
  25311. #ifdef WOLFSSL_KEIL
  25312. "ands r6, r6, r7\n\t"
  25313. #elif defined(__clang__)
  25314. "ands r6, r7\n\t"
  25315. #else
  25316. "and r6, r7\n\t"
  25317. #endif
  25318. "ldr r5, [%[a], r4]\n\t"
  25319. #ifdef WOLFSSL_KEIL
  25320. "sbcs r5, r5, r6\n\t"
  25321. #elif defined(__clang__)
  25322. "sbcs r5, r6\n\t"
  25323. #else
  25324. "sbc r5, r6\n\t"
  25325. #endif
  25326. "stm %[a]!, {r5}\n\t"
  25327. "ldm %[m]!, {r6}\n\t"
  25328. #ifdef WOLFSSL_KEIL
  25329. "ands r6, r6, r7\n\t"
  25330. #elif defined(__clang__)
  25331. "ands r6, r7\n\t"
  25332. #else
  25333. "and r6, r7\n\t"
  25334. #endif
  25335. "ldr r5, [%[a], r4]\n\t"
  25336. #ifdef WOLFSSL_KEIL
  25337. "sbcs r5, r5, r6\n\t"
  25338. #elif defined(__clang__)
  25339. "sbcs r5, r6\n\t"
  25340. #else
  25341. "sbc r5, r6\n\t"
  25342. #endif
  25343. "stm %[a]!, {r5}\n\t"
  25344. "ldm %[m]!, {r6}\n\t"
  25345. #ifdef WOLFSSL_KEIL
  25346. "ands r6, r6, r7\n\t"
  25347. #elif defined(__clang__)
  25348. "ands r6, r7\n\t"
  25349. #else
  25350. "and r6, r7\n\t"
  25351. #endif
  25352. "ldr r5, [%[a], r4]\n\t"
  25353. #ifdef WOLFSSL_KEIL
  25354. "sbcs r5, r5, r6\n\t"
  25355. #elif defined(__clang__)
  25356. "sbcs r5, r6\n\t"
  25357. #else
  25358. "sbc r5, r6\n\t"
  25359. #endif
  25360. "stm %[a]!, {r5}\n\t"
  25361. "ldm %[m]!, {r6}\n\t"
  25362. #ifdef WOLFSSL_KEIL
  25363. "ands r6, r6, r7\n\t"
  25364. #elif defined(__clang__)
  25365. "ands r6, r7\n\t"
  25366. #else
  25367. "and r6, r7\n\t"
  25368. #endif
  25369. "ldr r5, [%[a], r4]\n\t"
  25370. #ifdef WOLFSSL_KEIL
  25371. "sbcs r5, r5, r6\n\t"
  25372. #elif defined(__clang__)
  25373. "sbcs r5, r6\n\t"
  25374. #else
  25375. "sbc r5, r6\n\t"
  25376. #endif
  25377. "stm %[a]!, {r5}\n\t"
  25378. "ldm %[m]!, {r6}\n\t"
  25379. #ifdef WOLFSSL_KEIL
  25380. "ands r6, r6, r7\n\t"
  25381. #elif defined(__clang__)
  25382. "ands r6, r7\n\t"
  25383. #else
  25384. "and r6, r7\n\t"
  25385. #endif
  25386. "ldr r5, [%[a], r4]\n\t"
  25387. #ifdef WOLFSSL_KEIL
  25388. "sbcs r5, r5, r6\n\t"
  25389. #elif defined(__clang__)
  25390. "sbcs r5, r6\n\t"
  25391. #else
  25392. "sbc r5, r6\n\t"
  25393. #endif
  25394. "stm %[a]!, {r5}\n\t"
  25395. "ldm %[m]!, {r6}\n\t"
  25396. #ifdef WOLFSSL_KEIL
  25397. "ands r6, r6, r7\n\t"
  25398. #elif defined(__clang__)
  25399. "ands r6, r7\n\t"
  25400. #else
  25401. "and r6, r7\n\t"
  25402. #endif
  25403. "ldr r5, [%[a], r4]\n\t"
  25404. #ifdef WOLFSSL_KEIL
  25405. "sbcs r5, r5, r6\n\t"
  25406. #elif defined(__clang__)
  25407. "sbcs r5, r6\n\t"
  25408. #else
  25409. "sbc r5, r6\n\t"
  25410. #endif
  25411. "stm %[a]!, {r5}\n\t"
  25412. "ldm %[m]!, {r6}\n\t"
  25413. #ifdef WOLFSSL_KEIL
  25414. "ands r6, r6, r7\n\t"
  25415. #elif defined(__clang__)
  25416. "ands r6, r7\n\t"
  25417. #else
  25418. "and r6, r7\n\t"
  25419. #endif
  25420. "ldr r5, [%[a], r4]\n\t"
  25421. #ifdef WOLFSSL_KEIL
  25422. "sbcs r5, r5, r6\n\t"
  25423. #elif defined(__clang__)
  25424. "sbcs r5, r6\n\t"
  25425. #else
  25426. "sbc r5, r6\n\t"
  25427. #endif
  25428. "stm %[a]!, {r5}\n\t"
  25429. "ldm %[m]!, {r6}\n\t"
  25430. #ifdef WOLFSSL_KEIL
  25431. "ands r6, r6, r7\n\t"
  25432. #elif defined(__clang__)
  25433. "ands r6, r7\n\t"
  25434. #else
  25435. "and r6, r7\n\t"
  25436. #endif
  25437. "ldr r5, [%[a], r4]\n\t"
  25438. #ifdef WOLFSSL_KEIL
  25439. "sbcs r5, r5, r6\n\t"
  25440. #elif defined(__clang__)
  25441. "sbcs r5, r6\n\t"
  25442. #else
  25443. "sbc r5, r6\n\t"
  25444. #endif
  25445. "stm %[a]!, {r5}\n\t"
  25446. "ldm %[m]!, {r6}\n\t"
  25447. #ifdef WOLFSSL_KEIL
  25448. "ands r6, r6, r7\n\t"
  25449. #elif defined(__clang__)
  25450. "ands r6, r7\n\t"
  25451. #else
  25452. "and r6, r7\n\t"
  25453. #endif
  25454. "ldr r5, [%[a], r4]\n\t"
  25455. #ifdef WOLFSSL_KEIL
  25456. "sbcs r5, r5, r6\n\t"
  25457. #elif defined(__clang__)
  25458. "sbcs r5, r6\n\t"
  25459. #else
  25460. "sbc r5, r6\n\t"
  25461. #endif
  25462. "stm %[a]!, {r5}\n\t"
  25463. "ldm %[m]!, {r6}\n\t"
  25464. #ifdef WOLFSSL_KEIL
  25465. "ands r6, r6, r7\n\t"
  25466. #elif defined(__clang__)
  25467. "ands r6, r7\n\t"
  25468. #else
  25469. "and r6, r7\n\t"
  25470. #endif
  25471. "ldr r5, [%[a], r4]\n\t"
  25472. #ifdef WOLFSSL_KEIL
  25473. "sbcs r5, r5, r6\n\t"
  25474. #elif defined(__clang__)
  25475. "sbcs r5, r6\n\t"
  25476. #else
  25477. "sbc r5, r6\n\t"
  25478. #endif
  25479. "stm %[a]!, {r5}\n\t"
  25480. "ldm %[m]!, {r6}\n\t"
  25481. #ifdef WOLFSSL_KEIL
  25482. "ands r6, r6, r7\n\t"
  25483. #elif defined(__clang__)
  25484. "ands r6, r7\n\t"
  25485. #else
  25486. "and r6, r7\n\t"
  25487. #endif
  25488. "ldr r5, [%[a], r4]\n\t"
  25489. #ifdef WOLFSSL_KEIL
  25490. "sbcs r5, r5, r6\n\t"
  25491. #elif defined(__clang__)
  25492. "sbcs r5, r6\n\t"
  25493. #else
  25494. "sbc r5, r6\n\t"
  25495. #endif
  25496. "stm %[a]!, {r5}\n\t"
  25497. "ldm %[m]!, {r6}\n\t"
  25498. #ifdef WOLFSSL_KEIL
  25499. "ands r6, r6, r7\n\t"
  25500. #elif defined(__clang__)
  25501. "ands r6, r7\n\t"
  25502. #else
  25503. "and r6, r7\n\t"
  25504. #endif
  25505. "ldr r5, [%[a], r4]\n\t"
  25506. #ifdef WOLFSSL_KEIL
  25507. "sbcs r5, r5, r6\n\t"
  25508. #elif defined(__clang__)
  25509. "sbcs r5, r6\n\t"
  25510. #else
  25511. "sbc r5, r6\n\t"
  25512. #endif
  25513. "stm %[a]!, {r5}\n\t"
  25514. "ldm %[m]!, {r6}\n\t"
  25515. #ifdef WOLFSSL_KEIL
  25516. "ands r6, r6, r7\n\t"
  25517. #elif defined(__clang__)
  25518. "ands r6, r7\n\t"
  25519. #else
  25520. "and r6, r7\n\t"
  25521. #endif
  25522. "ldr r5, [%[a], r4]\n\t"
  25523. #ifdef WOLFSSL_KEIL
  25524. "sbcs r5, r5, r6\n\t"
  25525. #elif defined(__clang__)
  25526. "sbcs r5, r6\n\t"
  25527. #else
  25528. "sbc r5, r6\n\t"
  25529. #endif
  25530. "stm %[a]!, {r5}\n\t"
  25531. "ldm %[m]!, {r6}\n\t"
  25532. #ifdef WOLFSSL_KEIL
  25533. "ands r6, r6, r7\n\t"
  25534. #elif defined(__clang__)
  25535. "ands r6, r7\n\t"
  25536. #else
  25537. "and r6, r7\n\t"
  25538. #endif
  25539. "ldr r5, [%[a], r4]\n\t"
  25540. #ifdef WOLFSSL_KEIL
  25541. "sbcs r5, r5, r6\n\t"
  25542. #elif defined(__clang__)
  25543. "sbcs r5, r6\n\t"
  25544. #else
  25545. "sbc r5, r6\n\t"
  25546. #endif
  25547. "stm %[a]!, {r5}\n\t"
  25548. "ldm %[m]!, {r6}\n\t"
  25549. #ifdef WOLFSSL_KEIL
  25550. "ands r6, r6, r7\n\t"
  25551. #elif defined(__clang__)
  25552. "ands r6, r7\n\t"
  25553. #else
  25554. "and r6, r7\n\t"
  25555. #endif
  25556. "ldr r5, [%[a], r4]\n\t"
  25557. #ifdef WOLFSSL_KEIL
  25558. "sbcs r5, r5, r6\n\t"
  25559. #elif defined(__clang__)
  25560. "sbcs r5, r6\n\t"
  25561. #else
  25562. "sbc r5, r6\n\t"
  25563. #endif
  25564. "stm %[a]!, {r5}\n\t"
  25565. "ldm %[m]!, {r6}\n\t"
  25566. #ifdef WOLFSSL_KEIL
  25567. "ands r6, r6, r7\n\t"
  25568. #elif defined(__clang__)
  25569. "ands r6, r7\n\t"
  25570. #else
  25571. "and r6, r7\n\t"
  25572. #endif
  25573. "ldr r5, [%[a], r4]\n\t"
  25574. #ifdef WOLFSSL_KEIL
  25575. "sbcs r5, r5, r6\n\t"
  25576. #elif defined(__clang__)
  25577. "sbcs r5, r6\n\t"
  25578. #else
  25579. "sbc r5, r6\n\t"
  25580. #endif
  25581. "stm %[a]!, {r5}\n\t"
  25582. "ldm %[m]!, {r6}\n\t"
  25583. #ifdef WOLFSSL_KEIL
  25584. "ands r6, r6, r7\n\t"
  25585. #elif defined(__clang__)
  25586. "ands r6, r7\n\t"
  25587. #else
  25588. "and r6, r7\n\t"
  25589. #endif
  25590. "ldr r5, [%[a], r4]\n\t"
  25591. #ifdef WOLFSSL_KEIL
  25592. "sbcs r5, r5, r6\n\t"
  25593. #elif defined(__clang__)
  25594. "sbcs r5, r6\n\t"
  25595. #else
  25596. "sbc r5, r6\n\t"
  25597. #endif
  25598. "stm %[a]!, {r5}\n\t"
  25599. "ldm %[m]!, {r6}\n\t"
  25600. #ifdef WOLFSSL_KEIL
  25601. "ands r6, r6, r7\n\t"
  25602. #elif defined(__clang__)
  25603. "ands r6, r7\n\t"
  25604. #else
  25605. "and r6, r7\n\t"
  25606. #endif
  25607. "ldr r5, [%[a], r4]\n\t"
  25608. #ifdef WOLFSSL_KEIL
  25609. "sbcs r5, r5, r6\n\t"
  25610. #elif defined(__clang__)
  25611. "sbcs r5, r6\n\t"
  25612. #else
  25613. "sbc r5, r6\n\t"
  25614. #endif
  25615. "stm %[a]!, {r5}\n\t"
  25616. "ldm %[m]!, {r6}\n\t"
  25617. #ifdef WOLFSSL_KEIL
  25618. "ands r6, r6, r7\n\t"
  25619. #elif defined(__clang__)
  25620. "ands r6, r7\n\t"
  25621. #else
  25622. "and r6, r7\n\t"
  25623. #endif
  25624. "ldr r5, [%[a], r4]\n\t"
  25625. #ifdef WOLFSSL_KEIL
  25626. "sbcs r5, r5, r6\n\t"
  25627. #elif defined(__clang__)
  25628. "sbcs r5, r6\n\t"
  25629. #else
  25630. "sbc r5, r6\n\t"
  25631. #endif
  25632. "stm %[a]!, {r5}\n\t"
  25633. "ldm %[m]!, {r6}\n\t"
  25634. #ifdef WOLFSSL_KEIL
  25635. "ands r6, r6, r7\n\t"
  25636. #elif defined(__clang__)
  25637. "ands r6, r7\n\t"
  25638. #else
  25639. "and r6, r7\n\t"
  25640. #endif
  25641. "ldr r5, [%[a], r4]\n\t"
  25642. #ifdef WOLFSSL_KEIL
  25643. "sbcs r5, r5, r6\n\t"
  25644. #elif defined(__clang__)
  25645. "sbcs r5, r6\n\t"
  25646. #else
  25647. "sbc r5, r6\n\t"
  25648. #endif
  25649. "stm %[a]!, {r5}\n\t"
  25650. "ldm %[m]!, {r6}\n\t"
  25651. #ifdef WOLFSSL_KEIL
  25652. "ands r6, r6, r7\n\t"
  25653. #elif defined(__clang__)
  25654. "ands r6, r7\n\t"
  25655. #else
  25656. "and r6, r7\n\t"
  25657. #endif
  25658. "ldr r5, [%[a], r4]\n\t"
  25659. #ifdef WOLFSSL_KEIL
  25660. "sbcs r5, r5, r6\n\t"
  25661. #elif defined(__clang__)
  25662. "sbcs r5, r6\n\t"
  25663. #else
  25664. "sbc r5, r6\n\t"
  25665. #endif
  25666. "stm %[a]!, {r5}\n\t"
  25667. "ldm %[m]!, {r6}\n\t"
  25668. #ifdef WOLFSSL_KEIL
  25669. "ands r6, r6, r7\n\t"
  25670. #elif defined(__clang__)
  25671. "ands r6, r7\n\t"
  25672. #else
  25673. "and r6, r7\n\t"
  25674. #endif
  25675. "ldr r5, [%[a], r4]\n\t"
  25676. #ifdef WOLFSSL_KEIL
  25677. "sbcs r5, r5, r6\n\t"
  25678. #elif defined(__clang__)
  25679. "sbcs r5, r6\n\t"
  25680. #else
  25681. "sbc r5, r6\n\t"
  25682. #endif
  25683. "stm %[a]!, {r5}\n\t"
  25684. "ldm %[m]!, {r6}\n\t"
  25685. #ifdef WOLFSSL_KEIL
  25686. "ands r6, r6, r7\n\t"
  25687. #elif defined(__clang__)
  25688. "ands r6, r7\n\t"
  25689. #else
  25690. "and r6, r7\n\t"
  25691. #endif
  25692. "ldr r5, [%[a], r4]\n\t"
  25693. #ifdef WOLFSSL_KEIL
  25694. "sbcs r5, r5, r6\n\t"
  25695. #elif defined(__clang__)
  25696. "sbcs r5, r6\n\t"
  25697. #else
  25698. "sbc r5, r6\n\t"
  25699. #endif
  25700. "stm %[a]!, {r5}\n\t"
  25701. "ldm %[m]!, {r6}\n\t"
  25702. #ifdef WOLFSSL_KEIL
  25703. "ands r6, r6, r7\n\t"
  25704. #elif defined(__clang__)
  25705. "ands r6, r7\n\t"
  25706. #else
  25707. "and r6, r7\n\t"
  25708. #endif
  25709. "ldr r5, [%[a], r4]\n\t"
  25710. #ifdef WOLFSSL_KEIL
  25711. "sbcs r5, r5, r6\n\t"
  25712. #elif defined(__clang__)
  25713. "sbcs r5, r6\n\t"
  25714. #else
  25715. "sbc r5, r6\n\t"
  25716. #endif
  25717. "stm %[a]!, {r5}\n\t"
  25718. "ldm %[m]!, {r6}\n\t"
  25719. #ifdef WOLFSSL_KEIL
  25720. "ands r6, r6, r7\n\t"
  25721. #elif defined(__clang__)
  25722. "ands r6, r7\n\t"
  25723. #else
  25724. "and r6, r7\n\t"
  25725. #endif
  25726. "ldr r5, [%[a], r4]\n\t"
  25727. #ifdef WOLFSSL_KEIL
  25728. "sbcs r5, r5, r6\n\t"
  25729. #elif defined(__clang__)
  25730. "sbcs r5, r6\n\t"
  25731. #else
  25732. "sbc r5, r6\n\t"
  25733. #endif
  25734. "stm %[a]!, {r5}\n\t"
  25735. "ldm %[m]!, {r6}\n\t"
  25736. #ifdef WOLFSSL_KEIL
  25737. "ands r6, r6, r7\n\t"
  25738. #elif defined(__clang__)
  25739. "ands r6, r7\n\t"
  25740. #else
  25741. "and r6, r7\n\t"
  25742. #endif
  25743. "ldr r5, [%[a], r4]\n\t"
  25744. #ifdef WOLFSSL_KEIL
  25745. "sbcs r5, r5, r6\n\t"
  25746. #elif defined(__clang__)
  25747. "sbcs r5, r6\n\t"
  25748. #else
  25749. "sbc r5, r6\n\t"
  25750. #endif
  25751. "stm %[a]!, {r5}\n\t"
  25752. "ldm %[m]!, {r6}\n\t"
  25753. #ifdef WOLFSSL_KEIL
  25754. "ands r6, r6, r7\n\t"
  25755. #elif defined(__clang__)
  25756. "ands r6, r7\n\t"
  25757. #else
  25758. "and r6, r7\n\t"
  25759. #endif
  25760. "ldr r5, [%[a], r4]\n\t"
  25761. #ifdef WOLFSSL_KEIL
  25762. "sbcs r5, r5, r6\n\t"
  25763. #elif defined(__clang__)
  25764. "sbcs r5, r6\n\t"
  25765. #else
  25766. "sbc r5, r6\n\t"
  25767. #endif
  25768. "stm %[a]!, {r5}\n\t"
  25769. "ldm %[m]!, {r6}\n\t"
  25770. #ifdef WOLFSSL_KEIL
  25771. "ands r6, r6, r7\n\t"
  25772. #elif defined(__clang__)
  25773. "ands r6, r7\n\t"
  25774. #else
  25775. "and r6, r7\n\t"
  25776. #endif
  25777. "ldr r5, [%[a], r4]\n\t"
  25778. #ifdef WOLFSSL_KEIL
  25779. "sbcs r5, r5, r6\n\t"
  25780. #elif defined(__clang__)
  25781. "sbcs r5, r6\n\t"
  25782. #else
  25783. "sbc r5, r6\n\t"
  25784. #endif
  25785. "stm %[a]!, {r5}\n\t"
  25786. "ldm %[m]!, {r6}\n\t"
  25787. #ifdef WOLFSSL_KEIL
  25788. "ands r6, r6, r7\n\t"
  25789. #elif defined(__clang__)
  25790. "ands r6, r7\n\t"
  25791. #else
  25792. "and r6, r7\n\t"
  25793. #endif
  25794. "ldr r5, [%[a], r4]\n\t"
  25795. #ifdef WOLFSSL_KEIL
  25796. "sbcs r5, r5, r6\n\t"
  25797. #elif defined(__clang__)
  25798. "sbcs r5, r6\n\t"
  25799. #else
  25800. "sbc r5, r6\n\t"
  25801. #endif
  25802. "stm %[a]!, {r5}\n\t"
  25803. "ldm %[m]!, {r6}\n\t"
  25804. #ifdef WOLFSSL_KEIL
  25805. "ands r6, r6, r7\n\t"
  25806. #elif defined(__clang__)
  25807. "ands r6, r7\n\t"
  25808. #else
  25809. "and r6, r7\n\t"
  25810. #endif
  25811. "ldr r5, [%[a], r4]\n\t"
  25812. #ifdef WOLFSSL_KEIL
  25813. "sbcs r5, r5, r6\n\t"
  25814. #elif defined(__clang__)
  25815. "sbcs r5, r6\n\t"
  25816. #else
  25817. "sbc r5, r6\n\t"
  25818. #endif
  25819. "stm %[a]!, {r5}\n\t"
  25820. "ldm %[m]!, {r6}\n\t"
  25821. #ifdef WOLFSSL_KEIL
  25822. "ands r6, r6, r7\n\t"
  25823. #elif defined(__clang__)
  25824. "ands r6, r7\n\t"
  25825. #else
  25826. "and r6, r7\n\t"
  25827. #endif
  25828. "ldr r5, [%[a], r4]\n\t"
  25829. #ifdef WOLFSSL_KEIL
  25830. "sbcs r5, r5, r6\n\t"
  25831. #elif defined(__clang__)
  25832. "sbcs r5, r6\n\t"
  25833. #else
  25834. "sbc r5, r6\n\t"
  25835. #endif
  25836. "stm %[a]!, {r5}\n\t"
  25837. "ldm %[m]!, {r6}\n\t"
  25838. #ifdef WOLFSSL_KEIL
  25839. "ands r6, r6, r7\n\t"
  25840. #elif defined(__clang__)
  25841. "ands r6, r7\n\t"
  25842. #else
  25843. "and r6, r7\n\t"
  25844. #endif
  25845. "ldr r5, [%[a], r4]\n\t"
  25846. #ifdef WOLFSSL_KEIL
  25847. "sbcs r5, r5, r6\n\t"
  25848. #elif defined(__clang__)
  25849. "sbcs r5, r6\n\t"
  25850. #else
  25851. "sbc r5, r6\n\t"
  25852. #endif
  25853. "stm %[a]!, {r5}\n\t"
  25854. "ldm %[m]!, {r6}\n\t"
  25855. #ifdef WOLFSSL_KEIL
  25856. "ands r6, r6, r7\n\t"
  25857. #elif defined(__clang__)
  25858. "ands r6, r7\n\t"
  25859. #else
  25860. "and r6, r7\n\t"
  25861. #endif
  25862. "ldr r5, [%[a], r4]\n\t"
  25863. #ifdef WOLFSSL_KEIL
  25864. "sbcs r5, r5, r6\n\t"
  25865. #elif defined(__clang__)
  25866. "sbcs r5, r6\n\t"
  25867. #else
  25868. "sbc r5, r6\n\t"
  25869. #endif
  25870. "stm %[a]!, {r5}\n\t"
  25871. #endif /* WOLFSSL_SP_LARGE_CODE */
  25872. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  25873. :
  25874. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  25875. );
  25876. }
  25877. /* Multiply two Montgomery form numbers mod the modulus (prime).
  25878. * (r = a * b mod m)
  25879. *
  25880. * r Result of multiplication.
  25881. * a First number to multiply in Montgomery form.
  25882. * b Second number to multiply in Montgomery form.
  25883. * m Modulus (prime).
  25884. * mp Montgomery multiplier.
  25885. */
  25886. SP_NOINLINE static void sp_2048_mont_mul_64(sp_digit* r, const sp_digit* a,
  25887. const sp_digit* b, const sp_digit* m, sp_digit mp)
  25888. {
  25889. sp_2048_mul_64(r, a, b);
  25890. sp_2048_mont_reduce_64(r, m, mp);
  25891. }
  25892. /* Square the Montgomery form number. (r = a * a mod m)
  25893. *
  25894. * r Result of squaring.
  25895. * a Number to square in Montgomery form.
  25896. * m Modulus (prime).
  25897. * mp Montgomery multiplier.
  25898. */
  25899. SP_NOINLINE static void sp_2048_mont_sqr_64(sp_digit* r, const sp_digit* a,
  25900. const sp_digit* m, sp_digit mp)
  25901. {
  25902. sp_2048_sqr_64(r, a);
  25903. sp_2048_mont_reduce_64(r, m, mp);
  25904. }
  25905. #ifdef WOLFSSL_SP_SMALL
  25906. /* Sub b from a into r. (r = a - b)
  25907. *
  25908. * r A single precision integer.
  25909. * a A single precision integer.
  25910. * b A single precision integer.
  25911. */
  25912. SP_NOINLINE static sp_digit sp_2048_sub_64(sp_digit* r, const sp_digit* a,
  25913. const sp_digit* b)
  25914. {
  25915. __asm__ __volatile__ (
  25916. "movs r6, %[a]\n\t"
  25917. "movs r3, #0\n\t"
  25918. "movs r5, #0xff\n\t"
  25919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25920. "adds r5, r5, #1\n\t"
  25921. #else
  25922. "add r5, r5, #1\n\t"
  25923. #endif
  25924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25925. "adds r6, r6, r5\n\t"
  25926. #else
  25927. "add r6, r6, r5\n\t"
  25928. #endif
  25929. "\n"
  25930. "L_sp_2048_sub_64_word_%=:\n\t"
  25931. "movs r5, #0\n\t"
  25932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25933. "subs r5, r5, r3\n\t"
  25934. #else
  25935. "sub r5, r5, r3\n\t"
  25936. #endif
  25937. "ldr r4, [%[a]]\n\t"
  25938. "ldr r5, [%[b]]\n\t"
  25939. #ifdef WOLFSSL_KEIL
  25940. "sbcs r4, r4, r5\n\t"
  25941. #elif defined(__clang__)
  25942. "sbcs r4, r5\n\t"
  25943. #else
  25944. "sbc r4, r5\n\t"
  25945. #endif
  25946. "str r4, [%[r]]\n\t"
  25947. #ifdef WOLFSSL_KEIL
  25948. "sbcs r3, r3, r3\n\t"
  25949. #elif defined(__clang__)
  25950. "sbcs r3, r3\n\t"
  25951. #else
  25952. "sbc r3, r3\n\t"
  25953. #endif
  25954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25955. "adds %[a], %[a], #4\n\t"
  25956. #else
  25957. "add %[a], %[a], #4\n\t"
  25958. #endif
  25959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25960. "adds %[b], %[b], #4\n\t"
  25961. #else
  25962. "add %[b], %[b], #4\n\t"
  25963. #endif
  25964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25965. "adds %[r], %[r], #4\n\t"
  25966. #else
  25967. "add %[r], %[r], #4\n\t"
  25968. #endif
  25969. "cmp %[a], r6\n\t"
  25970. "bne L_sp_2048_sub_64_word_%=\n\t"
  25971. "movs %[r], r3\n\t"
  25972. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  25973. :
  25974. : "memory", "r3", "r4", "r5", "r6"
  25975. );
  25976. return (uint32_t)(size_t)r;
  25977. }
  25978. #else
  25979. /* Sub b from a into r. (r = a - b)
  25980. *
  25981. * r A single precision integer.
  25982. * a A single precision integer.
  25983. * b A single precision integer.
  25984. */
  25985. SP_NOINLINE static sp_digit sp_2048_sub_64(sp_digit* r, const sp_digit* a,
  25986. const sp_digit* b)
  25987. {
  25988. __asm__ __volatile__ (
  25989. "ldm %[b]!, {r5, r6}\n\t"
  25990. "ldm %[a]!, {r3, r4}\n\t"
  25991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25992. "subs r3, r3, r5\n\t"
  25993. #else
  25994. "sub r3, r3, r5\n\t"
  25995. #endif
  25996. #ifdef WOLFSSL_KEIL
  25997. "sbcs r4, r4, r6\n\t"
  25998. #elif defined(__clang__)
  25999. "sbcs r4, r6\n\t"
  26000. #else
  26001. "sbc r4, r6\n\t"
  26002. #endif
  26003. "stm %[r]!, {r3, r4}\n\t"
  26004. "ldm %[b]!, {r5, r6}\n\t"
  26005. "ldm %[a]!, {r3, r4}\n\t"
  26006. #ifdef WOLFSSL_KEIL
  26007. "sbcs r3, r3, r5\n\t"
  26008. #elif defined(__clang__)
  26009. "sbcs r3, r5\n\t"
  26010. #else
  26011. "sbc r3, r5\n\t"
  26012. #endif
  26013. #ifdef WOLFSSL_KEIL
  26014. "sbcs r4, r4, r6\n\t"
  26015. #elif defined(__clang__)
  26016. "sbcs r4, r6\n\t"
  26017. #else
  26018. "sbc r4, r6\n\t"
  26019. #endif
  26020. "stm %[r]!, {r3, r4}\n\t"
  26021. "ldm %[b]!, {r5, r6}\n\t"
  26022. "ldm %[a]!, {r3, r4}\n\t"
  26023. #ifdef WOLFSSL_KEIL
  26024. "sbcs r3, r3, r5\n\t"
  26025. #elif defined(__clang__)
  26026. "sbcs r3, r5\n\t"
  26027. #else
  26028. "sbc r3, r5\n\t"
  26029. #endif
  26030. #ifdef WOLFSSL_KEIL
  26031. "sbcs r4, r4, r6\n\t"
  26032. #elif defined(__clang__)
  26033. "sbcs r4, r6\n\t"
  26034. #else
  26035. "sbc r4, r6\n\t"
  26036. #endif
  26037. "stm %[r]!, {r3, r4}\n\t"
  26038. "ldm %[b]!, {r5, r6}\n\t"
  26039. "ldm %[a]!, {r3, r4}\n\t"
  26040. #ifdef WOLFSSL_KEIL
  26041. "sbcs r3, r3, r5\n\t"
  26042. #elif defined(__clang__)
  26043. "sbcs r3, r5\n\t"
  26044. #else
  26045. "sbc r3, r5\n\t"
  26046. #endif
  26047. #ifdef WOLFSSL_KEIL
  26048. "sbcs r4, r4, r6\n\t"
  26049. #elif defined(__clang__)
  26050. "sbcs r4, r6\n\t"
  26051. #else
  26052. "sbc r4, r6\n\t"
  26053. #endif
  26054. "stm %[r]!, {r3, r4}\n\t"
  26055. "ldm %[b]!, {r5, r6}\n\t"
  26056. "ldm %[a]!, {r3, r4}\n\t"
  26057. #ifdef WOLFSSL_KEIL
  26058. "sbcs r3, r3, r5\n\t"
  26059. #elif defined(__clang__)
  26060. "sbcs r3, r5\n\t"
  26061. #else
  26062. "sbc r3, r5\n\t"
  26063. #endif
  26064. #ifdef WOLFSSL_KEIL
  26065. "sbcs r4, r4, r6\n\t"
  26066. #elif defined(__clang__)
  26067. "sbcs r4, r6\n\t"
  26068. #else
  26069. "sbc r4, r6\n\t"
  26070. #endif
  26071. "stm %[r]!, {r3, r4}\n\t"
  26072. "ldm %[b]!, {r5, r6}\n\t"
  26073. "ldm %[a]!, {r3, r4}\n\t"
  26074. #ifdef WOLFSSL_KEIL
  26075. "sbcs r3, r3, r5\n\t"
  26076. #elif defined(__clang__)
  26077. "sbcs r3, r5\n\t"
  26078. #else
  26079. "sbc r3, r5\n\t"
  26080. #endif
  26081. #ifdef WOLFSSL_KEIL
  26082. "sbcs r4, r4, r6\n\t"
  26083. #elif defined(__clang__)
  26084. "sbcs r4, r6\n\t"
  26085. #else
  26086. "sbc r4, r6\n\t"
  26087. #endif
  26088. "stm %[r]!, {r3, r4}\n\t"
  26089. "ldm %[b]!, {r5, r6}\n\t"
  26090. "ldm %[a]!, {r3, r4}\n\t"
  26091. #ifdef WOLFSSL_KEIL
  26092. "sbcs r3, r3, r5\n\t"
  26093. #elif defined(__clang__)
  26094. "sbcs r3, r5\n\t"
  26095. #else
  26096. "sbc r3, r5\n\t"
  26097. #endif
  26098. #ifdef WOLFSSL_KEIL
  26099. "sbcs r4, r4, r6\n\t"
  26100. #elif defined(__clang__)
  26101. "sbcs r4, r6\n\t"
  26102. #else
  26103. "sbc r4, r6\n\t"
  26104. #endif
  26105. "stm %[r]!, {r3, r4}\n\t"
  26106. "ldm %[b]!, {r5, r6}\n\t"
  26107. "ldm %[a]!, {r3, r4}\n\t"
  26108. #ifdef WOLFSSL_KEIL
  26109. "sbcs r3, r3, r5\n\t"
  26110. #elif defined(__clang__)
  26111. "sbcs r3, r5\n\t"
  26112. #else
  26113. "sbc r3, r5\n\t"
  26114. #endif
  26115. #ifdef WOLFSSL_KEIL
  26116. "sbcs r4, r4, r6\n\t"
  26117. #elif defined(__clang__)
  26118. "sbcs r4, r6\n\t"
  26119. #else
  26120. "sbc r4, r6\n\t"
  26121. #endif
  26122. "stm %[r]!, {r3, r4}\n\t"
  26123. "ldm %[b]!, {r5, r6}\n\t"
  26124. "ldm %[a]!, {r3, r4}\n\t"
  26125. #ifdef WOLFSSL_KEIL
  26126. "sbcs r3, r3, r5\n\t"
  26127. #elif defined(__clang__)
  26128. "sbcs r3, r5\n\t"
  26129. #else
  26130. "sbc r3, r5\n\t"
  26131. #endif
  26132. #ifdef WOLFSSL_KEIL
  26133. "sbcs r4, r4, r6\n\t"
  26134. #elif defined(__clang__)
  26135. "sbcs r4, r6\n\t"
  26136. #else
  26137. "sbc r4, r6\n\t"
  26138. #endif
  26139. "stm %[r]!, {r3, r4}\n\t"
  26140. "ldm %[b]!, {r5, r6}\n\t"
  26141. "ldm %[a]!, {r3, r4}\n\t"
  26142. #ifdef WOLFSSL_KEIL
  26143. "sbcs r3, r3, r5\n\t"
  26144. #elif defined(__clang__)
  26145. "sbcs r3, r5\n\t"
  26146. #else
  26147. "sbc r3, r5\n\t"
  26148. #endif
  26149. #ifdef WOLFSSL_KEIL
  26150. "sbcs r4, r4, r6\n\t"
  26151. #elif defined(__clang__)
  26152. "sbcs r4, r6\n\t"
  26153. #else
  26154. "sbc r4, r6\n\t"
  26155. #endif
  26156. "stm %[r]!, {r3, r4}\n\t"
  26157. "ldm %[b]!, {r5, r6}\n\t"
  26158. "ldm %[a]!, {r3, r4}\n\t"
  26159. #ifdef WOLFSSL_KEIL
  26160. "sbcs r3, r3, r5\n\t"
  26161. #elif defined(__clang__)
  26162. "sbcs r3, r5\n\t"
  26163. #else
  26164. "sbc r3, r5\n\t"
  26165. #endif
  26166. #ifdef WOLFSSL_KEIL
  26167. "sbcs r4, r4, r6\n\t"
  26168. #elif defined(__clang__)
  26169. "sbcs r4, r6\n\t"
  26170. #else
  26171. "sbc r4, r6\n\t"
  26172. #endif
  26173. "stm %[r]!, {r3, r4}\n\t"
  26174. "ldm %[b]!, {r5, r6}\n\t"
  26175. "ldm %[a]!, {r3, r4}\n\t"
  26176. #ifdef WOLFSSL_KEIL
  26177. "sbcs r3, r3, r5\n\t"
  26178. #elif defined(__clang__)
  26179. "sbcs r3, r5\n\t"
  26180. #else
  26181. "sbc r3, r5\n\t"
  26182. #endif
  26183. #ifdef WOLFSSL_KEIL
  26184. "sbcs r4, r4, r6\n\t"
  26185. #elif defined(__clang__)
  26186. "sbcs r4, r6\n\t"
  26187. #else
  26188. "sbc r4, r6\n\t"
  26189. #endif
  26190. "stm %[r]!, {r3, r4}\n\t"
  26191. "ldm %[b]!, {r5, r6}\n\t"
  26192. "ldm %[a]!, {r3, r4}\n\t"
  26193. #ifdef WOLFSSL_KEIL
  26194. "sbcs r3, r3, r5\n\t"
  26195. #elif defined(__clang__)
  26196. "sbcs r3, r5\n\t"
  26197. #else
  26198. "sbc r3, r5\n\t"
  26199. #endif
  26200. #ifdef WOLFSSL_KEIL
  26201. "sbcs r4, r4, r6\n\t"
  26202. #elif defined(__clang__)
  26203. "sbcs r4, r6\n\t"
  26204. #else
  26205. "sbc r4, r6\n\t"
  26206. #endif
  26207. "stm %[r]!, {r3, r4}\n\t"
  26208. "ldm %[b]!, {r5, r6}\n\t"
  26209. "ldm %[a]!, {r3, r4}\n\t"
  26210. #ifdef WOLFSSL_KEIL
  26211. "sbcs r3, r3, r5\n\t"
  26212. #elif defined(__clang__)
  26213. "sbcs r3, r5\n\t"
  26214. #else
  26215. "sbc r3, r5\n\t"
  26216. #endif
  26217. #ifdef WOLFSSL_KEIL
  26218. "sbcs r4, r4, r6\n\t"
  26219. #elif defined(__clang__)
  26220. "sbcs r4, r6\n\t"
  26221. #else
  26222. "sbc r4, r6\n\t"
  26223. #endif
  26224. "stm %[r]!, {r3, r4}\n\t"
  26225. "ldm %[b]!, {r5, r6}\n\t"
  26226. "ldm %[a]!, {r3, r4}\n\t"
  26227. #ifdef WOLFSSL_KEIL
  26228. "sbcs r3, r3, r5\n\t"
  26229. #elif defined(__clang__)
  26230. "sbcs r3, r5\n\t"
  26231. #else
  26232. "sbc r3, r5\n\t"
  26233. #endif
  26234. #ifdef WOLFSSL_KEIL
  26235. "sbcs r4, r4, r6\n\t"
  26236. #elif defined(__clang__)
  26237. "sbcs r4, r6\n\t"
  26238. #else
  26239. "sbc r4, r6\n\t"
  26240. #endif
  26241. "stm %[r]!, {r3, r4}\n\t"
  26242. "ldm %[b]!, {r5, r6}\n\t"
  26243. "ldm %[a]!, {r3, r4}\n\t"
  26244. #ifdef WOLFSSL_KEIL
  26245. "sbcs r3, r3, r5\n\t"
  26246. #elif defined(__clang__)
  26247. "sbcs r3, r5\n\t"
  26248. #else
  26249. "sbc r3, r5\n\t"
  26250. #endif
  26251. #ifdef WOLFSSL_KEIL
  26252. "sbcs r4, r4, r6\n\t"
  26253. #elif defined(__clang__)
  26254. "sbcs r4, r6\n\t"
  26255. #else
  26256. "sbc r4, r6\n\t"
  26257. #endif
  26258. "stm %[r]!, {r3, r4}\n\t"
  26259. "ldm %[b]!, {r5, r6}\n\t"
  26260. "ldm %[a]!, {r3, r4}\n\t"
  26261. #ifdef WOLFSSL_KEIL
  26262. "sbcs r3, r3, r5\n\t"
  26263. #elif defined(__clang__)
  26264. "sbcs r3, r5\n\t"
  26265. #else
  26266. "sbc r3, r5\n\t"
  26267. #endif
  26268. #ifdef WOLFSSL_KEIL
  26269. "sbcs r4, r4, r6\n\t"
  26270. #elif defined(__clang__)
  26271. "sbcs r4, r6\n\t"
  26272. #else
  26273. "sbc r4, r6\n\t"
  26274. #endif
  26275. "stm %[r]!, {r3, r4}\n\t"
  26276. "ldm %[b]!, {r5, r6}\n\t"
  26277. "ldm %[a]!, {r3, r4}\n\t"
  26278. #ifdef WOLFSSL_KEIL
  26279. "sbcs r3, r3, r5\n\t"
  26280. #elif defined(__clang__)
  26281. "sbcs r3, r5\n\t"
  26282. #else
  26283. "sbc r3, r5\n\t"
  26284. #endif
  26285. #ifdef WOLFSSL_KEIL
  26286. "sbcs r4, r4, r6\n\t"
  26287. #elif defined(__clang__)
  26288. "sbcs r4, r6\n\t"
  26289. #else
  26290. "sbc r4, r6\n\t"
  26291. #endif
  26292. "stm %[r]!, {r3, r4}\n\t"
  26293. "ldm %[b]!, {r5, r6}\n\t"
  26294. "ldm %[a]!, {r3, r4}\n\t"
  26295. #ifdef WOLFSSL_KEIL
  26296. "sbcs r3, r3, r5\n\t"
  26297. #elif defined(__clang__)
  26298. "sbcs r3, r5\n\t"
  26299. #else
  26300. "sbc r3, r5\n\t"
  26301. #endif
  26302. #ifdef WOLFSSL_KEIL
  26303. "sbcs r4, r4, r6\n\t"
  26304. #elif defined(__clang__)
  26305. "sbcs r4, r6\n\t"
  26306. #else
  26307. "sbc r4, r6\n\t"
  26308. #endif
  26309. "stm %[r]!, {r3, r4}\n\t"
  26310. "ldm %[b]!, {r5, r6}\n\t"
  26311. "ldm %[a]!, {r3, r4}\n\t"
  26312. #ifdef WOLFSSL_KEIL
  26313. "sbcs r3, r3, r5\n\t"
  26314. #elif defined(__clang__)
  26315. "sbcs r3, r5\n\t"
  26316. #else
  26317. "sbc r3, r5\n\t"
  26318. #endif
  26319. #ifdef WOLFSSL_KEIL
  26320. "sbcs r4, r4, r6\n\t"
  26321. #elif defined(__clang__)
  26322. "sbcs r4, r6\n\t"
  26323. #else
  26324. "sbc r4, r6\n\t"
  26325. #endif
  26326. "stm %[r]!, {r3, r4}\n\t"
  26327. "ldm %[b]!, {r5, r6}\n\t"
  26328. "ldm %[a]!, {r3, r4}\n\t"
  26329. #ifdef WOLFSSL_KEIL
  26330. "sbcs r3, r3, r5\n\t"
  26331. #elif defined(__clang__)
  26332. "sbcs r3, r5\n\t"
  26333. #else
  26334. "sbc r3, r5\n\t"
  26335. #endif
  26336. #ifdef WOLFSSL_KEIL
  26337. "sbcs r4, r4, r6\n\t"
  26338. #elif defined(__clang__)
  26339. "sbcs r4, r6\n\t"
  26340. #else
  26341. "sbc r4, r6\n\t"
  26342. #endif
  26343. "stm %[r]!, {r3, r4}\n\t"
  26344. "ldm %[b]!, {r5, r6}\n\t"
  26345. "ldm %[a]!, {r3, r4}\n\t"
  26346. #ifdef WOLFSSL_KEIL
  26347. "sbcs r3, r3, r5\n\t"
  26348. #elif defined(__clang__)
  26349. "sbcs r3, r5\n\t"
  26350. #else
  26351. "sbc r3, r5\n\t"
  26352. #endif
  26353. #ifdef WOLFSSL_KEIL
  26354. "sbcs r4, r4, r6\n\t"
  26355. #elif defined(__clang__)
  26356. "sbcs r4, r6\n\t"
  26357. #else
  26358. "sbc r4, r6\n\t"
  26359. #endif
  26360. "stm %[r]!, {r3, r4}\n\t"
  26361. "ldm %[b]!, {r5, r6}\n\t"
  26362. "ldm %[a]!, {r3, r4}\n\t"
  26363. #ifdef WOLFSSL_KEIL
  26364. "sbcs r3, r3, r5\n\t"
  26365. #elif defined(__clang__)
  26366. "sbcs r3, r5\n\t"
  26367. #else
  26368. "sbc r3, r5\n\t"
  26369. #endif
  26370. #ifdef WOLFSSL_KEIL
  26371. "sbcs r4, r4, r6\n\t"
  26372. #elif defined(__clang__)
  26373. "sbcs r4, r6\n\t"
  26374. #else
  26375. "sbc r4, r6\n\t"
  26376. #endif
  26377. "stm %[r]!, {r3, r4}\n\t"
  26378. "ldm %[b]!, {r5, r6}\n\t"
  26379. "ldm %[a]!, {r3, r4}\n\t"
  26380. #ifdef WOLFSSL_KEIL
  26381. "sbcs r3, r3, r5\n\t"
  26382. #elif defined(__clang__)
  26383. "sbcs r3, r5\n\t"
  26384. #else
  26385. "sbc r3, r5\n\t"
  26386. #endif
  26387. #ifdef WOLFSSL_KEIL
  26388. "sbcs r4, r4, r6\n\t"
  26389. #elif defined(__clang__)
  26390. "sbcs r4, r6\n\t"
  26391. #else
  26392. "sbc r4, r6\n\t"
  26393. #endif
  26394. "stm %[r]!, {r3, r4}\n\t"
  26395. "ldm %[b]!, {r5, r6}\n\t"
  26396. "ldm %[a]!, {r3, r4}\n\t"
  26397. #ifdef WOLFSSL_KEIL
  26398. "sbcs r3, r3, r5\n\t"
  26399. #elif defined(__clang__)
  26400. "sbcs r3, r5\n\t"
  26401. #else
  26402. "sbc r3, r5\n\t"
  26403. #endif
  26404. #ifdef WOLFSSL_KEIL
  26405. "sbcs r4, r4, r6\n\t"
  26406. #elif defined(__clang__)
  26407. "sbcs r4, r6\n\t"
  26408. #else
  26409. "sbc r4, r6\n\t"
  26410. #endif
  26411. "stm %[r]!, {r3, r4}\n\t"
  26412. "ldm %[b]!, {r5, r6}\n\t"
  26413. "ldm %[a]!, {r3, r4}\n\t"
  26414. #ifdef WOLFSSL_KEIL
  26415. "sbcs r3, r3, r5\n\t"
  26416. #elif defined(__clang__)
  26417. "sbcs r3, r5\n\t"
  26418. #else
  26419. "sbc r3, r5\n\t"
  26420. #endif
  26421. #ifdef WOLFSSL_KEIL
  26422. "sbcs r4, r4, r6\n\t"
  26423. #elif defined(__clang__)
  26424. "sbcs r4, r6\n\t"
  26425. #else
  26426. "sbc r4, r6\n\t"
  26427. #endif
  26428. "stm %[r]!, {r3, r4}\n\t"
  26429. "ldm %[b]!, {r5, r6}\n\t"
  26430. "ldm %[a]!, {r3, r4}\n\t"
  26431. #ifdef WOLFSSL_KEIL
  26432. "sbcs r3, r3, r5\n\t"
  26433. #elif defined(__clang__)
  26434. "sbcs r3, r5\n\t"
  26435. #else
  26436. "sbc r3, r5\n\t"
  26437. #endif
  26438. #ifdef WOLFSSL_KEIL
  26439. "sbcs r4, r4, r6\n\t"
  26440. #elif defined(__clang__)
  26441. "sbcs r4, r6\n\t"
  26442. #else
  26443. "sbc r4, r6\n\t"
  26444. #endif
  26445. "stm %[r]!, {r3, r4}\n\t"
  26446. "ldm %[b]!, {r5, r6}\n\t"
  26447. "ldm %[a]!, {r3, r4}\n\t"
  26448. #ifdef WOLFSSL_KEIL
  26449. "sbcs r3, r3, r5\n\t"
  26450. #elif defined(__clang__)
  26451. "sbcs r3, r5\n\t"
  26452. #else
  26453. "sbc r3, r5\n\t"
  26454. #endif
  26455. #ifdef WOLFSSL_KEIL
  26456. "sbcs r4, r4, r6\n\t"
  26457. #elif defined(__clang__)
  26458. "sbcs r4, r6\n\t"
  26459. #else
  26460. "sbc r4, r6\n\t"
  26461. #endif
  26462. "stm %[r]!, {r3, r4}\n\t"
  26463. "ldm %[b]!, {r5, r6}\n\t"
  26464. "ldm %[a]!, {r3, r4}\n\t"
  26465. #ifdef WOLFSSL_KEIL
  26466. "sbcs r3, r3, r5\n\t"
  26467. #elif defined(__clang__)
  26468. "sbcs r3, r5\n\t"
  26469. #else
  26470. "sbc r3, r5\n\t"
  26471. #endif
  26472. #ifdef WOLFSSL_KEIL
  26473. "sbcs r4, r4, r6\n\t"
  26474. #elif defined(__clang__)
  26475. "sbcs r4, r6\n\t"
  26476. #else
  26477. "sbc r4, r6\n\t"
  26478. #endif
  26479. "stm %[r]!, {r3, r4}\n\t"
  26480. "ldm %[b]!, {r5, r6}\n\t"
  26481. "ldm %[a]!, {r3, r4}\n\t"
  26482. #ifdef WOLFSSL_KEIL
  26483. "sbcs r3, r3, r5\n\t"
  26484. #elif defined(__clang__)
  26485. "sbcs r3, r5\n\t"
  26486. #else
  26487. "sbc r3, r5\n\t"
  26488. #endif
  26489. #ifdef WOLFSSL_KEIL
  26490. "sbcs r4, r4, r6\n\t"
  26491. #elif defined(__clang__)
  26492. "sbcs r4, r6\n\t"
  26493. #else
  26494. "sbc r4, r6\n\t"
  26495. #endif
  26496. "stm %[r]!, {r3, r4}\n\t"
  26497. "ldm %[b]!, {r5, r6}\n\t"
  26498. "ldm %[a]!, {r3, r4}\n\t"
  26499. #ifdef WOLFSSL_KEIL
  26500. "sbcs r3, r3, r5\n\t"
  26501. #elif defined(__clang__)
  26502. "sbcs r3, r5\n\t"
  26503. #else
  26504. "sbc r3, r5\n\t"
  26505. #endif
  26506. #ifdef WOLFSSL_KEIL
  26507. "sbcs r4, r4, r6\n\t"
  26508. #elif defined(__clang__)
  26509. "sbcs r4, r6\n\t"
  26510. #else
  26511. "sbc r4, r6\n\t"
  26512. #endif
  26513. "stm %[r]!, {r3, r4}\n\t"
  26514. "ldm %[b]!, {r5, r6}\n\t"
  26515. "ldm %[a]!, {r3, r4}\n\t"
  26516. #ifdef WOLFSSL_KEIL
  26517. "sbcs r3, r3, r5\n\t"
  26518. #elif defined(__clang__)
  26519. "sbcs r3, r5\n\t"
  26520. #else
  26521. "sbc r3, r5\n\t"
  26522. #endif
  26523. #ifdef WOLFSSL_KEIL
  26524. "sbcs r4, r4, r6\n\t"
  26525. #elif defined(__clang__)
  26526. "sbcs r4, r6\n\t"
  26527. #else
  26528. "sbc r4, r6\n\t"
  26529. #endif
  26530. "stm %[r]!, {r3, r4}\n\t"
  26531. #ifdef WOLFSSL_KEIL
  26532. "sbcs %[r], %[r], %[r]\n\t"
  26533. #elif defined(__clang__)
  26534. "sbcs %[r], %[r]\n\t"
  26535. #else
  26536. "sbc %[r], %[r]\n\t"
  26537. #endif
  26538. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  26539. :
  26540. : "memory", "r3", "r4", "r5", "r6"
  26541. );
  26542. return (uint32_t)(size_t)r;
  26543. }
  26544. #endif /* WOLFSSL_SP_SMALL */
  26545. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  26546. *
  26547. * d1 The high order half of the number to divide.
  26548. * d0 The low order half of the number to divide.
  26549. * div The divisor.
  26550. * returns the result of the division.
  26551. *
  26552. * Note that this is an approximate div. It may give an answer 1 larger.
  26553. */
  26554. SP_NOINLINE static sp_digit div_2048_word_64(sp_digit d1, sp_digit d0,
  26555. sp_digit div)
  26556. {
  26557. __asm__ __volatile__ (
  26558. "movs r3, #0\n\t"
  26559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26560. "lsrs r5, %[div], #1\n\t"
  26561. #else
  26562. "lsr r5, %[div], #1\n\t"
  26563. #endif
  26564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26565. "adds r5, r5, #1\n\t"
  26566. #else
  26567. "add r5, r5, #1\n\t"
  26568. #endif
  26569. "mov r8, %[d0]\n\t"
  26570. "mov r9, %[d1]\n\t"
  26571. "# Do top 32\n\t"
  26572. "movs r6, r5\n\t"
  26573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26574. "subs r6, r6, %[d1]\n\t"
  26575. #else
  26576. "sub r6, r6, %[d1]\n\t"
  26577. #endif
  26578. #ifdef WOLFSSL_KEIL
  26579. "sbcs r6, r6, r6\n\t"
  26580. #elif defined(__clang__)
  26581. "sbcs r6, r6\n\t"
  26582. #else
  26583. "sbc r6, r6\n\t"
  26584. #endif
  26585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26586. "adds r3, r3, r3\n\t"
  26587. #else
  26588. "add r3, r3, r3\n\t"
  26589. #endif
  26590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26591. "subs r3, r3, r6\n\t"
  26592. #else
  26593. "sub r3, r3, r6\n\t"
  26594. #endif
  26595. #ifdef WOLFSSL_KEIL
  26596. "ands r6, r6, r5\n\t"
  26597. #elif defined(__clang__)
  26598. "ands r6, r5\n\t"
  26599. #else
  26600. "and r6, r5\n\t"
  26601. #endif
  26602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26603. "subs %[d1], %[d1], r6\n\t"
  26604. #else
  26605. "sub %[d1], %[d1], r6\n\t"
  26606. #endif
  26607. "movs r4, #29\n\t"
  26608. "\n"
  26609. "L_div_2048_word_64_loop_%=:\n\t"
  26610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26611. "lsls %[d0], %[d0], #1\n\t"
  26612. #else
  26613. "lsl %[d0], %[d0], #1\n\t"
  26614. #endif
  26615. #ifdef WOLFSSL_KEIL
  26616. "adcs %[d1], %[d1], %[d1]\n\t"
  26617. #elif defined(__clang__)
  26618. "adcs %[d1], %[d1]\n\t"
  26619. #else
  26620. "adc %[d1], %[d1]\n\t"
  26621. #endif
  26622. "movs r6, r5\n\t"
  26623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26624. "subs r6, r6, %[d1]\n\t"
  26625. #else
  26626. "sub r6, r6, %[d1]\n\t"
  26627. #endif
  26628. #ifdef WOLFSSL_KEIL
  26629. "sbcs r6, r6, r6\n\t"
  26630. #elif defined(__clang__)
  26631. "sbcs r6, r6\n\t"
  26632. #else
  26633. "sbc r6, r6\n\t"
  26634. #endif
  26635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26636. "adds r3, r3, r3\n\t"
  26637. #else
  26638. "add r3, r3, r3\n\t"
  26639. #endif
  26640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26641. "subs r3, r3, r6\n\t"
  26642. #else
  26643. "sub r3, r3, r6\n\t"
  26644. #endif
  26645. #ifdef WOLFSSL_KEIL
  26646. "ands r6, r6, r5\n\t"
  26647. #elif defined(__clang__)
  26648. "ands r6, r5\n\t"
  26649. #else
  26650. "and r6, r5\n\t"
  26651. #endif
  26652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26653. "subs %[d1], %[d1], r6\n\t"
  26654. #else
  26655. "sub %[d1], %[d1], r6\n\t"
  26656. #endif
  26657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26658. "subs r4, r4, #1\n\t"
  26659. #else
  26660. "sub r4, r4, #1\n\t"
  26661. #endif
  26662. "bpl L_div_2048_word_64_loop_%=\n\t"
  26663. "movs r7, #0\n\t"
  26664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26665. "adds r3, r3, r3\n\t"
  26666. #else
  26667. "add r3, r3, r3\n\t"
  26668. #endif
  26669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26670. "adds r3, r3, #1\n\t"
  26671. #else
  26672. "add r3, r3, #1\n\t"
  26673. #endif
  26674. "# r * div - Start\n\t"
  26675. "uxth %[d1], r3\n\t"
  26676. "uxth r4, %[div]\n\t"
  26677. #ifdef WOLFSSL_KEIL
  26678. "muls r4, %[d1], r4\n\t"
  26679. #elif defined(__clang__)
  26680. "muls r4, %[d1]\n\t"
  26681. #else
  26682. "mul r4, %[d1]\n\t"
  26683. #endif
  26684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26685. "lsrs r6, %[div], #16\n\t"
  26686. #else
  26687. "lsr r6, %[div], #16\n\t"
  26688. #endif
  26689. #ifdef WOLFSSL_KEIL
  26690. "muls %[d1], r6, %[d1]\n\t"
  26691. #elif defined(__clang__)
  26692. "muls %[d1], r6\n\t"
  26693. #else
  26694. "mul %[d1], r6\n\t"
  26695. #endif
  26696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26697. "lsrs r5, %[d1], #16\n\t"
  26698. #else
  26699. "lsr r5, %[d1], #16\n\t"
  26700. #endif
  26701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26702. "lsls %[d1], %[d1], #16\n\t"
  26703. #else
  26704. "lsl %[d1], %[d1], #16\n\t"
  26705. #endif
  26706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26707. "adds r4, r4, %[d1]\n\t"
  26708. #else
  26709. "add r4, r4, %[d1]\n\t"
  26710. #endif
  26711. #ifdef WOLFSSL_KEIL
  26712. "adcs r5, r5, r7\n\t"
  26713. #elif defined(__clang__)
  26714. "adcs r5, r7\n\t"
  26715. #else
  26716. "adc r5, r7\n\t"
  26717. #endif
  26718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26719. "lsrs %[d1], r3, #16\n\t"
  26720. #else
  26721. "lsr %[d1], r3, #16\n\t"
  26722. #endif
  26723. #ifdef WOLFSSL_KEIL
  26724. "muls r6, %[d1], r6\n\t"
  26725. #elif defined(__clang__)
  26726. "muls r6, %[d1]\n\t"
  26727. #else
  26728. "mul r6, %[d1]\n\t"
  26729. #endif
  26730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26731. "adds r5, r5, r6\n\t"
  26732. #else
  26733. "add r5, r5, r6\n\t"
  26734. #endif
  26735. "uxth r6, %[div]\n\t"
  26736. #ifdef WOLFSSL_KEIL
  26737. "muls %[d1], r6, %[d1]\n\t"
  26738. #elif defined(__clang__)
  26739. "muls %[d1], r6\n\t"
  26740. #else
  26741. "mul %[d1], r6\n\t"
  26742. #endif
  26743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26744. "lsrs r6, %[d1], #16\n\t"
  26745. #else
  26746. "lsr r6, %[d1], #16\n\t"
  26747. #endif
  26748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26749. "lsls %[d1], %[d1], #16\n\t"
  26750. #else
  26751. "lsl %[d1], %[d1], #16\n\t"
  26752. #endif
  26753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26754. "adds r4, r4, %[d1]\n\t"
  26755. #else
  26756. "add r4, r4, %[d1]\n\t"
  26757. #endif
  26758. #ifdef WOLFSSL_KEIL
  26759. "adcs r5, r5, r6\n\t"
  26760. #elif defined(__clang__)
  26761. "adcs r5, r6\n\t"
  26762. #else
  26763. "adc r5, r6\n\t"
  26764. #endif
  26765. "# r * div - Done\n\t"
  26766. "mov %[d1], r8\n\t"
  26767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26768. "subs %[d1], %[d1], r4\n\t"
  26769. #else
  26770. "sub %[d1], %[d1], r4\n\t"
  26771. #endif
  26772. "movs r4, %[d1]\n\t"
  26773. "mov %[d1], r9\n\t"
  26774. #ifdef WOLFSSL_KEIL
  26775. "sbcs %[d1], %[d1], r5\n\t"
  26776. #elif defined(__clang__)
  26777. "sbcs %[d1], r5\n\t"
  26778. #else
  26779. "sbc %[d1], r5\n\t"
  26780. #endif
  26781. "movs r5, %[d1]\n\t"
  26782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26783. "adds r3, r3, r5\n\t"
  26784. #else
  26785. "add r3, r3, r5\n\t"
  26786. #endif
  26787. "# r * div - Start\n\t"
  26788. "uxth %[d1], r3\n\t"
  26789. "uxth r4, %[div]\n\t"
  26790. #ifdef WOLFSSL_KEIL
  26791. "muls r4, %[d1], r4\n\t"
  26792. #elif defined(__clang__)
  26793. "muls r4, %[d1]\n\t"
  26794. #else
  26795. "mul r4, %[d1]\n\t"
  26796. #endif
  26797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26798. "lsrs r6, %[div], #16\n\t"
  26799. #else
  26800. "lsr r6, %[div], #16\n\t"
  26801. #endif
  26802. #ifdef WOLFSSL_KEIL
  26803. "muls %[d1], r6, %[d1]\n\t"
  26804. #elif defined(__clang__)
  26805. "muls %[d1], r6\n\t"
  26806. #else
  26807. "mul %[d1], r6\n\t"
  26808. #endif
  26809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26810. "lsrs r5, %[d1], #16\n\t"
  26811. #else
  26812. "lsr r5, %[d1], #16\n\t"
  26813. #endif
  26814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26815. "lsls %[d1], %[d1], #16\n\t"
  26816. #else
  26817. "lsl %[d1], %[d1], #16\n\t"
  26818. #endif
  26819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26820. "adds r4, r4, %[d1]\n\t"
  26821. #else
  26822. "add r4, r4, %[d1]\n\t"
  26823. #endif
  26824. #ifdef WOLFSSL_KEIL
  26825. "adcs r5, r5, r7\n\t"
  26826. #elif defined(__clang__)
  26827. "adcs r5, r7\n\t"
  26828. #else
  26829. "adc r5, r7\n\t"
  26830. #endif
  26831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26832. "lsrs %[d1], r3, #16\n\t"
  26833. #else
  26834. "lsr %[d1], r3, #16\n\t"
  26835. #endif
  26836. #ifdef WOLFSSL_KEIL
  26837. "muls r6, %[d1], r6\n\t"
  26838. #elif defined(__clang__)
  26839. "muls r6, %[d1]\n\t"
  26840. #else
  26841. "mul r6, %[d1]\n\t"
  26842. #endif
  26843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26844. "adds r5, r5, r6\n\t"
  26845. #else
  26846. "add r5, r5, r6\n\t"
  26847. #endif
  26848. "uxth r6, %[div]\n\t"
  26849. #ifdef WOLFSSL_KEIL
  26850. "muls %[d1], r6, %[d1]\n\t"
  26851. #elif defined(__clang__)
  26852. "muls %[d1], r6\n\t"
  26853. #else
  26854. "mul %[d1], r6\n\t"
  26855. #endif
  26856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26857. "lsrs r6, %[d1], #16\n\t"
  26858. #else
  26859. "lsr r6, %[d1], #16\n\t"
  26860. #endif
  26861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26862. "lsls %[d1], %[d1], #16\n\t"
  26863. #else
  26864. "lsl %[d1], %[d1], #16\n\t"
  26865. #endif
  26866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26867. "adds r4, r4, %[d1]\n\t"
  26868. #else
  26869. "add r4, r4, %[d1]\n\t"
  26870. #endif
  26871. #ifdef WOLFSSL_KEIL
  26872. "adcs r5, r5, r6\n\t"
  26873. #elif defined(__clang__)
  26874. "adcs r5, r6\n\t"
  26875. #else
  26876. "adc r5, r6\n\t"
  26877. #endif
  26878. "# r * div - Done\n\t"
  26879. "mov %[d1], r8\n\t"
  26880. "mov r6, r9\n\t"
  26881. #ifdef WOLFSSL_KEIL
  26882. "subs r4, %[d1], r4\n\t"
  26883. #else
  26884. #ifdef __clang__
  26885. "subs r4, %[d1], r4\n\t"
  26886. #else
  26887. "sub r4, %[d1], r4\n\t"
  26888. #endif
  26889. #endif
  26890. #ifdef WOLFSSL_KEIL
  26891. "sbcs r6, r6, r5\n\t"
  26892. #elif defined(__clang__)
  26893. "sbcs r6, r5\n\t"
  26894. #else
  26895. "sbc r6, r5\n\t"
  26896. #endif
  26897. "movs r5, r6\n\t"
  26898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26899. "adds r3, r3, r5\n\t"
  26900. #else
  26901. "add r3, r3, r5\n\t"
  26902. #endif
  26903. "# r * div - Start\n\t"
  26904. "uxth %[d1], r3\n\t"
  26905. "uxth r4, %[div]\n\t"
  26906. #ifdef WOLFSSL_KEIL
  26907. "muls r4, %[d1], r4\n\t"
  26908. #elif defined(__clang__)
  26909. "muls r4, %[d1]\n\t"
  26910. #else
  26911. "mul r4, %[d1]\n\t"
  26912. #endif
  26913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26914. "lsrs r6, %[div], #16\n\t"
  26915. #else
  26916. "lsr r6, %[div], #16\n\t"
  26917. #endif
  26918. #ifdef WOLFSSL_KEIL
  26919. "muls %[d1], r6, %[d1]\n\t"
  26920. #elif defined(__clang__)
  26921. "muls %[d1], r6\n\t"
  26922. #else
  26923. "mul %[d1], r6\n\t"
  26924. #endif
  26925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26926. "lsrs r5, %[d1], #16\n\t"
  26927. #else
  26928. "lsr r5, %[d1], #16\n\t"
  26929. #endif
  26930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26931. "lsls %[d1], %[d1], #16\n\t"
  26932. #else
  26933. "lsl %[d1], %[d1], #16\n\t"
  26934. #endif
  26935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26936. "adds r4, r4, %[d1]\n\t"
  26937. #else
  26938. "add r4, r4, %[d1]\n\t"
  26939. #endif
  26940. #ifdef WOLFSSL_KEIL
  26941. "adcs r5, r5, r7\n\t"
  26942. #elif defined(__clang__)
  26943. "adcs r5, r7\n\t"
  26944. #else
  26945. "adc r5, r7\n\t"
  26946. #endif
  26947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26948. "lsrs %[d1], r3, #16\n\t"
  26949. #else
  26950. "lsr %[d1], r3, #16\n\t"
  26951. #endif
  26952. #ifdef WOLFSSL_KEIL
  26953. "muls r6, %[d1], r6\n\t"
  26954. #elif defined(__clang__)
  26955. "muls r6, %[d1]\n\t"
  26956. #else
  26957. "mul r6, %[d1]\n\t"
  26958. #endif
  26959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26960. "adds r5, r5, r6\n\t"
  26961. #else
  26962. "add r5, r5, r6\n\t"
  26963. #endif
  26964. "uxth r6, %[div]\n\t"
  26965. #ifdef WOLFSSL_KEIL
  26966. "muls %[d1], r6, %[d1]\n\t"
  26967. #elif defined(__clang__)
  26968. "muls %[d1], r6\n\t"
  26969. #else
  26970. "mul %[d1], r6\n\t"
  26971. #endif
  26972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26973. "lsrs r6, %[d1], #16\n\t"
  26974. #else
  26975. "lsr r6, %[d1], #16\n\t"
  26976. #endif
  26977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26978. "lsls %[d1], %[d1], #16\n\t"
  26979. #else
  26980. "lsl %[d1], %[d1], #16\n\t"
  26981. #endif
  26982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26983. "adds r4, r4, %[d1]\n\t"
  26984. #else
  26985. "add r4, r4, %[d1]\n\t"
  26986. #endif
  26987. #ifdef WOLFSSL_KEIL
  26988. "adcs r5, r5, r6\n\t"
  26989. #elif defined(__clang__)
  26990. "adcs r5, r6\n\t"
  26991. #else
  26992. "adc r5, r6\n\t"
  26993. #endif
  26994. "# r * div - Done\n\t"
  26995. "mov %[d1], r8\n\t"
  26996. "mov r6, r9\n\t"
  26997. #ifdef WOLFSSL_KEIL
  26998. "subs r4, %[d1], r4\n\t"
  26999. #else
  27000. #ifdef __clang__
  27001. "subs r4, %[d1], r4\n\t"
  27002. #else
  27003. "sub r4, %[d1], r4\n\t"
  27004. #endif
  27005. #endif
  27006. #ifdef WOLFSSL_KEIL
  27007. "sbcs r6, r6, r5\n\t"
  27008. #elif defined(__clang__)
  27009. "sbcs r6, r5\n\t"
  27010. #else
  27011. "sbc r6, r5\n\t"
  27012. #endif
  27013. "movs r5, r6\n\t"
  27014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27015. "adds r3, r3, r5\n\t"
  27016. #else
  27017. "add r3, r3, r5\n\t"
  27018. #endif
  27019. "# r * div - Start\n\t"
  27020. "uxth %[d1], r3\n\t"
  27021. "uxth r4, %[div]\n\t"
  27022. #ifdef WOLFSSL_KEIL
  27023. "muls r4, %[d1], r4\n\t"
  27024. #elif defined(__clang__)
  27025. "muls r4, %[d1]\n\t"
  27026. #else
  27027. "mul r4, %[d1]\n\t"
  27028. #endif
  27029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27030. "lsrs r6, %[div], #16\n\t"
  27031. #else
  27032. "lsr r6, %[div], #16\n\t"
  27033. #endif
  27034. #ifdef WOLFSSL_KEIL
  27035. "muls %[d1], r6, %[d1]\n\t"
  27036. #elif defined(__clang__)
  27037. "muls %[d1], r6\n\t"
  27038. #else
  27039. "mul %[d1], r6\n\t"
  27040. #endif
  27041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27042. "lsrs r5, %[d1], #16\n\t"
  27043. #else
  27044. "lsr r5, %[d1], #16\n\t"
  27045. #endif
  27046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27047. "lsls %[d1], %[d1], #16\n\t"
  27048. #else
  27049. "lsl %[d1], %[d1], #16\n\t"
  27050. #endif
  27051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27052. "adds r4, r4, %[d1]\n\t"
  27053. #else
  27054. "add r4, r4, %[d1]\n\t"
  27055. #endif
  27056. #ifdef WOLFSSL_KEIL
  27057. "adcs r5, r5, r7\n\t"
  27058. #elif defined(__clang__)
  27059. "adcs r5, r7\n\t"
  27060. #else
  27061. "adc r5, r7\n\t"
  27062. #endif
  27063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27064. "lsrs %[d1], r3, #16\n\t"
  27065. #else
  27066. "lsr %[d1], r3, #16\n\t"
  27067. #endif
  27068. #ifdef WOLFSSL_KEIL
  27069. "muls r6, %[d1], r6\n\t"
  27070. #elif defined(__clang__)
  27071. "muls r6, %[d1]\n\t"
  27072. #else
  27073. "mul r6, %[d1]\n\t"
  27074. #endif
  27075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27076. "adds r5, r5, r6\n\t"
  27077. #else
  27078. "add r5, r5, r6\n\t"
  27079. #endif
  27080. "uxth r6, %[div]\n\t"
  27081. #ifdef WOLFSSL_KEIL
  27082. "muls %[d1], r6, %[d1]\n\t"
  27083. #elif defined(__clang__)
  27084. "muls %[d1], r6\n\t"
  27085. #else
  27086. "mul %[d1], r6\n\t"
  27087. #endif
  27088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27089. "lsrs r6, %[d1], #16\n\t"
  27090. #else
  27091. "lsr r6, %[d1], #16\n\t"
  27092. #endif
  27093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27094. "lsls %[d1], %[d1], #16\n\t"
  27095. #else
  27096. "lsl %[d1], %[d1], #16\n\t"
  27097. #endif
  27098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27099. "adds r4, r4, %[d1]\n\t"
  27100. #else
  27101. "add r4, r4, %[d1]\n\t"
  27102. #endif
  27103. #ifdef WOLFSSL_KEIL
  27104. "adcs r5, r5, r6\n\t"
  27105. #elif defined(__clang__)
  27106. "adcs r5, r6\n\t"
  27107. #else
  27108. "adc r5, r6\n\t"
  27109. #endif
  27110. "# r * div - Done\n\t"
  27111. "mov %[d1], r8\n\t"
  27112. "mov r6, r9\n\t"
  27113. #ifdef WOLFSSL_KEIL
  27114. "subs r4, %[d1], r4\n\t"
  27115. #else
  27116. #ifdef __clang__
  27117. "subs r4, %[d1], r4\n\t"
  27118. #else
  27119. "sub r4, %[d1], r4\n\t"
  27120. #endif
  27121. #endif
  27122. #ifdef WOLFSSL_KEIL
  27123. "sbcs r6, r6, r5\n\t"
  27124. #elif defined(__clang__)
  27125. "sbcs r6, r5\n\t"
  27126. #else
  27127. "sbc r6, r5\n\t"
  27128. #endif
  27129. "movs r5, r6\n\t"
  27130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27131. "adds r3, r3, r5\n\t"
  27132. #else
  27133. "add r3, r3, r5\n\t"
  27134. #endif
  27135. "movs r6, %[div]\n\t"
  27136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27137. "subs r6, r6, r4\n\t"
  27138. #else
  27139. "sub r6, r6, r4\n\t"
  27140. #endif
  27141. #ifdef WOLFSSL_KEIL
  27142. "sbcs r6, r6, r6\n\t"
  27143. #elif defined(__clang__)
  27144. "sbcs r6, r6\n\t"
  27145. #else
  27146. "sbc r6, r6\n\t"
  27147. #endif
  27148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27149. "subs r3, r3, r6\n\t"
  27150. #else
  27151. "sub r3, r3, r6\n\t"
  27152. #endif
  27153. "movs %[d1], r3\n\t"
  27154. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  27155. :
  27156. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  27157. );
  27158. return (uint32_t)(size_t)d1;
  27159. }
  27160. /* Divide d in a and put remainder into r (m*d + r = a)
  27161. * m is not calculated as it is not needed at this time.
  27162. *
  27163. * a Number to be divided.
  27164. * d Number to divide with.
  27165. * m Multiplier result.
  27166. * r Remainder from the division.
  27167. * returns MP_OKAY indicating success.
  27168. */
  27169. static WC_INLINE int sp_2048_div_64_cond(const sp_digit* a, const sp_digit* d,
  27170. sp_digit* m, sp_digit* r)
  27171. {
  27172. sp_digit t1[128], t2[65];
  27173. sp_digit div, r1;
  27174. int i;
  27175. (void)m;
  27176. div = d[63];
  27177. XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
  27178. for (i = 63; i > 0; i--) {
  27179. if (t1[i + 64] != d[i])
  27180. break;
  27181. }
  27182. if (t1[i + 64] >= d[i]) {
  27183. sp_2048_sub_in_place_64(&t1[64], d);
  27184. }
  27185. for (i = 63; i >= 0; i--) {
  27186. if (t1[64 + i] == div) {
  27187. r1 = SP_DIGIT_MAX;
  27188. }
  27189. else {
  27190. r1 = div_2048_word_64(t1[64 + i], t1[64 + i - 1], div);
  27191. }
  27192. sp_2048_mul_d_64(t2, d, r1);
  27193. t1[64 + i] += sp_2048_sub_in_place_64(&t1[i], t2);
  27194. t1[64 + i] -= t2[64];
  27195. if (t1[64 + i] != 0) {
  27196. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], d);
  27197. if (t1[64 + i] != 0)
  27198. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], d);
  27199. }
  27200. }
  27201. for (i = 63; i > 0; i--) {
  27202. if (t1[i] != d[i])
  27203. break;
  27204. }
  27205. if (t1[i] >= d[i]) {
  27206. sp_2048_sub_64(r, t1, d);
  27207. }
  27208. else {
  27209. XMEMCPY(r, t1, sizeof(*t1) * 64);
  27210. }
  27211. return MP_OKAY;
  27212. }
  27213. /* Reduce a modulo m into r. (r = a mod m)
  27214. *
  27215. * r A single precision number that is the reduced result.
  27216. * a A single precision number that is to be reduced.
  27217. * m A single precision number that is the modulus to reduce with.
  27218. * returns MP_OKAY indicating success.
  27219. */
  27220. static WC_INLINE int sp_2048_mod_64_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
  27221. {
  27222. int ret;
  27223. ret = sp_2048_div_64_cond(a, m, NULL, r);
  27224. return ret;
  27225. }
  27226. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  27227. /* AND m into each word of a and store in r.
  27228. *
  27229. * r A single precision integer.
  27230. * a A single precision integer.
  27231. * m Mask to AND against each digit.
  27232. */
  27233. static void sp_2048_mask_64(sp_digit* r, const sp_digit* a, sp_digit m)
  27234. {
  27235. #ifdef WOLFSSL_SP_SMALL
  27236. int i;
  27237. for (i=0; i<64; i++) {
  27238. r[i] = a[i] & m;
  27239. }
  27240. #else
  27241. int i;
  27242. for (i = 0; i < 64; i += 8) {
  27243. r[i+0] = a[i+0] & m;
  27244. r[i+1] = a[i+1] & m;
  27245. r[i+2] = a[i+2] & m;
  27246. r[i+3] = a[i+3] & m;
  27247. r[i+4] = a[i+4] & m;
  27248. r[i+5] = a[i+5] & m;
  27249. r[i+6] = a[i+6] & m;
  27250. r[i+7] = a[i+7] & m;
  27251. }
  27252. #endif
  27253. }
  27254. /* Compare a with b in constant time.
  27255. *
  27256. * a A single precision integer.
  27257. * b A single precision integer.
  27258. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  27259. * respectively.
  27260. */
  27261. SP_NOINLINE static sp_int32 sp_2048_cmp_64(const sp_digit* a, const sp_digit* b)
  27262. {
  27263. __asm__ __volatile__ (
  27264. "movs r2, #0\n\t"
  27265. "movs r3, #0\n\t"
  27266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27267. "mvns r3, r3\n\t"
  27268. #else
  27269. "mvn r3, r3\n\t"
  27270. #endif
  27271. "movs r6, #0xfc\n\t"
  27272. "\n"
  27273. "L_sp_2048_cmp_64_words_%=:\n\t"
  27274. "ldr r7, [%[a], r6]\n\t"
  27275. "ldr r5, [%[b], r6]\n\t"
  27276. #ifdef WOLFSSL_KEIL
  27277. "ands r7, r7, r3\n\t"
  27278. #elif defined(__clang__)
  27279. "ands r7, r3\n\t"
  27280. #else
  27281. "and r7, r3\n\t"
  27282. #endif
  27283. #ifdef WOLFSSL_KEIL
  27284. "ands r5, r5, r3\n\t"
  27285. #elif defined(__clang__)
  27286. "ands r5, r3\n\t"
  27287. #else
  27288. "and r5, r3\n\t"
  27289. #endif
  27290. "movs r4, r7\n\t"
  27291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27292. "subs r7, r7, r5\n\t"
  27293. #else
  27294. "sub r7, r7, r5\n\t"
  27295. #endif
  27296. #ifdef WOLFSSL_KEIL
  27297. "sbcs r7, r7, r7\n\t"
  27298. #elif defined(__clang__)
  27299. "sbcs r7, r7\n\t"
  27300. #else
  27301. "sbc r7, r7\n\t"
  27302. #endif
  27303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27304. "adds r2, r2, r7\n\t"
  27305. #else
  27306. "add r2, r2, r7\n\t"
  27307. #endif
  27308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27309. "mvns r7, r7\n\t"
  27310. #else
  27311. "mvn r7, r7\n\t"
  27312. #endif
  27313. #ifdef WOLFSSL_KEIL
  27314. "ands r3, r3, r7\n\t"
  27315. #elif defined(__clang__)
  27316. "ands r3, r7\n\t"
  27317. #else
  27318. "and r3, r7\n\t"
  27319. #endif
  27320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27321. "subs r5, r5, r4\n\t"
  27322. #else
  27323. "sub r5, r5, r4\n\t"
  27324. #endif
  27325. #ifdef WOLFSSL_KEIL
  27326. "sbcs r7, r7, r7\n\t"
  27327. #elif defined(__clang__)
  27328. "sbcs r7, r7\n\t"
  27329. #else
  27330. "sbc r7, r7\n\t"
  27331. #endif
  27332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27333. "subs r2, r2, r7\n\t"
  27334. #else
  27335. "sub r2, r2, r7\n\t"
  27336. #endif
  27337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27338. "mvns r7, r7\n\t"
  27339. #else
  27340. "mvn r7, r7\n\t"
  27341. #endif
  27342. #ifdef WOLFSSL_KEIL
  27343. "ands r3, r3, r7\n\t"
  27344. #elif defined(__clang__)
  27345. "ands r3, r7\n\t"
  27346. #else
  27347. "and r3, r7\n\t"
  27348. #endif
  27349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27350. "subs r6, r6, #4\n\t"
  27351. #else
  27352. "sub r6, r6, #4\n\t"
  27353. #endif
  27354. "bge L_sp_2048_cmp_64_words_%=\n\t"
  27355. "movs %[a], r2\n\t"
  27356. : [a] "+l" (a), [b] "+l" (b)
  27357. :
  27358. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  27359. );
  27360. return (uint32_t)(size_t)a;
  27361. }
  27362. /* Divide d in a and put remainder into r (m*d + r = a)
  27363. * m is not calculated as it is not needed at this time.
  27364. *
  27365. * a Number to be divided.
  27366. * d Number to divide with.
  27367. * m Multiplier result.
  27368. * r Remainder from the division.
  27369. * returns MP_OKAY indicating success.
  27370. */
  27371. static WC_INLINE int sp_2048_div_64(const sp_digit* a, const sp_digit* d,
  27372. sp_digit* m, sp_digit* r)
  27373. {
  27374. sp_digit t1[128], t2[65];
  27375. sp_digit div, r1;
  27376. int i;
  27377. (void)m;
  27378. div = d[63];
  27379. XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
  27380. r1 = sp_2048_cmp_64(&t1[64], d) >= 0;
  27381. sp_2048_cond_sub_64(&t1[64], &t1[64], d, (sp_digit)0 - r1);
  27382. for (i = 63; i >= 0; i--) {
  27383. volatile sp_digit mask = (sp_digit)0 - (t1[64 + i] == div);
  27384. sp_digit hi = t1[64 + i] + mask;
  27385. r1 = div_2048_word_64(hi, t1[64 + i - 1], div);
  27386. r1 |= mask;
  27387. sp_2048_mul_d_64(t2, d, r1);
  27388. t1[64 + i] += sp_2048_sub_in_place_64(&t1[i], t2);
  27389. t1[64 + i] -= t2[64];
  27390. sp_2048_mask_64(t2, d, t1[64 + i]);
  27391. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], t2);
  27392. sp_2048_mask_64(t2, d, t1[64 + i]);
  27393. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], t2);
  27394. }
  27395. r1 = sp_2048_cmp_64(t1, d) >= 0;
  27396. sp_2048_cond_sub_64(r, t1, d, (sp_digit)0 - r1);
  27397. return MP_OKAY;
  27398. }
  27399. /* Reduce a modulo m into r. (r = a mod m)
  27400. *
  27401. * r A single precision number that is the reduced result.
  27402. * a A single precision number that is to be reduced.
  27403. * m A single precision number that is the modulus to reduce with.
  27404. * returns MP_OKAY indicating success.
  27405. */
  27406. static WC_INLINE int sp_2048_mod_64(sp_digit* r, const sp_digit* a, const sp_digit* m)
  27407. {
  27408. int ret;
  27409. ret = sp_2048_div_64(a, m, NULL, r);
  27410. return ret;
  27411. }
  27412. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  27413. defined(WOLFSSL_HAVE_SP_DH)
  27414. #ifdef WOLFSSL_SP_SMALL
  27415. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  27416. *
  27417. * r A single precision number that is the result of the operation.
  27418. * a A single precision number being exponentiated.
  27419. * e A single precision number that is the exponent.
  27420. * bits The number of bits in the exponent.
  27421. * m A single precision number that is the modulus.
  27422. * returns 0 on success.
  27423. * returns MEMORY_E on dynamic memory allocation failure.
  27424. * returns MP_VAL when base is even or exponent is 0.
  27425. */
  27426. static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
  27427. int bits, const sp_digit* m, int reduceA)
  27428. {
  27429. #ifdef WOLFSSL_SP_SMALL_STACK
  27430. sp_digit* td = NULL;
  27431. #else
  27432. sp_digit td[8 * 128];
  27433. #endif
  27434. sp_digit* t[8];
  27435. sp_digit* norm = NULL;
  27436. sp_digit mp = 1;
  27437. sp_digit n;
  27438. sp_digit mask;
  27439. int i;
  27440. int c;
  27441. byte y;
  27442. int err = MP_OKAY;
  27443. if (bits == 0) {
  27444. err = MP_VAL;
  27445. }
  27446. #ifdef WOLFSSL_SP_SMALL_STACK
  27447. if (err == MP_OKAY) {
  27448. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 128), NULL,
  27449. DYNAMIC_TYPE_TMP_BUFFER);
  27450. if (td == NULL)
  27451. err = MEMORY_E;
  27452. }
  27453. #endif
  27454. if (err == MP_OKAY) {
  27455. norm = td;
  27456. for (i=0; i<8; i++) {
  27457. t[i] = td + i * 128;
  27458. }
  27459. sp_2048_mont_setup(m, &mp);
  27460. sp_2048_mont_norm_64(norm, m);
  27461. XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
  27462. if (reduceA != 0) {
  27463. err = sp_2048_mod_64(t[1] + 64, a, m);
  27464. if (err == MP_OKAY) {
  27465. err = sp_2048_mod_64(t[1], t[1], m);
  27466. }
  27467. }
  27468. else {
  27469. XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
  27470. err = sp_2048_mod_64(t[1], t[1], m);
  27471. }
  27472. }
  27473. if (err == MP_OKAY) {
  27474. sp_2048_mont_sqr_64(t[ 2], t[ 1], m, mp);
  27475. sp_2048_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
  27476. sp_2048_mont_sqr_64(t[ 4], t[ 2], m, mp);
  27477. sp_2048_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
  27478. sp_2048_mont_sqr_64(t[ 6], t[ 3], m, mp);
  27479. sp_2048_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
  27480. i = (bits - 1) / 32;
  27481. n = e[i--];
  27482. c = bits & 31;
  27483. if (c == 0) {
  27484. c = 32;
  27485. }
  27486. c -= bits % 3;
  27487. if (c == 32) {
  27488. c = 29;
  27489. }
  27490. if (c < 0) {
  27491. /* Number of bits in top word is less than number needed. */
  27492. c = -c;
  27493. y = (byte)(n << c);
  27494. n = e[i--];
  27495. y |= (byte)(n >> (64 - c));
  27496. n <<= c;
  27497. c = 64 - c;
  27498. }
  27499. else if (c == 0) {
  27500. /* All bits in top word used. */
  27501. y = (byte)n;
  27502. }
  27503. else {
  27504. y = (byte)(n >> c);
  27505. n <<= 32 - c;
  27506. }
  27507. XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
  27508. for (; i>=0 || c>=3; ) {
  27509. if (c == 0) {
  27510. n = e[i--];
  27511. y = (byte)(n >> 29);
  27512. n <<= 3;
  27513. c = 29;
  27514. }
  27515. else if (c < 3) {
  27516. y = (byte)(n >> 29);
  27517. n = e[i--];
  27518. c = 3 - c;
  27519. y |= (byte)(n >> (32 - c));
  27520. n <<= c;
  27521. c = 32 - c;
  27522. }
  27523. else {
  27524. y = (byte)((n >> 29) & 0x7);
  27525. n <<= 3;
  27526. c -= 3;
  27527. }
  27528. sp_2048_mont_sqr_64(r, r, m, mp);
  27529. sp_2048_mont_sqr_64(r, r, m, mp);
  27530. sp_2048_mont_sqr_64(r, r, m, mp);
  27531. sp_2048_mont_mul_64(r, r, t[y], m, mp);
  27532. }
  27533. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  27534. sp_2048_mont_reduce_64(r, m, mp);
  27535. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  27536. sp_2048_cond_sub_64(r, r, m, mask);
  27537. }
  27538. #ifdef WOLFSSL_SP_SMALL_STACK
  27539. if (td != NULL)
  27540. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27541. #endif
  27542. return err;
  27543. }
  27544. #else
  27545. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  27546. *
  27547. * r A single precision number that is the result of the operation.
  27548. * a A single precision number being exponentiated.
  27549. * e A single precision number that is the exponent.
  27550. * bits The number of bits in the exponent.
  27551. * m A single precision number that is the modulus.
  27552. * returns 0 on success.
  27553. * returns MEMORY_E on dynamic memory allocation failure.
  27554. * returns MP_VAL when base is even or exponent is 0.
  27555. */
  27556. static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
  27557. int bits, const sp_digit* m, int reduceA)
  27558. {
  27559. #ifdef WOLFSSL_SP_SMALL_STACK
  27560. sp_digit* td = NULL;
  27561. #else
  27562. sp_digit td[16 * 128];
  27563. #endif
  27564. sp_digit* t[16];
  27565. sp_digit* norm = NULL;
  27566. sp_digit mp = 1;
  27567. sp_digit n;
  27568. sp_digit mask;
  27569. int i;
  27570. int c;
  27571. byte y;
  27572. int err = MP_OKAY;
  27573. if (bits == 0) {
  27574. err = MP_VAL;
  27575. }
  27576. #ifdef WOLFSSL_SP_SMALL_STACK
  27577. if (err == MP_OKAY) {
  27578. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 128), NULL,
  27579. DYNAMIC_TYPE_TMP_BUFFER);
  27580. if (td == NULL)
  27581. err = MEMORY_E;
  27582. }
  27583. #endif
  27584. if (err == MP_OKAY) {
  27585. norm = td;
  27586. for (i=0; i<16; i++) {
  27587. t[i] = td + i * 128;
  27588. }
  27589. sp_2048_mont_setup(m, &mp);
  27590. sp_2048_mont_norm_64(norm, m);
  27591. XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
  27592. if (reduceA != 0) {
  27593. err = sp_2048_mod_64(t[1] + 64, a, m);
  27594. if (err == MP_OKAY) {
  27595. err = sp_2048_mod_64(t[1], t[1], m);
  27596. }
  27597. }
  27598. else {
  27599. XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
  27600. err = sp_2048_mod_64(t[1], t[1], m);
  27601. }
  27602. }
  27603. if (err == MP_OKAY) {
  27604. sp_2048_mont_sqr_64(t[ 2], t[ 1], m, mp);
  27605. sp_2048_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
  27606. sp_2048_mont_sqr_64(t[ 4], t[ 2], m, mp);
  27607. sp_2048_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
  27608. sp_2048_mont_sqr_64(t[ 6], t[ 3], m, mp);
  27609. sp_2048_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
  27610. sp_2048_mont_sqr_64(t[ 8], t[ 4], m, mp);
  27611. sp_2048_mont_mul_64(t[ 9], t[ 5], t[ 4], m, mp);
  27612. sp_2048_mont_sqr_64(t[10], t[ 5], m, mp);
  27613. sp_2048_mont_mul_64(t[11], t[ 6], t[ 5], m, mp);
  27614. sp_2048_mont_sqr_64(t[12], t[ 6], m, mp);
  27615. sp_2048_mont_mul_64(t[13], t[ 7], t[ 6], m, mp);
  27616. sp_2048_mont_sqr_64(t[14], t[ 7], m, mp);
  27617. sp_2048_mont_mul_64(t[15], t[ 8], t[ 7], m, mp);
  27618. i = (bits - 1) / 32;
  27619. n = e[i--];
  27620. c = bits & 31;
  27621. if (c == 0) {
  27622. c = 32;
  27623. }
  27624. c -= bits % 4;
  27625. if (c == 32) {
  27626. c = 28;
  27627. }
  27628. if (c < 0) {
  27629. /* Number of bits in top word is less than number needed. */
  27630. c = -c;
  27631. y = (byte)(n << c);
  27632. n = e[i--];
  27633. y |= (byte)(n >> (64 - c));
  27634. n <<= c;
  27635. c = 64 - c;
  27636. }
  27637. else if (c == 0) {
  27638. /* All bits in top word used. */
  27639. y = (byte)n;
  27640. }
  27641. else {
  27642. y = (byte)(n >> c);
  27643. n <<= 32 - c;
  27644. }
  27645. XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
  27646. for (; i>=0 || c>=4; ) {
  27647. if (c == 0) {
  27648. n = e[i--];
  27649. y = (byte)(n >> 28);
  27650. n <<= 4;
  27651. c = 28;
  27652. }
  27653. else if (c < 4) {
  27654. y = (byte)(n >> 28);
  27655. n = e[i--];
  27656. c = 4 - c;
  27657. y |= (byte)(n >> (32 - c));
  27658. n <<= c;
  27659. c = 32 - c;
  27660. }
  27661. else {
  27662. y = (byte)((n >> 28) & 0xf);
  27663. n <<= 4;
  27664. c -= 4;
  27665. }
  27666. sp_2048_mont_sqr_64(r, r, m, mp);
  27667. sp_2048_mont_sqr_64(r, r, m, mp);
  27668. sp_2048_mont_sqr_64(r, r, m, mp);
  27669. sp_2048_mont_sqr_64(r, r, m, mp);
  27670. sp_2048_mont_mul_64(r, r, t[y], m, mp);
  27671. }
  27672. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  27673. sp_2048_mont_reduce_64(r, m, mp);
  27674. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  27675. sp_2048_cond_sub_64(r, r, m, mask);
  27676. }
  27677. #ifdef WOLFSSL_SP_SMALL_STACK
  27678. if (td != NULL)
  27679. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27680. #endif
  27681. return err;
  27682. }
  27683. #endif /* WOLFSSL_SP_SMALL */
  27684. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  27685. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  27686. #ifdef WOLFSSL_HAVE_SP_RSA
  27687. /* RSA public key operation.
  27688. *
  27689. * in Array of bytes representing the number to exponentiate, base.
  27690. * inLen Number of bytes in base.
  27691. * em Public exponent.
  27692. * mm Modulus.
  27693. * out Buffer to hold big-endian bytes of exponentiation result.
  27694. * Must be at least 256 bytes long.
  27695. * outLen Number of bytes in result.
  27696. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  27697. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  27698. */
  27699. int sp_RsaPublic_2048(const byte* in, word32 inLen, const mp_int* em,
  27700. const mp_int* mm, byte* out, word32* outLen)
  27701. {
  27702. #ifdef WOLFSSL_SP_SMALL_STACK
  27703. sp_digit* a = NULL;
  27704. #else
  27705. sp_digit a[64 * 5];
  27706. #endif
  27707. sp_digit* m = NULL;
  27708. sp_digit* r = NULL;
  27709. sp_digit *ah = NULL;
  27710. sp_digit e[1] = {0};
  27711. int err = MP_OKAY;
  27712. if (*outLen < 256) {
  27713. err = MP_TO_E;
  27714. }
  27715. else if (mp_count_bits(em) > 32 || inLen > 256 ||
  27716. mp_count_bits(mm) != 2048) {
  27717. err = MP_READ_E;
  27718. }
  27719. else if (mp_iseven(mm)) {
  27720. err = MP_VAL;
  27721. }
  27722. #ifdef WOLFSSL_SP_SMALL_STACK
  27723. if (err == MP_OKAY) {
  27724. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 5, NULL,
  27725. DYNAMIC_TYPE_RSA);
  27726. if (a == NULL)
  27727. err = MEMORY_E;
  27728. }
  27729. #endif
  27730. if (err == MP_OKAY) {
  27731. ah = a + 64;
  27732. r = a + 64 * 2;
  27733. m = r + 64 * 2;
  27734. sp_2048_from_bin(ah, 64, in, inLen);
  27735. #if DIGIT_BIT >= 32
  27736. e[0] = em->dp[0];
  27737. #else
  27738. e[0] = em->dp[0];
  27739. if (em->used > 1) {
  27740. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  27741. }
  27742. #endif
  27743. if (e[0] == 0) {
  27744. err = MP_EXPTMOD_E;
  27745. }
  27746. }
  27747. if (err == MP_OKAY) {
  27748. sp_2048_from_mp(m, 64, mm);
  27749. if (e[0] == 0x10001) {
  27750. int i;
  27751. sp_digit mp;
  27752. sp_2048_mont_setup(m, &mp);
  27753. /* Convert to Montgomery form. */
  27754. XMEMSET(a, 0, sizeof(sp_digit) * 64);
  27755. err = sp_2048_mod_64_cond(r, a, m);
  27756. /* Montgomery form: r = a.R mod m */
  27757. if (err == MP_OKAY) {
  27758. /* r = a ^ 0x10000 => r = a squared 16 times */
  27759. for (i = 15; i >= 0; i--) {
  27760. sp_2048_mont_sqr_64(r, r, m, mp);
  27761. }
  27762. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  27763. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  27764. */
  27765. sp_2048_mont_mul_64(r, r, ah, m, mp);
  27766. for (i = 63; i > 0; i--) {
  27767. if (r[i] != m[i]) {
  27768. break;
  27769. }
  27770. }
  27771. if (r[i] >= m[i]) {
  27772. sp_2048_sub_in_place_64(r, m);
  27773. }
  27774. }
  27775. }
  27776. else if (e[0] == 0x3) {
  27777. if (err == MP_OKAY) {
  27778. sp_2048_sqr_64(r, ah);
  27779. err = sp_2048_mod_64_cond(r, r, m);
  27780. }
  27781. if (err == MP_OKAY) {
  27782. sp_2048_mul_64(r, ah, r);
  27783. err = sp_2048_mod_64_cond(r, r, m);
  27784. }
  27785. }
  27786. else {
  27787. int i;
  27788. sp_digit mp;
  27789. sp_2048_mont_setup(m, &mp);
  27790. /* Convert to Montgomery form. */
  27791. XMEMSET(a, 0, sizeof(sp_digit) * 64);
  27792. err = sp_2048_mod_64_cond(a, a, m);
  27793. if (err == MP_OKAY) {
  27794. for (i = 31; i >= 0; i--) {
  27795. if (e[0] >> i) {
  27796. break;
  27797. }
  27798. }
  27799. XMEMCPY(r, a, sizeof(sp_digit) * 64);
  27800. for (i--; i >= 0; i--) {
  27801. sp_2048_mont_sqr_64(r, r, m, mp);
  27802. if (((e[0] >> i) & 1) == 1) {
  27803. sp_2048_mont_mul_64(r, r, a, m, mp);
  27804. }
  27805. }
  27806. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64);
  27807. sp_2048_mont_reduce_64(r, m, mp);
  27808. for (i = 63; i > 0; i--) {
  27809. if (r[i] != m[i]) {
  27810. break;
  27811. }
  27812. }
  27813. if (r[i] >= m[i]) {
  27814. sp_2048_sub_in_place_64(r, m);
  27815. }
  27816. }
  27817. }
  27818. }
  27819. if (err == MP_OKAY) {
  27820. sp_2048_to_bin_64(r, out);
  27821. *outLen = 256;
  27822. }
  27823. #ifdef WOLFSSL_SP_SMALL_STACK
  27824. if (a != NULL)
  27825. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  27826. #endif
  27827. return err;
  27828. }
  27829. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  27830. /* Conditionally add a and b using the mask m.
  27831. * m is -1 to add and 0 when not.
  27832. *
  27833. * r A single precision number representing conditional add result.
  27834. * a A single precision number to add with.
  27835. * b A single precision number to add.
  27836. * m Mask value to apply.
  27837. */
  27838. SP_NOINLINE static sp_digit sp_2048_cond_add_32(sp_digit* r, const sp_digit* a,
  27839. const sp_digit* b, sp_digit m)
  27840. {
  27841. __asm__ __volatile__ (
  27842. "movs r4, #0\n\t"
  27843. "movs r5, #0x80\n\t"
  27844. "mov r8, r5\n\t"
  27845. "movs r7, #0\n\t"
  27846. "\n"
  27847. "L_sp_2048_cond_add_32_words_%=:\n\t"
  27848. "ldr r6, [%[b], r7]\n\t"
  27849. #ifdef WOLFSSL_KEIL
  27850. "ands r6, r6, %[m]\n\t"
  27851. #elif defined(__clang__)
  27852. "ands r6, %[m]\n\t"
  27853. #else
  27854. "and r6, %[m]\n\t"
  27855. #endif
  27856. "movs r5, #0\n\t"
  27857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27858. "subs r5, r5, #1\n\t"
  27859. #else
  27860. "sub r5, r5, #1\n\t"
  27861. #endif
  27862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27863. "adds r5, r5, r4\n\t"
  27864. #else
  27865. "add r5, r5, r4\n\t"
  27866. #endif
  27867. "ldr r5, [%[a], r7]\n\t"
  27868. #ifdef WOLFSSL_KEIL
  27869. "adcs r5, r5, r6\n\t"
  27870. #elif defined(__clang__)
  27871. "adcs r5, r6\n\t"
  27872. #else
  27873. "adc r5, r6\n\t"
  27874. #endif
  27875. "movs r4, #0\n\t"
  27876. #ifdef WOLFSSL_KEIL
  27877. "adcs r4, r4, r4\n\t"
  27878. #elif defined(__clang__)
  27879. "adcs r4, r4\n\t"
  27880. #else
  27881. "adc r4, r4\n\t"
  27882. #endif
  27883. "str r5, [%[r], r7]\n\t"
  27884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27885. "adds r7, r7, #4\n\t"
  27886. #else
  27887. "add r7, r7, #4\n\t"
  27888. #endif
  27889. "cmp r7, r8\n\t"
  27890. "blt L_sp_2048_cond_add_32_words_%=\n\t"
  27891. "movs %[r], r4\n\t"
  27892. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  27893. :
  27894. : "memory", "r4", "r5", "r6", "r7", "r8"
  27895. );
  27896. return (uint32_t)(size_t)r;
  27897. }
  27898. /* RSA private key operation.
  27899. *
  27900. * in Array of bytes representing the number to exponentiate, base.
  27901. * inLen Number of bytes in base.
  27902. * dm Private exponent.
  27903. * pm First prime.
  27904. * qm Second prime.
  27905. * dpm First prime's CRT exponent.
  27906. * dqm Second prime's CRT exponent.
  27907. * qim Inverse of second prime mod p.
  27908. * mm Modulus.
  27909. * out Buffer to hold big-endian bytes of exponentiation result.
  27910. * Must be at least 256 bytes long.
  27911. * outLen Number of bytes in result.
  27912. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  27913. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  27914. */
  27915. int sp_RsaPrivate_2048(const byte* in, word32 inLen, const mp_int* dm,
  27916. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  27917. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  27918. {
  27919. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  27920. #ifdef WOLFSSL_SP_SMALL_STACK
  27921. sp_digit* d = NULL;
  27922. #else
  27923. sp_digit d[64 * 4];
  27924. #endif
  27925. sp_digit* a = NULL;
  27926. sp_digit* m = NULL;
  27927. sp_digit* r = NULL;
  27928. int err = MP_OKAY;
  27929. (void)pm;
  27930. (void)qm;
  27931. (void)dpm;
  27932. (void)dqm;
  27933. (void)qim;
  27934. if (*outLen < 256U) {
  27935. err = MP_TO_E;
  27936. }
  27937. if (err == MP_OKAY) {
  27938. if (mp_count_bits(dm) > 2048) {
  27939. err = MP_READ_E;
  27940. }
  27941. else if (inLen > 256) {
  27942. err = MP_READ_E;
  27943. }
  27944. else if (mp_count_bits(mm) != 2048) {
  27945. err = MP_READ_E;
  27946. }
  27947. else if (mp_iseven(mm)) {
  27948. err = MP_VAL;
  27949. }
  27950. }
  27951. #ifdef WOLFSSL_SP_SMALL_STACK
  27952. if (err == MP_OKAY) {
  27953. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL,
  27954. DYNAMIC_TYPE_RSA);
  27955. if (d == NULL)
  27956. err = MEMORY_E;
  27957. }
  27958. #endif
  27959. if (err == MP_OKAY) {
  27960. a = d + 64;
  27961. m = a + 128;
  27962. r = a;
  27963. sp_2048_from_bin(a, 64, in, inLen);
  27964. sp_2048_from_mp(d, 64, dm);
  27965. sp_2048_from_mp(m, 64, mm);
  27966. err = sp_2048_mod_exp_64(r, a, d, 2048, m, 0);
  27967. }
  27968. if (err == MP_OKAY) {
  27969. sp_2048_to_bin_64(r, out);
  27970. *outLen = 256;
  27971. }
  27972. #ifdef WOLFSSL_SP_SMALL_STACK
  27973. if (d != NULL)
  27974. #endif
  27975. {
  27976. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  27977. if (a != NULL)
  27978. ForceZero(a, sizeof(sp_digit) * 64);
  27979. #ifdef WOLFSSL_SP_SMALL_STACK
  27980. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  27981. #endif
  27982. }
  27983. return err;
  27984. #else
  27985. #ifdef WOLFSSL_SP_SMALL_STACK
  27986. sp_digit* a = NULL;
  27987. #else
  27988. sp_digit a[32 * 11];
  27989. #endif
  27990. sp_digit* p = NULL;
  27991. sp_digit* q = NULL;
  27992. sp_digit* dp = NULL;
  27993. sp_digit* tmpa = NULL;
  27994. sp_digit* tmpb = NULL;
  27995. sp_digit* r = NULL;
  27996. sp_digit* qi = NULL;
  27997. sp_digit* dq = NULL;
  27998. sp_digit c;
  27999. int err = MP_OKAY;
  28000. (void)dm;
  28001. (void)mm;
  28002. if (*outLen < 256) {
  28003. err = MP_TO_E;
  28004. }
  28005. else if (inLen > 256 || mp_count_bits(mm) != 2048) {
  28006. err = MP_READ_E;
  28007. }
  28008. else if (mp_iseven(mm)) {
  28009. err = MP_VAL;
  28010. }
  28011. else if (mp_iseven(pm)) {
  28012. err = MP_VAL;
  28013. }
  28014. else if (mp_iseven(qm)) {
  28015. err = MP_VAL;
  28016. }
  28017. #ifdef WOLFSSL_SP_SMALL_STACK
  28018. if (err == MP_OKAY) {
  28019. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 11, NULL,
  28020. DYNAMIC_TYPE_RSA);
  28021. if (a == NULL)
  28022. err = MEMORY_E;
  28023. }
  28024. #endif
  28025. if (err == MP_OKAY) {
  28026. p = a + 64 * 2;
  28027. q = p + 32;
  28028. qi = dq = dp = q + 32;
  28029. tmpa = qi + 32;
  28030. tmpb = tmpa + 64;
  28031. r = a;
  28032. sp_2048_from_bin(a, 64, in, inLen);
  28033. sp_2048_from_mp(p, 32, pm);
  28034. sp_2048_from_mp(q, 32, qm);
  28035. sp_2048_from_mp(dp, 32, dpm);
  28036. err = sp_2048_mod_exp_32(tmpa, a, dp, 1024, p, 1);
  28037. }
  28038. if (err == MP_OKAY) {
  28039. sp_2048_from_mp(dq, 32, dqm);
  28040. err = sp_2048_mod_exp_32(tmpb, a, dq, 1024, q, 1);
  28041. }
  28042. if (err == MP_OKAY) {
  28043. c = sp_2048_sub_in_place_32(tmpa, tmpb);
  28044. c += sp_2048_cond_add_32(tmpa, tmpa, p, c);
  28045. sp_2048_cond_add_32(tmpa, tmpa, p, c);
  28046. sp_2048_from_mp(qi, 32, qim);
  28047. sp_2048_mul_32(tmpa, tmpa, qi);
  28048. err = sp_2048_mod_32(tmpa, tmpa, p);
  28049. }
  28050. if (err == MP_OKAY) {
  28051. sp_2048_mul_32(tmpa, q, tmpa);
  28052. XMEMSET(&tmpb[32], 0, sizeof(sp_digit) * 32);
  28053. sp_2048_add_64(r, tmpb, tmpa);
  28054. sp_2048_to_bin_64(r, out);
  28055. *outLen = 256;
  28056. }
  28057. #ifdef WOLFSSL_SP_SMALL_STACK
  28058. if (a != NULL)
  28059. #endif
  28060. {
  28061. ForceZero(a, sizeof(sp_digit) * 32 * 11);
  28062. #ifdef WOLFSSL_SP_SMALL_STACK
  28063. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  28064. #endif
  28065. }
  28066. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  28067. return err;
  28068. }
  28069. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  28070. #endif /* WOLFSSL_HAVE_SP_RSA */
  28071. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  28072. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  28073. /* Convert an array of sp_digit to an mp_int.
  28074. *
  28075. * a A single precision integer.
  28076. * r A multi-precision integer.
  28077. */
  28078. static int sp_2048_to_mp(const sp_digit* a, mp_int* r)
  28079. {
  28080. int err;
  28081. err = mp_grow(r, (2048 + DIGIT_BIT - 1) / DIGIT_BIT);
  28082. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  28083. #if DIGIT_BIT == 32
  28084. XMEMCPY(r->dp, a, sizeof(sp_digit) * 64);
  28085. r->used = 64;
  28086. mp_clamp(r);
  28087. #elif DIGIT_BIT < 32
  28088. int i;
  28089. int j = 0;
  28090. int s = 0;
  28091. r->dp[0] = 0;
  28092. for (i = 0; i < 64; i++) {
  28093. r->dp[j] |= (mp_digit)(a[i] << s);
  28094. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  28095. s = DIGIT_BIT - s;
  28096. r->dp[++j] = (mp_digit)(a[i] >> s);
  28097. while (s + DIGIT_BIT <= 32) {
  28098. s += DIGIT_BIT;
  28099. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  28100. if (s == SP_WORD_SIZE) {
  28101. r->dp[j] = 0;
  28102. }
  28103. else {
  28104. r->dp[j] = (mp_digit)(a[i] >> s);
  28105. }
  28106. }
  28107. s = 32 - s;
  28108. }
  28109. r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
  28110. mp_clamp(r);
  28111. #else
  28112. int i;
  28113. int j = 0;
  28114. int s = 0;
  28115. r->dp[0] = 0;
  28116. for (i = 0; i < 64; i++) {
  28117. r->dp[j] |= ((mp_digit)a[i]) << s;
  28118. if (s + 32 >= DIGIT_BIT) {
  28119. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  28120. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  28121. #endif
  28122. s = DIGIT_BIT - s;
  28123. r->dp[++j] = a[i] >> s;
  28124. s = 32 - s;
  28125. }
  28126. else {
  28127. s += 32;
  28128. }
  28129. }
  28130. r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
  28131. mp_clamp(r);
  28132. #endif
  28133. }
  28134. return err;
  28135. }
  28136. /* Perform the modular exponentiation for Diffie-Hellman.
  28137. *
  28138. * base Base. MP integer.
  28139. * exp Exponent. MP integer.
  28140. * mod Modulus. MP integer.
  28141. * res Result. MP integer.
  28142. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  28143. * and MEMORY_E if memory allocation fails.
  28144. */
  28145. int sp_ModExp_2048(const mp_int* base, const mp_int* exp, const mp_int* mod,
  28146. mp_int* res)
  28147. {
  28148. int err = MP_OKAY;
  28149. sp_digit b[128];
  28150. sp_digit e[64];
  28151. sp_digit m[64];
  28152. sp_digit* r = b;
  28153. int expBits = mp_count_bits(exp);
  28154. if (mp_count_bits(base) > 2048) {
  28155. err = MP_READ_E;
  28156. }
  28157. else if (expBits > 2048) {
  28158. err = MP_READ_E;
  28159. }
  28160. else if (mp_count_bits(mod) != 2048) {
  28161. err = MP_READ_E;
  28162. }
  28163. else if (mp_iseven(mod)) {
  28164. err = MP_VAL;
  28165. }
  28166. if (err == MP_OKAY) {
  28167. sp_2048_from_mp(b, 64, base);
  28168. sp_2048_from_mp(e, 64, exp);
  28169. sp_2048_from_mp(m, 64, mod);
  28170. err = sp_2048_mod_exp_64(r, b, e, expBits, m, 0);
  28171. }
  28172. if (err == MP_OKAY) {
  28173. err = sp_2048_to_mp(r, res);
  28174. }
  28175. XMEMSET(e, 0, sizeof(e));
  28176. return err;
  28177. }
  28178. #ifdef WOLFSSL_HAVE_SP_DH
  28179. #ifdef HAVE_FFDHE_2048
  28180. /* Lefy shift a by n bits into r. (r = a << n)
  28181. *
  28182. * r A single precision integer.
  28183. * a A single precision integer.
  28184. * n Integer representing number of bits to shift.
  28185. */
  28186. static void sp_2048_lshift_64(sp_digit* r, const sp_digit* a, byte n)
  28187. {
  28188. __asm__ __volatile__ (
  28189. "movs r7, #31\n\t"
  28190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28191. "subs r7, r7, %[n]\n\t"
  28192. #else
  28193. "sub r7, r7, %[n]\n\t"
  28194. #endif
  28195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28196. "adds %[a], %[a], #0xc0\n\t"
  28197. #else
  28198. "add %[a], %[a], #0xc0\n\t"
  28199. #endif
  28200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28201. "adds %[r], %[r], #0xc0\n\t"
  28202. #else
  28203. "add %[r], %[r], #0xc0\n\t"
  28204. #endif
  28205. "ldr r4, [%[a], #60]\n\t"
  28206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28207. "lsrs r5, r4, #1\n\t"
  28208. #else
  28209. "lsr r5, r4, #1\n\t"
  28210. #endif
  28211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28212. "lsls r4, r4, %[n]\n\t"
  28213. #else
  28214. "lsl r4, r4, %[n]\n\t"
  28215. #endif
  28216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28217. "lsrs r5, r5, r7\n\t"
  28218. #else
  28219. "lsr r5, r5, r7\n\t"
  28220. #endif
  28221. "ldr r3, [%[a], #56]\n\t"
  28222. "str r5, [%[r], #64]\n\t"
  28223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28224. "lsrs r6, r3, #1\n\t"
  28225. #else
  28226. "lsr r6, r3, #1\n\t"
  28227. #endif
  28228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28229. "lsls r3, r3, %[n]\n\t"
  28230. #else
  28231. "lsl r3, r3, %[n]\n\t"
  28232. #endif
  28233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28234. "lsrs r6, r6, r7\n\t"
  28235. #else
  28236. "lsr r6, r6, r7\n\t"
  28237. #endif
  28238. #ifdef WOLFSSL_KEIL
  28239. "orrs r4, r4, r6\n\t"
  28240. #elif defined(__clang__)
  28241. "orrs r4, r6\n\t"
  28242. #else
  28243. "orr r4, r6\n\t"
  28244. #endif
  28245. "ldr r5, [%[a], #52]\n\t"
  28246. "str r4, [%[r], #60]\n\t"
  28247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28248. "lsrs r6, r5, #1\n\t"
  28249. #else
  28250. "lsr r6, r5, #1\n\t"
  28251. #endif
  28252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28253. "lsls r5, r5, %[n]\n\t"
  28254. #else
  28255. "lsl r5, r5, %[n]\n\t"
  28256. #endif
  28257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28258. "lsrs r6, r6, r7\n\t"
  28259. #else
  28260. "lsr r6, r6, r7\n\t"
  28261. #endif
  28262. #ifdef WOLFSSL_KEIL
  28263. "orrs r3, r3, r6\n\t"
  28264. #elif defined(__clang__)
  28265. "orrs r3, r6\n\t"
  28266. #else
  28267. "orr r3, r6\n\t"
  28268. #endif
  28269. "ldr r4, [%[a], #48]\n\t"
  28270. "str r3, [%[r], #56]\n\t"
  28271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28272. "lsrs r6, r4, #1\n\t"
  28273. #else
  28274. "lsr r6, r4, #1\n\t"
  28275. #endif
  28276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28277. "lsls r4, r4, %[n]\n\t"
  28278. #else
  28279. "lsl r4, r4, %[n]\n\t"
  28280. #endif
  28281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28282. "lsrs r6, r6, r7\n\t"
  28283. #else
  28284. "lsr r6, r6, r7\n\t"
  28285. #endif
  28286. #ifdef WOLFSSL_KEIL
  28287. "orrs r5, r5, r6\n\t"
  28288. #elif defined(__clang__)
  28289. "orrs r5, r6\n\t"
  28290. #else
  28291. "orr r5, r6\n\t"
  28292. #endif
  28293. "ldr r3, [%[a], #44]\n\t"
  28294. "str r5, [%[r], #52]\n\t"
  28295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28296. "lsrs r6, r3, #1\n\t"
  28297. #else
  28298. "lsr r6, r3, #1\n\t"
  28299. #endif
  28300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28301. "lsls r3, r3, %[n]\n\t"
  28302. #else
  28303. "lsl r3, r3, %[n]\n\t"
  28304. #endif
  28305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28306. "lsrs r6, r6, r7\n\t"
  28307. #else
  28308. "lsr r6, r6, r7\n\t"
  28309. #endif
  28310. #ifdef WOLFSSL_KEIL
  28311. "orrs r4, r4, r6\n\t"
  28312. #elif defined(__clang__)
  28313. "orrs r4, r6\n\t"
  28314. #else
  28315. "orr r4, r6\n\t"
  28316. #endif
  28317. "ldr r5, [%[a], #40]\n\t"
  28318. "str r4, [%[r], #48]\n\t"
  28319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28320. "lsrs r6, r5, #1\n\t"
  28321. #else
  28322. "lsr r6, r5, #1\n\t"
  28323. #endif
  28324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28325. "lsls r5, r5, %[n]\n\t"
  28326. #else
  28327. "lsl r5, r5, %[n]\n\t"
  28328. #endif
  28329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28330. "lsrs r6, r6, r7\n\t"
  28331. #else
  28332. "lsr r6, r6, r7\n\t"
  28333. #endif
  28334. #ifdef WOLFSSL_KEIL
  28335. "orrs r3, r3, r6\n\t"
  28336. #elif defined(__clang__)
  28337. "orrs r3, r6\n\t"
  28338. #else
  28339. "orr r3, r6\n\t"
  28340. #endif
  28341. "ldr r4, [%[a], #36]\n\t"
  28342. "str r3, [%[r], #44]\n\t"
  28343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28344. "lsrs r6, r4, #1\n\t"
  28345. #else
  28346. "lsr r6, r4, #1\n\t"
  28347. #endif
  28348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28349. "lsls r4, r4, %[n]\n\t"
  28350. #else
  28351. "lsl r4, r4, %[n]\n\t"
  28352. #endif
  28353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28354. "lsrs r6, r6, r7\n\t"
  28355. #else
  28356. "lsr r6, r6, r7\n\t"
  28357. #endif
  28358. #ifdef WOLFSSL_KEIL
  28359. "orrs r5, r5, r6\n\t"
  28360. #elif defined(__clang__)
  28361. "orrs r5, r6\n\t"
  28362. #else
  28363. "orr r5, r6\n\t"
  28364. #endif
  28365. "ldr r3, [%[a], #32]\n\t"
  28366. "str r5, [%[r], #40]\n\t"
  28367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28368. "lsrs r6, r3, #1\n\t"
  28369. #else
  28370. "lsr r6, r3, #1\n\t"
  28371. #endif
  28372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28373. "lsls r3, r3, %[n]\n\t"
  28374. #else
  28375. "lsl r3, r3, %[n]\n\t"
  28376. #endif
  28377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28378. "lsrs r6, r6, r7\n\t"
  28379. #else
  28380. "lsr r6, r6, r7\n\t"
  28381. #endif
  28382. #ifdef WOLFSSL_KEIL
  28383. "orrs r4, r4, r6\n\t"
  28384. #elif defined(__clang__)
  28385. "orrs r4, r6\n\t"
  28386. #else
  28387. "orr r4, r6\n\t"
  28388. #endif
  28389. "ldr r5, [%[a], #28]\n\t"
  28390. "str r4, [%[r], #36]\n\t"
  28391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28392. "lsrs r6, r5, #1\n\t"
  28393. #else
  28394. "lsr r6, r5, #1\n\t"
  28395. #endif
  28396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28397. "lsls r5, r5, %[n]\n\t"
  28398. #else
  28399. "lsl r5, r5, %[n]\n\t"
  28400. #endif
  28401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28402. "lsrs r6, r6, r7\n\t"
  28403. #else
  28404. "lsr r6, r6, r7\n\t"
  28405. #endif
  28406. #ifdef WOLFSSL_KEIL
  28407. "orrs r3, r3, r6\n\t"
  28408. #elif defined(__clang__)
  28409. "orrs r3, r6\n\t"
  28410. #else
  28411. "orr r3, r6\n\t"
  28412. #endif
  28413. "ldr r4, [%[a], #24]\n\t"
  28414. "str r3, [%[r], #32]\n\t"
  28415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28416. "lsrs r6, r4, #1\n\t"
  28417. #else
  28418. "lsr r6, r4, #1\n\t"
  28419. #endif
  28420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28421. "lsls r4, r4, %[n]\n\t"
  28422. #else
  28423. "lsl r4, r4, %[n]\n\t"
  28424. #endif
  28425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28426. "lsrs r6, r6, r7\n\t"
  28427. #else
  28428. "lsr r6, r6, r7\n\t"
  28429. #endif
  28430. #ifdef WOLFSSL_KEIL
  28431. "orrs r5, r5, r6\n\t"
  28432. #elif defined(__clang__)
  28433. "orrs r5, r6\n\t"
  28434. #else
  28435. "orr r5, r6\n\t"
  28436. #endif
  28437. "ldr r3, [%[a], #20]\n\t"
  28438. "str r5, [%[r], #28]\n\t"
  28439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28440. "lsrs r6, r3, #1\n\t"
  28441. #else
  28442. "lsr r6, r3, #1\n\t"
  28443. #endif
  28444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28445. "lsls r3, r3, %[n]\n\t"
  28446. #else
  28447. "lsl r3, r3, %[n]\n\t"
  28448. #endif
  28449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28450. "lsrs r6, r6, r7\n\t"
  28451. #else
  28452. "lsr r6, r6, r7\n\t"
  28453. #endif
  28454. #ifdef WOLFSSL_KEIL
  28455. "orrs r4, r4, r6\n\t"
  28456. #elif defined(__clang__)
  28457. "orrs r4, r6\n\t"
  28458. #else
  28459. "orr r4, r6\n\t"
  28460. #endif
  28461. "ldr r5, [%[a], #16]\n\t"
  28462. "str r4, [%[r], #24]\n\t"
  28463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28464. "lsrs r6, r5, #1\n\t"
  28465. #else
  28466. "lsr r6, r5, #1\n\t"
  28467. #endif
  28468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28469. "lsls r5, r5, %[n]\n\t"
  28470. #else
  28471. "lsl r5, r5, %[n]\n\t"
  28472. #endif
  28473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28474. "lsrs r6, r6, r7\n\t"
  28475. #else
  28476. "lsr r6, r6, r7\n\t"
  28477. #endif
  28478. #ifdef WOLFSSL_KEIL
  28479. "orrs r3, r3, r6\n\t"
  28480. #elif defined(__clang__)
  28481. "orrs r3, r6\n\t"
  28482. #else
  28483. "orr r3, r6\n\t"
  28484. #endif
  28485. "ldr r4, [%[a], #12]\n\t"
  28486. "str r3, [%[r], #20]\n\t"
  28487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28488. "lsrs r6, r4, #1\n\t"
  28489. #else
  28490. "lsr r6, r4, #1\n\t"
  28491. #endif
  28492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28493. "lsls r4, r4, %[n]\n\t"
  28494. #else
  28495. "lsl r4, r4, %[n]\n\t"
  28496. #endif
  28497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28498. "lsrs r6, r6, r7\n\t"
  28499. #else
  28500. "lsr r6, r6, r7\n\t"
  28501. #endif
  28502. #ifdef WOLFSSL_KEIL
  28503. "orrs r5, r5, r6\n\t"
  28504. #elif defined(__clang__)
  28505. "orrs r5, r6\n\t"
  28506. #else
  28507. "orr r5, r6\n\t"
  28508. #endif
  28509. "ldr r3, [%[a], #8]\n\t"
  28510. "str r5, [%[r], #16]\n\t"
  28511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28512. "lsrs r6, r3, #1\n\t"
  28513. #else
  28514. "lsr r6, r3, #1\n\t"
  28515. #endif
  28516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28517. "lsls r3, r3, %[n]\n\t"
  28518. #else
  28519. "lsl r3, r3, %[n]\n\t"
  28520. #endif
  28521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28522. "lsrs r6, r6, r7\n\t"
  28523. #else
  28524. "lsr r6, r6, r7\n\t"
  28525. #endif
  28526. #ifdef WOLFSSL_KEIL
  28527. "orrs r4, r4, r6\n\t"
  28528. #elif defined(__clang__)
  28529. "orrs r4, r6\n\t"
  28530. #else
  28531. "orr r4, r6\n\t"
  28532. #endif
  28533. "ldr r5, [%[a], #4]\n\t"
  28534. "str r4, [%[r], #12]\n\t"
  28535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28536. "lsrs r6, r5, #1\n\t"
  28537. #else
  28538. "lsr r6, r5, #1\n\t"
  28539. #endif
  28540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28541. "lsls r5, r5, %[n]\n\t"
  28542. #else
  28543. "lsl r5, r5, %[n]\n\t"
  28544. #endif
  28545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28546. "lsrs r6, r6, r7\n\t"
  28547. #else
  28548. "lsr r6, r6, r7\n\t"
  28549. #endif
  28550. #ifdef WOLFSSL_KEIL
  28551. "orrs r3, r3, r6\n\t"
  28552. #elif defined(__clang__)
  28553. "orrs r3, r6\n\t"
  28554. #else
  28555. "orr r3, r6\n\t"
  28556. #endif
  28557. "ldr r4, [%[a]]\n\t"
  28558. "str r3, [%[r], #8]\n\t"
  28559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28560. "lsrs r6, r4, #1\n\t"
  28561. #else
  28562. "lsr r6, r4, #1\n\t"
  28563. #endif
  28564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28565. "lsls r4, r4, %[n]\n\t"
  28566. #else
  28567. "lsl r4, r4, %[n]\n\t"
  28568. #endif
  28569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28570. "lsrs r6, r6, r7\n\t"
  28571. #else
  28572. "lsr r6, r6, r7\n\t"
  28573. #endif
  28574. #ifdef WOLFSSL_KEIL
  28575. "orrs r5, r5, r6\n\t"
  28576. #elif defined(__clang__)
  28577. "orrs r5, r6\n\t"
  28578. #else
  28579. "orr r5, r6\n\t"
  28580. #endif
  28581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28582. "subs %[a], %[a], #0x40\n\t"
  28583. #else
  28584. "sub %[a], %[a], #0x40\n\t"
  28585. #endif
  28586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28587. "subs %[r], %[r], #0x40\n\t"
  28588. #else
  28589. "sub %[r], %[r], #0x40\n\t"
  28590. #endif
  28591. "ldr r3, [%[a], #60]\n\t"
  28592. "str r5, [%[r], #68]\n\t"
  28593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28594. "lsrs r6, r3, #1\n\t"
  28595. #else
  28596. "lsr r6, r3, #1\n\t"
  28597. #endif
  28598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28599. "lsls r3, r3, %[n]\n\t"
  28600. #else
  28601. "lsl r3, r3, %[n]\n\t"
  28602. #endif
  28603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28604. "lsrs r6, r6, r7\n\t"
  28605. #else
  28606. "lsr r6, r6, r7\n\t"
  28607. #endif
  28608. #ifdef WOLFSSL_KEIL
  28609. "orrs r4, r4, r6\n\t"
  28610. #elif defined(__clang__)
  28611. "orrs r4, r6\n\t"
  28612. #else
  28613. "orr r4, r6\n\t"
  28614. #endif
  28615. "ldr r5, [%[a], #56]\n\t"
  28616. "str r4, [%[r], #64]\n\t"
  28617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28618. "lsrs r6, r5, #1\n\t"
  28619. #else
  28620. "lsr r6, r5, #1\n\t"
  28621. #endif
  28622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28623. "lsls r5, r5, %[n]\n\t"
  28624. #else
  28625. "lsl r5, r5, %[n]\n\t"
  28626. #endif
  28627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28628. "lsrs r6, r6, r7\n\t"
  28629. #else
  28630. "lsr r6, r6, r7\n\t"
  28631. #endif
  28632. #ifdef WOLFSSL_KEIL
  28633. "orrs r3, r3, r6\n\t"
  28634. #elif defined(__clang__)
  28635. "orrs r3, r6\n\t"
  28636. #else
  28637. "orr r3, r6\n\t"
  28638. #endif
  28639. "ldr r4, [%[a], #52]\n\t"
  28640. "str r3, [%[r], #60]\n\t"
  28641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28642. "lsrs r6, r4, #1\n\t"
  28643. #else
  28644. "lsr r6, r4, #1\n\t"
  28645. #endif
  28646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28647. "lsls r4, r4, %[n]\n\t"
  28648. #else
  28649. "lsl r4, r4, %[n]\n\t"
  28650. #endif
  28651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28652. "lsrs r6, r6, r7\n\t"
  28653. #else
  28654. "lsr r6, r6, r7\n\t"
  28655. #endif
  28656. #ifdef WOLFSSL_KEIL
  28657. "orrs r5, r5, r6\n\t"
  28658. #elif defined(__clang__)
  28659. "orrs r5, r6\n\t"
  28660. #else
  28661. "orr r5, r6\n\t"
  28662. #endif
  28663. "ldr r3, [%[a], #48]\n\t"
  28664. "str r5, [%[r], #56]\n\t"
  28665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28666. "lsrs r6, r3, #1\n\t"
  28667. #else
  28668. "lsr r6, r3, #1\n\t"
  28669. #endif
  28670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28671. "lsls r3, r3, %[n]\n\t"
  28672. #else
  28673. "lsl r3, r3, %[n]\n\t"
  28674. #endif
  28675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28676. "lsrs r6, r6, r7\n\t"
  28677. #else
  28678. "lsr r6, r6, r7\n\t"
  28679. #endif
  28680. #ifdef WOLFSSL_KEIL
  28681. "orrs r4, r4, r6\n\t"
  28682. #elif defined(__clang__)
  28683. "orrs r4, r6\n\t"
  28684. #else
  28685. "orr r4, r6\n\t"
  28686. #endif
  28687. "ldr r5, [%[a], #44]\n\t"
  28688. "str r4, [%[r], #52]\n\t"
  28689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28690. "lsrs r6, r5, #1\n\t"
  28691. #else
  28692. "lsr r6, r5, #1\n\t"
  28693. #endif
  28694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28695. "lsls r5, r5, %[n]\n\t"
  28696. #else
  28697. "lsl r5, r5, %[n]\n\t"
  28698. #endif
  28699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28700. "lsrs r6, r6, r7\n\t"
  28701. #else
  28702. "lsr r6, r6, r7\n\t"
  28703. #endif
  28704. #ifdef WOLFSSL_KEIL
  28705. "orrs r3, r3, r6\n\t"
  28706. #elif defined(__clang__)
  28707. "orrs r3, r6\n\t"
  28708. #else
  28709. "orr r3, r6\n\t"
  28710. #endif
  28711. "ldr r4, [%[a], #40]\n\t"
  28712. "str r3, [%[r], #48]\n\t"
  28713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28714. "lsrs r6, r4, #1\n\t"
  28715. #else
  28716. "lsr r6, r4, #1\n\t"
  28717. #endif
  28718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28719. "lsls r4, r4, %[n]\n\t"
  28720. #else
  28721. "lsl r4, r4, %[n]\n\t"
  28722. #endif
  28723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28724. "lsrs r6, r6, r7\n\t"
  28725. #else
  28726. "lsr r6, r6, r7\n\t"
  28727. #endif
  28728. #ifdef WOLFSSL_KEIL
  28729. "orrs r5, r5, r6\n\t"
  28730. #elif defined(__clang__)
  28731. "orrs r5, r6\n\t"
  28732. #else
  28733. "orr r5, r6\n\t"
  28734. #endif
  28735. "ldr r3, [%[a], #36]\n\t"
  28736. "str r5, [%[r], #44]\n\t"
  28737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28738. "lsrs r6, r3, #1\n\t"
  28739. #else
  28740. "lsr r6, r3, #1\n\t"
  28741. #endif
  28742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28743. "lsls r3, r3, %[n]\n\t"
  28744. #else
  28745. "lsl r3, r3, %[n]\n\t"
  28746. #endif
  28747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28748. "lsrs r6, r6, r7\n\t"
  28749. #else
  28750. "lsr r6, r6, r7\n\t"
  28751. #endif
  28752. #ifdef WOLFSSL_KEIL
  28753. "orrs r4, r4, r6\n\t"
  28754. #elif defined(__clang__)
  28755. "orrs r4, r6\n\t"
  28756. #else
  28757. "orr r4, r6\n\t"
  28758. #endif
  28759. "ldr r5, [%[a], #32]\n\t"
  28760. "str r4, [%[r], #40]\n\t"
  28761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28762. "lsrs r6, r5, #1\n\t"
  28763. #else
  28764. "lsr r6, r5, #1\n\t"
  28765. #endif
  28766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28767. "lsls r5, r5, %[n]\n\t"
  28768. #else
  28769. "lsl r5, r5, %[n]\n\t"
  28770. #endif
  28771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28772. "lsrs r6, r6, r7\n\t"
  28773. #else
  28774. "lsr r6, r6, r7\n\t"
  28775. #endif
  28776. #ifdef WOLFSSL_KEIL
  28777. "orrs r3, r3, r6\n\t"
  28778. #elif defined(__clang__)
  28779. "orrs r3, r6\n\t"
  28780. #else
  28781. "orr r3, r6\n\t"
  28782. #endif
  28783. "ldr r4, [%[a], #28]\n\t"
  28784. "str r3, [%[r], #36]\n\t"
  28785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28786. "lsrs r6, r4, #1\n\t"
  28787. #else
  28788. "lsr r6, r4, #1\n\t"
  28789. #endif
  28790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28791. "lsls r4, r4, %[n]\n\t"
  28792. #else
  28793. "lsl r4, r4, %[n]\n\t"
  28794. #endif
  28795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28796. "lsrs r6, r6, r7\n\t"
  28797. #else
  28798. "lsr r6, r6, r7\n\t"
  28799. #endif
  28800. #ifdef WOLFSSL_KEIL
  28801. "orrs r5, r5, r6\n\t"
  28802. #elif defined(__clang__)
  28803. "orrs r5, r6\n\t"
  28804. #else
  28805. "orr r5, r6\n\t"
  28806. #endif
  28807. "ldr r3, [%[a], #24]\n\t"
  28808. "str r5, [%[r], #32]\n\t"
  28809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28810. "lsrs r6, r3, #1\n\t"
  28811. #else
  28812. "lsr r6, r3, #1\n\t"
  28813. #endif
  28814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28815. "lsls r3, r3, %[n]\n\t"
  28816. #else
  28817. "lsl r3, r3, %[n]\n\t"
  28818. #endif
  28819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28820. "lsrs r6, r6, r7\n\t"
  28821. #else
  28822. "lsr r6, r6, r7\n\t"
  28823. #endif
  28824. #ifdef WOLFSSL_KEIL
  28825. "orrs r4, r4, r6\n\t"
  28826. #elif defined(__clang__)
  28827. "orrs r4, r6\n\t"
  28828. #else
  28829. "orr r4, r6\n\t"
  28830. #endif
  28831. "ldr r5, [%[a], #20]\n\t"
  28832. "str r4, [%[r], #28]\n\t"
  28833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28834. "lsrs r6, r5, #1\n\t"
  28835. #else
  28836. "lsr r6, r5, #1\n\t"
  28837. #endif
  28838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28839. "lsls r5, r5, %[n]\n\t"
  28840. #else
  28841. "lsl r5, r5, %[n]\n\t"
  28842. #endif
  28843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28844. "lsrs r6, r6, r7\n\t"
  28845. #else
  28846. "lsr r6, r6, r7\n\t"
  28847. #endif
  28848. #ifdef WOLFSSL_KEIL
  28849. "orrs r3, r3, r6\n\t"
  28850. #elif defined(__clang__)
  28851. "orrs r3, r6\n\t"
  28852. #else
  28853. "orr r3, r6\n\t"
  28854. #endif
  28855. "ldr r4, [%[a], #16]\n\t"
  28856. "str r3, [%[r], #24]\n\t"
  28857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28858. "lsrs r6, r4, #1\n\t"
  28859. #else
  28860. "lsr r6, r4, #1\n\t"
  28861. #endif
  28862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28863. "lsls r4, r4, %[n]\n\t"
  28864. #else
  28865. "lsl r4, r4, %[n]\n\t"
  28866. #endif
  28867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28868. "lsrs r6, r6, r7\n\t"
  28869. #else
  28870. "lsr r6, r6, r7\n\t"
  28871. #endif
  28872. #ifdef WOLFSSL_KEIL
  28873. "orrs r5, r5, r6\n\t"
  28874. #elif defined(__clang__)
  28875. "orrs r5, r6\n\t"
  28876. #else
  28877. "orr r5, r6\n\t"
  28878. #endif
  28879. "ldr r3, [%[a], #12]\n\t"
  28880. "str r5, [%[r], #20]\n\t"
  28881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28882. "lsrs r6, r3, #1\n\t"
  28883. #else
  28884. "lsr r6, r3, #1\n\t"
  28885. #endif
  28886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28887. "lsls r3, r3, %[n]\n\t"
  28888. #else
  28889. "lsl r3, r3, %[n]\n\t"
  28890. #endif
  28891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28892. "lsrs r6, r6, r7\n\t"
  28893. #else
  28894. "lsr r6, r6, r7\n\t"
  28895. #endif
  28896. #ifdef WOLFSSL_KEIL
  28897. "orrs r4, r4, r6\n\t"
  28898. #elif defined(__clang__)
  28899. "orrs r4, r6\n\t"
  28900. #else
  28901. "orr r4, r6\n\t"
  28902. #endif
  28903. "ldr r5, [%[a], #8]\n\t"
  28904. "str r4, [%[r], #16]\n\t"
  28905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28906. "lsrs r6, r5, #1\n\t"
  28907. #else
  28908. "lsr r6, r5, #1\n\t"
  28909. #endif
  28910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28911. "lsls r5, r5, %[n]\n\t"
  28912. #else
  28913. "lsl r5, r5, %[n]\n\t"
  28914. #endif
  28915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28916. "lsrs r6, r6, r7\n\t"
  28917. #else
  28918. "lsr r6, r6, r7\n\t"
  28919. #endif
  28920. #ifdef WOLFSSL_KEIL
  28921. "orrs r3, r3, r6\n\t"
  28922. #elif defined(__clang__)
  28923. "orrs r3, r6\n\t"
  28924. #else
  28925. "orr r3, r6\n\t"
  28926. #endif
  28927. "ldr r4, [%[a], #4]\n\t"
  28928. "str r3, [%[r], #12]\n\t"
  28929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28930. "lsrs r6, r4, #1\n\t"
  28931. #else
  28932. "lsr r6, r4, #1\n\t"
  28933. #endif
  28934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28935. "lsls r4, r4, %[n]\n\t"
  28936. #else
  28937. "lsl r4, r4, %[n]\n\t"
  28938. #endif
  28939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28940. "lsrs r6, r6, r7\n\t"
  28941. #else
  28942. "lsr r6, r6, r7\n\t"
  28943. #endif
  28944. #ifdef WOLFSSL_KEIL
  28945. "orrs r5, r5, r6\n\t"
  28946. #elif defined(__clang__)
  28947. "orrs r5, r6\n\t"
  28948. #else
  28949. "orr r5, r6\n\t"
  28950. #endif
  28951. "ldr r3, [%[a]]\n\t"
  28952. "str r5, [%[r], #8]\n\t"
  28953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28954. "lsrs r6, r3, #1\n\t"
  28955. #else
  28956. "lsr r6, r3, #1\n\t"
  28957. #endif
  28958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28959. "lsls r3, r3, %[n]\n\t"
  28960. #else
  28961. "lsl r3, r3, %[n]\n\t"
  28962. #endif
  28963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28964. "lsrs r6, r6, r7\n\t"
  28965. #else
  28966. "lsr r6, r6, r7\n\t"
  28967. #endif
  28968. #ifdef WOLFSSL_KEIL
  28969. "orrs r4, r4, r6\n\t"
  28970. #elif defined(__clang__)
  28971. "orrs r4, r6\n\t"
  28972. #else
  28973. "orr r4, r6\n\t"
  28974. #endif
  28975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28976. "subs %[a], %[a], #0x40\n\t"
  28977. #else
  28978. "sub %[a], %[a], #0x40\n\t"
  28979. #endif
  28980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28981. "subs %[r], %[r], #0x40\n\t"
  28982. #else
  28983. "sub %[r], %[r], #0x40\n\t"
  28984. #endif
  28985. "ldr r5, [%[a], #60]\n\t"
  28986. "str r4, [%[r], #68]\n\t"
  28987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28988. "lsrs r6, r5, #1\n\t"
  28989. #else
  28990. "lsr r6, r5, #1\n\t"
  28991. #endif
  28992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28993. "lsls r5, r5, %[n]\n\t"
  28994. #else
  28995. "lsl r5, r5, %[n]\n\t"
  28996. #endif
  28997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28998. "lsrs r6, r6, r7\n\t"
  28999. #else
  29000. "lsr r6, r6, r7\n\t"
  29001. #endif
  29002. #ifdef WOLFSSL_KEIL
  29003. "orrs r3, r3, r6\n\t"
  29004. #elif defined(__clang__)
  29005. "orrs r3, r6\n\t"
  29006. #else
  29007. "orr r3, r6\n\t"
  29008. #endif
  29009. "ldr r4, [%[a], #56]\n\t"
  29010. "str r3, [%[r], #64]\n\t"
  29011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29012. "lsrs r6, r4, #1\n\t"
  29013. #else
  29014. "lsr r6, r4, #1\n\t"
  29015. #endif
  29016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29017. "lsls r4, r4, %[n]\n\t"
  29018. #else
  29019. "lsl r4, r4, %[n]\n\t"
  29020. #endif
  29021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29022. "lsrs r6, r6, r7\n\t"
  29023. #else
  29024. "lsr r6, r6, r7\n\t"
  29025. #endif
  29026. #ifdef WOLFSSL_KEIL
  29027. "orrs r5, r5, r6\n\t"
  29028. #elif defined(__clang__)
  29029. "orrs r5, r6\n\t"
  29030. #else
  29031. "orr r5, r6\n\t"
  29032. #endif
  29033. "ldr r3, [%[a], #52]\n\t"
  29034. "str r5, [%[r], #60]\n\t"
  29035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29036. "lsrs r6, r3, #1\n\t"
  29037. #else
  29038. "lsr r6, r3, #1\n\t"
  29039. #endif
  29040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29041. "lsls r3, r3, %[n]\n\t"
  29042. #else
  29043. "lsl r3, r3, %[n]\n\t"
  29044. #endif
  29045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29046. "lsrs r6, r6, r7\n\t"
  29047. #else
  29048. "lsr r6, r6, r7\n\t"
  29049. #endif
  29050. #ifdef WOLFSSL_KEIL
  29051. "orrs r4, r4, r6\n\t"
  29052. #elif defined(__clang__)
  29053. "orrs r4, r6\n\t"
  29054. #else
  29055. "orr r4, r6\n\t"
  29056. #endif
  29057. "ldr r5, [%[a], #48]\n\t"
  29058. "str r4, [%[r], #56]\n\t"
  29059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29060. "lsrs r6, r5, #1\n\t"
  29061. #else
  29062. "lsr r6, r5, #1\n\t"
  29063. #endif
  29064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29065. "lsls r5, r5, %[n]\n\t"
  29066. #else
  29067. "lsl r5, r5, %[n]\n\t"
  29068. #endif
  29069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29070. "lsrs r6, r6, r7\n\t"
  29071. #else
  29072. "lsr r6, r6, r7\n\t"
  29073. #endif
  29074. #ifdef WOLFSSL_KEIL
  29075. "orrs r3, r3, r6\n\t"
  29076. #elif defined(__clang__)
  29077. "orrs r3, r6\n\t"
  29078. #else
  29079. "orr r3, r6\n\t"
  29080. #endif
  29081. "ldr r4, [%[a], #44]\n\t"
  29082. "str r3, [%[r], #52]\n\t"
  29083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29084. "lsrs r6, r4, #1\n\t"
  29085. #else
  29086. "lsr r6, r4, #1\n\t"
  29087. #endif
  29088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29089. "lsls r4, r4, %[n]\n\t"
  29090. #else
  29091. "lsl r4, r4, %[n]\n\t"
  29092. #endif
  29093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29094. "lsrs r6, r6, r7\n\t"
  29095. #else
  29096. "lsr r6, r6, r7\n\t"
  29097. #endif
  29098. #ifdef WOLFSSL_KEIL
  29099. "orrs r5, r5, r6\n\t"
  29100. #elif defined(__clang__)
  29101. "orrs r5, r6\n\t"
  29102. #else
  29103. "orr r5, r6\n\t"
  29104. #endif
  29105. "ldr r3, [%[a], #40]\n\t"
  29106. "str r5, [%[r], #48]\n\t"
  29107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29108. "lsrs r6, r3, #1\n\t"
  29109. #else
  29110. "lsr r6, r3, #1\n\t"
  29111. #endif
  29112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29113. "lsls r3, r3, %[n]\n\t"
  29114. #else
  29115. "lsl r3, r3, %[n]\n\t"
  29116. #endif
  29117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29118. "lsrs r6, r6, r7\n\t"
  29119. #else
  29120. "lsr r6, r6, r7\n\t"
  29121. #endif
  29122. #ifdef WOLFSSL_KEIL
  29123. "orrs r4, r4, r6\n\t"
  29124. #elif defined(__clang__)
  29125. "orrs r4, r6\n\t"
  29126. #else
  29127. "orr r4, r6\n\t"
  29128. #endif
  29129. "ldr r5, [%[a], #36]\n\t"
  29130. "str r4, [%[r], #44]\n\t"
  29131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29132. "lsrs r6, r5, #1\n\t"
  29133. #else
  29134. "lsr r6, r5, #1\n\t"
  29135. #endif
  29136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29137. "lsls r5, r5, %[n]\n\t"
  29138. #else
  29139. "lsl r5, r5, %[n]\n\t"
  29140. #endif
  29141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29142. "lsrs r6, r6, r7\n\t"
  29143. #else
  29144. "lsr r6, r6, r7\n\t"
  29145. #endif
  29146. #ifdef WOLFSSL_KEIL
  29147. "orrs r3, r3, r6\n\t"
  29148. #elif defined(__clang__)
  29149. "orrs r3, r6\n\t"
  29150. #else
  29151. "orr r3, r6\n\t"
  29152. #endif
  29153. "ldr r4, [%[a], #32]\n\t"
  29154. "str r3, [%[r], #40]\n\t"
  29155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29156. "lsrs r6, r4, #1\n\t"
  29157. #else
  29158. "lsr r6, r4, #1\n\t"
  29159. #endif
  29160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29161. "lsls r4, r4, %[n]\n\t"
  29162. #else
  29163. "lsl r4, r4, %[n]\n\t"
  29164. #endif
  29165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29166. "lsrs r6, r6, r7\n\t"
  29167. #else
  29168. "lsr r6, r6, r7\n\t"
  29169. #endif
  29170. #ifdef WOLFSSL_KEIL
  29171. "orrs r5, r5, r6\n\t"
  29172. #elif defined(__clang__)
  29173. "orrs r5, r6\n\t"
  29174. #else
  29175. "orr r5, r6\n\t"
  29176. #endif
  29177. "ldr r3, [%[a], #28]\n\t"
  29178. "str r5, [%[r], #36]\n\t"
  29179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29180. "lsrs r6, r3, #1\n\t"
  29181. #else
  29182. "lsr r6, r3, #1\n\t"
  29183. #endif
  29184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29185. "lsls r3, r3, %[n]\n\t"
  29186. #else
  29187. "lsl r3, r3, %[n]\n\t"
  29188. #endif
  29189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29190. "lsrs r6, r6, r7\n\t"
  29191. #else
  29192. "lsr r6, r6, r7\n\t"
  29193. #endif
  29194. #ifdef WOLFSSL_KEIL
  29195. "orrs r4, r4, r6\n\t"
  29196. #elif defined(__clang__)
  29197. "orrs r4, r6\n\t"
  29198. #else
  29199. "orr r4, r6\n\t"
  29200. #endif
  29201. "ldr r5, [%[a], #24]\n\t"
  29202. "str r4, [%[r], #32]\n\t"
  29203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29204. "lsrs r6, r5, #1\n\t"
  29205. #else
  29206. "lsr r6, r5, #1\n\t"
  29207. #endif
  29208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29209. "lsls r5, r5, %[n]\n\t"
  29210. #else
  29211. "lsl r5, r5, %[n]\n\t"
  29212. #endif
  29213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29214. "lsrs r6, r6, r7\n\t"
  29215. #else
  29216. "lsr r6, r6, r7\n\t"
  29217. #endif
  29218. #ifdef WOLFSSL_KEIL
  29219. "orrs r3, r3, r6\n\t"
  29220. #elif defined(__clang__)
  29221. "orrs r3, r6\n\t"
  29222. #else
  29223. "orr r3, r6\n\t"
  29224. #endif
  29225. "ldr r4, [%[a], #20]\n\t"
  29226. "str r3, [%[r], #28]\n\t"
  29227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29228. "lsrs r6, r4, #1\n\t"
  29229. #else
  29230. "lsr r6, r4, #1\n\t"
  29231. #endif
  29232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29233. "lsls r4, r4, %[n]\n\t"
  29234. #else
  29235. "lsl r4, r4, %[n]\n\t"
  29236. #endif
  29237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29238. "lsrs r6, r6, r7\n\t"
  29239. #else
  29240. "lsr r6, r6, r7\n\t"
  29241. #endif
  29242. #ifdef WOLFSSL_KEIL
  29243. "orrs r5, r5, r6\n\t"
  29244. #elif defined(__clang__)
  29245. "orrs r5, r6\n\t"
  29246. #else
  29247. "orr r5, r6\n\t"
  29248. #endif
  29249. "ldr r3, [%[a], #16]\n\t"
  29250. "str r5, [%[r], #24]\n\t"
  29251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29252. "lsrs r6, r3, #1\n\t"
  29253. #else
  29254. "lsr r6, r3, #1\n\t"
  29255. #endif
  29256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29257. "lsls r3, r3, %[n]\n\t"
  29258. #else
  29259. "lsl r3, r3, %[n]\n\t"
  29260. #endif
  29261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29262. "lsrs r6, r6, r7\n\t"
  29263. #else
  29264. "lsr r6, r6, r7\n\t"
  29265. #endif
  29266. #ifdef WOLFSSL_KEIL
  29267. "orrs r4, r4, r6\n\t"
  29268. #elif defined(__clang__)
  29269. "orrs r4, r6\n\t"
  29270. #else
  29271. "orr r4, r6\n\t"
  29272. #endif
  29273. "ldr r5, [%[a], #12]\n\t"
  29274. "str r4, [%[r], #20]\n\t"
  29275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29276. "lsrs r6, r5, #1\n\t"
  29277. #else
  29278. "lsr r6, r5, #1\n\t"
  29279. #endif
  29280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29281. "lsls r5, r5, %[n]\n\t"
  29282. #else
  29283. "lsl r5, r5, %[n]\n\t"
  29284. #endif
  29285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29286. "lsrs r6, r6, r7\n\t"
  29287. #else
  29288. "lsr r6, r6, r7\n\t"
  29289. #endif
  29290. #ifdef WOLFSSL_KEIL
  29291. "orrs r3, r3, r6\n\t"
  29292. #elif defined(__clang__)
  29293. "orrs r3, r6\n\t"
  29294. #else
  29295. "orr r3, r6\n\t"
  29296. #endif
  29297. "ldr r4, [%[a], #8]\n\t"
  29298. "str r3, [%[r], #16]\n\t"
  29299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29300. "lsrs r6, r4, #1\n\t"
  29301. #else
  29302. "lsr r6, r4, #1\n\t"
  29303. #endif
  29304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29305. "lsls r4, r4, %[n]\n\t"
  29306. #else
  29307. "lsl r4, r4, %[n]\n\t"
  29308. #endif
  29309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29310. "lsrs r6, r6, r7\n\t"
  29311. #else
  29312. "lsr r6, r6, r7\n\t"
  29313. #endif
  29314. #ifdef WOLFSSL_KEIL
  29315. "orrs r5, r5, r6\n\t"
  29316. #elif defined(__clang__)
  29317. "orrs r5, r6\n\t"
  29318. #else
  29319. "orr r5, r6\n\t"
  29320. #endif
  29321. "ldr r3, [%[a], #4]\n\t"
  29322. "str r5, [%[r], #12]\n\t"
  29323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29324. "lsrs r6, r3, #1\n\t"
  29325. #else
  29326. "lsr r6, r3, #1\n\t"
  29327. #endif
  29328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29329. "lsls r3, r3, %[n]\n\t"
  29330. #else
  29331. "lsl r3, r3, %[n]\n\t"
  29332. #endif
  29333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29334. "lsrs r6, r6, r7\n\t"
  29335. #else
  29336. "lsr r6, r6, r7\n\t"
  29337. #endif
  29338. #ifdef WOLFSSL_KEIL
  29339. "orrs r4, r4, r6\n\t"
  29340. #elif defined(__clang__)
  29341. "orrs r4, r6\n\t"
  29342. #else
  29343. "orr r4, r6\n\t"
  29344. #endif
  29345. "ldr r5, [%[a]]\n\t"
  29346. "str r4, [%[r], #8]\n\t"
  29347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29348. "lsrs r6, r5, #1\n\t"
  29349. #else
  29350. "lsr r6, r5, #1\n\t"
  29351. #endif
  29352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29353. "lsls r5, r5, %[n]\n\t"
  29354. #else
  29355. "lsl r5, r5, %[n]\n\t"
  29356. #endif
  29357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29358. "lsrs r6, r6, r7\n\t"
  29359. #else
  29360. "lsr r6, r6, r7\n\t"
  29361. #endif
  29362. #ifdef WOLFSSL_KEIL
  29363. "orrs r3, r3, r6\n\t"
  29364. #elif defined(__clang__)
  29365. "orrs r3, r6\n\t"
  29366. #else
  29367. "orr r3, r6\n\t"
  29368. #endif
  29369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29370. "subs %[a], %[a], #0x40\n\t"
  29371. #else
  29372. "sub %[a], %[a], #0x40\n\t"
  29373. #endif
  29374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29375. "subs %[r], %[r], #0x40\n\t"
  29376. #else
  29377. "sub %[r], %[r], #0x40\n\t"
  29378. #endif
  29379. "ldr r4, [%[a], #60]\n\t"
  29380. "str r3, [%[r], #68]\n\t"
  29381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29382. "lsrs r6, r4, #1\n\t"
  29383. #else
  29384. "lsr r6, r4, #1\n\t"
  29385. #endif
  29386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29387. "lsls r4, r4, %[n]\n\t"
  29388. #else
  29389. "lsl r4, r4, %[n]\n\t"
  29390. #endif
  29391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29392. "lsrs r6, r6, r7\n\t"
  29393. #else
  29394. "lsr r6, r6, r7\n\t"
  29395. #endif
  29396. #ifdef WOLFSSL_KEIL
  29397. "orrs r5, r5, r6\n\t"
  29398. #elif defined(__clang__)
  29399. "orrs r5, r6\n\t"
  29400. #else
  29401. "orr r5, r6\n\t"
  29402. #endif
  29403. "ldr r3, [%[a], #56]\n\t"
  29404. "str r5, [%[r], #64]\n\t"
  29405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29406. "lsrs r6, r3, #1\n\t"
  29407. #else
  29408. "lsr r6, r3, #1\n\t"
  29409. #endif
  29410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29411. "lsls r3, r3, %[n]\n\t"
  29412. #else
  29413. "lsl r3, r3, %[n]\n\t"
  29414. #endif
  29415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29416. "lsrs r6, r6, r7\n\t"
  29417. #else
  29418. "lsr r6, r6, r7\n\t"
  29419. #endif
  29420. #ifdef WOLFSSL_KEIL
  29421. "orrs r4, r4, r6\n\t"
  29422. #elif defined(__clang__)
  29423. "orrs r4, r6\n\t"
  29424. #else
  29425. "orr r4, r6\n\t"
  29426. #endif
  29427. "ldr r5, [%[a], #52]\n\t"
  29428. "str r4, [%[r], #60]\n\t"
  29429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29430. "lsrs r6, r5, #1\n\t"
  29431. #else
  29432. "lsr r6, r5, #1\n\t"
  29433. #endif
  29434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29435. "lsls r5, r5, %[n]\n\t"
  29436. #else
  29437. "lsl r5, r5, %[n]\n\t"
  29438. #endif
  29439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29440. "lsrs r6, r6, r7\n\t"
  29441. #else
  29442. "lsr r6, r6, r7\n\t"
  29443. #endif
  29444. #ifdef WOLFSSL_KEIL
  29445. "orrs r3, r3, r6\n\t"
  29446. #elif defined(__clang__)
  29447. "orrs r3, r6\n\t"
  29448. #else
  29449. "orr r3, r6\n\t"
  29450. #endif
  29451. "ldr r4, [%[a], #48]\n\t"
  29452. "str r3, [%[r], #56]\n\t"
  29453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29454. "lsrs r6, r4, #1\n\t"
  29455. #else
  29456. "lsr r6, r4, #1\n\t"
  29457. #endif
  29458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29459. "lsls r4, r4, %[n]\n\t"
  29460. #else
  29461. "lsl r4, r4, %[n]\n\t"
  29462. #endif
  29463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29464. "lsrs r6, r6, r7\n\t"
  29465. #else
  29466. "lsr r6, r6, r7\n\t"
  29467. #endif
  29468. #ifdef WOLFSSL_KEIL
  29469. "orrs r5, r5, r6\n\t"
  29470. #elif defined(__clang__)
  29471. "orrs r5, r6\n\t"
  29472. #else
  29473. "orr r5, r6\n\t"
  29474. #endif
  29475. "ldr r3, [%[a], #44]\n\t"
  29476. "str r5, [%[r], #52]\n\t"
  29477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29478. "lsrs r6, r3, #1\n\t"
  29479. #else
  29480. "lsr r6, r3, #1\n\t"
  29481. #endif
  29482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29483. "lsls r3, r3, %[n]\n\t"
  29484. #else
  29485. "lsl r3, r3, %[n]\n\t"
  29486. #endif
  29487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29488. "lsrs r6, r6, r7\n\t"
  29489. #else
  29490. "lsr r6, r6, r7\n\t"
  29491. #endif
  29492. #ifdef WOLFSSL_KEIL
  29493. "orrs r4, r4, r6\n\t"
  29494. #elif defined(__clang__)
  29495. "orrs r4, r6\n\t"
  29496. #else
  29497. "orr r4, r6\n\t"
  29498. #endif
  29499. "ldr r5, [%[a], #40]\n\t"
  29500. "str r4, [%[r], #48]\n\t"
  29501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29502. "lsrs r6, r5, #1\n\t"
  29503. #else
  29504. "lsr r6, r5, #1\n\t"
  29505. #endif
  29506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29507. "lsls r5, r5, %[n]\n\t"
  29508. #else
  29509. "lsl r5, r5, %[n]\n\t"
  29510. #endif
  29511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29512. "lsrs r6, r6, r7\n\t"
  29513. #else
  29514. "lsr r6, r6, r7\n\t"
  29515. #endif
  29516. #ifdef WOLFSSL_KEIL
  29517. "orrs r3, r3, r6\n\t"
  29518. #elif defined(__clang__)
  29519. "orrs r3, r6\n\t"
  29520. #else
  29521. "orr r3, r6\n\t"
  29522. #endif
  29523. "ldr r4, [%[a], #36]\n\t"
  29524. "str r3, [%[r], #44]\n\t"
  29525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29526. "lsrs r6, r4, #1\n\t"
  29527. #else
  29528. "lsr r6, r4, #1\n\t"
  29529. #endif
  29530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29531. "lsls r4, r4, %[n]\n\t"
  29532. #else
  29533. "lsl r4, r4, %[n]\n\t"
  29534. #endif
  29535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29536. "lsrs r6, r6, r7\n\t"
  29537. #else
  29538. "lsr r6, r6, r7\n\t"
  29539. #endif
  29540. #ifdef WOLFSSL_KEIL
  29541. "orrs r5, r5, r6\n\t"
  29542. #elif defined(__clang__)
  29543. "orrs r5, r6\n\t"
  29544. #else
  29545. "orr r5, r6\n\t"
  29546. #endif
  29547. "ldr r3, [%[a], #32]\n\t"
  29548. "str r5, [%[r], #40]\n\t"
  29549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29550. "lsrs r6, r3, #1\n\t"
  29551. #else
  29552. "lsr r6, r3, #1\n\t"
  29553. #endif
  29554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29555. "lsls r3, r3, %[n]\n\t"
  29556. #else
  29557. "lsl r3, r3, %[n]\n\t"
  29558. #endif
  29559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29560. "lsrs r6, r6, r7\n\t"
  29561. #else
  29562. "lsr r6, r6, r7\n\t"
  29563. #endif
  29564. #ifdef WOLFSSL_KEIL
  29565. "orrs r4, r4, r6\n\t"
  29566. #elif defined(__clang__)
  29567. "orrs r4, r6\n\t"
  29568. #else
  29569. "orr r4, r6\n\t"
  29570. #endif
  29571. "ldr r5, [%[a], #28]\n\t"
  29572. "str r4, [%[r], #36]\n\t"
  29573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29574. "lsrs r6, r5, #1\n\t"
  29575. #else
  29576. "lsr r6, r5, #1\n\t"
  29577. #endif
  29578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29579. "lsls r5, r5, %[n]\n\t"
  29580. #else
  29581. "lsl r5, r5, %[n]\n\t"
  29582. #endif
  29583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29584. "lsrs r6, r6, r7\n\t"
  29585. #else
  29586. "lsr r6, r6, r7\n\t"
  29587. #endif
  29588. #ifdef WOLFSSL_KEIL
  29589. "orrs r3, r3, r6\n\t"
  29590. #elif defined(__clang__)
  29591. "orrs r3, r6\n\t"
  29592. #else
  29593. "orr r3, r6\n\t"
  29594. #endif
  29595. "ldr r4, [%[a], #24]\n\t"
  29596. "str r3, [%[r], #32]\n\t"
  29597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29598. "lsrs r6, r4, #1\n\t"
  29599. #else
  29600. "lsr r6, r4, #1\n\t"
  29601. #endif
  29602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29603. "lsls r4, r4, %[n]\n\t"
  29604. #else
  29605. "lsl r4, r4, %[n]\n\t"
  29606. #endif
  29607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29608. "lsrs r6, r6, r7\n\t"
  29609. #else
  29610. "lsr r6, r6, r7\n\t"
  29611. #endif
  29612. #ifdef WOLFSSL_KEIL
  29613. "orrs r5, r5, r6\n\t"
  29614. #elif defined(__clang__)
  29615. "orrs r5, r6\n\t"
  29616. #else
  29617. "orr r5, r6\n\t"
  29618. #endif
  29619. "ldr r3, [%[a], #20]\n\t"
  29620. "str r5, [%[r], #28]\n\t"
  29621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29622. "lsrs r6, r3, #1\n\t"
  29623. #else
  29624. "lsr r6, r3, #1\n\t"
  29625. #endif
  29626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29627. "lsls r3, r3, %[n]\n\t"
  29628. #else
  29629. "lsl r3, r3, %[n]\n\t"
  29630. #endif
  29631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29632. "lsrs r6, r6, r7\n\t"
  29633. #else
  29634. "lsr r6, r6, r7\n\t"
  29635. #endif
  29636. #ifdef WOLFSSL_KEIL
  29637. "orrs r4, r4, r6\n\t"
  29638. #elif defined(__clang__)
  29639. "orrs r4, r6\n\t"
  29640. #else
  29641. "orr r4, r6\n\t"
  29642. #endif
  29643. "ldr r5, [%[a], #16]\n\t"
  29644. "str r4, [%[r], #24]\n\t"
  29645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29646. "lsrs r6, r5, #1\n\t"
  29647. #else
  29648. "lsr r6, r5, #1\n\t"
  29649. #endif
  29650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29651. "lsls r5, r5, %[n]\n\t"
  29652. #else
  29653. "lsl r5, r5, %[n]\n\t"
  29654. #endif
  29655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29656. "lsrs r6, r6, r7\n\t"
  29657. #else
  29658. "lsr r6, r6, r7\n\t"
  29659. #endif
  29660. #ifdef WOLFSSL_KEIL
  29661. "orrs r3, r3, r6\n\t"
  29662. #elif defined(__clang__)
  29663. "orrs r3, r6\n\t"
  29664. #else
  29665. "orr r3, r6\n\t"
  29666. #endif
  29667. "ldr r4, [%[a], #12]\n\t"
  29668. "str r3, [%[r], #20]\n\t"
  29669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29670. "lsrs r6, r4, #1\n\t"
  29671. #else
  29672. "lsr r6, r4, #1\n\t"
  29673. #endif
  29674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29675. "lsls r4, r4, %[n]\n\t"
  29676. #else
  29677. "lsl r4, r4, %[n]\n\t"
  29678. #endif
  29679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29680. "lsrs r6, r6, r7\n\t"
  29681. #else
  29682. "lsr r6, r6, r7\n\t"
  29683. #endif
  29684. #ifdef WOLFSSL_KEIL
  29685. "orrs r5, r5, r6\n\t"
  29686. #elif defined(__clang__)
  29687. "orrs r5, r6\n\t"
  29688. #else
  29689. "orr r5, r6\n\t"
  29690. #endif
  29691. "ldr r3, [%[a], #8]\n\t"
  29692. "str r5, [%[r], #16]\n\t"
  29693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29694. "lsrs r6, r3, #1\n\t"
  29695. #else
  29696. "lsr r6, r3, #1\n\t"
  29697. #endif
  29698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29699. "lsls r3, r3, %[n]\n\t"
  29700. #else
  29701. "lsl r3, r3, %[n]\n\t"
  29702. #endif
  29703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29704. "lsrs r6, r6, r7\n\t"
  29705. #else
  29706. "lsr r6, r6, r7\n\t"
  29707. #endif
  29708. #ifdef WOLFSSL_KEIL
  29709. "orrs r4, r4, r6\n\t"
  29710. #elif defined(__clang__)
  29711. "orrs r4, r6\n\t"
  29712. #else
  29713. "orr r4, r6\n\t"
  29714. #endif
  29715. "ldr r5, [%[a], #4]\n\t"
  29716. "str r4, [%[r], #12]\n\t"
  29717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29718. "lsrs r6, r5, #1\n\t"
  29719. #else
  29720. "lsr r6, r5, #1\n\t"
  29721. #endif
  29722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29723. "lsls r5, r5, %[n]\n\t"
  29724. #else
  29725. "lsl r5, r5, %[n]\n\t"
  29726. #endif
  29727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29728. "lsrs r6, r6, r7\n\t"
  29729. #else
  29730. "lsr r6, r6, r7\n\t"
  29731. #endif
  29732. #ifdef WOLFSSL_KEIL
  29733. "orrs r3, r3, r6\n\t"
  29734. #elif defined(__clang__)
  29735. "orrs r3, r6\n\t"
  29736. #else
  29737. "orr r3, r6\n\t"
  29738. #endif
  29739. "ldr r4, [%[a]]\n\t"
  29740. "str r3, [%[r], #8]\n\t"
  29741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29742. "lsrs r6, r4, #1\n\t"
  29743. #else
  29744. "lsr r6, r4, #1\n\t"
  29745. #endif
  29746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29747. "lsls r4, r4, %[n]\n\t"
  29748. #else
  29749. "lsl r4, r4, %[n]\n\t"
  29750. #endif
  29751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29752. "lsrs r6, r6, r7\n\t"
  29753. #else
  29754. "lsr r6, r6, r7\n\t"
  29755. #endif
  29756. #ifdef WOLFSSL_KEIL
  29757. "orrs r5, r5, r6\n\t"
  29758. #elif defined(__clang__)
  29759. "orrs r5, r6\n\t"
  29760. #else
  29761. "orr r5, r6\n\t"
  29762. #endif
  29763. "str r4, [%[r]]\n\t"
  29764. "str r5, [%[r], #4]\n\t"
  29765. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  29766. :
  29767. : "memory", "r3", "r4", "r5", "r6", "r7"
  29768. );
  29769. }
  29770. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  29771. *
  29772. * r A single precision number that is the result of the operation.
  29773. * e A single precision number that is the exponent.
  29774. * bits The number of bits in the exponent.
  29775. * m A single precision number that is the modulus.
  29776. * returns 0 on success.
  29777. * returns MEMORY_E on dynamic memory allocation failure.
  29778. * returns MP_VAL when base is even.
  29779. */
  29780. static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits,
  29781. const sp_digit* m)
  29782. {
  29783. #ifdef WOLFSSL_SP_SMALL_STACK
  29784. sp_digit* td = NULL;
  29785. #else
  29786. sp_digit td[193];
  29787. #endif
  29788. sp_digit* norm = NULL;
  29789. sp_digit* tmp = NULL;
  29790. sp_digit mp = 1;
  29791. sp_digit n;
  29792. sp_digit o;
  29793. sp_digit mask;
  29794. int i;
  29795. int c;
  29796. byte y;
  29797. int err = MP_OKAY;
  29798. if (bits == 0) {
  29799. err = MP_VAL;
  29800. }
  29801. #ifdef WOLFSSL_SP_SMALL_STACK
  29802. if (err == MP_OKAY) {
  29803. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 193, NULL,
  29804. DYNAMIC_TYPE_TMP_BUFFER);
  29805. if (td == NULL)
  29806. err = MEMORY_E;
  29807. }
  29808. #endif
  29809. if (err == MP_OKAY) {
  29810. norm = td;
  29811. tmp = td + 128;
  29812. sp_2048_mont_setup(m, &mp);
  29813. sp_2048_mont_norm_64(norm, m);
  29814. i = (bits - 1) / 32;
  29815. n = e[i--];
  29816. c = bits & 31;
  29817. if (c == 0) {
  29818. c = 32;
  29819. }
  29820. c -= bits % 5;
  29821. if (c == 32) {
  29822. c = 27;
  29823. }
  29824. if (c < 0) {
  29825. /* Number of bits in top word is less than number needed. */
  29826. c = -c;
  29827. y = (byte)(n << c);
  29828. n = e[i--];
  29829. y |= (byte)(n >> (64 - c));
  29830. n <<= c;
  29831. c = 64 - c;
  29832. }
  29833. else if (c == 0) {
  29834. /* All bits in top word used. */
  29835. y = (byte)n;
  29836. }
  29837. else {
  29838. y = (byte)(n >> c);
  29839. n <<= 32 - c;
  29840. }
  29841. sp_2048_lshift_64(r, norm, y);
  29842. for (; i>=0 || c>=5; ) {
  29843. if (c == 0) {
  29844. n = e[i--];
  29845. y = (byte)(n >> 27);
  29846. n <<= 5;
  29847. c = 27;
  29848. }
  29849. else if (c < 5) {
  29850. y = (byte)(n >> 27);
  29851. n = e[i--];
  29852. c = 5 - c;
  29853. y |= (byte)(n >> (32 - c));
  29854. n <<= c;
  29855. c = 32 - c;
  29856. }
  29857. else {
  29858. y = (byte)((n >> 27) & 0x1f);
  29859. n <<= 5;
  29860. c -= 5;
  29861. }
  29862. sp_2048_mont_sqr_64(r, r, m, mp);
  29863. sp_2048_mont_sqr_64(r, r, m, mp);
  29864. sp_2048_mont_sqr_64(r, r, m, mp);
  29865. sp_2048_mont_sqr_64(r, r, m, mp);
  29866. sp_2048_mont_sqr_64(r, r, m, mp);
  29867. sp_2048_lshift_64(r, r, y);
  29868. sp_2048_mul_d_64(tmp, norm, r[64]);
  29869. r[64] = 0;
  29870. o = sp_2048_add_64(r, r, tmp);
  29871. sp_2048_cond_sub_64(r, r, m, (sp_digit)0 - o);
  29872. }
  29873. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  29874. sp_2048_mont_reduce_64(r, m, mp);
  29875. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  29876. sp_2048_cond_sub_64(r, r, m, mask);
  29877. }
  29878. #ifdef WOLFSSL_SP_SMALL_STACK
  29879. if (td != NULL)
  29880. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29881. #endif
  29882. return err;
  29883. }
  29884. #endif /* HAVE_FFDHE_2048 */
  29885. /* Perform the modular exponentiation for Diffie-Hellman.
  29886. *
  29887. * base Base.
  29888. * exp Array of bytes that is the exponent.
  29889. * expLen Length of data, in bytes, in exponent.
  29890. * mod Modulus.
  29891. * out Buffer to hold big-endian bytes of exponentiation result.
  29892. * Must be at least 256 bytes long.
  29893. * outLen Length, in bytes, of exponentiation result.
  29894. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  29895. * and MEMORY_E if memory allocation fails.
  29896. */
  29897. int sp_DhExp_2048(const mp_int* base, const byte* exp, word32 expLen,
  29898. const mp_int* mod, byte* out, word32* outLen)
  29899. {
  29900. int err = MP_OKAY;
  29901. sp_digit b[128];
  29902. sp_digit e[64];
  29903. sp_digit m[64];
  29904. sp_digit* r = b;
  29905. word32 i;
  29906. if (mp_count_bits(base) > 2048) {
  29907. err = MP_READ_E;
  29908. }
  29909. else if (expLen > 256) {
  29910. err = MP_READ_E;
  29911. }
  29912. else if (mp_count_bits(mod) != 2048) {
  29913. err = MP_READ_E;
  29914. }
  29915. else if (mp_iseven(mod)) {
  29916. err = MP_VAL;
  29917. }
  29918. if (err == MP_OKAY) {
  29919. sp_2048_from_mp(b, 64, base);
  29920. sp_2048_from_bin(e, 64, exp, expLen);
  29921. sp_2048_from_mp(m, 64, mod);
  29922. #ifdef HAVE_FFDHE_2048
  29923. if (base->used == 1 && base->dp[0] == 2 && m[63] == (sp_digit)-1)
  29924. err = sp_2048_mod_exp_2_64(r, e, expLen * 8, m);
  29925. else
  29926. #endif
  29927. err = sp_2048_mod_exp_64(r, b, e, expLen * 8, m, 0);
  29928. }
  29929. if (err == MP_OKAY) {
  29930. sp_2048_to_bin_64(r, out);
  29931. *outLen = 256;
  29932. for (i=0; i<256 && out[i] == 0; i++) {
  29933. /* Search for first non-zero. */
  29934. }
  29935. *outLen -= i;
  29936. XMEMMOVE(out, out + i, *outLen);
  29937. }
  29938. XMEMSET(e, 0, sizeof(e));
  29939. return err;
  29940. }
  29941. #endif /* WOLFSSL_HAVE_SP_DH */
  29942. /* Perform the modular exponentiation for Diffie-Hellman.
  29943. *
  29944. * base Base. MP integer.
  29945. * exp Exponent. MP integer.
  29946. * mod Modulus. MP integer.
  29947. * res Result. MP integer.
  29948. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  29949. * and MEMORY_E if memory allocation fails.
  29950. */
  29951. int sp_ModExp_1024(const mp_int* base, const mp_int* exp, const mp_int* mod,
  29952. mp_int* res)
  29953. {
  29954. int err = MP_OKAY;
  29955. sp_digit b[64];
  29956. sp_digit e[32];
  29957. sp_digit m[32];
  29958. sp_digit* r = b;
  29959. int expBits = mp_count_bits(exp);
  29960. if (mp_count_bits(base) > 1024) {
  29961. err = MP_READ_E;
  29962. }
  29963. else if (expBits > 1024) {
  29964. err = MP_READ_E;
  29965. }
  29966. else if (mp_count_bits(mod) != 1024) {
  29967. err = MP_READ_E;
  29968. }
  29969. else if (mp_iseven(mod)) {
  29970. err = MP_VAL;
  29971. }
  29972. if (err == MP_OKAY) {
  29973. sp_2048_from_mp(b, 32, base);
  29974. sp_2048_from_mp(e, 32, exp);
  29975. sp_2048_from_mp(m, 32, mod);
  29976. err = sp_2048_mod_exp_32(r, b, e, expBits, m, 0);
  29977. }
  29978. if (err == MP_OKAY) {
  29979. XMEMSET(r + 32, 0, sizeof(*r) * 32U);
  29980. err = sp_2048_to_mp(r, res);
  29981. res->used = mod->used;
  29982. mp_clamp(res);
  29983. }
  29984. XMEMSET(e, 0, sizeof(e));
  29985. return err;
  29986. }
  29987. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  29988. #endif /* !WOLFSSL_SP_NO_2048 */
  29989. #ifndef WOLFSSL_SP_NO_3072
  29990. /* Read big endian unsigned byte array into r.
  29991. *
  29992. * r A single precision integer.
  29993. * size Maximum number of bytes to convert
  29994. * a Byte array.
  29995. * n Number of bytes in array to read.
  29996. */
  29997. static void sp_3072_from_bin(sp_digit* r, int size, const byte* a, int n)
  29998. {
  29999. int i;
  30000. int j;
  30001. byte* d;
  30002. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  30003. r[j] = ((sp_digit)a[i - 0] << 0) |
  30004. ((sp_digit)a[i - 1] << 8) |
  30005. ((sp_digit)a[i - 2] << 16) |
  30006. ((sp_digit)a[i - 3] << 24);
  30007. j++;
  30008. }
  30009. if (i >= 0) {
  30010. r[j] = 0;
  30011. d = (byte*)r;
  30012. switch (i) {
  30013. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  30014. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  30015. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  30016. }
  30017. j++;
  30018. }
  30019. for (; j < size; j++) {
  30020. r[j] = 0;
  30021. }
  30022. }
  30023. /* Convert an mp_int to an array of sp_digit.
  30024. *
  30025. * r A single precision integer.
  30026. * size Maximum number of bytes to convert
  30027. * a A multi-precision integer.
  30028. */
  30029. static void sp_3072_from_mp(sp_digit* r, int size, const mp_int* a)
  30030. {
  30031. #if DIGIT_BIT == 32
  30032. int i;
  30033. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  30034. int o = 0;
  30035. for (i = 0; i < size; i++) {
  30036. sp_digit mask = (sp_digit)0 - (j >> 31);
  30037. r[i] = a->dp[o] & mask;
  30038. j++;
  30039. o += (int)(j >> 31);
  30040. }
  30041. #elif DIGIT_BIT > 32
  30042. unsigned int i;
  30043. int j = 0;
  30044. word32 s = 0;
  30045. r[0] = 0;
  30046. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  30047. r[j] |= ((sp_digit)a->dp[i] << s);
  30048. r[j] &= 0xffffffff;
  30049. s = 32U - s;
  30050. if (j + 1 >= size) {
  30051. break;
  30052. }
  30053. /* lint allow cast of mismatch word32 and mp_digit */
  30054. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  30055. while ((s + 32U) <= (word32)DIGIT_BIT) {
  30056. s += 32U;
  30057. r[j] &= 0xffffffff;
  30058. if (j + 1 >= size) {
  30059. break;
  30060. }
  30061. if (s < (word32)DIGIT_BIT) {
  30062. /* lint allow cast of mismatch word32 and mp_digit */
  30063. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  30064. }
  30065. else {
  30066. r[++j] = (sp_digit)0;
  30067. }
  30068. }
  30069. s = (word32)DIGIT_BIT - s;
  30070. }
  30071. for (j++; j < size; j++) {
  30072. r[j] = 0;
  30073. }
  30074. #else
  30075. unsigned int i;
  30076. int j = 0;
  30077. int s = 0;
  30078. r[0] = 0;
  30079. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  30080. r[j] |= ((sp_digit)a->dp[i]) << s;
  30081. if (s + DIGIT_BIT >= 32) {
  30082. r[j] &= 0xffffffff;
  30083. if (j + 1 >= size) {
  30084. break;
  30085. }
  30086. s = 32 - s;
  30087. if (s == DIGIT_BIT) {
  30088. r[++j] = 0;
  30089. s = 0;
  30090. }
  30091. else {
  30092. r[++j] = a->dp[i] >> s;
  30093. s = DIGIT_BIT - s;
  30094. }
  30095. }
  30096. else {
  30097. s += DIGIT_BIT;
  30098. }
  30099. }
  30100. for (j++; j < size; j++) {
  30101. r[j] = 0;
  30102. }
  30103. #endif
  30104. }
  30105. /* Write r as big endian to byte array.
  30106. * Fixed length number of bytes written: 384
  30107. *
  30108. * r A single precision integer.
  30109. * a Byte array.
  30110. */
  30111. static void sp_3072_to_bin_96(sp_digit* r, byte* a)
  30112. {
  30113. int i;
  30114. int j = 0;
  30115. for (i = 95; i >= 0; i--) {
  30116. a[j++] = r[i] >> 24;
  30117. a[j++] = r[i] >> 16;
  30118. a[j++] = r[i] >> 8;
  30119. a[j++] = r[i] >> 0;
  30120. }
  30121. }
  30122. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  30123. /* Normalize the values in each word to 32.
  30124. *
  30125. * a Array of sp_digit to normalize.
  30126. */
  30127. #define sp_3072_norm_96(a)
  30128. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  30129. /* Normalize the values in each word to 32.
  30130. *
  30131. * a Array of sp_digit to normalize.
  30132. */
  30133. #define sp_3072_norm_96(a)
  30134. #ifndef WOLFSSL_SP_SMALL
  30135. #ifndef WOLFSSL_SP_LARGE_CODE
  30136. /* Multiply a and b into r. (r = a * b)
  30137. *
  30138. * r A single precision integer.
  30139. * a A single precision integer.
  30140. * b A single precision integer.
  30141. */
  30142. SP_NOINLINE static void sp_3072_mul_12(sp_digit* r, const sp_digit* a,
  30143. const sp_digit* b)
  30144. {
  30145. sp_digit t[12 * 2];
  30146. sp_digit* tmp = t;
  30147. __asm__ __volatile__ (
  30148. "movs r3, #0\n\t"
  30149. "movs r4, #0\n\t"
  30150. "mov r8, r3\n\t"
  30151. "mov r11, %[tmp]\n\t"
  30152. "mov r9, %[a]\n\t"
  30153. "mov r10, %[b]\n\t"
  30154. "movs r6, #48\n\t"
  30155. "add r6, r6, r9\n\t"
  30156. "mov r12, r6\n\t"
  30157. "\n"
  30158. "L_sp_3072_mul_12_words_%=:\n\t"
  30159. "movs %[tmp], #0\n\t"
  30160. "movs r5, #0\n\t"
  30161. "movs r6, #44\n\t"
  30162. "mov %[a], r8\n\t"
  30163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30164. "subs %[a], %[a], r6\n\t"
  30165. #else
  30166. "sub %[a], %[a], r6\n\t"
  30167. #endif
  30168. #ifdef WOLFSSL_KEIL
  30169. "sbcs r6, r6, r6\n\t"
  30170. #elif defined(__clang__)
  30171. "sbcs r6, r6\n\t"
  30172. #else
  30173. "sbc r6, r6\n\t"
  30174. #endif
  30175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30176. "mvns r6, r6\n\t"
  30177. #else
  30178. "mvn r6, r6\n\t"
  30179. #endif
  30180. #ifdef WOLFSSL_KEIL
  30181. "ands %[a], %[a], r6\n\t"
  30182. #elif defined(__clang__)
  30183. "ands %[a], r6\n\t"
  30184. #else
  30185. "and %[a], r6\n\t"
  30186. #endif
  30187. "mov %[b], r8\n\t"
  30188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30189. "subs %[b], %[b], %[a]\n\t"
  30190. #else
  30191. "sub %[b], %[b], %[a]\n\t"
  30192. #endif
  30193. "add %[a], %[a], r9\n\t"
  30194. "add %[b], %[b], r10\n\t"
  30195. "\n"
  30196. "L_sp_3072_mul_12_mul_%=:\n\t"
  30197. "# Multiply Start\n\t"
  30198. "ldrh r6, [%[a]]\n\t"
  30199. "ldrh r7, [%[b]]\n\t"
  30200. #ifdef WOLFSSL_KEIL
  30201. "muls r7, r6, r7\n\t"
  30202. #elif defined(__clang__)
  30203. "muls r7, r6\n\t"
  30204. #else
  30205. "mul r7, r6\n\t"
  30206. #endif
  30207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30208. "adds r3, r3, r7\n\t"
  30209. #else
  30210. "add r3, r3, r7\n\t"
  30211. #endif
  30212. #ifdef WOLFSSL_KEIL
  30213. "adcs r4, r4, %[tmp]\n\t"
  30214. #elif defined(__clang__)
  30215. "adcs r4, %[tmp]\n\t"
  30216. #else
  30217. "adc r4, %[tmp]\n\t"
  30218. #endif
  30219. #ifdef WOLFSSL_KEIL
  30220. "adcs r5, r5, %[tmp]\n\t"
  30221. #elif defined(__clang__)
  30222. "adcs r5, %[tmp]\n\t"
  30223. #else
  30224. "adc r5, %[tmp]\n\t"
  30225. #endif
  30226. "ldr r7, [%[b]]\n\t"
  30227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30228. "lsrs r7, r7, #16\n\t"
  30229. #else
  30230. "lsr r7, r7, #16\n\t"
  30231. #endif
  30232. #ifdef WOLFSSL_KEIL
  30233. "muls r6, r7, r6\n\t"
  30234. #elif defined(__clang__)
  30235. "muls r6, r7\n\t"
  30236. #else
  30237. "mul r6, r7\n\t"
  30238. #endif
  30239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30240. "lsrs r7, r6, #16\n\t"
  30241. #else
  30242. "lsr r7, r6, #16\n\t"
  30243. #endif
  30244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30245. "lsls r6, r6, #16\n\t"
  30246. #else
  30247. "lsl r6, r6, #16\n\t"
  30248. #endif
  30249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30250. "adds r3, r3, r6\n\t"
  30251. #else
  30252. "add r3, r3, r6\n\t"
  30253. #endif
  30254. #ifdef WOLFSSL_KEIL
  30255. "adcs r4, r4, r7\n\t"
  30256. #elif defined(__clang__)
  30257. "adcs r4, r7\n\t"
  30258. #else
  30259. "adc r4, r7\n\t"
  30260. #endif
  30261. #ifdef WOLFSSL_KEIL
  30262. "adcs r5, r5, %[tmp]\n\t"
  30263. #elif defined(__clang__)
  30264. "adcs r5, %[tmp]\n\t"
  30265. #else
  30266. "adc r5, %[tmp]\n\t"
  30267. #endif
  30268. "ldr r6, [%[a]]\n\t"
  30269. "ldr r7, [%[b]]\n\t"
  30270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30271. "lsrs r6, r6, #16\n\t"
  30272. #else
  30273. "lsr r6, r6, #16\n\t"
  30274. #endif
  30275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30276. "lsrs r7, r7, #16\n\t"
  30277. #else
  30278. "lsr r7, r7, #16\n\t"
  30279. #endif
  30280. #ifdef WOLFSSL_KEIL
  30281. "muls r7, r6, r7\n\t"
  30282. #elif defined(__clang__)
  30283. "muls r7, r6\n\t"
  30284. #else
  30285. "mul r7, r6\n\t"
  30286. #endif
  30287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30288. "adds r4, r4, r7\n\t"
  30289. #else
  30290. "add r4, r4, r7\n\t"
  30291. #endif
  30292. #ifdef WOLFSSL_KEIL
  30293. "adcs r5, r5, %[tmp]\n\t"
  30294. #elif defined(__clang__)
  30295. "adcs r5, %[tmp]\n\t"
  30296. #else
  30297. "adc r5, %[tmp]\n\t"
  30298. #endif
  30299. "ldrh r7, [%[b]]\n\t"
  30300. #ifdef WOLFSSL_KEIL
  30301. "muls r6, r7, r6\n\t"
  30302. #elif defined(__clang__)
  30303. "muls r6, r7\n\t"
  30304. #else
  30305. "mul r6, r7\n\t"
  30306. #endif
  30307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30308. "lsrs r7, r6, #16\n\t"
  30309. #else
  30310. "lsr r7, r6, #16\n\t"
  30311. #endif
  30312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30313. "lsls r6, r6, #16\n\t"
  30314. #else
  30315. "lsl r6, r6, #16\n\t"
  30316. #endif
  30317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30318. "adds r3, r3, r6\n\t"
  30319. #else
  30320. "add r3, r3, r6\n\t"
  30321. #endif
  30322. #ifdef WOLFSSL_KEIL
  30323. "adcs r4, r4, r7\n\t"
  30324. #elif defined(__clang__)
  30325. "adcs r4, r7\n\t"
  30326. #else
  30327. "adc r4, r7\n\t"
  30328. #endif
  30329. #ifdef WOLFSSL_KEIL
  30330. "adcs r5, r5, %[tmp]\n\t"
  30331. #elif defined(__clang__)
  30332. "adcs r5, %[tmp]\n\t"
  30333. #else
  30334. "adc r5, %[tmp]\n\t"
  30335. #endif
  30336. "# Multiply Done\n\t"
  30337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30338. "adds %[a], %[a], #4\n\t"
  30339. #else
  30340. "add %[a], %[a], #4\n\t"
  30341. #endif
  30342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30343. "subs %[b], %[b], #4\n\t"
  30344. #else
  30345. "sub %[b], %[b], #4\n\t"
  30346. #endif
  30347. "cmp %[a], r12\n\t"
  30348. "beq L_sp_3072_mul_12_done_mul_%=\n\t"
  30349. "mov r6, r8\n\t"
  30350. "add r6, r6, r9\n\t"
  30351. "cmp %[a], r6\n\t"
  30352. "ble L_sp_3072_mul_12_mul_%=\n\t"
  30353. "\n"
  30354. "L_sp_3072_mul_12_done_mul_%=:\n\t"
  30355. "mov %[tmp], r11\n\t"
  30356. "mov r7, r8\n\t"
  30357. "str r3, [%[tmp], r7]\n\t"
  30358. "movs r3, r4\n\t"
  30359. "movs r4, r5\n\t"
  30360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30361. "adds r7, r7, #4\n\t"
  30362. #else
  30363. "add r7, r7, #4\n\t"
  30364. #endif
  30365. "mov r8, r7\n\t"
  30366. "movs r6, #0x58\n\t"
  30367. "cmp r7, r6\n\t"
  30368. "ble L_sp_3072_mul_12_words_%=\n\t"
  30369. "str r3, [%[tmp], r7]\n\t"
  30370. "mov %[a], r9\n\t"
  30371. "mov %[b], r10\n\t"
  30372. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  30373. :
  30374. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  30375. );
  30376. XMEMCPY(r, t, sizeof(t));
  30377. }
  30378. #else
  30379. /* Multiply a and b into r. (r = a * b)
  30380. *
  30381. * r A single precision integer.
  30382. * a A single precision integer.
  30383. * b A single precision integer.
  30384. */
  30385. SP_NOINLINE static void sp_3072_mul_12(sp_digit* r, const sp_digit* a,
  30386. const sp_digit* b)
  30387. {
  30388. __asm__ __volatile__ (
  30389. "sub sp, sp, #48\n\t"
  30390. "mov r8, %[r]\n\t"
  30391. "mov r9, %[a]\n\t"
  30392. "mov r10, %[b]\n\t"
  30393. "movs %[r], #0\n\t"
  30394. "# A[0] * B[0]\n\t"
  30395. "ldr %[a], [%[a]]\n\t"
  30396. "ldr %[b], [%[b]]\n\t"
  30397. "uxth r6, %[a]\n\t"
  30398. "uxth r3, %[b]\n\t"
  30399. #ifdef WOLFSSL_KEIL
  30400. "muls r3, r6, r3\n\t"
  30401. #elif defined(__clang__)
  30402. "muls r3, r6\n\t"
  30403. #else
  30404. "mul r3, r6\n\t"
  30405. #endif
  30406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30407. "lsrs r7, %[b], #16\n\t"
  30408. #else
  30409. "lsr r7, %[b], #16\n\t"
  30410. #endif
  30411. #ifdef WOLFSSL_KEIL
  30412. "muls r6, r7, r6\n\t"
  30413. #elif defined(__clang__)
  30414. "muls r6, r7\n\t"
  30415. #else
  30416. "mul r6, r7\n\t"
  30417. #endif
  30418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30419. "lsrs r4, r6, #16\n\t"
  30420. #else
  30421. "lsr r4, r6, #16\n\t"
  30422. #endif
  30423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30424. "lsls r6, r6, #16\n\t"
  30425. #else
  30426. "lsl r6, r6, #16\n\t"
  30427. #endif
  30428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30429. "adds r3, r3, r6\n\t"
  30430. #else
  30431. "add r3, r3, r6\n\t"
  30432. #endif
  30433. #ifdef WOLFSSL_KEIL
  30434. "adcs r4, r4, %[r]\n\t"
  30435. #elif defined(__clang__)
  30436. "adcs r4, %[r]\n\t"
  30437. #else
  30438. "adc r4, %[r]\n\t"
  30439. #endif
  30440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30441. "lsrs r6, %[a], #16\n\t"
  30442. #else
  30443. "lsr r6, %[a], #16\n\t"
  30444. #endif
  30445. #ifdef WOLFSSL_KEIL
  30446. "muls r7, r6, r7\n\t"
  30447. #elif defined(__clang__)
  30448. "muls r7, r6\n\t"
  30449. #else
  30450. "mul r7, r6\n\t"
  30451. #endif
  30452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30453. "adds r4, r4, r7\n\t"
  30454. #else
  30455. "add r4, r4, r7\n\t"
  30456. #endif
  30457. "uxth r7, %[b]\n\t"
  30458. #ifdef WOLFSSL_KEIL
  30459. "muls r6, r7, r6\n\t"
  30460. #elif defined(__clang__)
  30461. "muls r6, r7\n\t"
  30462. #else
  30463. "mul r6, r7\n\t"
  30464. #endif
  30465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30466. "lsrs r7, r6, #16\n\t"
  30467. #else
  30468. "lsr r7, r6, #16\n\t"
  30469. #endif
  30470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30471. "lsls r6, r6, #16\n\t"
  30472. #else
  30473. "lsl r6, r6, #16\n\t"
  30474. #endif
  30475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30476. "adds r3, r3, r6\n\t"
  30477. #else
  30478. "add r3, r3, r6\n\t"
  30479. #endif
  30480. #ifdef WOLFSSL_KEIL
  30481. "adcs r4, r4, r7\n\t"
  30482. #elif defined(__clang__)
  30483. "adcs r4, r7\n\t"
  30484. #else
  30485. "adc r4, r7\n\t"
  30486. #endif
  30487. "movs r5, #0\n\t"
  30488. "str r3, [sp]\n\t"
  30489. "# A[0] * B[1]\n\t"
  30490. "movs r3, #0\n\t"
  30491. "mov %[a], r9\n\t"
  30492. "mov %[b], r10\n\t"
  30493. "ldr %[a], [%[a]]\n\t"
  30494. "ldr %[b], [%[b], #4]\n\t"
  30495. "uxth r6, %[a]\n\t"
  30496. "uxth r7, %[b]\n\t"
  30497. #ifdef WOLFSSL_KEIL
  30498. "muls r7, r6, r7\n\t"
  30499. #elif defined(__clang__)
  30500. "muls r7, r6\n\t"
  30501. #else
  30502. "mul r7, r6\n\t"
  30503. #endif
  30504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30505. "adds r4, r4, r7\n\t"
  30506. #else
  30507. "add r4, r4, r7\n\t"
  30508. #endif
  30509. #ifdef WOLFSSL_KEIL
  30510. "adcs r5, r5, %[r]\n\t"
  30511. #elif defined(__clang__)
  30512. "adcs r5, %[r]\n\t"
  30513. #else
  30514. "adc r5, %[r]\n\t"
  30515. #endif
  30516. #ifdef WOLFSSL_KEIL
  30517. "adcs r3, r3, %[r]\n\t"
  30518. #elif defined(__clang__)
  30519. "adcs r3, %[r]\n\t"
  30520. #else
  30521. "adc r3, %[r]\n\t"
  30522. #endif
  30523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30524. "lsrs r7, %[b], #16\n\t"
  30525. #else
  30526. "lsr r7, %[b], #16\n\t"
  30527. #endif
  30528. #ifdef WOLFSSL_KEIL
  30529. "muls r6, r7, r6\n\t"
  30530. #elif defined(__clang__)
  30531. "muls r6, r7\n\t"
  30532. #else
  30533. "mul r6, r7\n\t"
  30534. #endif
  30535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30536. "lsrs r7, r6, #16\n\t"
  30537. #else
  30538. "lsr r7, r6, #16\n\t"
  30539. #endif
  30540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30541. "lsls r6, r6, #16\n\t"
  30542. #else
  30543. "lsl r6, r6, #16\n\t"
  30544. #endif
  30545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30546. "adds r4, r4, r6\n\t"
  30547. #else
  30548. "add r4, r4, r6\n\t"
  30549. #endif
  30550. #ifdef WOLFSSL_KEIL
  30551. "adcs r5, r5, r7\n\t"
  30552. #elif defined(__clang__)
  30553. "adcs r5, r7\n\t"
  30554. #else
  30555. "adc r5, r7\n\t"
  30556. #endif
  30557. #ifdef WOLFSSL_KEIL
  30558. "adcs r3, r3, %[r]\n\t"
  30559. #elif defined(__clang__)
  30560. "adcs r3, %[r]\n\t"
  30561. #else
  30562. "adc r3, %[r]\n\t"
  30563. #endif
  30564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30565. "lsrs r6, %[a], #16\n\t"
  30566. #else
  30567. "lsr r6, %[a], #16\n\t"
  30568. #endif
  30569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30570. "lsrs r7, %[b], #16\n\t"
  30571. #else
  30572. "lsr r7, %[b], #16\n\t"
  30573. #endif
  30574. #ifdef WOLFSSL_KEIL
  30575. "muls r7, r6, r7\n\t"
  30576. #elif defined(__clang__)
  30577. "muls r7, r6\n\t"
  30578. #else
  30579. "mul r7, r6\n\t"
  30580. #endif
  30581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30582. "adds r5, r5, r7\n\t"
  30583. #else
  30584. "add r5, r5, r7\n\t"
  30585. #endif
  30586. #ifdef WOLFSSL_KEIL
  30587. "adcs r3, r3, %[r]\n\t"
  30588. #elif defined(__clang__)
  30589. "adcs r3, %[r]\n\t"
  30590. #else
  30591. "adc r3, %[r]\n\t"
  30592. #endif
  30593. "uxth r7, %[b]\n\t"
  30594. #ifdef WOLFSSL_KEIL
  30595. "muls r6, r7, r6\n\t"
  30596. #elif defined(__clang__)
  30597. "muls r6, r7\n\t"
  30598. #else
  30599. "mul r6, r7\n\t"
  30600. #endif
  30601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30602. "lsrs r7, r6, #16\n\t"
  30603. #else
  30604. "lsr r7, r6, #16\n\t"
  30605. #endif
  30606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30607. "lsls r6, r6, #16\n\t"
  30608. #else
  30609. "lsl r6, r6, #16\n\t"
  30610. #endif
  30611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30612. "adds r4, r4, r6\n\t"
  30613. #else
  30614. "add r4, r4, r6\n\t"
  30615. #endif
  30616. #ifdef WOLFSSL_KEIL
  30617. "adcs r5, r5, r7\n\t"
  30618. #elif defined(__clang__)
  30619. "adcs r5, r7\n\t"
  30620. #else
  30621. "adc r5, r7\n\t"
  30622. #endif
  30623. #ifdef WOLFSSL_KEIL
  30624. "adcs r3, r3, %[r]\n\t"
  30625. #elif defined(__clang__)
  30626. "adcs r3, %[r]\n\t"
  30627. #else
  30628. "adc r3, %[r]\n\t"
  30629. #endif
  30630. "# A[1] * B[0]\n\t"
  30631. "mov %[a], r9\n\t"
  30632. "mov %[b], r10\n\t"
  30633. "ldr %[a], [%[a], #4]\n\t"
  30634. "ldr %[b], [%[b]]\n\t"
  30635. "uxth r6, %[a]\n\t"
  30636. "uxth r7, %[b]\n\t"
  30637. #ifdef WOLFSSL_KEIL
  30638. "muls r7, r6, r7\n\t"
  30639. #elif defined(__clang__)
  30640. "muls r7, r6\n\t"
  30641. #else
  30642. "mul r7, r6\n\t"
  30643. #endif
  30644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30645. "adds r4, r4, r7\n\t"
  30646. #else
  30647. "add r4, r4, r7\n\t"
  30648. #endif
  30649. #ifdef WOLFSSL_KEIL
  30650. "adcs r5, r5, %[r]\n\t"
  30651. #elif defined(__clang__)
  30652. "adcs r5, %[r]\n\t"
  30653. #else
  30654. "adc r5, %[r]\n\t"
  30655. #endif
  30656. #ifdef WOLFSSL_KEIL
  30657. "adcs r3, r3, %[r]\n\t"
  30658. #elif defined(__clang__)
  30659. "adcs r3, %[r]\n\t"
  30660. #else
  30661. "adc r3, %[r]\n\t"
  30662. #endif
  30663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30664. "lsrs r7, %[b], #16\n\t"
  30665. #else
  30666. "lsr r7, %[b], #16\n\t"
  30667. #endif
  30668. #ifdef WOLFSSL_KEIL
  30669. "muls r6, r7, r6\n\t"
  30670. #elif defined(__clang__)
  30671. "muls r6, r7\n\t"
  30672. #else
  30673. "mul r6, r7\n\t"
  30674. #endif
  30675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30676. "lsrs r7, r6, #16\n\t"
  30677. #else
  30678. "lsr r7, r6, #16\n\t"
  30679. #endif
  30680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30681. "lsls r6, r6, #16\n\t"
  30682. #else
  30683. "lsl r6, r6, #16\n\t"
  30684. #endif
  30685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30686. "adds r4, r4, r6\n\t"
  30687. #else
  30688. "add r4, r4, r6\n\t"
  30689. #endif
  30690. #ifdef WOLFSSL_KEIL
  30691. "adcs r5, r5, r7\n\t"
  30692. #elif defined(__clang__)
  30693. "adcs r5, r7\n\t"
  30694. #else
  30695. "adc r5, r7\n\t"
  30696. #endif
  30697. #ifdef WOLFSSL_KEIL
  30698. "adcs r3, r3, %[r]\n\t"
  30699. #elif defined(__clang__)
  30700. "adcs r3, %[r]\n\t"
  30701. #else
  30702. "adc r3, %[r]\n\t"
  30703. #endif
  30704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30705. "lsrs r6, %[a], #16\n\t"
  30706. #else
  30707. "lsr r6, %[a], #16\n\t"
  30708. #endif
  30709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30710. "lsrs r7, %[b], #16\n\t"
  30711. #else
  30712. "lsr r7, %[b], #16\n\t"
  30713. #endif
  30714. #ifdef WOLFSSL_KEIL
  30715. "muls r7, r6, r7\n\t"
  30716. #elif defined(__clang__)
  30717. "muls r7, r6\n\t"
  30718. #else
  30719. "mul r7, r6\n\t"
  30720. #endif
  30721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30722. "adds r5, r5, r7\n\t"
  30723. #else
  30724. "add r5, r5, r7\n\t"
  30725. #endif
  30726. #ifdef WOLFSSL_KEIL
  30727. "adcs r3, r3, %[r]\n\t"
  30728. #elif defined(__clang__)
  30729. "adcs r3, %[r]\n\t"
  30730. #else
  30731. "adc r3, %[r]\n\t"
  30732. #endif
  30733. "uxth r7, %[b]\n\t"
  30734. #ifdef WOLFSSL_KEIL
  30735. "muls r6, r7, r6\n\t"
  30736. #elif defined(__clang__)
  30737. "muls r6, r7\n\t"
  30738. #else
  30739. "mul r6, r7\n\t"
  30740. #endif
  30741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30742. "lsrs r7, r6, #16\n\t"
  30743. #else
  30744. "lsr r7, r6, #16\n\t"
  30745. #endif
  30746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30747. "lsls r6, r6, #16\n\t"
  30748. #else
  30749. "lsl r6, r6, #16\n\t"
  30750. #endif
  30751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30752. "adds r4, r4, r6\n\t"
  30753. #else
  30754. "add r4, r4, r6\n\t"
  30755. #endif
  30756. #ifdef WOLFSSL_KEIL
  30757. "adcs r5, r5, r7\n\t"
  30758. #elif defined(__clang__)
  30759. "adcs r5, r7\n\t"
  30760. #else
  30761. "adc r5, r7\n\t"
  30762. #endif
  30763. #ifdef WOLFSSL_KEIL
  30764. "adcs r3, r3, %[r]\n\t"
  30765. #elif defined(__clang__)
  30766. "adcs r3, %[r]\n\t"
  30767. #else
  30768. "adc r3, %[r]\n\t"
  30769. #endif
  30770. "str r4, [sp, #4]\n\t"
  30771. "# A[2] * B[0]\n\t"
  30772. "movs r4, #0\n\t"
  30773. "mov %[a], r9\n\t"
  30774. "mov %[b], r10\n\t"
  30775. "ldr %[a], [%[a], #8]\n\t"
  30776. "ldr %[b], [%[b]]\n\t"
  30777. "uxth r6, %[a]\n\t"
  30778. "uxth r7, %[b]\n\t"
  30779. #ifdef WOLFSSL_KEIL
  30780. "muls r7, r6, r7\n\t"
  30781. #elif defined(__clang__)
  30782. "muls r7, r6\n\t"
  30783. #else
  30784. "mul r7, r6\n\t"
  30785. #endif
  30786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30787. "adds r5, r5, r7\n\t"
  30788. #else
  30789. "add r5, r5, r7\n\t"
  30790. #endif
  30791. #ifdef WOLFSSL_KEIL
  30792. "adcs r3, r3, %[r]\n\t"
  30793. #elif defined(__clang__)
  30794. "adcs r3, %[r]\n\t"
  30795. #else
  30796. "adc r3, %[r]\n\t"
  30797. #endif
  30798. #ifdef WOLFSSL_KEIL
  30799. "adcs r4, r4, %[r]\n\t"
  30800. #elif defined(__clang__)
  30801. "adcs r4, %[r]\n\t"
  30802. #else
  30803. "adc r4, %[r]\n\t"
  30804. #endif
  30805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30806. "lsrs r7, %[b], #16\n\t"
  30807. #else
  30808. "lsr r7, %[b], #16\n\t"
  30809. #endif
  30810. #ifdef WOLFSSL_KEIL
  30811. "muls r6, r7, r6\n\t"
  30812. #elif defined(__clang__)
  30813. "muls r6, r7\n\t"
  30814. #else
  30815. "mul r6, r7\n\t"
  30816. #endif
  30817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30818. "lsrs r7, r6, #16\n\t"
  30819. #else
  30820. "lsr r7, r6, #16\n\t"
  30821. #endif
  30822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30823. "lsls r6, r6, #16\n\t"
  30824. #else
  30825. "lsl r6, r6, #16\n\t"
  30826. #endif
  30827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30828. "adds r5, r5, r6\n\t"
  30829. #else
  30830. "add r5, r5, r6\n\t"
  30831. #endif
  30832. #ifdef WOLFSSL_KEIL
  30833. "adcs r3, r3, r7\n\t"
  30834. #elif defined(__clang__)
  30835. "adcs r3, r7\n\t"
  30836. #else
  30837. "adc r3, r7\n\t"
  30838. #endif
  30839. #ifdef WOLFSSL_KEIL
  30840. "adcs r4, r4, %[r]\n\t"
  30841. #elif defined(__clang__)
  30842. "adcs r4, %[r]\n\t"
  30843. #else
  30844. "adc r4, %[r]\n\t"
  30845. #endif
  30846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30847. "lsrs r6, %[a], #16\n\t"
  30848. #else
  30849. "lsr r6, %[a], #16\n\t"
  30850. #endif
  30851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30852. "lsrs r7, %[b], #16\n\t"
  30853. #else
  30854. "lsr r7, %[b], #16\n\t"
  30855. #endif
  30856. #ifdef WOLFSSL_KEIL
  30857. "muls r7, r6, r7\n\t"
  30858. #elif defined(__clang__)
  30859. "muls r7, r6\n\t"
  30860. #else
  30861. "mul r7, r6\n\t"
  30862. #endif
  30863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30864. "adds r3, r3, r7\n\t"
  30865. #else
  30866. "add r3, r3, r7\n\t"
  30867. #endif
  30868. #ifdef WOLFSSL_KEIL
  30869. "adcs r4, r4, %[r]\n\t"
  30870. #elif defined(__clang__)
  30871. "adcs r4, %[r]\n\t"
  30872. #else
  30873. "adc r4, %[r]\n\t"
  30874. #endif
  30875. "uxth r7, %[b]\n\t"
  30876. #ifdef WOLFSSL_KEIL
  30877. "muls r6, r7, r6\n\t"
  30878. #elif defined(__clang__)
  30879. "muls r6, r7\n\t"
  30880. #else
  30881. "mul r6, r7\n\t"
  30882. #endif
  30883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30884. "lsrs r7, r6, #16\n\t"
  30885. #else
  30886. "lsr r7, r6, #16\n\t"
  30887. #endif
  30888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30889. "lsls r6, r6, #16\n\t"
  30890. #else
  30891. "lsl r6, r6, #16\n\t"
  30892. #endif
  30893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30894. "adds r5, r5, r6\n\t"
  30895. #else
  30896. "add r5, r5, r6\n\t"
  30897. #endif
  30898. #ifdef WOLFSSL_KEIL
  30899. "adcs r3, r3, r7\n\t"
  30900. #elif defined(__clang__)
  30901. "adcs r3, r7\n\t"
  30902. #else
  30903. "adc r3, r7\n\t"
  30904. #endif
  30905. #ifdef WOLFSSL_KEIL
  30906. "adcs r4, r4, %[r]\n\t"
  30907. #elif defined(__clang__)
  30908. "adcs r4, %[r]\n\t"
  30909. #else
  30910. "adc r4, %[r]\n\t"
  30911. #endif
  30912. "# A[1] * B[1]\n\t"
  30913. "mov %[a], r9\n\t"
  30914. "mov %[b], r10\n\t"
  30915. "ldr %[a], [%[a], #4]\n\t"
  30916. "ldr %[b], [%[b], #4]\n\t"
  30917. "uxth r6, %[a]\n\t"
  30918. "uxth r7, %[b]\n\t"
  30919. #ifdef WOLFSSL_KEIL
  30920. "muls r7, r6, r7\n\t"
  30921. #elif defined(__clang__)
  30922. "muls r7, r6\n\t"
  30923. #else
  30924. "mul r7, r6\n\t"
  30925. #endif
  30926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30927. "adds r5, r5, r7\n\t"
  30928. #else
  30929. "add r5, r5, r7\n\t"
  30930. #endif
  30931. #ifdef WOLFSSL_KEIL
  30932. "adcs r3, r3, %[r]\n\t"
  30933. #elif defined(__clang__)
  30934. "adcs r3, %[r]\n\t"
  30935. #else
  30936. "adc r3, %[r]\n\t"
  30937. #endif
  30938. #ifdef WOLFSSL_KEIL
  30939. "adcs r4, r4, %[r]\n\t"
  30940. #elif defined(__clang__)
  30941. "adcs r4, %[r]\n\t"
  30942. #else
  30943. "adc r4, %[r]\n\t"
  30944. #endif
  30945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30946. "lsrs r7, %[b], #16\n\t"
  30947. #else
  30948. "lsr r7, %[b], #16\n\t"
  30949. #endif
  30950. #ifdef WOLFSSL_KEIL
  30951. "muls r6, r7, r6\n\t"
  30952. #elif defined(__clang__)
  30953. "muls r6, r7\n\t"
  30954. #else
  30955. "mul r6, r7\n\t"
  30956. #endif
  30957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30958. "lsrs r7, r6, #16\n\t"
  30959. #else
  30960. "lsr r7, r6, #16\n\t"
  30961. #endif
  30962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30963. "lsls r6, r6, #16\n\t"
  30964. #else
  30965. "lsl r6, r6, #16\n\t"
  30966. #endif
  30967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30968. "adds r5, r5, r6\n\t"
  30969. #else
  30970. "add r5, r5, r6\n\t"
  30971. #endif
  30972. #ifdef WOLFSSL_KEIL
  30973. "adcs r3, r3, r7\n\t"
  30974. #elif defined(__clang__)
  30975. "adcs r3, r7\n\t"
  30976. #else
  30977. "adc r3, r7\n\t"
  30978. #endif
  30979. #ifdef WOLFSSL_KEIL
  30980. "adcs r4, r4, %[r]\n\t"
  30981. #elif defined(__clang__)
  30982. "adcs r4, %[r]\n\t"
  30983. #else
  30984. "adc r4, %[r]\n\t"
  30985. #endif
  30986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30987. "lsrs r6, %[a], #16\n\t"
  30988. #else
  30989. "lsr r6, %[a], #16\n\t"
  30990. #endif
  30991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30992. "lsrs r7, %[b], #16\n\t"
  30993. #else
  30994. "lsr r7, %[b], #16\n\t"
  30995. #endif
  30996. #ifdef WOLFSSL_KEIL
  30997. "muls r7, r6, r7\n\t"
  30998. #elif defined(__clang__)
  30999. "muls r7, r6\n\t"
  31000. #else
  31001. "mul r7, r6\n\t"
  31002. #endif
  31003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31004. "adds r3, r3, r7\n\t"
  31005. #else
  31006. "add r3, r3, r7\n\t"
  31007. #endif
  31008. #ifdef WOLFSSL_KEIL
  31009. "adcs r4, r4, %[r]\n\t"
  31010. #elif defined(__clang__)
  31011. "adcs r4, %[r]\n\t"
  31012. #else
  31013. "adc r4, %[r]\n\t"
  31014. #endif
  31015. "uxth r7, %[b]\n\t"
  31016. #ifdef WOLFSSL_KEIL
  31017. "muls r6, r7, r6\n\t"
  31018. #elif defined(__clang__)
  31019. "muls r6, r7\n\t"
  31020. #else
  31021. "mul r6, r7\n\t"
  31022. #endif
  31023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31024. "lsrs r7, r6, #16\n\t"
  31025. #else
  31026. "lsr r7, r6, #16\n\t"
  31027. #endif
  31028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31029. "lsls r6, r6, #16\n\t"
  31030. #else
  31031. "lsl r6, r6, #16\n\t"
  31032. #endif
  31033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31034. "adds r5, r5, r6\n\t"
  31035. #else
  31036. "add r5, r5, r6\n\t"
  31037. #endif
  31038. #ifdef WOLFSSL_KEIL
  31039. "adcs r3, r3, r7\n\t"
  31040. #elif defined(__clang__)
  31041. "adcs r3, r7\n\t"
  31042. #else
  31043. "adc r3, r7\n\t"
  31044. #endif
  31045. #ifdef WOLFSSL_KEIL
  31046. "adcs r4, r4, %[r]\n\t"
  31047. #elif defined(__clang__)
  31048. "adcs r4, %[r]\n\t"
  31049. #else
  31050. "adc r4, %[r]\n\t"
  31051. #endif
  31052. "# A[0] * B[2]\n\t"
  31053. "mov %[a], r9\n\t"
  31054. "mov %[b], r10\n\t"
  31055. "ldr %[a], [%[a]]\n\t"
  31056. "ldr %[b], [%[b], #8]\n\t"
  31057. "uxth r6, %[a]\n\t"
  31058. "uxth r7, %[b]\n\t"
  31059. #ifdef WOLFSSL_KEIL
  31060. "muls r7, r6, r7\n\t"
  31061. #elif defined(__clang__)
  31062. "muls r7, r6\n\t"
  31063. #else
  31064. "mul r7, r6\n\t"
  31065. #endif
  31066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31067. "adds r5, r5, r7\n\t"
  31068. #else
  31069. "add r5, r5, r7\n\t"
  31070. #endif
  31071. #ifdef WOLFSSL_KEIL
  31072. "adcs r3, r3, %[r]\n\t"
  31073. #elif defined(__clang__)
  31074. "adcs r3, %[r]\n\t"
  31075. #else
  31076. "adc r3, %[r]\n\t"
  31077. #endif
  31078. #ifdef WOLFSSL_KEIL
  31079. "adcs r4, r4, %[r]\n\t"
  31080. #elif defined(__clang__)
  31081. "adcs r4, %[r]\n\t"
  31082. #else
  31083. "adc r4, %[r]\n\t"
  31084. #endif
  31085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31086. "lsrs r7, %[b], #16\n\t"
  31087. #else
  31088. "lsr r7, %[b], #16\n\t"
  31089. #endif
  31090. #ifdef WOLFSSL_KEIL
  31091. "muls r6, r7, r6\n\t"
  31092. #elif defined(__clang__)
  31093. "muls r6, r7\n\t"
  31094. #else
  31095. "mul r6, r7\n\t"
  31096. #endif
  31097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31098. "lsrs r7, r6, #16\n\t"
  31099. #else
  31100. "lsr r7, r6, #16\n\t"
  31101. #endif
  31102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31103. "lsls r6, r6, #16\n\t"
  31104. #else
  31105. "lsl r6, r6, #16\n\t"
  31106. #endif
  31107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31108. "adds r5, r5, r6\n\t"
  31109. #else
  31110. "add r5, r5, r6\n\t"
  31111. #endif
  31112. #ifdef WOLFSSL_KEIL
  31113. "adcs r3, r3, r7\n\t"
  31114. #elif defined(__clang__)
  31115. "adcs r3, r7\n\t"
  31116. #else
  31117. "adc r3, r7\n\t"
  31118. #endif
  31119. #ifdef WOLFSSL_KEIL
  31120. "adcs r4, r4, %[r]\n\t"
  31121. #elif defined(__clang__)
  31122. "adcs r4, %[r]\n\t"
  31123. #else
  31124. "adc r4, %[r]\n\t"
  31125. #endif
  31126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31127. "lsrs r6, %[a], #16\n\t"
  31128. #else
  31129. "lsr r6, %[a], #16\n\t"
  31130. #endif
  31131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31132. "lsrs r7, %[b], #16\n\t"
  31133. #else
  31134. "lsr r7, %[b], #16\n\t"
  31135. #endif
  31136. #ifdef WOLFSSL_KEIL
  31137. "muls r7, r6, r7\n\t"
  31138. #elif defined(__clang__)
  31139. "muls r7, r6\n\t"
  31140. #else
  31141. "mul r7, r6\n\t"
  31142. #endif
  31143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31144. "adds r3, r3, r7\n\t"
  31145. #else
  31146. "add r3, r3, r7\n\t"
  31147. #endif
  31148. #ifdef WOLFSSL_KEIL
  31149. "adcs r4, r4, %[r]\n\t"
  31150. #elif defined(__clang__)
  31151. "adcs r4, %[r]\n\t"
  31152. #else
  31153. "adc r4, %[r]\n\t"
  31154. #endif
  31155. "uxth r7, %[b]\n\t"
  31156. #ifdef WOLFSSL_KEIL
  31157. "muls r6, r7, r6\n\t"
  31158. #elif defined(__clang__)
  31159. "muls r6, r7\n\t"
  31160. #else
  31161. "mul r6, r7\n\t"
  31162. #endif
  31163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31164. "lsrs r7, r6, #16\n\t"
  31165. #else
  31166. "lsr r7, r6, #16\n\t"
  31167. #endif
  31168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31169. "lsls r6, r6, #16\n\t"
  31170. #else
  31171. "lsl r6, r6, #16\n\t"
  31172. #endif
  31173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31174. "adds r5, r5, r6\n\t"
  31175. #else
  31176. "add r5, r5, r6\n\t"
  31177. #endif
  31178. #ifdef WOLFSSL_KEIL
  31179. "adcs r3, r3, r7\n\t"
  31180. #elif defined(__clang__)
  31181. "adcs r3, r7\n\t"
  31182. #else
  31183. "adc r3, r7\n\t"
  31184. #endif
  31185. #ifdef WOLFSSL_KEIL
  31186. "adcs r4, r4, %[r]\n\t"
  31187. #elif defined(__clang__)
  31188. "adcs r4, %[r]\n\t"
  31189. #else
  31190. "adc r4, %[r]\n\t"
  31191. #endif
  31192. "str r5, [sp, #8]\n\t"
  31193. "# A[0] * B[3]\n\t"
  31194. "movs r5, #0\n\t"
  31195. "mov %[a], r9\n\t"
  31196. "mov %[b], r10\n\t"
  31197. "ldr %[a], [%[a]]\n\t"
  31198. "ldr %[b], [%[b], #12]\n\t"
  31199. "uxth r6, %[a]\n\t"
  31200. "uxth r7, %[b]\n\t"
  31201. #ifdef WOLFSSL_KEIL
  31202. "muls r7, r6, r7\n\t"
  31203. #elif defined(__clang__)
  31204. "muls r7, r6\n\t"
  31205. #else
  31206. "mul r7, r6\n\t"
  31207. #endif
  31208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31209. "adds r3, r3, r7\n\t"
  31210. #else
  31211. "add r3, r3, r7\n\t"
  31212. #endif
  31213. #ifdef WOLFSSL_KEIL
  31214. "adcs r4, r4, %[r]\n\t"
  31215. #elif defined(__clang__)
  31216. "adcs r4, %[r]\n\t"
  31217. #else
  31218. "adc r4, %[r]\n\t"
  31219. #endif
  31220. #ifdef WOLFSSL_KEIL
  31221. "adcs r5, r5, %[r]\n\t"
  31222. #elif defined(__clang__)
  31223. "adcs r5, %[r]\n\t"
  31224. #else
  31225. "adc r5, %[r]\n\t"
  31226. #endif
  31227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31228. "lsrs r7, %[b], #16\n\t"
  31229. #else
  31230. "lsr r7, %[b], #16\n\t"
  31231. #endif
  31232. #ifdef WOLFSSL_KEIL
  31233. "muls r6, r7, r6\n\t"
  31234. #elif defined(__clang__)
  31235. "muls r6, r7\n\t"
  31236. #else
  31237. "mul r6, r7\n\t"
  31238. #endif
  31239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31240. "lsrs r7, r6, #16\n\t"
  31241. #else
  31242. "lsr r7, r6, #16\n\t"
  31243. #endif
  31244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31245. "lsls r6, r6, #16\n\t"
  31246. #else
  31247. "lsl r6, r6, #16\n\t"
  31248. #endif
  31249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31250. "adds r3, r3, r6\n\t"
  31251. #else
  31252. "add r3, r3, r6\n\t"
  31253. #endif
  31254. #ifdef WOLFSSL_KEIL
  31255. "adcs r4, r4, r7\n\t"
  31256. #elif defined(__clang__)
  31257. "adcs r4, r7\n\t"
  31258. #else
  31259. "adc r4, r7\n\t"
  31260. #endif
  31261. #ifdef WOLFSSL_KEIL
  31262. "adcs r5, r5, %[r]\n\t"
  31263. #elif defined(__clang__)
  31264. "adcs r5, %[r]\n\t"
  31265. #else
  31266. "adc r5, %[r]\n\t"
  31267. #endif
  31268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31269. "lsrs r6, %[a], #16\n\t"
  31270. #else
  31271. "lsr r6, %[a], #16\n\t"
  31272. #endif
  31273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31274. "lsrs r7, %[b], #16\n\t"
  31275. #else
  31276. "lsr r7, %[b], #16\n\t"
  31277. #endif
  31278. #ifdef WOLFSSL_KEIL
  31279. "muls r7, r6, r7\n\t"
  31280. #elif defined(__clang__)
  31281. "muls r7, r6\n\t"
  31282. #else
  31283. "mul r7, r6\n\t"
  31284. #endif
  31285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31286. "adds r4, r4, r7\n\t"
  31287. #else
  31288. "add r4, r4, r7\n\t"
  31289. #endif
  31290. #ifdef WOLFSSL_KEIL
  31291. "adcs r5, r5, %[r]\n\t"
  31292. #elif defined(__clang__)
  31293. "adcs r5, %[r]\n\t"
  31294. #else
  31295. "adc r5, %[r]\n\t"
  31296. #endif
  31297. "uxth r7, %[b]\n\t"
  31298. #ifdef WOLFSSL_KEIL
  31299. "muls r6, r7, r6\n\t"
  31300. #elif defined(__clang__)
  31301. "muls r6, r7\n\t"
  31302. #else
  31303. "mul r6, r7\n\t"
  31304. #endif
  31305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31306. "lsrs r7, r6, #16\n\t"
  31307. #else
  31308. "lsr r7, r6, #16\n\t"
  31309. #endif
  31310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31311. "lsls r6, r6, #16\n\t"
  31312. #else
  31313. "lsl r6, r6, #16\n\t"
  31314. #endif
  31315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31316. "adds r3, r3, r6\n\t"
  31317. #else
  31318. "add r3, r3, r6\n\t"
  31319. #endif
  31320. #ifdef WOLFSSL_KEIL
  31321. "adcs r4, r4, r7\n\t"
  31322. #elif defined(__clang__)
  31323. "adcs r4, r7\n\t"
  31324. #else
  31325. "adc r4, r7\n\t"
  31326. #endif
  31327. #ifdef WOLFSSL_KEIL
  31328. "adcs r5, r5, %[r]\n\t"
  31329. #elif defined(__clang__)
  31330. "adcs r5, %[r]\n\t"
  31331. #else
  31332. "adc r5, %[r]\n\t"
  31333. #endif
  31334. "# A[1] * B[2]\n\t"
  31335. "mov %[a], r9\n\t"
  31336. "mov %[b], r10\n\t"
  31337. "ldr %[a], [%[a], #4]\n\t"
  31338. "ldr %[b], [%[b], #8]\n\t"
  31339. "uxth r6, %[a]\n\t"
  31340. "uxth r7, %[b]\n\t"
  31341. #ifdef WOLFSSL_KEIL
  31342. "muls r7, r6, r7\n\t"
  31343. #elif defined(__clang__)
  31344. "muls r7, r6\n\t"
  31345. #else
  31346. "mul r7, r6\n\t"
  31347. #endif
  31348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31349. "adds r3, r3, r7\n\t"
  31350. #else
  31351. "add r3, r3, r7\n\t"
  31352. #endif
  31353. #ifdef WOLFSSL_KEIL
  31354. "adcs r4, r4, %[r]\n\t"
  31355. #elif defined(__clang__)
  31356. "adcs r4, %[r]\n\t"
  31357. #else
  31358. "adc r4, %[r]\n\t"
  31359. #endif
  31360. #ifdef WOLFSSL_KEIL
  31361. "adcs r5, r5, %[r]\n\t"
  31362. #elif defined(__clang__)
  31363. "adcs r5, %[r]\n\t"
  31364. #else
  31365. "adc r5, %[r]\n\t"
  31366. #endif
  31367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31368. "lsrs r7, %[b], #16\n\t"
  31369. #else
  31370. "lsr r7, %[b], #16\n\t"
  31371. #endif
  31372. #ifdef WOLFSSL_KEIL
  31373. "muls r6, r7, r6\n\t"
  31374. #elif defined(__clang__)
  31375. "muls r6, r7\n\t"
  31376. #else
  31377. "mul r6, r7\n\t"
  31378. #endif
  31379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31380. "lsrs r7, r6, #16\n\t"
  31381. #else
  31382. "lsr r7, r6, #16\n\t"
  31383. #endif
  31384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31385. "lsls r6, r6, #16\n\t"
  31386. #else
  31387. "lsl r6, r6, #16\n\t"
  31388. #endif
  31389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31390. "adds r3, r3, r6\n\t"
  31391. #else
  31392. "add r3, r3, r6\n\t"
  31393. #endif
  31394. #ifdef WOLFSSL_KEIL
  31395. "adcs r4, r4, r7\n\t"
  31396. #elif defined(__clang__)
  31397. "adcs r4, r7\n\t"
  31398. #else
  31399. "adc r4, r7\n\t"
  31400. #endif
  31401. #ifdef WOLFSSL_KEIL
  31402. "adcs r5, r5, %[r]\n\t"
  31403. #elif defined(__clang__)
  31404. "adcs r5, %[r]\n\t"
  31405. #else
  31406. "adc r5, %[r]\n\t"
  31407. #endif
  31408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31409. "lsrs r6, %[a], #16\n\t"
  31410. #else
  31411. "lsr r6, %[a], #16\n\t"
  31412. #endif
  31413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31414. "lsrs r7, %[b], #16\n\t"
  31415. #else
  31416. "lsr r7, %[b], #16\n\t"
  31417. #endif
  31418. #ifdef WOLFSSL_KEIL
  31419. "muls r7, r6, r7\n\t"
  31420. #elif defined(__clang__)
  31421. "muls r7, r6\n\t"
  31422. #else
  31423. "mul r7, r6\n\t"
  31424. #endif
  31425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31426. "adds r4, r4, r7\n\t"
  31427. #else
  31428. "add r4, r4, r7\n\t"
  31429. #endif
  31430. #ifdef WOLFSSL_KEIL
  31431. "adcs r5, r5, %[r]\n\t"
  31432. #elif defined(__clang__)
  31433. "adcs r5, %[r]\n\t"
  31434. #else
  31435. "adc r5, %[r]\n\t"
  31436. #endif
  31437. "uxth r7, %[b]\n\t"
  31438. #ifdef WOLFSSL_KEIL
  31439. "muls r6, r7, r6\n\t"
  31440. #elif defined(__clang__)
  31441. "muls r6, r7\n\t"
  31442. #else
  31443. "mul r6, r7\n\t"
  31444. #endif
  31445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31446. "lsrs r7, r6, #16\n\t"
  31447. #else
  31448. "lsr r7, r6, #16\n\t"
  31449. #endif
  31450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31451. "lsls r6, r6, #16\n\t"
  31452. #else
  31453. "lsl r6, r6, #16\n\t"
  31454. #endif
  31455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31456. "adds r3, r3, r6\n\t"
  31457. #else
  31458. "add r3, r3, r6\n\t"
  31459. #endif
  31460. #ifdef WOLFSSL_KEIL
  31461. "adcs r4, r4, r7\n\t"
  31462. #elif defined(__clang__)
  31463. "adcs r4, r7\n\t"
  31464. #else
  31465. "adc r4, r7\n\t"
  31466. #endif
  31467. #ifdef WOLFSSL_KEIL
  31468. "adcs r5, r5, %[r]\n\t"
  31469. #elif defined(__clang__)
  31470. "adcs r5, %[r]\n\t"
  31471. #else
  31472. "adc r5, %[r]\n\t"
  31473. #endif
  31474. "# A[2] * B[1]\n\t"
  31475. "mov %[a], r9\n\t"
  31476. "mov %[b], r10\n\t"
  31477. "ldr %[a], [%[a], #8]\n\t"
  31478. "ldr %[b], [%[b], #4]\n\t"
  31479. "uxth r6, %[a]\n\t"
  31480. "uxth r7, %[b]\n\t"
  31481. #ifdef WOLFSSL_KEIL
  31482. "muls r7, r6, r7\n\t"
  31483. #elif defined(__clang__)
  31484. "muls r7, r6\n\t"
  31485. #else
  31486. "mul r7, r6\n\t"
  31487. #endif
  31488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31489. "adds r3, r3, r7\n\t"
  31490. #else
  31491. "add r3, r3, r7\n\t"
  31492. #endif
  31493. #ifdef WOLFSSL_KEIL
  31494. "adcs r4, r4, %[r]\n\t"
  31495. #elif defined(__clang__)
  31496. "adcs r4, %[r]\n\t"
  31497. #else
  31498. "adc r4, %[r]\n\t"
  31499. #endif
  31500. #ifdef WOLFSSL_KEIL
  31501. "adcs r5, r5, %[r]\n\t"
  31502. #elif defined(__clang__)
  31503. "adcs r5, %[r]\n\t"
  31504. #else
  31505. "adc r5, %[r]\n\t"
  31506. #endif
  31507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31508. "lsrs r7, %[b], #16\n\t"
  31509. #else
  31510. "lsr r7, %[b], #16\n\t"
  31511. #endif
  31512. #ifdef WOLFSSL_KEIL
  31513. "muls r6, r7, r6\n\t"
  31514. #elif defined(__clang__)
  31515. "muls r6, r7\n\t"
  31516. #else
  31517. "mul r6, r7\n\t"
  31518. #endif
  31519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31520. "lsrs r7, r6, #16\n\t"
  31521. #else
  31522. "lsr r7, r6, #16\n\t"
  31523. #endif
  31524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31525. "lsls r6, r6, #16\n\t"
  31526. #else
  31527. "lsl r6, r6, #16\n\t"
  31528. #endif
  31529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31530. "adds r3, r3, r6\n\t"
  31531. #else
  31532. "add r3, r3, r6\n\t"
  31533. #endif
  31534. #ifdef WOLFSSL_KEIL
  31535. "adcs r4, r4, r7\n\t"
  31536. #elif defined(__clang__)
  31537. "adcs r4, r7\n\t"
  31538. #else
  31539. "adc r4, r7\n\t"
  31540. #endif
  31541. #ifdef WOLFSSL_KEIL
  31542. "adcs r5, r5, %[r]\n\t"
  31543. #elif defined(__clang__)
  31544. "adcs r5, %[r]\n\t"
  31545. #else
  31546. "adc r5, %[r]\n\t"
  31547. #endif
  31548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31549. "lsrs r6, %[a], #16\n\t"
  31550. #else
  31551. "lsr r6, %[a], #16\n\t"
  31552. #endif
  31553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31554. "lsrs r7, %[b], #16\n\t"
  31555. #else
  31556. "lsr r7, %[b], #16\n\t"
  31557. #endif
  31558. #ifdef WOLFSSL_KEIL
  31559. "muls r7, r6, r7\n\t"
  31560. #elif defined(__clang__)
  31561. "muls r7, r6\n\t"
  31562. #else
  31563. "mul r7, r6\n\t"
  31564. #endif
  31565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31566. "adds r4, r4, r7\n\t"
  31567. #else
  31568. "add r4, r4, r7\n\t"
  31569. #endif
  31570. #ifdef WOLFSSL_KEIL
  31571. "adcs r5, r5, %[r]\n\t"
  31572. #elif defined(__clang__)
  31573. "adcs r5, %[r]\n\t"
  31574. #else
  31575. "adc r5, %[r]\n\t"
  31576. #endif
  31577. "uxth r7, %[b]\n\t"
  31578. #ifdef WOLFSSL_KEIL
  31579. "muls r6, r7, r6\n\t"
  31580. #elif defined(__clang__)
  31581. "muls r6, r7\n\t"
  31582. #else
  31583. "mul r6, r7\n\t"
  31584. #endif
  31585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31586. "lsrs r7, r6, #16\n\t"
  31587. #else
  31588. "lsr r7, r6, #16\n\t"
  31589. #endif
  31590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31591. "lsls r6, r6, #16\n\t"
  31592. #else
  31593. "lsl r6, r6, #16\n\t"
  31594. #endif
  31595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31596. "adds r3, r3, r6\n\t"
  31597. #else
  31598. "add r3, r3, r6\n\t"
  31599. #endif
  31600. #ifdef WOLFSSL_KEIL
  31601. "adcs r4, r4, r7\n\t"
  31602. #elif defined(__clang__)
  31603. "adcs r4, r7\n\t"
  31604. #else
  31605. "adc r4, r7\n\t"
  31606. #endif
  31607. #ifdef WOLFSSL_KEIL
  31608. "adcs r5, r5, %[r]\n\t"
  31609. #elif defined(__clang__)
  31610. "adcs r5, %[r]\n\t"
  31611. #else
  31612. "adc r5, %[r]\n\t"
  31613. #endif
  31614. "# A[3] * B[0]\n\t"
  31615. "mov %[a], r9\n\t"
  31616. "mov %[b], r10\n\t"
  31617. "ldr %[a], [%[a], #12]\n\t"
  31618. "ldr %[b], [%[b]]\n\t"
  31619. "uxth r6, %[a]\n\t"
  31620. "uxth r7, %[b]\n\t"
  31621. #ifdef WOLFSSL_KEIL
  31622. "muls r7, r6, r7\n\t"
  31623. #elif defined(__clang__)
  31624. "muls r7, r6\n\t"
  31625. #else
  31626. "mul r7, r6\n\t"
  31627. #endif
  31628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31629. "adds r3, r3, r7\n\t"
  31630. #else
  31631. "add r3, r3, r7\n\t"
  31632. #endif
  31633. #ifdef WOLFSSL_KEIL
  31634. "adcs r4, r4, %[r]\n\t"
  31635. #elif defined(__clang__)
  31636. "adcs r4, %[r]\n\t"
  31637. #else
  31638. "adc r4, %[r]\n\t"
  31639. #endif
  31640. #ifdef WOLFSSL_KEIL
  31641. "adcs r5, r5, %[r]\n\t"
  31642. #elif defined(__clang__)
  31643. "adcs r5, %[r]\n\t"
  31644. #else
  31645. "adc r5, %[r]\n\t"
  31646. #endif
  31647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31648. "lsrs r7, %[b], #16\n\t"
  31649. #else
  31650. "lsr r7, %[b], #16\n\t"
  31651. #endif
  31652. #ifdef WOLFSSL_KEIL
  31653. "muls r6, r7, r6\n\t"
  31654. #elif defined(__clang__)
  31655. "muls r6, r7\n\t"
  31656. #else
  31657. "mul r6, r7\n\t"
  31658. #endif
  31659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31660. "lsrs r7, r6, #16\n\t"
  31661. #else
  31662. "lsr r7, r6, #16\n\t"
  31663. #endif
  31664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31665. "lsls r6, r6, #16\n\t"
  31666. #else
  31667. "lsl r6, r6, #16\n\t"
  31668. #endif
  31669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31670. "adds r3, r3, r6\n\t"
  31671. #else
  31672. "add r3, r3, r6\n\t"
  31673. #endif
  31674. #ifdef WOLFSSL_KEIL
  31675. "adcs r4, r4, r7\n\t"
  31676. #elif defined(__clang__)
  31677. "adcs r4, r7\n\t"
  31678. #else
  31679. "adc r4, r7\n\t"
  31680. #endif
  31681. #ifdef WOLFSSL_KEIL
  31682. "adcs r5, r5, %[r]\n\t"
  31683. #elif defined(__clang__)
  31684. "adcs r5, %[r]\n\t"
  31685. #else
  31686. "adc r5, %[r]\n\t"
  31687. #endif
  31688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31689. "lsrs r6, %[a], #16\n\t"
  31690. #else
  31691. "lsr r6, %[a], #16\n\t"
  31692. #endif
  31693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31694. "lsrs r7, %[b], #16\n\t"
  31695. #else
  31696. "lsr r7, %[b], #16\n\t"
  31697. #endif
  31698. #ifdef WOLFSSL_KEIL
  31699. "muls r7, r6, r7\n\t"
  31700. #elif defined(__clang__)
  31701. "muls r7, r6\n\t"
  31702. #else
  31703. "mul r7, r6\n\t"
  31704. #endif
  31705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31706. "adds r4, r4, r7\n\t"
  31707. #else
  31708. "add r4, r4, r7\n\t"
  31709. #endif
  31710. #ifdef WOLFSSL_KEIL
  31711. "adcs r5, r5, %[r]\n\t"
  31712. #elif defined(__clang__)
  31713. "adcs r5, %[r]\n\t"
  31714. #else
  31715. "adc r5, %[r]\n\t"
  31716. #endif
  31717. "uxth r7, %[b]\n\t"
  31718. #ifdef WOLFSSL_KEIL
  31719. "muls r6, r7, r6\n\t"
  31720. #elif defined(__clang__)
  31721. "muls r6, r7\n\t"
  31722. #else
  31723. "mul r6, r7\n\t"
  31724. #endif
  31725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31726. "lsrs r7, r6, #16\n\t"
  31727. #else
  31728. "lsr r7, r6, #16\n\t"
  31729. #endif
  31730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31731. "lsls r6, r6, #16\n\t"
  31732. #else
  31733. "lsl r6, r6, #16\n\t"
  31734. #endif
  31735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31736. "adds r3, r3, r6\n\t"
  31737. #else
  31738. "add r3, r3, r6\n\t"
  31739. #endif
  31740. #ifdef WOLFSSL_KEIL
  31741. "adcs r4, r4, r7\n\t"
  31742. #elif defined(__clang__)
  31743. "adcs r4, r7\n\t"
  31744. #else
  31745. "adc r4, r7\n\t"
  31746. #endif
  31747. #ifdef WOLFSSL_KEIL
  31748. "adcs r5, r5, %[r]\n\t"
  31749. #elif defined(__clang__)
  31750. "adcs r5, %[r]\n\t"
  31751. #else
  31752. "adc r5, %[r]\n\t"
  31753. #endif
  31754. "str r3, [sp, #12]\n\t"
  31755. "# A[4] * B[0]\n\t"
  31756. "movs r3, #0\n\t"
  31757. "mov %[a], r9\n\t"
  31758. "mov %[b], r10\n\t"
  31759. "ldr %[a], [%[a], #16]\n\t"
  31760. "ldr %[b], [%[b]]\n\t"
  31761. "uxth r6, %[a]\n\t"
  31762. "uxth r7, %[b]\n\t"
  31763. #ifdef WOLFSSL_KEIL
  31764. "muls r7, r6, r7\n\t"
  31765. #elif defined(__clang__)
  31766. "muls r7, r6\n\t"
  31767. #else
  31768. "mul r7, r6\n\t"
  31769. #endif
  31770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31771. "adds r4, r4, r7\n\t"
  31772. #else
  31773. "add r4, r4, r7\n\t"
  31774. #endif
  31775. #ifdef WOLFSSL_KEIL
  31776. "adcs r5, r5, %[r]\n\t"
  31777. #elif defined(__clang__)
  31778. "adcs r5, %[r]\n\t"
  31779. #else
  31780. "adc r5, %[r]\n\t"
  31781. #endif
  31782. #ifdef WOLFSSL_KEIL
  31783. "adcs r3, r3, %[r]\n\t"
  31784. #elif defined(__clang__)
  31785. "adcs r3, %[r]\n\t"
  31786. #else
  31787. "adc r3, %[r]\n\t"
  31788. #endif
  31789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31790. "lsrs r7, %[b], #16\n\t"
  31791. #else
  31792. "lsr r7, %[b], #16\n\t"
  31793. #endif
  31794. #ifdef WOLFSSL_KEIL
  31795. "muls r6, r7, r6\n\t"
  31796. #elif defined(__clang__)
  31797. "muls r6, r7\n\t"
  31798. #else
  31799. "mul r6, r7\n\t"
  31800. #endif
  31801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31802. "lsrs r7, r6, #16\n\t"
  31803. #else
  31804. "lsr r7, r6, #16\n\t"
  31805. #endif
  31806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31807. "lsls r6, r6, #16\n\t"
  31808. #else
  31809. "lsl r6, r6, #16\n\t"
  31810. #endif
  31811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31812. "adds r4, r4, r6\n\t"
  31813. #else
  31814. "add r4, r4, r6\n\t"
  31815. #endif
  31816. #ifdef WOLFSSL_KEIL
  31817. "adcs r5, r5, r7\n\t"
  31818. #elif defined(__clang__)
  31819. "adcs r5, r7\n\t"
  31820. #else
  31821. "adc r5, r7\n\t"
  31822. #endif
  31823. #ifdef WOLFSSL_KEIL
  31824. "adcs r3, r3, %[r]\n\t"
  31825. #elif defined(__clang__)
  31826. "adcs r3, %[r]\n\t"
  31827. #else
  31828. "adc r3, %[r]\n\t"
  31829. #endif
  31830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31831. "lsrs r6, %[a], #16\n\t"
  31832. #else
  31833. "lsr r6, %[a], #16\n\t"
  31834. #endif
  31835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31836. "lsrs r7, %[b], #16\n\t"
  31837. #else
  31838. "lsr r7, %[b], #16\n\t"
  31839. #endif
  31840. #ifdef WOLFSSL_KEIL
  31841. "muls r7, r6, r7\n\t"
  31842. #elif defined(__clang__)
  31843. "muls r7, r6\n\t"
  31844. #else
  31845. "mul r7, r6\n\t"
  31846. #endif
  31847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31848. "adds r5, r5, r7\n\t"
  31849. #else
  31850. "add r5, r5, r7\n\t"
  31851. #endif
  31852. #ifdef WOLFSSL_KEIL
  31853. "adcs r3, r3, %[r]\n\t"
  31854. #elif defined(__clang__)
  31855. "adcs r3, %[r]\n\t"
  31856. #else
  31857. "adc r3, %[r]\n\t"
  31858. #endif
  31859. "uxth r7, %[b]\n\t"
  31860. #ifdef WOLFSSL_KEIL
  31861. "muls r6, r7, r6\n\t"
  31862. #elif defined(__clang__)
  31863. "muls r6, r7\n\t"
  31864. #else
  31865. "mul r6, r7\n\t"
  31866. #endif
  31867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31868. "lsrs r7, r6, #16\n\t"
  31869. #else
  31870. "lsr r7, r6, #16\n\t"
  31871. #endif
  31872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31873. "lsls r6, r6, #16\n\t"
  31874. #else
  31875. "lsl r6, r6, #16\n\t"
  31876. #endif
  31877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31878. "adds r4, r4, r6\n\t"
  31879. #else
  31880. "add r4, r4, r6\n\t"
  31881. #endif
  31882. #ifdef WOLFSSL_KEIL
  31883. "adcs r5, r5, r7\n\t"
  31884. #elif defined(__clang__)
  31885. "adcs r5, r7\n\t"
  31886. #else
  31887. "adc r5, r7\n\t"
  31888. #endif
  31889. #ifdef WOLFSSL_KEIL
  31890. "adcs r3, r3, %[r]\n\t"
  31891. #elif defined(__clang__)
  31892. "adcs r3, %[r]\n\t"
  31893. #else
  31894. "adc r3, %[r]\n\t"
  31895. #endif
  31896. "# A[3] * B[1]\n\t"
  31897. "mov %[a], r9\n\t"
  31898. "mov %[b], r10\n\t"
  31899. "ldr %[a], [%[a], #12]\n\t"
  31900. "ldr %[b], [%[b], #4]\n\t"
  31901. "uxth r6, %[a]\n\t"
  31902. "uxth r7, %[b]\n\t"
  31903. #ifdef WOLFSSL_KEIL
  31904. "muls r7, r6, r7\n\t"
  31905. #elif defined(__clang__)
  31906. "muls r7, r6\n\t"
  31907. #else
  31908. "mul r7, r6\n\t"
  31909. #endif
  31910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31911. "adds r4, r4, r7\n\t"
  31912. #else
  31913. "add r4, r4, r7\n\t"
  31914. #endif
  31915. #ifdef WOLFSSL_KEIL
  31916. "adcs r5, r5, %[r]\n\t"
  31917. #elif defined(__clang__)
  31918. "adcs r5, %[r]\n\t"
  31919. #else
  31920. "adc r5, %[r]\n\t"
  31921. #endif
  31922. #ifdef WOLFSSL_KEIL
  31923. "adcs r3, r3, %[r]\n\t"
  31924. #elif defined(__clang__)
  31925. "adcs r3, %[r]\n\t"
  31926. #else
  31927. "adc r3, %[r]\n\t"
  31928. #endif
  31929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31930. "lsrs r7, %[b], #16\n\t"
  31931. #else
  31932. "lsr r7, %[b], #16\n\t"
  31933. #endif
  31934. #ifdef WOLFSSL_KEIL
  31935. "muls r6, r7, r6\n\t"
  31936. #elif defined(__clang__)
  31937. "muls r6, r7\n\t"
  31938. #else
  31939. "mul r6, r7\n\t"
  31940. #endif
  31941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31942. "lsrs r7, r6, #16\n\t"
  31943. #else
  31944. "lsr r7, r6, #16\n\t"
  31945. #endif
  31946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31947. "lsls r6, r6, #16\n\t"
  31948. #else
  31949. "lsl r6, r6, #16\n\t"
  31950. #endif
  31951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31952. "adds r4, r4, r6\n\t"
  31953. #else
  31954. "add r4, r4, r6\n\t"
  31955. #endif
  31956. #ifdef WOLFSSL_KEIL
  31957. "adcs r5, r5, r7\n\t"
  31958. #elif defined(__clang__)
  31959. "adcs r5, r7\n\t"
  31960. #else
  31961. "adc r5, r7\n\t"
  31962. #endif
  31963. #ifdef WOLFSSL_KEIL
  31964. "adcs r3, r3, %[r]\n\t"
  31965. #elif defined(__clang__)
  31966. "adcs r3, %[r]\n\t"
  31967. #else
  31968. "adc r3, %[r]\n\t"
  31969. #endif
  31970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31971. "lsrs r6, %[a], #16\n\t"
  31972. #else
  31973. "lsr r6, %[a], #16\n\t"
  31974. #endif
  31975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31976. "lsrs r7, %[b], #16\n\t"
  31977. #else
  31978. "lsr r7, %[b], #16\n\t"
  31979. #endif
  31980. #ifdef WOLFSSL_KEIL
  31981. "muls r7, r6, r7\n\t"
  31982. #elif defined(__clang__)
  31983. "muls r7, r6\n\t"
  31984. #else
  31985. "mul r7, r6\n\t"
  31986. #endif
  31987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31988. "adds r5, r5, r7\n\t"
  31989. #else
  31990. "add r5, r5, r7\n\t"
  31991. #endif
  31992. #ifdef WOLFSSL_KEIL
  31993. "adcs r3, r3, %[r]\n\t"
  31994. #elif defined(__clang__)
  31995. "adcs r3, %[r]\n\t"
  31996. #else
  31997. "adc r3, %[r]\n\t"
  31998. #endif
  31999. "uxth r7, %[b]\n\t"
  32000. #ifdef WOLFSSL_KEIL
  32001. "muls r6, r7, r6\n\t"
  32002. #elif defined(__clang__)
  32003. "muls r6, r7\n\t"
  32004. #else
  32005. "mul r6, r7\n\t"
  32006. #endif
  32007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32008. "lsrs r7, r6, #16\n\t"
  32009. #else
  32010. "lsr r7, r6, #16\n\t"
  32011. #endif
  32012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32013. "lsls r6, r6, #16\n\t"
  32014. #else
  32015. "lsl r6, r6, #16\n\t"
  32016. #endif
  32017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32018. "adds r4, r4, r6\n\t"
  32019. #else
  32020. "add r4, r4, r6\n\t"
  32021. #endif
  32022. #ifdef WOLFSSL_KEIL
  32023. "adcs r5, r5, r7\n\t"
  32024. #elif defined(__clang__)
  32025. "adcs r5, r7\n\t"
  32026. #else
  32027. "adc r5, r7\n\t"
  32028. #endif
  32029. #ifdef WOLFSSL_KEIL
  32030. "adcs r3, r3, %[r]\n\t"
  32031. #elif defined(__clang__)
  32032. "adcs r3, %[r]\n\t"
  32033. #else
  32034. "adc r3, %[r]\n\t"
  32035. #endif
  32036. "# A[2] * B[2]\n\t"
  32037. "mov %[a], r9\n\t"
  32038. "mov %[b], r10\n\t"
  32039. "ldr %[a], [%[a], #8]\n\t"
  32040. "ldr %[b], [%[b], #8]\n\t"
  32041. "uxth r6, %[a]\n\t"
  32042. "uxth r7, %[b]\n\t"
  32043. #ifdef WOLFSSL_KEIL
  32044. "muls r7, r6, r7\n\t"
  32045. #elif defined(__clang__)
  32046. "muls r7, r6\n\t"
  32047. #else
  32048. "mul r7, r6\n\t"
  32049. #endif
  32050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32051. "adds r4, r4, r7\n\t"
  32052. #else
  32053. "add r4, r4, r7\n\t"
  32054. #endif
  32055. #ifdef WOLFSSL_KEIL
  32056. "adcs r5, r5, %[r]\n\t"
  32057. #elif defined(__clang__)
  32058. "adcs r5, %[r]\n\t"
  32059. #else
  32060. "adc r5, %[r]\n\t"
  32061. #endif
  32062. #ifdef WOLFSSL_KEIL
  32063. "adcs r3, r3, %[r]\n\t"
  32064. #elif defined(__clang__)
  32065. "adcs r3, %[r]\n\t"
  32066. #else
  32067. "adc r3, %[r]\n\t"
  32068. #endif
  32069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32070. "lsrs r7, %[b], #16\n\t"
  32071. #else
  32072. "lsr r7, %[b], #16\n\t"
  32073. #endif
  32074. #ifdef WOLFSSL_KEIL
  32075. "muls r6, r7, r6\n\t"
  32076. #elif defined(__clang__)
  32077. "muls r6, r7\n\t"
  32078. #else
  32079. "mul r6, r7\n\t"
  32080. #endif
  32081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32082. "lsrs r7, r6, #16\n\t"
  32083. #else
  32084. "lsr r7, r6, #16\n\t"
  32085. #endif
  32086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32087. "lsls r6, r6, #16\n\t"
  32088. #else
  32089. "lsl r6, r6, #16\n\t"
  32090. #endif
  32091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32092. "adds r4, r4, r6\n\t"
  32093. #else
  32094. "add r4, r4, r6\n\t"
  32095. #endif
  32096. #ifdef WOLFSSL_KEIL
  32097. "adcs r5, r5, r7\n\t"
  32098. #elif defined(__clang__)
  32099. "adcs r5, r7\n\t"
  32100. #else
  32101. "adc r5, r7\n\t"
  32102. #endif
  32103. #ifdef WOLFSSL_KEIL
  32104. "adcs r3, r3, %[r]\n\t"
  32105. #elif defined(__clang__)
  32106. "adcs r3, %[r]\n\t"
  32107. #else
  32108. "adc r3, %[r]\n\t"
  32109. #endif
  32110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32111. "lsrs r6, %[a], #16\n\t"
  32112. #else
  32113. "lsr r6, %[a], #16\n\t"
  32114. #endif
  32115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32116. "lsrs r7, %[b], #16\n\t"
  32117. #else
  32118. "lsr r7, %[b], #16\n\t"
  32119. #endif
  32120. #ifdef WOLFSSL_KEIL
  32121. "muls r7, r6, r7\n\t"
  32122. #elif defined(__clang__)
  32123. "muls r7, r6\n\t"
  32124. #else
  32125. "mul r7, r6\n\t"
  32126. #endif
  32127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32128. "adds r5, r5, r7\n\t"
  32129. #else
  32130. "add r5, r5, r7\n\t"
  32131. #endif
  32132. #ifdef WOLFSSL_KEIL
  32133. "adcs r3, r3, %[r]\n\t"
  32134. #elif defined(__clang__)
  32135. "adcs r3, %[r]\n\t"
  32136. #else
  32137. "adc r3, %[r]\n\t"
  32138. #endif
  32139. "uxth r7, %[b]\n\t"
  32140. #ifdef WOLFSSL_KEIL
  32141. "muls r6, r7, r6\n\t"
  32142. #elif defined(__clang__)
  32143. "muls r6, r7\n\t"
  32144. #else
  32145. "mul r6, r7\n\t"
  32146. #endif
  32147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32148. "lsrs r7, r6, #16\n\t"
  32149. #else
  32150. "lsr r7, r6, #16\n\t"
  32151. #endif
  32152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32153. "lsls r6, r6, #16\n\t"
  32154. #else
  32155. "lsl r6, r6, #16\n\t"
  32156. #endif
  32157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32158. "adds r4, r4, r6\n\t"
  32159. #else
  32160. "add r4, r4, r6\n\t"
  32161. #endif
  32162. #ifdef WOLFSSL_KEIL
  32163. "adcs r5, r5, r7\n\t"
  32164. #elif defined(__clang__)
  32165. "adcs r5, r7\n\t"
  32166. #else
  32167. "adc r5, r7\n\t"
  32168. #endif
  32169. #ifdef WOLFSSL_KEIL
  32170. "adcs r3, r3, %[r]\n\t"
  32171. #elif defined(__clang__)
  32172. "adcs r3, %[r]\n\t"
  32173. #else
  32174. "adc r3, %[r]\n\t"
  32175. #endif
  32176. "# A[1] * B[3]\n\t"
  32177. "mov %[a], r9\n\t"
  32178. "mov %[b], r10\n\t"
  32179. "ldr %[a], [%[a], #4]\n\t"
  32180. "ldr %[b], [%[b], #12]\n\t"
  32181. "uxth r6, %[a]\n\t"
  32182. "uxth r7, %[b]\n\t"
  32183. #ifdef WOLFSSL_KEIL
  32184. "muls r7, r6, r7\n\t"
  32185. #elif defined(__clang__)
  32186. "muls r7, r6\n\t"
  32187. #else
  32188. "mul r7, r6\n\t"
  32189. #endif
  32190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32191. "adds r4, r4, r7\n\t"
  32192. #else
  32193. "add r4, r4, r7\n\t"
  32194. #endif
  32195. #ifdef WOLFSSL_KEIL
  32196. "adcs r5, r5, %[r]\n\t"
  32197. #elif defined(__clang__)
  32198. "adcs r5, %[r]\n\t"
  32199. #else
  32200. "adc r5, %[r]\n\t"
  32201. #endif
  32202. #ifdef WOLFSSL_KEIL
  32203. "adcs r3, r3, %[r]\n\t"
  32204. #elif defined(__clang__)
  32205. "adcs r3, %[r]\n\t"
  32206. #else
  32207. "adc r3, %[r]\n\t"
  32208. #endif
  32209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32210. "lsrs r7, %[b], #16\n\t"
  32211. #else
  32212. "lsr r7, %[b], #16\n\t"
  32213. #endif
  32214. #ifdef WOLFSSL_KEIL
  32215. "muls r6, r7, r6\n\t"
  32216. #elif defined(__clang__)
  32217. "muls r6, r7\n\t"
  32218. #else
  32219. "mul r6, r7\n\t"
  32220. #endif
  32221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32222. "lsrs r7, r6, #16\n\t"
  32223. #else
  32224. "lsr r7, r6, #16\n\t"
  32225. #endif
  32226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32227. "lsls r6, r6, #16\n\t"
  32228. #else
  32229. "lsl r6, r6, #16\n\t"
  32230. #endif
  32231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32232. "adds r4, r4, r6\n\t"
  32233. #else
  32234. "add r4, r4, r6\n\t"
  32235. #endif
  32236. #ifdef WOLFSSL_KEIL
  32237. "adcs r5, r5, r7\n\t"
  32238. #elif defined(__clang__)
  32239. "adcs r5, r7\n\t"
  32240. #else
  32241. "adc r5, r7\n\t"
  32242. #endif
  32243. #ifdef WOLFSSL_KEIL
  32244. "adcs r3, r3, %[r]\n\t"
  32245. #elif defined(__clang__)
  32246. "adcs r3, %[r]\n\t"
  32247. #else
  32248. "adc r3, %[r]\n\t"
  32249. #endif
  32250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32251. "lsrs r6, %[a], #16\n\t"
  32252. #else
  32253. "lsr r6, %[a], #16\n\t"
  32254. #endif
  32255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32256. "lsrs r7, %[b], #16\n\t"
  32257. #else
  32258. "lsr r7, %[b], #16\n\t"
  32259. #endif
  32260. #ifdef WOLFSSL_KEIL
  32261. "muls r7, r6, r7\n\t"
  32262. #elif defined(__clang__)
  32263. "muls r7, r6\n\t"
  32264. #else
  32265. "mul r7, r6\n\t"
  32266. #endif
  32267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32268. "adds r5, r5, r7\n\t"
  32269. #else
  32270. "add r5, r5, r7\n\t"
  32271. #endif
  32272. #ifdef WOLFSSL_KEIL
  32273. "adcs r3, r3, %[r]\n\t"
  32274. #elif defined(__clang__)
  32275. "adcs r3, %[r]\n\t"
  32276. #else
  32277. "adc r3, %[r]\n\t"
  32278. #endif
  32279. "uxth r7, %[b]\n\t"
  32280. #ifdef WOLFSSL_KEIL
  32281. "muls r6, r7, r6\n\t"
  32282. #elif defined(__clang__)
  32283. "muls r6, r7\n\t"
  32284. #else
  32285. "mul r6, r7\n\t"
  32286. #endif
  32287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32288. "lsrs r7, r6, #16\n\t"
  32289. #else
  32290. "lsr r7, r6, #16\n\t"
  32291. #endif
  32292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32293. "lsls r6, r6, #16\n\t"
  32294. #else
  32295. "lsl r6, r6, #16\n\t"
  32296. #endif
  32297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32298. "adds r4, r4, r6\n\t"
  32299. #else
  32300. "add r4, r4, r6\n\t"
  32301. #endif
  32302. #ifdef WOLFSSL_KEIL
  32303. "adcs r5, r5, r7\n\t"
  32304. #elif defined(__clang__)
  32305. "adcs r5, r7\n\t"
  32306. #else
  32307. "adc r5, r7\n\t"
  32308. #endif
  32309. #ifdef WOLFSSL_KEIL
  32310. "adcs r3, r3, %[r]\n\t"
  32311. #elif defined(__clang__)
  32312. "adcs r3, %[r]\n\t"
  32313. #else
  32314. "adc r3, %[r]\n\t"
  32315. #endif
  32316. "# A[0] * B[4]\n\t"
  32317. "mov %[a], r9\n\t"
  32318. "mov %[b], r10\n\t"
  32319. "ldr %[a], [%[a]]\n\t"
  32320. "ldr %[b], [%[b], #16]\n\t"
  32321. "uxth r6, %[a]\n\t"
  32322. "uxth r7, %[b]\n\t"
  32323. #ifdef WOLFSSL_KEIL
  32324. "muls r7, r6, r7\n\t"
  32325. #elif defined(__clang__)
  32326. "muls r7, r6\n\t"
  32327. #else
  32328. "mul r7, r6\n\t"
  32329. #endif
  32330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32331. "adds r4, r4, r7\n\t"
  32332. #else
  32333. "add r4, r4, r7\n\t"
  32334. #endif
  32335. #ifdef WOLFSSL_KEIL
  32336. "adcs r5, r5, %[r]\n\t"
  32337. #elif defined(__clang__)
  32338. "adcs r5, %[r]\n\t"
  32339. #else
  32340. "adc r5, %[r]\n\t"
  32341. #endif
  32342. #ifdef WOLFSSL_KEIL
  32343. "adcs r3, r3, %[r]\n\t"
  32344. #elif defined(__clang__)
  32345. "adcs r3, %[r]\n\t"
  32346. #else
  32347. "adc r3, %[r]\n\t"
  32348. #endif
  32349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32350. "lsrs r7, %[b], #16\n\t"
  32351. #else
  32352. "lsr r7, %[b], #16\n\t"
  32353. #endif
  32354. #ifdef WOLFSSL_KEIL
  32355. "muls r6, r7, r6\n\t"
  32356. #elif defined(__clang__)
  32357. "muls r6, r7\n\t"
  32358. #else
  32359. "mul r6, r7\n\t"
  32360. #endif
  32361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32362. "lsrs r7, r6, #16\n\t"
  32363. #else
  32364. "lsr r7, r6, #16\n\t"
  32365. #endif
  32366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32367. "lsls r6, r6, #16\n\t"
  32368. #else
  32369. "lsl r6, r6, #16\n\t"
  32370. #endif
  32371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32372. "adds r4, r4, r6\n\t"
  32373. #else
  32374. "add r4, r4, r6\n\t"
  32375. #endif
  32376. #ifdef WOLFSSL_KEIL
  32377. "adcs r5, r5, r7\n\t"
  32378. #elif defined(__clang__)
  32379. "adcs r5, r7\n\t"
  32380. #else
  32381. "adc r5, r7\n\t"
  32382. #endif
  32383. #ifdef WOLFSSL_KEIL
  32384. "adcs r3, r3, %[r]\n\t"
  32385. #elif defined(__clang__)
  32386. "adcs r3, %[r]\n\t"
  32387. #else
  32388. "adc r3, %[r]\n\t"
  32389. #endif
  32390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32391. "lsrs r6, %[a], #16\n\t"
  32392. #else
  32393. "lsr r6, %[a], #16\n\t"
  32394. #endif
  32395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32396. "lsrs r7, %[b], #16\n\t"
  32397. #else
  32398. "lsr r7, %[b], #16\n\t"
  32399. #endif
  32400. #ifdef WOLFSSL_KEIL
  32401. "muls r7, r6, r7\n\t"
  32402. #elif defined(__clang__)
  32403. "muls r7, r6\n\t"
  32404. #else
  32405. "mul r7, r6\n\t"
  32406. #endif
  32407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32408. "adds r5, r5, r7\n\t"
  32409. #else
  32410. "add r5, r5, r7\n\t"
  32411. #endif
  32412. #ifdef WOLFSSL_KEIL
  32413. "adcs r3, r3, %[r]\n\t"
  32414. #elif defined(__clang__)
  32415. "adcs r3, %[r]\n\t"
  32416. #else
  32417. "adc r3, %[r]\n\t"
  32418. #endif
  32419. "uxth r7, %[b]\n\t"
  32420. #ifdef WOLFSSL_KEIL
  32421. "muls r6, r7, r6\n\t"
  32422. #elif defined(__clang__)
  32423. "muls r6, r7\n\t"
  32424. #else
  32425. "mul r6, r7\n\t"
  32426. #endif
  32427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32428. "lsrs r7, r6, #16\n\t"
  32429. #else
  32430. "lsr r7, r6, #16\n\t"
  32431. #endif
  32432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32433. "lsls r6, r6, #16\n\t"
  32434. #else
  32435. "lsl r6, r6, #16\n\t"
  32436. #endif
  32437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32438. "adds r4, r4, r6\n\t"
  32439. #else
  32440. "add r4, r4, r6\n\t"
  32441. #endif
  32442. #ifdef WOLFSSL_KEIL
  32443. "adcs r5, r5, r7\n\t"
  32444. #elif defined(__clang__)
  32445. "adcs r5, r7\n\t"
  32446. #else
  32447. "adc r5, r7\n\t"
  32448. #endif
  32449. #ifdef WOLFSSL_KEIL
  32450. "adcs r3, r3, %[r]\n\t"
  32451. #elif defined(__clang__)
  32452. "adcs r3, %[r]\n\t"
  32453. #else
  32454. "adc r3, %[r]\n\t"
  32455. #endif
  32456. "str r4, [sp, #16]\n\t"
  32457. "# A[0] * B[5]\n\t"
  32458. "movs r4, #0\n\t"
  32459. "mov %[a], r9\n\t"
  32460. "mov %[b], r10\n\t"
  32461. "ldr %[a], [%[a]]\n\t"
  32462. "ldr %[b], [%[b], #20]\n\t"
  32463. "uxth r6, %[a]\n\t"
  32464. "uxth r7, %[b]\n\t"
  32465. #ifdef WOLFSSL_KEIL
  32466. "muls r7, r6, r7\n\t"
  32467. #elif defined(__clang__)
  32468. "muls r7, r6\n\t"
  32469. #else
  32470. "mul r7, r6\n\t"
  32471. #endif
  32472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32473. "adds r5, r5, r7\n\t"
  32474. #else
  32475. "add r5, r5, r7\n\t"
  32476. #endif
  32477. #ifdef WOLFSSL_KEIL
  32478. "adcs r3, r3, %[r]\n\t"
  32479. #elif defined(__clang__)
  32480. "adcs r3, %[r]\n\t"
  32481. #else
  32482. "adc r3, %[r]\n\t"
  32483. #endif
  32484. #ifdef WOLFSSL_KEIL
  32485. "adcs r4, r4, %[r]\n\t"
  32486. #elif defined(__clang__)
  32487. "adcs r4, %[r]\n\t"
  32488. #else
  32489. "adc r4, %[r]\n\t"
  32490. #endif
  32491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32492. "lsrs r7, %[b], #16\n\t"
  32493. #else
  32494. "lsr r7, %[b], #16\n\t"
  32495. #endif
  32496. #ifdef WOLFSSL_KEIL
  32497. "muls r6, r7, r6\n\t"
  32498. #elif defined(__clang__)
  32499. "muls r6, r7\n\t"
  32500. #else
  32501. "mul r6, r7\n\t"
  32502. #endif
  32503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32504. "lsrs r7, r6, #16\n\t"
  32505. #else
  32506. "lsr r7, r6, #16\n\t"
  32507. #endif
  32508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32509. "lsls r6, r6, #16\n\t"
  32510. #else
  32511. "lsl r6, r6, #16\n\t"
  32512. #endif
  32513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32514. "adds r5, r5, r6\n\t"
  32515. #else
  32516. "add r5, r5, r6\n\t"
  32517. #endif
  32518. #ifdef WOLFSSL_KEIL
  32519. "adcs r3, r3, r7\n\t"
  32520. #elif defined(__clang__)
  32521. "adcs r3, r7\n\t"
  32522. #else
  32523. "adc r3, r7\n\t"
  32524. #endif
  32525. #ifdef WOLFSSL_KEIL
  32526. "adcs r4, r4, %[r]\n\t"
  32527. #elif defined(__clang__)
  32528. "adcs r4, %[r]\n\t"
  32529. #else
  32530. "adc r4, %[r]\n\t"
  32531. #endif
  32532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32533. "lsrs r6, %[a], #16\n\t"
  32534. #else
  32535. "lsr r6, %[a], #16\n\t"
  32536. #endif
  32537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32538. "lsrs r7, %[b], #16\n\t"
  32539. #else
  32540. "lsr r7, %[b], #16\n\t"
  32541. #endif
  32542. #ifdef WOLFSSL_KEIL
  32543. "muls r7, r6, r7\n\t"
  32544. #elif defined(__clang__)
  32545. "muls r7, r6\n\t"
  32546. #else
  32547. "mul r7, r6\n\t"
  32548. #endif
  32549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32550. "adds r3, r3, r7\n\t"
  32551. #else
  32552. "add r3, r3, r7\n\t"
  32553. #endif
  32554. #ifdef WOLFSSL_KEIL
  32555. "adcs r4, r4, %[r]\n\t"
  32556. #elif defined(__clang__)
  32557. "adcs r4, %[r]\n\t"
  32558. #else
  32559. "adc r4, %[r]\n\t"
  32560. #endif
  32561. "uxth r7, %[b]\n\t"
  32562. #ifdef WOLFSSL_KEIL
  32563. "muls r6, r7, r6\n\t"
  32564. #elif defined(__clang__)
  32565. "muls r6, r7\n\t"
  32566. #else
  32567. "mul r6, r7\n\t"
  32568. #endif
  32569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32570. "lsrs r7, r6, #16\n\t"
  32571. #else
  32572. "lsr r7, r6, #16\n\t"
  32573. #endif
  32574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32575. "lsls r6, r6, #16\n\t"
  32576. #else
  32577. "lsl r6, r6, #16\n\t"
  32578. #endif
  32579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32580. "adds r5, r5, r6\n\t"
  32581. #else
  32582. "add r5, r5, r6\n\t"
  32583. #endif
  32584. #ifdef WOLFSSL_KEIL
  32585. "adcs r3, r3, r7\n\t"
  32586. #elif defined(__clang__)
  32587. "adcs r3, r7\n\t"
  32588. #else
  32589. "adc r3, r7\n\t"
  32590. #endif
  32591. #ifdef WOLFSSL_KEIL
  32592. "adcs r4, r4, %[r]\n\t"
  32593. #elif defined(__clang__)
  32594. "adcs r4, %[r]\n\t"
  32595. #else
  32596. "adc r4, %[r]\n\t"
  32597. #endif
  32598. "# A[1] * B[4]\n\t"
  32599. "mov %[a], r9\n\t"
  32600. "mov %[b], r10\n\t"
  32601. "ldr %[a], [%[a], #4]\n\t"
  32602. "ldr %[b], [%[b], #16]\n\t"
  32603. "uxth r6, %[a]\n\t"
  32604. "uxth r7, %[b]\n\t"
  32605. #ifdef WOLFSSL_KEIL
  32606. "muls r7, r6, r7\n\t"
  32607. #elif defined(__clang__)
  32608. "muls r7, r6\n\t"
  32609. #else
  32610. "mul r7, r6\n\t"
  32611. #endif
  32612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32613. "adds r5, r5, r7\n\t"
  32614. #else
  32615. "add r5, r5, r7\n\t"
  32616. #endif
  32617. #ifdef WOLFSSL_KEIL
  32618. "adcs r3, r3, %[r]\n\t"
  32619. #elif defined(__clang__)
  32620. "adcs r3, %[r]\n\t"
  32621. #else
  32622. "adc r3, %[r]\n\t"
  32623. #endif
  32624. #ifdef WOLFSSL_KEIL
  32625. "adcs r4, r4, %[r]\n\t"
  32626. #elif defined(__clang__)
  32627. "adcs r4, %[r]\n\t"
  32628. #else
  32629. "adc r4, %[r]\n\t"
  32630. #endif
  32631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32632. "lsrs r7, %[b], #16\n\t"
  32633. #else
  32634. "lsr r7, %[b], #16\n\t"
  32635. #endif
  32636. #ifdef WOLFSSL_KEIL
  32637. "muls r6, r7, r6\n\t"
  32638. #elif defined(__clang__)
  32639. "muls r6, r7\n\t"
  32640. #else
  32641. "mul r6, r7\n\t"
  32642. #endif
  32643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32644. "lsrs r7, r6, #16\n\t"
  32645. #else
  32646. "lsr r7, r6, #16\n\t"
  32647. #endif
  32648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32649. "lsls r6, r6, #16\n\t"
  32650. #else
  32651. "lsl r6, r6, #16\n\t"
  32652. #endif
  32653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32654. "adds r5, r5, r6\n\t"
  32655. #else
  32656. "add r5, r5, r6\n\t"
  32657. #endif
  32658. #ifdef WOLFSSL_KEIL
  32659. "adcs r3, r3, r7\n\t"
  32660. #elif defined(__clang__)
  32661. "adcs r3, r7\n\t"
  32662. #else
  32663. "adc r3, r7\n\t"
  32664. #endif
  32665. #ifdef WOLFSSL_KEIL
  32666. "adcs r4, r4, %[r]\n\t"
  32667. #elif defined(__clang__)
  32668. "adcs r4, %[r]\n\t"
  32669. #else
  32670. "adc r4, %[r]\n\t"
  32671. #endif
  32672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32673. "lsrs r6, %[a], #16\n\t"
  32674. #else
  32675. "lsr r6, %[a], #16\n\t"
  32676. #endif
  32677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32678. "lsrs r7, %[b], #16\n\t"
  32679. #else
  32680. "lsr r7, %[b], #16\n\t"
  32681. #endif
  32682. #ifdef WOLFSSL_KEIL
  32683. "muls r7, r6, r7\n\t"
  32684. #elif defined(__clang__)
  32685. "muls r7, r6\n\t"
  32686. #else
  32687. "mul r7, r6\n\t"
  32688. #endif
  32689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32690. "adds r3, r3, r7\n\t"
  32691. #else
  32692. "add r3, r3, r7\n\t"
  32693. #endif
  32694. #ifdef WOLFSSL_KEIL
  32695. "adcs r4, r4, %[r]\n\t"
  32696. #elif defined(__clang__)
  32697. "adcs r4, %[r]\n\t"
  32698. #else
  32699. "adc r4, %[r]\n\t"
  32700. #endif
  32701. "uxth r7, %[b]\n\t"
  32702. #ifdef WOLFSSL_KEIL
  32703. "muls r6, r7, r6\n\t"
  32704. #elif defined(__clang__)
  32705. "muls r6, r7\n\t"
  32706. #else
  32707. "mul r6, r7\n\t"
  32708. #endif
  32709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32710. "lsrs r7, r6, #16\n\t"
  32711. #else
  32712. "lsr r7, r6, #16\n\t"
  32713. #endif
  32714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32715. "lsls r6, r6, #16\n\t"
  32716. #else
  32717. "lsl r6, r6, #16\n\t"
  32718. #endif
  32719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32720. "adds r5, r5, r6\n\t"
  32721. #else
  32722. "add r5, r5, r6\n\t"
  32723. #endif
  32724. #ifdef WOLFSSL_KEIL
  32725. "adcs r3, r3, r7\n\t"
  32726. #elif defined(__clang__)
  32727. "adcs r3, r7\n\t"
  32728. #else
  32729. "adc r3, r7\n\t"
  32730. #endif
  32731. #ifdef WOLFSSL_KEIL
  32732. "adcs r4, r4, %[r]\n\t"
  32733. #elif defined(__clang__)
  32734. "adcs r4, %[r]\n\t"
  32735. #else
  32736. "adc r4, %[r]\n\t"
  32737. #endif
  32738. "# A[2] * B[3]\n\t"
  32739. "mov %[a], r9\n\t"
  32740. "mov %[b], r10\n\t"
  32741. "ldr %[a], [%[a], #8]\n\t"
  32742. "ldr %[b], [%[b], #12]\n\t"
  32743. "uxth r6, %[a]\n\t"
  32744. "uxth r7, %[b]\n\t"
  32745. #ifdef WOLFSSL_KEIL
  32746. "muls r7, r6, r7\n\t"
  32747. #elif defined(__clang__)
  32748. "muls r7, r6\n\t"
  32749. #else
  32750. "mul r7, r6\n\t"
  32751. #endif
  32752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32753. "adds r5, r5, r7\n\t"
  32754. #else
  32755. "add r5, r5, r7\n\t"
  32756. #endif
  32757. #ifdef WOLFSSL_KEIL
  32758. "adcs r3, r3, %[r]\n\t"
  32759. #elif defined(__clang__)
  32760. "adcs r3, %[r]\n\t"
  32761. #else
  32762. "adc r3, %[r]\n\t"
  32763. #endif
  32764. #ifdef WOLFSSL_KEIL
  32765. "adcs r4, r4, %[r]\n\t"
  32766. #elif defined(__clang__)
  32767. "adcs r4, %[r]\n\t"
  32768. #else
  32769. "adc r4, %[r]\n\t"
  32770. #endif
  32771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32772. "lsrs r7, %[b], #16\n\t"
  32773. #else
  32774. "lsr r7, %[b], #16\n\t"
  32775. #endif
  32776. #ifdef WOLFSSL_KEIL
  32777. "muls r6, r7, r6\n\t"
  32778. #elif defined(__clang__)
  32779. "muls r6, r7\n\t"
  32780. #else
  32781. "mul r6, r7\n\t"
  32782. #endif
  32783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32784. "lsrs r7, r6, #16\n\t"
  32785. #else
  32786. "lsr r7, r6, #16\n\t"
  32787. #endif
  32788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32789. "lsls r6, r6, #16\n\t"
  32790. #else
  32791. "lsl r6, r6, #16\n\t"
  32792. #endif
  32793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32794. "adds r5, r5, r6\n\t"
  32795. #else
  32796. "add r5, r5, r6\n\t"
  32797. #endif
  32798. #ifdef WOLFSSL_KEIL
  32799. "adcs r3, r3, r7\n\t"
  32800. #elif defined(__clang__)
  32801. "adcs r3, r7\n\t"
  32802. #else
  32803. "adc r3, r7\n\t"
  32804. #endif
  32805. #ifdef WOLFSSL_KEIL
  32806. "adcs r4, r4, %[r]\n\t"
  32807. #elif defined(__clang__)
  32808. "adcs r4, %[r]\n\t"
  32809. #else
  32810. "adc r4, %[r]\n\t"
  32811. #endif
  32812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32813. "lsrs r6, %[a], #16\n\t"
  32814. #else
  32815. "lsr r6, %[a], #16\n\t"
  32816. #endif
  32817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32818. "lsrs r7, %[b], #16\n\t"
  32819. #else
  32820. "lsr r7, %[b], #16\n\t"
  32821. #endif
  32822. #ifdef WOLFSSL_KEIL
  32823. "muls r7, r6, r7\n\t"
  32824. #elif defined(__clang__)
  32825. "muls r7, r6\n\t"
  32826. #else
  32827. "mul r7, r6\n\t"
  32828. #endif
  32829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32830. "adds r3, r3, r7\n\t"
  32831. #else
  32832. "add r3, r3, r7\n\t"
  32833. #endif
  32834. #ifdef WOLFSSL_KEIL
  32835. "adcs r4, r4, %[r]\n\t"
  32836. #elif defined(__clang__)
  32837. "adcs r4, %[r]\n\t"
  32838. #else
  32839. "adc r4, %[r]\n\t"
  32840. #endif
  32841. "uxth r7, %[b]\n\t"
  32842. #ifdef WOLFSSL_KEIL
  32843. "muls r6, r7, r6\n\t"
  32844. #elif defined(__clang__)
  32845. "muls r6, r7\n\t"
  32846. #else
  32847. "mul r6, r7\n\t"
  32848. #endif
  32849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32850. "lsrs r7, r6, #16\n\t"
  32851. #else
  32852. "lsr r7, r6, #16\n\t"
  32853. #endif
  32854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32855. "lsls r6, r6, #16\n\t"
  32856. #else
  32857. "lsl r6, r6, #16\n\t"
  32858. #endif
  32859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32860. "adds r5, r5, r6\n\t"
  32861. #else
  32862. "add r5, r5, r6\n\t"
  32863. #endif
  32864. #ifdef WOLFSSL_KEIL
  32865. "adcs r3, r3, r7\n\t"
  32866. #elif defined(__clang__)
  32867. "adcs r3, r7\n\t"
  32868. #else
  32869. "adc r3, r7\n\t"
  32870. #endif
  32871. #ifdef WOLFSSL_KEIL
  32872. "adcs r4, r4, %[r]\n\t"
  32873. #elif defined(__clang__)
  32874. "adcs r4, %[r]\n\t"
  32875. #else
  32876. "adc r4, %[r]\n\t"
  32877. #endif
  32878. "# A[3] * B[2]\n\t"
  32879. "mov %[a], r9\n\t"
  32880. "mov %[b], r10\n\t"
  32881. "ldr %[a], [%[a], #12]\n\t"
  32882. "ldr %[b], [%[b], #8]\n\t"
  32883. "uxth r6, %[a]\n\t"
  32884. "uxth r7, %[b]\n\t"
  32885. #ifdef WOLFSSL_KEIL
  32886. "muls r7, r6, r7\n\t"
  32887. #elif defined(__clang__)
  32888. "muls r7, r6\n\t"
  32889. #else
  32890. "mul r7, r6\n\t"
  32891. #endif
  32892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32893. "adds r5, r5, r7\n\t"
  32894. #else
  32895. "add r5, r5, r7\n\t"
  32896. #endif
  32897. #ifdef WOLFSSL_KEIL
  32898. "adcs r3, r3, %[r]\n\t"
  32899. #elif defined(__clang__)
  32900. "adcs r3, %[r]\n\t"
  32901. #else
  32902. "adc r3, %[r]\n\t"
  32903. #endif
  32904. #ifdef WOLFSSL_KEIL
  32905. "adcs r4, r4, %[r]\n\t"
  32906. #elif defined(__clang__)
  32907. "adcs r4, %[r]\n\t"
  32908. #else
  32909. "adc r4, %[r]\n\t"
  32910. #endif
  32911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32912. "lsrs r7, %[b], #16\n\t"
  32913. #else
  32914. "lsr r7, %[b], #16\n\t"
  32915. #endif
  32916. #ifdef WOLFSSL_KEIL
  32917. "muls r6, r7, r6\n\t"
  32918. #elif defined(__clang__)
  32919. "muls r6, r7\n\t"
  32920. #else
  32921. "mul r6, r7\n\t"
  32922. #endif
  32923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32924. "lsrs r7, r6, #16\n\t"
  32925. #else
  32926. "lsr r7, r6, #16\n\t"
  32927. #endif
  32928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32929. "lsls r6, r6, #16\n\t"
  32930. #else
  32931. "lsl r6, r6, #16\n\t"
  32932. #endif
  32933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32934. "adds r5, r5, r6\n\t"
  32935. #else
  32936. "add r5, r5, r6\n\t"
  32937. #endif
  32938. #ifdef WOLFSSL_KEIL
  32939. "adcs r3, r3, r7\n\t"
  32940. #elif defined(__clang__)
  32941. "adcs r3, r7\n\t"
  32942. #else
  32943. "adc r3, r7\n\t"
  32944. #endif
  32945. #ifdef WOLFSSL_KEIL
  32946. "adcs r4, r4, %[r]\n\t"
  32947. #elif defined(__clang__)
  32948. "adcs r4, %[r]\n\t"
  32949. #else
  32950. "adc r4, %[r]\n\t"
  32951. #endif
  32952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32953. "lsrs r6, %[a], #16\n\t"
  32954. #else
  32955. "lsr r6, %[a], #16\n\t"
  32956. #endif
  32957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32958. "lsrs r7, %[b], #16\n\t"
  32959. #else
  32960. "lsr r7, %[b], #16\n\t"
  32961. #endif
  32962. #ifdef WOLFSSL_KEIL
  32963. "muls r7, r6, r7\n\t"
  32964. #elif defined(__clang__)
  32965. "muls r7, r6\n\t"
  32966. #else
  32967. "mul r7, r6\n\t"
  32968. #endif
  32969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32970. "adds r3, r3, r7\n\t"
  32971. #else
  32972. "add r3, r3, r7\n\t"
  32973. #endif
  32974. #ifdef WOLFSSL_KEIL
  32975. "adcs r4, r4, %[r]\n\t"
  32976. #elif defined(__clang__)
  32977. "adcs r4, %[r]\n\t"
  32978. #else
  32979. "adc r4, %[r]\n\t"
  32980. #endif
  32981. "uxth r7, %[b]\n\t"
  32982. #ifdef WOLFSSL_KEIL
  32983. "muls r6, r7, r6\n\t"
  32984. #elif defined(__clang__)
  32985. "muls r6, r7\n\t"
  32986. #else
  32987. "mul r6, r7\n\t"
  32988. #endif
  32989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32990. "lsrs r7, r6, #16\n\t"
  32991. #else
  32992. "lsr r7, r6, #16\n\t"
  32993. #endif
  32994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32995. "lsls r6, r6, #16\n\t"
  32996. #else
  32997. "lsl r6, r6, #16\n\t"
  32998. #endif
  32999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33000. "adds r5, r5, r6\n\t"
  33001. #else
  33002. "add r5, r5, r6\n\t"
  33003. #endif
  33004. #ifdef WOLFSSL_KEIL
  33005. "adcs r3, r3, r7\n\t"
  33006. #elif defined(__clang__)
  33007. "adcs r3, r7\n\t"
  33008. #else
  33009. "adc r3, r7\n\t"
  33010. #endif
  33011. #ifdef WOLFSSL_KEIL
  33012. "adcs r4, r4, %[r]\n\t"
  33013. #elif defined(__clang__)
  33014. "adcs r4, %[r]\n\t"
  33015. #else
  33016. "adc r4, %[r]\n\t"
  33017. #endif
  33018. "# A[4] * B[1]\n\t"
  33019. "mov %[a], r9\n\t"
  33020. "mov %[b], r10\n\t"
  33021. "ldr %[a], [%[a], #16]\n\t"
  33022. "ldr %[b], [%[b], #4]\n\t"
  33023. "uxth r6, %[a]\n\t"
  33024. "uxth r7, %[b]\n\t"
  33025. #ifdef WOLFSSL_KEIL
  33026. "muls r7, r6, r7\n\t"
  33027. #elif defined(__clang__)
  33028. "muls r7, r6\n\t"
  33029. #else
  33030. "mul r7, r6\n\t"
  33031. #endif
  33032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33033. "adds r5, r5, r7\n\t"
  33034. #else
  33035. "add r5, r5, r7\n\t"
  33036. #endif
  33037. #ifdef WOLFSSL_KEIL
  33038. "adcs r3, r3, %[r]\n\t"
  33039. #elif defined(__clang__)
  33040. "adcs r3, %[r]\n\t"
  33041. #else
  33042. "adc r3, %[r]\n\t"
  33043. #endif
  33044. #ifdef WOLFSSL_KEIL
  33045. "adcs r4, r4, %[r]\n\t"
  33046. #elif defined(__clang__)
  33047. "adcs r4, %[r]\n\t"
  33048. #else
  33049. "adc r4, %[r]\n\t"
  33050. #endif
  33051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33052. "lsrs r7, %[b], #16\n\t"
  33053. #else
  33054. "lsr r7, %[b], #16\n\t"
  33055. #endif
  33056. #ifdef WOLFSSL_KEIL
  33057. "muls r6, r7, r6\n\t"
  33058. #elif defined(__clang__)
  33059. "muls r6, r7\n\t"
  33060. #else
  33061. "mul r6, r7\n\t"
  33062. #endif
  33063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33064. "lsrs r7, r6, #16\n\t"
  33065. #else
  33066. "lsr r7, r6, #16\n\t"
  33067. #endif
  33068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33069. "lsls r6, r6, #16\n\t"
  33070. #else
  33071. "lsl r6, r6, #16\n\t"
  33072. #endif
  33073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33074. "adds r5, r5, r6\n\t"
  33075. #else
  33076. "add r5, r5, r6\n\t"
  33077. #endif
  33078. #ifdef WOLFSSL_KEIL
  33079. "adcs r3, r3, r7\n\t"
  33080. #elif defined(__clang__)
  33081. "adcs r3, r7\n\t"
  33082. #else
  33083. "adc r3, r7\n\t"
  33084. #endif
  33085. #ifdef WOLFSSL_KEIL
  33086. "adcs r4, r4, %[r]\n\t"
  33087. #elif defined(__clang__)
  33088. "adcs r4, %[r]\n\t"
  33089. #else
  33090. "adc r4, %[r]\n\t"
  33091. #endif
  33092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33093. "lsrs r6, %[a], #16\n\t"
  33094. #else
  33095. "lsr r6, %[a], #16\n\t"
  33096. #endif
  33097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33098. "lsrs r7, %[b], #16\n\t"
  33099. #else
  33100. "lsr r7, %[b], #16\n\t"
  33101. #endif
  33102. #ifdef WOLFSSL_KEIL
  33103. "muls r7, r6, r7\n\t"
  33104. #elif defined(__clang__)
  33105. "muls r7, r6\n\t"
  33106. #else
  33107. "mul r7, r6\n\t"
  33108. #endif
  33109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33110. "adds r3, r3, r7\n\t"
  33111. #else
  33112. "add r3, r3, r7\n\t"
  33113. #endif
  33114. #ifdef WOLFSSL_KEIL
  33115. "adcs r4, r4, %[r]\n\t"
  33116. #elif defined(__clang__)
  33117. "adcs r4, %[r]\n\t"
  33118. #else
  33119. "adc r4, %[r]\n\t"
  33120. #endif
  33121. "uxth r7, %[b]\n\t"
  33122. #ifdef WOLFSSL_KEIL
  33123. "muls r6, r7, r6\n\t"
  33124. #elif defined(__clang__)
  33125. "muls r6, r7\n\t"
  33126. #else
  33127. "mul r6, r7\n\t"
  33128. #endif
  33129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33130. "lsrs r7, r6, #16\n\t"
  33131. #else
  33132. "lsr r7, r6, #16\n\t"
  33133. #endif
  33134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33135. "lsls r6, r6, #16\n\t"
  33136. #else
  33137. "lsl r6, r6, #16\n\t"
  33138. #endif
  33139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33140. "adds r5, r5, r6\n\t"
  33141. #else
  33142. "add r5, r5, r6\n\t"
  33143. #endif
  33144. #ifdef WOLFSSL_KEIL
  33145. "adcs r3, r3, r7\n\t"
  33146. #elif defined(__clang__)
  33147. "adcs r3, r7\n\t"
  33148. #else
  33149. "adc r3, r7\n\t"
  33150. #endif
  33151. #ifdef WOLFSSL_KEIL
  33152. "adcs r4, r4, %[r]\n\t"
  33153. #elif defined(__clang__)
  33154. "adcs r4, %[r]\n\t"
  33155. #else
  33156. "adc r4, %[r]\n\t"
  33157. #endif
  33158. "# A[5] * B[0]\n\t"
  33159. "mov %[a], r9\n\t"
  33160. "mov %[b], r10\n\t"
  33161. "ldr %[a], [%[a], #20]\n\t"
  33162. "ldr %[b], [%[b]]\n\t"
  33163. "uxth r6, %[a]\n\t"
  33164. "uxth r7, %[b]\n\t"
  33165. #ifdef WOLFSSL_KEIL
  33166. "muls r7, r6, r7\n\t"
  33167. #elif defined(__clang__)
  33168. "muls r7, r6\n\t"
  33169. #else
  33170. "mul r7, r6\n\t"
  33171. #endif
  33172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33173. "adds r5, r5, r7\n\t"
  33174. #else
  33175. "add r5, r5, r7\n\t"
  33176. #endif
  33177. #ifdef WOLFSSL_KEIL
  33178. "adcs r3, r3, %[r]\n\t"
  33179. #elif defined(__clang__)
  33180. "adcs r3, %[r]\n\t"
  33181. #else
  33182. "adc r3, %[r]\n\t"
  33183. #endif
  33184. #ifdef WOLFSSL_KEIL
  33185. "adcs r4, r4, %[r]\n\t"
  33186. #elif defined(__clang__)
  33187. "adcs r4, %[r]\n\t"
  33188. #else
  33189. "adc r4, %[r]\n\t"
  33190. #endif
  33191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33192. "lsrs r7, %[b], #16\n\t"
  33193. #else
  33194. "lsr r7, %[b], #16\n\t"
  33195. #endif
  33196. #ifdef WOLFSSL_KEIL
  33197. "muls r6, r7, r6\n\t"
  33198. #elif defined(__clang__)
  33199. "muls r6, r7\n\t"
  33200. #else
  33201. "mul r6, r7\n\t"
  33202. #endif
  33203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33204. "lsrs r7, r6, #16\n\t"
  33205. #else
  33206. "lsr r7, r6, #16\n\t"
  33207. #endif
  33208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33209. "lsls r6, r6, #16\n\t"
  33210. #else
  33211. "lsl r6, r6, #16\n\t"
  33212. #endif
  33213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33214. "adds r5, r5, r6\n\t"
  33215. #else
  33216. "add r5, r5, r6\n\t"
  33217. #endif
  33218. #ifdef WOLFSSL_KEIL
  33219. "adcs r3, r3, r7\n\t"
  33220. #elif defined(__clang__)
  33221. "adcs r3, r7\n\t"
  33222. #else
  33223. "adc r3, r7\n\t"
  33224. #endif
  33225. #ifdef WOLFSSL_KEIL
  33226. "adcs r4, r4, %[r]\n\t"
  33227. #elif defined(__clang__)
  33228. "adcs r4, %[r]\n\t"
  33229. #else
  33230. "adc r4, %[r]\n\t"
  33231. #endif
  33232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33233. "lsrs r6, %[a], #16\n\t"
  33234. #else
  33235. "lsr r6, %[a], #16\n\t"
  33236. #endif
  33237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33238. "lsrs r7, %[b], #16\n\t"
  33239. #else
  33240. "lsr r7, %[b], #16\n\t"
  33241. #endif
  33242. #ifdef WOLFSSL_KEIL
  33243. "muls r7, r6, r7\n\t"
  33244. #elif defined(__clang__)
  33245. "muls r7, r6\n\t"
  33246. #else
  33247. "mul r7, r6\n\t"
  33248. #endif
  33249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33250. "adds r3, r3, r7\n\t"
  33251. #else
  33252. "add r3, r3, r7\n\t"
  33253. #endif
  33254. #ifdef WOLFSSL_KEIL
  33255. "adcs r4, r4, %[r]\n\t"
  33256. #elif defined(__clang__)
  33257. "adcs r4, %[r]\n\t"
  33258. #else
  33259. "adc r4, %[r]\n\t"
  33260. #endif
  33261. "uxth r7, %[b]\n\t"
  33262. #ifdef WOLFSSL_KEIL
  33263. "muls r6, r7, r6\n\t"
  33264. #elif defined(__clang__)
  33265. "muls r6, r7\n\t"
  33266. #else
  33267. "mul r6, r7\n\t"
  33268. #endif
  33269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33270. "lsrs r7, r6, #16\n\t"
  33271. #else
  33272. "lsr r7, r6, #16\n\t"
  33273. #endif
  33274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33275. "lsls r6, r6, #16\n\t"
  33276. #else
  33277. "lsl r6, r6, #16\n\t"
  33278. #endif
  33279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33280. "adds r5, r5, r6\n\t"
  33281. #else
  33282. "add r5, r5, r6\n\t"
  33283. #endif
  33284. #ifdef WOLFSSL_KEIL
  33285. "adcs r3, r3, r7\n\t"
  33286. #elif defined(__clang__)
  33287. "adcs r3, r7\n\t"
  33288. #else
  33289. "adc r3, r7\n\t"
  33290. #endif
  33291. #ifdef WOLFSSL_KEIL
  33292. "adcs r4, r4, %[r]\n\t"
  33293. #elif defined(__clang__)
  33294. "adcs r4, %[r]\n\t"
  33295. #else
  33296. "adc r4, %[r]\n\t"
  33297. #endif
  33298. "str r5, [sp, #20]\n\t"
  33299. "# A[6] * B[0]\n\t"
  33300. "movs r5, #0\n\t"
  33301. "mov %[a], r9\n\t"
  33302. "mov %[b], r10\n\t"
  33303. "ldr %[a], [%[a], #24]\n\t"
  33304. "ldr %[b], [%[b]]\n\t"
  33305. "uxth r6, %[a]\n\t"
  33306. "uxth r7, %[b]\n\t"
  33307. #ifdef WOLFSSL_KEIL
  33308. "muls r7, r6, r7\n\t"
  33309. #elif defined(__clang__)
  33310. "muls r7, r6\n\t"
  33311. #else
  33312. "mul r7, r6\n\t"
  33313. #endif
  33314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33315. "adds r3, r3, r7\n\t"
  33316. #else
  33317. "add r3, r3, r7\n\t"
  33318. #endif
  33319. #ifdef WOLFSSL_KEIL
  33320. "adcs r4, r4, %[r]\n\t"
  33321. #elif defined(__clang__)
  33322. "adcs r4, %[r]\n\t"
  33323. #else
  33324. "adc r4, %[r]\n\t"
  33325. #endif
  33326. #ifdef WOLFSSL_KEIL
  33327. "adcs r5, r5, %[r]\n\t"
  33328. #elif defined(__clang__)
  33329. "adcs r5, %[r]\n\t"
  33330. #else
  33331. "adc r5, %[r]\n\t"
  33332. #endif
  33333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33334. "lsrs r7, %[b], #16\n\t"
  33335. #else
  33336. "lsr r7, %[b], #16\n\t"
  33337. #endif
  33338. #ifdef WOLFSSL_KEIL
  33339. "muls r6, r7, r6\n\t"
  33340. #elif defined(__clang__)
  33341. "muls r6, r7\n\t"
  33342. #else
  33343. "mul r6, r7\n\t"
  33344. #endif
  33345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33346. "lsrs r7, r6, #16\n\t"
  33347. #else
  33348. "lsr r7, r6, #16\n\t"
  33349. #endif
  33350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33351. "lsls r6, r6, #16\n\t"
  33352. #else
  33353. "lsl r6, r6, #16\n\t"
  33354. #endif
  33355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33356. "adds r3, r3, r6\n\t"
  33357. #else
  33358. "add r3, r3, r6\n\t"
  33359. #endif
  33360. #ifdef WOLFSSL_KEIL
  33361. "adcs r4, r4, r7\n\t"
  33362. #elif defined(__clang__)
  33363. "adcs r4, r7\n\t"
  33364. #else
  33365. "adc r4, r7\n\t"
  33366. #endif
  33367. #ifdef WOLFSSL_KEIL
  33368. "adcs r5, r5, %[r]\n\t"
  33369. #elif defined(__clang__)
  33370. "adcs r5, %[r]\n\t"
  33371. #else
  33372. "adc r5, %[r]\n\t"
  33373. #endif
  33374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33375. "lsrs r6, %[a], #16\n\t"
  33376. #else
  33377. "lsr r6, %[a], #16\n\t"
  33378. #endif
  33379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33380. "lsrs r7, %[b], #16\n\t"
  33381. #else
  33382. "lsr r7, %[b], #16\n\t"
  33383. #endif
  33384. #ifdef WOLFSSL_KEIL
  33385. "muls r7, r6, r7\n\t"
  33386. #elif defined(__clang__)
  33387. "muls r7, r6\n\t"
  33388. #else
  33389. "mul r7, r6\n\t"
  33390. #endif
  33391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33392. "adds r4, r4, r7\n\t"
  33393. #else
  33394. "add r4, r4, r7\n\t"
  33395. #endif
  33396. #ifdef WOLFSSL_KEIL
  33397. "adcs r5, r5, %[r]\n\t"
  33398. #elif defined(__clang__)
  33399. "adcs r5, %[r]\n\t"
  33400. #else
  33401. "adc r5, %[r]\n\t"
  33402. #endif
  33403. "uxth r7, %[b]\n\t"
  33404. #ifdef WOLFSSL_KEIL
  33405. "muls r6, r7, r6\n\t"
  33406. #elif defined(__clang__)
  33407. "muls r6, r7\n\t"
  33408. #else
  33409. "mul r6, r7\n\t"
  33410. #endif
  33411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33412. "lsrs r7, r6, #16\n\t"
  33413. #else
  33414. "lsr r7, r6, #16\n\t"
  33415. #endif
  33416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33417. "lsls r6, r6, #16\n\t"
  33418. #else
  33419. "lsl r6, r6, #16\n\t"
  33420. #endif
  33421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33422. "adds r3, r3, r6\n\t"
  33423. #else
  33424. "add r3, r3, r6\n\t"
  33425. #endif
  33426. #ifdef WOLFSSL_KEIL
  33427. "adcs r4, r4, r7\n\t"
  33428. #elif defined(__clang__)
  33429. "adcs r4, r7\n\t"
  33430. #else
  33431. "adc r4, r7\n\t"
  33432. #endif
  33433. #ifdef WOLFSSL_KEIL
  33434. "adcs r5, r5, %[r]\n\t"
  33435. #elif defined(__clang__)
  33436. "adcs r5, %[r]\n\t"
  33437. #else
  33438. "adc r5, %[r]\n\t"
  33439. #endif
  33440. "# A[5] * B[1]\n\t"
  33441. "mov %[a], r9\n\t"
  33442. "mov %[b], r10\n\t"
  33443. "ldr %[a], [%[a], #20]\n\t"
  33444. "ldr %[b], [%[b], #4]\n\t"
  33445. "uxth r6, %[a]\n\t"
  33446. "uxth r7, %[b]\n\t"
  33447. #ifdef WOLFSSL_KEIL
  33448. "muls r7, r6, r7\n\t"
  33449. #elif defined(__clang__)
  33450. "muls r7, r6\n\t"
  33451. #else
  33452. "mul r7, r6\n\t"
  33453. #endif
  33454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33455. "adds r3, r3, r7\n\t"
  33456. #else
  33457. "add r3, r3, r7\n\t"
  33458. #endif
  33459. #ifdef WOLFSSL_KEIL
  33460. "adcs r4, r4, %[r]\n\t"
  33461. #elif defined(__clang__)
  33462. "adcs r4, %[r]\n\t"
  33463. #else
  33464. "adc r4, %[r]\n\t"
  33465. #endif
  33466. #ifdef WOLFSSL_KEIL
  33467. "adcs r5, r5, %[r]\n\t"
  33468. #elif defined(__clang__)
  33469. "adcs r5, %[r]\n\t"
  33470. #else
  33471. "adc r5, %[r]\n\t"
  33472. #endif
  33473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33474. "lsrs r7, %[b], #16\n\t"
  33475. #else
  33476. "lsr r7, %[b], #16\n\t"
  33477. #endif
  33478. #ifdef WOLFSSL_KEIL
  33479. "muls r6, r7, r6\n\t"
  33480. #elif defined(__clang__)
  33481. "muls r6, r7\n\t"
  33482. #else
  33483. "mul r6, r7\n\t"
  33484. #endif
  33485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33486. "lsrs r7, r6, #16\n\t"
  33487. #else
  33488. "lsr r7, r6, #16\n\t"
  33489. #endif
  33490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33491. "lsls r6, r6, #16\n\t"
  33492. #else
  33493. "lsl r6, r6, #16\n\t"
  33494. #endif
  33495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33496. "adds r3, r3, r6\n\t"
  33497. #else
  33498. "add r3, r3, r6\n\t"
  33499. #endif
  33500. #ifdef WOLFSSL_KEIL
  33501. "adcs r4, r4, r7\n\t"
  33502. #elif defined(__clang__)
  33503. "adcs r4, r7\n\t"
  33504. #else
  33505. "adc r4, r7\n\t"
  33506. #endif
  33507. #ifdef WOLFSSL_KEIL
  33508. "adcs r5, r5, %[r]\n\t"
  33509. #elif defined(__clang__)
  33510. "adcs r5, %[r]\n\t"
  33511. #else
  33512. "adc r5, %[r]\n\t"
  33513. #endif
  33514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33515. "lsrs r6, %[a], #16\n\t"
  33516. #else
  33517. "lsr r6, %[a], #16\n\t"
  33518. #endif
  33519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33520. "lsrs r7, %[b], #16\n\t"
  33521. #else
  33522. "lsr r7, %[b], #16\n\t"
  33523. #endif
  33524. #ifdef WOLFSSL_KEIL
  33525. "muls r7, r6, r7\n\t"
  33526. #elif defined(__clang__)
  33527. "muls r7, r6\n\t"
  33528. #else
  33529. "mul r7, r6\n\t"
  33530. #endif
  33531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33532. "adds r4, r4, r7\n\t"
  33533. #else
  33534. "add r4, r4, r7\n\t"
  33535. #endif
  33536. #ifdef WOLFSSL_KEIL
  33537. "adcs r5, r5, %[r]\n\t"
  33538. #elif defined(__clang__)
  33539. "adcs r5, %[r]\n\t"
  33540. #else
  33541. "adc r5, %[r]\n\t"
  33542. #endif
  33543. "uxth r7, %[b]\n\t"
  33544. #ifdef WOLFSSL_KEIL
  33545. "muls r6, r7, r6\n\t"
  33546. #elif defined(__clang__)
  33547. "muls r6, r7\n\t"
  33548. #else
  33549. "mul r6, r7\n\t"
  33550. #endif
  33551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33552. "lsrs r7, r6, #16\n\t"
  33553. #else
  33554. "lsr r7, r6, #16\n\t"
  33555. #endif
  33556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33557. "lsls r6, r6, #16\n\t"
  33558. #else
  33559. "lsl r6, r6, #16\n\t"
  33560. #endif
  33561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33562. "adds r3, r3, r6\n\t"
  33563. #else
  33564. "add r3, r3, r6\n\t"
  33565. #endif
  33566. #ifdef WOLFSSL_KEIL
  33567. "adcs r4, r4, r7\n\t"
  33568. #elif defined(__clang__)
  33569. "adcs r4, r7\n\t"
  33570. #else
  33571. "adc r4, r7\n\t"
  33572. #endif
  33573. #ifdef WOLFSSL_KEIL
  33574. "adcs r5, r5, %[r]\n\t"
  33575. #elif defined(__clang__)
  33576. "adcs r5, %[r]\n\t"
  33577. #else
  33578. "adc r5, %[r]\n\t"
  33579. #endif
  33580. "# A[4] * B[2]\n\t"
  33581. "mov %[a], r9\n\t"
  33582. "mov %[b], r10\n\t"
  33583. "ldr %[a], [%[a], #16]\n\t"
  33584. "ldr %[b], [%[b], #8]\n\t"
  33585. "uxth r6, %[a]\n\t"
  33586. "uxth r7, %[b]\n\t"
  33587. #ifdef WOLFSSL_KEIL
  33588. "muls r7, r6, r7\n\t"
  33589. #elif defined(__clang__)
  33590. "muls r7, r6\n\t"
  33591. #else
  33592. "mul r7, r6\n\t"
  33593. #endif
  33594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33595. "adds r3, r3, r7\n\t"
  33596. #else
  33597. "add r3, r3, r7\n\t"
  33598. #endif
  33599. #ifdef WOLFSSL_KEIL
  33600. "adcs r4, r4, %[r]\n\t"
  33601. #elif defined(__clang__)
  33602. "adcs r4, %[r]\n\t"
  33603. #else
  33604. "adc r4, %[r]\n\t"
  33605. #endif
  33606. #ifdef WOLFSSL_KEIL
  33607. "adcs r5, r5, %[r]\n\t"
  33608. #elif defined(__clang__)
  33609. "adcs r5, %[r]\n\t"
  33610. #else
  33611. "adc r5, %[r]\n\t"
  33612. #endif
  33613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33614. "lsrs r7, %[b], #16\n\t"
  33615. #else
  33616. "lsr r7, %[b], #16\n\t"
  33617. #endif
  33618. #ifdef WOLFSSL_KEIL
  33619. "muls r6, r7, r6\n\t"
  33620. #elif defined(__clang__)
  33621. "muls r6, r7\n\t"
  33622. #else
  33623. "mul r6, r7\n\t"
  33624. #endif
  33625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33626. "lsrs r7, r6, #16\n\t"
  33627. #else
  33628. "lsr r7, r6, #16\n\t"
  33629. #endif
  33630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33631. "lsls r6, r6, #16\n\t"
  33632. #else
  33633. "lsl r6, r6, #16\n\t"
  33634. #endif
  33635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33636. "adds r3, r3, r6\n\t"
  33637. #else
  33638. "add r3, r3, r6\n\t"
  33639. #endif
  33640. #ifdef WOLFSSL_KEIL
  33641. "adcs r4, r4, r7\n\t"
  33642. #elif defined(__clang__)
  33643. "adcs r4, r7\n\t"
  33644. #else
  33645. "adc r4, r7\n\t"
  33646. #endif
  33647. #ifdef WOLFSSL_KEIL
  33648. "adcs r5, r5, %[r]\n\t"
  33649. #elif defined(__clang__)
  33650. "adcs r5, %[r]\n\t"
  33651. #else
  33652. "adc r5, %[r]\n\t"
  33653. #endif
  33654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33655. "lsrs r6, %[a], #16\n\t"
  33656. #else
  33657. "lsr r6, %[a], #16\n\t"
  33658. #endif
  33659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33660. "lsrs r7, %[b], #16\n\t"
  33661. #else
  33662. "lsr r7, %[b], #16\n\t"
  33663. #endif
  33664. #ifdef WOLFSSL_KEIL
  33665. "muls r7, r6, r7\n\t"
  33666. #elif defined(__clang__)
  33667. "muls r7, r6\n\t"
  33668. #else
  33669. "mul r7, r6\n\t"
  33670. #endif
  33671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33672. "adds r4, r4, r7\n\t"
  33673. #else
  33674. "add r4, r4, r7\n\t"
  33675. #endif
  33676. #ifdef WOLFSSL_KEIL
  33677. "adcs r5, r5, %[r]\n\t"
  33678. #elif defined(__clang__)
  33679. "adcs r5, %[r]\n\t"
  33680. #else
  33681. "adc r5, %[r]\n\t"
  33682. #endif
  33683. "uxth r7, %[b]\n\t"
  33684. #ifdef WOLFSSL_KEIL
  33685. "muls r6, r7, r6\n\t"
  33686. #elif defined(__clang__)
  33687. "muls r6, r7\n\t"
  33688. #else
  33689. "mul r6, r7\n\t"
  33690. #endif
  33691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33692. "lsrs r7, r6, #16\n\t"
  33693. #else
  33694. "lsr r7, r6, #16\n\t"
  33695. #endif
  33696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33697. "lsls r6, r6, #16\n\t"
  33698. #else
  33699. "lsl r6, r6, #16\n\t"
  33700. #endif
  33701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33702. "adds r3, r3, r6\n\t"
  33703. #else
  33704. "add r3, r3, r6\n\t"
  33705. #endif
  33706. #ifdef WOLFSSL_KEIL
  33707. "adcs r4, r4, r7\n\t"
  33708. #elif defined(__clang__)
  33709. "adcs r4, r7\n\t"
  33710. #else
  33711. "adc r4, r7\n\t"
  33712. #endif
  33713. #ifdef WOLFSSL_KEIL
  33714. "adcs r5, r5, %[r]\n\t"
  33715. #elif defined(__clang__)
  33716. "adcs r5, %[r]\n\t"
  33717. #else
  33718. "adc r5, %[r]\n\t"
  33719. #endif
  33720. "# A[3] * B[3]\n\t"
  33721. "mov %[a], r9\n\t"
  33722. "mov %[b], r10\n\t"
  33723. "ldr %[a], [%[a], #12]\n\t"
  33724. "ldr %[b], [%[b], #12]\n\t"
  33725. "uxth r6, %[a]\n\t"
  33726. "uxth r7, %[b]\n\t"
  33727. #ifdef WOLFSSL_KEIL
  33728. "muls r7, r6, r7\n\t"
  33729. #elif defined(__clang__)
  33730. "muls r7, r6\n\t"
  33731. #else
  33732. "mul r7, r6\n\t"
  33733. #endif
  33734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33735. "adds r3, r3, r7\n\t"
  33736. #else
  33737. "add r3, r3, r7\n\t"
  33738. #endif
  33739. #ifdef WOLFSSL_KEIL
  33740. "adcs r4, r4, %[r]\n\t"
  33741. #elif defined(__clang__)
  33742. "adcs r4, %[r]\n\t"
  33743. #else
  33744. "adc r4, %[r]\n\t"
  33745. #endif
  33746. #ifdef WOLFSSL_KEIL
  33747. "adcs r5, r5, %[r]\n\t"
  33748. #elif defined(__clang__)
  33749. "adcs r5, %[r]\n\t"
  33750. #else
  33751. "adc r5, %[r]\n\t"
  33752. #endif
  33753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33754. "lsrs r7, %[b], #16\n\t"
  33755. #else
  33756. "lsr r7, %[b], #16\n\t"
  33757. #endif
  33758. #ifdef WOLFSSL_KEIL
  33759. "muls r6, r7, r6\n\t"
  33760. #elif defined(__clang__)
  33761. "muls r6, r7\n\t"
  33762. #else
  33763. "mul r6, r7\n\t"
  33764. #endif
  33765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33766. "lsrs r7, r6, #16\n\t"
  33767. #else
  33768. "lsr r7, r6, #16\n\t"
  33769. #endif
  33770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33771. "lsls r6, r6, #16\n\t"
  33772. #else
  33773. "lsl r6, r6, #16\n\t"
  33774. #endif
  33775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33776. "adds r3, r3, r6\n\t"
  33777. #else
  33778. "add r3, r3, r6\n\t"
  33779. #endif
  33780. #ifdef WOLFSSL_KEIL
  33781. "adcs r4, r4, r7\n\t"
  33782. #elif defined(__clang__)
  33783. "adcs r4, r7\n\t"
  33784. #else
  33785. "adc r4, r7\n\t"
  33786. #endif
  33787. #ifdef WOLFSSL_KEIL
  33788. "adcs r5, r5, %[r]\n\t"
  33789. #elif defined(__clang__)
  33790. "adcs r5, %[r]\n\t"
  33791. #else
  33792. "adc r5, %[r]\n\t"
  33793. #endif
  33794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33795. "lsrs r6, %[a], #16\n\t"
  33796. #else
  33797. "lsr r6, %[a], #16\n\t"
  33798. #endif
  33799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33800. "lsrs r7, %[b], #16\n\t"
  33801. #else
  33802. "lsr r7, %[b], #16\n\t"
  33803. #endif
  33804. #ifdef WOLFSSL_KEIL
  33805. "muls r7, r6, r7\n\t"
  33806. #elif defined(__clang__)
  33807. "muls r7, r6\n\t"
  33808. #else
  33809. "mul r7, r6\n\t"
  33810. #endif
  33811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33812. "adds r4, r4, r7\n\t"
  33813. #else
  33814. "add r4, r4, r7\n\t"
  33815. #endif
  33816. #ifdef WOLFSSL_KEIL
  33817. "adcs r5, r5, %[r]\n\t"
  33818. #elif defined(__clang__)
  33819. "adcs r5, %[r]\n\t"
  33820. #else
  33821. "adc r5, %[r]\n\t"
  33822. #endif
  33823. "uxth r7, %[b]\n\t"
  33824. #ifdef WOLFSSL_KEIL
  33825. "muls r6, r7, r6\n\t"
  33826. #elif defined(__clang__)
  33827. "muls r6, r7\n\t"
  33828. #else
  33829. "mul r6, r7\n\t"
  33830. #endif
  33831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33832. "lsrs r7, r6, #16\n\t"
  33833. #else
  33834. "lsr r7, r6, #16\n\t"
  33835. #endif
  33836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33837. "lsls r6, r6, #16\n\t"
  33838. #else
  33839. "lsl r6, r6, #16\n\t"
  33840. #endif
  33841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33842. "adds r3, r3, r6\n\t"
  33843. #else
  33844. "add r3, r3, r6\n\t"
  33845. #endif
  33846. #ifdef WOLFSSL_KEIL
  33847. "adcs r4, r4, r7\n\t"
  33848. #elif defined(__clang__)
  33849. "adcs r4, r7\n\t"
  33850. #else
  33851. "adc r4, r7\n\t"
  33852. #endif
  33853. #ifdef WOLFSSL_KEIL
  33854. "adcs r5, r5, %[r]\n\t"
  33855. #elif defined(__clang__)
  33856. "adcs r5, %[r]\n\t"
  33857. #else
  33858. "adc r5, %[r]\n\t"
  33859. #endif
  33860. "# A[2] * B[4]\n\t"
  33861. "mov %[a], r9\n\t"
  33862. "mov %[b], r10\n\t"
  33863. "ldr %[a], [%[a], #8]\n\t"
  33864. "ldr %[b], [%[b], #16]\n\t"
  33865. "uxth r6, %[a]\n\t"
  33866. "uxth r7, %[b]\n\t"
  33867. #ifdef WOLFSSL_KEIL
  33868. "muls r7, r6, r7\n\t"
  33869. #elif defined(__clang__)
  33870. "muls r7, r6\n\t"
  33871. #else
  33872. "mul r7, r6\n\t"
  33873. #endif
  33874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33875. "adds r3, r3, r7\n\t"
  33876. #else
  33877. "add r3, r3, r7\n\t"
  33878. #endif
  33879. #ifdef WOLFSSL_KEIL
  33880. "adcs r4, r4, %[r]\n\t"
  33881. #elif defined(__clang__)
  33882. "adcs r4, %[r]\n\t"
  33883. #else
  33884. "adc r4, %[r]\n\t"
  33885. #endif
  33886. #ifdef WOLFSSL_KEIL
  33887. "adcs r5, r5, %[r]\n\t"
  33888. #elif defined(__clang__)
  33889. "adcs r5, %[r]\n\t"
  33890. #else
  33891. "adc r5, %[r]\n\t"
  33892. #endif
  33893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33894. "lsrs r7, %[b], #16\n\t"
  33895. #else
  33896. "lsr r7, %[b], #16\n\t"
  33897. #endif
  33898. #ifdef WOLFSSL_KEIL
  33899. "muls r6, r7, r6\n\t"
  33900. #elif defined(__clang__)
  33901. "muls r6, r7\n\t"
  33902. #else
  33903. "mul r6, r7\n\t"
  33904. #endif
  33905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33906. "lsrs r7, r6, #16\n\t"
  33907. #else
  33908. "lsr r7, r6, #16\n\t"
  33909. #endif
  33910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33911. "lsls r6, r6, #16\n\t"
  33912. #else
  33913. "lsl r6, r6, #16\n\t"
  33914. #endif
  33915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33916. "adds r3, r3, r6\n\t"
  33917. #else
  33918. "add r3, r3, r6\n\t"
  33919. #endif
  33920. #ifdef WOLFSSL_KEIL
  33921. "adcs r4, r4, r7\n\t"
  33922. #elif defined(__clang__)
  33923. "adcs r4, r7\n\t"
  33924. #else
  33925. "adc r4, r7\n\t"
  33926. #endif
  33927. #ifdef WOLFSSL_KEIL
  33928. "adcs r5, r5, %[r]\n\t"
  33929. #elif defined(__clang__)
  33930. "adcs r5, %[r]\n\t"
  33931. #else
  33932. "adc r5, %[r]\n\t"
  33933. #endif
  33934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33935. "lsrs r6, %[a], #16\n\t"
  33936. #else
  33937. "lsr r6, %[a], #16\n\t"
  33938. #endif
  33939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33940. "lsrs r7, %[b], #16\n\t"
  33941. #else
  33942. "lsr r7, %[b], #16\n\t"
  33943. #endif
  33944. #ifdef WOLFSSL_KEIL
  33945. "muls r7, r6, r7\n\t"
  33946. #elif defined(__clang__)
  33947. "muls r7, r6\n\t"
  33948. #else
  33949. "mul r7, r6\n\t"
  33950. #endif
  33951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33952. "adds r4, r4, r7\n\t"
  33953. #else
  33954. "add r4, r4, r7\n\t"
  33955. #endif
  33956. #ifdef WOLFSSL_KEIL
  33957. "adcs r5, r5, %[r]\n\t"
  33958. #elif defined(__clang__)
  33959. "adcs r5, %[r]\n\t"
  33960. #else
  33961. "adc r5, %[r]\n\t"
  33962. #endif
  33963. "uxth r7, %[b]\n\t"
  33964. #ifdef WOLFSSL_KEIL
  33965. "muls r6, r7, r6\n\t"
  33966. #elif defined(__clang__)
  33967. "muls r6, r7\n\t"
  33968. #else
  33969. "mul r6, r7\n\t"
  33970. #endif
  33971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33972. "lsrs r7, r6, #16\n\t"
  33973. #else
  33974. "lsr r7, r6, #16\n\t"
  33975. #endif
  33976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33977. "lsls r6, r6, #16\n\t"
  33978. #else
  33979. "lsl r6, r6, #16\n\t"
  33980. #endif
  33981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33982. "adds r3, r3, r6\n\t"
  33983. #else
  33984. "add r3, r3, r6\n\t"
  33985. #endif
  33986. #ifdef WOLFSSL_KEIL
  33987. "adcs r4, r4, r7\n\t"
  33988. #elif defined(__clang__)
  33989. "adcs r4, r7\n\t"
  33990. #else
  33991. "adc r4, r7\n\t"
  33992. #endif
  33993. #ifdef WOLFSSL_KEIL
  33994. "adcs r5, r5, %[r]\n\t"
  33995. #elif defined(__clang__)
  33996. "adcs r5, %[r]\n\t"
  33997. #else
  33998. "adc r5, %[r]\n\t"
  33999. #endif
  34000. "# A[1] * B[5]\n\t"
  34001. "mov %[a], r9\n\t"
  34002. "mov %[b], r10\n\t"
  34003. "ldr %[a], [%[a], #4]\n\t"
  34004. "ldr %[b], [%[b], #20]\n\t"
  34005. "uxth r6, %[a]\n\t"
  34006. "uxth r7, %[b]\n\t"
  34007. #ifdef WOLFSSL_KEIL
  34008. "muls r7, r6, r7\n\t"
  34009. #elif defined(__clang__)
  34010. "muls r7, r6\n\t"
  34011. #else
  34012. "mul r7, r6\n\t"
  34013. #endif
  34014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34015. "adds r3, r3, r7\n\t"
  34016. #else
  34017. "add r3, r3, r7\n\t"
  34018. #endif
  34019. #ifdef WOLFSSL_KEIL
  34020. "adcs r4, r4, %[r]\n\t"
  34021. #elif defined(__clang__)
  34022. "adcs r4, %[r]\n\t"
  34023. #else
  34024. "adc r4, %[r]\n\t"
  34025. #endif
  34026. #ifdef WOLFSSL_KEIL
  34027. "adcs r5, r5, %[r]\n\t"
  34028. #elif defined(__clang__)
  34029. "adcs r5, %[r]\n\t"
  34030. #else
  34031. "adc r5, %[r]\n\t"
  34032. #endif
  34033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34034. "lsrs r7, %[b], #16\n\t"
  34035. #else
  34036. "lsr r7, %[b], #16\n\t"
  34037. #endif
  34038. #ifdef WOLFSSL_KEIL
  34039. "muls r6, r7, r6\n\t"
  34040. #elif defined(__clang__)
  34041. "muls r6, r7\n\t"
  34042. #else
  34043. "mul r6, r7\n\t"
  34044. #endif
  34045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34046. "lsrs r7, r6, #16\n\t"
  34047. #else
  34048. "lsr r7, r6, #16\n\t"
  34049. #endif
  34050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34051. "lsls r6, r6, #16\n\t"
  34052. #else
  34053. "lsl r6, r6, #16\n\t"
  34054. #endif
  34055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34056. "adds r3, r3, r6\n\t"
  34057. #else
  34058. "add r3, r3, r6\n\t"
  34059. #endif
  34060. #ifdef WOLFSSL_KEIL
  34061. "adcs r4, r4, r7\n\t"
  34062. #elif defined(__clang__)
  34063. "adcs r4, r7\n\t"
  34064. #else
  34065. "adc r4, r7\n\t"
  34066. #endif
  34067. #ifdef WOLFSSL_KEIL
  34068. "adcs r5, r5, %[r]\n\t"
  34069. #elif defined(__clang__)
  34070. "adcs r5, %[r]\n\t"
  34071. #else
  34072. "adc r5, %[r]\n\t"
  34073. #endif
  34074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34075. "lsrs r6, %[a], #16\n\t"
  34076. #else
  34077. "lsr r6, %[a], #16\n\t"
  34078. #endif
  34079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34080. "lsrs r7, %[b], #16\n\t"
  34081. #else
  34082. "lsr r7, %[b], #16\n\t"
  34083. #endif
  34084. #ifdef WOLFSSL_KEIL
  34085. "muls r7, r6, r7\n\t"
  34086. #elif defined(__clang__)
  34087. "muls r7, r6\n\t"
  34088. #else
  34089. "mul r7, r6\n\t"
  34090. #endif
  34091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34092. "adds r4, r4, r7\n\t"
  34093. #else
  34094. "add r4, r4, r7\n\t"
  34095. #endif
  34096. #ifdef WOLFSSL_KEIL
  34097. "adcs r5, r5, %[r]\n\t"
  34098. #elif defined(__clang__)
  34099. "adcs r5, %[r]\n\t"
  34100. #else
  34101. "adc r5, %[r]\n\t"
  34102. #endif
  34103. "uxth r7, %[b]\n\t"
  34104. #ifdef WOLFSSL_KEIL
  34105. "muls r6, r7, r6\n\t"
  34106. #elif defined(__clang__)
  34107. "muls r6, r7\n\t"
  34108. #else
  34109. "mul r6, r7\n\t"
  34110. #endif
  34111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34112. "lsrs r7, r6, #16\n\t"
  34113. #else
  34114. "lsr r7, r6, #16\n\t"
  34115. #endif
  34116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34117. "lsls r6, r6, #16\n\t"
  34118. #else
  34119. "lsl r6, r6, #16\n\t"
  34120. #endif
  34121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34122. "adds r3, r3, r6\n\t"
  34123. #else
  34124. "add r3, r3, r6\n\t"
  34125. #endif
  34126. #ifdef WOLFSSL_KEIL
  34127. "adcs r4, r4, r7\n\t"
  34128. #elif defined(__clang__)
  34129. "adcs r4, r7\n\t"
  34130. #else
  34131. "adc r4, r7\n\t"
  34132. #endif
  34133. #ifdef WOLFSSL_KEIL
  34134. "adcs r5, r5, %[r]\n\t"
  34135. #elif defined(__clang__)
  34136. "adcs r5, %[r]\n\t"
  34137. #else
  34138. "adc r5, %[r]\n\t"
  34139. #endif
  34140. "# A[0] * B[6]\n\t"
  34141. "mov %[a], r9\n\t"
  34142. "mov %[b], r10\n\t"
  34143. "ldr %[a], [%[a]]\n\t"
  34144. "ldr %[b], [%[b], #24]\n\t"
  34145. "uxth r6, %[a]\n\t"
  34146. "uxth r7, %[b]\n\t"
  34147. #ifdef WOLFSSL_KEIL
  34148. "muls r7, r6, r7\n\t"
  34149. #elif defined(__clang__)
  34150. "muls r7, r6\n\t"
  34151. #else
  34152. "mul r7, r6\n\t"
  34153. #endif
  34154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34155. "adds r3, r3, r7\n\t"
  34156. #else
  34157. "add r3, r3, r7\n\t"
  34158. #endif
  34159. #ifdef WOLFSSL_KEIL
  34160. "adcs r4, r4, %[r]\n\t"
  34161. #elif defined(__clang__)
  34162. "adcs r4, %[r]\n\t"
  34163. #else
  34164. "adc r4, %[r]\n\t"
  34165. #endif
  34166. #ifdef WOLFSSL_KEIL
  34167. "adcs r5, r5, %[r]\n\t"
  34168. #elif defined(__clang__)
  34169. "adcs r5, %[r]\n\t"
  34170. #else
  34171. "adc r5, %[r]\n\t"
  34172. #endif
  34173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34174. "lsrs r7, %[b], #16\n\t"
  34175. #else
  34176. "lsr r7, %[b], #16\n\t"
  34177. #endif
  34178. #ifdef WOLFSSL_KEIL
  34179. "muls r6, r7, r6\n\t"
  34180. #elif defined(__clang__)
  34181. "muls r6, r7\n\t"
  34182. #else
  34183. "mul r6, r7\n\t"
  34184. #endif
  34185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34186. "lsrs r7, r6, #16\n\t"
  34187. #else
  34188. "lsr r7, r6, #16\n\t"
  34189. #endif
  34190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34191. "lsls r6, r6, #16\n\t"
  34192. #else
  34193. "lsl r6, r6, #16\n\t"
  34194. #endif
  34195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34196. "adds r3, r3, r6\n\t"
  34197. #else
  34198. "add r3, r3, r6\n\t"
  34199. #endif
  34200. #ifdef WOLFSSL_KEIL
  34201. "adcs r4, r4, r7\n\t"
  34202. #elif defined(__clang__)
  34203. "adcs r4, r7\n\t"
  34204. #else
  34205. "adc r4, r7\n\t"
  34206. #endif
  34207. #ifdef WOLFSSL_KEIL
  34208. "adcs r5, r5, %[r]\n\t"
  34209. #elif defined(__clang__)
  34210. "adcs r5, %[r]\n\t"
  34211. #else
  34212. "adc r5, %[r]\n\t"
  34213. #endif
  34214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34215. "lsrs r6, %[a], #16\n\t"
  34216. #else
  34217. "lsr r6, %[a], #16\n\t"
  34218. #endif
  34219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34220. "lsrs r7, %[b], #16\n\t"
  34221. #else
  34222. "lsr r7, %[b], #16\n\t"
  34223. #endif
  34224. #ifdef WOLFSSL_KEIL
  34225. "muls r7, r6, r7\n\t"
  34226. #elif defined(__clang__)
  34227. "muls r7, r6\n\t"
  34228. #else
  34229. "mul r7, r6\n\t"
  34230. #endif
  34231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34232. "adds r4, r4, r7\n\t"
  34233. #else
  34234. "add r4, r4, r7\n\t"
  34235. #endif
  34236. #ifdef WOLFSSL_KEIL
  34237. "adcs r5, r5, %[r]\n\t"
  34238. #elif defined(__clang__)
  34239. "adcs r5, %[r]\n\t"
  34240. #else
  34241. "adc r5, %[r]\n\t"
  34242. #endif
  34243. "uxth r7, %[b]\n\t"
  34244. #ifdef WOLFSSL_KEIL
  34245. "muls r6, r7, r6\n\t"
  34246. #elif defined(__clang__)
  34247. "muls r6, r7\n\t"
  34248. #else
  34249. "mul r6, r7\n\t"
  34250. #endif
  34251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34252. "lsrs r7, r6, #16\n\t"
  34253. #else
  34254. "lsr r7, r6, #16\n\t"
  34255. #endif
  34256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34257. "lsls r6, r6, #16\n\t"
  34258. #else
  34259. "lsl r6, r6, #16\n\t"
  34260. #endif
  34261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34262. "adds r3, r3, r6\n\t"
  34263. #else
  34264. "add r3, r3, r6\n\t"
  34265. #endif
  34266. #ifdef WOLFSSL_KEIL
  34267. "adcs r4, r4, r7\n\t"
  34268. #elif defined(__clang__)
  34269. "adcs r4, r7\n\t"
  34270. #else
  34271. "adc r4, r7\n\t"
  34272. #endif
  34273. #ifdef WOLFSSL_KEIL
  34274. "adcs r5, r5, %[r]\n\t"
  34275. #elif defined(__clang__)
  34276. "adcs r5, %[r]\n\t"
  34277. #else
  34278. "adc r5, %[r]\n\t"
  34279. #endif
  34280. "str r3, [sp, #24]\n\t"
  34281. "# A[0] * B[7]\n\t"
  34282. "movs r3, #0\n\t"
  34283. "mov %[a], r9\n\t"
  34284. "mov %[b], r10\n\t"
  34285. "ldr %[a], [%[a]]\n\t"
  34286. "ldr %[b], [%[b], #28]\n\t"
  34287. "uxth r6, %[a]\n\t"
  34288. "uxth r7, %[b]\n\t"
  34289. #ifdef WOLFSSL_KEIL
  34290. "muls r7, r6, r7\n\t"
  34291. #elif defined(__clang__)
  34292. "muls r7, r6\n\t"
  34293. #else
  34294. "mul r7, r6\n\t"
  34295. #endif
  34296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34297. "adds r4, r4, r7\n\t"
  34298. #else
  34299. "add r4, r4, r7\n\t"
  34300. #endif
  34301. #ifdef WOLFSSL_KEIL
  34302. "adcs r5, r5, %[r]\n\t"
  34303. #elif defined(__clang__)
  34304. "adcs r5, %[r]\n\t"
  34305. #else
  34306. "adc r5, %[r]\n\t"
  34307. #endif
  34308. #ifdef WOLFSSL_KEIL
  34309. "adcs r3, r3, %[r]\n\t"
  34310. #elif defined(__clang__)
  34311. "adcs r3, %[r]\n\t"
  34312. #else
  34313. "adc r3, %[r]\n\t"
  34314. #endif
  34315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34316. "lsrs r7, %[b], #16\n\t"
  34317. #else
  34318. "lsr r7, %[b], #16\n\t"
  34319. #endif
  34320. #ifdef WOLFSSL_KEIL
  34321. "muls r6, r7, r6\n\t"
  34322. #elif defined(__clang__)
  34323. "muls r6, r7\n\t"
  34324. #else
  34325. "mul r6, r7\n\t"
  34326. #endif
  34327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34328. "lsrs r7, r6, #16\n\t"
  34329. #else
  34330. "lsr r7, r6, #16\n\t"
  34331. #endif
  34332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34333. "lsls r6, r6, #16\n\t"
  34334. #else
  34335. "lsl r6, r6, #16\n\t"
  34336. #endif
  34337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34338. "adds r4, r4, r6\n\t"
  34339. #else
  34340. "add r4, r4, r6\n\t"
  34341. #endif
  34342. #ifdef WOLFSSL_KEIL
  34343. "adcs r5, r5, r7\n\t"
  34344. #elif defined(__clang__)
  34345. "adcs r5, r7\n\t"
  34346. #else
  34347. "adc r5, r7\n\t"
  34348. #endif
  34349. #ifdef WOLFSSL_KEIL
  34350. "adcs r3, r3, %[r]\n\t"
  34351. #elif defined(__clang__)
  34352. "adcs r3, %[r]\n\t"
  34353. #else
  34354. "adc r3, %[r]\n\t"
  34355. #endif
  34356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34357. "lsrs r6, %[a], #16\n\t"
  34358. #else
  34359. "lsr r6, %[a], #16\n\t"
  34360. #endif
  34361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34362. "lsrs r7, %[b], #16\n\t"
  34363. #else
  34364. "lsr r7, %[b], #16\n\t"
  34365. #endif
  34366. #ifdef WOLFSSL_KEIL
  34367. "muls r7, r6, r7\n\t"
  34368. #elif defined(__clang__)
  34369. "muls r7, r6\n\t"
  34370. #else
  34371. "mul r7, r6\n\t"
  34372. #endif
  34373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34374. "adds r5, r5, r7\n\t"
  34375. #else
  34376. "add r5, r5, r7\n\t"
  34377. #endif
  34378. #ifdef WOLFSSL_KEIL
  34379. "adcs r3, r3, %[r]\n\t"
  34380. #elif defined(__clang__)
  34381. "adcs r3, %[r]\n\t"
  34382. #else
  34383. "adc r3, %[r]\n\t"
  34384. #endif
  34385. "uxth r7, %[b]\n\t"
  34386. #ifdef WOLFSSL_KEIL
  34387. "muls r6, r7, r6\n\t"
  34388. #elif defined(__clang__)
  34389. "muls r6, r7\n\t"
  34390. #else
  34391. "mul r6, r7\n\t"
  34392. #endif
  34393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34394. "lsrs r7, r6, #16\n\t"
  34395. #else
  34396. "lsr r7, r6, #16\n\t"
  34397. #endif
  34398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34399. "lsls r6, r6, #16\n\t"
  34400. #else
  34401. "lsl r6, r6, #16\n\t"
  34402. #endif
  34403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34404. "adds r4, r4, r6\n\t"
  34405. #else
  34406. "add r4, r4, r6\n\t"
  34407. #endif
  34408. #ifdef WOLFSSL_KEIL
  34409. "adcs r5, r5, r7\n\t"
  34410. #elif defined(__clang__)
  34411. "adcs r5, r7\n\t"
  34412. #else
  34413. "adc r5, r7\n\t"
  34414. #endif
  34415. #ifdef WOLFSSL_KEIL
  34416. "adcs r3, r3, %[r]\n\t"
  34417. #elif defined(__clang__)
  34418. "adcs r3, %[r]\n\t"
  34419. #else
  34420. "adc r3, %[r]\n\t"
  34421. #endif
  34422. "# A[1] * B[6]\n\t"
  34423. "mov %[a], r9\n\t"
  34424. "mov %[b], r10\n\t"
  34425. "ldr %[a], [%[a], #4]\n\t"
  34426. "ldr %[b], [%[b], #24]\n\t"
  34427. "uxth r6, %[a]\n\t"
  34428. "uxth r7, %[b]\n\t"
  34429. #ifdef WOLFSSL_KEIL
  34430. "muls r7, r6, r7\n\t"
  34431. #elif defined(__clang__)
  34432. "muls r7, r6\n\t"
  34433. #else
  34434. "mul r7, r6\n\t"
  34435. #endif
  34436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34437. "adds r4, r4, r7\n\t"
  34438. #else
  34439. "add r4, r4, r7\n\t"
  34440. #endif
  34441. #ifdef WOLFSSL_KEIL
  34442. "adcs r5, r5, %[r]\n\t"
  34443. #elif defined(__clang__)
  34444. "adcs r5, %[r]\n\t"
  34445. #else
  34446. "adc r5, %[r]\n\t"
  34447. #endif
  34448. #ifdef WOLFSSL_KEIL
  34449. "adcs r3, r3, %[r]\n\t"
  34450. #elif defined(__clang__)
  34451. "adcs r3, %[r]\n\t"
  34452. #else
  34453. "adc r3, %[r]\n\t"
  34454. #endif
  34455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34456. "lsrs r7, %[b], #16\n\t"
  34457. #else
  34458. "lsr r7, %[b], #16\n\t"
  34459. #endif
  34460. #ifdef WOLFSSL_KEIL
  34461. "muls r6, r7, r6\n\t"
  34462. #elif defined(__clang__)
  34463. "muls r6, r7\n\t"
  34464. #else
  34465. "mul r6, r7\n\t"
  34466. #endif
  34467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34468. "lsrs r7, r6, #16\n\t"
  34469. #else
  34470. "lsr r7, r6, #16\n\t"
  34471. #endif
  34472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34473. "lsls r6, r6, #16\n\t"
  34474. #else
  34475. "lsl r6, r6, #16\n\t"
  34476. #endif
  34477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34478. "adds r4, r4, r6\n\t"
  34479. #else
  34480. "add r4, r4, r6\n\t"
  34481. #endif
  34482. #ifdef WOLFSSL_KEIL
  34483. "adcs r5, r5, r7\n\t"
  34484. #elif defined(__clang__)
  34485. "adcs r5, r7\n\t"
  34486. #else
  34487. "adc r5, r7\n\t"
  34488. #endif
  34489. #ifdef WOLFSSL_KEIL
  34490. "adcs r3, r3, %[r]\n\t"
  34491. #elif defined(__clang__)
  34492. "adcs r3, %[r]\n\t"
  34493. #else
  34494. "adc r3, %[r]\n\t"
  34495. #endif
  34496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34497. "lsrs r6, %[a], #16\n\t"
  34498. #else
  34499. "lsr r6, %[a], #16\n\t"
  34500. #endif
  34501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34502. "lsrs r7, %[b], #16\n\t"
  34503. #else
  34504. "lsr r7, %[b], #16\n\t"
  34505. #endif
  34506. #ifdef WOLFSSL_KEIL
  34507. "muls r7, r6, r7\n\t"
  34508. #elif defined(__clang__)
  34509. "muls r7, r6\n\t"
  34510. #else
  34511. "mul r7, r6\n\t"
  34512. #endif
  34513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34514. "adds r5, r5, r7\n\t"
  34515. #else
  34516. "add r5, r5, r7\n\t"
  34517. #endif
  34518. #ifdef WOLFSSL_KEIL
  34519. "adcs r3, r3, %[r]\n\t"
  34520. #elif defined(__clang__)
  34521. "adcs r3, %[r]\n\t"
  34522. #else
  34523. "adc r3, %[r]\n\t"
  34524. #endif
  34525. "uxth r7, %[b]\n\t"
  34526. #ifdef WOLFSSL_KEIL
  34527. "muls r6, r7, r6\n\t"
  34528. #elif defined(__clang__)
  34529. "muls r6, r7\n\t"
  34530. #else
  34531. "mul r6, r7\n\t"
  34532. #endif
  34533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34534. "lsrs r7, r6, #16\n\t"
  34535. #else
  34536. "lsr r7, r6, #16\n\t"
  34537. #endif
  34538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34539. "lsls r6, r6, #16\n\t"
  34540. #else
  34541. "lsl r6, r6, #16\n\t"
  34542. #endif
  34543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34544. "adds r4, r4, r6\n\t"
  34545. #else
  34546. "add r4, r4, r6\n\t"
  34547. #endif
  34548. #ifdef WOLFSSL_KEIL
  34549. "adcs r5, r5, r7\n\t"
  34550. #elif defined(__clang__)
  34551. "adcs r5, r7\n\t"
  34552. #else
  34553. "adc r5, r7\n\t"
  34554. #endif
  34555. #ifdef WOLFSSL_KEIL
  34556. "adcs r3, r3, %[r]\n\t"
  34557. #elif defined(__clang__)
  34558. "adcs r3, %[r]\n\t"
  34559. #else
  34560. "adc r3, %[r]\n\t"
  34561. #endif
  34562. "# A[2] * B[5]\n\t"
  34563. "mov %[a], r9\n\t"
  34564. "mov %[b], r10\n\t"
  34565. "ldr %[a], [%[a], #8]\n\t"
  34566. "ldr %[b], [%[b], #20]\n\t"
  34567. "uxth r6, %[a]\n\t"
  34568. "uxth r7, %[b]\n\t"
  34569. #ifdef WOLFSSL_KEIL
  34570. "muls r7, r6, r7\n\t"
  34571. #elif defined(__clang__)
  34572. "muls r7, r6\n\t"
  34573. #else
  34574. "mul r7, r6\n\t"
  34575. #endif
  34576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34577. "adds r4, r4, r7\n\t"
  34578. #else
  34579. "add r4, r4, r7\n\t"
  34580. #endif
  34581. #ifdef WOLFSSL_KEIL
  34582. "adcs r5, r5, %[r]\n\t"
  34583. #elif defined(__clang__)
  34584. "adcs r5, %[r]\n\t"
  34585. #else
  34586. "adc r5, %[r]\n\t"
  34587. #endif
  34588. #ifdef WOLFSSL_KEIL
  34589. "adcs r3, r3, %[r]\n\t"
  34590. #elif defined(__clang__)
  34591. "adcs r3, %[r]\n\t"
  34592. #else
  34593. "adc r3, %[r]\n\t"
  34594. #endif
  34595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34596. "lsrs r7, %[b], #16\n\t"
  34597. #else
  34598. "lsr r7, %[b], #16\n\t"
  34599. #endif
  34600. #ifdef WOLFSSL_KEIL
  34601. "muls r6, r7, r6\n\t"
  34602. #elif defined(__clang__)
  34603. "muls r6, r7\n\t"
  34604. #else
  34605. "mul r6, r7\n\t"
  34606. #endif
  34607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34608. "lsrs r7, r6, #16\n\t"
  34609. #else
  34610. "lsr r7, r6, #16\n\t"
  34611. #endif
  34612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34613. "lsls r6, r6, #16\n\t"
  34614. #else
  34615. "lsl r6, r6, #16\n\t"
  34616. #endif
  34617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34618. "adds r4, r4, r6\n\t"
  34619. #else
  34620. "add r4, r4, r6\n\t"
  34621. #endif
  34622. #ifdef WOLFSSL_KEIL
  34623. "adcs r5, r5, r7\n\t"
  34624. #elif defined(__clang__)
  34625. "adcs r5, r7\n\t"
  34626. #else
  34627. "adc r5, r7\n\t"
  34628. #endif
  34629. #ifdef WOLFSSL_KEIL
  34630. "adcs r3, r3, %[r]\n\t"
  34631. #elif defined(__clang__)
  34632. "adcs r3, %[r]\n\t"
  34633. #else
  34634. "adc r3, %[r]\n\t"
  34635. #endif
  34636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34637. "lsrs r6, %[a], #16\n\t"
  34638. #else
  34639. "lsr r6, %[a], #16\n\t"
  34640. #endif
  34641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34642. "lsrs r7, %[b], #16\n\t"
  34643. #else
  34644. "lsr r7, %[b], #16\n\t"
  34645. #endif
  34646. #ifdef WOLFSSL_KEIL
  34647. "muls r7, r6, r7\n\t"
  34648. #elif defined(__clang__)
  34649. "muls r7, r6\n\t"
  34650. #else
  34651. "mul r7, r6\n\t"
  34652. #endif
  34653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34654. "adds r5, r5, r7\n\t"
  34655. #else
  34656. "add r5, r5, r7\n\t"
  34657. #endif
  34658. #ifdef WOLFSSL_KEIL
  34659. "adcs r3, r3, %[r]\n\t"
  34660. #elif defined(__clang__)
  34661. "adcs r3, %[r]\n\t"
  34662. #else
  34663. "adc r3, %[r]\n\t"
  34664. #endif
  34665. "uxth r7, %[b]\n\t"
  34666. #ifdef WOLFSSL_KEIL
  34667. "muls r6, r7, r6\n\t"
  34668. #elif defined(__clang__)
  34669. "muls r6, r7\n\t"
  34670. #else
  34671. "mul r6, r7\n\t"
  34672. #endif
  34673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34674. "lsrs r7, r6, #16\n\t"
  34675. #else
  34676. "lsr r7, r6, #16\n\t"
  34677. #endif
  34678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34679. "lsls r6, r6, #16\n\t"
  34680. #else
  34681. "lsl r6, r6, #16\n\t"
  34682. #endif
  34683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34684. "adds r4, r4, r6\n\t"
  34685. #else
  34686. "add r4, r4, r6\n\t"
  34687. #endif
  34688. #ifdef WOLFSSL_KEIL
  34689. "adcs r5, r5, r7\n\t"
  34690. #elif defined(__clang__)
  34691. "adcs r5, r7\n\t"
  34692. #else
  34693. "adc r5, r7\n\t"
  34694. #endif
  34695. #ifdef WOLFSSL_KEIL
  34696. "adcs r3, r3, %[r]\n\t"
  34697. #elif defined(__clang__)
  34698. "adcs r3, %[r]\n\t"
  34699. #else
  34700. "adc r3, %[r]\n\t"
  34701. #endif
  34702. "# A[3] * B[4]\n\t"
  34703. "mov %[a], r9\n\t"
  34704. "mov %[b], r10\n\t"
  34705. "ldr %[a], [%[a], #12]\n\t"
  34706. "ldr %[b], [%[b], #16]\n\t"
  34707. "uxth r6, %[a]\n\t"
  34708. "uxth r7, %[b]\n\t"
  34709. #ifdef WOLFSSL_KEIL
  34710. "muls r7, r6, r7\n\t"
  34711. #elif defined(__clang__)
  34712. "muls r7, r6\n\t"
  34713. #else
  34714. "mul r7, r6\n\t"
  34715. #endif
  34716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34717. "adds r4, r4, r7\n\t"
  34718. #else
  34719. "add r4, r4, r7\n\t"
  34720. #endif
  34721. #ifdef WOLFSSL_KEIL
  34722. "adcs r5, r5, %[r]\n\t"
  34723. #elif defined(__clang__)
  34724. "adcs r5, %[r]\n\t"
  34725. #else
  34726. "adc r5, %[r]\n\t"
  34727. #endif
  34728. #ifdef WOLFSSL_KEIL
  34729. "adcs r3, r3, %[r]\n\t"
  34730. #elif defined(__clang__)
  34731. "adcs r3, %[r]\n\t"
  34732. #else
  34733. "adc r3, %[r]\n\t"
  34734. #endif
  34735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34736. "lsrs r7, %[b], #16\n\t"
  34737. #else
  34738. "lsr r7, %[b], #16\n\t"
  34739. #endif
  34740. #ifdef WOLFSSL_KEIL
  34741. "muls r6, r7, r6\n\t"
  34742. #elif defined(__clang__)
  34743. "muls r6, r7\n\t"
  34744. #else
  34745. "mul r6, r7\n\t"
  34746. #endif
  34747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34748. "lsrs r7, r6, #16\n\t"
  34749. #else
  34750. "lsr r7, r6, #16\n\t"
  34751. #endif
  34752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34753. "lsls r6, r6, #16\n\t"
  34754. #else
  34755. "lsl r6, r6, #16\n\t"
  34756. #endif
  34757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34758. "adds r4, r4, r6\n\t"
  34759. #else
  34760. "add r4, r4, r6\n\t"
  34761. #endif
  34762. #ifdef WOLFSSL_KEIL
  34763. "adcs r5, r5, r7\n\t"
  34764. #elif defined(__clang__)
  34765. "adcs r5, r7\n\t"
  34766. #else
  34767. "adc r5, r7\n\t"
  34768. #endif
  34769. #ifdef WOLFSSL_KEIL
  34770. "adcs r3, r3, %[r]\n\t"
  34771. #elif defined(__clang__)
  34772. "adcs r3, %[r]\n\t"
  34773. #else
  34774. "adc r3, %[r]\n\t"
  34775. #endif
  34776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34777. "lsrs r6, %[a], #16\n\t"
  34778. #else
  34779. "lsr r6, %[a], #16\n\t"
  34780. #endif
  34781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34782. "lsrs r7, %[b], #16\n\t"
  34783. #else
  34784. "lsr r7, %[b], #16\n\t"
  34785. #endif
  34786. #ifdef WOLFSSL_KEIL
  34787. "muls r7, r6, r7\n\t"
  34788. #elif defined(__clang__)
  34789. "muls r7, r6\n\t"
  34790. #else
  34791. "mul r7, r6\n\t"
  34792. #endif
  34793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34794. "adds r5, r5, r7\n\t"
  34795. #else
  34796. "add r5, r5, r7\n\t"
  34797. #endif
  34798. #ifdef WOLFSSL_KEIL
  34799. "adcs r3, r3, %[r]\n\t"
  34800. #elif defined(__clang__)
  34801. "adcs r3, %[r]\n\t"
  34802. #else
  34803. "adc r3, %[r]\n\t"
  34804. #endif
  34805. "uxth r7, %[b]\n\t"
  34806. #ifdef WOLFSSL_KEIL
  34807. "muls r6, r7, r6\n\t"
  34808. #elif defined(__clang__)
  34809. "muls r6, r7\n\t"
  34810. #else
  34811. "mul r6, r7\n\t"
  34812. #endif
  34813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34814. "lsrs r7, r6, #16\n\t"
  34815. #else
  34816. "lsr r7, r6, #16\n\t"
  34817. #endif
  34818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34819. "lsls r6, r6, #16\n\t"
  34820. #else
  34821. "lsl r6, r6, #16\n\t"
  34822. #endif
  34823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34824. "adds r4, r4, r6\n\t"
  34825. #else
  34826. "add r4, r4, r6\n\t"
  34827. #endif
  34828. #ifdef WOLFSSL_KEIL
  34829. "adcs r5, r5, r7\n\t"
  34830. #elif defined(__clang__)
  34831. "adcs r5, r7\n\t"
  34832. #else
  34833. "adc r5, r7\n\t"
  34834. #endif
  34835. #ifdef WOLFSSL_KEIL
  34836. "adcs r3, r3, %[r]\n\t"
  34837. #elif defined(__clang__)
  34838. "adcs r3, %[r]\n\t"
  34839. #else
  34840. "adc r3, %[r]\n\t"
  34841. #endif
  34842. "# A[4] * B[3]\n\t"
  34843. "mov %[a], r9\n\t"
  34844. "mov %[b], r10\n\t"
  34845. "ldr %[a], [%[a], #16]\n\t"
  34846. "ldr %[b], [%[b], #12]\n\t"
  34847. "uxth r6, %[a]\n\t"
  34848. "uxth r7, %[b]\n\t"
  34849. #ifdef WOLFSSL_KEIL
  34850. "muls r7, r6, r7\n\t"
  34851. #elif defined(__clang__)
  34852. "muls r7, r6\n\t"
  34853. #else
  34854. "mul r7, r6\n\t"
  34855. #endif
  34856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34857. "adds r4, r4, r7\n\t"
  34858. #else
  34859. "add r4, r4, r7\n\t"
  34860. #endif
  34861. #ifdef WOLFSSL_KEIL
  34862. "adcs r5, r5, %[r]\n\t"
  34863. #elif defined(__clang__)
  34864. "adcs r5, %[r]\n\t"
  34865. #else
  34866. "adc r5, %[r]\n\t"
  34867. #endif
  34868. #ifdef WOLFSSL_KEIL
  34869. "adcs r3, r3, %[r]\n\t"
  34870. #elif defined(__clang__)
  34871. "adcs r3, %[r]\n\t"
  34872. #else
  34873. "adc r3, %[r]\n\t"
  34874. #endif
  34875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34876. "lsrs r7, %[b], #16\n\t"
  34877. #else
  34878. "lsr r7, %[b], #16\n\t"
  34879. #endif
  34880. #ifdef WOLFSSL_KEIL
  34881. "muls r6, r7, r6\n\t"
  34882. #elif defined(__clang__)
  34883. "muls r6, r7\n\t"
  34884. #else
  34885. "mul r6, r7\n\t"
  34886. #endif
  34887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34888. "lsrs r7, r6, #16\n\t"
  34889. #else
  34890. "lsr r7, r6, #16\n\t"
  34891. #endif
  34892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34893. "lsls r6, r6, #16\n\t"
  34894. #else
  34895. "lsl r6, r6, #16\n\t"
  34896. #endif
  34897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34898. "adds r4, r4, r6\n\t"
  34899. #else
  34900. "add r4, r4, r6\n\t"
  34901. #endif
  34902. #ifdef WOLFSSL_KEIL
  34903. "adcs r5, r5, r7\n\t"
  34904. #elif defined(__clang__)
  34905. "adcs r5, r7\n\t"
  34906. #else
  34907. "adc r5, r7\n\t"
  34908. #endif
  34909. #ifdef WOLFSSL_KEIL
  34910. "adcs r3, r3, %[r]\n\t"
  34911. #elif defined(__clang__)
  34912. "adcs r3, %[r]\n\t"
  34913. #else
  34914. "adc r3, %[r]\n\t"
  34915. #endif
  34916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34917. "lsrs r6, %[a], #16\n\t"
  34918. #else
  34919. "lsr r6, %[a], #16\n\t"
  34920. #endif
  34921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34922. "lsrs r7, %[b], #16\n\t"
  34923. #else
  34924. "lsr r7, %[b], #16\n\t"
  34925. #endif
  34926. #ifdef WOLFSSL_KEIL
  34927. "muls r7, r6, r7\n\t"
  34928. #elif defined(__clang__)
  34929. "muls r7, r6\n\t"
  34930. #else
  34931. "mul r7, r6\n\t"
  34932. #endif
  34933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34934. "adds r5, r5, r7\n\t"
  34935. #else
  34936. "add r5, r5, r7\n\t"
  34937. #endif
  34938. #ifdef WOLFSSL_KEIL
  34939. "adcs r3, r3, %[r]\n\t"
  34940. #elif defined(__clang__)
  34941. "adcs r3, %[r]\n\t"
  34942. #else
  34943. "adc r3, %[r]\n\t"
  34944. #endif
  34945. "uxth r7, %[b]\n\t"
  34946. #ifdef WOLFSSL_KEIL
  34947. "muls r6, r7, r6\n\t"
  34948. #elif defined(__clang__)
  34949. "muls r6, r7\n\t"
  34950. #else
  34951. "mul r6, r7\n\t"
  34952. #endif
  34953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34954. "lsrs r7, r6, #16\n\t"
  34955. #else
  34956. "lsr r7, r6, #16\n\t"
  34957. #endif
  34958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34959. "lsls r6, r6, #16\n\t"
  34960. #else
  34961. "lsl r6, r6, #16\n\t"
  34962. #endif
  34963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34964. "adds r4, r4, r6\n\t"
  34965. #else
  34966. "add r4, r4, r6\n\t"
  34967. #endif
  34968. #ifdef WOLFSSL_KEIL
  34969. "adcs r5, r5, r7\n\t"
  34970. #elif defined(__clang__)
  34971. "adcs r5, r7\n\t"
  34972. #else
  34973. "adc r5, r7\n\t"
  34974. #endif
  34975. #ifdef WOLFSSL_KEIL
  34976. "adcs r3, r3, %[r]\n\t"
  34977. #elif defined(__clang__)
  34978. "adcs r3, %[r]\n\t"
  34979. #else
  34980. "adc r3, %[r]\n\t"
  34981. #endif
  34982. "# A[5] * B[2]\n\t"
  34983. "mov %[a], r9\n\t"
  34984. "mov %[b], r10\n\t"
  34985. "ldr %[a], [%[a], #20]\n\t"
  34986. "ldr %[b], [%[b], #8]\n\t"
  34987. "uxth r6, %[a]\n\t"
  34988. "uxth r7, %[b]\n\t"
  34989. #ifdef WOLFSSL_KEIL
  34990. "muls r7, r6, r7\n\t"
  34991. #elif defined(__clang__)
  34992. "muls r7, r6\n\t"
  34993. #else
  34994. "mul r7, r6\n\t"
  34995. #endif
  34996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34997. "adds r4, r4, r7\n\t"
  34998. #else
  34999. "add r4, r4, r7\n\t"
  35000. #endif
  35001. #ifdef WOLFSSL_KEIL
  35002. "adcs r5, r5, %[r]\n\t"
  35003. #elif defined(__clang__)
  35004. "adcs r5, %[r]\n\t"
  35005. #else
  35006. "adc r5, %[r]\n\t"
  35007. #endif
  35008. #ifdef WOLFSSL_KEIL
  35009. "adcs r3, r3, %[r]\n\t"
  35010. #elif defined(__clang__)
  35011. "adcs r3, %[r]\n\t"
  35012. #else
  35013. "adc r3, %[r]\n\t"
  35014. #endif
  35015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35016. "lsrs r7, %[b], #16\n\t"
  35017. #else
  35018. "lsr r7, %[b], #16\n\t"
  35019. #endif
  35020. #ifdef WOLFSSL_KEIL
  35021. "muls r6, r7, r6\n\t"
  35022. #elif defined(__clang__)
  35023. "muls r6, r7\n\t"
  35024. #else
  35025. "mul r6, r7\n\t"
  35026. #endif
  35027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35028. "lsrs r7, r6, #16\n\t"
  35029. #else
  35030. "lsr r7, r6, #16\n\t"
  35031. #endif
  35032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35033. "lsls r6, r6, #16\n\t"
  35034. #else
  35035. "lsl r6, r6, #16\n\t"
  35036. #endif
  35037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35038. "adds r4, r4, r6\n\t"
  35039. #else
  35040. "add r4, r4, r6\n\t"
  35041. #endif
  35042. #ifdef WOLFSSL_KEIL
  35043. "adcs r5, r5, r7\n\t"
  35044. #elif defined(__clang__)
  35045. "adcs r5, r7\n\t"
  35046. #else
  35047. "adc r5, r7\n\t"
  35048. #endif
  35049. #ifdef WOLFSSL_KEIL
  35050. "adcs r3, r3, %[r]\n\t"
  35051. #elif defined(__clang__)
  35052. "adcs r3, %[r]\n\t"
  35053. #else
  35054. "adc r3, %[r]\n\t"
  35055. #endif
  35056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35057. "lsrs r6, %[a], #16\n\t"
  35058. #else
  35059. "lsr r6, %[a], #16\n\t"
  35060. #endif
  35061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35062. "lsrs r7, %[b], #16\n\t"
  35063. #else
  35064. "lsr r7, %[b], #16\n\t"
  35065. #endif
  35066. #ifdef WOLFSSL_KEIL
  35067. "muls r7, r6, r7\n\t"
  35068. #elif defined(__clang__)
  35069. "muls r7, r6\n\t"
  35070. #else
  35071. "mul r7, r6\n\t"
  35072. #endif
  35073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35074. "adds r5, r5, r7\n\t"
  35075. #else
  35076. "add r5, r5, r7\n\t"
  35077. #endif
  35078. #ifdef WOLFSSL_KEIL
  35079. "adcs r3, r3, %[r]\n\t"
  35080. #elif defined(__clang__)
  35081. "adcs r3, %[r]\n\t"
  35082. #else
  35083. "adc r3, %[r]\n\t"
  35084. #endif
  35085. "uxth r7, %[b]\n\t"
  35086. #ifdef WOLFSSL_KEIL
  35087. "muls r6, r7, r6\n\t"
  35088. #elif defined(__clang__)
  35089. "muls r6, r7\n\t"
  35090. #else
  35091. "mul r6, r7\n\t"
  35092. #endif
  35093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35094. "lsrs r7, r6, #16\n\t"
  35095. #else
  35096. "lsr r7, r6, #16\n\t"
  35097. #endif
  35098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35099. "lsls r6, r6, #16\n\t"
  35100. #else
  35101. "lsl r6, r6, #16\n\t"
  35102. #endif
  35103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35104. "adds r4, r4, r6\n\t"
  35105. #else
  35106. "add r4, r4, r6\n\t"
  35107. #endif
  35108. #ifdef WOLFSSL_KEIL
  35109. "adcs r5, r5, r7\n\t"
  35110. #elif defined(__clang__)
  35111. "adcs r5, r7\n\t"
  35112. #else
  35113. "adc r5, r7\n\t"
  35114. #endif
  35115. #ifdef WOLFSSL_KEIL
  35116. "adcs r3, r3, %[r]\n\t"
  35117. #elif defined(__clang__)
  35118. "adcs r3, %[r]\n\t"
  35119. #else
  35120. "adc r3, %[r]\n\t"
  35121. #endif
  35122. "# A[6] * B[1]\n\t"
  35123. "mov %[a], r9\n\t"
  35124. "mov %[b], r10\n\t"
  35125. "ldr %[a], [%[a], #24]\n\t"
  35126. "ldr %[b], [%[b], #4]\n\t"
  35127. "uxth r6, %[a]\n\t"
  35128. "uxth r7, %[b]\n\t"
  35129. #ifdef WOLFSSL_KEIL
  35130. "muls r7, r6, r7\n\t"
  35131. #elif defined(__clang__)
  35132. "muls r7, r6\n\t"
  35133. #else
  35134. "mul r7, r6\n\t"
  35135. #endif
  35136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35137. "adds r4, r4, r7\n\t"
  35138. #else
  35139. "add r4, r4, r7\n\t"
  35140. #endif
  35141. #ifdef WOLFSSL_KEIL
  35142. "adcs r5, r5, %[r]\n\t"
  35143. #elif defined(__clang__)
  35144. "adcs r5, %[r]\n\t"
  35145. #else
  35146. "adc r5, %[r]\n\t"
  35147. #endif
  35148. #ifdef WOLFSSL_KEIL
  35149. "adcs r3, r3, %[r]\n\t"
  35150. #elif defined(__clang__)
  35151. "adcs r3, %[r]\n\t"
  35152. #else
  35153. "adc r3, %[r]\n\t"
  35154. #endif
  35155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35156. "lsrs r7, %[b], #16\n\t"
  35157. #else
  35158. "lsr r7, %[b], #16\n\t"
  35159. #endif
  35160. #ifdef WOLFSSL_KEIL
  35161. "muls r6, r7, r6\n\t"
  35162. #elif defined(__clang__)
  35163. "muls r6, r7\n\t"
  35164. #else
  35165. "mul r6, r7\n\t"
  35166. #endif
  35167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35168. "lsrs r7, r6, #16\n\t"
  35169. #else
  35170. "lsr r7, r6, #16\n\t"
  35171. #endif
  35172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35173. "lsls r6, r6, #16\n\t"
  35174. #else
  35175. "lsl r6, r6, #16\n\t"
  35176. #endif
  35177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35178. "adds r4, r4, r6\n\t"
  35179. #else
  35180. "add r4, r4, r6\n\t"
  35181. #endif
  35182. #ifdef WOLFSSL_KEIL
  35183. "adcs r5, r5, r7\n\t"
  35184. #elif defined(__clang__)
  35185. "adcs r5, r7\n\t"
  35186. #else
  35187. "adc r5, r7\n\t"
  35188. #endif
  35189. #ifdef WOLFSSL_KEIL
  35190. "adcs r3, r3, %[r]\n\t"
  35191. #elif defined(__clang__)
  35192. "adcs r3, %[r]\n\t"
  35193. #else
  35194. "adc r3, %[r]\n\t"
  35195. #endif
  35196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35197. "lsrs r6, %[a], #16\n\t"
  35198. #else
  35199. "lsr r6, %[a], #16\n\t"
  35200. #endif
  35201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35202. "lsrs r7, %[b], #16\n\t"
  35203. #else
  35204. "lsr r7, %[b], #16\n\t"
  35205. #endif
  35206. #ifdef WOLFSSL_KEIL
  35207. "muls r7, r6, r7\n\t"
  35208. #elif defined(__clang__)
  35209. "muls r7, r6\n\t"
  35210. #else
  35211. "mul r7, r6\n\t"
  35212. #endif
  35213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35214. "adds r5, r5, r7\n\t"
  35215. #else
  35216. "add r5, r5, r7\n\t"
  35217. #endif
  35218. #ifdef WOLFSSL_KEIL
  35219. "adcs r3, r3, %[r]\n\t"
  35220. #elif defined(__clang__)
  35221. "adcs r3, %[r]\n\t"
  35222. #else
  35223. "adc r3, %[r]\n\t"
  35224. #endif
  35225. "uxth r7, %[b]\n\t"
  35226. #ifdef WOLFSSL_KEIL
  35227. "muls r6, r7, r6\n\t"
  35228. #elif defined(__clang__)
  35229. "muls r6, r7\n\t"
  35230. #else
  35231. "mul r6, r7\n\t"
  35232. #endif
  35233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35234. "lsrs r7, r6, #16\n\t"
  35235. #else
  35236. "lsr r7, r6, #16\n\t"
  35237. #endif
  35238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35239. "lsls r6, r6, #16\n\t"
  35240. #else
  35241. "lsl r6, r6, #16\n\t"
  35242. #endif
  35243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35244. "adds r4, r4, r6\n\t"
  35245. #else
  35246. "add r4, r4, r6\n\t"
  35247. #endif
  35248. #ifdef WOLFSSL_KEIL
  35249. "adcs r5, r5, r7\n\t"
  35250. #elif defined(__clang__)
  35251. "adcs r5, r7\n\t"
  35252. #else
  35253. "adc r5, r7\n\t"
  35254. #endif
  35255. #ifdef WOLFSSL_KEIL
  35256. "adcs r3, r3, %[r]\n\t"
  35257. #elif defined(__clang__)
  35258. "adcs r3, %[r]\n\t"
  35259. #else
  35260. "adc r3, %[r]\n\t"
  35261. #endif
  35262. "# A[7] * B[0]\n\t"
  35263. "mov %[a], r9\n\t"
  35264. "mov %[b], r10\n\t"
  35265. "ldr %[a], [%[a], #28]\n\t"
  35266. "ldr %[b], [%[b]]\n\t"
  35267. "uxth r6, %[a]\n\t"
  35268. "uxth r7, %[b]\n\t"
  35269. #ifdef WOLFSSL_KEIL
  35270. "muls r7, r6, r7\n\t"
  35271. #elif defined(__clang__)
  35272. "muls r7, r6\n\t"
  35273. #else
  35274. "mul r7, r6\n\t"
  35275. #endif
  35276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35277. "adds r4, r4, r7\n\t"
  35278. #else
  35279. "add r4, r4, r7\n\t"
  35280. #endif
  35281. #ifdef WOLFSSL_KEIL
  35282. "adcs r5, r5, %[r]\n\t"
  35283. #elif defined(__clang__)
  35284. "adcs r5, %[r]\n\t"
  35285. #else
  35286. "adc r5, %[r]\n\t"
  35287. #endif
  35288. #ifdef WOLFSSL_KEIL
  35289. "adcs r3, r3, %[r]\n\t"
  35290. #elif defined(__clang__)
  35291. "adcs r3, %[r]\n\t"
  35292. #else
  35293. "adc r3, %[r]\n\t"
  35294. #endif
  35295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35296. "lsrs r7, %[b], #16\n\t"
  35297. #else
  35298. "lsr r7, %[b], #16\n\t"
  35299. #endif
  35300. #ifdef WOLFSSL_KEIL
  35301. "muls r6, r7, r6\n\t"
  35302. #elif defined(__clang__)
  35303. "muls r6, r7\n\t"
  35304. #else
  35305. "mul r6, r7\n\t"
  35306. #endif
  35307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35308. "lsrs r7, r6, #16\n\t"
  35309. #else
  35310. "lsr r7, r6, #16\n\t"
  35311. #endif
  35312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35313. "lsls r6, r6, #16\n\t"
  35314. #else
  35315. "lsl r6, r6, #16\n\t"
  35316. #endif
  35317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35318. "adds r4, r4, r6\n\t"
  35319. #else
  35320. "add r4, r4, r6\n\t"
  35321. #endif
  35322. #ifdef WOLFSSL_KEIL
  35323. "adcs r5, r5, r7\n\t"
  35324. #elif defined(__clang__)
  35325. "adcs r5, r7\n\t"
  35326. #else
  35327. "adc r5, r7\n\t"
  35328. #endif
  35329. #ifdef WOLFSSL_KEIL
  35330. "adcs r3, r3, %[r]\n\t"
  35331. #elif defined(__clang__)
  35332. "adcs r3, %[r]\n\t"
  35333. #else
  35334. "adc r3, %[r]\n\t"
  35335. #endif
  35336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35337. "lsrs r6, %[a], #16\n\t"
  35338. #else
  35339. "lsr r6, %[a], #16\n\t"
  35340. #endif
  35341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35342. "lsrs r7, %[b], #16\n\t"
  35343. #else
  35344. "lsr r7, %[b], #16\n\t"
  35345. #endif
  35346. #ifdef WOLFSSL_KEIL
  35347. "muls r7, r6, r7\n\t"
  35348. #elif defined(__clang__)
  35349. "muls r7, r6\n\t"
  35350. #else
  35351. "mul r7, r6\n\t"
  35352. #endif
  35353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35354. "adds r5, r5, r7\n\t"
  35355. #else
  35356. "add r5, r5, r7\n\t"
  35357. #endif
  35358. #ifdef WOLFSSL_KEIL
  35359. "adcs r3, r3, %[r]\n\t"
  35360. #elif defined(__clang__)
  35361. "adcs r3, %[r]\n\t"
  35362. #else
  35363. "adc r3, %[r]\n\t"
  35364. #endif
  35365. "uxth r7, %[b]\n\t"
  35366. #ifdef WOLFSSL_KEIL
  35367. "muls r6, r7, r6\n\t"
  35368. #elif defined(__clang__)
  35369. "muls r6, r7\n\t"
  35370. #else
  35371. "mul r6, r7\n\t"
  35372. #endif
  35373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35374. "lsrs r7, r6, #16\n\t"
  35375. #else
  35376. "lsr r7, r6, #16\n\t"
  35377. #endif
  35378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35379. "lsls r6, r6, #16\n\t"
  35380. #else
  35381. "lsl r6, r6, #16\n\t"
  35382. #endif
  35383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35384. "adds r4, r4, r6\n\t"
  35385. #else
  35386. "add r4, r4, r6\n\t"
  35387. #endif
  35388. #ifdef WOLFSSL_KEIL
  35389. "adcs r5, r5, r7\n\t"
  35390. #elif defined(__clang__)
  35391. "adcs r5, r7\n\t"
  35392. #else
  35393. "adc r5, r7\n\t"
  35394. #endif
  35395. #ifdef WOLFSSL_KEIL
  35396. "adcs r3, r3, %[r]\n\t"
  35397. #elif defined(__clang__)
  35398. "adcs r3, %[r]\n\t"
  35399. #else
  35400. "adc r3, %[r]\n\t"
  35401. #endif
  35402. "str r4, [sp, #28]\n\t"
  35403. "# A[8] * B[0]\n\t"
  35404. "movs r4, #0\n\t"
  35405. "mov %[a], r9\n\t"
  35406. "mov %[b], r10\n\t"
  35407. "ldr %[a], [%[a], #32]\n\t"
  35408. "ldr %[b], [%[b]]\n\t"
  35409. "uxth r6, %[a]\n\t"
  35410. "uxth r7, %[b]\n\t"
  35411. #ifdef WOLFSSL_KEIL
  35412. "muls r7, r6, r7\n\t"
  35413. #elif defined(__clang__)
  35414. "muls r7, r6\n\t"
  35415. #else
  35416. "mul r7, r6\n\t"
  35417. #endif
  35418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35419. "adds r5, r5, r7\n\t"
  35420. #else
  35421. "add r5, r5, r7\n\t"
  35422. #endif
  35423. #ifdef WOLFSSL_KEIL
  35424. "adcs r3, r3, %[r]\n\t"
  35425. #elif defined(__clang__)
  35426. "adcs r3, %[r]\n\t"
  35427. #else
  35428. "adc r3, %[r]\n\t"
  35429. #endif
  35430. #ifdef WOLFSSL_KEIL
  35431. "adcs r4, r4, %[r]\n\t"
  35432. #elif defined(__clang__)
  35433. "adcs r4, %[r]\n\t"
  35434. #else
  35435. "adc r4, %[r]\n\t"
  35436. #endif
  35437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35438. "lsrs r7, %[b], #16\n\t"
  35439. #else
  35440. "lsr r7, %[b], #16\n\t"
  35441. #endif
  35442. #ifdef WOLFSSL_KEIL
  35443. "muls r6, r7, r6\n\t"
  35444. #elif defined(__clang__)
  35445. "muls r6, r7\n\t"
  35446. #else
  35447. "mul r6, r7\n\t"
  35448. #endif
  35449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35450. "lsrs r7, r6, #16\n\t"
  35451. #else
  35452. "lsr r7, r6, #16\n\t"
  35453. #endif
  35454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35455. "lsls r6, r6, #16\n\t"
  35456. #else
  35457. "lsl r6, r6, #16\n\t"
  35458. #endif
  35459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35460. "adds r5, r5, r6\n\t"
  35461. #else
  35462. "add r5, r5, r6\n\t"
  35463. #endif
  35464. #ifdef WOLFSSL_KEIL
  35465. "adcs r3, r3, r7\n\t"
  35466. #elif defined(__clang__)
  35467. "adcs r3, r7\n\t"
  35468. #else
  35469. "adc r3, r7\n\t"
  35470. #endif
  35471. #ifdef WOLFSSL_KEIL
  35472. "adcs r4, r4, %[r]\n\t"
  35473. #elif defined(__clang__)
  35474. "adcs r4, %[r]\n\t"
  35475. #else
  35476. "adc r4, %[r]\n\t"
  35477. #endif
  35478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35479. "lsrs r6, %[a], #16\n\t"
  35480. #else
  35481. "lsr r6, %[a], #16\n\t"
  35482. #endif
  35483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35484. "lsrs r7, %[b], #16\n\t"
  35485. #else
  35486. "lsr r7, %[b], #16\n\t"
  35487. #endif
  35488. #ifdef WOLFSSL_KEIL
  35489. "muls r7, r6, r7\n\t"
  35490. #elif defined(__clang__)
  35491. "muls r7, r6\n\t"
  35492. #else
  35493. "mul r7, r6\n\t"
  35494. #endif
  35495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35496. "adds r3, r3, r7\n\t"
  35497. #else
  35498. "add r3, r3, r7\n\t"
  35499. #endif
  35500. #ifdef WOLFSSL_KEIL
  35501. "adcs r4, r4, %[r]\n\t"
  35502. #elif defined(__clang__)
  35503. "adcs r4, %[r]\n\t"
  35504. #else
  35505. "adc r4, %[r]\n\t"
  35506. #endif
  35507. "uxth r7, %[b]\n\t"
  35508. #ifdef WOLFSSL_KEIL
  35509. "muls r6, r7, r6\n\t"
  35510. #elif defined(__clang__)
  35511. "muls r6, r7\n\t"
  35512. #else
  35513. "mul r6, r7\n\t"
  35514. #endif
  35515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35516. "lsrs r7, r6, #16\n\t"
  35517. #else
  35518. "lsr r7, r6, #16\n\t"
  35519. #endif
  35520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35521. "lsls r6, r6, #16\n\t"
  35522. #else
  35523. "lsl r6, r6, #16\n\t"
  35524. #endif
  35525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35526. "adds r5, r5, r6\n\t"
  35527. #else
  35528. "add r5, r5, r6\n\t"
  35529. #endif
  35530. #ifdef WOLFSSL_KEIL
  35531. "adcs r3, r3, r7\n\t"
  35532. #elif defined(__clang__)
  35533. "adcs r3, r7\n\t"
  35534. #else
  35535. "adc r3, r7\n\t"
  35536. #endif
  35537. #ifdef WOLFSSL_KEIL
  35538. "adcs r4, r4, %[r]\n\t"
  35539. #elif defined(__clang__)
  35540. "adcs r4, %[r]\n\t"
  35541. #else
  35542. "adc r4, %[r]\n\t"
  35543. #endif
  35544. "# A[7] * B[1]\n\t"
  35545. "mov %[a], r9\n\t"
  35546. "mov %[b], r10\n\t"
  35547. "ldr %[a], [%[a], #28]\n\t"
  35548. "ldr %[b], [%[b], #4]\n\t"
  35549. "uxth r6, %[a]\n\t"
  35550. "uxth r7, %[b]\n\t"
  35551. #ifdef WOLFSSL_KEIL
  35552. "muls r7, r6, r7\n\t"
  35553. #elif defined(__clang__)
  35554. "muls r7, r6\n\t"
  35555. #else
  35556. "mul r7, r6\n\t"
  35557. #endif
  35558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35559. "adds r5, r5, r7\n\t"
  35560. #else
  35561. "add r5, r5, r7\n\t"
  35562. #endif
  35563. #ifdef WOLFSSL_KEIL
  35564. "adcs r3, r3, %[r]\n\t"
  35565. #elif defined(__clang__)
  35566. "adcs r3, %[r]\n\t"
  35567. #else
  35568. "adc r3, %[r]\n\t"
  35569. #endif
  35570. #ifdef WOLFSSL_KEIL
  35571. "adcs r4, r4, %[r]\n\t"
  35572. #elif defined(__clang__)
  35573. "adcs r4, %[r]\n\t"
  35574. #else
  35575. "adc r4, %[r]\n\t"
  35576. #endif
  35577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35578. "lsrs r7, %[b], #16\n\t"
  35579. #else
  35580. "lsr r7, %[b], #16\n\t"
  35581. #endif
  35582. #ifdef WOLFSSL_KEIL
  35583. "muls r6, r7, r6\n\t"
  35584. #elif defined(__clang__)
  35585. "muls r6, r7\n\t"
  35586. #else
  35587. "mul r6, r7\n\t"
  35588. #endif
  35589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35590. "lsrs r7, r6, #16\n\t"
  35591. #else
  35592. "lsr r7, r6, #16\n\t"
  35593. #endif
  35594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35595. "lsls r6, r6, #16\n\t"
  35596. #else
  35597. "lsl r6, r6, #16\n\t"
  35598. #endif
  35599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35600. "adds r5, r5, r6\n\t"
  35601. #else
  35602. "add r5, r5, r6\n\t"
  35603. #endif
  35604. #ifdef WOLFSSL_KEIL
  35605. "adcs r3, r3, r7\n\t"
  35606. #elif defined(__clang__)
  35607. "adcs r3, r7\n\t"
  35608. #else
  35609. "adc r3, r7\n\t"
  35610. #endif
  35611. #ifdef WOLFSSL_KEIL
  35612. "adcs r4, r4, %[r]\n\t"
  35613. #elif defined(__clang__)
  35614. "adcs r4, %[r]\n\t"
  35615. #else
  35616. "adc r4, %[r]\n\t"
  35617. #endif
  35618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35619. "lsrs r6, %[a], #16\n\t"
  35620. #else
  35621. "lsr r6, %[a], #16\n\t"
  35622. #endif
  35623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35624. "lsrs r7, %[b], #16\n\t"
  35625. #else
  35626. "lsr r7, %[b], #16\n\t"
  35627. #endif
  35628. #ifdef WOLFSSL_KEIL
  35629. "muls r7, r6, r7\n\t"
  35630. #elif defined(__clang__)
  35631. "muls r7, r6\n\t"
  35632. #else
  35633. "mul r7, r6\n\t"
  35634. #endif
  35635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35636. "adds r3, r3, r7\n\t"
  35637. #else
  35638. "add r3, r3, r7\n\t"
  35639. #endif
  35640. #ifdef WOLFSSL_KEIL
  35641. "adcs r4, r4, %[r]\n\t"
  35642. #elif defined(__clang__)
  35643. "adcs r4, %[r]\n\t"
  35644. #else
  35645. "adc r4, %[r]\n\t"
  35646. #endif
  35647. "uxth r7, %[b]\n\t"
  35648. #ifdef WOLFSSL_KEIL
  35649. "muls r6, r7, r6\n\t"
  35650. #elif defined(__clang__)
  35651. "muls r6, r7\n\t"
  35652. #else
  35653. "mul r6, r7\n\t"
  35654. #endif
  35655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35656. "lsrs r7, r6, #16\n\t"
  35657. #else
  35658. "lsr r7, r6, #16\n\t"
  35659. #endif
  35660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35661. "lsls r6, r6, #16\n\t"
  35662. #else
  35663. "lsl r6, r6, #16\n\t"
  35664. #endif
  35665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35666. "adds r5, r5, r6\n\t"
  35667. #else
  35668. "add r5, r5, r6\n\t"
  35669. #endif
  35670. #ifdef WOLFSSL_KEIL
  35671. "adcs r3, r3, r7\n\t"
  35672. #elif defined(__clang__)
  35673. "adcs r3, r7\n\t"
  35674. #else
  35675. "adc r3, r7\n\t"
  35676. #endif
  35677. #ifdef WOLFSSL_KEIL
  35678. "adcs r4, r4, %[r]\n\t"
  35679. #elif defined(__clang__)
  35680. "adcs r4, %[r]\n\t"
  35681. #else
  35682. "adc r4, %[r]\n\t"
  35683. #endif
  35684. "# A[6] * B[2]\n\t"
  35685. "mov %[a], r9\n\t"
  35686. "mov %[b], r10\n\t"
  35687. "ldr %[a], [%[a], #24]\n\t"
  35688. "ldr %[b], [%[b], #8]\n\t"
  35689. "uxth r6, %[a]\n\t"
  35690. "uxth r7, %[b]\n\t"
  35691. #ifdef WOLFSSL_KEIL
  35692. "muls r7, r6, r7\n\t"
  35693. #elif defined(__clang__)
  35694. "muls r7, r6\n\t"
  35695. #else
  35696. "mul r7, r6\n\t"
  35697. #endif
  35698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35699. "adds r5, r5, r7\n\t"
  35700. #else
  35701. "add r5, r5, r7\n\t"
  35702. #endif
  35703. #ifdef WOLFSSL_KEIL
  35704. "adcs r3, r3, %[r]\n\t"
  35705. #elif defined(__clang__)
  35706. "adcs r3, %[r]\n\t"
  35707. #else
  35708. "adc r3, %[r]\n\t"
  35709. #endif
  35710. #ifdef WOLFSSL_KEIL
  35711. "adcs r4, r4, %[r]\n\t"
  35712. #elif defined(__clang__)
  35713. "adcs r4, %[r]\n\t"
  35714. #else
  35715. "adc r4, %[r]\n\t"
  35716. #endif
  35717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35718. "lsrs r7, %[b], #16\n\t"
  35719. #else
  35720. "lsr r7, %[b], #16\n\t"
  35721. #endif
  35722. #ifdef WOLFSSL_KEIL
  35723. "muls r6, r7, r6\n\t"
  35724. #elif defined(__clang__)
  35725. "muls r6, r7\n\t"
  35726. #else
  35727. "mul r6, r7\n\t"
  35728. #endif
  35729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35730. "lsrs r7, r6, #16\n\t"
  35731. #else
  35732. "lsr r7, r6, #16\n\t"
  35733. #endif
  35734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35735. "lsls r6, r6, #16\n\t"
  35736. #else
  35737. "lsl r6, r6, #16\n\t"
  35738. #endif
  35739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35740. "adds r5, r5, r6\n\t"
  35741. #else
  35742. "add r5, r5, r6\n\t"
  35743. #endif
  35744. #ifdef WOLFSSL_KEIL
  35745. "adcs r3, r3, r7\n\t"
  35746. #elif defined(__clang__)
  35747. "adcs r3, r7\n\t"
  35748. #else
  35749. "adc r3, r7\n\t"
  35750. #endif
  35751. #ifdef WOLFSSL_KEIL
  35752. "adcs r4, r4, %[r]\n\t"
  35753. #elif defined(__clang__)
  35754. "adcs r4, %[r]\n\t"
  35755. #else
  35756. "adc r4, %[r]\n\t"
  35757. #endif
  35758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35759. "lsrs r6, %[a], #16\n\t"
  35760. #else
  35761. "lsr r6, %[a], #16\n\t"
  35762. #endif
  35763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35764. "lsrs r7, %[b], #16\n\t"
  35765. #else
  35766. "lsr r7, %[b], #16\n\t"
  35767. #endif
  35768. #ifdef WOLFSSL_KEIL
  35769. "muls r7, r6, r7\n\t"
  35770. #elif defined(__clang__)
  35771. "muls r7, r6\n\t"
  35772. #else
  35773. "mul r7, r6\n\t"
  35774. #endif
  35775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35776. "adds r3, r3, r7\n\t"
  35777. #else
  35778. "add r3, r3, r7\n\t"
  35779. #endif
  35780. #ifdef WOLFSSL_KEIL
  35781. "adcs r4, r4, %[r]\n\t"
  35782. #elif defined(__clang__)
  35783. "adcs r4, %[r]\n\t"
  35784. #else
  35785. "adc r4, %[r]\n\t"
  35786. #endif
  35787. "uxth r7, %[b]\n\t"
  35788. #ifdef WOLFSSL_KEIL
  35789. "muls r6, r7, r6\n\t"
  35790. #elif defined(__clang__)
  35791. "muls r6, r7\n\t"
  35792. #else
  35793. "mul r6, r7\n\t"
  35794. #endif
  35795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35796. "lsrs r7, r6, #16\n\t"
  35797. #else
  35798. "lsr r7, r6, #16\n\t"
  35799. #endif
  35800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35801. "lsls r6, r6, #16\n\t"
  35802. #else
  35803. "lsl r6, r6, #16\n\t"
  35804. #endif
  35805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35806. "adds r5, r5, r6\n\t"
  35807. #else
  35808. "add r5, r5, r6\n\t"
  35809. #endif
  35810. #ifdef WOLFSSL_KEIL
  35811. "adcs r3, r3, r7\n\t"
  35812. #elif defined(__clang__)
  35813. "adcs r3, r7\n\t"
  35814. #else
  35815. "adc r3, r7\n\t"
  35816. #endif
  35817. #ifdef WOLFSSL_KEIL
  35818. "adcs r4, r4, %[r]\n\t"
  35819. #elif defined(__clang__)
  35820. "adcs r4, %[r]\n\t"
  35821. #else
  35822. "adc r4, %[r]\n\t"
  35823. #endif
  35824. "# A[5] * B[3]\n\t"
  35825. "mov %[a], r9\n\t"
  35826. "mov %[b], r10\n\t"
  35827. "ldr %[a], [%[a], #20]\n\t"
  35828. "ldr %[b], [%[b], #12]\n\t"
  35829. "uxth r6, %[a]\n\t"
  35830. "uxth r7, %[b]\n\t"
  35831. #ifdef WOLFSSL_KEIL
  35832. "muls r7, r6, r7\n\t"
  35833. #elif defined(__clang__)
  35834. "muls r7, r6\n\t"
  35835. #else
  35836. "mul r7, r6\n\t"
  35837. #endif
  35838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35839. "adds r5, r5, r7\n\t"
  35840. #else
  35841. "add r5, r5, r7\n\t"
  35842. #endif
  35843. #ifdef WOLFSSL_KEIL
  35844. "adcs r3, r3, %[r]\n\t"
  35845. #elif defined(__clang__)
  35846. "adcs r3, %[r]\n\t"
  35847. #else
  35848. "adc r3, %[r]\n\t"
  35849. #endif
  35850. #ifdef WOLFSSL_KEIL
  35851. "adcs r4, r4, %[r]\n\t"
  35852. #elif defined(__clang__)
  35853. "adcs r4, %[r]\n\t"
  35854. #else
  35855. "adc r4, %[r]\n\t"
  35856. #endif
  35857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35858. "lsrs r7, %[b], #16\n\t"
  35859. #else
  35860. "lsr r7, %[b], #16\n\t"
  35861. #endif
  35862. #ifdef WOLFSSL_KEIL
  35863. "muls r6, r7, r6\n\t"
  35864. #elif defined(__clang__)
  35865. "muls r6, r7\n\t"
  35866. #else
  35867. "mul r6, r7\n\t"
  35868. #endif
  35869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35870. "lsrs r7, r6, #16\n\t"
  35871. #else
  35872. "lsr r7, r6, #16\n\t"
  35873. #endif
  35874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35875. "lsls r6, r6, #16\n\t"
  35876. #else
  35877. "lsl r6, r6, #16\n\t"
  35878. #endif
  35879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35880. "adds r5, r5, r6\n\t"
  35881. #else
  35882. "add r5, r5, r6\n\t"
  35883. #endif
  35884. #ifdef WOLFSSL_KEIL
  35885. "adcs r3, r3, r7\n\t"
  35886. #elif defined(__clang__)
  35887. "adcs r3, r7\n\t"
  35888. #else
  35889. "adc r3, r7\n\t"
  35890. #endif
  35891. #ifdef WOLFSSL_KEIL
  35892. "adcs r4, r4, %[r]\n\t"
  35893. #elif defined(__clang__)
  35894. "adcs r4, %[r]\n\t"
  35895. #else
  35896. "adc r4, %[r]\n\t"
  35897. #endif
  35898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35899. "lsrs r6, %[a], #16\n\t"
  35900. #else
  35901. "lsr r6, %[a], #16\n\t"
  35902. #endif
  35903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35904. "lsrs r7, %[b], #16\n\t"
  35905. #else
  35906. "lsr r7, %[b], #16\n\t"
  35907. #endif
  35908. #ifdef WOLFSSL_KEIL
  35909. "muls r7, r6, r7\n\t"
  35910. #elif defined(__clang__)
  35911. "muls r7, r6\n\t"
  35912. #else
  35913. "mul r7, r6\n\t"
  35914. #endif
  35915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35916. "adds r3, r3, r7\n\t"
  35917. #else
  35918. "add r3, r3, r7\n\t"
  35919. #endif
  35920. #ifdef WOLFSSL_KEIL
  35921. "adcs r4, r4, %[r]\n\t"
  35922. #elif defined(__clang__)
  35923. "adcs r4, %[r]\n\t"
  35924. #else
  35925. "adc r4, %[r]\n\t"
  35926. #endif
  35927. "uxth r7, %[b]\n\t"
  35928. #ifdef WOLFSSL_KEIL
  35929. "muls r6, r7, r6\n\t"
  35930. #elif defined(__clang__)
  35931. "muls r6, r7\n\t"
  35932. #else
  35933. "mul r6, r7\n\t"
  35934. #endif
  35935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35936. "lsrs r7, r6, #16\n\t"
  35937. #else
  35938. "lsr r7, r6, #16\n\t"
  35939. #endif
  35940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35941. "lsls r6, r6, #16\n\t"
  35942. #else
  35943. "lsl r6, r6, #16\n\t"
  35944. #endif
  35945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35946. "adds r5, r5, r6\n\t"
  35947. #else
  35948. "add r5, r5, r6\n\t"
  35949. #endif
  35950. #ifdef WOLFSSL_KEIL
  35951. "adcs r3, r3, r7\n\t"
  35952. #elif defined(__clang__)
  35953. "adcs r3, r7\n\t"
  35954. #else
  35955. "adc r3, r7\n\t"
  35956. #endif
  35957. #ifdef WOLFSSL_KEIL
  35958. "adcs r4, r4, %[r]\n\t"
  35959. #elif defined(__clang__)
  35960. "adcs r4, %[r]\n\t"
  35961. #else
  35962. "adc r4, %[r]\n\t"
  35963. #endif
  35964. "# A[4] * B[4]\n\t"
  35965. "mov %[a], r9\n\t"
  35966. "mov %[b], r10\n\t"
  35967. "ldr %[a], [%[a], #16]\n\t"
  35968. "ldr %[b], [%[b], #16]\n\t"
  35969. "uxth r6, %[a]\n\t"
  35970. "uxth r7, %[b]\n\t"
  35971. #ifdef WOLFSSL_KEIL
  35972. "muls r7, r6, r7\n\t"
  35973. #elif defined(__clang__)
  35974. "muls r7, r6\n\t"
  35975. #else
  35976. "mul r7, r6\n\t"
  35977. #endif
  35978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35979. "adds r5, r5, r7\n\t"
  35980. #else
  35981. "add r5, r5, r7\n\t"
  35982. #endif
  35983. #ifdef WOLFSSL_KEIL
  35984. "adcs r3, r3, %[r]\n\t"
  35985. #elif defined(__clang__)
  35986. "adcs r3, %[r]\n\t"
  35987. #else
  35988. "adc r3, %[r]\n\t"
  35989. #endif
  35990. #ifdef WOLFSSL_KEIL
  35991. "adcs r4, r4, %[r]\n\t"
  35992. #elif defined(__clang__)
  35993. "adcs r4, %[r]\n\t"
  35994. #else
  35995. "adc r4, %[r]\n\t"
  35996. #endif
  35997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35998. "lsrs r7, %[b], #16\n\t"
  35999. #else
  36000. "lsr r7, %[b], #16\n\t"
  36001. #endif
  36002. #ifdef WOLFSSL_KEIL
  36003. "muls r6, r7, r6\n\t"
  36004. #elif defined(__clang__)
  36005. "muls r6, r7\n\t"
  36006. #else
  36007. "mul r6, r7\n\t"
  36008. #endif
  36009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36010. "lsrs r7, r6, #16\n\t"
  36011. #else
  36012. "lsr r7, r6, #16\n\t"
  36013. #endif
  36014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36015. "lsls r6, r6, #16\n\t"
  36016. #else
  36017. "lsl r6, r6, #16\n\t"
  36018. #endif
  36019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36020. "adds r5, r5, r6\n\t"
  36021. #else
  36022. "add r5, r5, r6\n\t"
  36023. #endif
  36024. #ifdef WOLFSSL_KEIL
  36025. "adcs r3, r3, r7\n\t"
  36026. #elif defined(__clang__)
  36027. "adcs r3, r7\n\t"
  36028. #else
  36029. "adc r3, r7\n\t"
  36030. #endif
  36031. #ifdef WOLFSSL_KEIL
  36032. "adcs r4, r4, %[r]\n\t"
  36033. #elif defined(__clang__)
  36034. "adcs r4, %[r]\n\t"
  36035. #else
  36036. "adc r4, %[r]\n\t"
  36037. #endif
  36038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36039. "lsrs r6, %[a], #16\n\t"
  36040. #else
  36041. "lsr r6, %[a], #16\n\t"
  36042. #endif
  36043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36044. "lsrs r7, %[b], #16\n\t"
  36045. #else
  36046. "lsr r7, %[b], #16\n\t"
  36047. #endif
  36048. #ifdef WOLFSSL_KEIL
  36049. "muls r7, r6, r7\n\t"
  36050. #elif defined(__clang__)
  36051. "muls r7, r6\n\t"
  36052. #else
  36053. "mul r7, r6\n\t"
  36054. #endif
  36055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36056. "adds r3, r3, r7\n\t"
  36057. #else
  36058. "add r3, r3, r7\n\t"
  36059. #endif
  36060. #ifdef WOLFSSL_KEIL
  36061. "adcs r4, r4, %[r]\n\t"
  36062. #elif defined(__clang__)
  36063. "adcs r4, %[r]\n\t"
  36064. #else
  36065. "adc r4, %[r]\n\t"
  36066. #endif
  36067. "uxth r7, %[b]\n\t"
  36068. #ifdef WOLFSSL_KEIL
  36069. "muls r6, r7, r6\n\t"
  36070. #elif defined(__clang__)
  36071. "muls r6, r7\n\t"
  36072. #else
  36073. "mul r6, r7\n\t"
  36074. #endif
  36075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36076. "lsrs r7, r6, #16\n\t"
  36077. #else
  36078. "lsr r7, r6, #16\n\t"
  36079. #endif
  36080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36081. "lsls r6, r6, #16\n\t"
  36082. #else
  36083. "lsl r6, r6, #16\n\t"
  36084. #endif
  36085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36086. "adds r5, r5, r6\n\t"
  36087. #else
  36088. "add r5, r5, r6\n\t"
  36089. #endif
  36090. #ifdef WOLFSSL_KEIL
  36091. "adcs r3, r3, r7\n\t"
  36092. #elif defined(__clang__)
  36093. "adcs r3, r7\n\t"
  36094. #else
  36095. "adc r3, r7\n\t"
  36096. #endif
  36097. #ifdef WOLFSSL_KEIL
  36098. "adcs r4, r4, %[r]\n\t"
  36099. #elif defined(__clang__)
  36100. "adcs r4, %[r]\n\t"
  36101. #else
  36102. "adc r4, %[r]\n\t"
  36103. #endif
  36104. "# A[3] * B[5]\n\t"
  36105. "mov %[a], r9\n\t"
  36106. "mov %[b], r10\n\t"
  36107. "ldr %[a], [%[a], #12]\n\t"
  36108. "ldr %[b], [%[b], #20]\n\t"
  36109. "uxth r6, %[a]\n\t"
  36110. "uxth r7, %[b]\n\t"
  36111. #ifdef WOLFSSL_KEIL
  36112. "muls r7, r6, r7\n\t"
  36113. #elif defined(__clang__)
  36114. "muls r7, r6\n\t"
  36115. #else
  36116. "mul r7, r6\n\t"
  36117. #endif
  36118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36119. "adds r5, r5, r7\n\t"
  36120. #else
  36121. "add r5, r5, r7\n\t"
  36122. #endif
  36123. #ifdef WOLFSSL_KEIL
  36124. "adcs r3, r3, %[r]\n\t"
  36125. #elif defined(__clang__)
  36126. "adcs r3, %[r]\n\t"
  36127. #else
  36128. "adc r3, %[r]\n\t"
  36129. #endif
  36130. #ifdef WOLFSSL_KEIL
  36131. "adcs r4, r4, %[r]\n\t"
  36132. #elif defined(__clang__)
  36133. "adcs r4, %[r]\n\t"
  36134. #else
  36135. "adc r4, %[r]\n\t"
  36136. #endif
  36137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36138. "lsrs r7, %[b], #16\n\t"
  36139. #else
  36140. "lsr r7, %[b], #16\n\t"
  36141. #endif
  36142. #ifdef WOLFSSL_KEIL
  36143. "muls r6, r7, r6\n\t"
  36144. #elif defined(__clang__)
  36145. "muls r6, r7\n\t"
  36146. #else
  36147. "mul r6, r7\n\t"
  36148. #endif
  36149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36150. "lsrs r7, r6, #16\n\t"
  36151. #else
  36152. "lsr r7, r6, #16\n\t"
  36153. #endif
  36154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36155. "lsls r6, r6, #16\n\t"
  36156. #else
  36157. "lsl r6, r6, #16\n\t"
  36158. #endif
  36159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36160. "adds r5, r5, r6\n\t"
  36161. #else
  36162. "add r5, r5, r6\n\t"
  36163. #endif
  36164. #ifdef WOLFSSL_KEIL
  36165. "adcs r3, r3, r7\n\t"
  36166. #elif defined(__clang__)
  36167. "adcs r3, r7\n\t"
  36168. #else
  36169. "adc r3, r7\n\t"
  36170. #endif
  36171. #ifdef WOLFSSL_KEIL
  36172. "adcs r4, r4, %[r]\n\t"
  36173. #elif defined(__clang__)
  36174. "adcs r4, %[r]\n\t"
  36175. #else
  36176. "adc r4, %[r]\n\t"
  36177. #endif
  36178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36179. "lsrs r6, %[a], #16\n\t"
  36180. #else
  36181. "lsr r6, %[a], #16\n\t"
  36182. #endif
  36183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36184. "lsrs r7, %[b], #16\n\t"
  36185. #else
  36186. "lsr r7, %[b], #16\n\t"
  36187. #endif
  36188. #ifdef WOLFSSL_KEIL
  36189. "muls r7, r6, r7\n\t"
  36190. #elif defined(__clang__)
  36191. "muls r7, r6\n\t"
  36192. #else
  36193. "mul r7, r6\n\t"
  36194. #endif
  36195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36196. "adds r3, r3, r7\n\t"
  36197. #else
  36198. "add r3, r3, r7\n\t"
  36199. #endif
  36200. #ifdef WOLFSSL_KEIL
  36201. "adcs r4, r4, %[r]\n\t"
  36202. #elif defined(__clang__)
  36203. "adcs r4, %[r]\n\t"
  36204. #else
  36205. "adc r4, %[r]\n\t"
  36206. #endif
  36207. "uxth r7, %[b]\n\t"
  36208. #ifdef WOLFSSL_KEIL
  36209. "muls r6, r7, r6\n\t"
  36210. #elif defined(__clang__)
  36211. "muls r6, r7\n\t"
  36212. #else
  36213. "mul r6, r7\n\t"
  36214. #endif
  36215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36216. "lsrs r7, r6, #16\n\t"
  36217. #else
  36218. "lsr r7, r6, #16\n\t"
  36219. #endif
  36220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36221. "lsls r6, r6, #16\n\t"
  36222. #else
  36223. "lsl r6, r6, #16\n\t"
  36224. #endif
  36225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36226. "adds r5, r5, r6\n\t"
  36227. #else
  36228. "add r5, r5, r6\n\t"
  36229. #endif
  36230. #ifdef WOLFSSL_KEIL
  36231. "adcs r3, r3, r7\n\t"
  36232. #elif defined(__clang__)
  36233. "adcs r3, r7\n\t"
  36234. #else
  36235. "adc r3, r7\n\t"
  36236. #endif
  36237. #ifdef WOLFSSL_KEIL
  36238. "adcs r4, r4, %[r]\n\t"
  36239. #elif defined(__clang__)
  36240. "adcs r4, %[r]\n\t"
  36241. #else
  36242. "adc r4, %[r]\n\t"
  36243. #endif
  36244. "# A[2] * B[6]\n\t"
  36245. "mov %[a], r9\n\t"
  36246. "mov %[b], r10\n\t"
  36247. "ldr %[a], [%[a], #8]\n\t"
  36248. "ldr %[b], [%[b], #24]\n\t"
  36249. "uxth r6, %[a]\n\t"
  36250. "uxth r7, %[b]\n\t"
  36251. #ifdef WOLFSSL_KEIL
  36252. "muls r7, r6, r7\n\t"
  36253. #elif defined(__clang__)
  36254. "muls r7, r6\n\t"
  36255. #else
  36256. "mul r7, r6\n\t"
  36257. #endif
  36258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36259. "adds r5, r5, r7\n\t"
  36260. #else
  36261. "add r5, r5, r7\n\t"
  36262. #endif
  36263. #ifdef WOLFSSL_KEIL
  36264. "adcs r3, r3, %[r]\n\t"
  36265. #elif defined(__clang__)
  36266. "adcs r3, %[r]\n\t"
  36267. #else
  36268. "adc r3, %[r]\n\t"
  36269. #endif
  36270. #ifdef WOLFSSL_KEIL
  36271. "adcs r4, r4, %[r]\n\t"
  36272. #elif defined(__clang__)
  36273. "adcs r4, %[r]\n\t"
  36274. #else
  36275. "adc r4, %[r]\n\t"
  36276. #endif
  36277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36278. "lsrs r7, %[b], #16\n\t"
  36279. #else
  36280. "lsr r7, %[b], #16\n\t"
  36281. #endif
  36282. #ifdef WOLFSSL_KEIL
  36283. "muls r6, r7, r6\n\t"
  36284. #elif defined(__clang__)
  36285. "muls r6, r7\n\t"
  36286. #else
  36287. "mul r6, r7\n\t"
  36288. #endif
  36289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36290. "lsrs r7, r6, #16\n\t"
  36291. #else
  36292. "lsr r7, r6, #16\n\t"
  36293. #endif
  36294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36295. "lsls r6, r6, #16\n\t"
  36296. #else
  36297. "lsl r6, r6, #16\n\t"
  36298. #endif
  36299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36300. "adds r5, r5, r6\n\t"
  36301. #else
  36302. "add r5, r5, r6\n\t"
  36303. #endif
  36304. #ifdef WOLFSSL_KEIL
  36305. "adcs r3, r3, r7\n\t"
  36306. #elif defined(__clang__)
  36307. "adcs r3, r7\n\t"
  36308. #else
  36309. "adc r3, r7\n\t"
  36310. #endif
  36311. #ifdef WOLFSSL_KEIL
  36312. "adcs r4, r4, %[r]\n\t"
  36313. #elif defined(__clang__)
  36314. "adcs r4, %[r]\n\t"
  36315. #else
  36316. "adc r4, %[r]\n\t"
  36317. #endif
  36318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36319. "lsrs r6, %[a], #16\n\t"
  36320. #else
  36321. "lsr r6, %[a], #16\n\t"
  36322. #endif
  36323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36324. "lsrs r7, %[b], #16\n\t"
  36325. #else
  36326. "lsr r7, %[b], #16\n\t"
  36327. #endif
  36328. #ifdef WOLFSSL_KEIL
  36329. "muls r7, r6, r7\n\t"
  36330. #elif defined(__clang__)
  36331. "muls r7, r6\n\t"
  36332. #else
  36333. "mul r7, r6\n\t"
  36334. #endif
  36335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36336. "adds r3, r3, r7\n\t"
  36337. #else
  36338. "add r3, r3, r7\n\t"
  36339. #endif
  36340. #ifdef WOLFSSL_KEIL
  36341. "adcs r4, r4, %[r]\n\t"
  36342. #elif defined(__clang__)
  36343. "adcs r4, %[r]\n\t"
  36344. #else
  36345. "adc r4, %[r]\n\t"
  36346. #endif
  36347. "uxth r7, %[b]\n\t"
  36348. #ifdef WOLFSSL_KEIL
  36349. "muls r6, r7, r6\n\t"
  36350. #elif defined(__clang__)
  36351. "muls r6, r7\n\t"
  36352. #else
  36353. "mul r6, r7\n\t"
  36354. #endif
  36355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36356. "lsrs r7, r6, #16\n\t"
  36357. #else
  36358. "lsr r7, r6, #16\n\t"
  36359. #endif
  36360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36361. "lsls r6, r6, #16\n\t"
  36362. #else
  36363. "lsl r6, r6, #16\n\t"
  36364. #endif
  36365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36366. "adds r5, r5, r6\n\t"
  36367. #else
  36368. "add r5, r5, r6\n\t"
  36369. #endif
  36370. #ifdef WOLFSSL_KEIL
  36371. "adcs r3, r3, r7\n\t"
  36372. #elif defined(__clang__)
  36373. "adcs r3, r7\n\t"
  36374. #else
  36375. "adc r3, r7\n\t"
  36376. #endif
  36377. #ifdef WOLFSSL_KEIL
  36378. "adcs r4, r4, %[r]\n\t"
  36379. #elif defined(__clang__)
  36380. "adcs r4, %[r]\n\t"
  36381. #else
  36382. "adc r4, %[r]\n\t"
  36383. #endif
  36384. "# A[1] * B[7]\n\t"
  36385. "mov %[a], r9\n\t"
  36386. "mov %[b], r10\n\t"
  36387. "ldr %[a], [%[a], #4]\n\t"
  36388. "ldr %[b], [%[b], #28]\n\t"
  36389. "uxth r6, %[a]\n\t"
  36390. "uxth r7, %[b]\n\t"
  36391. #ifdef WOLFSSL_KEIL
  36392. "muls r7, r6, r7\n\t"
  36393. #elif defined(__clang__)
  36394. "muls r7, r6\n\t"
  36395. #else
  36396. "mul r7, r6\n\t"
  36397. #endif
  36398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36399. "adds r5, r5, r7\n\t"
  36400. #else
  36401. "add r5, r5, r7\n\t"
  36402. #endif
  36403. #ifdef WOLFSSL_KEIL
  36404. "adcs r3, r3, %[r]\n\t"
  36405. #elif defined(__clang__)
  36406. "adcs r3, %[r]\n\t"
  36407. #else
  36408. "adc r3, %[r]\n\t"
  36409. #endif
  36410. #ifdef WOLFSSL_KEIL
  36411. "adcs r4, r4, %[r]\n\t"
  36412. #elif defined(__clang__)
  36413. "adcs r4, %[r]\n\t"
  36414. #else
  36415. "adc r4, %[r]\n\t"
  36416. #endif
  36417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36418. "lsrs r7, %[b], #16\n\t"
  36419. #else
  36420. "lsr r7, %[b], #16\n\t"
  36421. #endif
  36422. #ifdef WOLFSSL_KEIL
  36423. "muls r6, r7, r6\n\t"
  36424. #elif defined(__clang__)
  36425. "muls r6, r7\n\t"
  36426. #else
  36427. "mul r6, r7\n\t"
  36428. #endif
  36429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36430. "lsrs r7, r6, #16\n\t"
  36431. #else
  36432. "lsr r7, r6, #16\n\t"
  36433. #endif
  36434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36435. "lsls r6, r6, #16\n\t"
  36436. #else
  36437. "lsl r6, r6, #16\n\t"
  36438. #endif
  36439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36440. "adds r5, r5, r6\n\t"
  36441. #else
  36442. "add r5, r5, r6\n\t"
  36443. #endif
  36444. #ifdef WOLFSSL_KEIL
  36445. "adcs r3, r3, r7\n\t"
  36446. #elif defined(__clang__)
  36447. "adcs r3, r7\n\t"
  36448. #else
  36449. "adc r3, r7\n\t"
  36450. #endif
  36451. #ifdef WOLFSSL_KEIL
  36452. "adcs r4, r4, %[r]\n\t"
  36453. #elif defined(__clang__)
  36454. "adcs r4, %[r]\n\t"
  36455. #else
  36456. "adc r4, %[r]\n\t"
  36457. #endif
  36458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36459. "lsrs r6, %[a], #16\n\t"
  36460. #else
  36461. "lsr r6, %[a], #16\n\t"
  36462. #endif
  36463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36464. "lsrs r7, %[b], #16\n\t"
  36465. #else
  36466. "lsr r7, %[b], #16\n\t"
  36467. #endif
  36468. #ifdef WOLFSSL_KEIL
  36469. "muls r7, r6, r7\n\t"
  36470. #elif defined(__clang__)
  36471. "muls r7, r6\n\t"
  36472. #else
  36473. "mul r7, r6\n\t"
  36474. #endif
  36475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36476. "adds r3, r3, r7\n\t"
  36477. #else
  36478. "add r3, r3, r7\n\t"
  36479. #endif
  36480. #ifdef WOLFSSL_KEIL
  36481. "adcs r4, r4, %[r]\n\t"
  36482. #elif defined(__clang__)
  36483. "adcs r4, %[r]\n\t"
  36484. #else
  36485. "adc r4, %[r]\n\t"
  36486. #endif
  36487. "uxth r7, %[b]\n\t"
  36488. #ifdef WOLFSSL_KEIL
  36489. "muls r6, r7, r6\n\t"
  36490. #elif defined(__clang__)
  36491. "muls r6, r7\n\t"
  36492. #else
  36493. "mul r6, r7\n\t"
  36494. #endif
  36495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36496. "lsrs r7, r6, #16\n\t"
  36497. #else
  36498. "lsr r7, r6, #16\n\t"
  36499. #endif
  36500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36501. "lsls r6, r6, #16\n\t"
  36502. #else
  36503. "lsl r6, r6, #16\n\t"
  36504. #endif
  36505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36506. "adds r5, r5, r6\n\t"
  36507. #else
  36508. "add r5, r5, r6\n\t"
  36509. #endif
  36510. #ifdef WOLFSSL_KEIL
  36511. "adcs r3, r3, r7\n\t"
  36512. #elif defined(__clang__)
  36513. "adcs r3, r7\n\t"
  36514. #else
  36515. "adc r3, r7\n\t"
  36516. #endif
  36517. #ifdef WOLFSSL_KEIL
  36518. "adcs r4, r4, %[r]\n\t"
  36519. #elif defined(__clang__)
  36520. "adcs r4, %[r]\n\t"
  36521. #else
  36522. "adc r4, %[r]\n\t"
  36523. #endif
  36524. "# A[0] * B[8]\n\t"
  36525. "mov %[a], r9\n\t"
  36526. "mov %[b], r10\n\t"
  36527. "ldr %[a], [%[a]]\n\t"
  36528. "ldr %[b], [%[b], #32]\n\t"
  36529. "uxth r6, %[a]\n\t"
  36530. "uxth r7, %[b]\n\t"
  36531. #ifdef WOLFSSL_KEIL
  36532. "muls r7, r6, r7\n\t"
  36533. #elif defined(__clang__)
  36534. "muls r7, r6\n\t"
  36535. #else
  36536. "mul r7, r6\n\t"
  36537. #endif
  36538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36539. "adds r5, r5, r7\n\t"
  36540. #else
  36541. "add r5, r5, r7\n\t"
  36542. #endif
  36543. #ifdef WOLFSSL_KEIL
  36544. "adcs r3, r3, %[r]\n\t"
  36545. #elif defined(__clang__)
  36546. "adcs r3, %[r]\n\t"
  36547. #else
  36548. "adc r3, %[r]\n\t"
  36549. #endif
  36550. #ifdef WOLFSSL_KEIL
  36551. "adcs r4, r4, %[r]\n\t"
  36552. #elif defined(__clang__)
  36553. "adcs r4, %[r]\n\t"
  36554. #else
  36555. "adc r4, %[r]\n\t"
  36556. #endif
  36557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36558. "lsrs r7, %[b], #16\n\t"
  36559. #else
  36560. "lsr r7, %[b], #16\n\t"
  36561. #endif
  36562. #ifdef WOLFSSL_KEIL
  36563. "muls r6, r7, r6\n\t"
  36564. #elif defined(__clang__)
  36565. "muls r6, r7\n\t"
  36566. #else
  36567. "mul r6, r7\n\t"
  36568. #endif
  36569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36570. "lsrs r7, r6, #16\n\t"
  36571. #else
  36572. "lsr r7, r6, #16\n\t"
  36573. #endif
  36574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36575. "lsls r6, r6, #16\n\t"
  36576. #else
  36577. "lsl r6, r6, #16\n\t"
  36578. #endif
  36579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36580. "adds r5, r5, r6\n\t"
  36581. #else
  36582. "add r5, r5, r6\n\t"
  36583. #endif
  36584. #ifdef WOLFSSL_KEIL
  36585. "adcs r3, r3, r7\n\t"
  36586. #elif defined(__clang__)
  36587. "adcs r3, r7\n\t"
  36588. #else
  36589. "adc r3, r7\n\t"
  36590. #endif
  36591. #ifdef WOLFSSL_KEIL
  36592. "adcs r4, r4, %[r]\n\t"
  36593. #elif defined(__clang__)
  36594. "adcs r4, %[r]\n\t"
  36595. #else
  36596. "adc r4, %[r]\n\t"
  36597. #endif
  36598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36599. "lsrs r6, %[a], #16\n\t"
  36600. #else
  36601. "lsr r6, %[a], #16\n\t"
  36602. #endif
  36603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36604. "lsrs r7, %[b], #16\n\t"
  36605. #else
  36606. "lsr r7, %[b], #16\n\t"
  36607. #endif
  36608. #ifdef WOLFSSL_KEIL
  36609. "muls r7, r6, r7\n\t"
  36610. #elif defined(__clang__)
  36611. "muls r7, r6\n\t"
  36612. #else
  36613. "mul r7, r6\n\t"
  36614. #endif
  36615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36616. "adds r3, r3, r7\n\t"
  36617. #else
  36618. "add r3, r3, r7\n\t"
  36619. #endif
  36620. #ifdef WOLFSSL_KEIL
  36621. "adcs r4, r4, %[r]\n\t"
  36622. #elif defined(__clang__)
  36623. "adcs r4, %[r]\n\t"
  36624. #else
  36625. "adc r4, %[r]\n\t"
  36626. #endif
  36627. "uxth r7, %[b]\n\t"
  36628. #ifdef WOLFSSL_KEIL
  36629. "muls r6, r7, r6\n\t"
  36630. #elif defined(__clang__)
  36631. "muls r6, r7\n\t"
  36632. #else
  36633. "mul r6, r7\n\t"
  36634. #endif
  36635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36636. "lsrs r7, r6, #16\n\t"
  36637. #else
  36638. "lsr r7, r6, #16\n\t"
  36639. #endif
  36640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36641. "lsls r6, r6, #16\n\t"
  36642. #else
  36643. "lsl r6, r6, #16\n\t"
  36644. #endif
  36645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36646. "adds r5, r5, r6\n\t"
  36647. #else
  36648. "add r5, r5, r6\n\t"
  36649. #endif
  36650. #ifdef WOLFSSL_KEIL
  36651. "adcs r3, r3, r7\n\t"
  36652. #elif defined(__clang__)
  36653. "adcs r3, r7\n\t"
  36654. #else
  36655. "adc r3, r7\n\t"
  36656. #endif
  36657. #ifdef WOLFSSL_KEIL
  36658. "adcs r4, r4, %[r]\n\t"
  36659. #elif defined(__clang__)
  36660. "adcs r4, %[r]\n\t"
  36661. #else
  36662. "adc r4, %[r]\n\t"
  36663. #endif
  36664. "str r5, [sp, #32]\n\t"
  36665. "# A[0] * B[9]\n\t"
  36666. "movs r5, #0\n\t"
  36667. "mov %[a], r9\n\t"
  36668. "mov %[b], r10\n\t"
  36669. "ldr %[a], [%[a]]\n\t"
  36670. "ldr %[b], [%[b], #36]\n\t"
  36671. "uxth r6, %[a]\n\t"
  36672. "uxth r7, %[b]\n\t"
  36673. #ifdef WOLFSSL_KEIL
  36674. "muls r7, r6, r7\n\t"
  36675. #elif defined(__clang__)
  36676. "muls r7, r6\n\t"
  36677. #else
  36678. "mul r7, r6\n\t"
  36679. #endif
  36680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36681. "adds r3, r3, r7\n\t"
  36682. #else
  36683. "add r3, r3, r7\n\t"
  36684. #endif
  36685. #ifdef WOLFSSL_KEIL
  36686. "adcs r4, r4, %[r]\n\t"
  36687. #elif defined(__clang__)
  36688. "adcs r4, %[r]\n\t"
  36689. #else
  36690. "adc r4, %[r]\n\t"
  36691. #endif
  36692. #ifdef WOLFSSL_KEIL
  36693. "adcs r5, r5, %[r]\n\t"
  36694. #elif defined(__clang__)
  36695. "adcs r5, %[r]\n\t"
  36696. #else
  36697. "adc r5, %[r]\n\t"
  36698. #endif
  36699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36700. "lsrs r7, %[b], #16\n\t"
  36701. #else
  36702. "lsr r7, %[b], #16\n\t"
  36703. #endif
  36704. #ifdef WOLFSSL_KEIL
  36705. "muls r6, r7, r6\n\t"
  36706. #elif defined(__clang__)
  36707. "muls r6, r7\n\t"
  36708. #else
  36709. "mul r6, r7\n\t"
  36710. #endif
  36711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36712. "lsrs r7, r6, #16\n\t"
  36713. #else
  36714. "lsr r7, r6, #16\n\t"
  36715. #endif
  36716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36717. "lsls r6, r6, #16\n\t"
  36718. #else
  36719. "lsl r6, r6, #16\n\t"
  36720. #endif
  36721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36722. "adds r3, r3, r6\n\t"
  36723. #else
  36724. "add r3, r3, r6\n\t"
  36725. #endif
  36726. #ifdef WOLFSSL_KEIL
  36727. "adcs r4, r4, r7\n\t"
  36728. #elif defined(__clang__)
  36729. "adcs r4, r7\n\t"
  36730. #else
  36731. "adc r4, r7\n\t"
  36732. #endif
  36733. #ifdef WOLFSSL_KEIL
  36734. "adcs r5, r5, %[r]\n\t"
  36735. #elif defined(__clang__)
  36736. "adcs r5, %[r]\n\t"
  36737. #else
  36738. "adc r5, %[r]\n\t"
  36739. #endif
  36740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36741. "lsrs r6, %[a], #16\n\t"
  36742. #else
  36743. "lsr r6, %[a], #16\n\t"
  36744. #endif
  36745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36746. "lsrs r7, %[b], #16\n\t"
  36747. #else
  36748. "lsr r7, %[b], #16\n\t"
  36749. #endif
  36750. #ifdef WOLFSSL_KEIL
  36751. "muls r7, r6, r7\n\t"
  36752. #elif defined(__clang__)
  36753. "muls r7, r6\n\t"
  36754. #else
  36755. "mul r7, r6\n\t"
  36756. #endif
  36757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36758. "adds r4, r4, r7\n\t"
  36759. #else
  36760. "add r4, r4, r7\n\t"
  36761. #endif
  36762. #ifdef WOLFSSL_KEIL
  36763. "adcs r5, r5, %[r]\n\t"
  36764. #elif defined(__clang__)
  36765. "adcs r5, %[r]\n\t"
  36766. #else
  36767. "adc r5, %[r]\n\t"
  36768. #endif
  36769. "uxth r7, %[b]\n\t"
  36770. #ifdef WOLFSSL_KEIL
  36771. "muls r6, r7, r6\n\t"
  36772. #elif defined(__clang__)
  36773. "muls r6, r7\n\t"
  36774. #else
  36775. "mul r6, r7\n\t"
  36776. #endif
  36777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36778. "lsrs r7, r6, #16\n\t"
  36779. #else
  36780. "lsr r7, r6, #16\n\t"
  36781. #endif
  36782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36783. "lsls r6, r6, #16\n\t"
  36784. #else
  36785. "lsl r6, r6, #16\n\t"
  36786. #endif
  36787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36788. "adds r3, r3, r6\n\t"
  36789. #else
  36790. "add r3, r3, r6\n\t"
  36791. #endif
  36792. #ifdef WOLFSSL_KEIL
  36793. "adcs r4, r4, r7\n\t"
  36794. #elif defined(__clang__)
  36795. "adcs r4, r7\n\t"
  36796. #else
  36797. "adc r4, r7\n\t"
  36798. #endif
  36799. #ifdef WOLFSSL_KEIL
  36800. "adcs r5, r5, %[r]\n\t"
  36801. #elif defined(__clang__)
  36802. "adcs r5, %[r]\n\t"
  36803. #else
  36804. "adc r5, %[r]\n\t"
  36805. #endif
  36806. "# A[1] * B[8]\n\t"
  36807. "mov %[a], r9\n\t"
  36808. "mov %[b], r10\n\t"
  36809. "ldr %[a], [%[a], #4]\n\t"
  36810. "ldr %[b], [%[b], #32]\n\t"
  36811. "uxth r6, %[a]\n\t"
  36812. "uxth r7, %[b]\n\t"
  36813. #ifdef WOLFSSL_KEIL
  36814. "muls r7, r6, r7\n\t"
  36815. #elif defined(__clang__)
  36816. "muls r7, r6\n\t"
  36817. #else
  36818. "mul r7, r6\n\t"
  36819. #endif
  36820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36821. "adds r3, r3, r7\n\t"
  36822. #else
  36823. "add r3, r3, r7\n\t"
  36824. #endif
  36825. #ifdef WOLFSSL_KEIL
  36826. "adcs r4, r4, %[r]\n\t"
  36827. #elif defined(__clang__)
  36828. "adcs r4, %[r]\n\t"
  36829. #else
  36830. "adc r4, %[r]\n\t"
  36831. #endif
  36832. #ifdef WOLFSSL_KEIL
  36833. "adcs r5, r5, %[r]\n\t"
  36834. #elif defined(__clang__)
  36835. "adcs r5, %[r]\n\t"
  36836. #else
  36837. "adc r5, %[r]\n\t"
  36838. #endif
  36839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36840. "lsrs r7, %[b], #16\n\t"
  36841. #else
  36842. "lsr r7, %[b], #16\n\t"
  36843. #endif
  36844. #ifdef WOLFSSL_KEIL
  36845. "muls r6, r7, r6\n\t"
  36846. #elif defined(__clang__)
  36847. "muls r6, r7\n\t"
  36848. #else
  36849. "mul r6, r7\n\t"
  36850. #endif
  36851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36852. "lsrs r7, r6, #16\n\t"
  36853. #else
  36854. "lsr r7, r6, #16\n\t"
  36855. #endif
  36856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36857. "lsls r6, r6, #16\n\t"
  36858. #else
  36859. "lsl r6, r6, #16\n\t"
  36860. #endif
  36861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36862. "adds r3, r3, r6\n\t"
  36863. #else
  36864. "add r3, r3, r6\n\t"
  36865. #endif
  36866. #ifdef WOLFSSL_KEIL
  36867. "adcs r4, r4, r7\n\t"
  36868. #elif defined(__clang__)
  36869. "adcs r4, r7\n\t"
  36870. #else
  36871. "adc r4, r7\n\t"
  36872. #endif
  36873. #ifdef WOLFSSL_KEIL
  36874. "adcs r5, r5, %[r]\n\t"
  36875. #elif defined(__clang__)
  36876. "adcs r5, %[r]\n\t"
  36877. #else
  36878. "adc r5, %[r]\n\t"
  36879. #endif
  36880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36881. "lsrs r6, %[a], #16\n\t"
  36882. #else
  36883. "lsr r6, %[a], #16\n\t"
  36884. #endif
  36885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36886. "lsrs r7, %[b], #16\n\t"
  36887. #else
  36888. "lsr r7, %[b], #16\n\t"
  36889. #endif
  36890. #ifdef WOLFSSL_KEIL
  36891. "muls r7, r6, r7\n\t"
  36892. #elif defined(__clang__)
  36893. "muls r7, r6\n\t"
  36894. #else
  36895. "mul r7, r6\n\t"
  36896. #endif
  36897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36898. "adds r4, r4, r7\n\t"
  36899. #else
  36900. "add r4, r4, r7\n\t"
  36901. #endif
  36902. #ifdef WOLFSSL_KEIL
  36903. "adcs r5, r5, %[r]\n\t"
  36904. #elif defined(__clang__)
  36905. "adcs r5, %[r]\n\t"
  36906. #else
  36907. "adc r5, %[r]\n\t"
  36908. #endif
  36909. "uxth r7, %[b]\n\t"
  36910. #ifdef WOLFSSL_KEIL
  36911. "muls r6, r7, r6\n\t"
  36912. #elif defined(__clang__)
  36913. "muls r6, r7\n\t"
  36914. #else
  36915. "mul r6, r7\n\t"
  36916. #endif
  36917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36918. "lsrs r7, r6, #16\n\t"
  36919. #else
  36920. "lsr r7, r6, #16\n\t"
  36921. #endif
  36922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36923. "lsls r6, r6, #16\n\t"
  36924. #else
  36925. "lsl r6, r6, #16\n\t"
  36926. #endif
  36927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36928. "adds r3, r3, r6\n\t"
  36929. #else
  36930. "add r3, r3, r6\n\t"
  36931. #endif
  36932. #ifdef WOLFSSL_KEIL
  36933. "adcs r4, r4, r7\n\t"
  36934. #elif defined(__clang__)
  36935. "adcs r4, r7\n\t"
  36936. #else
  36937. "adc r4, r7\n\t"
  36938. #endif
  36939. #ifdef WOLFSSL_KEIL
  36940. "adcs r5, r5, %[r]\n\t"
  36941. #elif defined(__clang__)
  36942. "adcs r5, %[r]\n\t"
  36943. #else
  36944. "adc r5, %[r]\n\t"
  36945. #endif
  36946. "# A[2] * B[7]\n\t"
  36947. "mov %[a], r9\n\t"
  36948. "mov %[b], r10\n\t"
  36949. "ldr %[a], [%[a], #8]\n\t"
  36950. "ldr %[b], [%[b], #28]\n\t"
  36951. "uxth r6, %[a]\n\t"
  36952. "uxth r7, %[b]\n\t"
  36953. #ifdef WOLFSSL_KEIL
  36954. "muls r7, r6, r7\n\t"
  36955. #elif defined(__clang__)
  36956. "muls r7, r6\n\t"
  36957. #else
  36958. "mul r7, r6\n\t"
  36959. #endif
  36960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36961. "adds r3, r3, r7\n\t"
  36962. #else
  36963. "add r3, r3, r7\n\t"
  36964. #endif
  36965. #ifdef WOLFSSL_KEIL
  36966. "adcs r4, r4, %[r]\n\t"
  36967. #elif defined(__clang__)
  36968. "adcs r4, %[r]\n\t"
  36969. #else
  36970. "adc r4, %[r]\n\t"
  36971. #endif
  36972. #ifdef WOLFSSL_KEIL
  36973. "adcs r5, r5, %[r]\n\t"
  36974. #elif defined(__clang__)
  36975. "adcs r5, %[r]\n\t"
  36976. #else
  36977. "adc r5, %[r]\n\t"
  36978. #endif
  36979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36980. "lsrs r7, %[b], #16\n\t"
  36981. #else
  36982. "lsr r7, %[b], #16\n\t"
  36983. #endif
  36984. #ifdef WOLFSSL_KEIL
  36985. "muls r6, r7, r6\n\t"
  36986. #elif defined(__clang__)
  36987. "muls r6, r7\n\t"
  36988. #else
  36989. "mul r6, r7\n\t"
  36990. #endif
  36991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36992. "lsrs r7, r6, #16\n\t"
  36993. #else
  36994. "lsr r7, r6, #16\n\t"
  36995. #endif
  36996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36997. "lsls r6, r6, #16\n\t"
  36998. #else
  36999. "lsl r6, r6, #16\n\t"
  37000. #endif
  37001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37002. "adds r3, r3, r6\n\t"
  37003. #else
  37004. "add r3, r3, r6\n\t"
  37005. #endif
  37006. #ifdef WOLFSSL_KEIL
  37007. "adcs r4, r4, r7\n\t"
  37008. #elif defined(__clang__)
  37009. "adcs r4, r7\n\t"
  37010. #else
  37011. "adc r4, r7\n\t"
  37012. #endif
  37013. #ifdef WOLFSSL_KEIL
  37014. "adcs r5, r5, %[r]\n\t"
  37015. #elif defined(__clang__)
  37016. "adcs r5, %[r]\n\t"
  37017. #else
  37018. "adc r5, %[r]\n\t"
  37019. #endif
  37020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37021. "lsrs r6, %[a], #16\n\t"
  37022. #else
  37023. "lsr r6, %[a], #16\n\t"
  37024. #endif
  37025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37026. "lsrs r7, %[b], #16\n\t"
  37027. #else
  37028. "lsr r7, %[b], #16\n\t"
  37029. #endif
  37030. #ifdef WOLFSSL_KEIL
  37031. "muls r7, r6, r7\n\t"
  37032. #elif defined(__clang__)
  37033. "muls r7, r6\n\t"
  37034. #else
  37035. "mul r7, r6\n\t"
  37036. #endif
  37037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37038. "adds r4, r4, r7\n\t"
  37039. #else
  37040. "add r4, r4, r7\n\t"
  37041. #endif
  37042. #ifdef WOLFSSL_KEIL
  37043. "adcs r5, r5, %[r]\n\t"
  37044. #elif defined(__clang__)
  37045. "adcs r5, %[r]\n\t"
  37046. #else
  37047. "adc r5, %[r]\n\t"
  37048. #endif
  37049. "uxth r7, %[b]\n\t"
  37050. #ifdef WOLFSSL_KEIL
  37051. "muls r6, r7, r6\n\t"
  37052. #elif defined(__clang__)
  37053. "muls r6, r7\n\t"
  37054. #else
  37055. "mul r6, r7\n\t"
  37056. #endif
  37057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37058. "lsrs r7, r6, #16\n\t"
  37059. #else
  37060. "lsr r7, r6, #16\n\t"
  37061. #endif
  37062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37063. "lsls r6, r6, #16\n\t"
  37064. #else
  37065. "lsl r6, r6, #16\n\t"
  37066. #endif
  37067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37068. "adds r3, r3, r6\n\t"
  37069. #else
  37070. "add r3, r3, r6\n\t"
  37071. #endif
  37072. #ifdef WOLFSSL_KEIL
  37073. "adcs r4, r4, r7\n\t"
  37074. #elif defined(__clang__)
  37075. "adcs r4, r7\n\t"
  37076. #else
  37077. "adc r4, r7\n\t"
  37078. #endif
  37079. #ifdef WOLFSSL_KEIL
  37080. "adcs r5, r5, %[r]\n\t"
  37081. #elif defined(__clang__)
  37082. "adcs r5, %[r]\n\t"
  37083. #else
  37084. "adc r5, %[r]\n\t"
  37085. #endif
  37086. "# A[3] * B[6]\n\t"
  37087. "mov %[a], r9\n\t"
  37088. "mov %[b], r10\n\t"
  37089. "ldr %[a], [%[a], #12]\n\t"
  37090. "ldr %[b], [%[b], #24]\n\t"
  37091. "uxth r6, %[a]\n\t"
  37092. "uxth r7, %[b]\n\t"
  37093. #ifdef WOLFSSL_KEIL
  37094. "muls r7, r6, r7\n\t"
  37095. #elif defined(__clang__)
  37096. "muls r7, r6\n\t"
  37097. #else
  37098. "mul r7, r6\n\t"
  37099. #endif
  37100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37101. "adds r3, r3, r7\n\t"
  37102. #else
  37103. "add r3, r3, r7\n\t"
  37104. #endif
  37105. #ifdef WOLFSSL_KEIL
  37106. "adcs r4, r4, %[r]\n\t"
  37107. #elif defined(__clang__)
  37108. "adcs r4, %[r]\n\t"
  37109. #else
  37110. "adc r4, %[r]\n\t"
  37111. #endif
  37112. #ifdef WOLFSSL_KEIL
  37113. "adcs r5, r5, %[r]\n\t"
  37114. #elif defined(__clang__)
  37115. "adcs r5, %[r]\n\t"
  37116. #else
  37117. "adc r5, %[r]\n\t"
  37118. #endif
  37119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37120. "lsrs r7, %[b], #16\n\t"
  37121. #else
  37122. "lsr r7, %[b], #16\n\t"
  37123. #endif
  37124. #ifdef WOLFSSL_KEIL
  37125. "muls r6, r7, r6\n\t"
  37126. #elif defined(__clang__)
  37127. "muls r6, r7\n\t"
  37128. #else
  37129. "mul r6, r7\n\t"
  37130. #endif
  37131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37132. "lsrs r7, r6, #16\n\t"
  37133. #else
  37134. "lsr r7, r6, #16\n\t"
  37135. #endif
  37136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37137. "lsls r6, r6, #16\n\t"
  37138. #else
  37139. "lsl r6, r6, #16\n\t"
  37140. #endif
  37141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37142. "adds r3, r3, r6\n\t"
  37143. #else
  37144. "add r3, r3, r6\n\t"
  37145. #endif
  37146. #ifdef WOLFSSL_KEIL
  37147. "adcs r4, r4, r7\n\t"
  37148. #elif defined(__clang__)
  37149. "adcs r4, r7\n\t"
  37150. #else
  37151. "adc r4, r7\n\t"
  37152. #endif
  37153. #ifdef WOLFSSL_KEIL
  37154. "adcs r5, r5, %[r]\n\t"
  37155. #elif defined(__clang__)
  37156. "adcs r5, %[r]\n\t"
  37157. #else
  37158. "adc r5, %[r]\n\t"
  37159. #endif
  37160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37161. "lsrs r6, %[a], #16\n\t"
  37162. #else
  37163. "lsr r6, %[a], #16\n\t"
  37164. #endif
  37165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37166. "lsrs r7, %[b], #16\n\t"
  37167. #else
  37168. "lsr r7, %[b], #16\n\t"
  37169. #endif
  37170. #ifdef WOLFSSL_KEIL
  37171. "muls r7, r6, r7\n\t"
  37172. #elif defined(__clang__)
  37173. "muls r7, r6\n\t"
  37174. #else
  37175. "mul r7, r6\n\t"
  37176. #endif
  37177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37178. "adds r4, r4, r7\n\t"
  37179. #else
  37180. "add r4, r4, r7\n\t"
  37181. #endif
  37182. #ifdef WOLFSSL_KEIL
  37183. "adcs r5, r5, %[r]\n\t"
  37184. #elif defined(__clang__)
  37185. "adcs r5, %[r]\n\t"
  37186. #else
  37187. "adc r5, %[r]\n\t"
  37188. #endif
  37189. "uxth r7, %[b]\n\t"
  37190. #ifdef WOLFSSL_KEIL
  37191. "muls r6, r7, r6\n\t"
  37192. #elif defined(__clang__)
  37193. "muls r6, r7\n\t"
  37194. #else
  37195. "mul r6, r7\n\t"
  37196. #endif
  37197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37198. "lsrs r7, r6, #16\n\t"
  37199. #else
  37200. "lsr r7, r6, #16\n\t"
  37201. #endif
  37202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37203. "lsls r6, r6, #16\n\t"
  37204. #else
  37205. "lsl r6, r6, #16\n\t"
  37206. #endif
  37207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37208. "adds r3, r3, r6\n\t"
  37209. #else
  37210. "add r3, r3, r6\n\t"
  37211. #endif
  37212. #ifdef WOLFSSL_KEIL
  37213. "adcs r4, r4, r7\n\t"
  37214. #elif defined(__clang__)
  37215. "adcs r4, r7\n\t"
  37216. #else
  37217. "adc r4, r7\n\t"
  37218. #endif
  37219. #ifdef WOLFSSL_KEIL
  37220. "adcs r5, r5, %[r]\n\t"
  37221. #elif defined(__clang__)
  37222. "adcs r5, %[r]\n\t"
  37223. #else
  37224. "adc r5, %[r]\n\t"
  37225. #endif
  37226. "# A[4] * B[5]\n\t"
  37227. "mov %[a], r9\n\t"
  37228. "mov %[b], r10\n\t"
  37229. "ldr %[a], [%[a], #16]\n\t"
  37230. "ldr %[b], [%[b], #20]\n\t"
  37231. "uxth r6, %[a]\n\t"
  37232. "uxth r7, %[b]\n\t"
  37233. #ifdef WOLFSSL_KEIL
  37234. "muls r7, r6, r7\n\t"
  37235. #elif defined(__clang__)
  37236. "muls r7, r6\n\t"
  37237. #else
  37238. "mul r7, r6\n\t"
  37239. #endif
  37240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37241. "adds r3, r3, r7\n\t"
  37242. #else
  37243. "add r3, r3, r7\n\t"
  37244. #endif
  37245. #ifdef WOLFSSL_KEIL
  37246. "adcs r4, r4, %[r]\n\t"
  37247. #elif defined(__clang__)
  37248. "adcs r4, %[r]\n\t"
  37249. #else
  37250. "adc r4, %[r]\n\t"
  37251. #endif
  37252. #ifdef WOLFSSL_KEIL
  37253. "adcs r5, r5, %[r]\n\t"
  37254. #elif defined(__clang__)
  37255. "adcs r5, %[r]\n\t"
  37256. #else
  37257. "adc r5, %[r]\n\t"
  37258. #endif
  37259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37260. "lsrs r7, %[b], #16\n\t"
  37261. #else
  37262. "lsr r7, %[b], #16\n\t"
  37263. #endif
  37264. #ifdef WOLFSSL_KEIL
  37265. "muls r6, r7, r6\n\t"
  37266. #elif defined(__clang__)
  37267. "muls r6, r7\n\t"
  37268. #else
  37269. "mul r6, r7\n\t"
  37270. #endif
  37271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37272. "lsrs r7, r6, #16\n\t"
  37273. #else
  37274. "lsr r7, r6, #16\n\t"
  37275. #endif
  37276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37277. "lsls r6, r6, #16\n\t"
  37278. #else
  37279. "lsl r6, r6, #16\n\t"
  37280. #endif
  37281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37282. "adds r3, r3, r6\n\t"
  37283. #else
  37284. "add r3, r3, r6\n\t"
  37285. #endif
  37286. #ifdef WOLFSSL_KEIL
  37287. "adcs r4, r4, r7\n\t"
  37288. #elif defined(__clang__)
  37289. "adcs r4, r7\n\t"
  37290. #else
  37291. "adc r4, r7\n\t"
  37292. #endif
  37293. #ifdef WOLFSSL_KEIL
  37294. "adcs r5, r5, %[r]\n\t"
  37295. #elif defined(__clang__)
  37296. "adcs r5, %[r]\n\t"
  37297. #else
  37298. "adc r5, %[r]\n\t"
  37299. #endif
  37300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37301. "lsrs r6, %[a], #16\n\t"
  37302. #else
  37303. "lsr r6, %[a], #16\n\t"
  37304. #endif
  37305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37306. "lsrs r7, %[b], #16\n\t"
  37307. #else
  37308. "lsr r7, %[b], #16\n\t"
  37309. #endif
  37310. #ifdef WOLFSSL_KEIL
  37311. "muls r7, r6, r7\n\t"
  37312. #elif defined(__clang__)
  37313. "muls r7, r6\n\t"
  37314. #else
  37315. "mul r7, r6\n\t"
  37316. #endif
  37317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37318. "adds r4, r4, r7\n\t"
  37319. #else
  37320. "add r4, r4, r7\n\t"
  37321. #endif
  37322. #ifdef WOLFSSL_KEIL
  37323. "adcs r5, r5, %[r]\n\t"
  37324. #elif defined(__clang__)
  37325. "adcs r5, %[r]\n\t"
  37326. #else
  37327. "adc r5, %[r]\n\t"
  37328. #endif
  37329. "uxth r7, %[b]\n\t"
  37330. #ifdef WOLFSSL_KEIL
  37331. "muls r6, r7, r6\n\t"
  37332. #elif defined(__clang__)
  37333. "muls r6, r7\n\t"
  37334. #else
  37335. "mul r6, r7\n\t"
  37336. #endif
  37337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37338. "lsrs r7, r6, #16\n\t"
  37339. #else
  37340. "lsr r7, r6, #16\n\t"
  37341. #endif
  37342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37343. "lsls r6, r6, #16\n\t"
  37344. #else
  37345. "lsl r6, r6, #16\n\t"
  37346. #endif
  37347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37348. "adds r3, r3, r6\n\t"
  37349. #else
  37350. "add r3, r3, r6\n\t"
  37351. #endif
  37352. #ifdef WOLFSSL_KEIL
  37353. "adcs r4, r4, r7\n\t"
  37354. #elif defined(__clang__)
  37355. "adcs r4, r7\n\t"
  37356. #else
  37357. "adc r4, r7\n\t"
  37358. #endif
  37359. #ifdef WOLFSSL_KEIL
  37360. "adcs r5, r5, %[r]\n\t"
  37361. #elif defined(__clang__)
  37362. "adcs r5, %[r]\n\t"
  37363. #else
  37364. "adc r5, %[r]\n\t"
  37365. #endif
  37366. "# A[5] * B[4]\n\t"
  37367. "mov %[a], r9\n\t"
  37368. "mov %[b], r10\n\t"
  37369. "ldr %[a], [%[a], #20]\n\t"
  37370. "ldr %[b], [%[b], #16]\n\t"
  37371. "uxth r6, %[a]\n\t"
  37372. "uxth r7, %[b]\n\t"
  37373. #ifdef WOLFSSL_KEIL
  37374. "muls r7, r6, r7\n\t"
  37375. #elif defined(__clang__)
  37376. "muls r7, r6\n\t"
  37377. #else
  37378. "mul r7, r6\n\t"
  37379. #endif
  37380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37381. "adds r3, r3, r7\n\t"
  37382. #else
  37383. "add r3, r3, r7\n\t"
  37384. #endif
  37385. #ifdef WOLFSSL_KEIL
  37386. "adcs r4, r4, %[r]\n\t"
  37387. #elif defined(__clang__)
  37388. "adcs r4, %[r]\n\t"
  37389. #else
  37390. "adc r4, %[r]\n\t"
  37391. #endif
  37392. #ifdef WOLFSSL_KEIL
  37393. "adcs r5, r5, %[r]\n\t"
  37394. #elif defined(__clang__)
  37395. "adcs r5, %[r]\n\t"
  37396. #else
  37397. "adc r5, %[r]\n\t"
  37398. #endif
  37399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37400. "lsrs r7, %[b], #16\n\t"
  37401. #else
  37402. "lsr r7, %[b], #16\n\t"
  37403. #endif
  37404. #ifdef WOLFSSL_KEIL
  37405. "muls r6, r7, r6\n\t"
  37406. #elif defined(__clang__)
  37407. "muls r6, r7\n\t"
  37408. #else
  37409. "mul r6, r7\n\t"
  37410. #endif
  37411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37412. "lsrs r7, r6, #16\n\t"
  37413. #else
  37414. "lsr r7, r6, #16\n\t"
  37415. #endif
  37416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37417. "lsls r6, r6, #16\n\t"
  37418. #else
  37419. "lsl r6, r6, #16\n\t"
  37420. #endif
  37421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37422. "adds r3, r3, r6\n\t"
  37423. #else
  37424. "add r3, r3, r6\n\t"
  37425. #endif
  37426. #ifdef WOLFSSL_KEIL
  37427. "adcs r4, r4, r7\n\t"
  37428. #elif defined(__clang__)
  37429. "adcs r4, r7\n\t"
  37430. #else
  37431. "adc r4, r7\n\t"
  37432. #endif
  37433. #ifdef WOLFSSL_KEIL
  37434. "adcs r5, r5, %[r]\n\t"
  37435. #elif defined(__clang__)
  37436. "adcs r5, %[r]\n\t"
  37437. #else
  37438. "adc r5, %[r]\n\t"
  37439. #endif
  37440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37441. "lsrs r6, %[a], #16\n\t"
  37442. #else
  37443. "lsr r6, %[a], #16\n\t"
  37444. #endif
  37445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37446. "lsrs r7, %[b], #16\n\t"
  37447. #else
  37448. "lsr r7, %[b], #16\n\t"
  37449. #endif
  37450. #ifdef WOLFSSL_KEIL
  37451. "muls r7, r6, r7\n\t"
  37452. #elif defined(__clang__)
  37453. "muls r7, r6\n\t"
  37454. #else
  37455. "mul r7, r6\n\t"
  37456. #endif
  37457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37458. "adds r4, r4, r7\n\t"
  37459. #else
  37460. "add r4, r4, r7\n\t"
  37461. #endif
  37462. #ifdef WOLFSSL_KEIL
  37463. "adcs r5, r5, %[r]\n\t"
  37464. #elif defined(__clang__)
  37465. "adcs r5, %[r]\n\t"
  37466. #else
  37467. "adc r5, %[r]\n\t"
  37468. #endif
  37469. "uxth r7, %[b]\n\t"
  37470. #ifdef WOLFSSL_KEIL
  37471. "muls r6, r7, r6\n\t"
  37472. #elif defined(__clang__)
  37473. "muls r6, r7\n\t"
  37474. #else
  37475. "mul r6, r7\n\t"
  37476. #endif
  37477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37478. "lsrs r7, r6, #16\n\t"
  37479. #else
  37480. "lsr r7, r6, #16\n\t"
  37481. #endif
  37482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37483. "lsls r6, r6, #16\n\t"
  37484. #else
  37485. "lsl r6, r6, #16\n\t"
  37486. #endif
  37487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37488. "adds r3, r3, r6\n\t"
  37489. #else
  37490. "add r3, r3, r6\n\t"
  37491. #endif
  37492. #ifdef WOLFSSL_KEIL
  37493. "adcs r4, r4, r7\n\t"
  37494. #elif defined(__clang__)
  37495. "adcs r4, r7\n\t"
  37496. #else
  37497. "adc r4, r7\n\t"
  37498. #endif
  37499. #ifdef WOLFSSL_KEIL
  37500. "adcs r5, r5, %[r]\n\t"
  37501. #elif defined(__clang__)
  37502. "adcs r5, %[r]\n\t"
  37503. #else
  37504. "adc r5, %[r]\n\t"
  37505. #endif
  37506. "# A[6] * B[3]\n\t"
  37507. "mov %[a], r9\n\t"
  37508. "mov %[b], r10\n\t"
  37509. "ldr %[a], [%[a], #24]\n\t"
  37510. "ldr %[b], [%[b], #12]\n\t"
  37511. "uxth r6, %[a]\n\t"
  37512. "uxth r7, %[b]\n\t"
  37513. #ifdef WOLFSSL_KEIL
  37514. "muls r7, r6, r7\n\t"
  37515. #elif defined(__clang__)
  37516. "muls r7, r6\n\t"
  37517. #else
  37518. "mul r7, r6\n\t"
  37519. #endif
  37520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37521. "adds r3, r3, r7\n\t"
  37522. #else
  37523. "add r3, r3, r7\n\t"
  37524. #endif
  37525. #ifdef WOLFSSL_KEIL
  37526. "adcs r4, r4, %[r]\n\t"
  37527. #elif defined(__clang__)
  37528. "adcs r4, %[r]\n\t"
  37529. #else
  37530. "adc r4, %[r]\n\t"
  37531. #endif
  37532. #ifdef WOLFSSL_KEIL
  37533. "adcs r5, r5, %[r]\n\t"
  37534. #elif defined(__clang__)
  37535. "adcs r5, %[r]\n\t"
  37536. #else
  37537. "adc r5, %[r]\n\t"
  37538. #endif
  37539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37540. "lsrs r7, %[b], #16\n\t"
  37541. #else
  37542. "lsr r7, %[b], #16\n\t"
  37543. #endif
  37544. #ifdef WOLFSSL_KEIL
  37545. "muls r6, r7, r6\n\t"
  37546. #elif defined(__clang__)
  37547. "muls r6, r7\n\t"
  37548. #else
  37549. "mul r6, r7\n\t"
  37550. #endif
  37551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37552. "lsrs r7, r6, #16\n\t"
  37553. #else
  37554. "lsr r7, r6, #16\n\t"
  37555. #endif
  37556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37557. "lsls r6, r6, #16\n\t"
  37558. #else
  37559. "lsl r6, r6, #16\n\t"
  37560. #endif
  37561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37562. "adds r3, r3, r6\n\t"
  37563. #else
  37564. "add r3, r3, r6\n\t"
  37565. #endif
  37566. #ifdef WOLFSSL_KEIL
  37567. "adcs r4, r4, r7\n\t"
  37568. #elif defined(__clang__)
  37569. "adcs r4, r7\n\t"
  37570. #else
  37571. "adc r4, r7\n\t"
  37572. #endif
  37573. #ifdef WOLFSSL_KEIL
  37574. "adcs r5, r5, %[r]\n\t"
  37575. #elif defined(__clang__)
  37576. "adcs r5, %[r]\n\t"
  37577. #else
  37578. "adc r5, %[r]\n\t"
  37579. #endif
  37580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37581. "lsrs r6, %[a], #16\n\t"
  37582. #else
  37583. "lsr r6, %[a], #16\n\t"
  37584. #endif
  37585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37586. "lsrs r7, %[b], #16\n\t"
  37587. #else
  37588. "lsr r7, %[b], #16\n\t"
  37589. #endif
  37590. #ifdef WOLFSSL_KEIL
  37591. "muls r7, r6, r7\n\t"
  37592. #elif defined(__clang__)
  37593. "muls r7, r6\n\t"
  37594. #else
  37595. "mul r7, r6\n\t"
  37596. #endif
  37597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37598. "adds r4, r4, r7\n\t"
  37599. #else
  37600. "add r4, r4, r7\n\t"
  37601. #endif
  37602. #ifdef WOLFSSL_KEIL
  37603. "adcs r5, r5, %[r]\n\t"
  37604. #elif defined(__clang__)
  37605. "adcs r5, %[r]\n\t"
  37606. #else
  37607. "adc r5, %[r]\n\t"
  37608. #endif
  37609. "uxth r7, %[b]\n\t"
  37610. #ifdef WOLFSSL_KEIL
  37611. "muls r6, r7, r6\n\t"
  37612. #elif defined(__clang__)
  37613. "muls r6, r7\n\t"
  37614. #else
  37615. "mul r6, r7\n\t"
  37616. #endif
  37617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37618. "lsrs r7, r6, #16\n\t"
  37619. #else
  37620. "lsr r7, r6, #16\n\t"
  37621. #endif
  37622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37623. "lsls r6, r6, #16\n\t"
  37624. #else
  37625. "lsl r6, r6, #16\n\t"
  37626. #endif
  37627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37628. "adds r3, r3, r6\n\t"
  37629. #else
  37630. "add r3, r3, r6\n\t"
  37631. #endif
  37632. #ifdef WOLFSSL_KEIL
  37633. "adcs r4, r4, r7\n\t"
  37634. #elif defined(__clang__)
  37635. "adcs r4, r7\n\t"
  37636. #else
  37637. "adc r4, r7\n\t"
  37638. #endif
  37639. #ifdef WOLFSSL_KEIL
  37640. "adcs r5, r5, %[r]\n\t"
  37641. #elif defined(__clang__)
  37642. "adcs r5, %[r]\n\t"
  37643. #else
  37644. "adc r5, %[r]\n\t"
  37645. #endif
  37646. "# A[7] * B[2]\n\t"
  37647. "mov %[a], r9\n\t"
  37648. "mov %[b], r10\n\t"
  37649. "ldr %[a], [%[a], #28]\n\t"
  37650. "ldr %[b], [%[b], #8]\n\t"
  37651. "uxth r6, %[a]\n\t"
  37652. "uxth r7, %[b]\n\t"
  37653. #ifdef WOLFSSL_KEIL
  37654. "muls r7, r6, r7\n\t"
  37655. #elif defined(__clang__)
  37656. "muls r7, r6\n\t"
  37657. #else
  37658. "mul r7, r6\n\t"
  37659. #endif
  37660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37661. "adds r3, r3, r7\n\t"
  37662. #else
  37663. "add r3, r3, r7\n\t"
  37664. #endif
  37665. #ifdef WOLFSSL_KEIL
  37666. "adcs r4, r4, %[r]\n\t"
  37667. #elif defined(__clang__)
  37668. "adcs r4, %[r]\n\t"
  37669. #else
  37670. "adc r4, %[r]\n\t"
  37671. #endif
  37672. #ifdef WOLFSSL_KEIL
  37673. "adcs r5, r5, %[r]\n\t"
  37674. #elif defined(__clang__)
  37675. "adcs r5, %[r]\n\t"
  37676. #else
  37677. "adc r5, %[r]\n\t"
  37678. #endif
  37679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37680. "lsrs r7, %[b], #16\n\t"
  37681. #else
  37682. "lsr r7, %[b], #16\n\t"
  37683. #endif
  37684. #ifdef WOLFSSL_KEIL
  37685. "muls r6, r7, r6\n\t"
  37686. #elif defined(__clang__)
  37687. "muls r6, r7\n\t"
  37688. #else
  37689. "mul r6, r7\n\t"
  37690. #endif
  37691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37692. "lsrs r7, r6, #16\n\t"
  37693. #else
  37694. "lsr r7, r6, #16\n\t"
  37695. #endif
  37696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37697. "lsls r6, r6, #16\n\t"
  37698. #else
  37699. "lsl r6, r6, #16\n\t"
  37700. #endif
  37701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37702. "adds r3, r3, r6\n\t"
  37703. #else
  37704. "add r3, r3, r6\n\t"
  37705. #endif
  37706. #ifdef WOLFSSL_KEIL
  37707. "adcs r4, r4, r7\n\t"
  37708. #elif defined(__clang__)
  37709. "adcs r4, r7\n\t"
  37710. #else
  37711. "adc r4, r7\n\t"
  37712. #endif
  37713. #ifdef WOLFSSL_KEIL
  37714. "adcs r5, r5, %[r]\n\t"
  37715. #elif defined(__clang__)
  37716. "adcs r5, %[r]\n\t"
  37717. #else
  37718. "adc r5, %[r]\n\t"
  37719. #endif
  37720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37721. "lsrs r6, %[a], #16\n\t"
  37722. #else
  37723. "lsr r6, %[a], #16\n\t"
  37724. #endif
  37725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37726. "lsrs r7, %[b], #16\n\t"
  37727. #else
  37728. "lsr r7, %[b], #16\n\t"
  37729. #endif
  37730. #ifdef WOLFSSL_KEIL
  37731. "muls r7, r6, r7\n\t"
  37732. #elif defined(__clang__)
  37733. "muls r7, r6\n\t"
  37734. #else
  37735. "mul r7, r6\n\t"
  37736. #endif
  37737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37738. "adds r4, r4, r7\n\t"
  37739. #else
  37740. "add r4, r4, r7\n\t"
  37741. #endif
  37742. #ifdef WOLFSSL_KEIL
  37743. "adcs r5, r5, %[r]\n\t"
  37744. #elif defined(__clang__)
  37745. "adcs r5, %[r]\n\t"
  37746. #else
  37747. "adc r5, %[r]\n\t"
  37748. #endif
  37749. "uxth r7, %[b]\n\t"
  37750. #ifdef WOLFSSL_KEIL
  37751. "muls r6, r7, r6\n\t"
  37752. #elif defined(__clang__)
  37753. "muls r6, r7\n\t"
  37754. #else
  37755. "mul r6, r7\n\t"
  37756. #endif
  37757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37758. "lsrs r7, r6, #16\n\t"
  37759. #else
  37760. "lsr r7, r6, #16\n\t"
  37761. #endif
  37762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37763. "lsls r6, r6, #16\n\t"
  37764. #else
  37765. "lsl r6, r6, #16\n\t"
  37766. #endif
  37767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37768. "adds r3, r3, r6\n\t"
  37769. #else
  37770. "add r3, r3, r6\n\t"
  37771. #endif
  37772. #ifdef WOLFSSL_KEIL
  37773. "adcs r4, r4, r7\n\t"
  37774. #elif defined(__clang__)
  37775. "adcs r4, r7\n\t"
  37776. #else
  37777. "adc r4, r7\n\t"
  37778. #endif
  37779. #ifdef WOLFSSL_KEIL
  37780. "adcs r5, r5, %[r]\n\t"
  37781. #elif defined(__clang__)
  37782. "adcs r5, %[r]\n\t"
  37783. #else
  37784. "adc r5, %[r]\n\t"
  37785. #endif
  37786. "# A[8] * B[1]\n\t"
  37787. "mov %[a], r9\n\t"
  37788. "mov %[b], r10\n\t"
  37789. "ldr %[a], [%[a], #32]\n\t"
  37790. "ldr %[b], [%[b], #4]\n\t"
  37791. "uxth r6, %[a]\n\t"
  37792. "uxth r7, %[b]\n\t"
  37793. #ifdef WOLFSSL_KEIL
  37794. "muls r7, r6, r7\n\t"
  37795. #elif defined(__clang__)
  37796. "muls r7, r6\n\t"
  37797. #else
  37798. "mul r7, r6\n\t"
  37799. #endif
  37800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37801. "adds r3, r3, r7\n\t"
  37802. #else
  37803. "add r3, r3, r7\n\t"
  37804. #endif
  37805. #ifdef WOLFSSL_KEIL
  37806. "adcs r4, r4, %[r]\n\t"
  37807. #elif defined(__clang__)
  37808. "adcs r4, %[r]\n\t"
  37809. #else
  37810. "adc r4, %[r]\n\t"
  37811. #endif
  37812. #ifdef WOLFSSL_KEIL
  37813. "adcs r5, r5, %[r]\n\t"
  37814. #elif defined(__clang__)
  37815. "adcs r5, %[r]\n\t"
  37816. #else
  37817. "adc r5, %[r]\n\t"
  37818. #endif
  37819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37820. "lsrs r7, %[b], #16\n\t"
  37821. #else
  37822. "lsr r7, %[b], #16\n\t"
  37823. #endif
  37824. #ifdef WOLFSSL_KEIL
  37825. "muls r6, r7, r6\n\t"
  37826. #elif defined(__clang__)
  37827. "muls r6, r7\n\t"
  37828. #else
  37829. "mul r6, r7\n\t"
  37830. #endif
  37831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37832. "lsrs r7, r6, #16\n\t"
  37833. #else
  37834. "lsr r7, r6, #16\n\t"
  37835. #endif
  37836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37837. "lsls r6, r6, #16\n\t"
  37838. #else
  37839. "lsl r6, r6, #16\n\t"
  37840. #endif
  37841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37842. "adds r3, r3, r6\n\t"
  37843. #else
  37844. "add r3, r3, r6\n\t"
  37845. #endif
  37846. #ifdef WOLFSSL_KEIL
  37847. "adcs r4, r4, r7\n\t"
  37848. #elif defined(__clang__)
  37849. "adcs r4, r7\n\t"
  37850. #else
  37851. "adc r4, r7\n\t"
  37852. #endif
  37853. #ifdef WOLFSSL_KEIL
  37854. "adcs r5, r5, %[r]\n\t"
  37855. #elif defined(__clang__)
  37856. "adcs r5, %[r]\n\t"
  37857. #else
  37858. "adc r5, %[r]\n\t"
  37859. #endif
  37860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37861. "lsrs r6, %[a], #16\n\t"
  37862. #else
  37863. "lsr r6, %[a], #16\n\t"
  37864. #endif
  37865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37866. "lsrs r7, %[b], #16\n\t"
  37867. #else
  37868. "lsr r7, %[b], #16\n\t"
  37869. #endif
  37870. #ifdef WOLFSSL_KEIL
  37871. "muls r7, r6, r7\n\t"
  37872. #elif defined(__clang__)
  37873. "muls r7, r6\n\t"
  37874. #else
  37875. "mul r7, r6\n\t"
  37876. #endif
  37877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37878. "adds r4, r4, r7\n\t"
  37879. #else
  37880. "add r4, r4, r7\n\t"
  37881. #endif
  37882. #ifdef WOLFSSL_KEIL
  37883. "adcs r5, r5, %[r]\n\t"
  37884. #elif defined(__clang__)
  37885. "adcs r5, %[r]\n\t"
  37886. #else
  37887. "adc r5, %[r]\n\t"
  37888. #endif
  37889. "uxth r7, %[b]\n\t"
  37890. #ifdef WOLFSSL_KEIL
  37891. "muls r6, r7, r6\n\t"
  37892. #elif defined(__clang__)
  37893. "muls r6, r7\n\t"
  37894. #else
  37895. "mul r6, r7\n\t"
  37896. #endif
  37897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37898. "lsrs r7, r6, #16\n\t"
  37899. #else
  37900. "lsr r7, r6, #16\n\t"
  37901. #endif
  37902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37903. "lsls r6, r6, #16\n\t"
  37904. #else
  37905. "lsl r6, r6, #16\n\t"
  37906. #endif
  37907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37908. "adds r3, r3, r6\n\t"
  37909. #else
  37910. "add r3, r3, r6\n\t"
  37911. #endif
  37912. #ifdef WOLFSSL_KEIL
  37913. "adcs r4, r4, r7\n\t"
  37914. #elif defined(__clang__)
  37915. "adcs r4, r7\n\t"
  37916. #else
  37917. "adc r4, r7\n\t"
  37918. #endif
  37919. #ifdef WOLFSSL_KEIL
  37920. "adcs r5, r5, %[r]\n\t"
  37921. #elif defined(__clang__)
  37922. "adcs r5, %[r]\n\t"
  37923. #else
  37924. "adc r5, %[r]\n\t"
  37925. #endif
  37926. "# A[9] * B[0]\n\t"
  37927. "mov %[a], r9\n\t"
  37928. "mov %[b], r10\n\t"
  37929. "ldr %[a], [%[a], #36]\n\t"
  37930. "ldr %[b], [%[b]]\n\t"
  37931. "uxth r6, %[a]\n\t"
  37932. "uxth r7, %[b]\n\t"
  37933. #ifdef WOLFSSL_KEIL
  37934. "muls r7, r6, r7\n\t"
  37935. #elif defined(__clang__)
  37936. "muls r7, r6\n\t"
  37937. #else
  37938. "mul r7, r6\n\t"
  37939. #endif
  37940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37941. "adds r3, r3, r7\n\t"
  37942. #else
  37943. "add r3, r3, r7\n\t"
  37944. #endif
  37945. #ifdef WOLFSSL_KEIL
  37946. "adcs r4, r4, %[r]\n\t"
  37947. #elif defined(__clang__)
  37948. "adcs r4, %[r]\n\t"
  37949. #else
  37950. "adc r4, %[r]\n\t"
  37951. #endif
  37952. #ifdef WOLFSSL_KEIL
  37953. "adcs r5, r5, %[r]\n\t"
  37954. #elif defined(__clang__)
  37955. "adcs r5, %[r]\n\t"
  37956. #else
  37957. "adc r5, %[r]\n\t"
  37958. #endif
  37959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37960. "lsrs r7, %[b], #16\n\t"
  37961. #else
  37962. "lsr r7, %[b], #16\n\t"
  37963. #endif
  37964. #ifdef WOLFSSL_KEIL
  37965. "muls r6, r7, r6\n\t"
  37966. #elif defined(__clang__)
  37967. "muls r6, r7\n\t"
  37968. #else
  37969. "mul r6, r7\n\t"
  37970. #endif
  37971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37972. "lsrs r7, r6, #16\n\t"
  37973. #else
  37974. "lsr r7, r6, #16\n\t"
  37975. #endif
  37976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37977. "lsls r6, r6, #16\n\t"
  37978. #else
  37979. "lsl r6, r6, #16\n\t"
  37980. #endif
  37981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37982. "adds r3, r3, r6\n\t"
  37983. #else
  37984. "add r3, r3, r6\n\t"
  37985. #endif
  37986. #ifdef WOLFSSL_KEIL
  37987. "adcs r4, r4, r7\n\t"
  37988. #elif defined(__clang__)
  37989. "adcs r4, r7\n\t"
  37990. #else
  37991. "adc r4, r7\n\t"
  37992. #endif
  37993. #ifdef WOLFSSL_KEIL
  37994. "adcs r5, r5, %[r]\n\t"
  37995. #elif defined(__clang__)
  37996. "adcs r5, %[r]\n\t"
  37997. #else
  37998. "adc r5, %[r]\n\t"
  37999. #endif
  38000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38001. "lsrs r6, %[a], #16\n\t"
  38002. #else
  38003. "lsr r6, %[a], #16\n\t"
  38004. #endif
  38005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38006. "lsrs r7, %[b], #16\n\t"
  38007. #else
  38008. "lsr r7, %[b], #16\n\t"
  38009. #endif
  38010. #ifdef WOLFSSL_KEIL
  38011. "muls r7, r6, r7\n\t"
  38012. #elif defined(__clang__)
  38013. "muls r7, r6\n\t"
  38014. #else
  38015. "mul r7, r6\n\t"
  38016. #endif
  38017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38018. "adds r4, r4, r7\n\t"
  38019. #else
  38020. "add r4, r4, r7\n\t"
  38021. #endif
  38022. #ifdef WOLFSSL_KEIL
  38023. "adcs r5, r5, %[r]\n\t"
  38024. #elif defined(__clang__)
  38025. "adcs r5, %[r]\n\t"
  38026. #else
  38027. "adc r5, %[r]\n\t"
  38028. #endif
  38029. "uxth r7, %[b]\n\t"
  38030. #ifdef WOLFSSL_KEIL
  38031. "muls r6, r7, r6\n\t"
  38032. #elif defined(__clang__)
  38033. "muls r6, r7\n\t"
  38034. #else
  38035. "mul r6, r7\n\t"
  38036. #endif
  38037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38038. "lsrs r7, r6, #16\n\t"
  38039. #else
  38040. "lsr r7, r6, #16\n\t"
  38041. #endif
  38042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38043. "lsls r6, r6, #16\n\t"
  38044. #else
  38045. "lsl r6, r6, #16\n\t"
  38046. #endif
  38047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38048. "adds r3, r3, r6\n\t"
  38049. #else
  38050. "add r3, r3, r6\n\t"
  38051. #endif
  38052. #ifdef WOLFSSL_KEIL
  38053. "adcs r4, r4, r7\n\t"
  38054. #elif defined(__clang__)
  38055. "adcs r4, r7\n\t"
  38056. #else
  38057. "adc r4, r7\n\t"
  38058. #endif
  38059. #ifdef WOLFSSL_KEIL
  38060. "adcs r5, r5, %[r]\n\t"
  38061. #elif defined(__clang__)
  38062. "adcs r5, %[r]\n\t"
  38063. #else
  38064. "adc r5, %[r]\n\t"
  38065. #endif
  38066. "str r3, [sp, #36]\n\t"
  38067. "# A[10] * B[0]\n\t"
  38068. "movs r3, #0\n\t"
  38069. "mov %[a], r9\n\t"
  38070. "mov %[b], r10\n\t"
  38071. "ldr %[a], [%[a], #40]\n\t"
  38072. "ldr %[b], [%[b]]\n\t"
  38073. "uxth r6, %[a]\n\t"
  38074. "uxth r7, %[b]\n\t"
  38075. #ifdef WOLFSSL_KEIL
  38076. "muls r7, r6, r7\n\t"
  38077. #elif defined(__clang__)
  38078. "muls r7, r6\n\t"
  38079. #else
  38080. "mul r7, r6\n\t"
  38081. #endif
  38082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38083. "adds r4, r4, r7\n\t"
  38084. #else
  38085. "add r4, r4, r7\n\t"
  38086. #endif
  38087. #ifdef WOLFSSL_KEIL
  38088. "adcs r5, r5, %[r]\n\t"
  38089. #elif defined(__clang__)
  38090. "adcs r5, %[r]\n\t"
  38091. #else
  38092. "adc r5, %[r]\n\t"
  38093. #endif
  38094. #ifdef WOLFSSL_KEIL
  38095. "adcs r3, r3, %[r]\n\t"
  38096. #elif defined(__clang__)
  38097. "adcs r3, %[r]\n\t"
  38098. #else
  38099. "adc r3, %[r]\n\t"
  38100. #endif
  38101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38102. "lsrs r7, %[b], #16\n\t"
  38103. #else
  38104. "lsr r7, %[b], #16\n\t"
  38105. #endif
  38106. #ifdef WOLFSSL_KEIL
  38107. "muls r6, r7, r6\n\t"
  38108. #elif defined(__clang__)
  38109. "muls r6, r7\n\t"
  38110. #else
  38111. "mul r6, r7\n\t"
  38112. #endif
  38113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38114. "lsrs r7, r6, #16\n\t"
  38115. #else
  38116. "lsr r7, r6, #16\n\t"
  38117. #endif
  38118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38119. "lsls r6, r6, #16\n\t"
  38120. #else
  38121. "lsl r6, r6, #16\n\t"
  38122. #endif
  38123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38124. "adds r4, r4, r6\n\t"
  38125. #else
  38126. "add r4, r4, r6\n\t"
  38127. #endif
  38128. #ifdef WOLFSSL_KEIL
  38129. "adcs r5, r5, r7\n\t"
  38130. #elif defined(__clang__)
  38131. "adcs r5, r7\n\t"
  38132. #else
  38133. "adc r5, r7\n\t"
  38134. #endif
  38135. #ifdef WOLFSSL_KEIL
  38136. "adcs r3, r3, %[r]\n\t"
  38137. #elif defined(__clang__)
  38138. "adcs r3, %[r]\n\t"
  38139. #else
  38140. "adc r3, %[r]\n\t"
  38141. #endif
  38142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38143. "lsrs r6, %[a], #16\n\t"
  38144. #else
  38145. "lsr r6, %[a], #16\n\t"
  38146. #endif
  38147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38148. "lsrs r7, %[b], #16\n\t"
  38149. #else
  38150. "lsr r7, %[b], #16\n\t"
  38151. #endif
  38152. #ifdef WOLFSSL_KEIL
  38153. "muls r7, r6, r7\n\t"
  38154. #elif defined(__clang__)
  38155. "muls r7, r6\n\t"
  38156. #else
  38157. "mul r7, r6\n\t"
  38158. #endif
  38159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38160. "adds r5, r5, r7\n\t"
  38161. #else
  38162. "add r5, r5, r7\n\t"
  38163. #endif
  38164. #ifdef WOLFSSL_KEIL
  38165. "adcs r3, r3, %[r]\n\t"
  38166. #elif defined(__clang__)
  38167. "adcs r3, %[r]\n\t"
  38168. #else
  38169. "adc r3, %[r]\n\t"
  38170. #endif
  38171. "uxth r7, %[b]\n\t"
  38172. #ifdef WOLFSSL_KEIL
  38173. "muls r6, r7, r6\n\t"
  38174. #elif defined(__clang__)
  38175. "muls r6, r7\n\t"
  38176. #else
  38177. "mul r6, r7\n\t"
  38178. #endif
  38179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38180. "lsrs r7, r6, #16\n\t"
  38181. #else
  38182. "lsr r7, r6, #16\n\t"
  38183. #endif
  38184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38185. "lsls r6, r6, #16\n\t"
  38186. #else
  38187. "lsl r6, r6, #16\n\t"
  38188. #endif
  38189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38190. "adds r4, r4, r6\n\t"
  38191. #else
  38192. "add r4, r4, r6\n\t"
  38193. #endif
  38194. #ifdef WOLFSSL_KEIL
  38195. "adcs r5, r5, r7\n\t"
  38196. #elif defined(__clang__)
  38197. "adcs r5, r7\n\t"
  38198. #else
  38199. "adc r5, r7\n\t"
  38200. #endif
  38201. #ifdef WOLFSSL_KEIL
  38202. "adcs r3, r3, %[r]\n\t"
  38203. #elif defined(__clang__)
  38204. "adcs r3, %[r]\n\t"
  38205. #else
  38206. "adc r3, %[r]\n\t"
  38207. #endif
  38208. "# A[9] * B[1]\n\t"
  38209. "mov %[a], r9\n\t"
  38210. "mov %[b], r10\n\t"
  38211. "ldr %[a], [%[a], #36]\n\t"
  38212. "ldr %[b], [%[b], #4]\n\t"
  38213. "uxth r6, %[a]\n\t"
  38214. "uxth r7, %[b]\n\t"
  38215. #ifdef WOLFSSL_KEIL
  38216. "muls r7, r6, r7\n\t"
  38217. #elif defined(__clang__)
  38218. "muls r7, r6\n\t"
  38219. #else
  38220. "mul r7, r6\n\t"
  38221. #endif
  38222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38223. "adds r4, r4, r7\n\t"
  38224. #else
  38225. "add r4, r4, r7\n\t"
  38226. #endif
  38227. #ifdef WOLFSSL_KEIL
  38228. "adcs r5, r5, %[r]\n\t"
  38229. #elif defined(__clang__)
  38230. "adcs r5, %[r]\n\t"
  38231. #else
  38232. "adc r5, %[r]\n\t"
  38233. #endif
  38234. #ifdef WOLFSSL_KEIL
  38235. "adcs r3, r3, %[r]\n\t"
  38236. #elif defined(__clang__)
  38237. "adcs r3, %[r]\n\t"
  38238. #else
  38239. "adc r3, %[r]\n\t"
  38240. #endif
  38241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38242. "lsrs r7, %[b], #16\n\t"
  38243. #else
  38244. "lsr r7, %[b], #16\n\t"
  38245. #endif
  38246. #ifdef WOLFSSL_KEIL
  38247. "muls r6, r7, r6\n\t"
  38248. #elif defined(__clang__)
  38249. "muls r6, r7\n\t"
  38250. #else
  38251. "mul r6, r7\n\t"
  38252. #endif
  38253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38254. "lsrs r7, r6, #16\n\t"
  38255. #else
  38256. "lsr r7, r6, #16\n\t"
  38257. #endif
  38258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38259. "lsls r6, r6, #16\n\t"
  38260. #else
  38261. "lsl r6, r6, #16\n\t"
  38262. #endif
  38263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38264. "adds r4, r4, r6\n\t"
  38265. #else
  38266. "add r4, r4, r6\n\t"
  38267. #endif
  38268. #ifdef WOLFSSL_KEIL
  38269. "adcs r5, r5, r7\n\t"
  38270. #elif defined(__clang__)
  38271. "adcs r5, r7\n\t"
  38272. #else
  38273. "adc r5, r7\n\t"
  38274. #endif
  38275. #ifdef WOLFSSL_KEIL
  38276. "adcs r3, r3, %[r]\n\t"
  38277. #elif defined(__clang__)
  38278. "adcs r3, %[r]\n\t"
  38279. #else
  38280. "adc r3, %[r]\n\t"
  38281. #endif
  38282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38283. "lsrs r6, %[a], #16\n\t"
  38284. #else
  38285. "lsr r6, %[a], #16\n\t"
  38286. #endif
  38287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38288. "lsrs r7, %[b], #16\n\t"
  38289. #else
  38290. "lsr r7, %[b], #16\n\t"
  38291. #endif
  38292. #ifdef WOLFSSL_KEIL
  38293. "muls r7, r6, r7\n\t"
  38294. #elif defined(__clang__)
  38295. "muls r7, r6\n\t"
  38296. #else
  38297. "mul r7, r6\n\t"
  38298. #endif
  38299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38300. "adds r5, r5, r7\n\t"
  38301. #else
  38302. "add r5, r5, r7\n\t"
  38303. #endif
  38304. #ifdef WOLFSSL_KEIL
  38305. "adcs r3, r3, %[r]\n\t"
  38306. #elif defined(__clang__)
  38307. "adcs r3, %[r]\n\t"
  38308. #else
  38309. "adc r3, %[r]\n\t"
  38310. #endif
  38311. "uxth r7, %[b]\n\t"
  38312. #ifdef WOLFSSL_KEIL
  38313. "muls r6, r7, r6\n\t"
  38314. #elif defined(__clang__)
  38315. "muls r6, r7\n\t"
  38316. #else
  38317. "mul r6, r7\n\t"
  38318. #endif
  38319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38320. "lsrs r7, r6, #16\n\t"
  38321. #else
  38322. "lsr r7, r6, #16\n\t"
  38323. #endif
  38324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38325. "lsls r6, r6, #16\n\t"
  38326. #else
  38327. "lsl r6, r6, #16\n\t"
  38328. #endif
  38329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38330. "adds r4, r4, r6\n\t"
  38331. #else
  38332. "add r4, r4, r6\n\t"
  38333. #endif
  38334. #ifdef WOLFSSL_KEIL
  38335. "adcs r5, r5, r7\n\t"
  38336. #elif defined(__clang__)
  38337. "adcs r5, r7\n\t"
  38338. #else
  38339. "adc r5, r7\n\t"
  38340. #endif
  38341. #ifdef WOLFSSL_KEIL
  38342. "adcs r3, r3, %[r]\n\t"
  38343. #elif defined(__clang__)
  38344. "adcs r3, %[r]\n\t"
  38345. #else
  38346. "adc r3, %[r]\n\t"
  38347. #endif
  38348. "# A[8] * B[2]\n\t"
  38349. "mov %[a], r9\n\t"
  38350. "mov %[b], r10\n\t"
  38351. "ldr %[a], [%[a], #32]\n\t"
  38352. "ldr %[b], [%[b], #8]\n\t"
  38353. "uxth r6, %[a]\n\t"
  38354. "uxth r7, %[b]\n\t"
  38355. #ifdef WOLFSSL_KEIL
  38356. "muls r7, r6, r7\n\t"
  38357. #elif defined(__clang__)
  38358. "muls r7, r6\n\t"
  38359. #else
  38360. "mul r7, r6\n\t"
  38361. #endif
  38362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38363. "adds r4, r4, r7\n\t"
  38364. #else
  38365. "add r4, r4, r7\n\t"
  38366. #endif
  38367. #ifdef WOLFSSL_KEIL
  38368. "adcs r5, r5, %[r]\n\t"
  38369. #elif defined(__clang__)
  38370. "adcs r5, %[r]\n\t"
  38371. #else
  38372. "adc r5, %[r]\n\t"
  38373. #endif
  38374. #ifdef WOLFSSL_KEIL
  38375. "adcs r3, r3, %[r]\n\t"
  38376. #elif defined(__clang__)
  38377. "adcs r3, %[r]\n\t"
  38378. #else
  38379. "adc r3, %[r]\n\t"
  38380. #endif
  38381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38382. "lsrs r7, %[b], #16\n\t"
  38383. #else
  38384. "lsr r7, %[b], #16\n\t"
  38385. #endif
  38386. #ifdef WOLFSSL_KEIL
  38387. "muls r6, r7, r6\n\t"
  38388. #elif defined(__clang__)
  38389. "muls r6, r7\n\t"
  38390. #else
  38391. "mul r6, r7\n\t"
  38392. #endif
  38393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38394. "lsrs r7, r6, #16\n\t"
  38395. #else
  38396. "lsr r7, r6, #16\n\t"
  38397. #endif
  38398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38399. "lsls r6, r6, #16\n\t"
  38400. #else
  38401. "lsl r6, r6, #16\n\t"
  38402. #endif
  38403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38404. "adds r4, r4, r6\n\t"
  38405. #else
  38406. "add r4, r4, r6\n\t"
  38407. #endif
  38408. #ifdef WOLFSSL_KEIL
  38409. "adcs r5, r5, r7\n\t"
  38410. #elif defined(__clang__)
  38411. "adcs r5, r7\n\t"
  38412. #else
  38413. "adc r5, r7\n\t"
  38414. #endif
  38415. #ifdef WOLFSSL_KEIL
  38416. "adcs r3, r3, %[r]\n\t"
  38417. #elif defined(__clang__)
  38418. "adcs r3, %[r]\n\t"
  38419. #else
  38420. "adc r3, %[r]\n\t"
  38421. #endif
  38422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38423. "lsrs r6, %[a], #16\n\t"
  38424. #else
  38425. "lsr r6, %[a], #16\n\t"
  38426. #endif
  38427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38428. "lsrs r7, %[b], #16\n\t"
  38429. #else
  38430. "lsr r7, %[b], #16\n\t"
  38431. #endif
  38432. #ifdef WOLFSSL_KEIL
  38433. "muls r7, r6, r7\n\t"
  38434. #elif defined(__clang__)
  38435. "muls r7, r6\n\t"
  38436. #else
  38437. "mul r7, r6\n\t"
  38438. #endif
  38439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38440. "adds r5, r5, r7\n\t"
  38441. #else
  38442. "add r5, r5, r7\n\t"
  38443. #endif
  38444. #ifdef WOLFSSL_KEIL
  38445. "adcs r3, r3, %[r]\n\t"
  38446. #elif defined(__clang__)
  38447. "adcs r3, %[r]\n\t"
  38448. #else
  38449. "adc r3, %[r]\n\t"
  38450. #endif
  38451. "uxth r7, %[b]\n\t"
  38452. #ifdef WOLFSSL_KEIL
  38453. "muls r6, r7, r6\n\t"
  38454. #elif defined(__clang__)
  38455. "muls r6, r7\n\t"
  38456. #else
  38457. "mul r6, r7\n\t"
  38458. #endif
  38459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38460. "lsrs r7, r6, #16\n\t"
  38461. #else
  38462. "lsr r7, r6, #16\n\t"
  38463. #endif
  38464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38465. "lsls r6, r6, #16\n\t"
  38466. #else
  38467. "lsl r6, r6, #16\n\t"
  38468. #endif
  38469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38470. "adds r4, r4, r6\n\t"
  38471. #else
  38472. "add r4, r4, r6\n\t"
  38473. #endif
  38474. #ifdef WOLFSSL_KEIL
  38475. "adcs r5, r5, r7\n\t"
  38476. #elif defined(__clang__)
  38477. "adcs r5, r7\n\t"
  38478. #else
  38479. "adc r5, r7\n\t"
  38480. #endif
  38481. #ifdef WOLFSSL_KEIL
  38482. "adcs r3, r3, %[r]\n\t"
  38483. #elif defined(__clang__)
  38484. "adcs r3, %[r]\n\t"
  38485. #else
  38486. "adc r3, %[r]\n\t"
  38487. #endif
  38488. "# A[7] * B[3]\n\t"
  38489. "mov %[a], r9\n\t"
  38490. "mov %[b], r10\n\t"
  38491. "ldr %[a], [%[a], #28]\n\t"
  38492. "ldr %[b], [%[b], #12]\n\t"
  38493. "uxth r6, %[a]\n\t"
  38494. "uxth r7, %[b]\n\t"
  38495. #ifdef WOLFSSL_KEIL
  38496. "muls r7, r6, r7\n\t"
  38497. #elif defined(__clang__)
  38498. "muls r7, r6\n\t"
  38499. #else
  38500. "mul r7, r6\n\t"
  38501. #endif
  38502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38503. "adds r4, r4, r7\n\t"
  38504. #else
  38505. "add r4, r4, r7\n\t"
  38506. #endif
  38507. #ifdef WOLFSSL_KEIL
  38508. "adcs r5, r5, %[r]\n\t"
  38509. #elif defined(__clang__)
  38510. "adcs r5, %[r]\n\t"
  38511. #else
  38512. "adc r5, %[r]\n\t"
  38513. #endif
  38514. #ifdef WOLFSSL_KEIL
  38515. "adcs r3, r3, %[r]\n\t"
  38516. #elif defined(__clang__)
  38517. "adcs r3, %[r]\n\t"
  38518. #else
  38519. "adc r3, %[r]\n\t"
  38520. #endif
  38521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38522. "lsrs r7, %[b], #16\n\t"
  38523. #else
  38524. "lsr r7, %[b], #16\n\t"
  38525. #endif
  38526. #ifdef WOLFSSL_KEIL
  38527. "muls r6, r7, r6\n\t"
  38528. #elif defined(__clang__)
  38529. "muls r6, r7\n\t"
  38530. #else
  38531. "mul r6, r7\n\t"
  38532. #endif
  38533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38534. "lsrs r7, r6, #16\n\t"
  38535. #else
  38536. "lsr r7, r6, #16\n\t"
  38537. #endif
  38538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38539. "lsls r6, r6, #16\n\t"
  38540. #else
  38541. "lsl r6, r6, #16\n\t"
  38542. #endif
  38543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38544. "adds r4, r4, r6\n\t"
  38545. #else
  38546. "add r4, r4, r6\n\t"
  38547. #endif
  38548. #ifdef WOLFSSL_KEIL
  38549. "adcs r5, r5, r7\n\t"
  38550. #elif defined(__clang__)
  38551. "adcs r5, r7\n\t"
  38552. #else
  38553. "adc r5, r7\n\t"
  38554. #endif
  38555. #ifdef WOLFSSL_KEIL
  38556. "adcs r3, r3, %[r]\n\t"
  38557. #elif defined(__clang__)
  38558. "adcs r3, %[r]\n\t"
  38559. #else
  38560. "adc r3, %[r]\n\t"
  38561. #endif
  38562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38563. "lsrs r6, %[a], #16\n\t"
  38564. #else
  38565. "lsr r6, %[a], #16\n\t"
  38566. #endif
  38567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38568. "lsrs r7, %[b], #16\n\t"
  38569. #else
  38570. "lsr r7, %[b], #16\n\t"
  38571. #endif
  38572. #ifdef WOLFSSL_KEIL
  38573. "muls r7, r6, r7\n\t"
  38574. #elif defined(__clang__)
  38575. "muls r7, r6\n\t"
  38576. #else
  38577. "mul r7, r6\n\t"
  38578. #endif
  38579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38580. "adds r5, r5, r7\n\t"
  38581. #else
  38582. "add r5, r5, r7\n\t"
  38583. #endif
  38584. #ifdef WOLFSSL_KEIL
  38585. "adcs r3, r3, %[r]\n\t"
  38586. #elif defined(__clang__)
  38587. "adcs r3, %[r]\n\t"
  38588. #else
  38589. "adc r3, %[r]\n\t"
  38590. #endif
  38591. "uxth r7, %[b]\n\t"
  38592. #ifdef WOLFSSL_KEIL
  38593. "muls r6, r7, r6\n\t"
  38594. #elif defined(__clang__)
  38595. "muls r6, r7\n\t"
  38596. #else
  38597. "mul r6, r7\n\t"
  38598. #endif
  38599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38600. "lsrs r7, r6, #16\n\t"
  38601. #else
  38602. "lsr r7, r6, #16\n\t"
  38603. #endif
  38604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38605. "lsls r6, r6, #16\n\t"
  38606. #else
  38607. "lsl r6, r6, #16\n\t"
  38608. #endif
  38609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38610. "adds r4, r4, r6\n\t"
  38611. #else
  38612. "add r4, r4, r6\n\t"
  38613. #endif
  38614. #ifdef WOLFSSL_KEIL
  38615. "adcs r5, r5, r7\n\t"
  38616. #elif defined(__clang__)
  38617. "adcs r5, r7\n\t"
  38618. #else
  38619. "adc r5, r7\n\t"
  38620. #endif
  38621. #ifdef WOLFSSL_KEIL
  38622. "adcs r3, r3, %[r]\n\t"
  38623. #elif defined(__clang__)
  38624. "adcs r3, %[r]\n\t"
  38625. #else
  38626. "adc r3, %[r]\n\t"
  38627. #endif
  38628. "# A[6] * B[4]\n\t"
  38629. "mov %[a], r9\n\t"
  38630. "mov %[b], r10\n\t"
  38631. "ldr %[a], [%[a], #24]\n\t"
  38632. "ldr %[b], [%[b], #16]\n\t"
  38633. "uxth r6, %[a]\n\t"
  38634. "uxth r7, %[b]\n\t"
  38635. #ifdef WOLFSSL_KEIL
  38636. "muls r7, r6, r7\n\t"
  38637. #elif defined(__clang__)
  38638. "muls r7, r6\n\t"
  38639. #else
  38640. "mul r7, r6\n\t"
  38641. #endif
  38642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38643. "adds r4, r4, r7\n\t"
  38644. #else
  38645. "add r4, r4, r7\n\t"
  38646. #endif
  38647. #ifdef WOLFSSL_KEIL
  38648. "adcs r5, r5, %[r]\n\t"
  38649. #elif defined(__clang__)
  38650. "adcs r5, %[r]\n\t"
  38651. #else
  38652. "adc r5, %[r]\n\t"
  38653. #endif
  38654. #ifdef WOLFSSL_KEIL
  38655. "adcs r3, r3, %[r]\n\t"
  38656. #elif defined(__clang__)
  38657. "adcs r3, %[r]\n\t"
  38658. #else
  38659. "adc r3, %[r]\n\t"
  38660. #endif
  38661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38662. "lsrs r7, %[b], #16\n\t"
  38663. #else
  38664. "lsr r7, %[b], #16\n\t"
  38665. #endif
  38666. #ifdef WOLFSSL_KEIL
  38667. "muls r6, r7, r6\n\t"
  38668. #elif defined(__clang__)
  38669. "muls r6, r7\n\t"
  38670. #else
  38671. "mul r6, r7\n\t"
  38672. #endif
  38673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38674. "lsrs r7, r6, #16\n\t"
  38675. #else
  38676. "lsr r7, r6, #16\n\t"
  38677. #endif
  38678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38679. "lsls r6, r6, #16\n\t"
  38680. #else
  38681. "lsl r6, r6, #16\n\t"
  38682. #endif
  38683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38684. "adds r4, r4, r6\n\t"
  38685. #else
  38686. "add r4, r4, r6\n\t"
  38687. #endif
  38688. #ifdef WOLFSSL_KEIL
  38689. "adcs r5, r5, r7\n\t"
  38690. #elif defined(__clang__)
  38691. "adcs r5, r7\n\t"
  38692. #else
  38693. "adc r5, r7\n\t"
  38694. #endif
  38695. #ifdef WOLFSSL_KEIL
  38696. "adcs r3, r3, %[r]\n\t"
  38697. #elif defined(__clang__)
  38698. "adcs r3, %[r]\n\t"
  38699. #else
  38700. "adc r3, %[r]\n\t"
  38701. #endif
  38702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38703. "lsrs r6, %[a], #16\n\t"
  38704. #else
  38705. "lsr r6, %[a], #16\n\t"
  38706. #endif
  38707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38708. "lsrs r7, %[b], #16\n\t"
  38709. #else
  38710. "lsr r7, %[b], #16\n\t"
  38711. #endif
  38712. #ifdef WOLFSSL_KEIL
  38713. "muls r7, r6, r7\n\t"
  38714. #elif defined(__clang__)
  38715. "muls r7, r6\n\t"
  38716. #else
  38717. "mul r7, r6\n\t"
  38718. #endif
  38719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38720. "adds r5, r5, r7\n\t"
  38721. #else
  38722. "add r5, r5, r7\n\t"
  38723. #endif
  38724. #ifdef WOLFSSL_KEIL
  38725. "adcs r3, r3, %[r]\n\t"
  38726. #elif defined(__clang__)
  38727. "adcs r3, %[r]\n\t"
  38728. #else
  38729. "adc r3, %[r]\n\t"
  38730. #endif
  38731. "uxth r7, %[b]\n\t"
  38732. #ifdef WOLFSSL_KEIL
  38733. "muls r6, r7, r6\n\t"
  38734. #elif defined(__clang__)
  38735. "muls r6, r7\n\t"
  38736. #else
  38737. "mul r6, r7\n\t"
  38738. #endif
  38739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38740. "lsrs r7, r6, #16\n\t"
  38741. #else
  38742. "lsr r7, r6, #16\n\t"
  38743. #endif
  38744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38745. "lsls r6, r6, #16\n\t"
  38746. #else
  38747. "lsl r6, r6, #16\n\t"
  38748. #endif
  38749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38750. "adds r4, r4, r6\n\t"
  38751. #else
  38752. "add r4, r4, r6\n\t"
  38753. #endif
  38754. #ifdef WOLFSSL_KEIL
  38755. "adcs r5, r5, r7\n\t"
  38756. #elif defined(__clang__)
  38757. "adcs r5, r7\n\t"
  38758. #else
  38759. "adc r5, r7\n\t"
  38760. #endif
  38761. #ifdef WOLFSSL_KEIL
  38762. "adcs r3, r3, %[r]\n\t"
  38763. #elif defined(__clang__)
  38764. "adcs r3, %[r]\n\t"
  38765. #else
  38766. "adc r3, %[r]\n\t"
  38767. #endif
  38768. "# A[5] * B[5]\n\t"
  38769. "mov %[a], r9\n\t"
  38770. "mov %[b], r10\n\t"
  38771. "ldr %[a], [%[a], #20]\n\t"
  38772. "ldr %[b], [%[b], #20]\n\t"
  38773. "uxth r6, %[a]\n\t"
  38774. "uxth r7, %[b]\n\t"
  38775. #ifdef WOLFSSL_KEIL
  38776. "muls r7, r6, r7\n\t"
  38777. #elif defined(__clang__)
  38778. "muls r7, r6\n\t"
  38779. #else
  38780. "mul r7, r6\n\t"
  38781. #endif
  38782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38783. "adds r4, r4, r7\n\t"
  38784. #else
  38785. "add r4, r4, r7\n\t"
  38786. #endif
  38787. #ifdef WOLFSSL_KEIL
  38788. "adcs r5, r5, %[r]\n\t"
  38789. #elif defined(__clang__)
  38790. "adcs r5, %[r]\n\t"
  38791. #else
  38792. "adc r5, %[r]\n\t"
  38793. #endif
  38794. #ifdef WOLFSSL_KEIL
  38795. "adcs r3, r3, %[r]\n\t"
  38796. #elif defined(__clang__)
  38797. "adcs r3, %[r]\n\t"
  38798. #else
  38799. "adc r3, %[r]\n\t"
  38800. #endif
  38801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38802. "lsrs r7, %[b], #16\n\t"
  38803. #else
  38804. "lsr r7, %[b], #16\n\t"
  38805. #endif
  38806. #ifdef WOLFSSL_KEIL
  38807. "muls r6, r7, r6\n\t"
  38808. #elif defined(__clang__)
  38809. "muls r6, r7\n\t"
  38810. #else
  38811. "mul r6, r7\n\t"
  38812. #endif
  38813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38814. "lsrs r7, r6, #16\n\t"
  38815. #else
  38816. "lsr r7, r6, #16\n\t"
  38817. #endif
  38818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38819. "lsls r6, r6, #16\n\t"
  38820. #else
  38821. "lsl r6, r6, #16\n\t"
  38822. #endif
  38823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38824. "adds r4, r4, r6\n\t"
  38825. #else
  38826. "add r4, r4, r6\n\t"
  38827. #endif
  38828. #ifdef WOLFSSL_KEIL
  38829. "adcs r5, r5, r7\n\t"
  38830. #elif defined(__clang__)
  38831. "adcs r5, r7\n\t"
  38832. #else
  38833. "adc r5, r7\n\t"
  38834. #endif
  38835. #ifdef WOLFSSL_KEIL
  38836. "adcs r3, r3, %[r]\n\t"
  38837. #elif defined(__clang__)
  38838. "adcs r3, %[r]\n\t"
  38839. #else
  38840. "adc r3, %[r]\n\t"
  38841. #endif
  38842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38843. "lsrs r6, %[a], #16\n\t"
  38844. #else
  38845. "lsr r6, %[a], #16\n\t"
  38846. #endif
  38847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38848. "lsrs r7, %[b], #16\n\t"
  38849. #else
  38850. "lsr r7, %[b], #16\n\t"
  38851. #endif
  38852. #ifdef WOLFSSL_KEIL
  38853. "muls r7, r6, r7\n\t"
  38854. #elif defined(__clang__)
  38855. "muls r7, r6\n\t"
  38856. #else
  38857. "mul r7, r6\n\t"
  38858. #endif
  38859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38860. "adds r5, r5, r7\n\t"
  38861. #else
  38862. "add r5, r5, r7\n\t"
  38863. #endif
  38864. #ifdef WOLFSSL_KEIL
  38865. "adcs r3, r3, %[r]\n\t"
  38866. #elif defined(__clang__)
  38867. "adcs r3, %[r]\n\t"
  38868. #else
  38869. "adc r3, %[r]\n\t"
  38870. #endif
  38871. "uxth r7, %[b]\n\t"
  38872. #ifdef WOLFSSL_KEIL
  38873. "muls r6, r7, r6\n\t"
  38874. #elif defined(__clang__)
  38875. "muls r6, r7\n\t"
  38876. #else
  38877. "mul r6, r7\n\t"
  38878. #endif
  38879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38880. "lsrs r7, r6, #16\n\t"
  38881. #else
  38882. "lsr r7, r6, #16\n\t"
  38883. #endif
  38884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38885. "lsls r6, r6, #16\n\t"
  38886. #else
  38887. "lsl r6, r6, #16\n\t"
  38888. #endif
  38889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38890. "adds r4, r4, r6\n\t"
  38891. #else
  38892. "add r4, r4, r6\n\t"
  38893. #endif
  38894. #ifdef WOLFSSL_KEIL
  38895. "adcs r5, r5, r7\n\t"
  38896. #elif defined(__clang__)
  38897. "adcs r5, r7\n\t"
  38898. #else
  38899. "adc r5, r7\n\t"
  38900. #endif
  38901. #ifdef WOLFSSL_KEIL
  38902. "adcs r3, r3, %[r]\n\t"
  38903. #elif defined(__clang__)
  38904. "adcs r3, %[r]\n\t"
  38905. #else
  38906. "adc r3, %[r]\n\t"
  38907. #endif
  38908. "# A[4] * B[6]\n\t"
  38909. "mov %[a], r9\n\t"
  38910. "mov %[b], r10\n\t"
  38911. "ldr %[a], [%[a], #16]\n\t"
  38912. "ldr %[b], [%[b], #24]\n\t"
  38913. "uxth r6, %[a]\n\t"
  38914. "uxth r7, %[b]\n\t"
  38915. #ifdef WOLFSSL_KEIL
  38916. "muls r7, r6, r7\n\t"
  38917. #elif defined(__clang__)
  38918. "muls r7, r6\n\t"
  38919. #else
  38920. "mul r7, r6\n\t"
  38921. #endif
  38922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38923. "adds r4, r4, r7\n\t"
  38924. #else
  38925. "add r4, r4, r7\n\t"
  38926. #endif
  38927. #ifdef WOLFSSL_KEIL
  38928. "adcs r5, r5, %[r]\n\t"
  38929. #elif defined(__clang__)
  38930. "adcs r5, %[r]\n\t"
  38931. #else
  38932. "adc r5, %[r]\n\t"
  38933. #endif
  38934. #ifdef WOLFSSL_KEIL
  38935. "adcs r3, r3, %[r]\n\t"
  38936. #elif defined(__clang__)
  38937. "adcs r3, %[r]\n\t"
  38938. #else
  38939. "adc r3, %[r]\n\t"
  38940. #endif
  38941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38942. "lsrs r7, %[b], #16\n\t"
  38943. #else
  38944. "lsr r7, %[b], #16\n\t"
  38945. #endif
  38946. #ifdef WOLFSSL_KEIL
  38947. "muls r6, r7, r6\n\t"
  38948. #elif defined(__clang__)
  38949. "muls r6, r7\n\t"
  38950. #else
  38951. "mul r6, r7\n\t"
  38952. #endif
  38953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38954. "lsrs r7, r6, #16\n\t"
  38955. #else
  38956. "lsr r7, r6, #16\n\t"
  38957. #endif
  38958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38959. "lsls r6, r6, #16\n\t"
  38960. #else
  38961. "lsl r6, r6, #16\n\t"
  38962. #endif
  38963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38964. "adds r4, r4, r6\n\t"
  38965. #else
  38966. "add r4, r4, r6\n\t"
  38967. #endif
  38968. #ifdef WOLFSSL_KEIL
  38969. "adcs r5, r5, r7\n\t"
  38970. #elif defined(__clang__)
  38971. "adcs r5, r7\n\t"
  38972. #else
  38973. "adc r5, r7\n\t"
  38974. #endif
  38975. #ifdef WOLFSSL_KEIL
  38976. "adcs r3, r3, %[r]\n\t"
  38977. #elif defined(__clang__)
  38978. "adcs r3, %[r]\n\t"
  38979. #else
  38980. "adc r3, %[r]\n\t"
  38981. #endif
  38982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38983. "lsrs r6, %[a], #16\n\t"
  38984. #else
  38985. "lsr r6, %[a], #16\n\t"
  38986. #endif
  38987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38988. "lsrs r7, %[b], #16\n\t"
  38989. #else
  38990. "lsr r7, %[b], #16\n\t"
  38991. #endif
  38992. #ifdef WOLFSSL_KEIL
  38993. "muls r7, r6, r7\n\t"
  38994. #elif defined(__clang__)
  38995. "muls r7, r6\n\t"
  38996. #else
  38997. "mul r7, r6\n\t"
  38998. #endif
  38999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39000. "adds r5, r5, r7\n\t"
  39001. #else
  39002. "add r5, r5, r7\n\t"
  39003. #endif
  39004. #ifdef WOLFSSL_KEIL
  39005. "adcs r3, r3, %[r]\n\t"
  39006. #elif defined(__clang__)
  39007. "adcs r3, %[r]\n\t"
  39008. #else
  39009. "adc r3, %[r]\n\t"
  39010. #endif
  39011. "uxth r7, %[b]\n\t"
  39012. #ifdef WOLFSSL_KEIL
  39013. "muls r6, r7, r6\n\t"
  39014. #elif defined(__clang__)
  39015. "muls r6, r7\n\t"
  39016. #else
  39017. "mul r6, r7\n\t"
  39018. #endif
  39019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39020. "lsrs r7, r6, #16\n\t"
  39021. #else
  39022. "lsr r7, r6, #16\n\t"
  39023. #endif
  39024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39025. "lsls r6, r6, #16\n\t"
  39026. #else
  39027. "lsl r6, r6, #16\n\t"
  39028. #endif
  39029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39030. "adds r4, r4, r6\n\t"
  39031. #else
  39032. "add r4, r4, r6\n\t"
  39033. #endif
  39034. #ifdef WOLFSSL_KEIL
  39035. "adcs r5, r5, r7\n\t"
  39036. #elif defined(__clang__)
  39037. "adcs r5, r7\n\t"
  39038. #else
  39039. "adc r5, r7\n\t"
  39040. #endif
  39041. #ifdef WOLFSSL_KEIL
  39042. "adcs r3, r3, %[r]\n\t"
  39043. #elif defined(__clang__)
  39044. "adcs r3, %[r]\n\t"
  39045. #else
  39046. "adc r3, %[r]\n\t"
  39047. #endif
  39048. "# A[3] * B[7]\n\t"
  39049. "mov %[a], r9\n\t"
  39050. "mov %[b], r10\n\t"
  39051. "ldr %[a], [%[a], #12]\n\t"
  39052. "ldr %[b], [%[b], #28]\n\t"
  39053. "uxth r6, %[a]\n\t"
  39054. "uxth r7, %[b]\n\t"
  39055. #ifdef WOLFSSL_KEIL
  39056. "muls r7, r6, r7\n\t"
  39057. #elif defined(__clang__)
  39058. "muls r7, r6\n\t"
  39059. #else
  39060. "mul r7, r6\n\t"
  39061. #endif
  39062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39063. "adds r4, r4, r7\n\t"
  39064. #else
  39065. "add r4, r4, r7\n\t"
  39066. #endif
  39067. #ifdef WOLFSSL_KEIL
  39068. "adcs r5, r5, %[r]\n\t"
  39069. #elif defined(__clang__)
  39070. "adcs r5, %[r]\n\t"
  39071. #else
  39072. "adc r5, %[r]\n\t"
  39073. #endif
  39074. #ifdef WOLFSSL_KEIL
  39075. "adcs r3, r3, %[r]\n\t"
  39076. #elif defined(__clang__)
  39077. "adcs r3, %[r]\n\t"
  39078. #else
  39079. "adc r3, %[r]\n\t"
  39080. #endif
  39081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39082. "lsrs r7, %[b], #16\n\t"
  39083. #else
  39084. "lsr r7, %[b], #16\n\t"
  39085. #endif
  39086. #ifdef WOLFSSL_KEIL
  39087. "muls r6, r7, r6\n\t"
  39088. #elif defined(__clang__)
  39089. "muls r6, r7\n\t"
  39090. #else
  39091. "mul r6, r7\n\t"
  39092. #endif
  39093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39094. "lsrs r7, r6, #16\n\t"
  39095. #else
  39096. "lsr r7, r6, #16\n\t"
  39097. #endif
  39098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39099. "lsls r6, r6, #16\n\t"
  39100. #else
  39101. "lsl r6, r6, #16\n\t"
  39102. #endif
  39103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39104. "adds r4, r4, r6\n\t"
  39105. #else
  39106. "add r4, r4, r6\n\t"
  39107. #endif
  39108. #ifdef WOLFSSL_KEIL
  39109. "adcs r5, r5, r7\n\t"
  39110. #elif defined(__clang__)
  39111. "adcs r5, r7\n\t"
  39112. #else
  39113. "adc r5, r7\n\t"
  39114. #endif
  39115. #ifdef WOLFSSL_KEIL
  39116. "adcs r3, r3, %[r]\n\t"
  39117. #elif defined(__clang__)
  39118. "adcs r3, %[r]\n\t"
  39119. #else
  39120. "adc r3, %[r]\n\t"
  39121. #endif
  39122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39123. "lsrs r6, %[a], #16\n\t"
  39124. #else
  39125. "lsr r6, %[a], #16\n\t"
  39126. #endif
  39127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39128. "lsrs r7, %[b], #16\n\t"
  39129. #else
  39130. "lsr r7, %[b], #16\n\t"
  39131. #endif
  39132. #ifdef WOLFSSL_KEIL
  39133. "muls r7, r6, r7\n\t"
  39134. #elif defined(__clang__)
  39135. "muls r7, r6\n\t"
  39136. #else
  39137. "mul r7, r6\n\t"
  39138. #endif
  39139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39140. "adds r5, r5, r7\n\t"
  39141. #else
  39142. "add r5, r5, r7\n\t"
  39143. #endif
  39144. #ifdef WOLFSSL_KEIL
  39145. "adcs r3, r3, %[r]\n\t"
  39146. #elif defined(__clang__)
  39147. "adcs r3, %[r]\n\t"
  39148. #else
  39149. "adc r3, %[r]\n\t"
  39150. #endif
  39151. "uxth r7, %[b]\n\t"
  39152. #ifdef WOLFSSL_KEIL
  39153. "muls r6, r7, r6\n\t"
  39154. #elif defined(__clang__)
  39155. "muls r6, r7\n\t"
  39156. #else
  39157. "mul r6, r7\n\t"
  39158. #endif
  39159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39160. "lsrs r7, r6, #16\n\t"
  39161. #else
  39162. "lsr r7, r6, #16\n\t"
  39163. #endif
  39164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39165. "lsls r6, r6, #16\n\t"
  39166. #else
  39167. "lsl r6, r6, #16\n\t"
  39168. #endif
  39169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39170. "adds r4, r4, r6\n\t"
  39171. #else
  39172. "add r4, r4, r6\n\t"
  39173. #endif
  39174. #ifdef WOLFSSL_KEIL
  39175. "adcs r5, r5, r7\n\t"
  39176. #elif defined(__clang__)
  39177. "adcs r5, r7\n\t"
  39178. #else
  39179. "adc r5, r7\n\t"
  39180. #endif
  39181. #ifdef WOLFSSL_KEIL
  39182. "adcs r3, r3, %[r]\n\t"
  39183. #elif defined(__clang__)
  39184. "adcs r3, %[r]\n\t"
  39185. #else
  39186. "adc r3, %[r]\n\t"
  39187. #endif
  39188. "# A[2] * B[8]\n\t"
  39189. "mov %[a], r9\n\t"
  39190. "mov %[b], r10\n\t"
  39191. "ldr %[a], [%[a], #8]\n\t"
  39192. "ldr %[b], [%[b], #32]\n\t"
  39193. "uxth r6, %[a]\n\t"
  39194. "uxth r7, %[b]\n\t"
  39195. #ifdef WOLFSSL_KEIL
  39196. "muls r7, r6, r7\n\t"
  39197. #elif defined(__clang__)
  39198. "muls r7, r6\n\t"
  39199. #else
  39200. "mul r7, r6\n\t"
  39201. #endif
  39202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39203. "adds r4, r4, r7\n\t"
  39204. #else
  39205. "add r4, r4, r7\n\t"
  39206. #endif
  39207. #ifdef WOLFSSL_KEIL
  39208. "adcs r5, r5, %[r]\n\t"
  39209. #elif defined(__clang__)
  39210. "adcs r5, %[r]\n\t"
  39211. #else
  39212. "adc r5, %[r]\n\t"
  39213. #endif
  39214. #ifdef WOLFSSL_KEIL
  39215. "adcs r3, r3, %[r]\n\t"
  39216. #elif defined(__clang__)
  39217. "adcs r3, %[r]\n\t"
  39218. #else
  39219. "adc r3, %[r]\n\t"
  39220. #endif
  39221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39222. "lsrs r7, %[b], #16\n\t"
  39223. #else
  39224. "lsr r7, %[b], #16\n\t"
  39225. #endif
  39226. #ifdef WOLFSSL_KEIL
  39227. "muls r6, r7, r6\n\t"
  39228. #elif defined(__clang__)
  39229. "muls r6, r7\n\t"
  39230. #else
  39231. "mul r6, r7\n\t"
  39232. #endif
  39233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39234. "lsrs r7, r6, #16\n\t"
  39235. #else
  39236. "lsr r7, r6, #16\n\t"
  39237. #endif
  39238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39239. "lsls r6, r6, #16\n\t"
  39240. #else
  39241. "lsl r6, r6, #16\n\t"
  39242. #endif
  39243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39244. "adds r4, r4, r6\n\t"
  39245. #else
  39246. "add r4, r4, r6\n\t"
  39247. #endif
  39248. #ifdef WOLFSSL_KEIL
  39249. "adcs r5, r5, r7\n\t"
  39250. #elif defined(__clang__)
  39251. "adcs r5, r7\n\t"
  39252. #else
  39253. "adc r5, r7\n\t"
  39254. #endif
  39255. #ifdef WOLFSSL_KEIL
  39256. "adcs r3, r3, %[r]\n\t"
  39257. #elif defined(__clang__)
  39258. "adcs r3, %[r]\n\t"
  39259. #else
  39260. "adc r3, %[r]\n\t"
  39261. #endif
  39262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39263. "lsrs r6, %[a], #16\n\t"
  39264. #else
  39265. "lsr r6, %[a], #16\n\t"
  39266. #endif
  39267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39268. "lsrs r7, %[b], #16\n\t"
  39269. #else
  39270. "lsr r7, %[b], #16\n\t"
  39271. #endif
  39272. #ifdef WOLFSSL_KEIL
  39273. "muls r7, r6, r7\n\t"
  39274. #elif defined(__clang__)
  39275. "muls r7, r6\n\t"
  39276. #else
  39277. "mul r7, r6\n\t"
  39278. #endif
  39279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39280. "adds r5, r5, r7\n\t"
  39281. #else
  39282. "add r5, r5, r7\n\t"
  39283. #endif
  39284. #ifdef WOLFSSL_KEIL
  39285. "adcs r3, r3, %[r]\n\t"
  39286. #elif defined(__clang__)
  39287. "adcs r3, %[r]\n\t"
  39288. #else
  39289. "adc r3, %[r]\n\t"
  39290. #endif
  39291. "uxth r7, %[b]\n\t"
  39292. #ifdef WOLFSSL_KEIL
  39293. "muls r6, r7, r6\n\t"
  39294. #elif defined(__clang__)
  39295. "muls r6, r7\n\t"
  39296. #else
  39297. "mul r6, r7\n\t"
  39298. #endif
  39299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39300. "lsrs r7, r6, #16\n\t"
  39301. #else
  39302. "lsr r7, r6, #16\n\t"
  39303. #endif
  39304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39305. "lsls r6, r6, #16\n\t"
  39306. #else
  39307. "lsl r6, r6, #16\n\t"
  39308. #endif
  39309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39310. "adds r4, r4, r6\n\t"
  39311. #else
  39312. "add r4, r4, r6\n\t"
  39313. #endif
  39314. #ifdef WOLFSSL_KEIL
  39315. "adcs r5, r5, r7\n\t"
  39316. #elif defined(__clang__)
  39317. "adcs r5, r7\n\t"
  39318. #else
  39319. "adc r5, r7\n\t"
  39320. #endif
  39321. #ifdef WOLFSSL_KEIL
  39322. "adcs r3, r3, %[r]\n\t"
  39323. #elif defined(__clang__)
  39324. "adcs r3, %[r]\n\t"
  39325. #else
  39326. "adc r3, %[r]\n\t"
  39327. #endif
  39328. "# A[1] * B[9]\n\t"
  39329. "mov %[a], r9\n\t"
  39330. "mov %[b], r10\n\t"
  39331. "ldr %[a], [%[a], #4]\n\t"
  39332. "ldr %[b], [%[b], #36]\n\t"
  39333. "uxth r6, %[a]\n\t"
  39334. "uxth r7, %[b]\n\t"
  39335. #ifdef WOLFSSL_KEIL
  39336. "muls r7, r6, r7\n\t"
  39337. #elif defined(__clang__)
  39338. "muls r7, r6\n\t"
  39339. #else
  39340. "mul r7, r6\n\t"
  39341. #endif
  39342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39343. "adds r4, r4, r7\n\t"
  39344. #else
  39345. "add r4, r4, r7\n\t"
  39346. #endif
  39347. #ifdef WOLFSSL_KEIL
  39348. "adcs r5, r5, %[r]\n\t"
  39349. #elif defined(__clang__)
  39350. "adcs r5, %[r]\n\t"
  39351. #else
  39352. "adc r5, %[r]\n\t"
  39353. #endif
  39354. #ifdef WOLFSSL_KEIL
  39355. "adcs r3, r3, %[r]\n\t"
  39356. #elif defined(__clang__)
  39357. "adcs r3, %[r]\n\t"
  39358. #else
  39359. "adc r3, %[r]\n\t"
  39360. #endif
  39361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39362. "lsrs r7, %[b], #16\n\t"
  39363. #else
  39364. "lsr r7, %[b], #16\n\t"
  39365. #endif
  39366. #ifdef WOLFSSL_KEIL
  39367. "muls r6, r7, r6\n\t"
  39368. #elif defined(__clang__)
  39369. "muls r6, r7\n\t"
  39370. #else
  39371. "mul r6, r7\n\t"
  39372. #endif
  39373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39374. "lsrs r7, r6, #16\n\t"
  39375. #else
  39376. "lsr r7, r6, #16\n\t"
  39377. #endif
  39378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39379. "lsls r6, r6, #16\n\t"
  39380. #else
  39381. "lsl r6, r6, #16\n\t"
  39382. #endif
  39383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39384. "adds r4, r4, r6\n\t"
  39385. #else
  39386. "add r4, r4, r6\n\t"
  39387. #endif
  39388. #ifdef WOLFSSL_KEIL
  39389. "adcs r5, r5, r7\n\t"
  39390. #elif defined(__clang__)
  39391. "adcs r5, r7\n\t"
  39392. #else
  39393. "adc r5, r7\n\t"
  39394. #endif
  39395. #ifdef WOLFSSL_KEIL
  39396. "adcs r3, r3, %[r]\n\t"
  39397. #elif defined(__clang__)
  39398. "adcs r3, %[r]\n\t"
  39399. #else
  39400. "adc r3, %[r]\n\t"
  39401. #endif
  39402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39403. "lsrs r6, %[a], #16\n\t"
  39404. #else
  39405. "lsr r6, %[a], #16\n\t"
  39406. #endif
  39407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39408. "lsrs r7, %[b], #16\n\t"
  39409. #else
  39410. "lsr r7, %[b], #16\n\t"
  39411. #endif
  39412. #ifdef WOLFSSL_KEIL
  39413. "muls r7, r6, r7\n\t"
  39414. #elif defined(__clang__)
  39415. "muls r7, r6\n\t"
  39416. #else
  39417. "mul r7, r6\n\t"
  39418. #endif
  39419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39420. "adds r5, r5, r7\n\t"
  39421. #else
  39422. "add r5, r5, r7\n\t"
  39423. #endif
  39424. #ifdef WOLFSSL_KEIL
  39425. "adcs r3, r3, %[r]\n\t"
  39426. #elif defined(__clang__)
  39427. "adcs r3, %[r]\n\t"
  39428. #else
  39429. "adc r3, %[r]\n\t"
  39430. #endif
  39431. "uxth r7, %[b]\n\t"
  39432. #ifdef WOLFSSL_KEIL
  39433. "muls r6, r7, r6\n\t"
  39434. #elif defined(__clang__)
  39435. "muls r6, r7\n\t"
  39436. #else
  39437. "mul r6, r7\n\t"
  39438. #endif
  39439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39440. "lsrs r7, r6, #16\n\t"
  39441. #else
  39442. "lsr r7, r6, #16\n\t"
  39443. #endif
  39444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39445. "lsls r6, r6, #16\n\t"
  39446. #else
  39447. "lsl r6, r6, #16\n\t"
  39448. #endif
  39449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39450. "adds r4, r4, r6\n\t"
  39451. #else
  39452. "add r4, r4, r6\n\t"
  39453. #endif
  39454. #ifdef WOLFSSL_KEIL
  39455. "adcs r5, r5, r7\n\t"
  39456. #elif defined(__clang__)
  39457. "adcs r5, r7\n\t"
  39458. #else
  39459. "adc r5, r7\n\t"
  39460. #endif
  39461. #ifdef WOLFSSL_KEIL
  39462. "adcs r3, r3, %[r]\n\t"
  39463. #elif defined(__clang__)
  39464. "adcs r3, %[r]\n\t"
  39465. #else
  39466. "adc r3, %[r]\n\t"
  39467. #endif
  39468. "# A[0] * B[10]\n\t"
  39469. "mov %[a], r9\n\t"
  39470. "mov %[b], r10\n\t"
  39471. "ldr %[a], [%[a]]\n\t"
  39472. "ldr %[b], [%[b], #40]\n\t"
  39473. "uxth r6, %[a]\n\t"
  39474. "uxth r7, %[b]\n\t"
  39475. #ifdef WOLFSSL_KEIL
  39476. "muls r7, r6, r7\n\t"
  39477. #elif defined(__clang__)
  39478. "muls r7, r6\n\t"
  39479. #else
  39480. "mul r7, r6\n\t"
  39481. #endif
  39482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39483. "adds r4, r4, r7\n\t"
  39484. #else
  39485. "add r4, r4, r7\n\t"
  39486. #endif
  39487. #ifdef WOLFSSL_KEIL
  39488. "adcs r5, r5, %[r]\n\t"
  39489. #elif defined(__clang__)
  39490. "adcs r5, %[r]\n\t"
  39491. #else
  39492. "adc r5, %[r]\n\t"
  39493. #endif
  39494. #ifdef WOLFSSL_KEIL
  39495. "adcs r3, r3, %[r]\n\t"
  39496. #elif defined(__clang__)
  39497. "adcs r3, %[r]\n\t"
  39498. #else
  39499. "adc r3, %[r]\n\t"
  39500. #endif
  39501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39502. "lsrs r7, %[b], #16\n\t"
  39503. #else
  39504. "lsr r7, %[b], #16\n\t"
  39505. #endif
  39506. #ifdef WOLFSSL_KEIL
  39507. "muls r6, r7, r6\n\t"
  39508. #elif defined(__clang__)
  39509. "muls r6, r7\n\t"
  39510. #else
  39511. "mul r6, r7\n\t"
  39512. #endif
  39513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39514. "lsrs r7, r6, #16\n\t"
  39515. #else
  39516. "lsr r7, r6, #16\n\t"
  39517. #endif
  39518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39519. "lsls r6, r6, #16\n\t"
  39520. #else
  39521. "lsl r6, r6, #16\n\t"
  39522. #endif
  39523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39524. "adds r4, r4, r6\n\t"
  39525. #else
  39526. "add r4, r4, r6\n\t"
  39527. #endif
  39528. #ifdef WOLFSSL_KEIL
  39529. "adcs r5, r5, r7\n\t"
  39530. #elif defined(__clang__)
  39531. "adcs r5, r7\n\t"
  39532. #else
  39533. "adc r5, r7\n\t"
  39534. #endif
  39535. #ifdef WOLFSSL_KEIL
  39536. "adcs r3, r3, %[r]\n\t"
  39537. #elif defined(__clang__)
  39538. "adcs r3, %[r]\n\t"
  39539. #else
  39540. "adc r3, %[r]\n\t"
  39541. #endif
  39542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39543. "lsrs r6, %[a], #16\n\t"
  39544. #else
  39545. "lsr r6, %[a], #16\n\t"
  39546. #endif
  39547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39548. "lsrs r7, %[b], #16\n\t"
  39549. #else
  39550. "lsr r7, %[b], #16\n\t"
  39551. #endif
  39552. #ifdef WOLFSSL_KEIL
  39553. "muls r7, r6, r7\n\t"
  39554. #elif defined(__clang__)
  39555. "muls r7, r6\n\t"
  39556. #else
  39557. "mul r7, r6\n\t"
  39558. #endif
  39559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39560. "adds r5, r5, r7\n\t"
  39561. #else
  39562. "add r5, r5, r7\n\t"
  39563. #endif
  39564. #ifdef WOLFSSL_KEIL
  39565. "adcs r3, r3, %[r]\n\t"
  39566. #elif defined(__clang__)
  39567. "adcs r3, %[r]\n\t"
  39568. #else
  39569. "adc r3, %[r]\n\t"
  39570. #endif
  39571. "uxth r7, %[b]\n\t"
  39572. #ifdef WOLFSSL_KEIL
  39573. "muls r6, r7, r6\n\t"
  39574. #elif defined(__clang__)
  39575. "muls r6, r7\n\t"
  39576. #else
  39577. "mul r6, r7\n\t"
  39578. #endif
  39579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39580. "lsrs r7, r6, #16\n\t"
  39581. #else
  39582. "lsr r7, r6, #16\n\t"
  39583. #endif
  39584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39585. "lsls r6, r6, #16\n\t"
  39586. #else
  39587. "lsl r6, r6, #16\n\t"
  39588. #endif
  39589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39590. "adds r4, r4, r6\n\t"
  39591. #else
  39592. "add r4, r4, r6\n\t"
  39593. #endif
  39594. #ifdef WOLFSSL_KEIL
  39595. "adcs r5, r5, r7\n\t"
  39596. #elif defined(__clang__)
  39597. "adcs r5, r7\n\t"
  39598. #else
  39599. "adc r5, r7\n\t"
  39600. #endif
  39601. #ifdef WOLFSSL_KEIL
  39602. "adcs r3, r3, %[r]\n\t"
  39603. #elif defined(__clang__)
  39604. "adcs r3, %[r]\n\t"
  39605. #else
  39606. "adc r3, %[r]\n\t"
  39607. #endif
  39608. "str r4, [sp, #40]\n\t"
  39609. "# A[0] * B[11]\n\t"
  39610. "movs r4, #0\n\t"
  39611. "mov %[a], r9\n\t"
  39612. "mov %[b], r10\n\t"
  39613. "ldr %[a], [%[a]]\n\t"
  39614. "ldr %[b], [%[b], #44]\n\t"
  39615. "uxth r6, %[a]\n\t"
  39616. "uxth r7, %[b]\n\t"
  39617. #ifdef WOLFSSL_KEIL
  39618. "muls r7, r6, r7\n\t"
  39619. #elif defined(__clang__)
  39620. "muls r7, r6\n\t"
  39621. #else
  39622. "mul r7, r6\n\t"
  39623. #endif
  39624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39625. "adds r5, r5, r7\n\t"
  39626. #else
  39627. "add r5, r5, r7\n\t"
  39628. #endif
  39629. #ifdef WOLFSSL_KEIL
  39630. "adcs r3, r3, %[r]\n\t"
  39631. #elif defined(__clang__)
  39632. "adcs r3, %[r]\n\t"
  39633. #else
  39634. "adc r3, %[r]\n\t"
  39635. #endif
  39636. #ifdef WOLFSSL_KEIL
  39637. "adcs r4, r4, %[r]\n\t"
  39638. #elif defined(__clang__)
  39639. "adcs r4, %[r]\n\t"
  39640. #else
  39641. "adc r4, %[r]\n\t"
  39642. #endif
  39643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39644. "lsrs r7, %[b], #16\n\t"
  39645. #else
  39646. "lsr r7, %[b], #16\n\t"
  39647. #endif
  39648. #ifdef WOLFSSL_KEIL
  39649. "muls r6, r7, r6\n\t"
  39650. #elif defined(__clang__)
  39651. "muls r6, r7\n\t"
  39652. #else
  39653. "mul r6, r7\n\t"
  39654. #endif
  39655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39656. "lsrs r7, r6, #16\n\t"
  39657. #else
  39658. "lsr r7, r6, #16\n\t"
  39659. #endif
  39660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39661. "lsls r6, r6, #16\n\t"
  39662. #else
  39663. "lsl r6, r6, #16\n\t"
  39664. #endif
  39665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39666. "adds r5, r5, r6\n\t"
  39667. #else
  39668. "add r5, r5, r6\n\t"
  39669. #endif
  39670. #ifdef WOLFSSL_KEIL
  39671. "adcs r3, r3, r7\n\t"
  39672. #elif defined(__clang__)
  39673. "adcs r3, r7\n\t"
  39674. #else
  39675. "adc r3, r7\n\t"
  39676. #endif
  39677. #ifdef WOLFSSL_KEIL
  39678. "adcs r4, r4, %[r]\n\t"
  39679. #elif defined(__clang__)
  39680. "adcs r4, %[r]\n\t"
  39681. #else
  39682. "adc r4, %[r]\n\t"
  39683. #endif
  39684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39685. "lsrs r6, %[a], #16\n\t"
  39686. #else
  39687. "lsr r6, %[a], #16\n\t"
  39688. #endif
  39689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39690. "lsrs r7, %[b], #16\n\t"
  39691. #else
  39692. "lsr r7, %[b], #16\n\t"
  39693. #endif
  39694. #ifdef WOLFSSL_KEIL
  39695. "muls r7, r6, r7\n\t"
  39696. #elif defined(__clang__)
  39697. "muls r7, r6\n\t"
  39698. #else
  39699. "mul r7, r6\n\t"
  39700. #endif
  39701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39702. "adds r3, r3, r7\n\t"
  39703. #else
  39704. "add r3, r3, r7\n\t"
  39705. #endif
  39706. #ifdef WOLFSSL_KEIL
  39707. "adcs r4, r4, %[r]\n\t"
  39708. #elif defined(__clang__)
  39709. "adcs r4, %[r]\n\t"
  39710. #else
  39711. "adc r4, %[r]\n\t"
  39712. #endif
  39713. "uxth r7, %[b]\n\t"
  39714. #ifdef WOLFSSL_KEIL
  39715. "muls r6, r7, r6\n\t"
  39716. #elif defined(__clang__)
  39717. "muls r6, r7\n\t"
  39718. #else
  39719. "mul r6, r7\n\t"
  39720. #endif
  39721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39722. "lsrs r7, r6, #16\n\t"
  39723. #else
  39724. "lsr r7, r6, #16\n\t"
  39725. #endif
  39726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39727. "lsls r6, r6, #16\n\t"
  39728. #else
  39729. "lsl r6, r6, #16\n\t"
  39730. #endif
  39731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39732. "adds r5, r5, r6\n\t"
  39733. #else
  39734. "add r5, r5, r6\n\t"
  39735. #endif
  39736. #ifdef WOLFSSL_KEIL
  39737. "adcs r3, r3, r7\n\t"
  39738. #elif defined(__clang__)
  39739. "adcs r3, r7\n\t"
  39740. #else
  39741. "adc r3, r7\n\t"
  39742. #endif
  39743. #ifdef WOLFSSL_KEIL
  39744. "adcs r4, r4, %[r]\n\t"
  39745. #elif defined(__clang__)
  39746. "adcs r4, %[r]\n\t"
  39747. #else
  39748. "adc r4, %[r]\n\t"
  39749. #endif
  39750. "# A[1] * B[10]\n\t"
  39751. "mov %[a], r9\n\t"
  39752. "mov %[b], r10\n\t"
  39753. "ldr %[a], [%[a], #4]\n\t"
  39754. "ldr %[b], [%[b], #40]\n\t"
  39755. "uxth r6, %[a]\n\t"
  39756. "uxth r7, %[b]\n\t"
  39757. #ifdef WOLFSSL_KEIL
  39758. "muls r7, r6, r7\n\t"
  39759. #elif defined(__clang__)
  39760. "muls r7, r6\n\t"
  39761. #else
  39762. "mul r7, r6\n\t"
  39763. #endif
  39764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39765. "adds r5, r5, r7\n\t"
  39766. #else
  39767. "add r5, r5, r7\n\t"
  39768. #endif
  39769. #ifdef WOLFSSL_KEIL
  39770. "adcs r3, r3, %[r]\n\t"
  39771. #elif defined(__clang__)
  39772. "adcs r3, %[r]\n\t"
  39773. #else
  39774. "adc r3, %[r]\n\t"
  39775. #endif
  39776. #ifdef WOLFSSL_KEIL
  39777. "adcs r4, r4, %[r]\n\t"
  39778. #elif defined(__clang__)
  39779. "adcs r4, %[r]\n\t"
  39780. #else
  39781. "adc r4, %[r]\n\t"
  39782. #endif
  39783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39784. "lsrs r7, %[b], #16\n\t"
  39785. #else
  39786. "lsr r7, %[b], #16\n\t"
  39787. #endif
  39788. #ifdef WOLFSSL_KEIL
  39789. "muls r6, r7, r6\n\t"
  39790. #elif defined(__clang__)
  39791. "muls r6, r7\n\t"
  39792. #else
  39793. "mul r6, r7\n\t"
  39794. #endif
  39795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39796. "lsrs r7, r6, #16\n\t"
  39797. #else
  39798. "lsr r7, r6, #16\n\t"
  39799. #endif
  39800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39801. "lsls r6, r6, #16\n\t"
  39802. #else
  39803. "lsl r6, r6, #16\n\t"
  39804. #endif
  39805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39806. "adds r5, r5, r6\n\t"
  39807. #else
  39808. "add r5, r5, r6\n\t"
  39809. #endif
  39810. #ifdef WOLFSSL_KEIL
  39811. "adcs r3, r3, r7\n\t"
  39812. #elif defined(__clang__)
  39813. "adcs r3, r7\n\t"
  39814. #else
  39815. "adc r3, r7\n\t"
  39816. #endif
  39817. #ifdef WOLFSSL_KEIL
  39818. "adcs r4, r4, %[r]\n\t"
  39819. #elif defined(__clang__)
  39820. "adcs r4, %[r]\n\t"
  39821. #else
  39822. "adc r4, %[r]\n\t"
  39823. #endif
  39824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39825. "lsrs r6, %[a], #16\n\t"
  39826. #else
  39827. "lsr r6, %[a], #16\n\t"
  39828. #endif
  39829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39830. "lsrs r7, %[b], #16\n\t"
  39831. #else
  39832. "lsr r7, %[b], #16\n\t"
  39833. #endif
  39834. #ifdef WOLFSSL_KEIL
  39835. "muls r7, r6, r7\n\t"
  39836. #elif defined(__clang__)
  39837. "muls r7, r6\n\t"
  39838. #else
  39839. "mul r7, r6\n\t"
  39840. #endif
  39841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39842. "adds r3, r3, r7\n\t"
  39843. #else
  39844. "add r3, r3, r7\n\t"
  39845. #endif
  39846. #ifdef WOLFSSL_KEIL
  39847. "adcs r4, r4, %[r]\n\t"
  39848. #elif defined(__clang__)
  39849. "adcs r4, %[r]\n\t"
  39850. #else
  39851. "adc r4, %[r]\n\t"
  39852. #endif
  39853. "uxth r7, %[b]\n\t"
  39854. #ifdef WOLFSSL_KEIL
  39855. "muls r6, r7, r6\n\t"
  39856. #elif defined(__clang__)
  39857. "muls r6, r7\n\t"
  39858. #else
  39859. "mul r6, r7\n\t"
  39860. #endif
  39861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39862. "lsrs r7, r6, #16\n\t"
  39863. #else
  39864. "lsr r7, r6, #16\n\t"
  39865. #endif
  39866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39867. "lsls r6, r6, #16\n\t"
  39868. #else
  39869. "lsl r6, r6, #16\n\t"
  39870. #endif
  39871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39872. "adds r5, r5, r6\n\t"
  39873. #else
  39874. "add r5, r5, r6\n\t"
  39875. #endif
  39876. #ifdef WOLFSSL_KEIL
  39877. "adcs r3, r3, r7\n\t"
  39878. #elif defined(__clang__)
  39879. "adcs r3, r7\n\t"
  39880. #else
  39881. "adc r3, r7\n\t"
  39882. #endif
  39883. #ifdef WOLFSSL_KEIL
  39884. "adcs r4, r4, %[r]\n\t"
  39885. #elif defined(__clang__)
  39886. "adcs r4, %[r]\n\t"
  39887. #else
  39888. "adc r4, %[r]\n\t"
  39889. #endif
  39890. "# A[2] * B[9]\n\t"
  39891. "mov %[a], r9\n\t"
  39892. "mov %[b], r10\n\t"
  39893. "ldr %[a], [%[a], #8]\n\t"
  39894. "ldr %[b], [%[b], #36]\n\t"
  39895. "uxth r6, %[a]\n\t"
  39896. "uxth r7, %[b]\n\t"
  39897. #ifdef WOLFSSL_KEIL
  39898. "muls r7, r6, r7\n\t"
  39899. #elif defined(__clang__)
  39900. "muls r7, r6\n\t"
  39901. #else
  39902. "mul r7, r6\n\t"
  39903. #endif
  39904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39905. "adds r5, r5, r7\n\t"
  39906. #else
  39907. "add r5, r5, r7\n\t"
  39908. #endif
  39909. #ifdef WOLFSSL_KEIL
  39910. "adcs r3, r3, %[r]\n\t"
  39911. #elif defined(__clang__)
  39912. "adcs r3, %[r]\n\t"
  39913. #else
  39914. "adc r3, %[r]\n\t"
  39915. #endif
  39916. #ifdef WOLFSSL_KEIL
  39917. "adcs r4, r4, %[r]\n\t"
  39918. #elif defined(__clang__)
  39919. "adcs r4, %[r]\n\t"
  39920. #else
  39921. "adc r4, %[r]\n\t"
  39922. #endif
  39923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39924. "lsrs r7, %[b], #16\n\t"
  39925. #else
  39926. "lsr r7, %[b], #16\n\t"
  39927. #endif
  39928. #ifdef WOLFSSL_KEIL
  39929. "muls r6, r7, r6\n\t"
  39930. #elif defined(__clang__)
  39931. "muls r6, r7\n\t"
  39932. #else
  39933. "mul r6, r7\n\t"
  39934. #endif
  39935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39936. "lsrs r7, r6, #16\n\t"
  39937. #else
  39938. "lsr r7, r6, #16\n\t"
  39939. #endif
  39940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39941. "lsls r6, r6, #16\n\t"
  39942. #else
  39943. "lsl r6, r6, #16\n\t"
  39944. #endif
  39945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39946. "adds r5, r5, r6\n\t"
  39947. #else
  39948. "add r5, r5, r6\n\t"
  39949. #endif
  39950. #ifdef WOLFSSL_KEIL
  39951. "adcs r3, r3, r7\n\t"
  39952. #elif defined(__clang__)
  39953. "adcs r3, r7\n\t"
  39954. #else
  39955. "adc r3, r7\n\t"
  39956. #endif
  39957. #ifdef WOLFSSL_KEIL
  39958. "adcs r4, r4, %[r]\n\t"
  39959. #elif defined(__clang__)
  39960. "adcs r4, %[r]\n\t"
  39961. #else
  39962. "adc r4, %[r]\n\t"
  39963. #endif
  39964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39965. "lsrs r6, %[a], #16\n\t"
  39966. #else
  39967. "lsr r6, %[a], #16\n\t"
  39968. #endif
  39969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39970. "lsrs r7, %[b], #16\n\t"
  39971. #else
  39972. "lsr r7, %[b], #16\n\t"
  39973. #endif
  39974. #ifdef WOLFSSL_KEIL
  39975. "muls r7, r6, r7\n\t"
  39976. #elif defined(__clang__)
  39977. "muls r7, r6\n\t"
  39978. #else
  39979. "mul r7, r6\n\t"
  39980. #endif
  39981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39982. "adds r3, r3, r7\n\t"
  39983. #else
  39984. "add r3, r3, r7\n\t"
  39985. #endif
  39986. #ifdef WOLFSSL_KEIL
  39987. "adcs r4, r4, %[r]\n\t"
  39988. #elif defined(__clang__)
  39989. "adcs r4, %[r]\n\t"
  39990. #else
  39991. "adc r4, %[r]\n\t"
  39992. #endif
  39993. "uxth r7, %[b]\n\t"
  39994. #ifdef WOLFSSL_KEIL
  39995. "muls r6, r7, r6\n\t"
  39996. #elif defined(__clang__)
  39997. "muls r6, r7\n\t"
  39998. #else
  39999. "mul r6, r7\n\t"
  40000. #endif
  40001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40002. "lsrs r7, r6, #16\n\t"
  40003. #else
  40004. "lsr r7, r6, #16\n\t"
  40005. #endif
  40006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40007. "lsls r6, r6, #16\n\t"
  40008. #else
  40009. "lsl r6, r6, #16\n\t"
  40010. #endif
  40011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40012. "adds r5, r5, r6\n\t"
  40013. #else
  40014. "add r5, r5, r6\n\t"
  40015. #endif
  40016. #ifdef WOLFSSL_KEIL
  40017. "adcs r3, r3, r7\n\t"
  40018. #elif defined(__clang__)
  40019. "adcs r3, r7\n\t"
  40020. #else
  40021. "adc r3, r7\n\t"
  40022. #endif
  40023. #ifdef WOLFSSL_KEIL
  40024. "adcs r4, r4, %[r]\n\t"
  40025. #elif defined(__clang__)
  40026. "adcs r4, %[r]\n\t"
  40027. #else
  40028. "adc r4, %[r]\n\t"
  40029. #endif
  40030. "# A[3] * B[8]\n\t"
  40031. "mov %[a], r9\n\t"
  40032. "mov %[b], r10\n\t"
  40033. "ldr %[a], [%[a], #12]\n\t"
  40034. "ldr %[b], [%[b], #32]\n\t"
  40035. "uxth r6, %[a]\n\t"
  40036. "uxth r7, %[b]\n\t"
  40037. #ifdef WOLFSSL_KEIL
  40038. "muls r7, r6, r7\n\t"
  40039. #elif defined(__clang__)
  40040. "muls r7, r6\n\t"
  40041. #else
  40042. "mul r7, r6\n\t"
  40043. #endif
  40044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40045. "adds r5, r5, r7\n\t"
  40046. #else
  40047. "add r5, r5, r7\n\t"
  40048. #endif
  40049. #ifdef WOLFSSL_KEIL
  40050. "adcs r3, r3, %[r]\n\t"
  40051. #elif defined(__clang__)
  40052. "adcs r3, %[r]\n\t"
  40053. #else
  40054. "adc r3, %[r]\n\t"
  40055. #endif
  40056. #ifdef WOLFSSL_KEIL
  40057. "adcs r4, r4, %[r]\n\t"
  40058. #elif defined(__clang__)
  40059. "adcs r4, %[r]\n\t"
  40060. #else
  40061. "adc r4, %[r]\n\t"
  40062. #endif
  40063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40064. "lsrs r7, %[b], #16\n\t"
  40065. #else
  40066. "lsr r7, %[b], #16\n\t"
  40067. #endif
  40068. #ifdef WOLFSSL_KEIL
  40069. "muls r6, r7, r6\n\t"
  40070. #elif defined(__clang__)
  40071. "muls r6, r7\n\t"
  40072. #else
  40073. "mul r6, r7\n\t"
  40074. #endif
  40075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40076. "lsrs r7, r6, #16\n\t"
  40077. #else
  40078. "lsr r7, r6, #16\n\t"
  40079. #endif
  40080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40081. "lsls r6, r6, #16\n\t"
  40082. #else
  40083. "lsl r6, r6, #16\n\t"
  40084. #endif
  40085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40086. "adds r5, r5, r6\n\t"
  40087. #else
  40088. "add r5, r5, r6\n\t"
  40089. #endif
  40090. #ifdef WOLFSSL_KEIL
  40091. "adcs r3, r3, r7\n\t"
  40092. #elif defined(__clang__)
  40093. "adcs r3, r7\n\t"
  40094. #else
  40095. "adc r3, r7\n\t"
  40096. #endif
  40097. #ifdef WOLFSSL_KEIL
  40098. "adcs r4, r4, %[r]\n\t"
  40099. #elif defined(__clang__)
  40100. "adcs r4, %[r]\n\t"
  40101. #else
  40102. "adc r4, %[r]\n\t"
  40103. #endif
  40104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40105. "lsrs r6, %[a], #16\n\t"
  40106. #else
  40107. "lsr r6, %[a], #16\n\t"
  40108. #endif
  40109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40110. "lsrs r7, %[b], #16\n\t"
  40111. #else
  40112. "lsr r7, %[b], #16\n\t"
  40113. #endif
  40114. #ifdef WOLFSSL_KEIL
  40115. "muls r7, r6, r7\n\t"
  40116. #elif defined(__clang__)
  40117. "muls r7, r6\n\t"
  40118. #else
  40119. "mul r7, r6\n\t"
  40120. #endif
  40121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40122. "adds r3, r3, r7\n\t"
  40123. #else
  40124. "add r3, r3, r7\n\t"
  40125. #endif
  40126. #ifdef WOLFSSL_KEIL
  40127. "adcs r4, r4, %[r]\n\t"
  40128. #elif defined(__clang__)
  40129. "adcs r4, %[r]\n\t"
  40130. #else
  40131. "adc r4, %[r]\n\t"
  40132. #endif
  40133. "uxth r7, %[b]\n\t"
  40134. #ifdef WOLFSSL_KEIL
  40135. "muls r6, r7, r6\n\t"
  40136. #elif defined(__clang__)
  40137. "muls r6, r7\n\t"
  40138. #else
  40139. "mul r6, r7\n\t"
  40140. #endif
  40141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40142. "lsrs r7, r6, #16\n\t"
  40143. #else
  40144. "lsr r7, r6, #16\n\t"
  40145. #endif
  40146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40147. "lsls r6, r6, #16\n\t"
  40148. #else
  40149. "lsl r6, r6, #16\n\t"
  40150. #endif
  40151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40152. "adds r5, r5, r6\n\t"
  40153. #else
  40154. "add r5, r5, r6\n\t"
  40155. #endif
  40156. #ifdef WOLFSSL_KEIL
  40157. "adcs r3, r3, r7\n\t"
  40158. #elif defined(__clang__)
  40159. "adcs r3, r7\n\t"
  40160. #else
  40161. "adc r3, r7\n\t"
  40162. #endif
  40163. #ifdef WOLFSSL_KEIL
  40164. "adcs r4, r4, %[r]\n\t"
  40165. #elif defined(__clang__)
  40166. "adcs r4, %[r]\n\t"
  40167. #else
  40168. "adc r4, %[r]\n\t"
  40169. #endif
  40170. "# A[4] * B[7]\n\t"
  40171. "mov %[a], r9\n\t"
  40172. "mov %[b], r10\n\t"
  40173. "ldr %[a], [%[a], #16]\n\t"
  40174. "ldr %[b], [%[b], #28]\n\t"
  40175. "uxth r6, %[a]\n\t"
  40176. "uxth r7, %[b]\n\t"
  40177. #ifdef WOLFSSL_KEIL
  40178. "muls r7, r6, r7\n\t"
  40179. #elif defined(__clang__)
  40180. "muls r7, r6\n\t"
  40181. #else
  40182. "mul r7, r6\n\t"
  40183. #endif
  40184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40185. "adds r5, r5, r7\n\t"
  40186. #else
  40187. "add r5, r5, r7\n\t"
  40188. #endif
  40189. #ifdef WOLFSSL_KEIL
  40190. "adcs r3, r3, %[r]\n\t"
  40191. #elif defined(__clang__)
  40192. "adcs r3, %[r]\n\t"
  40193. #else
  40194. "adc r3, %[r]\n\t"
  40195. #endif
  40196. #ifdef WOLFSSL_KEIL
  40197. "adcs r4, r4, %[r]\n\t"
  40198. #elif defined(__clang__)
  40199. "adcs r4, %[r]\n\t"
  40200. #else
  40201. "adc r4, %[r]\n\t"
  40202. #endif
  40203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40204. "lsrs r7, %[b], #16\n\t"
  40205. #else
  40206. "lsr r7, %[b], #16\n\t"
  40207. #endif
  40208. #ifdef WOLFSSL_KEIL
  40209. "muls r6, r7, r6\n\t"
  40210. #elif defined(__clang__)
  40211. "muls r6, r7\n\t"
  40212. #else
  40213. "mul r6, r7\n\t"
  40214. #endif
  40215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40216. "lsrs r7, r6, #16\n\t"
  40217. #else
  40218. "lsr r7, r6, #16\n\t"
  40219. #endif
  40220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40221. "lsls r6, r6, #16\n\t"
  40222. #else
  40223. "lsl r6, r6, #16\n\t"
  40224. #endif
  40225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40226. "adds r5, r5, r6\n\t"
  40227. #else
  40228. "add r5, r5, r6\n\t"
  40229. #endif
  40230. #ifdef WOLFSSL_KEIL
  40231. "adcs r3, r3, r7\n\t"
  40232. #elif defined(__clang__)
  40233. "adcs r3, r7\n\t"
  40234. #else
  40235. "adc r3, r7\n\t"
  40236. #endif
  40237. #ifdef WOLFSSL_KEIL
  40238. "adcs r4, r4, %[r]\n\t"
  40239. #elif defined(__clang__)
  40240. "adcs r4, %[r]\n\t"
  40241. #else
  40242. "adc r4, %[r]\n\t"
  40243. #endif
  40244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40245. "lsrs r6, %[a], #16\n\t"
  40246. #else
  40247. "lsr r6, %[a], #16\n\t"
  40248. #endif
  40249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40250. "lsrs r7, %[b], #16\n\t"
  40251. #else
  40252. "lsr r7, %[b], #16\n\t"
  40253. #endif
  40254. #ifdef WOLFSSL_KEIL
  40255. "muls r7, r6, r7\n\t"
  40256. #elif defined(__clang__)
  40257. "muls r7, r6\n\t"
  40258. #else
  40259. "mul r7, r6\n\t"
  40260. #endif
  40261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40262. "adds r3, r3, r7\n\t"
  40263. #else
  40264. "add r3, r3, r7\n\t"
  40265. #endif
  40266. #ifdef WOLFSSL_KEIL
  40267. "adcs r4, r4, %[r]\n\t"
  40268. #elif defined(__clang__)
  40269. "adcs r4, %[r]\n\t"
  40270. #else
  40271. "adc r4, %[r]\n\t"
  40272. #endif
  40273. "uxth r7, %[b]\n\t"
  40274. #ifdef WOLFSSL_KEIL
  40275. "muls r6, r7, r6\n\t"
  40276. #elif defined(__clang__)
  40277. "muls r6, r7\n\t"
  40278. #else
  40279. "mul r6, r7\n\t"
  40280. #endif
  40281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40282. "lsrs r7, r6, #16\n\t"
  40283. #else
  40284. "lsr r7, r6, #16\n\t"
  40285. #endif
  40286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40287. "lsls r6, r6, #16\n\t"
  40288. #else
  40289. "lsl r6, r6, #16\n\t"
  40290. #endif
  40291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40292. "adds r5, r5, r6\n\t"
  40293. #else
  40294. "add r5, r5, r6\n\t"
  40295. #endif
  40296. #ifdef WOLFSSL_KEIL
  40297. "adcs r3, r3, r7\n\t"
  40298. #elif defined(__clang__)
  40299. "adcs r3, r7\n\t"
  40300. #else
  40301. "adc r3, r7\n\t"
  40302. #endif
  40303. #ifdef WOLFSSL_KEIL
  40304. "adcs r4, r4, %[r]\n\t"
  40305. #elif defined(__clang__)
  40306. "adcs r4, %[r]\n\t"
  40307. #else
  40308. "adc r4, %[r]\n\t"
  40309. #endif
  40310. "# A[5] * B[6]\n\t"
  40311. "mov %[a], r9\n\t"
  40312. "mov %[b], r10\n\t"
  40313. "ldr %[a], [%[a], #20]\n\t"
  40314. "ldr %[b], [%[b], #24]\n\t"
  40315. "uxth r6, %[a]\n\t"
  40316. "uxth r7, %[b]\n\t"
  40317. #ifdef WOLFSSL_KEIL
  40318. "muls r7, r6, r7\n\t"
  40319. #elif defined(__clang__)
  40320. "muls r7, r6\n\t"
  40321. #else
  40322. "mul r7, r6\n\t"
  40323. #endif
  40324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40325. "adds r5, r5, r7\n\t"
  40326. #else
  40327. "add r5, r5, r7\n\t"
  40328. #endif
  40329. #ifdef WOLFSSL_KEIL
  40330. "adcs r3, r3, %[r]\n\t"
  40331. #elif defined(__clang__)
  40332. "adcs r3, %[r]\n\t"
  40333. #else
  40334. "adc r3, %[r]\n\t"
  40335. #endif
  40336. #ifdef WOLFSSL_KEIL
  40337. "adcs r4, r4, %[r]\n\t"
  40338. #elif defined(__clang__)
  40339. "adcs r4, %[r]\n\t"
  40340. #else
  40341. "adc r4, %[r]\n\t"
  40342. #endif
  40343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40344. "lsrs r7, %[b], #16\n\t"
  40345. #else
  40346. "lsr r7, %[b], #16\n\t"
  40347. #endif
  40348. #ifdef WOLFSSL_KEIL
  40349. "muls r6, r7, r6\n\t"
  40350. #elif defined(__clang__)
  40351. "muls r6, r7\n\t"
  40352. #else
  40353. "mul r6, r7\n\t"
  40354. #endif
  40355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40356. "lsrs r7, r6, #16\n\t"
  40357. #else
  40358. "lsr r7, r6, #16\n\t"
  40359. #endif
  40360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40361. "lsls r6, r6, #16\n\t"
  40362. #else
  40363. "lsl r6, r6, #16\n\t"
  40364. #endif
  40365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40366. "adds r5, r5, r6\n\t"
  40367. #else
  40368. "add r5, r5, r6\n\t"
  40369. #endif
  40370. #ifdef WOLFSSL_KEIL
  40371. "adcs r3, r3, r7\n\t"
  40372. #elif defined(__clang__)
  40373. "adcs r3, r7\n\t"
  40374. #else
  40375. "adc r3, r7\n\t"
  40376. #endif
  40377. #ifdef WOLFSSL_KEIL
  40378. "adcs r4, r4, %[r]\n\t"
  40379. #elif defined(__clang__)
  40380. "adcs r4, %[r]\n\t"
  40381. #else
  40382. "adc r4, %[r]\n\t"
  40383. #endif
  40384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40385. "lsrs r6, %[a], #16\n\t"
  40386. #else
  40387. "lsr r6, %[a], #16\n\t"
  40388. #endif
  40389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40390. "lsrs r7, %[b], #16\n\t"
  40391. #else
  40392. "lsr r7, %[b], #16\n\t"
  40393. #endif
  40394. #ifdef WOLFSSL_KEIL
  40395. "muls r7, r6, r7\n\t"
  40396. #elif defined(__clang__)
  40397. "muls r7, r6\n\t"
  40398. #else
  40399. "mul r7, r6\n\t"
  40400. #endif
  40401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40402. "adds r3, r3, r7\n\t"
  40403. #else
  40404. "add r3, r3, r7\n\t"
  40405. #endif
  40406. #ifdef WOLFSSL_KEIL
  40407. "adcs r4, r4, %[r]\n\t"
  40408. #elif defined(__clang__)
  40409. "adcs r4, %[r]\n\t"
  40410. #else
  40411. "adc r4, %[r]\n\t"
  40412. #endif
  40413. "uxth r7, %[b]\n\t"
  40414. #ifdef WOLFSSL_KEIL
  40415. "muls r6, r7, r6\n\t"
  40416. #elif defined(__clang__)
  40417. "muls r6, r7\n\t"
  40418. #else
  40419. "mul r6, r7\n\t"
  40420. #endif
  40421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40422. "lsrs r7, r6, #16\n\t"
  40423. #else
  40424. "lsr r7, r6, #16\n\t"
  40425. #endif
  40426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40427. "lsls r6, r6, #16\n\t"
  40428. #else
  40429. "lsl r6, r6, #16\n\t"
  40430. #endif
  40431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40432. "adds r5, r5, r6\n\t"
  40433. #else
  40434. "add r5, r5, r6\n\t"
  40435. #endif
  40436. #ifdef WOLFSSL_KEIL
  40437. "adcs r3, r3, r7\n\t"
  40438. #elif defined(__clang__)
  40439. "adcs r3, r7\n\t"
  40440. #else
  40441. "adc r3, r7\n\t"
  40442. #endif
  40443. #ifdef WOLFSSL_KEIL
  40444. "adcs r4, r4, %[r]\n\t"
  40445. #elif defined(__clang__)
  40446. "adcs r4, %[r]\n\t"
  40447. #else
  40448. "adc r4, %[r]\n\t"
  40449. #endif
  40450. "# A[6] * B[5]\n\t"
  40451. "mov %[a], r9\n\t"
  40452. "mov %[b], r10\n\t"
  40453. "ldr %[a], [%[a], #24]\n\t"
  40454. "ldr %[b], [%[b], #20]\n\t"
  40455. "uxth r6, %[a]\n\t"
  40456. "uxth r7, %[b]\n\t"
  40457. #ifdef WOLFSSL_KEIL
  40458. "muls r7, r6, r7\n\t"
  40459. #elif defined(__clang__)
  40460. "muls r7, r6\n\t"
  40461. #else
  40462. "mul r7, r6\n\t"
  40463. #endif
  40464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40465. "adds r5, r5, r7\n\t"
  40466. #else
  40467. "add r5, r5, r7\n\t"
  40468. #endif
  40469. #ifdef WOLFSSL_KEIL
  40470. "adcs r3, r3, %[r]\n\t"
  40471. #elif defined(__clang__)
  40472. "adcs r3, %[r]\n\t"
  40473. #else
  40474. "adc r3, %[r]\n\t"
  40475. #endif
  40476. #ifdef WOLFSSL_KEIL
  40477. "adcs r4, r4, %[r]\n\t"
  40478. #elif defined(__clang__)
  40479. "adcs r4, %[r]\n\t"
  40480. #else
  40481. "adc r4, %[r]\n\t"
  40482. #endif
  40483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40484. "lsrs r7, %[b], #16\n\t"
  40485. #else
  40486. "lsr r7, %[b], #16\n\t"
  40487. #endif
  40488. #ifdef WOLFSSL_KEIL
  40489. "muls r6, r7, r6\n\t"
  40490. #elif defined(__clang__)
  40491. "muls r6, r7\n\t"
  40492. #else
  40493. "mul r6, r7\n\t"
  40494. #endif
  40495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40496. "lsrs r7, r6, #16\n\t"
  40497. #else
  40498. "lsr r7, r6, #16\n\t"
  40499. #endif
  40500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40501. "lsls r6, r6, #16\n\t"
  40502. #else
  40503. "lsl r6, r6, #16\n\t"
  40504. #endif
  40505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40506. "adds r5, r5, r6\n\t"
  40507. #else
  40508. "add r5, r5, r6\n\t"
  40509. #endif
  40510. #ifdef WOLFSSL_KEIL
  40511. "adcs r3, r3, r7\n\t"
  40512. #elif defined(__clang__)
  40513. "adcs r3, r7\n\t"
  40514. #else
  40515. "adc r3, r7\n\t"
  40516. #endif
  40517. #ifdef WOLFSSL_KEIL
  40518. "adcs r4, r4, %[r]\n\t"
  40519. #elif defined(__clang__)
  40520. "adcs r4, %[r]\n\t"
  40521. #else
  40522. "adc r4, %[r]\n\t"
  40523. #endif
  40524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40525. "lsrs r6, %[a], #16\n\t"
  40526. #else
  40527. "lsr r6, %[a], #16\n\t"
  40528. #endif
  40529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40530. "lsrs r7, %[b], #16\n\t"
  40531. #else
  40532. "lsr r7, %[b], #16\n\t"
  40533. #endif
  40534. #ifdef WOLFSSL_KEIL
  40535. "muls r7, r6, r7\n\t"
  40536. #elif defined(__clang__)
  40537. "muls r7, r6\n\t"
  40538. #else
  40539. "mul r7, r6\n\t"
  40540. #endif
  40541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40542. "adds r3, r3, r7\n\t"
  40543. #else
  40544. "add r3, r3, r7\n\t"
  40545. #endif
  40546. #ifdef WOLFSSL_KEIL
  40547. "adcs r4, r4, %[r]\n\t"
  40548. #elif defined(__clang__)
  40549. "adcs r4, %[r]\n\t"
  40550. #else
  40551. "adc r4, %[r]\n\t"
  40552. #endif
  40553. "uxth r7, %[b]\n\t"
  40554. #ifdef WOLFSSL_KEIL
  40555. "muls r6, r7, r6\n\t"
  40556. #elif defined(__clang__)
  40557. "muls r6, r7\n\t"
  40558. #else
  40559. "mul r6, r7\n\t"
  40560. #endif
  40561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40562. "lsrs r7, r6, #16\n\t"
  40563. #else
  40564. "lsr r7, r6, #16\n\t"
  40565. #endif
  40566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40567. "lsls r6, r6, #16\n\t"
  40568. #else
  40569. "lsl r6, r6, #16\n\t"
  40570. #endif
  40571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40572. "adds r5, r5, r6\n\t"
  40573. #else
  40574. "add r5, r5, r6\n\t"
  40575. #endif
  40576. #ifdef WOLFSSL_KEIL
  40577. "adcs r3, r3, r7\n\t"
  40578. #elif defined(__clang__)
  40579. "adcs r3, r7\n\t"
  40580. #else
  40581. "adc r3, r7\n\t"
  40582. #endif
  40583. #ifdef WOLFSSL_KEIL
  40584. "adcs r4, r4, %[r]\n\t"
  40585. #elif defined(__clang__)
  40586. "adcs r4, %[r]\n\t"
  40587. #else
  40588. "adc r4, %[r]\n\t"
  40589. #endif
  40590. "# A[7] * B[4]\n\t"
  40591. "mov %[a], r9\n\t"
  40592. "mov %[b], r10\n\t"
  40593. "ldr %[a], [%[a], #28]\n\t"
  40594. "ldr %[b], [%[b], #16]\n\t"
  40595. "uxth r6, %[a]\n\t"
  40596. "uxth r7, %[b]\n\t"
  40597. #ifdef WOLFSSL_KEIL
  40598. "muls r7, r6, r7\n\t"
  40599. #elif defined(__clang__)
  40600. "muls r7, r6\n\t"
  40601. #else
  40602. "mul r7, r6\n\t"
  40603. #endif
  40604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40605. "adds r5, r5, r7\n\t"
  40606. #else
  40607. "add r5, r5, r7\n\t"
  40608. #endif
  40609. #ifdef WOLFSSL_KEIL
  40610. "adcs r3, r3, %[r]\n\t"
  40611. #elif defined(__clang__)
  40612. "adcs r3, %[r]\n\t"
  40613. #else
  40614. "adc r3, %[r]\n\t"
  40615. #endif
  40616. #ifdef WOLFSSL_KEIL
  40617. "adcs r4, r4, %[r]\n\t"
  40618. #elif defined(__clang__)
  40619. "adcs r4, %[r]\n\t"
  40620. #else
  40621. "adc r4, %[r]\n\t"
  40622. #endif
  40623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40624. "lsrs r7, %[b], #16\n\t"
  40625. #else
  40626. "lsr r7, %[b], #16\n\t"
  40627. #endif
  40628. #ifdef WOLFSSL_KEIL
  40629. "muls r6, r7, r6\n\t"
  40630. #elif defined(__clang__)
  40631. "muls r6, r7\n\t"
  40632. #else
  40633. "mul r6, r7\n\t"
  40634. #endif
  40635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40636. "lsrs r7, r6, #16\n\t"
  40637. #else
  40638. "lsr r7, r6, #16\n\t"
  40639. #endif
  40640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40641. "lsls r6, r6, #16\n\t"
  40642. #else
  40643. "lsl r6, r6, #16\n\t"
  40644. #endif
  40645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40646. "adds r5, r5, r6\n\t"
  40647. #else
  40648. "add r5, r5, r6\n\t"
  40649. #endif
  40650. #ifdef WOLFSSL_KEIL
  40651. "adcs r3, r3, r7\n\t"
  40652. #elif defined(__clang__)
  40653. "adcs r3, r7\n\t"
  40654. #else
  40655. "adc r3, r7\n\t"
  40656. #endif
  40657. #ifdef WOLFSSL_KEIL
  40658. "adcs r4, r4, %[r]\n\t"
  40659. #elif defined(__clang__)
  40660. "adcs r4, %[r]\n\t"
  40661. #else
  40662. "adc r4, %[r]\n\t"
  40663. #endif
  40664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40665. "lsrs r6, %[a], #16\n\t"
  40666. #else
  40667. "lsr r6, %[a], #16\n\t"
  40668. #endif
  40669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40670. "lsrs r7, %[b], #16\n\t"
  40671. #else
  40672. "lsr r7, %[b], #16\n\t"
  40673. #endif
  40674. #ifdef WOLFSSL_KEIL
  40675. "muls r7, r6, r7\n\t"
  40676. #elif defined(__clang__)
  40677. "muls r7, r6\n\t"
  40678. #else
  40679. "mul r7, r6\n\t"
  40680. #endif
  40681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40682. "adds r3, r3, r7\n\t"
  40683. #else
  40684. "add r3, r3, r7\n\t"
  40685. #endif
  40686. #ifdef WOLFSSL_KEIL
  40687. "adcs r4, r4, %[r]\n\t"
  40688. #elif defined(__clang__)
  40689. "adcs r4, %[r]\n\t"
  40690. #else
  40691. "adc r4, %[r]\n\t"
  40692. #endif
  40693. "uxth r7, %[b]\n\t"
  40694. #ifdef WOLFSSL_KEIL
  40695. "muls r6, r7, r6\n\t"
  40696. #elif defined(__clang__)
  40697. "muls r6, r7\n\t"
  40698. #else
  40699. "mul r6, r7\n\t"
  40700. #endif
  40701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40702. "lsrs r7, r6, #16\n\t"
  40703. #else
  40704. "lsr r7, r6, #16\n\t"
  40705. #endif
  40706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40707. "lsls r6, r6, #16\n\t"
  40708. #else
  40709. "lsl r6, r6, #16\n\t"
  40710. #endif
  40711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40712. "adds r5, r5, r6\n\t"
  40713. #else
  40714. "add r5, r5, r6\n\t"
  40715. #endif
  40716. #ifdef WOLFSSL_KEIL
  40717. "adcs r3, r3, r7\n\t"
  40718. #elif defined(__clang__)
  40719. "adcs r3, r7\n\t"
  40720. #else
  40721. "adc r3, r7\n\t"
  40722. #endif
  40723. #ifdef WOLFSSL_KEIL
  40724. "adcs r4, r4, %[r]\n\t"
  40725. #elif defined(__clang__)
  40726. "adcs r4, %[r]\n\t"
  40727. #else
  40728. "adc r4, %[r]\n\t"
  40729. #endif
  40730. "# A[8] * B[3]\n\t"
  40731. "mov %[a], r9\n\t"
  40732. "mov %[b], r10\n\t"
  40733. "ldr %[a], [%[a], #32]\n\t"
  40734. "ldr %[b], [%[b], #12]\n\t"
  40735. "uxth r6, %[a]\n\t"
  40736. "uxth r7, %[b]\n\t"
  40737. #ifdef WOLFSSL_KEIL
  40738. "muls r7, r6, r7\n\t"
  40739. #elif defined(__clang__)
  40740. "muls r7, r6\n\t"
  40741. #else
  40742. "mul r7, r6\n\t"
  40743. #endif
  40744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40745. "adds r5, r5, r7\n\t"
  40746. #else
  40747. "add r5, r5, r7\n\t"
  40748. #endif
  40749. #ifdef WOLFSSL_KEIL
  40750. "adcs r3, r3, %[r]\n\t"
  40751. #elif defined(__clang__)
  40752. "adcs r3, %[r]\n\t"
  40753. #else
  40754. "adc r3, %[r]\n\t"
  40755. #endif
  40756. #ifdef WOLFSSL_KEIL
  40757. "adcs r4, r4, %[r]\n\t"
  40758. #elif defined(__clang__)
  40759. "adcs r4, %[r]\n\t"
  40760. #else
  40761. "adc r4, %[r]\n\t"
  40762. #endif
  40763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40764. "lsrs r7, %[b], #16\n\t"
  40765. #else
  40766. "lsr r7, %[b], #16\n\t"
  40767. #endif
  40768. #ifdef WOLFSSL_KEIL
  40769. "muls r6, r7, r6\n\t"
  40770. #elif defined(__clang__)
  40771. "muls r6, r7\n\t"
  40772. #else
  40773. "mul r6, r7\n\t"
  40774. #endif
  40775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40776. "lsrs r7, r6, #16\n\t"
  40777. #else
  40778. "lsr r7, r6, #16\n\t"
  40779. #endif
  40780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40781. "lsls r6, r6, #16\n\t"
  40782. #else
  40783. "lsl r6, r6, #16\n\t"
  40784. #endif
  40785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40786. "adds r5, r5, r6\n\t"
  40787. #else
  40788. "add r5, r5, r6\n\t"
  40789. #endif
  40790. #ifdef WOLFSSL_KEIL
  40791. "adcs r3, r3, r7\n\t"
  40792. #elif defined(__clang__)
  40793. "adcs r3, r7\n\t"
  40794. #else
  40795. "adc r3, r7\n\t"
  40796. #endif
  40797. #ifdef WOLFSSL_KEIL
  40798. "adcs r4, r4, %[r]\n\t"
  40799. #elif defined(__clang__)
  40800. "adcs r4, %[r]\n\t"
  40801. #else
  40802. "adc r4, %[r]\n\t"
  40803. #endif
  40804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40805. "lsrs r6, %[a], #16\n\t"
  40806. #else
  40807. "lsr r6, %[a], #16\n\t"
  40808. #endif
  40809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40810. "lsrs r7, %[b], #16\n\t"
  40811. #else
  40812. "lsr r7, %[b], #16\n\t"
  40813. #endif
  40814. #ifdef WOLFSSL_KEIL
  40815. "muls r7, r6, r7\n\t"
  40816. #elif defined(__clang__)
  40817. "muls r7, r6\n\t"
  40818. #else
  40819. "mul r7, r6\n\t"
  40820. #endif
  40821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40822. "adds r3, r3, r7\n\t"
  40823. #else
  40824. "add r3, r3, r7\n\t"
  40825. #endif
  40826. #ifdef WOLFSSL_KEIL
  40827. "adcs r4, r4, %[r]\n\t"
  40828. #elif defined(__clang__)
  40829. "adcs r4, %[r]\n\t"
  40830. #else
  40831. "adc r4, %[r]\n\t"
  40832. #endif
  40833. "uxth r7, %[b]\n\t"
  40834. #ifdef WOLFSSL_KEIL
  40835. "muls r6, r7, r6\n\t"
  40836. #elif defined(__clang__)
  40837. "muls r6, r7\n\t"
  40838. #else
  40839. "mul r6, r7\n\t"
  40840. #endif
  40841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40842. "lsrs r7, r6, #16\n\t"
  40843. #else
  40844. "lsr r7, r6, #16\n\t"
  40845. #endif
  40846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40847. "lsls r6, r6, #16\n\t"
  40848. #else
  40849. "lsl r6, r6, #16\n\t"
  40850. #endif
  40851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40852. "adds r5, r5, r6\n\t"
  40853. #else
  40854. "add r5, r5, r6\n\t"
  40855. #endif
  40856. #ifdef WOLFSSL_KEIL
  40857. "adcs r3, r3, r7\n\t"
  40858. #elif defined(__clang__)
  40859. "adcs r3, r7\n\t"
  40860. #else
  40861. "adc r3, r7\n\t"
  40862. #endif
  40863. #ifdef WOLFSSL_KEIL
  40864. "adcs r4, r4, %[r]\n\t"
  40865. #elif defined(__clang__)
  40866. "adcs r4, %[r]\n\t"
  40867. #else
  40868. "adc r4, %[r]\n\t"
  40869. #endif
  40870. "# A[9] * B[2]\n\t"
  40871. "mov %[a], r9\n\t"
  40872. "mov %[b], r10\n\t"
  40873. "ldr %[a], [%[a], #36]\n\t"
  40874. "ldr %[b], [%[b], #8]\n\t"
  40875. "uxth r6, %[a]\n\t"
  40876. "uxth r7, %[b]\n\t"
  40877. #ifdef WOLFSSL_KEIL
  40878. "muls r7, r6, r7\n\t"
  40879. #elif defined(__clang__)
  40880. "muls r7, r6\n\t"
  40881. #else
  40882. "mul r7, r6\n\t"
  40883. #endif
  40884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40885. "adds r5, r5, r7\n\t"
  40886. #else
  40887. "add r5, r5, r7\n\t"
  40888. #endif
  40889. #ifdef WOLFSSL_KEIL
  40890. "adcs r3, r3, %[r]\n\t"
  40891. #elif defined(__clang__)
  40892. "adcs r3, %[r]\n\t"
  40893. #else
  40894. "adc r3, %[r]\n\t"
  40895. #endif
  40896. #ifdef WOLFSSL_KEIL
  40897. "adcs r4, r4, %[r]\n\t"
  40898. #elif defined(__clang__)
  40899. "adcs r4, %[r]\n\t"
  40900. #else
  40901. "adc r4, %[r]\n\t"
  40902. #endif
  40903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40904. "lsrs r7, %[b], #16\n\t"
  40905. #else
  40906. "lsr r7, %[b], #16\n\t"
  40907. #endif
  40908. #ifdef WOLFSSL_KEIL
  40909. "muls r6, r7, r6\n\t"
  40910. #elif defined(__clang__)
  40911. "muls r6, r7\n\t"
  40912. #else
  40913. "mul r6, r7\n\t"
  40914. #endif
  40915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40916. "lsrs r7, r6, #16\n\t"
  40917. #else
  40918. "lsr r7, r6, #16\n\t"
  40919. #endif
  40920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40921. "lsls r6, r6, #16\n\t"
  40922. #else
  40923. "lsl r6, r6, #16\n\t"
  40924. #endif
  40925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40926. "adds r5, r5, r6\n\t"
  40927. #else
  40928. "add r5, r5, r6\n\t"
  40929. #endif
  40930. #ifdef WOLFSSL_KEIL
  40931. "adcs r3, r3, r7\n\t"
  40932. #elif defined(__clang__)
  40933. "adcs r3, r7\n\t"
  40934. #else
  40935. "adc r3, r7\n\t"
  40936. #endif
  40937. #ifdef WOLFSSL_KEIL
  40938. "adcs r4, r4, %[r]\n\t"
  40939. #elif defined(__clang__)
  40940. "adcs r4, %[r]\n\t"
  40941. #else
  40942. "adc r4, %[r]\n\t"
  40943. #endif
  40944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40945. "lsrs r6, %[a], #16\n\t"
  40946. #else
  40947. "lsr r6, %[a], #16\n\t"
  40948. #endif
  40949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40950. "lsrs r7, %[b], #16\n\t"
  40951. #else
  40952. "lsr r7, %[b], #16\n\t"
  40953. #endif
  40954. #ifdef WOLFSSL_KEIL
  40955. "muls r7, r6, r7\n\t"
  40956. #elif defined(__clang__)
  40957. "muls r7, r6\n\t"
  40958. #else
  40959. "mul r7, r6\n\t"
  40960. #endif
  40961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40962. "adds r3, r3, r7\n\t"
  40963. #else
  40964. "add r3, r3, r7\n\t"
  40965. #endif
  40966. #ifdef WOLFSSL_KEIL
  40967. "adcs r4, r4, %[r]\n\t"
  40968. #elif defined(__clang__)
  40969. "adcs r4, %[r]\n\t"
  40970. #else
  40971. "adc r4, %[r]\n\t"
  40972. #endif
  40973. "uxth r7, %[b]\n\t"
  40974. #ifdef WOLFSSL_KEIL
  40975. "muls r6, r7, r6\n\t"
  40976. #elif defined(__clang__)
  40977. "muls r6, r7\n\t"
  40978. #else
  40979. "mul r6, r7\n\t"
  40980. #endif
  40981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40982. "lsrs r7, r6, #16\n\t"
  40983. #else
  40984. "lsr r7, r6, #16\n\t"
  40985. #endif
  40986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40987. "lsls r6, r6, #16\n\t"
  40988. #else
  40989. "lsl r6, r6, #16\n\t"
  40990. #endif
  40991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40992. "adds r5, r5, r6\n\t"
  40993. #else
  40994. "add r5, r5, r6\n\t"
  40995. #endif
  40996. #ifdef WOLFSSL_KEIL
  40997. "adcs r3, r3, r7\n\t"
  40998. #elif defined(__clang__)
  40999. "adcs r3, r7\n\t"
  41000. #else
  41001. "adc r3, r7\n\t"
  41002. #endif
  41003. #ifdef WOLFSSL_KEIL
  41004. "adcs r4, r4, %[r]\n\t"
  41005. #elif defined(__clang__)
  41006. "adcs r4, %[r]\n\t"
  41007. #else
  41008. "adc r4, %[r]\n\t"
  41009. #endif
  41010. "# A[10] * B[1]\n\t"
  41011. "mov %[a], r9\n\t"
  41012. "mov %[b], r10\n\t"
  41013. "ldr %[a], [%[a], #40]\n\t"
  41014. "ldr %[b], [%[b], #4]\n\t"
  41015. "uxth r6, %[a]\n\t"
  41016. "uxth r7, %[b]\n\t"
  41017. #ifdef WOLFSSL_KEIL
  41018. "muls r7, r6, r7\n\t"
  41019. #elif defined(__clang__)
  41020. "muls r7, r6\n\t"
  41021. #else
  41022. "mul r7, r6\n\t"
  41023. #endif
  41024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41025. "adds r5, r5, r7\n\t"
  41026. #else
  41027. "add r5, r5, r7\n\t"
  41028. #endif
  41029. #ifdef WOLFSSL_KEIL
  41030. "adcs r3, r3, %[r]\n\t"
  41031. #elif defined(__clang__)
  41032. "adcs r3, %[r]\n\t"
  41033. #else
  41034. "adc r3, %[r]\n\t"
  41035. #endif
  41036. #ifdef WOLFSSL_KEIL
  41037. "adcs r4, r4, %[r]\n\t"
  41038. #elif defined(__clang__)
  41039. "adcs r4, %[r]\n\t"
  41040. #else
  41041. "adc r4, %[r]\n\t"
  41042. #endif
  41043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41044. "lsrs r7, %[b], #16\n\t"
  41045. #else
  41046. "lsr r7, %[b], #16\n\t"
  41047. #endif
  41048. #ifdef WOLFSSL_KEIL
  41049. "muls r6, r7, r6\n\t"
  41050. #elif defined(__clang__)
  41051. "muls r6, r7\n\t"
  41052. #else
  41053. "mul r6, r7\n\t"
  41054. #endif
  41055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41056. "lsrs r7, r6, #16\n\t"
  41057. #else
  41058. "lsr r7, r6, #16\n\t"
  41059. #endif
  41060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41061. "lsls r6, r6, #16\n\t"
  41062. #else
  41063. "lsl r6, r6, #16\n\t"
  41064. #endif
  41065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41066. "adds r5, r5, r6\n\t"
  41067. #else
  41068. "add r5, r5, r6\n\t"
  41069. #endif
  41070. #ifdef WOLFSSL_KEIL
  41071. "adcs r3, r3, r7\n\t"
  41072. #elif defined(__clang__)
  41073. "adcs r3, r7\n\t"
  41074. #else
  41075. "adc r3, r7\n\t"
  41076. #endif
  41077. #ifdef WOLFSSL_KEIL
  41078. "adcs r4, r4, %[r]\n\t"
  41079. #elif defined(__clang__)
  41080. "adcs r4, %[r]\n\t"
  41081. #else
  41082. "adc r4, %[r]\n\t"
  41083. #endif
  41084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41085. "lsrs r6, %[a], #16\n\t"
  41086. #else
  41087. "lsr r6, %[a], #16\n\t"
  41088. #endif
  41089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41090. "lsrs r7, %[b], #16\n\t"
  41091. #else
  41092. "lsr r7, %[b], #16\n\t"
  41093. #endif
  41094. #ifdef WOLFSSL_KEIL
  41095. "muls r7, r6, r7\n\t"
  41096. #elif defined(__clang__)
  41097. "muls r7, r6\n\t"
  41098. #else
  41099. "mul r7, r6\n\t"
  41100. #endif
  41101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41102. "adds r3, r3, r7\n\t"
  41103. #else
  41104. "add r3, r3, r7\n\t"
  41105. #endif
  41106. #ifdef WOLFSSL_KEIL
  41107. "adcs r4, r4, %[r]\n\t"
  41108. #elif defined(__clang__)
  41109. "adcs r4, %[r]\n\t"
  41110. #else
  41111. "adc r4, %[r]\n\t"
  41112. #endif
  41113. "uxth r7, %[b]\n\t"
  41114. #ifdef WOLFSSL_KEIL
  41115. "muls r6, r7, r6\n\t"
  41116. #elif defined(__clang__)
  41117. "muls r6, r7\n\t"
  41118. #else
  41119. "mul r6, r7\n\t"
  41120. #endif
  41121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41122. "lsrs r7, r6, #16\n\t"
  41123. #else
  41124. "lsr r7, r6, #16\n\t"
  41125. #endif
  41126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41127. "lsls r6, r6, #16\n\t"
  41128. #else
  41129. "lsl r6, r6, #16\n\t"
  41130. #endif
  41131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41132. "adds r5, r5, r6\n\t"
  41133. #else
  41134. "add r5, r5, r6\n\t"
  41135. #endif
  41136. #ifdef WOLFSSL_KEIL
  41137. "adcs r3, r3, r7\n\t"
  41138. #elif defined(__clang__)
  41139. "adcs r3, r7\n\t"
  41140. #else
  41141. "adc r3, r7\n\t"
  41142. #endif
  41143. #ifdef WOLFSSL_KEIL
  41144. "adcs r4, r4, %[r]\n\t"
  41145. #elif defined(__clang__)
  41146. "adcs r4, %[r]\n\t"
  41147. #else
  41148. "adc r4, %[r]\n\t"
  41149. #endif
  41150. "# A[11] * B[0]\n\t"
  41151. "mov %[a], r9\n\t"
  41152. "mov %[b], r10\n\t"
  41153. "ldr %[a], [%[a], #44]\n\t"
  41154. "ldr %[b], [%[b]]\n\t"
  41155. "uxth r6, %[a]\n\t"
  41156. "uxth r7, %[b]\n\t"
  41157. #ifdef WOLFSSL_KEIL
  41158. "muls r7, r6, r7\n\t"
  41159. #elif defined(__clang__)
  41160. "muls r7, r6\n\t"
  41161. #else
  41162. "mul r7, r6\n\t"
  41163. #endif
  41164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41165. "adds r5, r5, r7\n\t"
  41166. #else
  41167. "add r5, r5, r7\n\t"
  41168. #endif
  41169. #ifdef WOLFSSL_KEIL
  41170. "adcs r3, r3, %[r]\n\t"
  41171. #elif defined(__clang__)
  41172. "adcs r3, %[r]\n\t"
  41173. #else
  41174. "adc r3, %[r]\n\t"
  41175. #endif
  41176. #ifdef WOLFSSL_KEIL
  41177. "adcs r4, r4, %[r]\n\t"
  41178. #elif defined(__clang__)
  41179. "adcs r4, %[r]\n\t"
  41180. #else
  41181. "adc r4, %[r]\n\t"
  41182. #endif
  41183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41184. "lsrs r7, %[b], #16\n\t"
  41185. #else
  41186. "lsr r7, %[b], #16\n\t"
  41187. #endif
  41188. #ifdef WOLFSSL_KEIL
  41189. "muls r6, r7, r6\n\t"
  41190. #elif defined(__clang__)
  41191. "muls r6, r7\n\t"
  41192. #else
  41193. "mul r6, r7\n\t"
  41194. #endif
  41195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41196. "lsrs r7, r6, #16\n\t"
  41197. #else
  41198. "lsr r7, r6, #16\n\t"
  41199. #endif
  41200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41201. "lsls r6, r6, #16\n\t"
  41202. #else
  41203. "lsl r6, r6, #16\n\t"
  41204. #endif
  41205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41206. "adds r5, r5, r6\n\t"
  41207. #else
  41208. "add r5, r5, r6\n\t"
  41209. #endif
  41210. #ifdef WOLFSSL_KEIL
  41211. "adcs r3, r3, r7\n\t"
  41212. #elif defined(__clang__)
  41213. "adcs r3, r7\n\t"
  41214. #else
  41215. "adc r3, r7\n\t"
  41216. #endif
  41217. #ifdef WOLFSSL_KEIL
  41218. "adcs r4, r4, %[r]\n\t"
  41219. #elif defined(__clang__)
  41220. "adcs r4, %[r]\n\t"
  41221. #else
  41222. "adc r4, %[r]\n\t"
  41223. #endif
  41224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41225. "lsrs r6, %[a], #16\n\t"
  41226. #else
  41227. "lsr r6, %[a], #16\n\t"
  41228. #endif
  41229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41230. "lsrs r7, %[b], #16\n\t"
  41231. #else
  41232. "lsr r7, %[b], #16\n\t"
  41233. #endif
  41234. #ifdef WOLFSSL_KEIL
  41235. "muls r7, r6, r7\n\t"
  41236. #elif defined(__clang__)
  41237. "muls r7, r6\n\t"
  41238. #else
  41239. "mul r7, r6\n\t"
  41240. #endif
  41241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41242. "adds r3, r3, r7\n\t"
  41243. #else
  41244. "add r3, r3, r7\n\t"
  41245. #endif
  41246. #ifdef WOLFSSL_KEIL
  41247. "adcs r4, r4, %[r]\n\t"
  41248. #elif defined(__clang__)
  41249. "adcs r4, %[r]\n\t"
  41250. #else
  41251. "adc r4, %[r]\n\t"
  41252. #endif
  41253. "uxth r7, %[b]\n\t"
  41254. #ifdef WOLFSSL_KEIL
  41255. "muls r6, r7, r6\n\t"
  41256. #elif defined(__clang__)
  41257. "muls r6, r7\n\t"
  41258. #else
  41259. "mul r6, r7\n\t"
  41260. #endif
  41261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41262. "lsrs r7, r6, #16\n\t"
  41263. #else
  41264. "lsr r7, r6, #16\n\t"
  41265. #endif
  41266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41267. "lsls r6, r6, #16\n\t"
  41268. #else
  41269. "lsl r6, r6, #16\n\t"
  41270. #endif
  41271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41272. "adds r5, r5, r6\n\t"
  41273. #else
  41274. "add r5, r5, r6\n\t"
  41275. #endif
  41276. #ifdef WOLFSSL_KEIL
  41277. "adcs r3, r3, r7\n\t"
  41278. #elif defined(__clang__)
  41279. "adcs r3, r7\n\t"
  41280. #else
  41281. "adc r3, r7\n\t"
  41282. #endif
  41283. #ifdef WOLFSSL_KEIL
  41284. "adcs r4, r4, %[r]\n\t"
  41285. #elif defined(__clang__)
  41286. "adcs r4, %[r]\n\t"
  41287. #else
  41288. "adc r4, %[r]\n\t"
  41289. #endif
  41290. "str r5, [sp, #44]\n\t"
  41291. "# A[11] * B[1]\n\t"
  41292. "movs r5, #0\n\t"
  41293. "mov %[a], r9\n\t"
  41294. "mov %[b], r10\n\t"
  41295. "ldr %[a], [%[a], #44]\n\t"
  41296. "ldr %[b], [%[b], #4]\n\t"
  41297. "uxth r6, %[a]\n\t"
  41298. "uxth r7, %[b]\n\t"
  41299. #ifdef WOLFSSL_KEIL
  41300. "muls r7, r6, r7\n\t"
  41301. #elif defined(__clang__)
  41302. "muls r7, r6\n\t"
  41303. #else
  41304. "mul r7, r6\n\t"
  41305. #endif
  41306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41307. "adds r3, r3, r7\n\t"
  41308. #else
  41309. "add r3, r3, r7\n\t"
  41310. #endif
  41311. #ifdef WOLFSSL_KEIL
  41312. "adcs r4, r4, %[r]\n\t"
  41313. #elif defined(__clang__)
  41314. "adcs r4, %[r]\n\t"
  41315. #else
  41316. "adc r4, %[r]\n\t"
  41317. #endif
  41318. #ifdef WOLFSSL_KEIL
  41319. "adcs r5, r5, %[r]\n\t"
  41320. #elif defined(__clang__)
  41321. "adcs r5, %[r]\n\t"
  41322. #else
  41323. "adc r5, %[r]\n\t"
  41324. #endif
  41325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41326. "lsrs r7, %[b], #16\n\t"
  41327. #else
  41328. "lsr r7, %[b], #16\n\t"
  41329. #endif
  41330. #ifdef WOLFSSL_KEIL
  41331. "muls r6, r7, r6\n\t"
  41332. #elif defined(__clang__)
  41333. "muls r6, r7\n\t"
  41334. #else
  41335. "mul r6, r7\n\t"
  41336. #endif
  41337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41338. "lsrs r7, r6, #16\n\t"
  41339. #else
  41340. "lsr r7, r6, #16\n\t"
  41341. #endif
  41342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41343. "lsls r6, r6, #16\n\t"
  41344. #else
  41345. "lsl r6, r6, #16\n\t"
  41346. #endif
  41347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41348. "adds r3, r3, r6\n\t"
  41349. #else
  41350. "add r3, r3, r6\n\t"
  41351. #endif
  41352. #ifdef WOLFSSL_KEIL
  41353. "adcs r4, r4, r7\n\t"
  41354. #elif defined(__clang__)
  41355. "adcs r4, r7\n\t"
  41356. #else
  41357. "adc r4, r7\n\t"
  41358. #endif
  41359. #ifdef WOLFSSL_KEIL
  41360. "adcs r5, r5, %[r]\n\t"
  41361. #elif defined(__clang__)
  41362. "adcs r5, %[r]\n\t"
  41363. #else
  41364. "adc r5, %[r]\n\t"
  41365. #endif
  41366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41367. "lsrs r6, %[a], #16\n\t"
  41368. #else
  41369. "lsr r6, %[a], #16\n\t"
  41370. #endif
  41371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41372. "lsrs r7, %[b], #16\n\t"
  41373. #else
  41374. "lsr r7, %[b], #16\n\t"
  41375. #endif
  41376. #ifdef WOLFSSL_KEIL
  41377. "muls r7, r6, r7\n\t"
  41378. #elif defined(__clang__)
  41379. "muls r7, r6\n\t"
  41380. #else
  41381. "mul r7, r6\n\t"
  41382. #endif
  41383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41384. "adds r4, r4, r7\n\t"
  41385. #else
  41386. "add r4, r4, r7\n\t"
  41387. #endif
  41388. #ifdef WOLFSSL_KEIL
  41389. "adcs r5, r5, %[r]\n\t"
  41390. #elif defined(__clang__)
  41391. "adcs r5, %[r]\n\t"
  41392. #else
  41393. "adc r5, %[r]\n\t"
  41394. #endif
  41395. "uxth r7, %[b]\n\t"
  41396. #ifdef WOLFSSL_KEIL
  41397. "muls r6, r7, r6\n\t"
  41398. #elif defined(__clang__)
  41399. "muls r6, r7\n\t"
  41400. #else
  41401. "mul r6, r7\n\t"
  41402. #endif
  41403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41404. "lsrs r7, r6, #16\n\t"
  41405. #else
  41406. "lsr r7, r6, #16\n\t"
  41407. #endif
  41408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41409. "lsls r6, r6, #16\n\t"
  41410. #else
  41411. "lsl r6, r6, #16\n\t"
  41412. #endif
  41413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41414. "adds r3, r3, r6\n\t"
  41415. #else
  41416. "add r3, r3, r6\n\t"
  41417. #endif
  41418. #ifdef WOLFSSL_KEIL
  41419. "adcs r4, r4, r7\n\t"
  41420. #elif defined(__clang__)
  41421. "adcs r4, r7\n\t"
  41422. #else
  41423. "adc r4, r7\n\t"
  41424. #endif
  41425. #ifdef WOLFSSL_KEIL
  41426. "adcs r5, r5, %[r]\n\t"
  41427. #elif defined(__clang__)
  41428. "adcs r5, %[r]\n\t"
  41429. #else
  41430. "adc r5, %[r]\n\t"
  41431. #endif
  41432. "# A[10] * B[2]\n\t"
  41433. "mov %[a], r9\n\t"
  41434. "mov %[b], r10\n\t"
  41435. "ldr %[a], [%[a], #40]\n\t"
  41436. "ldr %[b], [%[b], #8]\n\t"
  41437. "uxth r6, %[a]\n\t"
  41438. "uxth r7, %[b]\n\t"
  41439. #ifdef WOLFSSL_KEIL
  41440. "muls r7, r6, r7\n\t"
  41441. #elif defined(__clang__)
  41442. "muls r7, r6\n\t"
  41443. #else
  41444. "mul r7, r6\n\t"
  41445. #endif
  41446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41447. "adds r3, r3, r7\n\t"
  41448. #else
  41449. "add r3, r3, r7\n\t"
  41450. #endif
  41451. #ifdef WOLFSSL_KEIL
  41452. "adcs r4, r4, %[r]\n\t"
  41453. #elif defined(__clang__)
  41454. "adcs r4, %[r]\n\t"
  41455. #else
  41456. "adc r4, %[r]\n\t"
  41457. #endif
  41458. #ifdef WOLFSSL_KEIL
  41459. "adcs r5, r5, %[r]\n\t"
  41460. #elif defined(__clang__)
  41461. "adcs r5, %[r]\n\t"
  41462. #else
  41463. "adc r5, %[r]\n\t"
  41464. #endif
  41465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41466. "lsrs r7, %[b], #16\n\t"
  41467. #else
  41468. "lsr r7, %[b], #16\n\t"
  41469. #endif
  41470. #ifdef WOLFSSL_KEIL
  41471. "muls r6, r7, r6\n\t"
  41472. #elif defined(__clang__)
  41473. "muls r6, r7\n\t"
  41474. #else
  41475. "mul r6, r7\n\t"
  41476. #endif
  41477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41478. "lsrs r7, r6, #16\n\t"
  41479. #else
  41480. "lsr r7, r6, #16\n\t"
  41481. #endif
  41482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41483. "lsls r6, r6, #16\n\t"
  41484. #else
  41485. "lsl r6, r6, #16\n\t"
  41486. #endif
  41487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41488. "adds r3, r3, r6\n\t"
  41489. #else
  41490. "add r3, r3, r6\n\t"
  41491. #endif
  41492. #ifdef WOLFSSL_KEIL
  41493. "adcs r4, r4, r7\n\t"
  41494. #elif defined(__clang__)
  41495. "adcs r4, r7\n\t"
  41496. #else
  41497. "adc r4, r7\n\t"
  41498. #endif
  41499. #ifdef WOLFSSL_KEIL
  41500. "adcs r5, r5, %[r]\n\t"
  41501. #elif defined(__clang__)
  41502. "adcs r5, %[r]\n\t"
  41503. #else
  41504. "adc r5, %[r]\n\t"
  41505. #endif
  41506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41507. "lsrs r6, %[a], #16\n\t"
  41508. #else
  41509. "lsr r6, %[a], #16\n\t"
  41510. #endif
  41511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41512. "lsrs r7, %[b], #16\n\t"
  41513. #else
  41514. "lsr r7, %[b], #16\n\t"
  41515. #endif
  41516. #ifdef WOLFSSL_KEIL
  41517. "muls r7, r6, r7\n\t"
  41518. #elif defined(__clang__)
  41519. "muls r7, r6\n\t"
  41520. #else
  41521. "mul r7, r6\n\t"
  41522. #endif
  41523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41524. "adds r4, r4, r7\n\t"
  41525. #else
  41526. "add r4, r4, r7\n\t"
  41527. #endif
  41528. #ifdef WOLFSSL_KEIL
  41529. "adcs r5, r5, %[r]\n\t"
  41530. #elif defined(__clang__)
  41531. "adcs r5, %[r]\n\t"
  41532. #else
  41533. "adc r5, %[r]\n\t"
  41534. #endif
  41535. "uxth r7, %[b]\n\t"
  41536. #ifdef WOLFSSL_KEIL
  41537. "muls r6, r7, r6\n\t"
  41538. #elif defined(__clang__)
  41539. "muls r6, r7\n\t"
  41540. #else
  41541. "mul r6, r7\n\t"
  41542. #endif
  41543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41544. "lsrs r7, r6, #16\n\t"
  41545. #else
  41546. "lsr r7, r6, #16\n\t"
  41547. #endif
  41548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41549. "lsls r6, r6, #16\n\t"
  41550. #else
  41551. "lsl r6, r6, #16\n\t"
  41552. #endif
  41553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41554. "adds r3, r3, r6\n\t"
  41555. #else
  41556. "add r3, r3, r6\n\t"
  41557. #endif
  41558. #ifdef WOLFSSL_KEIL
  41559. "adcs r4, r4, r7\n\t"
  41560. #elif defined(__clang__)
  41561. "adcs r4, r7\n\t"
  41562. #else
  41563. "adc r4, r7\n\t"
  41564. #endif
  41565. #ifdef WOLFSSL_KEIL
  41566. "adcs r5, r5, %[r]\n\t"
  41567. #elif defined(__clang__)
  41568. "adcs r5, %[r]\n\t"
  41569. #else
  41570. "adc r5, %[r]\n\t"
  41571. #endif
  41572. "# A[9] * B[3]\n\t"
  41573. "mov %[a], r9\n\t"
  41574. "mov %[b], r10\n\t"
  41575. "ldr %[a], [%[a], #36]\n\t"
  41576. "ldr %[b], [%[b], #12]\n\t"
  41577. "uxth r6, %[a]\n\t"
  41578. "uxth r7, %[b]\n\t"
  41579. #ifdef WOLFSSL_KEIL
  41580. "muls r7, r6, r7\n\t"
  41581. #elif defined(__clang__)
  41582. "muls r7, r6\n\t"
  41583. #else
  41584. "mul r7, r6\n\t"
  41585. #endif
  41586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41587. "adds r3, r3, r7\n\t"
  41588. #else
  41589. "add r3, r3, r7\n\t"
  41590. #endif
  41591. #ifdef WOLFSSL_KEIL
  41592. "adcs r4, r4, %[r]\n\t"
  41593. #elif defined(__clang__)
  41594. "adcs r4, %[r]\n\t"
  41595. #else
  41596. "adc r4, %[r]\n\t"
  41597. #endif
  41598. #ifdef WOLFSSL_KEIL
  41599. "adcs r5, r5, %[r]\n\t"
  41600. #elif defined(__clang__)
  41601. "adcs r5, %[r]\n\t"
  41602. #else
  41603. "adc r5, %[r]\n\t"
  41604. #endif
  41605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41606. "lsrs r7, %[b], #16\n\t"
  41607. #else
  41608. "lsr r7, %[b], #16\n\t"
  41609. #endif
  41610. #ifdef WOLFSSL_KEIL
  41611. "muls r6, r7, r6\n\t"
  41612. #elif defined(__clang__)
  41613. "muls r6, r7\n\t"
  41614. #else
  41615. "mul r6, r7\n\t"
  41616. #endif
  41617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41618. "lsrs r7, r6, #16\n\t"
  41619. #else
  41620. "lsr r7, r6, #16\n\t"
  41621. #endif
  41622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41623. "lsls r6, r6, #16\n\t"
  41624. #else
  41625. "lsl r6, r6, #16\n\t"
  41626. #endif
  41627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41628. "adds r3, r3, r6\n\t"
  41629. #else
  41630. "add r3, r3, r6\n\t"
  41631. #endif
  41632. #ifdef WOLFSSL_KEIL
  41633. "adcs r4, r4, r7\n\t"
  41634. #elif defined(__clang__)
  41635. "adcs r4, r7\n\t"
  41636. #else
  41637. "adc r4, r7\n\t"
  41638. #endif
  41639. #ifdef WOLFSSL_KEIL
  41640. "adcs r5, r5, %[r]\n\t"
  41641. #elif defined(__clang__)
  41642. "adcs r5, %[r]\n\t"
  41643. #else
  41644. "adc r5, %[r]\n\t"
  41645. #endif
  41646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41647. "lsrs r6, %[a], #16\n\t"
  41648. #else
  41649. "lsr r6, %[a], #16\n\t"
  41650. #endif
  41651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41652. "lsrs r7, %[b], #16\n\t"
  41653. #else
  41654. "lsr r7, %[b], #16\n\t"
  41655. #endif
  41656. #ifdef WOLFSSL_KEIL
  41657. "muls r7, r6, r7\n\t"
  41658. #elif defined(__clang__)
  41659. "muls r7, r6\n\t"
  41660. #else
  41661. "mul r7, r6\n\t"
  41662. #endif
  41663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41664. "adds r4, r4, r7\n\t"
  41665. #else
  41666. "add r4, r4, r7\n\t"
  41667. #endif
  41668. #ifdef WOLFSSL_KEIL
  41669. "adcs r5, r5, %[r]\n\t"
  41670. #elif defined(__clang__)
  41671. "adcs r5, %[r]\n\t"
  41672. #else
  41673. "adc r5, %[r]\n\t"
  41674. #endif
  41675. "uxth r7, %[b]\n\t"
  41676. #ifdef WOLFSSL_KEIL
  41677. "muls r6, r7, r6\n\t"
  41678. #elif defined(__clang__)
  41679. "muls r6, r7\n\t"
  41680. #else
  41681. "mul r6, r7\n\t"
  41682. #endif
  41683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41684. "lsrs r7, r6, #16\n\t"
  41685. #else
  41686. "lsr r7, r6, #16\n\t"
  41687. #endif
  41688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41689. "lsls r6, r6, #16\n\t"
  41690. #else
  41691. "lsl r6, r6, #16\n\t"
  41692. #endif
  41693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41694. "adds r3, r3, r6\n\t"
  41695. #else
  41696. "add r3, r3, r6\n\t"
  41697. #endif
  41698. #ifdef WOLFSSL_KEIL
  41699. "adcs r4, r4, r7\n\t"
  41700. #elif defined(__clang__)
  41701. "adcs r4, r7\n\t"
  41702. #else
  41703. "adc r4, r7\n\t"
  41704. #endif
  41705. #ifdef WOLFSSL_KEIL
  41706. "adcs r5, r5, %[r]\n\t"
  41707. #elif defined(__clang__)
  41708. "adcs r5, %[r]\n\t"
  41709. #else
  41710. "adc r5, %[r]\n\t"
  41711. #endif
  41712. "# A[8] * B[4]\n\t"
  41713. "mov %[a], r9\n\t"
  41714. "mov %[b], r10\n\t"
  41715. "ldr %[a], [%[a], #32]\n\t"
  41716. "ldr %[b], [%[b], #16]\n\t"
  41717. "uxth r6, %[a]\n\t"
  41718. "uxth r7, %[b]\n\t"
  41719. #ifdef WOLFSSL_KEIL
  41720. "muls r7, r6, r7\n\t"
  41721. #elif defined(__clang__)
  41722. "muls r7, r6\n\t"
  41723. #else
  41724. "mul r7, r6\n\t"
  41725. #endif
  41726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41727. "adds r3, r3, r7\n\t"
  41728. #else
  41729. "add r3, r3, r7\n\t"
  41730. #endif
  41731. #ifdef WOLFSSL_KEIL
  41732. "adcs r4, r4, %[r]\n\t"
  41733. #elif defined(__clang__)
  41734. "adcs r4, %[r]\n\t"
  41735. #else
  41736. "adc r4, %[r]\n\t"
  41737. #endif
  41738. #ifdef WOLFSSL_KEIL
  41739. "adcs r5, r5, %[r]\n\t"
  41740. #elif defined(__clang__)
  41741. "adcs r5, %[r]\n\t"
  41742. #else
  41743. "adc r5, %[r]\n\t"
  41744. #endif
  41745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41746. "lsrs r7, %[b], #16\n\t"
  41747. #else
  41748. "lsr r7, %[b], #16\n\t"
  41749. #endif
  41750. #ifdef WOLFSSL_KEIL
  41751. "muls r6, r7, r6\n\t"
  41752. #elif defined(__clang__)
  41753. "muls r6, r7\n\t"
  41754. #else
  41755. "mul r6, r7\n\t"
  41756. #endif
  41757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41758. "lsrs r7, r6, #16\n\t"
  41759. #else
  41760. "lsr r7, r6, #16\n\t"
  41761. #endif
  41762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41763. "lsls r6, r6, #16\n\t"
  41764. #else
  41765. "lsl r6, r6, #16\n\t"
  41766. #endif
  41767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41768. "adds r3, r3, r6\n\t"
  41769. #else
  41770. "add r3, r3, r6\n\t"
  41771. #endif
  41772. #ifdef WOLFSSL_KEIL
  41773. "adcs r4, r4, r7\n\t"
  41774. #elif defined(__clang__)
  41775. "adcs r4, r7\n\t"
  41776. #else
  41777. "adc r4, r7\n\t"
  41778. #endif
  41779. #ifdef WOLFSSL_KEIL
  41780. "adcs r5, r5, %[r]\n\t"
  41781. #elif defined(__clang__)
  41782. "adcs r5, %[r]\n\t"
  41783. #else
  41784. "adc r5, %[r]\n\t"
  41785. #endif
  41786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41787. "lsrs r6, %[a], #16\n\t"
  41788. #else
  41789. "lsr r6, %[a], #16\n\t"
  41790. #endif
  41791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41792. "lsrs r7, %[b], #16\n\t"
  41793. #else
  41794. "lsr r7, %[b], #16\n\t"
  41795. #endif
  41796. #ifdef WOLFSSL_KEIL
  41797. "muls r7, r6, r7\n\t"
  41798. #elif defined(__clang__)
  41799. "muls r7, r6\n\t"
  41800. #else
  41801. "mul r7, r6\n\t"
  41802. #endif
  41803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41804. "adds r4, r4, r7\n\t"
  41805. #else
  41806. "add r4, r4, r7\n\t"
  41807. #endif
  41808. #ifdef WOLFSSL_KEIL
  41809. "adcs r5, r5, %[r]\n\t"
  41810. #elif defined(__clang__)
  41811. "adcs r5, %[r]\n\t"
  41812. #else
  41813. "adc r5, %[r]\n\t"
  41814. #endif
  41815. "uxth r7, %[b]\n\t"
  41816. #ifdef WOLFSSL_KEIL
  41817. "muls r6, r7, r6\n\t"
  41818. #elif defined(__clang__)
  41819. "muls r6, r7\n\t"
  41820. #else
  41821. "mul r6, r7\n\t"
  41822. #endif
  41823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41824. "lsrs r7, r6, #16\n\t"
  41825. #else
  41826. "lsr r7, r6, #16\n\t"
  41827. #endif
  41828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41829. "lsls r6, r6, #16\n\t"
  41830. #else
  41831. "lsl r6, r6, #16\n\t"
  41832. #endif
  41833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41834. "adds r3, r3, r6\n\t"
  41835. #else
  41836. "add r3, r3, r6\n\t"
  41837. #endif
  41838. #ifdef WOLFSSL_KEIL
  41839. "adcs r4, r4, r7\n\t"
  41840. #elif defined(__clang__)
  41841. "adcs r4, r7\n\t"
  41842. #else
  41843. "adc r4, r7\n\t"
  41844. #endif
  41845. #ifdef WOLFSSL_KEIL
  41846. "adcs r5, r5, %[r]\n\t"
  41847. #elif defined(__clang__)
  41848. "adcs r5, %[r]\n\t"
  41849. #else
  41850. "adc r5, %[r]\n\t"
  41851. #endif
  41852. "# A[7] * B[5]\n\t"
  41853. "mov %[a], r9\n\t"
  41854. "mov %[b], r10\n\t"
  41855. "ldr %[a], [%[a], #28]\n\t"
  41856. "ldr %[b], [%[b], #20]\n\t"
  41857. "uxth r6, %[a]\n\t"
  41858. "uxth r7, %[b]\n\t"
  41859. #ifdef WOLFSSL_KEIL
  41860. "muls r7, r6, r7\n\t"
  41861. #elif defined(__clang__)
  41862. "muls r7, r6\n\t"
  41863. #else
  41864. "mul r7, r6\n\t"
  41865. #endif
  41866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41867. "adds r3, r3, r7\n\t"
  41868. #else
  41869. "add r3, r3, r7\n\t"
  41870. #endif
  41871. #ifdef WOLFSSL_KEIL
  41872. "adcs r4, r4, %[r]\n\t"
  41873. #elif defined(__clang__)
  41874. "adcs r4, %[r]\n\t"
  41875. #else
  41876. "adc r4, %[r]\n\t"
  41877. #endif
  41878. #ifdef WOLFSSL_KEIL
  41879. "adcs r5, r5, %[r]\n\t"
  41880. #elif defined(__clang__)
  41881. "adcs r5, %[r]\n\t"
  41882. #else
  41883. "adc r5, %[r]\n\t"
  41884. #endif
  41885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41886. "lsrs r7, %[b], #16\n\t"
  41887. #else
  41888. "lsr r7, %[b], #16\n\t"
  41889. #endif
  41890. #ifdef WOLFSSL_KEIL
  41891. "muls r6, r7, r6\n\t"
  41892. #elif defined(__clang__)
  41893. "muls r6, r7\n\t"
  41894. #else
  41895. "mul r6, r7\n\t"
  41896. #endif
  41897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41898. "lsrs r7, r6, #16\n\t"
  41899. #else
  41900. "lsr r7, r6, #16\n\t"
  41901. #endif
  41902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41903. "lsls r6, r6, #16\n\t"
  41904. #else
  41905. "lsl r6, r6, #16\n\t"
  41906. #endif
  41907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41908. "adds r3, r3, r6\n\t"
  41909. #else
  41910. "add r3, r3, r6\n\t"
  41911. #endif
  41912. #ifdef WOLFSSL_KEIL
  41913. "adcs r4, r4, r7\n\t"
  41914. #elif defined(__clang__)
  41915. "adcs r4, r7\n\t"
  41916. #else
  41917. "adc r4, r7\n\t"
  41918. #endif
  41919. #ifdef WOLFSSL_KEIL
  41920. "adcs r5, r5, %[r]\n\t"
  41921. #elif defined(__clang__)
  41922. "adcs r5, %[r]\n\t"
  41923. #else
  41924. "adc r5, %[r]\n\t"
  41925. #endif
  41926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41927. "lsrs r6, %[a], #16\n\t"
  41928. #else
  41929. "lsr r6, %[a], #16\n\t"
  41930. #endif
  41931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41932. "lsrs r7, %[b], #16\n\t"
  41933. #else
  41934. "lsr r7, %[b], #16\n\t"
  41935. #endif
  41936. #ifdef WOLFSSL_KEIL
  41937. "muls r7, r6, r7\n\t"
  41938. #elif defined(__clang__)
  41939. "muls r7, r6\n\t"
  41940. #else
  41941. "mul r7, r6\n\t"
  41942. #endif
  41943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41944. "adds r4, r4, r7\n\t"
  41945. #else
  41946. "add r4, r4, r7\n\t"
  41947. #endif
  41948. #ifdef WOLFSSL_KEIL
  41949. "adcs r5, r5, %[r]\n\t"
  41950. #elif defined(__clang__)
  41951. "adcs r5, %[r]\n\t"
  41952. #else
  41953. "adc r5, %[r]\n\t"
  41954. #endif
  41955. "uxth r7, %[b]\n\t"
  41956. #ifdef WOLFSSL_KEIL
  41957. "muls r6, r7, r6\n\t"
  41958. #elif defined(__clang__)
  41959. "muls r6, r7\n\t"
  41960. #else
  41961. "mul r6, r7\n\t"
  41962. #endif
  41963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41964. "lsrs r7, r6, #16\n\t"
  41965. #else
  41966. "lsr r7, r6, #16\n\t"
  41967. #endif
  41968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41969. "lsls r6, r6, #16\n\t"
  41970. #else
  41971. "lsl r6, r6, #16\n\t"
  41972. #endif
  41973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41974. "adds r3, r3, r6\n\t"
  41975. #else
  41976. "add r3, r3, r6\n\t"
  41977. #endif
  41978. #ifdef WOLFSSL_KEIL
  41979. "adcs r4, r4, r7\n\t"
  41980. #elif defined(__clang__)
  41981. "adcs r4, r7\n\t"
  41982. #else
  41983. "adc r4, r7\n\t"
  41984. #endif
  41985. #ifdef WOLFSSL_KEIL
  41986. "adcs r5, r5, %[r]\n\t"
  41987. #elif defined(__clang__)
  41988. "adcs r5, %[r]\n\t"
  41989. #else
  41990. "adc r5, %[r]\n\t"
  41991. #endif
  41992. "# A[6] * B[6]\n\t"
  41993. "mov %[a], r9\n\t"
  41994. "mov %[b], r10\n\t"
  41995. "ldr %[a], [%[a], #24]\n\t"
  41996. "ldr %[b], [%[b], #24]\n\t"
  41997. "uxth r6, %[a]\n\t"
  41998. "uxth r7, %[b]\n\t"
  41999. #ifdef WOLFSSL_KEIL
  42000. "muls r7, r6, r7\n\t"
  42001. #elif defined(__clang__)
  42002. "muls r7, r6\n\t"
  42003. #else
  42004. "mul r7, r6\n\t"
  42005. #endif
  42006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42007. "adds r3, r3, r7\n\t"
  42008. #else
  42009. "add r3, r3, r7\n\t"
  42010. #endif
  42011. #ifdef WOLFSSL_KEIL
  42012. "adcs r4, r4, %[r]\n\t"
  42013. #elif defined(__clang__)
  42014. "adcs r4, %[r]\n\t"
  42015. #else
  42016. "adc r4, %[r]\n\t"
  42017. #endif
  42018. #ifdef WOLFSSL_KEIL
  42019. "adcs r5, r5, %[r]\n\t"
  42020. #elif defined(__clang__)
  42021. "adcs r5, %[r]\n\t"
  42022. #else
  42023. "adc r5, %[r]\n\t"
  42024. #endif
  42025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42026. "lsrs r7, %[b], #16\n\t"
  42027. #else
  42028. "lsr r7, %[b], #16\n\t"
  42029. #endif
  42030. #ifdef WOLFSSL_KEIL
  42031. "muls r6, r7, r6\n\t"
  42032. #elif defined(__clang__)
  42033. "muls r6, r7\n\t"
  42034. #else
  42035. "mul r6, r7\n\t"
  42036. #endif
  42037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42038. "lsrs r7, r6, #16\n\t"
  42039. #else
  42040. "lsr r7, r6, #16\n\t"
  42041. #endif
  42042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42043. "lsls r6, r6, #16\n\t"
  42044. #else
  42045. "lsl r6, r6, #16\n\t"
  42046. #endif
  42047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42048. "adds r3, r3, r6\n\t"
  42049. #else
  42050. "add r3, r3, r6\n\t"
  42051. #endif
  42052. #ifdef WOLFSSL_KEIL
  42053. "adcs r4, r4, r7\n\t"
  42054. #elif defined(__clang__)
  42055. "adcs r4, r7\n\t"
  42056. #else
  42057. "adc r4, r7\n\t"
  42058. #endif
  42059. #ifdef WOLFSSL_KEIL
  42060. "adcs r5, r5, %[r]\n\t"
  42061. #elif defined(__clang__)
  42062. "adcs r5, %[r]\n\t"
  42063. #else
  42064. "adc r5, %[r]\n\t"
  42065. #endif
  42066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42067. "lsrs r6, %[a], #16\n\t"
  42068. #else
  42069. "lsr r6, %[a], #16\n\t"
  42070. #endif
  42071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42072. "lsrs r7, %[b], #16\n\t"
  42073. #else
  42074. "lsr r7, %[b], #16\n\t"
  42075. #endif
  42076. #ifdef WOLFSSL_KEIL
  42077. "muls r7, r6, r7\n\t"
  42078. #elif defined(__clang__)
  42079. "muls r7, r6\n\t"
  42080. #else
  42081. "mul r7, r6\n\t"
  42082. #endif
  42083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42084. "adds r4, r4, r7\n\t"
  42085. #else
  42086. "add r4, r4, r7\n\t"
  42087. #endif
  42088. #ifdef WOLFSSL_KEIL
  42089. "adcs r5, r5, %[r]\n\t"
  42090. #elif defined(__clang__)
  42091. "adcs r5, %[r]\n\t"
  42092. #else
  42093. "adc r5, %[r]\n\t"
  42094. #endif
  42095. "uxth r7, %[b]\n\t"
  42096. #ifdef WOLFSSL_KEIL
  42097. "muls r6, r7, r6\n\t"
  42098. #elif defined(__clang__)
  42099. "muls r6, r7\n\t"
  42100. #else
  42101. "mul r6, r7\n\t"
  42102. #endif
  42103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42104. "lsrs r7, r6, #16\n\t"
  42105. #else
  42106. "lsr r7, r6, #16\n\t"
  42107. #endif
  42108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42109. "lsls r6, r6, #16\n\t"
  42110. #else
  42111. "lsl r6, r6, #16\n\t"
  42112. #endif
  42113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42114. "adds r3, r3, r6\n\t"
  42115. #else
  42116. "add r3, r3, r6\n\t"
  42117. #endif
  42118. #ifdef WOLFSSL_KEIL
  42119. "adcs r4, r4, r7\n\t"
  42120. #elif defined(__clang__)
  42121. "adcs r4, r7\n\t"
  42122. #else
  42123. "adc r4, r7\n\t"
  42124. #endif
  42125. #ifdef WOLFSSL_KEIL
  42126. "adcs r5, r5, %[r]\n\t"
  42127. #elif defined(__clang__)
  42128. "adcs r5, %[r]\n\t"
  42129. #else
  42130. "adc r5, %[r]\n\t"
  42131. #endif
  42132. "# A[5] * B[7]\n\t"
  42133. "mov %[a], r9\n\t"
  42134. "mov %[b], r10\n\t"
  42135. "ldr %[a], [%[a], #20]\n\t"
  42136. "ldr %[b], [%[b], #28]\n\t"
  42137. "uxth r6, %[a]\n\t"
  42138. "uxth r7, %[b]\n\t"
  42139. #ifdef WOLFSSL_KEIL
  42140. "muls r7, r6, r7\n\t"
  42141. #elif defined(__clang__)
  42142. "muls r7, r6\n\t"
  42143. #else
  42144. "mul r7, r6\n\t"
  42145. #endif
  42146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42147. "adds r3, r3, r7\n\t"
  42148. #else
  42149. "add r3, r3, r7\n\t"
  42150. #endif
  42151. #ifdef WOLFSSL_KEIL
  42152. "adcs r4, r4, %[r]\n\t"
  42153. #elif defined(__clang__)
  42154. "adcs r4, %[r]\n\t"
  42155. #else
  42156. "adc r4, %[r]\n\t"
  42157. #endif
  42158. #ifdef WOLFSSL_KEIL
  42159. "adcs r5, r5, %[r]\n\t"
  42160. #elif defined(__clang__)
  42161. "adcs r5, %[r]\n\t"
  42162. #else
  42163. "adc r5, %[r]\n\t"
  42164. #endif
  42165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42166. "lsrs r7, %[b], #16\n\t"
  42167. #else
  42168. "lsr r7, %[b], #16\n\t"
  42169. #endif
  42170. #ifdef WOLFSSL_KEIL
  42171. "muls r6, r7, r6\n\t"
  42172. #elif defined(__clang__)
  42173. "muls r6, r7\n\t"
  42174. #else
  42175. "mul r6, r7\n\t"
  42176. #endif
  42177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42178. "lsrs r7, r6, #16\n\t"
  42179. #else
  42180. "lsr r7, r6, #16\n\t"
  42181. #endif
  42182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42183. "lsls r6, r6, #16\n\t"
  42184. #else
  42185. "lsl r6, r6, #16\n\t"
  42186. #endif
  42187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42188. "adds r3, r3, r6\n\t"
  42189. #else
  42190. "add r3, r3, r6\n\t"
  42191. #endif
  42192. #ifdef WOLFSSL_KEIL
  42193. "adcs r4, r4, r7\n\t"
  42194. #elif defined(__clang__)
  42195. "adcs r4, r7\n\t"
  42196. #else
  42197. "adc r4, r7\n\t"
  42198. #endif
  42199. #ifdef WOLFSSL_KEIL
  42200. "adcs r5, r5, %[r]\n\t"
  42201. #elif defined(__clang__)
  42202. "adcs r5, %[r]\n\t"
  42203. #else
  42204. "adc r5, %[r]\n\t"
  42205. #endif
  42206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42207. "lsrs r6, %[a], #16\n\t"
  42208. #else
  42209. "lsr r6, %[a], #16\n\t"
  42210. #endif
  42211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42212. "lsrs r7, %[b], #16\n\t"
  42213. #else
  42214. "lsr r7, %[b], #16\n\t"
  42215. #endif
  42216. #ifdef WOLFSSL_KEIL
  42217. "muls r7, r6, r7\n\t"
  42218. #elif defined(__clang__)
  42219. "muls r7, r6\n\t"
  42220. #else
  42221. "mul r7, r6\n\t"
  42222. #endif
  42223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42224. "adds r4, r4, r7\n\t"
  42225. #else
  42226. "add r4, r4, r7\n\t"
  42227. #endif
  42228. #ifdef WOLFSSL_KEIL
  42229. "adcs r5, r5, %[r]\n\t"
  42230. #elif defined(__clang__)
  42231. "adcs r5, %[r]\n\t"
  42232. #else
  42233. "adc r5, %[r]\n\t"
  42234. #endif
  42235. "uxth r7, %[b]\n\t"
  42236. #ifdef WOLFSSL_KEIL
  42237. "muls r6, r7, r6\n\t"
  42238. #elif defined(__clang__)
  42239. "muls r6, r7\n\t"
  42240. #else
  42241. "mul r6, r7\n\t"
  42242. #endif
  42243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42244. "lsrs r7, r6, #16\n\t"
  42245. #else
  42246. "lsr r7, r6, #16\n\t"
  42247. #endif
  42248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42249. "lsls r6, r6, #16\n\t"
  42250. #else
  42251. "lsl r6, r6, #16\n\t"
  42252. #endif
  42253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42254. "adds r3, r3, r6\n\t"
  42255. #else
  42256. "add r3, r3, r6\n\t"
  42257. #endif
  42258. #ifdef WOLFSSL_KEIL
  42259. "adcs r4, r4, r7\n\t"
  42260. #elif defined(__clang__)
  42261. "adcs r4, r7\n\t"
  42262. #else
  42263. "adc r4, r7\n\t"
  42264. #endif
  42265. #ifdef WOLFSSL_KEIL
  42266. "adcs r5, r5, %[r]\n\t"
  42267. #elif defined(__clang__)
  42268. "adcs r5, %[r]\n\t"
  42269. #else
  42270. "adc r5, %[r]\n\t"
  42271. #endif
  42272. "# A[4] * B[8]\n\t"
  42273. "mov %[a], r9\n\t"
  42274. "mov %[b], r10\n\t"
  42275. "ldr %[a], [%[a], #16]\n\t"
  42276. "ldr %[b], [%[b], #32]\n\t"
  42277. "uxth r6, %[a]\n\t"
  42278. "uxth r7, %[b]\n\t"
  42279. #ifdef WOLFSSL_KEIL
  42280. "muls r7, r6, r7\n\t"
  42281. #elif defined(__clang__)
  42282. "muls r7, r6\n\t"
  42283. #else
  42284. "mul r7, r6\n\t"
  42285. #endif
  42286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42287. "adds r3, r3, r7\n\t"
  42288. #else
  42289. "add r3, r3, r7\n\t"
  42290. #endif
  42291. #ifdef WOLFSSL_KEIL
  42292. "adcs r4, r4, %[r]\n\t"
  42293. #elif defined(__clang__)
  42294. "adcs r4, %[r]\n\t"
  42295. #else
  42296. "adc r4, %[r]\n\t"
  42297. #endif
  42298. #ifdef WOLFSSL_KEIL
  42299. "adcs r5, r5, %[r]\n\t"
  42300. #elif defined(__clang__)
  42301. "adcs r5, %[r]\n\t"
  42302. #else
  42303. "adc r5, %[r]\n\t"
  42304. #endif
  42305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42306. "lsrs r7, %[b], #16\n\t"
  42307. #else
  42308. "lsr r7, %[b], #16\n\t"
  42309. #endif
  42310. #ifdef WOLFSSL_KEIL
  42311. "muls r6, r7, r6\n\t"
  42312. #elif defined(__clang__)
  42313. "muls r6, r7\n\t"
  42314. #else
  42315. "mul r6, r7\n\t"
  42316. #endif
  42317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42318. "lsrs r7, r6, #16\n\t"
  42319. #else
  42320. "lsr r7, r6, #16\n\t"
  42321. #endif
  42322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42323. "lsls r6, r6, #16\n\t"
  42324. #else
  42325. "lsl r6, r6, #16\n\t"
  42326. #endif
  42327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42328. "adds r3, r3, r6\n\t"
  42329. #else
  42330. "add r3, r3, r6\n\t"
  42331. #endif
  42332. #ifdef WOLFSSL_KEIL
  42333. "adcs r4, r4, r7\n\t"
  42334. #elif defined(__clang__)
  42335. "adcs r4, r7\n\t"
  42336. #else
  42337. "adc r4, r7\n\t"
  42338. #endif
  42339. #ifdef WOLFSSL_KEIL
  42340. "adcs r5, r5, %[r]\n\t"
  42341. #elif defined(__clang__)
  42342. "adcs r5, %[r]\n\t"
  42343. #else
  42344. "adc r5, %[r]\n\t"
  42345. #endif
  42346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42347. "lsrs r6, %[a], #16\n\t"
  42348. #else
  42349. "lsr r6, %[a], #16\n\t"
  42350. #endif
  42351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42352. "lsrs r7, %[b], #16\n\t"
  42353. #else
  42354. "lsr r7, %[b], #16\n\t"
  42355. #endif
  42356. #ifdef WOLFSSL_KEIL
  42357. "muls r7, r6, r7\n\t"
  42358. #elif defined(__clang__)
  42359. "muls r7, r6\n\t"
  42360. #else
  42361. "mul r7, r6\n\t"
  42362. #endif
  42363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42364. "adds r4, r4, r7\n\t"
  42365. #else
  42366. "add r4, r4, r7\n\t"
  42367. #endif
  42368. #ifdef WOLFSSL_KEIL
  42369. "adcs r5, r5, %[r]\n\t"
  42370. #elif defined(__clang__)
  42371. "adcs r5, %[r]\n\t"
  42372. #else
  42373. "adc r5, %[r]\n\t"
  42374. #endif
  42375. "uxth r7, %[b]\n\t"
  42376. #ifdef WOLFSSL_KEIL
  42377. "muls r6, r7, r6\n\t"
  42378. #elif defined(__clang__)
  42379. "muls r6, r7\n\t"
  42380. #else
  42381. "mul r6, r7\n\t"
  42382. #endif
  42383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42384. "lsrs r7, r6, #16\n\t"
  42385. #else
  42386. "lsr r7, r6, #16\n\t"
  42387. #endif
  42388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42389. "lsls r6, r6, #16\n\t"
  42390. #else
  42391. "lsl r6, r6, #16\n\t"
  42392. #endif
  42393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42394. "adds r3, r3, r6\n\t"
  42395. #else
  42396. "add r3, r3, r6\n\t"
  42397. #endif
  42398. #ifdef WOLFSSL_KEIL
  42399. "adcs r4, r4, r7\n\t"
  42400. #elif defined(__clang__)
  42401. "adcs r4, r7\n\t"
  42402. #else
  42403. "adc r4, r7\n\t"
  42404. #endif
  42405. #ifdef WOLFSSL_KEIL
  42406. "adcs r5, r5, %[r]\n\t"
  42407. #elif defined(__clang__)
  42408. "adcs r5, %[r]\n\t"
  42409. #else
  42410. "adc r5, %[r]\n\t"
  42411. #endif
  42412. "# A[3] * B[9]\n\t"
  42413. "mov %[a], r9\n\t"
  42414. "mov %[b], r10\n\t"
  42415. "ldr %[a], [%[a], #12]\n\t"
  42416. "ldr %[b], [%[b], #36]\n\t"
  42417. "uxth r6, %[a]\n\t"
  42418. "uxth r7, %[b]\n\t"
  42419. #ifdef WOLFSSL_KEIL
  42420. "muls r7, r6, r7\n\t"
  42421. #elif defined(__clang__)
  42422. "muls r7, r6\n\t"
  42423. #else
  42424. "mul r7, r6\n\t"
  42425. #endif
  42426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42427. "adds r3, r3, r7\n\t"
  42428. #else
  42429. "add r3, r3, r7\n\t"
  42430. #endif
  42431. #ifdef WOLFSSL_KEIL
  42432. "adcs r4, r4, %[r]\n\t"
  42433. #elif defined(__clang__)
  42434. "adcs r4, %[r]\n\t"
  42435. #else
  42436. "adc r4, %[r]\n\t"
  42437. #endif
  42438. #ifdef WOLFSSL_KEIL
  42439. "adcs r5, r5, %[r]\n\t"
  42440. #elif defined(__clang__)
  42441. "adcs r5, %[r]\n\t"
  42442. #else
  42443. "adc r5, %[r]\n\t"
  42444. #endif
  42445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42446. "lsrs r7, %[b], #16\n\t"
  42447. #else
  42448. "lsr r7, %[b], #16\n\t"
  42449. #endif
  42450. #ifdef WOLFSSL_KEIL
  42451. "muls r6, r7, r6\n\t"
  42452. #elif defined(__clang__)
  42453. "muls r6, r7\n\t"
  42454. #else
  42455. "mul r6, r7\n\t"
  42456. #endif
  42457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42458. "lsrs r7, r6, #16\n\t"
  42459. #else
  42460. "lsr r7, r6, #16\n\t"
  42461. #endif
  42462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42463. "lsls r6, r6, #16\n\t"
  42464. #else
  42465. "lsl r6, r6, #16\n\t"
  42466. #endif
  42467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42468. "adds r3, r3, r6\n\t"
  42469. #else
  42470. "add r3, r3, r6\n\t"
  42471. #endif
  42472. #ifdef WOLFSSL_KEIL
  42473. "adcs r4, r4, r7\n\t"
  42474. #elif defined(__clang__)
  42475. "adcs r4, r7\n\t"
  42476. #else
  42477. "adc r4, r7\n\t"
  42478. #endif
  42479. #ifdef WOLFSSL_KEIL
  42480. "adcs r5, r5, %[r]\n\t"
  42481. #elif defined(__clang__)
  42482. "adcs r5, %[r]\n\t"
  42483. #else
  42484. "adc r5, %[r]\n\t"
  42485. #endif
  42486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42487. "lsrs r6, %[a], #16\n\t"
  42488. #else
  42489. "lsr r6, %[a], #16\n\t"
  42490. #endif
  42491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42492. "lsrs r7, %[b], #16\n\t"
  42493. #else
  42494. "lsr r7, %[b], #16\n\t"
  42495. #endif
  42496. #ifdef WOLFSSL_KEIL
  42497. "muls r7, r6, r7\n\t"
  42498. #elif defined(__clang__)
  42499. "muls r7, r6\n\t"
  42500. #else
  42501. "mul r7, r6\n\t"
  42502. #endif
  42503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42504. "adds r4, r4, r7\n\t"
  42505. #else
  42506. "add r4, r4, r7\n\t"
  42507. #endif
  42508. #ifdef WOLFSSL_KEIL
  42509. "adcs r5, r5, %[r]\n\t"
  42510. #elif defined(__clang__)
  42511. "adcs r5, %[r]\n\t"
  42512. #else
  42513. "adc r5, %[r]\n\t"
  42514. #endif
  42515. "uxth r7, %[b]\n\t"
  42516. #ifdef WOLFSSL_KEIL
  42517. "muls r6, r7, r6\n\t"
  42518. #elif defined(__clang__)
  42519. "muls r6, r7\n\t"
  42520. #else
  42521. "mul r6, r7\n\t"
  42522. #endif
  42523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42524. "lsrs r7, r6, #16\n\t"
  42525. #else
  42526. "lsr r7, r6, #16\n\t"
  42527. #endif
  42528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42529. "lsls r6, r6, #16\n\t"
  42530. #else
  42531. "lsl r6, r6, #16\n\t"
  42532. #endif
  42533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42534. "adds r3, r3, r6\n\t"
  42535. #else
  42536. "add r3, r3, r6\n\t"
  42537. #endif
  42538. #ifdef WOLFSSL_KEIL
  42539. "adcs r4, r4, r7\n\t"
  42540. #elif defined(__clang__)
  42541. "adcs r4, r7\n\t"
  42542. #else
  42543. "adc r4, r7\n\t"
  42544. #endif
  42545. #ifdef WOLFSSL_KEIL
  42546. "adcs r5, r5, %[r]\n\t"
  42547. #elif defined(__clang__)
  42548. "adcs r5, %[r]\n\t"
  42549. #else
  42550. "adc r5, %[r]\n\t"
  42551. #endif
  42552. "# A[2] * B[10]\n\t"
  42553. "mov %[a], r9\n\t"
  42554. "mov %[b], r10\n\t"
  42555. "ldr %[a], [%[a], #8]\n\t"
  42556. "ldr %[b], [%[b], #40]\n\t"
  42557. "uxth r6, %[a]\n\t"
  42558. "uxth r7, %[b]\n\t"
  42559. #ifdef WOLFSSL_KEIL
  42560. "muls r7, r6, r7\n\t"
  42561. #elif defined(__clang__)
  42562. "muls r7, r6\n\t"
  42563. #else
  42564. "mul r7, r6\n\t"
  42565. #endif
  42566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42567. "adds r3, r3, r7\n\t"
  42568. #else
  42569. "add r3, r3, r7\n\t"
  42570. #endif
  42571. #ifdef WOLFSSL_KEIL
  42572. "adcs r4, r4, %[r]\n\t"
  42573. #elif defined(__clang__)
  42574. "adcs r4, %[r]\n\t"
  42575. #else
  42576. "adc r4, %[r]\n\t"
  42577. #endif
  42578. #ifdef WOLFSSL_KEIL
  42579. "adcs r5, r5, %[r]\n\t"
  42580. #elif defined(__clang__)
  42581. "adcs r5, %[r]\n\t"
  42582. #else
  42583. "adc r5, %[r]\n\t"
  42584. #endif
  42585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42586. "lsrs r7, %[b], #16\n\t"
  42587. #else
  42588. "lsr r7, %[b], #16\n\t"
  42589. #endif
  42590. #ifdef WOLFSSL_KEIL
  42591. "muls r6, r7, r6\n\t"
  42592. #elif defined(__clang__)
  42593. "muls r6, r7\n\t"
  42594. #else
  42595. "mul r6, r7\n\t"
  42596. #endif
  42597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42598. "lsrs r7, r6, #16\n\t"
  42599. #else
  42600. "lsr r7, r6, #16\n\t"
  42601. #endif
  42602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42603. "lsls r6, r6, #16\n\t"
  42604. #else
  42605. "lsl r6, r6, #16\n\t"
  42606. #endif
  42607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42608. "adds r3, r3, r6\n\t"
  42609. #else
  42610. "add r3, r3, r6\n\t"
  42611. #endif
  42612. #ifdef WOLFSSL_KEIL
  42613. "adcs r4, r4, r7\n\t"
  42614. #elif defined(__clang__)
  42615. "adcs r4, r7\n\t"
  42616. #else
  42617. "adc r4, r7\n\t"
  42618. #endif
  42619. #ifdef WOLFSSL_KEIL
  42620. "adcs r5, r5, %[r]\n\t"
  42621. #elif defined(__clang__)
  42622. "adcs r5, %[r]\n\t"
  42623. #else
  42624. "adc r5, %[r]\n\t"
  42625. #endif
  42626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42627. "lsrs r6, %[a], #16\n\t"
  42628. #else
  42629. "lsr r6, %[a], #16\n\t"
  42630. #endif
  42631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42632. "lsrs r7, %[b], #16\n\t"
  42633. #else
  42634. "lsr r7, %[b], #16\n\t"
  42635. #endif
  42636. #ifdef WOLFSSL_KEIL
  42637. "muls r7, r6, r7\n\t"
  42638. #elif defined(__clang__)
  42639. "muls r7, r6\n\t"
  42640. #else
  42641. "mul r7, r6\n\t"
  42642. #endif
  42643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42644. "adds r4, r4, r7\n\t"
  42645. #else
  42646. "add r4, r4, r7\n\t"
  42647. #endif
  42648. #ifdef WOLFSSL_KEIL
  42649. "adcs r5, r5, %[r]\n\t"
  42650. #elif defined(__clang__)
  42651. "adcs r5, %[r]\n\t"
  42652. #else
  42653. "adc r5, %[r]\n\t"
  42654. #endif
  42655. "uxth r7, %[b]\n\t"
  42656. #ifdef WOLFSSL_KEIL
  42657. "muls r6, r7, r6\n\t"
  42658. #elif defined(__clang__)
  42659. "muls r6, r7\n\t"
  42660. #else
  42661. "mul r6, r7\n\t"
  42662. #endif
  42663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42664. "lsrs r7, r6, #16\n\t"
  42665. #else
  42666. "lsr r7, r6, #16\n\t"
  42667. #endif
  42668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42669. "lsls r6, r6, #16\n\t"
  42670. #else
  42671. "lsl r6, r6, #16\n\t"
  42672. #endif
  42673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42674. "adds r3, r3, r6\n\t"
  42675. #else
  42676. "add r3, r3, r6\n\t"
  42677. #endif
  42678. #ifdef WOLFSSL_KEIL
  42679. "adcs r4, r4, r7\n\t"
  42680. #elif defined(__clang__)
  42681. "adcs r4, r7\n\t"
  42682. #else
  42683. "adc r4, r7\n\t"
  42684. #endif
  42685. #ifdef WOLFSSL_KEIL
  42686. "adcs r5, r5, %[r]\n\t"
  42687. #elif defined(__clang__)
  42688. "adcs r5, %[r]\n\t"
  42689. #else
  42690. "adc r5, %[r]\n\t"
  42691. #endif
  42692. "# A[1] * B[11]\n\t"
  42693. "mov %[a], r9\n\t"
  42694. "mov %[b], r10\n\t"
  42695. "ldr %[a], [%[a], #4]\n\t"
  42696. "ldr %[b], [%[b], #44]\n\t"
  42697. "uxth r6, %[a]\n\t"
  42698. "uxth r7, %[b]\n\t"
  42699. #ifdef WOLFSSL_KEIL
  42700. "muls r7, r6, r7\n\t"
  42701. #elif defined(__clang__)
  42702. "muls r7, r6\n\t"
  42703. #else
  42704. "mul r7, r6\n\t"
  42705. #endif
  42706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42707. "adds r3, r3, r7\n\t"
  42708. #else
  42709. "add r3, r3, r7\n\t"
  42710. #endif
  42711. #ifdef WOLFSSL_KEIL
  42712. "adcs r4, r4, %[r]\n\t"
  42713. #elif defined(__clang__)
  42714. "adcs r4, %[r]\n\t"
  42715. #else
  42716. "adc r4, %[r]\n\t"
  42717. #endif
  42718. #ifdef WOLFSSL_KEIL
  42719. "adcs r5, r5, %[r]\n\t"
  42720. #elif defined(__clang__)
  42721. "adcs r5, %[r]\n\t"
  42722. #else
  42723. "adc r5, %[r]\n\t"
  42724. #endif
  42725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42726. "lsrs r7, %[b], #16\n\t"
  42727. #else
  42728. "lsr r7, %[b], #16\n\t"
  42729. #endif
  42730. #ifdef WOLFSSL_KEIL
  42731. "muls r6, r7, r6\n\t"
  42732. #elif defined(__clang__)
  42733. "muls r6, r7\n\t"
  42734. #else
  42735. "mul r6, r7\n\t"
  42736. #endif
  42737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42738. "lsrs r7, r6, #16\n\t"
  42739. #else
  42740. "lsr r7, r6, #16\n\t"
  42741. #endif
  42742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42743. "lsls r6, r6, #16\n\t"
  42744. #else
  42745. "lsl r6, r6, #16\n\t"
  42746. #endif
  42747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42748. "adds r3, r3, r6\n\t"
  42749. #else
  42750. "add r3, r3, r6\n\t"
  42751. #endif
  42752. #ifdef WOLFSSL_KEIL
  42753. "adcs r4, r4, r7\n\t"
  42754. #elif defined(__clang__)
  42755. "adcs r4, r7\n\t"
  42756. #else
  42757. "adc r4, r7\n\t"
  42758. #endif
  42759. #ifdef WOLFSSL_KEIL
  42760. "adcs r5, r5, %[r]\n\t"
  42761. #elif defined(__clang__)
  42762. "adcs r5, %[r]\n\t"
  42763. #else
  42764. "adc r5, %[r]\n\t"
  42765. #endif
  42766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42767. "lsrs r6, %[a], #16\n\t"
  42768. #else
  42769. "lsr r6, %[a], #16\n\t"
  42770. #endif
  42771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42772. "lsrs r7, %[b], #16\n\t"
  42773. #else
  42774. "lsr r7, %[b], #16\n\t"
  42775. #endif
  42776. #ifdef WOLFSSL_KEIL
  42777. "muls r7, r6, r7\n\t"
  42778. #elif defined(__clang__)
  42779. "muls r7, r6\n\t"
  42780. #else
  42781. "mul r7, r6\n\t"
  42782. #endif
  42783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42784. "adds r4, r4, r7\n\t"
  42785. #else
  42786. "add r4, r4, r7\n\t"
  42787. #endif
  42788. #ifdef WOLFSSL_KEIL
  42789. "adcs r5, r5, %[r]\n\t"
  42790. #elif defined(__clang__)
  42791. "adcs r5, %[r]\n\t"
  42792. #else
  42793. "adc r5, %[r]\n\t"
  42794. #endif
  42795. "uxth r7, %[b]\n\t"
  42796. #ifdef WOLFSSL_KEIL
  42797. "muls r6, r7, r6\n\t"
  42798. #elif defined(__clang__)
  42799. "muls r6, r7\n\t"
  42800. #else
  42801. "mul r6, r7\n\t"
  42802. #endif
  42803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42804. "lsrs r7, r6, #16\n\t"
  42805. #else
  42806. "lsr r7, r6, #16\n\t"
  42807. #endif
  42808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42809. "lsls r6, r6, #16\n\t"
  42810. #else
  42811. "lsl r6, r6, #16\n\t"
  42812. #endif
  42813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42814. "adds r3, r3, r6\n\t"
  42815. #else
  42816. "add r3, r3, r6\n\t"
  42817. #endif
  42818. #ifdef WOLFSSL_KEIL
  42819. "adcs r4, r4, r7\n\t"
  42820. #elif defined(__clang__)
  42821. "adcs r4, r7\n\t"
  42822. #else
  42823. "adc r4, r7\n\t"
  42824. #endif
  42825. #ifdef WOLFSSL_KEIL
  42826. "adcs r5, r5, %[r]\n\t"
  42827. #elif defined(__clang__)
  42828. "adcs r5, %[r]\n\t"
  42829. #else
  42830. "adc r5, %[r]\n\t"
  42831. #endif
  42832. "mov %[r], r8\n\t"
  42833. "str r3, [%[r], #48]\n\t"
  42834. "movs %[r], #0\n\t"
  42835. "# A[2] * B[11]\n\t"
  42836. "movs r3, #0\n\t"
  42837. "mov %[a], r9\n\t"
  42838. "mov %[b], r10\n\t"
  42839. "ldr %[a], [%[a], #8]\n\t"
  42840. "ldr %[b], [%[b], #44]\n\t"
  42841. "uxth r6, %[a]\n\t"
  42842. "uxth r7, %[b]\n\t"
  42843. #ifdef WOLFSSL_KEIL
  42844. "muls r7, r6, r7\n\t"
  42845. #elif defined(__clang__)
  42846. "muls r7, r6\n\t"
  42847. #else
  42848. "mul r7, r6\n\t"
  42849. #endif
  42850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42851. "adds r4, r4, r7\n\t"
  42852. #else
  42853. "add r4, r4, r7\n\t"
  42854. #endif
  42855. #ifdef WOLFSSL_KEIL
  42856. "adcs r5, r5, %[r]\n\t"
  42857. #elif defined(__clang__)
  42858. "adcs r5, %[r]\n\t"
  42859. #else
  42860. "adc r5, %[r]\n\t"
  42861. #endif
  42862. #ifdef WOLFSSL_KEIL
  42863. "adcs r3, r3, %[r]\n\t"
  42864. #elif defined(__clang__)
  42865. "adcs r3, %[r]\n\t"
  42866. #else
  42867. "adc r3, %[r]\n\t"
  42868. #endif
  42869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42870. "lsrs r7, %[b], #16\n\t"
  42871. #else
  42872. "lsr r7, %[b], #16\n\t"
  42873. #endif
  42874. #ifdef WOLFSSL_KEIL
  42875. "muls r6, r7, r6\n\t"
  42876. #elif defined(__clang__)
  42877. "muls r6, r7\n\t"
  42878. #else
  42879. "mul r6, r7\n\t"
  42880. #endif
  42881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42882. "lsrs r7, r6, #16\n\t"
  42883. #else
  42884. "lsr r7, r6, #16\n\t"
  42885. #endif
  42886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42887. "lsls r6, r6, #16\n\t"
  42888. #else
  42889. "lsl r6, r6, #16\n\t"
  42890. #endif
  42891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42892. "adds r4, r4, r6\n\t"
  42893. #else
  42894. "add r4, r4, r6\n\t"
  42895. #endif
  42896. #ifdef WOLFSSL_KEIL
  42897. "adcs r5, r5, r7\n\t"
  42898. #elif defined(__clang__)
  42899. "adcs r5, r7\n\t"
  42900. #else
  42901. "adc r5, r7\n\t"
  42902. #endif
  42903. #ifdef WOLFSSL_KEIL
  42904. "adcs r3, r3, %[r]\n\t"
  42905. #elif defined(__clang__)
  42906. "adcs r3, %[r]\n\t"
  42907. #else
  42908. "adc r3, %[r]\n\t"
  42909. #endif
  42910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42911. "lsrs r6, %[a], #16\n\t"
  42912. #else
  42913. "lsr r6, %[a], #16\n\t"
  42914. #endif
  42915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42916. "lsrs r7, %[b], #16\n\t"
  42917. #else
  42918. "lsr r7, %[b], #16\n\t"
  42919. #endif
  42920. #ifdef WOLFSSL_KEIL
  42921. "muls r7, r6, r7\n\t"
  42922. #elif defined(__clang__)
  42923. "muls r7, r6\n\t"
  42924. #else
  42925. "mul r7, r6\n\t"
  42926. #endif
  42927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42928. "adds r5, r5, r7\n\t"
  42929. #else
  42930. "add r5, r5, r7\n\t"
  42931. #endif
  42932. #ifdef WOLFSSL_KEIL
  42933. "adcs r3, r3, %[r]\n\t"
  42934. #elif defined(__clang__)
  42935. "adcs r3, %[r]\n\t"
  42936. #else
  42937. "adc r3, %[r]\n\t"
  42938. #endif
  42939. "uxth r7, %[b]\n\t"
  42940. #ifdef WOLFSSL_KEIL
  42941. "muls r6, r7, r6\n\t"
  42942. #elif defined(__clang__)
  42943. "muls r6, r7\n\t"
  42944. #else
  42945. "mul r6, r7\n\t"
  42946. #endif
  42947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42948. "lsrs r7, r6, #16\n\t"
  42949. #else
  42950. "lsr r7, r6, #16\n\t"
  42951. #endif
  42952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42953. "lsls r6, r6, #16\n\t"
  42954. #else
  42955. "lsl r6, r6, #16\n\t"
  42956. #endif
  42957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42958. "adds r4, r4, r6\n\t"
  42959. #else
  42960. "add r4, r4, r6\n\t"
  42961. #endif
  42962. #ifdef WOLFSSL_KEIL
  42963. "adcs r5, r5, r7\n\t"
  42964. #elif defined(__clang__)
  42965. "adcs r5, r7\n\t"
  42966. #else
  42967. "adc r5, r7\n\t"
  42968. #endif
  42969. #ifdef WOLFSSL_KEIL
  42970. "adcs r3, r3, %[r]\n\t"
  42971. #elif defined(__clang__)
  42972. "adcs r3, %[r]\n\t"
  42973. #else
  42974. "adc r3, %[r]\n\t"
  42975. #endif
  42976. "# A[3] * B[10]\n\t"
  42977. "mov %[a], r9\n\t"
  42978. "mov %[b], r10\n\t"
  42979. "ldr %[a], [%[a], #12]\n\t"
  42980. "ldr %[b], [%[b], #40]\n\t"
  42981. "uxth r6, %[a]\n\t"
  42982. "uxth r7, %[b]\n\t"
  42983. #ifdef WOLFSSL_KEIL
  42984. "muls r7, r6, r7\n\t"
  42985. #elif defined(__clang__)
  42986. "muls r7, r6\n\t"
  42987. #else
  42988. "mul r7, r6\n\t"
  42989. #endif
  42990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42991. "adds r4, r4, r7\n\t"
  42992. #else
  42993. "add r4, r4, r7\n\t"
  42994. #endif
  42995. #ifdef WOLFSSL_KEIL
  42996. "adcs r5, r5, %[r]\n\t"
  42997. #elif defined(__clang__)
  42998. "adcs r5, %[r]\n\t"
  42999. #else
  43000. "adc r5, %[r]\n\t"
  43001. #endif
  43002. #ifdef WOLFSSL_KEIL
  43003. "adcs r3, r3, %[r]\n\t"
  43004. #elif defined(__clang__)
  43005. "adcs r3, %[r]\n\t"
  43006. #else
  43007. "adc r3, %[r]\n\t"
  43008. #endif
  43009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43010. "lsrs r7, %[b], #16\n\t"
  43011. #else
  43012. "lsr r7, %[b], #16\n\t"
  43013. #endif
  43014. #ifdef WOLFSSL_KEIL
  43015. "muls r6, r7, r6\n\t"
  43016. #elif defined(__clang__)
  43017. "muls r6, r7\n\t"
  43018. #else
  43019. "mul r6, r7\n\t"
  43020. #endif
  43021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43022. "lsrs r7, r6, #16\n\t"
  43023. #else
  43024. "lsr r7, r6, #16\n\t"
  43025. #endif
  43026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43027. "lsls r6, r6, #16\n\t"
  43028. #else
  43029. "lsl r6, r6, #16\n\t"
  43030. #endif
  43031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43032. "adds r4, r4, r6\n\t"
  43033. #else
  43034. "add r4, r4, r6\n\t"
  43035. #endif
  43036. #ifdef WOLFSSL_KEIL
  43037. "adcs r5, r5, r7\n\t"
  43038. #elif defined(__clang__)
  43039. "adcs r5, r7\n\t"
  43040. #else
  43041. "adc r5, r7\n\t"
  43042. #endif
  43043. #ifdef WOLFSSL_KEIL
  43044. "adcs r3, r3, %[r]\n\t"
  43045. #elif defined(__clang__)
  43046. "adcs r3, %[r]\n\t"
  43047. #else
  43048. "adc r3, %[r]\n\t"
  43049. #endif
  43050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43051. "lsrs r6, %[a], #16\n\t"
  43052. #else
  43053. "lsr r6, %[a], #16\n\t"
  43054. #endif
  43055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43056. "lsrs r7, %[b], #16\n\t"
  43057. #else
  43058. "lsr r7, %[b], #16\n\t"
  43059. #endif
  43060. #ifdef WOLFSSL_KEIL
  43061. "muls r7, r6, r7\n\t"
  43062. #elif defined(__clang__)
  43063. "muls r7, r6\n\t"
  43064. #else
  43065. "mul r7, r6\n\t"
  43066. #endif
  43067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43068. "adds r5, r5, r7\n\t"
  43069. #else
  43070. "add r5, r5, r7\n\t"
  43071. #endif
  43072. #ifdef WOLFSSL_KEIL
  43073. "adcs r3, r3, %[r]\n\t"
  43074. #elif defined(__clang__)
  43075. "adcs r3, %[r]\n\t"
  43076. #else
  43077. "adc r3, %[r]\n\t"
  43078. #endif
  43079. "uxth r7, %[b]\n\t"
  43080. #ifdef WOLFSSL_KEIL
  43081. "muls r6, r7, r6\n\t"
  43082. #elif defined(__clang__)
  43083. "muls r6, r7\n\t"
  43084. #else
  43085. "mul r6, r7\n\t"
  43086. #endif
  43087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43088. "lsrs r7, r6, #16\n\t"
  43089. #else
  43090. "lsr r7, r6, #16\n\t"
  43091. #endif
  43092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43093. "lsls r6, r6, #16\n\t"
  43094. #else
  43095. "lsl r6, r6, #16\n\t"
  43096. #endif
  43097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43098. "adds r4, r4, r6\n\t"
  43099. #else
  43100. "add r4, r4, r6\n\t"
  43101. #endif
  43102. #ifdef WOLFSSL_KEIL
  43103. "adcs r5, r5, r7\n\t"
  43104. #elif defined(__clang__)
  43105. "adcs r5, r7\n\t"
  43106. #else
  43107. "adc r5, r7\n\t"
  43108. #endif
  43109. #ifdef WOLFSSL_KEIL
  43110. "adcs r3, r3, %[r]\n\t"
  43111. #elif defined(__clang__)
  43112. "adcs r3, %[r]\n\t"
  43113. #else
  43114. "adc r3, %[r]\n\t"
  43115. #endif
  43116. "# A[4] * B[9]\n\t"
  43117. "mov %[a], r9\n\t"
  43118. "mov %[b], r10\n\t"
  43119. "ldr %[a], [%[a], #16]\n\t"
  43120. "ldr %[b], [%[b], #36]\n\t"
  43121. "uxth r6, %[a]\n\t"
  43122. "uxth r7, %[b]\n\t"
  43123. #ifdef WOLFSSL_KEIL
  43124. "muls r7, r6, r7\n\t"
  43125. #elif defined(__clang__)
  43126. "muls r7, r6\n\t"
  43127. #else
  43128. "mul r7, r6\n\t"
  43129. #endif
  43130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43131. "adds r4, r4, r7\n\t"
  43132. #else
  43133. "add r4, r4, r7\n\t"
  43134. #endif
  43135. #ifdef WOLFSSL_KEIL
  43136. "adcs r5, r5, %[r]\n\t"
  43137. #elif defined(__clang__)
  43138. "adcs r5, %[r]\n\t"
  43139. #else
  43140. "adc r5, %[r]\n\t"
  43141. #endif
  43142. #ifdef WOLFSSL_KEIL
  43143. "adcs r3, r3, %[r]\n\t"
  43144. #elif defined(__clang__)
  43145. "adcs r3, %[r]\n\t"
  43146. #else
  43147. "adc r3, %[r]\n\t"
  43148. #endif
  43149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43150. "lsrs r7, %[b], #16\n\t"
  43151. #else
  43152. "lsr r7, %[b], #16\n\t"
  43153. #endif
  43154. #ifdef WOLFSSL_KEIL
  43155. "muls r6, r7, r6\n\t"
  43156. #elif defined(__clang__)
  43157. "muls r6, r7\n\t"
  43158. #else
  43159. "mul r6, r7\n\t"
  43160. #endif
  43161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43162. "lsrs r7, r6, #16\n\t"
  43163. #else
  43164. "lsr r7, r6, #16\n\t"
  43165. #endif
  43166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43167. "lsls r6, r6, #16\n\t"
  43168. #else
  43169. "lsl r6, r6, #16\n\t"
  43170. #endif
  43171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43172. "adds r4, r4, r6\n\t"
  43173. #else
  43174. "add r4, r4, r6\n\t"
  43175. #endif
  43176. #ifdef WOLFSSL_KEIL
  43177. "adcs r5, r5, r7\n\t"
  43178. #elif defined(__clang__)
  43179. "adcs r5, r7\n\t"
  43180. #else
  43181. "adc r5, r7\n\t"
  43182. #endif
  43183. #ifdef WOLFSSL_KEIL
  43184. "adcs r3, r3, %[r]\n\t"
  43185. #elif defined(__clang__)
  43186. "adcs r3, %[r]\n\t"
  43187. #else
  43188. "adc r3, %[r]\n\t"
  43189. #endif
  43190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43191. "lsrs r6, %[a], #16\n\t"
  43192. #else
  43193. "lsr r6, %[a], #16\n\t"
  43194. #endif
  43195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43196. "lsrs r7, %[b], #16\n\t"
  43197. #else
  43198. "lsr r7, %[b], #16\n\t"
  43199. #endif
  43200. #ifdef WOLFSSL_KEIL
  43201. "muls r7, r6, r7\n\t"
  43202. #elif defined(__clang__)
  43203. "muls r7, r6\n\t"
  43204. #else
  43205. "mul r7, r6\n\t"
  43206. #endif
  43207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43208. "adds r5, r5, r7\n\t"
  43209. #else
  43210. "add r5, r5, r7\n\t"
  43211. #endif
  43212. #ifdef WOLFSSL_KEIL
  43213. "adcs r3, r3, %[r]\n\t"
  43214. #elif defined(__clang__)
  43215. "adcs r3, %[r]\n\t"
  43216. #else
  43217. "adc r3, %[r]\n\t"
  43218. #endif
  43219. "uxth r7, %[b]\n\t"
  43220. #ifdef WOLFSSL_KEIL
  43221. "muls r6, r7, r6\n\t"
  43222. #elif defined(__clang__)
  43223. "muls r6, r7\n\t"
  43224. #else
  43225. "mul r6, r7\n\t"
  43226. #endif
  43227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43228. "lsrs r7, r6, #16\n\t"
  43229. #else
  43230. "lsr r7, r6, #16\n\t"
  43231. #endif
  43232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43233. "lsls r6, r6, #16\n\t"
  43234. #else
  43235. "lsl r6, r6, #16\n\t"
  43236. #endif
  43237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43238. "adds r4, r4, r6\n\t"
  43239. #else
  43240. "add r4, r4, r6\n\t"
  43241. #endif
  43242. #ifdef WOLFSSL_KEIL
  43243. "adcs r5, r5, r7\n\t"
  43244. #elif defined(__clang__)
  43245. "adcs r5, r7\n\t"
  43246. #else
  43247. "adc r5, r7\n\t"
  43248. #endif
  43249. #ifdef WOLFSSL_KEIL
  43250. "adcs r3, r3, %[r]\n\t"
  43251. #elif defined(__clang__)
  43252. "adcs r3, %[r]\n\t"
  43253. #else
  43254. "adc r3, %[r]\n\t"
  43255. #endif
  43256. "# A[5] * B[8]\n\t"
  43257. "mov %[a], r9\n\t"
  43258. "mov %[b], r10\n\t"
  43259. "ldr %[a], [%[a], #20]\n\t"
  43260. "ldr %[b], [%[b], #32]\n\t"
  43261. "uxth r6, %[a]\n\t"
  43262. "uxth r7, %[b]\n\t"
  43263. #ifdef WOLFSSL_KEIL
  43264. "muls r7, r6, r7\n\t"
  43265. #elif defined(__clang__)
  43266. "muls r7, r6\n\t"
  43267. #else
  43268. "mul r7, r6\n\t"
  43269. #endif
  43270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43271. "adds r4, r4, r7\n\t"
  43272. #else
  43273. "add r4, r4, r7\n\t"
  43274. #endif
  43275. #ifdef WOLFSSL_KEIL
  43276. "adcs r5, r5, %[r]\n\t"
  43277. #elif defined(__clang__)
  43278. "adcs r5, %[r]\n\t"
  43279. #else
  43280. "adc r5, %[r]\n\t"
  43281. #endif
  43282. #ifdef WOLFSSL_KEIL
  43283. "adcs r3, r3, %[r]\n\t"
  43284. #elif defined(__clang__)
  43285. "adcs r3, %[r]\n\t"
  43286. #else
  43287. "adc r3, %[r]\n\t"
  43288. #endif
  43289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43290. "lsrs r7, %[b], #16\n\t"
  43291. #else
  43292. "lsr r7, %[b], #16\n\t"
  43293. #endif
  43294. #ifdef WOLFSSL_KEIL
  43295. "muls r6, r7, r6\n\t"
  43296. #elif defined(__clang__)
  43297. "muls r6, r7\n\t"
  43298. #else
  43299. "mul r6, r7\n\t"
  43300. #endif
  43301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43302. "lsrs r7, r6, #16\n\t"
  43303. #else
  43304. "lsr r7, r6, #16\n\t"
  43305. #endif
  43306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43307. "lsls r6, r6, #16\n\t"
  43308. #else
  43309. "lsl r6, r6, #16\n\t"
  43310. #endif
  43311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43312. "adds r4, r4, r6\n\t"
  43313. #else
  43314. "add r4, r4, r6\n\t"
  43315. #endif
  43316. #ifdef WOLFSSL_KEIL
  43317. "adcs r5, r5, r7\n\t"
  43318. #elif defined(__clang__)
  43319. "adcs r5, r7\n\t"
  43320. #else
  43321. "adc r5, r7\n\t"
  43322. #endif
  43323. #ifdef WOLFSSL_KEIL
  43324. "adcs r3, r3, %[r]\n\t"
  43325. #elif defined(__clang__)
  43326. "adcs r3, %[r]\n\t"
  43327. #else
  43328. "adc r3, %[r]\n\t"
  43329. #endif
  43330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43331. "lsrs r6, %[a], #16\n\t"
  43332. #else
  43333. "lsr r6, %[a], #16\n\t"
  43334. #endif
  43335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43336. "lsrs r7, %[b], #16\n\t"
  43337. #else
  43338. "lsr r7, %[b], #16\n\t"
  43339. #endif
  43340. #ifdef WOLFSSL_KEIL
  43341. "muls r7, r6, r7\n\t"
  43342. #elif defined(__clang__)
  43343. "muls r7, r6\n\t"
  43344. #else
  43345. "mul r7, r6\n\t"
  43346. #endif
  43347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43348. "adds r5, r5, r7\n\t"
  43349. #else
  43350. "add r5, r5, r7\n\t"
  43351. #endif
  43352. #ifdef WOLFSSL_KEIL
  43353. "adcs r3, r3, %[r]\n\t"
  43354. #elif defined(__clang__)
  43355. "adcs r3, %[r]\n\t"
  43356. #else
  43357. "adc r3, %[r]\n\t"
  43358. #endif
  43359. "uxth r7, %[b]\n\t"
  43360. #ifdef WOLFSSL_KEIL
  43361. "muls r6, r7, r6\n\t"
  43362. #elif defined(__clang__)
  43363. "muls r6, r7\n\t"
  43364. #else
  43365. "mul r6, r7\n\t"
  43366. #endif
  43367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43368. "lsrs r7, r6, #16\n\t"
  43369. #else
  43370. "lsr r7, r6, #16\n\t"
  43371. #endif
  43372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43373. "lsls r6, r6, #16\n\t"
  43374. #else
  43375. "lsl r6, r6, #16\n\t"
  43376. #endif
  43377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43378. "adds r4, r4, r6\n\t"
  43379. #else
  43380. "add r4, r4, r6\n\t"
  43381. #endif
  43382. #ifdef WOLFSSL_KEIL
  43383. "adcs r5, r5, r7\n\t"
  43384. #elif defined(__clang__)
  43385. "adcs r5, r7\n\t"
  43386. #else
  43387. "adc r5, r7\n\t"
  43388. #endif
  43389. #ifdef WOLFSSL_KEIL
  43390. "adcs r3, r3, %[r]\n\t"
  43391. #elif defined(__clang__)
  43392. "adcs r3, %[r]\n\t"
  43393. #else
  43394. "adc r3, %[r]\n\t"
  43395. #endif
  43396. "# A[6] * B[7]\n\t"
  43397. "mov %[a], r9\n\t"
  43398. "mov %[b], r10\n\t"
  43399. "ldr %[a], [%[a], #24]\n\t"
  43400. "ldr %[b], [%[b], #28]\n\t"
  43401. "uxth r6, %[a]\n\t"
  43402. "uxth r7, %[b]\n\t"
  43403. #ifdef WOLFSSL_KEIL
  43404. "muls r7, r6, r7\n\t"
  43405. #elif defined(__clang__)
  43406. "muls r7, r6\n\t"
  43407. #else
  43408. "mul r7, r6\n\t"
  43409. #endif
  43410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43411. "adds r4, r4, r7\n\t"
  43412. #else
  43413. "add r4, r4, r7\n\t"
  43414. #endif
  43415. #ifdef WOLFSSL_KEIL
  43416. "adcs r5, r5, %[r]\n\t"
  43417. #elif defined(__clang__)
  43418. "adcs r5, %[r]\n\t"
  43419. #else
  43420. "adc r5, %[r]\n\t"
  43421. #endif
  43422. #ifdef WOLFSSL_KEIL
  43423. "adcs r3, r3, %[r]\n\t"
  43424. #elif defined(__clang__)
  43425. "adcs r3, %[r]\n\t"
  43426. #else
  43427. "adc r3, %[r]\n\t"
  43428. #endif
  43429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43430. "lsrs r7, %[b], #16\n\t"
  43431. #else
  43432. "lsr r7, %[b], #16\n\t"
  43433. #endif
  43434. #ifdef WOLFSSL_KEIL
  43435. "muls r6, r7, r6\n\t"
  43436. #elif defined(__clang__)
  43437. "muls r6, r7\n\t"
  43438. #else
  43439. "mul r6, r7\n\t"
  43440. #endif
  43441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43442. "lsrs r7, r6, #16\n\t"
  43443. #else
  43444. "lsr r7, r6, #16\n\t"
  43445. #endif
  43446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43447. "lsls r6, r6, #16\n\t"
  43448. #else
  43449. "lsl r6, r6, #16\n\t"
  43450. #endif
  43451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43452. "adds r4, r4, r6\n\t"
  43453. #else
  43454. "add r4, r4, r6\n\t"
  43455. #endif
  43456. #ifdef WOLFSSL_KEIL
  43457. "adcs r5, r5, r7\n\t"
  43458. #elif defined(__clang__)
  43459. "adcs r5, r7\n\t"
  43460. #else
  43461. "adc r5, r7\n\t"
  43462. #endif
  43463. #ifdef WOLFSSL_KEIL
  43464. "adcs r3, r3, %[r]\n\t"
  43465. #elif defined(__clang__)
  43466. "adcs r3, %[r]\n\t"
  43467. #else
  43468. "adc r3, %[r]\n\t"
  43469. #endif
  43470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43471. "lsrs r6, %[a], #16\n\t"
  43472. #else
  43473. "lsr r6, %[a], #16\n\t"
  43474. #endif
  43475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43476. "lsrs r7, %[b], #16\n\t"
  43477. #else
  43478. "lsr r7, %[b], #16\n\t"
  43479. #endif
  43480. #ifdef WOLFSSL_KEIL
  43481. "muls r7, r6, r7\n\t"
  43482. #elif defined(__clang__)
  43483. "muls r7, r6\n\t"
  43484. #else
  43485. "mul r7, r6\n\t"
  43486. #endif
  43487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43488. "adds r5, r5, r7\n\t"
  43489. #else
  43490. "add r5, r5, r7\n\t"
  43491. #endif
  43492. #ifdef WOLFSSL_KEIL
  43493. "adcs r3, r3, %[r]\n\t"
  43494. #elif defined(__clang__)
  43495. "adcs r3, %[r]\n\t"
  43496. #else
  43497. "adc r3, %[r]\n\t"
  43498. #endif
  43499. "uxth r7, %[b]\n\t"
  43500. #ifdef WOLFSSL_KEIL
  43501. "muls r6, r7, r6\n\t"
  43502. #elif defined(__clang__)
  43503. "muls r6, r7\n\t"
  43504. #else
  43505. "mul r6, r7\n\t"
  43506. #endif
  43507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43508. "lsrs r7, r6, #16\n\t"
  43509. #else
  43510. "lsr r7, r6, #16\n\t"
  43511. #endif
  43512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43513. "lsls r6, r6, #16\n\t"
  43514. #else
  43515. "lsl r6, r6, #16\n\t"
  43516. #endif
  43517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43518. "adds r4, r4, r6\n\t"
  43519. #else
  43520. "add r4, r4, r6\n\t"
  43521. #endif
  43522. #ifdef WOLFSSL_KEIL
  43523. "adcs r5, r5, r7\n\t"
  43524. #elif defined(__clang__)
  43525. "adcs r5, r7\n\t"
  43526. #else
  43527. "adc r5, r7\n\t"
  43528. #endif
  43529. #ifdef WOLFSSL_KEIL
  43530. "adcs r3, r3, %[r]\n\t"
  43531. #elif defined(__clang__)
  43532. "adcs r3, %[r]\n\t"
  43533. #else
  43534. "adc r3, %[r]\n\t"
  43535. #endif
  43536. "# A[7] * B[6]\n\t"
  43537. "mov %[a], r9\n\t"
  43538. "mov %[b], r10\n\t"
  43539. "ldr %[a], [%[a], #28]\n\t"
  43540. "ldr %[b], [%[b], #24]\n\t"
  43541. "uxth r6, %[a]\n\t"
  43542. "uxth r7, %[b]\n\t"
  43543. #ifdef WOLFSSL_KEIL
  43544. "muls r7, r6, r7\n\t"
  43545. #elif defined(__clang__)
  43546. "muls r7, r6\n\t"
  43547. #else
  43548. "mul r7, r6\n\t"
  43549. #endif
  43550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43551. "adds r4, r4, r7\n\t"
  43552. #else
  43553. "add r4, r4, r7\n\t"
  43554. #endif
  43555. #ifdef WOLFSSL_KEIL
  43556. "adcs r5, r5, %[r]\n\t"
  43557. #elif defined(__clang__)
  43558. "adcs r5, %[r]\n\t"
  43559. #else
  43560. "adc r5, %[r]\n\t"
  43561. #endif
  43562. #ifdef WOLFSSL_KEIL
  43563. "adcs r3, r3, %[r]\n\t"
  43564. #elif defined(__clang__)
  43565. "adcs r3, %[r]\n\t"
  43566. #else
  43567. "adc r3, %[r]\n\t"
  43568. #endif
  43569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43570. "lsrs r7, %[b], #16\n\t"
  43571. #else
  43572. "lsr r7, %[b], #16\n\t"
  43573. #endif
  43574. #ifdef WOLFSSL_KEIL
  43575. "muls r6, r7, r6\n\t"
  43576. #elif defined(__clang__)
  43577. "muls r6, r7\n\t"
  43578. #else
  43579. "mul r6, r7\n\t"
  43580. #endif
  43581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43582. "lsrs r7, r6, #16\n\t"
  43583. #else
  43584. "lsr r7, r6, #16\n\t"
  43585. #endif
  43586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43587. "lsls r6, r6, #16\n\t"
  43588. #else
  43589. "lsl r6, r6, #16\n\t"
  43590. #endif
  43591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43592. "adds r4, r4, r6\n\t"
  43593. #else
  43594. "add r4, r4, r6\n\t"
  43595. #endif
  43596. #ifdef WOLFSSL_KEIL
  43597. "adcs r5, r5, r7\n\t"
  43598. #elif defined(__clang__)
  43599. "adcs r5, r7\n\t"
  43600. #else
  43601. "adc r5, r7\n\t"
  43602. #endif
  43603. #ifdef WOLFSSL_KEIL
  43604. "adcs r3, r3, %[r]\n\t"
  43605. #elif defined(__clang__)
  43606. "adcs r3, %[r]\n\t"
  43607. #else
  43608. "adc r3, %[r]\n\t"
  43609. #endif
  43610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43611. "lsrs r6, %[a], #16\n\t"
  43612. #else
  43613. "lsr r6, %[a], #16\n\t"
  43614. #endif
  43615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43616. "lsrs r7, %[b], #16\n\t"
  43617. #else
  43618. "lsr r7, %[b], #16\n\t"
  43619. #endif
  43620. #ifdef WOLFSSL_KEIL
  43621. "muls r7, r6, r7\n\t"
  43622. #elif defined(__clang__)
  43623. "muls r7, r6\n\t"
  43624. #else
  43625. "mul r7, r6\n\t"
  43626. #endif
  43627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43628. "adds r5, r5, r7\n\t"
  43629. #else
  43630. "add r5, r5, r7\n\t"
  43631. #endif
  43632. #ifdef WOLFSSL_KEIL
  43633. "adcs r3, r3, %[r]\n\t"
  43634. #elif defined(__clang__)
  43635. "adcs r3, %[r]\n\t"
  43636. #else
  43637. "adc r3, %[r]\n\t"
  43638. #endif
  43639. "uxth r7, %[b]\n\t"
  43640. #ifdef WOLFSSL_KEIL
  43641. "muls r6, r7, r6\n\t"
  43642. #elif defined(__clang__)
  43643. "muls r6, r7\n\t"
  43644. #else
  43645. "mul r6, r7\n\t"
  43646. #endif
  43647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43648. "lsrs r7, r6, #16\n\t"
  43649. #else
  43650. "lsr r7, r6, #16\n\t"
  43651. #endif
  43652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43653. "lsls r6, r6, #16\n\t"
  43654. #else
  43655. "lsl r6, r6, #16\n\t"
  43656. #endif
  43657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43658. "adds r4, r4, r6\n\t"
  43659. #else
  43660. "add r4, r4, r6\n\t"
  43661. #endif
  43662. #ifdef WOLFSSL_KEIL
  43663. "adcs r5, r5, r7\n\t"
  43664. #elif defined(__clang__)
  43665. "adcs r5, r7\n\t"
  43666. #else
  43667. "adc r5, r7\n\t"
  43668. #endif
  43669. #ifdef WOLFSSL_KEIL
  43670. "adcs r3, r3, %[r]\n\t"
  43671. #elif defined(__clang__)
  43672. "adcs r3, %[r]\n\t"
  43673. #else
  43674. "adc r3, %[r]\n\t"
  43675. #endif
  43676. "# A[8] * B[5]\n\t"
  43677. "mov %[a], r9\n\t"
  43678. "mov %[b], r10\n\t"
  43679. "ldr %[a], [%[a], #32]\n\t"
  43680. "ldr %[b], [%[b], #20]\n\t"
  43681. "uxth r6, %[a]\n\t"
  43682. "uxth r7, %[b]\n\t"
  43683. #ifdef WOLFSSL_KEIL
  43684. "muls r7, r6, r7\n\t"
  43685. #elif defined(__clang__)
  43686. "muls r7, r6\n\t"
  43687. #else
  43688. "mul r7, r6\n\t"
  43689. #endif
  43690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43691. "adds r4, r4, r7\n\t"
  43692. #else
  43693. "add r4, r4, r7\n\t"
  43694. #endif
  43695. #ifdef WOLFSSL_KEIL
  43696. "adcs r5, r5, %[r]\n\t"
  43697. #elif defined(__clang__)
  43698. "adcs r5, %[r]\n\t"
  43699. #else
  43700. "adc r5, %[r]\n\t"
  43701. #endif
  43702. #ifdef WOLFSSL_KEIL
  43703. "adcs r3, r3, %[r]\n\t"
  43704. #elif defined(__clang__)
  43705. "adcs r3, %[r]\n\t"
  43706. #else
  43707. "adc r3, %[r]\n\t"
  43708. #endif
  43709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43710. "lsrs r7, %[b], #16\n\t"
  43711. #else
  43712. "lsr r7, %[b], #16\n\t"
  43713. #endif
  43714. #ifdef WOLFSSL_KEIL
  43715. "muls r6, r7, r6\n\t"
  43716. #elif defined(__clang__)
  43717. "muls r6, r7\n\t"
  43718. #else
  43719. "mul r6, r7\n\t"
  43720. #endif
  43721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43722. "lsrs r7, r6, #16\n\t"
  43723. #else
  43724. "lsr r7, r6, #16\n\t"
  43725. #endif
  43726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43727. "lsls r6, r6, #16\n\t"
  43728. #else
  43729. "lsl r6, r6, #16\n\t"
  43730. #endif
  43731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43732. "adds r4, r4, r6\n\t"
  43733. #else
  43734. "add r4, r4, r6\n\t"
  43735. #endif
  43736. #ifdef WOLFSSL_KEIL
  43737. "adcs r5, r5, r7\n\t"
  43738. #elif defined(__clang__)
  43739. "adcs r5, r7\n\t"
  43740. #else
  43741. "adc r5, r7\n\t"
  43742. #endif
  43743. #ifdef WOLFSSL_KEIL
  43744. "adcs r3, r3, %[r]\n\t"
  43745. #elif defined(__clang__)
  43746. "adcs r3, %[r]\n\t"
  43747. #else
  43748. "adc r3, %[r]\n\t"
  43749. #endif
  43750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43751. "lsrs r6, %[a], #16\n\t"
  43752. #else
  43753. "lsr r6, %[a], #16\n\t"
  43754. #endif
  43755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43756. "lsrs r7, %[b], #16\n\t"
  43757. #else
  43758. "lsr r7, %[b], #16\n\t"
  43759. #endif
  43760. #ifdef WOLFSSL_KEIL
  43761. "muls r7, r6, r7\n\t"
  43762. #elif defined(__clang__)
  43763. "muls r7, r6\n\t"
  43764. #else
  43765. "mul r7, r6\n\t"
  43766. #endif
  43767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43768. "adds r5, r5, r7\n\t"
  43769. #else
  43770. "add r5, r5, r7\n\t"
  43771. #endif
  43772. #ifdef WOLFSSL_KEIL
  43773. "adcs r3, r3, %[r]\n\t"
  43774. #elif defined(__clang__)
  43775. "adcs r3, %[r]\n\t"
  43776. #else
  43777. "adc r3, %[r]\n\t"
  43778. #endif
  43779. "uxth r7, %[b]\n\t"
  43780. #ifdef WOLFSSL_KEIL
  43781. "muls r6, r7, r6\n\t"
  43782. #elif defined(__clang__)
  43783. "muls r6, r7\n\t"
  43784. #else
  43785. "mul r6, r7\n\t"
  43786. #endif
  43787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43788. "lsrs r7, r6, #16\n\t"
  43789. #else
  43790. "lsr r7, r6, #16\n\t"
  43791. #endif
  43792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43793. "lsls r6, r6, #16\n\t"
  43794. #else
  43795. "lsl r6, r6, #16\n\t"
  43796. #endif
  43797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43798. "adds r4, r4, r6\n\t"
  43799. #else
  43800. "add r4, r4, r6\n\t"
  43801. #endif
  43802. #ifdef WOLFSSL_KEIL
  43803. "adcs r5, r5, r7\n\t"
  43804. #elif defined(__clang__)
  43805. "adcs r5, r7\n\t"
  43806. #else
  43807. "adc r5, r7\n\t"
  43808. #endif
  43809. #ifdef WOLFSSL_KEIL
  43810. "adcs r3, r3, %[r]\n\t"
  43811. #elif defined(__clang__)
  43812. "adcs r3, %[r]\n\t"
  43813. #else
  43814. "adc r3, %[r]\n\t"
  43815. #endif
  43816. "# A[9] * B[4]\n\t"
  43817. "mov %[a], r9\n\t"
  43818. "mov %[b], r10\n\t"
  43819. "ldr %[a], [%[a], #36]\n\t"
  43820. "ldr %[b], [%[b], #16]\n\t"
  43821. "uxth r6, %[a]\n\t"
  43822. "uxth r7, %[b]\n\t"
  43823. #ifdef WOLFSSL_KEIL
  43824. "muls r7, r6, r7\n\t"
  43825. #elif defined(__clang__)
  43826. "muls r7, r6\n\t"
  43827. #else
  43828. "mul r7, r6\n\t"
  43829. #endif
  43830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43831. "adds r4, r4, r7\n\t"
  43832. #else
  43833. "add r4, r4, r7\n\t"
  43834. #endif
  43835. #ifdef WOLFSSL_KEIL
  43836. "adcs r5, r5, %[r]\n\t"
  43837. #elif defined(__clang__)
  43838. "adcs r5, %[r]\n\t"
  43839. #else
  43840. "adc r5, %[r]\n\t"
  43841. #endif
  43842. #ifdef WOLFSSL_KEIL
  43843. "adcs r3, r3, %[r]\n\t"
  43844. #elif defined(__clang__)
  43845. "adcs r3, %[r]\n\t"
  43846. #else
  43847. "adc r3, %[r]\n\t"
  43848. #endif
  43849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43850. "lsrs r7, %[b], #16\n\t"
  43851. #else
  43852. "lsr r7, %[b], #16\n\t"
  43853. #endif
  43854. #ifdef WOLFSSL_KEIL
  43855. "muls r6, r7, r6\n\t"
  43856. #elif defined(__clang__)
  43857. "muls r6, r7\n\t"
  43858. #else
  43859. "mul r6, r7\n\t"
  43860. #endif
  43861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43862. "lsrs r7, r6, #16\n\t"
  43863. #else
  43864. "lsr r7, r6, #16\n\t"
  43865. #endif
  43866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43867. "lsls r6, r6, #16\n\t"
  43868. #else
  43869. "lsl r6, r6, #16\n\t"
  43870. #endif
  43871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43872. "adds r4, r4, r6\n\t"
  43873. #else
  43874. "add r4, r4, r6\n\t"
  43875. #endif
  43876. #ifdef WOLFSSL_KEIL
  43877. "adcs r5, r5, r7\n\t"
  43878. #elif defined(__clang__)
  43879. "adcs r5, r7\n\t"
  43880. #else
  43881. "adc r5, r7\n\t"
  43882. #endif
  43883. #ifdef WOLFSSL_KEIL
  43884. "adcs r3, r3, %[r]\n\t"
  43885. #elif defined(__clang__)
  43886. "adcs r3, %[r]\n\t"
  43887. #else
  43888. "adc r3, %[r]\n\t"
  43889. #endif
  43890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43891. "lsrs r6, %[a], #16\n\t"
  43892. #else
  43893. "lsr r6, %[a], #16\n\t"
  43894. #endif
  43895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43896. "lsrs r7, %[b], #16\n\t"
  43897. #else
  43898. "lsr r7, %[b], #16\n\t"
  43899. #endif
  43900. #ifdef WOLFSSL_KEIL
  43901. "muls r7, r6, r7\n\t"
  43902. #elif defined(__clang__)
  43903. "muls r7, r6\n\t"
  43904. #else
  43905. "mul r7, r6\n\t"
  43906. #endif
  43907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43908. "adds r5, r5, r7\n\t"
  43909. #else
  43910. "add r5, r5, r7\n\t"
  43911. #endif
  43912. #ifdef WOLFSSL_KEIL
  43913. "adcs r3, r3, %[r]\n\t"
  43914. #elif defined(__clang__)
  43915. "adcs r3, %[r]\n\t"
  43916. #else
  43917. "adc r3, %[r]\n\t"
  43918. #endif
  43919. "uxth r7, %[b]\n\t"
  43920. #ifdef WOLFSSL_KEIL
  43921. "muls r6, r7, r6\n\t"
  43922. #elif defined(__clang__)
  43923. "muls r6, r7\n\t"
  43924. #else
  43925. "mul r6, r7\n\t"
  43926. #endif
  43927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43928. "lsrs r7, r6, #16\n\t"
  43929. #else
  43930. "lsr r7, r6, #16\n\t"
  43931. #endif
  43932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43933. "lsls r6, r6, #16\n\t"
  43934. #else
  43935. "lsl r6, r6, #16\n\t"
  43936. #endif
  43937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43938. "adds r4, r4, r6\n\t"
  43939. #else
  43940. "add r4, r4, r6\n\t"
  43941. #endif
  43942. #ifdef WOLFSSL_KEIL
  43943. "adcs r5, r5, r7\n\t"
  43944. #elif defined(__clang__)
  43945. "adcs r5, r7\n\t"
  43946. #else
  43947. "adc r5, r7\n\t"
  43948. #endif
  43949. #ifdef WOLFSSL_KEIL
  43950. "adcs r3, r3, %[r]\n\t"
  43951. #elif defined(__clang__)
  43952. "adcs r3, %[r]\n\t"
  43953. #else
  43954. "adc r3, %[r]\n\t"
  43955. #endif
  43956. "# A[10] * B[3]\n\t"
  43957. "mov %[a], r9\n\t"
  43958. "mov %[b], r10\n\t"
  43959. "ldr %[a], [%[a], #40]\n\t"
  43960. "ldr %[b], [%[b], #12]\n\t"
  43961. "uxth r6, %[a]\n\t"
  43962. "uxth r7, %[b]\n\t"
  43963. #ifdef WOLFSSL_KEIL
  43964. "muls r7, r6, r7\n\t"
  43965. #elif defined(__clang__)
  43966. "muls r7, r6\n\t"
  43967. #else
  43968. "mul r7, r6\n\t"
  43969. #endif
  43970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43971. "adds r4, r4, r7\n\t"
  43972. #else
  43973. "add r4, r4, r7\n\t"
  43974. #endif
  43975. #ifdef WOLFSSL_KEIL
  43976. "adcs r5, r5, %[r]\n\t"
  43977. #elif defined(__clang__)
  43978. "adcs r5, %[r]\n\t"
  43979. #else
  43980. "adc r5, %[r]\n\t"
  43981. #endif
  43982. #ifdef WOLFSSL_KEIL
  43983. "adcs r3, r3, %[r]\n\t"
  43984. #elif defined(__clang__)
  43985. "adcs r3, %[r]\n\t"
  43986. #else
  43987. "adc r3, %[r]\n\t"
  43988. #endif
  43989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43990. "lsrs r7, %[b], #16\n\t"
  43991. #else
  43992. "lsr r7, %[b], #16\n\t"
  43993. #endif
  43994. #ifdef WOLFSSL_KEIL
  43995. "muls r6, r7, r6\n\t"
  43996. #elif defined(__clang__)
  43997. "muls r6, r7\n\t"
  43998. #else
  43999. "mul r6, r7\n\t"
  44000. #endif
  44001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44002. "lsrs r7, r6, #16\n\t"
  44003. #else
  44004. "lsr r7, r6, #16\n\t"
  44005. #endif
  44006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44007. "lsls r6, r6, #16\n\t"
  44008. #else
  44009. "lsl r6, r6, #16\n\t"
  44010. #endif
  44011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44012. "adds r4, r4, r6\n\t"
  44013. #else
  44014. "add r4, r4, r6\n\t"
  44015. #endif
  44016. #ifdef WOLFSSL_KEIL
  44017. "adcs r5, r5, r7\n\t"
  44018. #elif defined(__clang__)
  44019. "adcs r5, r7\n\t"
  44020. #else
  44021. "adc r5, r7\n\t"
  44022. #endif
  44023. #ifdef WOLFSSL_KEIL
  44024. "adcs r3, r3, %[r]\n\t"
  44025. #elif defined(__clang__)
  44026. "adcs r3, %[r]\n\t"
  44027. #else
  44028. "adc r3, %[r]\n\t"
  44029. #endif
  44030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44031. "lsrs r6, %[a], #16\n\t"
  44032. #else
  44033. "lsr r6, %[a], #16\n\t"
  44034. #endif
  44035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44036. "lsrs r7, %[b], #16\n\t"
  44037. #else
  44038. "lsr r7, %[b], #16\n\t"
  44039. #endif
  44040. #ifdef WOLFSSL_KEIL
  44041. "muls r7, r6, r7\n\t"
  44042. #elif defined(__clang__)
  44043. "muls r7, r6\n\t"
  44044. #else
  44045. "mul r7, r6\n\t"
  44046. #endif
  44047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44048. "adds r5, r5, r7\n\t"
  44049. #else
  44050. "add r5, r5, r7\n\t"
  44051. #endif
  44052. #ifdef WOLFSSL_KEIL
  44053. "adcs r3, r3, %[r]\n\t"
  44054. #elif defined(__clang__)
  44055. "adcs r3, %[r]\n\t"
  44056. #else
  44057. "adc r3, %[r]\n\t"
  44058. #endif
  44059. "uxth r7, %[b]\n\t"
  44060. #ifdef WOLFSSL_KEIL
  44061. "muls r6, r7, r6\n\t"
  44062. #elif defined(__clang__)
  44063. "muls r6, r7\n\t"
  44064. #else
  44065. "mul r6, r7\n\t"
  44066. #endif
  44067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44068. "lsrs r7, r6, #16\n\t"
  44069. #else
  44070. "lsr r7, r6, #16\n\t"
  44071. #endif
  44072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44073. "lsls r6, r6, #16\n\t"
  44074. #else
  44075. "lsl r6, r6, #16\n\t"
  44076. #endif
  44077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44078. "adds r4, r4, r6\n\t"
  44079. #else
  44080. "add r4, r4, r6\n\t"
  44081. #endif
  44082. #ifdef WOLFSSL_KEIL
  44083. "adcs r5, r5, r7\n\t"
  44084. #elif defined(__clang__)
  44085. "adcs r5, r7\n\t"
  44086. #else
  44087. "adc r5, r7\n\t"
  44088. #endif
  44089. #ifdef WOLFSSL_KEIL
  44090. "adcs r3, r3, %[r]\n\t"
  44091. #elif defined(__clang__)
  44092. "adcs r3, %[r]\n\t"
  44093. #else
  44094. "adc r3, %[r]\n\t"
  44095. #endif
  44096. "# A[11] * B[2]\n\t"
  44097. "mov %[a], r9\n\t"
  44098. "mov %[b], r10\n\t"
  44099. "ldr %[a], [%[a], #44]\n\t"
  44100. "ldr %[b], [%[b], #8]\n\t"
  44101. "uxth r6, %[a]\n\t"
  44102. "uxth r7, %[b]\n\t"
  44103. #ifdef WOLFSSL_KEIL
  44104. "muls r7, r6, r7\n\t"
  44105. #elif defined(__clang__)
  44106. "muls r7, r6\n\t"
  44107. #else
  44108. "mul r7, r6\n\t"
  44109. #endif
  44110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44111. "adds r4, r4, r7\n\t"
  44112. #else
  44113. "add r4, r4, r7\n\t"
  44114. #endif
  44115. #ifdef WOLFSSL_KEIL
  44116. "adcs r5, r5, %[r]\n\t"
  44117. #elif defined(__clang__)
  44118. "adcs r5, %[r]\n\t"
  44119. #else
  44120. "adc r5, %[r]\n\t"
  44121. #endif
  44122. #ifdef WOLFSSL_KEIL
  44123. "adcs r3, r3, %[r]\n\t"
  44124. #elif defined(__clang__)
  44125. "adcs r3, %[r]\n\t"
  44126. #else
  44127. "adc r3, %[r]\n\t"
  44128. #endif
  44129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44130. "lsrs r7, %[b], #16\n\t"
  44131. #else
  44132. "lsr r7, %[b], #16\n\t"
  44133. #endif
  44134. #ifdef WOLFSSL_KEIL
  44135. "muls r6, r7, r6\n\t"
  44136. #elif defined(__clang__)
  44137. "muls r6, r7\n\t"
  44138. #else
  44139. "mul r6, r7\n\t"
  44140. #endif
  44141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44142. "lsrs r7, r6, #16\n\t"
  44143. #else
  44144. "lsr r7, r6, #16\n\t"
  44145. #endif
  44146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44147. "lsls r6, r6, #16\n\t"
  44148. #else
  44149. "lsl r6, r6, #16\n\t"
  44150. #endif
  44151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44152. "adds r4, r4, r6\n\t"
  44153. #else
  44154. "add r4, r4, r6\n\t"
  44155. #endif
  44156. #ifdef WOLFSSL_KEIL
  44157. "adcs r5, r5, r7\n\t"
  44158. #elif defined(__clang__)
  44159. "adcs r5, r7\n\t"
  44160. #else
  44161. "adc r5, r7\n\t"
  44162. #endif
  44163. #ifdef WOLFSSL_KEIL
  44164. "adcs r3, r3, %[r]\n\t"
  44165. #elif defined(__clang__)
  44166. "adcs r3, %[r]\n\t"
  44167. #else
  44168. "adc r3, %[r]\n\t"
  44169. #endif
  44170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44171. "lsrs r6, %[a], #16\n\t"
  44172. #else
  44173. "lsr r6, %[a], #16\n\t"
  44174. #endif
  44175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44176. "lsrs r7, %[b], #16\n\t"
  44177. #else
  44178. "lsr r7, %[b], #16\n\t"
  44179. #endif
  44180. #ifdef WOLFSSL_KEIL
  44181. "muls r7, r6, r7\n\t"
  44182. #elif defined(__clang__)
  44183. "muls r7, r6\n\t"
  44184. #else
  44185. "mul r7, r6\n\t"
  44186. #endif
  44187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44188. "adds r5, r5, r7\n\t"
  44189. #else
  44190. "add r5, r5, r7\n\t"
  44191. #endif
  44192. #ifdef WOLFSSL_KEIL
  44193. "adcs r3, r3, %[r]\n\t"
  44194. #elif defined(__clang__)
  44195. "adcs r3, %[r]\n\t"
  44196. #else
  44197. "adc r3, %[r]\n\t"
  44198. #endif
  44199. "uxth r7, %[b]\n\t"
  44200. #ifdef WOLFSSL_KEIL
  44201. "muls r6, r7, r6\n\t"
  44202. #elif defined(__clang__)
  44203. "muls r6, r7\n\t"
  44204. #else
  44205. "mul r6, r7\n\t"
  44206. #endif
  44207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44208. "lsrs r7, r6, #16\n\t"
  44209. #else
  44210. "lsr r7, r6, #16\n\t"
  44211. #endif
  44212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44213. "lsls r6, r6, #16\n\t"
  44214. #else
  44215. "lsl r6, r6, #16\n\t"
  44216. #endif
  44217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44218. "adds r4, r4, r6\n\t"
  44219. #else
  44220. "add r4, r4, r6\n\t"
  44221. #endif
  44222. #ifdef WOLFSSL_KEIL
  44223. "adcs r5, r5, r7\n\t"
  44224. #elif defined(__clang__)
  44225. "adcs r5, r7\n\t"
  44226. #else
  44227. "adc r5, r7\n\t"
  44228. #endif
  44229. #ifdef WOLFSSL_KEIL
  44230. "adcs r3, r3, %[r]\n\t"
  44231. #elif defined(__clang__)
  44232. "adcs r3, %[r]\n\t"
  44233. #else
  44234. "adc r3, %[r]\n\t"
  44235. #endif
  44236. "mov %[r], r8\n\t"
  44237. "str r4, [%[r], #52]\n\t"
  44238. "movs %[r], #0\n\t"
  44239. "# A[11] * B[3]\n\t"
  44240. "movs r4, #0\n\t"
  44241. "mov %[a], r9\n\t"
  44242. "mov %[b], r10\n\t"
  44243. "ldr %[a], [%[a], #44]\n\t"
  44244. "ldr %[b], [%[b], #12]\n\t"
  44245. "uxth r6, %[a]\n\t"
  44246. "uxth r7, %[b]\n\t"
  44247. #ifdef WOLFSSL_KEIL
  44248. "muls r7, r6, r7\n\t"
  44249. #elif defined(__clang__)
  44250. "muls r7, r6\n\t"
  44251. #else
  44252. "mul r7, r6\n\t"
  44253. #endif
  44254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44255. "adds r5, r5, r7\n\t"
  44256. #else
  44257. "add r5, r5, r7\n\t"
  44258. #endif
  44259. #ifdef WOLFSSL_KEIL
  44260. "adcs r3, r3, %[r]\n\t"
  44261. #elif defined(__clang__)
  44262. "adcs r3, %[r]\n\t"
  44263. #else
  44264. "adc r3, %[r]\n\t"
  44265. #endif
  44266. #ifdef WOLFSSL_KEIL
  44267. "adcs r4, r4, %[r]\n\t"
  44268. #elif defined(__clang__)
  44269. "adcs r4, %[r]\n\t"
  44270. #else
  44271. "adc r4, %[r]\n\t"
  44272. #endif
  44273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44274. "lsrs r7, %[b], #16\n\t"
  44275. #else
  44276. "lsr r7, %[b], #16\n\t"
  44277. #endif
  44278. #ifdef WOLFSSL_KEIL
  44279. "muls r6, r7, r6\n\t"
  44280. #elif defined(__clang__)
  44281. "muls r6, r7\n\t"
  44282. #else
  44283. "mul r6, r7\n\t"
  44284. #endif
  44285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44286. "lsrs r7, r6, #16\n\t"
  44287. #else
  44288. "lsr r7, r6, #16\n\t"
  44289. #endif
  44290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44291. "lsls r6, r6, #16\n\t"
  44292. #else
  44293. "lsl r6, r6, #16\n\t"
  44294. #endif
  44295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44296. "adds r5, r5, r6\n\t"
  44297. #else
  44298. "add r5, r5, r6\n\t"
  44299. #endif
  44300. #ifdef WOLFSSL_KEIL
  44301. "adcs r3, r3, r7\n\t"
  44302. #elif defined(__clang__)
  44303. "adcs r3, r7\n\t"
  44304. #else
  44305. "adc r3, r7\n\t"
  44306. #endif
  44307. #ifdef WOLFSSL_KEIL
  44308. "adcs r4, r4, %[r]\n\t"
  44309. #elif defined(__clang__)
  44310. "adcs r4, %[r]\n\t"
  44311. #else
  44312. "adc r4, %[r]\n\t"
  44313. #endif
  44314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44315. "lsrs r6, %[a], #16\n\t"
  44316. #else
  44317. "lsr r6, %[a], #16\n\t"
  44318. #endif
  44319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44320. "lsrs r7, %[b], #16\n\t"
  44321. #else
  44322. "lsr r7, %[b], #16\n\t"
  44323. #endif
  44324. #ifdef WOLFSSL_KEIL
  44325. "muls r7, r6, r7\n\t"
  44326. #elif defined(__clang__)
  44327. "muls r7, r6\n\t"
  44328. #else
  44329. "mul r7, r6\n\t"
  44330. #endif
  44331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44332. "adds r3, r3, r7\n\t"
  44333. #else
  44334. "add r3, r3, r7\n\t"
  44335. #endif
  44336. #ifdef WOLFSSL_KEIL
  44337. "adcs r4, r4, %[r]\n\t"
  44338. #elif defined(__clang__)
  44339. "adcs r4, %[r]\n\t"
  44340. #else
  44341. "adc r4, %[r]\n\t"
  44342. #endif
  44343. "uxth r7, %[b]\n\t"
  44344. #ifdef WOLFSSL_KEIL
  44345. "muls r6, r7, r6\n\t"
  44346. #elif defined(__clang__)
  44347. "muls r6, r7\n\t"
  44348. #else
  44349. "mul r6, r7\n\t"
  44350. #endif
  44351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44352. "lsrs r7, r6, #16\n\t"
  44353. #else
  44354. "lsr r7, r6, #16\n\t"
  44355. #endif
  44356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44357. "lsls r6, r6, #16\n\t"
  44358. #else
  44359. "lsl r6, r6, #16\n\t"
  44360. #endif
  44361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44362. "adds r5, r5, r6\n\t"
  44363. #else
  44364. "add r5, r5, r6\n\t"
  44365. #endif
  44366. #ifdef WOLFSSL_KEIL
  44367. "adcs r3, r3, r7\n\t"
  44368. #elif defined(__clang__)
  44369. "adcs r3, r7\n\t"
  44370. #else
  44371. "adc r3, r7\n\t"
  44372. #endif
  44373. #ifdef WOLFSSL_KEIL
  44374. "adcs r4, r4, %[r]\n\t"
  44375. #elif defined(__clang__)
  44376. "adcs r4, %[r]\n\t"
  44377. #else
  44378. "adc r4, %[r]\n\t"
  44379. #endif
  44380. "# A[10] * B[4]\n\t"
  44381. "mov %[a], r9\n\t"
  44382. "mov %[b], r10\n\t"
  44383. "ldr %[a], [%[a], #40]\n\t"
  44384. "ldr %[b], [%[b], #16]\n\t"
  44385. "uxth r6, %[a]\n\t"
  44386. "uxth r7, %[b]\n\t"
  44387. #ifdef WOLFSSL_KEIL
  44388. "muls r7, r6, r7\n\t"
  44389. #elif defined(__clang__)
  44390. "muls r7, r6\n\t"
  44391. #else
  44392. "mul r7, r6\n\t"
  44393. #endif
  44394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44395. "adds r5, r5, r7\n\t"
  44396. #else
  44397. "add r5, r5, r7\n\t"
  44398. #endif
  44399. #ifdef WOLFSSL_KEIL
  44400. "adcs r3, r3, %[r]\n\t"
  44401. #elif defined(__clang__)
  44402. "adcs r3, %[r]\n\t"
  44403. #else
  44404. "adc r3, %[r]\n\t"
  44405. #endif
  44406. #ifdef WOLFSSL_KEIL
  44407. "adcs r4, r4, %[r]\n\t"
  44408. #elif defined(__clang__)
  44409. "adcs r4, %[r]\n\t"
  44410. #else
  44411. "adc r4, %[r]\n\t"
  44412. #endif
  44413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44414. "lsrs r7, %[b], #16\n\t"
  44415. #else
  44416. "lsr r7, %[b], #16\n\t"
  44417. #endif
  44418. #ifdef WOLFSSL_KEIL
  44419. "muls r6, r7, r6\n\t"
  44420. #elif defined(__clang__)
  44421. "muls r6, r7\n\t"
  44422. #else
  44423. "mul r6, r7\n\t"
  44424. #endif
  44425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44426. "lsrs r7, r6, #16\n\t"
  44427. #else
  44428. "lsr r7, r6, #16\n\t"
  44429. #endif
  44430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44431. "lsls r6, r6, #16\n\t"
  44432. #else
  44433. "lsl r6, r6, #16\n\t"
  44434. #endif
  44435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44436. "adds r5, r5, r6\n\t"
  44437. #else
  44438. "add r5, r5, r6\n\t"
  44439. #endif
  44440. #ifdef WOLFSSL_KEIL
  44441. "adcs r3, r3, r7\n\t"
  44442. #elif defined(__clang__)
  44443. "adcs r3, r7\n\t"
  44444. #else
  44445. "adc r3, r7\n\t"
  44446. #endif
  44447. #ifdef WOLFSSL_KEIL
  44448. "adcs r4, r4, %[r]\n\t"
  44449. #elif defined(__clang__)
  44450. "adcs r4, %[r]\n\t"
  44451. #else
  44452. "adc r4, %[r]\n\t"
  44453. #endif
  44454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44455. "lsrs r6, %[a], #16\n\t"
  44456. #else
  44457. "lsr r6, %[a], #16\n\t"
  44458. #endif
  44459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44460. "lsrs r7, %[b], #16\n\t"
  44461. #else
  44462. "lsr r7, %[b], #16\n\t"
  44463. #endif
  44464. #ifdef WOLFSSL_KEIL
  44465. "muls r7, r6, r7\n\t"
  44466. #elif defined(__clang__)
  44467. "muls r7, r6\n\t"
  44468. #else
  44469. "mul r7, r6\n\t"
  44470. #endif
  44471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44472. "adds r3, r3, r7\n\t"
  44473. #else
  44474. "add r3, r3, r7\n\t"
  44475. #endif
  44476. #ifdef WOLFSSL_KEIL
  44477. "adcs r4, r4, %[r]\n\t"
  44478. #elif defined(__clang__)
  44479. "adcs r4, %[r]\n\t"
  44480. #else
  44481. "adc r4, %[r]\n\t"
  44482. #endif
  44483. "uxth r7, %[b]\n\t"
  44484. #ifdef WOLFSSL_KEIL
  44485. "muls r6, r7, r6\n\t"
  44486. #elif defined(__clang__)
  44487. "muls r6, r7\n\t"
  44488. #else
  44489. "mul r6, r7\n\t"
  44490. #endif
  44491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44492. "lsrs r7, r6, #16\n\t"
  44493. #else
  44494. "lsr r7, r6, #16\n\t"
  44495. #endif
  44496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44497. "lsls r6, r6, #16\n\t"
  44498. #else
  44499. "lsl r6, r6, #16\n\t"
  44500. #endif
  44501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44502. "adds r5, r5, r6\n\t"
  44503. #else
  44504. "add r5, r5, r6\n\t"
  44505. #endif
  44506. #ifdef WOLFSSL_KEIL
  44507. "adcs r3, r3, r7\n\t"
  44508. #elif defined(__clang__)
  44509. "adcs r3, r7\n\t"
  44510. #else
  44511. "adc r3, r7\n\t"
  44512. #endif
  44513. #ifdef WOLFSSL_KEIL
  44514. "adcs r4, r4, %[r]\n\t"
  44515. #elif defined(__clang__)
  44516. "adcs r4, %[r]\n\t"
  44517. #else
  44518. "adc r4, %[r]\n\t"
  44519. #endif
  44520. "# A[9] * B[5]\n\t"
  44521. "mov %[a], r9\n\t"
  44522. "mov %[b], r10\n\t"
  44523. "ldr %[a], [%[a], #36]\n\t"
  44524. "ldr %[b], [%[b], #20]\n\t"
  44525. "uxth r6, %[a]\n\t"
  44526. "uxth r7, %[b]\n\t"
  44527. #ifdef WOLFSSL_KEIL
  44528. "muls r7, r6, r7\n\t"
  44529. #elif defined(__clang__)
  44530. "muls r7, r6\n\t"
  44531. #else
  44532. "mul r7, r6\n\t"
  44533. #endif
  44534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44535. "adds r5, r5, r7\n\t"
  44536. #else
  44537. "add r5, r5, r7\n\t"
  44538. #endif
  44539. #ifdef WOLFSSL_KEIL
  44540. "adcs r3, r3, %[r]\n\t"
  44541. #elif defined(__clang__)
  44542. "adcs r3, %[r]\n\t"
  44543. #else
  44544. "adc r3, %[r]\n\t"
  44545. #endif
  44546. #ifdef WOLFSSL_KEIL
  44547. "adcs r4, r4, %[r]\n\t"
  44548. #elif defined(__clang__)
  44549. "adcs r4, %[r]\n\t"
  44550. #else
  44551. "adc r4, %[r]\n\t"
  44552. #endif
  44553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44554. "lsrs r7, %[b], #16\n\t"
  44555. #else
  44556. "lsr r7, %[b], #16\n\t"
  44557. #endif
  44558. #ifdef WOLFSSL_KEIL
  44559. "muls r6, r7, r6\n\t"
  44560. #elif defined(__clang__)
  44561. "muls r6, r7\n\t"
  44562. #else
  44563. "mul r6, r7\n\t"
  44564. #endif
  44565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44566. "lsrs r7, r6, #16\n\t"
  44567. #else
  44568. "lsr r7, r6, #16\n\t"
  44569. #endif
  44570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44571. "lsls r6, r6, #16\n\t"
  44572. #else
  44573. "lsl r6, r6, #16\n\t"
  44574. #endif
  44575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44576. "adds r5, r5, r6\n\t"
  44577. #else
  44578. "add r5, r5, r6\n\t"
  44579. #endif
  44580. #ifdef WOLFSSL_KEIL
  44581. "adcs r3, r3, r7\n\t"
  44582. #elif defined(__clang__)
  44583. "adcs r3, r7\n\t"
  44584. #else
  44585. "adc r3, r7\n\t"
  44586. #endif
  44587. #ifdef WOLFSSL_KEIL
  44588. "adcs r4, r4, %[r]\n\t"
  44589. #elif defined(__clang__)
  44590. "adcs r4, %[r]\n\t"
  44591. #else
  44592. "adc r4, %[r]\n\t"
  44593. #endif
  44594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44595. "lsrs r6, %[a], #16\n\t"
  44596. #else
  44597. "lsr r6, %[a], #16\n\t"
  44598. #endif
  44599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44600. "lsrs r7, %[b], #16\n\t"
  44601. #else
  44602. "lsr r7, %[b], #16\n\t"
  44603. #endif
  44604. #ifdef WOLFSSL_KEIL
  44605. "muls r7, r6, r7\n\t"
  44606. #elif defined(__clang__)
  44607. "muls r7, r6\n\t"
  44608. #else
  44609. "mul r7, r6\n\t"
  44610. #endif
  44611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44612. "adds r3, r3, r7\n\t"
  44613. #else
  44614. "add r3, r3, r7\n\t"
  44615. #endif
  44616. #ifdef WOLFSSL_KEIL
  44617. "adcs r4, r4, %[r]\n\t"
  44618. #elif defined(__clang__)
  44619. "adcs r4, %[r]\n\t"
  44620. #else
  44621. "adc r4, %[r]\n\t"
  44622. #endif
  44623. "uxth r7, %[b]\n\t"
  44624. #ifdef WOLFSSL_KEIL
  44625. "muls r6, r7, r6\n\t"
  44626. #elif defined(__clang__)
  44627. "muls r6, r7\n\t"
  44628. #else
  44629. "mul r6, r7\n\t"
  44630. #endif
  44631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44632. "lsrs r7, r6, #16\n\t"
  44633. #else
  44634. "lsr r7, r6, #16\n\t"
  44635. #endif
  44636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44637. "lsls r6, r6, #16\n\t"
  44638. #else
  44639. "lsl r6, r6, #16\n\t"
  44640. #endif
  44641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44642. "adds r5, r5, r6\n\t"
  44643. #else
  44644. "add r5, r5, r6\n\t"
  44645. #endif
  44646. #ifdef WOLFSSL_KEIL
  44647. "adcs r3, r3, r7\n\t"
  44648. #elif defined(__clang__)
  44649. "adcs r3, r7\n\t"
  44650. #else
  44651. "adc r3, r7\n\t"
  44652. #endif
  44653. #ifdef WOLFSSL_KEIL
  44654. "adcs r4, r4, %[r]\n\t"
  44655. #elif defined(__clang__)
  44656. "adcs r4, %[r]\n\t"
  44657. #else
  44658. "adc r4, %[r]\n\t"
  44659. #endif
  44660. "# A[8] * B[6]\n\t"
  44661. "mov %[a], r9\n\t"
  44662. "mov %[b], r10\n\t"
  44663. "ldr %[a], [%[a], #32]\n\t"
  44664. "ldr %[b], [%[b], #24]\n\t"
  44665. "uxth r6, %[a]\n\t"
  44666. "uxth r7, %[b]\n\t"
  44667. #ifdef WOLFSSL_KEIL
  44668. "muls r7, r6, r7\n\t"
  44669. #elif defined(__clang__)
  44670. "muls r7, r6\n\t"
  44671. #else
  44672. "mul r7, r6\n\t"
  44673. #endif
  44674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44675. "adds r5, r5, r7\n\t"
  44676. #else
  44677. "add r5, r5, r7\n\t"
  44678. #endif
  44679. #ifdef WOLFSSL_KEIL
  44680. "adcs r3, r3, %[r]\n\t"
  44681. #elif defined(__clang__)
  44682. "adcs r3, %[r]\n\t"
  44683. #else
  44684. "adc r3, %[r]\n\t"
  44685. #endif
  44686. #ifdef WOLFSSL_KEIL
  44687. "adcs r4, r4, %[r]\n\t"
  44688. #elif defined(__clang__)
  44689. "adcs r4, %[r]\n\t"
  44690. #else
  44691. "adc r4, %[r]\n\t"
  44692. #endif
  44693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44694. "lsrs r7, %[b], #16\n\t"
  44695. #else
  44696. "lsr r7, %[b], #16\n\t"
  44697. #endif
  44698. #ifdef WOLFSSL_KEIL
  44699. "muls r6, r7, r6\n\t"
  44700. #elif defined(__clang__)
  44701. "muls r6, r7\n\t"
  44702. #else
  44703. "mul r6, r7\n\t"
  44704. #endif
  44705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44706. "lsrs r7, r6, #16\n\t"
  44707. #else
  44708. "lsr r7, r6, #16\n\t"
  44709. #endif
  44710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44711. "lsls r6, r6, #16\n\t"
  44712. #else
  44713. "lsl r6, r6, #16\n\t"
  44714. #endif
  44715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44716. "adds r5, r5, r6\n\t"
  44717. #else
  44718. "add r5, r5, r6\n\t"
  44719. #endif
  44720. #ifdef WOLFSSL_KEIL
  44721. "adcs r3, r3, r7\n\t"
  44722. #elif defined(__clang__)
  44723. "adcs r3, r7\n\t"
  44724. #else
  44725. "adc r3, r7\n\t"
  44726. #endif
  44727. #ifdef WOLFSSL_KEIL
  44728. "adcs r4, r4, %[r]\n\t"
  44729. #elif defined(__clang__)
  44730. "adcs r4, %[r]\n\t"
  44731. #else
  44732. "adc r4, %[r]\n\t"
  44733. #endif
  44734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44735. "lsrs r6, %[a], #16\n\t"
  44736. #else
  44737. "lsr r6, %[a], #16\n\t"
  44738. #endif
  44739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44740. "lsrs r7, %[b], #16\n\t"
  44741. #else
  44742. "lsr r7, %[b], #16\n\t"
  44743. #endif
  44744. #ifdef WOLFSSL_KEIL
  44745. "muls r7, r6, r7\n\t"
  44746. #elif defined(__clang__)
  44747. "muls r7, r6\n\t"
  44748. #else
  44749. "mul r7, r6\n\t"
  44750. #endif
  44751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44752. "adds r3, r3, r7\n\t"
  44753. #else
  44754. "add r3, r3, r7\n\t"
  44755. #endif
  44756. #ifdef WOLFSSL_KEIL
  44757. "adcs r4, r4, %[r]\n\t"
  44758. #elif defined(__clang__)
  44759. "adcs r4, %[r]\n\t"
  44760. #else
  44761. "adc r4, %[r]\n\t"
  44762. #endif
  44763. "uxth r7, %[b]\n\t"
  44764. #ifdef WOLFSSL_KEIL
  44765. "muls r6, r7, r6\n\t"
  44766. #elif defined(__clang__)
  44767. "muls r6, r7\n\t"
  44768. #else
  44769. "mul r6, r7\n\t"
  44770. #endif
  44771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44772. "lsrs r7, r6, #16\n\t"
  44773. #else
  44774. "lsr r7, r6, #16\n\t"
  44775. #endif
  44776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44777. "lsls r6, r6, #16\n\t"
  44778. #else
  44779. "lsl r6, r6, #16\n\t"
  44780. #endif
  44781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44782. "adds r5, r5, r6\n\t"
  44783. #else
  44784. "add r5, r5, r6\n\t"
  44785. #endif
  44786. #ifdef WOLFSSL_KEIL
  44787. "adcs r3, r3, r7\n\t"
  44788. #elif defined(__clang__)
  44789. "adcs r3, r7\n\t"
  44790. #else
  44791. "adc r3, r7\n\t"
  44792. #endif
  44793. #ifdef WOLFSSL_KEIL
  44794. "adcs r4, r4, %[r]\n\t"
  44795. #elif defined(__clang__)
  44796. "adcs r4, %[r]\n\t"
  44797. #else
  44798. "adc r4, %[r]\n\t"
  44799. #endif
  44800. "# A[7] * B[7]\n\t"
  44801. "mov %[a], r9\n\t"
  44802. "mov %[b], r10\n\t"
  44803. "ldr %[a], [%[a], #28]\n\t"
  44804. "ldr %[b], [%[b], #28]\n\t"
  44805. "uxth r6, %[a]\n\t"
  44806. "uxth r7, %[b]\n\t"
  44807. #ifdef WOLFSSL_KEIL
  44808. "muls r7, r6, r7\n\t"
  44809. #elif defined(__clang__)
  44810. "muls r7, r6\n\t"
  44811. #else
  44812. "mul r7, r6\n\t"
  44813. #endif
  44814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44815. "adds r5, r5, r7\n\t"
  44816. #else
  44817. "add r5, r5, r7\n\t"
  44818. #endif
  44819. #ifdef WOLFSSL_KEIL
  44820. "adcs r3, r3, %[r]\n\t"
  44821. #elif defined(__clang__)
  44822. "adcs r3, %[r]\n\t"
  44823. #else
  44824. "adc r3, %[r]\n\t"
  44825. #endif
  44826. #ifdef WOLFSSL_KEIL
  44827. "adcs r4, r4, %[r]\n\t"
  44828. #elif defined(__clang__)
  44829. "adcs r4, %[r]\n\t"
  44830. #else
  44831. "adc r4, %[r]\n\t"
  44832. #endif
  44833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44834. "lsrs r7, %[b], #16\n\t"
  44835. #else
  44836. "lsr r7, %[b], #16\n\t"
  44837. #endif
  44838. #ifdef WOLFSSL_KEIL
  44839. "muls r6, r7, r6\n\t"
  44840. #elif defined(__clang__)
  44841. "muls r6, r7\n\t"
  44842. #else
  44843. "mul r6, r7\n\t"
  44844. #endif
  44845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44846. "lsrs r7, r6, #16\n\t"
  44847. #else
  44848. "lsr r7, r6, #16\n\t"
  44849. #endif
  44850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44851. "lsls r6, r6, #16\n\t"
  44852. #else
  44853. "lsl r6, r6, #16\n\t"
  44854. #endif
  44855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44856. "adds r5, r5, r6\n\t"
  44857. #else
  44858. "add r5, r5, r6\n\t"
  44859. #endif
  44860. #ifdef WOLFSSL_KEIL
  44861. "adcs r3, r3, r7\n\t"
  44862. #elif defined(__clang__)
  44863. "adcs r3, r7\n\t"
  44864. #else
  44865. "adc r3, r7\n\t"
  44866. #endif
  44867. #ifdef WOLFSSL_KEIL
  44868. "adcs r4, r4, %[r]\n\t"
  44869. #elif defined(__clang__)
  44870. "adcs r4, %[r]\n\t"
  44871. #else
  44872. "adc r4, %[r]\n\t"
  44873. #endif
  44874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44875. "lsrs r6, %[a], #16\n\t"
  44876. #else
  44877. "lsr r6, %[a], #16\n\t"
  44878. #endif
  44879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44880. "lsrs r7, %[b], #16\n\t"
  44881. #else
  44882. "lsr r7, %[b], #16\n\t"
  44883. #endif
  44884. #ifdef WOLFSSL_KEIL
  44885. "muls r7, r6, r7\n\t"
  44886. #elif defined(__clang__)
  44887. "muls r7, r6\n\t"
  44888. #else
  44889. "mul r7, r6\n\t"
  44890. #endif
  44891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44892. "adds r3, r3, r7\n\t"
  44893. #else
  44894. "add r3, r3, r7\n\t"
  44895. #endif
  44896. #ifdef WOLFSSL_KEIL
  44897. "adcs r4, r4, %[r]\n\t"
  44898. #elif defined(__clang__)
  44899. "adcs r4, %[r]\n\t"
  44900. #else
  44901. "adc r4, %[r]\n\t"
  44902. #endif
  44903. "uxth r7, %[b]\n\t"
  44904. #ifdef WOLFSSL_KEIL
  44905. "muls r6, r7, r6\n\t"
  44906. #elif defined(__clang__)
  44907. "muls r6, r7\n\t"
  44908. #else
  44909. "mul r6, r7\n\t"
  44910. #endif
  44911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44912. "lsrs r7, r6, #16\n\t"
  44913. #else
  44914. "lsr r7, r6, #16\n\t"
  44915. #endif
  44916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44917. "lsls r6, r6, #16\n\t"
  44918. #else
  44919. "lsl r6, r6, #16\n\t"
  44920. #endif
  44921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44922. "adds r5, r5, r6\n\t"
  44923. #else
  44924. "add r5, r5, r6\n\t"
  44925. #endif
  44926. #ifdef WOLFSSL_KEIL
  44927. "adcs r3, r3, r7\n\t"
  44928. #elif defined(__clang__)
  44929. "adcs r3, r7\n\t"
  44930. #else
  44931. "adc r3, r7\n\t"
  44932. #endif
  44933. #ifdef WOLFSSL_KEIL
  44934. "adcs r4, r4, %[r]\n\t"
  44935. #elif defined(__clang__)
  44936. "adcs r4, %[r]\n\t"
  44937. #else
  44938. "adc r4, %[r]\n\t"
  44939. #endif
  44940. "# A[6] * B[8]\n\t"
  44941. "mov %[a], r9\n\t"
  44942. "mov %[b], r10\n\t"
  44943. "ldr %[a], [%[a], #24]\n\t"
  44944. "ldr %[b], [%[b], #32]\n\t"
  44945. "uxth r6, %[a]\n\t"
  44946. "uxth r7, %[b]\n\t"
  44947. #ifdef WOLFSSL_KEIL
  44948. "muls r7, r6, r7\n\t"
  44949. #elif defined(__clang__)
  44950. "muls r7, r6\n\t"
  44951. #else
  44952. "mul r7, r6\n\t"
  44953. #endif
  44954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44955. "adds r5, r5, r7\n\t"
  44956. #else
  44957. "add r5, r5, r7\n\t"
  44958. #endif
  44959. #ifdef WOLFSSL_KEIL
  44960. "adcs r3, r3, %[r]\n\t"
  44961. #elif defined(__clang__)
  44962. "adcs r3, %[r]\n\t"
  44963. #else
  44964. "adc r3, %[r]\n\t"
  44965. #endif
  44966. #ifdef WOLFSSL_KEIL
  44967. "adcs r4, r4, %[r]\n\t"
  44968. #elif defined(__clang__)
  44969. "adcs r4, %[r]\n\t"
  44970. #else
  44971. "adc r4, %[r]\n\t"
  44972. #endif
  44973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44974. "lsrs r7, %[b], #16\n\t"
  44975. #else
  44976. "lsr r7, %[b], #16\n\t"
  44977. #endif
  44978. #ifdef WOLFSSL_KEIL
  44979. "muls r6, r7, r6\n\t"
  44980. #elif defined(__clang__)
  44981. "muls r6, r7\n\t"
  44982. #else
  44983. "mul r6, r7\n\t"
  44984. #endif
  44985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44986. "lsrs r7, r6, #16\n\t"
  44987. #else
  44988. "lsr r7, r6, #16\n\t"
  44989. #endif
  44990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44991. "lsls r6, r6, #16\n\t"
  44992. #else
  44993. "lsl r6, r6, #16\n\t"
  44994. #endif
  44995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44996. "adds r5, r5, r6\n\t"
  44997. #else
  44998. "add r5, r5, r6\n\t"
  44999. #endif
  45000. #ifdef WOLFSSL_KEIL
  45001. "adcs r3, r3, r7\n\t"
  45002. #elif defined(__clang__)
  45003. "adcs r3, r7\n\t"
  45004. #else
  45005. "adc r3, r7\n\t"
  45006. #endif
  45007. #ifdef WOLFSSL_KEIL
  45008. "adcs r4, r4, %[r]\n\t"
  45009. #elif defined(__clang__)
  45010. "adcs r4, %[r]\n\t"
  45011. #else
  45012. "adc r4, %[r]\n\t"
  45013. #endif
  45014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45015. "lsrs r6, %[a], #16\n\t"
  45016. #else
  45017. "lsr r6, %[a], #16\n\t"
  45018. #endif
  45019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45020. "lsrs r7, %[b], #16\n\t"
  45021. #else
  45022. "lsr r7, %[b], #16\n\t"
  45023. #endif
  45024. #ifdef WOLFSSL_KEIL
  45025. "muls r7, r6, r7\n\t"
  45026. #elif defined(__clang__)
  45027. "muls r7, r6\n\t"
  45028. #else
  45029. "mul r7, r6\n\t"
  45030. #endif
  45031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45032. "adds r3, r3, r7\n\t"
  45033. #else
  45034. "add r3, r3, r7\n\t"
  45035. #endif
  45036. #ifdef WOLFSSL_KEIL
  45037. "adcs r4, r4, %[r]\n\t"
  45038. #elif defined(__clang__)
  45039. "adcs r4, %[r]\n\t"
  45040. #else
  45041. "adc r4, %[r]\n\t"
  45042. #endif
  45043. "uxth r7, %[b]\n\t"
  45044. #ifdef WOLFSSL_KEIL
  45045. "muls r6, r7, r6\n\t"
  45046. #elif defined(__clang__)
  45047. "muls r6, r7\n\t"
  45048. #else
  45049. "mul r6, r7\n\t"
  45050. #endif
  45051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45052. "lsrs r7, r6, #16\n\t"
  45053. #else
  45054. "lsr r7, r6, #16\n\t"
  45055. #endif
  45056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45057. "lsls r6, r6, #16\n\t"
  45058. #else
  45059. "lsl r6, r6, #16\n\t"
  45060. #endif
  45061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45062. "adds r5, r5, r6\n\t"
  45063. #else
  45064. "add r5, r5, r6\n\t"
  45065. #endif
  45066. #ifdef WOLFSSL_KEIL
  45067. "adcs r3, r3, r7\n\t"
  45068. #elif defined(__clang__)
  45069. "adcs r3, r7\n\t"
  45070. #else
  45071. "adc r3, r7\n\t"
  45072. #endif
  45073. #ifdef WOLFSSL_KEIL
  45074. "adcs r4, r4, %[r]\n\t"
  45075. #elif defined(__clang__)
  45076. "adcs r4, %[r]\n\t"
  45077. #else
  45078. "adc r4, %[r]\n\t"
  45079. #endif
  45080. "# A[5] * B[9]\n\t"
  45081. "mov %[a], r9\n\t"
  45082. "mov %[b], r10\n\t"
  45083. "ldr %[a], [%[a], #20]\n\t"
  45084. "ldr %[b], [%[b], #36]\n\t"
  45085. "uxth r6, %[a]\n\t"
  45086. "uxth r7, %[b]\n\t"
  45087. #ifdef WOLFSSL_KEIL
  45088. "muls r7, r6, r7\n\t"
  45089. #elif defined(__clang__)
  45090. "muls r7, r6\n\t"
  45091. #else
  45092. "mul r7, r6\n\t"
  45093. #endif
  45094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45095. "adds r5, r5, r7\n\t"
  45096. #else
  45097. "add r5, r5, r7\n\t"
  45098. #endif
  45099. #ifdef WOLFSSL_KEIL
  45100. "adcs r3, r3, %[r]\n\t"
  45101. #elif defined(__clang__)
  45102. "adcs r3, %[r]\n\t"
  45103. #else
  45104. "adc r3, %[r]\n\t"
  45105. #endif
  45106. #ifdef WOLFSSL_KEIL
  45107. "adcs r4, r4, %[r]\n\t"
  45108. #elif defined(__clang__)
  45109. "adcs r4, %[r]\n\t"
  45110. #else
  45111. "adc r4, %[r]\n\t"
  45112. #endif
  45113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45114. "lsrs r7, %[b], #16\n\t"
  45115. #else
  45116. "lsr r7, %[b], #16\n\t"
  45117. #endif
  45118. #ifdef WOLFSSL_KEIL
  45119. "muls r6, r7, r6\n\t"
  45120. #elif defined(__clang__)
  45121. "muls r6, r7\n\t"
  45122. #else
  45123. "mul r6, r7\n\t"
  45124. #endif
  45125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45126. "lsrs r7, r6, #16\n\t"
  45127. #else
  45128. "lsr r7, r6, #16\n\t"
  45129. #endif
  45130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45131. "lsls r6, r6, #16\n\t"
  45132. #else
  45133. "lsl r6, r6, #16\n\t"
  45134. #endif
  45135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45136. "adds r5, r5, r6\n\t"
  45137. #else
  45138. "add r5, r5, r6\n\t"
  45139. #endif
  45140. #ifdef WOLFSSL_KEIL
  45141. "adcs r3, r3, r7\n\t"
  45142. #elif defined(__clang__)
  45143. "adcs r3, r7\n\t"
  45144. #else
  45145. "adc r3, r7\n\t"
  45146. #endif
  45147. #ifdef WOLFSSL_KEIL
  45148. "adcs r4, r4, %[r]\n\t"
  45149. #elif defined(__clang__)
  45150. "adcs r4, %[r]\n\t"
  45151. #else
  45152. "adc r4, %[r]\n\t"
  45153. #endif
  45154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45155. "lsrs r6, %[a], #16\n\t"
  45156. #else
  45157. "lsr r6, %[a], #16\n\t"
  45158. #endif
  45159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45160. "lsrs r7, %[b], #16\n\t"
  45161. #else
  45162. "lsr r7, %[b], #16\n\t"
  45163. #endif
  45164. #ifdef WOLFSSL_KEIL
  45165. "muls r7, r6, r7\n\t"
  45166. #elif defined(__clang__)
  45167. "muls r7, r6\n\t"
  45168. #else
  45169. "mul r7, r6\n\t"
  45170. #endif
  45171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45172. "adds r3, r3, r7\n\t"
  45173. #else
  45174. "add r3, r3, r7\n\t"
  45175. #endif
  45176. #ifdef WOLFSSL_KEIL
  45177. "adcs r4, r4, %[r]\n\t"
  45178. #elif defined(__clang__)
  45179. "adcs r4, %[r]\n\t"
  45180. #else
  45181. "adc r4, %[r]\n\t"
  45182. #endif
  45183. "uxth r7, %[b]\n\t"
  45184. #ifdef WOLFSSL_KEIL
  45185. "muls r6, r7, r6\n\t"
  45186. #elif defined(__clang__)
  45187. "muls r6, r7\n\t"
  45188. #else
  45189. "mul r6, r7\n\t"
  45190. #endif
  45191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45192. "lsrs r7, r6, #16\n\t"
  45193. #else
  45194. "lsr r7, r6, #16\n\t"
  45195. #endif
  45196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45197. "lsls r6, r6, #16\n\t"
  45198. #else
  45199. "lsl r6, r6, #16\n\t"
  45200. #endif
  45201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45202. "adds r5, r5, r6\n\t"
  45203. #else
  45204. "add r5, r5, r6\n\t"
  45205. #endif
  45206. #ifdef WOLFSSL_KEIL
  45207. "adcs r3, r3, r7\n\t"
  45208. #elif defined(__clang__)
  45209. "adcs r3, r7\n\t"
  45210. #else
  45211. "adc r3, r7\n\t"
  45212. #endif
  45213. #ifdef WOLFSSL_KEIL
  45214. "adcs r4, r4, %[r]\n\t"
  45215. #elif defined(__clang__)
  45216. "adcs r4, %[r]\n\t"
  45217. #else
  45218. "adc r4, %[r]\n\t"
  45219. #endif
  45220. "# A[4] * B[10]\n\t"
  45221. "mov %[a], r9\n\t"
  45222. "mov %[b], r10\n\t"
  45223. "ldr %[a], [%[a], #16]\n\t"
  45224. "ldr %[b], [%[b], #40]\n\t"
  45225. "uxth r6, %[a]\n\t"
  45226. "uxth r7, %[b]\n\t"
  45227. #ifdef WOLFSSL_KEIL
  45228. "muls r7, r6, r7\n\t"
  45229. #elif defined(__clang__)
  45230. "muls r7, r6\n\t"
  45231. #else
  45232. "mul r7, r6\n\t"
  45233. #endif
  45234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45235. "adds r5, r5, r7\n\t"
  45236. #else
  45237. "add r5, r5, r7\n\t"
  45238. #endif
  45239. #ifdef WOLFSSL_KEIL
  45240. "adcs r3, r3, %[r]\n\t"
  45241. #elif defined(__clang__)
  45242. "adcs r3, %[r]\n\t"
  45243. #else
  45244. "adc r3, %[r]\n\t"
  45245. #endif
  45246. #ifdef WOLFSSL_KEIL
  45247. "adcs r4, r4, %[r]\n\t"
  45248. #elif defined(__clang__)
  45249. "adcs r4, %[r]\n\t"
  45250. #else
  45251. "adc r4, %[r]\n\t"
  45252. #endif
  45253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45254. "lsrs r7, %[b], #16\n\t"
  45255. #else
  45256. "lsr r7, %[b], #16\n\t"
  45257. #endif
  45258. #ifdef WOLFSSL_KEIL
  45259. "muls r6, r7, r6\n\t"
  45260. #elif defined(__clang__)
  45261. "muls r6, r7\n\t"
  45262. #else
  45263. "mul r6, r7\n\t"
  45264. #endif
  45265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45266. "lsrs r7, r6, #16\n\t"
  45267. #else
  45268. "lsr r7, r6, #16\n\t"
  45269. #endif
  45270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45271. "lsls r6, r6, #16\n\t"
  45272. #else
  45273. "lsl r6, r6, #16\n\t"
  45274. #endif
  45275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45276. "adds r5, r5, r6\n\t"
  45277. #else
  45278. "add r5, r5, r6\n\t"
  45279. #endif
  45280. #ifdef WOLFSSL_KEIL
  45281. "adcs r3, r3, r7\n\t"
  45282. #elif defined(__clang__)
  45283. "adcs r3, r7\n\t"
  45284. #else
  45285. "adc r3, r7\n\t"
  45286. #endif
  45287. #ifdef WOLFSSL_KEIL
  45288. "adcs r4, r4, %[r]\n\t"
  45289. #elif defined(__clang__)
  45290. "adcs r4, %[r]\n\t"
  45291. #else
  45292. "adc r4, %[r]\n\t"
  45293. #endif
  45294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45295. "lsrs r6, %[a], #16\n\t"
  45296. #else
  45297. "lsr r6, %[a], #16\n\t"
  45298. #endif
  45299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45300. "lsrs r7, %[b], #16\n\t"
  45301. #else
  45302. "lsr r7, %[b], #16\n\t"
  45303. #endif
  45304. #ifdef WOLFSSL_KEIL
  45305. "muls r7, r6, r7\n\t"
  45306. #elif defined(__clang__)
  45307. "muls r7, r6\n\t"
  45308. #else
  45309. "mul r7, r6\n\t"
  45310. #endif
  45311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45312. "adds r3, r3, r7\n\t"
  45313. #else
  45314. "add r3, r3, r7\n\t"
  45315. #endif
  45316. #ifdef WOLFSSL_KEIL
  45317. "adcs r4, r4, %[r]\n\t"
  45318. #elif defined(__clang__)
  45319. "adcs r4, %[r]\n\t"
  45320. #else
  45321. "adc r4, %[r]\n\t"
  45322. #endif
  45323. "uxth r7, %[b]\n\t"
  45324. #ifdef WOLFSSL_KEIL
  45325. "muls r6, r7, r6\n\t"
  45326. #elif defined(__clang__)
  45327. "muls r6, r7\n\t"
  45328. #else
  45329. "mul r6, r7\n\t"
  45330. #endif
  45331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45332. "lsrs r7, r6, #16\n\t"
  45333. #else
  45334. "lsr r7, r6, #16\n\t"
  45335. #endif
  45336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45337. "lsls r6, r6, #16\n\t"
  45338. #else
  45339. "lsl r6, r6, #16\n\t"
  45340. #endif
  45341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45342. "adds r5, r5, r6\n\t"
  45343. #else
  45344. "add r5, r5, r6\n\t"
  45345. #endif
  45346. #ifdef WOLFSSL_KEIL
  45347. "adcs r3, r3, r7\n\t"
  45348. #elif defined(__clang__)
  45349. "adcs r3, r7\n\t"
  45350. #else
  45351. "adc r3, r7\n\t"
  45352. #endif
  45353. #ifdef WOLFSSL_KEIL
  45354. "adcs r4, r4, %[r]\n\t"
  45355. #elif defined(__clang__)
  45356. "adcs r4, %[r]\n\t"
  45357. #else
  45358. "adc r4, %[r]\n\t"
  45359. #endif
  45360. "# A[3] * B[11]\n\t"
  45361. "mov %[a], r9\n\t"
  45362. "mov %[b], r10\n\t"
  45363. "ldr %[a], [%[a], #12]\n\t"
  45364. "ldr %[b], [%[b], #44]\n\t"
  45365. "uxth r6, %[a]\n\t"
  45366. "uxth r7, %[b]\n\t"
  45367. #ifdef WOLFSSL_KEIL
  45368. "muls r7, r6, r7\n\t"
  45369. #elif defined(__clang__)
  45370. "muls r7, r6\n\t"
  45371. #else
  45372. "mul r7, r6\n\t"
  45373. #endif
  45374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45375. "adds r5, r5, r7\n\t"
  45376. #else
  45377. "add r5, r5, r7\n\t"
  45378. #endif
  45379. #ifdef WOLFSSL_KEIL
  45380. "adcs r3, r3, %[r]\n\t"
  45381. #elif defined(__clang__)
  45382. "adcs r3, %[r]\n\t"
  45383. #else
  45384. "adc r3, %[r]\n\t"
  45385. #endif
  45386. #ifdef WOLFSSL_KEIL
  45387. "adcs r4, r4, %[r]\n\t"
  45388. #elif defined(__clang__)
  45389. "adcs r4, %[r]\n\t"
  45390. #else
  45391. "adc r4, %[r]\n\t"
  45392. #endif
  45393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45394. "lsrs r7, %[b], #16\n\t"
  45395. #else
  45396. "lsr r7, %[b], #16\n\t"
  45397. #endif
  45398. #ifdef WOLFSSL_KEIL
  45399. "muls r6, r7, r6\n\t"
  45400. #elif defined(__clang__)
  45401. "muls r6, r7\n\t"
  45402. #else
  45403. "mul r6, r7\n\t"
  45404. #endif
  45405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45406. "lsrs r7, r6, #16\n\t"
  45407. #else
  45408. "lsr r7, r6, #16\n\t"
  45409. #endif
  45410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45411. "lsls r6, r6, #16\n\t"
  45412. #else
  45413. "lsl r6, r6, #16\n\t"
  45414. #endif
  45415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45416. "adds r5, r5, r6\n\t"
  45417. #else
  45418. "add r5, r5, r6\n\t"
  45419. #endif
  45420. #ifdef WOLFSSL_KEIL
  45421. "adcs r3, r3, r7\n\t"
  45422. #elif defined(__clang__)
  45423. "adcs r3, r7\n\t"
  45424. #else
  45425. "adc r3, r7\n\t"
  45426. #endif
  45427. #ifdef WOLFSSL_KEIL
  45428. "adcs r4, r4, %[r]\n\t"
  45429. #elif defined(__clang__)
  45430. "adcs r4, %[r]\n\t"
  45431. #else
  45432. "adc r4, %[r]\n\t"
  45433. #endif
  45434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45435. "lsrs r6, %[a], #16\n\t"
  45436. #else
  45437. "lsr r6, %[a], #16\n\t"
  45438. #endif
  45439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45440. "lsrs r7, %[b], #16\n\t"
  45441. #else
  45442. "lsr r7, %[b], #16\n\t"
  45443. #endif
  45444. #ifdef WOLFSSL_KEIL
  45445. "muls r7, r6, r7\n\t"
  45446. #elif defined(__clang__)
  45447. "muls r7, r6\n\t"
  45448. #else
  45449. "mul r7, r6\n\t"
  45450. #endif
  45451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45452. "adds r3, r3, r7\n\t"
  45453. #else
  45454. "add r3, r3, r7\n\t"
  45455. #endif
  45456. #ifdef WOLFSSL_KEIL
  45457. "adcs r4, r4, %[r]\n\t"
  45458. #elif defined(__clang__)
  45459. "adcs r4, %[r]\n\t"
  45460. #else
  45461. "adc r4, %[r]\n\t"
  45462. #endif
  45463. "uxth r7, %[b]\n\t"
  45464. #ifdef WOLFSSL_KEIL
  45465. "muls r6, r7, r6\n\t"
  45466. #elif defined(__clang__)
  45467. "muls r6, r7\n\t"
  45468. #else
  45469. "mul r6, r7\n\t"
  45470. #endif
  45471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45472. "lsrs r7, r6, #16\n\t"
  45473. #else
  45474. "lsr r7, r6, #16\n\t"
  45475. #endif
  45476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45477. "lsls r6, r6, #16\n\t"
  45478. #else
  45479. "lsl r6, r6, #16\n\t"
  45480. #endif
  45481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45482. "adds r5, r5, r6\n\t"
  45483. #else
  45484. "add r5, r5, r6\n\t"
  45485. #endif
  45486. #ifdef WOLFSSL_KEIL
  45487. "adcs r3, r3, r7\n\t"
  45488. #elif defined(__clang__)
  45489. "adcs r3, r7\n\t"
  45490. #else
  45491. "adc r3, r7\n\t"
  45492. #endif
  45493. #ifdef WOLFSSL_KEIL
  45494. "adcs r4, r4, %[r]\n\t"
  45495. #elif defined(__clang__)
  45496. "adcs r4, %[r]\n\t"
  45497. #else
  45498. "adc r4, %[r]\n\t"
  45499. #endif
  45500. "mov %[r], r8\n\t"
  45501. "str r5, [%[r], #56]\n\t"
  45502. "movs %[r], #0\n\t"
  45503. "# A[4] * B[11]\n\t"
  45504. "movs r5, #0\n\t"
  45505. "mov %[a], r9\n\t"
  45506. "mov %[b], r10\n\t"
  45507. "ldr %[a], [%[a], #16]\n\t"
  45508. "ldr %[b], [%[b], #44]\n\t"
  45509. "uxth r6, %[a]\n\t"
  45510. "uxth r7, %[b]\n\t"
  45511. #ifdef WOLFSSL_KEIL
  45512. "muls r7, r6, r7\n\t"
  45513. #elif defined(__clang__)
  45514. "muls r7, r6\n\t"
  45515. #else
  45516. "mul r7, r6\n\t"
  45517. #endif
  45518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45519. "adds r3, r3, r7\n\t"
  45520. #else
  45521. "add r3, r3, r7\n\t"
  45522. #endif
  45523. #ifdef WOLFSSL_KEIL
  45524. "adcs r4, r4, %[r]\n\t"
  45525. #elif defined(__clang__)
  45526. "adcs r4, %[r]\n\t"
  45527. #else
  45528. "adc r4, %[r]\n\t"
  45529. #endif
  45530. #ifdef WOLFSSL_KEIL
  45531. "adcs r5, r5, %[r]\n\t"
  45532. #elif defined(__clang__)
  45533. "adcs r5, %[r]\n\t"
  45534. #else
  45535. "adc r5, %[r]\n\t"
  45536. #endif
  45537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45538. "lsrs r7, %[b], #16\n\t"
  45539. #else
  45540. "lsr r7, %[b], #16\n\t"
  45541. #endif
  45542. #ifdef WOLFSSL_KEIL
  45543. "muls r6, r7, r6\n\t"
  45544. #elif defined(__clang__)
  45545. "muls r6, r7\n\t"
  45546. #else
  45547. "mul r6, r7\n\t"
  45548. #endif
  45549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45550. "lsrs r7, r6, #16\n\t"
  45551. #else
  45552. "lsr r7, r6, #16\n\t"
  45553. #endif
  45554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45555. "lsls r6, r6, #16\n\t"
  45556. #else
  45557. "lsl r6, r6, #16\n\t"
  45558. #endif
  45559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45560. "adds r3, r3, r6\n\t"
  45561. #else
  45562. "add r3, r3, r6\n\t"
  45563. #endif
  45564. #ifdef WOLFSSL_KEIL
  45565. "adcs r4, r4, r7\n\t"
  45566. #elif defined(__clang__)
  45567. "adcs r4, r7\n\t"
  45568. #else
  45569. "adc r4, r7\n\t"
  45570. #endif
  45571. #ifdef WOLFSSL_KEIL
  45572. "adcs r5, r5, %[r]\n\t"
  45573. #elif defined(__clang__)
  45574. "adcs r5, %[r]\n\t"
  45575. #else
  45576. "adc r5, %[r]\n\t"
  45577. #endif
  45578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45579. "lsrs r6, %[a], #16\n\t"
  45580. #else
  45581. "lsr r6, %[a], #16\n\t"
  45582. #endif
  45583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45584. "lsrs r7, %[b], #16\n\t"
  45585. #else
  45586. "lsr r7, %[b], #16\n\t"
  45587. #endif
  45588. #ifdef WOLFSSL_KEIL
  45589. "muls r7, r6, r7\n\t"
  45590. #elif defined(__clang__)
  45591. "muls r7, r6\n\t"
  45592. #else
  45593. "mul r7, r6\n\t"
  45594. #endif
  45595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45596. "adds r4, r4, r7\n\t"
  45597. #else
  45598. "add r4, r4, r7\n\t"
  45599. #endif
  45600. #ifdef WOLFSSL_KEIL
  45601. "adcs r5, r5, %[r]\n\t"
  45602. #elif defined(__clang__)
  45603. "adcs r5, %[r]\n\t"
  45604. #else
  45605. "adc r5, %[r]\n\t"
  45606. #endif
  45607. "uxth r7, %[b]\n\t"
  45608. #ifdef WOLFSSL_KEIL
  45609. "muls r6, r7, r6\n\t"
  45610. #elif defined(__clang__)
  45611. "muls r6, r7\n\t"
  45612. #else
  45613. "mul r6, r7\n\t"
  45614. #endif
  45615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45616. "lsrs r7, r6, #16\n\t"
  45617. #else
  45618. "lsr r7, r6, #16\n\t"
  45619. #endif
  45620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45621. "lsls r6, r6, #16\n\t"
  45622. #else
  45623. "lsl r6, r6, #16\n\t"
  45624. #endif
  45625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45626. "adds r3, r3, r6\n\t"
  45627. #else
  45628. "add r3, r3, r6\n\t"
  45629. #endif
  45630. #ifdef WOLFSSL_KEIL
  45631. "adcs r4, r4, r7\n\t"
  45632. #elif defined(__clang__)
  45633. "adcs r4, r7\n\t"
  45634. #else
  45635. "adc r4, r7\n\t"
  45636. #endif
  45637. #ifdef WOLFSSL_KEIL
  45638. "adcs r5, r5, %[r]\n\t"
  45639. #elif defined(__clang__)
  45640. "adcs r5, %[r]\n\t"
  45641. #else
  45642. "adc r5, %[r]\n\t"
  45643. #endif
  45644. "# A[5] * B[10]\n\t"
  45645. "mov %[a], r9\n\t"
  45646. "mov %[b], r10\n\t"
  45647. "ldr %[a], [%[a], #20]\n\t"
  45648. "ldr %[b], [%[b], #40]\n\t"
  45649. "uxth r6, %[a]\n\t"
  45650. "uxth r7, %[b]\n\t"
  45651. #ifdef WOLFSSL_KEIL
  45652. "muls r7, r6, r7\n\t"
  45653. #elif defined(__clang__)
  45654. "muls r7, r6\n\t"
  45655. #else
  45656. "mul r7, r6\n\t"
  45657. #endif
  45658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45659. "adds r3, r3, r7\n\t"
  45660. #else
  45661. "add r3, r3, r7\n\t"
  45662. #endif
  45663. #ifdef WOLFSSL_KEIL
  45664. "adcs r4, r4, %[r]\n\t"
  45665. #elif defined(__clang__)
  45666. "adcs r4, %[r]\n\t"
  45667. #else
  45668. "adc r4, %[r]\n\t"
  45669. #endif
  45670. #ifdef WOLFSSL_KEIL
  45671. "adcs r5, r5, %[r]\n\t"
  45672. #elif defined(__clang__)
  45673. "adcs r5, %[r]\n\t"
  45674. #else
  45675. "adc r5, %[r]\n\t"
  45676. #endif
  45677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45678. "lsrs r7, %[b], #16\n\t"
  45679. #else
  45680. "lsr r7, %[b], #16\n\t"
  45681. #endif
  45682. #ifdef WOLFSSL_KEIL
  45683. "muls r6, r7, r6\n\t"
  45684. #elif defined(__clang__)
  45685. "muls r6, r7\n\t"
  45686. #else
  45687. "mul r6, r7\n\t"
  45688. #endif
  45689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45690. "lsrs r7, r6, #16\n\t"
  45691. #else
  45692. "lsr r7, r6, #16\n\t"
  45693. #endif
  45694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45695. "lsls r6, r6, #16\n\t"
  45696. #else
  45697. "lsl r6, r6, #16\n\t"
  45698. #endif
  45699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45700. "adds r3, r3, r6\n\t"
  45701. #else
  45702. "add r3, r3, r6\n\t"
  45703. #endif
  45704. #ifdef WOLFSSL_KEIL
  45705. "adcs r4, r4, r7\n\t"
  45706. #elif defined(__clang__)
  45707. "adcs r4, r7\n\t"
  45708. #else
  45709. "adc r4, r7\n\t"
  45710. #endif
  45711. #ifdef WOLFSSL_KEIL
  45712. "adcs r5, r5, %[r]\n\t"
  45713. #elif defined(__clang__)
  45714. "adcs r5, %[r]\n\t"
  45715. #else
  45716. "adc r5, %[r]\n\t"
  45717. #endif
  45718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45719. "lsrs r6, %[a], #16\n\t"
  45720. #else
  45721. "lsr r6, %[a], #16\n\t"
  45722. #endif
  45723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45724. "lsrs r7, %[b], #16\n\t"
  45725. #else
  45726. "lsr r7, %[b], #16\n\t"
  45727. #endif
  45728. #ifdef WOLFSSL_KEIL
  45729. "muls r7, r6, r7\n\t"
  45730. #elif defined(__clang__)
  45731. "muls r7, r6\n\t"
  45732. #else
  45733. "mul r7, r6\n\t"
  45734. #endif
  45735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45736. "adds r4, r4, r7\n\t"
  45737. #else
  45738. "add r4, r4, r7\n\t"
  45739. #endif
  45740. #ifdef WOLFSSL_KEIL
  45741. "adcs r5, r5, %[r]\n\t"
  45742. #elif defined(__clang__)
  45743. "adcs r5, %[r]\n\t"
  45744. #else
  45745. "adc r5, %[r]\n\t"
  45746. #endif
  45747. "uxth r7, %[b]\n\t"
  45748. #ifdef WOLFSSL_KEIL
  45749. "muls r6, r7, r6\n\t"
  45750. #elif defined(__clang__)
  45751. "muls r6, r7\n\t"
  45752. #else
  45753. "mul r6, r7\n\t"
  45754. #endif
  45755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45756. "lsrs r7, r6, #16\n\t"
  45757. #else
  45758. "lsr r7, r6, #16\n\t"
  45759. #endif
  45760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45761. "lsls r6, r6, #16\n\t"
  45762. #else
  45763. "lsl r6, r6, #16\n\t"
  45764. #endif
  45765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45766. "adds r3, r3, r6\n\t"
  45767. #else
  45768. "add r3, r3, r6\n\t"
  45769. #endif
  45770. #ifdef WOLFSSL_KEIL
  45771. "adcs r4, r4, r7\n\t"
  45772. #elif defined(__clang__)
  45773. "adcs r4, r7\n\t"
  45774. #else
  45775. "adc r4, r7\n\t"
  45776. #endif
  45777. #ifdef WOLFSSL_KEIL
  45778. "adcs r5, r5, %[r]\n\t"
  45779. #elif defined(__clang__)
  45780. "adcs r5, %[r]\n\t"
  45781. #else
  45782. "adc r5, %[r]\n\t"
  45783. #endif
  45784. "# A[6] * B[9]\n\t"
  45785. "mov %[a], r9\n\t"
  45786. "mov %[b], r10\n\t"
  45787. "ldr %[a], [%[a], #24]\n\t"
  45788. "ldr %[b], [%[b], #36]\n\t"
  45789. "uxth r6, %[a]\n\t"
  45790. "uxth r7, %[b]\n\t"
  45791. #ifdef WOLFSSL_KEIL
  45792. "muls r7, r6, r7\n\t"
  45793. #elif defined(__clang__)
  45794. "muls r7, r6\n\t"
  45795. #else
  45796. "mul r7, r6\n\t"
  45797. #endif
  45798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45799. "adds r3, r3, r7\n\t"
  45800. #else
  45801. "add r3, r3, r7\n\t"
  45802. #endif
  45803. #ifdef WOLFSSL_KEIL
  45804. "adcs r4, r4, %[r]\n\t"
  45805. #elif defined(__clang__)
  45806. "adcs r4, %[r]\n\t"
  45807. #else
  45808. "adc r4, %[r]\n\t"
  45809. #endif
  45810. #ifdef WOLFSSL_KEIL
  45811. "adcs r5, r5, %[r]\n\t"
  45812. #elif defined(__clang__)
  45813. "adcs r5, %[r]\n\t"
  45814. #else
  45815. "adc r5, %[r]\n\t"
  45816. #endif
  45817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45818. "lsrs r7, %[b], #16\n\t"
  45819. #else
  45820. "lsr r7, %[b], #16\n\t"
  45821. #endif
  45822. #ifdef WOLFSSL_KEIL
  45823. "muls r6, r7, r6\n\t"
  45824. #elif defined(__clang__)
  45825. "muls r6, r7\n\t"
  45826. #else
  45827. "mul r6, r7\n\t"
  45828. #endif
  45829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45830. "lsrs r7, r6, #16\n\t"
  45831. #else
  45832. "lsr r7, r6, #16\n\t"
  45833. #endif
  45834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45835. "lsls r6, r6, #16\n\t"
  45836. #else
  45837. "lsl r6, r6, #16\n\t"
  45838. #endif
  45839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45840. "adds r3, r3, r6\n\t"
  45841. #else
  45842. "add r3, r3, r6\n\t"
  45843. #endif
  45844. #ifdef WOLFSSL_KEIL
  45845. "adcs r4, r4, r7\n\t"
  45846. #elif defined(__clang__)
  45847. "adcs r4, r7\n\t"
  45848. #else
  45849. "adc r4, r7\n\t"
  45850. #endif
  45851. #ifdef WOLFSSL_KEIL
  45852. "adcs r5, r5, %[r]\n\t"
  45853. #elif defined(__clang__)
  45854. "adcs r5, %[r]\n\t"
  45855. #else
  45856. "adc r5, %[r]\n\t"
  45857. #endif
  45858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45859. "lsrs r6, %[a], #16\n\t"
  45860. #else
  45861. "lsr r6, %[a], #16\n\t"
  45862. #endif
  45863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45864. "lsrs r7, %[b], #16\n\t"
  45865. #else
  45866. "lsr r7, %[b], #16\n\t"
  45867. #endif
  45868. #ifdef WOLFSSL_KEIL
  45869. "muls r7, r6, r7\n\t"
  45870. #elif defined(__clang__)
  45871. "muls r7, r6\n\t"
  45872. #else
  45873. "mul r7, r6\n\t"
  45874. #endif
  45875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45876. "adds r4, r4, r7\n\t"
  45877. #else
  45878. "add r4, r4, r7\n\t"
  45879. #endif
  45880. #ifdef WOLFSSL_KEIL
  45881. "adcs r5, r5, %[r]\n\t"
  45882. #elif defined(__clang__)
  45883. "adcs r5, %[r]\n\t"
  45884. #else
  45885. "adc r5, %[r]\n\t"
  45886. #endif
  45887. "uxth r7, %[b]\n\t"
  45888. #ifdef WOLFSSL_KEIL
  45889. "muls r6, r7, r6\n\t"
  45890. #elif defined(__clang__)
  45891. "muls r6, r7\n\t"
  45892. #else
  45893. "mul r6, r7\n\t"
  45894. #endif
  45895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45896. "lsrs r7, r6, #16\n\t"
  45897. #else
  45898. "lsr r7, r6, #16\n\t"
  45899. #endif
  45900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45901. "lsls r6, r6, #16\n\t"
  45902. #else
  45903. "lsl r6, r6, #16\n\t"
  45904. #endif
  45905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45906. "adds r3, r3, r6\n\t"
  45907. #else
  45908. "add r3, r3, r6\n\t"
  45909. #endif
  45910. #ifdef WOLFSSL_KEIL
  45911. "adcs r4, r4, r7\n\t"
  45912. #elif defined(__clang__)
  45913. "adcs r4, r7\n\t"
  45914. #else
  45915. "adc r4, r7\n\t"
  45916. #endif
  45917. #ifdef WOLFSSL_KEIL
  45918. "adcs r5, r5, %[r]\n\t"
  45919. #elif defined(__clang__)
  45920. "adcs r5, %[r]\n\t"
  45921. #else
  45922. "adc r5, %[r]\n\t"
  45923. #endif
  45924. "# A[7] * B[8]\n\t"
  45925. "mov %[a], r9\n\t"
  45926. "mov %[b], r10\n\t"
  45927. "ldr %[a], [%[a], #28]\n\t"
  45928. "ldr %[b], [%[b], #32]\n\t"
  45929. "uxth r6, %[a]\n\t"
  45930. "uxth r7, %[b]\n\t"
  45931. #ifdef WOLFSSL_KEIL
  45932. "muls r7, r6, r7\n\t"
  45933. #elif defined(__clang__)
  45934. "muls r7, r6\n\t"
  45935. #else
  45936. "mul r7, r6\n\t"
  45937. #endif
  45938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45939. "adds r3, r3, r7\n\t"
  45940. #else
  45941. "add r3, r3, r7\n\t"
  45942. #endif
  45943. #ifdef WOLFSSL_KEIL
  45944. "adcs r4, r4, %[r]\n\t"
  45945. #elif defined(__clang__)
  45946. "adcs r4, %[r]\n\t"
  45947. #else
  45948. "adc r4, %[r]\n\t"
  45949. #endif
  45950. #ifdef WOLFSSL_KEIL
  45951. "adcs r5, r5, %[r]\n\t"
  45952. #elif defined(__clang__)
  45953. "adcs r5, %[r]\n\t"
  45954. #else
  45955. "adc r5, %[r]\n\t"
  45956. #endif
  45957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45958. "lsrs r7, %[b], #16\n\t"
  45959. #else
  45960. "lsr r7, %[b], #16\n\t"
  45961. #endif
  45962. #ifdef WOLFSSL_KEIL
  45963. "muls r6, r7, r6\n\t"
  45964. #elif defined(__clang__)
  45965. "muls r6, r7\n\t"
  45966. #else
  45967. "mul r6, r7\n\t"
  45968. #endif
  45969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45970. "lsrs r7, r6, #16\n\t"
  45971. #else
  45972. "lsr r7, r6, #16\n\t"
  45973. #endif
  45974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45975. "lsls r6, r6, #16\n\t"
  45976. #else
  45977. "lsl r6, r6, #16\n\t"
  45978. #endif
  45979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45980. "adds r3, r3, r6\n\t"
  45981. #else
  45982. "add r3, r3, r6\n\t"
  45983. #endif
  45984. #ifdef WOLFSSL_KEIL
  45985. "adcs r4, r4, r7\n\t"
  45986. #elif defined(__clang__)
  45987. "adcs r4, r7\n\t"
  45988. #else
  45989. "adc r4, r7\n\t"
  45990. #endif
  45991. #ifdef WOLFSSL_KEIL
  45992. "adcs r5, r5, %[r]\n\t"
  45993. #elif defined(__clang__)
  45994. "adcs r5, %[r]\n\t"
  45995. #else
  45996. "adc r5, %[r]\n\t"
  45997. #endif
  45998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45999. "lsrs r6, %[a], #16\n\t"
  46000. #else
  46001. "lsr r6, %[a], #16\n\t"
  46002. #endif
  46003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46004. "lsrs r7, %[b], #16\n\t"
  46005. #else
  46006. "lsr r7, %[b], #16\n\t"
  46007. #endif
  46008. #ifdef WOLFSSL_KEIL
  46009. "muls r7, r6, r7\n\t"
  46010. #elif defined(__clang__)
  46011. "muls r7, r6\n\t"
  46012. #else
  46013. "mul r7, r6\n\t"
  46014. #endif
  46015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46016. "adds r4, r4, r7\n\t"
  46017. #else
  46018. "add r4, r4, r7\n\t"
  46019. #endif
  46020. #ifdef WOLFSSL_KEIL
  46021. "adcs r5, r5, %[r]\n\t"
  46022. #elif defined(__clang__)
  46023. "adcs r5, %[r]\n\t"
  46024. #else
  46025. "adc r5, %[r]\n\t"
  46026. #endif
  46027. "uxth r7, %[b]\n\t"
  46028. #ifdef WOLFSSL_KEIL
  46029. "muls r6, r7, r6\n\t"
  46030. #elif defined(__clang__)
  46031. "muls r6, r7\n\t"
  46032. #else
  46033. "mul r6, r7\n\t"
  46034. #endif
  46035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46036. "lsrs r7, r6, #16\n\t"
  46037. #else
  46038. "lsr r7, r6, #16\n\t"
  46039. #endif
  46040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46041. "lsls r6, r6, #16\n\t"
  46042. #else
  46043. "lsl r6, r6, #16\n\t"
  46044. #endif
  46045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46046. "adds r3, r3, r6\n\t"
  46047. #else
  46048. "add r3, r3, r6\n\t"
  46049. #endif
  46050. #ifdef WOLFSSL_KEIL
  46051. "adcs r4, r4, r7\n\t"
  46052. #elif defined(__clang__)
  46053. "adcs r4, r7\n\t"
  46054. #else
  46055. "adc r4, r7\n\t"
  46056. #endif
  46057. #ifdef WOLFSSL_KEIL
  46058. "adcs r5, r5, %[r]\n\t"
  46059. #elif defined(__clang__)
  46060. "adcs r5, %[r]\n\t"
  46061. #else
  46062. "adc r5, %[r]\n\t"
  46063. #endif
  46064. "# A[8] * B[7]\n\t"
  46065. "mov %[a], r9\n\t"
  46066. "mov %[b], r10\n\t"
  46067. "ldr %[a], [%[a], #32]\n\t"
  46068. "ldr %[b], [%[b], #28]\n\t"
  46069. "uxth r6, %[a]\n\t"
  46070. "uxth r7, %[b]\n\t"
  46071. #ifdef WOLFSSL_KEIL
  46072. "muls r7, r6, r7\n\t"
  46073. #elif defined(__clang__)
  46074. "muls r7, r6\n\t"
  46075. #else
  46076. "mul r7, r6\n\t"
  46077. #endif
  46078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46079. "adds r3, r3, r7\n\t"
  46080. #else
  46081. "add r3, r3, r7\n\t"
  46082. #endif
  46083. #ifdef WOLFSSL_KEIL
  46084. "adcs r4, r4, %[r]\n\t"
  46085. #elif defined(__clang__)
  46086. "adcs r4, %[r]\n\t"
  46087. #else
  46088. "adc r4, %[r]\n\t"
  46089. #endif
  46090. #ifdef WOLFSSL_KEIL
  46091. "adcs r5, r5, %[r]\n\t"
  46092. #elif defined(__clang__)
  46093. "adcs r5, %[r]\n\t"
  46094. #else
  46095. "adc r5, %[r]\n\t"
  46096. #endif
  46097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46098. "lsrs r7, %[b], #16\n\t"
  46099. #else
  46100. "lsr r7, %[b], #16\n\t"
  46101. #endif
  46102. #ifdef WOLFSSL_KEIL
  46103. "muls r6, r7, r6\n\t"
  46104. #elif defined(__clang__)
  46105. "muls r6, r7\n\t"
  46106. #else
  46107. "mul r6, r7\n\t"
  46108. #endif
  46109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46110. "lsrs r7, r6, #16\n\t"
  46111. #else
  46112. "lsr r7, r6, #16\n\t"
  46113. #endif
  46114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46115. "lsls r6, r6, #16\n\t"
  46116. #else
  46117. "lsl r6, r6, #16\n\t"
  46118. #endif
  46119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46120. "adds r3, r3, r6\n\t"
  46121. #else
  46122. "add r3, r3, r6\n\t"
  46123. #endif
  46124. #ifdef WOLFSSL_KEIL
  46125. "adcs r4, r4, r7\n\t"
  46126. #elif defined(__clang__)
  46127. "adcs r4, r7\n\t"
  46128. #else
  46129. "adc r4, r7\n\t"
  46130. #endif
  46131. #ifdef WOLFSSL_KEIL
  46132. "adcs r5, r5, %[r]\n\t"
  46133. #elif defined(__clang__)
  46134. "adcs r5, %[r]\n\t"
  46135. #else
  46136. "adc r5, %[r]\n\t"
  46137. #endif
  46138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46139. "lsrs r6, %[a], #16\n\t"
  46140. #else
  46141. "lsr r6, %[a], #16\n\t"
  46142. #endif
  46143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46144. "lsrs r7, %[b], #16\n\t"
  46145. #else
  46146. "lsr r7, %[b], #16\n\t"
  46147. #endif
  46148. #ifdef WOLFSSL_KEIL
  46149. "muls r7, r6, r7\n\t"
  46150. #elif defined(__clang__)
  46151. "muls r7, r6\n\t"
  46152. #else
  46153. "mul r7, r6\n\t"
  46154. #endif
  46155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46156. "adds r4, r4, r7\n\t"
  46157. #else
  46158. "add r4, r4, r7\n\t"
  46159. #endif
  46160. #ifdef WOLFSSL_KEIL
  46161. "adcs r5, r5, %[r]\n\t"
  46162. #elif defined(__clang__)
  46163. "adcs r5, %[r]\n\t"
  46164. #else
  46165. "adc r5, %[r]\n\t"
  46166. #endif
  46167. "uxth r7, %[b]\n\t"
  46168. #ifdef WOLFSSL_KEIL
  46169. "muls r6, r7, r6\n\t"
  46170. #elif defined(__clang__)
  46171. "muls r6, r7\n\t"
  46172. #else
  46173. "mul r6, r7\n\t"
  46174. #endif
  46175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46176. "lsrs r7, r6, #16\n\t"
  46177. #else
  46178. "lsr r7, r6, #16\n\t"
  46179. #endif
  46180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46181. "lsls r6, r6, #16\n\t"
  46182. #else
  46183. "lsl r6, r6, #16\n\t"
  46184. #endif
  46185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46186. "adds r3, r3, r6\n\t"
  46187. #else
  46188. "add r3, r3, r6\n\t"
  46189. #endif
  46190. #ifdef WOLFSSL_KEIL
  46191. "adcs r4, r4, r7\n\t"
  46192. #elif defined(__clang__)
  46193. "adcs r4, r7\n\t"
  46194. #else
  46195. "adc r4, r7\n\t"
  46196. #endif
  46197. #ifdef WOLFSSL_KEIL
  46198. "adcs r5, r5, %[r]\n\t"
  46199. #elif defined(__clang__)
  46200. "adcs r5, %[r]\n\t"
  46201. #else
  46202. "adc r5, %[r]\n\t"
  46203. #endif
  46204. "# A[9] * B[6]\n\t"
  46205. "mov %[a], r9\n\t"
  46206. "mov %[b], r10\n\t"
  46207. "ldr %[a], [%[a], #36]\n\t"
  46208. "ldr %[b], [%[b], #24]\n\t"
  46209. "uxth r6, %[a]\n\t"
  46210. "uxth r7, %[b]\n\t"
  46211. #ifdef WOLFSSL_KEIL
  46212. "muls r7, r6, r7\n\t"
  46213. #elif defined(__clang__)
  46214. "muls r7, r6\n\t"
  46215. #else
  46216. "mul r7, r6\n\t"
  46217. #endif
  46218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46219. "adds r3, r3, r7\n\t"
  46220. #else
  46221. "add r3, r3, r7\n\t"
  46222. #endif
  46223. #ifdef WOLFSSL_KEIL
  46224. "adcs r4, r4, %[r]\n\t"
  46225. #elif defined(__clang__)
  46226. "adcs r4, %[r]\n\t"
  46227. #else
  46228. "adc r4, %[r]\n\t"
  46229. #endif
  46230. #ifdef WOLFSSL_KEIL
  46231. "adcs r5, r5, %[r]\n\t"
  46232. #elif defined(__clang__)
  46233. "adcs r5, %[r]\n\t"
  46234. #else
  46235. "adc r5, %[r]\n\t"
  46236. #endif
  46237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46238. "lsrs r7, %[b], #16\n\t"
  46239. #else
  46240. "lsr r7, %[b], #16\n\t"
  46241. #endif
  46242. #ifdef WOLFSSL_KEIL
  46243. "muls r6, r7, r6\n\t"
  46244. #elif defined(__clang__)
  46245. "muls r6, r7\n\t"
  46246. #else
  46247. "mul r6, r7\n\t"
  46248. #endif
  46249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46250. "lsrs r7, r6, #16\n\t"
  46251. #else
  46252. "lsr r7, r6, #16\n\t"
  46253. #endif
  46254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46255. "lsls r6, r6, #16\n\t"
  46256. #else
  46257. "lsl r6, r6, #16\n\t"
  46258. #endif
  46259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46260. "adds r3, r3, r6\n\t"
  46261. #else
  46262. "add r3, r3, r6\n\t"
  46263. #endif
  46264. #ifdef WOLFSSL_KEIL
  46265. "adcs r4, r4, r7\n\t"
  46266. #elif defined(__clang__)
  46267. "adcs r4, r7\n\t"
  46268. #else
  46269. "adc r4, r7\n\t"
  46270. #endif
  46271. #ifdef WOLFSSL_KEIL
  46272. "adcs r5, r5, %[r]\n\t"
  46273. #elif defined(__clang__)
  46274. "adcs r5, %[r]\n\t"
  46275. #else
  46276. "adc r5, %[r]\n\t"
  46277. #endif
  46278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46279. "lsrs r6, %[a], #16\n\t"
  46280. #else
  46281. "lsr r6, %[a], #16\n\t"
  46282. #endif
  46283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46284. "lsrs r7, %[b], #16\n\t"
  46285. #else
  46286. "lsr r7, %[b], #16\n\t"
  46287. #endif
  46288. #ifdef WOLFSSL_KEIL
  46289. "muls r7, r6, r7\n\t"
  46290. #elif defined(__clang__)
  46291. "muls r7, r6\n\t"
  46292. #else
  46293. "mul r7, r6\n\t"
  46294. #endif
  46295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46296. "adds r4, r4, r7\n\t"
  46297. #else
  46298. "add r4, r4, r7\n\t"
  46299. #endif
  46300. #ifdef WOLFSSL_KEIL
  46301. "adcs r5, r5, %[r]\n\t"
  46302. #elif defined(__clang__)
  46303. "adcs r5, %[r]\n\t"
  46304. #else
  46305. "adc r5, %[r]\n\t"
  46306. #endif
  46307. "uxth r7, %[b]\n\t"
  46308. #ifdef WOLFSSL_KEIL
  46309. "muls r6, r7, r6\n\t"
  46310. #elif defined(__clang__)
  46311. "muls r6, r7\n\t"
  46312. #else
  46313. "mul r6, r7\n\t"
  46314. #endif
  46315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46316. "lsrs r7, r6, #16\n\t"
  46317. #else
  46318. "lsr r7, r6, #16\n\t"
  46319. #endif
  46320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46321. "lsls r6, r6, #16\n\t"
  46322. #else
  46323. "lsl r6, r6, #16\n\t"
  46324. #endif
  46325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46326. "adds r3, r3, r6\n\t"
  46327. #else
  46328. "add r3, r3, r6\n\t"
  46329. #endif
  46330. #ifdef WOLFSSL_KEIL
  46331. "adcs r4, r4, r7\n\t"
  46332. #elif defined(__clang__)
  46333. "adcs r4, r7\n\t"
  46334. #else
  46335. "adc r4, r7\n\t"
  46336. #endif
  46337. #ifdef WOLFSSL_KEIL
  46338. "adcs r5, r5, %[r]\n\t"
  46339. #elif defined(__clang__)
  46340. "adcs r5, %[r]\n\t"
  46341. #else
  46342. "adc r5, %[r]\n\t"
  46343. #endif
  46344. "# A[10] * B[5]\n\t"
  46345. "mov %[a], r9\n\t"
  46346. "mov %[b], r10\n\t"
  46347. "ldr %[a], [%[a], #40]\n\t"
  46348. "ldr %[b], [%[b], #20]\n\t"
  46349. "uxth r6, %[a]\n\t"
  46350. "uxth r7, %[b]\n\t"
  46351. #ifdef WOLFSSL_KEIL
  46352. "muls r7, r6, r7\n\t"
  46353. #elif defined(__clang__)
  46354. "muls r7, r6\n\t"
  46355. #else
  46356. "mul r7, r6\n\t"
  46357. #endif
  46358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46359. "adds r3, r3, r7\n\t"
  46360. #else
  46361. "add r3, r3, r7\n\t"
  46362. #endif
  46363. #ifdef WOLFSSL_KEIL
  46364. "adcs r4, r4, %[r]\n\t"
  46365. #elif defined(__clang__)
  46366. "adcs r4, %[r]\n\t"
  46367. #else
  46368. "adc r4, %[r]\n\t"
  46369. #endif
  46370. #ifdef WOLFSSL_KEIL
  46371. "adcs r5, r5, %[r]\n\t"
  46372. #elif defined(__clang__)
  46373. "adcs r5, %[r]\n\t"
  46374. #else
  46375. "adc r5, %[r]\n\t"
  46376. #endif
  46377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46378. "lsrs r7, %[b], #16\n\t"
  46379. #else
  46380. "lsr r7, %[b], #16\n\t"
  46381. #endif
  46382. #ifdef WOLFSSL_KEIL
  46383. "muls r6, r7, r6\n\t"
  46384. #elif defined(__clang__)
  46385. "muls r6, r7\n\t"
  46386. #else
  46387. "mul r6, r7\n\t"
  46388. #endif
  46389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46390. "lsrs r7, r6, #16\n\t"
  46391. #else
  46392. "lsr r7, r6, #16\n\t"
  46393. #endif
  46394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46395. "lsls r6, r6, #16\n\t"
  46396. #else
  46397. "lsl r6, r6, #16\n\t"
  46398. #endif
  46399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46400. "adds r3, r3, r6\n\t"
  46401. #else
  46402. "add r3, r3, r6\n\t"
  46403. #endif
  46404. #ifdef WOLFSSL_KEIL
  46405. "adcs r4, r4, r7\n\t"
  46406. #elif defined(__clang__)
  46407. "adcs r4, r7\n\t"
  46408. #else
  46409. "adc r4, r7\n\t"
  46410. #endif
  46411. #ifdef WOLFSSL_KEIL
  46412. "adcs r5, r5, %[r]\n\t"
  46413. #elif defined(__clang__)
  46414. "adcs r5, %[r]\n\t"
  46415. #else
  46416. "adc r5, %[r]\n\t"
  46417. #endif
  46418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46419. "lsrs r6, %[a], #16\n\t"
  46420. #else
  46421. "lsr r6, %[a], #16\n\t"
  46422. #endif
  46423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46424. "lsrs r7, %[b], #16\n\t"
  46425. #else
  46426. "lsr r7, %[b], #16\n\t"
  46427. #endif
  46428. #ifdef WOLFSSL_KEIL
  46429. "muls r7, r6, r7\n\t"
  46430. #elif defined(__clang__)
  46431. "muls r7, r6\n\t"
  46432. #else
  46433. "mul r7, r6\n\t"
  46434. #endif
  46435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46436. "adds r4, r4, r7\n\t"
  46437. #else
  46438. "add r4, r4, r7\n\t"
  46439. #endif
  46440. #ifdef WOLFSSL_KEIL
  46441. "adcs r5, r5, %[r]\n\t"
  46442. #elif defined(__clang__)
  46443. "adcs r5, %[r]\n\t"
  46444. #else
  46445. "adc r5, %[r]\n\t"
  46446. #endif
  46447. "uxth r7, %[b]\n\t"
  46448. #ifdef WOLFSSL_KEIL
  46449. "muls r6, r7, r6\n\t"
  46450. #elif defined(__clang__)
  46451. "muls r6, r7\n\t"
  46452. #else
  46453. "mul r6, r7\n\t"
  46454. #endif
  46455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46456. "lsrs r7, r6, #16\n\t"
  46457. #else
  46458. "lsr r7, r6, #16\n\t"
  46459. #endif
  46460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46461. "lsls r6, r6, #16\n\t"
  46462. #else
  46463. "lsl r6, r6, #16\n\t"
  46464. #endif
  46465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46466. "adds r3, r3, r6\n\t"
  46467. #else
  46468. "add r3, r3, r6\n\t"
  46469. #endif
  46470. #ifdef WOLFSSL_KEIL
  46471. "adcs r4, r4, r7\n\t"
  46472. #elif defined(__clang__)
  46473. "adcs r4, r7\n\t"
  46474. #else
  46475. "adc r4, r7\n\t"
  46476. #endif
  46477. #ifdef WOLFSSL_KEIL
  46478. "adcs r5, r5, %[r]\n\t"
  46479. #elif defined(__clang__)
  46480. "adcs r5, %[r]\n\t"
  46481. #else
  46482. "adc r5, %[r]\n\t"
  46483. #endif
  46484. "# A[11] * B[4]\n\t"
  46485. "mov %[a], r9\n\t"
  46486. "mov %[b], r10\n\t"
  46487. "ldr %[a], [%[a], #44]\n\t"
  46488. "ldr %[b], [%[b], #16]\n\t"
  46489. "uxth r6, %[a]\n\t"
  46490. "uxth r7, %[b]\n\t"
  46491. #ifdef WOLFSSL_KEIL
  46492. "muls r7, r6, r7\n\t"
  46493. #elif defined(__clang__)
  46494. "muls r7, r6\n\t"
  46495. #else
  46496. "mul r7, r6\n\t"
  46497. #endif
  46498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46499. "adds r3, r3, r7\n\t"
  46500. #else
  46501. "add r3, r3, r7\n\t"
  46502. #endif
  46503. #ifdef WOLFSSL_KEIL
  46504. "adcs r4, r4, %[r]\n\t"
  46505. #elif defined(__clang__)
  46506. "adcs r4, %[r]\n\t"
  46507. #else
  46508. "adc r4, %[r]\n\t"
  46509. #endif
  46510. #ifdef WOLFSSL_KEIL
  46511. "adcs r5, r5, %[r]\n\t"
  46512. #elif defined(__clang__)
  46513. "adcs r5, %[r]\n\t"
  46514. #else
  46515. "adc r5, %[r]\n\t"
  46516. #endif
  46517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46518. "lsrs r7, %[b], #16\n\t"
  46519. #else
  46520. "lsr r7, %[b], #16\n\t"
  46521. #endif
  46522. #ifdef WOLFSSL_KEIL
  46523. "muls r6, r7, r6\n\t"
  46524. #elif defined(__clang__)
  46525. "muls r6, r7\n\t"
  46526. #else
  46527. "mul r6, r7\n\t"
  46528. #endif
  46529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46530. "lsrs r7, r6, #16\n\t"
  46531. #else
  46532. "lsr r7, r6, #16\n\t"
  46533. #endif
  46534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46535. "lsls r6, r6, #16\n\t"
  46536. #else
  46537. "lsl r6, r6, #16\n\t"
  46538. #endif
  46539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46540. "adds r3, r3, r6\n\t"
  46541. #else
  46542. "add r3, r3, r6\n\t"
  46543. #endif
  46544. #ifdef WOLFSSL_KEIL
  46545. "adcs r4, r4, r7\n\t"
  46546. #elif defined(__clang__)
  46547. "adcs r4, r7\n\t"
  46548. #else
  46549. "adc r4, r7\n\t"
  46550. #endif
  46551. #ifdef WOLFSSL_KEIL
  46552. "adcs r5, r5, %[r]\n\t"
  46553. #elif defined(__clang__)
  46554. "adcs r5, %[r]\n\t"
  46555. #else
  46556. "adc r5, %[r]\n\t"
  46557. #endif
  46558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46559. "lsrs r6, %[a], #16\n\t"
  46560. #else
  46561. "lsr r6, %[a], #16\n\t"
  46562. #endif
  46563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46564. "lsrs r7, %[b], #16\n\t"
  46565. #else
  46566. "lsr r7, %[b], #16\n\t"
  46567. #endif
  46568. #ifdef WOLFSSL_KEIL
  46569. "muls r7, r6, r7\n\t"
  46570. #elif defined(__clang__)
  46571. "muls r7, r6\n\t"
  46572. #else
  46573. "mul r7, r6\n\t"
  46574. #endif
  46575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46576. "adds r4, r4, r7\n\t"
  46577. #else
  46578. "add r4, r4, r7\n\t"
  46579. #endif
  46580. #ifdef WOLFSSL_KEIL
  46581. "adcs r5, r5, %[r]\n\t"
  46582. #elif defined(__clang__)
  46583. "adcs r5, %[r]\n\t"
  46584. #else
  46585. "adc r5, %[r]\n\t"
  46586. #endif
  46587. "uxth r7, %[b]\n\t"
  46588. #ifdef WOLFSSL_KEIL
  46589. "muls r6, r7, r6\n\t"
  46590. #elif defined(__clang__)
  46591. "muls r6, r7\n\t"
  46592. #else
  46593. "mul r6, r7\n\t"
  46594. #endif
  46595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46596. "lsrs r7, r6, #16\n\t"
  46597. #else
  46598. "lsr r7, r6, #16\n\t"
  46599. #endif
  46600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46601. "lsls r6, r6, #16\n\t"
  46602. #else
  46603. "lsl r6, r6, #16\n\t"
  46604. #endif
  46605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46606. "adds r3, r3, r6\n\t"
  46607. #else
  46608. "add r3, r3, r6\n\t"
  46609. #endif
  46610. #ifdef WOLFSSL_KEIL
  46611. "adcs r4, r4, r7\n\t"
  46612. #elif defined(__clang__)
  46613. "adcs r4, r7\n\t"
  46614. #else
  46615. "adc r4, r7\n\t"
  46616. #endif
  46617. #ifdef WOLFSSL_KEIL
  46618. "adcs r5, r5, %[r]\n\t"
  46619. #elif defined(__clang__)
  46620. "adcs r5, %[r]\n\t"
  46621. #else
  46622. "adc r5, %[r]\n\t"
  46623. #endif
  46624. "mov %[r], r8\n\t"
  46625. "str r3, [%[r], #60]\n\t"
  46626. "movs %[r], #0\n\t"
  46627. "# A[11] * B[5]\n\t"
  46628. "movs r3, #0\n\t"
  46629. "mov %[a], r9\n\t"
  46630. "mov %[b], r10\n\t"
  46631. "ldr %[a], [%[a], #44]\n\t"
  46632. "ldr %[b], [%[b], #20]\n\t"
  46633. "uxth r6, %[a]\n\t"
  46634. "uxth r7, %[b]\n\t"
  46635. #ifdef WOLFSSL_KEIL
  46636. "muls r7, r6, r7\n\t"
  46637. #elif defined(__clang__)
  46638. "muls r7, r6\n\t"
  46639. #else
  46640. "mul r7, r6\n\t"
  46641. #endif
  46642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46643. "adds r4, r4, r7\n\t"
  46644. #else
  46645. "add r4, r4, r7\n\t"
  46646. #endif
  46647. #ifdef WOLFSSL_KEIL
  46648. "adcs r5, r5, %[r]\n\t"
  46649. #elif defined(__clang__)
  46650. "adcs r5, %[r]\n\t"
  46651. #else
  46652. "adc r5, %[r]\n\t"
  46653. #endif
  46654. #ifdef WOLFSSL_KEIL
  46655. "adcs r3, r3, %[r]\n\t"
  46656. #elif defined(__clang__)
  46657. "adcs r3, %[r]\n\t"
  46658. #else
  46659. "adc r3, %[r]\n\t"
  46660. #endif
  46661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46662. "lsrs r7, %[b], #16\n\t"
  46663. #else
  46664. "lsr r7, %[b], #16\n\t"
  46665. #endif
  46666. #ifdef WOLFSSL_KEIL
  46667. "muls r6, r7, r6\n\t"
  46668. #elif defined(__clang__)
  46669. "muls r6, r7\n\t"
  46670. #else
  46671. "mul r6, r7\n\t"
  46672. #endif
  46673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46674. "lsrs r7, r6, #16\n\t"
  46675. #else
  46676. "lsr r7, r6, #16\n\t"
  46677. #endif
  46678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46679. "lsls r6, r6, #16\n\t"
  46680. #else
  46681. "lsl r6, r6, #16\n\t"
  46682. #endif
  46683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46684. "adds r4, r4, r6\n\t"
  46685. #else
  46686. "add r4, r4, r6\n\t"
  46687. #endif
  46688. #ifdef WOLFSSL_KEIL
  46689. "adcs r5, r5, r7\n\t"
  46690. #elif defined(__clang__)
  46691. "adcs r5, r7\n\t"
  46692. #else
  46693. "adc r5, r7\n\t"
  46694. #endif
  46695. #ifdef WOLFSSL_KEIL
  46696. "adcs r3, r3, %[r]\n\t"
  46697. #elif defined(__clang__)
  46698. "adcs r3, %[r]\n\t"
  46699. #else
  46700. "adc r3, %[r]\n\t"
  46701. #endif
  46702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46703. "lsrs r6, %[a], #16\n\t"
  46704. #else
  46705. "lsr r6, %[a], #16\n\t"
  46706. #endif
  46707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46708. "lsrs r7, %[b], #16\n\t"
  46709. #else
  46710. "lsr r7, %[b], #16\n\t"
  46711. #endif
  46712. #ifdef WOLFSSL_KEIL
  46713. "muls r7, r6, r7\n\t"
  46714. #elif defined(__clang__)
  46715. "muls r7, r6\n\t"
  46716. #else
  46717. "mul r7, r6\n\t"
  46718. #endif
  46719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46720. "adds r5, r5, r7\n\t"
  46721. #else
  46722. "add r5, r5, r7\n\t"
  46723. #endif
  46724. #ifdef WOLFSSL_KEIL
  46725. "adcs r3, r3, %[r]\n\t"
  46726. #elif defined(__clang__)
  46727. "adcs r3, %[r]\n\t"
  46728. #else
  46729. "adc r3, %[r]\n\t"
  46730. #endif
  46731. "uxth r7, %[b]\n\t"
  46732. #ifdef WOLFSSL_KEIL
  46733. "muls r6, r7, r6\n\t"
  46734. #elif defined(__clang__)
  46735. "muls r6, r7\n\t"
  46736. #else
  46737. "mul r6, r7\n\t"
  46738. #endif
  46739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46740. "lsrs r7, r6, #16\n\t"
  46741. #else
  46742. "lsr r7, r6, #16\n\t"
  46743. #endif
  46744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46745. "lsls r6, r6, #16\n\t"
  46746. #else
  46747. "lsl r6, r6, #16\n\t"
  46748. #endif
  46749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46750. "adds r4, r4, r6\n\t"
  46751. #else
  46752. "add r4, r4, r6\n\t"
  46753. #endif
  46754. #ifdef WOLFSSL_KEIL
  46755. "adcs r5, r5, r7\n\t"
  46756. #elif defined(__clang__)
  46757. "adcs r5, r7\n\t"
  46758. #else
  46759. "adc r5, r7\n\t"
  46760. #endif
  46761. #ifdef WOLFSSL_KEIL
  46762. "adcs r3, r3, %[r]\n\t"
  46763. #elif defined(__clang__)
  46764. "adcs r3, %[r]\n\t"
  46765. #else
  46766. "adc r3, %[r]\n\t"
  46767. #endif
  46768. "# A[10] * B[6]\n\t"
  46769. "mov %[a], r9\n\t"
  46770. "mov %[b], r10\n\t"
  46771. "ldr %[a], [%[a], #40]\n\t"
  46772. "ldr %[b], [%[b], #24]\n\t"
  46773. "uxth r6, %[a]\n\t"
  46774. "uxth r7, %[b]\n\t"
  46775. #ifdef WOLFSSL_KEIL
  46776. "muls r7, r6, r7\n\t"
  46777. #elif defined(__clang__)
  46778. "muls r7, r6\n\t"
  46779. #else
  46780. "mul r7, r6\n\t"
  46781. #endif
  46782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46783. "adds r4, r4, r7\n\t"
  46784. #else
  46785. "add r4, r4, r7\n\t"
  46786. #endif
  46787. #ifdef WOLFSSL_KEIL
  46788. "adcs r5, r5, %[r]\n\t"
  46789. #elif defined(__clang__)
  46790. "adcs r5, %[r]\n\t"
  46791. #else
  46792. "adc r5, %[r]\n\t"
  46793. #endif
  46794. #ifdef WOLFSSL_KEIL
  46795. "adcs r3, r3, %[r]\n\t"
  46796. #elif defined(__clang__)
  46797. "adcs r3, %[r]\n\t"
  46798. #else
  46799. "adc r3, %[r]\n\t"
  46800. #endif
  46801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46802. "lsrs r7, %[b], #16\n\t"
  46803. #else
  46804. "lsr r7, %[b], #16\n\t"
  46805. #endif
  46806. #ifdef WOLFSSL_KEIL
  46807. "muls r6, r7, r6\n\t"
  46808. #elif defined(__clang__)
  46809. "muls r6, r7\n\t"
  46810. #else
  46811. "mul r6, r7\n\t"
  46812. #endif
  46813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46814. "lsrs r7, r6, #16\n\t"
  46815. #else
  46816. "lsr r7, r6, #16\n\t"
  46817. #endif
  46818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46819. "lsls r6, r6, #16\n\t"
  46820. #else
  46821. "lsl r6, r6, #16\n\t"
  46822. #endif
  46823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46824. "adds r4, r4, r6\n\t"
  46825. #else
  46826. "add r4, r4, r6\n\t"
  46827. #endif
  46828. #ifdef WOLFSSL_KEIL
  46829. "adcs r5, r5, r7\n\t"
  46830. #elif defined(__clang__)
  46831. "adcs r5, r7\n\t"
  46832. #else
  46833. "adc r5, r7\n\t"
  46834. #endif
  46835. #ifdef WOLFSSL_KEIL
  46836. "adcs r3, r3, %[r]\n\t"
  46837. #elif defined(__clang__)
  46838. "adcs r3, %[r]\n\t"
  46839. #else
  46840. "adc r3, %[r]\n\t"
  46841. #endif
  46842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46843. "lsrs r6, %[a], #16\n\t"
  46844. #else
  46845. "lsr r6, %[a], #16\n\t"
  46846. #endif
  46847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46848. "lsrs r7, %[b], #16\n\t"
  46849. #else
  46850. "lsr r7, %[b], #16\n\t"
  46851. #endif
  46852. #ifdef WOLFSSL_KEIL
  46853. "muls r7, r6, r7\n\t"
  46854. #elif defined(__clang__)
  46855. "muls r7, r6\n\t"
  46856. #else
  46857. "mul r7, r6\n\t"
  46858. #endif
  46859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46860. "adds r5, r5, r7\n\t"
  46861. #else
  46862. "add r5, r5, r7\n\t"
  46863. #endif
  46864. #ifdef WOLFSSL_KEIL
  46865. "adcs r3, r3, %[r]\n\t"
  46866. #elif defined(__clang__)
  46867. "adcs r3, %[r]\n\t"
  46868. #else
  46869. "adc r3, %[r]\n\t"
  46870. #endif
  46871. "uxth r7, %[b]\n\t"
  46872. #ifdef WOLFSSL_KEIL
  46873. "muls r6, r7, r6\n\t"
  46874. #elif defined(__clang__)
  46875. "muls r6, r7\n\t"
  46876. #else
  46877. "mul r6, r7\n\t"
  46878. #endif
  46879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46880. "lsrs r7, r6, #16\n\t"
  46881. #else
  46882. "lsr r7, r6, #16\n\t"
  46883. #endif
  46884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46885. "lsls r6, r6, #16\n\t"
  46886. #else
  46887. "lsl r6, r6, #16\n\t"
  46888. #endif
  46889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46890. "adds r4, r4, r6\n\t"
  46891. #else
  46892. "add r4, r4, r6\n\t"
  46893. #endif
  46894. #ifdef WOLFSSL_KEIL
  46895. "adcs r5, r5, r7\n\t"
  46896. #elif defined(__clang__)
  46897. "adcs r5, r7\n\t"
  46898. #else
  46899. "adc r5, r7\n\t"
  46900. #endif
  46901. #ifdef WOLFSSL_KEIL
  46902. "adcs r3, r3, %[r]\n\t"
  46903. #elif defined(__clang__)
  46904. "adcs r3, %[r]\n\t"
  46905. #else
  46906. "adc r3, %[r]\n\t"
  46907. #endif
  46908. "# A[9] * B[7]\n\t"
  46909. "mov %[a], r9\n\t"
  46910. "mov %[b], r10\n\t"
  46911. "ldr %[a], [%[a], #36]\n\t"
  46912. "ldr %[b], [%[b], #28]\n\t"
  46913. "uxth r6, %[a]\n\t"
  46914. "uxth r7, %[b]\n\t"
  46915. #ifdef WOLFSSL_KEIL
  46916. "muls r7, r6, r7\n\t"
  46917. #elif defined(__clang__)
  46918. "muls r7, r6\n\t"
  46919. #else
  46920. "mul r7, r6\n\t"
  46921. #endif
  46922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46923. "adds r4, r4, r7\n\t"
  46924. #else
  46925. "add r4, r4, r7\n\t"
  46926. #endif
  46927. #ifdef WOLFSSL_KEIL
  46928. "adcs r5, r5, %[r]\n\t"
  46929. #elif defined(__clang__)
  46930. "adcs r5, %[r]\n\t"
  46931. #else
  46932. "adc r5, %[r]\n\t"
  46933. #endif
  46934. #ifdef WOLFSSL_KEIL
  46935. "adcs r3, r3, %[r]\n\t"
  46936. #elif defined(__clang__)
  46937. "adcs r3, %[r]\n\t"
  46938. #else
  46939. "adc r3, %[r]\n\t"
  46940. #endif
  46941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46942. "lsrs r7, %[b], #16\n\t"
  46943. #else
  46944. "lsr r7, %[b], #16\n\t"
  46945. #endif
  46946. #ifdef WOLFSSL_KEIL
  46947. "muls r6, r7, r6\n\t"
  46948. #elif defined(__clang__)
  46949. "muls r6, r7\n\t"
  46950. #else
  46951. "mul r6, r7\n\t"
  46952. #endif
  46953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46954. "lsrs r7, r6, #16\n\t"
  46955. #else
  46956. "lsr r7, r6, #16\n\t"
  46957. #endif
  46958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46959. "lsls r6, r6, #16\n\t"
  46960. #else
  46961. "lsl r6, r6, #16\n\t"
  46962. #endif
  46963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46964. "adds r4, r4, r6\n\t"
  46965. #else
  46966. "add r4, r4, r6\n\t"
  46967. #endif
  46968. #ifdef WOLFSSL_KEIL
  46969. "adcs r5, r5, r7\n\t"
  46970. #elif defined(__clang__)
  46971. "adcs r5, r7\n\t"
  46972. #else
  46973. "adc r5, r7\n\t"
  46974. #endif
  46975. #ifdef WOLFSSL_KEIL
  46976. "adcs r3, r3, %[r]\n\t"
  46977. #elif defined(__clang__)
  46978. "adcs r3, %[r]\n\t"
  46979. #else
  46980. "adc r3, %[r]\n\t"
  46981. #endif
  46982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46983. "lsrs r6, %[a], #16\n\t"
  46984. #else
  46985. "lsr r6, %[a], #16\n\t"
  46986. #endif
  46987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46988. "lsrs r7, %[b], #16\n\t"
  46989. #else
  46990. "lsr r7, %[b], #16\n\t"
  46991. #endif
  46992. #ifdef WOLFSSL_KEIL
  46993. "muls r7, r6, r7\n\t"
  46994. #elif defined(__clang__)
  46995. "muls r7, r6\n\t"
  46996. #else
  46997. "mul r7, r6\n\t"
  46998. #endif
  46999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47000. "adds r5, r5, r7\n\t"
  47001. #else
  47002. "add r5, r5, r7\n\t"
  47003. #endif
  47004. #ifdef WOLFSSL_KEIL
  47005. "adcs r3, r3, %[r]\n\t"
  47006. #elif defined(__clang__)
  47007. "adcs r3, %[r]\n\t"
  47008. #else
  47009. "adc r3, %[r]\n\t"
  47010. #endif
  47011. "uxth r7, %[b]\n\t"
  47012. #ifdef WOLFSSL_KEIL
  47013. "muls r6, r7, r6\n\t"
  47014. #elif defined(__clang__)
  47015. "muls r6, r7\n\t"
  47016. #else
  47017. "mul r6, r7\n\t"
  47018. #endif
  47019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47020. "lsrs r7, r6, #16\n\t"
  47021. #else
  47022. "lsr r7, r6, #16\n\t"
  47023. #endif
  47024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47025. "lsls r6, r6, #16\n\t"
  47026. #else
  47027. "lsl r6, r6, #16\n\t"
  47028. #endif
  47029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47030. "adds r4, r4, r6\n\t"
  47031. #else
  47032. "add r4, r4, r6\n\t"
  47033. #endif
  47034. #ifdef WOLFSSL_KEIL
  47035. "adcs r5, r5, r7\n\t"
  47036. #elif defined(__clang__)
  47037. "adcs r5, r7\n\t"
  47038. #else
  47039. "adc r5, r7\n\t"
  47040. #endif
  47041. #ifdef WOLFSSL_KEIL
  47042. "adcs r3, r3, %[r]\n\t"
  47043. #elif defined(__clang__)
  47044. "adcs r3, %[r]\n\t"
  47045. #else
  47046. "adc r3, %[r]\n\t"
  47047. #endif
  47048. "# A[8] * B[8]\n\t"
  47049. "mov %[a], r9\n\t"
  47050. "mov %[b], r10\n\t"
  47051. "ldr %[a], [%[a], #32]\n\t"
  47052. "ldr %[b], [%[b], #32]\n\t"
  47053. "uxth r6, %[a]\n\t"
  47054. "uxth r7, %[b]\n\t"
  47055. #ifdef WOLFSSL_KEIL
  47056. "muls r7, r6, r7\n\t"
  47057. #elif defined(__clang__)
  47058. "muls r7, r6\n\t"
  47059. #else
  47060. "mul r7, r6\n\t"
  47061. #endif
  47062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47063. "adds r4, r4, r7\n\t"
  47064. #else
  47065. "add r4, r4, r7\n\t"
  47066. #endif
  47067. #ifdef WOLFSSL_KEIL
  47068. "adcs r5, r5, %[r]\n\t"
  47069. #elif defined(__clang__)
  47070. "adcs r5, %[r]\n\t"
  47071. #else
  47072. "adc r5, %[r]\n\t"
  47073. #endif
  47074. #ifdef WOLFSSL_KEIL
  47075. "adcs r3, r3, %[r]\n\t"
  47076. #elif defined(__clang__)
  47077. "adcs r3, %[r]\n\t"
  47078. #else
  47079. "adc r3, %[r]\n\t"
  47080. #endif
  47081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47082. "lsrs r7, %[b], #16\n\t"
  47083. #else
  47084. "lsr r7, %[b], #16\n\t"
  47085. #endif
  47086. #ifdef WOLFSSL_KEIL
  47087. "muls r6, r7, r6\n\t"
  47088. #elif defined(__clang__)
  47089. "muls r6, r7\n\t"
  47090. #else
  47091. "mul r6, r7\n\t"
  47092. #endif
  47093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47094. "lsrs r7, r6, #16\n\t"
  47095. #else
  47096. "lsr r7, r6, #16\n\t"
  47097. #endif
  47098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47099. "lsls r6, r6, #16\n\t"
  47100. #else
  47101. "lsl r6, r6, #16\n\t"
  47102. #endif
  47103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47104. "adds r4, r4, r6\n\t"
  47105. #else
  47106. "add r4, r4, r6\n\t"
  47107. #endif
  47108. #ifdef WOLFSSL_KEIL
  47109. "adcs r5, r5, r7\n\t"
  47110. #elif defined(__clang__)
  47111. "adcs r5, r7\n\t"
  47112. #else
  47113. "adc r5, r7\n\t"
  47114. #endif
  47115. #ifdef WOLFSSL_KEIL
  47116. "adcs r3, r3, %[r]\n\t"
  47117. #elif defined(__clang__)
  47118. "adcs r3, %[r]\n\t"
  47119. #else
  47120. "adc r3, %[r]\n\t"
  47121. #endif
  47122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47123. "lsrs r6, %[a], #16\n\t"
  47124. #else
  47125. "lsr r6, %[a], #16\n\t"
  47126. #endif
  47127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47128. "lsrs r7, %[b], #16\n\t"
  47129. #else
  47130. "lsr r7, %[b], #16\n\t"
  47131. #endif
  47132. #ifdef WOLFSSL_KEIL
  47133. "muls r7, r6, r7\n\t"
  47134. #elif defined(__clang__)
  47135. "muls r7, r6\n\t"
  47136. #else
  47137. "mul r7, r6\n\t"
  47138. #endif
  47139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47140. "adds r5, r5, r7\n\t"
  47141. #else
  47142. "add r5, r5, r7\n\t"
  47143. #endif
  47144. #ifdef WOLFSSL_KEIL
  47145. "adcs r3, r3, %[r]\n\t"
  47146. #elif defined(__clang__)
  47147. "adcs r3, %[r]\n\t"
  47148. #else
  47149. "adc r3, %[r]\n\t"
  47150. #endif
  47151. "uxth r7, %[b]\n\t"
  47152. #ifdef WOLFSSL_KEIL
  47153. "muls r6, r7, r6\n\t"
  47154. #elif defined(__clang__)
  47155. "muls r6, r7\n\t"
  47156. #else
  47157. "mul r6, r7\n\t"
  47158. #endif
  47159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47160. "lsrs r7, r6, #16\n\t"
  47161. #else
  47162. "lsr r7, r6, #16\n\t"
  47163. #endif
  47164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47165. "lsls r6, r6, #16\n\t"
  47166. #else
  47167. "lsl r6, r6, #16\n\t"
  47168. #endif
  47169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47170. "adds r4, r4, r6\n\t"
  47171. #else
  47172. "add r4, r4, r6\n\t"
  47173. #endif
  47174. #ifdef WOLFSSL_KEIL
  47175. "adcs r5, r5, r7\n\t"
  47176. #elif defined(__clang__)
  47177. "adcs r5, r7\n\t"
  47178. #else
  47179. "adc r5, r7\n\t"
  47180. #endif
  47181. #ifdef WOLFSSL_KEIL
  47182. "adcs r3, r3, %[r]\n\t"
  47183. #elif defined(__clang__)
  47184. "adcs r3, %[r]\n\t"
  47185. #else
  47186. "adc r3, %[r]\n\t"
  47187. #endif
  47188. "# A[7] * B[9]\n\t"
  47189. "mov %[a], r9\n\t"
  47190. "mov %[b], r10\n\t"
  47191. "ldr %[a], [%[a], #28]\n\t"
  47192. "ldr %[b], [%[b], #36]\n\t"
  47193. "uxth r6, %[a]\n\t"
  47194. "uxth r7, %[b]\n\t"
  47195. #ifdef WOLFSSL_KEIL
  47196. "muls r7, r6, r7\n\t"
  47197. #elif defined(__clang__)
  47198. "muls r7, r6\n\t"
  47199. #else
  47200. "mul r7, r6\n\t"
  47201. #endif
  47202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47203. "adds r4, r4, r7\n\t"
  47204. #else
  47205. "add r4, r4, r7\n\t"
  47206. #endif
  47207. #ifdef WOLFSSL_KEIL
  47208. "adcs r5, r5, %[r]\n\t"
  47209. #elif defined(__clang__)
  47210. "adcs r5, %[r]\n\t"
  47211. #else
  47212. "adc r5, %[r]\n\t"
  47213. #endif
  47214. #ifdef WOLFSSL_KEIL
  47215. "adcs r3, r3, %[r]\n\t"
  47216. #elif defined(__clang__)
  47217. "adcs r3, %[r]\n\t"
  47218. #else
  47219. "adc r3, %[r]\n\t"
  47220. #endif
  47221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47222. "lsrs r7, %[b], #16\n\t"
  47223. #else
  47224. "lsr r7, %[b], #16\n\t"
  47225. #endif
  47226. #ifdef WOLFSSL_KEIL
  47227. "muls r6, r7, r6\n\t"
  47228. #elif defined(__clang__)
  47229. "muls r6, r7\n\t"
  47230. #else
  47231. "mul r6, r7\n\t"
  47232. #endif
  47233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47234. "lsrs r7, r6, #16\n\t"
  47235. #else
  47236. "lsr r7, r6, #16\n\t"
  47237. #endif
  47238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47239. "lsls r6, r6, #16\n\t"
  47240. #else
  47241. "lsl r6, r6, #16\n\t"
  47242. #endif
  47243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47244. "adds r4, r4, r6\n\t"
  47245. #else
  47246. "add r4, r4, r6\n\t"
  47247. #endif
  47248. #ifdef WOLFSSL_KEIL
  47249. "adcs r5, r5, r7\n\t"
  47250. #elif defined(__clang__)
  47251. "adcs r5, r7\n\t"
  47252. #else
  47253. "adc r5, r7\n\t"
  47254. #endif
  47255. #ifdef WOLFSSL_KEIL
  47256. "adcs r3, r3, %[r]\n\t"
  47257. #elif defined(__clang__)
  47258. "adcs r3, %[r]\n\t"
  47259. #else
  47260. "adc r3, %[r]\n\t"
  47261. #endif
  47262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47263. "lsrs r6, %[a], #16\n\t"
  47264. #else
  47265. "lsr r6, %[a], #16\n\t"
  47266. #endif
  47267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47268. "lsrs r7, %[b], #16\n\t"
  47269. #else
  47270. "lsr r7, %[b], #16\n\t"
  47271. #endif
  47272. #ifdef WOLFSSL_KEIL
  47273. "muls r7, r6, r7\n\t"
  47274. #elif defined(__clang__)
  47275. "muls r7, r6\n\t"
  47276. #else
  47277. "mul r7, r6\n\t"
  47278. #endif
  47279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47280. "adds r5, r5, r7\n\t"
  47281. #else
  47282. "add r5, r5, r7\n\t"
  47283. #endif
  47284. #ifdef WOLFSSL_KEIL
  47285. "adcs r3, r3, %[r]\n\t"
  47286. #elif defined(__clang__)
  47287. "adcs r3, %[r]\n\t"
  47288. #else
  47289. "adc r3, %[r]\n\t"
  47290. #endif
  47291. "uxth r7, %[b]\n\t"
  47292. #ifdef WOLFSSL_KEIL
  47293. "muls r6, r7, r6\n\t"
  47294. #elif defined(__clang__)
  47295. "muls r6, r7\n\t"
  47296. #else
  47297. "mul r6, r7\n\t"
  47298. #endif
  47299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47300. "lsrs r7, r6, #16\n\t"
  47301. #else
  47302. "lsr r7, r6, #16\n\t"
  47303. #endif
  47304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47305. "lsls r6, r6, #16\n\t"
  47306. #else
  47307. "lsl r6, r6, #16\n\t"
  47308. #endif
  47309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47310. "adds r4, r4, r6\n\t"
  47311. #else
  47312. "add r4, r4, r6\n\t"
  47313. #endif
  47314. #ifdef WOLFSSL_KEIL
  47315. "adcs r5, r5, r7\n\t"
  47316. #elif defined(__clang__)
  47317. "adcs r5, r7\n\t"
  47318. #else
  47319. "adc r5, r7\n\t"
  47320. #endif
  47321. #ifdef WOLFSSL_KEIL
  47322. "adcs r3, r3, %[r]\n\t"
  47323. #elif defined(__clang__)
  47324. "adcs r3, %[r]\n\t"
  47325. #else
  47326. "adc r3, %[r]\n\t"
  47327. #endif
  47328. "# A[6] * B[10]\n\t"
  47329. "mov %[a], r9\n\t"
  47330. "mov %[b], r10\n\t"
  47331. "ldr %[a], [%[a], #24]\n\t"
  47332. "ldr %[b], [%[b], #40]\n\t"
  47333. "uxth r6, %[a]\n\t"
  47334. "uxth r7, %[b]\n\t"
  47335. #ifdef WOLFSSL_KEIL
  47336. "muls r7, r6, r7\n\t"
  47337. #elif defined(__clang__)
  47338. "muls r7, r6\n\t"
  47339. #else
  47340. "mul r7, r6\n\t"
  47341. #endif
  47342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47343. "adds r4, r4, r7\n\t"
  47344. #else
  47345. "add r4, r4, r7\n\t"
  47346. #endif
  47347. #ifdef WOLFSSL_KEIL
  47348. "adcs r5, r5, %[r]\n\t"
  47349. #elif defined(__clang__)
  47350. "adcs r5, %[r]\n\t"
  47351. #else
  47352. "adc r5, %[r]\n\t"
  47353. #endif
  47354. #ifdef WOLFSSL_KEIL
  47355. "adcs r3, r3, %[r]\n\t"
  47356. #elif defined(__clang__)
  47357. "adcs r3, %[r]\n\t"
  47358. #else
  47359. "adc r3, %[r]\n\t"
  47360. #endif
  47361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47362. "lsrs r7, %[b], #16\n\t"
  47363. #else
  47364. "lsr r7, %[b], #16\n\t"
  47365. #endif
  47366. #ifdef WOLFSSL_KEIL
  47367. "muls r6, r7, r6\n\t"
  47368. #elif defined(__clang__)
  47369. "muls r6, r7\n\t"
  47370. #else
  47371. "mul r6, r7\n\t"
  47372. #endif
  47373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47374. "lsrs r7, r6, #16\n\t"
  47375. #else
  47376. "lsr r7, r6, #16\n\t"
  47377. #endif
  47378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47379. "lsls r6, r6, #16\n\t"
  47380. #else
  47381. "lsl r6, r6, #16\n\t"
  47382. #endif
  47383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47384. "adds r4, r4, r6\n\t"
  47385. #else
  47386. "add r4, r4, r6\n\t"
  47387. #endif
  47388. #ifdef WOLFSSL_KEIL
  47389. "adcs r5, r5, r7\n\t"
  47390. #elif defined(__clang__)
  47391. "adcs r5, r7\n\t"
  47392. #else
  47393. "adc r5, r7\n\t"
  47394. #endif
  47395. #ifdef WOLFSSL_KEIL
  47396. "adcs r3, r3, %[r]\n\t"
  47397. #elif defined(__clang__)
  47398. "adcs r3, %[r]\n\t"
  47399. #else
  47400. "adc r3, %[r]\n\t"
  47401. #endif
  47402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47403. "lsrs r6, %[a], #16\n\t"
  47404. #else
  47405. "lsr r6, %[a], #16\n\t"
  47406. #endif
  47407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47408. "lsrs r7, %[b], #16\n\t"
  47409. #else
  47410. "lsr r7, %[b], #16\n\t"
  47411. #endif
  47412. #ifdef WOLFSSL_KEIL
  47413. "muls r7, r6, r7\n\t"
  47414. #elif defined(__clang__)
  47415. "muls r7, r6\n\t"
  47416. #else
  47417. "mul r7, r6\n\t"
  47418. #endif
  47419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47420. "adds r5, r5, r7\n\t"
  47421. #else
  47422. "add r5, r5, r7\n\t"
  47423. #endif
  47424. #ifdef WOLFSSL_KEIL
  47425. "adcs r3, r3, %[r]\n\t"
  47426. #elif defined(__clang__)
  47427. "adcs r3, %[r]\n\t"
  47428. #else
  47429. "adc r3, %[r]\n\t"
  47430. #endif
  47431. "uxth r7, %[b]\n\t"
  47432. #ifdef WOLFSSL_KEIL
  47433. "muls r6, r7, r6\n\t"
  47434. #elif defined(__clang__)
  47435. "muls r6, r7\n\t"
  47436. #else
  47437. "mul r6, r7\n\t"
  47438. #endif
  47439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47440. "lsrs r7, r6, #16\n\t"
  47441. #else
  47442. "lsr r7, r6, #16\n\t"
  47443. #endif
  47444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47445. "lsls r6, r6, #16\n\t"
  47446. #else
  47447. "lsl r6, r6, #16\n\t"
  47448. #endif
  47449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47450. "adds r4, r4, r6\n\t"
  47451. #else
  47452. "add r4, r4, r6\n\t"
  47453. #endif
  47454. #ifdef WOLFSSL_KEIL
  47455. "adcs r5, r5, r7\n\t"
  47456. #elif defined(__clang__)
  47457. "adcs r5, r7\n\t"
  47458. #else
  47459. "adc r5, r7\n\t"
  47460. #endif
  47461. #ifdef WOLFSSL_KEIL
  47462. "adcs r3, r3, %[r]\n\t"
  47463. #elif defined(__clang__)
  47464. "adcs r3, %[r]\n\t"
  47465. #else
  47466. "adc r3, %[r]\n\t"
  47467. #endif
  47468. "# A[5] * B[11]\n\t"
  47469. "mov %[a], r9\n\t"
  47470. "mov %[b], r10\n\t"
  47471. "ldr %[a], [%[a], #20]\n\t"
  47472. "ldr %[b], [%[b], #44]\n\t"
  47473. "uxth r6, %[a]\n\t"
  47474. "uxth r7, %[b]\n\t"
  47475. #ifdef WOLFSSL_KEIL
  47476. "muls r7, r6, r7\n\t"
  47477. #elif defined(__clang__)
  47478. "muls r7, r6\n\t"
  47479. #else
  47480. "mul r7, r6\n\t"
  47481. #endif
  47482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47483. "adds r4, r4, r7\n\t"
  47484. #else
  47485. "add r4, r4, r7\n\t"
  47486. #endif
  47487. #ifdef WOLFSSL_KEIL
  47488. "adcs r5, r5, %[r]\n\t"
  47489. #elif defined(__clang__)
  47490. "adcs r5, %[r]\n\t"
  47491. #else
  47492. "adc r5, %[r]\n\t"
  47493. #endif
  47494. #ifdef WOLFSSL_KEIL
  47495. "adcs r3, r3, %[r]\n\t"
  47496. #elif defined(__clang__)
  47497. "adcs r3, %[r]\n\t"
  47498. #else
  47499. "adc r3, %[r]\n\t"
  47500. #endif
  47501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47502. "lsrs r7, %[b], #16\n\t"
  47503. #else
  47504. "lsr r7, %[b], #16\n\t"
  47505. #endif
  47506. #ifdef WOLFSSL_KEIL
  47507. "muls r6, r7, r6\n\t"
  47508. #elif defined(__clang__)
  47509. "muls r6, r7\n\t"
  47510. #else
  47511. "mul r6, r7\n\t"
  47512. #endif
  47513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47514. "lsrs r7, r6, #16\n\t"
  47515. #else
  47516. "lsr r7, r6, #16\n\t"
  47517. #endif
  47518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47519. "lsls r6, r6, #16\n\t"
  47520. #else
  47521. "lsl r6, r6, #16\n\t"
  47522. #endif
  47523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47524. "adds r4, r4, r6\n\t"
  47525. #else
  47526. "add r4, r4, r6\n\t"
  47527. #endif
  47528. #ifdef WOLFSSL_KEIL
  47529. "adcs r5, r5, r7\n\t"
  47530. #elif defined(__clang__)
  47531. "adcs r5, r7\n\t"
  47532. #else
  47533. "adc r5, r7\n\t"
  47534. #endif
  47535. #ifdef WOLFSSL_KEIL
  47536. "adcs r3, r3, %[r]\n\t"
  47537. #elif defined(__clang__)
  47538. "adcs r3, %[r]\n\t"
  47539. #else
  47540. "adc r3, %[r]\n\t"
  47541. #endif
  47542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47543. "lsrs r6, %[a], #16\n\t"
  47544. #else
  47545. "lsr r6, %[a], #16\n\t"
  47546. #endif
  47547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47548. "lsrs r7, %[b], #16\n\t"
  47549. #else
  47550. "lsr r7, %[b], #16\n\t"
  47551. #endif
  47552. #ifdef WOLFSSL_KEIL
  47553. "muls r7, r6, r7\n\t"
  47554. #elif defined(__clang__)
  47555. "muls r7, r6\n\t"
  47556. #else
  47557. "mul r7, r6\n\t"
  47558. #endif
  47559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47560. "adds r5, r5, r7\n\t"
  47561. #else
  47562. "add r5, r5, r7\n\t"
  47563. #endif
  47564. #ifdef WOLFSSL_KEIL
  47565. "adcs r3, r3, %[r]\n\t"
  47566. #elif defined(__clang__)
  47567. "adcs r3, %[r]\n\t"
  47568. #else
  47569. "adc r3, %[r]\n\t"
  47570. #endif
  47571. "uxth r7, %[b]\n\t"
  47572. #ifdef WOLFSSL_KEIL
  47573. "muls r6, r7, r6\n\t"
  47574. #elif defined(__clang__)
  47575. "muls r6, r7\n\t"
  47576. #else
  47577. "mul r6, r7\n\t"
  47578. #endif
  47579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47580. "lsrs r7, r6, #16\n\t"
  47581. #else
  47582. "lsr r7, r6, #16\n\t"
  47583. #endif
  47584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47585. "lsls r6, r6, #16\n\t"
  47586. #else
  47587. "lsl r6, r6, #16\n\t"
  47588. #endif
  47589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47590. "adds r4, r4, r6\n\t"
  47591. #else
  47592. "add r4, r4, r6\n\t"
  47593. #endif
  47594. #ifdef WOLFSSL_KEIL
  47595. "adcs r5, r5, r7\n\t"
  47596. #elif defined(__clang__)
  47597. "adcs r5, r7\n\t"
  47598. #else
  47599. "adc r5, r7\n\t"
  47600. #endif
  47601. #ifdef WOLFSSL_KEIL
  47602. "adcs r3, r3, %[r]\n\t"
  47603. #elif defined(__clang__)
  47604. "adcs r3, %[r]\n\t"
  47605. #else
  47606. "adc r3, %[r]\n\t"
  47607. #endif
  47608. "mov %[r], r8\n\t"
  47609. "str r4, [%[r], #64]\n\t"
  47610. "movs %[r], #0\n\t"
  47611. "# A[6] * B[11]\n\t"
  47612. "movs r4, #0\n\t"
  47613. "mov %[a], r9\n\t"
  47614. "mov %[b], r10\n\t"
  47615. "ldr %[a], [%[a], #24]\n\t"
  47616. "ldr %[b], [%[b], #44]\n\t"
  47617. "uxth r6, %[a]\n\t"
  47618. "uxth r7, %[b]\n\t"
  47619. #ifdef WOLFSSL_KEIL
  47620. "muls r7, r6, r7\n\t"
  47621. #elif defined(__clang__)
  47622. "muls r7, r6\n\t"
  47623. #else
  47624. "mul r7, r6\n\t"
  47625. #endif
  47626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47627. "adds r5, r5, r7\n\t"
  47628. #else
  47629. "add r5, r5, r7\n\t"
  47630. #endif
  47631. #ifdef WOLFSSL_KEIL
  47632. "adcs r3, r3, %[r]\n\t"
  47633. #elif defined(__clang__)
  47634. "adcs r3, %[r]\n\t"
  47635. #else
  47636. "adc r3, %[r]\n\t"
  47637. #endif
  47638. #ifdef WOLFSSL_KEIL
  47639. "adcs r4, r4, %[r]\n\t"
  47640. #elif defined(__clang__)
  47641. "adcs r4, %[r]\n\t"
  47642. #else
  47643. "adc r4, %[r]\n\t"
  47644. #endif
  47645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47646. "lsrs r7, %[b], #16\n\t"
  47647. #else
  47648. "lsr r7, %[b], #16\n\t"
  47649. #endif
  47650. #ifdef WOLFSSL_KEIL
  47651. "muls r6, r7, r6\n\t"
  47652. #elif defined(__clang__)
  47653. "muls r6, r7\n\t"
  47654. #else
  47655. "mul r6, r7\n\t"
  47656. #endif
  47657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47658. "lsrs r7, r6, #16\n\t"
  47659. #else
  47660. "lsr r7, r6, #16\n\t"
  47661. #endif
  47662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47663. "lsls r6, r6, #16\n\t"
  47664. #else
  47665. "lsl r6, r6, #16\n\t"
  47666. #endif
  47667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47668. "adds r5, r5, r6\n\t"
  47669. #else
  47670. "add r5, r5, r6\n\t"
  47671. #endif
  47672. #ifdef WOLFSSL_KEIL
  47673. "adcs r3, r3, r7\n\t"
  47674. #elif defined(__clang__)
  47675. "adcs r3, r7\n\t"
  47676. #else
  47677. "adc r3, r7\n\t"
  47678. #endif
  47679. #ifdef WOLFSSL_KEIL
  47680. "adcs r4, r4, %[r]\n\t"
  47681. #elif defined(__clang__)
  47682. "adcs r4, %[r]\n\t"
  47683. #else
  47684. "adc r4, %[r]\n\t"
  47685. #endif
  47686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47687. "lsrs r6, %[a], #16\n\t"
  47688. #else
  47689. "lsr r6, %[a], #16\n\t"
  47690. #endif
  47691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47692. "lsrs r7, %[b], #16\n\t"
  47693. #else
  47694. "lsr r7, %[b], #16\n\t"
  47695. #endif
  47696. #ifdef WOLFSSL_KEIL
  47697. "muls r7, r6, r7\n\t"
  47698. #elif defined(__clang__)
  47699. "muls r7, r6\n\t"
  47700. #else
  47701. "mul r7, r6\n\t"
  47702. #endif
  47703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47704. "adds r3, r3, r7\n\t"
  47705. #else
  47706. "add r3, r3, r7\n\t"
  47707. #endif
  47708. #ifdef WOLFSSL_KEIL
  47709. "adcs r4, r4, %[r]\n\t"
  47710. #elif defined(__clang__)
  47711. "adcs r4, %[r]\n\t"
  47712. #else
  47713. "adc r4, %[r]\n\t"
  47714. #endif
  47715. "uxth r7, %[b]\n\t"
  47716. #ifdef WOLFSSL_KEIL
  47717. "muls r6, r7, r6\n\t"
  47718. #elif defined(__clang__)
  47719. "muls r6, r7\n\t"
  47720. #else
  47721. "mul r6, r7\n\t"
  47722. #endif
  47723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47724. "lsrs r7, r6, #16\n\t"
  47725. #else
  47726. "lsr r7, r6, #16\n\t"
  47727. #endif
  47728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47729. "lsls r6, r6, #16\n\t"
  47730. #else
  47731. "lsl r6, r6, #16\n\t"
  47732. #endif
  47733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47734. "adds r5, r5, r6\n\t"
  47735. #else
  47736. "add r5, r5, r6\n\t"
  47737. #endif
  47738. #ifdef WOLFSSL_KEIL
  47739. "adcs r3, r3, r7\n\t"
  47740. #elif defined(__clang__)
  47741. "adcs r3, r7\n\t"
  47742. #else
  47743. "adc r3, r7\n\t"
  47744. #endif
  47745. #ifdef WOLFSSL_KEIL
  47746. "adcs r4, r4, %[r]\n\t"
  47747. #elif defined(__clang__)
  47748. "adcs r4, %[r]\n\t"
  47749. #else
  47750. "adc r4, %[r]\n\t"
  47751. #endif
  47752. "# A[7] * B[10]\n\t"
  47753. "mov %[a], r9\n\t"
  47754. "mov %[b], r10\n\t"
  47755. "ldr %[a], [%[a], #28]\n\t"
  47756. "ldr %[b], [%[b], #40]\n\t"
  47757. "uxth r6, %[a]\n\t"
  47758. "uxth r7, %[b]\n\t"
  47759. #ifdef WOLFSSL_KEIL
  47760. "muls r7, r6, r7\n\t"
  47761. #elif defined(__clang__)
  47762. "muls r7, r6\n\t"
  47763. #else
  47764. "mul r7, r6\n\t"
  47765. #endif
  47766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47767. "adds r5, r5, r7\n\t"
  47768. #else
  47769. "add r5, r5, r7\n\t"
  47770. #endif
  47771. #ifdef WOLFSSL_KEIL
  47772. "adcs r3, r3, %[r]\n\t"
  47773. #elif defined(__clang__)
  47774. "adcs r3, %[r]\n\t"
  47775. #else
  47776. "adc r3, %[r]\n\t"
  47777. #endif
  47778. #ifdef WOLFSSL_KEIL
  47779. "adcs r4, r4, %[r]\n\t"
  47780. #elif defined(__clang__)
  47781. "adcs r4, %[r]\n\t"
  47782. #else
  47783. "adc r4, %[r]\n\t"
  47784. #endif
  47785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47786. "lsrs r7, %[b], #16\n\t"
  47787. #else
  47788. "lsr r7, %[b], #16\n\t"
  47789. #endif
  47790. #ifdef WOLFSSL_KEIL
  47791. "muls r6, r7, r6\n\t"
  47792. #elif defined(__clang__)
  47793. "muls r6, r7\n\t"
  47794. #else
  47795. "mul r6, r7\n\t"
  47796. #endif
  47797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47798. "lsrs r7, r6, #16\n\t"
  47799. #else
  47800. "lsr r7, r6, #16\n\t"
  47801. #endif
  47802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47803. "lsls r6, r6, #16\n\t"
  47804. #else
  47805. "lsl r6, r6, #16\n\t"
  47806. #endif
  47807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47808. "adds r5, r5, r6\n\t"
  47809. #else
  47810. "add r5, r5, r6\n\t"
  47811. #endif
  47812. #ifdef WOLFSSL_KEIL
  47813. "adcs r3, r3, r7\n\t"
  47814. #elif defined(__clang__)
  47815. "adcs r3, r7\n\t"
  47816. #else
  47817. "adc r3, r7\n\t"
  47818. #endif
  47819. #ifdef WOLFSSL_KEIL
  47820. "adcs r4, r4, %[r]\n\t"
  47821. #elif defined(__clang__)
  47822. "adcs r4, %[r]\n\t"
  47823. #else
  47824. "adc r4, %[r]\n\t"
  47825. #endif
  47826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47827. "lsrs r6, %[a], #16\n\t"
  47828. #else
  47829. "lsr r6, %[a], #16\n\t"
  47830. #endif
  47831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47832. "lsrs r7, %[b], #16\n\t"
  47833. #else
  47834. "lsr r7, %[b], #16\n\t"
  47835. #endif
  47836. #ifdef WOLFSSL_KEIL
  47837. "muls r7, r6, r7\n\t"
  47838. #elif defined(__clang__)
  47839. "muls r7, r6\n\t"
  47840. #else
  47841. "mul r7, r6\n\t"
  47842. #endif
  47843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47844. "adds r3, r3, r7\n\t"
  47845. #else
  47846. "add r3, r3, r7\n\t"
  47847. #endif
  47848. #ifdef WOLFSSL_KEIL
  47849. "adcs r4, r4, %[r]\n\t"
  47850. #elif defined(__clang__)
  47851. "adcs r4, %[r]\n\t"
  47852. #else
  47853. "adc r4, %[r]\n\t"
  47854. #endif
  47855. "uxth r7, %[b]\n\t"
  47856. #ifdef WOLFSSL_KEIL
  47857. "muls r6, r7, r6\n\t"
  47858. #elif defined(__clang__)
  47859. "muls r6, r7\n\t"
  47860. #else
  47861. "mul r6, r7\n\t"
  47862. #endif
  47863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47864. "lsrs r7, r6, #16\n\t"
  47865. #else
  47866. "lsr r7, r6, #16\n\t"
  47867. #endif
  47868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47869. "lsls r6, r6, #16\n\t"
  47870. #else
  47871. "lsl r6, r6, #16\n\t"
  47872. #endif
  47873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47874. "adds r5, r5, r6\n\t"
  47875. #else
  47876. "add r5, r5, r6\n\t"
  47877. #endif
  47878. #ifdef WOLFSSL_KEIL
  47879. "adcs r3, r3, r7\n\t"
  47880. #elif defined(__clang__)
  47881. "adcs r3, r7\n\t"
  47882. #else
  47883. "adc r3, r7\n\t"
  47884. #endif
  47885. #ifdef WOLFSSL_KEIL
  47886. "adcs r4, r4, %[r]\n\t"
  47887. #elif defined(__clang__)
  47888. "adcs r4, %[r]\n\t"
  47889. #else
  47890. "adc r4, %[r]\n\t"
  47891. #endif
  47892. "# A[8] * B[9]\n\t"
  47893. "mov %[a], r9\n\t"
  47894. "mov %[b], r10\n\t"
  47895. "ldr %[a], [%[a], #32]\n\t"
  47896. "ldr %[b], [%[b], #36]\n\t"
  47897. "uxth r6, %[a]\n\t"
  47898. "uxth r7, %[b]\n\t"
  47899. #ifdef WOLFSSL_KEIL
  47900. "muls r7, r6, r7\n\t"
  47901. #elif defined(__clang__)
  47902. "muls r7, r6\n\t"
  47903. #else
  47904. "mul r7, r6\n\t"
  47905. #endif
  47906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47907. "adds r5, r5, r7\n\t"
  47908. #else
  47909. "add r5, r5, r7\n\t"
  47910. #endif
  47911. #ifdef WOLFSSL_KEIL
  47912. "adcs r3, r3, %[r]\n\t"
  47913. #elif defined(__clang__)
  47914. "adcs r3, %[r]\n\t"
  47915. #else
  47916. "adc r3, %[r]\n\t"
  47917. #endif
  47918. #ifdef WOLFSSL_KEIL
  47919. "adcs r4, r4, %[r]\n\t"
  47920. #elif defined(__clang__)
  47921. "adcs r4, %[r]\n\t"
  47922. #else
  47923. "adc r4, %[r]\n\t"
  47924. #endif
  47925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47926. "lsrs r7, %[b], #16\n\t"
  47927. #else
  47928. "lsr r7, %[b], #16\n\t"
  47929. #endif
  47930. #ifdef WOLFSSL_KEIL
  47931. "muls r6, r7, r6\n\t"
  47932. #elif defined(__clang__)
  47933. "muls r6, r7\n\t"
  47934. #else
  47935. "mul r6, r7\n\t"
  47936. #endif
  47937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47938. "lsrs r7, r6, #16\n\t"
  47939. #else
  47940. "lsr r7, r6, #16\n\t"
  47941. #endif
  47942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47943. "lsls r6, r6, #16\n\t"
  47944. #else
  47945. "lsl r6, r6, #16\n\t"
  47946. #endif
  47947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47948. "adds r5, r5, r6\n\t"
  47949. #else
  47950. "add r5, r5, r6\n\t"
  47951. #endif
  47952. #ifdef WOLFSSL_KEIL
  47953. "adcs r3, r3, r7\n\t"
  47954. #elif defined(__clang__)
  47955. "adcs r3, r7\n\t"
  47956. #else
  47957. "adc r3, r7\n\t"
  47958. #endif
  47959. #ifdef WOLFSSL_KEIL
  47960. "adcs r4, r4, %[r]\n\t"
  47961. #elif defined(__clang__)
  47962. "adcs r4, %[r]\n\t"
  47963. #else
  47964. "adc r4, %[r]\n\t"
  47965. #endif
  47966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47967. "lsrs r6, %[a], #16\n\t"
  47968. #else
  47969. "lsr r6, %[a], #16\n\t"
  47970. #endif
  47971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47972. "lsrs r7, %[b], #16\n\t"
  47973. #else
  47974. "lsr r7, %[b], #16\n\t"
  47975. #endif
  47976. #ifdef WOLFSSL_KEIL
  47977. "muls r7, r6, r7\n\t"
  47978. #elif defined(__clang__)
  47979. "muls r7, r6\n\t"
  47980. #else
  47981. "mul r7, r6\n\t"
  47982. #endif
  47983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47984. "adds r3, r3, r7\n\t"
  47985. #else
  47986. "add r3, r3, r7\n\t"
  47987. #endif
  47988. #ifdef WOLFSSL_KEIL
  47989. "adcs r4, r4, %[r]\n\t"
  47990. #elif defined(__clang__)
  47991. "adcs r4, %[r]\n\t"
  47992. #else
  47993. "adc r4, %[r]\n\t"
  47994. #endif
  47995. "uxth r7, %[b]\n\t"
  47996. #ifdef WOLFSSL_KEIL
  47997. "muls r6, r7, r6\n\t"
  47998. #elif defined(__clang__)
  47999. "muls r6, r7\n\t"
  48000. #else
  48001. "mul r6, r7\n\t"
  48002. #endif
  48003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48004. "lsrs r7, r6, #16\n\t"
  48005. #else
  48006. "lsr r7, r6, #16\n\t"
  48007. #endif
  48008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48009. "lsls r6, r6, #16\n\t"
  48010. #else
  48011. "lsl r6, r6, #16\n\t"
  48012. #endif
  48013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48014. "adds r5, r5, r6\n\t"
  48015. #else
  48016. "add r5, r5, r6\n\t"
  48017. #endif
  48018. #ifdef WOLFSSL_KEIL
  48019. "adcs r3, r3, r7\n\t"
  48020. #elif defined(__clang__)
  48021. "adcs r3, r7\n\t"
  48022. #else
  48023. "adc r3, r7\n\t"
  48024. #endif
  48025. #ifdef WOLFSSL_KEIL
  48026. "adcs r4, r4, %[r]\n\t"
  48027. #elif defined(__clang__)
  48028. "adcs r4, %[r]\n\t"
  48029. #else
  48030. "adc r4, %[r]\n\t"
  48031. #endif
  48032. "# A[9] * B[8]\n\t"
  48033. "mov %[a], r9\n\t"
  48034. "mov %[b], r10\n\t"
  48035. "ldr %[a], [%[a], #36]\n\t"
  48036. "ldr %[b], [%[b], #32]\n\t"
  48037. "uxth r6, %[a]\n\t"
  48038. "uxth r7, %[b]\n\t"
  48039. #ifdef WOLFSSL_KEIL
  48040. "muls r7, r6, r7\n\t"
  48041. #elif defined(__clang__)
  48042. "muls r7, r6\n\t"
  48043. #else
  48044. "mul r7, r6\n\t"
  48045. #endif
  48046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48047. "adds r5, r5, r7\n\t"
  48048. #else
  48049. "add r5, r5, r7\n\t"
  48050. #endif
  48051. #ifdef WOLFSSL_KEIL
  48052. "adcs r3, r3, %[r]\n\t"
  48053. #elif defined(__clang__)
  48054. "adcs r3, %[r]\n\t"
  48055. #else
  48056. "adc r3, %[r]\n\t"
  48057. #endif
  48058. #ifdef WOLFSSL_KEIL
  48059. "adcs r4, r4, %[r]\n\t"
  48060. #elif defined(__clang__)
  48061. "adcs r4, %[r]\n\t"
  48062. #else
  48063. "adc r4, %[r]\n\t"
  48064. #endif
  48065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48066. "lsrs r7, %[b], #16\n\t"
  48067. #else
  48068. "lsr r7, %[b], #16\n\t"
  48069. #endif
  48070. #ifdef WOLFSSL_KEIL
  48071. "muls r6, r7, r6\n\t"
  48072. #elif defined(__clang__)
  48073. "muls r6, r7\n\t"
  48074. #else
  48075. "mul r6, r7\n\t"
  48076. #endif
  48077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48078. "lsrs r7, r6, #16\n\t"
  48079. #else
  48080. "lsr r7, r6, #16\n\t"
  48081. #endif
  48082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48083. "lsls r6, r6, #16\n\t"
  48084. #else
  48085. "lsl r6, r6, #16\n\t"
  48086. #endif
  48087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48088. "adds r5, r5, r6\n\t"
  48089. #else
  48090. "add r5, r5, r6\n\t"
  48091. #endif
  48092. #ifdef WOLFSSL_KEIL
  48093. "adcs r3, r3, r7\n\t"
  48094. #elif defined(__clang__)
  48095. "adcs r3, r7\n\t"
  48096. #else
  48097. "adc r3, r7\n\t"
  48098. #endif
  48099. #ifdef WOLFSSL_KEIL
  48100. "adcs r4, r4, %[r]\n\t"
  48101. #elif defined(__clang__)
  48102. "adcs r4, %[r]\n\t"
  48103. #else
  48104. "adc r4, %[r]\n\t"
  48105. #endif
  48106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48107. "lsrs r6, %[a], #16\n\t"
  48108. #else
  48109. "lsr r6, %[a], #16\n\t"
  48110. #endif
  48111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48112. "lsrs r7, %[b], #16\n\t"
  48113. #else
  48114. "lsr r7, %[b], #16\n\t"
  48115. #endif
  48116. #ifdef WOLFSSL_KEIL
  48117. "muls r7, r6, r7\n\t"
  48118. #elif defined(__clang__)
  48119. "muls r7, r6\n\t"
  48120. #else
  48121. "mul r7, r6\n\t"
  48122. #endif
  48123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48124. "adds r3, r3, r7\n\t"
  48125. #else
  48126. "add r3, r3, r7\n\t"
  48127. #endif
  48128. #ifdef WOLFSSL_KEIL
  48129. "adcs r4, r4, %[r]\n\t"
  48130. #elif defined(__clang__)
  48131. "adcs r4, %[r]\n\t"
  48132. #else
  48133. "adc r4, %[r]\n\t"
  48134. #endif
  48135. "uxth r7, %[b]\n\t"
  48136. #ifdef WOLFSSL_KEIL
  48137. "muls r6, r7, r6\n\t"
  48138. #elif defined(__clang__)
  48139. "muls r6, r7\n\t"
  48140. #else
  48141. "mul r6, r7\n\t"
  48142. #endif
  48143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48144. "lsrs r7, r6, #16\n\t"
  48145. #else
  48146. "lsr r7, r6, #16\n\t"
  48147. #endif
  48148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48149. "lsls r6, r6, #16\n\t"
  48150. #else
  48151. "lsl r6, r6, #16\n\t"
  48152. #endif
  48153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48154. "adds r5, r5, r6\n\t"
  48155. #else
  48156. "add r5, r5, r6\n\t"
  48157. #endif
  48158. #ifdef WOLFSSL_KEIL
  48159. "adcs r3, r3, r7\n\t"
  48160. #elif defined(__clang__)
  48161. "adcs r3, r7\n\t"
  48162. #else
  48163. "adc r3, r7\n\t"
  48164. #endif
  48165. #ifdef WOLFSSL_KEIL
  48166. "adcs r4, r4, %[r]\n\t"
  48167. #elif defined(__clang__)
  48168. "adcs r4, %[r]\n\t"
  48169. #else
  48170. "adc r4, %[r]\n\t"
  48171. #endif
  48172. "# A[10] * B[7]\n\t"
  48173. "mov %[a], r9\n\t"
  48174. "mov %[b], r10\n\t"
  48175. "ldr %[a], [%[a], #40]\n\t"
  48176. "ldr %[b], [%[b], #28]\n\t"
  48177. "uxth r6, %[a]\n\t"
  48178. "uxth r7, %[b]\n\t"
  48179. #ifdef WOLFSSL_KEIL
  48180. "muls r7, r6, r7\n\t"
  48181. #elif defined(__clang__)
  48182. "muls r7, r6\n\t"
  48183. #else
  48184. "mul r7, r6\n\t"
  48185. #endif
  48186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48187. "adds r5, r5, r7\n\t"
  48188. #else
  48189. "add r5, r5, r7\n\t"
  48190. #endif
  48191. #ifdef WOLFSSL_KEIL
  48192. "adcs r3, r3, %[r]\n\t"
  48193. #elif defined(__clang__)
  48194. "adcs r3, %[r]\n\t"
  48195. #else
  48196. "adc r3, %[r]\n\t"
  48197. #endif
  48198. #ifdef WOLFSSL_KEIL
  48199. "adcs r4, r4, %[r]\n\t"
  48200. #elif defined(__clang__)
  48201. "adcs r4, %[r]\n\t"
  48202. #else
  48203. "adc r4, %[r]\n\t"
  48204. #endif
  48205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48206. "lsrs r7, %[b], #16\n\t"
  48207. #else
  48208. "lsr r7, %[b], #16\n\t"
  48209. #endif
  48210. #ifdef WOLFSSL_KEIL
  48211. "muls r6, r7, r6\n\t"
  48212. #elif defined(__clang__)
  48213. "muls r6, r7\n\t"
  48214. #else
  48215. "mul r6, r7\n\t"
  48216. #endif
  48217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48218. "lsrs r7, r6, #16\n\t"
  48219. #else
  48220. "lsr r7, r6, #16\n\t"
  48221. #endif
  48222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48223. "lsls r6, r6, #16\n\t"
  48224. #else
  48225. "lsl r6, r6, #16\n\t"
  48226. #endif
  48227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48228. "adds r5, r5, r6\n\t"
  48229. #else
  48230. "add r5, r5, r6\n\t"
  48231. #endif
  48232. #ifdef WOLFSSL_KEIL
  48233. "adcs r3, r3, r7\n\t"
  48234. #elif defined(__clang__)
  48235. "adcs r3, r7\n\t"
  48236. #else
  48237. "adc r3, r7\n\t"
  48238. #endif
  48239. #ifdef WOLFSSL_KEIL
  48240. "adcs r4, r4, %[r]\n\t"
  48241. #elif defined(__clang__)
  48242. "adcs r4, %[r]\n\t"
  48243. #else
  48244. "adc r4, %[r]\n\t"
  48245. #endif
  48246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48247. "lsrs r6, %[a], #16\n\t"
  48248. #else
  48249. "lsr r6, %[a], #16\n\t"
  48250. #endif
  48251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48252. "lsrs r7, %[b], #16\n\t"
  48253. #else
  48254. "lsr r7, %[b], #16\n\t"
  48255. #endif
  48256. #ifdef WOLFSSL_KEIL
  48257. "muls r7, r6, r7\n\t"
  48258. #elif defined(__clang__)
  48259. "muls r7, r6\n\t"
  48260. #else
  48261. "mul r7, r6\n\t"
  48262. #endif
  48263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48264. "adds r3, r3, r7\n\t"
  48265. #else
  48266. "add r3, r3, r7\n\t"
  48267. #endif
  48268. #ifdef WOLFSSL_KEIL
  48269. "adcs r4, r4, %[r]\n\t"
  48270. #elif defined(__clang__)
  48271. "adcs r4, %[r]\n\t"
  48272. #else
  48273. "adc r4, %[r]\n\t"
  48274. #endif
  48275. "uxth r7, %[b]\n\t"
  48276. #ifdef WOLFSSL_KEIL
  48277. "muls r6, r7, r6\n\t"
  48278. #elif defined(__clang__)
  48279. "muls r6, r7\n\t"
  48280. #else
  48281. "mul r6, r7\n\t"
  48282. #endif
  48283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48284. "lsrs r7, r6, #16\n\t"
  48285. #else
  48286. "lsr r7, r6, #16\n\t"
  48287. #endif
  48288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48289. "lsls r6, r6, #16\n\t"
  48290. #else
  48291. "lsl r6, r6, #16\n\t"
  48292. #endif
  48293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48294. "adds r5, r5, r6\n\t"
  48295. #else
  48296. "add r5, r5, r6\n\t"
  48297. #endif
  48298. #ifdef WOLFSSL_KEIL
  48299. "adcs r3, r3, r7\n\t"
  48300. #elif defined(__clang__)
  48301. "adcs r3, r7\n\t"
  48302. #else
  48303. "adc r3, r7\n\t"
  48304. #endif
  48305. #ifdef WOLFSSL_KEIL
  48306. "adcs r4, r4, %[r]\n\t"
  48307. #elif defined(__clang__)
  48308. "adcs r4, %[r]\n\t"
  48309. #else
  48310. "adc r4, %[r]\n\t"
  48311. #endif
  48312. "# A[11] * B[6]\n\t"
  48313. "mov %[a], r9\n\t"
  48314. "mov %[b], r10\n\t"
  48315. "ldr %[a], [%[a], #44]\n\t"
  48316. "ldr %[b], [%[b], #24]\n\t"
  48317. "uxth r6, %[a]\n\t"
  48318. "uxth r7, %[b]\n\t"
  48319. #ifdef WOLFSSL_KEIL
  48320. "muls r7, r6, r7\n\t"
  48321. #elif defined(__clang__)
  48322. "muls r7, r6\n\t"
  48323. #else
  48324. "mul r7, r6\n\t"
  48325. #endif
  48326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48327. "adds r5, r5, r7\n\t"
  48328. #else
  48329. "add r5, r5, r7\n\t"
  48330. #endif
  48331. #ifdef WOLFSSL_KEIL
  48332. "adcs r3, r3, %[r]\n\t"
  48333. #elif defined(__clang__)
  48334. "adcs r3, %[r]\n\t"
  48335. #else
  48336. "adc r3, %[r]\n\t"
  48337. #endif
  48338. #ifdef WOLFSSL_KEIL
  48339. "adcs r4, r4, %[r]\n\t"
  48340. #elif defined(__clang__)
  48341. "adcs r4, %[r]\n\t"
  48342. #else
  48343. "adc r4, %[r]\n\t"
  48344. #endif
  48345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48346. "lsrs r7, %[b], #16\n\t"
  48347. #else
  48348. "lsr r7, %[b], #16\n\t"
  48349. #endif
  48350. #ifdef WOLFSSL_KEIL
  48351. "muls r6, r7, r6\n\t"
  48352. #elif defined(__clang__)
  48353. "muls r6, r7\n\t"
  48354. #else
  48355. "mul r6, r7\n\t"
  48356. #endif
  48357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48358. "lsrs r7, r6, #16\n\t"
  48359. #else
  48360. "lsr r7, r6, #16\n\t"
  48361. #endif
  48362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48363. "lsls r6, r6, #16\n\t"
  48364. #else
  48365. "lsl r6, r6, #16\n\t"
  48366. #endif
  48367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48368. "adds r5, r5, r6\n\t"
  48369. #else
  48370. "add r5, r5, r6\n\t"
  48371. #endif
  48372. #ifdef WOLFSSL_KEIL
  48373. "adcs r3, r3, r7\n\t"
  48374. #elif defined(__clang__)
  48375. "adcs r3, r7\n\t"
  48376. #else
  48377. "adc r3, r7\n\t"
  48378. #endif
  48379. #ifdef WOLFSSL_KEIL
  48380. "adcs r4, r4, %[r]\n\t"
  48381. #elif defined(__clang__)
  48382. "adcs r4, %[r]\n\t"
  48383. #else
  48384. "adc r4, %[r]\n\t"
  48385. #endif
  48386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48387. "lsrs r6, %[a], #16\n\t"
  48388. #else
  48389. "lsr r6, %[a], #16\n\t"
  48390. #endif
  48391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48392. "lsrs r7, %[b], #16\n\t"
  48393. #else
  48394. "lsr r7, %[b], #16\n\t"
  48395. #endif
  48396. #ifdef WOLFSSL_KEIL
  48397. "muls r7, r6, r7\n\t"
  48398. #elif defined(__clang__)
  48399. "muls r7, r6\n\t"
  48400. #else
  48401. "mul r7, r6\n\t"
  48402. #endif
  48403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48404. "adds r3, r3, r7\n\t"
  48405. #else
  48406. "add r3, r3, r7\n\t"
  48407. #endif
  48408. #ifdef WOLFSSL_KEIL
  48409. "adcs r4, r4, %[r]\n\t"
  48410. #elif defined(__clang__)
  48411. "adcs r4, %[r]\n\t"
  48412. #else
  48413. "adc r4, %[r]\n\t"
  48414. #endif
  48415. "uxth r7, %[b]\n\t"
  48416. #ifdef WOLFSSL_KEIL
  48417. "muls r6, r7, r6\n\t"
  48418. #elif defined(__clang__)
  48419. "muls r6, r7\n\t"
  48420. #else
  48421. "mul r6, r7\n\t"
  48422. #endif
  48423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48424. "lsrs r7, r6, #16\n\t"
  48425. #else
  48426. "lsr r7, r6, #16\n\t"
  48427. #endif
  48428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48429. "lsls r6, r6, #16\n\t"
  48430. #else
  48431. "lsl r6, r6, #16\n\t"
  48432. #endif
  48433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48434. "adds r5, r5, r6\n\t"
  48435. #else
  48436. "add r5, r5, r6\n\t"
  48437. #endif
  48438. #ifdef WOLFSSL_KEIL
  48439. "adcs r3, r3, r7\n\t"
  48440. #elif defined(__clang__)
  48441. "adcs r3, r7\n\t"
  48442. #else
  48443. "adc r3, r7\n\t"
  48444. #endif
  48445. #ifdef WOLFSSL_KEIL
  48446. "adcs r4, r4, %[r]\n\t"
  48447. #elif defined(__clang__)
  48448. "adcs r4, %[r]\n\t"
  48449. #else
  48450. "adc r4, %[r]\n\t"
  48451. #endif
  48452. "mov %[r], r8\n\t"
  48453. "str r5, [%[r], #68]\n\t"
  48454. "movs %[r], #0\n\t"
  48455. "# A[11] * B[7]\n\t"
  48456. "movs r5, #0\n\t"
  48457. "mov %[a], r9\n\t"
  48458. "mov %[b], r10\n\t"
  48459. "ldr %[a], [%[a], #44]\n\t"
  48460. "ldr %[b], [%[b], #28]\n\t"
  48461. "uxth r6, %[a]\n\t"
  48462. "uxth r7, %[b]\n\t"
  48463. #ifdef WOLFSSL_KEIL
  48464. "muls r7, r6, r7\n\t"
  48465. #elif defined(__clang__)
  48466. "muls r7, r6\n\t"
  48467. #else
  48468. "mul r7, r6\n\t"
  48469. #endif
  48470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48471. "adds r3, r3, r7\n\t"
  48472. #else
  48473. "add r3, r3, r7\n\t"
  48474. #endif
  48475. #ifdef WOLFSSL_KEIL
  48476. "adcs r4, r4, %[r]\n\t"
  48477. #elif defined(__clang__)
  48478. "adcs r4, %[r]\n\t"
  48479. #else
  48480. "adc r4, %[r]\n\t"
  48481. #endif
  48482. #ifdef WOLFSSL_KEIL
  48483. "adcs r5, r5, %[r]\n\t"
  48484. #elif defined(__clang__)
  48485. "adcs r5, %[r]\n\t"
  48486. #else
  48487. "adc r5, %[r]\n\t"
  48488. #endif
  48489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48490. "lsrs r7, %[b], #16\n\t"
  48491. #else
  48492. "lsr r7, %[b], #16\n\t"
  48493. #endif
  48494. #ifdef WOLFSSL_KEIL
  48495. "muls r6, r7, r6\n\t"
  48496. #elif defined(__clang__)
  48497. "muls r6, r7\n\t"
  48498. #else
  48499. "mul r6, r7\n\t"
  48500. #endif
  48501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48502. "lsrs r7, r6, #16\n\t"
  48503. #else
  48504. "lsr r7, r6, #16\n\t"
  48505. #endif
  48506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48507. "lsls r6, r6, #16\n\t"
  48508. #else
  48509. "lsl r6, r6, #16\n\t"
  48510. #endif
  48511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48512. "adds r3, r3, r6\n\t"
  48513. #else
  48514. "add r3, r3, r6\n\t"
  48515. #endif
  48516. #ifdef WOLFSSL_KEIL
  48517. "adcs r4, r4, r7\n\t"
  48518. #elif defined(__clang__)
  48519. "adcs r4, r7\n\t"
  48520. #else
  48521. "adc r4, r7\n\t"
  48522. #endif
  48523. #ifdef WOLFSSL_KEIL
  48524. "adcs r5, r5, %[r]\n\t"
  48525. #elif defined(__clang__)
  48526. "adcs r5, %[r]\n\t"
  48527. #else
  48528. "adc r5, %[r]\n\t"
  48529. #endif
  48530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48531. "lsrs r6, %[a], #16\n\t"
  48532. #else
  48533. "lsr r6, %[a], #16\n\t"
  48534. #endif
  48535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48536. "lsrs r7, %[b], #16\n\t"
  48537. #else
  48538. "lsr r7, %[b], #16\n\t"
  48539. #endif
  48540. #ifdef WOLFSSL_KEIL
  48541. "muls r7, r6, r7\n\t"
  48542. #elif defined(__clang__)
  48543. "muls r7, r6\n\t"
  48544. #else
  48545. "mul r7, r6\n\t"
  48546. #endif
  48547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48548. "adds r4, r4, r7\n\t"
  48549. #else
  48550. "add r4, r4, r7\n\t"
  48551. #endif
  48552. #ifdef WOLFSSL_KEIL
  48553. "adcs r5, r5, %[r]\n\t"
  48554. #elif defined(__clang__)
  48555. "adcs r5, %[r]\n\t"
  48556. #else
  48557. "adc r5, %[r]\n\t"
  48558. #endif
  48559. "uxth r7, %[b]\n\t"
  48560. #ifdef WOLFSSL_KEIL
  48561. "muls r6, r7, r6\n\t"
  48562. #elif defined(__clang__)
  48563. "muls r6, r7\n\t"
  48564. #else
  48565. "mul r6, r7\n\t"
  48566. #endif
  48567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48568. "lsrs r7, r6, #16\n\t"
  48569. #else
  48570. "lsr r7, r6, #16\n\t"
  48571. #endif
  48572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48573. "lsls r6, r6, #16\n\t"
  48574. #else
  48575. "lsl r6, r6, #16\n\t"
  48576. #endif
  48577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48578. "adds r3, r3, r6\n\t"
  48579. #else
  48580. "add r3, r3, r6\n\t"
  48581. #endif
  48582. #ifdef WOLFSSL_KEIL
  48583. "adcs r4, r4, r7\n\t"
  48584. #elif defined(__clang__)
  48585. "adcs r4, r7\n\t"
  48586. #else
  48587. "adc r4, r7\n\t"
  48588. #endif
  48589. #ifdef WOLFSSL_KEIL
  48590. "adcs r5, r5, %[r]\n\t"
  48591. #elif defined(__clang__)
  48592. "adcs r5, %[r]\n\t"
  48593. #else
  48594. "adc r5, %[r]\n\t"
  48595. #endif
  48596. "# A[10] * B[8]\n\t"
  48597. "mov %[a], r9\n\t"
  48598. "mov %[b], r10\n\t"
  48599. "ldr %[a], [%[a], #40]\n\t"
  48600. "ldr %[b], [%[b], #32]\n\t"
  48601. "uxth r6, %[a]\n\t"
  48602. "uxth r7, %[b]\n\t"
  48603. #ifdef WOLFSSL_KEIL
  48604. "muls r7, r6, r7\n\t"
  48605. #elif defined(__clang__)
  48606. "muls r7, r6\n\t"
  48607. #else
  48608. "mul r7, r6\n\t"
  48609. #endif
  48610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48611. "adds r3, r3, r7\n\t"
  48612. #else
  48613. "add r3, r3, r7\n\t"
  48614. #endif
  48615. #ifdef WOLFSSL_KEIL
  48616. "adcs r4, r4, %[r]\n\t"
  48617. #elif defined(__clang__)
  48618. "adcs r4, %[r]\n\t"
  48619. #else
  48620. "adc r4, %[r]\n\t"
  48621. #endif
  48622. #ifdef WOLFSSL_KEIL
  48623. "adcs r5, r5, %[r]\n\t"
  48624. #elif defined(__clang__)
  48625. "adcs r5, %[r]\n\t"
  48626. #else
  48627. "adc r5, %[r]\n\t"
  48628. #endif
  48629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48630. "lsrs r7, %[b], #16\n\t"
  48631. #else
  48632. "lsr r7, %[b], #16\n\t"
  48633. #endif
  48634. #ifdef WOLFSSL_KEIL
  48635. "muls r6, r7, r6\n\t"
  48636. #elif defined(__clang__)
  48637. "muls r6, r7\n\t"
  48638. #else
  48639. "mul r6, r7\n\t"
  48640. #endif
  48641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48642. "lsrs r7, r6, #16\n\t"
  48643. #else
  48644. "lsr r7, r6, #16\n\t"
  48645. #endif
  48646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48647. "lsls r6, r6, #16\n\t"
  48648. #else
  48649. "lsl r6, r6, #16\n\t"
  48650. #endif
  48651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48652. "adds r3, r3, r6\n\t"
  48653. #else
  48654. "add r3, r3, r6\n\t"
  48655. #endif
  48656. #ifdef WOLFSSL_KEIL
  48657. "adcs r4, r4, r7\n\t"
  48658. #elif defined(__clang__)
  48659. "adcs r4, r7\n\t"
  48660. #else
  48661. "adc r4, r7\n\t"
  48662. #endif
  48663. #ifdef WOLFSSL_KEIL
  48664. "adcs r5, r5, %[r]\n\t"
  48665. #elif defined(__clang__)
  48666. "adcs r5, %[r]\n\t"
  48667. #else
  48668. "adc r5, %[r]\n\t"
  48669. #endif
  48670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48671. "lsrs r6, %[a], #16\n\t"
  48672. #else
  48673. "lsr r6, %[a], #16\n\t"
  48674. #endif
  48675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48676. "lsrs r7, %[b], #16\n\t"
  48677. #else
  48678. "lsr r7, %[b], #16\n\t"
  48679. #endif
  48680. #ifdef WOLFSSL_KEIL
  48681. "muls r7, r6, r7\n\t"
  48682. #elif defined(__clang__)
  48683. "muls r7, r6\n\t"
  48684. #else
  48685. "mul r7, r6\n\t"
  48686. #endif
  48687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48688. "adds r4, r4, r7\n\t"
  48689. #else
  48690. "add r4, r4, r7\n\t"
  48691. #endif
  48692. #ifdef WOLFSSL_KEIL
  48693. "adcs r5, r5, %[r]\n\t"
  48694. #elif defined(__clang__)
  48695. "adcs r5, %[r]\n\t"
  48696. #else
  48697. "adc r5, %[r]\n\t"
  48698. #endif
  48699. "uxth r7, %[b]\n\t"
  48700. #ifdef WOLFSSL_KEIL
  48701. "muls r6, r7, r6\n\t"
  48702. #elif defined(__clang__)
  48703. "muls r6, r7\n\t"
  48704. #else
  48705. "mul r6, r7\n\t"
  48706. #endif
  48707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48708. "lsrs r7, r6, #16\n\t"
  48709. #else
  48710. "lsr r7, r6, #16\n\t"
  48711. #endif
  48712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48713. "lsls r6, r6, #16\n\t"
  48714. #else
  48715. "lsl r6, r6, #16\n\t"
  48716. #endif
  48717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48718. "adds r3, r3, r6\n\t"
  48719. #else
  48720. "add r3, r3, r6\n\t"
  48721. #endif
  48722. #ifdef WOLFSSL_KEIL
  48723. "adcs r4, r4, r7\n\t"
  48724. #elif defined(__clang__)
  48725. "adcs r4, r7\n\t"
  48726. #else
  48727. "adc r4, r7\n\t"
  48728. #endif
  48729. #ifdef WOLFSSL_KEIL
  48730. "adcs r5, r5, %[r]\n\t"
  48731. #elif defined(__clang__)
  48732. "adcs r5, %[r]\n\t"
  48733. #else
  48734. "adc r5, %[r]\n\t"
  48735. #endif
  48736. "# A[9] * B[9]\n\t"
  48737. "mov %[a], r9\n\t"
  48738. "mov %[b], r10\n\t"
  48739. "ldr %[a], [%[a], #36]\n\t"
  48740. "ldr %[b], [%[b], #36]\n\t"
  48741. "uxth r6, %[a]\n\t"
  48742. "uxth r7, %[b]\n\t"
  48743. #ifdef WOLFSSL_KEIL
  48744. "muls r7, r6, r7\n\t"
  48745. #elif defined(__clang__)
  48746. "muls r7, r6\n\t"
  48747. #else
  48748. "mul r7, r6\n\t"
  48749. #endif
  48750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48751. "adds r3, r3, r7\n\t"
  48752. #else
  48753. "add r3, r3, r7\n\t"
  48754. #endif
  48755. #ifdef WOLFSSL_KEIL
  48756. "adcs r4, r4, %[r]\n\t"
  48757. #elif defined(__clang__)
  48758. "adcs r4, %[r]\n\t"
  48759. #else
  48760. "adc r4, %[r]\n\t"
  48761. #endif
  48762. #ifdef WOLFSSL_KEIL
  48763. "adcs r5, r5, %[r]\n\t"
  48764. #elif defined(__clang__)
  48765. "adcs r5, %[r]\n\t"
  48766. #else
  48767. "adc r5, %[r]\n\t"
  48768. #endif
  48769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48770. "lsrs r7, %[b], #16\n\t"
  48771. #else
  48772. "lsr r7, %[b], #16\n\t"
  48773. #endif
  48774. #ifdef WOLFSSL_KEIL
  48775. "muls r6, r7, r6\n\t"
  48776. #elif defined(__clang__)
  48777. "muls r6, r7\n\t"
  48778. #else
  48779. "mul r6, r7\n\t"
  48780. #endif
  48781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48782. "lsrs r7, r6, #16\n\t"
  48783. #else
  48784. "lsr r7, r6, #16\n\t"
  48785. #endif
  48786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48787. "lsls r6, r6, #16\n\t"
  48788. #else
  48789. "lsl r6, r6, #16\n\t"
  48790. #endif
  48791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48792. "adds r3, r3, r6\n\t"
  48793. #else
  48794. "add r3, r3, r6\n\t"
  48795. #endif
  48796. #ifdef WOLFSSL_KEIL
  48797. "adcs r4, r4, r7\n\t"
  48798. #elif defined(__clang__)
  48799. "adcs r4, r7\n\t"
  48800. #else
  48801. "adc r4, r7\n\t"
  48802. #endif
  48803. #ifdef WOLFSSL_KEIL
  48804. "adcs r5, r5, %[r]\n\t"
  48805. #elif defined(__clang__)
  48806. "adcs r5, %[r]\n\t"
  48807. #else
  48808. "adc r5, %[r]\n\t"
  48809. #endif
  48810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48811. "lsrs r6, %[a], #16\n\t"
  48812. #else
  48813. "lsr r6, %[a], #16\n\t"
  48814. #endif
  48815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48816. "lsrs r7, %[b], #16\n\t"
  48817. #else
  48818. "lsr r7, %[b], #16\n\t"
  48819. #endif
  48820. #ifdef WOLFSSL_KEIL
  48821. "muls r7, r6, r7\n\t"
  48822. #elif defined(__clang__)
  48823. "muls r7, r6\n\t"
  48824. #else
  48825. "mul r7, r6\n\t"
  48826. #endif
  48827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48828. "adds r4, r4, r7\n\t"
  48829. #else
  48830. "add r4, r4, r7\n\t"
  48831. #endif
  48832. #ifdef WOLFSSL_KEIL
  48833. "adcs r5, r5, %[r]\n\t"
  48834. #elif defined(__clang__)
  48835. "adcs r5, %[r]\n\t"
  48836. #else
  48837. "adc r5, %[r]\n\t"
  48838. #endif
  48839. "uxth r7, %[b]\n\t"
  48840. #ifdef WOLFSSL_KEIL
  48841. "muls r6, r7, r6\n\t"
  48842. #elif defined(__clang__)
  48843. "muls r6, r7\n\t"
  48844. #else
  48845. "mul r6, r7\n\t"
  48846. #endif
  48847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48848. "lsrs r7, r6, #16\n\t"
  48849. #else
  48850. "lsr r7, r6, #16\n\t"
  48851. #endif
  48852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48853. "lsls r6, r6, #16\n\t"
  48854. #else
  48855. "lsl r6, r6, #16\n\t"
  48856. #endif
  48857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48858. "adds r3, r3, r6\n\t"
  48859. #else
  48860. "add r3, r3, r6\n\t"
  48861. #endif
  48862. #ifdef WOLFSSL_KEIL
  48863. "adcs r4, r4, r7\n\t"
  48864. #elif defined(__clang__)
  48865. "adcs r4, r7\n\t"
  48866. #else
  48867. "adc r4, r7\n\t"
  48868. #endif
  48869. #ifdef WOLFSSL_KEIL
  48870. "adcs r5, r5, %[r]\n\t"
  48871. #elif defined(__clang__)
  48872. "adcs r5, %[r]\n\t"
  48873. #else
  48874. "adc r5, %[r]\n\t"
  48875. #endif
  48876. "# A[8] * B[10]\n\t"
  48877. "mov %[a], r9\n\t"
  48878. "mov %[b], r10\n\t"
  48879. "ldr %[a], [%[a], #32]\n\t"
  48880. "ldr %[b], [%[b], #40]\n\t"
  48881. "uxth r6, %[a]\n\t"
  48882. "uxth r7, %[b]\n\t"
  48883. #ifdef WOLFSSL_KEIL
  48884. "muls r7, r6, r7\n\t"
  48885. #elif defined(__clang__)
  48886. "muls r7, r6\n\t"
  48887. #else
  48888. "mul r7, r6\n\t"
  48889. #endif
  48890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48891. "adds r3, r3, r7\n\t"
  48892. #else
  48893. "add r3, r3, r7\n\t"
  48894. #endif
  48895. #ifdef WOLFSSL_KEIL
  48896. "adcs r4, r4, %[r]\n\t"
  48897. #elif defined(__clang__)
  48898. "adcs r4, %[r]\n\t"
  48899. #else
  48900. "adc r4, %[r]\n\t"
  48901. #endif
  48902. #ifdef WOLFSSL_KEIL
  48903. "adcs r5, r5, %[r]\n\t"
  48904. #elif defined(__clang__)
  48905. "adcs r5, %[r]\n\t"
  48906. #else
  48907. "adc r5, %[r]\n\t"
  48908. #endif
  48909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48910. "lsrs r7, %[b], #16\n\t"
  48911. #else
  48912. "lsr r7, %[b], #16\n\t"
  48913. #endif
  48914. #ifdef WOLFSSL_KEIL
  48915. "muls r6, r7, r6\n\t"
  48916. #elif defined(__clang__)
  48917. "muls r6, r7\n\t"
  48918. #else
  48919. "mul r6, r7\n\t"
  48920. #endif
  48921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48922. "lsrs r7, r6, #16\n\t"
  48923. #else
  48924. "lsr r7, r6, #16\n\t"
  48925. #endif
  48926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48927. "lsls r6, r6, #16\n\t"
  48928. #else
  48929. "lsl r6, r6, #16\n\t"
  48930. #endif
  48931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48932. "adds r3, r3, r6\n\t"
  48933. #else
  48934. "add r3, r3, r6\n\t"
  48935. #endif
  48936. #ifdef WOLFSSL_KEIL
  48937. "adcs r4, r4, r7\n\t"
  48938. #elif defined(__clang__)
  48939. "adcs r4, r7\n\t"
  48940. #else
  48941. "adc r4, r7\n\t"
  48942. #endif
  48943. #ifdef WOLFSSL_KEIL
  48944. "adcs r5, r5, %[r]\n\t"
  48945. #elif defined(__clang__)
  48946. "adcs r5, %[r]\n\t"
  48947. #else
  48948. "adc r5, %[r]\n\t"
  48949. #endif
  48950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48951. "lsrs r6, %[a], #16\n\t"
  48952. #else
  48953. "lsr r6, %[a], #16\n\t"
  48954. #endif
  48955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48956. "lsrs r7, %[b], #16\n\t"
  48957. #else
  48958. "lsr r7, %[b], #16\n\t"
  48959. #endif
  48960. #ifdef WOLFSSL_KEIL
  48961. "muls r7, r6, r7\n\t"
  48962. #elif defined(__clang__)
  48963. "muls r7, r6\n\t"
  48964. #else
  48965. "mul r7, r6\n\t"
  48966. #endif
  48967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48968. "adds r4, r4, r7\n\t"
  48969. #else
  48970. "add r4, r4, r7\n\t"
  48971. #endif
  48972. #ifdef WOLFSSL_KEIL
  48973. "adcs r5, r5, %[r]\n\t"
  48974. #elif defined(__clang__)
  48975. "adcs r5, %[r]\n\t"
  48976. #else
  48977. "adc r5, %[r]\n\t"
  48978. #endif
  48979. "uxth r7, %[b]\n\t"
  48980. #ifdef WOLFSSL_KEIL
  48981. "muls r6, r7, r6\n\t"
  48982. #elif defined(__clang__)
  48983. "muls r6, r7\n\t"
  48984. #else
  48985. "mul r6, r7\n\t"
  48986. #endif
  48987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48988. "lsrs r7, r6, #16\n\t"
  48989. #else
  48990. "lsr r7, r6, #16\n\t"
  48991. #endif
  48992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48993. "lsls r6, r6, #16\n\t"
  48994. #else
  48995. "lsl r6, r6, #16\n\t"
  48996. #endif
  48997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48998. "adds r3, r3, r6\n\t"
  48999. #else
  49000. "add r3, r3, r6\n\t"
  49001. #endif
  49002. #ifdef WOLFSSL_KEIL
  49003. "adcs r4, r4, r7\n\t"
  49004. #elif defined(__clang__)
  49005. "adcs r4, r7\n\t"
  49006. #else
  49007. "adc r4, r7\n\t"
  49008. #endif
  49009. #ifdef WOLFSSL_KEIL
  49010. "adcs r5, r5, %[r]\n\t"
  49011. #elif defined(__clang__)
  49012. "adcs r5, %[r]\n\t"
  49013. #else
  49014. "adc r5, %[r]\n\t"
  49015. #endif
  49016. "# A[7] * B[11]\n\t"
  49017. "mov %[a], r9\n\t"
  49018. "mov %[b], r10\n\t"
  49019. "ldr %[a], [%[a], #28]\n\t"
  49020. "ldr %[b], [%[b], #44]\n\t"
  49021. "uxth r6, %[a]\n\t"
  49022. "uxth r7, %[b]\n\t"
  49023. #ifdef WOLFSSL_KEIL
  49024. "muls r7, r6, r7\n\t"
  49025. #elif defined(__clang__)
  49026. "muls r7, r6\n\t"
  49027. #else
  49028. "mul r7, r6\n\t"
  49029. #endif
  49030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49031. "adds r3, r3, r7\n\t"
  49032. #else
  49033. "add r3, r3, r7\n\t"
  49034. #endif
  49035. #ifdef WOLFSSL_KEIL
  49036. "adcs r4, r4, %[r]\n\t"
  49037. #elif defined(__clang__)
  49038. "adcs r4, %[r]\n\t"
  49039. #else
  49040. "adc r4, %[r]\n\t"
  49041. #endif
  49042. #ifdef WOLFSSL_KEIL
  49043. "adcs r5, r5, %[r]\n\t"
  49044. #elif defined(__clang__)
  49045. "adcs r5, %[r]\n\t"
  49046. #else
  49047. "adc r5, %[r]\n\t"
  49048. #endif
  49049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49050. "lsrs r7, %[b], #16\n\t"
  49051. #else
  49052. "lsr r7, %[b], #16\n\t"
  49053. #endif
  49054. #ifdef WOLFSSL_KEIL
  49055. "muls r6, r7, r6\n\t"
  49056. #elif defined(__clang__)
  49057. "muls r6, r7\n\t"
  49058. #else
  49059. "mul r6, r7\n\t"
  49060. #endif
  49061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49062. "lsrs r7, r6, #16\n\t"
  49063. #else
  49064. "lsr r7, r6, #16\n\t"
  49065. #endif
  49066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49067. "lsls r6, r6, #16\n\t"
  49068. #else
  49069. "lsl r6, r6, #16\n\t"
  49070. #endif
  49071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49072. "adds r3, r3, r6\n\t"
  49073. #else
  49074. "add r3, r3, r6\n\t"
  49075. #endif
  49076. #ifdef WOLFSSL_KEIL
  49077. "adcs r4, r4, r7\n\t"
  49078. #elif defined(__clang__)
  49079. "adcs r4, r7\n\t"
  49080. #else
  49081. "adc r4, r7\n\t"
  49082. #endif
  49083. #ifdef WOLFSSL_KEIL
  49084. "adcs r5, r5, %[r]\n\t"
  49085. #elif defined(__clang__)
  49086. "adcs r5, %[r]\n\t"
  49087. #else
  49088. "adc r5, %[r]\n\t"
  49089. #endif
  49090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49091. "lsrs r6, %[a], #16\n\t"
  49092. #else
  49093. "lsr r6, %[a], #16\n\t"
  49094. #endif
  49095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49096. "lsrs r7, %[b], #16\n\t"
  49097. #else
  49098. "lsr r7, %[b], #16\n\t"
  49099. #endif
  49100. #ifdef WOLFSSL_KEIL
  49101. "muls r7, r6, r7\n\t"
  49102. #elif defined(__clang__)
  49103. "muls r7, r6\n\t"
  49104. #else
  49105. "mul r7, r6\n\t"
  49106. #endif
  49107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49108. "adds r4, r4, r7\n\t"
  49109. #else
  49110. "add r4, r4, r7\n\t"
  49111. #endif
  49112. #ifdef WOLFSSL_KEIL
  49113. "adcs r5, r5, %[r]\n\t"
  49114. #elif defined(__clang__)
  49115. "adcs r5, %[r]\n\t"
  49116. #else
  49117. "adc r5, %[r]\n\t"
  49118. #endif
  49119. "uxth r7, %[b]\n\t"
  49120. #ifdef WOLFSSL_KEIL
  49121. "muls r6, r7, r6\n\t"
  49122. #elif defined(__clang__)
  49123. "muls r6, r7\n\t"
  49124. #else
  49125. "mul r6, r7\n\t"
  49126. #endif
  49127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49128. "lsrs r7, r6, #16\n\t"
  49129. #else
  49130. "lsr r7, r6, #16\n\t"
  49131. #endif
  49132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49133. "lsls r6, r6, #16\n\t"
  49134. #else
  49135. "lsl r6, r6, #16\n\t"
  49136. #endif
  49137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49138. "adds r3, r3, r6\n\t"
  49139. #else
  49140. "add r3, r3, r6\n\t"
  49141. #endif
  49142. #ifdef WOLFSSL_KEIL
  49143. "adcs r4, r4, r7\n\t"
  49144. #elif defined(__clang__)
  49145. "adcs r4, r7\n\t"
  49146. #else
  49147. "adc r4, r7\n\t"
  49148. #endif
  49149. #ifdef WOLFSSL_KEIL
  49150. "adcs r5, r5, %[r]\n\t"
  49151. #elif defined(__clang__)
  49152. "adcs r5, %[r]\n\t"
  49153. #else
  49154. "adc r5, %[r]\n\t"
  49155. #endif
  49156. "mov %[r], r8\n\t"
  49157. "str r3, [%[r], #72]\n\t"
  49158. "movs %[r], #0\n\t"
  49159. "# A[8] * B[11]\n\t"
  49160. "movs r3, #0\n\t"
  49161. "mov %[a], r9\n\t"
  49162. "mov %[b], r10\n\t"
  49163. "ldr %[a], [%[a], #32]\n\t"
  49164. "ldr %[b], [%[b], #44]\n\t"
  49165. "uxth r6, %[a]\n\t"
  49166. "uxth r7, %[b]\n\t"
  49167. #ifdef WOLFSSL_KEIL
  49168. "muls r7, r6, r7\n\t"
  49169. #elif defined(__clang__)
  49170. "muls r7, r6\n\t"
  49171. #else
  49172. "mul r7, r6\n\t"
  49173. #endif
  49174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49175. "adds r4, r4, r7\n\t"
  49176. #else
  49177. "add r4, r4, r7\n\t"
  49178. #endif
  49179. #ifdef WOLFSSL_KEIL
  49180. "adcs r5, r5, %[r]\n\t"
  49181. #elif defined(__clang__)
  49182. "adcs r5, %[r]\n\t"
  49183. #else
  49184. "adc r5, %[r]\n\t"
  49185. #endif
  49186. #ifdef WOLFSSL_KEIL
  49187. "adcs r3, r3, %[r]\n\t"
  49188. #elif defined(__clang__)
  49189. "adcs r3, %[r]\n\t"
  49190. #else
  49191. "adc r3, %[r]\n\t"
  49192. #endif
  49193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49194. "lsrs r7, %[b], #16\n\t"
  49195. #else
  49196. "lsr r7, %[b], #16\n\t"
  49197. #endif
  49198. #ifdef WOLFSSL_KEIL
  49199. "muls r6, r7, r6\n\t"
  49200. #elif defined(__clang__)
  49201. "muls r6, r7\n\t"
  49202. #else
  49203. "mul r6, r7\n\t"
  49204. #endif
  49205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49206. "lsrs r7, r6, #16\n\t"
  49207. #else
  49208. "lsr r7, r6, #16\n\t"
  49209. #endif
  49210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49211. "lsls r6, r6, #16\n\t"
  49212. #else
  49213. "lsl r6, r6, #16\n\t"
  49214. #endif
  49215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49216. "adds r4, r4, r6\n\t"
  49217. #else
  49218. "add r4, r4, r6\n\t"
  49219. #endif
  49220. #ifdef WOLFSSL_KEIL
  49221. "adcs r5, r5, r7\n\t"
  49222. #elif defined(__clang__)
  49223. "adcs r5, r7\n\t"
  49224. #else
  49225. "adc r5, r7\n\t"
  49226. #endif
  49227. #ifdef WOLFSSL_KEIL
  49228. "adcs r3, r3, %[r]\n\t"
  49229. #elif defined(__clang__)
  49230. "adcs r3, %[r]\n\t"
  49231. #else
  49232. "adc r3, %[r]\n\t"
  49233. #endif
  49234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49235. "lsrs r6, %[a], #16\n\t"
  49236. #else
  49237. "lsr r6, %[a], #16\n\t"
  49238. #endif
  49239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49240. "lsrs r7, %[b], #16\n\t"
  49241. #else
  49242. "lsr r7, %[b], #16\n\t"
  49243. #endif
  49244. #ifdef WOLFSSL_KEIL
  49245. "muls r7, r6, r7\n\t"
  49246. #elif defined(__clang__)
  49247. "muls r7, r6\n\t"
  49248. #else
  49249. "mul r7, r6\n\t"
  49250. #endif
  49251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49252. "adds r5, r5, r7\n\t"
  49253. #else
  49254. "add r5, r5, r7\n\t"
  49255. #endif
  49256. #ifdef WOLFSSL_KEIL
  49257. "adcs r3, r3, %[r]\n\t"
  49258. #elif defined(__clang__)
  49259. "adcs r3, %[r]\n\t"
  49260. #else
  49261. "adc r3, %[r]\n\t"
  49262. #endif
  49263. "uxth r7, %[b]\n\t"
  49264. #ifdef WOLFSSL_KEIL
  49265. "muls r6, r7, r6\n\t"
  49266. #elif defined(__clang__)
  49267. "muls r6, r7\n\t"
  49268. #else
  49269. "mul r6, r7\n\t"
  49270. #endif
  49271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49272. "lsrs r7, r6, #16\n\t"
  49273. #else
  49274. "lsr r7, r6, #16\n\t"
  49275. #endif
  49276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49277. "lsls r6, r6, #16\n\t"
  49278. #else
  49279. "lsl r6, r6, #16\n\t"
  49280. #endif
  49281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49282. "adds r4, r4, r6\n\t"
  49283. #else
  49284. "add r4, r4, r6\n\t"
  49285. #endif
  49286. #ifdef WOLFSSL_KEIL
  49287. "adcs r5, r5, r7\n\t"
  49288. #elif defined(__clang__)
  49289. "adcs r5, r7\n\t"
  49290. #else
  49291. "adc r5, r7\n\t"
  49292. #endif
  49293. #ifdef WOLFSSL_KEIL
  49294. "adcs r3, r3, %[r]\n\t"
  49295. #elif defined(__clang__)
  49296. "adcs r3, %[r]\n\t"
  49297. #else
  49298. "adc r3, %[r]\n\t"
  49299. #endif
  49300. "# A[9] * B[10]\n\t"
  49301. "mov %[a], r9\n\t"
  49302. "mov %[b], r10\n\t"
  49303. "ldr %[a], [%[a], #36]\n\t"
  49304. "ldr %[b], [%[b], #40]\n\t"
  49305. "uxth r6, %[a]\n\t"
  49306. "uxth r7, %[b]\n\t"
  49307. #ifdef WOLFSSL_KEIL
  49308. "muls r7, r6, r7\n\t"
  49309. #elif defined(__clang__)
  49310. "muls r7, r6\n\t"
  49311. #else
  49312. "mul r7, r6\n\t"
  49313. #endif
  49314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49315. "adds r4, r4, r7\n\t"
  49316. #else
  49317. "add r4, r4, r7\n\t"
  49318. #endif
  49319. #ifdef WOLFSSL_KEIL
  49320. "adcs r5, r5, %[r]\n\t"
  49321. #elif defined(__clang__)
  49322. "adcs r5, %[r]\n\t"
  49323. #else
  49324. "adc r5, %[r]\n\t"
  49325. #endif
  49326. #ifdef WOLFSSL_KEIL
  49327. "adcs r3, r3, %[r]\n\t"
  49328. #elif defined(__clang__)
  49329. "adcs r3, %[r]\n\t"
  49330. #else
  49331. "adc r3, %[r]\n\t"
  49332. #endif
  49333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49334. "lsrs r7, %[b], #16\n\t"
  49335. #else
  49336. "lsr r7, %[b], #16\n\t"
  49337. #endif
  49338. #ifdef WOLFSSL_KEIL
  49339. "muls r6, r7, r6\n\t"
  49340. #elif defined(__clang__)
  49341. "muls r6, r7\n\t"
  49342. #else
  49343. "mul r6, r7\n\t"
  49344. #endif
  49345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49346. "lsrs r7, r6, #16\n\t"
  49347. #else
  49348. "lsr r7, r6, #16\n\t"
  49349. #endif
  49350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49351. "lsls r6, r6, #16\n\t"
  49352. #else
  49353. "lsl r6, r6, #16\n\t"
  49354. #endif
  49355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49356. "adds r4, r4, r6\n\t"
  49357. #else
  49358. "add r4, r4, r6\n\t"
  49359. #endif
  49360. #ifdef WOLFSSL_KEIL
  49361. "adcs r5, r5, r7\n\t"
  49362. #elif defined(__clang__)
  49363. "adcs r5, r7\n\t"
  49364. #else
  49365. "adc r5, r7\n\t"
  49366. #endif
  49367. #ifdef WOLFSSL_KEIL
  49368. "adcs r3, r3, %[r]\n\t"
  49369. #elif defined(__clang__)
  49370. "adcs r3, %[r]\n\t"
  49371. #else
  49372. "adc r3, %[r]\n\t"
  49373. #endif
  49374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49375. "lsrs r6, %[a], #16\n\t"
  49376. #else
  49377. "lsr r6, %[a], #16\n\t"
  49378. #endif
  49379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49380. "lsrs r7, %[b], #16\n\t"
  49381. #else
  49382. "lsr r7, %[b], #16\n\t"
  49383. #endif
  49384. #ifdef WOLFSSL_KEIL
  49385. "muls r7, r6, r7\n\t"
  49386. #elif defined(__clang__)
  49387. "muls r7, r6\n\t"
  49388. #else
  49389. "mul r7, r6\n\t"
  49390. #endif
  49391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49392. "adds r5, r5, r7\n\t"
  49393. #else
  49394. "add r5, r5, r7\n\t"
  49395. #endif
  49396. #ifdef WOLFSSL_KEIL
  49397. "adcs r3, r3, %[r]\n\t"
  49398. #elif defined(__clang__)
  49399. "adcs r3, %[r]\n\t"
  49400. #else
  49401. "adc r3, %[r]\n\t"
  49402. #endif
  49403. "uxth r7, %[b]\n\t"
  49404. #ifdef WOLFSSL_KEIL
  49405. "muls r6, r7, r6\n\t"
  49406. #elif defined(__clang__)
  49407. "muls r6, r7\n\t"
  49408. #else
  49409. "mul r6, r7\n\t"
  49410. #endif
  49411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49412. "lsrs r7, r6, #16\n\t"
  49413. #else
  49414. "lsr r7, r6, #16\n\t"
  49415. #endif
  49416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49417. "lsls r6, r6, #16\n\t"
  49418. #else
  49419. "lsl r6, r6, #16\n\t"
  49420. #endif
  49421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49422. "adds r4, r4, r6\n\t"
  49423. #else
  49424. "add r4, r4, r6\n\t"
  49425. #endif
  49426. #ifdef WOLFSSL_KEIL
  49427. "adcs r5, r5, r7\n\t"
  49428. #elif defined(__clang__)
  49429. "adcs r5, r7\n\t"
  49430. #else
  49431. "adc r5, r7\n\t"
  49432. #endif
  49433. #ifdef WOLFSSL_KEIL
  49434. "adcs r3, r3, %[r]\n\t"
  49435. #elif defined(__clang__)
  49436. "adcs r3, %[r]\n\t"
  49437. #else
  49438. "adc r3, %[r]\n\t"
  49439. #endif
  49440. "# A[10] * B[9]\n\t"
  49441. "mov %[a], r9\n\t"
  49442. "mov %[b], r10\n\t"
  49443. "ldr %[a], [%[a], #40]\n\t"
  49444. "ldr %[b], [%[b], #36]\n\t"
  49445. "uxth r6, %[a]\n\t"
  49446. "uxth r7, %[b]\n\t"
  49447. #ifdef WOLFSSL_KEIL
  49448. "muls r7, r6, r7\n\t"
  49449. #elif defined(__clang__)
  49450. "muls r7, r6\n\t"
  49451. #else
  49452. "mul r7, r6\n\t"
  49453. #endif
  49454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49455. "adds r4, r4, r7\n\t"
  49456. #else
  49457. "add r4, r4, r7\n\t"
  49458. #endif
  49459. #ifdef WOLFSSL_KEIL
  49460. "adcs r5, r5, %[r]\n\t"
  49461. #elif defined(__clang__)
  49462. "adcs r5, %[r]\n\t"
  49463. #else
  49464. "adc r5, %[r]\n\t"
  49465. #endif
  49466. #ifdef WOLFSSL_KEIL
  49467. "adcs r3, r3, %[r]\n\t"
  49468. #elif defined(__clang__)
  49469. "adcs r3, %[r]\n\t"
  49470. #else
  49471. "adc r3, %[r]\n\t"
  49472. #endif
  49473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49474. "lsrs r7, %[b], #16\n\t"
  49475. #else
  49476. "lsr r7, %[b], #16\n\t"
  49477. #endif
  49478. #ifdef WOLFSSL_KEIL
  49479. "muls r6, r7, r6\n\t"
  49480. #elif defined(__clang__)
  49481. "muls r6, r7\n\t"
  49482. #else
  49483. "mul r6, r7\n\t"
  49484. #endif
  49485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49486. "lsrs r7, r6, #16\n\t"
  49487. #else
  49488. "lsr r7, r6, #16\n\t"
  49489. #endif
  49490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49491. "lsls r6, r6, #16\n\t"
  49492. #else
  49493. "lsl r6, r6, #16\n\t"
  49494. #endif
  49495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49496. "adds r4, r4, r6\n\t"
  49497. #else
  49498. "add r4, r4, r6\n\t"
  49499. #endif
  49500. #ifdef WOLFSSL_KEIL
  49501. "adcs r5, r5, r7\n\t"
  49502. #elif defined(__clang__)
  49503. "adcs r5, r7\n\t"
  49504. #else
  49505. "adc r5, r7\n\t"
  49506. #endif
  49507. #ifdef WOLFSSL_KEIL
  49508. "adcs r3, r3, %[r]\n\t"
  49509. #elif defined(__clang__)
  49510. "adcs r3, %[r]\n\t"
  49511. #else
  49512. "adc r3, %[r]\n\t"
  49513. #endif
  49514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49515. "lsrs r6, %[a], #16\n\t"
  49516. #else
  49517. "lsr r6, %[a], #16\n\t"
  49518. #endif
  49519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49520. "lsrs r7, %[b], #16\n\t"
  49521. #else
  49522. "lsr r7, %[b], #16\n\t"
  49523. #endif
  49524. #ifdef WOLFSSL_KEIL
  49525. "muls r7, r6, r7\n\t"
  49526. #elif defined(__clang__)
  49527. "muls r7, r6\n\t"
  49528. #else
  49529. "mul r7, r6\n\t"
  49530. #endif
  49531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49532. "adds r5, r5, r7\n\t"
  49533. #else
  49534. "add r5, r5, r7\n\t"
  49535. #endif
  49536. #ifdef WOLFSSL_KEIL
  49537. "adcs r3, r3, %[r]\n\t"
  49538. #elif defined(__clang__)
  49539. "adcs r3, %[r]\n\t"
  49540. #else
  49541. "adc r3, %[r]\n\t"
  49542. #endif
  49543. "uxth r7, %[b]\n\t"
  49544. #ifdef WOLFSSL_KEIL
  49545. "muls r6, r7, r6\n\t"
  49546. #elif defined(__clang__)
  49547. "muls r6, r7\n\t"
  49548. #else
  49549. "mul r6, r7\n\t"
  49550. #endif
  49551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49552. "lsrs r7, r6, #16\n\t"
  49553. #else
  49554. "lsr r7, r6, #16\n\t"
  49555. #endif
  49556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49557. "lsls r6, r6, #16\n\t"
  49558. #else
  49559. "lsl r6, r6, #16\n\t"
  49560. #endif
  49561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49562. "adds r4, r4, r6\n\t"
  49563. #else
  49564. "add r4, r4, r6\n\t"
  49565. #endif
  49566. #ifdef WOLFSSL_KEIL
  49567. "adcs r5, r5, r7\n\t"
  49568. #elif defined(__clang__)
  49569. "adcs r5, r7\n\t"
  49570. #else
  49571. "adc r5, r7\n\t"
  49572. #endif
  49573. #ifdef WOLFSSL_KEIL
  49574. "adcs r3, r3, %[r]\n\t"
  49575. #elif defined(__clang__)
  49576. "adcs r3, %[r]\n\t"
  49577. #else
  49578. "adc r3, %[r]\n\t"
  49579. #endif
  49580. "# A[11] * B[8]\n\t"
  49581. "mov %[a], r9\n\t"
  49582. "mov %[b], r10\n\t"
  49583. "ldr %[a], [%[a], #44]\n\t"
  49584. "ldr %[b], [%[b], #32]\n\t"
  49585. "uxth r6, %[a]\n\t"
  49586. "uxth r7, %[b]\n\t"
  49587. #ifdef WOLFSSL_KEIL
  49588. "muls r7, r6, r7\n\t"
  49589. #elif defined(__clang__)
  49590. "muls r7, r6\n\t"
  49591. #else
  49592. "mul r7, r6\n\t"
  49593. #endif
  49594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49595. "adds r4, r4, r7\n\t"
  49596. #else
  49597. "add r4, r4, r7\n\t"
  49598. #endif
  49599. #ifdef WOLFSSL_KEIL
  49600. "adcs r5, r5, %[r]\n\t"
  49601. #elif defined(__clang__)
  49602. "adcs r5, %[r]\n\t"
  49603. #else
  49604. "adc r5, %[r]\n\t"
  49605. #endif
  49606. #ifdef WOLFSSL_KEIL
  49607. "adcs r3, r3, %[r]\n\t"
  49608. #elif defined(__clang__)
  49609. "adcs r3, %[r]\n\t"
  49610. #else
  49611. "adc r3, %[r]\n\t"
  49612. #endif
  49613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49614. "lsrs r7, %[b], #16\n\t"
  49615. #else
  49616. "lsr r7, %[b], #16\n\t"
  49617. #endif
  49618. #ifdef WOLFSSL_KEIL
  49619. "muls r6, r7, r6\n\t"
  49620. #elif defined(__clang__)
  49621. "muls r6, r7\n\t"
  49622. #else
  49623. "mul r6, r7\n\t"
  49624. #endif
  49625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49626. "lsrs r7, r6, #16\n\t"
  49627. #else
  49628. "lsr r7, r6, #16\n\t"
  49629. #endif
  49630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49631. "lsls r6, r6, #16\n\t"
  49632. #else
  49633. "lsl r6, r6, #16\n\t"
  49634. #endif
  49635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49636. "adds r4, r4, r6\n\t"
  49637. #else
  49638. "add r4, r4, r6\n\t"
  49639. #endif
  49640. #ifdef WOLFSSL_KEIL
  49641. "adcs r5, r5, r7\n\t"
  49642. #elif defined(__clang__)
  49643. "adcs r5, r7\n\t"
  49644. #else
  49645. "adc r5, r7\n\t"
  49646. #endif
  49647. #ifdef WOLFSSL_KEIL
  49648. "adcs r3, r3, %[r]\n\t"
  49649. #elif defined(__clang__)
  49650. "adcs r3, %[r]\n\t"
  49651. #else
  49652. "adc r3, %[r]\n\t"
  49653. #endif
  49654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49655. "lsrs r6, %[a], #16\n\t"
  49656. #else
  49657. "lsr r6, %[a], #16\n\t"
  49658. #endif
  49659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49660. "lsrs r7, %[b], #16\n\t"
  49661. #else
  49662. "lsr r7, %[b], #16\n\t"
  49663. #endif
  49664. #ifdef WOLFSSL_KEIL
  49665. "muls r7, r6, r7\n\t"
  49666. #elif defined(__clang__)
  49667. "muls r7, r6\n\t"
  49668. #else
  49669. "mul r7, r6\n\t"
  49670. #endif
  49671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49672. "adds r5, r5, r7\n\t"
  49673. #else
  49674. "add r5, r5, r7\n\t"
  49675. #endif
  49676. #ifdef WOLFSSL_KEIL
  49677. "adcs r3, r3, %[r]\n\t"
  49678. #elif defined(__clang__)
  49679. "adcs r3, %[r]\n\t"
  49680. #else
  49681. "adc r3, %[r]\n\t"
  49682. #endif
  49683. "uxth r7, %[b]\n\t"
  49684. #ifdef WOLFSSL_KEIL
  49685. "muls r6, r7, r6\n\t"
  49686. #elif defined(__clang__)
  49687. "muls r6, r7\n\t"
  49688. #else
  49689. "mul r6, r7\n\t"
  49690. #endif
  49691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49692. "lsrs r7, r6, #16\n\t"
  49693. #else
  49694. "lsr r7, r6, #16\n\t"
  49695. #endif
  49696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49697. "lsls r6, r6, #16\n\t"
  49698. #else
  49699. "lsl r6, r6, #16\n\t"
  49700. #endif
  49701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49702. "adds r4, r4, r6\n\t"
  49703. #else
  49704. "add r4, r4, r6\n\t"
  49705. #endif
  49706. #ifdef WOLFSSL_KEIL
  49707. "adcs r5, r5, r7\n\t"
  49708. #elif defined(__clang__)
  49709. "adcs r5, r7\n\t"
  49710. #else
  49711. "adc r5, r7\n\t"
  49712. #endif
  49713. #ifdef WOLFSSL_KEIL
  49714. "adcs r3, r3, %[r]\n\t"
  49715. #elif defined(__clang__)
  49716. "adcs r3, %[r]\n\t"
  49717. #else
  49718. "adc r3, %[r]\n\t"
  49719. #endif
  49720. "mov %[r], r8\n\t"
  49721. "str r4, [%[r], #76]\n\t"
  49722. "movs %[r], #0\n\t"
  49723. "# A[11] * B[9]\n\t"
  49724. "movs r4, #0\n\t"
  49725. "mov %[a], r9\n\t"
  49726. "mov %[b], r10\n\t"
  49727. "ldr %[a], [%[a], #44]\n\t"
  49728. "ldr %[b], [%[b], #36]\n\t"
  49729. "uxth r6, %[a]\n\t"
  49730. "uxth r7, %[b]\n\t"
  49731. #ifdef WOLFSSL_KEIL
  49732. "muls r7, r6, r7\n\t"
  49733. #elif defined(__clang__)
  49734. "muls r7, r6\n\t"
  49735. #else
  49736. "mul r7, r6\n\t"
  49737. #endif
  49738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49739. "adds r5, r5, r7\n\t"
  49740. #else
  49741. "add r5, r5, r7\n\t"
  49742. #endif
  49743. #ifdef WOLFSSL_KEIL
  49744. "adcs r3, r3, %[r]\n\t"
  49745. #elif defined(__clang__)
  49746. "adcs r3, %[r]\n\t"
  49747. #else
  49748. "adc r3, %[r]\n\t"
  49749. #endif
  49750. #ifdef WOLFSSL_KEIL
  49751. "adcs r4, r4, %[r]\n\t"
  49752. #elif defined(__clang__)
  49753. "adcs r4, %[r]\n\t"
  49754. #else
  49755. "adc r4, %[r]\n\t"
  49756. #endif
  49757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49758. "lsrs r7, %[b], #16\n\t"
  49759. #else
  49760. "lsr r7, %[b], #16\n\t"
  49761. #endif
  49762. #ifdef WOLFSSL_KEIL
  49763. "muls r6, r7, r6\n\t"
  49764. #elif defined(__clang__)
  49765. "muls r6, r7\n\t"
  49766. #else
  49767. "mul r6, r7\n\t"
  49768. #endif
  49769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49770. "lsrs r7, r6, #16\n\t"
  49771. #else
  49772. "lsr r7, r6, #16\n\t"
  49773. #endif
  49774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49775. "lsls r6, r6, #16\n\t"
  49776. #else
  49777. "lsl r6, r6, #16\n\t"
  49778. #endif
  49779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49780. "adds r5, r5, r6\n\t"
  49781. #else
  49782. "add r5, r5, r6\n\t"
  49783. #endif
  49784. #ifdef WOLFSSL_KEIL
  49785. "adcs r3, r3, r7\n\t"
  49786. #elif defined(__clang__)
  49787. "adcs r3, r7\n\t"
  49788. #else
  49789. "adc r3, r7\n\t"
  49790. #endif
  49791. #ifdef WOLFSSL_KEIL
  49792. "adcs r4, r4, %[r]\n\t"
  49793. #elif defined(__clang__)
  49794. "adcs r4, %[r]\n\t"
  49795. #else
  49796. "adc r4, %[r]\n\t"
  49797. #endif
  49798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49799. "lsrs r6, %[a], #16\n\t"
  49800. #else
  49801. "lsr r6, %[a], #16\n\t"
  49802. #endif
  49803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49804. "lsrs r7, %[b], #16\n\t"
  49805. #else
  49806. "lsr r7, %[b], #16\n\t"
  49807. #endif
  49808. #ifdef WOLFSSL_KEIL
  49809. "muls r7, r6, r7\n\t"
  49810. #elif defined(__clang__)
  49811. "muls r7, r6\n\t"
  49812. #else
  49813. "mul r7, r6\n\t"
  49814. #endif
  49815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49816. "adds r3, r3, r7\n\t"
  49817. #else
  49818. "add r3, r3, r7\n\t"
  49819. #endif
  49820. #ifdef WOLFSSL_KEIL
  49821. "adcs r4, r4, %[r]\n\t"
  49822. #elif defined(__clang__)
  49823. "adcs r4, %[r]\n\t"
  49824. #else
  49825. "adc r4, %[r]\n\t"
  49826. #endif
  49827. "uxth r7, %[b]\n\t"
  49828. #ifdef WOLFSSL_KEIL
  49829. "muls r6, r7, r6\n\t"
  49830. #elif defined(__clang__)
  49831. "muls r6, r7\n\t"
  49832. #else
  49833. "mul r6, r7\n\t"
  49834. #endif
  49835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49836. "lsrs r7, r6, #16\n\t"
  49837. #else
  49838. "lsr r7, r6, #16\n\t"
  49839. #endif
  49840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49841. "lsls r6, r6, #16\n\t"
  49842. #else
  49843. "lsl r6, r6, #16\n\t"
  49844. #endif
  49845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49846. "adds r5, r5, r6\n\t"
  49847. #else
  49848. "add r5, r5, r6\n\t"
  49849. #endif
  49850. #ifdef WOLFSSL_KEIL
  49851. "adcs r3, r3, r7\n\t"
  49852. #elif defined(__clang__)
  49853. "adcs r3, r7\n\t"
  49854. #else
  49855. "adc r3, r7\n\t"
  49856. #endif
  49857. #ifdef WOLFSSL_KEIL
  49858. "adcs r4, r4, %[r]\n\t"
  49859. #elif defined(__clang__)
  49860. "adcs r4, %[r]\n\t"
  49861. #else
  49862. "adc r4, %[r]\n\t"
  49863. #endif
  49864. "# A[10] * B[10]\n\t"
  49865. "mov %[a], r9\n\t"
  49866. "mov %[b], r10\n\t"
  49867. "ldr %[a], [%[a], #40]\n\t"
  49868. "ldr %[b], [%[b], #40]\n\t"
  49869. "uxth r6, %[a]\n\t"
  49870. "uxth r7, %[b]\n\t"
  49871. #ifdef WOLFSSL_KEIL
  49872. "muls r7, r6, r7\n\t"
  49873. #elif defined(__clang__)
  49874. "muls r7, r6\n\t"
  49875. #else
  49876. "mul r7, r6\n\t"
  49877. #endif
  49878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49879. "adds r5, r5, r7\n\t"
  49880. #else
  49881. "add r5, r5, r7\n\t"
  49882. #endif
  49883. #ifdef WOLFSSL_KEIL
  49884. "adcs r3, r3, %[r]\n\t"
  49885. #elif defined(__clang__)
  49886. "adcs r3, %[r]\n\t"
  49887. #else
  49888. "adc r3, %[r]\n\t"
  49889. #endif
  49890. #ifdef WOLFSSL_KEIL
  49891. "adcs r4, r4, %[r]\n\t"
  49892. #elif defined(__clang__)
  49893. "adcs r4, %[r]\n\t"
  49894. #else
  49895. "adc r4, %[r]\n\t"
  49896. #endif
  49897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49898. "lsrs r7, %[b], #16\n\t"
  49899. #else
  49900. "lsr r7, %[b], #16\n\t"
  49901. #endif
  49902. #ifdef WOLFSSL_KEIL
  49903. "muls r6, r7, r6\n\t"
  49904. #elif defined(__clang__)
  49905. "muls r6, r7\n\t"
  49906. #else
  49907. "mul r6, r7\n\t"
  49908. #endif
  49909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49910. "lsrs r7, r6, #16\n\t"
  49911. #else
  49912. "lsr r7, r6, #16\n\t"
  49913. #endif
  49914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49915. "lsls r6, r6, #16\n\t"
  49916. #else
  49917. "lsl r6, r6, #16\n\t"
  49918. #endif
  49919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49920. "adds r5, r5, r6\n\t"
  49921. #else
  49922. "add r5, r5, r6\n\t"
  49923. #endif
  49924. #ifdef WOLFSSL_KEIL
  49925. "adcs r3, r3, r7\n\t"
  49926. #elif defined(__clang__)
  49927. "adcs r3, r7\n\t"
  49928. #else
  49929. "adc r3, r7\n\t"
  49930. #endif
  49931. #ifdef WOLFSSL_KEIL
  49932. "adcs r4, r4, %[r]\n\t"
  49933. #elif defined(__clang__)
  49934. "adcs r4, %[r]\n\t"
  49935. #else
  49936. "adc r4, %[r]\n\t"
  49937. #endif
  49938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49939. "lsrs r6, %[a], #16\n\t"
  49940. #else
  49941. "lsr r6, %[a], #16\n\t"
  49942. #endif
  49943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49944. "lsrs r7, %[b], #16\n\t"
  49945. #else
  49946. "lsr r7, %[b], #16\n\t"
  49947. #endif
  49948. #ifdef WOLFSSL_KEIL
  49949. "muls r7, r6, r7\n\t"
  49950. #elif defined(__clang__)
  49951. "muls r7, r6\n\t"
  49952. #else
  49953. "mul r7, r6\n\t"
  49954. #endif
  49955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49956. "adds r3, r3, r7\n\t"
  49957. #else
  49958. "add r3, r3, r7\n\t"
  49959. #endif
  49960. #ifdef WOLFSSL_KEIL
  49961. "adcs r4, r4, %[r]\n\t"
  49962. #elif defined(__clang__)
  49963. "adcs r4, %[r]\n\t"
  49964. #else
  49965. "adc r4, %[r]\n\t"
  49966. #endif
  49967. "uxth r7, %[b]\n\t"
  49968. #ifdef WOLFSSL_KEIL
  49969. "muls r6, r7, r6\n\t"
  49970. #elif defined(__clang__)
  49971. "muls r6, r7\n\t"
  49972. #else
  49973. "mul r6, r7\n\t"
  49974. #endif
  49975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49976. "lsrs r7, r6, #16\n\t"
  49977. #else
  49978. "lsr r7, r6, #16\n\t"
  49979. #endif
  49980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49981. "lsls r6, r6, #16\n\t"
  49982. #else
  49983. "lsl r6, r6, #16\n\t"
  49984. #endif
  49985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49986. "adds r5, r5, r6\n\t"
  49987. #else
  49988. "add r5, r5, r6\n\t"
  49989. #endif
  49990. #ifdef WOLFSSL_KEIL
  49991. "adcs r3, r3, r7\n\t"
  49992. #elif defined(__clang__)
  49993. "adcs r3, r7\n\t"
  49994. #else
  49995. "adc r3, r7\n\t"
  49996. #endif
  49997. #ifdef WOLFSSL_KEIL
  49998. "adcs r4, r4, %[r]\n\t"
  49999. #elif defined(__clang__)
  50000. "adcs r4, %[r]\n\t"
  50001. #else
  50002. "adc r4, %[r]\n\t"
  50003. #endif
  50004. "# A[9] * B[11]\n\t"
  50005. "mov %[a], r9\n\t"
  50006. "mov %[b], r10\n\t"
  50007. "ldr %[a], [%[a], #36]\n\t"
  50008. "ldr %[b], [%[b], #44]\n\t"
  50009. "uxth r6, %[a]\n\t"
  50010. "uxth r7, %[b]\n\t"
  50011. #ifdef WOLFSSL_KEIL
  50012. "muls r7, r6, r7\n\t"
  50013. #elif defined(__clang__)
  50014. "muls r7, r6\n\t"
  50015. #else
  50016. "mul r7, r6\n\t"
  50017. #endif
  50018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50019. "adds r5, r5, r7\n\t"
  50020. #else
  50021. "add r5, r5, r7\n\t"
  50022. #endif
  50023. #ifdef WOLFSSL_KEIL
  50024. "adcs r3, r3, %[r]\n\t"
  50025. #elif defined(__clang__)
  50026. "adcs r3, %[r]\n\t"
  50027. #else
  50028. "adc r3, %[r]\n\t"
  50029. #endif
  50030. #ifdef WOLFSSL_KEIL
  50031. "adcs r4, r4, %[r]\n\t"
  50032. #elif defined(__clang__)
  50033. "adcs r4, %[r]\n\t"
  50034. #else
  50035. "adc r4, %[r]\n\t"
  50036. #endif
  50037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50038. "lsrs r7, %[b], #16\n\t"
  50039. #else
  50040. "lsr r7, %[b], #16\n\t"
  50041. #endif
  50042. #ifdef WOLFSSL_KEIL
  50043. "muls r6, r7, r6\n\t"
  50044. #elif defined(__clang__)
  50045. "muls r6, r7\n\t"
  50046. #else
  50047. "mul r6, r7\n\t"
  50048. #endif
  50049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50050. "lsrs r7, r6, #16\n\t"
  50051. #else
  50052. "lsr r7, r6, #16\n\t"
  50053. #endif
  50054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50055. "lsls r6, r6, #16\n\t"
  50056. #else
  50057. "lsl r6, r6, #16\n\t"
  50058. #endif
  50059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50060. "adds r5, r5, r6\n\t"
  50061. #else
  50062. "add r5, r5, r6\n\t"
  50063. #endif
  50064. #ifdef WOLFSSL_KEIL
  50065. "adcs r3, r3, r7\n\t"
  50066. #elif defined(__clang__)
  50067. "adcs r3, r7\n\t"
  50068. #else
  50069. "adc r3, r7\n\t"
  50070. #endif
  50071. #ifdef WOLFSSL_KEIL
  50072. "adcs r4, r4, %[r]\n\t"
  50073. #elif defined(__clang__)
  50074. "adcs r4, %[r]\n\t"
  50075. #else
  50076. "adc r4, %[r]\n\t"
  50077. #endif
  50078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50079. "lsrs r6, %[a], #16\n\t"
  50080. #else
  50081. "lsr r6, %[a], #16\n\t"
  50082. #endif
  50083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50084. "lsrs r7, %[b], #16\n\t"
  50085. #else
  50086. "lsr r7, %[b], #16\n\t"
  50087. #endif
  50088. #ifdef WOLFSSL_KEIL
  50089. "muls r7, r6, r7\n\t"
  50090. #elif defined(__clang__)
  50091. "muls r7, r6\n\t"
  50092. #else
  50093. "mul r7, r6\n\t"
  50094. #endif
  50095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50096. "adds r3, r3, r7\n\t"
  50097. #else
  50098. "add r3, r3, r7\n\t"
  50099. #endif
  50100. #ifdef WOLFSSL_KEIL
  50101. "adcs r4, r4, %[r]\n\t"
  50102. #elif defined(__clang__)
  50103. "adcs r4, %[r]\n\t"
  50104. #else
  50105. "adc r4, %[r]\n\t"
  50106. #endif
  50107. "uxth r7, %[b]\n\t"
  50108. #ifdef WOLFSSL_KEIL
  50109. "muls r6, r7, r6\n\t"
  50110. #elif defined(__clang__)
  50111. "muls r6, r7\n\t"
  50112. #else
  50113. "mul r6, r7\n\t"
  50114. #endif
  50115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50116. "lsrs r7, r6, #16\n\t"
  50117. #else
  50118. "lsr r7, r6, #16\n\t"
  50119. #endif
  50120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50121. "lsls r6, r6, #16\n\t"
  50122. #else
  50123. "lsl r6, r6, #16\n\t"
  50124. #endif
  50125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50126. "adds r5, r5, r6\n\t"
  50127. #else
  50128. "add r5, r5, r6\n\t"
  50129. #endif
  50130. #ifdef WOLFSSL_KEIL
  50131. "adcs r3, r3, r7\n\t"
  50132. #elif defined(__clang__)
  50133. "adcs r3, r7\n\t"
  50134. #else
  50135. "adc r3, r7\n\t"
  50136. #endif
  50137. #ifdef WOLFSSL_KEIL
  50138. "adcs r4, r4, %[r]\n\t"
  50139. #elif defined(__clang__)
  50140. "adcs r4, %[r]\n\t"
  50141. #else
  50142. "adc r4, %[r]\n\t"
  50143. #endif
  50144. "mov %[r], r8\n\t"
  50145. "str r5, [%[r], #80]\n\t"
  50146. "movs %[r], #0\n\t"
  50147. "# A[10] * B[11]\n\t"
  50148. "movs r5, #0\n\t"
  50149. "mov %[a], r9\n\t"
  50150. "mov %[b], r10\n\t"
  50151. "ldr %[a], [%[a], #40]\n\t"
  50152. "ldr %[b], [%[b], #44]\n\t"
  50153. "uxth r6, %[a]\n\t"
  50154. "uxth r7, %[b]\n\t"
  50155. #ifdef WOLFSSL_KEIL
  50156. "muls r7, r6, r7\n\t"
  50157. #elif defined(__clang__)
  50158. "muls r7, r6\n\t"
  50159. #else
  50160. "mul r7, r6\n\t"
  50161. #endif
  50162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50163. "adds r3, r3, r7\n\t"
  50164. #else
  50165. "add r3, r3, r7\n\t"
  50166. #endif
  50167. #ifdef WOLFSSL_KEIL
  50168. "adcs r4, r4, %[r]\n\t"
  50169. #elif defined(__clang__)
  50170. "adcs r4, %[r]\n\t"
  50171. #else
  50172. "adc r4, %[r]\n\t"
  50173. #endif
  50174. #ifdef WOLFSSL_KEIL
  50175. "adcs r5, r5, %[r]\n\t"
  50176. #elif defined(__clang__)
  50177. "adcs r5, %[r]\n\t"
  50178. #else
  50179. "adc r5, %[r]\n\t"
  50180. #endif
  50181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50182. "lsrs r7, %[b], #16\n\t"
  50183. #else
  50184. "lsr r7, %[b], #16\n\t"
  50185. #endif
  50186. #ifdef WOLFSSL_KEIL
  50187. "muls r6, r7, r6\n\t"
  50188. #elif defined(__clang__)
  50189. "muls r6, r7\n\t"
  50190. #else
  50191. "mul r6, r7\n\t"
  50192. #endif
  50193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50194. "lsrs r7, r6, #16\n\t"
  50195. #else
  50196. "lsr r7, r6, #16\n\t"
  50197. #endif
  50198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50199. "lsls r6, r6, #16\n\t"
  50200. #else
  50201. "lsl r6, r6, #16\n\t"
  50202. #endif
  50203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50204. "adds r3, r3, r6\n\t"
  50205. #else
  50206. "add r3, r3, r6\n\t"
  50207. #endif
  50208. #ifdef WOLFSSL_KEIL
  50209. "adcs r4, r4, r7\n\t"
  50210. #elif defined(__clang__)
  50211. "adcs r4, r7\n\t"
  50212. #else
  50213. "adc r4, r7\n\t"
  50214. #endif
  50215. #ifdef WOLFSSL_KEIL
  50216. "adcs r5, r5, %[r]\n\t"
  50217. #elif defined(__clang__)
  50218. "adcs r5, %[r]\n\t"
  50219. #else
  50220. "adc r5, %[r]\n\t"
  50221. #endif
  50222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50223. "lsrs r6, %[a], #16\n\t"
  50224. #else
  50225. "lsr r6, %[a], #16\n\t"
  50226. #endif
  50227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50228. "lsrs r7, %[b], #16\n\t"
  50229. #else
  50230. "lsr r7, %[b], #16\n\t"
  50231. #endif
  50232. #ifdef WOLFSSL_KEIL
  50233. "muls r7, r6, r7\n\t"
  50234. #elif defined(__clang__)
  50235. "muls r7, r6\n\t"
  50236. #else
  50237. "mul r7, r6\n\t"
  50238. #endif
  50239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50240. "adds r4, r4, r7\n\t"
  50241. #else
  50242. "add r4, r4, r7\n\t"
  50243. #endif
  50244. #ifdef WOLFSSL_KEIL
  50245. "adcs r5, r5, %[r]\n\t"
  50246. #elif defined(__clang__)
  50247. "adcs r5, %[r]\n\t"
  50248. #else
  50249. "adc r5, %[r]\n\t"
  50250. #endif
  50251. "uxth r7, %[b]\n\t"
  50252. #ifdef WOLFSSL_KEIL
  50253. "muls r6, r7, r6\n\t"
  50254. #elif defined(__clang__)
  50255. "muls r6, r7\n\t"
  50256. #else
  50257. "mul r6, r7\n\t"
  50258. #endif
  50259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50260. "lsrs r7, r6, #16\n\t"
  50261. #else
  50262. "lsr r7, r6, #16\n\t"
  50263. #endif
  50264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50265. "lsls r6, r6, #16\n\t"
  50266. #else
  50267. "lsl r6, r6, #16\n\t"
  50268. #endif
  50269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50270. "adds r3, r3, r6\n\t"
  50271. #else
  50272. "add r3, r3, r6\n\t"
  50273. #endif
  50274. #ifdef WOLFSSL_KEIL
  50275. "adcs r4, r4, r7\n\t"
  50276. #elif defined(__clang__)
  50277. "adcs r4, r7\n\t"
  50278. #else
  50279. "adc r4, r7\n\t"
  50280. #endif
  50281. #ifdef WOLFSSL_KEIL
  50282. "adcs r5, r5, %[r]\n\t"
  50283. #elif defined(__clang__)
  50284. "adcs r5, %[r]\n\t"
  50285. #else
  50286. "adc r5, %[r]\n\t"
  50287. #endif
  50288. "# A[11] * B[10]\n\t"
  50289. "mov %[a], r9\n\t"
  50290. "mov %[b], r10\n\t"
  50291. "ldr %[a], [%[a], #44]\n\t"
  50292. "ldr %[b], [%[b], #40]\n\t"
  50293. "uxth r6, %[a]\n\t"
  50294. "uxth r7, %[b]\n\t"
  50295. #ifdef WOLFSSL_KEIL
  50296. "muls r7, r6, r7\n\t"
  50297. #elif defined(__clang__)
  50298. "muls r7, r6\n\t"
  50299. #else
  50300. "mul r7, r6\n\t"
  50301. #endif
  50302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50303. "adds r3, r3, r7\n\t"
  50304. #else
  50305. "add r3, r3, r7\n\t"
  50306. #endif
  50307. #ifdef WOLFSSL_KEIL
  50308. "adcs r4, r4, %[r]\n\t"
  50309. #elif defined(__clang__)
  50310. "adcs r4, %[r]\n\t"
  50311. #else
  50312. "adc r4, %[r]\n\t"
  50313. #endif
  50314. #ifdef WOLFSSL_KEIL
  50315. "adcs r5, r5, %[r]\n\t"
  50316. #elif defined(__clang__)
  50317. "adcs r5, %[r]\n\t"
  50318. #else
  50319. "adc r5, %[r]\n\t"
  50320. #endif
  50321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50322. "lsrs r7, %[b], #16\n\t"
  50323. #else
  50324. "lsr r7, %[b], #16\n\t"
  50325. #endif
  50326. #ifdef WOLFSSL_KEIL
  50327. "muls r6, r7, r6\n\t"
  50328. #elif defined(__clang__)
  50329. "muls r6, r7\n\t"
  50330. #else
  50331. "mul r6, r7\n\t"
  50332. #endif
  50333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50334. "lsrs r7, r6, #16\n\t"
  50335. #else
  50336. "lsr r7, r6, #16\n\t"
  50337. #endif
  50338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50339. "lsls r6, r6, #16\n\t"
  50340. #else
  50341. "lsl r6, r6, #16\n\t"
  50342. #endif
  50343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50344. "adds r3, r3, r6\n\t"
  50345. #else
  50346. "add r3, r3, r6\n\t"
  50347. #endif
  50348. #ifdef WOLFSSL_KEIL
  50349. "adcs r4, r4, r7\n\t"
  50350. #elif defined(__clang__)
  50351. "adcs r4, r7\n\t"
  50352. #else
  50353. "adc r4, r7\n\t"
  50354. #endif
  50355. #ifdef WOLFSSL_KEIL
  50356. "adcs r5, r5, %[r]\n\t"
  50357. #elif defined(__clang__)
  50358. "adcs r5, %[r]\n\t"
  50359. #else
  50360. "adc r5, %[r]\n\t"
  50361. #endif
  50362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50363. "lsrs r6, %[a], #16\n\t"
  50364. #else
  50365. "lsr r6, %[a], #16\n\t"
  50366. #endif
  50367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50368. "lsrs r7, %[b], #16\n\t"
  50369. #else
  50370. "lsr r7, %[b], #16\n\t"
  50371. #endif
  50372. #ifdef WOLFSSL_KEIL
  50373. "muls r7, r6, r7\n\t"
  50374. #elif defined(__clang__)
  50375. "muls r7, r6\n\t"
  50376. #else
  50377. "mul r7, r6\n\t"
  50378. #endif
  50379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50380. "adds r4, r4, r7\n\t"
  50381. #else
  50382. "add r4, r4, r7\n\t"
  50383. #endif
  50384. #ifdef WOLFSSL_KEIL
  50385. "adcs r5, r5, %[r]\n\t"
  50386. #elif defined(__clang__)
  50387. "adcs r5, %[r]\n\t"
  50388. #else
  50389. "adc r5, %[r]\n\t"
  50390. #endif
  50391. "uxth r7, %[b]\n\t"
  50392. #ifdef WOLFSSL_KEIL
  50393. "muls r6, r7, r6\n\t"
  50394. #elif defined(__clang__)
  50395. "muls r6, r7\n\t"
  50396. #else
  50397. "mul r6, r7\n\t"
  50398. #endif
  50399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50400. "lsrs r7, r6, #16\n\t"
  50401. #else
  50402. "lsr r7, r6, #16\n\t"
  50403. #endif
  50404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50405. "lsls r6, r6, #16\n\t"
  50406. #else
  50407. "lsl r6, r6, #16\n\t"
  50408. #endif
  50409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50410. "adds r3, r3, r6\n\t"
  50411. #else
  50412. "add r3, r3, r6\n\t"
  50413. #endif
  50414. #ifdef WOLFSSL_KEIL
  50415. "adcs r4, r4, r7\n\t"
  50416. #elif defined(__clang__)
  50417. "adcs r4, r7\n\t"
  50418. #else
  50419. "adc r4, r7\n\t"
  50420. #endif
  50421. #ifdef WOLFSSL_KEIL
  50422. "adcs r5, r5, %[r]\n\t"
  50423. #elif defined(__clang__)
  50424. "adcs r5, %[r]\n\t"
  50425. #else
  50426. "adc r5, %[r]\n\t"
  50427. #endif
  50428. "mov %[r], r8\n\t"
  50429. "str r3, [%[r], #84]\n\t"
  50430. "movs %[r], #0\n\t"
  50431. "# A[11] * B[11]\n\t"
  50432. "mov %[a], r9\n\t"
  50433. "mov %[b], r10\n\t"
  50434. "ldr %[a], [%[a], #44]\n\t"
  50435. "ldr %[b], [%[b], #44]\n\t"
  50436. "uxth r6, %[a]\n\t"
  50437. "uxth r7, %[b]\n\t"
  50438. #ifdef WOLFSSL_KEIL
  50439. "muls r7, r6, r7\n\t"
  50440. #elif defined(__clang__)
  50441. "muls r7, r6\n\t"
  50442. #else
  50443. "mul r7, r6\n\t"
  50444. #endif
  50445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50446. "adds r4, r4, r7\n\t"
  50447. #else
  50448. "add r4, r4, r7\n\t"
  50449. #endif
  50450. #ifdef WOLFSSL_KEIL
  50451. "adcs r5, r5, %[r]\n\t"
  50452. #elif defined(__clang__)
  50453. "adcs r5, %[r]\n\t"
  50454. #else
  50455. "adc r5, %[r]\n\t"
  50456. #endif
  50457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50458. "lsrs r7, %[b], #16\n\t"
  50459. #else
  50460. "lsr r7, %[b], #16\n\t"
  50461. #endif
  50462. #ifdef WOLFSSL_KEIL
  50463. "muls r6, r7, r6\n\t"
  50464. #elif defined(__clang__)
  50465. "muls r6, r7\n\t"
  50466. #else
  50467. "mul r6, r7\n\t"
  50468. #endif
  50469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50470. "lsrs r7, r6, #16\n\t"
  50471. #else
  50472. "lsr r7, r6, #16\n\t"
  50473. #endif
  50474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50475. "lsls r6, r6, #16\n\t"
  50476. #else
  50477. "lsl r6, r6, #16\n\t"
  50478. #endif
  50479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50480. "adds r4, r4, r6\n\t"
  50481. #else
  50482. "add r4, r4, r6\n\t"
  50483. #endif
  50484. #ifdef WOLFSSL_KEIL
  50485. "adcs r5, r5, r7\n\t"
  50486. #elif defined(__clang__)
  50487. "adcs r5, r7\n\t"
  50488. #else
  50489. "adc r5, r7\n\t"
  50490. #endif
  50491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50492. "lsrs r6, %[a], #16\n\t"
  50493. #else
  50494. "lsr r6, %[a], #16\n\t"
  50495. #endif
  50496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50497. "lsrs r7, %[b], #16\n\t"
  50498. #else
  50499. "lsr r7, %[b], #16\n\t"
  50500. #endif
  50501. #ifdef WOLFSSL_KEIL
  50502. "muls r7, r6, r7\n\t"
  50503. #elif defined(__clang__)
  50504. "muls r7, r6\n\t"
  50505. #else
  50506. "mul r7, r6\n\t"
  50507. #endif
  50508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50509. "adds r5, r5, r7\n\t"
  50510. #else
  50511. "add r5, r5, r7\n\t"
  50512. #endif
  50513. "uxth r7, %[b]\n\t"
  50514. #ifdef WOLFSSL_KEIL
  50515. "muls r6, r7, r6\n\t"
  50516. #elif defined(__clang__)
  50517. "muls r6, r7\n\t"
  50518. #else
  50519. "mul r6, r7\n\t"
  50520. #endif
  50521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50522. "lsrs r7, r6, #16\n\t"
  50523. #else
  50524. "lsr r7, r6, #16\n\t"
  50525. #endif
  50526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50527. "lsls r6, r6, #16\n\t"
  50528. #else
  50529. "lsl r6, r6, #16\n\t"
  50530. #endif
  50531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50532. "adds r4, r4, r6\n\t"
  50533. #else
  50534. "add r4, r4, r6\n\t"
  50535. #endif
  50536. #ifdef WOLFSSL_KEIL
  50537. "adcs r5, r5, r7\n\t"
  50538. #elif defined(__clang__)
  50539. "adcs r5, r7\n\t"
  50540. #else
  50541. "adc r5, r7\n\t"
  50542. #endif
  50543. "mov %[r], r8\n\t"
  50544. "str r4, [%[r], #88]\n\t"
  50545. "str r5, [%[r], #92]\n\t"
  50546. "pop {r3, r4, r5, r6}\n\t"
  50547. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  50548. "pop {r3, r4, r5, r6}\n\t"
  50549. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  50550. "pop {r3, r4, r5, r6}\n\t"
  50551. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  50552. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  50553. :
  50554. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  50555. );
  50556. }
  50557. #endif /* !WOLFSSL_SP_LARGE_CODE */
  50558. /* Add b to a into r. (r = a + b)
  50559. *
  50560. * r A single precision integer.
  50561. * a A single precision integer.
  50562. * b A single precision integer.
  50563. */
  50564. SP_NOINLINE static sp_digit sp_3072_add_12(sp_digit* r, const sp_digit* a,
  50565. const sp_digit* b)
  50566. {
  50567. __asm__ __volatile__ (
  50568. "ldm %[b]!, {r5, r6}\n\t"
  50569. "ldm %[a]!, {r3, r4}\n\t"
  50570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50571. "adds r3, r3, r5\n\t"
  50572. #else
  50573. "add r3, r3, r5\n\t"
  50574. #endif
  50575. #ifdef WOLFSSL_KEIL
  50576. "adcs r4, r4, r6\n\t"
  50577. #elif defined(__clang__)
  50578. "adcs r4, r6\n\t"
  50579. #else
  50580. "adc r4, r6\n\t"
  50581. #endif
  50582. "stm %[r]!, {r3, r4}\n\t"
  50583. "ldm %[b]!, {r5, r6}\n\t"
  50584. "ldm %[a]!, {r3, r4}\n\t"
  50585. #ifdef WOLFSSL_KEIL
  50586. "adcs r3, r3, r5\n\t"
  50587. #elif defined(__clang__)
  50588. "adcs r3, r5\n\t"
  50589. #else
  50590. "adc r3, r5\n\t"
  50591. #endif
  50592. #ifdef WOLFSSL_KEIL
  50593. "adcs r4, r4, r6\n\t"
  50594. #elif defined(__clang__)
  50595. "adcs r4, r6\n\t"
  50596. #else
  50597. "adc r4, r6\n\t"
  50598. #endif
  50599. "stm %[r]!, {r3, r4}\n\t"
  50600. "ldm %[b]!, {r5, r6}\n\t"
  50601. "ldm %[a]!, {r3, r4}\n\t"
  50602. #ifdef WOLFSSL_KEIL
  50603. "adcs r3, r3, r5\n\t"
  50604. #elif defined(__clang__)
  50605. "adcs r3, r5\n\t"
  50606. #else
  50607. "adc r3, r5\n\t"
  50608. #endif
  50609. #ifdef WOLFSSL_KEIL
  50610. "adcs r4, r4, r6\n\t"
  50611. #elif defined(__clang__)
  50612. "adcs r4, r6\n\t"
  50613. #else
  50614. "adc r4, r6\n\t"
  50615. #endif
  50616. "stm %[r]!, {r3, r4}\n\t"
  50617. "ldm %[b]!, {r5, r6}\n\t"
  50618. "ldm %[a]!, {r3, r4}\n\t"
  50619. #ifdef WOLFSSL_KEIL
  50620. "adcs r3, r3, r5\n\t"
  50621. #elif defined(__clang__)
  50622. "adcs r3, r5\n\t"
  50623. #else
  50624. "adc r3, r5\n\t"
  50625. #endif
  50626. #ifdef WOLFSSL_KEIL
  50627. "adcs r4, r4, r6\n\t"
  50628. #elif defined(__clang__)
  50629. "adcs r4, r6\n\t"
  50630. #else
  50631. "adc r4, r6\n\t"
  50632. #endif
  50633. "stm %[r]!, {r3, r4}\n\t"
  50634. "ldm %[b]!, {r5, r6}\n\t"
  50635. "ldm %[a]!, {r3, r4}\n\t"
  50636. #ifdef WOLFSSL_KEIL
  50637. "adcs r3, r3, r5\n\t"
  50638. #elif defined(__clang__)
  50639. "adcs r3, r5\n\t"
  50640. #else
  50641. "adc r3, r5\n\t"
  50642. #endif
  50643. #ifdef WOLFSSL_KEIL
  50644. "adcs r4, r4, r6\n\t"
  50645. #elif defined(__clang__)
  50646. "adcs r4, r6\n\t"
  50647. #else
  50648. "adc r4, r6\n\t"
  50649. #endif
  50650. "stm %[r]!, {r3, r4}\n\t"
  50651. "ldm %[b]!, {r5, r6}\n\t"
  50652. "ldm %[a]!, {r3, r4}\n\t"
  50653. #ifdef WOLFSSL_KEIL
  50654. "adcs r3, r3, r5\n\t"
  50655. #elif defined(__clang__)
  50656. "adcs r3, r5\n\t"
  50657. #else
  50658. "adc r3, r5\n\t"
  50659. #endif
  50660. #ifdef WOLFSSL_KEIL
  50661. "adcs r4, r4, r6\n\t"
  50662. #elif defined(__clang__)
  50663. "adcs r4, r6\n\t"
  50664. #else
  50665. "adc r4, r6\n\t"
  50666. #endif
  50667. "stm %[r]!, {r3, r4}\n\t"
  50668. "movs %[r], #0\n\t"
  50669. #ifdef WOLFSSL_KEIL
  50670. "adcs %[r], %[r], %[r]\n\t"
  50671. #elif defined(__clang__)
  50672. "adcs %[r], %[r]\n\t"
  50673. #else
  50674. "adc %[r], %[r]\n\t"
  50675. #endif
  50676. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  50677. :
  50678. : "memory", "r3", "r4", "r5", "r6"
  50679. );
  50680. return (uint32_t)(size_t)r;
  50681. }
  50682. /* Add b to a into r. (r = a + b)
  50683. *
  50684. * r A single precision integer.
  50685. * a A single precision integer.
  50686. * b A single precision integer.
  50687. */
  50688. SP_NOINLINE static sp_digit sp_3072_add_word_12(sp_digit* r, const sp_digit* a,
  50689. sp_digit b)
  50690. {
  50691. __asm__ __volatile__ (
  50692. "movs r5, #0\n\t"
  50693. "ldm %[a]!, {r3, r4}\n\t"
  50694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50695. "adds r3, r3, %[b]\n\t"
  50696. #else
  50697. "add r3, r3, %[b]\n\t"
  50698. #endif
  50699. #ifdef WOLFSSL_KEIL
  50700. "adcs r4, r4, r5\n\t"
  50701. #elif defined(__clang__)
  50702. "adcs r4, r5\n\t"
  50703. #else
  50704. "adc r4, r5\n\t"
  50705. #endif
  50706. "stm %[r]!, {r3, r4}\n\t"
  50707. "ldm %[a]!, {r3, r4}\n\t"
  50708. #ifdef WOLFSSL_KEIL
  50709. "adcs r3, r3, r5\n\t"
  50710. #elif defined(__clang__)
  50711. "adcs r3, r5\n\t"
  50712. #else
  50713. "adc r3, r5\n\t"
  50714. #endif
  50715. #ifdef WOLFSSL_KEIL
  50716. "adcs r4, r4, r5\n\t"
  50717. #elif defined(__clang__)
  50718. "adcs r4, r5\n\t"
  50719. #else
  50720. "adc r4, r5\n\t"
  50721. #endif
  50722. "stm %[r]!, {r3, r4}\n\t"
  50723. "ldm %[a]!, {r3, r4}\n\t"
  50724. #ifdef WOLFSSL_KEIL
  50725. "adcs r3, r3, r5\n\t"
  50726. #elif defined(__clang__)
  50727. "adcs r3, r5\n\t"
  50728. #else
  50729. "adc r3, r5\n\t"
  50730. #endif
  50731. #ifdef WOLFSSL_KEIL
  50732. "adcs r4, r4, r5\n\t"
  50733. #elif defined(__clang__)
  50734. "adcs r4, r5\n\t"
  50735. #else
  50736. "adc r4, r5\n\t"
  50737. #endif
  50738. "stm %[r]!, {r3, r4}\n\t"
  50739. "ldm %[a]!, {r3, r4}\n\t"
  50740. #ifdef WOLFSSL_KEIL
  50741. "adcs r3, r3, r5\n\t"
  50742. #elif defined(__clang__)
  50743. "adcs r3, r5\n\t"
  50744. #else
  50745. "adc r3, r5\n\t"
  50746. #endif
  50747. #ifdef WOLFSSL_KEIL
  50748. "adcs r4, r4, r5\n\t"
  50749. #elif defined(__clang__)
  50750. "adcs r4, r5\n\t"
  50751. #else
  50752. "adc r4, r5\n\t"
  50753. #endif
  50754. "stm %[r]!, {r3, r4}\n\t"
  50755. "ldm %[a]!, {r3, r4}\n\t"
  50756. #ifdef WOLFSSL_KEIL
  50757. "adcs r3, r3, r5\n\t"
  50758. #elif defined(__clang__)
  50759. "adcs r3, r5\n\t"
  50760. #else
  50761. "adc r3, r5\n\t"
  50762. #endif
  50763. #ifdef WOLFSSL_KEIL
  50764. "adcs r4, r4, r5\n\t"
  50765. #elif defined(__clang__)
  50766. "adcs r4, r5\n\t"
  50767. #else
  50768. "adc r4, r5\n\t"
  50769. #endif
  50770. "stm %[r]!, {r3, r4}\n\t"
  50771. "ldm %[a]!, {r3, r4}\n\t"
  50772. #ifdef WOLFSSL_KEIL
  50773. "adcs r3, r3, r5\n\t"
  50774. #elif defined(__clang__)
  50775. "adcs r3, r5\n\t"
  50776. #else
  50777. "adc r3, r5\n\t"
  50778. #endif
  50779. #ifdef WOLFSSL_KEIL
  50780. "adcs r4, r4, r5\n\t"
  50781. #elif defined(__clang__)
  50782. "adcs r4, r5\n\t"
  50783. #else
  50784. "adc r4, r5\n\t"
  50785. #endif
  50786. "stm %[r]!, {r3, r4}\n\t"
  50787. "movs %[r], #0\n\t"
  50788. #ifdef WOLFSSL_KEIL
  50789. "adcs %[r], %[r], %[r]\n\t"
  50790. #elif defined(__clang__)
  50791. "adcs %[r], %[r]\n\t"
  50792. #else
  50793. "adc %[r], %[r]\n\t"
  50794. #endif
  50795. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  50796. :
  50797. : "memory", "r3", "r4", "r5"
  50798. );
  50799. return (uint32_t)(size_t)r;
  50800. }
  50801. /* Sub b from a into a. (a -= b)
  50802. *
  50803. * a A single precision integer.
  50804. * b A single precision integer.
  50805. */
  50806. SP_NOINLINE static sp_digit sp_3072_sub_in_place_24(sp_digit* a,
  50807. const sp_digit* b)
  50808. {
  50809. __asm__ __volatile__ (
  50810. "ldm %[b]!, {r4, r5}\n\t"
  50811. "ldr r2, [%[a]]\n\t"
  50812. "ldr r3, [%[a], #4]\n\t"
  50813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50814. "subs r2, r2, r4\n\t"
  50815. #else
  50816. "sub r2, r2, r4\n\t"
  50817. #endif
  50818. #ifdef WOLFSSL_KEIL
  50819. "sbcs r3, r3, r5\n\t"
  50820. #elif defined(__clang__)
  50821. "sbcs r3, r5\n\t"
  50822. #else
  50823. "sbc r3, r5\n\t"
  50824. #endif
  50825. "stm %[a]!, {r2, r3}\n\t"
  50826. "ldm %[b]!, {r4, r5}\n\t"
  50827. "ldr r2, [%[a]]\n\t"
  50828. "ldr r3, [%[a], #4]\n\t"
  50829. #ifdef WOLFSSL_KEIL
  50830. "sbcs r2, r2, r4\n\t"
  50831. #elif defined(__clang__)
  50832. "sbcs r2, r4\n\t"
  50833. #else
  50834. "sbc r2, r4\n\t"
  50835. #endif
  50836. #ifdef WOLFSSL_KEIL
  50837. "sbcs r3, r3, r5\n\t"
  50838. #elif defined(__clang__)
  50839. "sbcs r3, r5\n\t"
  50840. #else
  50841. "sbc r3, r5\n\t"
  50842. #endif
  50843. "stm %[a]!, {r2, r3}\n\t"
  50844. "ldm %[b]!, {r4, r5}\n\t"
  50845. "ldr r2, [%[a]]\n\t"
  50846. "ldr r3, [%[a], #4]\n\t"
  50847. #ifdef WOLFSSL_KEIL
  50848. "sbcs r2, r2, r4\n\t"
  50849. #elif defined(__clang__)
  50850. "sbcs r2, r4\n\t"
  50851. #else
  50852. "sbc r2, r4\n\t"
  50853. #endif
  50854. #ifdef WOLFSSL_KEIL
  50855. "sbcs r3, r3, r5\n\t"
  50856. #elif defined(__clang__)
  50857. "sbcs r3, r5\n\t"
  50858. #else
  50859. "sbc r3, r5\n\t"
  50860. #endif
  50861. "stm %[a]!, {r2, r3}\n\t"
  50862. "ldm %[b]!, {r4, r5}\n\t"
  50863. "ldr r2, [%[a]]\n\t"
  50864. "ldr r3, [%[a], #4]\n\t"
  50865. #ifdef WOLFSSL_KEIL
  50866. "sbcs r2, r2, r4\n\t"
  50867. #elif defined(__clang__)
  50868. "sbcs r2, r4\n\t"
  50869. #else
  50870. "sbc r2, r4\n\t"
  50871. #endif
  50872. #ifdef WOLFSSL_KEIL
  50873. "sbcs r3, r3, r5\n\t"
  50874. #elif defined(__clang__)
  50875. "sbcs r3, r5\n\t"
  50876. #else
  50877. "sbc r3, r5\n\t"
  50878. #endif
  50879. "stm %[a]!, {r2, r3}\n\t"
  50880. "ldm %[b]!, {r4, r5}\n\t"
  50881. "ldr r2, [%[a]]\n\t"
  50882. "ldr r3, [%[a], #4]\n\t"
  50883. #ifdef WOLFSSL_KEIL
  50884. "sbcs r2, r2, r4\n\t"
  50885. #elif defined(__clang__)
  50886. "sbcs r2, r4\n\t"
  50887. #else
  50888. "sbc r2, r4\n\t"
  50889. #endif
  50890. #ifdef WOLFSSL_KEIL
  50891. "sbcs r3, r3, r5\n\t"
  50892. #elif defined(__clang__)
  50893. "sbcs r3, r5\n\t"
  50894. #else
  50895. "sbc r3, r5\n\t"
  50896. #endif
  50897. "stm %[a]!, {r2, r3}\n\t"
  50898. "ldm %[b]!, {r4, r5}\n\t"
  50899. "ldr r2, [%[a]]\n\t"
  50900. "ldr r3, [%[a], #4]\n\t"
  50901. #ifdef WOLFSSL_KEIL
  50902. "sbcs r2, r2, r4\n\t"
  50903. #elif defined(__clang__)
  50904. "sbcs r2, r4\n\t"
  50905. #else
  50906. "sbc r2, r4\n\t"
  50907. #endif
  50908. #ifdef WOLFSSL_KEIL
  50909. "sbcs r3, r3, r5\n\t"
  50910. #elif defined(__clang__)
  50911. "sbcs r3, r5\n\t"
  50912. #else
  50913. "sbc r3, r5\n\t"
  50914. #endif
  50915. "stm %[a]!, {r2, r3}\n\t"
  50916. "ldm %[b]!, {r4, r5}\n\t"
  50917. "ldr r2, [%[a]]\n\t"
  50918. "ldr r3, [%[a], #4]\n\t"
  50919. #ifdef WOLFSSL_KEIL
  50920. "sbcs r2, r2, r4\n\t"
  50921. #elif defined(__clang__)
  50922. "sbcs r2, r4\n\t"
  50923. #else
  50924. "sbc r2, r4\n\t"
  50925. #endif
  50926. #ifdef WOLFSSL_KEIL
  50927. "sbcs r3, r3, r5\n\t"
  50928. #elif defined(__clang__)
  50929. "sbcs r3, r5\n\t"
  50930. #else
  50931. "sbc r3, r5\n\t"
  50932. #endif
  50933. "stm %[a]!, {r2, r3}\n\t"
  50934. "ldm %[b]!, {r4, r5}\n\t"
  50935. "ldr r2, [%[a]]\n\t"
  50936. "ldr r3, [%[a], #4]\n\t"
  50937. #ifdef WOLFSSL_KEIL
  50938. "sbcs r2, r2, r4\n\t"
  50939. #elif defined(__clang__)
  50940. "sbcs r2, r4\n\t"
  50941. #else
  50942. "sbc r2, r4\n\t"
  50943. #endif
  50944. #ifdef WOLFSSL_KEIL
  50945. "sbcs r3, r3, r5\n\t"
  50946. #elif defined(__clang__)
  50947. "sbcs r3, r5\n\t"
  50948. #else
  50949. "sbc r3, r5\n\t"
  50950. #endif
  50951. "stm %[a]!, {r2, r3}\n\t"
  50952. "ldm %[b]!, {r4, r5}\n\t"
  50953. "ldr r2, [%[a]]\n\t"
  50954. "ldr r3, [%[a], #4]\n\t"
  50955. #ifdef WOLFSSL_KEIL
  50956. "sbcs r2, r2, r4\n\t"
  50957. #elif defined(__clang__)
  50958. "sbcs r2, r4\n\t"
  50959. #else
  50960. "sbc r2, r4\n\t"
  50961. #endif
  50962. #ifdef WOLFSSL_KEIL
  50963. "sbcs r3, r3, r5\n\t"
  50964. #elif defined(__clang__)
  50965. "sbcs r3, r5\n\t"
  50966. #else
  50967. "sbc r3, r5\n\t"
  50968. #endif
  50969. "stm %[a]!, {r2, r3}\n\t"
  50970. "ldm %[b]!, {r4, r5}\n\t"
  50971. "ldr r2, [%[a]]\n\t"
  50972. "ldr r3, [%[a], #4]\n\t"
  50973. #ifdef WOLFSSL_KEIL
  50974. "sbcs r2, r2, r4\n\t"
  50975. #elif defined(__clang__)
  50976. "sbcs r2, r4\n\t"
  50977. #else
  50978. "sbc r2, r4\n\t"
  50979. #endif
  50980. #ifdef WOLFSSL_KEIL
  50981. "sbcs r3, r3, r5\n\t"
  50982. #elif defined(__clang__)
  50983. "sbcs r3, r5\n\t"
  50984. #else
  50985. "sbc r3, r5\n\t"
  50986. #endif
  50987. "stm %[a]!, {r2, r3}\n\t"
  50988. "ldm %[b]!, {r4, r5}\n\t"
  50989. "ldr r2, [%[a]]\n\t"
  50990. "ldr r3, [%[a], #4]\n\t"
  50991. #ifdef WOLFSSL_KEIL
  50992. "sbcs r2, r2, r4\n\t"
  50993. #elif defined(__clang__)
  50994. "sbcs r2, r4\n\t"
  50995. #else
  50996. "sbc r2, r4\n\t"
  50997. #endif
  50998. #ifdef WOLFSSL_KEIL
  50999. "sbcs r3, r3, r5\n\t"
  51000. #elif defined(__clang__)
  51001. "sbcs r3, r5\n\t"
  51002. #else
  51003. "sbc r3, r5\n\t"
  51004. #endif
  51005. "stm %[a]!, {r2, r3}\n\t"
  51006. "ldm %[b]!, {r4, r5}\n\t"
  51007. "ldr r2, [%[a]]\n\t"
  51008. "ldr r3, [%[a], #4]\n\t"
  51009. #ifdef WOLFSSL_KEIL
  51010. "sbcs r2, r2, r4\n\t"
  51011. #elif defined(__clang__)
  51012. "sbcs r2, r4\n\t"
  51013. #else
  51014. "sbc r2, r4\n\t"
  51015. #endif
  51016. #ifdef WOLFSSL_KEIL
  51017. "sbcs r3, r3, r5\n\t"
  51018. #elif defined(__clang__)
  51019. "sbcs r3, r5\n\t"
  51020. #else
  51021. "sbc r3, r5\n\t"
  51022. #endif
  51023. "stm %[a]!, {r2, r3}\n\t"
  51024. #ifdef WOLFSSL_KEIL
  51025. "sbcs %[a], %[a], %[a]\n\t"
  51026. #elif defined(__clang__)
  51027. "sbcs %[a], %[a]\n\t"
  51028. #else
  51029. "sbc %[a], %[a]\n\t"
  51030. #endif
  51031. : [a] "+l" (a), [b] "+l" (b)
  51032. :
  51033. : "memory", "r2", "r3", "r4", "r5"
  51034. );
  51035. return (uint32_t)(size_t)a;
  51036. }
  51037. /* Add b to a into r. (r = a + b)
  51038. *
  51039. * r A single precision integer.
  51040. * a A single precision integer.
  51041. * b A single precision integer.
  51042. */
  51043. SP_NOINLINE static sp_digit sp_3072_add_24(sp_digit* r, const sp_digit* a,
  51044. const sp_digit* b)
  51045. {
  51046. __asm__ __volatile__ (
  51047. "ldm %[b]!, {r5, r6}\n\t"
  51048. "ldm %[a]!, {r3, r4}\n\t"
  51049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51050. "adds r3, r3, r5\n\t"
  51051. #else
  51052. "add r3, r3, r5\n\t"
  51053. #endif
  51054. #ifdef WOLFSSL_KEIL
  51055. "adcs r4, r4, r6\n\t"
  51056. #elif defined(__clang__)
  51057. "adcs r4, r6\n\t"
  51058. #else
  51059. "adc r4, r6\n\t"
  51060. #endif
  51061. "stm %[r]!, {r3, r4}\n\t"
  51062. "ldm %[b]!, {r5, r6}\n\t"
  51063. "ldm %[a]!, {r3, r4}\n\t"
  51064. #ifdef WOLFSSL_KEIL
  51065. "adcs r3, r3, r5\n\t"
  51066. #elif defined(__clang__)
  51067. "adcs r3, r5\n\t"
  51068. #else
  51069. "adc r3, r5\n\t"
  51070. #endif
  51071. #ifdef WOLFSSL_KEIL
  51072. "adcs r4, r4, r6\n\t"
  51073. #elif defined(__clang__)
  51074. "adcs r4, r6\n\t"
  51075. #else
  51076. "adc r4, r6\n\t"
  51077. #endif
  51078. "stm %[r]!, {r3, r4}\n\t"
  51079. "ldm %[b]!, {r5, r6}\n\t"
  51080. "ldm %[a]!, {r3, r4}\n\t"
  51081. #ifdef WOLFSSL_KEIL
  51082. "adcs r3, r3, r5\n\t"
  51083. #elif defined(__clang__)
  51084. "adcs r3, r5\n\t"
  51085. #else
  51086. "adc r3, r5\n\t"
  51087. #endif
  51088. #ifdef WOLFSSL_KEIL
  51089. "adcs r4, r4, r6\n\t"
  51090. #elif defined(__clang__)
  51091. "adcs r4, r6\n\t"
  51092. #else
  51093. "adc r4, r6\n\t"
  51094. #endif
  51095. "stm %[r]!, {r3, r4}\n\t"
  51096. "ldm %[b]!, {r5, r6}\n\t"
  51097. "ldm %[a]!, {r3, r4}\n\t"
  51098. #ifdef WOLFSSL_KEIL
  51099. "adcs r3, r3, r5\n\t"
  51100. #elif defined(__clang__)
  51101. "adcs r3, r5\n\t"
  51102. #else
  51103. "adc r3, r5\n\t"
  51104. #endif
  51105. #ifdef WOLFSSL_KEIL
  51106. "adcs r4, r4, r6\n\t"
  51107. #elif defined(__clang__)
  51108. "adcs r4, r6\n\t"
  51109. #else
  51110. "adc r4, r6\n\t"
  51111. #endif
  51112. "stm %[r]!, {r3, r4}\n\t"
  51113. "ldm %[b]!, {r5, r6}\n\t"
  51114. "ldm %[a]!, {r3, r4}\n\t"
  51115. #ifdef WOLFSSL_KEIL
  51116. "adcs r3, r3, r5\n\t"
  51117. #elif defined(__clang__)
  51118. "adcs r3, r5\n\t"
  51119. #else
  51120. "adc r3, r5\n\t"
  51121. #endif
  51122. #ifdef WOLFSSL_KEIL
  51123. "adcs r4, r4, r6\n\t"
  51124. #elif defined(__clang__)
  51125. "adcs r4, r6\n\t"
  51126. #else
  51127. "adc r4, r6\n\t"
  51128. #endif
  51129. "stm %[r]!, {r3, r4}\n\t"
  51130. "ldm %[b]!, {r5, r6}\n\t"
  51131. "ldm %[a]!, {r3, r4}\n\t"
  51132. #ifdef WOLFSSL_KEIL
  51133. "adcs r3, r3, r5\n\t"
  51134. #elif defined(__clang__)
  51135. "adcs r3, r5\n\t"
  51136. #else
  51137. "adc r3, r5\n\t"
  51138. #endif
  51139. #ifdef WOLFSSL_KEIL
  51140. "adcs r4, r4, r6\n\t"
  51141. #elif defined(__clang__)
  51142. "adcs r4, r6\n\t"
  51143. #else
  51144. "adc r4, r6\n\t"
  51145. #endif
  51146. "stm %[r]!, {r3, r4}\n\t"
  51147. "ldm %[b]!, {r5, r6}\n\t"
  51148. "ldm %[a]!, {r3, r4}\n\t"
  51149. #ifdef WOLFSSL_KEIL
  51150. "adcs r3, r3, r5\n\t"
  51151. #elif defined(__clang__)
  51152. "adcs r3, r5\n\t"
  51153. #else
  51154. "adc r3, r5\n\t"
  51155. #endif
  51156. #ifdef WOLFSSL_KEIL
  51157. "adcs r4, r4, r6\n\t"
  51158. #elif defined(__clang__)
  51159. "adcs r4, r6\n\t"
  51160. #else
  51161. "adc r4, r6\n\t"
  51162. #endif
  51163. "stm %[r]!, {r3, r4}\n\t"
  51164. "ldm %[b]!, {r5, r6}\n\t"
  51165. "ldm %[a]!, {r3, r4}\n\t"
  51166. #ifdef WOLFSSL_KEIL
  51167. "adcs r3, r3, r5\n\t"
  51168. #elif defined(__clang__)
  51169. "adcs r3, r5\n\t"
  51170. #else
  51171. "adc r3, r5\n\t"
  51172. #endif
  51173. #ifdef WOLFSSL_KEIL
  51174. "adcs r4, r4, r6\n\t"
  51175. #elif defined(__clang__)
  51176. "adcs r4, r6\n\t"
  51177. #else
  51178. "adc r4, r6\n\t"
  51179. #endif
  51180. "stm %[r]!, {r3, r4}\n\t"
  51181. "ldm %[b]!, {r5, r6}\n\t"
  51182. "ldm %[a]!, {r3, r4}\n\t"
  51183. #ifdef WOLFSSL_KEIL
  51184. "adcs r3, r3, r5\n\t"
  51185. #elif defined(__clang__)
  51186. "adcs r3, r5\n\t"
  51187. #else
  51188. "adc r3, r5\n\t"
  51189. #endif
  51190. #ifdef WOLFSSL_KEIL
  51191. "adcs r4, r4, r6\n\t"
  51192. #elif defined(__clang__)
  51193. "adcs r4, r6\n\t"
  51194. #else
  51195. "adc r4, r6\n\t"
  51196. #endif
  51197. "stm %[r]!, {r3, r4}\n\t"
  51198. "ldm %[b]!, {r5, r6}\n\t"
  51199. "ldm %[a]!, {r3, r4}\n\t"
  51200. #ifdef WOLFSSL_KEIL
  51201. "adcs r3, r3, r5\n\t"
  51202. #elif defined(__clang__)
  51203. "adcs r3, r5\n\t"
  51204. #else
  51205. "adc r3, r5\n\t"
  51206. #endif
  51207. #ifdef WOLFSSL_KEIL
  51208. "adcs r4, r4, r6\n\t"
  51209. #elif defined(__clang__)
  51210. "adcs r4, r6\n\t"
  51211. #else
  51212. "adc r4, r6\n\t"
  51213. #endif
  51214. "stm %[r]!, {r3, r4}\n\t"
  51215. "ldm %[b]!, {r5, r6}\n\t"
  51216. "ldm %[a]!, {r3, r4}\n\t"
  51217. #ifdef WOLFSSL_KEIL
  51218. "adcs r3, r3, r5\n\t"
  51219. #elif defined(__clang__)
  51220. "adcs r3, r5\n\t"
  51221. #else
  51222. "adc r3, r5\n\t"
  51223. #endif
  51224. #ifdef WOLFSSL_KEIL
  51225. "adcs r4, r4, r6\n\t"
  51226. #elif defined(__clang__)
  51227. "adcs r4, r6\n\t"
  51228. #else
  51229. "adc r4, r6\n\t"
  51230. #endif
  51231. "stm %[r]!, {r3, r4}\n\t"
  51232. "ldm %[b]!, {r5, r6}\n\t"
  51233. "ldm %[a]!, {r3, r4}\n\t"
  51234. #ifdef WOLFSSL_KEIL
  51235. "adcs r3, r3, r5\n\t"
  51236. #elif defined(__clang__)
  51237. "adcs r3, r5\n\t"
  51238. #else
  51239. "adc r3, r5\n\t"
  51240. #endif
  51241. #ifdef WOLFSSL_KEIL
  51242. "adcs r4, r4, r6\n\t"
  51243. #elif defined(__clang__)
  51244. "adcs r4, r6\n\t"
  51245. #else
  51246. "adc r4, r6\n\t"
  51247. #endif
  51248. "stm %[r]!, {r3, r4}\n\t"
  51249. "movs %[r], #0\n\t"
  51250. #ifdef WOLFSSL_KEIL
  51251. "adcs %[r], %[r], %[r]\n\t"
  51252. #elif defined(__clang__)
  51253. "adcs %[r], %[r]\n\t"
  51254. #else
  51255. "adc %[r], %[r]\n\t"
  51256. #endif
  51257. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  51258. :
  51259. : "memory", "r3", "r4", "r5", "r6"
  51260. );
  51261. return (uint32_t)(size_t)r;
  51262. }
  51263. /* AND m into each word of a and store in r.
  51264. *
  51265. * r A single precision integer.
  51266. * a A single precision integer.
  51267. * m Mask to AND against each digit.
  51268. */
  51269. static void sp_3072_mask_12(sp_digit* r, const sp_digit* a, sp_digit m)
  51270. {
  51271. #ifdef WOLFSSL_SP_SMALL
  51272. int i;
  51273. for (i=0; i<12; i++) {
  51274. r[i] = a[i] & m;
  51275. }
  51276. #else
  51277. r[0] = a[0] & m;
  51278. r[1] = a[1] & m;
  51279. r[2] = a[2] & m;
  51280. r[3] = a[3] & m;
  51281. r[4] = a[4] & m;
  51282. r[5] = a[5] & m;
  51283. r[6] = a[6] & m;
  51284. r[7] = a[7] & m;
  51285. r[8] = a[8] & m;
  51286. r[9] = a[9] & m;
  51287. r[10] = a[10] & m;
  51288. r[11] = a[11] & m;
  51289. #endif
  51290. }
  51291. /* Multiply a and b into r. (r = a * b)
  51292. *
  51293. * r A single precision integer.
  51294. * a A single precision integer.
  51295. * b A single precision integer.
  51296. */
  51297. SP_NOINLINE static void sp_3072_mul_24(sp_digit* r, const sp_digit* a,
  51298. const sp_digit* b)
  51299. {
  51300. sp_digit* z0 = r;
  51301. sp_digit z1[24];
  51302. sp_digit a1[12];
  51303. sp_digit b1[12];
  51304. sp_digit* z2 = r + 24;
  51305. sp_digit u;
  51306. sp_digit ca;
  51307. sp_digit cb;
  51308. ca = sp_3072_add_12(a1, a, &a[12]);
  51309. cb = sp_3072_add_12(b1, b, &b[12]);
  51310. u = ca & cb;
  51311. sp_3072_mul_12(z2, &a[12], &b[12]);
  51312. sp_3072_mul_12(z0, a, b);
  51313. sp_3072_mul_12(z1, a1, b1);
  51314. u += sp_3072_sub_in_place_24(z1, z0);
  51315. u += sp_3072_sub_in_place_24(z1, z2);
  51316. sp_3072_mask_12(a1, a1, 0 - cb);
  51317. u += sp_3072_add_12(z1 + 12, z1 + 12, a1);
  51318. sp_3072_mask_12(b1, b1, 0 - ca);
  51319. u += sp_3072_add_12(z1 + 12, z1 + 12, b1);
  51320. u += sp_3072_add_24(r + 12, r + 12, z1);
  51321. (void)sp_3072_add_word_12(r + 36, r + 36, u);
  51322. }
  51323. /* Add b to a into r. (r = a + b)
  51324. *
  51325. * r A single precision integer.
  51326. * a A single precision integer.
  51327. * b A single precision integer.
  51328. */
  51329. SP_NOINLINE static sp_digit sp_3072_add_word_24(sp_digit* r, const sp_digit* a,
  51330. sp_digit b)
  51331. {
  51332. __asm__ __volatile__ (
  51333. "movs r5, #0\n\t"
  51334. "ldm %[a]!, {r3, r4}\n\t"
  51335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51336. "adds r3, r3, %[b]\n\t"
  51337. #else
  51338. "add r3, r3, %[b]\n\t"
  51339. #endif
  51340. #ifdef WOLFSSL_KEIL
  51341. "adcs r4, r4, r5\n\t"
  51342. #elif defined(__clang__)
  51343. "adcs r4, r5\n\t"
  51344. #else
  51345. "adc r4, r5\n\t"
  51346. #endif
  51347. "stm %[r]!, {r3, r4}\n\t"
  51348. "ldm %[a]!, {r3, r4}\n\t"
  51349. #ifdef WOLFSSL_KEIL
  51350. "adcs r3, r3, r5\n\t"
  51351. #elif defined(__clang__)
  51352. "adcs r3, r5\n\t"
  51353. #else
  51354. "adc r3, r5\n\t"
  51355. #endif
  51356. #ifdef WOLFSSL_KEIL
  51357. "adcs r4, r4, r5\n\t"
  51358. #elif defined(__clang__)
  51359. "adcs r4, r5\n\t"
  51360. #else
  51361. "adc r4, r5\n\t"
  51362. #endif
  51363. "stm %[r]!, {r3, r4}\n\t"
  51364. "ldm %[a]!, {r3, r4}\n\t"
  51365. #ifdef WOLFSSL_KEIL
  51366. "adcs r3, r3, r5\n\t"
  51367. #elif defined(__clang__)
  51368. "adcs r3, r5\n\t"
  51369. #else
  51370. "adc r3, r5\n\t"
  51371. #endif
  51372. #ifdef WOLFSSL_KEIL
  51373. "adcs r4, r4, r5\n\t"
  51374. #elif defined(__clang__)
  51375. "adcs r4, r5\n\t"
  51376. #else
  51377. "adc r4, r5\n\t"
  51378. #endif
  51379. "stm %[r]!, {r3, r4}\n\t"
  51380. "ldm %[a]!, {r3, r4}\n\t"
  51381. #ifdef WOLFSSL_KEIL
  51382. "adcs r3, r3, r5\n\t"
  51383. #elif defined(__clang__)
  51384. "adcs r3, r5\n\t"
  51385. #else
  51386. "adc r3, r5\n\t"
  51387. #endif
  51388. #ifdef WOLFSSL_KEIL
  51389. "adcs r4, r4, r5\n\t"
  51390. #elif defined(__clang__)
  51391. "adcs r4, r5\n\t"
  51392. #else
  51393. "adc r4, r5\n\t"
  51394. #endif
  51395. "stm %[r]!, {r3, r4}\n\t"
  51396. "ldm %[a]!, {r3, r4}\n\t"
  51397. #ifdef WOLFSSL_KEIL
  51398. "adcs r3, r3, r5\n\t"
  51399. #elif defined(__clang__)
  51400. "adcs r3, r5\n\t"
  51401. #else
  51402. "adc r3, r5\n\t"
  51403. #endif
  51404. #ifdef WOLFSSL_KEIL
  51405. "adcs r4, r4, r5\n\t"
  51406. #elif defined(__clang__)
  51407. "adcs r4, r5\n\t"
  51408. #else
  51409. "adc r4, r5\n\t"
  51410. #endif
  51411. "stm %[r]!, {r3, r4}\n\t"
  51412. "ldm %[a]!, {r3, r4}\n\t"
  51413. #ifdef WOLFSSL_KEIL
  51414. "adcs r3, r3, r5\n\t"
  51415. #elif defined(__clang__)
  51416. "adcs r3, r5\n\t"
  51417. #else
  51418. "adc r3, r5\n\t"
  51419. #endif
  51420. #ifdef WOLFSSL_KEIL
  51421. "adcs r4, r4, r5\n\t"
  51422. #elif defined(__clang__)
  51423. "adcs r4, r5\n\t"
  51424. #else
  51425. "adc r4, r5\n\t"
  51426. #endif
  51427. "stm %[r]!, {r3, r4}\n\t"
  51428. "ldm %[a]!, {r3, r4}\n\t"
  51429. #ifdef WOLFSSL_KEIL
  51430. "adcs r3, r3, r5\n\t"
  51431. #elif defined(__clang__)
  51432. "adcs r3, r5\n\t"
  51433. #else
  51434. "adc r3, r5\n\t"
  51435. #endif
  51436. #ifdef WOLFSSL_KEIL
  51437. "adcs r4, r4, r5\n\t"
  51438. #elif defined(__clang__)
  51439. "adcs r4, r5\n\t"
  51440. #else
  51441. "adc r4, r5\n\t"
  51442. #endif
  51443. "stm %[r]!, {r3, r4}\n\t"
  51444. "ldm %[a]!, {r3, r4}\n\t"
  51445. #ifdef WOLFSSL_KEIL
  51446. "adcs r3, r3, r5\n\t"
  51447. #elif defined(__clang__)
  51448. "adcs r3, r5\n\t"
  51449. #else
  51450. "adc r3, r5\n\t"
  51451. #endif
  51452. #ifdef WOLFSSL_KEIL
  51453. "adcs r4, r4, r5\n\t"
  51454. #elif defined(__clang__)
  51455. "adcs r4, r5\n\t"
  51456. #else
  51457. "adc r4, r5\n\t"
  51458. #endif
  51459. "stm %[r]!, {r3, r4}\n\t"
  51460. "ldm %[a]!, {r3, r4}\n\t"
  51461. #ifdef WOLFSSL_KEIL
  51462. "adcs r3, r3, r5\n\t"
  51463. #elif defined(__clang__)
  51464. "adcs r3, r5\n\t"
  51465. #else
  51466. "adc r3, r5\n\t"
  51467. #endif
  51468. #ifdef WOLFSSL_KEIL
  51469. "adcs r4, r4, r5\n\t"
  51470. #elif defined(__clang__)
  51471. "adcs r4, r5\n\t"
  51472. #else
  51473. "adc r4, r5\n\t"
  51474. #endif
  51475. "stm %[r]!, {r3, r4}\n\t"
  51476. "ldm %[a]!, {r3, r4}\n\t"
  51477. #ifdef WOLFSSL_KEIL
  51478. "adcs r3, r3, r5\n\t"
  51479. #elif defined(__clang__)
  51480. "adcs r3, r5\n\t"
  51481. #else
  51482. "adc r3, r5\n\t"
  51483. #endif
  51484. #ifdef WOLFSSL_KEIL
  51485. "adcs r4, r4, r5\n\t"
  51486. #elif defined(__clang__)
  51487. "adcs r4, r5\n\t"
  51488. #else
  51489. "adc r4, r5\n\t"
  51490. #endif
  51491. "stm %[r]!, {r3, r4}\n\t"
  51492. "ldm %[a]!, {r3, r4}\n\t"
  51493. #ifdef WOLFSSL_KEIL
  51494. "adcs r3, r3, r5\n\t"
  51495. #elif defined(__clang__)
  51496. "adcs r3, r5\n\t"
  51497. #else
  51498. "adc r3, r5\n\t"
  51499. #endif
  51500. #ifdef WOLFSSL_KEIL
  51501. "adcs r4, r4, r5\n\t"
  51502. #elif defined(__clang__)
  51503. "adcs r4, r5\n\t"
  51504. #else
  51505. "adc r4, r5\n\t"
  51506. #endif
  51507. "stm %[r]!, {r3, r4}\n\t"
  51508. "ldm %[a]!, {r3, r4}\n\t"
  51509. #ifdef WOLFSSL_KEIL
  51510. "adcs r3, r3, r5\n\t"
  51511. #elif defined(__clang__)
  51512. "adcs r3, r5\n\t"
  51513. #else
  51514. "adc r3, r5\n\t"
  51515. #endif
  51516. #ifdef WOLFSSL_KEIL
  51517. "adcs r4, r4, r5\n\t"
  51518. #elif defined(__clang__)
  51519. "adcs r4, r5\n\t"
  51520. #else
  51521. "adc r4, r5\n\t"
  51522. #endif
  51523. "stm %[r]!, {r3, r4}\n\t"
  51524. "movs %[r], #0\n\t"
  51525. #ifdef WOLFSSL_KEIL
  51526. "adcs %[r], %[r], %[r]\n\t"
  51527. #elif defined(__clang__)
  51528. "adcs %[r], %[r]\n\t"
  51529. #else
  51530. "adc %[r], %[r]\n\t"
  51531. #endif
  51532. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  51533. :
  51534. : "memory", "r3", "r4", "r5"
  51535. );
  51536. return (uint32_t)(size_t)r;
  51537. }
  51538. /* Sub b from a into a. (a -= b)
  51539. *
  51540. * a A single precision integer.
  51541. * b A single precision integer.
  51542. */
  51543. SP_NOINLINE static sp_digit sp_3072_sub_in_place_48(sp_digit* a,
  51544. const sp_digit* b)
  51545. {
  51546. __asm__ __volatile__ (
  51547. "ldm %[b]!, {r4, r5}\n\t"
  51548. "ldr r2, [%[a]]\n\t"
  51549. "ldr r3, [%[a], #4]\n\t"
  51550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51551. "subs r2, r2, r4\n\t"
  51552. #else
  51553. "sub r2, r2, r4\n\t"
  51554. #endif
  51555. #ifdef WOLFSSL_KEIL
  51556. "sbcs r3, r3, r5\n\t"
  51557. #elif defined(__clang__)
  51558. "sbcs r3, r5\n\t"
  51559. #else
  51560. "sbc r3, r5\n\t"
  51561. #endif
  51562. "stm %[a]!, {r2, r3}\n\t"
  51563. "ldm %[b]!, {r4, r5}\n\t"
  51564. "ldr r2, [%[a]]\n\t"
  51565. "ldr r3, [%[a], #4]\n\t"
  51566. #ifdef WOLFSSL_KEIL
  51567. "sbcs r2, r2, r4\n\t"
  51568. #elif defined(__clang__)
  51569. "sbcs r2, r4\n\t"
  51570. #else
  51571. "sbc r2, r4\n\t"
  51572. #endif
  51573. #ifdef WOLFSSL_KEIL
  51574. "sbcs r3, r3, r5\n\t"
  51575. #elif defined(__clang__)
  51576. "sbcs r3, r5\n\t"
  51577. #else
  51578. "sbc r3, r5\n\t"
  51579. #endif
  51580. "stm %[a]!, {r2, r3}\n\t"
  51581. "ldm %[b]!, {r4, r5}\n\t"
  51582. "ldr r2, [%[a]]\n\t"
  51583. "ldr r3, [%[a], #4]\n\t"
  51584. #ifdef WOLFSSL_KEIL
  51585. "sbcs r2, r2, r4\n\t"
  51586. #elif defined(__clang__)
  51587. "sbcs r2, r4\n\t"
  51588. #else
  51589. "sbc r2, r4\n\t"
  51590. #endif
  51591. #ifdef WOLFSSL_KEIL
  51592. "sbcs r3, r3, r5\n\t"
  51593. #elif defined(__clang__)
  51594. "sbcs r3, r5\n\t"
  51595. #else
  51596. "sbc r3, r5\n\t"
  51597. #endif
  51598. "stm %[a]!, {r2, r3}\n\t"
  51599. "ldm %[b]!, {r4, r5}\n\t"
  51600. "ldr r2, [%[a]]\n\t"
  51601. "ldr r3, [%[a], #4]\n\t"
  51602. #ifdef WOLFSSL_KEIL
  51603. "sbcs r2, r2, r4\n\t"
  51604. #elif defined(__clang__)
  51605. "sbcs r2, r4\n\t"
  51606. #else
  51607. "sbc r2, r4\n\t"
  51608. #endif
  51609. #ifdef WOLFSSL_KEIL
  51610. "sbcs r3, r3, r5\n\t"
  51611. #elif defined(__clang__)
  51612. "sbcs r3, r5\n\t"
  51613. #else
  51614. "sbc r3, r5\n\t"
  51615. #endif
  51616. "stm %[a]!, {r2, r3}\n\t"
  51617. "ldm %[b]!, {r4, r5}\n\t"
  51618. "ldr r2, [%[a]]\n\t"
  51619. "ldr r3, [%[a], #4]\n\t"
  51620. #ifdef WOLFSSL_KEIL
  51621. "sbcs r2, r2, r4\n\t"
  51622. #elif defined(__clang__)
  51623. "sbcs r2, r4\n\t"
  51624. #else
  51625. "sbc r2, r4\n\t"
  51626. #endif
  51627. #ifdef WOLFSSL_KEIL
  51628. "sbcs r3, r3, r5\n\t"
  51629. #elif defined(__clang__)
  51630. "sbcs r3, r5\n\t"
  51631. #else
  51632. "sbc r3, r5\n\t"
  51633. #endif
  51634. "stm %[a]!, {r2, r3}\n\t"
  51635. "ldm %[b]!, {r4, r5}\n\t"
  51636. "ldr r2, [%[a]]\n\t"
  51637. "ldr r3, [%[a], #4]\n\t"
  51638. #ifdef WOLFSSL_KEIL
  51639. "sbcs r2, r2, r4\n\t"
  51640. #elif defined(__clang__)
  51641. "sbcs r2, r4\n\t"
  51642. #else
  51643. "sbc r2, r4\n\t"
  51644. #endif
  51645. #ifdef WOLFSSL_KEIL
  51646. "sbcs r3, r3, r5\n\t"
  51647. #elif defined(__clang__)
  51648. "sbcs r3, r5\n\t"
  51649. #else
  51650. "sbc r3, r5\n\t"
  51651. #endif
  51652. "stm %[a]!, {r2, r3}\n\t"
  51653. "ldm %[b]!, {r4, r5}\n\t"
  51654. "ldr r2, [%[a]]\n\t"
  51655. "ldr r3, [%[a], #4]\n\t"
  51656. #ifdef WOLFSSL_KEIL
  51657. "sbcs r2, r2, r4\n\t"
  51658. #elif defined(__clang__)
  51659. "sbcs r2, r4\n\t"
  51660. #else
  51661. "sbc r2, r4\n\t"
  51662. #endif
  51663. #ifdef WOLFSSL_KEIL
  51664. "sbcs r3, r3, r5\n\t"
  51665. #elif defined(__clang__)
  51666. "sbcs r3, r5\n\t"
  51667. #else
  51668. "sbc r3, r5\n\t"
  51669. #endif
  51670. "stm %[a]!, {r2, r3}\n\t"
  51671. "ldm %[b]!, {r4, r5}\n\t"
  51672. "ldr r2, [%[a]]\n\t"
  51673. "ldr r3, [%[a], #4]\n\t"
  51674. #ifdef WOLFSSL_KEIL
  51675. "sbcs r2, r2, r4\n\t"
  51676. #elif defined(__clang__)
  51677. "sbcs r2, r4\n\t"
  51678. #else
  51679. "sbc r2, r4\n\t"
  51680. #endif
  51681. #ifdef WOLFSSL_KEIL
  51682. "sbcs r3, r3, r5\n\t"
  51683. #elif defined(__clang__)
  51684. "sbcs r3, r5\n\t"
  51685. #else
  51686. "sbc r3, r5\n\t"
  51687. #endif
  51688. "stm %[a]!, {r2, r3}\n\t"
  51689. "ldm %[b]!, {r4, r5}\n\t"
  51690. "ldr r2, [%[a]]\n\t"
  51691. "ldr r3, [%[a], #4]\n\t"
  51692. #ifdef WOLFSSL_KEIL
  51693. "sbcs r2, r2, r4\n\t"
  51694. #elif defined(__clang__)
  51695. "sbcs r2, r4\n\t"
  51696. #else
  51697. "sbc r2, r4\n\t"
  51698. #endif
  51699. #ifdef WOLFSSL_KEIL
  51700. "sbcs r3, r3, r5\n\t"
  51701. #elif defined(__clang__)
  51702. "sbcs r3, r5\n\t"
  51703. #else
  51704. "sbc r3, r5\n\t"
  51705. #endif
  51706. "stm %[a]!, {r2, r3}\n\t"
  51707. "ldm %[b]!, {r4, r5}\n\t"
  51708. "ldr r2, [%[a]]\n\t"
  51709. "ldr r3, [%[a], #4]\n\t"
  51710. #ifdef WOLFSSL_KEIL
  51711. "sbcs r2, r2, r4\n\t"
  51712. #elif defined(__clang__)
  51713. "sbcs r2, r4\n\t"
  51714. #else
  51715. "sbc r2, r4\n\t"
  51716. #endif
  51717. #ifdef WOLFSSL_KEIL
  51718. "sbcs r3, r3, r5\n\t"
  51719. #elif defined(__clang__)
  51720. "sbcs r3, r5\n\t"
  51721. #else
  51722. "sbc r3, r5\n\t"
  51723. #endif
  51724. "stm %[a]!, {r2, r3}\n\t"
  51725. "ldm %[b]!, {r4, r5}\n\t"
  51726. "ldr r2, [%[a]]\n\t"
  51727. "ldr r3, [%[a], #4]\n\t"
  51728. #ifdef WOLFSSL_KEIL
  51729. "sbcs r2, r2, r4\n\t"
  51730. #elif defined(__clang__)
  51731. "sbcs r2, r4\n\t"
  51732. #else
  51733. "sbc r2, r4\n\t"
  51734. #endif
  51735. #ifdef WOLFSSL_KEIL
  51736. "sbcs r3, r3, r5\n\t"
  51737. #elif defined(__clang__)
  51738. "sbcs r3, r5\n\t"
  51739. #else
  51740. "sbc r3, r5\n\t"
  51741. #endif
  51742. "stm %[a]!, {r2, r3}\n\t"
  51743. "ldm %[b]!, {r4, r5}\n\t"
  51744. "ldr r2, [%[a]]\n\t"
  51745. "ldr r3, [%[a], #4]\n\t"
  51746. #ifdef WOLFSSL_KEIL
  51747. "sbcs r2, r2, r4\n\t"
  51748. #elif defined(__clang__)
  51749. "sbcs r2, r4\n\t"
  51750. #else
  51751. "sbc r2, r4\n\t"
  51752. #endif
  51753. #ifdef WOLFSSL_KEIL
  51754. "sbcs r3, r3, r5\n\t"
  51755. #elif defined(__clang__)
  51756. "sbcs r3, r5\n\t"
  51757. #else
  51758. "sbc r3, r5\n\t"
  51759. #endif
  51760. "stm %[a]!, {r2, r3}\n\t"
  51761. "ldm %[b]!, {r4, r5}\n\t"
  51762. "ldr r2, [%[a]]\n\t"
  51763. "ldr r3, [%[a], #4]\n\t"
  51764. #ifdef WOLFSSL_KEIL
  51765. "sbcs r2, r2, r4\n\t"
  51766. #elif defined(__clang__)
  51767. "sbcs r2, r4\n\t"
  51768. #else
  51769. "sbc r2, r4\n\t"
  51770. #endif
  51771. #ifdef WOLFSSL_KEIL
  51772. "sbcs r3, r3, r5\n\t"
  51773. #elif defined(__clang__)
  51774. "sbcs r3, r5\n\t"
  51775. #else
  51776. "sbc r3, r5\n\t"
  51777. #endif
  51778. "stm %[a]!, {r2, r3}\n\t"
  51779. "ldm %[b]!, {r4, r5}\n\t"
  51780. "ldr r2, [%[a]]\n\t"
  51781. "ldr r3, [%[a], #4]\n\t"
  51782. #ifdef WOLFSSL_KEIL
  51783. "sbcs r2, r2, r4\n\t"
  51784. #elif defined(__clang__)
  51785. "sbcs r2, r4\n\t"
  51786. #else
  51787. "sbc r2, r4\n\t"
  51788. #endif
  51789. #ifdef WOLFSSL_KEIL
  51790. "sbcs r3, r3, r5\n\t"
  51791. #elif defined(__clang__)
  51792. "sbcs r3, r5\n\t"
  51793. #else
  51794. "sbc r3, r5\n\t"
  51795. #endif
  51796. "stm %[a]!, {r2, r3}\n\t"
  51797. "ldm %[b]!, {r4, r5}\n\t"
  51798. "ldr r2, [%[a]]\n\t"
  51799. "ldr r3, [%[a], #4]\n\t"
  51800. #ifdef WOLFSSL_KEIL
  51801. "sbcs r2, r2, r4\n\t"
  51802. #elif defined(__clang__)
  51803. "sbcs r2, r4\n\t"
  51804. #else
  51805. "sbc r2, r4\n\t"
  51806. #endif
  51807. #ifdef WOLFSSL_KEIL
  51808. "sbcs r3, r3, r5\n\t"
  51809. #elif defined(__clang__)
  51810. "sbcs r3, r5\n\t"
  51811. #else
  51812. "sbc r3, r5\n\t"
  51813. #endif
  51814. "stm %[a]!, {r2, r3}\n\t"
  51815. "ldm %[b]!, {r4, r5}\n\t"
  51816. "ldr r2, [%[a]]\n\t"
  51817. "ldr r3, [%[a], #4]\n\t"
  51818. #ifdef WOLFSSL_KEIL
  51819. "sbcs r2, r2, r4\n\t"
  51820. #elif defined(__clang__)
  51821. "sbcs r2, r4\n\t"
  51822. #else
  51823. "sbc r2, r4\n\t"
  51824. #endif
  51825. #ifdef WOLFSSL_KEIL
  51826. "sbcs r3, r3, r5\n\t"
  51827. #elif defined(__clang__)
  51828. "sbcs r3, r5\n\t"
  51829. #else
  51830. "sbc r3, r5\n\t"
  51831. #endif
  51832. "stm %[a]!, {r2, r3}\n\t"
  51833. "ldm %[b]!, {r4, r5}\n\t"
  51834. "ldr r2, [%[a]]\n\t"
  51835. "ldr r3, [%[a], #4]\n\t"
  51836. #ifdef WOLFSSL_KEIL
  51837. "sbcs r2, r2, r4\n\t"
  51838. #elif defined(__clang__)
  51839. "sbcs r2, r4\n\t"
  51840. #else
  51841. "sbc r2, r4\n\t"
  51842. #endif
  51843. #ifdef WOLFSSL_KEIL
  51844. "sbcs r3, r3, r5\n\t"
  51845. #elif defined(__clang__)
  51846. "sbcs r3, r5\n\t"
  51847. #else
  51848. "sbc r3, r5\n\t"
  51849. #endif
  51850. "stm %[a]!, {r2, r3}\n\t"
  51851. "ldm %[b]!, {r4, r5}\n\t"
  51852. "ldr r2, [%[a]]\n\t"
  51853. "ldr r3, [%[a], #4]\n\t"
  51854. #ifdef WOLFSSL_KEIL
  51855. "sbcs r2, r2, r4\n\t"
  51856. #elif defined(__clang__)
  51857. "sbcs r2, r4\n\t"
  51858. #else
  51859. "sbc r2, r4\n\t"
  51860. #endif
  51861. #ifdef WOLFSSL_KEIL
  51862. "sbcs r3, r3, r5\n\t"
  51863. #elif defined(__clang__)
  51864. "sbcs r3, r5\n\t"
  51865. #else
  51866. "sbc r3, r5\n\t"
  51867. #endif
  51868. "stm %[a]!, {r2, r3}\n\t"
  51869. "ldm %[b]!, {r4, r5}\n\t"
  51870. "ldr r2, [%[a]]\n\t"
  51871. "ldr r3, [%[a], #4]\n\t"
  51872. #ifdef WOLFSSL_KEIL
  51873. "sbcs r2, r2, r4\n\t"
  51874. #elif defined(__clang__)
  51875. "sbcs r2, r4\n\t"
  51876. #else
  51877. "sbc r2, r4\n\t"
  51878. #endif
  51879. #ifdef WOLFSSL_KEIL
  51880. "sbcs r3, r3, r5\n\t"
  51881. #elif defined(__clang__)
  51882. "sbcs r3, r5\n\t"
  51883. #else
  51884. "sbc r3, r5\n\t"
  51885. #endif
  51886. "stm %[a]!, {r2, r3}\n\t"
  51887. "ldm %[b]!, {r4, r5}\n\t"
  51888. "ldr r2, [%[a]]\n\t"
  51889. "ldr r3, [%[a], #4]\n\t"
  51890. #ifdef WOLFSSL_KEIL
  51891. "sbcs r2, r2, r4\n\t"
  51892. #elif defined(__clang__)
  51893. "sbcs r2, r4\n\t"
  51894. #else
  51895. "sbc r2, r4\n\t"
  51896. #endif
  51897. #ifdef WOLFSSL_KEIL
  51898. "sbcs r3, r3, r5\n\t"
  51899. #elif defined(__clang__)
  51900. "sbcs r3, r5\n\t"
  51901. #else
  51902. "sbc r3, r5\n\t"
  51903. #endif
  51904. "stm %[a]!, {r2, r3}\n\t"
  51905. "ldm %[b]!, {r4, r5}\n\t"
  51906. "ldr r2, [%[a]]\n\t"
  51907. "ldr r3, [%[a], #4]\n\t"
  51908. #ifdef WOLFSSL_KEIL
  51909. "sbcs r2, r2, r4\n\t"
  51910. #elif defined(__clang__)
  51911. "sbcs r2, r4\n\t"
  51912. #else
  51913. "sbc r2, r4\n\t"
  51914. #endif
  51915. #ifdef WOLFSSL_KEIL
  51916. "sbcs r3, r3, r5\n\t"
  51917. #elif defined(__clang__)
  51918. "sbcs r3, r5\n\t"
  51919. #else
  51920. "sbc r3, r5\n\t"
  51921. #endif
  51922. "stm %[a]!, {r2, r3}\n\t"
  51923. "ldm %[b]!, {r4, r5}\n\t"
  51924. "ldr r2, [%[a]]\n\t"
  51925. "ldr r3, [%[a], #4]\n\t"
  51926. #ifdef WOLFSSL_KEIL
  51927. "sbcs r2, r2, r4\n\t"
  51928. #elif defined(__clang__)
  51929. "sbcs r2, r4\n\t"
  51930. #else
  51931. "sbc r2, r4\n\t"
  51932. #endif
  51933. #ifdef WOLFSSL_KEIL
  51934. "sbcs r3, r3, r5\n\t"
  51935. #elif defined(__clang__)
  51936. "sbcs r3, r5\n\t"
  51937. #else
  51938. "sbc r3, r5\n\t"
  51939. #endif
  51940. "stm %[a]!, {r2, r3}\n\t"
  51941. "ldm %[b]!, {r4, r5}\n\t"
  51942. "ldr r2, [%[a]]\n\t"
  51943. "ldr r3, [%[a], #4]\n\t"
  51944. #ifdef WOLFSSL_KEIL
  51945. "sbcs r2, r2, r4\n\t"
  51946. #elif defined(__clang__)
  51947. "sbcs r2, r4\n\t"
  51948. #else
  51949. "sbc r2, r4\n\t"
  51950. #endif
  51951. #ifdef WOLFSSL_KEIL
  51952. "sbcs r3, r3, r5\n\t"
  51953. #elif defined(__clang__)
  51954. "sbcs r3, r5\n\t"
  51955. #else
  51956. "sbc r3, r5\n\t"
  51957. #endif
  51958. "stm %[a]!, {r2, r3}\n\t"
  51959. "ldm %[b]!, {r4, r5}\n\t"
  51960. "ldr r2, [%[a]]\n\t"
  51961. "ldr r3, [%[a], #4]\n\t"
  51962. #ifdef WOLFSSL_KEIL
  51963. "sbcs r2, r2, r4\n\t"
  51964. #elif defined(__clang__)
  51965. "sbcs r2, r4\n\t"
  51966. #else
  51967. "sbc r2, r4\n\t"
  51968. #endif
  51969. #ifdef WOLFSSL_KEIL
  51970. "sbcs r3, r3, r5\n\t"
  51971. #elif defined(__clang__)
  51972. "sbcs r3, r5\n\t"
  51973. #else
  51974. "sbc r3, r5\n\t"
  51975. #endif
  51976. "stm %[a]!, {r2, r3}\n\t"
  51977. #ifdef WOLFSSL_KEIL
  51978. "sbcs %[a], %[a], %[a]\n\t"
  51979. #elif defined(__clang__)
  51980. "sbcs %[a], %[a]\n\t"
  51981. #else
  51982. "sbc %[a], %[a]\n\t"
  51983. #endif
  51984. : [a] "+l" (a), [b] "+l" (b)
  51985. :
  51986. : "memory", "r2", "r3", "r4", "r5"
  51987. );
  51988. return (uint32_t)(size_t)a;
  51989. }
  51990. /* Add b to a into r. (r = a + b)
  51991. *
  51992. * r A single precision integer.
  51993. * a A single precision integer.
  51994. * b A single precision integer.
  51995. */
  51996. SP_NOINLINE static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a,
  51997. const sp_digit* b)
  51998. {
  51999. __asm__ __volatile__ (
  52000. "ldm %[b]!, {r5, r6}\n\t"
  52001. "ldm %[a]!, {r3, r4}\n\t"
  52002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52003. "adds r3, r3, r5\n\t"
  52004. #else
  52005. "add r3, r3, r5\n\t"
  52006. #endif
  52007. #ifdef WOLFSSL_KEIL
  52008. "adcs r4, r4, r6\n\t"
  52009. #elif defined(__clang__)
  52010. "adcs r4, r6\n\t"
  52011. #else
  52012. "adc r4, r6\n\t"
  52013. #endif
  52014. "stm %[r]!, {r3, r4}\n\t"
  52015. "ldm %[b]!, {r5, r6}\n\t"
  52016. "ldm %[a]!, {r3, r4}\n\t"
  52017. #ifdef WOLFSSL_KEIL
  52018. "adcs r3, r3, r5\n\t"
  52019. #elif defined(__clang__)
  52020. "adcs r3, r5\n\t"
  52021. #else
  52022. "adc r3, r5\n\t"
  52023. #endif
  52024. #ifdef WOLFSSL_KEIL
  52025. "adcs r4, r4, r6\n\t"
  52026. #elif defined(__clang__)
  52027. "adcs r4, r6\n\t"
  52028. #else
  52029. "adc r4, r6\n\t"
  52030. #endif
  52031. "stm %[r]!, {r3, r4}\n\t"
  52032. "ldm %[b]!, {r5, r6}\n\t"
  52033. "ldm %[a]!, {r3, r4}\n\t"
  52034. #ifdef WOLFSSL_KEIL
  52035. "adcs r3, r3, r5\n\t"
  52036. #elif defined(__clang__)
  52037. "adcs r3, r5\n\t"
  52038. #else
  52039. "adc r3, r5\n\t"
  52040. #endif
  52041. #ifdef WOLFSSL_KEIL
  52042. "adcs r4, r4, r6\n\t"
  52043. #elif defined(__clang__)
  52044. "adcs r4, r6\n\t"
  52045. #else
  52046. "adc r4, r6\n\t"
  52047. #endif
  52048. "stm %[r]!, {r3, r4}\n\t"
  52049. "ldm %[b]!, {r5, r6}\n\t"
  52050. "ldm %[a]!, {r3, r4}\n\t"
  52051. #ifdef WOLFSSL_KEIL
  52052. "adcs r3, r3, r5\n\t"
  52053. #elif defined(__clang__)
  52054. "adcs r3, r5\n\t"
  52055. #else
  52056. "adc r3, r5\n\t"
  52057. #endif
  52058. #ifdef WOLFSSL_KEIL
  52059. "adcs r4, r4, r6\n\t"
  52060. #elif defined(__clang__)
  52061. "adcs r4, r6\n\t"
  52062. #else
  52063. "adc r4, r6\n\t"
  52064. #endif
  52065. "stm %[r]!, {r3, r4}\n\t"
  52066. "ldm %[b]!, {r5, r6}\n\t"
  52067. "ldm %[a]!, {r3, r4}\n\t"
  52068. #ifdef WOLFSSL_KEIL
  52069. "adcs r3, r3, r5\n\t"
  52070. #elif defined(__clang__)
  52071. "adcs r3, r5\n\t"
  52072. #else
  52073. "adc r3, r5\n\t"
  52074. #endif
  52075. #ifdef WOLFSSL_KEIL
  52076. "adcs r4, r4, r6\n\t"
  52077. #elif defined(__clang__)
  52078. "adcs r4, r6\n\t"
  52079. #else
  52080. "adc r4, r6\n\t"
  52081. #endif
  52082. "stm %[r]!, {r3, r4}\n\t"
  52083. "ldm %[b]!, {r5, r6}\n\t"
  52084. "ldm %[a]!, {r3, r4}\n\t"
  52085. #ifdef WOLFSSL_KEIL
  52086. "adcs r3, r3, r5\n\t"
  52087. #elif defined(__clang__)
  52088. "adcs r3, r5\n\t"
  52089. #else
  52090. "adc r3, r5\n\t"
  52091. #endif
  52092. #ifdef WOLFSSL_KEIL
  52093. "adcs r4, r4, r6\n\t"
  52094. #elif defined(__clang__)
  52095. "adcs r4, r6\n\t"
  52096. #else
  52097. "adc r4, r6\n\t"
  52098. #endif
  52099. "stm %[r]!, {r3, r4}\n\t"
  52100. "ldm %[b]!, {r5, r6}\n\t"
  52101. "ldm %[a]!, {r3, r4}\n\t"
  52102. #ifdef WOLFSSL_KEIL
  52103. "adcs r3, r3, r5\n\t"
  52104. #elif defined(__clang__)
  52105. "adcs r3, r5\n\t"
  52106. #else
  52107. "adc r3, r5\n\t"
  52108. #endif
  52109. #ifdef WOLFSSL_KEIL
  52110. "adcs r4, r4, r6\n\t"
  52111. #elif defined(__clang__)
  52112. "adcs r4, r6\n\t"
  52113. #else
  52114. "adc r4, r6\n\t"
  52115. #endif
  52116. "stm %[r]!, {r3, r4}\n\t"
  52117. "ldm %[b]!, {r5, r6}\n\t"
  52118. "ldm %[a]!, {r3, r4}\n\t"
  52119. #ifdef WOLFSSL_KEIL
  52120. "adcs r3, r3, r5\n\t"
  52121. #elif defined(__clang__)
  52122. "adcs r3, r5\n\t"
  52123. #else
  52124. "adc r3, r5\n\t"
  52125. #endif
  52126. #ifdef WOLFSSL_KEIL
  52127. "adcs r4, r4, r6\n\t"
  52128. #elif defined(__clang__)
  52129. "adcs r4, r6\n\t"
  52130. #else
  52131. "adc r4, r6\n\t"
  52132. #endif
  52133. "stm %[r]!, {r3, r4}\n\t"
  52134. "ldm %[b]!, {r5, r6}\n\t"
  52135. "ldm %[a]!, {r3, r4}\n\t"
  52136. #ifdef WOLFSSL_KEIL
  52137. "adcs r3, r3, r5\n\t"
  52138. #elif defined(__clang__)
  52139. "adcs r3, r5\n\t"
  52140. #else
  52141. "adc r3, r5\n\t"
  52142. #endif
  52143. #ifdef WOLFSSL_KEIL
  52144. "adcs r4, r4, r6\n\t"
  52145. #elif defined(__clang__)
  52146. "adcs r4, r6\n\t"
  52147. #else
  52148. "adc r4, r6\n\t"
  52149. #endif
  52150. "stm %[r]!, {r3, r4}\n\t"
  52151. "ldm %[b]!, {r5, r6}\n\t"
  52152. "ldm %[a]!, {r3, r4}\n\t"
  52153. #ifdef WOLFSSL_KEIL
  52154. "adcs r3, r3, r5\n\t"
  52155. #elif defined(__clang__)
  52156. "adcs r3, r5\n\t"
  52157. #else
  52158. "adc r3, r5\n\t"
  52159. #endif
  52160. #ifdef WOLFSSL_KEIL
  52161. "adcs r4, r4, r6\n\t"
  52162. #elif defined(__clang__)
  52163. "adcs r4, r6\n\t"
  52164. #else
  52165. "adc r4, r6\n\t"
  52166. #endif
  52167. "stm %[r]!, {r3, r4}\n\t"
  52168. "ldm %[b]!, {r5, r6}\n\t"
  52169. "ldm %[a]!, {r3, r4}\n\t"
  52170. #ifdef WOLFSSL_KEIL
  52171. "adcs r3, r3, r5\n\t"
  52172. #elif defined(__clang__)
  52173. "adcs r3, r5\n\t"
  52174. #else
  52175. "adc r3, r5\n\t"
  52176. #endif
  52177. #ifdef WOLFSSL_KEIL
  52178. "adcs r4, r4, r6\n\t"
  52179. #elif defined(__clang__)
  52180. "adcs r4, r6\n\t"
  52181. #else
  52182. "adc r4, r6\n\t"
  52183. #endif
  52184. "stm %[r]!, {r3, r4}\n\t"
  52185. "ldm %[b]!, {r5, r6}\n\t"
  52186. "ldm %[a]!, {r3, r4}\n\t"
  52187. #ifdef WOLFSSL_KEIL
  52188. "adcs r3, r3, r5\n\t"
  52189. #elif defined(__clang__)
  52190. "adcs r3, r5\n\t"
  52191. #else
  52192. "adc r3, r5\n\t"
  52193. #endif
  52194. #ifdef WOLFSSL_KEIL
  52195. "adcs r4, r4, r6\n\t"
  52196. #elif defined(__clang__)
  52197. "adcs r4, r6\n\t"
  52198. #else
  52199. "adc r4, r6\n\t"
  52200. #endif
  52201. "stm %[r]!, {r3, r4}\n\t"
  52202. "ldm %[b]!, {r5, r6}\n\t"
  52203. "ldm %[a]!, {r3, r4}\n\t"
  52204. #ifdef WOLFSSL_KEIL
  52205. "adcs r3, r3, r5\n\t"
  52206. #elif defined(__clang__)
  52207. "adcs r3, r5\n\t"
  52208. #else
  52209. "adc r3, r5\n\t"
  52210. #endif
  52211. #ifdef WOLFSSL_KEIL
  52212. "adcs r4, r4, r6\n\t"
  52213. #elif defined(__clang__)
  52214. "adcs r4, r6\n\t"
  52215. #else
  52216. "adc r4, r6\n\t"
  52217. #endif
  52218. "stm %[r]!, {r3, r4}\n\t"
  52219. "ldm %[b]!, {r5, r6}\n\t"
  52220. "ldm %[a]!, {r3, r4}\n\t"
  52221. #ifdef WOLFSSL_KEIL
  52222. "adcs r3, r3, r5\n\t"
  52223. #elif defined(__clang__)
  52224. "adcs r3, r5\n\t"
  52225. #else
  52226. "adc r3, r5\n\t"
  52227. #endif
  52228. #ifdef WOLFSSL_KEIL
  52229. "adcs r4, r4, r6\n\t"
  52230. #elif defined(__clang__)
  52231. "adcs r4, r6\n\t"
  52232. #else
  52233. "adc r4, r6\n\t"
  52234. #endif
  52235. "stm %[r]!, {r3, r4}\n\t"
  52236. "ldm %[b]!, {r5, r6}\n\t"
  52237. "ldm %[a]!, {r3, r4}\n\t"
  52238. #ifdef WOLFSSL_KEIL
  52239. "adcs r3, r3, r5\n\t"
  52240. #elif defined(__clang__)
  52241. "adcs r3, r5\n\t"
  52242. #else
  52243. "adc r3, r5\n\t"
  52244. #endif
  52245. #ifdef WOLFSSL_KEIL
  52246. "adcs r4, r4, r6\n\t"
  52247. #elif defined(__clang__)
  52248. "adcs r4, r6\n\t"
  52249. #else
  52250. "adc r4, r6\n\t"
  52251. #endif
  52252. "stm %[r]!, {r3, r4}\n\t"
  52253. "ldm %[b]!, {r5, r6}\n\t"
  52254. "ldm %[a]!, {r3, r4}\n\t"
  52255. #ifdef WOLFSSL_KEIL
  52256. "adcs r3, r3, r5\n\t"
  52257. #elif defined(__clang__)
  52258. "adcs r3, r5\n\t"
  52259. #else
  52260. "adc r3, r5\n\t"
  52261. #endif
  52262. #ifdef WOLFSSL_KEIL
  52263. "adcs r4, r4, r6\n\t"
  52264. #elif defined(__clang__)
  52265. "adcs r4, r6\n\t"
  52266. #else
  52267. "adc r4, r6\n\t"
  52268. #endif
  52269. "stm %[r]!, {r3, r4}\n\t"
  52270. "ldm %[b]!, {r5, r6}\n\t"
  52271. "ldm %[a]!, {r3, r4}\n\t"
  52272. #ifdef WOLFSSL_KEIL
  52273. "adcs r3, r3, r5\n\t"
  52274. #elif defined(__clang__)
  52275. "adcs r3, r5\n\t"
  52276. #else
  52277. "adc r3, r5\n\t"
  52278. #endif
  52279. #ifdef WOLFSSL_KEIL
  52280. "adcs r4, r4, r6\n\t"
  52281. #elif defined(__clang__)
  52282. "adcs r4, r6\n\t"
  52283. #else
  52284. "adc r4, r6\n\t"
  52285. #endif
  52286. "stm %[r]!, {r3, r4}\n\t"
  52287. "ldm %[b]!, {r5, r6}\n\t"
  52288. "ldm %[a]!, {r3, r4}\n\t"
  52289. #ifdef WOLFSSL_KEIL
  52290. "adcs r3, r3, r5\n\t"
  52291. #elif defined(__clang__)
  52292. "adcs r3, r5\n\t"
  52293. #else
  52294. "adc r3, r5\n\t"
  52295. #endif
  52296. #ifdef WOLFSSL_KEIL
  52297. "adcs r4, r4, r6\n\t"
  52298. #elif defined(__clang__)
  52299. "adcs r4, r6\n\t"
  52300. #else
  52301. "adc r4, r6\n\t"
  52302. #endif
  52303. "stm %[r]!, {r3, r4}\n\t"
  52304. "ldm %[b]!, {r5, r6}\n\t"
  52305. "ldm %[a]!, {r3, r4}\n\t"
  52306. #ifdef WOLFSSL_KEIL
  52307. "adcs r3, r3, r5\n\t"
  52308. #elif defined(__clang__)
  52309. "adcs r3, r5\n\t"
  52310. #else
  52311. "adc r3, r5\n\t"
  52312. #endif
  52313. #ifdef WOLFSSL_KEIL
  52314. "adcs r4, r4, r6\n\t"
  52315. #elif defined(__clang__)
  52316. "adcs r4, r6\n\t"
  52317. #else
  52318. "adc r4, r6\n\t"
  52319. #endif
  52320. "stm %[r]!, {r3, r4}\n\t"
  52321. "ldm %[b]!, {r5, r6}\n\t"
  52322. "ldm %[a]!, {r3, r4}\n\t"
  52323. #ifdef WOLFSSL_KEIL
  52324. "adcs r3, r3, r5\n\t"
  52325. #elif defined(__clang__)
  52326. "adcs r3, r5\n\t"
  52327. #else
  52328. "adc r3, r5\n\t"
  52329. #endif
  52330. #ifdef WOLFSSL_KEIL
  52331. "adcs r4, r4, r6\n\t"
  52332. #elif defined(__clang__)
  52333. "adcs r4, r6\n\t"
  52334. #else
  52335. "adc r4, r6\n\t"
  52336. #endif
  52337. "stm %[r]!, {r3, r4}\n\t"
  52338. "ldm %[b]!, {r5, r6}\n\t"
  52339. "ldm %[a]!, {r3, r4}\n\t"
  52340. #ifdef WOLFSSL_KEIL
  52341. "adcs r3, r3, r5\n\t"
  52342. #elif defined(__clang__)
  52343. "adcs r3, r5\n\t"
  52344. #else
  52345. "adc r3, r5\n\t"
  52346. #endif
  52347. #ifdef WOLFSSL_KEIL
  52348. "adcs r4, r4, r6\n\t"
  52349. #elif defined(__clang__)
  52350. "adcs r4, r6\n\t"
  52351. #else
  52352. "adc r4, r6\n\t"
  52353. #endif
  52354. "stm %[r]!, {r3, r4}\n\t"
  52355. "ldm %[b]!, {r5, r6}\n\t"
  52356. "ldm %[a]!, {r3, r4}\n\t"
  52357. #ifdef WOLFSSL_KEIL
  52358. "adcs r3, r3, r5\n\t"
  52359. #elif defined(__clang__)
  52360. "adcs r3, r5\n\t"
  52361. #else
  52362. "adc r3, r5\n\t"
  52363. #endif
  52364. #ifdef WOLFSSL_KEIL
  52365. "adcs r4, r4, r6\n\t"
  52366. #elif defined(__clang__)
  52367. "adcs r4, r6\n\t"
  52368. #else
  52369. "adc r4, r6\n\t"
  52370. #endif
  52371. "stm %[r]!, {r3, r4}\n\t"
  52372. "ldm %[b]!, {r5, r6}\n\t"
  52373. "ldm %[a]!, {r3, r4}\n\t"
  52374. #ifdef WOLFSSL_KEIL
  52375. "adcs r3, r3, r5\n\t"
  52376. #elif defined(__clang__)
  52377. "adcs r3, r5\n\t"
  52378. #else
  52379. "adc r3, r5\n\t"
  52380. #endif
  52381. #ifdef WOLFSSL_KEIL
  52382. "adcs r4, r4, r6\n\t"
  52383. #elif defined(__clang__)
  52384. "adcs r4, r6\n\t"
  52385. #else
  52386. "adc r4, r6\n\t"
  52387. #endif
  52388. "stm %[r]!, {r3, r4}\n\t"
  52389. "ldm %[b]!, {r5, r6}\n\t"
  52390. "ldm %[a]!, {r3, r4}\n\t"
  52391. #ifdef WOLFSSL_KEIL
  52392. "adcs r3, r3, r5\n\t"
  52393. #elif defined(__clang__)
  52394. "adcs r3, r5\n\t"
  52395. #else
  52396. "adc r3, r5\n\t"
  52397. #endif
  52398. #ifdef WOLFSSL_KEIL
  52399. "adcs r4, r4, r6\n\t"
  52400. #elif defined(__clang__)
  52401. "adcs r4, r6\n\t"
  52402. #else
  52403. "adc r4, r6\n\t"
  52404. #endif
  52405. "stm %[r]!, {r3, r4}\n\t"
  52406. "movs %[r], #0\n\t"
  52407. #ifdef WOLFSSL_KEIL
  52408. "adcs %[r], %[r], %[r]\n\t"
  52409. #elif defined(__clang__)
  52410. "adcs %[r], %[r]\n\t"
  52411. #else
  52412. "adc %[r], %[r]\n\t"
  52413. #endif
  52414. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  52415. :
  52416. : "memory", "r3", "r4", "r5", "r6"
  52417. );
  52418. return (uint32_t)(size_t)r;
  52419. }
  52420. /* AND m into each word of a and store in r.
  52421. *
  52422. * r A single precision integer.
  52423. * a A single precision integer.
  52424. * m Mask to AND against each digit.
  52425. */
  52426. static void sp_3072_mask_24(sp_digit* r, const sp_digit* a, sp_digit m)
  52427. {
  52428. #ifdef WOLFSSL_SP_SMALL
  52429. int i;
  52430. for (i=0; i<24; i++) {
  52431. r[i] = a[i] & m;
  52432. }
  52433. #else
  52434. int i;
  52435. for (i = 0; i < 24; i += 8) {
  52436. r[i+0] = a[i+0] & m;
  52437. r[i+1] = a[i+1] & m;
  52438. r[i+2] = a[i+2] & m;
  52439. r[i+3] = a[i+3] & m;
  52440. r[i+4] = a[i+4] & m;
  52441. r[i+5] = a[i+5] & m;
  52442. r[i+6] = a[i+6] & m;
  52443. r[i+7] = a[i+7] & m;
  52444. }
  52445. #endif
  52446. }
  52447. /* Multiply a and b into r. (r = a * b)
  52448. *
  52449. * r A single precision integer.
  52450. * a A single precision integer.
  52451. * b A single precision integer.
  52452. */
  52453. SP_NOINLINE static void sp_3072_mul_48(sp_digit* r, const sp_digit* a,
  52454. const sp_digit* b)
  52455. {
  52456. sp_digit* z0 = r;
  52457. sp_digit z1[48];
  52458. sp_digit a1[24];
  52459. sp_digit b1[24];
  52460. sp_digit* z2 = r + 48;
  52461. sp_digit u;
  52462. sp_digit ca;
  52463. sp_digit cb;
  52464. ca = sp_3072_add_24(a1, a, &a[24]);
  52465. cb = sp_3072_add_24(b1, b, &b[24]);
  52466. u = ca & cb;
  52467. sp_3072_mul_24(z2, &a[24], &b[24]);
  52468. sp_3072_mul_24(z0, a, b);
  52469. sp_3072_mul_24(z1, a1, b1);
  52470. u += sp_3072_sub_in_place_48(z1, z0);
  52471. u += sp_3072_sub_in_place_48(z1, z2);
  52472. sp_3072_mask_24(a1, a1, 0 - cb);
  52473. u += sp_3072_add_24(z1 + 24, z1 + 24, a1);
  52474. sp_3072_mask_24(b1, b1, 0 - ca);
  52475. u += sp_3072_add_24(z1 + 24, z1 + 24, b1);
  52476. u += sp_3072_add_48(r + 24, r + 24, z1);
  52477. (void)sp_3072_add_word_24(r + 72, r + 72, u);
  52478. }
  52479. /* Add b to a into r. (r = a + b)
  52480. *
  52481. * r A single precision integer.
  52482. * a A single precision integer.
  52483. * b A single precision integer.
  52484. */
  52485. SP_NOINLINE static sp_digit sp_3072_add_word_48(sp_digit* r, const sp_digit* a,
  52486. sp_digit b)
  52487. {
  52488. __asm__ __volatile__ (
  52489. "movs r5, #0\n\t"
  52490. "ldm %[a]!, {r3, r4}\n\t"
  52491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52492. "adds r3, r3, %[b]\n\t"
  52493. #else
  52494. "add r3, r3, %[b]\n\t"
  52495. #endif
  52496. #ifdef WOLFSSL_KEIL
  52497. "adcs r4, r4, r5\n\t"
  52498. #elif defined(__clang__)
  52499. "adcs r4, r5\n\t"
  52500. #else
  52501. "adc r4, r5\n\t"
  52502. #endif
  52503. "stm %[r]!, {r3, r4}\n\t"
  52504. "ldm %[a]!, {r3, r4}\n\t"
  52505. #ifdef WOLFSSL_KEIL
  52506. "adcs r3, r3, r5\n\t"
  52507. #elif defined(__clang__)
  52508. "adcs r3, r5\n\t"
  52509. #else
  52510. "adc r3, r5\n\t"
  52511. #endif
  52512. #ifdef WOLFSSL_KEIL
  52513. "adcs r4, r4, r5\n\t"
  52514. #elif defined(__clang__)
  52515. "adcs r4, r5\n\t"
  52516. #else
  52517. "adc r4, r5\n\t"
  52518. #endif
  52519. "stm %[r]!, {r3, r4}\n\t"
  52520. "ldm %[a]!, {r3, r4}\n\t"
  52521. #ifdef WOLFSSL_KEIL
  52522. "adcs r3, r3, r5\n\t"
  52523. #elif defined(__clang__)
  52524. "adcs r3, r5\n\t"
  52525. #else
  52526. "adc r3, r5\n\t"
  52527. #endif
  52528. #ifdef WOLFSSL_KEIL
  52529. "adcs r4, r4, r5\n\t"
  52530. #elif defined(__clang__)
  52531. "adcs r4, r5\n\t"
  52532. #else
  52533. "adc r4, r5\n\t"
  52534. #endif
  52535. "stm %[r]!, {r3, r4}\n\t"
  52536. "ldm %[a]!, {r3, r4}\n\t"
  52537. #ifdef WOLFSSL_KEIL
  52538. "adcs r3, r3, r5\n\t"
  52539. #elif defined(__clang__)
  52540. "adcs r3, r5\n\t"
  52541. #else
  52542. "adc r3, r5\n\t"
  52543. #endif
  52544. #ifdef WOLFSSL_KEIL
  52545. "adcs r4, r4, r5\n\t"
  52546. #elif defined(__clang__)
  52547. "adcs r4, r5\n\t"
  52548. #else
  52549. "adc r4, r5\n\t"
  52550. #endif
  52551. "stm %[r]!, {r3, r4}\n\t"
  52552. "ldm %[a]!, {r3, r4}\n\t"
  52553. #ifdef WOLFSSL_KEIL
  52554. "adcs r3, r3, r5\n\t"
  52555. #elif defined(__clang__)
  52556. "adcs r3, r5\n\t"
  52557. #else
  52558. "adc r3, r5\n\t"
  52559. #endif
  52560. #ifdef WOLFSSL_KEIL
  52561. "adcs r4, r4, r5\n\t"
  52562. #elif defined(__clang__)
  52563. "adcs r4, r5\n\t"
  52564. #else
  52565. "adc r4, r5\n\t"
  52566. #endif
  52567. "stm %[r]!, {r3, r4}\n\t"
  52568. "ldm %[a]!, {r3, r4}\n\t"
  52569. #ifdef WOLFSSL_KEIL
  52570. "adcs r3, r3, r5\n\t"
  52571. #elif defined(__clang__)
  52572. "adcs r3, r5\n\t"
  52573. #else
  52574. "adc r3, r5\n\t"
  52575. #endif
  52576. #ifdef WOLFSSL_KEIL
  52577. "adcs r4, r4, r5\n\t"
  52578. #elif defined(__clang__)
  52579. "adcs r4, r5\n\t"
  52580. #else
  52581. "adc r4, r5\n\t"
  52582. #endif
  52583. "stm %[r]!, {r3, r4}\n\t"
  52584. "ldm %[a]!, {r3, r4}\n\t"
  52585. #ifdef WOLFSSL_KEIL
  52586. "adcs r3, r3, r5\n\t"
  52587. #elif defined(__clang__)
  52588. "adcs r3, r5\n\t"
  52589. #else
  52590. "adc r3, r5\n\t"
  52591. #endif
  52592. #ifdef WOLFSSL_KEIL
  52593. "adcs r4, r4, r5\n\t"
  52594. #elif defined(__clang__)
  52595. "adcs r4, r5\n\t"
  52596. #else
  52597. "adc r4, r5\n\t"
  52598. #endif
  52599. "stm %[r]!, {r3, r4}\n\t"
  52600. "ldm %[a]!, {r3, r4}\n\t"
  52601. #ifdef WOLFSSL_KEIL
  52602. "adcs r3, r3, r5\n\t"
  52603. #elif defined(__clang__)
  52604. "adcs r3, r5\n\t"
  52605. #else
  52606. "adc r3, r5\n\t"
  52607. #endif
  52608. #ifdef WOLFSSL_KEIL
  52609. "adcs r4, r4, r5\n\t"
  52610. #elif defined(__clang__)
  52611. "adcs r4, r5\n\t"
  52612. #else
  52613. "adc r4, r5\n\t"
  52614. #endif
  52615. "stm %[r]!, {r3, r4}\n\t"
  52616. "ldm %[a]!, {r3, r4}\n\t"
  52617. #ifdef WOLFSSL_KEIL
  52618. "adcs r3, r3, r5\n\t"
  52619. #elif defined(__clang__)
  52620. "adcs r3, r5\n\t"
  52621. #else
  52622. "adc r3, r5\n\t"
  52623. #endif
  52624. #ifdef WOLFSSL_KEIL
  52625. "adcs r4, r4, r5\n\t"
  52626. #elif defined(__clang__)
  52627. "adcs r4, r5\n\t"
  52628. #else
  52629. "adc r4, r5\n\t"
  52630. #endif
  52631. "stm %[r]!, {r3, r4}\n\t"
  52632. "ldm %[a]!, {r3, r4}\n\t"
  52633. #ifdef WOLFSSL_KEIL
  52634. "adcs r3, r3, r5\n\t"
  52635. #elif defined(__clang__)
  52636. "adcs r3, r5\n\t"
  52637. #else
  52638. "adc r3, r5\n\t"
  52639. #endif
  52640. #ifdef WOLFSSL_KEIL
  52641. "adcs r4, r4, r5\n\t"
  52642. #elif defined(__clang__)
  52643. "adcs r4, r5\n\t"
  52644. #else
  52645. "adc r4, r5\n\t"
  52646. #endif
  52647. "stm %[r]!, {r3, r4}\n\t"
  52648. "ldm %[a]!, {r3, r4}\n\t"
  52649. #ifdef WOLFSSL_KEIL
  52650. "adcs r3, r3, r5\n\t"
  52651. #elif defined(__clang__)
  52652. "adcs r3, r5\n\t"
  52653. #else
  52654. "adc r3, r5\n\t"
  52655. #endif
  52656. #ifdef WOLFSSL_KEIL
  52657. "adcs r4, r4, r5\n\t"
  52658. #elif defined(__clang__)
  52659. "adcs r4, r5\n\t"
  52660. #else
  52661. "adc r4, r5\n\t"
  52662. #endif
  52663. "stm %[r]!, {r3, r4}\n\t"
  52664. "ldm %[a]!, {r3, r4}\n\t"
  52665. #ifdef WOLFSSL_KEIL
  52666. "adcs r3, r3, r5\n\t"
  52667. #elif defined(__clang__)
  52668. "adcs r3, r5\n\t"
  52669. #else
  52670. "adc r3, r5\n\t"
  52671. #endif
  52672. #ifdef WOLFSSL_KEIL
  52673. "adcs r4, r4, r5\n\t"
  52674. #elif defined(__clang__)
  52675. "adcs r4, r5\n\t"
  52676. #else
  52677. "adc r4, r5\n\t"
  52678. #endif
  52679. "stm %[r]!, {r3, r4}\n\t"
  52680. "ldm %[a]!, {r3, r4}\n\t"
  52681. #ifdef WOLFSSL_KEIL
  52682. "adcs r3, r3, r5\n\t"
  52683. #elif defined(__clang__)
  52684. "adcs r3, r5\n\t"
  52685. #else
  52686. "adc r3, r5\n\t"
  52687. #endif
  52688. #ifdef WOLFSSL_KEIL
  52689. "adcs r4, r4, r5\n\t"
  52690. #elif defined(__clang__)
  52691. "adcs r4, r5\n\t"
  52692. #else
  52693. "adc r4, r5\n\t"
  52694. #endif
  52695. "stm %[r]!, {r3, r4}\n\t"
  52696. "ldm %[a]!, {r3, r4}\n\t"
  52697. #ifdef WOLFSSL_KEIL
  52698. "adcs r3, r3, r5\n\t"
  52699. #elif defined(__clang__)
  52700. "adcs r3, r5\n\t"
  52701. #else
  52702. "adc r3, r5\n\t"
  52703. #endif
  52704. #ifdef WOLFSSL_KEIL
  52705. "adcs r4, r4, r5\n\t"
  52706. #elif defined(__clang__)
  52707. "adcs r4, r5\n\t"
  52708. #else
  52709. "adc r4, r5\n\t"
  52710. #endif
  52711. "stm %[r]!, {r3, r4}\n\t"
  52712. "ldm %[a]!, {r3, r4}\n\t"
  52713. #ifdef WOLFSSL_KEIL
  52714. "adcs r3, r3, r5\n\t"
  52715. #elif defined(__clang__)
  52716. "adcs r3, r5\n\t"
  52717. #else
  52718. "adc r3, r5\n\t"
  52719. #endif
  52720. #ifdef WOLFSSL_KEIL
  52721. "adcs r4, r4, r5\n\t"
  52722. #elif defined(__clang__)
  52723. "adcs r4, r5\n\t"
  52724. #else
  52725. "adc r4, r5\n\t"
  52726. #endif
  52727. "stm %[r]!, {r3, r4}\n\t"
  52728. "ldm %[a]!, {r3, r4}\n\t"
  52729. #ifdef WOLFSSL_KEIL
  52730. "adcs r3, r3, r5\n\t"
  52731. #elif defined(__clang__)
  52732. "adcs r3, r5\n\t"
  52733. #else
  52734. "adc r3, r5\n\t"
  52735. #endif
  52736. #ifdef WOLFSSL_KEIL
  52737. "adcs r4, r4, r5\n\t"
  52738. #elif defined(__clang__)
  52739. "adcs r4, r5\n\t"
  52740. #else
  52741. "adc r4, r5\n\t"
  52742. #endif
  52743. "stm %[r]!, {r3, r4}\n\t"
  52744. "ldm %[a]!, {r3, r4}\n\t"
  52745. #ifdef WOLFSSL_KEIL
  52746. "adcs r3, r3, r5\n\t"
  52747. #elif defined(__clang__)
  52748. "adcs r3, r5\n\t"
  52749. #else
  52750. "adc r3, r5\n\t"
  52751. #endif
  52752. #ifdef WOLFSSL_KEIL
  52753. "adcs r4, r4, r5\n\t"
  52754. #elif defined(__clang__)
  52755. "adcs r4, r5\n\t"
  52756. #else
  52757. "adc r4, r5\n\t"
  52758. #endif
  52759. "stm %[r]!, {r3, r4}\n\t"
  52760. "ldm %[a]!, {r3, r4}\n\t"
  52761. #ifdef WOLFSSL_KEIL
  52762. "adcs r3, r3, r5\n\t"
  52763. #elif defined(__clang__)
  52764. "adcs r3, r5\n\t"
  52765. #else
  52766. "adc r3, r5\n\t"
  52767. #endif
  52768. #ifdef WOLFSSL_KEIL
  52769. "adcs r4, r4, r5\n\t"
  52770. #elif defined(__clang__)
  52771. "adcs r4, r5\n\t"
  52772. #else
  52773. "adc r4, r5\n\t"
  52774. #endif
  52775. "stm %[r]!, {r3, r4}\n\t"
  52776. "ldm %[a]!, {r3, r4}\n\t"
  52777. #ifdef WOLFSSL_KEIL
  52778. "adcs r3, r3, r5\n\t"
  52779. #elif defined(__clang__)
  52780. "adcs r3, r5\n\t"
  52781. #else
  52782. "adc r3, r5\n\t"
  52783. #endif
  52784. #ifdef WOLFSSL_KEIL
  52785. "adcs r4, r4, r5\n\t"
  52786. #elif defined(__clang__)
  52787. "adcs r4, r5\n\t"
  52788. #else
  52789. "adc r4, r5\n\t"
  52790. #endif
  52791. "stm %[r]!, {r3, r4}\n\t"
  52792. "ldm %[a]!, {r3, r4}\n\t"
  52793. #ifdef WOLFSSL_KEIL
  52794. "adcs r3, r3, r5\n\t"
  52795. #elif defined(__clang__)
  52796. "adcs r3, r5\n\t"
  52797. #else
  52798. "adc r3, r5\n\t"
  52799. #endif
  52800. #ifdef WOLFSSL_KEIL
  52801. "adcs r4, r4, r5\n\t"
  52802. #elif defined(__clang__)
  52803. "adcs r4, r5\n\t"
  52804. #else
  52805. "adc r4, r5\n\t"
  52806. #endif
  52807. "stm %[r]!, {r3, r4}\n\t"
  52808. "ldm %[a]!, {r3, r4}\n\t"
  52809. #ifdef WOLFSSL_KEIL
  52810. "adcs r3, r3, r5\n\t"
  52811. #elif defined(__clang__)
  52812. "adcs r3, r5\n\t"
  52813. #else
  52814. "adc r3, r5\n\t"
  52815. #endif
  52816. #ifdef WOLFSSL_KEIL
  52817. "adcs r4, r4, r5\n\t"
  52818. #elif defined(__clang__)
  52819. "adcs r4, r5\n\t"
  52820. #else
  52821. "adc r4, r5\n\t"
  52822. #endif
  52823. "stm %[r]!, {r3, r4}\n\t"
  52824. "ldm %[a]!, {r3, r4}\n\t"
  52825. #ifdef WOLFSSL_KEIL
  52826. "adcs r3, r3, r5\n\t"
  52827. #elif defined(__clang__)
  52828. "adcs r3, r5\n\t"
  52829. #else
  52830. "adc r3, r5\n\t"
  52831. #endif
  52832. #ifdef WOLFSSL_KEIL
  52833. "adcs r4, r4, r5\n\t"
  52834. #elif defined(__clang__)
  52835. "adcs r4, r5\n\t"
  52836. #else
  52837. "adc r4, r5\n\t"
  52838. #endif
  52839. "stm %[r]!, {r3, r4}\n\t"
  52840. "ldm %[a]!, {r3, r4}\n\t"
  52841. #ifdef WOLFSSL_KEIL
  52842. "adcs r3, r3, r5\n\t"
  52843. #elif defined(__clang__)
  52844. "adcs r3, r5\n\t"
  52845. #else
  52846. "adc r3, r5\n\t"
  52847. #endif
  52848. #ifdef WOLFSSL_KEIL
  52849. "adcs r4, r4, r5\n\t"
  52850. #elif defined(__clang__)
  52851. "adcs r4, r5\n\t"
  52852. #else
  52853. "adc r4, r5\n\t"
  52854. #endif
  52855. "stm %[r]!, {r3, r4}\n\t"
  52856. "ldm %[a]!, {r3, r4}\n\t"
  52857. #ifdef WOLFSSL_KEIL
  52858. "adcs r3, r3, r5\n\t"
  52859. #elif defined(__clang__)
  52860. "adcs r3, r5\n\t"
  52861. #else
  52862. "adc r3, r5\n\t"
  52863. #endif
  52864. #ifdef WOLFSSL_KEIL
  52865. "adcs r4, r4, r5\n\t"
  52866. #elif defined(__clang__)
  52867. "adcs r4, r5\n\t"
  52868. #else
  52869. "adc r4, r5\n\t"
  52870. #endif
  52871. "stm %[r]!, {r3, r4}\n\t"
  52872. "movs %[r], #0\n\t"
  52873. #ifdef WOLFSSL_KEIL
  52874. "adcs %[r], %[r], %[r]\n\t"
  52875. #elif defined(__clang__)
  52876. "adcs %[r], %[r]\n\t"
  52877. #else
  52878. "adc %[r], %[r]\n\t"
  52879. #endif
  52880. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  52881. :
  52882. : "memory", "r3", "r4", "r5"
  52883. );
  52884. return (uint32_t)(size_t)r;
  52885. }
  52886. /* Sub b from a into a. (a -= b)
  52887. *
  52888. * a A single precision integer.
  52889. * b A single precision integer.
  52890. */
  52891. SP_NOINLINE static sp_digit sp_3072_sub_in_place_96(sp_digit* a,
  52892. const sp_digit* b)
  52893. {
  52894. __asm__ __volatile__ (
  52895. "ldm %[b]!, {r4, r5}\n\t"
  52896. "ldr r2, [%[a]]\n\t"
  52897. "ldr r3, [%[a], #4]\n\t"
  52898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52899. "subs r2, r2, r4\n\t"
  52900. #else
  52901. "sub r2, r2, r4\n\t"
  52902. #endif
  52903. #ifdef WOLFSSL_KEIL
  52904. "sbcs r3, r3, r5\n\t"
  52905. #elif defined(__clang__)
  52906. "sbcs r3, r5\n\t"
  52907. #else
  52908. "sbc r3, r5\n\t"
  52909. #endif
  52910. "stm %[a]!, {r2, r3}\n\t"
  52911. "ldm %[b]!, {r4, r5}\n\t"
  52912. "ldr r2, [%[a]]\n\t"
  52913. "ldr r3, [%[a], #4]\n\t"
  52914. #ifdef WOLFSSL_KEIL
  52915. "sbcs r2, r2, r4\n\t"
  52916. #elif defined(__clang__)
  52917. "sbcs r2, r4\n\t"
  52918. #else
  52919. "sbc r2, r4\n\t"
  52920. #endif
  52921. #ifdef WOLFSSL_KEIL
  52922. "sbcs r3, r3, r5\n\t"
  52923. #elif defined(__clang__)
  52924. "sbcs r3, r5\n\t"
  52925. #else
  52926. "sbc r3, r5\n\t"
  52927. #endif
  52928. "stm %[a]!, {r2, r3}\n\t"
  52929. "ldm %[b]!, {r4, r5}\n\t"
  52930. "ldr r2, [%[a]]\n\t"
  52931. "ldr r3, [%[a], #4]\n\t"
  52932. #ifdef WOLFSSL_KEIL
  52933. "sbcs r2, r2, r4\n\t"
  52934. #elif defined(__clang__)
  52935. "sbcs r2, r4\n\t"
  52936. #else
  52937. "sbc r2, r4\n\t"
  52938. #endif
  52939. #ifdef WOLFSSL_KEIL
  52940. "sbcs r3, r3, r5\n\t"
  52941. #elif defined(__clang__)
  52942. "sbcs r3, r5\n\t"
  52943. #else
  52944. "sbc r3, r5\n\t"
  52945. #endif
  52946. "stm %[a]!, {r2, r3}\n\t"
  52947. "ldm %[b]!, {r4, r5}\n\t"
  52948. "ldr r2, [%[a]]\n\t"
  52949. "ldr r3, [%[a], #4]\n\t"
  52950. #ifdef WOLFSSL_KEIL
  52951. "sbcs r2, r2, r4\n\t"
  52952. #elif defined(__clang__)
  52953. "sbcs r2, r4\n\t"
  52954. #else
  52955. "sbc r2, r4\n\t"
  52956. #endif
  52957. #ifdef WOLFSSL_KEIL
  52958. "sbcs r3, r3, r5\n\t"
  52959. #elif defined(__clang__)
  52960. "sbcs r3, r5\n\t"
  52961. #else
  52962. "sbc r3, r5\n\t"
  52963. #endif
  52964. "stm %[a]!, {r2, r3}\n\t"
  52965. "ldm %[b]!, {r4, r5}\n\t"
  52966. "ldr r2, [%[a]]\n\t"
  52967. "ldr r3, [%[a], #4]\n\t"
  52968. #ifdef WOLFSSL_KEIL
  52969. "sbcs r2, r2, r4\n\t"
  52970. #elif defined(__clang__)
  52971. "sbcs r2, r4\n\t"
  52972. #else
  52973. "sbc r2, r4\n\t"
  52974. #endif
  52975. #ifdef WOLFSSL_KEIL
  52976. "sbcs r3, r3, r5\n\t"
  52977. #elif defined(__clang__)
  52978. "sbcs r3, r5\n\t"
  52979. #else
  52980. "sbc r3, r5\n\t"
  52981. #endif
  52982. "stm %[a]!, {r2, r3}\n\t"
  52983. "ldm %[b]!, {r4, r5}\n\t"
  52984. "ldr r2, [%[a]]\n\t"
  52985. "ldr r3, [%[a], #4]\n\t"
  52986. #ifdef WOLFSSL_KEIL
  52987. "sbcs r2, r2, r4\n\t"
  52988. #elif defined(__clang__)
  52989. "sbcs r2, r4\n\t"
  52990. #else
  52991. "sbc r2, r4\n\t"
  52992. #endif
  52993. #ifdef WOLFSSL_KEIL
  52994. "sbcs r3, r3, r5\n\t"
  52995. #elif defined(__clang__)
  52996. "sbcs r3, r5\n\t"
  52997. #else
  52998. "sbc r3, r5\n\t"
  52999. #endif
  53000. "stm %[a]!, {r2, r3}\n\t"
  53001. "ldm %[b]!, {r4, r5}\n\t"
  53002. "ldr r2, [%[a]]\n\t"
  53003. "ldr r3, [%[a], #4]\n\t"
  53004. #ifdef WOLFSSL_KEIL
  53005. "sbcs r2, r2, r4\n\t"
  53006. #elif defined(__clang__)
  53007. "sbcs r2, r4\n\t"
  53008. #else
  53009. "sbc r2, r4\n\t"
  53010. #endif
  53011. #ifdef WOLFSSL_KEIL
  53012. "sbcs r3, r3, r5\n\t"
  53013. #elif defined(__clang__)
  53014. "sbcs r3, r5\n\t"
  53015. #else
  53016. "sbc r3, r5\n\t"
  53017. #endif
  53018. "stm %[a]!, {r2, r3}\n\t"
  53019. "ldm %[b]!, {r4, r5}\n\t"
  53020. "ldr r2, [%[a]]\n\t"
  53021. "ldr r3, [%[a], #4]\n\t"
  53022. #ifdef WOLFSSL_KEIL
  53023. "sbcs r2, r2, r4\n\t"
  53024. #elif defined(__clang__)
  53025. "sbcs r2, r4\n\t"
  53026. #else
  53027. "sbc r2, r4\n\t"
  53028. #endif
  53029. #ifdef WOLFSSL_KEIL
  53030. "sbcs r3, r3, r5\n\t"
  53031. #elif defined(__clang__)
  53032. "sbcs r3, r5\n\t"
  53033. #else
  53034. "sbc r3, r5\n\t"
  53035. #endif
  53036. "stm %[a]!, {r2, r3}\n\t"
  53037. "ldm %[b]!, {r4, r5}\n\t"
  53038. "ldr r2, [%[a]]\n\t"
  53039. "ldr r3, [%[a], #4]\n\t"
  53040. #ifdef WOLFSSL_KEIL
  53041. "sbcs r2, r2, r4\n\t"
  53042. #elif defined(__clang__)
  53043. "sbcs r2, r4\n\t"
  53044. #else
  53045. "sbc r2, r4\n\t"
  53046. #endif
  53047. #ifdef WOLFSSL_KEIL
  53048. "sbcs r3, r3, r5\n\t"
  53049. #elif defined(__clang__)
  53050. "sbcs r3, r5\n\t"
  53051. #else
  53052. "sbc r3, r5\n\t"
  53053. #endif
  53054. "stm %[a]!, {r2, r3}\n\t"
  53055. "ldm %[b]!, {r4, r5}\n\t"
  53056. "ldr r2, [%[a]]\n\t"
  53057. "ldr r3, [%[a], #4]\n\t"
  53058. #ifdef WOLFSSL_KEIL
  53059. "sbcs r2, r2, r4\n\t"
  53060. #elif defined(__clang__)
  53061. "sbcs r2, r4\n\t"
  53062. #else
  53063. "sbc r2, r4\n\t"
  53064. #endif
  53065. #ifdef WOLFSSL_KEIL
  53066. "sbcs r3, r3, r5\n\t"
  53067. #elif defined(__clang__)
  53068. "sbcs r3, r5\n\t"
  53069. #else
  53070. "sbc r3, r5\n\t"
  53071. #endif
  53072. "stm %[a]!, {r2, r3}\n\t"
  53073. "ldm %[b]!, {r4, r5}\n\t"
  53074. "ldr r2, [%[a]]\n\t"
  53075. "ldr r3, [%[a], #4]\n\t"
  53076. #ifdef WOLFSSL_KEIL
  53077. "sbcs r2, r2, r4\n\t"
  53078. #elif defined(__clang__)
  53079. "sbcs r2, r4\n\t"
  53080. #else
  53081. "sbc r2, r4\n\t"
  53082. #endif
  53083. #ifdef WOLFSSL_KEIL
  53084. "sbcs r3, r3, r5\n\t"
  53085. #elif defined(__clang__)
  53086. "sbcs r3, r5\n\t"
  53087. #else
  53088. "sbc r3, r5\n\t"
  53089. #endif
  53090. "stm %[a]!, {r2, r3}\n\t"
  53091. "ldm %[b]!, {r4, r5}\n\t"
  53092. "ldr r2, [%[a]]\n\t"
  53093. "ldr r3, [%[a], #4]\n\t"
  53094. #ifdef WOLFSSL_KEIL
  53095. "sbcs r2, r2, r4\n\t"
  53096. #elif defined(__clang__)
  53097. "sbcs r2, r4\n\t"
  53098. #else
  53099. "sbc r2, r4\n\t"
  53100. #endif
  53101. #ifdef WOLFSSL_KEIL
  53102. "sbcs r3, r3, r5\n\t"
  53103. #elif defined(__clang__)
  53104. "sbcs r3, r5\n\t"
  53105. #else
  53106. "sbc r3, r5\n\t"
  53107. #endif
  53108. "stm %[a]!, {r2, r3}\n\t"
  53109. "ldm %[b]!, {r4, r5}\n\t"
  53110. "ldr r2, [%[a]]\n\t"
  53111. "ldr r3, [%[a], #4]\n\t"
  53112. #ifdef WOLFSSL_KEIL
  53113. "sbcs r2, r2, r4\n\t"
  53114. #elif defined(__clang__)
  53115. "sbcs r2, r4\n\t"
  53116. #else
  53117. "sbc r2, r4\n\t"
  53118. #endif
  53119. #ifdef WOLFSSL_KEIL
  53120. "sbcs r3, r3, r5\n\t"
  53121. #elif defined(__clang__)
  53122. "sbcs r3, r5\n\t"
  53123. #else
  53124. "sbc r3, r5\n\t"
  53125. #endif
  53126. "stm %[a]!, {r2, r3}\n\t"
  53127. "ldm %[b]!, {r4, r5}\n\t"
  53128. "ldr r2, [%[a]]\n\t"
  53129. "ldr r3, [%[a], #4]\n\t"
  53130. #ifdef WOLFSSL_KEIL
  53131. "sbcs r2, r2, r4\n\t"
  53132. #elif defined(__clang__)
  53133. "sbcs r2, r4\n\t"
  53134. #else
  53135. "sbc r2, r4\n\t"
  53136. #endif
  53137. #ifdef WOLFSSL_KEIL
  53138. "sbcs r3, r3, r5\n\t"
  53139. #elif defined(__clang__)
  53140. "sbcs r3, r5\n\t"
  53141. #else
  53142. "sbc r3, r5\n\t"
  53143. #endif
  53144. "stm %[a]!, {r2, r3}\n\t"
  53145. "ldm %[b]!, {r4, r5}\n\t"
  53146. "ldr r2, [%[a]]\n\t"
  53147. "ldr r3, [%[a], #4]\n\t"
  53148. #ifdef WOLFSSL_KEIL
  53149. "sbcs r2, r2, r4\n\t"
  53150. #elif defined(__clang__)
  53151. "sbcs r2, r4\n\t"
  53152. #else
  53153. "sbc r2, r4\n\t"
  53154. #endif
  53155. #ifdef WOLFSSL_KEIL
  53156. "sbcs r3, r3, r5\n\t"
  53157. #elif defined(__clang__)
  53158. "sbcs r3, r5\n\t"
  53159. #else
  53160. "sbc r3, r5\n\t"
  53161. #endif
  53162. "stm %[a]!, {r2, r3}\n\t"
  53163. "ldm %[b]!, {r4, r5}\n\t"
  53164. "ldr r2, [%[a]]\n\t"
  53165. "ldr r3, [%[a], #4]\n\t"
  53166. #ifdef WOLFSSL_KEIL
  53167. "sbcs r2, r2, r4\n\t"
  53168. #elif defined(__clang__)
  53169. "sbcs r2, r4\n\t"
  53170. #else
  53171. "sbc r2, r4\n\t"
  53172. #endif
  53173. #ifdef WOLFSSL_KEIL
  53174. "sbcs r3, r3, r5\n\t"
  53175. #elif defined(__clang__)
  53176. "sbcs r3, r5\n\t"
  53177. #else
  53178. "sbc r3, r5\n\t"
  53179. #endif
  53180. "stm %[a]!, {r2, r3}\n\t"
  53181. "ldm %[b]!, {r4, r5}\n\t"
  53182. "ldr r2, [%[a]]\n\t"
  53183. "ldr r3, [%[a], #4]\n\t"
  53184. #ifdef WOLFSSL_KEIL
  53185. "sbcs r2, r2, r4\n\t"
  53186. #elif defined(__clang__)
  53187. "sbcs r2, r4\n\t"
  53188. #else
  53189. "sbc r2, r4\n\t"
  53190. #endif
  53191. #ifdef WOLFSSL_KEIL
  53192. "sbcs r3, r3, r5\n\t"
  53193. #elif defined(__clang__)
  53194. "sbcs r3, r5\n\t"
  53195. #else
  53196. "sbc r3, r5\n\t"
  53197. #endif
  53198. "stm %[a]!, {r2, r3}\n\t"
  53199. "ldm %[b]!, {r4, r5}\n\t"
  53200. "ldr r2, [%[a]]\n\t"
  53201. "ldr r3, [%[a], #4]\n\t"
  53202. #ifdef WOLFSSL_KEIL
  53203. "sbcs r2, r2, r4\n\t"
  53204. #elif defined(__clang__)
  53205. "sbcs r2, r4\n\t"
  53206. #else
  53207. "sbc r2, r4\n\t"
  53208. #endif
  53209. #ifdef WOLFSSL_KEIL
  53210. "sbcs r3, r3, r5\n\t"
  53211. #elif defined(__clang__)
  53212. "sbcs r3, r5\n\t"
  53213. #else
  53214. "sbc r3, r5\n\t"
  53215. #endif
  53216. "stm %[a]!, {r2, r3}\n\t"
  53217. "ldm %[b]!, {r4, r5}\n\t"
  53218. "ldr r2, [%[a]]\n\t"
  53219. "ldr r3, [%[a], #4]\n\t"
  53220. #ifdef WOLFSSL_KEIL
  53221. "sbcs r2, r2, r4\n\t"
  53222. #elif defined(__clang__)
  53223. "sbcs r2, r4\n\t"
  53224. #else
  53225. "sbc r2, r4\n\t"
  53226. #endif
  53227. #ifdef WOLFSSL_KEIL
  53228. "sbcs r3, r3, r5\n\t"
  53229. #elif defined(__clang__)
  53230. "sbcs r3, r5\n\t"
  53231. #else
  53232. "sbc r3, r5\n\t"
  53233. #endif
  53234. "stm %[a]!, {r2, r3}\n\t"
  53235. "ldm %[b]!, {r4, r5}\n\t"
  53236. "ldr r2, [%[a]]\n\t"
  53237. "ldr r3, [%[a], #4]\n\t"
  53238. #ifdef WOLFSSL_KEIL
  53239. "sbcs r2, r2, r4\n\t"
  53240. #elif defined(__clang__)
  53241. "sbcs r2, r4\n\t"
  53242. #else
  53243. "sbc r2, r4\n\t"
  53244. #endif
  53245. #ifdef WOLFSSL_KEIL
  53246. "sbcs r3, r3, r5\n\t"
  53247. #elif defined(__clang__)
  53248. "sbcs r3, r5\n\t"
  53249. #else
  53250. "sbc r3, r5\n\t"
  53251. #endif
  53252. "stm %[a]!, {r2, r3}\n\t"
  53253. "ldm %[b]!, {r4, r5}\n\t"
  53254. "ldr r2, [%[a]]\n\t"
  53255. "ldr r3, [%[a], #4]\n\t"
  53256. #ifdef WOLFSSL_KEIL
  53257. "sbcs r2, r2, r4\n\t"
  53258. #elif defined(__clang__)
  53259. "sbcs r2, r4\n\t"
  53260. #else
  53261. "sbc r2, r4\n\t"
  53262. #endif
  53263. #ifdef WOLFSSL_KEIL
  53264. "sbcs r3, r3, r5\n\t"
  53265. #elif defined(__clang__)
  53266. "sbcs r3, r5\n\t"
  53267. #else
  53268. "sbc r3, r5\n\t"
  53269. #endif
  53270. "stm %[a]!, {r2, r3}\n\t"
  53271. "ldm %[b]!, {r4, r5}\n\t"
  53272. "ldr r2, [%[a]]\n\t"
  53273. "ldr r3, [%[a], #4]\n\t"
  53274. #ifdef WOLFSSL_KEIL
  53275. "sbcs r2, r2, r4\n\t"
  53276. #elif defined(__clang__)
  53277. "sbcs r2, r4\n\t"
  53278. #else
  53279. "sbc r2, r4\n\t"
  53280. #endif
  53281. #ifdef WOLFSSL_KEIL
  53282. "sbcs r3, r3, r5\n\t"
  53283. #elif defined(__clang__)
  53284. "sbcs r3, r5\n\t"
  53285. #else
  53286. "sbc r3, r5\n\t"
  53287. #endif
  53288. "stm %[a]!, {r2, r3}\n\t"
  53289. "ldm %[b]!, {r4, r5}\n\t"
  53290. "ldr r2, [%[a]]\n\t"
  53291. "ldr r3, [%[a], #4]\n\t"
  53292. #ifdef WOLFSSL_KEIL
  53293. "sbcs r2, r2, r4\n\t"
  53294. #elif defined(__clang__)
  53295. "sbcs r2, r4\n\t"
  53296. #else
  53297. "sbc r2, r4\n\t"
  53298. #endif
  53299. #ifdef WOLFSSL_KEIL
  53300. "sbcs r3, r3, r5\n\t"
  53301. #elif defined(__clang__)
  53302. "sbcs r3, r5\n\t"
  53303. #else
  53304. "sbc r3, r5\n\t"
  53305. #endif
  53306. "stm %[a]!, {r2, r3}\n\t"
  53307. "ldm %[b]!, {r4, r5}\n\t"
  53308. "ldr r2, [%[a]]\n\t"
  53309. "ldr r3, [%[a], #4]\n\t"
  53310. #ifdef WOLFSSL_KEIL
  53311. "sbcs r2, r2, r4\n\t"
  53312. #elif defined(__clang__)
  53313. "sbcs r2, r4\n\t"
  53314. #else
  53315. "sbc r2, r4\n\t"
  53316. #endif
  53317. #ifdef WOLFSSL_KEIL
  53318. "sbcs r3, r3, r5\n\t"
  53319. #elif defined(__clang__)
  53320. "sbcs r3, r5\n\t"
  53321. #else
  53322. "sbc r3, r5\n\t"
  53323. #endif
  53324. "stm %[a]!, {r2, r3}\n\t"
  53325. "ldm %[b]!, {r4, r5}\n\t"
  53326. "ldr r2, [%[a]]\n\t"
  53327. "ldr r3, [%[a], #4]\n\t"
  53328. #ifdef WOLFSSL_KEIL
  53329. "sbcs r2, r2, r4\n\t"
  53330. #elif defined(__clang__)
  53331. "sbcs r2, r4\n\t"
  53332. #else
  53333. "sbc r2, r4\n\t"
  53334. #endif
  53335. #ifdef WOLFSSL_KEIL
  53336. "sbcs r3, r3, r5\n\t"
  53337. #elif defined(__clang__)
  53338. "sbcs r3, r5\n\t"
  53339. #else
  53340. "sbc r3, r5\n\t"
  53341. #endif
  53342. "stm %[a]!, {r2, r3}\n\t"
  53343. "ldm %[b]!, {r4, r5}\n\t"
  53344. "ldr r2, [%[a]]\n\t"
  53345. "ldr r3, [%[a], #4]\n\t"
  53346. #ifdef WOLFSSL_KEIL
  53347. "sbcs r2, r2, r4\n\t"
  53348. #elif defined(__clang__)
  53349. "sbcs r2, r4\n\t"
  53350. #else
  53351. "sbc r2, r4\n\t"
  53352. #endif
  53353. #ifdef WOLFSSL_KEIL
  53354. "sbcs r3, r3, r5\n\t"
  53355. #elif defined(__clang__)
  53356. "sbcs r3, r5\n\t"
  53357. #else
  53358. "sbc r3, r5\n\t"
  53359. #endif
  53360. "stm %[a]!, {r2, r3}\n\t"
  53361. "ldm %[b]!, {r4, r5}\n\t"
  53362. "ldr r2, [%[a]]\n\t"
  53363. "ldr r3, [%[a], #4]\n\t"
  53364. #ifdef WOLFSSL_KEIL
  53365. "sbcs r2, r2, r4\n\t"
  53366. #elif defined(__clang__)
  53367. "sbcs r2, r4\n\t"
  53368. #else
  53369. "sbc r2, r4\n\t"
  53370. #endif
  53371. #ifdef WOLFSSL_KEIL
  53372. "sbcs r3, r3, r5\n\t"
  53373. #elif defined(__clang__)
  53374. "sbcs r3, r5\n\t"
  53375. #else
  53376. "sbc r3, r5\n\t"
  53377. #endif
  53378. "stm %[a]!, {r2, r3}\n\t"
  53379. "ldm %[b]!, {r4, r5}\n\t"
  53380. "ldr r2, [%[a]]\n\t"
  53381. "ldr r3, [%[a], #4]\n\t"
  53382. #ifdef WOLFSSL_KEIL
  53383. "sbcs r2, r2, r4\n\t"
  53384. #elif defined(__clang__)
  53385. "sbcs r2, r4\n\t"
  53386. #else
  53387. "sbc r2, r4\n\t"
  53388. #endif
  53389. #ifdef WOLFSSL_KEIL
  53390. "sbcs r3, r3, r5\n\t"
  53391. #elif defined(__clang__)
  53392. "sbcs r3, r5\n\t"
  53393. #else
  53394. "sbc r3, r5\n\t"
  53395. #endif
  53396. "stm %[a]!, {r2, r3}\n\t"
  53397. "ldm %[b]!, {r4, r5}\n\t"
  53398. "ldr r2, [%[a]]\n\t"
  53399. "ldr r3, [%[a], #4]\n\t"
  53400. #ifdef WOLFSSL_KEIL
  53401. "sbcs r2, r2, r4\n\t"
  53402. #elif defined(__clang__)
  53403. "sbcs r2, r4\n\t"
  53404. #else
  53405. "sbc r2, r4\n\t"
  53406. #endif
  53407. #ifdef WOLFSSL_KEIL
  53408. "sbcs r3, r3, r5\n\t"
  53409. #elif defined(__clang__)
  53410. "sbcs r3, r5\n\t"
  53411. #else
  53412. "sbc r3, r5\n\t"
  53413. #endif
  53414. "stm %[a]!, {r2, r3}\n\t"
  53415. "ldm %[b]!, {r4, r5}\n\t"
  53416. "ldr r2, [%[a]]\n\t"
  53417. "ldr r3, [%[a], #4]\n\t"
  53418. #ifdef WOLFSSL_KEIL
  53419. "sbcs r2, r2, r4\n\t"
  53420. #elif defined(__clang__)
  53421. "sbcs r2, r4\n\t"
  53422. #else
  53423. "sbc r2, r4\n\t"
  53424. #endif
  53425. #ifdef WOLFSSL_KEIL
  53426. "sbcs r3, r3, r5\n\t"
  53427. #elif defined(__clang__)
  53428. "sbcs r3, r5\n\t"
  53429. #else
  53430. "sbc r3, r5\n\t"
  53431. #endif
  53432. "stm %[a]!, {r2, r3}\n\t"
  53433. "ldm %[b]!, {r4, r5}\n\t"
  53434. "ldr r2, [%[a]]\n\t"
  53435. "ldr r3, [%[a], #4]\n\t"
  53436. #ifdef WOLFSSL_KEIL
  53437. "sbcs r2, r2, r4\n\t"
  53438. #elif defined(__clang__)
  53439. "sbcs r2, r4\n\t"
  53440. #else
  53441. "sbc r2, r4\n\t"
  53442. #endif
  53443. #ifdef WOLFSSL_KEIL
  53444. "sbcs r3, r3, r5\n\t"
  53445. #elif defined(__clang__)
  53446. "sbcs r3, r5\n\t"
  53447. #else
  53448. "sbc r3, r5\n\t"
  53449. #endif
  53450. "stm %[a]!, {r2, r3}\n\t"
  53451. "ldm %[b]!, {r4, r5}\n\t"
  53452. "ldr r2, [%[a]]\n\t"
  53453. "ldr r3, [%[a], #4]\n\t"
  53454. #ifdef WOLFSSL_KEIL
  53455. "sbcs r2, r2, r4\n\t"
  53456. #elif defined(__clang__)
  53457. "sbcs r2, r4\n\t"
  53458. #else
  53459. "sbc r2, r4\n\t"
  53460. #endif
  53461. #ifdef WOLFSSL_KEIL
  53462. "sbcs r3, r3, r5\n\t"
  53463. #elif defined(__clang__)
  53464. "sbcs r3, r5\n\t"
  53465. #else
  53466. "sbc r3, r5\n\t"
  53467. #endif
  53468. "stm %[a]!, {r2, r3}\n\t"
  53469. "ldm %[b]!, {r4, r5}\n\t"
  53470. "ldr r2, [%[a]]\n\t"
  53471. "ldr r3, [%[a], #4]\n\t"
  53472. #ifdef WOLFSSL_KEIL
  53473. "sbcs r2, r2, r4\n\t"
  53474. #elif defined(__clang__)
  53475. "sbcs r2, r4\n\t"
  53476. #else
  53477. "sbc r2, r4\n\t"
  53478. #endif
  53479. #ifdef WOLFSSL_KEIL
  53480. "sbcs r3, r3, r5\n\t"
  53481. #elif defined(__clang__)
  53482. "sbcs r3, r5\n\t"
  53483. #else
  53484. "sbc r3, r5\n\t"
  53485. #endif
  53486. "stm %[a]!, {r2, r3}\n\t"
  53487. "ldm %[b]!, {r4, r5}\n\t"
  53488. "ldr r2, [%[a]]\n\t"
  53489. "ldr r3, [%[a], #4]\n\t"
  53490. #ifdef WOLFSSL_KEIL
  53491. "sbcs r2, r2, r4\n\t"
  53492. #elif defined(__clang__)
  53493. "sbcs r2, r4\n\t"
  53494. #else
  53495. "sbc r2, r4\n\t"
  53496. #endif
  53497. #ifdef WOLFSSL_KEIL
  53498. "sbcs r3, r3, r5\n\t"
  53499. #elif defined(__clang__)
  53500. "sbcs r3, r5\n\t"
  53501. #else
  53502. "sbc r3, r5\n\t"
  53503. #endif
  53504. "stm %[a]!, {r2, r3}\n\t"
  53505. "ldm %[b]!, {r4, r5}\n\t"
  53506. "ldr r2, [%[a]]\n\t"
  53507. "ldr r3, [%[a], #4]\n\t"
  53508. #ifdef WOLFSSL_KEIL
  53509. "sbcs r2, r2, r4\n\t"
  53510. #elif defined(__clang__)
  53511. "sbcs r2, r4\n\t"
  53512. #else
  53513. "sbc r2, r4\n\t"
  53514. #endif
  53515. #ifdef WOLFSSL_KEIL
  53516. "sbcs r3, r3, r5\n\t"
  53517. #elif defined(__clang__)
  53518. "sbcs r3, r5\n\t"
  53519. #else
  53520. "sbc r3, r5\n\t"
  53521. #endif
  53522. "stm %[a]!, {r2, r3}\n\t"
  53523. "ldm %[b]!, {r4, r5}\n\t"
  53524. "ldr r2, [%[a]]\n\t"
  53525. "ldr r3, [%[a], #4]\n\t"
  53526. #ifdef WOLFSSL_KEIL
  53527. "sbcs r2, r2, r4\n\t"
  53528. #elif defined(__clang__)
  53529. "sbcs r2, r4\n\t"
  53530. #else
  53531. "sbc r2, r4\n\t"
  53532. #endif
  53533. #ifdef WOLFSSL_KEIL
  53534. "sbcs r3, r3, r5\n\t"
  53535. #elif defined(__clang__)
  53536. "sbcs r3, r5\n\t"
  53537. #else
  53538. "sbc r3, r5\n\t"
  53539. #endif
  53540. "stm %[a]!, {r2, r3}\n\t"
  53541. "ldm %[b]!, {r4, r5}\n\t"
  53542. "ldr r2, [%[a]]\n\t"
  53543. "ldr r3, [%[a], #4]\n\t"
  53544. #ifdef WOLFSSL_KEIL
  53545. "sbcs r2, r2, r4\n\t"
  53546. #elif defined(__clang__)
  53547. "sbcs r2, r4\n\t"
  53548. #else
  53549. "sbc r2, r4\n\t"
  53550. #endif
  53551. #ifdef WOLFSSL_KEIL
  53552. "sbcs r3, r3, r5\n\t"
  53553. #elif defined(__clang__)
  53554. "sbcs r3, r5\n\t"
  53555. #else
  53556. "sbc r3, r5\n\t"
  53557. #endif
  53558. "stm %[a]!, {r2, r3}\n\t"
  53559. "ldm %[b]!, {r4, r5}\n\t"
  53560. "ldr r2, [%[a]]\n\t"
  53561. "ldr r3, [%[a], #4]\n\t"
  53562. #ifdef WOLFSSL_KEIL
  53563. "sbcs r2, r2, r4\n\t"
  53564. #elif defined(__clang__)
  53565. "sbcs r2, r4\n\t"
  53566. #else
  53567. "sbc r2, r4\n\t"
  53568. #endif
  53569. #ifdef WOLFSSL_KEIL
  53570. "sbcs r3, r3, r5\n\t"
  53571. #elif defined(__clang__)
  53572. "sbcs r3, r5\n\t"
  53573. #else
  53574. "sbc r3, r5\n\t"
  53575. #endif
  53576. "stm %[a]!, {r2, r3}\n\t"
  53577. "ldm %[b]!, {r4, r5}\n\t"
  53578. "ldr r2, [%[a]]\n\t"
  53579. "ldr r3, [%[a], #4]\n\t"
  53580. #ifdef WOLFSSL_KEIL
  53581. "sbcs r2, r2, r4\n\t"
  53582. #elif defined(__clang__)
  53583. "sbcs r2, r4\n\t"
  53584. #else
  53585. "sbc r2, r4\n\t"
  53586. #endif
  53587. #ifdef WOLFSSL_KEIL
  53588. "sbcs r3, r3, r5\n\t"
  53589. #elif defined(__clang__)
  53590. "sbcs r3, r5\n\t"
  53591. #else
  53592. "sbc r3, r5\n\t"
  53593. #endif
  53594. "stm %[a]!, {r2, r3}\n\t"
  53595. "ldm %[b]!, {r4, r5}\n\t"
  53596. "ldr r2, [%[a]]\n\t"
  53597. "ldr r3, [%[a], #4]\n\t"
  53598. #ifdef WOLFSSL_KEIL
  53599. "sbcs r2, r2, r4\n\t"
  53600. #elif defined(__clang__)
  53601. "sbcs r2, r4\n\t"
  53602. #else
  53603. "sbc r2, r4\n\t"
  53604. #endif
  53605. #ifdef WOLFSSL_KEIL
  53606. "sbcs r3, r3, r5\n\t"
  53607. #elif defined(__clang__)
  53608. "sbcs r3, r5\n\t"
  53609. #else
  53610. "sbc r3, r5\n\t"
  53611. #endif
  53612. "stm %[a]!, {r2, r3}\n\t"
  53613. "ldm %[b]!, {r4, r5}\n\t"
  53614. "ldr r2, [%[a]]\n\t"
  53615. "ldr r3, [%[a], #4]\n\t"
  53616. #ifdef WOLFSSL_KEIL
  53617. "sbcs r2, r2, r4\n\t"
  53618. #elif defined(__clang__)
  53619. "sbcs r2, r4\n\t"
  53620. #else
  53621. "sbc r2, r4\n\t"
  53622. #endif
  53623. #ifdef WOLFSSL_KEIL
  53624. "sbcs r3, r3, r5\n\t"
  53625. #elif defined(__clang__)
  53626. "sbcs r3, r5\n\t"
  53627. #else
  53628. "sbc r3, r5\n\t"
  53629. #endif
  53630. "stm %[a]!, {r2, r3}\n\t"
  53631. "ldm %[b]!, {r4, r5}\n\t"
  53632. "ldr r2, [%[a]]\n\t"
  53633. "ldr r3, [%[a], #4]\n\t"
  53634. #ifdef WOLFSSL_KEIL
  53635. "sbcs r2, r2, r4\n\t"
  53636. #elif defined(__clang__)
  53637. "sbcs r2, r4\n\t"
  53638. #else
  53639. "sbc r2, r4\n\t"
  53640. #endif
  53641. #ifdef WOLFSSL_KEIL
  53642. "sbcs r3, r3, r5\n\t"
  53643. #elif defined(__clang__)
  53644. "sbcs r3, r5\n\t"
  53645. #else
  53646. "sbc r3, r5\n\t"
  53647. #endif
  53648. "stm %[a]!, {r2, r3}\n\t"
  53649. "ldm %[b]!, {r4, r5}\n\t"
  53650. "ldr r2, [%[a]]\n\t"
  53651. "ldr r3, [%[a], #4]\n\t"
  53652. #ifdef WOLFSSL_KEIL
  53653. "sbcs r2, r2, r4\n\t"
  53654. #elif defined(__clang__)
  53655. "sbcs r2, r4\n\t"
  53656. #else
  53657. "sbc r2, r4\n\t"
  53658. #endif
  53659. #ifdef WOLFSSL_KEIL
  53660. "sbcs r3, r3, r5\n\t"
  53661. #elif defined(__clang__)
  53662. "sbcs r3, r5\n\t"
  53663. #else
  53664. "sbc r3, r5\n\t"
  53665. #endif
  53666. "stm %[a]!, {r2, r3}\n\t"
  53667. "ldm %[b]!, {r4, r5}\n\t"
  53668. "ldr r2, [%[a]]\n\t"
  53669. "ldr r3, [%[a], #4]\n\t"
  53670. #ifdef WOLFSSL_KEIL
  53671. "sbcs r2, r2, r4\n\t"
  53672. #elif defined(__clang__)
  53673. "sbcs r2, r4\n\t"
  53674. #else
  53675. "sbc r2, r4\n\t"
  53676. #endif
  53677. #ifdef WOLFSSL_KEIL
  53678. "sbcs r3, r3, r5\n\t"
  53679. #elif defined(__clang__)
  53680. "sbcs r3, r5\n\t"
  53681. #else
  53682. "sbc r3, r5\n\t"
  53683. #endif
  53684. "stm %[a]!, {r2, r3}\n\t"
  53685. "ldm %[b]!, {r4, r5}\n\t"
  53686. "ldr r2, [%[a]]\n\t"
  53687. "ldr r3, [%[a], #4]\n\t"
  53688. #ifdef WOLFSSL_KEIL
  53689. "sbcs r2, r2, r4\n\t"
  53690. #elif defined(__clang__)
  53691. "sbcs r2, r4\n\t"
  53692. #else
  53693. "sbc r2, r4\n\t"
  53694. #endif
  53695. #ifdef WOLFSSL_KEIL
  53696. "sbcs r3, r3, r5\n\t"
  53697. #elif defined(__clang__)
  53698. "sbcs r3, r5\n\t"
  53699. #else
  53700. "sbc r3, r5\n\t"
  53701. #endif
  53702. "stm %[a]!, {r2, r3}\n\t"
  53703. "ldm %[b]!, {r4, r5}\n\t"
  53704. "ldr r2, [%[a]]\n\t"
  53705. "ldr r3, [%[a], #4]\n\t"
  53706. #ifdef WOLFSSL_KEIL
  53707. "sbcs r2, r2, r4\n\t"
  53708. #elif defined(__clang__)
  53709. "sbcs r2, r4\n\t"
  53710. #else
  53711. "sbc r2, r4\n\t"
  53712. #endif
  53713. #ifdef WOLFSSL_KEIL
  53714. "sbcs r3, r3, r5\n\t"
  53715. #elif defined(__clang__)
  53716. "sbcs r3, r5\n\t"
  53717. #else
  53718. "sbc r3, r5\n\t"
  53719. #endif
  53720. "stm %[a]!, {r2, r3}\n\t"
  53721. "ldm %[b]!, {r4, r5}\n\t"
  53722. "ldr r2, [%[a]]\n\t"
  53723. "ldr r3, [%[a], #4]\n\t"
  53724. #ifdef WOLFSSL_KEIL
  53725. "sbcs r2, r2, r4\n\t"
  53726. #elif defined(__clang__)
  53727. "sbcs r2, r4\n\t"
  53728. #else
  53729. "sbc r2, r4\n\t"
  53730. #endif
  53731. #ifdef WOLFSSL_KEIL
  53732. "sbcs r3, r3, r5\n\t"
  53733. #elif defined(__clang__)
  53734. "sbcs r3, r5\n\t"
  53735. #else
  53736. "sbc r3, r5\n\t"
  53737. #endif
  53738. "stm %[a]!, {r2, r3}\n\t"
  53739. "ldm %[b]!, {r4, r5}\n\t"
  53740. "ldr r2, [%[a]]\n\t"
  53741. "ldr r3, [%[a], #4]\n\t"
  53742. #ifdef WOLFSSL_KEIL
  53743. "sbcs r2, r2, r4\n\t"
  53744. #elif defined(__clang__)
  53745. "sbcs r2, r4\n\t"
  53746. #else
  53747. "sbc r2, r4\n\t"
  53748. #endif
  53749. #ifdef WOLFSSL_KEIL
  53750. "sbcs r3, r3, r5\n\t"
  53751. #elif defined(__clang__)
  53752. "sbcs r3, r5\n\t"
  53753. #else
  53754. "sbc r3, r5\n\t"
  53755. #endif
  53756. "stm %[a]!, {r2, r3}\n\t"
  53757. #ifdef WOLFSSL_KEIL
  53758. "sbcs %[a], %[a], %[a]\n\t"
  53759. #elif defined(__clang__)
  53760. "sbcs %[a], %[a]\n\t"
  53761. #else
  53762. "sbc %[a], %[a]\n\t"
  53763. #endif
  53764. : [a] "+l" (a), [b] "+l" (b)
  53765. :
  53766. : "memory", "r2", "r3", "r4", "r5"
  53767. );
  53768. return (uint32_t)(size_t)a;
  53769. }
  53770. /* Add b to a into r. (r = a + b)
  53771. *
  53772. * r A single precision integer.
  53773. * a A single precision integer.
  53774. * b A single precision integer.
  53775. */
  53776. SP_NOINLINE static sp_digit sp_3072_add_96(sp_digit* r, const sp_digit* a,
  53777. const sp_digit* b)
  53778. {
  53779. __asm__ __volatile__ (
  53780. "ldm %[b]!, {r5, r6}\n\t"
  53781. "ldm %[a]!, {r3, r4}\n\t"
  53782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53783. "adds r3, r3, r5\n\t"
  53784. #else
  53785. "add r3, r3, r5\n\t"
  53786. #endif
  53787. #ifdef WOLFSSL_KEIL
  53788. "adcs r4, r4, r6\n\t"
  53789. #elif defined(__clang__)
  53790. "adcs r4, r6\n\t"
  53791. #else
  53792. "adc r4, r6\n\t"
  53793. #endif
  53794. "stm %[r]!, {r3, r4}\n\t"
  53795. "ldm %[b]!, {r5, r6}\n\t"
  53796. "ldm %[a]!, {r3, r4}\n\t"
  53797. #ifdef WOLFSSL_KEIL
  53798. "adcs r3, r3, r5\n\t"
  53799. #elif defined(__clang__)
  53800. "adcs r3, r5\n\t"
  53801. #else
  53802. "adc r3, r5\n\t"
  53803. #endif
  53804. #ifdef WOLFSSL_KEIL
  53805. "adcs r4, r4, r6\n\t"
  53806. #elif defined(__clang__)
  53807. "adcs r4, r6\n\t"
  53808. #else
  53809. "adc r4, r6\n\t"
  53810. #endif
  53811. "stm %[r]!, {r3, r4}\n\t"
  53812. "ldm %[b]!, {r5, r6}\n\t"
  53813. "ldm %[a]!, {r3, r4}\n\t"
  53814. #ifdef WOLFSSL_KEIL
  53815. "adcs r3, r3, r5\n\t"
  53816. #elif defined(__clang__)
  53817. "adcs r3, r5\n\t"
  53818. #else
  53819. "adc r3, r5\n\t"
  53820. #endif
  53821. #ifdef WOLFSSL_KEIL
  53822. "adcs r4, r4, r6\n\t"
  53823. #elif defined(__clang__)
  53824. "adcs r4, r6\n\t"
  53825. #else
  53826. "adc r4, r6\n\t"
  53827. #endif
  53828. "stm %[r]!, {r3, r4}\n\t"
  53829. "ldm %[b]!, {r5, r6}\n\t"
  53830. "ldm %[a]!, {r3, r4}\n\t"
  53831. #ifdef WOLFSSL_KEIL
  53832. "adcs r3, r3, r5\n\t"
  53833. #elif defined(__clang__)
  53834. "adcs r3, r5\n\t"
  53835. #else
  53836. "adc r3, r5\n\t"
  53837. #endif
  53838. #ifdef WOLFSSL_KEIL
  53839. "adcs r4, r4, r6\n\t"
  53840. #elif defined(__clang__)
  53841. "adcs r4, r6\n\t"
  53842. #else
  53843. "adc r4, r6\n\t"
  53844. #endif
  53845. "stm %[r]!, {r3, r4}\n\t"
  53846. "ldm %[b]!, {r5, r6}\n\t"
  53847. "ldm %[a]!, {r3, r4}\n\t"
  53848. #ifdef WOLFSSL_KEIL
  53849. "adcs r3, r3, r5\n\t"
  53850. #elif defined(__clang__)
  53851. "adcs r3, r5\n\t"
  53852. #else
  53853. "adc r3, r5\n\t"
  53854. #endif
  53855. #ifdef WOLFSSL_KEIL
  53856. "adcs r4, r4, r6\n\t"
  53857. #elif defined(__clang__)
  53858. "adcs r4, r6\n\t"
  53859. #else
  53860. "adc r4, r6\n\t"
  53861. #endif
  53862. "stm %[r]!, {r3, r4}\n\t"
  53863. "ldm %[b]!, {r5, r6}\n\t"
  53864. "ldm %[a]!, {r3, r4}\n\t"
  53865. #ifdef WOLFSSL_KEIL
  53866. "adcs r3, r3, r5\n\t"
  53867. #elif defined(__clang__)
  53868. "adcs r3, r5\n\t"
  53869. #else
  53870. "adc r3, r5\n\t"
  53871. #endif
  53872. #ifdef WOLFSSL_KEIL
  53873. "adcs r4, r4, r6\n\t"
  53874. #elif defined(__clang__)
  53875. "adcs r4, r6\n\t"
  53876. #else
  53877. "adc r4, r6\n\t"
  53878. #endif
  53879. "stm %[r]!, {r3, r4}\n\t"
  53880. "ldm %[b]!, {r5, r6}\n\t"
  53881. "ldm %[a]!, {r3, r4}\n\t"
  53882. #ifdef WOLFSSL_KEIL
  53883. "adcs r3, r3, r5\n\t"
  53884. #elif defined(__clang__)
  53885. "adcs r3, r5\n\t"
  53886. #else
  53887. "adc r3, r5\n\t"
  53888. #endif
  53889. #ifdef WOLFSSL_KEIL
  53890. "adcs r4, r4, r6\n\t"
  53891. #elif defined(__clang__)
  53892. "adcs r4, r6\n\t"
  53893. #else
  53894. "adc r4, r6\n\t"
  53895. #endif
  53896. "stm %[r]!, {r3, r4}\n\t"
  53897. "ldm %[b]!, {r5, r6}\n\t"
  53898. "ldm %[a]!, {r3, r4}\n\t"
  53899. #ifdef WOLFSSL_KEIL
  53900. "adcs r3, r3, r5\n\t"
  53901. #elif defined(__clang__)
  53902. "adcs r3, r5\n\t"
  53903. #else
  53904. "adc r3, r5\n\t"
  53905. #endif
  53906. #ifdef WOLFSSL_KEIL
  53907. "adcs r4, r4, r6\n\t"
  53908. #elif defined(__clang__)
  53909. "adcs r4, r6\n\t"
  53910. #else
  53911. "adc r4, r6\n\t"
  53912. #endif
  53913. "stm %[r]!, {r3, r4}\n\t"
  53914. "ldm %[b]!, {r5, r6}\n\t"
  53915. "ldm %[a]!, {r3, r4}\n\t"
  53916. #ifdef WOLFSSL_KEIL
  53917. "adcs r3, r3, r5\n\t"
  53918. #elif defined(__clang__)
  53919. "adcs r3, r5\n\t"
  53920. #else
  53921. "adc r3, r5\n\t"
  53922. #endif
  53923. #ifdef WOLFSSL_KEIL
  53924. "adcs r4, r4, r6\n\t"
  53925. #elif defined(__clang__)
  53926. "adcs r4, r6\n\t"
  53927. #else
  53928. "adc r4, r6\n\t"
  53929. #endif
  53930. "stm %[r]!, {r3, r4}\n\t"
  53931. "ldm %[b]!, {r5, r6}\n\t"
  53932. "ldm %[a]!, {r3, r4}\n\t"
  53933. #ifdef WOLFSSL_KEIL
  53934. "adcs r3, r3, r5\n\t"
  53935. #elif defined(__clang__)
  53936. "adcs r3, r5\n\t"
  53937. #else
  53938. "adc r3, r5\n\t"
  53939. #endif
  53940. #ifdef WOLFSSL_KEIL
  53941. "adcs r4, r4, r6\n\t"
  53942. #elif defined(__clang__)
  53943. "adcs r4, r6\n\t"
  53944. #else
  53945. "adc r4, r6\n\t"
  53946. #endif
  53947. "stm %[r]!, {r3, r4}\n\t"
  53948. "ldm %[b]!, {r5, r6}\n\t"
  53949. "ldm %[a]!, {r3, r4}\n\t"
  53950. #ifdef WOLFSSL_KEIL
  53951. "adcs r3, r3, r5\n\t"
  53952. #elif defined(__clang__)
  53953. "adcs r3, r5\n\t"
  53954. #else
  53955. "adc r3, r5\n\t"
  53956. #endif
  53957. #ifdef WOLFSSL_KEIL
  53958. "adcs r4, r4, r6\n\t"
  53959. #elif defined(__clang__)
  53960. "adcs r4, r6\n\t"
  53961. #else
  53962. "adc r4, r6\n\t"
  53963. #endif
  53964. "stm %[r]!, {r3, r4}\n\t"
  53965. "ldm %[b]!, {r5, r6}\n\t"
  53966. "ldm %[a]!, {r3, r4}\n\t"
  53967. #ifdef WOLFSSL_KEIL
  53968. "adcs r3, r3, r5\n\t"
  53969. #elif defined(__clang__)
  53970. "adcs r3, r5\n\t"
  53971. #else
  53972. "adc r3, r5\n\t"
  53973. #endif
  53974. #ifdef WOLFSSL_KEIL
  53975. "adcs r4, r4, r6\n\t"
  53976. #elif defined(__clang__)
  53977. "adcs r4, r6\n\t"
  53978. #else
  53979. "adc r4, r6\n\t"
  53980. #endif
  53981. "stm %[r]!, {r3, r4}\n\t"
  53982. "ldm %[b]!, {r5, r6}\n\t"
  53983. "ldm %[a]!, {r3, r4}\n\t"
  53984. #ifdef WOLFSSL_KEIL
  53985. "adcs r3, r3, r5\n\t"
  53986. #elif defined(__clang__)
  53987. "adcs r3, r5\n\t"
  53988. #else
  53989. "adc r3, r5\n\t"
  53990. #endif
  53991. #ifdef WOLFSSL_KEIL
  53992. "adcs r4, r4, r6\n\t"
  53993. #elif defined(__clang__)
  53994. "adcs r4, r6\n\t"
  53995. #else
  53996. "adc r4, r6\n\t"
  53997. #endif
  53998. "stm %[r]!, {r3, r4}\n\t"
  53999. "ldm %[b]!, {r5, r6}\n\t"
  54000. "ldm %[a]!, {r3, r4}\n\t"
  54001. #ifdef WOLFSSL_KEIL
  54002. "adcs r3, r3, r5\n\t"
  54003. #elif defined(__clang__)
  54004. "adcs r3, r5\n\t"
  54005. #else
  54006. "adc r3, r5\n\t"
  54007. #endif
  54008. #ifdef WOLFSSL_KEIL
  54009. "adcs r4, r4, r6\n\t"
  54010. #elif defined(__clang__)
  54011. "adcs r4, r6\n\t"
  54012. #else
  54013. "adc r4, r6\n\t"
  54014. #endif
  54015. "stm %[r]!, {r3, r4}\n\t"
  54016. "ldm %[b]!, {r5, r6}\n\t"
  54017. "ldm %[a]!, {r3, r4}\n\t"
  54018. #ifdef WOLFSSL_KEIL
  54019. "adcs r3, r3, r5\n\t"
  54020. #elif defined(__clang__)
  54021. "adcs r3, r5\n\t"
  54022. #else
  54023. "adc r3, r5\n\t"
  54024. #endif
  54025. #ifdef WOLFSSL_KEIL
  54026. "adcs r4, r4, r6\n\t"
  54027. #elif defined(__clang__)
  54028. "adcs r4, r6\n\t"
  54029. #else
  54030. "adc r4, r6\n\t"
  54031. #endif
  54032. "stm %[r]!, {r3, r4}\n\t"
  54033. "ldm %[b]!, {r5, r6}\n\t"
  54034. "ldm %[a]!, {r3, r4}\n\t"
  54035. #ifdef WOLFSSL_KEIL
  54036. "adcs r3, r3, r5\n\t"
  54037. #elif defined(__clang__)
  54038. "adcs r3, r5\n\t"
  54039. #else
  54040. "adc r3, r5\n\t"
  54041. #endif
  54042. #ifdef WOLFSSL_KEIL
  54043. "adcs r4, r4, r6\n\t"
  54044. #elif defined(__clang__)
  54045. "adcs r4, r6\n\t"
  54046. #else
  54047. "adc r4, r6\n\t"
  54048. #endif
  54049. "stm %[r]!, {r3, r4}\n\t"
  54050. "ldm %[b]!, {r5, r6}\n\t"
  54051. "ldm %[a]!, {r3, r4}\n\t"
  54052. #ifdef WOLFSSL_KEIL
  54053. "adcs r3, r3, r5\n\t"
  54054. #elif defined(__clang__)
  54055. "adcs r3, r5\n\t"
  54056. #else
  54057. "adc r3, r5\n\t"
  54058. #endif
  54059. #ifdef WOLFSSL_KEIL
  54060. "adcs r4, r4, r6\n\t"
  54061. #elif defined(__clang__)
  54062. "adcs r4, r6\n\t"
  54063. #else
  54064. "adc r4, r6\n\t"
  54065. #endif
  54066. "stm %[r]!, {r3, r4}\n\t"
  54067. "ldm %[b]!, {r5, r6}\n\t"
  54068. "ldm %[a]!, {r3, r4}\n\t"
  54069. #ifdef WOLFSSL_KEIL
  54070. "adcs r3, r3, r5\n\t"
  54071. #elif defined(__clang__)
  54072. "adcs r3, r5\n\t"
  54073. #else
  54074. "adc r3, r5\n\t"
  54075. #endif
  54076. #ifdef WOLFSSL_KEIL
  54077. "adcs r4, r4, r6\n\t"
  54078. #elif defined(__clang__)
  54079. "adcs r4, r6\n\t"
  54080. #else
  54081. "adc r4, r6\n\t"
  54082. #endif
  54083. "stm %[r]!, {r3, r4}\n\t"
  54084. "ldm %[b]!, {r5, r6}\n\t"
  54085. "ldm %[a]!, {r3, r4}\n\t"
  54086. #ifdef WOLFSSL_KEIL
  54087. "adcs r3, r3, r5\n\t"
  54088. #elif defined(__clang__)
  54089. "adcs r3, r5\n\t"
  54090. #else
  54091. "adc r3, r5\n\t"
  54092. #endif
  54093. #ifdef WOLFSSL_KEIL
  54094. "adcs r4, r4, r6\n\t"
  54095. #elif defined(__clang__)
  54096. "adcs r4, r6\n\t"
  54097. #else
  54098. "adc r4, r6\n\t"
  54099. #endif
  54100. "stm %[r]!, {r3, r4}\n\t"
  54101. "ldm %[b]!, {r5, r6}\n\t"
  54102. "ldm %[a]!, {r3, r4}\n\t"
  54103. #ifdef WOLFSSL_KEIL
  54104. "adcs r3, r3, r5\n\t"
  54105. #elif defined(__clang__)
  54106. "adcs r3, r5\n\t"
  54107. #else
  54108. "adc r3, r5\n\t"
  54109. #endif
  54110. #ifdef WOLFSSL_KEIL
  54111. "adcs r4, r4, r6\n\t"
  54112. #elif defined(__clang__)
  54113. "adcs r4, r6\n\t"
  54114. #else
  54115. "adc r4, r6\n\t"
  54116. #endif
  54117. "stm %[r]!, {r3, r4}\n\t"
  54118. "ldm %[b]!, {r5, r6}\n\t"
  54119. "ldm %[a]!, {r3, r4}\n\t"
  54120. #ifdef WOLFSSL_KEIL
  54121. "adcs r3, r3, r5\n\t"
  54122. #elif defined(__clang__)
  54123. "adcs r3, r5\n\t"
  54124. #else
  54125. "adc r3, r5\n\t"
  54126. #endif
  54127. #ifdef WOLFSSL_KEIL
  54128. "adcs r4, r4, r6\n\t"
  54129. #elif defined(__clang__)
  54130. "adcs r4, r6\n\t"
  54131. #else
  54132. "adc r4, r6\n\t"
  54133. #endif
  54134. "stm %[r]!, {r3, r4}\n\t"
  54135. "ldm %[b]!, {r5, r6}\n\t"
  54136. "ldm %[a]!, {r3, r4}\n\t"
  54137. #ifdef WOLFSSL_KEIL
  54138. "adcs r3, r3, r5\n\t"
  54139. #elif defined(__clang__)
  54140. "adcs r3, r5\n\t"
  54141. #else
  54142. "adc r3, r5\n\t"
  54143. #endif
  54144. #ifdef WOLFSSL_KEIL
  54145. "adcs r4, r4, r6\n\t"
  54146. #elif defined(__clang__)
  54147. "adcs r4, r6\n\t"
  54148. #else
  54149. "adc r4, r6\n\t"
  54150. #endif
  54151. "stm %[r]!, {r3, r4}\n\t"
  54152. "ldm %[b]!, {r5, r6}\n\t"
  54153. "ldm %[a]!, {r3, r4}\n\t"
  54154. #ifdef WOLFSSL_KEIL
  54155. "adcs r3, r3, r5\n\t"
  54156. #elif defined(__clang__)
  54157. "adcs r3, r5\n\t"
  54158. #else
  54159. "adc r3, r5\n\t"
  54160. #endif
  54161. #ifdef WOLFSSL_KEIL
  54162. "adcs r4, r4, r6\n\t"
  54163. #elif defined(__clang__)
  54164. "adcs r4, r6\n\t"
  54165. #else
  54166. "adc r4, r6\n\t"
  54167. #endif
  54168. "stm %[r]!, {r3, r4}\n\t"
  54169. "ldm %[b]!, {r5, r6}\n\t"
  54170. "ldm %[a]!, {r3, r4}\n\t"
  54171. #ifdef WOLFSSL_KEIL
  54172. "adcs r3, r3, r5\n\t"
  54173. #elif defined(__clang__)
  54174. "adcs r3, r5\n\t"
  54175. #else
  54176. "adc r3, r5\n\t"
  54177. #endif
  54178. #ifdef WOLFSSL_KEIL
  54179. "adcs r4, r4, r6\n\t"
  54180. #elif defined(__clang__)
  54181. "adcs r4, r6\n\t"
  54182. #else
  54183. "adc r4, r6\n\t"
  54184. #endif
  54185. "stm %[r]!, {r3, r4}\n\t"
  54186. "ldm %[b]!, {r5, r6}\n\t"
  54187. "ldm %[a]!, {r3, r4}\n\t"
  54188. #ifdef WOLFSSL_KEIL
  54189. "adcs r3, r3, r5\n\t"
  54190. #elif defined(__clang__)
  54191. "adcs r3, r5\n\t"
  54192. #else
  54193. "adc r3, r5\n\t"
  54194. #endif
  54195. #ifdef WOLFSSL_KEIL
  54196. "adcs r4, r4, r6\n\t"
  54197. #elif defined(__clang__)
  54198. "adcs r4, r6\n\t"
  54199. #else
  54200. "adc r4, r6\n\t"
  54201. #endif
  54202. "stm %[r]!, {r3, r4}\n\t"
  54203. "ldm %[b]!, {r5, r6}\n\t"
  54204. "ldm %[a]!, {r3, r4}\n\t"
  54205. #ifdef WOLFSSL_KEIL
  54206. "adcs r3, r3, r5\n\t"
  54207. #elif defined(__clang__)
  54208. "adcs r3, r5\n\t"
  54209. #else
  54210. "adc r3, r5\n\t"
  54211. #endif
  54212. #ifdef WOLFSSL_KEIL
  54213. "adcs r4, r4, r6\n\t"
  54214. #elif defined(__clang__)
  54215. "adcs r4, r6\n\t"
  54216. #else
  54217. "adc r4, r6\n\t"
  54218. #endif
  54219. "stm %[r]!, {r3, r4}\n\t"
  54220. "ldm %[b]!, {r5, r6}\n\t"
  54221. "ldm %[a]!, {r3, r4}\n\t"
  54222. #ifdef WOLFSSL_KEIL
  54223. "adcs r3, r3, r5\n\t"
  54224. #elif defined(__clang__)
  54225. "adcs r3, r5\n\t"
  54226. #else
  54227. "adc r3, r5\n\t"
  54228. #endif
  54229. #ifdef WOLFSSL_KEIL
  54230. "adcs r4, r4, r6\n\t"
  54231. #elif defined(__clang__)
  54232. "adcs r4, r6\n\t"
  54233. #else
  54234. "adc r4, r6\n\t"
  54235. #endif
  54236. "stm %[r]!, {r3, r4}\n\t"
  54237. "ldm %[b]!, {r5, r6}\n\t"
  54238. "ldm %[a]!, {r3, r4}\n\t"
  54239. #ifdef WOLFSSL_KEIL
  54240. "adcs r3, r3, r5\n\t"
  54241. #elif defined(__clang__)
  54242. "adcs r3, r5\n\t"
  54243. #else
  54244. "adc r3, r5\n\t"
  54245. #endif
  54246. #ifdef WOLFSSL_KEIL
  54247. "adcs r4, r4, r6\n\t"
  54248. #elif defined(__clang__)
  54249. "adcs r4, r6\n\t"
  54250. #else
  54251. "adc r4, r6\n\t"
  54252. #endif
  54253. "stm %[r]!, {r3, r4}\n\t"
  54254. "ldm %[b]!, {r5, r6}\n\t"
  54255. "ldm %[a]!, {r3, r4}\n\t"
  54256. #ifdef WOLFSSL_KEIL
  54257. "adcs r3, r3, r5\n\t"
  54258. #elif defined(__clang__)
  54259. "adcs r3, r5\n\t"
  54260. #else
  54261. "adc r3, r5\n\t"
  54262. #endif
  54263. #ifdef WOLFSSL_KEIL
  54264. "adcs r4, r4, r6\n\t"
  54265. #elif defined(__clang__)
  54266. "adcs r4, r6\n\t"
  54267. #else
  54268. "adc r4, r6\n\t"
  54269. #endif
  54270. "stm %[r]!, {r3, r4}\n\t"
  54271. "ldm %[b]!, {r5, r6}\n\t"
  54272. "ldm %[a]!, {r3, r4}\n\t"
  54273. #ifdef WOLFSSL_KEIL
  54274. "adcs r3, r3, r5\n\t"
  54275. #elif defined(__clang__)
  54276. "adcs r3, r5\n\t"
  54277. #else
  54278. "adc r3, r5\n\t"
  54279. #endif
  54280. #ifdef WOLFSSL_KEIL
  54281. "adcs r4, r4, r6\n\t"
  54282. #elif defined(__clang__)
  54283. "adcs r4, r6\n\t"
  54284. #else
  54285. "adc r4, r6\n\t"
  54286. #endif
  54287. "stm %[r]!, {r3, r4}\n\t"
  54288. "ldm %[b]!, {r5, r6}\n\t"
  54289. "ldm %[a]!, {r3, r4}\n\t"
  54290. #ifdef WOLFSSL_KEIL
  54291. "adcs r3, r3, r5\n\t"
  54292. #elif defined(__clang__)
  54293. "adcs r3, r5\n\t"
  54294. #else
  54295. "adc r3, r5\n\t"
  54296. #endif
  54297. #ifdef WOLFSSL_KEIL
  54298. "adcs r4, r4, r6\n\t"
  54299. #elif defined(__clang__)
  54300. "adcs r4, r6\n\t"
  54301. #else
  54302. "adc r4, r6\n\t"
  54303. #endif
  54304. "stm %[r]!, {r3, r4}\n\t"
  54305. "ldm %[b]!, {r5, r6}\n\t"
  54306. "ldm %[a]!, {r3, r4}\n\t"
  54307. #ifdef WOLFSSL_KEIL
  54308. "adcs r3, r3, r5\n\t"
  54309. #elif defined(__clang__)
  54310. "adcs r3, r5\n\t"
  54311. #else
  54312. "adc r3, r5\n\t"
  54313. #endif
  54314. #ifdef WOLFSSL_KEIL
  54315. "adcs r4, r4, r6\n\t"
  54316. #elif defined(__clang__)
  54317. "adcs r4, r6\n\t"
  54318. #else
  54319. "adc r4, r6\n\t"
  54320. #endif
  54321. "stm %[r]!, {r3, r4}\n\t"
  54322. "ldm %[b]!, {r5, r6}\n\t"
  54323. "ldm %[a]!, {r3, r4}\n\t"
  54324. #ifdef WOLFSSL_KEIL
  54325. "adcs r3, r3, r5\n\t"
  54326. #elif defined(__clang__)
  54327. "adcs r3, r5\n\t"
  54328. #else
  54329. "adc r3, r5\n\t"
  54330. #endif
  54331. #ifdef WOLFSSL_KEIL
  54332. "adcs r4, r4, r6\n\t"
  54333. #elif defined(__clang__)
  54334. "adcs r4, r6\n\t"
  54335. #else
  54336. "adc r4, r6\n\t"
  54337. #endif
  54338. "stm %[r]!, {r3, r4}\n\t"
  54339. "ldm %[b]!, {r5, r6}\n\t"
  54340. "ldm %[a]!, {r3, r4}\n\t"
  54341. #ifdef WOLFSSL_KEIL
  54342. "adcs r3, r3, r5\n\t"
  54343. #elif defined(__clang__)
  54344. "adcs r3, r5\n\t"
  54345. #else
  54346. "adc r3, r5\n\t"
  54347. #endif
  54348. #ifdef WOLFSSL_KEIL
  54349. "adcs r4, r4, r6\n\t"
  54350. #elif defined(__clang__)
  54351. "adcs r4, r6\n\t"
  54352. #else
  54353. "adc r4, r6\n\t"
  54354. #endif
  54355. "stm %[r]!, {r3, r4}\n\t"
  54356. "ldm %[b]!, {r5, r6}\n\t"
  54357. "ldm %[a]!, {r3, r4}\n\t"
  54358. #ifdef WOLFSSL_KEIL
  54359. "adcs r3, r3, r5\n\t"
  54360. #elif defined(__clang__)
  54361. "adcs r3, r5\n\t"
  54362. #else
  54363. "adc r3, r5\n\t"
  54364. #endif
  54365. #ifdef WOLFSSL_KEIL
  54366. "adcs r4, r4, r6\n\t"
  54367. #elif defined(__clang__)
  54368. "adcs r4, r6\n\t"
  54369. #else
  54370. "adc r4, r6\n\t"
  54371. #endif
  54372. "stm %[r]!, {r3, r4}\n\t"
  54373. "ldm %[b]!, {r5, r6}\n\t"
  54374. "ldm %[a]!, {r3, r4}\n\t"
  54375. #ifdef WOLFSSL_KEIL
  54376. "adcs r3, r3, r5\n\t"
  54377. #elif defined(__clang__)
  54378. "adcs r3, r5\n\t"
  54379. #else
  54380. "adc r3, r5\n\t"
  54381. #endif
  54382. #ifdef WOLFSSL_KEIL
  54383. "adcs r4, r4, r6\n\t"
  54384. #elif defined(__clang__)
  54385. "adcs r4, r6\n\t"
  54386. #else
  54387. "adc r4, r6\n\t"
  54388. #endif
  54389. "stm %[r]!, {r3, r4}\n\t"
  54390. "ldm %[b]!, {r5, r6}\n\t"
  54391. "ldm %[a]!, {r3, r4}\n\t"
  54392. #ifdef WOLFSSL_KEIL
  54393. "adcs r3, r3, r5\n\t"
  54394. #elif defined(__clang__)
  54395. "adcs r3, r5\n\t"
  54396. #else
  54397. "adc r3, r5\n\t"
  54398. #endif
  54399. #ifdef WOLFSSL_KEIL
  54400. "adcs r4, r4, r6\n\t"
  54401. #elif defined(__clang__)
  54402. "adcs r4, r6\n\t"
  54403. #else
  54404. "adc r4, r6\n\t"
  54405. #endif
  54406. "stm %[r]!, {r3, r4}\n\t"
  54407. "ldm %[b]!, {r5, r6}\n\t"
  54408. "ldm %[a]!, {r3, r4}\n\t"
  54409. #ifdef WOLFSSL_KEIL
  54410. "adcs r3, r3, r5\n\t"
  54411. #elif defined(__clang__)
  54412. "adcs r3, r5\n\t"
  54413. #else
  54414. "adc r3, r5\n\t"
  54415. #endif
  54416. #ifdef WOLFSSL_KEIL
  54417. "adcs r4, r4, r6\n\t"
  54418. #elif defined(__clang__)
  54419. "adcs r4, r6\n\t"
  54420. #else
  54421. "adc r4, r6\n\t"
  54422. #endif
  54423. "stm %[r]!, {r3, r4}\n\t"
  54424. "ldm %[b]!, {r5, r6}\n\t"
  54425. "ldm %[a]!, {r3, r4}\n\t"
  54426. #ifdef WOLFSSL_KEIL
  54427. "adcs r3, r3, r5\n\t"
  54428. #elif defined(__clang__)
  54429. "adcs r3, r5\n\t"
  54430. #else
  54431. "adc r3, r5\n\t"
  54432. #endif
  54433. #ifdef WOLFSSL_KEIL
  54434. "adcs r4, r4, r6\n\t"
  54435. #elif defined(__clang__)
  54436. "adcs r4, r6\n\t"
  54437. #else
  54438. "adc r4, r6\n\t"
  54439. #endif
  54440. "stm %[r]!, {r3, r4}\n\t"
  54441. "ldm %[b]!, {r5, r6}\n\t"
  54442. "ldm %[a]!, {r3, r4}\n\t"
  54443. #ifdef WOLFSSL_KEIL
  54444. "adcs r3, r3, r5\n\t"
  54445. #elif defined(__clang__)
  54446. "adcs r3, r5\n\t"
  54447. #else
  54448. "adc r3, r5\n\t"
  54449. #endif
  54450. #ifdef WOLFSSL_KEIL
  54451. "adcs r4, r4, r6\n\t"
  54452. #elif defined(__clang__)
  54453. "adcs r4, r6\n\t"
  54454. #else
  54455. "adc r4, r6\n\t"
  54456. #endif
  54457. "stm %[r]!, {r3, r4}\n\t"
  54458. "ldm %[b]!, {r5, r6}\n\t"
  54459. "ldm %[a]!, {r3, r4}\n\t"
  54460. #ifdef WOLFSSL_KEIL
  54461. "adcs r3, r3, r5\n\t"
  54462. #elif defined(__clang__)
  54463. "adcs r3, r5\n\t"
  54464. #else
  54465. "adc r3, r5\n\t"
  54466. #endif
  54467. #ifdef WOLFSSL_KEIL
  54468. "adcs r4, r4, r6\n\t"
  54469. #elif defined(__clang__)
  54470. "adcs r4, r6\n\t"
  54471. #else
  54472. "adc r4, r6\n\t"
  54473. #endif
  54474. "stm %[r]!, {r3, r4}\n\t"
  54475. "ldm %[b]!, {r5, r6}\n\t"
  54476. "ldm %[a]!, {r3, r4}\n\t"
  54477. #ifdef WOLFSSL_KEIL
  54478. "adcs r3, r3, r5\n\t"
  54479. #elif defined(__clang__)
  54480. "adcs r3, r5\n\t"
  54481. #else
  54482. "adc r3, r5\n\t"
  54483. #endif
  54484. #ifdef WOLFSSL_KEIL
  54485. "adcs r4, r4, r6\n\t"
  54486. #elif defined(__clang__)
  54487. "adcs r4, r6\n\t"
  54488. #else
  54489. "adc r4, r6\n\t"
  54490. #endif
  54491. "stm %[r]!, {r3, r4}\n\t"
  54492. "ldm %[b]!, {r5, r6}\n\t"
  54493. "ldm %[a]!, {r3, r4}\n\t"
  54494. #ifdef WOLFSSL_KEIL
  54495. "adcs r3, r3, r5\n\t"
  54496. #elif defined(__clang__)
  54497. "adcs r3, r5\n\t"
  54498. #else
  54499. "adc r3, r5\n\t"
  54500. #endif
  54501. #ifdef WOLFSSL_KEIL
  54502. "adcs r4, r4, r6\n\t"
  54503. #elif defined(__clang__)
  54504. "adcs r4, r6\n\t"
  54505. #else
  54506. "adc r4, r6\n\t"
  54507. #endif
  54508. "stm %[r]!, {r3, r4}\n\t"
  54509. "ldm %[b]!, {r5, r6}\n\t"
  54510. "ldm %[a]!, {r3, r4}\n\t"
  54511. #ifdef WOLFSSL_KEIL
  54512. "adcs r3, r3, r5\n\t"
  54513. #elif defined(__clang__)
  54514. "adcs r3, r5\n\t"
  54515. #else
  54516. "adc r3, r5\n\t"
  54517. #endif
  54518. #ifdef WOLFSSL_KEIL
  54519. "adcs r4, r4, r6\n\t"
  54520. #elif defined(__clang__)
  54521. "adcs r4, r6\n\t"
  54522. #else
  54523. "adc r4, r6\n\t"
  54524. #endif
  54525. "stm %[r]!, {r3, r4}\n\t"
  54526. "ldm %[b]!, {r5, r6}\n\t"
  54527. "ldm %[a]!, {r3, r4}\n\t"
  54528. #ifdef WOLFSSL_KEIL
  54529. "adcs r3, r3, r5\n\t"
  54530. #elif defined(__clang__)
  54531. "adcs r3, r5\n\t"
  54532. #else
  54533. "adc r3, r5\n\t"
  54534. #endif
  54535. #ifdef WOLFSSL_KEIL
  54536. "adcs r4, r4, r6\n\t"
  54537. #elif defined(__clang__)
  54538. "adcs r4, r6\n\t"
  54539. #else
  54540. "adc r4, r6\n\t"
  54541. #endif
  54542. "stm %[r]!, {r3, r4}\n\t"
  54543. "ldm %[b]!, {r5, r6}\n\t"
  54544. "ldm %[a]!, {r3, r4}\n\t"
  54545. #ifdef WOLFSSL_KEIL
  54546. "adcs r3, r3, r5\n\t"
  54547. #elif defined(__clang__)
  54548. "adcs r3, r5\n\t"
  54549. #else
  54550. "adc r3, r5\n\t"
  54551. #endif
  54552. #ifdef WOLFSSL_KEIL
  54553. "adcs r4, r4, r6\n\t"
  54554. #elif defined(__clang__)
  54555. "adcs r4, r6\n\t"
  54556. #else
  54557. "adc r4, r6\n\t"
  54558. #endif
  54559. "stm %[r]!, {r3, r4}\n\t"
  54560. "ldm %[b]!, {r5, r6}\n\t"
  54561. "ldm %[a]!, {r3, r4}\n\t"
  54562. #ifdef WOLFSSL_KEIL
  54563. "adcs r3, r3, r5\n\t"
  54564. #elif defined(__clang__)
  54565. "adcs r3, r5\n\t"
  54566. #else
  54567. "adc r3, r5\n\t"
  54568. #endif
  54569. #ifdef WOLFSSL_KEIL
  54570. "adcs r4, r4, r6\n\t"
  54571. #elif defined(__clang__)
  54572. "adcs r4, r6\n\t"
  54573. #else
  54574. "adc r4, r6\n\t"
  54575. #endif
  54576. "stm %[r]!, {r3, r4}\n\t"
  54577. "ldm %[b]!, {r5, r6}\n\t"
  54578. "ldm %[a]!, {r3, r4}\n\t"
  54579. #ifdef WOLFSSL_KEIL
  54580. "adcs r3, r3, r5\n\t"
  54581. #elif defined(__clang__)
  54582. "adcs r3, r5\n\t"
  54583. #else
  54584. "adc r3, r5\n\t"
  54585. #endif
  54586. #ifdef WOLFSSL_KEIL
  54587. "adcs r4, r4, r6\n\t"
  54588. #elif defined(__clang__)
  54589. "adcs r4, r6\n\t"
  54590. #else
  54591. "adc r4, r6\n\t"
  54592. #endif
  54593. "stm %[r]!, {r3, r4}\n\t"
  54594. "movs %[r], #0\n\t"
  54595. #ifdef WOLFSSL_KEIL
  54596. "adcs %[r], %[r], %[r]\n\t"
  54597. #elif defined(__clang__)
  54598. "adcs %[r], %[r]\n\t"
  54599. #else
  54600. "adc %[r], %[r]\n\t"
  54601. #endif
  54602. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  54603. :
  54604. : "memory", "r3", "r4", "r5", "r6"
  54605. );
  54606. return (uint32_t)(size_t)r;
  54607. }
  54608. /* AND m into each word of a and store in r.
  54609. *
  54610. * r A single precision integer.
  54611. * a A single precision integer.
  54612. * m Mask to AND against each digit.
  54613. */
  54614. static void sp_3072_mask_48(sp_digit* r, const sp_digit* a, sp_digit m)
  54615. {
  54616. #ifdef WOLFSSL_SP_SMALL
  54617. int i;
  54618. for (i=0; i<48; i++) {
  54619. r[i] = a[i] & m;
  54620. }
  54621. #else
  54622. int i;
  54623. for (i = 0; i < 48; i += 8) {
  54624. r[i+0] = a[i+0] & m;
  54625. r[i+1] = a[i+1] & m;
  54626. r[i+2] = a[i+2] & m;
  54627. r[i+3] = a[i+3] & m;
  54628. r[i+4] = a[i+4] & m;
  54629. r[i+5] = a[i+5] & m;
  54630. r[i+6] = a[i+6] & m;
  54631. r[i+7] = a[i+7] & m;
  54632. }
  54633. #endif
  54634. }
  54635. /* Multiply a and b into r. (r = a * b)
  54636. *
  54637. * r A single precision integer.
  54638. * a A single precision integer.
  54639. * b A single precision integer.
  54640. */
  54641. SP_NOINLINE static void sp_3072_mul_96(sp_digit* r, const sp_digit* a,
  54642. const sp_digit* b)
  54643. {
  54644. sp_digit* z0 = r;
  54645. sp_digit z1[96];
  54646. sp_digit a1[48];
  54647. sp_digit b1[48];
  54648. sp_digit* z2 = r + 96;
  54649. sp_digit u;
  54650. sp_digit ca;
  54651. sp_digit cb;
  54652. ca = sp_3072_add_48(a1, a, &a[48]);
  54653. cb = sp_3072_add_48(b1, b, &b[48]);
  54654. u = ca & cb;
  54655. sp_3072_mul_48(z2, &a[48], &b[48]);
  54656. sp_3072_mul_48(z0, a, b);
  54657. sp_3072_mul_48(z1, a1, b1);
  54658. u += sp_3072_sub_in_place_96(z1, z0);
  54659. u += sp_3072_sub_in_place_96(z1, z2);
  54660. sp_3072_mask_48(a1, a1, 0 - cb);
  54661. u += sp_3072_add_48(z1 + 48, z1 + 48, a1);
  54662. sp_3072_mask_48(b1, b1, 0 - ca);
  54663. u += sp_3072_add_48(z1 + 48, z1 + 48, b1);
  54664. u += sp_3072_add_96(r + 48, r + 48, z1);
  54665. (void)sp_3072_add_word_48(r + 144, r + 144, u);
  54666. }
  54667. #ifndef WOLFSSL_SP_LARGE_CODE
  54668. /* Square a and put result in r. (r = a * a)
  54669. *
  54670. * r A single precision integer.
  54671. * a A single precision integer.
  54672. */
  54673. SP_NOINLINE static void sp_3072_sqr_12(sp_digit* r, const sp_digit* a)
  54674. {
  54675. __asm__ __volatile__ (
  54676. "movs r3, #0\n\t"
  54677. "movs r4, #0\n\t"
  54678. "movs r5, #0\n\t"
  54679. "mov r8, r3\n\t"
  54680. "mov r11, %[r]\n\t"
  54681. "movs r6, #0x60\n\t"
  54682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54683. "negs r6, r6\n\t"
  54684. #else
  54685. "neg r6, r6\n\t"
  54686. #endif
  54687. "add sp, sp, r6\n\t"
  54688. "mov r10, sp\n\t"
  54689. "mov r9, %[a]\n\t"
  54690. "\n"
  54691. "L_sp_3072_sqr_12_words_%=:\n\t"
  54692. "movs %[r], #0\n\t"
  54693. "movs r6, #44\n\t"
  54694. "mov %[a], r8\n\t"
  54695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54696. "subs %[a], %[a], r6\n\t"
  54697. #else
  54698. "sub %[a], %[a], r6\n\t"
  54699. #endif
  54700. #ifdef WOLFSSL_KEIL
  54701. "sbcs r6, r6, r6\n\t"
  54702. #elif defined(__clang__)
  54703. "sbcs r6, r6\n\t"
  54704. #else
  54705. "sbc r6, r6\n\t"
  54706. #endif
  54707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54708. "mvns r6, r6\n\t"
  54709. #else
  54710. "mvn r6, r6\n\t"
  54711. #endif
  54712. #ifdef WOLFSSL_KEIL
  54713. "ands %[a], %[a], r6\n\t"
  54714. #elif defined(__clang__)
  54715. "ands %[a], r6\n\t"
  54716. #else
  54717. "and %[a], r6\n\t"
  54718. #endif
  54719. "mov r2, r8\n\t"
  54720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54721. "subs r2, r2, %[a]\n\t"
  54722. #else
  54723. "sub r2, r2, %[a]\n\t"
  54724. #endif
  54725. "add %[a], %[a], r9\n\t"
  54726. "add r2, r2, r9\n\t"
  54727. "\n"
  54728. "L_sp_3072_sqr_12_mul_%=:\n\t"
  54729. "cmp r2, %[a]\n\t"
  54730. "beq L_sp_3072_sqr_12_sqr_%=\n\t"
  54731. "# Multiply * 2: Start\n\t"
  54732. "ldrh r6, [%[a]]\n\t"
  54733. "ldrh r7, [r2]\n\t"
  54734. #ifdef WOLFSSL_KEIL
  54735. "muls r7, r6, r7\n\t"
  54736. #elif defined(__clang__)
  54737. "muls r7, r6\n\t"
  54738. #else
  54739. "mul r7, r6\n\t"
  54740. #endif
  54741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54742. "adds r3, r3, r7\n\t"
  54743. #else
  54744. "add r3, r3, r7\n\t"
  54745. #endif
  54746. #ifdef WOLFSSL_KEIL
  54747. "adcs r4, r4, %[r]\n\t"
  54748. #elif defined(__clang__)
  54749. "adcs r4, %[r]\n\t"
  54750. #else
  54751. "adc r4, %[r]\n\t"
  54752. #endif
  54753. #ifdef WOLFSSL_KEIL
  54754. "adcs r5, r5, %[r]\n\t"
  54755. #elif defined(__clang__)
  54756. "adcs r5, %[r]\n\t"
  54757. #else
  54758. "adc r5, %[r]\n\t"
  54759. #endif
  54760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54761. "adds r3, r3, r7\n\t"
  54762. #else
  54763. "add r3, r3, r7\n\t"
  54764. #endif
  54765. #ifdef WOLFSSL_KEIL
  54766. "adcs r4, r4, %[r]\n\t"
  54767. #elif defined(__clang__)
  54768. "adcs r4, %[r]\n\t"
  54769. #else
  54770. "adc r4, %[r]\n\t"
  54771. #endif
  54772. #ifdef WOLFSSL_KEIL
  54773. "adcs r5, r5, %[r]\n\t"
  54774. #elif defined(__clang__)
  54775. "adcs r5, %[r]\n\t"
  54776. #else
  54777. "adc r5, %[r]\n\t"
  54778. #endif
  54779. "ldr r7, [r2]\n\t"
  54780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54781. "lsrs r7, r7, #16\n\t"
  54782. #else
  54783. "lsr r7, r7, #16\n\t"
  54784. #endif
  54785. #ifdef WOLFSSL_KEIL
  54786. "muls r6, r7, r6\n\t"
  54787. #elif defined(__clang__)
  54788. "muls r6, r7\n\t"
  54789. #else
  54790. "mul r6, r7\n\t"
  54791. #endif
  54792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54793. "lsrs r7, r6, #16\n\t"
  54794. #else
  54795. "lsr r7, r6, #16\n\t"
  54796. #endif
  54797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54798. "lsls r6, r6, #16\n\t"
  54799. #else
  54800. "lsl r6, r6, #16\n\t"
  54801. #endif
  54802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54803. "adds r3, r3, r6\n\t"
  54804. #else
  54805. "add r3, r3, r6\n\t"
  54806. #endif
  54807. #ifdef WOLFSSL_KEIL
  54808. "adcs r4, r4, r7\n\t"
  54809. #elif defined(__clang__)
  54810. "adcs r4, r7\n\t"
  54811. #else
  54812. "adc r4, r7\n\t"
  54813. #endif
  54814. #ifdef WOLFSSL_KEIL
  54815. "adcs r5, r5, %[r]\n\t"
  54816. #elif defined(__clang__)
  54817. "adcs r5, %[r]\n\t"
  54818. #else
  54819. "adc r5, %[r]\n\t"
  54820. #endif
  54821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54822. "adds r3, r3, r6\n\t"
  54823. #else
  54824. "add r3, r3, r6\n\t"
  54825. #endif
  54826. #ifdef WOLFSSL_KEIL
  54827. "adcs r4, r4, r7\n\t"
  54828. #elif defined(__clang__)
  54829. "adcs r4, r7\n\t"
  54830. #else
  54831. "adc r4, r7\n\t"
  54832. #endif
  54833. #ifdef WOLFSSL_KEIL
  54834. "adcs r5, r5, %[r]\n\t"
  54835. #elif defined(__clang__)
  54836. "adcs r5, %[r]\n\t"
  54837. #else
  54838. "adc r5, %[r]\n\t"
  54839. #endif
  54840. "ldr r6, [%[a]]\n\t"
  54841. "ldr r7, [r2]\n\t"
  54842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54843. "lsrs r6, r6, #16\n\t"
  54844. #else
  54845. "lsr r6, r6, #16\n\t"
  54846. #endif
  54847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54848. "lsrs r7, r7, #16\n\t"
  54849. #else
  54850. "lsr r7, r7, #16\n\t"
  54851. #endif
  54852. #ifdef WOLFSSL_KEIL
  54853. "muls r7, r6, r7\n\t"
  54854. #elif defined(__clang__)
  54855. "muls r7, r6\n\t"
  54856. #else
  54857. "mul r7, r6\n\t"
  54858. #endif
  54859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54860. "adds r4, r4, r7\n\t"
  54861. #else
  54862. "add r4, r4, r7\n\t"
  54863. #endif
  54864. #ifdef WOLFSSL_KEIL
  54865. "adcs r5, r5, %[r]\n\t"
  54866. #elif defined(__clang__)
  54867. "adcs r5, %[r]\n\t"
  54868. #else
  54869. "adc r5, %[r]\n\t"
  54870. #endif
  54871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54872. "adds r4, r4, r7\n\t"
  54873. #else
  54874. "add r4, r4, r7\n\t"
  54875. #endif
  54876. #ifdef WOLFSSL_KEIL
  54877. "adcs r5, r5, %[r]\n\t"
  54878. #elif defined(__clang__)
  54879. "adcs r5, %[r]\n\t"
  54880. #else
  54881. "adc r5, %[r]\n\t"
  54882. #endif
  54883. "ldrh r7, [r2]\n\t"
  54884. #ifdef WOLFSSL_KEIL
  54885. "muls r6, r7, r6\n\t"
  54886. #elif defined(__clang__)
  54887. "muls r6, r7\n\t"
  54888. #else
  54889. "mul r6, r7\n\t"
  54890. #endif
  54891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54892. "lsrs r7, r6, #16\n\t"
  54893. #else
  54894. "lsr r7, r6, #16\n\t"
  54895. #endif
  54896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54897. "lsls r6, r6, #16\n\t"
  54898. #else
  54899. "lsl r6, r6, #16\n\t"
  54900. #endif
  54901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54902. "adds r3, r3, r6\n\t"
  54903. #else
  54904. "add r3, r3, r6\n\t"
  54905. #endif
  54906. #ifdef WOLFSSL_KEIL
  54907. "adcs r4, r4, r7\n\t"
  54908. #elif defined(__clang__)
  54909. "adcs r4, r7\n\t"
  54910. #else
  54911. "adc r4, r7\n\t"
  54912. #endif
  54913. #ifdef WOLFSSL_KEIL
  54914. "adcs r5, r5, %[r]\n\t"
  54915. #elif defined(__clang__)
  54916. "adcs r5, %[r]\n\t"
  54917. #else
  54918. "adc r5, %[r]\n\t"
  54919. #endif
  54920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54921. "adds r3, r3, r6\n\t"
  54922. #else
  54923. "add r3, r3, r6\n\t"
  54924. #endif
  54925. #ifdef WOLFSSL_KEIL
  54926. "adcs r4, r4, r7\n\t"
  54927. #elif defined(__clang__)
  54928. "adcs r4, r7\n\t"
  54929. #else
  54930. "adc r4, r7\n\t"
  54931. #endif
  54932. #ifdef WOLFSSL_KEIL
  54933. "adcs r5, r5, %[r]\n\t"
  54934. #elif defined(__clang__)
  54935. "adcs r5, %[r]\n\t"
  54936. #else
  54937. "adc r5, %[r]\n\t"
  54938. #endif
  54939. "# Multiply * 2: Done\n\t"
  54940. "bal L_sp_3072_sqr_12_done_sqr_%=\n\t"
  54941. "\n"
  54942. "L_sp_3072_sqr_12_sqr_%=:\n\t"
  54943. "mov r12, r2\n\t"
  54944. "ldr r2, [%[a]]\n\t"
  54945. "# Square: Start\n\t"
  54946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54947. "lsrs r7, r2, #16\n\t"
  54948. #else
  54949. "lsr r7, r2, #16\n\t"
  54950. #endif
  54951. "uxth r6, r2\n\t"
  54952. #ifdef WOLFSSL_KEIL
  54953. "muls r6, r6, r6\n\t"
  54954. #elif defined(__clang__)
  54955. "muls r6, r6\n\t"
  54956. #else
  54957. "mul r6, r6\n\t"
  54958. #endif
  54959. #ifdef WOLFSSL_KEIL
  54960. "muls r7, r7, r7\n\t"
  54961. #elif defined(__clang__)
  54962. "muls r7, r7\n\t"
  54963. #else
  54964. "mul r7, r7\n\t"
  54965. #endif
  54966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54967. "adds r3, r3, r6\n\t"
  54968. #else
  54969. "add r3, r3, r6\n\t"
  54970. #endif
  54971. #ifdef WOLFSSL_KEIL
  54972. "adcs r4, r4, r7\n\t"
  54973. #elif defined(__clang__)
  54974. "adcs r4, r7\n\t"
  54975. #else
  54976. "adc r4, r7\n\t"
  54977. #endif
  54978. #ifdef WOLFSSL_KEIL
  54979. "adcs r5, r5, %[r]\n\t"
  54980. #elif defined(__clang__)
  54981. "adcs r5, %[r]\n\t"
  54982. #else
  54983. "adc r5, %[r]\n\t"
  54984. #endif
  54985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54986. "lsrs r7, r2, #16\n\t"
  54987. #else
  54988. "lsr r7, r2, #16\n\t"
  54989. #endif
  54990. "uxth r6, r2\n\t"
  54991. #ifdef WOLFSSL_KEIL
  54992. "muls r6, r7, r6\n\t"
  54993. #elif defined(__clang__)
  54994. "muls r6, r7\n\t"
  54995. #else
  54996. "mul r6, r7\n\t"
  54997. #endif
  54998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54999. "lsrs r7, r6, #15\n\t"
  55000. #else
  55001. "lsr r7, r6, #15\n\t"
  55002. #endif
  55003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55004. "lsls r6, r6, #17\n\t"
  55005. #else
  55006. "lsl r6, r6, #17\n\t"
  55007. #endif
  55008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55009. "adds r3, r3, r6\n\t"
  55010. #else
  55011. "add r3, r3, r6\n\t"
  55012. #endif
  55013. #ifdef WOLFSSL_KEIL
  55014. "adcs r4, r4, r7\n\t"
  55015. #elif defined(__clang__)
  55016. "adcs r4, r7\n\t"
  55017. #else
  55018. "adc r4, r7\n\t"
  55019. #endif
  55020. #ifdef WOLFSSL_KEIL
  55021. "adcs r5, r5, %[r]\n\t"
  55022. #elif defined(__clang__)
  55023. "adcs r5, %[r]\n\t"
  55024. #else
  55025. "adc r5, %[r]\n\t"
  55026. #endif
  55027. "# Square: Done\n\t"
  55028. "mov r2, r12\n\t"
  55029. "\n"
  55030. "L_sp_3072_sqr_12_done_sqr_%=:\n\t"
  55031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55032. "adds %[a], %[a], #4\n\t"
  55033. #else
  55034. "add %[a], %[a], #4\n\t"
  55035. #endif
  55036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55037. "subs r2, r2, #4\n\t"
  55038. #else
  55039. "sub r2, r2, #4\n\t"
  55040. #endif
  55041. "movs r6, #48\n\t"
  55042. "add r6, r6, r9\n\t"
  55043. "cmp %[a], r6\n\t"
  55044. "beq L_sp_3072_sqr_12_done_mul_%=\n\t"
  55045. "cmp %[a], r2\n\t"
  55046. "bgt L_sp_3072_sqr_12_done_mul_%=\n\t"
  55047. "mov r7, r8\n\t"
  55048. "add r7, r7, r9\n\t"
  55049. "cmp %[a], r7\n\t"
  55050. "ble L_sp_3072_sqr_12_mul_%=\n\t"
  55051. "\n"
  55052. "L_sp_3072_sqr_12_done_mul_%=:\n\t"
  55053. "mov %[r], r10\n\t"
  55054. "mov r7, r8\n\t"
  55055. "str r3, [%[r], r7]\n\t"
  55056. "movs r3, r4\n\t"
  55057. "movs r4, r5\n\t"
  55058. "movs r5, #0\n\t"
  55059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55060. "adds r7, r7, #4\n\t"
  55061. #else
  55062. "add r7, r7, #4\n\t"
  55063. #endif
  55064. "mov r8, r7\n\t"
  55065. "movs r6, #0x58\n\t"
  55066. "cmp r7, r6\n\t"
  55067. "ble L_sp_3072_sqr_12_words_%=\n\t"
  55068. "mov %[a], r9\n\t"
  55069. "str r3, [%[r], r7]\n\t"
  55070. "mov %[r], r11\n\t"
  55071. "mov %[a], r10\n\t"
  55072. "movs r3, #0x5c\n\t"
  55073. "\n"
  55074. "L_sp_3072_sqr_12_store_%=:\n\t"
  55075. "ldr r6, [%[a], r3]\n\t"
  55076. "str r6, [%[r], r3]\n\t"
  55077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55078. "subs r3, r3, #4\n\t"
  55079. #else
  55080. "sub r3, r3, #4\n\t"
  55081. #endif
  55082. "bge L_sp_3072_sqr_12_store_%=\n\t"
  55083. "movs r6, #0x60\n\t"
  55084. "add sp, sp, r6\n\t"
  55085. : [r] "+l" (r), [a] "+l" (a)
  55086. :
  55087. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  55088. );
  55089. }
  55090. #else
  55091. /* Square a and put result in r. (r = a * a)
  55092. *
  55093. * r A single precision integer.
  55094. * a A single precision integer.
  55095. */
  55096. SP_NOINLINE static void sp_3072_sqr_12(sp_digit* r, const sp_digit* a)
  55097. {
  55098. __asm__ __volatile__ (
  55099. "sub sp, sp, #48\n\t"
  55100. "mov r8, %[r]\n\t"
  55101. "mov r9, %[a]\n\t"
  55102. "movs %[r], #0\n\t"
  55103. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  55104. "mov r10, r2\n\t"
  55105. "mov r11, r3\n\t"
  55106. "mov r12, r4\n\t"
  55107. "mov lr, r5\n\t"
  55108. "mov %[a], r9\n\t"
  55109. "# A[0] * A[0]\n\t"
  55110. "movs r4, #0\n\t"
  55111. "mov r7, r10\n\t"
  55112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55113. "lsrs r6, r7, #16\n\t"
  55114. #else
  55115. "lsr r6, r7, #16\n\t"
  55116. #endif
  55117. "uxth r5, r7\n\t"
  55118. "movs r2, r5\n\t"
  55119. "movs r3, r6\n\t"
  55120. #ifdef WOLFSSL_KEIL
  55121. "muls r2, r2, r2\n\t"
  55122. #elif defined(__clang__)
  55123. "muls r2, r2\n\t"
  55124. #else
  55125. "mul r2, r2\n\t"
  55126. #endif
  55127. #ifdef WOLFSSL_KEIL
  55128. "muls r3, r3, r3\n\t"
  55129. #elif defined(__clang__)
  55130. "muls r3, r3\n\t"
  55131. #else
  55132. "mul r3, r3\n\t"
  55133. #endif
  55134. #ifdef WOLFSSL_KEIL
  55135. "muls r5, r6, r5\n\t"
  55136. #elif defined(__clang__)
  55137. "muls r5, r6\n\t"
  55138. #else
  55139. "mul r5, r6\n\t"
  55140. #endif
  55141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55142. "lsrs r6, r5, #15\n\t"
  55143. #else
  55144. "lsr r6, r5, #15\n\t"
  55145. #endif
  55146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55147. "lsls r5, r5, #17\n\t"
  55148. #else
  55149. "lsl r5, r5, #17\n\t"
  55150. #endif
  55151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55152. "adds r2, r2, r5\n\t"
  55153. #else
  55154. "add r2, r2, r5\n\t"
  55155. #endif
  55156. #ifdef WOLFSSL_KEIL
  55157. "adcs r3, r3, r6\n\t"
  55158. #elif defined(__clang__)
  55159. "adcs r3, r6\n\t"
  55160. #else
  55161. "adc r3, r6\n\t"
  55162. #endif
  55163. "str r2, [sp]\n\t"
  55164. "# A[1] * A[0]\n\t"
  55165. "movs r2, #0\n\t"
  55166. "mov %[a], r11\n\t"
  55167. "uxth r5, %[a]\n\t"
  55168. "uxth r6, r7\n\t"
  55169. #ifdef WOLFSSL_KEIL
  55170. "muls r6, r5, r6\n\t"
  55171. #elif defined(__clang__)
  55172. "muls r6, r5\n\t"
  55173. #else
  55174. "mul r6, r5\n\t"
  55175. #endif
  55176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55177. "adds r3, r3, r6\n\t"
  55178. #else
  55179. "add r3, r3, r6\n\t"
  55180. #endif
  55181. #ifdef WOLFSSL_KEIL
  55182. "adcs r4, r4, %[r]\n\t"
  55183. #elif defined(__clang__)
  55184. "adcs r4, %[r]\n\t"
  55185. #else
  55186. "adc r4, %[r]\n\t"
  55187. #endif
  55188. #ifdef WOLFSSL_KEIL
  55189. "adcs r2, r2, %[r]\n\t"
  55190. #elif defined(__clang__)
  55191. "adcs r2, %[r]\n\t"
  55192. #else
  55193. "adc r2, %[r]\n\t"
  55194. #endif
  55195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55196. "adds r3, r3, r6\n\t"
  55197. #else
  55198. "add r3, r3, r6\n\t"
  55199. #endif
  55200. #ifdef WOLFSSL_KEIL
  55201. "adcs r4, r4, %[r]\n\t"
  55202. #elif defined(__clang__)
  55203. "adcs r4, %[r]\n\t"
  55204. #else
  55205. "adc r4, %[r]\n\t"
  55206. #endif
  55207. #ifdef WOLFSSL_KEIL
  55208. "adcs r2, r2, %[r]\n\t"
  55209. #elif defined(__clang__)
  55210. "adcs r2, %[r]\n\t"
  55211. #else
  55212. "adc r2, %[r]\n\t"
  55213. #endif
  55214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55215. "lsrs r6, r7, #16\n\t"
  55216. #else
  55217. "lsr r6, r7, #16\n\t"
  55218. #endif
  55219. #ifdef WOLFSSL_KEIL
  55220. "muls r5, r6, r5\n\t"
  55221. #elif defined(__clang__)
  55222. "muls r5, r6\n\t"
  55223. #else
  55224. "mul r5, r6\n\t"
  55225. #endif
  55226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55227. "lsrs r6, r5, #16\n\t"
  55228. #else
  55229. "lsr r6, r5, #16\n\t"
  55230. #endif
  55231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55232. "lsls r5, r5, #16\n\t"
  55233. #else
  55234. "lsl r5, r5, #16\n\t"
  55235. #endif
  55236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55237. "adds r3, r3, r5\n\t"
  55238. #else
  55239. "add r3, r3, r5\n\t"
  55240. #endif
  55241. #ifdef WOLFSSL_KEIL
  55242. "adcs r4, r4, r6\n\t"
  55243. #elif defined(__clang__)
  55244. "adcs r4, r6\n\t"
  55245. #else
  55246. "adc r4, r6\n\t"
  55247. #endif
  55248. #ifdef WOLFSSL_KEIL
  55249. "adcs r2, r2, %[r]\n\t"
  55250. #elif defined(__clang__)
  55251. "adcs r2, %[r]\n\t"
  55252. #else
  55253. "adc r2, %[r]\n\t"
  55254. #endif
  55255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55256. "adds r3, r3, r5\n\t"
  55257. #else
  55258. "add r3, r3, r5\n\t"
  55259. #endif
  55260. #ifdef WOLFSSL_KEIL
  55261. "adcs r4, r4, r6\n\t"
  55262. #elif defined(__clang__)
  55263. "adcs r4, r6\n\t"
  55264. #else
  55265. "adc r4, r6\n\t"
  55266. #endif
  55267. #ifdef WOLFSSL_KEIL
  55268. "adcs r2, r2, %[r]\n\t"
  55269. #elif defined(__clang__)
  55270. "adcs r2, %[r]\n\t"
  55271. #else
  55272. "adc r2, %[r]\n\t"
  55273. #endif
  55274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55275. "lsrs r5, %[a], #16\n\t"
  55276. #else
  55277. "lsr r5, %[a], #16\n\t"
  55278. #endif
  55279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55280. "lsrs r6, r7, #16\n\t"
  55281. #else
  55282. "lsr r6, r7, #16\n\t"
  55283. #endif
  55284. #ifdef WOLFSSL_KEIL
  55285. "muls r6, r5, r6\n\t"
  55286. #elif defined(__clang__)
  55287. "muls r6, r5\n\t"
  55288. #else
  55289. "mul r6, r5\n\t"
  55290. #endif
  55291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55292. "adds r4, r4, r6\n\t"
  55293. #else
  55294. "add r4, r4, r6\n\t"
  55295. #endif
  55296. #ifdef WOLFSSL_KEIL
  55297. "adcs r2, r2, %[r]\n\t"
  55298. #elif defined(__clang__)
  55299. "adcs r2, %[r]\n\t"
  55300. #else
  55301. "adc r2, %[r]\n\t"
  55302. #endif
  55303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55304. "adds r4, r4, r6\n\t"
  55305. #else
  55306. "add r4, r4, r6\n\t"
  55307. #endif
  55308. #ifdef WOLFSSL_KEIL
  55309. "adcs r2, r2, %[r]\n\t"
  55310. #elif defined(__clang__)
  55311. "adcs r2, %[r]\n\t"
  55312. #else
  55313. "adc r2, %[r]\n\t"
  55314. #endif
  55315. "uxth r6, r7\n\t"
  55316. #ifdef WOLFSSL_KEIL
  55317. "muls r5, r6, r5\n\t"
  55318. #elif defined(__clang__)
  55319. "muls r5, r6\n\t"
  55320. #else
  55321. "mul r5, r6\n\t"
  55322. #endif
  55323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55324. "lsrs r6, r5, #16\n\t"
  55325. #else
  55326. "lsr r6, r5, #16\n\t"
  55327. #endif
  55328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55329. "lsls r5, r5, #16\n\t"
  55330. #else
  55331. "lsl r5, r5, #16\n\t"
  55332. #endif
  55333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55334. "adds r3, r3, r5\n\t"
  55335. #else
  55336. "add r3, r3, r5\n\t"
  55337. #endif
  55338. #ifdef WOLFSSL_KEIL
  55339. "adcs r4, r4, r6\n\t"
  55340. #elif defined(__clang__)
  55341. "adcs r4, r6\n\t"
  55342. #else
  55343. "adc r4, r6\n\t"
  55344. #endif
  55345. #ifdef WOLFSSL_KEIL
  55346. "adcs r2, r2, %[r]\n\t"
  55347. #elif defined(__clang__)
  55348. "adcs r2, %[r]\n\t"
  55349. #else
  55350. "adc r2, %[r]\n\t"
  55351. #endif
  55352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55353. "adds r3, r3, r5\n\t"
  55354. #else
  55355. "add r3, r3, r5\n\t"
  55356. #endif
  55357. #ifdef WOLFSSL_KEIL
  55358. "adcs r4, r4, r6\n\t"
  55359. #elif defined(__clang__)
  55360. "adcs r4, r6\n\t"
  55361. #else
  55362. "adc r4, r6\n\t"
  55363. #endif
  55364. #ifdef WOLFSSL_KEIL
  55365. "adcs r2, r2, %[r]\n\t"
  55366. #elif defined(__clang__)
  55367. "adcs r2, %[r]\n\t"
  55368. #else
  55369. "adc r2, %[r]\n\t"
  55370. #endif
  55371. "str r3, [sp, #4]\n\t"
  55372. "# A[2] * A[0]\n\t"
  55373. "movs r3, #0\n\t"
  55374. "mov %[a], r9\n\t"
  55375. "mov %[a], r12\n\t"
  55376. "uxth r5, %[a]\n\t"
  55377. "uxth r6, r7\n\t"
  55378. #ifdef WOLFSSL_KEIL
  55379. "muls r6, r5, r6\n\t"
  55380. #elif defined(__clang__)
  55381. "muls r6, r5\n\t"
  55382. #else
  55383. "mul r6, r5\n\t"
  55384. #endif
  55385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55386. "adds r4, r4, r6\n\t"
  55387. #else
  55388. "add r4, r4, r6\n\t"
  55389. #endif
  55390. #ifdef WOLFSSL_KEIL
  55391. "adcs r2, r2, %[r]\n\t"
  55392. #elif defined(__clang__)
  55393. "adcs r2, %[r]\n\t"
  55394. #else
  55395. "adc r2, %[r]\n\t"
  55396. #endif
  55397. #ifdef WOLFSSL_KEIL
  55398. "adcs r3, r3, %[r]\n\t"
  55399. #elif defined(__clang__)
  55400. "adcs r3, %[r]\n\t"
  55401. #else
  55402. "adc r3, %[r]\n\t"
  55403. #endif
  55404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55405. "adds r4, r4, r6\n\t"
  55406. #else
  55407. "add r4, r4, r6\n\t"
  55408. #endif
  55409. #ifdef WOLFSSL_KEIL
  55410. "adcs r2, r2, %[r]\n\t"
  55411. #elif defined(__clang__)
  55412. "adcs r2, %[r]\n\t"
  55413. #else
  55414. "adc r2, %[r]\n\t"
  55415. #endif
  55416. #ifdef WOLFSSL_KEIL
  55417. "adcs r3, r3, %[r]\n\t"
  55418. #elif defined(__clang__)
  55419. "adcs r3, %[r]\n\t"
  55420. #else
  55421. "adc r3, %[r]\n\t"
  55422. #endif
  55423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55424. "lsrs r6, r7, #16\n\t"
  55425. #else
  55426. "lsr r6, r7, #16\n\t"
  55427. #endif
  55428. #ifdef WOLFSSL_KEIL
  55429. "muls r5, r6, r5\n\t"
  55430. #elif defined(__clang__)
  55431. "muls r5, r6\n\t"
  55432. #else
  55433. "mul r5, r6\n\t"
  55434. #endif
  55435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55436. "lsrs r6, r5, #16\n\t"
  55437. #else
  55438. "lsr r6, r5, #16\n\t"
  55439. #endif
  55440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55441. "lsls r5, r5, #16\n\t"
  55442. #else
  55443. "lsl r5, r5, #16\n\t"
  55444. #endif
  55445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55446. "adds r4, r4, r5\n\t"
  55447. #else
  55448. "add r4, r4, r5\n\t"
  55449. #endif
  55450. #ifdef WOLFSSL_KEIL
  55451. "adcs r2, r2, r6\n\t"
  55452. #elif defined(__clang__)
  55453. "adcs r2, r6\n\t"
  55454. #else
  55455. "adc r2, r6\n\t"
  55456. #endif
  55457. #ifdef WOLFSSL_KEIL
  55458. "adcs r3, r3, %[r]\n\t"
  55459. #elif defined(__clang__)
  55460. "adcs r3, %[r]\n\t"
  55461. #else
  55462. "adc r3, %[r]\n\t"
  55463. #endif
  55464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55465. "adds r4, r4, r5\n\t"
  55466. #else
  55467. "add r4, r4, r5\n\t"
  55468. #endif
  55469. #ifdef WOLFSSL_KEIL
  55470. "adcs r2, r2, r6\n\t"
  55471. #elif defined(__clang__)
  55472. "adcs r2, r6\n\t"
  55473. #else
  55474. "adc r2, r6\n\t"
  55475. #endif
  55476. #ifdef WOLFSSL_KEIL
  55477. "adcs r3, r3, %[r]\n\t"
  55478. #elif defined(__clang__)
  55479. "adcs r3, %[r]\n\t"
  55480. #else
  55481. "adc r3, %[r]\n\t"
  55482. #endif
  55483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55484. "lsrs r5, %[a], #16\n\t"
  55485. #else
  55486. "lsr r5, %[a], #16\n\t"
  55487. #endif
  55488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55489. "lsrs r6, r7, #16\n\t"
  55490. #else
  55491. "lsr r6, r7, #16\n\t"
  55492. #endif
  55493. #ifdef WOLFSSL_KEIL
  55494. "muls r6, r5, r6\n\t"
  55495. #elif defined(__clang__)
  55496. "muls r6, r5\n\t"
  55497. #else
  55498. "mul r6, r5\n\t"
  55499. #endif
  55500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55501. "adds r2, r2, r6\n\t"
  55502. #else
  55503. "add r2, r2, r6\n\t"
  55504. #endif
  55505. #ifdef WOLFSSL_KEIL
  55506. "adcs r3, r3, %[r]\n\t"
  55507. #elif defined(__clang__)
  55508. "adcs r3, %[r]\n\t"
  55509. #else
  55510. "adc r3, %[r]\n\t"
  55511. #endif
  55512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55513. "adds r2, r2, r6\n\t"
  55514. #else
  55515. "add r2, r2, r6\n\t"
  55516. #endif
  55517. #ifdef WOLFSSL_KEIL
  55518. "adcs r3, r3, %[r]\n\t"
  55519. #elif defined(__clang__)
  55520. "adcs r3, %[r]\n\t"
  55521. #else
  55522. "adc r3, %[r]\n\t"
  55523. #endif
  55524. "uxth r6, r7\n\t"
  55525. #ifdef WOLFSSL_KEIL
  55526. "muls r5, r6, r5\n\t"
  55527. #elif defined(__clang__)
  55528. "muls r5, r6\n\t"
  55529. #else
  55530. "mul r5, r6\n\t"
  55531. #endif
  55532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55533. "lsrs r6, r5, #16\n\t"
  55534. #else
  55535. "lsr r6, r5, #16\n\t"
  55536. #endif
  55537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55538. "lsls r5, r5, #16\n\t"
  55539. #else
  55540. "lsl r5, r5, #16\n\t"
  55541. #endif
  55542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55543. "adds r4, r4, r5\n\t"
  55544. #else
  55545. "add r4, r4, r5\n\t"
  55546. #endif
  55547. #ifdef WOLFSSL_KEIL
  55548. "adcs r2, r2, r6\n\t"
  55549. #elif defined(__clang__)
  55550. "adcs r2, r6\n\t"
  55551. #else
  55552. "adc r2, r6\n\t"
  55553. #endif
  55554. #ifdef WOLFSSL_KEIL
  55555. "adcs r3, r3, %[r]\n\t"
  55556. #elif defined(__clang__)
  55557. "adcs r3, %[r]\n\t"
  55558. #else
  55559. "adc r3, %[r]\n\t"
  55560. #endif
  55561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55562. "adds r4, r4, r5\n\t"
  55563. #else
  55564. "add r4, r4, r5\n\t"
  55565. #endif
  55566. #ifdef WOLFSSL_KEIL
  55567. "adcs r2, r2, r6\n\t"
  55568. #elif defined(__clang__)
  55569. "adcs r2, r6\n\t"
  55570. #else
  55571. "adc r2, r6\n\t"
  55572. #endif
  55573. #ifdef WOLFSSL_KEIL
  55574. "adcs r3, r3, %[r]\n\t"
  55575. #elif defined(__clang__)
  55576. "adcs r3, %[r]\n\t"
  55577. #else
  55578. "adc r3, %[r]\n\t"
  55579. #endif
  55580. "# A[1] * A[1]\n\t"
  55581. "mov r7, r11\n\t"
  55582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55583. "lsrs r6, r7, #16\n\t"
  55584. #else
  55585. "lsr r6, r7, #16\n\t"
  55586. #endif
  55587. "uxth r5, r7\n\t"
  55588. #ifdef WOLFSSL_KEIL
  55589. "muls r5, r5, r5\n\t"
  55590. #elif defined(__clang__)
  55591. "muls r5, r5\n\t"
  55592. #else
  55593. "mul r5, r5\n\t"
  55594. #endif
  55595. #ifdef WOLFSSL_KEIL
  55596. "muls r6, r6, r6\n\t"
  55597. #elif defined(__clang__)
  55598. "muls r6, r6\n\t"
  55599. #else
  55600. "mul r6, r6\n\t"
  55601. #endif
  55602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55603. "adds r4, r4, r5\n\t"
  55604. #else
  55605. "add r4, r4, r5\n\t"
  55606. #endif
  55607. #ifdef WOLFSSL_KEIL
  55608. "adcs r2, r2, r6\n\t"
  55609. #elif defined(__clang__)
  55610. "adcs r2, r6\n\t"
  55611. #else
  55612. "adc r2, r6\n\t"
  55613. #endif
  55614. #ifdef WOLFSSL_KEIL
  55615. "adcs r3, r3, %[r]\n\t"
  55616. #elif defined(__clang__)
  55617. "adcs r3, %[r]\n\t"
  55618. #else
  55619. "adc r3, %[r]\n\t"
  55620. #endif
  55621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55622. "lsrs r6, r7, #16\n\t"
  55623. #else
  55624. "lsr r6, r7, #16\n\t"
  55625. #endif
  55626. "uxth r5, r7\n\t"
  55627. #ifdef WOLFSSL_KEIL
  55628. "muls r5, r6, r5\n\t"
  55629. #elif defined(__clang__)
  55630. "muls r5, r6\n\t"
  55631. #else
  55632. "mul r5, r6\n\t"
  55633. #endif
  55634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55635. "lsrs r6, r5, #15\n\t"
  55636. #else
  55637. "lsr r6, r5, #15\n\t"
  55638. #endif
  55639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55640. "lsls r5, r5, #17\n\t"
  55641. #else
  55642. "lsl r5, r5, #17\n\t"
  55643. #endif
  55644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55645. "adds r4, r4, r5\n\t"
  55646. #else
  55647. "add r4, r4, r5\n\t"
  55648. #endif
  55649. #ifdef WOLFSSL_KEIL
  55650. "adcs r2, r2, r6\n\t"
  55651. #elif defined(__clang__)
  55652. "adcs r2, r6\n\t"
  55653. #else
  55654. "adc r2, r6\n\t"
  55655. #endif
  55656. #ifdef WOLFSSL_KEIL
  55657. "adcs r3, r3, %[r]\n\t"
  55658. #elif defined(__clang__)
  55659. "adcs r3, %[r]\n\t"
  55660. #else
  55661. "adc r3, %[r]\n\t"
  55662. #endif
  55663. "str r4, [sp, #8]\n\t"
  55664. "# A[2] * A[1]\n\t"
  55665. "movs r4, #0\n\t"
  55666. "mov %[a], r9\n\t"
  55667. "mov %[a], r12\n\t"
  55668. "uxth r5, %[a]\n\t"
  55669. "uxth r6, r7\n\t"
  55670. #ifdef WOLFSSL_KEIL
  55671. "muls r6, r5, r6\n\t"
  55672. #elif defined(__clang__)
  55673. "muls r6, r5\n\t"
  55674. #else
  55675. "mul r6, r5\n\t"
  55676. #endif
  55677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55678. "adds r2, r2, r6\n\t"
  55679. #else
  55680. "add r2, r2, r6\n\t"
  55681. #endif
  55682. #ifdef WOLFSSL_KEIL
  55683. "adcs r3, r3, %[r]\n\t"
  55684. #elif defined(__clang__)
  55685. "adcs r3, %[r]\n\t"
  55686. #else
  55687. "adc r3, %[r]\n\t"
  55688. #endif
  55689. #ifdef WOLFSSL_KEIL
  55690. "adcs r4, r4, %[r]\n\t"
  55691. #elif defined(__clang__)
  55692. "adcs r4, %[r]\n\t"
  55693. #else
  55694. "adc r4, %[r]\n\t"
  55695. #endif
  55696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55697. "adds r2, r2, r6\n\t"
  55698. #else
  55699. "add r2, r2, r6\n\t"
  55700. #endif
  55701. #ifdef WOLFSSL_KEIL
  55702. "adcs r3, r3, %[r]\n\t"
  55703. #elif defined(__clang__)
  55704. "adcs r3, %[r]\n\t"
  55705. #else
  55706. "adc r3, %[r]\n\t"
  55707. #endif
  55708. #ifdef WOLFSSL_KEIL
  55709. "adcs r4, r4, %[r]\n\t"
  55710. #elif defined(__clang__)
  55711. "adcs r4, %[r]\n\t"
  55712. #else
  55713. "adc r4, %[r]\n\t"
  55714. #endif
  55715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55716. "lsrs r6, r7, #16\n\t"
  55717. #else
  55718. "lsr r6, r7, #16\n\t"
  55719. #endif
  55720. #ifdef WOLFSSL_KEIL
  55721. "muls r5, r6, r5\n\t"
  55722. #elif defined(__clang__)
  55723. "muls r5, r6\n\t"
  55724. #else
  55725. "mul r5, r6\n\t"
  55726. #endif
  55727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55728. "lsrs r6, r5, #16\n\t"
  55729. #else
  55730. "lsr r6, r5, #16\n\t"
  55731. #endif
  55732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55733. "lsls r5, r5, #16\n\t"
  55734. #else
  55735. "lsl r5, r5, #16\n\t"
  55736. #endif
  55737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55738. "adds r2, r2, r5\n\t"
  55739. #else
  55740. "add r2, r2, r5\n\t"
  55741. #endif
  55742. #ifdef WOLFSSL_KEIL
  55743. "adcs r3, r3, r6\n\t"
  55744. #elif defined(__clang__)
  55745. "adcs r3, r6\n\t"
  55746. #else
  55747. "adc r3, r6\n\t"
  55748. #endif
  55749. #ifdef WOLFSSL_KEIL
  55750. "adcs r4, r4, %[r]\n\t"
  55751. #elif defined(__clang__)
  55752. "adcs r4, %[r]\n\t"
  55753. #else
  55754. "adc r4, %[r]\n\t"
  55755. #endif
  55756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55757. "adds r2, r2, r5\n\t"
  55758. #else
  55759. "add r2, r2, r5\n\t"
  55760. #endif
  55761. #ifdef WOLFSSL_KEIL
  55762. "adcs r3, r3, r6\n\t"
  55763. #elif defined(__clang__)
  55764. "adcs r3, r6\n\t"
  55765. #else
  55766. "adc r3, r6\n\t"
  55767. #endif
  55768. #ifdef WOLFSSL_KEIL
  55769. "adcs r4, r4, %[r]\n\t"
  55770. #elif defined(__clang__)
  55771. "adcs r4, %[r]\n\t"
  55772. #else
  55773. "adc r4, %[r]\n\t"
  55774. #endif
  55775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55776. "lsrs r5, %[a], #16\n\t"
  55777. #else
  55778. "lsr r5, %[a], #16\n\t"
  55779. #endif
  55780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55781. "lsrs r6, r7, #16\n\t"
  55782. #else
  55783. "lsr r6, r7, #16\n\t"
  55784. #endif
  55785. #ifdef WOLFSSL_KEIL
  55786. "muls r6, r5, r6\n\t"
  55787. #elif defined(__clang__)
  55788. "muls r6, r5\n\t"
  55789. #else
  55790. "mul r6, r5\n\t"
  55791. #endif
  55792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55793. "adds r3, r3, r6\n\t"
  55794. #else
  55795. "add r3, r3, r6\n\t"
  55796. #endif
  55797. #ifdef WOLFSSL_KEIL
  55798. "adcs r4, r4, %[r]\n\t"
  55799. #elif defined(__clang__)
  55800. "adcs r4, %[r]\n\t"
  55801. #else
  55802. "adc r4, %[r]\n\t"
  55803. #endif
  55804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55805. "adds r3, r3, r6\n\t"
  55806. #else
  55807. "add r3, r3, r6\n\t"
  55808. #endif
  55809. #ifdef WOLFSSL_KEIL
  55810. "adcs r4, r4, %[r]\n\t"
  55811. #elif defined(__clang__)
  55812. "adcs r4, %[r]\n\t"
  55813. #else
  55814. "adc r4, %[r]\n\t"
  55815. #endif
  55816. "uxth r6, r7\n\t"
  55817. #ifdef WOLFSSL_KEIL
  55818. "muls r5, r6, r5\n\t"
  55819. #elif defined(__clang__)
  55820. "muls r5, r6\n\t"
  55821. #else
  55822. "mul r5, r6\n\t"
  55823. #endif
  55824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55825. "lsrs r6, r5, #16\n\t"
  55826. #else
  55827. "lsr r6, r5, #16\n\t"
  55828. #endif
  55829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55830. "lsls r5, r5, #16\n\t"
  55831. #else
  55832. "lsl r5, r5, #16\n\t"
  55833. #endif
  55834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55835. "adds r2, r2, r5\n\t"
  55836. #else
  55837. "add r2, r2, r5\n\t"
  55838. #endif
  55839. #ifdef WOLFSSL_KEIL
  55840. "adcs r3, r3, r6\n\t"
  55841. #elif defined(__clang__)
  55842. "adcs r3, r6\n\t"
  55843. #else
  55844. "adc r3, r6\n\t"
  55845. #endif
  55846. #ifdef WOLFSSL_KEIL
  55847. "adcs r4, r4, %[r]\n\t"
  55848. #elif defined(__clang__)
  55849. "adcs r4, %[r]\n\t"
  55850. #else
  55851. "adc r4, %[r]\n\t"
  55852. #endif
  55853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55854. "adds r2, r2, r5\n\t"
  55855. #else
  55856. "add r2, r2, r5\n\t"
  55857. #endif
  55858. #ifdef WOLFSSL_KEIL
  55859. "adcs r3, r3, r6\n\t"
  55860. #elif defined(__clang__)
  55861. "adcs r3, r6\n\t"
  55862. #else
  55863. "adc r3, r6\n\t"
  55864. #endif
  55865. #ifdef WOLFSSL_KEIL
  55866. "adcs r4, r4, %[r]\n\t"
  55867. #elif defined(__clang__)
  55868. "adcs r4, %[r]\n\t"
  55869. #else
  55870. "adc r4, %[r]\n\t"
  55871. #endif
  55872. "# A[3] * A[0]\n\t"
  55873. "mov %[a], r9\n\t"
  55874. "mov r7, r10\n\t"
  55875. "mov %[a], lr\n\t"
  55876. "uxth r5, %[a]\n\t"
  55877. "uxth r6, r7\n\t"
  55878. #ifdef WOLFSSL_KEIL
  55879. "muls r6, r5, r6\n\t"
  55880. #elif defined(__clang__)
  55881. "muls r6, r5\n\t"
  55882. #else
  55883. "mul r6, r5\n\t"
  55884. #endif
  55885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55886. "adds r2, r2, r6\n\t"
  55887. #else
  55888. "add r2, r2, r6\n\t"
  55889. #endif
  55890. #ifdef WOLFSSL_KEIL
  55891. "adcs r3, r3, %[r]\n\t"
  55892. #elif defined(__clang__)
  55893. "adcs r3, %[r]\n\t"
  55894. #else
  55895. "adc r3, %[r]\n\t"
  55896. #endif
  55897. #ifdef WOLFSSL_KEIL
  55898. "adcs r4, r4, %[r]\n\t"
  55899. #elif defined(__clang__)
  55900. "adcs r4, %[r]\n\t"
  55901. #else
  55902. "adc r4, %[r]\n\t"
  55903. #endif
  55904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55905. "adds r2, r2, r6\n\t"
  55906. #else
  55907. "add r2, r2, r6\n\t"
  55908. #endif
  55909. #ifdef WOLFSSL_KEIL
  55910. "adcs r3, r3, %[r]\n\t"
  55911. #elif defined(__clang__)
  55912. "adcs r3, %[r]\n\t"
  55913. #else
  55914. "adc r3, %[r]\n\t"
  55915. #endif
  55916. #ifdef WOLFSSL_KEIL
  55917. "adcs r4, r4, %[r]\n\t"
  55918. #elif defined(__clang__)
  55919. "adcs r4, %[r]\n\t"
  55920. #else
  55921. "adc r4, %[r]\n\t"
  55922. #endif
  55923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55924. "lsrs r6, r7, #16\n\t"
  55925. #else
  55926. "lsr r6, r7, #16\n\t"
  55927. #endif
  55928. #ifdef WOLFSSL_KEIL
  55929. "muls r5, r6, r5\n\t"
  55930. #elif defined(__clang__)
  55931. "muls r5, r6\n\t"
  55932. #else
  55933. "mul r5, r6\n\t"
  55934. #endif
  55935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55936. "lsrs r6, r5, #16\n\t"
  55937. #else
  55938. "lsr r6, r5, #16\n\t"
  55939. #endif
  55940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55941. "lsls r5, r5, #16\n\t"
  55942. #else
  55943. "lsl r5, r5, #16\n\t"
  55944. #endif
  55945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55946. "adds r2, r2, r5\n\t"
  55947. #else
  55948. "add r2, r2, r5\n\t"
  55949. #endif
  55950. #ifdef WOLFSSL_KEIL
  55951. "adcs r3, r3, r6\n\t"
  55952. #elif defined(__clang__)
  55953. "adcs r3, r6\n\t"
  55954. #else
  55955. "adc r3, r6\n\t"
  55956. #endif
  55957. #ifdef WOLFSSL_KEIL
  55958. "adcs r4, r4, %[r]\n\t"
  55959. #elif defined(__clang__)
  55960. "adcs r4, %[r]\n\t"
  55961. #else
  55962. "adc r4, %[r]\n\t"
  55963. #endif
  55964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55965. "adds r2, r2, r5\n\t"
  55966. #else
  55967. "add r2, r2, r5\n\t"
  55968. #endif
  55969. #ifdef WOLFSSL_KEIL
  55970. "adcs r3, r3, r6\n\t"
  55971. #elif defined(__clang__)
  55972. "adcs r3, r6\n\t"
  55973. #else
  55974. "adc r3, r6\n\t"
  55975. #endif
  55976. #ifdef WOLFSSL_KEIL
  55977. "adcs r4, r4, %[r]\n\t"
  55978. #elif defined(__clang__)
  55979. "adcs r4, %[r]\n\t"
  55980. #else
  55981. "adc r4, %[r]\n\t"
  55982. #endif
  55983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55984. "lsrs r5, %[a], #16\n\t"
  55985. #else
  55986. "lsr r5, %[a], #16\n\t"
  55987. #endif
  55988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55989. "lsrs r6, r7, #16\n\t"
  55990. #else
  55991. "lsr r6, r7, #16\n\t"
  55992. #endif
  55993. #ifdef WOLFSSL_KEIL
  55994. "muls r6, r5, r6\n\t"
  55995. #elif defined(__clang__)
  55996. "muls r6, r5\n\t"
  55997. #else
  55998. "mul r6, r5\n\t"
  55999. #endif
  56000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56001. "adds r3, r3, r6\n\t"
  56002. #else
  56003. "add r3, r3, r6\n\t"
  56004. #endif
  56005. #ifdef WOLFSSL_KEIL
  56006. "adcs r4, r4, %[r]\n\t"
  56007. #elif defined(__clang__)
  56008. "adcs r4, %[r]\n\t"
  56009. #else
  56010. "adc r4, %[r]\n\t"
  56011. #endif
  56012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56013. "adds r3, r3, r6\n\t"
  56014. #else
  56015. "add r3, r3, r6\n\t"
  56016. #endif
  56017. #ifdef WOLFSSL_KEIL
  56018. "adcs r4, r4, %[r]\n\t"
  56019. #elif defined(__clang__)
  56020. "adcs r4, %[r]\n\t"
  56021. #else
  56022. "adc r4, %[r]\n\t"
  56023. #endif
  56024. "uxth r6, r7\n\t"
  56025. #ifdef WOLFSSL_KEIL
  56026. "muls r5, r6, r5\n\t"
  56027. #elif defined(__clang__)
  56028. "muls r5, r6\n\t"
  56029. #else
  56030. "mul r5, r6\n\t"
  56031. #endif
  56032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56033. "lsrs r6, r5, #16\n\t"
  56034. #else
  56035. "lsr r6, r5, #16\n\t"
  56036. #endif
  56037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56038. "lsls r5, r5, #16\n\t"
  56039. #else
  56040. "lsl r5, r5, #16\n\t"
  56041. #endif
  56042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56043. "adds r2, r2, r5\n\t"
  56044. #else
  56045. "add r2, r2, r5\n\t"
  56046. #endif
  56047. #ifdef WOLFSSL_KEIL
  56048. "adcs r3, r3, r6\n\t"
  56049. #elif defined(__clang__)
  56050. "adcs r3, r6\n\t"
  56051. #else
  56052. "adc r3, r6\n\t"
  56053. #endif
  56054. #ifdef WOLFSSL_KEIL
  56055. "adcs r4, r4, %[r]\n\t"
  56056. #elif defined(__clang__)
  56057. "adcs r4, %[r]\n\t"
  56058. #else
  56059. "adc r4, %[r]\n\t"
  56060. #endif
  56061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56062. "adds r2, r2, r5\n\t"
  56063. #else
  56064. "add r2, r2, r5\n\t"
  56065. #endif
  56066. #ifdef WOLFSSL_KEIL
  56067. "adcs r3, r3, r6\n\t"
  56068. #elif defined(__clang__)
  56069. "adcs r3, r6\n\t"
  56070. #else
  56071. "adc r3, r6\n\t"
  56072. #endif
  56073. #ifdef WOLFSSL_KEIL
  56074. "adcs r4, r4, %[r]\n\t"
  56075. #elif defined(__clang__)
  56076. "adcs r4, %[r]\n\t"
  56077. #else
  56078. "adc r4, %[r]\n\t"
  56079. #endif
  56080. "str r2, [sp, #12]\n\t"
  56081. "# A[4] * A[0]\n\t"
  56082. "movs r2, #0\n\t"
  56083. "mov %[a], r9\n\t"
  56084. "ldr %[a], [%[a], #16]\n\t"
  56085. "uxth r5, %[a]\n\t"
  56086. "uxth r6, r7\n\t"
  56087. #ifdef WOLFSSL_KEIL
  56088. "muls r6, r5, r6\n\t"
  56089. #elif defined(__clang__)
  56090. "muls r6, r5\n\t"
  56091. #else
  56092. "mul r6, r5\n\t"
  56093. #endif
  56094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56095. "adds r3, r3, r6\n\t"
  56096. #else
  56097. "add r3, r3, r6\n\t"
  56098. #endif
  56099. #ifdef WOLFSSL_KEIL
  56100. "adcs r4, r4, %[r]\n\t"
  56101. #elif defined(__clang__)
  56102. "adcs r4, %[r]\n\t"
  56103. #else
  56104. "adc r4, %[r]\n\t"
  56105. #endif
  56106. #ifdef WOLFSSL_KEIL
  56107. "adcs r2, r2, %[r]\n\t"
  56108. #elif defined(__clang__)
  56109. "adcs r2, %[r]\n\t"
  56110. #else
  56111. "adc r2, %[r]\n\t"
  56112. #endif
  56113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56114. "adds r3, r3, r6\n\t"
  56115. #else
  56116. "add r3, r3, r6\n\t"
  56117. #endif
  56118. #ifdef WOLFSSL_KEIL
  56119. "adcs r4, r4, %[r]\n\t"
  56120. #elif defined(__clang__)
  56121. "adcs r4, %[r]\n\t"
  56122. #else
  56123. "adc r4, %[r]\n\t"
  56124. #endif
  56125. #ifdef WOLFSSL_KEIL
  56126. "adcs r2, r2, %[r]\n\t"
  56127. #elif defined(__clang__)
  56128. "adcs r2, %[r]\n\t"
  56129. #else
  56130. "adc r2, %[r]\n\t"
  56131. #endif
  56132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56133. "lsrs r6, r7, #16\n\t"
  56134. #else
  56135. "lsr r6, r7, #16\n\t"
  56136. #endif
  56137. #ifdef WOLFSSL_KEIL
  56138. "muls r5, r6, r5\n\t"
  56139. #elif defined(__clang__)
  56140. "muls r5, r6\n\t"
  56141. #else
  56142. "mul r5, r6\n\t"
  56143. #endif
  56144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56145. "lsrs r6, r5, #16\n\t"
  56146. #else
  56147. "lsr r6, r5, #16\n\t"
  56148. #endif
  56149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56150. "lsls r5, r5, #16\n\t"
  56151. #else
  56152. "lsl r5, r5, #16\n\t"
  56153. #endif
  56154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56155. "adds r3, r3, r5\n\t"
  56156. #else
  56157. "add r3, r3, r5\n\t"
  56158. #endif
  56159. #ifdef WOLFSSL_KEIL
  56160. "adcs r4, r4, r6\n\t"
  56161. #elif defined(__clang__)
  56162. "adcs r4, r6\n\t"
  56163. #else
  56164. "adc r4, r6\n\t"
  56165. #endif
  56166. #ifdef WOLFSSL_KEIL
  56167. "adcs r2, r2, %[r]\n\t"
  56168. #elif defined(__clang__)
  56169. "adcs r2, %[r]\n\t"
  56170. #else
  56171. "adc r2, %[r]\n\t"
  56172. #endif
  56173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56174. "adds r3, r3, r5\n\t"
  56175. #else
  56176. "add r3, r3, r5\n\t"
  56177. #endif
  56178. #ifdef WOLFSSL_KEIL
  56179. "adcs r4, r4, r6\n\t"
  56180. #elif defined(__clang__)
  56181. "adcs r4, r6\n\t"
  56182. #else
  56183. "adc r4, r6\n\t"
  56184. #endif
  56185. #ifdef WOLFSSL_KEIL
  56186. "adcs r2, r2, %[r]\n\t"
  56187. #elif defined(__clang__)
  56188. "adcs r2, %[r]\n\t"
  56189. #else
  56190. "adc r2, %[r]\n\t"
  56191. #endif
  56192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56193. "lsrs r5, %[a], #16\n\t"
  56194. #else
  56195. "lsr r5, %[a], #16\n\t"
  56196. #endif
  56197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56198. "lsrs r6, r7, #16\n\t"
  56199. #else
  56200. "lsr r6, r7, #16\n\t"
  56201. #endif
  56202. #ifdef WOLFSSL_KEIL
  56203. "muls r6, r5, r6\n\t"
  56204. #elif defined(__clang__)
  56205. "muls r6, r5\n\t"
  56206. #else
  56207. "mul r6, r5\n\t"
  56208. #endif
  56209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56210. "adds r4, r4, r6\n\t"
  56211. #else
  56212. "add r4, r4, r6\n\t"
  56213. #endif
  56214. #ifdef WOLFSSL_KEIL
  56215. "adcs r2, r2, %[r]\n\t"
  56216. #elif defined(__clang__)
  56217. "adcs r2, %[r]\n\t"
  56218. #else
  56219. "adc r2, %[r]\n\t"
  56220. #endif
  56221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56222. "adds r4, r4, r6\n\t"
  56223. #else
  56224. "add r4, r4, r6\n\t"
  56225. #endif
  56226. #ifdef WOLFSSL_KEIL
  56227. "adcs r2, r2, %[r]\n\t"
  56228. #elif defined(__clang__)
  56229. "adcs r2, %[r]\n\t"
  56230. #else
  56231. "adc r2, %[r]\n\t"
  56232. #endif
  56233. "uxth r6, r7\n\t"
  56234. #ifdef WOLFSSL_KEIL
  56235. "muls r5, r6, r5\n\t"
  56236. #elif defined(__clang__)
  56237. "muls r5, r6\n\t"
  56238. #else
  56239. "mul r5, r6\n\t"
  56240. #endif
  56241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56242. "lsrs r6, r5, #16\n\t"
  56243. #else
  56244. "lsr r6, r5, #16\n\t"
  56245. #endif
  56246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56247. "lsls r5, r5, #16\n\t"
  56248. #else
  56249. "lsl r5, r5, #16\n\t"
  56250. #endif
  56251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56252. "adds r3, r3, r5\n\t"
  56253. #else
  56254. "add r3, r3, r5\n\t"
  56255. #endif
  56256. #ifdef WOLFSSL_KEIL
  56257. "adcs r4, r4, r6\n\t"
  56258. #elif defined(__clang__)
  56259. "adcs r4, r6\n\t"
  56260. #else
  56261. "adc r4, r6\n\t"
  56262. #endif
  56263. #ifdef WOLFSSL_KEIL
  56264. "adcs r2, r2, %[r]\n\t"
  56265. #elif defined(__clang__)
  56266. "adcs r2, %[r]\n\t"
  56267. #else
  56268. "adc r2, %[r]\n\t"
  56269. #endif
  56270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56271. "adds r3, r3, r5\n\t"
  56272. #else
  56273. "add r3, r3, r5\n\t"
  56274. #endif
  56275. #ifdef WOLFSSL_KEIL
  56276. "adcs r4, r4, r6\n\t"
  56277. #elif defined(__clang__)
  56278. "adcs r4, r6\n\t"
  56279. #else
  56280. "adc r4, r6\n\t"
  56281. #endif
  56282. #ifdef WOLFSSL_KEIL
  56283. "adcs r2, r2, %[r]\n\t"
  56284. #elif defined(__clang__)
  56285. "adcs r2, %[r]\n\t"
  56286. #else
  56287. "adc r2, %[r]\n\t"
  56288. #endif
  56289. "# A[3] * A[1]\n\t"
  56290. "mov %[a], r9\n\t"
  56291. "mov r7, r11\n\t"
  56292. "mov %[a], lr\n\t"
  56293. "uxth r5, %[a]\n\t"
  56294. "uxth r6, r7\n\t"
  56295. #ifdef WOLFSSL_KEIL
  56296. "muls r6, r5, r6\n\t"
  56297. #elif defined(__clang__)
  56298. "muls r6, r5\n\t"
  56299. #else
  56300. "mul r6, r5\n\t"
  56301. #endif
  56302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56303. "adds r3, r3, r6\n\t"
  56304. #else
  56305. "add r3, r3, r6\n\t"
  56306. #endif
  56307. #ifdef WOLFSSL_KEIL
  56308. "adcs r4, r4, %[r]\n\t"
  56309. #elif defined(__clang__)
  56310. "adcs r4, %[r]\n\t"
  56311. #else
  56312. "adc r4, %[r]\n\t"
  56313. #endif
  56314. #ifdef WOLFSSL_KEIL
  56315. "adcs r2, r2, %[r]\n\t"
  56316. #elif defined(__clang__)
  56317. "adcs r2, %[r]\n\t"
  56318. #else
  56319. "adc r2, %[r]\n\t"
  56320. #endif
  56321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56322. "adds r3, r3, r6\n\t"
  56323. #else
  56324. "add r3, r3, r6\n\t"
  56325. #endif
  56326. #ifdef WOLFSSL_KEIL
  56327. "adcs r4, r4, %[r]\n\t"
  56328. #elif defined(__clang__)
  56329. "adcs r4, %[r]\n\t"
  56330. #else
  56331. "adc r4, %[r]\n\t"
  56332. #endif
  56333. #ifdef WOLFSSL_KEIL
  56334. "adcs r2, r2, %[r]\n\t"
  56335. #elif defined(__clang__)
  56336. "adcs r2, %[r]\n\t"
  56337. #else
  56338. "adc r2, %[r]\n\t"
  56339. #endif
  56340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56341. "lsrs r6, r7, #16\n\t"
  56342. #else
  56343. "lsr r6, r7, #16\n\t"
  56344. #endif
  56345. #ifdef WOLFSSL_KEIL
  56346. "muls r5, r6, r5\n\t"
  56347. #elif defined(__clang__)
  56348. "muls r5, r6\n\t"
  56349. #else
  56350. "mul r5, r6\n\t"
  56351. #endif
  56352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56353. "lsrs r6, r5, #16\n\t"
  56354. #else
  56355. "lsr r6, r5, #16\n\t"
  56356. #endif
  56357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56358. "lsls r5, r5, #16\n\t"
  56359. #else
  56360. "lsl r5, r5, #16\n\t"
  56361. #endif
  56362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56363. "adds r3, r3, r5\n\t"
  56364. #else
  56365. "add r3, r3, r5\n\t"
  56366. #endif
  56367. #ifdef WOLFSSL_KEIL
  56368. "adcs r4, r4, r6\n\t"
  56369. #elif defined(__clang__)
  56370. "adcs r4, r6\n\t"
  56371. #else
  56372. "adc r4, r6\n\t"
  56373. #endif
  56374. #ifdef WOLFSSL_KEIL
  56375. "adcs r2, r2, %[r]\n\t"
  56376. #elif defined(__clang__)
  56377. "adcs r2, %[r]\n\t"
  56378. #else
  56379. "adc r2, %[r]\n\t"
  56380. #endif
  56381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56382. "adds r3, r3, r5\n\t"
  56383. #else
  56384. "add r3, r3, r5\n\t"
  56385. #endif
  56386. #ifdef WOLFSSL_KEIL
  56387. "adcs r4, r4, r6\n\t"
  56388. #elif defined(__clang__)
  56389. "adcs r4, r6\n\t"
  56390. #else
  56391. "adc r4, r6\n\t"
  56392. #endif
  56393. #ifdef WOLFSSL_KEIL
  56394. "adcs r2, r2, %[r]\n\t"
  56395. #elif defined(__clang__)
  56396. "adcs r2, %[r]\n\t"
  56397. #else
  56398. "adc r2, %[r]\n\t"
  56399. #endif
  56400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56401. "lsrs r5, %[a], #16\n\t"
  56402. #else
  56403. "lsr r5, %[a], #16\n\t"
  56404. #endif
  56405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56406. "lsrs r6, r7, #16\n\t"
  56407. #else
  56408. "lsr r6, r7, #16\n\t"
  56409. #endif
  56410. #ifdef WOLFSSL_KEIL
  56411. "muls r6, r5, r6\n\t"
  56412. #elif defined(__clang__)
  56413. "muls r6, r5\n\t"
  56414. #else
  56415. "mul r6, r5\n\t"
  56416. #endif
  56417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56418. "adds r4, r4, r6\n\t"
  56419. #else
  56420. "add r4, r4, r6\n\t"
  56421. #endif
  56422. #ifdef WOLFSSL_KEIL
  56423. "adcs r2, r2, %[r]\n\t"
  56424. #elif defined(__clang__)
  56425. "adcs r2, %[r]\n\t"
  56426. #else
  56427. "adc r2, %[r]\n\t"
  56428. #endif
  56429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56430. "adds r4, r4, r6\n\t"
  56431. #else
  56432. "add r4, r4, r6\n\t"
  56433. #endif
  56434. #ifdef WOLFSSL_KEIL
  56435. "adcs r2, r2, %[r]\n\t"
  56436. #elif defined(__clang__)
  56437. "adcs r2, %[r]\n\t"
  56438. #else
  56439. "adc r2, %[r]\n\t"
  56440. #endif
  56441. "uxth r6, r7\n\t"
  56442. #ifdef WOLFSSL_KEIL
  56443. "muls r5, r6, r5\n\t"
  56444. #elif defined(__clang__)
  56445. "muls r5, r6\n\t"
  56446. #else
  56447. "mul r5, r6\n\t"
  56448. #endif
  56449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56450. "lsrs r6, r5, #16\n\t"
  56451. #else
  56452. "lsr r6, r5, #16\n\t"
  56453. #endif
  56454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56455. "lsls r5, r5, #16\n\t"
  56456. #else
  56457. "lsl r5, r5, #16\n\t"
  56458. #endif
  56459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56460. "adds r3, r3, r5\n\t"
  56461. #else
  56462. "add r3, r3, r5\n\t"
  56463. #endif
  56464. #ifdef WOLFSSL_KEIL
  56465. "adcs r4, r4, r6\n\t"
  56466. #elif defined(__clang__)
  56467. "adcs r4, r6\n\t"
  56468. #else
  56469. "adc r4, r6\n\t"
  56470. #endif
  56471. #ifdef WOLFSSL_KEIL
  56472. "adcs r2, r2, %[r]\n\t"
  56473. #elif defined(__clang__)
  56474. "adcs r2, %[r]\n\t"
  56475. #else
  56476. "adc r2, %[r]\n\t"
  56477. #endif
  56478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56479. "adds r3, r3, r5\n\t"
  56480. #else
  56481. "add r3, r3, r5\n\t"
  56482. #endif
  56483. #ifdef WOLFSSL_KEIL
  56484. "adcs r4, r4, r6\n\t"
  56485. #elif defined(__clang__)
  56486. "adcs r4, r6\n\t"
  56487. #else
  56488. "adc r4, r6\n\t"
  56489. #endif
  56490. #ifdef WOLFSSL_KEIL
  56491. "adcs r2, r2, %[r]\n\t"
  56492. #elif defined(__clang__)
  56493. "adcs r2, %[r]\n\t"
  56494. #else
  56495. "adc r2, %[r]\n\t"
  56496. #endif
  56497. "# A[2] * A[2]\n\t"
  56498. "mov r7, r12\n\t"
  56499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56500. "lsrs r6, r7, #16\n\t"
  56501. #else
  56502. "lsr r6, r7, #16\n\t"
  56503. #endif
  56504. "uxth r5, r7\n\t"
  56505. #ifdef WOLFSSL_KEIL
  56506. "muls r5, r5, r5\n\t"
  56507. #elif defined(__clang__)
  56508. "muls r5, r5\n\t"
  56509. #else
  56510. "mul r5, r5\n\t"
  56511. #endif
  56512. #ifdef WOLFSSL_KEIL
  56513. "muls r6, r6, r6\n\t"
  56514. #elif defined(__clang__)
  56515. "muls r6, r6\n\t"
  56516. #else
  56517. "mul r6, r6\n\t"
  56518. #endif
  56519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56520. "adds r3, r3, r5\n\t"
  56521. #else
  56522. "add r3, r3, r5\n\t"
  56523. #endif
  56524. #ifdef WOLFSSL_KEIL
  56525. "adcs r4, r4, r6\n\t"
  56526. #elif defined(__clang__)
  56527. "adcs r4, r6\n\t"
  56528. #else
  56529. "adc r4, r6\n\t"
  56530. #endif
  56531. #ifdef WOLFSSL_KEIL
  56532. "adcs r2, r2, %[r]\n\t"
  56533. #elif defined(__clang__)
  56534. "adcs r2, %[r]\n\t"
  56535. #else
  56536. "adc r2, %[r]\n\t"
  56537. #endif
  56538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56539. "lsrs r6, r7, #16\n\t"
  56540. #else
  56541. "lsr r6, r7, #16\n\t"
  56542. #endif
  56543. "uxth r5, r7\n\t"
  56544. #ifdef WOLFSSL_KEIL
  56545. "muls r5, r6, r5\n\t"
  56546. #elif defined(__clang__)
  56547. "muls r5, r6\n\t"
  56548. #else
  56549. "mul r5, r6\n\t"
  56550. #endif
  56551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56552. "lsrs r6, r5, #15\n\t"
  56553. #else
  56554. "lsr r6, r5, #15\n\t"
  56555. #endif
  56556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56557. "lsls r5, r5, #17\n\t"
  56558. #else
  56559. "lsl r5, r5, #17\n\t"
  56560. #endif
  56561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56562. "adds r3, r3, r5\n\t"
  56563. #else
  56564. "add r3, r3, r5\n\t"
  56565. #endif
  56566. #ifdef WOLFSSL_KEIL
  56567. "adcs r4, r4, r6\n\t"
  56568. #elif defined(__clang__)
  56569. "adcs r4, r6\n\t"
  56570. #else
  56571. "adc r4, r6\n\t"
  56572. #endif
  56573. #ifdef WOLFSSL_KEIL
  56574. "adcs r2, r2, %[r]\n\t"
  56575. #elif defined(__clang__)
  56576. "adcs r2, %[r]\n\t"
  56577. #else
  56578. "adc r2, %[r]\n\t"
  56579. #endif
  56580. "str r3, [sp, #16]\n\t"
  56581. "# A[3] * A[2]\n\t"
  56582. "movs r3, #0\n\t"
  56583. "mov %[a], r9\n\t"
  56584. "mov %[a], lr\n\t"
  56585. "uxth r5, %[a]\n\t"
  56586. "uxth r6, r7\n\t"
  56587. #ifdef WOLFSSL_KEIL
  56588. "muls r6, r5, r6\n\t"
  56589. #elif defined(__clang__)
  56590. "muls r6, r5\n\t"
  56591. #else
  56592. "mul r6, r5\n\t"
  56593. #endif
  56594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56595. "adds r4, r4, r6\n\t"
  56596. #else
  56597. "add r4, r4, r6\n\t"
  56598. #endif
  56599. #ifdef WOLFSSL_KEIL
  56600. "adcs r2, r2, %[r]\n\t"
  56601. #elif defined(__clang__)
  56602. "adcs r2, %[r]\n\t"
  56603. #else
  56604. "adc r2, %[r]\n\t"
  56605. #endif
  56606. #ifdef WOLFSSL_KEIL
  56607. "adcs r3, r3, %[r]\n\t"
  56608. #elif defined(__clang__)
  56609. "adcs r3, %[r]\n\t"
  56610. #else
  56611. "adc r3, %[r]\n\t"
  56612. #endif
  56613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56614. "adds r4, r4, r6\n\t"
  56615. #else
  56616. "add r4, r4, r6\n\t"
  56617. #endif
  56618. #ifdef WOLFSSL_KEIL
  56619. "adcs r2, r2, %[r]\n\t"
  56620. #elif defined(__clang__)
  56621. "adcs r2, %[r]\n\t"
  56622. #else
  56623. "adc r2, %[r]\n\t"
  56624. #endif
  56625. #ifdef WOLFSSL_KEIL
  56626. "adcs r3, r3, %[r]\n\t"
  56627. #elif defined(__clang__)
  56628. "adcs r3, %[r]\n\t"
  56629. #else
  56630. "adc r3, %[r]\n\t"
  56631. #endif
  56632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56633. "lsrs r6, r7, #16\n\t"
  56634. #else
  56635. "lsr r6, r7, #16\n\t"
  56636. #endif
  56637. #ifdef WOLFSSL_KEIL
  56638. "muls r5, r6, r5\n\t"
  56639. #elif defined(__clang__)
  56640. "muls r5, r6\n\t"
  56641. #else
  56642. "mul r5, r6\n\t"
  56643. #endif
  56644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56645. "lsrs r6, r5, #16\n\t"
  56646. #else
  56647. "lsr r6, r5, #16\n\t"
  56648. #endif
  56649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56650. "lsls r5, r5, #16\n\t"
  56651. #else
  56652. "lsl r5, r5, #16\n\t"
  56653. #endif
  56654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56655. "adds r4, r4, r5\n\t"
  56656. #else
  56657. "add r4, r4, r5\n\t"
  56658. #endif
  56659. #ifdef WOLFSSL_KEIL
  56660. "adcs r2, r2, r6\n\t"
  56661. #elif defined(__clang__)
  56662. "adcs r2, r6\n\t"
  56663. #else
  56664. "adc r2, r6\n\t"
  56665. #endif
  56666. #ifdef WOLFSSL_KEIL
  56667. "adcs r3, r3, %[r]\n\t"
  56668. #elif defined(__clang__)
  56669. "adcs r3, %[r]\n\t"
  56670. #else
  56671. "adc r3, %[r]\n\t"
  56672. #endif
  56673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56674. "adds r4, r4, r5\n\t"
  56675. #else
  56676. "add r4, r4, r5\n\t"
  56677. #endif
  56678. #ifdef WOLFSSL_KEIL
  56679. "adcs r2, r2, r6\n\t"
  56680. #elif defined(__clang__)
  56681. "adcs r2, r6\n\t"
  56682. #else
  56683. "adc r2, r6\n\t"
  56684. #endif
  56685. #ifdef WOLFSSL_KEIL
  56686. "adcs r3, r3, %[r]\n\t"
  56687. #elif defined(__clang__)
  56688. "adcs r3, %[r]\n\t"
  56689. #else
  56690. "adc r3, %[r]\n\t"
  56691. #endif
  56692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56693. "lsrs r5, %[a], #16\n\t"
  56694. #else
  56695. "lsr r5, %[a], #16\n\t"
  56696. #endif
  56697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56698. "lsrs r6, r7, #16\n\t"
  56699. #else
  56700. "lsr r6, r7, #16\n\t"
  56701. #endif
  56702. #ifdef WOLFSSL_KEIL
  56703. "muls r6, r5, r6\n\t"
  56704. #elif defined(__clang__)
  56705. "muls r6, r5\n\t"
  56706. #else
  56707. "mul r6, r5\n\t"
  56708. #endif
  56709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56710. "adds r2, r2, r6\n\t"
  56711. #else
  56712. "add r2, r2, r6\n\t"
  56713. #endif
  56714. #ifdef WOLFSSL_KEIL
  56715. "adcs r3, r3, %[r]\n\t"
  56716. #elif defined(__clang__)
  56717. "adcs r3, %[r]\n\t"
  56718. #else
  56719. "adc r3, %[r]\n\t"
  56720. #endif
  56721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56722. "adds r2, r2, r6\n\t"
  56723. #else
  56724. "add r2, r2, r6\n\t"
  56725. #endif
  56726. #ifdef WOLFSSL_KEIL
  56727. "adcs r3, r3, %[r]\n\t"
  56728. #elif defined(__clang__)
  56729. "adcs r3, %[r]\n\t"
  56730. #else
  56731. "adc r3, %[r]\n\t"
  56732. #endif
  56733. "uxth r6, r7\n\t"
  56734. #ifdef WOLFSSL_KEIL
  56735. "muls r5, r6, r5\n\t"
  56736. #elif defined(__clang__)
  56737. "muls r5, r6\n\t"
  56738. #else
  56739. "mul r5, r6\n\t"
  56740. #endif
  56741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56742. "lsrs r6, r5, #16\n\t"
  56743. #else
  56744. "lsr r6, r5, #16\n\t"
  56745. #endif
  56746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56747. "lsls r5, r5, #16\n\t"
  56748. #else
  56749. "lsl r5, r5, #16\n\t"
  56750. #endif
  56751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56752. "adds r4, r4, r5\n\t"
  56753. #else
  56754. "add r4, r4, r5\n\t"
  56755. #endif
  56756. #ifdef WOLFSSL_KEIL
  56757. "adcs r2, r2, r6\n\t"
  56758. #elif defined(__clang__)
  56759. "adcs r2, r6\n\t"
  56760. #else
  56761. "adc r2, r6\n\t"
  56762. #endif
  56763. #ifdef WOLFSSL_KEIL
  56764. "adcs r3, r3, %[r]\n\t"
  56765. #elif defined(__clang__)
  56766. "adcs r3, %[r]\n\t"
  56767. #else
  56768. "adc r3, %[r]\n\t"
  56769. #endif
  56770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56771. "adds r4, r4, r5\n\t"
  56772. #else
  56773. "add r4, r4, r5\n\t"
  56774. #endif
  56775. #ifdef WOLFSSL_KEIL
  56776. "adcs r2, r2, r6\n\t"
  56777. #elif defined(__clang__)
  56778. "adcs r2, r6\n\t"
  56779. #else
  56780. "adc r2, r6\n\t"
  56781. #endif
  56782. #ifdef WOLFSSL_KEIL
  56783. "adcs r3, r3, %[r]\n\t"
  56784. #elif defined(__clang__)
  56785. "adcs r3, %[r]\n\t"
  56786. #else
  56787. "adc r3, %[r]\n\t"
  56788. #endif
  56789. "# A[4] * A[1]\n\t"
  56790. "mov %[a], r9\n\t"
  56791. "mov r7, r11\n\t"
  56792. "ldr %[a], [%[a], #16]\n\t"
  56793. "uxth r5, %[a]\n\t"
  56794. "uxth r6, r7\n\t"
  56795. #ifdef WOLFSSL_KEIL
  56796. "muls r6, r5, r6\n\t"
  56797. #elif defined(__clang__)
  56798. "muls r6, r5\n\t"
  56799. #else
  56800. "mul r6, r5\n\t"
  56801. #endif
  56802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56803. "adds r4, r4, r6\n\t"
  56804. #else
  56805. "add r4, r4, r6\n\t"
  56806. #endif
  56807. #ifdef WOLFSSL_KEIL
  56808. "adcs r2, r2, %[r]\n\t"
  56809. #elif defined(__clang__)
  56810. "adcs r2, %[r]\n\t"
  56811. #else
  56812. "adc r2, %[r]\n\t"
  56813. #endif
  56814. #ifdef WOLFSSL_KEIL
  56815. "adcs r3, r3, %[r]\n\t"
  56816. #elif defined(__clang__)
  56817. "adcs r3, %[r]\n\t"
  56818. #else
  56819. "adc r3, %[r]\n\t"
  56820. #endif
  56821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56822. "adds r4, r4, r6\n\t"
  56823. #else
  56824. "add r4, r4, r6\n\t"
  56825. #endif
  56826. #ifdef WOLFSSL_KEIL
  56827. "adcs r2, r2, %[r]\n\t"
  56828. #elif defined(__clang__)
  56829. "adcs r2, %[r]\n\t"
  56830. #else
  56831. "adc r2, %[r]\n\t"
  56832. #endif
  56833. #ifdef WOLFSSL_KEIL
  56834. "adcs r3, r3, %[r]\n\t"
  56835. #elif defined(__clang__)
  56836. "adcs r3, %[r]\n\t"
  56837. #else
  56838. "adc r3, %[r]\n\t"
  56839. #endif
  56840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56841. "lsrs r6, r7, #16\n\t"
  56842. #else
  56843. "lsr r6, r7, #16\n\t"
  56844. #endif
  56845. #ifdef WOLFSSL_KEIL
  56846. "muls r5, r6, r5\n\t"
  56847. #elif defined(__clang__)
  56848. "muls r5, r6\n\t"
  56849. #else
  56850. "mul r5, r6\n\t"
  56851. #endif
  56852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56853. "lsrs r6, r5, #16\n\t"
  56854. #else
  56855. "lsr r6, r5, #16\n\t"
  56856. #endif
  56857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56858. "lsls r5, r5, #16\n\t"
  56859. #else
  56860. "lsl r5, r5, #16\n\t"
  56861. #endif
  56862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56863. "adds r4, r4, r5\n\t"
  56864. #else
  56865. "add r4, r4, r5\n\t"
  56866. #endif
  56867. #ifdef WOLFSSL_KEIL
  56868. "adcs r2, r2, r6\n\t"
  56869. #elif defined(__clang__)
  56870. "adcs r2, r6\n\t"
  56871. #else
  56872. "adc r2, r6\n\t"
  56873. #endif
  56874. #ifdef WOLFSSL_KEIL
  56875. "adcs r3, r3, %[r]\n\t"
  56876. #elif defined(__clang__)
  56877. "adcs r3, %[r]\n\t"
  56878. #else
  56879. "adc r3, %[r]\n\t"
  56880. #endif
  56881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56882. "adds r4, r4, r5\n\t"
  56883. #else
  56884. "add r4, r4, r5\n\t"
  56885. #endif
  56886. #ifdef WOLFSSL_KEIL
  56887. "adcs r2, r2, r6\n\t"
  56888. #elif defined(__clang__)
  56889. "adcs r2, r6\n\t"
  56890. #else
  56891. "adc r2, r6\n\t"
  56892. #endif
  56893. #ifdef WOLFSSL_KEIL
  56894. "adcs r3, r3, %[r]\n\t"
  56895. #elif defined(__clang__)
  56896. "adcs r3, %[r]\n\t"
  56897. #else
  56898. "adc r3, %[r]\n\t"
  56899. #endif
  56900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56901. "lsrs r5, %[a], #16\n\t"
  56902. #else
  56903. "lsr r5, %[a], #16\n\t"
  56904. #endif
  56905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56906. "lsrs r6, r7, #16\n\t"
  56907. #else
  56908. "lsr r6, r7, #16\n\t"
  56909. #endif
  56910. #ifdef WOLFSSL_KEIL
  56911. "muls r6, r5, r6\n\t"
  56912. #elif defined(__clang__)
  56913. "muls r6, r5\n\t"
  56914. #else
  56915. "mul r6, r5\n\t"
  56916. #endif
  56917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56918. "adds r2, r2, r6\n\t"
  56919. #else
  56920. "add r2, r2, r6\n\t"
  56921. #endif
  56922. #ifdef WOLFSSL_KEIL
  56923. "adcs r3, r3, %[r]\n\t"
  56924. #elif defined(__clang__)
  56925. "adcs r3, %[r]\n\t"
  56926. #else
  56927. "adc r3, %[r]\n\t"
  56928. #endif
  56929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56930. "adds r2, r2, r6\n\t"
  56931. #else
  56932. "add r2, r2, r6\n\t"
  56933. #endif
  56934. #ifdef WOLFSSL_KEIL
  56935. "adcs r3, r3, %[r]\n\t"
  56936. #elif defined(__clang__)
  56937. "adcs r3, %[r]\n\t"
  56938. #else
  56939. "adc r3, %[r]\n\t"
  56940. #endif
  56941. "uxth r6, r7\n\t"
  56942. #ifdef WOLFSSL_KEIL
  56943. "muls r5, r6, r5\n\t"
  56944. #elif defined(__clang__)
  56945. "muls r5, r6\n\t"
  56946. #else
  56947. "mul r5, r6\n\t"
  56948. #endif
  56949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56950. "lsrs r6, r5, #16\n\t"
  56951. #else
  56952. "lsr r6, r5, #16\n\t"
  56953. #endif
  56954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56955. "lsls r5, r5, #16\n\t"
  56956. #else
  56957. "lsl r5, r5, #16\n\t"
  56958. #endif
  56959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56960. "adds r4, r4, r5\n\t"
  56961. #else
  56962. "add r4, r4, r5\n\t"
  56963. #endif
  56964. #ifdef WOLFSSL_KEIL
  56965. "adcs r2, r2, r6\n\t"
  56966. #elif defined(__clang__)
  56967. "adcs r2, r6\n\t"
  56968. #else
  56969. "adc r2, r6\n\t"
  56970. #endif
  56971. #ifdef WOLFSSL_KEIL
  56972. "adcs r3, r3, %[r]\n\t"
  56973. #elif defined(__clang__)
  56974. "adcs r3, %[r]\n\t"
  56975. #else
  56976. "adc r3, %[r]\n\t"
  56977. #endif
  56978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56979. "adds r4, r4, r5\n\t"
  56980. #else
  56981. "add r4, r4, r5\n\t"
  56982. #endif
  56983. #ifdef WOLFSSL_KEIL
  56984. "adcs r2, r2, r6\n\t"
  56985. #elif defined(__clang__)
  56986. "adcs r2, r6\n\t"
  56987. #else
  56988. "adc r2, r6\n\t"
  56989. #endif
  56990. #ifdef WOLFSSL_KEIL
  56991. "adcs r3, r3, %[r]\n\t"
  56992. #elif defined(__clang__)
  56993. "adcs r3, %[r]\n\t"
  56994. #else
  56995. "adc r3, %[r]\n\t"
  56996. #endif
  56997. "# A[5] * A[0]\n\t"
  56998. "mov %[a], r9\n\t"
  56999. "mov r7, r10\n\t"
  57000. "ldr %[a], [%[a], #20]\n\t"
  57001. "uxth r5, %[a]\n\t"
  57002. "uxth r6, r7\n\t"
  57003. #ifdef WOLFSSL_KEIL
  57004. "muls r6, r5, r6\n\t"
  57005. #elif defined(__clang__)
  57006. "muls r6, r5\n\t"
  57007. #else
  57008. "mul r6, r5\n\t"
  57009. #endif
  57010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57011. "adds r4, r4, r6\n\t"
  57012. #else
  57013. "add r4, r4, r6\n\t"
  57014. #endif
  57015. #ifdef WOLFSSL_KEIL
  57016. "adcs r2, r2, %[r]\n\t"
  57017. #elif defined(__clang__)
  57018. "adcs r2, %[r]\n\t"
  57019. #else
  57020. "adc r2, %[r]\n\t"
  57021. #endif
  57022. #ifdef WOLFSSL_KEIL
  57023. "adcs r3, r3, %[r]\n\t"
  57024. #elif defined(__clang__)
  57025. "adcs r3, %[r]\n\t"
  57026. #else
  57027. "adc r3, %[r]\n\t"
  57028. #endif
  57029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57030. "adds r4, r4, r6\n\t"
  57031. #else
  57032. "add r4, r4, r6\n\t"
  57033. #endif
  57034. #ifdef WOLFSSL_KEIL
  57035. "adcs r2, r2, %[r]\n\t"
  57036. #elif defined(__clang__)
  57037. "adcs r2, %[r]\n\t"
  57038. #else
  57039. "adc r2, %[r]\n\t"
  57040. #endif
  57041. #ifdef WOLFSSL_KEIL
  57042. "adcs r3, r3, %[r]\n\t"
  57043. #elif defined(__clang__)
  57044. "adcs r3, %[r]\n\t"
  57045. #else
  57046. "adc r3, %[r]\n\t"
  57047. #endif
  57048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57049. "lsrs r6, r7, #16\n\t"
  57050. #else
  57051. "lsr r6, r7, #16\n\t"
  57052. #endif
  57053. #ifdef WOLFSSL_KEIL
  57054. "muls r5, r6, r5\n\t"
  57055. #elif defined(__clang__)
  57056. "muls r5, r6\n\t"
  57057. #else
  57058. "mul r5, r6\n\t"
  57059. #endif
  57060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57061. "lsrs r6, r5, #16\n\t"
  57062. #else
  57063. "lsr r6, r5, #16\n\t"
  57064. #endif
  57065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57066. "lsls r5, r5, #16\n\t"
  57067. #else
  57068. "lsl r5, r5, #16\n\t"
  57069. #endif
  57070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57071. "adds r4, r4, r5\n\t"
  57072. #else
  57073. "add r4, r4, r5\n\t"
  57074. #endif
  57075. #ifdef WOLFSSL_KEIL
  57076. "adcs r2, r2, r6\n\t"
  57077. #elif defined(__clang__)
  57078. "adcs r2, r6\n\t"
  57079. #else
  57080. "adc r2, r6\n\t"
  57081. #endif
  57082. #ifdef WOLFSSL_KEIL
  57083. "adcs r3, r3, %[r]\n\t"
  57084. #elif defined(__clang__)
  57085. "adcs r3, %[r]\n\t"
  57086. #else
  57087. "adc r3, %[r]\n\t"
  57088. #endif
  57089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57090. "adds r4, r4, r5\n\t"
  57091. #else
  57092. "add r4, r4, r5\n\t"
  57093. #endif
  57094. #ifdef WOLFSSL_KEIL
  57095. "adcs r2, r2, r6\n\t"
  57096. #elif defined(__clang__)
  57097. "adcs r2, r6\n\t"
  57098. #else
  57099. "adc r2, r6\n\t"
  57100. #endif
  57101. #ifdef WOLFSSL_KEIL
  57102. "adcs r3, r3, %[r]\n\t"
  57103. #elif defined(__clang__)
  57104. "adcs r3, %[r]\n\t"
  57105. #else
  57106. "adc r3, %[r]\n\t"
  57107. #endif
  57108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57109. "lsrs r5, %[a], #16\n\t"
  57110. #else
  57111. "lsr r5, %[a], #16\n\t"
  57112. #endif
  57113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57114. "lsrs r6, r7, #16\n\t"
  57115. #else
  57116. "lsr r6, r7, #16\n\t"
  57117. #endif
  57118. #ifdef WOLFSSL_KEIL
  57119. "muls r6, r5, r6\n\t"
  57120. #elif defined(__clang__)
  57121. "muls r6, r5\n\t"
  57122. #else
  57123. "mul r6, r5\n\t"
  57124. #endif
  57125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57126. "adds r2, r2, r6\n\t"
  57127. #else
  57128. "add r2, r2, r6\n\t"
  57129. #endif
  57130. #ifdef WOLFSSL_KEIL
  57131. "adcs r3, r3, %[r]\n\t"
  57132. #elif defined(__clang__)
  57133. "adcs r3, %[r]\n\t"
  57134. #else
  57135. "adc r3, %[r]\n\t"
  57136. #endif
  57137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57138. "adds r2, r2, r6\n\t"
  57139. #else
  57140. "add r2, r2, r6\n\t"
  57141. #endif
  57142. #ifdef WOLFSSL_KEIL
  57143. "adcs r3, r3, %[r]\n\t"
  57144. #elif defined(__clang__)
  57145. "adcs r3, %[r]\n\t"
  57146. #else
  57147. "adc r3, %[r]\n\t"
  57148. #endif
  57149. "uxth r6, r7\n\t"
  57150. #ifdef WOLFSSL_KEIL
  57151. "muls r5, r6, r5\n\t"
  57152. #elif defined(__clang__)
  57153. "muls r5, r6\n\t"
  57154. #else
  57155. "mul r5, r6\n\t"
  57156. #endif
  57157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57158. "lsrs r6, r5, #16\n\t"
  57159. #else
  57160. "lsr r6, r5, #16\n\t"
  57161. #endif
  57162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57163. "lsls r5, r5, #16\n\t"
  57164. #else
  57165. "lsl r5, r5, #16\n\t"
  57166. #endif
  57167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57168. "adds r4, r4, r5\n\t"
  57169. #else
  57170. "add r4, r4, r5\n\t"
  57171. #endif
  57172. #ifdef WOLFSSL_KEIL
  57173. "adcs r2, r2, r6\n\t"
  57174. #elif defined(__clang__)
  57175. "adcs r2, r6\n\t"
  57176. #else
  57177. "adc r2, r6\n\t"
  57178. #endif
  57179. #ifdef WOLFSSL_KEIL
  57180. "adcs r3, r3, %[r]\n\t"
  57181. #elif defined(__clang__)
  57182. "adcs r3, %[r]\n\t"
  57183. #else
  57184. "adc r3, %[r]\n\t"
  57185. #endif
  57186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57187. "adds r4, r4, r5\n\t"
  57188. #else
  57189. "add r4, r4, r5\n\t"
  57190. #endif
  57191. #ifdef WOLFSSL_KEIL
  57192. "adcs r2, r2, r6\n\t"
  57193. #elif defined(__clang__)
  57194. "adcs r2, r6\n\t"
  57195. #else
  57196. "adc r2, r6\n\t"
  57197. #endif
  57198. #ifdef WOLFSSL_KEIL
  57199. "adcs r3, r3, %[r]\n\t"
  57200. #elif defined(__clang__)
  57201. "adcs r3, %[r]\n\t"
  57202. #else
  57203. "adc r3, %[r]\n\t"
  57204. #endif
  57205. "str r4, [sp, #20]\n\t"
  57206. "# A[6] * A[0]\n\t"
  57207. "movs r4, #0\n\t"
  57208. "mov %[a], r9\n\t"
  57209. "ldr %[a], [%[a], #24]\n\t"
  57210. "uxth r5, %[a]\n\t"
  57211. "uxth r6, r7\n\t"
  57212. #ifdef WOLFSSL_KEIL
  57213. "muls r6, r5, r6\n\t"
  57214. #elif defined(__clang__)
  57215. "muls r6, r5\n\t"
  57216. #else
  57217. "mul r6, r5\n\t"
  57218. #endif
  57219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57220. "adds r2, r2, r6\n\t"
  57221. #else
  57222. "add r2, r2, r6\n\t"
  57223. #endif
  57224. #ifdef WOLFSSL_KEIL
  57225. "adcs r3, r3, %[r]\n\t"
  57226. #elif defined(__clang__)
  57227. "adcs r3, %[r]\n\t"
  57228. #else
  57229. "adc r3, %[r]\n\t"
  57230. #endif
  57231. #ifdef WOLFSSL_KEIL
  57232. "adcs r4, r4, %[r]\n\t"
  57233. #elif defined(__clang__)
  57234. "adcs r4, %[r]\n\t"
  57235. #else
  57236. "adc r4, %[r]\n\t"
  57237. #endif
  57238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57239. "adds r2, r2, r6\n\t"
  57240. #else
  57241. "add r2, r2, r6\n\t"
  57242. #endif
  57243. #ifdef WOLFSSL_KEIL
  57244. "adcs r3, r3, %[r]\n\t"
  57245. #elif defined(__clang__)
  57246. "adcs r3, %[r]\n\t"
  57247. #else
  57248. "adc r3, %[r]\n\t"
  57249. #endif
  57250. #ifdef WOLFSSL_KEIL
  57251. "adcs r4, r4, %[r]\n\t"
  57252. #elif defined(__clang__)
  57253. "adcs r4, %[r]\n\t"
  57254. #else
  57255. "adc r4, %[r]\n\t"
  57256. #endif
  57257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57258. "lsrs r6, r7, #16\n\t"
  57259. #else
  57260. "lsr r6, r7, #16\n\t"
  57261. #endif
  57262. #ifdef WOLFSSL_KEIL
  57263. "muls r5, r6, r5\n\t"
  57264. #elif defined(__clang__)
  57265. "muls r5, r6\n\t"
  57266. #else
  57267. "mul r5, r6\n\t"
  57268. #endif
  57269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57270. "lsrs r6, r5, #16\n\t"
  57271. #else
  57272. "lsr r6, r5, #16\n\t"
  57273. #endif
  57274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57275. "lsls r5, r5, #16\n\t"
  57276. #else
  57277. "lsl r5, r5, #16\n\t"
  57278. #endif
  57279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57280. "adds r2, r2, r5\n\t"
  57281. #else
  57282. "add r2, r2, r5\n\t"
  57283. #endif
  57284. #ifdef WOLFSSL_KEIL
  57285. "adcs r3, r3, r6\n\t"
  57286. #elif defined(__clang__)
  57287. "adcs r3, r6\n\t"
  57288. #else
  57289. "adc r3, r6\n\t"
  57290. #endif
  57291. #ifdef WOLFSSL_KEIL
  57292. "adcs r4, r4, %[r]\n\t"
  57293. #elif defined(__clang__)
  57294. "adcs r4, %[r]\n\t"
  57295. #else
  57296. "adc r4, %[r]\n\t"
  57297. #endif
  57298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57299. "adds r2, r2, r5\n\t"
  57300. #else
  57301. "add r2, r2, r5\n\t"
  57302. #endif
  57303. #ifdef WOLFSSL_KEIL
  57304. "adcs r3, r3, r6\n\t"
  57305. #elif defined(__clang__)
  57306. "adcs r3, r6\n\t"
  57307. #else
  57308. "adc r3, r6\n\t"
  57309. #endif
  57310. #ifdef WOLFSSL_KEIL
  57311. "adcs r4, r4, %[r]\n\t"
  57312. #elif defined(__clang__)
  57313. "adcs r4, %[r]\n\t"
  57314. #else
  57315. "adc r4, %[r]\n\t"
  57316. #endif
  57317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57318. "lsrs r5, %[a], #16\n\t"
  57319. #else
  57320. "lsr r5, %[a], #16\n\t"
  57321. #endif
  57322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57323. "lsrs r6, r7, #16\n\t"
  57324. #else
  57325. "lsr r6, r7, #16\n\t"
  57326. #endif
  57327. #ifdef WOLFSSL_KEIL
  57328. "muls r6, r5, r6\n\t"
  57329. #elif defined(__clang__)
  57330. "muls r6, r5\n\t"
  57331. #else
  57332. "mul r6, r5\n\t"
  57333. #endif
  57334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57335. "adds r3, r3, r6\n\t"
  57336. #else
  57337. "add r3, r3, r6\n\t"
  57338. #endif
  57339. #ifdef WOLFSSL_KEIL
  57340. "adcs r4, r4, %[r]\n\t"
  57341. #elif defined(__clang__)
  57342. "adcs r4, %[r]\n\t"
  57343. #else
  57344. "adc r4, %[r]\n\t"
  57345. #endif
  57346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57347. "adds r3, r3, r6\n\t"
  57348. #else
  57349. "add r3, r3, r6\n\t"
  57350. #endif
  57351. #ifdef WOLFSSL_KEIL
  57352. "adcs r4, r4, %[r]\n\t"
  57353. #elif defined(__clang__)
  57354. "adcs r4, %[r]\n\t"
  57355. #else
  57356. "adc r4, %[r]\n\t"
  57357. #endif
  57358. "uxth r6, r7\n\t"
  57359. #ifdef WOLFSSL_KEIL
  57360. "muls r5, r6, r5\n\t"
  57361. #elif defined(__clang__)
  57362. "muls r5, r6\n\t"
  57363. #else
  57364. "mul r5, r6\n\t"
  57365. #endif
  57366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57367. "lsrs r6, r5, #16\n\t"
  57368. #else
  57369. "lsr r6, r5, #16\n\t"
  57370. #endif
  57371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57372. "lsls r5, r5, #16\n\t"
  57373. #else
  57374. "lsl r5, r5, #16\n\t"
  57375. #endif
  57376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57377. "adds r2, r2, r5\n\t"
  57378. #else
  57379. "add r2, r2, r5\n\t"
  57380. #endif
  57381. #ifdef WOLFSSL_KEIL
  57382. "adcs r3, r3, r6\n\t"
  57383. #elif defined(__clang__)
  57384. "adcs r3, r6\n\t"
  57385. #else
  57386. "adc r3, r6\n\t"
  57387. #endif
  57388. #ifdef WOLFSSL_KEIL
  57389. "adcs r4, r4, %[r]\n\t"
  57390. #elif defined(__clang__)
  57391. "adcs r4, %[r]\n\t"
  57392. #else
  57393. "adc r4, %[r]\n\t"
  57394. #endif
  57395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57396. "adds r2, r2, r5\n\t"
  57397. #else
  57398. "add r2, r2, r5\n\t"
  57399. #endif
  57400. #ifdef WOLFSSL_KEIL
  57401. "adcs r3, r3, r6\n\t"
  57402. #elif defined(__clang__)
  57403. "adcs r3, r6\n\t"
  57404. #else
  57405. "adc r3, r6\n\t"
  57406. #endif
  57407. #ifdef WOLFSSL_KEIL
  57408. "adcs r4, r4, %[r]\n\t"
  57409. #elif defined(__clang__)
  57410. "adcs r4, %[r]\n\t"
  57411. #else
  57412. "adc r4, %[r]\n\t"
  57413. #endif
  57414. "# A[5] * A[1]\n\t"
  57415. "mov %[a], r9\n\t"
  57416. "mov r7, r11\n\t"
  57417. "ldr %[a], [%[a], #20]\n\t"
  57418. "uxth r5, %[a]\n\t"
  57419. "uxth r6, r7\n\t"
  57420. #ifdef WOLFSSL_KEIL
  57421. "muls r6, r5, r6\n\t"
  57422. #elif defined(__clang__)
  57423. "muls r6, r5\n\t"
  57424. #else
  57425. "mul r6, r5\n\t"
  57426. #endif
  57427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57428. "adds r2, r2, r6\n\t"
  57429. #else
  57430. "add r2, r2, r6\n\t"
  57431. #endif
  57432. #ifdef WOLFSSL_KEIL
  57433. "adcs r3, r3, %[r]\n\t"
  57434. #elif defined(__clang__)
  57435. "adcs r3, %[r]\n\t"
  57436. #else
  57437. "adc r3, %[r]\n\t"
  57438. #endif
  57439. #ifdef WOLFSSL_KEIL
  57440. "adcs r4, r4, %[r]\n\t"
  57441. #elif defined(__clang__)
  57442. "adcs r4, %[r]\n\t"
  57443. #else
  57444. "adc r4, %[r]\n\t"
  57445. #endif
  57446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57447. "adds r2, r2, r6\n\t"
  57448. #else
  57449. "add r2, r2, r6\n\t"
  57450. #endif
  57451. #ifdef WOLFSSL_KEIL
  57452. "adcs r3, r3, %[r]\n\t"
  57453. #elif defined(__clang__)
  57454. "adcs r3, %[r]\n\t"
  57455. #else
  57456. "adc r3, %[r]\n\t"
  57457. #endif
  57458. #ifdef WOLFSSL_KEIL
  57459. "adcs r4, r4, %[r]\n\t"
  57460. #elif defined(__clang__)
  57461. "adcs r4, %[r]\n\t"
  57462. #else
  57463. "adc r4, %[r]\n\t"
  57464. #endif
  57465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57466. "lsrs r6, r7, #16\n\t"
  57467. #else
  57468. "lsr r6, r7, #16\n\t"
  57469. #endif
  57470. #ifdef WOLFSSL_KEIL
  57471. "muls r5, r6, r5\n\t"
  57472. #elif defined(__clang__)
  57473. "muls r5, r6\n\t"
  57474. #else
  57475. "mul r5, r6\n\t"
  57476. #endif
  57477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57478. "lsrs r6, r5, #16\n\t"
  57479. #else
  57480. "lsr r6, r5, #16\n\t"
  57481. #endif
  57482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57483. "lsls r5, r5, #16\n\t"
  57484. #else
  57485. "lsl r5, r5, #16\n\t"
  57486. #endif
  57487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57488. "adds r2, r2, r5\n\t"
  57489. #else
  57490. "add r2, r2, r5\n\t"
  57491. #endif
  57492. #ifdef WOLFSSL_KEIL
  57493. "adcs r3, r3, r6\n\t"
  57494. #elif defined(__clang__)
  57495. "adcs r3, r6\n\t"
  57496. #else
  57497. "adc r3, r6\n\t"
  57498. #endif
  57499. #ifdef WOLFSSL_KEIL
  57500. "adcs r4, r4, %[r]\n\t"
  57501. #elif defined(__clang__)
  57502. "adcs r4, %[r]\n\t"
  57503. #else
  57504. "adc r4, %[r]\n\t"
  57505. #endif
  57506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57507. "adds r2, r2, r5\n\t"
  57508. #else
  57509. "add r2, r2, r5\n\t"
  57510. #endif
  57511. #ifdef WOLFSSL_KEIL
  57512. "adcs r3, r3, r6\n\t"
  57513. #elif defined(__clang__)
  57514. "adcs r3, r6\n\t"
  57515. #else
  57516. "adc r3, r6\n\t"
  57517. #endif
  57518. #ifdef WOLFSSL_KEIL
  57519. "adcs r4, r4, %[r]\n\t"
  57520. #elif defined(__clang__)
  57521. "adcs r4, %[r]\n\t"
  57522. #else
  57523. "adc r4, %[r]\n\t"
  57524. #endif
  57525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57526. "lsrs r5, %[a], #16\n\t"
  57527. #else
  57528. "lsr r5, %[a], #16\n\t"
  57529. #endif
  57530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57531. "lsrs r6, r7, #16\n\t"
  57532. #else
  57533. "lsr r6, r7, #16\n\t"
  57534. #endif
  57535. #ifdef WOLFSSL_KEIL
  57536. "muls r6, r5, r6\n\t"
  57537. #elif defined(__clang__)
  57538. "muls r6, r5\n\t"
  57539. #else
  57540. "mul r6, r5\n\t"
  57541. #endif
  57542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57543. "adds r3, r3, r6\n\t"
  57544. #else
  57545. "add r3, r3, r6\n\t"
  57546. #endif
  57547. #ifdef WOLFSSL_KEIL
  57548. "adcs r4, r4, %[r]\n\t"
  57549. #elif defined(__clang__)
  57550. "adcs r4, %[r]\n\t"
  57551. #else
  57552. "adc r4, %[r]\n\t"
  57553. #endif
  57554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57555. "adds r3, r3, r6\n\t"
  57556. #else
  57557. "add r3, r3, r6\n\t"
  57558. #endif
  57559. #ifdef WOLFSSL_KEIL
  57560. "adcs r4, r4, %[r]\n\t"
  57561. #elif defined(__clang__)
  57562. "adcs r4, %[r]\n\t"
  57563. #else
  57564. "adc r4, %[r]\n\t"
  57565. #endif
  57566. "uxth r6, r7\n\t"
  57567. #ifdef WOLFSSL_KEIL
  57568. "muls r5, r6, r5\n\t"
  57569. #elif defined(__clang__)
  57570. "muls r5, r6\n\t"
  57571. #else
  57572. "mul r5, r6\n\t"
  57573. #endif
  57574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57575. "lsrs r6, r5, #16\n\t"
  57576. #else
  57577. "lsr r6, r5, #16\n\t"
  57578. #endif
  57579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57580. "lsls r5, r5, #16\n\t"
  57581. #else
  57582. "lsl r5, r5, #16\n\t"
  57583. #endif
  57584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57585. "adds r2, r2, r5\n\t"
  57586. #else
  57587. "add r2, r2, r5\n\t"
  57588. #endif
  57589. #ifdef WOLFSSL_KEIL
  57590. "adcs r3, r3, r6\n\t"
  57591. #elif defined(__clang__)
  57592. "adcs r3, r6\n\t"
  57593. #else
  57594. "adc r3, r6\n\t"
  57595. #endif
  57596. #ifdef WOLFSSL_KEIL
  57597. "adcs r4, r4, %[r]\n\t"
  57598. #elif defined(__clang__)
  57599. "adcs r4, %[r]\n\t"
  57600. #else
  57601. "adc r4, %[r]\n\t"
  57602. #endif
  57603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57604. "adds r2, r2, r5\n\t"
  57605. #else
  57606. "add r2, r2, r5\n\t"
  57607. #endif
  57608. #ifdef WOLFSSL_KEIL
  57609. "adcs r3, r3, r6\n\t"
  57610. #elif defined(__clang__)
  57611. "adcs r3, r6\n\t"
  57612. #else
  57613. "adc r3, r6\n\t"
  57614. #endif
  57615. #ifdef WOLFSSL_KEIL
  57616. "adcs r4, r4, %[r]\n\t"
  57617. #elif defined(__clang__)
  57618. "adcs r4, %[r]\n\t"
  57619. #else
  57620. "adc r4, %[r]\n\t"
  57621. #endif
  57622. "# A[4] * A[2]\n\t"
  57623. "mov %[a], r9\n\t"
  57624. "mov r7, r12\n\t"
  57625. "ldr %[a], [%[a], #16]\n\t"
  57626. "uxth r5, %[a]\n\t"
  57627. "uxth r6, r7\n\t"
  57628. #ifdef WOLFSSL_KEIL
  57629. "muls r6, r5, r6\n\t"
  57630. #elif defined(__clang__)
  57631. "muls r6, r5\n\t"
  57632. #else
  57633. "mul r6, r5\n\t"
  57634. #endif
  57635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57636. "adds r2, r2, r6\n\t"
  57637. #else
  57638. "add r2, r2, r6\n\t"
  57639. #endif
  57640. #ifdef WOLFSSL_KEIL
  57641. "adcs r3, r3, %[r]\n\t"
  57642. #elif defined(__clang__)
  57643. "adcs r3, %[r]\n\t"
  57644. #else
  57645. "adc r3, %[r]\n\t"
  57646. #endif
  57647. #ifdef WOLFSSL_KEIL
  57648. "adcs r4, r4, %[r]\n\t"
  57649. #elif defined(__clang__)
  57650. "adcs r4, %[r]\n\t"
  57651. #else
  57652. "adc r4, %[r]\n\t"
  57653. #endif
  57654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57655. "adds r2, r2, r6\n\t"
  57656. #else
  57657. "add r2, r2, r6\n\t"
  57658. #endif
  57659. #ifdef WOLFSSL_KEIL
  57660. "adcs r3, r3, %[r]\n\t"
  57661. #elif defined(__clang__)
  57662. "adcs r3, %[r]\n\t"
  57663. #else
  57664. "adc r3, %[r]\n\t"
  57665. #endif
  57666. #ifdef WOLFSSL_KEIL
  57667. "adcs r4, r4, %[r]\n\t"
  57668. #elif defined(__clang__)
  57669. "adcs r4, %[r]\n\t"
  57670. #else
  57671. "adc r4, %[r]\n\t"
  57672. #endif
  57673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57674. "lsrs r6, r7, #16\n\t"
  57675. #else
  57676. "lsr r6, r7, #16\n\t"
  57677. #endif
  57678. #ifdef WOLFSSL_KEIL
  57679. "muls r5, r6, r5\n\t"
  57680. #elif defined(__clang__)
  57681. "muls r5, r6\n\t"
  57682. #else
  57683. "mul r5, r6\n\t"
  57684. #endif
  57685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57686. "lsrs r6, r5, #16\n\t"
  57687. #else
  57688. "lsr r6, r5, #16\n\t"
  57689. #endif
  57690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57691. "lsls r5, r5, #16\n\t"
  57692. #else
  57693. "lsl r5, r5, #16\n\t"
  57694. #endif
  57695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57696. "adds r2, r2, r5\n\t"
  57697. #else
  57698. "add r2, r2, r5\n\t"
  57699. #endif
  57700. #ifdef WOLFSSL_KEIL
  57701. "adcs r3, r3, r6\n\t"
  57702. #elif defined(__clang__)
  57703. "adcs r3, r6\n\t"
  57704. #else
  57705. "adc r3, r6\n\t"
  57706. #endif
  57707. #ifdef WOLFSSL_KEIL
  57708. "adcs r4, r4, %[r]\n\t"
  57709. #elif defined(__clang__)
  57710. "adcs r4, %[r]\n\t"
  57711. #else
  57712. "adc r4, %[r]\n\t"
  57713. #endif
  57714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57715. "adds r2, r2, r5\n\t"
  57716. #else
  57717. "add r2, r2, r5\n\t"
  57718. #endif
  57719. #ifdef WOLFSSL_KEIL
  57720. "adcs r3, r3, r6\n\t"
  57721. #elif defined(__clang__)
  57722. "adcs r3, r6\n\t"
  57723. #else
  57724. "adc r3, r6\n\t"
  57725. #endif
  57726. #ifdef WOLFSSL_KEIL
  57727. "adcs r4, r4, %[r]\n\t"
  57728. #elif defined(__clang__)
  57729. "adcs r4, %[r]\n\t"
  57730. #else
  57731. "adc r4, %[r]\n\t"
  57732. #endif
  57733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57734. "lsrs r5, %[a], #16\n\t"
  57735. #else
  57736. "lsr r5, %[a], #16\n\t"
  57737. #endif
  57738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57739. "lsrs r6, r7, #16\n\t"
  57740. #else
  57741. "lsr r6, r7, #16\n\t"
  57742. #endif
  57743. #ifdef WOLFSSL_KEIL
  57744. "muls r6, r5, r6\n\t"
  57745. #elif defined(__clang__)
  57746. "muls r6, r5\n\t"
  57747. #else
  57748. "mul r6, r5\n\t"
  57749. #endif
  57750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57751. "adds r3, r3, r6\n\t"
  57752. #else
  57753. "add r3, r3, r6\n\t"
  57754. #endif
  57755. #ifdef WOLFSSL_KEIL
  57756. "adcs r4, r4, %[r]\n\t"
  57757. #elif defined(__clang__)
  57758. "adcs r4, %[r]\n\t"
  57759. #else
  57760. "adc r4, %[r]\n\t"
  57761. #endif
  57762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57763. "adds r3, r3, r6\n\t"
  57764. #else
  57765. "add r3, r3, r6\n\t"
  57766. #endif
  57767. #ifdef WOLFSSL_KEIL
  57768. "adcs r4, r4, %[r]\n\t"
  57769. #elif defined(__clang__)
  57770. "adcs r4, %[r]\n\t"
  57771. #else
  57772. "adc r4, %[r]\n\t"
  57773. #endif
  57774. "uxth r6, r7\n\t"
  57775. #ifdef WOLFSSL_KEIL
  57776. "muls r5, r6, r5\n\t"
  57777. #elif defined(__clang__)
  57778. "muls r5, r6\n\t"
  57779. #else
  57780. "mul r5, r6\n\t"
  57781. #endif
  57782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57783. "lsrs r6, r5, #16\n\t"
  57784. #else
  57785. "lsr r6, r5, #16\n\t"
  57786. #endif
  57787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57788. "lsls r5, r5, #16\n\t"
  57789. #else
  57790. "lsl r5, r5, #16\n\t"
  57791. #endif
  57792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57793. "adds r2, r2, r5\n\t"
  57794. #else
  57795. "add r2, r2, r5\n\t"
  57796. #endif
  57797. #ifdef WOLFSSL_KEIL
  57798. "adcs r3, r3, r6\n\t"
  57799. #elif defined(__clang__)
  57800. "adcs r3, r6\n\t"
  57801. #else
  57802. "adc r3, r6\n\t"
  57803. #endif
  57804. #ifdef WOLFSSL_KEIL
  57805. "adcs r4, r4, %[r]\n\t"
  57806. #elif defined(__clang__)
  57807. "adcs r4, %[r]\n\t"
  57808. #else
  57809. "adc r4, %[r]\n\t"
  57810. #endif
  57811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57812. "adds r2, r2, r5\n\t"
  57813. #else
  57814. "add r2, r2, r5\n\t"
  57815. #endif
  57816. #ifdef WOLFSSL_KEIL
  57817. "adcs r3, r3, r6\n\t"
  57818. #elif defined(__clang__)
  57819. "adcs r3, r6\n\t"
  57820. #else
  57821. "adc r3, r6\n\t"
  57822. #endif
  57823. #ifdef WOLFSSL_KEIL
  57824. "adcs r4, r4, %[r]\n\t"
  57825. #elif defined(__clang__)
  57826. "adcs r4, %[r]\n\t"
  57827. #else
  57828. "adc r4, %[r]\n\t"
  57829. #endif
  57830. "# A[3] * A[3]\n\t"
  57831. "mov r7, lr\n\t"
  57832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57833. "lsrs r6, r7, #16\n\t"
  57834. #else
  57835. "lsr r6, r7, #16\n\t"
  57836. #endif
  57837. "uxth r5, r7\n\t"
  57838. #ifdef WOLFSSL_KEIL
  57839. "muls r5, r5, r5\n\t"
  57840. #elif defined(__clang__)
  57841. "muls r5, r5\n\t"
  57842. #else
  57843. "mul r5, r5\n\t"
  57844. #endif
  57845. #ifdef WOLFSSL_KEIL
  57846. "muls r6, r6, r6\n\t"
  57847. #elif defined(__clang__)
  57848. "muls r6, r6\n\t"
  57849. #else
  57850. "mul r6, r6\n\t"
  57851. #endif
  57852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57853. "adds r2, r2, r5\n\t"
  57854. #else
  57855. "add r2, r2, r5\n\t"
  57856. #endif
  57857. #ifdef WOLFSSL_KEIL
  57858. "adcs r3, r3, r6\n\t"
  57859. #elif defined(__clang__)
  57860. "adcs r3, r6\n\t"
  57861. #else
  57862. "adc r3, r6\n\t"
  57863. #endif
  57864. #ifdef WOLFSSL_KEIL
  57865. "adcs r4, r4, %[r]\n\t"
  57866. #elif defined(__clang__)
  57867. "adcs r4, %[r]\n\t"
  57868. #else
  57869. "adc r4, %[r]\n\t"
  57870. #endif
  57871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57872. "lsrs r6, r7, #16\n\t"
  57873. #else
  57874. "lsr r6, r7, #16\n\t"
  57875. #endif
  57876. "uxth r5, r7\n\t"
  57877. #ifdef WOLFSSL_KEIL
  57878. "muls r5, r6, r5\n\t"
  57879. #elif defined(__clang__)
  57880. "muls r5, r6\n\t"
  57881. #else
  57882. "mul r5, r6\n\t"
  57883. #endif
  57884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57885. "lsrs r6, r5, #15\n\t"
  57886. #else
  57887. "lsr r6, r5, #15\n\t"
  57888. #endif
  57889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57890. "lsls r5, r5, #17\n\t"
  57891. #else
  57892. "lsl r5, r5, #17\n\t"
  57893. #endif
  57894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57895. "adds r2, r2, r5\n\t"
  57896. #else
  57897. "add r2, r2, r5\n\t"
  57898. #endif
  57899. #ifdef WOLFSSL_KEIL
  57900. "adcs r3, r3, r6\n\t"
  57901. #elif defined(__clang__)
  57902. "adcs r3, r6\n\t"
  57903. #else
  57904. "adc r3, r6\n\t"
  57905. #endif
  57906. #ifdef WOLFSSL_KEIL
  57907. "adcs r4, r4, %[r]\n\t"
  57908. #elif defined(__clang__)
  57909. "adcs r4, %[r]\n\t"
  57910. #else
  57911. "adc r4, %[r]\n\t"
  57912. #endif
  57913. "str r2, [sp, #24]\n\t"
  57914. "# A[4] * A[3]\n\t"
  57915. "movs r2, #0\n\t"
  57916. "mov %[a], r9\n\t"
  57917. "ldr %[a], [%[a], #16]\n\t"
  57918. "uxth r5, %[a]\n\t"
  57919. "uxth r6, r7\n\t"
  57920. #ifdef WOLFSSL_KEIL
  57921. "muls r6, r5, r6\n\t"
  57922. #elif defined(__clang__)
  57923. "muls r6, r5\n\t"
  57924. #else
  57925. "mul r6, r5\n\t"
  57926. #endif
  57927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57928. "adds r3, r3, r6\n\t"
  57929. #else
  57930. "add r3, r3, r6\n\t"
  57931. #endif
  57932. #ifdef WOLFSSL_KEIL
  57933. "adcs r4, r4, %[r]\n\t"
  57934. #elif defined(__clang__)
  57935. "adcs r4, %[r]\n\t"
  57936. #else
  57937. "adc r4, %[r]\n\t"
  57938. #endif
  57939. #ifdef WOLFSSL_KEIL
  57940. "adcs r2, r2, %[r]\n\t"
  57941. #elif defined(__clang__)
  57942. "adcs r2, %[r]\n\t"
  57943. #else
  57944. "adc r2, %[r]\n\t"
  57945. #endif
  57946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57947. "adds r3, r3, r6\n\t"
  57948. #else
  57949. "add r3, r3, r6\n\t"
  57950. #endif
  57951. #ifdef WOLFSSL_KEIL
  57952. "adcs r4, r4, %[r]\n\t"
  57953. #elif defined(__clang__)
  57954. "adcs r4, %[r]\n\t"
  57955. #else
  57956. "adc r4, %[r]\n\t"
  57957. #endif
  57958. #ifdef WOLFSSL_KEIL
  57959. "adcs r2, r2, %[r]\n\t"
  57960. #elif defined(__clang__)
  57961. "adcs r2, %[r]\n\t"
  57962. #else
  57963. "adc r2, %[r]\n\t"
  57964. #endif
  57965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57966. "lsrs r6, r7, #16\n\t"
  57967. #else
  57968. "lsr r6, r7, #16\n\t"
  57969. #endif
  57970. #ifdef WOLFSSL_KEIL
  57971. "muls r5, r6, r5\n\t"
  57972. #elif defined(__clang__)
  57973. "muls r5, r6\n\t"
  57974. #else
  57975. "mul r5, r6\n\t"
  57976. #endif
  57977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57978. "lsrs r6, r5, #16\n\t"
  57979. #else
  57980. "lsr r6, r5, #16\n\t"
  57981. #endif
  57982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57983. "lsls r5, r5, #16\n\t"
  57984. #else
  57985. "lsl r5, r5, #16\n\t"
  57986. #endif
  57987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57988. "adds r3, r3, r5\n\t"
  57989. #else
  57990. "add r3, r3, r5\n\t"
  57991. #endif
  57992. #ifdef WOLFSSL_KEIL
  57993. "adcs r4, r4, r6\n\t"
  57994. #elif defined(__clang__)
  57995. "adcs r4, r6\n\t"
  57996. #else
  57997. "adc r4, r6\n\t"
  57998. #endif
  57999. #ifdef WOLFSSL_KEIL
  58000. "adcs r2, r2, %[r]\n\t"
  58001. #elif defined(__clang__)
  58002. "adcs r2, %[r]\n\t"
  58003. #else
  58004. "adc r2, %[r]\n\t"
  58005. #endif
  58006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58007. "adds r3, r3, r5\n\t"
  58008. #else
  58009. "add r3, r3, r5\n\t"
  58010. #endif
  58011. #ifdef WOLFSSL_KEIL
  58012. "adcs r4, r4, r6\n\t"
  58013. #elif defined(__clang__)
  58014. "adcs r4, r6\n\t"
  58015. #else
  58016. "adc r4, r6\n\t"
  58017. #endif
  58018. #ifdef WOLFSSL_KEIL
  58019. "adcs r2, r2, %[r]\n\t"
  58020. #elif defined(__clang__)
  58021. "adcs r2, %[r]\n\t"
  58022. #else
  58023. "adc r2, %[r]\n\t"
  58024. #endif
  58025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58026. "lsrs r5, %[a], #16\n\t"
  58027. #else
  58028. "lsr r5, %[a], #16\n\t"
  58029. #endif
  58030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58031. "lsrs r6, r7, #16\n\t"
  58032. #else
  58033. "lsr r6, r7, #16\n\t"
  58034. #endif
  58035. #ifdef WOLFSSL_KEIL
  58036. "muls r6, r5, r6\n\t"
  58037. #elif defined(__clang__)
  58038. "muls r6, r5\n\t"
  58039. #else
  58040. "mul r6, r5\n\t"
  58041. #endif
  58042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58043. "adds r4, r4, r6\n\t"
  58044. #else
  58045. "add r4, r4, r6\n\t"
  58046. #endif
  58047. #ifdef WOLFSSL_KEIL
  58048. "adcs r2, r2, %[r]\n\t"
  58049. #elif defined(__clang__)
  58050. "adcs r2, %[r]\n\t"
  58051. #else
  58052. "adc r2, %[r]\n\t"
  58053. #endif
  58054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58055. "adds r4, r4, r6\n\t"
  58056. #else
  58057. "add r4, r4, r6\n\t"
  58058. #endif
  58059. #ifdef WOLFSSL_KEIL
  58060. "adcs r2, r2, %[r]\n\t"
  58061. #elif defined(__clang__)
  58062. "adcs r2, %[r]\n\t"
  58063. #else
  58064. "adc r2, %[r]\n\t"
  58065. #endif
  58066. "uxth r6, r7\n\t"
  58067. #ifdef WOLFSSL_KEIL
  58068. "muls r5, r6, r5\n\t"
  58069. #elif defined(__clang__)
  58070. "muls r5, r6\n\t"
  58071. #else
  58072. "mul r5, r6\n\t"
  58073. #endif
  58074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58075. "lsrs r6, r5, #16\n\t"
  58076. #else
  58077. "lsr r6, r5, #16\n\t"
  58078. #endif
  58079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58080. "lsls r5, r5, #16\n\t"
  58081. #else
  58082. "lsl r5, r5, #16\n\t"
  58083. #endif
  58084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58085. "adds r3, r3, r5\n\t"
  58086. #else
  58087. "add r3, r3, r5\n\t"
  58088. #endif
  58089. #ifdef WOLFSSL_KEIL
  58090. "adcs r4, r4, r6\n\t"
  58091. #elif defined(__clang__)
  58092. "adcs r4, r6\n\t"
  58093. #else
  58094. "adc r4, r6\n\t"
  58095. #endif
  58096. #ifdef WOLFSSL_KEIL
  58097. "adcs r2, r2, %[r]\n\t"
  58098. #elif defined(__clang__)
  58099. "adcs r2, %[r]\n\t"
  58100. #else
  58101. "adc r2, %[r]\n\t"
  58102. #endif
  58103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58104. "adds r3, r3, r5\n\t"
  58105. #else
  58106. "add r3, r3, r5\n\t"
  58107. #endif
  58108. #ifdef WOLFSSL_KEIL
  58109. "adcs r4, r4, r6\n\t"
  58110. #elif defined(__clang__)
  58111. "adcs r4, r6\n\t"
  58112. #else
  58113. "adc r4, r6\n\t"
  58114. #endif
  58115. #ifdef WOLFSSL_KEIL
  58116. "adcs r2, r2, %[r]\n\t"
  58117. #elif defined(__clang__)
  58118. "adcs r2, %[r]\n\t"
  58119. #else
  58120. "adc r2, %[r]\n\t"
  58121. #endif
  58122. "# A[5] * A[2]\n\t"
  58123. "mov %[a], r9\n\t"
  58124. "mov r7, r12\n\t"
  58125. "ldr %[a], [%[a], #20]\n\t"
  58126. "uxth r5, %[a]\n\t"
  58127. "uxth r6, r7\n\t"
  58128. #ifdef WOLFSSL_KEIL
  58129. "muls r6, r5, r6\n\t"
  58130. #elif defined(__clang__)
  58131. "muls r6, r5\n\t"
  58132. #else
  58133. "mul r6, r5\n\t"
  58134. #endif
  58135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58136. "adds r3, r3, r6\n\t"
  58137. #else
  58138. "add r3, r3, r6\n\t"
  58139. #endif
  58140. #ifdef WOLFSSL_KEIL
  58141. "adcs r4, r4, %[r]\n\t"
  58142. #elif defined(__clang__)
  58143. "adcs r4, %[r]\n\t"
  58144. #else
  58145. "adc r4, %[r]\n\t"
  58146. #endif
  58147. #ifdef WOLFSSL_KEIL
  58148. "adcs r2, r2, %[r]\n\t"
  58149. #elif defined(__clang__)
  58150. "adcs r2, %[r]\n\t"
  58151. #else
  58152. "adc r2, %[r]\n\t"
  58153. #endif
  58154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58155. "adds r3, r3, r6\n\t"
  58156. #else
  58157. "add r3, r3, r6\n\t"
  58158. #endif
  58159. #ifdef WOLFSSL_KEIL
  58160. "adcs r4, r4, %[r]\n\t"
  58161. #elif defined(__clang__)
  58162. "adcs r4, %[r]\n\t"
  58163. #else
  58164. "adc r4, %[r]\n\t"
  58165. #endif
  58166. #ifdef WOLFSSL_KEIL
  58167. "adcs r2, r2, %[r]\n\t"
  58168. #elif defined(__clang__)
  58169. "adcs r2, %[r]\n\t"
  58170. #else
  58171. "adc r2, %[r]\n\t"
  58172. #endif
  58173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58174. "lsrs r6, r7, #16\n\t"
  58175. #else
  58176. "lsr r6, r7, #16\n\t"
  58177. #endif
  58178. #ifdef WOLFSSL_KEIL
  58179. "muls r5, r6, r5\n\t"
  58180. #elif defined(__clang__)
  58181. "muls r5, r6\n\t"
  58182. #else
  58183. "mul r5, r6\n\t"
  58184. #endif
  58185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58186. "lsrs r6, r5, #16\n\t"
  58187. #else
  58188. "lsr r6, r5, #16\n\t"
  58189. #endif
  58190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58191. "lsls r5, r5, #16\n\t"
  58192. #else
  58193. "lsl r5, r5, #16\n\t"
  58194. #endif
  58195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58196. "adds r3, r3, r5\n\t"
  58197. #else
  58198. "add r3, r3, r5\n\t"
  58199. #endif
  58200. #ifdef WOLFSSL_KEIL
  58201. "adcs r4, r4, r6\n\t"
  58202. #elif defined(__clang__)
  58203. "adcs r4, r6\n\t"
  58204. #else
  58205. "adc r4, r6\n\t"
  58206. #endif
  58207. #ifdef WOLFSSL_KEIL
  58208. "adcs r2, r2, %[r]\n\t"
  58209. #elif defined(__clang__)
  58210. "adcs r2, %[r]\n\t"
  58211. #else
  58212. "adc r2, %[r]\n\t"
  58213. #endif
  58214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58215. "adds r3, r3, r5\n\t"
  58216. #else
  58217. "add r3, r3, r5\n\t"
  58218. #endif
  58219. #ifdef WOLFSSL_KEIL
  58220. "adcs r4, r4, r6\n\t"
  58221. #elif defined(__clang__)
  58222. "adcs r4, r6\n\t"
  58223. #else
  58224. "adc r4, r6\n\t"
  58225. #endif
  58226. #ifdef WOLFSSL_KEIL
  58227. "adcs r2, r2, %[r]\n\t"
  58228. #elif defined(__clang__)
  58229. "adcs r2, %[r]\n\t"
  58230. #else
  58231. "adc r2, %[r]\n\t"
  58232. #endif
  58233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58234. "lsrs r5, %[a], #16\n\t"
  58235. #else
  58236. "lsr r5, %[a], #16\n\t"
  58237. #endif
  58238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58239. "lsrs r6, r7, #16\n\t"
  58240. #else
  58241. "lsr r6, r7, #16\n\t"
  58242. #endif
  58243. #ifdef WOLFSSL_KEIL
  58244. "muls r6, r5, r6\n\t"
  58245. #elif defined(__clang__)
  58246. "muls r6, r5\n\t"
  58247. #else
  58248. "mul r6, r5\n\t"
  58249. #endif
  58250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58251. "adds r4, r4, r6\n\t"
  58252. #else
  58253. "add r4, r4, r6\n\t"
  58254. #endif
  58255. #ifdef WOLFSSL_KEIL
  58256. "adcs r2, r2, %[r]\n\t"
  58257. #elif defined(__clang__)
  58258. "adcs r2, %[r]\n\t"
  58259. #else
  58260. "adc r2, %[r]\n\t"
  58261. #endif
  58262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58263. "adds r4, r4, r6\n\t"
  58264. #else
  58265. "add r4, r4, r6\n\t"
  58266. #endif
  58267. #ifdef WOLFSSL_KEIL
  58268. "adcs r2, r2, %[r]\n\t"
  58269. #elif defined(__clang__)
  58270. "adcs r2, %[r]\n\t"
  58271. #else
  58272. "adc r2, %[r]\n\t"
  58273. #endif
  58274. "uxth r6, r7\n\t"
  58275. #ifdef WOLFSSL_KEIL
  58276. "muls r5, r6, r5\n\t"
  58277. #elif defined(__clang__)
  58278. "muls r5, r6\n\t"
  58279. #else
  58280. "mul r5, r6\n\t"
  58281. #endif
  58282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58283. "lsrs r6, r5, #16\n\t"
  58284. #else
  58285. "lsr r6, r5, #16\n\t"
  58286. #endif
  58287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58288. "lsls r5, r5, #16\n\t"
  58289. #else
  58290. "lsl r5, r5, #16\n\t"
  58291. #endif
  58292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58293. "adds r3, r3, r5\n\t"
  58294. #else
  58295. "add r3, r3, r5\n\t"
  58296. #endif
  58297. #ifdef WOLFSSL_KEIL
  58298. "adcs r4, r4, r6\n\t"
  58299. #elif defined(__clang__)
  58300. "adcs r4, r6\n\t"
  58301. #else
  58302. "adc r4, r6\n\t"
  58303. #endif
  58304. #ifdef WOLFSSL_KEIL
  58305. "adcs r2, r2, %[r]\n\t"
  58306. #elif defined(__clang__)
  58307. "adcs r2, %[r]\n\t"
  58308. #else
  58309. "adc r2, %[r]\n\t"
  58310. #endif
  58311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58312. "adds r3, r3, r5\n\t"
  58313. #else
  58314. "add r3, r3, r5\n\t"
  58315. #endif
  58316. #ifdef WOLFSSL_KEIL
  58317. "adcs r4, r4, r6\n\t"
  58318. #elif defined(__clang__)
  58319. "adcs r4, r6\n\t"
  58320. #else
  58321. "adc r4, r6\n\t"
  58322. #endif
  58323. #ifdef WOLFSSL_KEIL
  58324. "adcs r2, r2, %[r]\n\t"
  58325. #elif defined(__clang__)
  58326. "adcs r2, %[r]\n\t"
  58327. #else
  58328. "adc r2, %[r]\n\t"
  58329. #endif
  58330. "# A[6] * A[1]\n\t"
  58331. "mov %[a], r9\n\t"
  58332. "mov r7, r11\n\t"
  58333. "ldr %[a], [%[a], #24]\n\t"
  58334. "uxth r5, %[a]\n\t"
  58335. "uxth r6, r7\n\t"
  58336. #ifdef WOLFSSL_KEIL
  58337. "muls r6, r5, r6\n\t"
  58338. #elif defined(__clang__)
  58339. "muls r6, r5\n\t"
  58340. #else
  58341. "mul r6, r5\n\t"
  58342. #endif
  58343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58344. "adds r3, r3, r6\n\t"
  58345. #else
  58346. "add r3, r3, r6\n\t"
  58347. #endif
  58348. #ifdef WOLFSSL_KEIL
  58349. "adcs r4, r4, %[r]\n\t"
  58350. #elif defined(__clang__)
  58351. "adcs r4, %[r]\n\t"
  58352. #else
  58353. "adc r4, %[r]\n\t"
  58354. #endif
  58355. #ifdef WOLFSSL_KEIL
  58356. "adcs r2, r2, %[r]\n\t"
  58357. #elif defined(__clang__)
  58358. "adcs r2, %[r]\n\t"
  58359. #else
  58360. "adc r2, %[r]\n\t"
  58361. #endif
  58362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58363. "adds r3, r3, r6\n\t"
  58364. #else
  58365. "add r3, r3, r6\n\t"
  58366. #endif
  58367. #ifdef WOLFSSL_KEIL
  58368. "adcs r4, r4, %[r]\n\t"
  58369. #elif defined(__clang__)
  58370. "adcs r4, %[r]\n\t"
  58371. #else
  58372. "adc r4, %[r]\n\t"
  58373. #endif
  58374. #ifdef WOLFSSL_KEIL
  58375. "adcs r2, r2, %[r]\n\t"
  58376. #elif defined(__clang__)
  58377. "adcs r2, %[r]\n\t"
  58378. #else
  58379. "adc r2, %[r]\n\t"
  58380. #endif
  58381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58382. "lsrs r6, r7, #16\n\t"
  58383. #else
  58384. "lsr r6, r7, #16\n\t"
  58385. #endif
  58386. #ifdef WOLFSSL_KEIL
  58387. "muls r5, r6, r5\n\t"
  58388. #elif defined(__clang__)
  58389. "muls r5, r6\n\t"
  58390. #else
  58391. "mul r5, r6\n\t"
  58392. #endif
  58393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58394. "lsrs r6, r5, #16\n\t"
  58395. #else
  58396. "lsr r6, r5, #16\n\t"
  58397. #endif
  58398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58399. "lsls r5, r5, #16\n\t"
  58400. #else
  58401. "lsl r5, r5, #16\n\t"
  58402. #endif
  58403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58404. "adds r3, r3, r5\n\t"
  58405. #else
  58406. "add r3, r3, r5\n\t"
  58407. #endif
  58408. #ifdef WOLFSSL_KEIL
  58409. "adcs r4, r4, r6\n\t"
  58410. #elif defined(__clang__)
  58411. "adcs r4, r6\n\t"
  58412. #else
  58413. "adc r4, r6\n\t"
  58414. #endif
  58415. #ifdef WOLFSSL_KEIL
  58416. "adcs r2, r2, %[r]\n\t"
  58417. #elif defined(__clang__)
  58418. "adcs r2, %[r]\n\t"
  58419. #else
  58420. "adc r2, %[r]\n\t"
  58421. #endif
  58422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58423. "adds r3, r3, r5\n\t"
  58424. #else
  58425. "add r3, r3, r5\n\t"
  58426. #endif
  58427. #ifdef WOLFSSL_KEIL
  58428. "adcs r4, r4, r6\n\t"
  58429. #elif defined(__clang__)
  58430. "adcs r4, r6\n\t"
  58431. #else
  58432. "adc r4, r6\n\t"
  58433. #endif
  58434. #ifdef WOLFSSL_KEIL
  58435. "adcs r2, r2, %[r]\n\t"
  58436. #elif defined(__clang__)
  58437. "adcs r2, %[r]\n\t"
  58438. #else
  58439. "adc r2, %[r]\n\t"
  58440. #endif
  58441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58442. "lsrs r5, %[a], #16\n\t"
  58443. #else
  58444. "lsr r5, %[a], #16\n\t"
  58445. #endif
  58446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58447. "lsrs r6, r7, #16\n\t"
  58448. #else
  58449. "lsr r6, r7, #16\n\t"
  58450. #endif
  58451. #ifdef WOLFSSL_KEIL
  58452. "muls r6, r5, r6\n\t"
  58453. #elif defined(__clang__)
  58454. "muls r6, r5\n\t"
  58455. #else
  58456. "mul r6, r5\n\t"
  58457. #endif
  58458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58459. "adds r4, r4, r6\n\t"
  58460. #else
  58461. "add r4, r4, r6\n\t"
  58462. #endif
  58463. #ifdef WOLFSSL_KEIL
  58464. "adcs r2, r2, %[r]\n\t"
  58465. #elif defined(__clang__)
  58466. "adcs r2, %[r]\n\t"
  58467. #else
  58468. "adc r2, %[r]\n\t"
  58469. #endif
  58470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58471. "adds r4, r4, r6\n\t"
  58472. #else
  58473. "add r4, r4, r6\n\t"
  58474. #endif
  58475. #ifdef WOLFSSL_KEIL
  58476. "adcs r2, r2, %[r]\n\t"
  58477. #elif defined(__clang__)
  58478. "adcs r2, %[r]\n\t"
  58479. #else
  58480. "adc r2, %[r]\n\t"
  58481. #endif
  58482. "uxth r6, r7\n\t"
  58483. #ifdef WOLFSSL_KEIL
  58484. "muls r5, r6, r5\n\t"
  58485. #elif defined(__clang__)
  58486. "muls r5, r6\n\t"
  58487. #else
  58488. "mul r5, r6\n\t"
  58489. #endif
  58490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58491. "lsrs r6, r5, #16\n\t"
  58492. #else
  58493. "lsr r6, r5, #16\n\t"
  58494. #endif
  58495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58496. "lsls r5, r5, #16\n\t"
  58497. #else
  58498. "lsl r5, r5, #16\n\t"
  58499. #endif
  58500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58501. "adds r3, r3, r5\n\t"
  58502. #else
  58503. "add r3, r3, r5\n\t"
  58504. #endif
  58505. #ifdef WOLFSSL_KEIL
  58506. "adcs r4, r4, r6\n\t"
  58507. #elif defined(__clang__)
  58508. "adcs r4, r6\n\t"
  58509. #else
  58510. "adc r4, r6\n\t"
  58511. #endif
  58512. #ifdef WOLFSSL_KEIL
  58513. "adcs r2, r2, %[r]\n\t"
  58514. #elif defined(__clang__)
  58515. "adcs r2, %[r]\n\t"
  58516. #else
  58517. "adc r2, %[r]\n\t"
  58518. #endif
  58519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58520. "adds r3, r3, r5\n\t"
  58521. #else
  58522. "add r3, r3, r5\n\t"
  58523. #endif
  58524. #ifdef WOLFSSL_KEIL
  58525. "adcs r4, r4, r6\n\t"
  58526. #elif defined(__clang__)
  58527. "adcs r4, r6\n\t"
  58528. #else
  58529. "adc r4, r6\n\t"
  58530. #endif
  58531. #ifdef WOLFSSL_KEIL
  58532. "adcs r2, r2, %[r]\n\t"
  58533. #elif defined(__clang__)
  58534. "adcs r2, %[r]\n\t"
  58535. #else
  58536. "adc r2, %[r]\n\t"
  58537. #endif
  58538. "# A[7] * A[0]\n\t"
  58539. "mov %[a], r9\n\t"
  58540. "mov r7, r10\n\t"
  58541. "ldr %[a], [%[a], #28]\n\t"
  58542. "uxth r5, %[a]\n\t"
  58543. "uxth r6, r7\n\t"
  58544. #ifdef WOLFSSL_KEIL
  58545. "muls r6, r5, r6\n\t"
  58546. #elif defined(__clang__)
  58547. "muls r6, r5\n\t"
  58548. #else
  58549. "mul r6, r5\n\t"
  58550. #endif
  58551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58552. "adds r3, r3, r6\n\t"
  58553. #else
  58554. "add r3, r3, r6\n\t"
  58555. #endif
  58556. #ifdef WOLFSSL_KEIL
  58557. "adcs r4, r4, %[r]\n\t"
  58558. #elif defined(__clang__)
  58559. "adcs r4, %[r]\n\t"
  58560. #else
  58561. "adc r4, %[r]\n\t"
  58562. #endif
  58563. #ifdef WOLFSSL_KEIL
  58564. "adcs r2, r2, %[r]\n\t"
  58565. #elif defined(__clang__)
  58566. "adcs r2, %[r]\n\t"
  58567. #else
  58568. "adc r2, %[r]\n\t"
  58569. #endif
  58570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58571. "adds r3, r3, r6\n\t"
  58572. #else
  58573. "add r3, r3, r6\n\t"
  58574. #endif
  58575. #ifdef WOLFSSL_KEIL
  58576. "adcs r4, r4, %[r]\n\t"
  58577. #elif defined(__clang__)
  58578. "adcs r4, %[r]\n\t"
  58579. #else
  58580. "adc r4, %[r]\n\t"
  58581. #endif
  58582. #ifdef WOLFSSL_KEIL
  58583. "adcs r2, r2, %[r]\n\t"
  58584. #elif defined(__clang__)
  58585. "adcs r2, %[r]\n\t"
  58586. #else
  58587. "adc r2, %[r]\n\t"
  58588. #endif
  58589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58590. "lsrs r6, r7, #16\n\t"
  58591. #else
  58592. "lsr r6, r7, #16\n\t"
  58593. #endif
  58594. #ifdef WOLFSSL_KEIL
  58595. "muls r5, r6, r5\n\t"
  58596. #elif defined(__clang__)
  58597. "muls r5, r6\n\t"
  58598. #else
  58599. "mul r5, r6\n\t"
  58600. #endif
  58601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58602. "lsrs r6, r5, #16\n\t"
  58603. #else
  58604. "lsr r6, r5, #16\n\t"
  58605. #endif
  58606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58607. "lsls r5, r5, #16\n\t"
  58608. #else
  58609. "lsl r5, r5, #16\n\t"
  58610. #endif
  58611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58612. "adds r3, r3, r5\n\t"
  58613. #else
  58614. "add r3, r3, r5\n\t"
  58615. #endif
  58616. #ifdef WOLFSSL_KEIL
  58617. "adcs r4, r4, r6\n\t"
  58618. #elif defined(__clang__)
  58619. "adcs r4, r6\n\t"
  58620. #else
  58621. "adc r4, r6\n\t"
  58622. #endif
  58623. #ifdef WOLFSSL_KEIL
  58624. "adcs r2, r2, %[r]\n\t"
  58625. #elif defined(__clang__)
  58626. "adcs r2, %[r]\n\t"
  58627. #else
  58628. "adc r2, %[r]\n\t"
  58629. #endif
  58630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58631. "adds r3, r3, r5\n\t"
  58632. #else
  58633. "add r3, r3, r5\n\t"
  58634. #endif
  58635. #ifdef WOLFSSL_KEIL
  58636. "adcs r4, r4, r6\n\t"
  58637. #elif defined(__clang__)
  58638. "adcs r4, r6\n\t"
  58639. #else
  58640. "adc r4, r6\n\t"
  58641. #endif
  58642. #ifdef WOLFSSL_KEIL
  58643. "adcs r2, r2, %[r]\n\t"
  58644. #elif defined(__clang__)
  58645. "adcs r2, %[r]\n\t"
  58646. #else
  58647. "adc r2, %[r]\n\t"
  58648. #endif
  58649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58650. "lsrs r5, %[a], #16\n\t"
  58651. #else
  58652. "lsr r5, %[a], #16\n\t"
  58653. #endif
  58654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58655. "lsrs r6, r7, #16\n\t"
  58656. #else
  58657. "lsr r6, r7, #16\n\t"
  58658. #endif
  58659. #ifdef WOLFSSL_KEIL
  58660. "muls r6, r5, r6\n\t"
  58661. #elif defined(__clang__)
  58662. "muls r6, r5\n\t"
  58663. #else
  58664. "mul r6, r5\n\t"
  58665. #endif
  58666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58667. "adds r4, r4, r6\n\t"
  58668. #else
  58669. "add r4, r4, r6\n\t"
  58670. #endif
  58671. #ifdef WOLFSSL_KEIL
  58672. "adcs r2, r2, %[r]\n\t"
  58673. #elif defined(__clang__)
  58674. "adcs r2, %[r]\n\t"
  58675. #else
  58676. "adc r2, %[r]\n\t"
  58677. #endif
  58678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58679. "adds r4, r4, r6\n\t"
  58680. #else
  58681. "add r4, r4, r6\n\t"
  58682. #endif
  58683. #ifdef WOLFSSL_KEIL
  58684. "adcs r2, r2, %[r]\n\t"
  58685. #elif defined(__clang__)
  58686. "adcs r2, %[r]\n\t"
  58687. #else
  58688. "adc r2, %[r]\n\t"
  58689. #endif
  58690. "uxth r6, r7\n\t"
  58691. #ifdef WOLFSSL_KEIL
  58692. "muls r5, r6, r5\n\t"
  58693. #elif defined(__clang__)
  58694. "muls r5, r6\n\t"
  58695. #else
  58696. "mul r5, r6\n\t"
  58697. #endif
  58698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58699. "lsrs r6, r5, #16\n\t"
  58700. #else
  58701. "lsr r6, r5, #16\n\t"
  58702. #endif
  58703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58704. "lsls r5, r5, #16\n\t"
  58705. #else
  58706. "lsl r5, r5, #16\n\t"
  58707. #endif
  58708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58709. "adds r3, r3, r5\n\t"
  58710. #else
  58711. "add r3, r3, r5\n\t"
  58712. #endif
  58713. #ifdef WOLFSSL_KEIL
  58714. "adcs r4, r4, r6\n\t"
  58715. #elif defined(__clang__)
  58716. "adcs r4, r6\n\t"
  58717. #else
  58718. "adc r4, r6\n\t"
  58719. #endif
  58720. #ifdef WOLFSSL_KEIL
  58721. "adcs r2, r2, %[r]\n\t"
  58722. #elif defined(__clang__)
  58723. "adcs r2, %[r]\n\t"
  58724. #else
  58725. "adc r2, %[r]\n\t"
  58726. #endif
  58727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58728. "adds r3, r3, r5\n\t"
  58729. #else
  58730. "add r3, r3, r5\n\t"
  58731. #endif
  58732. #ifdef WOLFSSL_KEIL
  58733. "adcs r4, r4, r6\n\t"
  58734. #elif defined(__clang__)
  58735. "adcs r4, r6\n\t"
  58736. #else
  58737. "adc r4, r6\n\t"
  58738. #endif
  58739. #ifdef WOLFSSL_KEIL
  58740. "adcs r2, r2, %[r]\n\t"
  58741. #elif defined(__clang__)
  58742. "adcs r2, %[r]\n\t"
  58743. #else
  58744. "adc r2, %[r]\n\t"
  58745. #endif
  58746. "str r3, [sp, #28]\n\t"
  58747. "# A[8] * A[0]\n\t"
  58748. "movs r3, #0\n\t"
  58749. "mov %[a], r9\n\t"
  58750. "ldr %[a], [%[a], #32]\n\t"
  58751. "uxth r5, %[a]\n\t"
  58752. "uxth r6, r7\n\t"
  58753. #ifdef WOLFSSL_KEIL
  58754. "muls r6, r5, r6\n\t"
  58755. #elif defined(__clang__)
  58756. "muls r6, r5\n\t"
  58757. #else
  58758. "mul r6, r5\n\t"
  58759. #endif
  58760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58761. "adds r4, r4, r6\n\t"
  58762. #else
  58763. "add r4, r4, r6\n\t"
  58764. #endif
  58765. #ifdef WOLFSSL_KEIL
  58766. "adcs r2, r2, %[r]\n\t"
  58767. #elif defined(__clang__)
  58768. "adcs r2, %[r]\n\t"
  58769. #else
  58770. "adc r2, %[r]\n\t"
  58771. #endif
  58772. #ifdef WOLFSSL_KEIL
  58773. "adcs r3, r3, %[r]\n\t"
  58774. #elif defined(__clang__)
  58775. "adcs r3, %[r]\n\t"
  58776. #else
  58777. "adc r3, %[r]\n\t"
  58778. #endif
  58779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58780. "adds r4, r4, r6\n\t"
  58781. #else
  58782. "add r4, r4, r6\n\t"
  58783. #endif
  58784. #ifdef WOLFSSL_KEIL
  58785. "adcs r2, r2, %[r]\n\t"
  58786. #elif defined(__clang__)
  58787. "adcs r2, %[r]\n\t"
  58788. #else
  58789. "adc r2, %[r]\n\t"
  58790. #endif
  58791. #ifdef WOLFSSL_KEIL
  58792. "adcs r3, r3, %[r]\n\t"
  58793. #elif defined(__clang__)
  58794. "adcs r3, %[r]\n\t"
  58795. #else
  58796. "adc r3, %[r]\n\t"
  58797. #endif
  58798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58799. "lsrs r6, r7, #16\n\t"
  58800. #else
  58801. "lsr r6, r7, #16\n\t"
  58802. #endif
  58803. #ifdef WOLFSSL_KEIL
  58804. "muls r5, r6, r5\n\t"
  58805. #elif defined(__clang__)
  58806. "muls r5, r6\n\t"
  58807. #else
  58808. "mul r5, r6\n\t"
  58809. #endif
  58810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58811. "lsrs r6, r5, #16\n\t"
  58812. #else
  58813. "lsr r6, r5, #16\n\t"
  58814. #endif
  58815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58816. "lsls r5, r5, #16\n\t"
  58817. #else
  58818. "lsl r5, r5, #16\n\t"
  58819. #endif
  58820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58821. "adds r4, r4, r5\n\t"
  58822. #else
  58823. "add r4, r4, r5\n\t"
  58824. #endif
  58825. #ifdef WOLFSSL_KEIL
  58826. "adcs r2, r2, r6\n\t"
  58827. #elif defined(__clang__)
  58828. "adcs r2, r6\n\t"
  58829. #else
  58830. "adc r2, r6\n\t"
  58831. #endif
  58832. #ifdef WOLFSSL_KEIL
  58833. "adcs r3, r3, %[r]\n\t"
  58834. #elif defined(__clang__)
  58835. "adcs r3, %[r]\n\t"
  58836. #else
  58837. "adc r3, %[r]\n\t"
  58838. #endif
  58839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58840. "adds r4, r4, r5\n\t"
  58841. #else
  58842. "add r4, r4, r5\n\t"
  58843. #endif
  58844. #ifdef WOLFSSL_KEIL
  58845. "adcs r2, r2, r6\n\t"
  58846. #elif defined(__clang__)
  58847. "adcs r2, r6\n\t"
  58848. #else
  58849. "adc r2, r6\n\t"
  58850. #endif
  58851. #ifdef WOLFSSL_KEIL
  58852. "adcs r3, r3, %[r]\n\t"
  58853. #elif defined(__clang__)
  58854. "adcs r3, %[r]\n\t"
  58855. #else
  58856. "adc r3, %[r]\n\t"
  58857. #endif
  58858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58859. "lsrs r5, %[a], #16\n\t"
  58860. #else
  58861. "lsr r5, %[a], #16\n\t"
  58862. #endif
  58863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58864. "lsrs r6, r7, #16\n\t"
  58865. #else
  58866. "lsr r6, r7, #16\n\t"
  58867. #endif
  58868. #ifdef WOLFSSL_KEIL
  58869. "muls r6, r5, r6\n\t"
  58870. #elif defined(__clang__)
  58871. "muls r6, r5\n\t"
  58872. #else
  58873. "mul r6, r5\n\t"
  58874. #endif
  58875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58876. "adds r2, r2, r6\n\t"
  58877. #else
  58878. "add r2, r2, r6\n\t"
  58879. #endif
  58880. #ifdef WOLFSSL_KEIL
  58881. "adcs r3, r3, %[r]\n\t"
  58882. #elif defined(__clang__)
  58883. "adcs r3, %[r]\n\t"
  58884. #else
  58885. "adc r3, %[r]\n\t"
  58886. #endif
  58887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58888. "adds r2, r2, r6\n\t"
  58889. #else
  58890. "add r2, r2, r6\n\t"
  58891. #endif
  58892. #ifdef WOLFSSL_KEIL
  58893. "adcs r3, r3, %[r]\n\t"
  58894. #elif defined(__clang__)
  58895. "adcs r3, %[r]\n\t"
  58896. #else
  58897. "adc r3, %[r]\n\t"
  58898. #endif
  58899. "uxth r6, r7\n\t"
  58900. #ifdef WOLFSSL_KEIL
  58901. "muls r5, r6, r5\n\t"
  58902. #elif defined(__clang__)
  58903. "muls r5, r6\n\t"
  58904. #else
  58905. "mul r5, r6\n\t"
  58906. #endif
  58907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58908. "lsrs r6, r5, #16\n\t"
  58909. #else
  58910. "lsr r6, r5, #16\n\t"
  58911. #endif
  58912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58913. "lsls r5, r5, #16\n\t"
  58914. #else
  58915. "lsl r5, r5, #16\n\t"
  58916. #endif
  58917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58918. "adds r4, r4, r5\n\t"
  58919. #else
  58920. "add r4, r4, r5\n\t"
  58921. #endif
  58922. #ifdef WOLFSSL_KEIL
  58923. "adcs r2, r2, r6\n\t"
  58924. #elif defined(__clang__)
  58925. "adcs r2, r6\n\t"
  58926. #else
  58927. "adc r2, r6\n\t"
  58928. #endif
  58929. #ifdef WOLFSSL_KEIL
  58930. "adcs r3, r3, %[r]\n\t"
  58931. #elif defined(__clang__)
  58932. "adcs r3, %[r]\n\t"
  58933. #else
  58934. "adc r3, %[r]\n\t"
  58935. #endif
  58936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58937. "adds r4, r4, r5\n\t"
  58938. #else
  58939. "add r4, r4, r5\n\t"
  58940. #endif
  58941. #ifdef WOLFSSL_KEIL
  58942. "adcs r2, r2, r6\n\t"
  58943. #elif defined(__clang__)
  58944. "adcs r2, r6\n\t"
  58945. #else
  58946. "adc r2, r6\n\t"
  58947. #endif
  58948. #ifdef WOLFSSL_KEIL
  58949. "adcs r3, r3, %[r]\n\t"
  58950. #elif defined(__clang__)
  58951. "adcs r3, %[r]\n\t"
  58952. #else
  58953. "adc r3, %[r]\n\t"
  58954. #endif
  58955. "# A[7] * A[1]\n\t"
  58956. "mov %[a], r9\n\t"
  58957. "mov r7, r11\n\t"
  58958. "ldr %[a], [%[a], #28]\n\t"
  58959. "uxth r5, %[a]\n\t"
  58960. "uxth r6, r7\n\t"
  58961. #ifdef WOLFSSL_KEIL
  58962. "muls r6, r5, r6\n\t"
  58963. #elif defined(__clang__)
  58964. "muls r6, r5\n\t"
  58965. #else
  58966. "mul r6, r5\n\t"
  58967. #endif
  58968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58969. "adds r4, r4, r6\n\t"
  58970. #else
  58971. "add r4, r4, r6\n\t"
  58972. #endif
  58973. #ifdef WOLFSSL_KEIL
  58974. "adcs r2, r2, %[r]\n\t"
  58975. #elif defined(__clang__)
  58976. "adcs r2, %[r]\n\t"
  58977. #else
  58978. "adc r2, %[r]\n\t"
  58979. #endif
  58980. #ifdef WOLFSSL_KEIL
  58981. "adcs r3, r3, %[r]\n\t"
  58982. #elif defined(__clang__)
  58983. "adcs r3, %[r]\n\t"
  58984. #else
  58985. "adc r3, %[r]\n\t"
  58986. #endif
  58987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58988. "adds r4, r4, r6\n\t"
  58989. #else
  58990. "add r4, r4, r6\n\t"
  58991. #endif
  58992. #ifdef WOLFSSL_KEIL
  58993. "adcs r2, r2, %[r]\n\t"
  58994. #elif defined(__clang__)
  58995. "adcs r2, %[r]\n\t"
  58996. #else
  58997. "adc r2, %[r]\n\t"
  58998. #endif
  58999. #ifdef WOLFSSL_KEIL
  59000. "adcs r3, r3, %[r]\n\t"
  59001. #elif defined(__clang__)
  59002. "adcs r3, %[r]\n\t"
  59003. #else
  59004. "adc r3, %[r]\n\t"
  59005. #endif
  59006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59007. "lsrs r6, r7, #16\n\t"
  59008. #else
  59009. "lsr r6, r7, #16\n\t"
  59010. #endif
  59011. #ifdef WOLFSSL_KEIL
  59012. "muls r5, r6, r5\n\t"
  59013. #elif defined(__clang__)
  59014. "muls r5, r6\n\t"
  59015. #else
  59016. "mul r5, r6\n\t"
  59017. #endif
  59018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59019. "lsrs r6, r5, #16\n\t"
  59020. #else
  59021. "lsr r6, r5, #16\n\t"
  59022. #endif
  59023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59024. "lsls r5, r5, #16\n\t"
  59025. #else
  59026. "lsl r5, r5, #16\n\t"
  59027. #endif
  59028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59029. "adds r4, r4, r5\n\t"
  59030. #else
  59031. "add r4, r4, r5\n\t"
  59032. #endif
  59033. #ifdef WOLFSSL_KEIL
  59034. "adcs r2, r2, r6\n\t"
  59035. #elif defined(__clang__)
  59036. "adcs r2, r6\n\t"
  59037. #else
  59038. "adc r2, r6\n\t"
  59039. #endif
  59040. #ifdef WOLFSSL_KEIL
  59041. "adcs r3, r3, %[r]\n\t"
  59042. #elif defined(__clang__)
  59043. "adcs r3, %[r]\n\t"
  59044. #else
  59045. "adc r3, %[r]\n\t"
  59046. #endif
  59047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59048. "adds r4, r4, r5\n\t"
  59049. #else
  59050. "add r4, r4, r5\n\t"
  59051. #endif
  59052. #ifdef WOLFSSL_KEIL
  59053. "adcs r2, r2, r6\n\t"
  59054. #elif defined(__clang__)
  59055. "adcs r2, r6\n\t"
  59056. #else
  59057. "adc r2, r6\n\t"
  59058. #endif
  59059. #ifdef WOLFSSL_KEIL
  59060. "adcs r3, r3, %[r]\n\t"
  59061. #elif defined(__clang__)
  59062. "adcs r3, %[r]\n\t"
  59063. #else
  59064. "adc r3, %[r]\n\t"
  59065. #endif
  59066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59067. "lsrs r5, %[a], #16\n\t"
  59068. #else
  59069. "lsr r5, %[a], #16\n\t"
  59070. #endif
  59071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59072. "lsrs r6, r7, #16\n\t"
  59073. #else
  59074. "lsr r6, r7, #16\n\t"
  59075. #endif
  59076. #ifdef WOLFSSL_KEIL
  59077. "muls r6, r5, r6\n\t"
  59078. #elif defined(__clang__)
  59079. "muls r6, r5\n\t"
  59080. #else
  59081. "mul r6, r5\n\t"
  59082. #endif
  59083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59084. "adds r2, r2, r6\n\t"
  59085. #else
  59086. "add r2, r2, r6\n\t"
  59087. #endif
  59088. #ifdef WOLFSSL_KEIL
  59089. "adcs r3, r3, %[r]\n\t"
  59090. #elif defined(__clang__)
  59091. "adcs r3, %[r]\n\t"
  59092. #else
  59093. "adc r3, %[r]\n\t"
  59094. #endif
  59095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59096. "adds r2, r2, r6\n\t"
  59097. #else
  59098. "add r2, r2, r6\n\t"
  59099. #endif
  59100. #ifdef WOLFSSL_KEIL
  59101. "adcs r3, r3, %[r]\n\t"
  59102. #elif defined(__clang__)
  59103. "adcs r3, %[r]\n\t"
  59104. #else
  59105. "adc r3, %[r]\n\t"
  59106. #endif
  59107. "uxth r6, r7\n\t"
  59108. #ifdef WOLFSSL_KEIL
  59109. "muls r5, r6, r5\n\t"
  59110. #elif defined(__clang__)
  59111. "muls r5, r6\n\t"
  59112. #else
  59113. "mul r5, r6\n\t"
  59114. #endif
  59115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59116. "lsrs r6, r5, #16\n\t"
  59117. #else
  59118. "lsr r6, r5, #16\n\t"
  59119. #endif
  59120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59121. "lsls r5, r5, #16\n\t"
  59122. #else
  59123. "lsl r5, r5, #16\n\t"
  59124. #endif
  59125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59126. "adds r4, r4, r5\n\t"
  59127. #else
  59128. "add r4, r4, r5\n\t"
  59129. #endif
  59130. #ifdef WOLFSSL_KEIL
  59131. "adcs r2, r2, r6\n\t"
  59132. #elif defined(__clang__)
  59133. "adcs r2, r6\n\t"
  59134. #else
  59135. "adc r2, r6\n\t"
  59136. #endif
  59137. #ifdef WOLFSSL_KEIL
  59138. "adcs r3, r3, %[r]\n\t"
  59139. #elif defined(__clang__)
  59140. "adcs r3, %[r]\n\t"
  59141. #else
  59142. "adc r3, %[r]\n\t"
  59143. #endif
  59144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59145. "adds r4, r4, r5\n\t"
  59146. #else
  59147. "add r4, r4, r5\n\t"
  59148. #endif
  59149. #ifdef WOLFSSL_KEIL
  59150. "adcs r2, r2, r6\n\t"
  59151. #elif defined(__clang__)
  59152. "adcs r2, r6\n\t"
  59153. #else
  59154. "adc r2, r6\n\t"
  59155. #endif
  59156. #ifdef WOLFSSL_KEIL
  59157. "adcs r3, r3, %[r]\n\t"
  59158. #elif defined(__clang__)
  59159. "adcs r3, %[r]\n\t"
  59160. #else
  59161. "adc r3, %[r]\n\t"
  59162. #endif
  59163. "# A[6] * A[2]\n\t"
  59164. "mov %[a], r9\n\t"
  59165. "mov r7, r12\n\t"
  59166. "ldr %[a], [%[a], #24]\n\t"
  59167. "uxth r5, %[a]\n\t"
  59168. "uxth r6, r7\n\t"
  59169. #ifdef WOLFSSL_KEIL
  59170. "muls r6, r5, r6\n\t"
  59171. #elif defined(__clang__)
  59172. "muls r6, r5\n\t"
  59173. #else
  59174. "mul r6, r5\n\t"
  59175. #endif
  59176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59177. "adds r4, r4, r6\n\t"
  59178. #else
  59179. "add r4, r4, r6\n\t"
  59180. #endif
  59181. #ifdef WOLFSSL_KEIL
  59182. "adcs r2, r2, %[r]\n\t"
  59183. #elif defined(__clang__)
  59184. "adcs r2, %[r]\n\t"
  59185. #else
  59186. "adc r2, %[r]\n\t"
  59187. #endif
  59188. #ifdef WOLFSSL_KEIL
  59189. "adcs r3, r3, %[r]\n\t"
  59190. #elif defined(__clang__)
  59191. "adcs r3, %[r]\n\t"
  59192. #else
  59193. "adc r3, %[r]\n\t"
  59194. #endif
  59195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59196. "adds r4, r4, r6\n\t"
  59197. #else
  59198. "add r4, r4, r6\n\t"
  59199. #endif
  59200. #ifdef WOLFSSL_KEIL
  59201. "adcs r2, r2, %[r]\n\t"
  59202. #elif defined(__clang__)
  59203. "adcs r2, %[r]\n\t"
  59204. #else
  59205. "adc r2, %[r]\n\t"
  59206. #endif
  59207. #ifdef WOLFSSL_KEIL
  59208. "adcs r3, r3, %[r]\n\t"
  59209. #elif defined(__clang__)
  59210. "adcs r3, %[r]\n\t"
  59211. #else
  59212. "adc r3, %[r]\n\t"
  59213. #endif
  59214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59215. "lsrs r6, r7, #16\n\t"
  59216. #else
  59217. "lsr r6, r7, #16\n\t"
  59218. #endif
  59219. #ifdef WOLFSSL_KEIL
  59220. "muls r5, r6, r5\n\t"
  59221. #elif defined(__clang__)
  59222. "muls r5, r6\n\t"
  59223. #else
  59224. "mul r5, r6\n\t"
  59225. #endif
  59226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59227. "lsrs r6, r5, #16\n\t"
  59228. #else
  59229. "lsr r6, r5, #16\n\t"
  59230. #endif
  59231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59232. "lsls r5, r5, #16\n\t"
  59233. #else
  59234. "lsl r5, r5, #16\n\t"
  59235. #endif
  59236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59237. "adds r4, r4, r5\n\t"
  59238. #else
  59239. "add r4, r4, r5\n\t"
  59240. #endif
  59241. #ifdef WOLFSSL_KEIL
  59242. "adcs r2, r2, r6\n\t"
  59243. #elif defined(__clang__)
  59244. "adcs r2, r6\n\t"
  59245. #else
  59246. "adc r2, r6\n\t"
  59247. #endif
  59248. #ifdef WOLFSSL_KEIL
  59249. "adcs r3, r3, %[r]\n\t"
  59250. #elif defined(__clang__)
  59251. "adcs r3, %[r]\n\t"
  59252. #else
  59253. "adc r3, %[r]\n\t"
  59254. #endif
  59255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59256. "adds r4, r4, r5\n\t"
  59257. #else
  59258. "add r4, r4, r5\n\t"
  59259. #endif
  59260. #ifdef WOLFSSL_KEIL
  59261. "adcs r2, r2, r6\n\t"
  59262. #elif defined(__clang__)
  59263. "adcs r2, r6\n\t"
  59264. #else
  59265. "adc r2, r6\n\t"
  59266. #endif
  59267. #ifdef WOLFSSL_KEIL
  59268. "adcs r3, r3, %[r]\n\t"
  59269. #elif defined(__clang__)
  59270. "adcs r3, %[r]\n\t"
  59271. #else
  59272. "adc r3, %[r]\n\t"
  59273. #endif
  59274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59275. "lsrs r5, %[a], #16\n\t"
  59276. #else
  59277. "lsr r5, %[a], #16\n\t"
  59278. #endif
  59279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59280. "lsrs r6, r7, #16\n\t"
  59281. #else
  59282. "lsr r6, r7, #16\n\t"
  59283. #endif
  59284. #ifdef WOLFSSL_KEIL
  59285. "muls r6, r5, r6\n\t"
  59286. #elif defined(__clang__)
  59287. "muls r6, r5\n\t"
  59288. #else
  59289. "mul r6, r5\n\t"
  59290. #endif
  59291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59292. "adds r2, r2, r6\n\t"
  59293. #else
  59294. "add r2, r2, r6\n\t"
  59295. #endif
  59296. #ifdef WOLFSSL_KEIL
  59297. "adcs r3, r3, %[r]\n\t"
  59298. #elif defined(__clang__)
  59299. "adcs r3, %[r]\n\t"
  59300. #else
  59301. "adc r3, %[r]\n\t"
  59302. #endif
  59303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59304. "adds r2, r2, r6\n\t"
  59305. #else
  59306. "add r2, r2, r6\n\t"
  59307. #endif
  59308. #ifdef WOLFSSL_KEIL
  59309. "adcs r3, r3, %[r]\n\t"
  59310. #elif defined(__clang__)
  59311. "adcs r3, %[r]\n\t"
  59312. #else
  59313. "adc r3, %[r]\n\t"
  59314. #endif
  59315. "uxth r6, r7\n\t"
  59316. #ifdef WOLFSSL_KEIL
  59317. "muls r5, r6, r5\n\t"
  59318. #elif defined(__clang__)
  59319. "muls r5, r6\n\t"
  59320. #else
  59321. "mul r5, r6\n\t"
  59322. #endif
  59323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59324. "lsrs r6, r5, #16\n\t"
  59325. #else
  59326. "lsr r6, r5, #16\n\t"
  59327. #endif
  59328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59329. "lsls r5, r5, #16\n\t"
  59330. #else
  59331. "lsl r5, r5, #16\n\t"
  59332. #endif
  59333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59334. "adds r4, r4, r5\n\t"
  59335. #else
  59336. "add r4, r4, r5\n\t"
  59337. #endif
  59338. #ifdef WOLFSSL_KEIL
  59339. "adcs r2, r2, r6\n\t"
  59340. #elif defined(__clang__)
  59341. "adcs r2, r6\n\t"
  59342. #else
  59343. "adc r2, r6\n\t"
  59344. #endif
  59345. #ifdef WOLFSSL_KEIL
  59346. "adcs r3, r3, %[r]\n\t"
  59347. #elif defined(__clang__)
  59348. "adcs r3, %[r]\n\t"
  59349. #else
  59350. "adc r3, %[r]\n\t"
  59351. #endif
  59352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59353. "adds r4, r4, r5\n\t"
  59354. #else
  59355. "add r4, r4, r5\n\t"
  59356. #endif
  59357. #ifdef WOLFSSL_KEIL
  59358. "adcs r2, r2, r6\n\t"
  59359. #elif defined(__clang__)
  59360. "adcs r2, r6\n\t"
  59361. #else
  59362. "adc r2, r6\n\t"
  59363. #endif
  59364. #ifdef WOLFSSL_KEIL
  59365. "adcs r3, r3, %[r]\n\t"
  59366. #elif defined(__clang__)
  59367. "adcs r3, %[r]\n\t"
  59368. #else
  59369. "adc r3, %[r]\n\t"
  59370. #endif
  59371. "# A[5] * A[3]\n\t"
  59372. "mov %[a], r9\n\t"
  59373. "mov r7, lr\n\t"
  59374. "ldr %[a], [%[a], #20]\n\t"
  59375. "uxth r5, %[a]\n\t"
  59376. "uxth r6, r7\n\t"
  59377. #ifdef WOLFSSL_KEIL
  59378. "muls r6, r5, r6\n\t"
  59379. #elif defined(__clang__)
  59380. "muls r6, r5\n\t"
  59381. #else
  59382. "mul r6, r5\n\t"
  59383. #endif
  59384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59385. "adds r4, r4, r6\n\t"
  59386. #else
  59387. "add r4, r4, r6\n\t"
  59388. #endif
  59389. #ifdef WOLFSSL_KEIL
  59390. "adcs r2, r2, %[r]\n\t"
  59391. #elif defined(__clang__)
  59392. "adcs r2, %[r]\n\t"
  59393. #else
  59394. "adc r2, %[r]\n\t"
  59395. #endif
  59396. #ifdef WOLFSSL_KEIL
  59397. "adcs r3, r3, %[r]\n\t"
  59398. #elif defined(__clang__)
  59399. "adcs r3, %[r]\n\t"
  59400. #else
  59401. "adc r3, %[r]\n\t"
  59402. #endif
  59403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59404. "adds r4, r4, r6\n\t"
  59405. #else
  59406. "add r4, r4, r6\n\t"
  59407. #endif
  59408. #ifdef WOLFSSL_KEIL
  59409. "adcs r2, r2, %[r]\n\t"
  59410. #elif defined(__clang__)
  59411. "adcs r2, %[r]\n\t"
  59412. #else
  59413. "adc r2, %[r]\n\t"
  59414. #endif
  59415. #ifdef WOLFSSL_KEIL
  59416. "adcs r3, r3, %[r]\n\t"
  59417. #elif defined(__clang__)
  59418. "adcs r3, %[r]\n\t"
  59419. #else
  59420. "adc r3, %[r]\n\t"
  59421. #endif
  59422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59423. "lsrs r6, r7, #16\n\t"
  59424. #else
  59425. "lsr r6, r7, #16\n\t"
  59426. #endif
  59427. #ifdef WOLFSSL_KEIL
  59428. "muls r5, r6, r5\n\t"
  59429. #elif defined(__clang__)
  59430. "muls r5, r6\n\t"
  59431. #else
  59432. "mul r5, r6\n\t"
  59433. #endif
  59434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59435. "lsrs r6, r5, #16\n\t"
  59436. #else
  59437. "lsr r6, r5, #16\n\t"
  59438. #endif
  59439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59440. "lsls r5, r5, #16\n\t"
  59441. #else
  59442. "lsl r5, r5, #16\n\t"
  59443. #endif
  59444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59445. "adds r4, r4, r5\n\t"
  59446. #else
  59447. "add r4, r4, r5\n\t"
  59448. #endif
  59449. #ifdef WOLFSSL_KEIL
  59450. "adcs r2, r2, r6\n\t"
  59451. #elif defined(__clang__)
  59452. "adcs r2, r6\n\t"
  59453. #else
  59454. "adc r2, r6\n\t"
  59455. #endif
  59456. #ifdef WOLFSSL_KEIL
  59457. "adcs r3, r3, %[r]\n\t"
  59458. #elif defined(__clang__)
  59459. "adcs r3, %[r]\n\t"
  59460. #else
  59461. "adc r3, %[r]\n\t"
  59462. #endif
  59463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59464. "adds r4, r4, r5\n\t"
  59465. #else
  59466. "add r4, r4, r5\n\t"
  59467. #endif
  59468. #ifdef WOLFSSL_KEIL
  59469. "adcs r2, r2, r6\n\t"
  59470. #elif defined(__clang__)
  59471. "adcs r2, r6\n\t"
  59472. #else
  59473. "adc r2, r6\n\t"
  59474. #endif
  59475. #ifdef WOLFSSL_KEIL
  59476. "adcs r3, r3, %[r]\n\t"
  59477. #elif defined(__clang__)
  59478. "adcs r3, %[r]\n\t"
  59479. #else
  59480. "adc r3, %[r]\n\t"
  59481. #endif
  59482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59483. "lsrs r5, %[a], #16\n\t"
  59484. #else
  59485. "lsr r5, %[a], #16\n\t"
  59486. #endif
  59487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59488. "lsrs r6, r7, #16\n\t"
  59489. #else
  59490. "lsr r6, r7, #16\n\t"
  59491. #endif
  59492. #ifdef WOLFSSL_KEIL
  59493. "muls r6, r5, r6\n\t"
  59494. #elif defined(__clang__)
  59495. "muls r6, r5\n\t"
  59496. #else
  59497. "mul r6, r5\n\t"
  59498. #endif
  59499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59500. "adds r2, r2, r6\n\t"
  59501. #else
  59502. "add r2, r2, r6\n\t"
  59503. #endif
  59504. #ifdef WOLFSSL_KEIL
  59505. "adcs r3, r3, %[r]\n\t"
  59506. #elif defined(__clang__)
  59507. "adcs r3, %[r]\n\t"
  59508. #else
  59509. "adc r3, %[r]\n\t"
  59510. #endif
  59511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59512. "adds r2, r2, r6\n\t"
  59513. #else
  59514. "add r2, r2, r6\n\t"
  59515. #endif
  59516. #ifdef WOLFSSL_KEIL
  59517. "adcs r3, r3, %[r]\n\t"
  59518. #elif defined(__clang__)
  59519. "adcs r3, %[r]\n\t"
  59520. #else
  59521. "adc r3, %[r]\n\t"
  59522. #endif
  59523. "uxth r6, r7\n\t"
  59524. #ifdef WOLFSSL_KEIL
  59525. "muls r5, r6, r5\n\t"
  59526. #elif defined(__clang__)
  59527. "muls r5, r6\n\t"
  59528. #else
  59529. "mul r5, r6\n\t"
  59530. #endif
  59531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59532. "lsrs r6, r5, #16\n\t"
  59533. #else
  59534. "lsr r6, r5, #16\n\t"
  59535. #endif
  59536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59537. "lsls r5, r5, #16\n\t"
  59538. #else
  59539. "lsl r5, r5, #16\n\t"
  59540. #endif
  59541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59542. "adds r4, r4, r5\n\t"
  59543. #else
  59544. "add r4, r4, r5\n\t"
  59545. #endif
  59546. #ifdef WOLFSSL_KEIL
  59547. "adcs r2, r2, r6\n\t"
  59548. #elif defined(__clang__)
  59549. "adcs r2, r6\n\t"
  59550. #else
  59551. "adc r2, r6\n\t"
  59552. #endif
  59553. #ifdef WOLFSSL_KEIL
  59554. "adcs r3, r3, %[r]\n\t"
  59555. #elif defined(__clang__)
  59556. "adcs r3, %[r]\n\t"
  59557. #else
  59558. "adc r3, %[r]\n\t"
  59559. #endif
  59560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59561. "adds r4, r4, r5\n\t"
  59562. #else
  59563. "add r4, r4, r5\n\t"
  59564. #endif
  59565. #ifdef WOLFSSL_KEIL
  59566. "adcs r2, r2, r6\n\t"
  59567. #elif defined(__clang__)
  59568. "adcs r2, r6\n\t"
  59569. #else
  59570. "adc r2, r6\n\t"
  59571. #endif
  59572. #ifdef WOLFSSL_KEIL
  59573. "adcs r3, r3, %[r]\n\t"
  59574. #elif defined(__clang__)
  59575. "adcs r3, %[r]\n\t"
  59576. #else
  59577. "adc r3, %[r]\n\t"
  59578. #endif
  59579. "# A[4] * A[4]\n\t"
  59580. "mov %[a], r9\n\t"
  59581. "ldr r7, [%[a], #16]\n\t"
  59582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59583. "lsrs r6, r7, #16\n\t"
  59584. #else
  59585. "lsr r6, r7, #16\n\t"
  59586. #endif
  59587. "uxth r5, r7\n\t"
  59588. #ifdef WOLFSSL_KEIL
  59589. "muls r5, r5, r5\n\t"
  59590. #elif defined(__clang__)
  59591. "muls r5, r5\n\t"
  59592. #else
  59593. "mul r5, r5\n\t"
  59594. #endif
  59595. #ifdef WOLFSSL_KEIL
  59596. "muls r6, r6, r6\n\t"
  59597. #elif defined(__clang__)
  59598. "muls r6, r6\n\t"
  59599. #else
  59600. "mul r6, r6\n\t"
  59601. #endif
  59602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59603. "adds r4, r4, r5\n\t"
  59604. #else
  59605. "add r4, r4, r5\n\t"
  59606. #endif
  59607. #ifdef WOLFSSL_KEIL
  59608. "adcs r2, r2, r6\n\t"
  59609. #elif defined(__clang__)
  59610. "adcs r2, r6\n\t"
  59611. #else
  59612. "adc r2, r6\n\t"
  59613. #endif
  59614. #ifdef WOLFSSL_KEIL
  59615. "adcs r3, r3, %[r]\n\t"
  59616. #elif defined(__clang__)
  59617. "adcs r3, %[r]\n\t"
  59618. #else
  59619. "adc r3, %[r]\n\t"
  59620. #endif
  59621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59622. "lsrs r6, r7, #16\n\t"
  59623. #else
  59624. "lsr r6, r7, #16\n\t"
  59625. #endif
  59626. "uxth r5, r7\n\t"
  59627. #ifdef WOLFSSL_KEIL
  59628. "muls r5, r6, r5\n\t"
  59629. #elif defined(__clang__)
  59630. "muls r5, r6\n\t"
  59631. #else
  59632. "mul r5, r6\n\t"
  59633. #endif
  59634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59635. "lsrs r6, r5, #15\n\t"
  59636. #else
  59637. "lsr r6, r5, #15\n\t"
  59638. #endif
  59639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59640. "lsls r5, r5, #17\n\t"
  59641. #else
  59642. "lsl r5, r5, #17\n\t"
  59643. #endif
  59644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59645. "adds r4, r4, r5\n\t"
  59646. #else
  59647. "add r4, r4, r5\n\t"
  59648. #endif
  59649. #ifdef WOLFSSL_KEIL
  59650. "adcs r2, r2, r6\n\t"
  59651. #elif defined(__clang__)
  59652. "adcs r2, r6\n\t"
  59653. #else
  59654. "adc r2, r6\n\t"
  59655. #endif
  59656. #ifdef WOLFSSL_KEIL
  59657. "adcs r3, r3, %[r]\n\t"
  59658. #elif defined(__clang__)
  59659. "adcs r3, %[r]\n\t"
  59660. #else
  59661. "adc r3, %[r]\n\t"
  59662. #endif
  59663. "str r4, [sp, #32]\n\t"
  59664. "# A[5] * A[4]\n\t"
  59665. "movs r4, #0\n\t"
  59666. "ldr %[a], [%[a], #20]\n\t"
  59667. "uxth r5, %[a]\n\t"
  59668. "uxth r6, r7\n\t"
  59669. #ifdef WOLFSSL_KEIL
  59670. "muls r6, r5, r6\n\t"
  59671. #elif defined(__clang__)
  59672. "muls r6, r5\n\t"
  59673. #else
  59674. "mul r6, r5\n\t"
  59675. #endif
  59676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59677. "adds r2, r2, r6\n\t"
  59678. #else
  59679. "add r2, r2, r6\n\t"
  59680. #endif
  59681. #ifdef WOLFSSL_KEIL
  59682. "adcs r3, r3, %[r]\n\t"
  59683. #elif defined(__clang__)
  59684. "adcs r3, %[r]\n\t"
  59685. #else
  59686. "adc r3, %[r]\n\t"
  59687. #endif
  59688. #ifdef WOLFSSL_KEIL
  59689. "adcs r4, r4, %[r]\n\t"
  59690. #elif defined(__clang__)
  59691. "adcs r4, %[r]\n\t"
  59692. #else
  59693. "adc r4, %[r]\n\t"
  59694. #endif
  59695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59696. "adds r2, r2, r6\n\t"
  59697. #else
  59698. "add r2, r2, r6\n\t"
  59699. #endif
  59700. #ifdef WOLFSSL_KEIL
  59701. "adcs r3, r3, %[r]\n\t"
  59702. #elif defined(__clang__)
  59703. "adcs r3, %[r]\n\t"
  59704. #else
  59705. "adc r3, %[r]\n\t"
  59706. #endif
  59707. #ifdef WOLFSSL_KEIL
  59708. "adcs r4, r4, %[r]\n\t"
  59709. #elif defined(__clang__)
  59710. "adcs r4, %[r]\n\t"
  59711. #else
  59712. "adc r4, %[r]\n\t"
  59713. #endif
  59714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59715. "lsrs r6, r7, #16\n\t"
  59716. #else
  59717. "lsr r6, r7, #16\n\t"
  59718. #endif
  59719. #ifdef WOLFSSL_KEIL
  59720. "muls r5, r6, r5\n\t"
  59721. #elif defined(__clang__)
  59722. "muls r5, r6\n\t"
  59723. #else
  59724. "mul r5, r6\n\t"
  59725. #endif
  59726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59727. "lsrs r6, r5, #16\n\t"
  59728. #else
  59729. "lsr r6, r5, #16\n\t"
  59730. #endif
  59731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59732. "lsls r5, r5, #16\n\t"
  59733. #else
  59734. "lsl r5, r5, #16\n\t"
  59735. #endif
  59736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59737. "adds r2, r2, r5\n\t"
  59738. #else
  59739. "add r2, r2, r5\n\t"
  59740. #endif
  59741. #ifdef WOLFSSL_KEIL
  59742. "adcs r3, r3, r6\n\t"
  59743. #elif defined(__clang__)
  59744. "adcs r3, r6\n\t"
  59745. #else
  59746. "adc r3, r6\n\t"
  59747. #endif
  59748. #ifdef WOLFSSL_KEIL
  59749. "adcs r4, r4, %[r]\n\t"
  59750. #elif defined(__clang__)
  59751. "adcs r4, %[r]\n\t"
  59752. #else
  59753. "adc r4, %[r]\n\t"
  59754. #endif
  59755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59756. "adds r2, r2, r5\n\t"
  59757. #else
  59758. "add r2, r2, r5\n\t"
  59759. #endif
  59760. #ifdef WOLFSSL_KEIL
  59761. "adcs r3, r3, r6\n\t"
  59762. #elif defined(__clang__)
  59763. "adcs r3, r6\n\t"
  59764. #else
  59765. "adc r3, r6\n\t"
  59766. #endif
  59767. #ifdef WOLFSSL_KEIL
  59768. "adcs r4, r4, %[r]\n\t"
  59769. #elif defined(__clang__)
  59770. "adcs r4, %[r]\n\t"
  59771. #else
  59772. "adc r4, %[r]\n\t"
  59773. #endif
  59774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59775. "lsrs r5, %[a], #16\n\t"
  59776. #else
  59777. "lsr r5, %[a], #16\n\t"
  59778. #endif
  59779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59780. "lsrs r6, r7, #16\n\t"
  59781. #else
  59782. "lsr r6, r7, #16\n\t"
  59783. #endif
  59784. #ifdef WOLFSSL_KEIL
  59785. "muls r6, r5, r6\n\t"
  59786. #elif defined(__clang__)
  59787. "muls r6, r5\n\t"
  59788. #else
  59789. "mul r6, r5\n\t"
  59790. #endif
  59791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59792. "adds r3, r3, r6\n\t"
  59793. #else
  59794. "add r3, r3, r6\n\t"
  59795. #endif
  59796. #ifdef WOLFSSL_KEIL
  59797. "adcs r4, r4, %[r]\n\t"
  59798. #elif defined(__clang__)
  59799. "adcs r4, %[r]\n\t"
  59800. #else
  59801. "adc r4, %[r]\n\t"
  59802. #endif
  59803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59804. "adds r3, r3, r6\n\t"
  59805. #else
  59806. "add r3, r3, r6\n\t"
  59807. #endif
  59808. #ifdef WOLFSSL_KEIL
  59809. "adcs r4, r4, %[r]\n\t"
  59810. #elif defined(__clang__)
  59811. "adcs r4, %[r]\n\t"
  59812. #else
  59813. "adc r4, %[r]\n\t"
  59814. #endif
  59815. "uxth r6, r7\n\t"
  59816. #ifdef WOLFSSL_KEIL
  59817. "muls r5, r6, r5\n\t"
  59818. #elif defined(__clang__)
  59819. "muls r5, r6\n\t"
  59820. #else
  59821. "mul r5, r6\n\t"
  59822. #endif
  59823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59824. "lsrs r6, r5, #16\n\t"
  59825. #else
  59826. "lsr r6, r5, #16\n\t"
  59827. #endif
  59828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59829. "lsls r5, r5, #16\n\t"
  59830. #else
  59831. "lsl r5, r5, #16\n\t"
  59832. #endif
  59833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59834. "adds r2, r2, r5\n\t"
  59835. #else
  59836. "add r2, r2, r5\n\t"
  59837. #endif
  59838. #ifdef WOLFSSL_KEIL
  59839. "adcs r3, r3, r6\n\t"
  59840. #elif defined(__clang__)
  59841. "adcs r3, r6\n\t"
  59842. #else
  59843. "adc r3, r6\n\t"
  59844. #endif
  59845. #ifdef WOLFSSL_KEIL
  59846. "adcs r4, r4, %[r]\n\t"
  59847. #elif defined(__clang__)
  59848. "adcs r4, %[r]\n\t"
  59849. #else
  59850. "adc r4, %[r]\n\t"
  59851. #endif
  59852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59853. "adds r2, r2, r5\n\t"
  59854. #else
  59855. "add r2, r2, r5\n\t"
  59856. #endif
  59857. #ifdef WOLFSSL_KEIL
  59858. "adcs r3, r3, r6\n\t"
  59859. #elif defined(__clang__)
  59860. "adcs r3, r6\n\t"
  59861. #else
  59862. "adc r3, r6\n\t"
  59863. #endif
  59864. #ifdef WOLFSSL_KEIL
  59865. "adcs r4, r4, %[r]\n\t"
  59866. #elif defined(__clang__)
  59867. "adcs r4, %[r]\n\t"
  59868. #else
  59869. "adc r4, %[r]\n\t"
  59870. #endif
  59871. "# A[6] * A[3]\n\t"
  59872. "mov %[a], r9\n\t"
  59873. "mov r7, lr\n\t"
  59874. "ldr %[a], [%[a], #24]\n\t"
  59875. "uxth r5, %[a]\n\t"
  59876. "uxth r6, r7\n\t"
  59877. #ifdef WOLFSSL_KEIL
  59878. "muls r6, r5, r6\n\t"
  59879. #elif defined(__clang__)
  59880. "muls r6, r5\n\t"
  59881. #else
  59882. "mul r6, r5\n\t"
  59883. #endif
  59884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59885. "adds r2, r2, r6\n\t"
  59886. #else
  59887. "add r2, r2, r6\n\t"
  59888. #endif
  59889. #ifdef WOLFSSL_KEIL
  59890. "adcs r3, r3, %[r]\n\t"
  59891. #elif defined(__clang__)
  59892. "adcs r3, %[r]\n\t"
  59893. #else
  59894. "adc r3, %[r]\n\t"
  59895. #endif
  59896. #ifdef WOLFSSL_KEIL
  59897. "adcs r4, r4, %[r]\n\t"
  59898. #elif defined(__clang__)
  59899. "adcs r4, %[r]\n\t"
  59900. #else
  59901. "adc r4, %[r]\n\t"
  59902. #endif
  59903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59904. "adds r2, r2, r6\n\t"
  59905. #else
  59906. "add r2, r2, r6\n\t"
  59907. #endif
  59908. #ifdef WOLFSSL_KEIL
  59909. "adcs r3, r3, %[r]\n\t"
  59910. #elif defined(__clang__)
  59911. "adcs r3, %[r]\n\t"
  59912. #else
  59913. "adc r3, %[r]\n\t"
  59914. #endif
  59915. #ifdef WOLFSSL_KEIL
  59916. "adcs r4, r4, %[r]\n\t"
  59917. #elif defined(__clang__)
  59918. "adcs r4, %[r]\n\t"
  59919. #else
  59920. "adc r4, %[r]\n\t"
  59921. #endif
  59922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59923. "lsrs r6, r7, #16\n\t"
  59924. #else
  59925. "lsr r6, r7, #16\n\t"
  59926. #endif
  59927. #ifdef WOLFSSL_KEIL
  59928. "muls r5, r6, r5\n\t"
  59929. #elif defined(__clang__)
  59930. "muls r5, r6\n\t"
  59931. #else
  59932. "mul r5, r6\n\t"
  59933. #endif
  59934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59935. "lsrs r6, r5, #16\n\t"
  59936. #else
  59937. "lsr r6, r5, #16\n\t"
  59938. #endif
  59939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59940. "lsls r5, r5, #16\n\t"
  59941. #else
  59942. "lsl r5, r5, #16\n\t"
  59943. #endif
  59944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59945. "adds r2, r2, r5\n\t"
  59946. #else
  59947. "add r2, r2, r5\n\t"
  59948. #endif
  59949. #ifdef WOLFSSL_KEIL
  59950. "adcs r3, r3, r6\n\t"
  59951. #elif defined(__clang__)
  59952. "adcs r3, r6\n\t"
  59953. #else
  59954. "adc r3, r6\n\t"
  59955. #endif
  59956. #ifdef WOLFSSL_KEIL
  59957. "adcs r4, r4, %[r]\n\t"
  59958. #elif defined(__clang__)
  59959. "adcs r4, %[r]\n\t"
  59960. #else
  59961. "adc r4, %[r]\n\t"
  59962. #endif
  59963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59964. "adds r2, r2, r5\n\t"
  59965. #else
  59966. "add r2, r2, r5\n\t"
  59967. #endif
  59968. #ifdef WOLFSSL_KEIL
  59969. "adcs r3, r3, r6\n\t"
  59970. #elif defined(__clang__)
  59971. "adcs r3, r6\n\t"
  59972. #else
  59973. "adc r3, r6\n\t"
  59974. #endif
  59975. #ifdef WOLFSSL_KEIL
  59976. "adcs r4, r4, %[r]\n\t"
  59977. #elif defined(__clang__)
  59978. "adcs r4, %[r]\n\t"
  59979. #else
  59980. "adc r4, %[r]\n\t"
  59981. #endif
  59982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59983. "lsrs r5, %[a], #16\n\t"
  59984. #else
  59985. "lsr r5, %[a], #16\n\t"
  59986. #endif
  59987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59988. "lsrs r6, r7, #16\n\t"
  59989. #else
  59990. "lsr r6, r7, #16\n\t"
  59991. #endif
  59992. #ifdef WOLFSSL_KEIL
  59993. "muls r6, r5, r6\n\t"
  59994. #elif defined(__clang__)
  59995. "muls r6, r5\n\t"
  59996. #else
  59997. "mul r6, r5\n\t"
  59998. #endif
  59999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60000. "adds r3, r3, r6\n\t"
  60001. #else
  60002. "add r3, r3, r6\n\t"
  60003. #endif
  60004. #ifdef WOLFSSL_KEIL
  60005. "adcs r4, r4, %[r]\n\t"
  60006. #elif defined(__clang__)
  60007. "adcs r4, %[r]\n\t"
  60008. #else
  60009. "adc r4, %[r]\n\t"
  60010. #endif
  60011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60012. "adds r3, r3, r6\n\t"
  60013. #else
  60014. "add r3, r3, r6\n\t"
  60015. #endif
  60016. #ifdef WOLFSSL_KEIL
  60017. "adcs r4, r4, %[r]\n\t"
  60018. #elif defined(__clang__)
  60019. "adcs r4, %[r]\n\t"
  60020. #else
  60021. "adc r4, %[r]\n\t"
  60022. #endif
  60023. "uxth r6, r7\n\t"
  60024. #ifdef WOLFSSL_KEIL
  60025. "muls r5, r6, r5\n\t"
  60026. #elif defined(__clang__)
  60027. "muls r5, r6\n\t"
  60028. #else
  60029. "mul r5, r6\n\t"
  60030. #endif
  60031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60032. "lsrs r6, r5, #16\n\t"
  60033. #else
  60034. "lsr r6, r5, #16\n\t"
  60035. #endif
  60036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60037. "lsls r5, r5, #16\n\t"
  60038. #else
  60039. "lsl r5, r5, #16\n\t"
  60040. #endif
  60041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60042. "adds r2, r2, r5\n\t"
  60043. #else
  60044. "add r2, r2, r5\n\t"
  60045. #endif
  60046. #ifdef WOLFSSL_KEIL
  60047. "adcs r3, r3, r6\n\t"
  60048. #elif defined(__clang__)
  60049. "adcs r3, r6\n\t"
  60050. #else
  60051. "adc r3, r6\n\t"
  60052. #endif
  60053. #ifdef WOLFSSL_KEIL
  60054. "adcs r4, r4, %[r]\n\t"
  60055. #elif defined(__clang__)
  60056. "adcs r4, %[r]\n\t"
  60057. #else
  60058. "adc r4, %[r]\n\t"
  60059. #endif
  60060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60061. "adds r2, r2, r5\n\t"
  60062. #else
  60063. "add r2, r2, r5\n\t"
  60064. #endif
  60065. #ifdef WOLFSSL_KEIL
  60066. "adcs r3, r3, r6\n\t"
  60067. #elif defined(__clang__)
  60068. "adcs r3, r6\n\t"
  60069. #else
  60070. "adc r3, r6\n\t"
  60071. #endif
  60072. #ifdef WOLFSSL_KEIL
  60073. "adcs r4, r4, %[r]\n\t"
  60074. #elif defined(__clang__)
  60075. "adcs r4, %[r]\n\t"
  60076. #else
  60077. "adc r4, %[r]\n\t"
  60078. #endif
  60079. "# A[7] * A[2]\n\t"
  60080. "mov %[a], r9\n\t"
  60081. "mov r7, r12\n\t"
  60082. "ldr %[a], [%[a], #28]\n\t"
  60083. "uxth r5, %[a]\n\t"
  60084. "uxth r6, r7\n\t"
  60085. #ifdef WOLFSSL_KEIL
  60086. "muls r6, r5, r6\n\t"
  60087. #elif defined(__clang__)
  60088. "muls r6, r5\n\t"
  60089. #else
  60090. "mul r6, r5\n\t"
  60091. #endif
  60092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60093. "adds r2, r2, r6\n\t"
  60094. #else
  60095. "add r2, r2, r6\n\t"
  60096. #endif
  60097. #ifdef WOLFSSL_KEIL
  60098. "adcs r3, r3, %[r]\n\t"
  60099. #elif defined(__clang__)
  60100. "adcs r3, %[r]\n\t"
  60101. #else
  60102. "adc r3, %[r]\n\t"
  60103. #endif
  60104. #ifdef WOLFSSL_KEIL
  60105. "adcs r4, r4, %[r]\n\t"
  60106. #elif defined(__clang__)
  60107. "adcs r4, %[r]\n\t"
  60108. #else
  60109. "adc r4, %[r]\n\t"
  60110. #endif
  60111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60112. "adds r2, r2, r6\n\t"
  60113. #else
  60114. "add r2, r2, r6\n\t"
  60115. #endif
  60116. #ifdef WOLFSSL_KEIL
  60117. "adcs r3, r3, %[r]\n\t"
  60118. #elif defined(__clang__)
  60119. "adcs r3, %[r]\n\t"
  60120. #else
  60121. "adc r3, %[r]\n\t"
  60122. #endif
  60123. #ifdef WOLFSSL_KEIL
  60124. "adcs r4, r4, %[r]\n\t"
  60125. #elif defined(__clang__)
  60126. "adcs r4, %[r]\n\t"
  60127. #else
  60128. "adc r4, %[r]\n\t"
  60129. #endif
  60130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60131. "lsrs r6, r7, #16\n\t"
  60132. #else
  60133. "lsr r6, r7, #16\n\t"
  60134. #endif
  60135. #ifdef WOLFSSL_KEIL
  60136. "muls r5, r6, r5\n\t"
  60137. #elif defined(__clang__)
  60138. "muls r5, r6\n\t"
  60139. #else
  60140. "mul r5, r6\n\t"
  60141. #endif
  60142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60143. "lsrs r6, r5, #16\n\t"
  60144. #else
  60145. "lsr r6, r5, #16\n\t"
  60146. #endif
  60147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60148. "lsls r5, r5, #16\n\t"
  60149. #else
  60150. "lsl r5, r5, #16\n\t"
  60151. #endif
  60152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60153. "adds r2, r2, r5\n\t"
  60154. #else
  60155. "add r2, r2, r5\n\t"
  60156. #endif
  60157. #ifdef WOLFSSL_KEIL
  60158. "adcs r3, r3, r6\n\t"
  60159. #elif defined(__clang__)
  60160. "adcs r3, r6\n\t"
  60161. #else
  60162. "adc r3, r6\n\t"
  60163. #endif
  60164. #ifdef WOLFSSL_KEIL
  60165. "adcs r4, r4, %[r]\n\t"
  60166. #elif defined(__clang__)
  60167. "adcs r4, %[r]\n\t"
  60168. #else
  60169. "adc r4, %[r]\n\t"
  60170. #endif
  60171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60172. "adds r2, r2, r5\n\t"
  60173. #else
  60174. "add r2, r2, r5\n\t"
  60175. #endif
  60176. #ifdef WOLFSSL_KEIL
  60177. "adcs r3, r3, r6\n\t"
  60178. #elif defined(__clang__)
  60179. "adcs r3, r6\n\t"
  60180. #else
  60181. "adc r3, r6\n\t"
  60182. #endif
  60183. #ifdef WOLFSSL_KEIL
  60184. "adcs r4, r4, %[r]\n\t"
  60185. #elif defined(__clang__)
  60186. "adcs r4, %[r]\n\t"
  60187. #else
  60188. "adc r4, %[r]\n\t"
  60189. #endif
  60190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60191. "lsrs r5, %[a], #16\n\t"
  60192. #else
  60193. "lsr r5, %[a], #16\n\t"
  60194. #endif
  60195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60196. "lsrs r6, r7, #16\n\t"
  60197. #else
  60198. "lsr r6, r7, #16\n\t"
  60199. #endif
  60200. #ifdef WOLFSSL_KEIL
  60201. "muls r6, r5, r6\n\t"
  60202. #elif defined(__clang__)
  60203. "muls r6, r5\n\t"
  60204. #else
  60205. "mul r6, r5\n\t"
  60206. #endif
  60207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60208. "adds r3, r3, r6\n\t"
  60209. #else
  60210. "add r3, r3, r6\n\t"
  60211. #endif
  60212. #ifdef WOLFSSL_KEIL
  60213. "adcs r4, r4, %[r]\n\t"
  60214. #elif defined(__clang__)
  60215. "adcs r4, %[r]\n\t"
  60216. #else
  60217. "adc r4, %[r]\n\t"
  60218. #endif
  60219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60220. "adds r3, r3, r6\n\t"
  60221. #else
  60222. "add r3, r3, r6\n\t"
  60223. #endif
  60224. #ifdef WOLFSSL_KEIL
  60225. "adcs r4, r4, %[r]\n\t"
  60226. #elif defined(__clang__)
  60227. "adcs r4, %[r]\n\t"
  60228. #else
  60229. "adc r4, %[r]\n\t"
  60230. #endif
  60231. "uxth r6, r7\n\t"
  60232. #ifdef WOLFSSL_KEIL
  60233. "muls r5, r6, r5\n\t"
  60234. #elif defined(__clang__)
  60235. "muls r5, r6\n\t"
  60236. #else
  60237. "mul r5, r6\n\t"
  60238. #endif
  60239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60240. "lsrs r6, r5, #16\n\t"
  60241. #else
  60242. "lsr r6, r5, #16\n\t"
  60243. #endif
  60244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60245. "lsls r5, r5, #16\n\t"
  60246. #else
  60247. "lsl r5, r5, #16\n\t"
  60248. #endif
  60249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60250. "adds r2, r2, r5\n\t"
  60251. #else
  60252. "add r2, r2, r5\n\t"
  60253. #endif
  60254. #ifdef WOLFSSL_KEIL
  60255. "adcs r3, r3, r6\n\t"
  60256. #elif defined(__clang__)
  60257. "adcs r3, r6\n\t"
  60258. #else
  60259. "adc r3, r6\n\t"
  60260. #endif
  60261. #ifdef WOLFSSL_KEIL
  60262. "adcs r4, r4, %[r]\n\t"
  60263. #elif defined(__clang__)
  60264. "adcs r4, %[r]\n\t"
  60265. #else
  60266. "adc r4, %[r]\n\t"
  60267. #endif
  60268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60269. "adds r2, r2, r5\n\t"
  60270. #else
  60271. "add r2, r2, r5\n\t"
  60272. #endif
  60273. #ifdef WOLFSSL_KEIL
  60274. "adcs r3, r3, r6\n\t"
  60275. #elif defined(__clang__)
  60276. "adcs r3, r6\n\t"
  60277. #else
  60278. "adc r3, r6\n\t"
  60279. #endif
  60280. #ifdef WOLFSSL_KEIL
  60281. "adcs r4, r4, %[r]\n\t"
  60282. #elif defined(__clang__)
  60283. "adcs r4, %[r]\n\t"
  60284. #else
  60285. "adc r4, %[r]\n\t"
  60286. #endif
  60287. "# A[8] * A[1]\n\t"
  60288. "mov %[a], r9\n\t"
  60289. "mov r7, r11\n\t"
  60290. "ldr %[a], [%[a], #32]\n\t"
  60291. "uxth r5, %[a]\n\t"
  60292. "uxth r6, r7\n\t"
  60293. #ifdef WOLFSSL_KEIL
  60294. "muls r6, r5, r6\n\t"
  60295. #elif defined(__clang__)
  60296. "muls r6, r5\n\t"
  60297. #else
  60298. "mul r6, r5\n\t"
  60299. #endif
  60300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60301. "adds r2, r2, r6\n\t"
  60302. #else
  60303. "add r2, r2, r6\n\t"
  60304. #endif
  60305. #ifdef WOLFSSL_KEIL
  60306. "adcs r3, r3, %[r]\n\t"
  60307. #elif defined(__clang__)
  60308. "adcs r3, %[r]\n\t"
  60309. #else
  60310. "adc r3, %[r]\n\t"
  60311. #endif
  60312. #ifdef WOLFSSL_KEIL
  60313. "adcs r4, r4, %[r]\n\t"
  60314. #elif defined(__clang__)
  60315. "adcs r4, %[r]\n\t"
  60316. #else
  60317. "adc r4, %[r]\n\t"
  60318. #endif
  60319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60320. "adds r2, r2, r6\n\t"
  60321. #else
  60322. "add r2, r2, r6\n\t"
  60323. #endif
  60324. #ifdef WOLFSSL_KEIL
  60325. "adcs r3, r3, %[r]\n\t"
  60326. #elif defined(__clang__)
  60327. "adcs r3, %[r]\n\t"
  60328. #else
  60329. "adc r3, %[r]\n\t"
  60330. #endif
  60331. #ifdef WOLFSSL_KEIL
  60332. "adcs r4, r4, %[r]\n\t"
  60333. #elif defined(__clang__)
  60334. "adcs r4, %[r]\n\t"
  60335. #else
  60336. "adc r4, %[r]\n\t"
  60337. #endif
  60338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60339. "lsrs r6, r7, #16\n\t"
  60340. #else
  60341. "lsr r6, r7, #16\n\t"
  60342. #endif
  60343. #ifdef WOLFSSL_KEIL
  60344. "muls r5, r6, r5\n\t"
  60345. #elif defined(__clang__)
  60346. "muls r5, r6\n\t"
  60347. #else
  60348. "mul r5, r6\n\t"
  60349. #endif
  60350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60351. "lsrs r6, r5, #16\n\t"
  60352. #else
  60353. "lsr r6, r5, #16\n\t"
  60354. #endif
  60355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60356. "lsls r5, r5, #16\n\t"
  60357. #else
  60358. "lsl r5, r5, #16\n\t"
  60359. #endif
  60360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60361. "adds r2, r2, r5\n\t"
  60362. #else
  60363. "add r2, r2, r5\n\t"
  60364. #endif
  60365. #ifdef WOLFSSL_KEIL
  60366. "adcs r3, r3, r6\n\t"
  60367. #elif defined(__clang__)
  60368. "adcs r3, r6\n\t"
  60369. #else
  60370. "adc r3, r6\n\t"
  60371. #endif
  60372. #ifdef WOLFSSL_KEIL
  60373. "adcs r4, r4, %[r]\n\t"
  60374. #elif defined(__clang__)
  60375. "adcs r4, %[r]\n\t"
  60376. #else
  60377. "adc r4, %[r]\n\t"
  60378. #endif
  60379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60380. "adds r2, r2, r5\n\t"
  60381. #else
  60382. "add r2, r2, r5\n\t"
  60383. #endif
  60384. #ifdef WOLFSSL_KEIL
  60385. "adcs r3, r3, r6\n\t"
  60386. #elif defined(__clang__)
  60387. "adcs r3, r6\n\t"
  60388. #else
  60389. "adc r3, r6\n\t"
  60390. #endif
  60391. #ifdef WOLFSSL_KEIL
  60392. "adcs r4, r4, %[r]\n\t"
  60393. #elif defined(__clang__)
  60394. "adcs r4, %[r]\n\t"
  60395. #else
  60396. "adc r4, %[r]\n\t"
  60397. #endif
  60398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60399. "lsrs r5, %[a], #16\n\t"
  60400. #else
  60401. "lsr r5, %[a], #16\n\t"
  60402. #endif
  60403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60404. "lsrs r6, r7, #16\n\t"
  60405. #else
  60406. "lsr r6, r7, #16\n\t"
  60407. #endif
  60408. #ifdef WOLFSSL_KEIL
  60409. "muls r6, r5, r6\n\t"
  60410. #elif defined(__clang__)
  60411. "muls r6, r5\n\t"
  60412. #else
  60413. "mul r6, r5\n\t"
  60414. #endif
  60415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60416. "adds r3, r3, r6\n\t"
  60417. #else
  60418. "add r3, r3, r6\n\t"
  60419. #endif
  60420. #ifdef WOLFSSL_KEIL
  60421. "adcs r4, r4, %[r]\n\t"
  60422. #elif defined(__clang__)
  60423. "adcs r4, %[r]\n\t"
  60424. #else
  60425. "adc r4, %[r]\n\t"
  60426. #endif
  60427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60428. "adds r3, r3, r6\n\t"
  60429. #else
  60430. "add r3, r3, r6\n\t"
  60431. #endif
  60432. #ifdef WOLFSSL_KEIL
  60433. "adcs r4, r4, %[r]\n\t"
  60434. #elif defined(__clang__)
  60435. "adcs r4, %[r]\n\t"
  60436. #else
  60437. "adc r4, %[r]\n\t"
  60438. #endif
  60439. "uxth r6, r7\n\t"
  60440. #ifdef WOLFSSL_KEIL
  60441. "muls r5, r6, r5\n\t"
  60442. #elif defined(__clang__)
  60443. "muls r5, r6\n\t"
  60444. #else
  60445. "mul r5, r6\n\t"
  60446. #endif
  60447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60448. "lsrs r6, r5, #16\n\t"
  60449. #else
  60450. "lsr r6, r5, #16\n\t"
  60451. #endif
  60452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60453. "lsls r5, r5, #16\n\t"
  60454. #else
  60455. "lsl r5, r5, #16\n\t"
  60456. #endif
  60457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60458. "adds r2, r2, r5\n\t"
  60459. #else
  60460. "add r2, r2, r5\n\t"
  60461. #endif
  60462. #ifdef WOLFSSL_KEIL
  60463. "adcs r3, r3, r6\n\t"
  60464. #elif defined(__clang__)
  60465. "adcs r3, r6\n\t"
  60466. #else
  60467. "adc r3, r6\n\t"
  60468. #endif
  60469. #ifdef WOLFSSL_KEIL
  60470. "adcs r4, r4, %[r]\n\t"
  60471. #elif defined(__clang__)
  60472. "adcs r4, %[r]\n\t"
  60473. #else
  60474. "adc r4, %[r]\n\t"
  60475. #endif
  60476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60477. "adds r2, r2, r5\n\t"
  60478. #else
  60479. "add r2, r2, r5\n\t"
  60480. #endif
  60481. #ifdef WOLFSSL_KEIL
  60482. "adcs r3, r3, r6\n\t"
  60483. #elif defined(__clang__)
  60484. "adcs r3, r6\n\t"
  60485. #else
  60486. "adc r3, r6\n\t"
  60487. #endif
  60488. #ifdef WOLFSSL_KEIL
  60489. "adcs r4, r4, %[r]\n\t"
  60490. #elif defined(__clang__)
  60491. "adcs r4, %[r]\n\t"
  60492. #else
  60493. "adc r4, %[r]\n\t"
  60494. #endif
  60495. "# A[9] * A[0]\n\t"
  60496. "mov %[a], r9\n\t"
  60497. "mov r7, r10\n\t"
  60498. "ldr %[a], [%[a], #36]\n\t"
  60499. "uxth r5, %[a]\n\t"
  60500. "uxth r6, r7\n\t"
  60501. #ifdef WOLFSSL_KEIL
  60502. "muls r6, r5, r6\n\t"
  60503. #elif defined(__clang__)
  60504. "muls r6, r5\n\t"
  60505. #else
  60506. "mul r6, r5\n\t"
  60507. #endif
  60508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60509. "adds r2, r2, r6\n\t"
  60510. #else
  60511. "add r2, r2, r6\n\t"
  60512. #endif
  60513. #ifdef WOLFSSL_KEIL
  60514. "adcs r3, r3, %[r]\n\t"
  60515. #elif defined(__clang__)
  60516. "adcs r3, %[r]\n\t"
  60517. #else
  60518. "adc r3, %[r]\n\t"
  60519. #endif
  60520. #ifdef WOLFSSL_KEIL
  60521. "adcs r4, r4, %[r]\n\t"
  60522. #elif defined(__clang__)
  60523. "adcs r4, %[r]\n\t"
  60524. #else
  60525. "adc r4, %[r]\n\t"
  60526. #endif
  60527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60528. "adds r2, r2, r6\n\t"
  60529. #else
  60530. "add r2, r2, r6\n\t"
  60531. #endif
  60532. #ifdef WOLFSSL_KEIL
  60533. "adcs r3, r3, %[r]\n\t"
  60534. #elif defined(__clang__)
  60535. "adcs r3, %[r]\n\t"
  60536. #else
  60537. "adc r3, %[r]\n\t"
  60538. #endif
  60539. #ifdef WOLFSSL_KEIL
  60540. "adcs r4, r4, %[r]\n\t"
  60541. #elif defined(__clang__)
  60542. "adcs r4, %[r]\n\t"
  60543. #else
  60544. "adc r4, %[r]\n\t"
  60545. #endif
  60546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60547. "lsrs r6, r7, #16\n\t"
  60548. #else
  60549. "lsr r6, r7, #16\n\t"
  60550. #endif
  60551. #ifdef WOLFSSL_KEIL
  60552. "muls r5, r6, r5\n\t"
  60553. #elif defined(__clang__)
  60554. "muls r5, r6\n\t"
  60555. #else
  60556. "mul r5, r6\n\t"
  60557. #endif
  60558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60559. "lsrs r6, r5, #16\n\t"
  60560. #else
  60561. "lsr r6, r5, #16\n\t"
  60562. #endif
  60563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60564. "lsls r5, r5, #16\n\t"
  60565. #else
  60566. "lsl r5, r5, #16\n\t"
  60567. #endif
  60568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60569. "adds r2, r2, r5\n\t"
  60570. #else
  60571. "add r2, r2, r5\n\t"
  60572. #endif
  60573. #ifdef WOLFSSL_KEIL
  60574. "adcs r3, r3, r6\n\t"
  60575. #elif defined(__clang__)
  60576. "adcs r3, r6\n\t"
  60577. #else
  60578. "adc r3, r6\n\t"
  60579. #endif
  60580. #ifdef WOLFSSL_KEIL
  60581. "adcs r4, r4, %[r]\n\t"
  60582. #elif defined(__clang__)
  60583. "adcs r4, %[r]\n\t"
  60584. #else
  60585. "adc r4, %[r]\n\t"
  60586. #endif
  60587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60588. "adds r2, r2, r5\n\t"
  60589. #else
  60590. "add r2, r2, r5\n\t"
  60591. #endif
  60592. #ifdef WOLFSSL_KEIL
  60593. "adcs r3, r3, r6\n\t"
  60594. #elif defined(__clang__)
  60595. "adcs r3, r6\n\t"
  60596. #else
  60597. "adc r3, r6\n\t"
  60598. #endif
  60599. #ifdef WOLFSSL_KEIL
  60600. "adcs r4, r4, %[r]\n\t"
  60601. #elif defined(__clang__)
  60602. "adcs r4, %[r]\n\t"
  60603. #else
  60604. "adc r4, %[r]\n\t"
  60605. #endif
  60606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60607. "lsrs r5, %[a], #16\n\t"
  60608. #else
  60609. "lsr r5, %[a], #16\n\t"
  60610. #endif
  60611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60612. "lsrs r6, r7, #16\n\t"
  60613. #else
  60614. "lsr r6, r7, #16\n\t"
  60615. #endif
  60616. #ifdef WOLFSSL_KEIL
  60617. "muls r6, r5, r6\n\t"
  60618. #elif defined(__clang__)
  60619. "muls r6, r5\n\t"
  60620. #else
  60621. "mul r6, r5\n\t"
  60622. #endif
  60623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60624. "adds r3, r3, r6\n\t"
  60625. #else
  60626. "add r3, r3, r6\n\t"
  60627. #endif
  60628. #ifdef WOLFSSL_KEIL
  60629. "adcs r4, r4, %[r]\n\t"
  60630. #elif defined(__clang__)
  60631. "adcs r4, %[r]\n\t"
  60632. #else
  60633. "adc r4, %[r]\n\t"
  60634. #endif
  60635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60636. "adds r3, r3, r6\n\t"
  60637. #else
  60638. "add r3, r3, r6\n\t"
  60639. #endif
  60640. #ifdef WOLFSSL_KEIL
  60641. "adcs r4, r4, %[r]\n\t"
  60642. #elif defined(__clang__)
  60643. "adcs r4, %[r]\n\t"
  60644. #else
  60645. "adc r4, %[r]\n\t"
  60646. #endif
  60647. "uxth r6, r7\n\t"
  60648. #ifdef WOLFSSL_KEIL
  60649. "muls r5, r6, r5\n\t"
  60650. #elif defined(__clang__)
  60651. "muls r5, r6\n\t"
  60652. #else
  60653. "mul r5, r6\n\t"
  60654. #endif
  60655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60656. "lsrs r6, r5, #16\n\t"
  60657. #else
  60658. "lsr r6, r5, #16\n\t"
  60659. #endif
  60660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60661. "lsls r5, r5, #16\n\t"
  60662. #else
  60663. "lsl r5, r5, #16\n\t"
  60664. #endif
  60665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60666. "adds r2, r2, r5\n\t"
  60667. #else
  60668. "add r2, r2, r5\n\t"
  60669. #endif
  60670. #ifdef WOLFSSL_KEIL
  60671. "adcs r3, r3, r6\n\t"
  60672. #elif defined(__clang__)
  60673. "adcs r3, r6\n\t"
  60674. #else
  60675. "adc r3, r6\n\t"
  60676. #endif
  60677. #ifdef WOLFSSL_KEIL
  60678. "adcs r4, r4, %[r]\n\t"
  60679. #elif defined(__clang__)
  60680. "adcs r4, %[r]\n\t"
  60681. #else
  60682. "adc r4, %[r]\n\t"
  60683. #endif
  60684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60685. "adds r2, r2, r5\n\t"
  60686. #else
  60687. "add r2, r2, r5\n\t"
  60688. #endif
  60689. #ifdef WOLFSSL_KEIL
  60690. "adcs r3, r3, r6\n\t"
  60691. #elif defined(__clang__)
  60692. "adcs r3, r6\n\t"
  60693. #else
  60694. "adc r3, r6\n\t"
  60695. #endif
  60696. #ifdef WOLFSSL_KEIL
  60697. "adcs r4, r4, %[r]\n\t"
  60698. #elif defined(__clang__)
  60699. "adcs r4, %[r]\n\t"
  60700. #else
  60701. "adc r4, %[r]\n\t"
  60702. #endif
  60703. "str r2, [sp, #36]\n\t"
  60704. "# A[10] * A[0]\n\t"
  60705. "movs r2, #0\n\t"
  60706. "mov %[a], r9\n\t"
  60707. "ldr %[a], [%[a], #40]\n\t"
  60708. "uxth r5, %[a]\n\t"
  60709. "uxth r6, r7\n\t"
  60710. #ifdef WOLFSSL_KEIL
  60711. "muls r6, r5, r6\n\t"
  60712. #elif defined(__clang__)
  60713. "muls r6, r5\n\t"
  60714. #else
  60715. "mul r6, r5\n\t"
  60716. #endif
  60717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60718. "adds r3, r3, r6\n\t"
  60719. #else
  60720. "add r3, r3, r6\n\t"
  60721. #endif
  60722. #ifdef WOLFSSL_KEIL
  60723. "adcs r4, r4, %[r]\n\t"
  60724. #elif defined(__clang__)
  60725. "adcs r4, %[r]\n\t"
  60726. #else
  60727. "adc r4, %[r]\n\t"
  60728. #endif
  60729. #ifdef WOLFSSL_KEIL
  60730. "adcs r2, r2, %[r]\n\t"
  60731. #elif defined(__clang__)
  60732. "adcs r2, %[r]\n\t"
  60733. #else
  60734. "adc r2, %[r]\n\t"
  60735. #endif
  60736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60737. "adds r3, r3, r6\n\t"
  60738. #else
  60739. "add r3, r3, r6\n\t"
  60740. #endif
  60741. #ifdef WOLFSSL_KEIL
  60742. "adcs r4, r4, %[r]\n\t"
  60743. #elif defined(__clang__)
  60744. "adcs r4, %[r]\n\t"
  60745. #else
  60746. "adc r4, %[r]\n\t"
  60747. #endif
  60748. #ifdef WOLFSSL_KEIL
  60749. "adcs r2, r2, %[r]\n\t"
  60750. #elif defined(__clang__)
  60751. "adcs r2, %[r]\n\t"
  60752. #else
  60753. "adc r2, %[r]\n\t"
  60754. #endif
  60755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60756. "lsrs r6, r7, #16\n\t"
  60757. #else
  60758. "lsr r6, r7, #16\n\t"
  60759. #endif
  60760. #ifdef WOLFSSL_KEIL
  60761. "muls r5, r6, r5\n\t"
  60762. #elif defined(__clang__)
  60763. "muls r5, r6\n\t"
  60764. #else
  60765. "mul r5, r6\n\t"
  60766. #endif
  60767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60768. "lsrs r6, r5, #16\n\t"
  60769. #else
  60770. "lsr r6, r5, #16\n\t"
  60771. #endif
  60772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60773. "lsls r5, r5, #16\n\t"
  60774. #else
  60775. "lsl r5, r5, #16\n\t"
  60776. #endif
  60777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60778. "adds r3, r3, r5\n\t"
  60779. #else
  60780. "add r3, r3, r5\n\t"
  60781. #endif
  60782. #ifdef WOLFSSL_KEIL
  60783. "adcs r4, r4, r6\n\t"
  60784. #elif defined(__clang__)
  60785. "adcs r4, r6\n\t"
  60786. #else
  60787. "adc r4, r6\n\t"
  60788. #endif
  60789. #ifdef WOLFSSL_KEIL
  60790. "adcs r2, r2, %[r]\n\t"
  60791. #elif defined(__clang__)
  60792. "adcs r2, %[r]\n\t"
  60793. #else
  60794. "adc r2, %[r]\n\t"
  60795. #endif
  60796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60797. "adds r3, r3, r5\n\t"
  60798. #else
  60799. "add r3, r3, r5\n\t"
  60800. #endif
  60801. #ifdef WOLFSSL_KEIL
  60802. "adcs r4, r4, r6\n\t"
  60803. #elif defined(__clang__)
  60804. "adcs r4, r6\n\t"
  60805. #else
  60806. "adc r4, r6\n\t"
  60807. #endif
  60808. #ifdef WOLFSSL_KEIL
  60809. "adcs r2, r2, %[r]\n\t"
  60810. #elif defined(__clang__)
  60811. "adcs r2, %[r]\n\t"
  60812. #else
  60813. "adc r2, %[r]\n\t"
  60814. #endif
  60815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60816. "lsrs r5, %[a], #16\n\t"
  60817. #else
  60818. "lsr r5, %[a], #16\n\t"
  60819. #endif
  60820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60821. "lsrs r6, r7, #16\n\t"
  60822. #else
  60823. "lsr r6, r7, #16\n\t"
  60824. #endif
  60825. #ifdef WOLFSSL_KEIL
  60826. "muls r6, r5, r6\n\t"
  60827. #elif defined(__clang__)
  60828. "muls r6, r5\n\t"
  60829. #else
  60830. "mul r6, r5\n\t"
  60831. #endif
  60832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60833. "adds r4, r4, r6\n\t"
  60834. #else
  60835. "add r4, r4, r6\n\t"
  60836. #endif
  60837. #ifdef WOLFSSL_KEIL
  60838. "adcs r2, r2, %[r]\n\t"
  60839. #elif defined(__clang__)
  60840. "adcs r2, %[r]\n\t"
  60841. #else
  60842. "adc r2, %[r]\n\t"
  60843. #endif
  60844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60845. "adds r4, r4, r6\n\t"
  60846. #else
  60847. "add r4, r4, r6\n\t"
  60848. #endif
  60849. #ifdef WOLFSSL_KEIL
  60850. "adcs r2, r2, %[r]\n\t"
  60851. #elif defined(__clang__)
  60852. "adcs r2, %[r]\n\t"
  60853. #else
  60854. "adc r2, %[r]\n\t"
  60855. #endif
  60856. "uxth r6, r7\n\t"
  60857. #ifdef WOLFSSL_KEIL
  60858. "muls r5, r6, r5\n\t"
  60859. #elif defined(__clang__)
  60860. "muls r5, r6\n\t"
  60861. #else
  60862. "mul r5, r6\n\t"
  60863. #endif
  60864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60865. "lsrs r6, r5, #16\n\t"
  60866. #else
  60867. "lsr r6, r5, #16\n\t"
  60868. #endif
  60869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60870. "lsls r5, r5, #16\n\t"
  60871. #else
  60872. "lsl r5, r5, #16\n\t"
  60873. #endif
  60874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60875. "adds r3, r3, r5\n\t"
  60876. #else
  60877. "add r3, r3, r5\n\t"
  60878. #endif
  60879. #ifdef WOLFSSL_KEIL
  60880. "adcs r4, r4, r6\n\t"
  60881. #elif defined(__clang__)
  60882. "adcs r4, r6\n\t"
  60883. #else
  60884. "adc r4, r6\n\t"
  60885. #endif
  60886. #ifdef WOLFSSL_KEIL
  60887. "adcs r2, r2, %[r]\n\t"
  60888. #elif defined(__clang__)
  60889. "adcs r2, %[r]\n\t"
  60890. #else
  60891. "adc r2, %[r]\n\t"
  60892. #endif
  60893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60894. "adds r3, r3, r5\n\t"
  60895. #else
  60896. "add r3, r3, r5\n\t"
  60897. #endif
  60898. #ifdef WOLFSSL_KEIL
  60899. "adcs r4, r4, r6\n\t"
  60900. #elif defined(__clang__)
  60901. "adcs r4, r6\n\t"
  60902. #else
  60903. "adc r4, r6\n\t"
  60904. #endif
  60905. #ifdef WOLFSSL_KEIL
  60906. "adcs r2, r2, %[r]\n\t"
  60907. #elif defined(__clang__)
  60908. "adcs r2, %[r]\n\t"
  60909. #else
  60910. "adc r2, %[r]\n\t"
  60911. #endif
  60912. "# A[9] * A[1]\n\t"
  60913. "mov %[a], r9\n\t"
  60914. "mov r7, r11\n\t"
  60915. "ldr %[a], [%[a], #36]\n\t"
  60916. "uxth r5, %[a]\n\t"
  60917. "uxth r6, r7\n\t"
  60918. #ifdef WOLFSSL_KEIL
  60919. "muls r6, r5, r6\n\t"
  60920. #elif defined(__clang__)
  60921. "muls r6, r5\n\t"
  60922. #else
  60923. "mul r6, r5\n\t"
  60924. #endif
  60925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60926. "adds r3, r3, r6\n\t"
  60927. #else
  60928. "add r3, r3, r6\n\t"
  60929. #endif
  60930. #ifdef WOLFSSL_KEIL
  60931. "adcs r4, r4, %[r]\n\t"
  60932. #elif defined(__clang__)
  60933. "adcs r4, %[r]\n\t"
  60934. #else
  60935. "adc r4, %[r]\n\t"
  60936. #endif
  60937. #ifdef WOLFSSL_KEIL
  60938. "adcs r2, r2, %[r]\n\t"
  60939. #elif defined(__clang__)
  60940. "adcs r2, %[r]\n\t"
  60941. #else
  60942. "adc r2, %[r]\n\t"
  60943. #endif
  60944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60945. "adds r3, r3, r6\n\t"
  60946. #else
  60947. "add r3, r3, r6\n\t"
  60948. #endif
  60949. #ifdef WOLFSSL_KEIL
  60950. "adcs r4, r4, %[r]\n\t"
  60951. #elif defined(__clang__)
  60952. "adcs r4, %[r]\n\t"
  60953. #else
  60954. "adc r4, %[r]\n\t"
  60955. #endif
  60956. #ifdef WOLFSSL_KEIL
  60957. "adcs r2, r2, %[r]\n\t"
  60958. #elif defined(__clang__)
  60959. "adcs r2, %[r]\n\t"
  60960. #else
  60961. "adc r2, %[r]\n\t"
  60962. #endif
  60963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60964. "lsrs r6, r7, #16\n\t"
  60965. #else
  60966. "lsr r6, r7, #16\n\t"
  60967. #endif
  60968. #ifdef WOLFSSL_KEIL
  60969. "muls r5, r6, r5\n\t"
  60970. #elif defined(__clang__)
  60971. "muls r5, r6\n\t"
  60972. #else
  60973. "mul r5, r6\n\t"
  60974. #endif
  60975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60976. "lsrs r6, r5, #16\n\t"
  60977. #else
  60978. "lsr r6, r5, #16\n\t"
  60979. #endif
  60980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60981. "lsls r5, r5, #16\n\t"
  60982. #else
  60983. "lsl r5, r5, #16\n\t"
  60984. #endif
  60985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60986. "adds r3, r3, r5\n\t"
  60987. #else
  60988. "add r3, r3, r5\n\t"
  60989. #endif
  60990. #ifdef WOLFSSL_KEIL
  60991. "adcs r4, r4, r6\n\t"
  60992. #elif defined(__clang__)
  60993. "adcs r4, r6\n\t"
  60994. #else
  60995. "adc r4, r6\n\t"
  60996. #endif
  60997. #ifdef WOLFSSL_KEIL
  60998. "adcs r2, r2, %[r]\n\t"
  60999. #elif defined(__clang__)
  61000. "adcs r2, %[r]\n\t"
  61001. #else
  61002. "adc r2, %[r]\n\t"
  61003. #endif
  61004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61005. "adds r3, r3, r5\n\t"
  61006. #else
  61007. "add r3, r3, r5\n\t"
  61008. #endif
  61009. #ifdef WOLFSSL_KEIL
  61010. "adcs r4, r4, r6\n\t"
  61011. #elif defined(__clang__)
  61012. "adcs r4, r6\n\t"
  61013. #else
  61014. "adc r4, r6\n\t"
  61015. #endif
  61016. #ifdef WOLFSSL_KEIL
  61017. "adcs r2, r2, %[r]\n\t"
  61018. #elif defined(__clang__)
  61019. "adcs r2, %[r]\n\t"
  61020. #else
  61021. "adc r2, %[r]\n\t"
  61022. #endif
  61023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61024. "lsrs r5, %[a], #16\n\t"
  61025. #else
  61026. "lsr r5, %[a], #16\n\t"
  61027. #endif
  61028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61029. "lsrs r6, r7, #16\n\t"
  61030. #else
  61031. "lsr r6, r7, #16\n\t"
  61032. #endif
  61033. #ifdef WOLFSSL_KEIL
  61034. "muls r6, r5, r6\n\t"
  61035. #elif defined(__clang__)
  61036. "muls r6, r5\n\t"
  61037. #else
  61038. "mul r6, r5\n\t"
  61039. #endif
  61040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61041. "adds r4, r4, r6\n\t"
  61042. #else
  61043. "add r4, r4, r6\n\t"
  61044. #endif
  61045. #ifdef WOLFSSL_KEIL
  61046. "adcs r2, r2, %[r]\n\t"
  61047. #elif defined(__clang__)
  61048. "adcs r2, %[r]\n\t"
  61049. #else
  61050. "adc r2, %[r]\n\t"
  61051. #endif
  61052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61053. "adds r4, r4, r6\n\t"
  61054. #else
  61055. "add r4, r4, r6\n\t"
  61056. #endif
  61057. #ifdef WOLFSSL_KEIL
  61058. "adcs r2, r2, %[r]\n\t"
  61059. #elif defined(__clang__)
  61060. "adcs r2, %[r]\n\t"
  61061. #else
  61062. "adc r2, %[r]\n\t"
  61063. #endif
  61064. "uxth r6, r7\n\t"
  61065. #ifdef WOLFSSL_KEIL
  61066. "muls r5, r6, r5\n\t"
  61067. #elif defined(__clang__)
  61068. "muls r5, r6\n\t"
  61069. #else
  61070. "mul r5, r6\n\t"
  61071. #endif
  61072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61073. "lsrs r6, r5, #16\n\t"
  61074. #else
  61075. "lsr r6, r5, #16\n\t"
  61076. #endif
  61077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61078. "lsls r5, r5, #16\n\t"
  61079. #else
  61080. "lsl r5, r5, #16\n\t"
  61081. #endif
  61082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61083. "adds r3, r3, r5\n\t"
  61084. #else
  61085. "add r3, r3, r5\n\t"
  61086. #endif
  61087. #ifdef WOLFSSL_KEIL
  61088. "adcs r4, r4, r6\n\t"
  61089. #elif defined(__clang__)
  61090. "adcs r4, r6\n\t"
  61091. #else
  61092. "adc r4, r6\n\t"
  61093. #endif
  61094. #ifdef WOLFSSL_KEIL
  61095. "adcs r2, r2, %[r]\n\t"
  61096. #elif defined(__clang__)
  61097. "adcs r2, %[r]\n\t"
  61098. #else
  61099. "adc r2, %[r]\n\t"
  61100. #endif
  61101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61102. "adds r3, r3, r5\n\t"
  61103. #else
  61104. "add r3, r3, r5\n\t"
  61105. #endif
  61106. #ifdef WOLFSSL_KEIL
  61107. "adcs r4, r4, r6\n\t"
  61108. #elif defined(__clang__)
  61109. "adcs r4, r6\n\t"
  61110. #else
  61111. "adc r4, r6\n\t"
  61112. #endif
  61113. #ifdef WOLFSSL_KEIL
  61114. "adcs r2, r2, %[r]\n\t"
  61115. #elif defined(__clang__)
  61116. "adcs r2, %[r]\n\t"
  61117. #else
  61118. "adc r2, %[r]\n\t"
  61119. #endif
  61120. "# A[8] * A[2]\n\t"
  61121. "mov %[a], r9\n\t"
  61122. "mov r7, r12\n\t"
  61123. "ldr %[a], [%[a], #32]\n\t"
  61124. "uxth r5, %[a]\n\t"
  61125. "uxth r6, r7\n\t"
  61126. #ifdef WOLFSSL_KEIL
  61127. "muls r6, r5, r6\n\t"
  61128. #elif defined(__clang__)
  61129. "muls r6, r5\n\t"
  61130. #else
  61131. "mul r6, r5\n\t"
  61132. #endif
  61133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61134. "adds r3, r3, r6\n\t"
  61135. #else
  61136. "add r3, r3, r6\n\t"
  61137. #endif
  61138. #ifdef WOLFSSL_KEIL
  61139. "adcs r4, r4, %[r]\n\t"
  61140. #elif defined(__clang__)
  61141. "adcs r4, %[r]\n\t"
  61142. #else
  61143. "adc r4, %[r]\n\t"
  61144. #endif
  61145. #ifdef WOLFSSL_KEIL
  61146. "adcs r2, r2, %[r]\n\t"
  61147. #elif defined(__clang__)
  61148. "adcs r2, %[r]\n\t"
  61149. #else
  61150. "adc r2, %[r]\n\t"
  61151. #endif
  61152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61153. "adds r3, r3, r6\n\t"
  61154. #else
  61155. "add r3, r3, r6\n\t"
  61156. #endif
  61157. #ifdef WOLFSSL_KEIL
  61158. "adcs r4, r4, %[r]\n\t"
  61159. #elif defined(__clang__)
  61160. "adcs r4, %[r]\n\t"
  61161. #else
  61162. "adc r4, %[r]\n\t"
  61163. #endif
  61164. #ifdef WOLFSSL_KEIL
  61165. "adcs r2, r2, %[r]\n\t"
  61166. #elif defined(__clang__)
  61167. "adcs r2, %[r]\n\t"
  61168. #else
  61169. "adc r2, %[r]\n\t"
  61170. #endif
  61171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61172. "lsrs r6, r7, #16\n\t"
  61173. #else
  61174. "lsr r6, r7, #16\n\t"
  61175. #endif
  61176. #ifdef WOLFSSL_KEIL
  61177. "muls r5, r6, r5\n\t"
  61178. #elif defined(__clang__)
  61179. "muls r5, r6\n\t"
  61180. #else
  61181. "mul r5, r6\n\t"
  61182. #endif
  61183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61184. "lsrs r6, r5, #16\n\t"
  61185. #else
  61186. "lsr r6, r5, #16\n\t"
  61187. #endif
  61188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61189. "lsls r5, r5, #16\n\t"
  61190. #else
  61191. "lsl r5, r5, #16\n\t"
  61192. #endif
  61193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61194. "adds r3, r3, r5\n\t"
  61195. #else
  61196. "add r3, r3, r5\n\t"
  61197. #endif
  61198. #ifdef WOLFSSL_KEIL
  61199. "adcs r4, r4, r6\n\t"
  61200. #elif defined(__clang__)
  61201. "adcs r4, r6\n\t"
  61202. #else
  61203. "adc r4, r6\n\t"
  61204. #endif
  61205. #ifdef WOLFSSL_KEIL
  61206. "adcs r2, r2, %[r]\n\t"
  61207. #elif defined(__clang__)
  61208. "adcs r2, %[r]\n\t"
  61209. #else
  61210. "adc r2, %[r]\n\t"
  61211. #endif
  61212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61213. "adds r3, r3, r5\n\t"
  61214. #else
  61215. "add r3, r3, r5\n\t"
  61216. #endif
  61217. #ifdef WOLFSSL_KEIL
  61218. "adcs r4, r4, r6\n\t"
  61219. #elif defined(__clang__)
  61220. "adcs r4, r6\n\t"
  61221. #else
  61222. "adc r4, r6\n\t"
  61223. #endif
  61224. #ifdef WOLFSSL_KEIL
  61225. "adcs r2, r2, %[r]\n\t"
  61226. #elif defined(__clang__)
  61227. "adcs r2, %[r]\n\t"
  61228. #else
  61229. "adc r2, %[r]\n\t"
  61230. #endif
  61231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61232. "lsrs r5, %[a], #16\n\t"
  61233. #else
  61234. "lsr r5, %[a], #16\n\t"
  61235. #endif
  61236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61237. "lsrs r6, r7, #16\n\t"
  61238. #else
  61239. "lsr r6, r7, #16\n\t"
  61240. #endif
  61241. #ifdef WOLFSSL_KEIL
  61242. "muls r6, r5, r6\n\t"
  61243. #elif defined(__clang__)
  61244. "muls r6, r5\n\t"
  61245. #else
  61246. "mul r6, r5\n\t"
  61247. #endif
  61248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61249. "adds r4, r4, r6\n\t"
  61250. #else
  61251. "add r4, r4, r6\n\t"
  61252. #endif
  61253. #ifdef WOLFSSL_KEIL
  61254. "adcs r2, r2, %[r]\n\t"
  61255. #elif defined(__clang__)
  61256. "adcs r2, %[r]\n\t"
  61257. #else
  61258. "adc r2, %[r]\n\t"
  61259. #endif
  61260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61261. "adds r4, r4, r6\n\t"
  61262. #else
  61263. "add r4, r4, r6\n\t"
  61264. #endif
  61265. #ifdef WOLFSSL_KEIL
  61266. "adcs r2, r2, %[r]\n\t"
  61267. #elif defined(__clang__)
  61268. "adcs r2, %[r]\n\t"
  61269. #else
  61270. "adc r2, %[r]\n\t"
  61271. #endif
  61272. "uxth r6, r7\n\t"
  61273. #ifdef WOLFSSL_KEIL
  61274. "muls r5, r6, r5\n\t"
  61275. #elif defined(__clang__)
  61276. "muls r5, r6\n\t"
  61277. #else
  61278. "mul r5, r6\n\t"
  61279. #endif
  61280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61281. "lsrs r6, r5, #16\n\t"
  61282. #else
  61283. "lsr r6, r5, #16\n\t"
  61284. #endif
  61285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61286. "lsls r5, r5, #16\n\t"
  61287. #else
  61288. "lsl r5, r5, #16\n\t"
  61289. #endif
  61290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61291. "adds r3, r3, r5\n\t"
  61292. #else
  61293. "add r3, r3, r5\n\t"
  61294. #endif
  61295. #ifdef WOLFSSL_KEIL
  61296. "adcs r4, r4, r6\n\t"
  61297. #elif defined(__clang__)
  61298. "adcs r4, r6\n\t"
  61299. #else
  61300. "adc r4, r6\n\t"
  61301. #endif
  61302. #ifdef WOLFSSL_KEIL
  61303. "adcs r2, r2, %[r]\n\t"
  61304. #elif defined(__clang__)
  61305. "adcs r2, %[r]\n\t"
  61306. #else
  61307. "adc r2, %[r]\n\t"
  61308. #endif
  61309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61310. "adds r3, r3, r5\n\t"
  61311. #else
  61312. "add r3, r3, r5\n\t"
  61313. #endif
  61314. #ifdef WOLFSSL_KEIL
  61315. "adcs r4, r4, r6\n\t"
  61316. #elif defined(__clang__)
  61317. "adcs r4, r6\n\t"
  61318. #else
  61319. "adc r4, r6\n\t"
  61320. #endif
  61321. #ifdef WOLFSSL_KEIL
  61322. "adcs r2, r2, %[r]\n\t"
  61323. #elif defined(__clang__)
  61324. "adcs r2, %[r]\n\t"
  61325. #else
  61326. "adc r2, %[r]\n\t"
  61327. #endif
  61328. "# A[7] * A[3]\n\t"
  61329. "mov %[a], r9\n\t"
  61330. "mov r7, lr\n\t"
  61331. "ldr %[a], [%[a], #28]\n\t"
  61332. "uxth r5, %[a]\n\t"
  61333. "uxth r6, r7\n\t"
  61334. #ifdef WOLFSSL_KEIL
  61335. "muls r6, r5, r6\n\t"
  61336. #elif defined(__clang__)
  61337. "muls r6, r5\n\t"
  61338. #else
  61339. "mul r6, r5\n\t"
  61340. #endif
  61341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61342. "adds r3, r3, r6\n\t"
  61343. #else
  61344. "add r3, r3, r6\n\t"
  61345. #endif
  61346. #ifdef WOLFSSL_KEIL
  61347. "adcs r4, r4, %[r]\n\t"
  61348. #elif defined(__clang__)
  61349. "adcs r4, %[r]\n\t"
  61350. #else
  61351. "adc r4, %[r]\n\t"
  61352. #endif
  61353. #ifdef WOLFSSL_KEIL
  61354. "adcs r2, r2, %[r]\n\t"
  61355. #elif defined(__clang__)
  61356. "adcs r2, %[r]\n\t"
  61357. #else
  61358. "adc r2, %[r]\n\t"
  61359. #endif
  61360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61361. "adds r3, r3, r6\n\t"
  61362. #else
  61363. "add r3, r3, r6\n\t"
  61364. #endif
  61365. #ifdef WOLFSSL_KEIL
  61366. "adcs r4, r4, %[r]\n\t"
  61367. #elif defined(__clang__)
  61368. "adcs r4, %[r]\n\t"
  61369. #else
  61370. "adc r4, %[r]\n\t"
  61371. #endif
  61372. #ifdef WOLFSSL_KEIL
  61373. "adcs r2, r2, %[r]\n\t"
  61374. #elif defined(__clang__)
  61375. "adcs r2, %[r]\n\t"
  61376. #else
  61377. "adc r2, %[r]\n\t"
  61378. #endif
  61379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61380. "lsrs r6, r7, #16\n\t"
  61381. #else
  61382. "lsr r6, r7, #16\n\t"
  61383. #endif
  61384. #ifdef WOLFSSL_KEIL
  61385. "muls r5, r6, r5\n\t"
  61386. #elif defined(__clang__)
  61387. "muls r5, r6\n\t"
  61388. #else
  61389. "mul r5, r6\n\t"
  61390. #endif
  61391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61392. "lsrs r6, r5, #16\n\t"
  61393. #else
  61394. "lsr r6, r5, #16\n\t"
  61395. #endif
  61396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61397. "lsls r5, r5, #16\n\t"
  61398. #else
  61399. "lsl r5, r5, #16\n\t"
  61400. #endif
  61401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61402. "adds r3, r3, r5\n\t"
  61403. #else
  61404. "add r3, r3, r5\n\t"
  61405. #endif
  61406. #ifdef WOLFSSL_KEIL
  61407. "adcs r4, r4, r6\n\t"
  61408. #elif defined(__clang__)
  61409. "adcs r4, r6\n\t"
  61410. #else
  61411. "adc r4, r6\n\t"
  61412. #endif
  61413. #ifdef WOLFSSL_KEIL
  61414. "adcs r2, r2, %[r]\n\t"
  61415. #elif defined(__clang__)
  61416. "adcs r2, %[r]\n\t"
  61417. #else
  61418. "adc r2, %[r]\n\t"
  61419. #endif
  61420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61421. "adds r3, r3, r5\n\t"
  61422. #else
  61423. "add r3, r3, r5\n\t"
  61424. #endif
  61425. #ifdef WOLFSSL_KEIL
  61426. "adcs r4, r4, r6\n\t"
  61427. #elif defined(__clang__)
  61428. "adcs r4, r6\n\t"
  61429. #else
  61430. "adc r4, r6\n\t"
  61431. #endif
  61432. #ifdef WOLFSSL_KEIL
  61433. "adcs r2, r2, %[r]\n\t"
  61434. #elif defined(__clang__)
  61435. "adcs r2, %[r]\n\t"
  61436. #else
  61437. "adc r2, %[r]\n\t"
  61438. #endif
  61439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61440. "lsrs r5, %[a], #16\n\t"
  61441. #else
  61442. "lsr r5, %[a], #16\n\t"
  61443. #endif
  61444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61445. "lsrs r6, r7, #16\n\t"
  61446. #else
  61447. "lsr r6, r7, #16\n\t"
  61448. #endif
  61449. #ifdef WOLFSSL_KEIL
  61450. "muls r6, r5, r6\n\t"
  61451. #elif defined(__clang__)
  61452. "muls r6, r5\n\t"
  61453. #else
  61454. "mul r6, r5\n\t"
  61455. #endif
  61456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61457. "adds r4, r4, r6\n\t"
  61458. #else
  61459. "add r4, r4, r6\n\t"
  61460. #endif
  61461. #ifdef WOLFSSL_KEIL
  61462. "adcs r2, r2, %[r]\n\t"
  61463. #elif defined(__clang__)
  61464. "adcs r2, %[r]\n\t"
  61465. #else
  61466. "adc r2, %[r]\n\t"
  61467. #endif
  61468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61469. "adds r4, r4, r6\n\t"
  61470. #else
  61471. "add r4, r4, r6\n\t"
  61472. #endif
  61473. #ifdef WOLFSSL_KEIL
  61474. "adcs r2, r2, %[r]\n\t"
  61475. #elif defined(__clang__)
  61476. "adcs r2, %[r]\n\t"
  61477. #else
  61478. "adc r2, %[r]\n\t"
  61479. #endif
  61480. "uxth r6, r7\n\t"
  61481. #ifdef WOLFSSL_KEIL
  61482. "muls r5, r6, r5\n\t"
  61483. #elif defined(__clang__)
  61484. "muls r5, r6\n\t"
  61485. #else
  61486. "mul r5, r6\n\t"
  61487. #endif
  61488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61489. "lsrs r6, r5, #16\n\t"
  61490. #else
  61491. "lsr r6, r5, #16\n\t"
  61492. #endif
  61493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61494. "lsls r5, r5, #16\n\t"
  61495. #else
  61496. "lsl r5, r5, #16\n\t"
  61497. #endif
  61498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61499. "adds r3, r3, r5\n\t"
  61500. #else
  61501. "add r3, r3, r5\n\t"
  61502. #endif
  61503. #ifdef WOLFSSL_KEIL
  61504. "adcs r4, r4, r6\n\t"
  61505. #elif defined(__clang__)
  61506. "adcs r4, r6\n\t"
  61507. #else
  61508. "adc r4, r6\n\t"
  61509. #endif
  61510. #ifdef WOLFSSL_KEIL
  61511. "adcs r2, r2, %[r]\n\t"
  61512. #elif defined(__clang__)
  61513. "adcs r2, %[r]\n\t"
  61514. #else
  61515. "adc r2, %[r]\n\t"
  61516. #endif
  61517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61518. "adds r3, r3, r5\n\t"
  61519. #else
  61520. "add r3, r3, r5\n\t"
  61521. #endif
  61522. #ifdef WOLFSSL_KEIL
  61523. "adcs r4, r4, r6\n\t"
  61524. #elif defined(__clang__)
  61525. "adcs r4, r6\n\t"
  61526. #else
  61527. "adc r4, r6\n\t"
  61528. #endif
  61529. #ifdef WOLFSSL_KEIL
  61530. "adcs r2, r2, %[r]\n\t"
  61531. #elif defined(__clang__)
  61532. "adcs r2, %[r]\n\t"
  61533. #else
  61534. "adc r2, %[r]\n\t"
  61535. #endif
  61536. "# A[6] * A[4]\n\t"
  61537. "mov %[a], r9\n\t"
  61538. "ldr r7, [%[a], #16]\n\t"
  61539. "ldr %[a], [%[a], #24]\n\t"
  61540. "uxth r5, %[a]\n\t"
  61541. "uxth r6, r7\n\t"
  61542. #ifdef WOLFSSL_KEIL
  61543. "muls r6, r5, r6\n\t"
  61544. #elif defined(__clang__)
  61545. "muls r6, r5\n\t"
  61546. #else
  61547. "mul r6, r5\n\t"
  61548. #endif
  61549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61550. "adds r3, r3, r6\n\t"
  61551. #else
  61552. "add r3, r3, r6\n\t"
  61553. #endif
  61554. #ifdef WOLFSSL_KEIL
  61555. "adcs r4, r4, %[r]\n\t"
  61556. #elif defined(__clang__)
  61557. "adcs r4, %[r]\n\t"
  61558. #else
  61559. "adc r4, %[r]\n\t"
  61560. #endif
  61561. #ifdef WOLFSSL_KEIL
  61562. "adcs r2, r2, %[r]\n\t"
  61563. #elif defined(__clang__)
  61564. "adcs r2, %[r]\n\t"
  61565. #else
  61566. "adc r2, %[r]\n\t"
  61567. #endif
  61568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61569. "adds r3, r3, r6\n\t"
  61570. #else
  61571. "add r3, r3, r6\n\t"
  61572. #endif
  61573. #ifdef WOLFSSL_KEIL
  61574. "adcs r4, r4, %[r]\n\t"
  61575. #elif defined(__clang__)
  61576. "adcs r4, %[r]\n\t"
  61577. #else
  61578. "adc r4, %[r]\n\t"
  61579. #endif
  61580. #ifdef WOLFSSL_KEIL
  61581. "adcs r2, r2, %[r]\n\t"
  61582. #elif defined(__clang__)
  61583. "adcs r2, %[r]\n\t"
  61584. #else
  61585. "adc r2, %[r]\n\t"
  61586. #endif
  61587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61588. "lsrs r6, r7, #16\n\t"
  61589. #else
  61590. "lsr r6, r7, #16\n\t"
  61591. #endif
  61592. #ifdef WOLFSSL_KEIL
  61593. "muls r5, r6, r5\n\t"
  61594. #elif defined(__clang__)
  61595. "muls r5, r6\n\t"
  61596. #else
  61597. "mul r5, r6\n\t"
  61598. #endif
  61599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61600. "lsrs r6, r5, #16\n\t"
  61601. #else
  61602. "lsr r6, r5, #16\n\t"
  61603. #endif
  61604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61605. "lsls r5, r5, #16\n\t"
  61606. #else
  61607. "lsl r5, r5, #16\n\t"
  61608. #endif
  61609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61610. "adds r3, r3, r5\n\t"
  61611. #else
  61612. "add r3, r3, r5\n\t"
  61613. #endif
  61614. #ifdef WOLFSSL_KEIL
  61615. "adcs r4, r4, r6\n\t"
  61616. #elif defined(__clang__)
  61617. "adcs r4, r6\n\t"
  61618. #else
  61619. "adc r4, r6\n\t"
  61620. #endif
  61621. #ifdef WOLFSSL_KEIL
  61622. "adcs r2, r2, %[r]\n\t"
  61623. #elif defined(__clang__)
  61624. "adcs r2, %[r]\n\t"
  61625. #else
  61626. "adc r2, %[r]\n\t"
  61627. #endif
  61628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61629. "adds r3, r3, r5\n\t"
  61630. #else
  61631. "add r3, r3, r5\n\t"
  61632. #endif
  61633. #ifdef WOLFSSL_KEIL
  61634. "adcs r4, r4, r6\n\t"
  61635. #elif defined(__clang__)
  61636. "adcs r4, r6\n\t"
  61637. #else
  61638. "adc r4, r6\n\t"
  61639. #endif
  61640. #ifdef WOLFSSL_KEIL
  61641. "adcs r2, r2, %[r]\n\t"
  61642. #elif defined(__clang__)
  61643. "adcs r2, %[r]\n\t"
  61644. #else
  61645. "adc r2, %[r]\n\t"
  61646. #endif
  61647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61648. "lsrs r5, %[a], #16\n\t"
  61649. #else
  61650. "lsr r5, %[a], #16\n\t"
  61651. #endif
  61652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61653. "lsrs r6, r7, #16\n\t"
  61654. #else
  61655. "lsr r6, r7, #16\n\t"
  61656. #endif
  61657. #ifdef WOLFSSL_KEIL
  61658. "muls r6, r5, r6\n\t"
  61659. #elif defined(__clang__)
  61660. "muls r6, r5\n\t"
  61661. #else
  61662. "mul r6, r5\n\t"
  61663. #endif
  61664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61665. "adds r4, r4, r6\n\t"
  61666. #else
  61667. "add r4, r4, r6\n\t"
  61668. #endif
  61669. #ifdef WOLFSSL_KEIL
  61670. "adcs r2, r2, %[r]\n\t"
  61671. #elif defined(__clang__)
  61672. "adcs r2, %[r]\n\t"
  61673. #else
  61674. "adc r2, %[r]\n\t"
  61675. #endif
  61676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61677. "adds r4, r4, r6\n\t"
  61678. #else
  61679. "add r4, r4, r6\n\t"
  61680. #endif
  61681. #ifdef WOLFSSL_KEIL
  61682. "adcs r2, r2, %[r]\n\t"
  61683. #elif defined(__clang__)
  61684. "adcs r2, %[r]\n\t"
  61685. #else
  61686. "adc r2, %[r]\n\t"
  61687. #endif
  61688. "uxth r6, r7\n\t"
  61689. #ifdef WOLFSSL_KEIL
  61690. "muls r5, r6, r5\n\t"
  61691. #elif defined(__clang__)
  61692. "muls r5, r6\n\t"
  61693. #else
  61694. "mul r5, r6\n\t"
  61695. #endif
  61696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61697. "lsrs r6, r5, #16\n\t"
  61698. #else
  61699. "lsr r6, r5, #16\n\t"
  61700. #endif
  61701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61702. "lsls r5, r5, #16\n\t"
  61703. #else
  61704. "lsl r5, r5, #16\n\t"
  61705. #endif
  61706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61707. "adds r3, r3, r5\n\t"
  61708. #else
  61709. "add r3, r3, r5\n\t"
  61710. #endif
  61711. #ifdef WOLFSSL_KEIL
  61712. "adcs r4, r4, r6\n\t"
  61713. #elif defined(__clang__)
  61714. "adcs r4, r6\n\t"
  61715. #else
  61716. "adc r4, r6\n\t"
  61717. #endif
  61718. #ifdef WOLFSSL_KEIL
  61719. "adcs r2, r2, %[r]\n\t"
  61720. #elif defined(__clang__)
  61721. "adcs r2, %[r]\n\t"
  61722. #else
  61723. "adc r2, %[r]\n\t"
  61724. #endif
  61725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61726. "adds r3, r3, r5\n\t"
  61727. #else
  61728. "add r3, r3, r5\n\t"
  61729. #endif
  61730. #ifdef WOLFSSL_KEIL
  61731. "adcs r4, r4, r6\n\t"
  61732. #elif defined(__clang__)
  61733. "adcs r4, r6\n\t"
  61734. #else
  61735. "adc r4, r6\n\t"
  61736. #endif
  61737. #ifdef WOLFSSL_KEIL
  61738. "adcs r2, r2, %[r]\n\t"
  61739. #elif defined(__clang__)
  61740. "adcs r2, %[r]\n\t"
  61741. #else
  61742. "adc r2, %[r]\n\t"
  61743. #endif
  61744. "# A[5] * A[5]\n\t"
  61745. "mov %[a], r9\n\t"
  61746. "ldr r7, [%[a], #20]\n\t"
  61747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61748. "lsrs r6, r7, #16\n\t"
  61749. #else
  61750. "lsr r6, r7, #16\n\t"
  61751. #endif
  61752. "uxth r5, r7\n\t"
  61753. #ifdef WOLFSSL_KEIL
  61754. "muls r5, r5, r5\n\t"
  61755. #elif defined(__clang__)
  61756. "muls r5, r5\n\t"
  61757. #else
  61758. "mul r5, r5\n\t"
  61759. #endif
  61760. #ifdef WOLFSSL_KEIL
  61761. "muls r6, r6, r6\n\t"
  61762. #elif defined(__clang__)
  61763. "muls r6, r6\n\t"
  61764. #else
  61765. "mul r6, r6\n\t"
  61766. #endif
  61767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61768. "adds r3, r3, r5\n\t"
  61769. #else
  61770. "add r3, r3, r5\n\t"
  61771. #endif
  61772. #ifdef WOLFSSL_KEIL
  61773. "adcs r4, r4, r6\n\t"
  61774. #elif defined(__clang__)
  61775. "adcs r4, r6\n\t"
  61776. #else
  61777. "adc r4, r6\n\t"
  61778. #endif
  61779. #ifdef WOLFSSL_KEIL
  61780. "adcs r2, r2, %[r]\n\t"
  61781. #elif defined(__clang__)
  61782. "adcs r2, %[r]\n\t"
  61783. #else
  61784. "adc r2, %[r]\n\t"
  61785. #endif
  61786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61787. "lsrs r6, r7, #16\n\t"
  61788. #else
  61789. "lsr r6, r7, #16\n\t"
  61790. #endif
  61791. "uxth r5, r7\n\t"
  61792. #ifdef WOLFSSL_KEIL
  61793. "muls r5, r6, r5\n\t"
  61794. #elif defined(__clang__)
  61795. "muls r5, r6\n\t"
  61796. #else
  61797. "mul r5, r6\n\t"
  61798. #endif
  61799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61800. "lsrs r6, r5, #15\n\t"
  61801. #else
  61802. "lsr r6, r5, #15\n\t"
  61803. #endif
  61804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61805. "lsls r5, r5, #17\n\t"
  61806. #else
  61807. "lsl r5, r5, #17\n\t"
  61808. #endif
  61809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61810. "adds r3, r3, r5\n\t"
  61811. #else
  61812. "add r3, r3, r5\n\t"
  61813. #endif
  61814. #ifdef WOLFSSL_KEIL
  61815. "adcs r4, r4, r6\n\t"
  61816. #elif defined(__clang__)
  61817. "adcs r4, r6\n\t"
  61818. #else
  61819. "adc r4, r6\n\t"
  61820. #endif
  61821. #ifdef WOLFSSL_KEIL
  61822. "adcs r2, r2, %[r]\n\t"
  61823. #elif defined(__clang__)
  61824. "adcs r2, %[r]\n\t"
  61825. #else
  61826. "adc r2, %[r]\n\t"
  61827. #endif
  61828. "str r3, [sp, #40]\n\t"
  61829. "# A[6] * A[5]\n\t"
  61830. "movs r3, #0\n\t"
  61831. "ldr %[a], [%[a], #24]\n\t"
  61832. "uxth r5, %[a]\n\t"
  61833. "uxth r6, r7\n\t"
  61834. #ifdef WOLFSSL_KEIL
  61835. "muls r6, r5, r6\n\t"
  61836. #elif defined(__clang__)
  61837. "muls r6, r5\n\t"
  61838. #else
  61839. "mul r6, r5\n\t"
  61840. #endif
  61841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61842. "adds r4, r4, r6\n\t"
  61843. #else
  61844. "add r4, r4, r6\n\t"
  61845. #endif
  61846. #ifdef WOLFSSL_KEIL
  61847. "adcs r2, r2, %[r]\n\t"
  61848. #elif defined(__clang__)
  61849. "adcs r2, %[r]\n\t"
  61850. #else
  61851. "adc r2, %[r]\n\t"
  61852. #endif
  61853. #ifdef WOLFSSL_KEIL
  61854. "adcs r3, r3, %[r]\n\t"
  61855. #elif defined(__clang__)
  61856. "adcs r3, %[r]\n\t"
  61857. #else
  61858. "adc r3, %[r]\n\t"
  61859. #endif
  61860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61861. "adds r4, r4, r6\n\t"
  61862. #else
  61863. "add r4, r4, r6\n\t"
  61864. #endif
  61865. #ifdef WOLFSSL_KEIL
  61866. "adcs r2, r2, %[r]\n\t"
  61867. #elif defined(__clang__)
  61868. "adcs r2, %[r]\n\t"
  61869. #else
  61870. "adc r2, %[r]\n\t"
  61871. #endif
  61872. #ifdef WOLFSSL_KEIL
  61873. "adcs r3, r3, %[r]\n\t"
  61874. #elif defined(__clang__)
  61875. "adcs r3, %[r]\n\t"
  61876. #else
  61877. "adc r3, %[r]\n\t"
  61878. #endif
  61879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61880. "lsrs r6, r7, #16\n\t"
  61881. #else
  61882. "lsr r6, r7, #16\n\t"
  61883. #endif
  61884. #ifdef WOLFSSL_KEIL
  61885. "muls r5, r6, r5\n\t"
  61886. #elif defined(__clang__)
  61887. "muls r5, r6\n\t"
  61888. #else
  61889. "mul r5, r6\n\t"
  61890. #endif
  61891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61892. "lsrs r6, r5, #16\n\t"
  61893. #else
  61894. "lsr r6, r5, #16\n\t"
  61895. #endif
  61896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61897. "lsls r5, r5, #16\n\t"
  61898. #else
  61899. "lsl r5, r5, #16\n\t"
  61900. #endif
  61901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61902. "adds r4, r4, r5\n\t"
  61903. #else
  61904. "add r4, r4, r5\n\t"
  61905. #endif
  61906. #ifdef WOLFSSL_KEIL
  61907. "adcs r2, r2, r6\n\t"
  61908. #elif defined(__clang__)
  61909. "adcs r2, r6\n\t"
  61910. #else
  61911. "adc r2, r6\n\t"
  61912. #endif
  61913. #ifdef WOLFSSL_KEIL
  61914. "adcs r3, r3, %[r]\n\t"
  61915. #elif defined(__clang__)
  61916. "adcs r3, %[r]\n\t"
  61917. #else
  61918. "adc r3, %[r]\n\t"
  61919. #endif
  61920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61921. "adds r4, r4, r5\n\t"
  61922. #else
  61923. "add r4, r4, r5\n\t"
  61924. #endif
  61925. #ifdef WOLFSSL_KEIL
  61926. "adcs r2, r2, r6\n\t"
  61927. #elif defined(__clang__)
  61928. "adcs r2, r6\n\t"
  61929. #else
  61930. "adc r2, r6\n\t"
  61931. #endif
  61932. #ifdef WOLFSSL_KEIL
  61933. "adcs r3, r3, %[r]\n\t"
  61934. #elif defined(__clang__)
  61935. "adcs r3, %[r]\n\t"
  61936. #else
  61937. "adc r3, %[r]\n\t"
  61938. #endif
  61939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61940. "lsrs r5, %[a], #16\n\t"
  61941. #else
  61942. "lsr r5, %[a], #16\n\t"
  61943. #endif
  61944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61945. "lsrs r6, r7, #16\n\t"
  61946. #else
  61947. "lsr r6, r7, #16\n\t"
  61948. #endif
  61949. #ifdef WOLFSSL_KEIL
  61950. "muls r6, r5, r6\n\t"
  61951. #elif defined(__clang__)
  61952. "muls r6, r5\n\t"
  61953. #else
  61954. "mul r6, r5\n\t"
  61955. #endif
  61956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61957. "adds r2, r2, r6\n\t"
  61958. #else
  61959. "add r2, r2, r6\n\t"
  61960. #endif
  61961. #ifdef WOLFSSL_KEIL
  61962. "adcs r3, r3, %[r]\n\t"
  61963. #elif defined(__clang__)
  61964. "adcs r3, %[r]\n\t"
  61965. #else
  61966. "adc r3, %[r]\n\t"
  61967. #endif
  61968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61969. "adds r2, r2, r6\n\t"
  61970. #else
  61971. "add r2, r2, r6\n\t"
  61972. #endif
  61973. #ifdef WOLFSSL_KEIL
  61974. "adcs r3, r3, %[r]\n\t"
  61975. #elif defined(__clang__)
  61976. "adcs r3, %[r]\n\t"
  61977. #else
  61978. "adc r3, %[r]\n\t"
  61979. #endif
  61980. "uxth r6, r7\n\t"
  61981. #ifdef WOLFSSL_KEIL
  61982. "muls r5, r6, r5\n\t"
  61983. #elif defined(__clang__)
  61984. "muls r5, r6\n\t"
  61985. #else
  61986. "mul r5, r6\n\t"
  61987. #endif
  61988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61989. "lsrs r6, r5, #16\n\t"
  61990. #else
  61991. "lsr r6, r5, #16\n\t"
  61992. #endif
  61993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61994. "lsls r5, r5, #16\n\t"
  61995. #else
  61996. "lsl r5, r5, #16\n\t"
  61997. #endif
  61998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61999. "adds r4, r4, r5\n\t"
  62000. #else
  62001. "add r4, r4, r5\n\t"
  62002. #endif
  62003. #ifdef WOLFSSL_KEIL
  62004. "adcs r2, r2, r6\n\t"
  62005. #elif defined(__clang__)
  62006. "adcs r2, r6\n\t"
  62007. #else
  62008. "adc r2, r6\n\t"
  62009. #endif
  62010. #ifdef WOLFSSL_KEIL
  62011. "adcs r3, r3, %[r]\n\t"
  62012. #elif defined(__clang__)
  62013. "adcs r3, %[r]\n\t"
  62014. #else
  62015. "adc r3, %[r]\n\t"
  62016. #endif
  62017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62018. "adds r4, r4, r5\n\t"
  62019. #else
  62020. "add r4, r4, r5\n\t"
  62021. #endif
  62022. #ifdef WOLFSSL_KEIL
  62023. "adcs r2, r2, r6\n\t"
  62024. #elif defined(__clang__)
  62025. "adcs r2, r6\n\t"
  62026. #else
  62027. "adc r2, r6\n\t"
  62028. #endif
  62029. #ifdef WOLFSSL_KEIL
  62030. "adcs r3, r3, %[r]\n\t"
  62031. #elif defined(__clang__)
  62032. "adcs r3, %[r]\n\t"
  62033. #else
  62034. "adc r3, %[r]\n\t"
  62035. #endif
  62036. "# A[7] * A[4]\n\t"
  62037. "mov %[a], r9\n\t"
  62038. "ldr r7, [%[a], #16]\n\t"
  62039. "ldr %[a], [%[a], #28]\n\t"
  62040. "uxth r5, %[a]\n\t"
  62041. "uxth r6, r7\n\t"
  62042. #ifdef WOLFSSL_KEIL
  62043. "muls r6, r5, r6\n\t"
  62044. #elif defined(__clang__)
  62045. "muls r6, r5\n\t"
  62046. #else
  62047. "mul r6, r5\n\t"
  62048. #endif
  62049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62050. "adds r4, r4, r6\n\t"
  62051. #else
  62052. "add r4, r4, r6\n\t"
  62053. #endif
  62054. #ifdef WOLFSSL_KEIL
  62055. "adcs r2, r2, %[r]\n\t"
  62056. #elif defined(__clang__)
  62057. "adcs r2, %[r]\n\t"
  62058. #else
  62059. "adc r2, %[r]\n\t"
  62060. #endif
  62061. #ifdef WOLFSSL_KEIL
  62062. "adcs r3, r3, %[r]\n\t"
  62063. #elif defined(__clang__)
  62064. "adcs r3, %[r]\n\t"
  62065. #else
  62066. "adc r3, %[r]\n\t"
  62067. #endif
  62068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62069. "adds r4, r4, r6\n\t"
  62070. #else
  62071. "add r4, r4, r6\n\t"
  62072. #endif
  62073. #ifdef WOLFSSL_KEIL
  62074. "adcs r2, r2, %[r]\n\t"
  62075. #elif defined(__clang__)
  62076. "adcs r2, %[r]\n\t"
  62077. #else
  62078. "adc r2, %[r]\n\t"
  62079. #endif
  62080. #ifdef WOLFSSL_KEIL
  62081. "adcs r3, r3, %[r]\n\t"
  62082. #elif defined(__clang__)
  62083. "adcs r3, %[r]\n\t"
  62084. #else
  62085. "adc r3, %[r]\n\t"
  62086. #endif
  62087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62088. "lsrs r6, r7, #16\n\t"
  62089. #else
  62090. "lsr r6, r7, #16\n\t"
  62091. #endif
  62092. #ifdef WOLFSSL_KEIL
  62093. "muls r5, r6, r5\n\t"
  62094. #elif defined(__clang__)
  62095. "muls r5, r6\n\t"
  62096. #else
  62097. "mul r5, r6\n\t"
  62098. #endif
  62099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62100. "lsrs r6, r5, #16\n\t"
  62101. #else
  62102. "lsr r6, r5, #16\n\t"
  62103. #endif
  62104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62105. "lsls r5, r5, #16\n\t"
  62106. #else
  62107. "lsl r5, r5, #16\n\t"
  62108. #endif
  62109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62110. "adds r4, r4, r5\n\t"
  62111. #else
  62112. "add r4, r4, r5\n\t"
  62113. #endif
  62114. #ifdef WOLFSSL_KEIL
  62115. "adcs r2, r2, r6\n\t"
  62116. #elif defined(__clang__)
  62117. "adcs r2, r6\n\t"
  62118. #else
  62119. "adc r2, r6\n\t"
  62120. #endif
  62121. #ifdef WOLFSSL_KEIL
  62122. "adcs r3, r3, %[r]\n\t"
  62123. #elif defined(__clang__)
  62124. "adcs r3, %[r]\n\t"
  62125. #else
  62126. "adc r3, %[r]\n\t"
  62127. #endif
  62128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62129. "adds r4, r4, r5\n\t"
  62130. #else
  62131. "add r4, r4, r5\n\t"
  62132. #endif
  62133. #ifdef WOLFSSL_KEIL
  62134. "adcs r2, r2, r6\n\t"
  62135. #elif defined(__clang__)
  62136. "adcs r2, r6\n\t"
  62137. #else
  62138. "adc r2, r6\n\t"
  62139. #endif
  62140. #ifdef WOLFSSL_KEIL
  62141. "adcs r3, r3, %[r]\n\t"
  62142. #elif defined(__clang__)
  62143. "adcs r3, %[r]\n\t"
  62144. #else
  62145. "adc r3, %[r]\n\t"
  62146. #endif
  62147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62148. "lsrs r5, %[a], #16\n\t"
  62149. #else
  62150. "lsr r5, %[a], #16\n\t"
  62151. #endif
  62152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62153. "lsrs r6, r7, #16\n\t"
  62154. #else
  62155. "lsr r6, r7, #16\n\t"
  62156. #endif
  62157. #ifdef WOLFSSL_KEIL
  62158. "muls r6, r5, r6\n\t"
  62159. #elif defined(__clang__)
  62160. "muls r6, r5\n\t"
  62161. #else
  62162. "mul r6, r5\n\t"
  62163. #endif
  62164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62165. "adds r2, r2, r6\n\t"
  62166. #else
  62167. "add r2, r2, r6\n\t"
  62168. #endif
  62169. #ifdef WOLFSSL_KEIL
  62170. "adcs r3, r3, %[r]\n\t"
  62171. #elif defined(__clang__)
  62172. "adcs r3, %[r]\n\t"
  62173. #else
  62174. "adc r3, %[r]\n\t"
  62175. #endif
  62176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62177. "adds r2, r2, r6\n\t"
  62178. #else
  62179. "add r2, r2, r6\n\t"
  62180. #endif
  62181. #ifdef WOLFSSL_KEIL
  62182. "adcs r3, r3, %[r]\n\t"
  62183. #elif defined(__clang__)
  62184. "adcs r3, %[r]\n\t"
  62185. #else
  62186. "adc r3, %[r]\n\t"
  62187. #endif
  62188. "uxth r6, r7\n\t"
  62189. #ifdef WOLFSSL_KEIL
  62190. "muls r5, r6, r5\n\t"
  62191. #elif defined(__clang__)
  62192. "muls r5, r6\n\t"
  62193. #else
  62194. "mul r5, r6\n\t"
  62195. #endif
  62196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62197. "lsrs r6, r5, #16\n\t"
  62198. #else
  62199. "lsr r6, r5, #16\n\t"
  62200. #endif
  62201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62202. "lsls r5, r5, #16\n\t"
  62203. #else
  62204. "lsl r5, r5, #16\n\t"
  62205. #endif
  62206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62207. "adds r4, r4, r5\n\t"
  62208. #else
  62209. "add r4, r4, r5\n\t"
  62210. #endif
  62211. #ifdef WOLFSSL_KEIL
  62212. "adcs r2, r2, r6\n\t"
  62213. #elif defined(__clang__)
  62214. "adcs r2, r6\n\t"
  62215. #else
  62216. "adc r2, r6\n\t"
  62217. #endif
  62218. #ifdef WOLFSSL_KEIL
  62219. "adcs r3, r3, %[r]\n\t"
  62220. #elif defined(__clang__)
  62221. "adcs r3, %[r]\n\t"
  62222. #else
  62223. "adc r3, %[r]\n\t"
  62224. #endif
  62225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62226. "adds r4, r4, r5\n\t"
  62227. #else
  62228. "add r4, r4, r5\n\t"
  62229. #endif
  62230. #ifdef WOLFSSL_KEIL
  62231. "adcs r2, r2, r6\n\t"
  62232. #elif defined(__clang__)
  62233. "adcs r2, r6\n\t"
  62234. #else
  62235. "adc r2, r6\n\t"
  62236. #endif
  62237. #ifdef WOLFSSL_KEIL
  62238. "adcs r3, r3, %[r]\n\t"
  62239. #elif defined(__clang__)
  62240. "adcs r3, %[r]\n\t"
  62241. #else
  62242. "adc r3, %[r]\n\t"
  62243. #endif
  62244. "# A[8] * A[3]\n\t"
  62245. "mov %[a], r9\n\t"
  62246. "mov r7, lr\n\t"
  62247. "ldr %[a], [%[a], #32]\n\t"
  62248. "uxth r5, %[a]\n\t"
  62249. "uxth r6, r7\n\t"
  62250. #ifdef WOLFSSL_KEIL
  62251. "muls r6, r5, r6\n\t"
  62252. #elif defined(__clang__)
  62253. "muls r6, r5\n\t"
  62254. #else
  62255. "mul r6, r5\n\t"
  62256. #endif
  62257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62258. "adds r4, r4, r6\n\t"
  62259. #else
  62260. "add r4, r4, r6\n\t"
  62261. #endif
  62262. #ifdef WOLFSSL_KEIL
  62263. "adcs r2, r2, %[r]\n\t"
  62264. #elif defined(__clang__)
  62265. "adcs r2, %[r]\n\t"
  62266. #else
  62267. "adc r2, %[r]\n\t"
  62268. #endif
  62269. #ifdef WOLFSSL_KEIL
  62270. "adcs r3, r3, %[r]\n\t"
  62271. #elif defined(__clang__)
  62272. "adcs r3, %[r]\n\t"
  62273. #else
  62274. "adc r3, %[r]\n\t"
  62275. #endif
  62276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62277. "adds r4, r4, r6\n\t"
  62278. #else
  62279. "add r4, r4, r6\n\t"
  62280. #endif
  62281. #ifdef WOLFSSL_KEIL
  62282. "adcs r2, r2, %[r]\n\t"
  62283. #elif defined(__clang__)
  62284. "adcs r2, %[r]\n\t"
  62285. #else
  62286. "adc r2, %[r]\n\t"
  62287. #endif
  62288. #ifdef WOLFSSL_KEIL
  62289. "adcs r3, r3, %[r]\n\t"
  62290. #elif defined(__clang__)
  62291. "adcs r3, %[r]\n\t"
  62292. #else
  62293. "adc r3, %[r]\n\t"
  62294. #endif
  62295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62296. "lsrs r6, r7, #16\n\t"
  62297. #else
  62298. "lsr r6, r7, #16\n\t"
  62299. #endif
  62300. #ifdef WOLFSSL_KEIL
  62301. "muls r5, r6, r5\n\t"
  62302. #elif defined(__clang__)
  62303. "muls r5, r6\n\t"
  62304. #else
  62305. "mul r5, r6\n\t"
  62306. #endif
  62307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62308. "lsrs r6, r5, #16\n\t"
  62309. #else
  62310. "lsr r6, r5, #16\n\t"
  62311. #endif
  62312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62313. "lsls r5, r5, #16\n\t"
  62314. #else
  62315. "lsl r5, r5, #16\n\t"
  62316. #endif
  62317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62318. "adds r4, r4, r5\n\t"
  62319. #else
  62320. "add r4, r4, r5\n\t"
  62321. #endif
  62322. #ifdef WOLFSSL_KEIL
  62323. "adcs r2, r2, r6\n\t"
  62324. #elif defined(__clang__)
  62325. "adcs r2, r6\n\t"
  62326. #else
  62327. "adc r2, r6\n\t"
  62328. #endif
  62329. #ifdef WOLFSSL_KEIL
  62330. "adcs r3, r3, %[r]\n\t"
  62331. #elif defined(__clang__)
  62332. "adcs r3, %[r]\n\t"
  62333. #else
  62334. "adc r3, %[r]\n\t"
  62335. #endif
  62336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62337. "adds r4, r4, r5\n\t"
  62338. #else
  62339. "add r4, r4, r5\n\t"
  62340. #endif
  62341. #ifdef WOLFSSL_KEIL
  62342. "adcs r2, r2, r6\n\t"
  62343. #elif defined(__clang__)
  62344. "adcs r2, r6\n\t"
  62345. #else
  62346. "adc r2, r6\n\t"
  62347. #endif
  62348. #ifdef WOLFSSL_KEIL
  62349. "adcs r3, r3, %[r]\n\t"
  62350. #elif defined(__clang__)
  62351. "adcs r3, %[r]\n\t"
  62352. #else
  62353. "adc r3, %[r]\n\t"
  62354. #endif
  62355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62356. "lsrs r5, %[a], #16\n\t"
  62357. #else
  62358. "lsr r5, %[a], #16\n\t"
  62359. #endif
  62360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62361. "lsrs r6, r7, #16\n\t"
  62362. #else
  62363. "lsr r6, r7, #16\n\t"
  62364. #endif
  62365. #ifdef WOLFSSL_KEIL
  62366. "muls r6, r5, r6\n\t"
  62367. #elif defined(__clang__)
  62368. "muls r6, r5\n\t"
  62369. #else
  62370. "mul r6, r5\n\t"
  62371. #endif
  62372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62373. "adds r2, r2, r6\n\t"
  62374. #else
  62375. "add r2, r2, r6\n\t"
  62376. #endif
  62377. #ifdef WOLFSSL_KEIL
  62378. "adcs r3, r3, %[r]\n\t"
  62379. #elif defined(__clang__)
  62380. "adcs r3, %[r]\n\t"
  62381. #else
  62382. "adc r3, %[r]\n\t"
  62383. #endif
  62384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62385. "adds r2, r2, r6\n\t"
  62386. #else
  62387. "add r2, r2, r6\n\t"
  62388. #endif
  62389. #ifdef WOLFSSL_KEIL
  62390. "adcs r3, r3, %[r]\n\t"
  62391. #elif defined(__clang__)
  62392. "adcs r3, %[r]\n\t"
  62393. #else
  62394. "adc r3, %[r]\n\t"
  62395. #endif
  62396. "uxth r6, r7\n\t"
  62397. #ifdef WOLFSSL_KEIL
  62398. "muls r5, r6, r5\n\t"
  62399. #elif defined(__clang__)
  62400. "muls r5, r6\n\t"
  62401. #else
  62402. "mul r5, r6\n\t"
  62403. #endif
  62404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62405. "lsrs r6, r5, #16\n\t"
  62406. #else
  62407. "lsr r6, r5, #16\n\t"
  62408. #endif
  62409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62410. "lsls r5, r5, #16\n\t"
  62411. #else
  62412. "lsl r5, r5, #16\n\t"
  62413. #endif
  62414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62415. "adds r4, r4, r5\n\t"
  62416. #else
  62417. "add r4, r4, r5\n\t"
  62418. #endif
  62419. #ifdef WOLFSSL_KEIL
  62420. "adcs r2, r2, r6\n\t"
  62421. #elif defined(__clang__)
  62422. "adcs r2, r6\n\t"
  62423. #else
  62424. "adc r2, r6\n\t"
  62425. #endif
  62426. #ifdef WOLFSSL_KEIL
  62427. "adcs r3, r3, %[r]\n\t"
  62428. #elif defined(__clang__)
  62429. "adcs r3, %[r]\n\t"
  62430. #else
  62431. "adc r3, %[r]\n\t"
  62432. #endif
  62433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62434. "adds r4, r4, r5\n\t"
  62435. #else
  62436. "add r4, r4, r5\n\t"
  62437. #endif
  62438. #ifdef WOLFSSL_KEIL
  62439. "adcs r2, r2, r6\n\t"
  62440. #elif defined(__clang__)
  62441. "adcs r2, r6\n\t"
  62442. #else
  62443. "adc r2, r6\n\t"
  62444. #endif
  62445. #ifdef WOLFSSL_KEIL
  62446. "adcs r3, r3, %[r]\n\t"
  62447. #elif defined(__clang__)
  62448. "adcs r3, %[r]\n\t"
  62449. #else
  62450. "adc r3, %[r]\n\t"
  62451. #endif
  62452. "# A[9] * A[2]\n\t"
  62453. "mov %[a], r9\n\t"
  62454. "mov r7, r12\n\t"
  62455. "ldr %[a], [%[a], #36]\n\t"
  62456. "uxth r5, %[a]\n\t"
  62457. "uxth r6, r7\n\t"
  62458. #ifdef WOLFSSL_KEIL
  62459. "muls r6, r5, r6\n\t"
  62460. #elif defined(__clang__)
  62461. "muls r6, r5\n\t"
  62462. #else
  62463. "mul r6, r5\n\t"
  62464. #endif
  62465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62466. "adds r4, r4, r6\n\t"
  62467. #else
  62468. "add r4, r4, r6\n\t"
  62469. #endif
  62470. #ifdef WOLFSSL_KEIL
  62471. "adcs r2, r2, %[r]\n\t"
  62472. #elif defined(__clang__)
  62473. "adcs r2, %[r]\n\t"
  62474. #else
  62475. "adc r2, %[r]\n\t"
  62476. #endif
  62477. #ifdef WOLFSSL_KEIL
  62478. "adcs r3, r3, %[r]\n\t"
  62479. #elif defined(__clang__)
  62480. "adcs r3, %[r]\n\t"
  62481. #else
  62482. "adc r3, %[r]\n\t"
  62483. #endif
  62484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62485. "adds r4, r4, r6\n\t"
  62486. #else
  62487. "add r4, r4, r6\n\t"
  62488. #endif
  62489. #ifdef WOLFSSL_KEIL
  62490. "adcs r2, r2, %[r]\n\t"
  62491. #elif defined(__clang__)
  62492. "adcs r2, %[r]\n\t"
  62493. #else
  62494. "adc r2, %[r]\n\t"
  62495. #endif
  62496. #ifdef WOLFSSL_KEIL
  62497. "adcs r3, r3, %[r]\n\t"
  62498. #elif defined(__clang__)
  62499. "adcs r3, %[r]\n\t"
  62500. #else
  62501. "adc r3, %[r]\n\t"
  62502. #endif
  62503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62504. "lsrs r6, r7, #16\n\t"
  62505. #else
  62506. "lsr r6, r7, #16\n\t"
  62507. #endif
  62508. #ifdef WOLFSSL_KEIL
  62509. "muls r5, r6, r5\n\t"
  62510. #elif defined(__clang__)
  62511. "muls r5, r6\n\t"
  62512. #else
  62513. "mul r5, r6\n\t"
  62514. #endif
  62515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62516. "lsrs r6, r5, #16\n\t"
  62517. #else
  62518. "lsr r6, r5, #16\n\t"
  62519. #endif
  62520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62521. "lsls r5, r5, #16\n\t"
  62522. #else
  62523. "lsl r5, r5, #16\n\t"
  62524. #endif
  62525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62526. "adds r4, r4, r5\n\t"
  62527. #else
  62528. "add r4, r4, r5\n\t"
  62529. #endif
  62530. #ifdef WOLFSSL_KEIL
  62531. "adcs r2, r2, r6\n\t"
  62532. #elif defined(__clang__)
  62533. "adcs r2, r6\n\t"
  62534. #else
  62535. "adc r2, r6\n\t"
  62536. #endif
  62537. #ifdef WOLFSSL_KEIL
  62538. "adcs r3, r3, %[r]\n\t"
  62539. #elif defined(__clang__)
  62540. "adcs r3, %[r]\n\t"
  62541. #else
  62542. "adc r3, %[r]\n\t"
  62543. #endif
  62544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62545. "adds r4, r4, r5\n\t"
  62546. #else
  62547. "add r4, r4, r5\n\t"
  62548. #endif
  62549. #ifdef WOLFSSL_KEIL
  62550. "adcs r2, r2, r6\n\t"
  62551. #elif defined(__clang__)
  62552. "adcs r2, r6\n\t"
  62553. #else
  62554. "adc r2, r6\n\t"
  62555. #endif
  62556. #ifdef WOLFSSL_KEIL
  62557. "adcs r3, r3, %[r]\n\t"
  62558. #elif defined(__clang__)
  62559. "adcs r3, %[r]\n\t"
  62560. #else
  62561. "adc r3, %[r]\n\t"
  62562. #endif
  62563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62564. "lsrs r5, %[a], #16\n\t"
  62565. #else
  62566. "lsr r5, %[a], #16\n\t"
  62567. #endif
  62568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62569. "lsrs r6, r7, #16\n\t"
  62570. #else
  62571. "lsr r6, r7, #16\n\t"
  62572. #endif
  62573. #ifdef WOLFSSL_KEIL
  62574. "muls r6, r5, r6\n\t"
  62575. #elif defined(__clang__)
  62576. "muls r6, r5\n\t"
  62577. #else
  62578. "mul r6, r5\n\t"
  62579. #endif
  62580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62581. "adds r2, r2, r6\n\t"
  62582. #else
  62583. "add r2, r2, r6\n\t"
  62584. #endif
  62585. #ifdef WOLFSSL_KEIL
  62586. "adcs r3, r3, %[r]\n\t"
  62587. #elif defined(__clang__)
  62588. "adcs r3, %[r]\n\t"
  62589. #else
  62590. "adc r3, %[r]\n\t"
  62591. #endif
  62592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62593. "adds r2, r2, r6\n\t"
  62594. #else
  62595. "add r2, r2, r6\n\t"
  62596. #endif
  62597. #ifdef WOLFSSL_KEIL
  62598. "adcs r3, r3, %[r]\n\t"
  62599. #elif defined(__clang__)
  62600. "adcs r3, %[r]\n\t"
  62601. #else
  62602. "adc r3, %[r]\n\t"
  62603. #endif
  62604. "uxth r6, r7\n\t"
  62605. #ifdef WOLFSSL_KEIL
  62606. "muls r5, r6, r5\n\t"
  62607. #elif defined(__clang__)
  62608. "muls r5, r6\n\t"
  62609. #else
  62610. "mul r5, r6\n\t"
  62611. #endif
  62612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62613. "lsrs r6, r5, #16\n\t"
  62614. #else
  62615. "lsr r6, r5, #16\n\t"
  62616. #endif
  62617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62618. "lsls r5, r5, #16\n\t"
  62619. #else
  62620. "lsl r5, r5, #16\n\t"
  62621. #endif
  62622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62623. "adds r4, r4, r5\n\t"
  62624. #else
  62625. "add r4, r4, r5\n\t"
  62626. #endif
  62627. #ifdef WOLFSSL_KEIL
  62628. "adcs r2, r2, r6\n\t"
  62629. #elif defined(__clang__)
  62630. "adcs r2, r6\n\t"
  62631. #else
  62632. "adc r2, r6\n\t"
  62633. #endif
  62634. #ifdef WOLFSSL_KEIL
  62635. "adcs r3, r3, %[r]\n\t"
  62636. #elif defined(__clang__)
  62637. "adcs r3, %[r]\n\t"
  62638. #else
  62639. "adc r3, %[r]\n\t"
  62640. #endif
  62641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62642. "adds r4, r4, r5\n\t"
  62643. #else
  62644. "add r4, r4, r5\n\t"
  62645. #endif
  62646. #ifdef WOLFSSL_KEIL
  62647. "adcs r2, r2, r6\n\t"
  62648. #elif defined(__clang__)
  62649. "adcs r2, r6\n\t"
  62650. #else
  62651. "adc r2, r6\n\t"
  62652. #endif
  62653. #ifdef WOLFSSL_KEIL
  62654. "adcs r3, r3, %[r]\n\t"
  62655. #elif defined(__clang__)
  62656. "adcs r3, %[r]\n\t"
  62657. #else
  62658. "adc r3, %[r]\n\t"
  62659. #endif
  62660. "# A[10] * A[1]\n\t"
  62661. "mov %[a], r9\n\t"
  62662. "mov r7, r11\n\t"
  62663. "ldr %[a], [%[a], #40]\n\t"
  62664. "uxth r5, %[a]\n\t"
  62665. "uxth r6, r7\n\t"
  62666. #ifdef WOLFSSL_KEIL
  62667. "muls r6, r5, r6\n\t"
  62668. #elif defined(__clang__)
  62669. "muls r6, r5\n\t"
  62670. #else
  62671. "mul r6, r5\n\t"
  62672. #endif
  62673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62674. "adds r4, r4, r6\n\t"
  62675. #else
  62676. "add r4, r4, r6\n\t"
  62677. #endif
  62678. #ifdef WOLFSSL_KEIL
  62679. "adcs r2, r2, %[r]\n\t"
  62680. #elif defined(__clang__)
  62681. "adcs r2, %[r]\n\t"
  62682. #else
  62683. "adc r2, %[r]\n\t"
  62684. #endif
  62685. #ifdef WOLFSSL_KEIL
  62686. "adcs r3, r3, %[r]\n\t"
  62687. #elif defined(__clang__)
  62688. "adcs r3, %[r]\n\t"
  62689. #else
  62690. "adc r3, %[r]\n\t"
  62691. #endif
  62692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62693. "adds r4, r4, r6\n\t"
  62694. #else
  62695. "add r4, r4, r6\n\t"
  62696. #endif
  62697. #ifdef WOLFSSL_KEIL
  62698. "adcs r2, r2, %[r]\n\t"
  62699. #elif defined(__clang__)
  62700. "adcs r2, %[r]\n\t"
  62701. #else
  62702. "adc r2, %[r]\n\t"
  62703. #endif
  62704. #ifdef WOLFSSL_KEIL
  62705. "adcs r3, r3, %[r]\n\t"
  62706. #elif defined(__clang__)
  62707. "adcs r3, %[r]\n\t"
  62708. #else
  62709. "adc r3, %[r]\n\t"
  62710. #endif
  62711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62712. "lsrs r6, r7, #16\n\t"
  62713. #else
  62714. "lsr r6, r7, #16\n\t"
  62715. #endif
  62716. #ifdef WOLFSSL_KEIL
  62717. "muls r5, r6, r5\n\t"
  62718. #elif defined(__clang__)
  62719. "muls r5, r6\n\t"
  62720. #else
  62721. "mul r5, r6\n\t"
  62722. #endif
  62723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62724. "lsrs r6, r5, #16\n\t"
  62725. #else
  62726. "lsr r6, r5, #16\n\t"
  62727. #endif
  62728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62729. "lsls r5, r5, #16\n\t"
  62730. #else
  62731. "lsl r5, r5, #16\n\t"
  62732. #endif
  62733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62734. "adds r4, r4, r5\n\t"
  62735. #else
  62736. "add r4, r4, r5\n\t"
  62737. #endif
  62738. #ifdef WOLFSSL_KEIL
  62739. "adcs r2, r2, r6\n\t"
  62740. #elif defined(__clang__)
  62741. "adcs r2, r6\n\t"
  62742. #else
  62743. "adc r2, r6\n\t"
  62744. #endif
  62745. #ifdef WOLFSSL_KEIL
  62746. "adcs r3, r3, %[r]\n\t"
  62747. #elif defined(__clang__)
  62748. "adcs r3, %[r]\n\t"
  62749. #else
  62750. "adc r3, %[r]\n\t"
  62751. #endif
  62752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62753. "adds r4, r4, r5\n\t"
  62754. #else
  62755. "add r4, r4, r5\n\t"
  62756. #endif
  62757. #ifdef WOLFSSL_KEIL
  62758. "adcs r2, r2, r6\n\t"
  62759. #elif defined(__clang__)
  62760. "adcs r2, r6\n\t"
  62761. #else
  62762. "adc r2, r6\n\t"
  62763. #endif
  62764. #ifdef WOLFSSL_KEIL
  62765. "adcs r3, r3, %[r]\n\t"
  62766. #elif defined(__clang__)
  62767. "adcs r3, %[r]\n\t"
  62768. #else
  62769. "adc r3, %[r]\n\t"
  62770. #endif
  62771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62772. "lsrs r5, %[a], #16\n\t"
  62773. #else
  62774. "lsr r5, %[a], #16\n\t"
  62775. #endif
  62776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62777. "lsrs r6, r7, #16\n\t"
  62778. #else
  62779. "lsr r6, r7, #16\n\t"
  62780. #endif
  62781. #ifdef WOLFSSL_KEIL
  62782. "muls r6, r5, r6\n\t"
  62783. #elif defined(__clang__)
  62784. "muls r6, r5\n\t"
  62785. #else
  62786. "mul r6, r5\n\t"
  62787. #endif
  62788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62789. "adds r2, r2, r6\n\t"
  62790. #else
  62791. "add r2, r2, r6\n\t"
  62792. #endif
  62793. #ifdef WOLFSSL_KEIL
  62794. "adcs r3, r3, %[r]\n\t"
  62795. #elif defined(__clang__)
  62796. "adcs r3, %[r]\n\t"
  62797. #else
  62798. "adc r3, %[r]\n\t"
  62799. #endif
  62800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62801. "adds r2, r2, r6\n\t"
  62802. #else
  62803. "add r2, r2, r6\n\t"
  62804. #endif
  62805. #ifdef WOLFSSL_KEIL
  62806. "adcs r3, r3, %[r]\n\t"
  62807. #elif defined(__clang__)
  62808. "adcs r3, %[r]\n\t"
  62809. #else
  62810. "adc r3, %[r]\n\t"
  62811. #endif
  62812. "uxth r6, r7\n\t"
  62813. #ifdef WOLFSSL_KEIL
  62814. "muls r5, r6, r5\n\t"
  62815. #elif defined(__clang__)
  62816. "muls r5, r6\n\t"
  62817. #else
  62818. "mul r5, r6\n\t"
  62819. #endif
  62820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62821. "lsrs r6, r5, #16\n\t"
  62822. #else
  62823. "lsr r6, r5, #16\n\t"
  62824. #endif
  62825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62826. "lsls r5, r5, #16\n\t"
  62827. #else
  62828. "lsl r5, r5, #16\n\t"
  62829. #endif
  62830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62831. "adds r4, r4, r5\n\t"
  62832. #else
  62833. "add r4, r4, r5\n\t"
  62834. #endif
  62835. #ifdef WOLFSSL_KEIL
  62836. "adcs r2, r2, r6\n\t"
  62837. #elif defined(__clang__)
  62838. "adcs r2, r6\n\t"
  62839. #else
  62840. "adc r2, r6\n\t"
  62841. #endif
  62842. #ifdef WOLFSSL_KEIL
  62843. "adcs r3, r3, %[r]\n\t"
  62844. #elif defined(__clang__)
  62845. "adcs r3, %[r]\n\t"
  62846. #else
  62847. "adc r3, %[r]\n\t"
  62848. #endif
  62849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62850. "adds r4, r4, r5\n\t"
  62851. #else
  62852. "add r4, r4, r5\n\t"
  62853. #endif
  62854. #ifdef WOLFSSL_KEIL
  62855. "adcs r2, r2, r6\n\t"
  62856. #elif defined(__clang__)
  62857. "adcs r2, r6\n\t"
  62858. #else
  62859. "adc r2, r6\n\t"
  62860. #endif
  62861. #ifdef WOLFSSL_KEIL
  62862. "adcs r3, r3, %[r]\n\t"
  62863. #elif defined(__clang__)
  62864. "adcs r3, %[r]\n\t"
  62865. #else
  62866. "adc r3, %[r]\n\t"
  62867. #endif
  62868. "# A[11] * A[0]\n\t"
  62869. "mov %[a], r9\n\t"
  62870. "mov r7, r10\n\t"
  62871. "ldr %[a], [%[a], #44]\n\t"
  62872. "uxth r5, %[a]\n\t"
  62873. "uxth r6, r7\n\t"
  62874. #ifdef WOLFSSL_KEIL
  62875. "muls r6, r5, r6\n\t"
  62876. #elif defined(__clang__)
  62877. "muls r6, r5\n\t"
  62878. #else
  62879. "mul r6, r5\n\t"
  62880. #endif
  62881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62882. "adds r4, r4, r6\n\t"
  62883. #else
  62884. "add r4, r4, r6\n\t"
  62885. #endif
  62886. #ifdef WOLFSSL_KEIL
  62887. "adcs r2, r2, %[r]\n\t"
  62888. #elif defined(__clang__)
  62889. "adcs r2, %[r]\n\t"
  62890. #else
  62891. "adc r2, %[r]\n\t"
  62892. #endif
  62893. #ifdef WOLFSSL_KEIL
  62894. "adcs r3, r3, %[r]\n\t"
  62895. #elif defined(__clang__)
  62896. "adcs r3, %[r]\n\t"
  62897. #else
  62898. "adc r3, %[r]\n\t"
  62899. #endif
  62900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62901. "adds r4, r4, r6\n\t"
  62902. #else
  62903. "add r4, r4, r6\n\t"
  62904. #endif
  62905. #ifdef WOLFSSL_KEIL
  62906. "adcs r2, r2, %[r]\n\t"
  62907. #elif defined(__clang__)
  62908. "adcs r2, %[r]\n\t"
  62909. #else
  62910. "adc r2, %[r]\n\t"
  62911. #endif
  62912. #ifdef WOLFSSL_KEIL
  62913. "adcs r3, r3, %[r]\n\t"
  62914. #elif defined(__clang__)
  62915. "adcs r3, %[r]\n\t"
  62916. #else
  62917. "adc r3, %[r]\n\t"
  62918. #endif
  62919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62920. "lsrs r6, r7, #16\n\t"
  62921. #else
  62922. "lsr r6, r7, #16\n\t"
  62923. #endif
  62924. #ifdef WOLFSSL_KEIL
  62925. "muls r5, r6, r5\n\t"
  62926. #elif defined(__clang__)
  62927. "muls r5, r6\n\t"
  62928. #else
  62929. "mul r5, r6\n\t"
  62930. #endif
  62931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62932. "lsrs r6, r5, #16\n\t"
  62933. #else
  62934. "lsr r6, r5, #16\n\t"
  62935. #endif
  62936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62937. "lsls r5, r5, #16\n\t"
  62938. #else
  62939. "lsl r5, r5, #16\n\t"
  62940. #endif
  62941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62942. "adds r4, r4, r5\n\t"
  62943. #else
  62944. "add r4, r4, r5\n\t"
  62945. #endif
  62946. #ifdef WOLFSSL_KEIL
  62947. "adcs r2, r2, r6\n\t"
  62948. #elif defined(__clang__)
  62949. "adcs r2, r6\n\t"
  62950. #else
  62951. "adc r2, r6\n\t"
  62952. #endif
  62953. #ifdef WOLFSSL_KEIL
  62954. "adcs r3, r3, %[r]\n\t"
  62955. #elif defined(__clang__)
  62956. "adcs r3, %[r]\n\t"
  62957. #else
  62958. "adc r3, %[r]\n\t"
  62959. #endif
  62960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62961. "adds r4, r4, r5\n\t"
  62962. #else
  62963. "add r4, r4, r5\n\t"
  62964. #endif
  62965. #ifdef WOLFSSL_KEIL
  62966. "adcs r2, r2, r6\n\t"
  62967. #elif defined(__clang__)
  62968. "adcs r2, r6\n\t"
  62969. #else
  62970. "adc r2, r6\n\t"
  62971. #endif
  62972. #ifdef WOLFSSL_KEIL
  62973. "adcs r3, r3, %[r]\n\t"
  62974. #elif defined(__clang__)
  62975. "adcs r3, %[r]\n\t"
  62976. #else
  62977. "adc r3, %[r]\n\t"
  62978. #endif
  62979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62980. "lsrs r5, %[a], #16\n\t"
  62981. #else
  62982. "lsr r5, %[a], #16\n\t"
  62983. #endif
  62984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62985. "lsrs r6, r7, #16\n\t"
  62986. #else
  62987. "lsr r6, r7, #16\n\t"
  62988. #endif
  62989. #ifdef WOLFSSL_KEIL
  62990. "muls r6, r5, r6\n\t"
  62991. #elif defined(__clang__)
  62992. "muls r6, r5\n\t"
  62993. #else
  62994. "mul r6, r5\n\t"
  62995. #endif
  62996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62997. "adds r2, r2, r6\n\t"
  62998. #else
  62999. "add r2, r2, r6\n\t"
  63000. #endif
  63001. #ifdef WOLFSSL_KEIL
  63002. "adcs r3, r3, %[r]\n\t"
  63003. #elif defined(__clang__)
  63004. "adcs r3, %[r]\n\t"
  63005. #else
  63006. "adc r3, %[r]\n\t"
  63007. #endif
  63008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63009. "adds r2, r2, r6\n\t"
  63010. #else
  63011. "add r2, r2, r6\n\t"
  63012. #endif
  63013. #ifdef WOLFSSL_KEIL
  63014. "adcs r3, r3, %[r]\n\t"
  63015. #elif defined(__clang__)
  63016. "adcs r3, %[r]\n\t"
  63017. #else
  63018. "adc r3, %[r]\n\t"
  63019. #endif
  63020. "uxth r6, r7\n\t"
  63021. #ifdef WOLFSSL_KEIL
  63022. "muls r5, r6, r5\n\t"
  63023. #elif defined(__clang__)
  63024. "muls r5, r6\n\t"
  63025. #else
  63026. "mul r5, r6\n\t"
  63027. #endif
  63028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63029. "lsrs r6, r5, #16\n\t"
  63030. #else
  63031. "lsr r6, r5, #16\n\t"
  63032. #endif
  63033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63034. "lsls r5, r5, #16\n\t"
  63035. #else
  63036. "lsl r5, r5, #16\n\t"
  63037. #endif
  63038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63039. "adds r4, r4, r5\n\t"
  63040. #else
  63041. "add r4, r4, r5\n\t"
  63042. #endif
  63043. #ifdef WOLFSSL_KEIL
  63044. "adcs r2, r2, r6\n\t"
  63045. #elif defined(__clang__)
  63046. "adcs r2, r6\n\t"
  63047. #else
  63048. "adc r2, r6\n\t"
  63049. #endif
  63050. #ifdef WOLFSSL_KEIL
  63051. "adcs r3, r3, %[r]\n\t"
  63052. #elif defined(__clang__)
  63053. "adcs r3, %[r]\n\t"
  63054. #else
  63055. "adc r3, %[r]\n\t"
  63056. #endif
  63057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63058. "adds r4, r4, r5\n\t"
  63059. #else
  63060. "add r4, r4, r5\n\t"
  63061. #endif
  63062. #ifdef WOLFSSL_KEIL
  63063. "adcs r2, r2, r6\n\t"
  63064. #elif defined(__clang__)
  63065. "adcs r2, r6\n\t"
  63066. #else
  63067. "adc r2, r6\n\t"
  63068. #endif
  63069. #ifdef WOLFSSL_KEIL
  63070. "adcs r3, r3, %[r]\n\t"
  63071. #elif defined(__clang__)
  63072. "adcs r3, %[r]\n\t"
  63073. #else
  63074. "adc r3, %[r]\n\t"
  63075. #endif
  63076. "str r4, [sp, #44]\n\t"
  63077. "# A[11] * A[1]\n\t"
  63078. "movs r4, #0\n\t"
  63079. "mov %[a], r9\n\t"
  63080. "mov r7, r11\n\t"
  63081. "ldr %[a], [%[a], #44]\n\t"
  63082. "uxth r5, %[a]\n\t"
  63083. "uxth r6, r7\n\t"
  63084. #ifdef WOLFSSL_KEIL
  63085. "muls r6, r5, r6\n\t"
  63086. #elif defined(__clang__)
  63087. "muls r6, r5\n\t"
  63088. #else
  63089. "mul r6, r5\n\t"
  63090. #endif
  63091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63092. "adds r2, r2, r6\n\t"
  63093. #else
  63094. "add r2, r2, r6\n\t"
  63095. #endif
  63096. #ifdef WOLFSSL_KEIL
  63097. "adcs r3, r3, %[r]\n\t"
  63098. #elif defined(__clang__)
  63099. "adcs r3, %[r]\n\t"
  63100. #else
  63101. "adc r3, %[r]\n\t"
  63102. #endif
  63103. #ifdef WOLFSSL_KEIL
  63104. "adcs r4, r4, %[r]\n\t"
  63105. #elif defined(__clang__)
  63106. "adcs r4, %[r]\n\t"
  63107. #else
  63108. "adc r4, %[r]\n\t"
  63109. #endif
  63110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63111. "adds r2, r2, r6\n\t"
  63112. #else
  63113. "add r2, r2, r6\n\t"
  63114. #endif
  63115. #ifdef WOLFSSL_KEIL
  63116. "adcs r3, r3, %[r]\n\t"
  63117. #elif defined(__clang__)
  63118. "adcs r3, %[r]\n\t"
  63119. #else
  63120. "adc r3, %[r]\n\t"
  63121. #endif
  63122. #ifdef WOLFSSL_KEIL
  63123. "adcs r4, r4, %[r]\n\t"
  63124. #elif defined(__clang__)
  63125. "adcs r4, %[r]\n\t"
  63126. #else
  63127. "adc r4, %[r]\n\t"
  63128. #endif
  63129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63130. "lsrs r6, r7, #16\n\t"
  63131. #else
  63132. "lsr r6, r7, #16\n\t"
  63133. #endif
  63134. #ifdef WOLFSSL_KEIL
  63135. "muls r5, r6, r5\n\t"
  63136. #elif defined(__clang__)
  63137. "muls r5, r6\n\t"
  63138. #else
  63139. "mul r5, r6\n\t"
  63140. #endif
  63141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63142. "lsrs r6, r5, #16\n\t"
  63143. #else
  63144. "lsr r6, r5, #16\n\t"
  63145. #endif
  63146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63147. "lsls r5, r5, #16\n\t"
  63148. #else
  63149. "lsl r5, r5, #16\n\t"
  63150. #endif
  63151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63152. "adds r2, r2, r5\n\t"
  63153. #else
  63154. "add r2, r2, r5\n\t"
  63155. #endif
  63156. #ifdef WOLFSSL_KEIL
  63157. "adcs r3, r3, r6\n\t"
  63158. #elif defined(__clang__)
  63159. "adcs r3, r6\n\t"
  63160. #else
  63161. "adc r3, r6\n\t"
  63162. #endif
  63163. #ifdef WOLFSSL_KEIL
  63164. "adcs r4, r4, %[r]\n\t"
  63165. #elif defined(__clang__)
  63166. "adcs r4, %[r]\n\t"
  63167. #else
  63168. "adc r4, %[r]\n\t"
  63169. #endif
  63170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63171. "adds r2, r2, r5\n\t"
  63172. #else
  63173. "add r2, r2, r5\n\t"
  63174. #endif
  63175. #ifdef WOLFSSL_KEIL
  63176. "adcs r3, r3, r6\n\t"
  63177. #elif defined(__clang__)
  63178. "adcs r3, r6\n\t"
  63179. #else
  63180. "adc r3, r6\n\t"
  63181. #endif
  63182. #ifdef WOLFSSL_KEIL
  63183. "adcs r4, r4, %[r]\n\t"
  63184. #elif defined(__clang__)
  63185. "adcs r4, %[r]\n\t"
  63186. #else
  63187. "adc r4, %[r]\n\t"
  63188. #endif
  63189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63190. "lsrs r5, %[a], #16\n\t"
  63191. #else
  63192. "lsr r5, %[a], #16\n\t"
  63193. #endif
  63194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63195. "lsrs r6, r7, #16\n\t"
  63196. #else
  63197. "lsr r6, r7, #16\n\t"
  63198. #endif
  63199. #ifdef WOLFSSL_KEIL
  63200. "muls r6, r5, r6\n\t"
  63201. #elif defined(__clang__)
  63202. "muls r6, r5\n\t"
  63203. #else
  63204. "mul r6, r5\n\t"
  63205. #endif
  63206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63207. "adds r3, r3, r6\n\t"
  63208. #else
  63209. "add r3, r3, r6\n\t"
  63210. #endif
  63211. #ifdef WOLFSSL_KEIL
  63212. "adcs r4, r4, %[r]\n\t"
  63213. #elif defined(__clang__)
  63214. "adcs r4, %[r]\n\t"
  63215. #else
  63216. "adc r4, %[r]\n\t"
  63217. #endif
  63218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63219. "adds r3, r3, r6\n\t"
  63220. #else
  63221. "add r3, r3, r6\n\t"
  63222. #endif
  63223. #ifdef WOLFSSL_KEIL
  63224. "adcs r4, r4, %[r]\n\t"
  63225. #elif defined(__clang__)
  63226. "adcs r4, %[r]\n\t"
  63227. #else
  63228. "adc r4, %[r]\n\t"
  63229. #endif
  63230. "uxth r6, r7\n\t"
  63231. #ifdef WOLFSSL_KEIL
  63232. "muls r5, r6, r5\n\t"
  63233. #elif defined(__clang__)
  63234. "muls r5, r6\n\t"
  63235. #else
  63236. "mul r5, r6\n\t"
  63237. #endif
  63238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63239. "lsrs r6, r5, #16\n\t"
  63240. #else
  63241. "lsr r6, r5, #16\n\t"
  63242. #endif
  63243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63244. "lsls r5, r5, #16\n\t"
  63245. #else
  63246. "lsl r5, r5, #16\n\t"
  63247. #endif
  63248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63249. "adds r2, r2, r5\n\t"
  63250. #else
  63251. "add r2, r2, r5\n\t"
  63252. #endif
  63253. #ifdef WOLFSSL_KEIL
  63254. "adcs r3, r3, r6\n\t"
  63255. #elif defined(__clang__)
  63256. "adcs r3, r6\n\t"
  63257. #else
  63258. "adc r3, r6\n\t"
  63259. #endif
  63260. #ifdef WOLFSSL_KEIL
  63261. "adcs r4, r4, %[r]\n\t"
  63262. #elif defined(__clang__)
  63263. "adcs r4, %[r]\n\t"
  63264. #else
  63265. "adc r4, %[r]\n\t"
  63266. #endif
  63267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63268. "adds r2, r2, r5\n\t"
  63269. #else
  63270. "add r2, r2, r5\n\t"
  63271. #endif
  63272. #ifdef WOLFSSL_KEIL
  63273. "adcs r3, r3, r6\n\t"
  63274. #elif defined(__clang__)
  63275. "adcs r3, r6\n\t"
  63276. #else
  63277. "adc r3, r6\n\t"
  63278. #endif
  63279. #ifdef WOLFSSL_KEIL
  63280. "adcs r4, r4, %[r]\n\t"
  63281. #elif defined(__clang__)
  63282. "adcs r4, %[r]\n\t"
  63283. #else
  63284. "adc r4, %[r]\n\t"
  63285. #endif
  63286. "# A[10] * A[2]\n\t"
  63287. "mov %[a], r9\n\t"
  63288. "mov r7, r12\n\t"
  63289. "ldr %[a], [%[a], #40]\n\t"
  63290. "uxth r5, %[a]\n\t"
  63291. "uxth r6, r7\n\t"
  63292. #ifdef WOLFSSL_KEIL
  63293. "muls r6, r5, r6\n\t"
  63294. #elif defined(__clang__)
  63295. "muls r6, r5\n\t"
  63296. #else
  63297. "mul r6, r5\n\t"
  63298. #endif
  63299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63300. "adds r2, r2, r6\n\t"
  63301. #else
  63302. "add r2, r2, r6\n\t"
  63303. #endif
  63304. #ifdef WOLFSSL_KEIL
  63305. "adcs r3, r3, %[r]\n\t"
  63306. #elif defined(__clang__)
  63307. "adcs r3, %[r]\n\t"
  63308. #else
  63309. "adc r3, %[r]\n\t"
  63310. #endif
  63311. #ifdef WOLFSSL_KEIL
  63312. "adcs r4, r4, %[r]\n\t"
  63313. #elif defined(__clang__)
  63314. "adcs r4, %[r]\n\t"
  63315. #else
  63316. "adc r4, %[r]\n\t"
  63317. #endif
  63318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63319. "adds r2, r2, r6\n\t"
  63320. #else
  63321. "add r2, r2, r6\n\t"
  63322. #endif
  63323. #ifdef WOLFSSL_KEIL
  63324. "adcs r3, r3, %[r]\n\t"
  63325. #elif defined(__clang__)
  63326. "adcs r3, %[r]\n\t"
  63327. #else
  63328. "adc r3, %[r]\n\t"
  63329. #endif
  63330. #ifdef WOLFSSL_KEIL
  63331. "adcs r4, r4, %[r]\n\t"
  63332. #elif defined(__clang__)
  63333. "adcs r4, %[r]\n\t"
  63334. #else
  63335. "adc r4, %[r]\n\t"
  63336. #endif
  63337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63338. "lsrs r6, r7, #16\n\t"
  63339. #else
  63340. "lsr r6, r7, #16\n\t"
  63341. #endif
  63342. #ifdef WOLFSSL_KEIL
  63343. "muls r5, r6, r5\n\t"
  63344. #elif defined(__clang__)
  63345. "muls r5, r6\n\t"
  63346. #else
  63347. "mul r5, r6\n\t"
  63348. #endif
  63349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63350. "lsrs r6, r5, #16\n\t"
  63351. #else
  63352. "lsr r6, r5, #16\n\t"
  63353. #endif
  63354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63355. "lsls r5, r5, #16\n\t"
  63356. #else
  63357. "lsl r5, r5, #16\n\t"
  63358. #endif
  63359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63360. "adds r2, r2, r5\n\t"
  63361. #else
  63362. "add r2, r2, r5\n\t"
  63363. #endif
  63364. #ifdef WOLFSSL_KEIL
  63365. "adcs r3, r3, r6\n\t"
  63366. #elif defined(__clang__)
  63367. "adcs r3, r6\n\t"
  63368. #else
  63369. "adc r3, r6\n\t"
  63370. #endif
  63371. #ifdef WOLFSSL_KEIL
  63372. "adcs r4, r4, %[r]\n\t"
  63373. #elif defined(__clang__)
  63374. "adcs r4, %[r]\n\t"
  63375. #else
  63376. "adc r4, %[r]\n\t"
  63377. #endif
  63378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63379. "adds r2, r2, r5\n\t"
  63380. #else
  63381. "add r2, r2, r5\n\t"
  63382. #endif
  63383. #ifdef WOLFSSL_KEIL
  63384. "adcs r3, r3, r6\n\t"
  63385. #elif defined(__clang__)
  63386. "adcs r3, r6\n\t"
  63387. #else
  63388. "adc r3, r6\n\t"
  63389. #endif
  63390. #ifdef WOLFSSL_KEIL
  63391. "adcs r4, r4, %[r]\n\t"
  63392. #elif defined(__clang__)
  63393. "adcs r4, %[r]\n\t"
  63394. #else
  63395. "adc r4, %[r]\n\t"
  63396. #endif
  63397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63398. "lsrs r5, %[a], #16\n\t"
  63399. #else
  63400. "lsr r5, %[a], #16\n\t"
  63401. #endif
  63402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63403. "lsrs r6, r7, #16\n\t"
  63404. #else
  63405. "lsr r6, r7, #16\n\t"
  63406. #endif
  63407. #ifdef WOLFSSL_KEIL
  63408. "muls r6, r5, r6\n\t"
  63409. #elif defined(__clang__)
  63410. "muls r6, r5\n\t"
  63411. #else
  63412. "mul r6, r5\n\t"
  63413. #endif
  63414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63415. "adds r3, r3, r6\n\t"
  63416. #else
  63417. "add r3, r3, r6\n\t"
  63418. #endif
  63419. #ifdef WOLFSSL_KEIL
  63420. "adcs r4, r4, %[r]\n\t"
  63421. #elif defined(__clang__)
  63422. "adcs r4, %[r]\n\t"
  63423. #else
  63424. "adc r4, %[r]\n\t"
  63425. #endif
  63426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63427. "adds r3, r3, r6\n\t"
  63428. #else
  63429. "add r3, r3, r6\n\t"
  63430. #endif
  63431. #ifdef WOLFSSL_KEIL
  63432. "adcs r4, r4, %[r]\n\t"
  63433. #elif defined(__clang__)
  63434. "adcs r4, %[r]\n\t"
  63435. #else
  63436. "adc r4, %[r]\n\t"
  63437. #endif
  63438. "uxth r6, r7\n\t"
  63439. #ifdef WOLFSSL_KEIL
  63440. "muls r5, r6, r5\n\t"
  63441. #elif defined(__clang__)
  63442. "muls r5, r6\n\t"
  63443. #else
  63444. "mul r5, r6\n\t"
  63445. #endif
  63446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63447. "lsrs r6, r5, #16\n\t"
  63448. #else
  63449. "lsr r6, r5, #16\n\t"
  63450. #endif
  63451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63452. "lsls r5, r5, #16\n\t"
  63453. #else
  63454. "lsl r5, r5, #16\n\t"
  63455. #endif
  63456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63457. "adds r2, r2, r5\n\t"
  63458. #else
  63459. "add r2, r2, r5\n\t"
  63460. #endif
  63461. #ifdef WOLFSSL_KEIL
  63462. "adcs r3, r3, r6\n\t"
  63463. #elif defined(__clang__)
  63464. "adcs r3, r6\n\t"
  63465. #else
  63466. "adc r3, r6\n\t"
  63467. #endif
  63468. #ifdef WOLFSSL_KEIL
  63469. "adcs r4, r4, %[r]\n\t"
  63470. #elif defined(__clang__)
  63471. "adcs r4, %[r]\n\t"
  63472. #else
  63473. "adc r4, %[r]\n\t"
  63474. #endif
  63475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63476. "adds r2, r2, r5\n\t"
  63477. #else
  63478. "add r2, r2, r5\n\t"
  63479. #endif
  63480. #ifdef WOLFSSL_KEIL
  63481. "adcs r3, r3, r6\n\t"
  63482. #elif defined(__clang__)
  63483. "adcs r3, r6\n\t"
  63484. #else
  63485. "adc r3, r6\n\t"
  63486. #endif
  63487. #ifdef WOLFSSL_KEIL
  63488. "adcs r4, r4, %[r]\n\t"
  63489. #elif defined(__clang__)
  63490. "adcs r4, %[r]\n\t"
  63491. #else
  63492. "adc r4, %[r]\n\t"
  63493. #endif
  63494. "# A[9] * A[3]\n\t"
  63495. "mov %[a], r9\n\t"
  63496. "mov r7, lr\n\t"
  63497. "ldr %[a], [%[a], #36]\n\t"
  63498. "uxth r5, %[a]\n\t"
  63499. "uxth r6, r7\n\t"
  63500. #ifdef WOLFSSL_KEIL
  63501. "muls r6, r5, r6\n\t"
  63502. #elif defined(__clang__)
  63503. "muls r6, r5\n\t"
  63504. #else
  63505. "mul r6, r5\n\t"
  63506. #endif
  63507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63508. "adds r2, r2, r6\n\t"
  63509. #else
  63510. "add r2, r2, r6\n\t"
  63511. #endif
  63512. #ifdef WOLFSSL_KEIL
  63513. "adcs r3, r3, %[r]\n\t"
  63514. #elif defined(__clang__)
  63515. "adcs r3, %[r]\n\t"
  63516. #else
  63517. "adc r3, %[r]\n\t"
  63518. #endif
  63519. #ifdef WOLFSSL_KEIL
  63520. "adcs r4, r4, %[r]\n\t"
  63521. #elif defined(__clang__)
  63522. "adcs r4, %[r]\n\t"
  63523. #else
  63524. "adc r4, %[r]\n\t"
  63525. #endif
  63526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63527. "adds r2, r2, r6\n\t"
  63528. #else
  63529. "add r2, r2, r6\n\t"
  63530. #endif
  63531. #ifdef WOLFSSL_KEIL
  63532. "adcs r3, r3, %[r]\n\t"
  63533. #elif defined(__clang__)
  63534. "adcs r3, %[r]\n\t"
  63535. #else
  63536. "adc r3, %[r]\n\t"
  63537. #endif
  63538. #ifdef WOLFSSL_KEIL
  63539. "adcs r4, r4, %[r]\n\t"
  63540. #elif defined(__clang__)
  63541. "adcs r4, %[r]\n\t"
  63542. #else
  63543. "adc r4, %[r]\n\t"
  63544. #endif
  63545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63546. "lsrs r6, r7, #16\n\t"
  63547. #else
  63548. "lsr r6, r7, #16\n\t"
  63549. #endif
  63550. #ifdef WOLFSSL_KEIL
  63551. "muls r5, r6, r5\n\t"
  63552. #elif defined(__clang__)
  63553. "muls r5, r6\n\t"
  63554. #else
  63555. "mul r5, r6\n\t"
  63556. #endif
  63557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63558. "lsrs r6, r5, #16\n\t"
  63559. #else
  63560. "lsr r6, r5, #16\n\t"
  63561. #endif
  63562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63563. "lsls r5, r5, #16\n\t"
  63564. #else
  63565. "lsl r5, r5, #16\n\t"
  63566. #endif
  63567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63568. "adds r2, r2, r5\n\t"
  63569. #else
  63570. "add r2, r2, r5\n\t"
  63571. #endif
  63572. #ifdef WOLFSSL_KEIL
  63573. "adcs r3, r3, r6\n\t"
  63574. #elif defined(__clang__)
  63575. "adcs r3, r6\n\t"
  63576. #else
  63577. "adc r3, r6\n\t"
  63578. #endif
  63579. #ifdef WOLFSSL_KEIL
  63580. "adcs r4, r4, %[r]\n\t"
  63581. #elif defined(__clang__)
  63582. "adcs r4, %[r]\n\t"
  63583. #else
  63584. "adc r4, %[r]\n\t"
  63585. #endif
  63586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63587. "adds r2, r2, r5\n\t"
  63588. #else
  63589. "add r2, r2, r5\n\t"
  63590. #endif
  63591. #ifdef WOLFSSL_KEIL
  63592. "adcs r3, r3, r6\n\t"
  63593. #elif defined(__clang__)
  63594. "adcs r3, r6\n\t"
  63595. #else
  63596. "adc r3, r6\n\t"
  63597. #endif
  63598. #ifdef WOLFSSL_KEIL
  63599. "adcs r4, r4, %[r]\n\t"
  63600. #elif defined(__clang__)
  63601. "adcs r4, %[r]\n\t"
  63602. #else
  63603. "adc r4, %[r]\n\t"
  63604. #endif
  63605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63606. "lsrs r5, %[a], #16\n\t"
  63607. #else
  63608. "lsr r5, %[a], #16\n\t"
  63609. #endif
  63610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63611. "lsrs r6, r7, #16\n\t"
  63612. #else
  63613. "lsr r6, r7, #16\n\t"
  63614. #endif
  63615. #ifdef WOLFSSL_KEIL
  63616. "muls r6, r5, r6\n\t"
  63617. #elif defined(__clang__)
  63618. "muls r6, r5\n\t"
  63619. #else
  63620. "mul r6, r5\n\t"
  63621. #endif
  63622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63623. "adds r3, r3, r6\n\t"
  63624. #else
  63625. "add r3, r3, r6\n\t"
  63626. #endif
  63627. #ifdef WOLFSSL_KEIL
  63628. "adcs r4, r4, %[r]\n\t"
  63629. #elif defined(__clang__)
  63630. "adcs r4, %[r]\n\t"
  63631. #else
  63632. "adc r4, %[r]\n\t"
  63633. #endif
  63634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63635. "adds r3, r3, r6\n\t"
  63636. #else
  63637. "add r3, r3, r6\n\t"
  63638. #endif
  63639. #ifdef WOLFSSL_KEIL
  63640. "adcs r4, r4, %[r]\n\t"
  63641. #elif defined(__clang__)
  63642. "adcs r4, %[r]\n\t"
  63643. #else
  63644. "adc r4, %[r]\n\t"
  63645. #endif
  63646. "uxth r6, r7\n\t"
  63647. #ifdef WOLFSSL_KEIL
  63648. "muls r5, r6, r5\n\t"
  63649. #elif defined(__clang__)
  63650. "muls r5, r6\n\t"
  63651. #else
  63652. "mul r5, r6\n\t"
  63653. #endif
  63654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63655. "lsrs r6, r5, #16\n\t"
  63656. #else
  63657. "lsr r6, r5, #16\n\t"
  63658. #endif
  63659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63660. "lsls r5, r5, #16\n\t"
  63661. #else
  63662. "lsl r5, r5, #16\n\t"
  63663. #endif
  63664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63665. "adds r2, r2, r5\n\t"
  63666. #else
  63667. "add r2, r2, r5\n\t"
  63668. #endif
  63669. #ifdef WOLFSSL_KEIL
  63670. "adcs r3, r3, r6\n\t"
  63671. #elif defined(__clang__)
  63672. "adcs r3, r6\n\t"
  63673. #else
  63674. "adc r3, r6\n\t"
  63675. #endif
  63676. #ifdef WOLFSSL_KEIL
  63677. "adcs r4, r4, %[r]\n\t"
  63678. #elif defined(__clang__)
  63679. "adcs r4, %[r]\n\t"
  63680. #else
  63681. "adc r4, %[r]\n\t"
  63682. #endif
  63683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63684. "adds r2, r2, r5\n\t"
  63685. #else
  63686. "add r2, r2, r5\n\t"
  63687. #endif
  63688. #ifdef WOLFSSL_KEIL
  63689. "adcs r3, r3, r6\n\t"
  63690. #elif defined(__clang__)
  63691. "adcs r3, r6\n\t"
  63692. #else
  63693. "adc r3, r6\n\t"
  63694. #endif
  63695. #ifdef WOLFSSL_KEIL
  63696. "adcs r4, r4, %[r]\n\t"
  63697. #elif defined(__clang__)
  63698. "adcs r4, %[r]\n\t"
  63699. #else
  63700. "adc r4, %[r]\n\t"
  63701. #endif
  63702. "# A[8] * A[4]\n\t"
  63703. "mov %[a], r9\n\t"
  63704. "ldr r7, [%[a], #16]\n\t"
  63705. "ldr %[a], [%[a], #32]\n\t"
  63706. "uxth r5, %[a]\n\t"
  63707. "uxth r6, r7\n\t"
  63708. #ifdef WOLFSSL_KEIL
  63709. "muls r6, r5, r6\n\t"
  63710. #elif defined(__clang__)
  63711. "muls r6, r5\n\t"
  63712. #else
  63713. "mul r6, r5\n\t"
  63714. #endif
  63715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63716. "adds r2, r2, r6\n\t"
  63717. #else
  63718. "add r2, r2, r6\n\t"
  63719. #endif
  63720. #ifdef WOLFSSL_KEIL
  63721. "adcs r3, r3, %[r]\n\t"
  63722. #elif defined(__clang__)
  63723. "adcs r3, %[r]\n\t"
  63724. #else
  63725. "adc r3, %[r]\n\t"
  63726. #endif
  63727. #ifdef WOLFSSL_KEIL
  63728. "adcs r4, r4, %[r]\n\t"
  63729. #elif defined(__clang__)
  63730. "adcs r4, %[r]\n\t"
  63731. #else
  63732. "adc r4, %[r]\n\t"
  63733. #endif
  63734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63735. "adds r2, r2, r6\n\t"
  63736. #else
  63737. "add r2, r2, r6\n\t"
  63738. #endif
  63739. #ifdef WOLFSSL_KEIL
  63740. "adcs r3, r3, %[r]\n\t"
  63741. #elif defined(__clang__)
  63742. "adcs r3, %[r]\n\t"
  63743. #else
  63744. "adc r3, %[r]\n\t"
  63745. #endif
  63746. #ifdef WOLFSSL_KEIL
  63747. "adcs r4, r4, %[r]\n\t"
  63748. #elif defined(__clang__)
  63749. "adcs r4, %[r]\n\t"
  63750. #else
  63751. "adc r4, %[r]\n\t"
  63752. #endif
  63753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63754. "lsrs r6, r7, #16\n\t"
  63755. #else
  63756. "lsr r6, r7, #16\n\t"
  63757. #endif
  63758. #ifdef WOLFSSL_KEIL
  63759. "muls r5, r6, r5\n\t"
  63760. #elif defined(__clang__)
  63761. "muls r5, r6\n\t"
  63762. #else
  63763. "mul r5, r6\n\t"
  63764. #endif
  63765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63766. "lsrs r6, r5, #16\n\t"
  63767. #else
  63768. "lsr r6, r5, #16\n\t"
  63769. #endif
  63770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63771. "lsls r5, r5, #16\n\t"
  63772. #else
  63773. "lsl r5, r5, #16\n\t"
  63774. #endif
  63775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63776. "adds r2, r2, r5\n\t"
  63777. #else
  63778. "add r2, r2, r5\n\t"
  63779. #endif
  63780. #ifdef WOLFSSL_KEIL
  63781. "adcs r3, r3, r6\n\t"
  63782. #elif defined(__clang__)
  63783. "adcs r3, r6\n\t"
  63784. #else
  63785. "adc r3, r6\n\t"
  63786. #endif
  63787. #ifdef WOLFSSL_KEIL
  63788. "adcs r4, r4, %[r]\n\t"
  63789. #elif defined(__clang__)
  63790. "adcs r4, %[r]\n\t"
  63791. #else
  63792. "adc r4, %[r]\n\t"
  63793. #endif
  63794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63795. "adds r2, r2, r5\n\t"
  63796. #else
  63797. "add r2, r2, r5\n\t"
  63798. #endif
  63799. #ifdef WOLFSSL_KEIL
  63800. "adcs r3, r3, r6\n\t"
  63801. #elif defined(__clang__)
  63802. "adcs r3, r6\n\t"
  63803. #else
  63804. "adc r3, r6\n\t"
  63805. #endif
  63806. #ifdef WOLFSSL_KEIL
  63807. "adcs r4, r4, %[r]\n\t"
  63808. #elif defined(__clang__)
  63809. "adcs r4, %[r]\n\t"
  63810. #else
  63811. "adc r4, %[r]\n\t"
  63812. #endif
  63813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63814. "lsrs r5, %[a], #16\n\t"
  63815. #else
  63816. "lsr r5, %[a], #16\n\t"
  63817. #endif
  63818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63819. "lsrs r6, r7, #16\n\t"
  63820. #else
  63821. "lsr r6, r7, #16\n\t"
  63822. #endif
  63823. #ifdef WOLFSSL_KEIL
  63824. "muls r6, r5, r6\n\t"
  63825. #elif defined(__clang__)
  63826. "muls r6, r5\n\t"
  63827. #else
  63828. "mul r6, r5\n\t"
  63829. #endif
  63830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63831. "adds r3, r3, r6\n\t"
  63832. #else
  63833. "add r3, r3, r6\n\t"
  63834. #endif
  63835. #ifdef WOLFSSL_KEIL
  63836. "adcs r4, r4, %[r]\n\t"
  63837. #elif defined(__clang__)
  63838. "adcs r4, %[r]\n\t"
  63839. #else
  63840. "adc r4, %[r]\n\t"
  63841. #endif
  63842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63843. "adds r3, r3, r6\n\t"
  63844. #else
  63845. "add r3, r3, r6\n\t"
  63846. #endif
  63847. #ifdef WOLFSSL_KEIL
  63848. "adcs r4, r4, %[r]\n\t"
  63849. #elif defined(__clang__)
  63850. "adcs r4, %[r]\n\t"
  63851. #else
  63852. "adc r4, %[r]\n\t"
  63853. #endif
  63854. "uxth r6, r7\n\t"
  63855. #ifdef WOLFSSL_KEIL
  63856. "muls r5, r6, r5\n\t"
  63857. #elif defined(__clang__)
  63858. "muls r5, r6\n\t"
  63859. #else
  63860. "mul r5, r6\n\t"
  63861. #endif
  63862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63863. "lsrs r6, r5, #16\n\t"
  63864. #else
  63865. "lsr r6, r5, #16\n\t"
  63866. #endif
  63867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63868. "lsls r5, r5, #16\n\t"
  63869. #else
  63870. "lsl r5, r5, #16\n\t"
  63871. #endif
  63872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63873. "adds r2, r2, r5\n\t"
  63874. #else
  63875. "add r2, r2, r5\n\t"
  63876. #endif
  63877. #ifdef WOLFSSL_KEIL
  63878. "adcs r3, r3, r6\n\t"
  63879. #elif defined(__clang__)
  63880. "adcs r3, r6\n\t"
  63881. #else
  63882. "adc r3, r6\n\t"
  63883. #endif
  63884. #ifdef WOLFSSL_KEIL
  63885. "adcs r4, r4, %[r]\n\t"
  63886. #elif defined(__clang__)
  63887. "adcs r4, %[r]\n\t"
  63888. #else
  63889. "adc r4, %[r]\n\t"
  63890. #endif
  63891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63892. "adds r2, r2, r5\n\t"
  63893. #else
  63894. "add r2, r2, r5\n\t"
  63895. #endif
  63896. #ifdef WOLFSSL_KEIL
  63897. "adcs r3, r3, r6\n\t"
  63898. #elif defined(__clang__)
  63899. "adcs r3, r6\n\t"
  63900. #else
  63901. "adc r3, r6\n\t"
  63902. #endif
  63903. #ifdef WOLFSSL_KEIL
  63904. "adcs r4, r4, %[r]\n\t"
  63905. #elif defined(__clang__)
  63906. "adcs r4, %[r]\n\t"
  63907. #else
  63908. "adc r4, %[r]\n\t"
  63909. #endif
  63910. "# A[7] * A[5]\n\t"
  63911. "mov %[a], r9\n\t"
  63912. "ldr r7, [%[a], #20]\n\t"
  63913. "ldr %[a], [%[a], #28]\n\t"
  63914. "uxth r5, %[a]\n\t"
  63915. "uxth r6, r7\n\t"
  63916. #ifdef WOLFSSL_KEIL
  63917. "muls r6, r5, r6\n\t"
  63918. #elif defined(__clang__)
  63919. "muls r6, r5\n\t"
  63920. #else
  63921. "mul r6, r5\n\t"
  63922. #endif
  63923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63924. "adds r2, r2, r6\n\t"
  63925. #else
  63926. "add r2, r2, r6\n\t"
  63927. #endif
  63928. #ifdef WOLFSSL_KEIL
  63929. "adcs r3, r3, %[r]\n\t"
  63930. #elif defined(__clang__)
  63931. "adcs r3, %[r]\n\t"
  63932. #else
  63933. "adc r3, %[r]\n\t"
  63934. #endif
  63935. #ifdef WOLFSSL_KEIL
  63936. "adcs r4, r4, %[r]\n\t"
  63937. #elif defined(__clang__)
  63938. "adcs r4, %[r]\n\t"
  63939. #else
  63940. "adc r4, %[r]\n\t"
  63941. #endif
  63942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63943. "adds r2, r2, r6\n\t"
  63944. #else
  63945. "add r2, r2, r6\n\t"
  63946. #endif
  63947. #ifdef WOLFSSL_KEIL
  63948. "adcs r3, r3, %[r]\n\t"
  63949. #elif defined(__clang__)
  63950. "adcs r3, %[r]\n\t"
  63951. #else
  63952. "adc r3, %[r]\n\t"
  63953. #endif
  63954. #ifdef WOLFSSL_KEIL
  63955. "adcs r4, r4, %[r]\n\t"
  63956. #elif defined(__clang__)
  63957. "adcs r4, %[r]\n\t"
  63958. #else
  63959. "adc r4, %[r]\n\t"
  63960. #endif
  63961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63962. "lsrs r6, r7, #16\n\t"
  63963. #else
  63964. "lsr r6, r7, #16\n\t"
  63965. #endif
  63966. #ifdef WOLFSSL_KEIL
  63967. "muls r5, r6, r5\n\t"
  63968. #elif defined(__clang__)
  63969. "muls r5, r6\n\t"
  63970. #else
  63971. "mul r5, r6\n\t"
  63972. #endif
  63973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63974. "lsrs r6, r5, #16\n\t"
  63975. #else
  63976. "lsr r6, r5, #16\n\t"
  63977. #endif
  63978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63979. "lsls r5, r5, #16\n\t"
  63980. #else
  63981. "lsl r5, r5, #16\n\t"
  63982. #endif
  63983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63984. "adds r2, r2, r5\n\t"
  63985. #else
  63986. "add r2, r2, r5\n\t"
  63987. #endif
  63988. #ifdef WOLFSSL_KEIL
  63989. "adcs r3, r3, r6\n\t"
  63990. #elif defined(__clang__)
  63991. "adcs r3, r6\n\t"
  63992. #else
  63993. "adc r3, r6\n\t"
  63994. #endif
  63995. #ifdef WOLFSSL_KEIL
  63996. "adcs r4, r4, %[r]\n\t"
  63997. #elif defined(__clang__)
  63998. "adcs r4, %[r]\n\t"
  63999. #else
  64000. "adc r4, %[r]\n\t"
  64001. #endif
  64002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64003. "adds r2, r2, r5\n\t"
  64004. #else
  64005. "add r2, r2, r5\n\t"
  64006. #endif
  64007. #ifdef WOLFSSL_KEIL
  64008. "adcs r3, r3, r6\n\t"
  64009. #elif defined(__clang__)
  64010. "adcs r3, r6\n\t"
  64011. #else
  64012. "adc r3, r6\n\t"
  64013. #endif
  64014. #ifdef WOLFSSL_KEIL
  64015. "adcs r4, r4, %[r]\n\t"
  64016. #elif defined(__clang__)
  64017. "adcs r4, %[r]\n\t"
  64018. #else
  64019. "adc r4, %[r]\n\t"
  64020. #endif
  64021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64022. "lsrs r5, %[a], #16\n\t"
  64023. #else
  64024. "lsr r5, %[a], #16\n\t"
  64025. #endif
  64026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64027. "lsrs r6, r7, #16\n\t"
  64028. #else
  64029. "lsr r6, r7, #16\n\t"
  64030. #endif
  64031. #ifdef WOLFSSL_KEIL
  64032. "muls r6, r5, r6\n\t"
  64033. #elif defined(__clang__)
  64034. "muls r6, r5\n\t"
  64035. #else
  64036. "mul r6, r5\n\t"
  64037. #endif
  64038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64039. "adds r3, r3, r6\n\t"
  64040. #else
  64041. "add r3, r3, r6\n\t"
  64042. #endif
  64043. #ifdef WOLFSSL_KEIL
  64044. "adcs r4, r4, %[r]\n\t"
  64045. #elif defined(__clang__)
  64046. "adcs r4, %[r]\n\t"
  64047. #else
  64048. "adc r4, %[r]\n\t"
  64049. #endif
  64050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64051. "adds r3, r3, r6\n\t"
  64052. #else
  64053. "add r3, r3, r6\n\t"
  64054. #endif
  64055. #ifdef WOLFSSL_KEIL
  64056. "adcs r4, r4, %[r]\n\t"
  64057. #elif defined(__clang__)
  64058. "adcs r4, %[r]\n\t"
  64059. #else
  64060. "adc r4, %[r]\n\t"
  64061. #endif
  64062. "uxth r6, r7\n\t"
  64063. #ifdef WOLFSSL_KEIL
  64064. "muls r5, r6, r5\n\t"
  64065. #elif defined(__clang__)
  64066. "muls r5, r6\n\t"
  64067. #else
  64068. "mul r5, r6\n\t"
  64069. #endif
  64070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64071. "lsrs r6, r5, #16\n\t"
  64072. #else
  64073. "lsr r6, r5, #16\n\t"
  64074. #endif
  64075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64076. "lsls r5, r5, #16\n\t"
  64077. #else
  64078. "lsl r5, r5, #16\n\t"
  64079. #endif
  64080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64081. "adds r2, r2, r5\n\t"
  64082. #else
  64083. "add r2, r2, r5\n\t"
  64084. #endif
  64085. #ifdef WOLFSSL_KEIL
  64086. "adcs r3, r3, r6\n\t"
  64087. #elif defined(__clang__)
  64088. "adcs r3, r6\n\t"
  64089. #else
  64090. "adc r3, r6\n\t"
  64091. #endif
  64092. #ifdef WOLFSSL_KEIL
  64093. "adcs r4, r4, %[r]\n\t"
  64094. #elif defined(__clang__)
  64095. "adcs r4, %[r]\n\t"
  64096. #else
  64097. "adc r4, %[r]\n\t"
  64098. #endif
  64099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64100. "adds r2, r2, r5\n\t"
  64101. #else
  64102. "add r2, r2, r5\n\t"
  64103. #endif
  64104. #ifdef WOLFSSL_KEIL
  64105. "adcs r3, r3, r6\n\t"
  64106. #elif defined(__clang__)
  64107. "adcs r3, r6\n\t"
  64108. #else
  64109. "adc r3, r6\n\t"
  64110. #endif
  64111. #ifdef WOLFSSL_KEIL
  64112. "adcs r4, r4, %[r]\n\t"
  64113. #elif defined(__clang__)
  64114. "adcs r4, %[r]\n\t"
  64115. #else
  64116. "adc r4, %[r]\n\t"
  64117. #endif
  64118. "# A[6] * A[6]\n\t"
  64119. "mov %[a], r9\n\t"
  64120. "ldr r7, [%[a], #24]\n\t"
  64121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64122. "lsrs r6, r7, #16\n\t"
  64123. #else
  64124. "lsr r6, r7, #16\n\t"
  64125. #endif
  64126. "uxth r5, r7\n\t"
  64127. #ifdef WOLFSSL_KEIL
  64128. "muls r5, r5, r5\n\t"
  64129. #elif defined(__clang__)
  64130. "muls r5, r5\n\t"
  64131. #else
  64132. "mul r5, r5\n\t"
  64133. #endif
  64134. #ifdef WOLFSSL_KEIL
  64135. "muls r6, r6, r6\n\t"
  64136. #elif defined(__clang__)
  64137. "muls r6, r6\n\t"
  64138. #else
  64139. "mul r6, r6\n\t"
  64140. #endif
  64141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64142. "adds r2, r2, r5\n\t"
  64143. #else
  64144. "add r2, r2, r5\n\t"
  64145. #endif
  64146. #ifdef WOLFSSL_KEIL
  64147. "adcs r3, r3, r6\n\t"
  64148. #elif defined(__clang__)
  64149. "adcs r3, r6\n\t"
  64150. #else
  64151. "adc r3, r6\n\t"
  64152. #endif
  64153. #ifdef WOLFSSL_KEIL
  64154. "adcs r4, r4, %[r]\n\t"
  64155. #elif defined(__clang__)
  64156. "adcs r4, %[r]\n\t"
  64157. #else
  64158. "adc r4, %[r]\n\t"
  64159. #endif
  64160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64161. "lsrs r6, r7, #16\n\t"
  64162. #else
  64163. "lsr r6, r7, #16\n\t"
  64164. #endif
  64165. "uxth r5, r7\n\t"
  64166. #ifdef WOLFSSL_KEIL
  64167. "muls r5, r6, r5\n\t"
  64168. #elif defined(__clang__)
  64169. "muls r5, r6\n\t"
  64170. #else
  64171. "mul r5, r6\n\t"
  64172. #endif
  64173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64174. "lsrs r6, r5, #15\n\t"
  64175. #else
  64176. "lsr r6, r5, #15\n\t"
  64177. #endif
  64178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64179. "lsls r5, r5, #17\n\t"
  64180. #else
  64181. "lsl r5, r5, #17\n\t"
  64182. #endif
  64183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64184. "adds r2, r2, r5\n\t"
  64185. #else
  64186. "add r2, r2, r5\n\t"
  64187. #endif
  64188. #ifdef WOLFSSL_KEIL
  64189. "adcs r3, r3, r6\n\t"
  64190. #elif defined(__clang__)
  64191. "adcs r3, r6\n\t"
  64192. #else
  64193. "adc r3, r6\n\t"
  64194. #endif
  64195. #ifdef WOLFSSL_KEIL
  64196. "adcs r4, r4, %[r]\n\t"
  64197. #elif defined(__clang__)
  64198. "adcs r4, %[r]\n\t"
  64199. #else
  64200. "adc r4, %[r]\n\t"
  64201. #endif
  64202. "mov %[r], r8\n\t"
  64203. "str r2, [%[r], #48]\n\t"
  64204. "movs %[r], #0\n\t"
  64205. "movs %[a], #32\n\t"
  64206. "add %[a], %[a], r9\n\t"
  64207. "ldm %[a]!, {r5, r6}\n\t"
  64208. "mov r10, r5\n\t"
  64209. "mov r11, r6\n\t"
  64210. "ldm %[a]!, {r5, r6}\n\t"
  64211. "mov r12, r5\n\t"
  64212. "mov lr, r6\n\t"
  64213. "mov %[a], r9\n\t"
  64214. "# A[7] * A[6]\n\t"
  64215. "movs r2, #0\n\t"
  64216. "ldr %[a], [%[a], #28]\n\t"
  64217. "uxth r5, %[a]\n\t"
  64218. "uxth r6, r7\n\t"
  64219. #ifdef WOLFSSL_KEIL
  64220. "muls r6, r5, r6\n\t"
  64221. #elif defined(__clang__)
  64222. "muls r6, r5\n\t"
  64223. #else
  64224. "mul r6, r5\n\t"
  64225. #endif
  64226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64227. "adds r3, r3, r6\n\t"
  64228. #else
  64229. "add r3, r3, r6\n\t"
  64230. #endif
  64231. #ifdef WOLFSSL_KEIL
  64232. "adcs r4, r4, %[r]\n\t"
  64233. #elif defined(__clang__)
  64234. "adcs r4, %[r]\n\t"
  64235. #else
  64236. "adc r4, %[r]\n\t"
  64237. #endif
  64238. #ifdef WOLFSSL_KEIL
  64239. "adcs r2, r2, %[r]\n\t"
  64240. #elif defined(__clang__)
  64241. "adcs r2, %[r]\n\t"
  64242. #else
  64243. "adc r2, %[r]\n\t"
  64244. #endif
  64245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64246. "adds r3, r3, r6\n\t"
  64247. #else
  64248. "add r3, r3, r6\n\t"
  64249. #endif
  64250. #ifdef WOLFSSL_KEIL
  64251. "adcs r4, r4, %[r]\n\t"
  64252. #elif defined(__clang__)
  64253. "adcs r4, %[r]\n\t"
  64254. #else
  64255. "adc r4, %[r]\n\t"
  64256. #endif
  64257. #ifdef WOLFSSL_KEIL
  64258. "adcs r2, r2, %[r]\n\t"
  64259. #elif defined(__clang__)
  64260. "adcs r2, %[r]\n\t"
  64261. #else
  64262. "adc r2, %[r]\n\t"
  64263. #endif
  64264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64265. "lsrs r6, r7, #16\n\t"
  64266. #else
  64267. "lsr r6, r7, #16\n\t"
  64268. #endif
  64269. #ifdef WOLFSSL_KEIL
  64270. "muls r5, r6, r5\n\t"
  64271. #elif defined(__clang__)
  64272. "muls r5, r6\n\t"
  64273. #else
  64274. "mul r5, r6\n\t"
  64275. #endif
  64276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64277. "lsrs r6, r5, #16\n\t"
  64278. #else
  64279. "lsr r6, r5, #16\n\t"
  64280. #endif
  64281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64282. "lsls r5, r5, #16\n\t"
  64283. #else
  64284. "lsl r5, r5, #16\n\t"
  64285. #endif
  64286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64287. "adds r3, r3, r5\n\t"
  64288. #else
  64289. "add r3, r3, r5\n\t"
  64290. #endif
  64291. #ifdef WOLFSSL_KEIL
  64292. "adcs r4, r4, r6\n\t"
  64293. #elif defined(__clang__)
  64294. "adcs r4, r6\n\t"
  64295. #else
  64296. "adc r4, r6\n\t"
  64297. #endif
  64298. #ifdef WOLFSSL_KEIL
  64299. "adcs r2, r2, %[r]\n\t"
  64300. #elif defined(__clang__)
  64301. "adcs r2, %[r]\n\t"
  64302. #else
  64303. "adc r2, %[r]\n\t"
  64304. #endif
  64305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64306. "adds r3, r3, r5\n\t"
  64307. #else
  64308. "add r3, r3, r5\n\t"
  64309. #endif
  64310. #ifdef WOLFSSL_KEIL
  64311. "adcs r4, r4, r6\n\t"
  64312. #elif defined(__clang__)
  64313. "adcs r4, r6\n\t"
  64314. #else
  64315. "adc r4, r6\n\t"
  64316. #endif
  64317. #ifdef WOLFSSL_KEIL
  64318. "adcs r2, r2, %[r]\n\t"
  64319. #elif defined(__clang__)
  64320. "adcs r2, %[r]\n\t"
  64321. #else
  64322. "adc r2, %[r]\n\t"
  64323. #endif
  64324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64325. "lsrs r5, %[a], #16\n\t"
  64326. #else
  64327. "lsr r5, %[a], #16\n\t"
  64328. #endif
  64329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64330. "lsrs r6, r7, #16\n\t"
  64331. #else
  64332. "lsr r6, r7, #16\n\t"
  64333. #endif
  64334. #ifdef WOLFSSL_KEIL
  64335. "muls r6, r5, r6\n\t"
  64336. #elif defined(__clang__)
  64337. "muls r6, r5\n\t"
  64338. #else
  64339. "mul r6, r5\n\t"
  64340. #endif
  64341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64342. "adds r4, r4, r6\n\t"
  64343. #else
  64344. "add r4, r4, r6\n\t"
  64345. #endif
  64346. #ifdef WOLFSSL_KEIL
  64347. "adcs r2, r2, %[r]\n\t"
  64348. #elif defined(__clang__)
  64349. "adcs r2, %[r]\n\t"
  64350. #else
  64351. "adc r2, %[r]\n\t"
  64352. #endif
  64353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64354. "adds r4, r4, r6\n\t"
  64355. #else
  64356. "add r4, r4, r6\n\t"
  64357. #endif
  64358. #ifdef WOLFSSL_KEIL
  64359. "adcs r2, r2, %[r]\n\t"
  64360. #elif defined(__clang__)
  64361. "adcs r2, %[r]\n\t"
  64362. #else
  64363. "adc r2, %[r]\n\t"
  64364. #endif
  64365. "uxth r6, r7\n\t"
  64366. #ifdef WOLFSSL_KEIL
  64367. "muls r5, r6, r5\n\t"
  64368. #elif defined(__clang__)
  64369. "muls r5, r6\n\t"
  64370. #else
  64371. "mul r5, r6\n\t"
  64372. #endif
  64373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64374. "lsrs r6, r5, #16\n\t"
  64375. #else
  64376. "lsr r6, r5, #16\n\t"
  64377. #endif
  64378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64379. "lsls r5, r5, #16\n\t"
  64380. #else
  64381. "lsl r5, r5, #16\n\t"
  64382. #endif
  64383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64384. "adds r3, r3, r5\n\t"
  64385. #else
  64386. "add r3, r3, r5\n\t"
  64387. #endif
  64388. #ifdef WOLFSSL_KEIL
  64389. "adcs r4, r4, r6\n\t"
  64390. #elif defined(__clang__)
  64391. "adcs r4, r6\n\t"
  64392. #else
  64393. "adc r4, r6\n\t"
  64394. #endif
  64395. #ifdef WOLFSSL_KEIL
  64396. "adcs r2, r2, %[r]\n\t"
  64397. #elif defined(__clang__)
  64398. "adcs r2, %[r]\n\t"
  64399. #else
  64400. "adc r2, %[r]\n\t"
  64401. #endif
  64402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64403. "adds r3, r3, r5\n\t"
  64404. #else
  64405. "add r3, r3, r5\n\t"
  64406. #endif
  64407. #ifdef WOLFSSL_KEIL
  64408. "adcs r4, r4, r6\n\t"
  64409. #elif defined(__clang__)
  64410. "adcs r4, r6\n\t"
  64411. #else
  64412. "adc r4, r6\n\t"
  64413. #endif
  64414. #ifdef WOLFSSL_KEIL
  64415. "adcs r2, r2, %[r]\n\t"
  64416. #elif defined(__clang__)
  64417. "adcs r2, %[r]\n\t"
  64418. #else
  64419. "adc r2, %[r]\n\t"
  64420. #endif
  64421. "# A[8] * A[5]\n\t"
  64422. "mov %[a], r9\n\t"
  64423. "ldr r7, [%[a], #20]\n\t"
  64424. "mov %[a], r10\n\t"
  64425. "uxth r5, %[a]\n\t"
  64426. "uxth r6, r7\n\t"
  64427. #ifdef WOLFSSL_KEIL
  64428. "muls r6, r5, r6\n\t"
  64429. #elif defined(__clang__)
  64430. "muls r6, r5\n\t"
  64431. #else
  64432. "mul r6, r5\n\t"
  64433. #endif
  64434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64435. "adds r3, r3, r6\n\t"
  64436. #else
  64437. "add r3, r3, r6\n\t"
  64438. #endif
  64439. #ifdef WOLFSSL_KEIL
  64440. "adcs r4, r4, %[r]\n\t"
  64441. #elif defined(__clang__)
  64442. "adcs r4, %[r]\n\t"
  64443. #else
  64444. "adc r4, %[r]\n\t"
  64445. #endif
  64446. #ifdef WOLFSSL_KEIL
  64447. "adcs r2, r2, %[r]\n\t"
  64448. #elif defined(__clang__)
  64449. "adcs r2, %[r]\n\t"
  64450. #else
  64451. "adc r2, %[r]\n\t"
  64452. #endif
  64453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64454. "adds r3, r3, r6\n\t"
  64455. #else
  64456. "add r3, r3, r6\n\t"
  64457. #endif
  64458. #ifdef WOLFSSL_KEIL
  64459. "adcs r4, r4, %[r]\n\t"
  64460. #elif defined(__clang__)
  64461. "adcs r4, %[r]\n\t"
  64462. #else
  64463. "adc r4, %[r]\n\t"
  64464. #endif
  64465. #ifdef WOLFSSL_KEIL
  64466. "adcs r2, r2, %[r]\n\t"
  64467. #elif defined(__clang__)
  64468. "adcs r2, %[r]\n\t"
  64469. #else
  64470. "adc r2, %[r]\n\t"
  64471. #endif
  64472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64473. "lsrs r6, r7, #16\n\t"
  64474. #else
  64475. "lsr r6, r7, #16\n\t"
  64476. #endif
  64477. #ifdef WOLFSSL_KEIL
  64478. "muls r5, r6, r5\n\t"
  64479. #elif defined(__clang__)
  64480. "muls r5, r6\n\t"
  64481. #else
  64482. "mul r5, r6\n\t"
  64483. #endif
  64484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64485. "lsrs r6, r5, #16\n\t"
  64486. #else
  64487. "lsr r6, r5, #16\n\t"
  64488. #endif
  64489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64490. "lsls r5, r5, #16\n\t"
  64491. #else
  64492. "lsl r5, r5, #16\n\t"
  64493. #endif
  64494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64495. "adds r3, r3, r5\n\t"
  64496. #else
  64497. "add r3, r3, r5\n\t"
  64498. #endif
  64499. #ifdef WOLFSSL_KEIL
  64500. "adcs r4, r4, r6\n\t"
  64501. #elif defined(__clang__)
  64502. "adcs r4, r6\n\t"
  64503. #else
  64504. "adc r4, r6\n\t"
  64505. #endif
  64506. #ifdef WOLFSSL_KEIL
  64507. "adcs r2, r2, %[r]\n\t"
  64508. #elif defined(__clang__)
  64509. "adcs r2, %[r]\n\t"
  64510. #else
  64511. "adc r2, %[r]\n\t"
  64512. #endif
  64513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64514. "adds r3, r3, r5\n\t"
  64515. #else
  64516. "add r3, r3, r5\n\t"
  64517. #endif
  64518. #ifdef WOLFSSL_KEIL
  64519. "adcs r4, r4, r6\n\t"
  64520. #elif defined(__clang__)
  64521. "adcs r4, r6\n\t"
  64522. #else
  64523. "adc r4, r6\n\t"
  64524. #endif
  64525. #ifdef WOLFSSL_KEIL
  64526. "adcs r2, r2, %[r]\n\t"
  64527. #elif defined(__clang__)
  64528. "adcs r2, %[r]\n\t"
  64529. #else
  64530. "adc r2, %[r]\n\t"
  64531. #endif
  64532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64533. "lsrs r5, %[a], #16\n\t"
  64534. #else
  64535. "lsr r5, %[a], #16\n\t"
  64536. #endif
  64537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64538. "lsrs r6, r7, #16\n\t"
  64539. #else
  64540. "lsr r6, r7, #16\n\t"
  64541. #endif
  64542. #ifdef WOLFSSL_KEIL
  64543. "muls r6, r5, r6\n\t"
  64544. #elif defined(__clang__)
  64545. "muls r6, r5\n\t"
  64546. #else
  64547. "mul r6, r5\n\t"
  64548. #endif
  64549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64550. "adds r4, r4, r6\n\t"
  64551. #else
  64552. "add r4, r4, r6\n\t"
  64553. #endif
  64554. #ifdef WOLFSSL_KEIL
  64555. "adcs r2, r2, %[r]\n\t"
  64556. #elif defined(__clang__)
  64557. "adcs r2, %[r]\n\t"
  64558. #else
  64559. "adc r2, %[r]\n\t"
  64560. #endif
  64561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64562. "adds r4, r4, r6\n\t"
  64563. #else
  64564. "add r4, r4, r6\n\t"
  64565. #endif
  64566. #ifdef WOLFSSL_KEIL
  64567. "adcs r2, r2, %[r]\n\t"
  64568. #elif defined(__clang__)
  64569. "adcs r2, %[r]\n\t"
  64570. #else
  64571. "adc r2, %[r]\n\t"
  64572. #endif
  64573. "uxth r6, r7\n\t"
  64574. #ifdef WOLFSSL_KEIL
  64575. "muls r5, r6, r5\n\t"
  64576. #elif defined(__clang__)
  64577. "muls r5, r6\n\t"
  64578. #else
  64579. "mul r5, r6\n\t"
  64580. #endif
  64581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64582. "lsrs r6, r5, #16\n\t"
  64583. #else
  64584. "lsr r6, r5, #16\n\t"
  64585. #endif
  64586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64587. "lsls r5, r5, #16\n\t"
  64588. #else
  64589. "lsl r5, r5, #16\n\t"
  64590. #endif
  64591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64592. "adds r3, r3, r5\n\t"
  64593. #else
  64594. "add r3, r3, r5\n\t"
  64595. #endif
  64596. #ifdef WOLFSSL_KEIL
  64597. "adcs r4, r4, r6\n\t"
  64598. #elif defined(__clang__)
  64599. "adcs r4, r6\n\t"
  64600. #else
  64601. "adc r4, r6\n\t"
  64602. #endif
  64603. #ifdef WOLFSSL_KEIL
  64604. "adcs r2, r2, %[r]\n\t"
  64605. #elif defined(__clang__)
  64606. "adcs r2, %[r]\n\t"
  64607. #else
  64608. "adc r2, %[r]\n\t"
  64609. #endif
  64610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64611. "adds r3, r3, r5\n\t"
  64612. #else
  64613. "add r3, r3, r5\n\t"
  64614. #endif
  64615. #ifdef WOLFSSL_KEIL
  64616. "adcs r4, r4, r6\n\t"
  64617. #elif defined(__clang__)
  64618. "adcs r4, r6\n\t"
  64619. #else
  64620. "adc r4, r6\n\t"
  64621. #endif
  64622. #ifdef WOLFSSL_KEIL
  64623. "adcs r2, r2, %[r]\n\t"
  64624. #elif defined(__clang__)
  64625. "adcs r2, %[r]\n\t"
  64626. #else
  64627. "adc r2, %[r]\n\t"
  64628. #endif
  64629. "# A[9] * A[4]\n\t"
  64630. "mov %[a], r9\n\t"
  64631. "ldr r7, [%[a], #16]\n\t"
  64632. "mov %[a], r11\n\t"
  64633. "uxth r5, %[a]\n\t"
  64634. "uxth r6, r7\n\t"
  64635. #ifdef WOLFSSL_KEIL
  64636. "muls r6, r5, r6\n\t"
  64637. #elif defined(__clang__)
  64638. "muls r6, r5\n\t"
  64639. #else
  64640. "mul r6, r5\n\t"
  64641. #endif
  64642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64643. "adds r3, r3, r6\n\t"
  64644. #else
  64645. "add r3, r3, r6\n\t"
  64646. #endif
  64647. #ifdef WOLFSSL_KEIL
  64648. "adcs r4, r4, %[r]\n\t"
  64649. #elif defined(__clang__)
  64650. "adcs r4, %[r]\n\t"
  64651. #else
  64652. "adc r4, %[r]\n\t"
  64653. #endif
  64654. #ifdef WOLFSSL_KEIL
  64655. "adcs r2, r2, %[r]\n\t"
  64656. #elif defined(__clang__)
  64657. "adcs r2, %[r]\n\t"
  64658. #else
  64659. "adc r2, %[r]\n\t"
  64660. #endif
  64661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64662. "adds r3, r3, r6\n\t"
  64663. #else
  64664. "add r3, r3, r6\n\t"
  64665. #endif
  64666. #ifdef WOLFSSL_KEIL
  64667. "adcs r4, r4, %[r]\n\t"
  64668. #elif defined(__clang__)
  64669. "adcs r4, %[r]\n\t"
  64670. #else
  64671. "adc r4, %[r]\n\t"
  64672. #endif
  64673. #ifdef WOLFSSL_KEIL
  64674. "adcs r2, r2, %[r]\n\t"
  64675. #elif defined(__clang__)
  64676. "adcs r2, %[r]\n\t"
  64677. #else
  64678. "adc r2, %[r]\n\t"
  64679. #endif
  64680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64681. "lsrs r6, r7, #16\n\t"
  64682. #else
  64683. "lsr r6, r7, #16\n\t"
  64684. #endif
  64685. #ifdef WOLFSSL_KEIL
  64686. "muls r5, r6, r5\n\t"
  64687. #elif defined(__clang__)
  64688. "muls r5, r6\n\t"
  64689. #else
  64690. "mul r5, r6\n\t"
  64691. #endif
  64692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64693. "lsrs r6, r5, #16\n\t"
  64694. #else
  64695. "lsr r6, r5, #16\n\t"
  64696. #endif
  64697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64698. "lsls r5, r5, #16\n\t"
  64699. #else
  64700. "lsl r5, r5, #16\n\t"
  64701. #endif
  64702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64703. "adds r3, r3, r5\n\t"
  64704. #else
  64705. "add r3, r3, r5\n\t"
  64706. #endif
  64707. #ifdef WOLFSSL_KEIL
  64708. "adcs r4, r4, r6\n\t"
  64709. #elif defined(__clang__)
  64710. "adcs r4, r6\n\t"
  64711. #else
  64712. "adc r4, r6\n\t"
  64713. #endif
  64714. #ifdef WOLFSSL_KEIL
  64715. "adcs r2, r2, %[r]\n\t"
  64716. #elif defined(__clang__)
  64717. "adcs r2, %[r]\n\t"
  64718. #else
  64719. "adc r2, %[r]\n\t"
  64720. #endif
  64721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64722. "adds r3, r3, r5\n\t"
  64723. #else
  64724. "add r3, r3, r5\n\t"
  64725. #endif
  64726. #ifdef WOLFSSL_KEIL
  64727. "adcs r4, r4, r6\n\t"
  64728. #elif defined(__clang__)
  64729. "adcs r4, r6\n\t"
  64730. #else
  64731. "adc r4, r6\n\t"
  64732. #endif
  64733. #ifdef WOLFSSL_KEIL
  64734. "adcs r2, r2, %[r]\n\t"
  64735. #elif defined(__clang__)
  64736. "adcs r2, %[r]\n\t"
  64737. #else
  64738. "adc r2, %[r]\n\t"
  64739. #endif
  64740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64741. "lsrs r5, %[a], #16\n\t"
  64742. #else
  64743. "lsr r5, %[a], #16\n\t"
  64744. #endif
  64745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64746. "lsrs r6, r7, #16\n\t"
  64747. #else
  64748. "lsr r6, r7, #16\n\t"
  64749. #endif
  64750. #ifdef WOLFSSL_KEIL
  64751. "muls r6, r5, r6\n\t"
  64752. #elif defined(__clang__)
  64753. "muls r6, r5\n\t"
  64754. #else
  64755. "mul r6, r5\n\t"
  64756. #endif
  64757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64758. "adds r4, r4, r6\n\t"
  64759. #else
  64760. "add r4, r4, r6\n\t"
  64761. #endif
  64762. #ifdef WOLFSSL_KEIL
  64763. "adcs r2, r2, %[r]\n\t"
  64764. #elif defined(__clang__)
  64765. "adcs r2, %[r]\n\t"
  64766. #else
  64767. "adc r2, %[r]\n\t"
  64768. #endif
  64769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64770. "adds r4, r4, r6\n\t"
  64771. #else
  64772. "add r4, r4, r6\n\t"
  64773. #endif
  64774. #ifdef WOLFSSL_KEIL
  64775. "adcs r2, r2, %[r]\n\t"
  64776. #elif defined(__clang__)
  64777. "adcs r2, %[r]\n\t"
  64778. #else
  64779. "adc r2, %[r]\n\t"
  64780. #endif
  64781. "uxth r6, r7\n\t"
  64782. #ifdef WOLFSSL_KEIL
  64783. "muls r5, r6, r5\n\t"
  64784. #elif defined(__clang__)
  64785. "muls r5, r6\n\t"
  64786. #else
  64787. "mul r5, r6\n\t"
  64788. #endif
  64789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64790. "lsrs r6, r5, #16\n\t"
  64791. #else
  64792. "lsr r6, r5, #16\n\t"
  64793. #endif
  64794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64795. "lsls r5, r5, #16\n\t"
  64796. #else
  64797. "lsl r5, r5, #16\n\t"
  64798. #endif
  64799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64800. "adds r3, r3, r5\n\t"
  64801. #else
  64802. "add r3, r3, r5\n\t"
  64803. #endif
  64804. #ifdef WOLFSSL_KEIL
  64805. "adcs r4, r4, r6\n\t"
  64806. #elif defined(__clang__)
  64807. "adcs r4, r6\n\t"
  64808. #else
  64809. "adc r4, r6\n\t"
  64810. #endif
  64811. #ifdef WOLFSSL_KEIL
  64812. "adcs r2, r2, %[r]\n\t"
  64813. #elif defined(__clang__)
  64814. "adcs r2, %[r]\n\t"
  64815. #else
  64816. "adc r2, %[r]\n\t"
  64817. #endif
  64818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64819. "adds r3, r3, r5\n\t"
  64820. #else
  64821. "add r3, r3, r5\n\t"
  64822. #endif
  64823. #ifdef WOLFSSL_KEIL
  64824. "adcs r4, r4, r6\n\t"
  64825. #elif defined(__clang__)
  64826. "adcs r4, r6\n\t"
  64827. #else
  64828. "adc r4, r6\n\t"
  64829. #endif
  64830. #ifdef WOLFSSL_KEIL
  64831. "adcs r2, r2, %[r]\n\t"
  64832. #elif defined(__clang__)
  64833. "adcs r2, %[r]\n\t"
  64834. #else
  64835. "adc r2, %[r]\n\t"
  64836. #endif
  64837. "# A[10] * A[3]\n\t"
  64838. "mov %[a], r9\n\t"
  64839. "ldr r7, [%[a], #12]\n\t"
  64840. "mov %[a], r12\n\t"
  64841. "uxth r5, %[a]\n\t"
  64842. "uxth r6, r7\n\t"
  64843. #ifdef WOLFSSL_KEIL
  64844. "muls r6, r5, r6\n\t"
  64845. #elif defined(__clang__)
  64846. "muls r6, r5\n\t"
  64847. #else
  64848. "mul r6, r5\n\t"
  64849. #endif
  64850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64851. "adds r3, r3, r6\n\t"
  64852. #else
  64853. "add r3, r3, r6\n\t"
  64854. #endif
  64855. #ifdef WOLFSSL_KEIL
  64856. "adcs r4, r4, %[r]\n\t"
  64857. #elif defined(__clang__)
  64858. "adcs r4, %[r]\n\t"
  64859. #else
  64860. "adc r4, %[r]\n\t"
  64861. #endif
  64862. #ifdef WOLFSSL_KEIL
  64863. "adcs r2, r2, %[r]\n\t"
  64864. #elif defined(__clang__)
  64865. "adcs r2, %[r]\n\t"
  64866. #else
  64867. "adc r2, %[r]\n\t"
  64868. #endif
  64869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64870. "adds r3, r3, r6\n\t"
  64871. #else
  64872. "add r3, r3, r6\n\t"
  64873. #endif
  64874. #ifdef WOLFSSL_KEIL
  64875. "adcs r4, r4, %[r]\n\t"
  64876. #elif defined(__clang__)
  64877. "adcs r4, %[r]\n\t"
  64878. #else
  64879. "adc r4, %[r]\n\t"
  64880. #endif
  64881. #ifdef WOLFSSL_KEIL
  64882. "adcs r2, r2, %[r]\n\t"
  64883. #elif defined(__clang__)
  64884. "adcs r2, %[r]\n\t"
  64885. #else
  64886. "adc r2, %[r]\n\t"
  64887. #endif
  64888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64889. "lsrs r6, r7, #16\n\t"
  64890. #else
  64891. "lsr r6, r7, #16\n\t"
  64892. #endif
  64893. #ifdef WOLFSSL_KEIL
  64894. "muls r5, r6, r5\n\t"
  64895. #elif defined(__clang__)
  64896. "muls r5, r6\n\t"
  64897. #else
  64898. "mul r5, r6\n\t"
  64899. #endif
  64900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64901. "lsrs r6, r5, #16\n\t"
  64902. #else
  64903. "lsr r6, r5, #16\n\t"
  64904. #endif
  64905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64906. "lsls r5, r5, #16\n\t"
  64907. #else
  64908. "lsl r5, r5, #16\n\t"
  64909. #endif
  64910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64911. "adds r3, r3, r5\n\t"
  64912. #else
  64913. "add r3, r3, r5\n\t"
  64914. #endif
  64915. #ifdef WOLFSSL_KEIL
  64916. "adcs r4, r4, r6\n\t"
  64917. #elif defined(__clang__)
  64918. "adcs r4, r6\n\t"
  64919. #else
  64920. "adc r4, r6\n\t"
  64921. #endif
  64922. #ifdef WOLFSSL_KEIL
  64923. "adcs r2, r2, %[r]\n\t"
  64924. #elif defined(__clang__)
  64925. "adcs r2, %[r]\n\t"
  64926. #else
  64927. "adc r2, %[r]\n\t"
  64928. #endif
  64929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64930. "adds r3, r3, r5\n\t"
  64931. #else
  64932. "add r3, r3, r5\n\t"
  64933. #endif
  64934. #ifdef WOLFSSL_KEIL
  64935. "adcs r4, r4, r6\n\t"
  64936. #elif defined(__clang__)
  64937. "adcs r4, r6\n\t"
  64938. #else
  64939. "adc r4, r6\n\t"
  64940. #endif
  64941. #ifdef WOLFSSL_KEIL
  64942. "adcs r2, r2, %[r]\n\t"
  64943. #elif defined(__clang__)
  64944. "adcs r2, %[r]\n\t"
  64945. #else
  64946. "adc r2, %[r]\n\t"
  64947. #endif
  64948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64949. "lsrs r5, %[a], #16\n\t"
  64950. #else
  64951. "lsr r5, %[a], #16\n\t"
  64952. #endif
  64953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64954. "lsrs r6, r7, #16\n\t"
  64955. #else
  64956. "lsr r6, r7, #16\n\t"
  64957. #endif
  64958. #ifdef WOLFSSL_KEIL
  64959. "muls r6, r5, r6\n\t"
  64960. #elif defined(__clang__)
  64961. "muls r6, r5\n\t"
  64962. #else
  64963. "mul r6, r5\n\t"
  64964. #endif
  64965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64966. "adds r4, r4, r6\n\t"
  64967. #else
  64968. "add r4, r4, r6\n\t"
  64969. #endif
  64970. #ifdef WOLFSSL_KEIL
  64971. "adcs r2, r2, %[r]\n\t"
  64972. #elif defined(__clang__)
  64973. "adcs r2, %[r]\n\t"
  64974. #else
  64975. "adc r2, %[r]\n\t"
  64976. #endif
  64977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64978. "adds r4, r4, r6\n\t"
  64979. #else
  64980. "add r4, r4, r6\n\t"
  64981. #endif
  64982. #ifdef WOLFSSL_KEIL
  64983. "adcs r2, r2, %[r]\n\t"
  64984. #elif defined(__clang__)
  64985. "adcs r2, %[r]\n\t"
  64986. #else
  64987. "adc r2, %[r]\n\t"
  64988. #endif
  64989. "uxth r6, r7\n\t"
  64990. #ifdef WOLFSSL_KEIL
  64991. "muls r5, r6, r5\n\t"
  64992. #elif defined(__clang__)
  64993. "muls r5, r6\n\t"
  64994. #else
  64995. "mul r5, r6\n\t"
  64996. #endif
  64997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64998. "lsrs r6, r5, #16\n\t"
  64999. #else
  65000. "lsr r6, r5, #16\n\t"
  65001. #endif
  65002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65003. "lsls r5, r5, #16\n\t"
  65004. #else
  65005. "lsl r5, r5, #16\n\t"
  65006. #endif
  65007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65008. "adds r3, r3, r5\n\t"
  65009. #else
  65010. "add r3, r3, r5\n\t"
  65011. #endif
  65012. #ifdef WOLFSSL_KEIL
  65013. "adcs r4, r4, r6\n\t"
  65014. #elif defined(__clang__)
  65015. "adcs r4, r6\n\t"
  65016. #else
  65017. "adc r4, r6\n\t"
  65018. #endif
  65019. #ifdef WOLFSSL_KEIL
  65020. "adcs r2, r2, %[r]\n\t"
  65021. #elif defined(__clang__)
  65022. "adcs r2, %[r]\n\t"
  65023. #else
  65024. "adc r2, %[r]\n\t"
  65025. #endif
  65026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65027. "adds r3, r3, r5\n\t"
  65028. #else
  65029. "add r3, r3, r5\n\t"
  65030. #endif
  65031. #ifdef WOLFSSL_KEIL
  65032. "adcs r4, r4, r6\n\t"
  65033. #elif defined(__clang__)
  65034. "adcs r4, r6\n\t"
  65035. #else
  65036. "adc r4, r6\n\t"
  65037. #endif
  65038. #ifdef WOLFSSL_KEIL
  65039. "adcs r2, r2, %[r]\n\t"
  65040. #elif defined(__clang__)
  65041. "adcs r2, %[r]\n\t"
  65042. #else
  65043. "adc r2, %[r]\n\t"
  65044. #endif
  65045. "# A[11] * A[2]\n\t"
  65046. "mov %[a], r9\n\t"
  65047. "ldr r7, [%[a], #8]\n\t"
  65048. "mov %[a], lr\n\t"
  65049. "uxth r5, %[a]\n\t"
  65050. "uxth r6, r7\n\t"
  65051. #ifdef WOLFSSL_KEIL
  65052. "muls r6, r5, r6\n\t"
  65053. #elif defined(__clang__)
  65054. "muls r6, r5\n\t"
  65055. #else
  65056. "mul r6, r5\n\t"
  65057. #endif
  65058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65059. "adds r3, r3, r6\n\t"
  65060. #else
  65061. "add r3, r3, r6\n\t"
  65062. #endif
  65063. #ifdef WOLFSSL_KEIL
  65064. "adcs r4, r4, %[r]\n\t"
  65065. #elif defined(__clang__)
  65066. "adcs r4, %[r]\n\t"
  65067. #else
  65068. "adc r4, %[r]\n\t"
  65069. #endif
  65070. #ifdef WOLFSSL_KEIL
  65071. "adcs r2, r2, %[r]\n\t"
  65072. #elif defined(__clang__)
  65073. "adcs r2, %[r]\n\t"
  65074. #else
  65075. "adc r2, %[r]\n\t"
  65076. #endif
  65077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65078. "adds r3, r3, r6\n\t"
  65079. #else
  65080. "add r3, r3, r6\n\t"
  65081. #endif
  65082. #ifdef WOLFSSL_KEIL
  65083. "adcs r4, r4, %[r]\n\t"
  65084. #elif defined(__clang__)
  65085. "adcs r4, %[r]\n\t"
  65086. #else
  65087. "adc r4, %[r]\n\t"
  65088. #endif
  65089. #ifdef WOLFSSL_KEIL
  65090. "adcs r2, r2, %[r]\n\t"
  65091. #elif defined(__clang__)
  65092. "adcs r2, %[r]\n\t"
  65093. #else
  65094. "adc r2, %[r]\n\t"
  65095. #endif
  65096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65097. "lsrs r6, r7, #16\n\t"
  65098. #else
  65099. "lsr r6, r7, #16\n\t"
  65100. #endif
  65101. #ifdef WOLFSSL_KEIL
  65102. "muls r5, r6, r5\n\t"
  65103. #elif defined(__clang__)
  65104. "muls r5, r6\n\t"
  65105. #else
  65106. "mul r5, r6\n\t"
  65107. #endif
  65108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65109. "lsrs r6, r5, #16\n\t"
  65110. #else
  65111. "lsr r6, r5, #16\n\t"
  65112. #endif
  65113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65114. "lsls r5, r5, #16\n\t"
  65115. #else
  65116. "lsl r5, r5, #16\n\t"
  65117. #endif
  65118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65119. "adds r3, r3, r5\n\t"
  65120. #else
  65121. "add r3, r3, r5\n\t"
  65122. #endif
  65123. #ifdef WOLFSSL_KEIL
  65124. "adcs r4, r4, r6\n\t"
  65125. #elif defined(__clang__)
  65126. "adcs r4, r6\n\t"
  65127. #else
  65128. "adc r4, r6\n\t"
  65129. #endif
  65130. #ifdef WOLFSSL_KEIL
  65131. "adcs r2, r2, %[r]\n\t"
  65132. #elif defined(__clang__)
  65133. "adcs r2, %[r]\n\t"
  65134. #else
  65135. "adc r2, %[r]\n\t"
  65136. #endif
  65137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65138. "adds r3, r3, r5\n\t"
  65139. #else
  65140. "add r3, r3, r5\n\t"
  65141. #endif
  65142. #ifdef WOLFSSL_KEIL
  65143. "adcs r4, r4, r6\n\t"
  65144. #elif defined(__clang__)
  65145. "adcs r4, r6\n\t"
  65146. #else
  65147. "adc r4, r6\n\t"
  65148. #endif
  65149. #ifdef WOLFSSL_KEIL
  65150. "adcs r2, r2, %[r]\n\t"
  65151. #elif defined(__clang__)
  65152. "adcs r2, %[r]\n\t"
  65153. #else
  65154. "adc r2, %[r]\n\t"
  65155. #endif
  65156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65157. "lsrs r5, %[a], #16\n\t"
  65158. #else
  65159. "lsr r5, %[a], #16\n\t"
  65160. #endif
  65161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65162. "lsrs r6, r7, #16\n\t"
  65163. #else
  65164. "lsr r6, r7, #16\n\t"
  65165. #endif
  65166. #ifdef WOLFSSL_KEIL
  65167. "muls r6, r5, r6\n\t"
  65168. #elif defined(__clang__)
  65169. "muls r6, r5\n\t"
  65170. #else
  65171. "mul r6, r5\n\t"
  65172. #endif
  65173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65174. "adds r4, r4, r6\n\t"
  65175. #else
  65176. "add r4, r4, r6\n\t"
  65177. #endif
  65178. #ifdef WOLFSSL_KEIL
  65179. "adcs r2, r2, %[r]\n\t"
  65180. #elif defined(__clang__)
  65181. "adcs r2, %[r]\n\t"
  65182. #else
  65183. "adc r2, %[r]\n\t"
  65184. #endif
  65185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65186. "adds r4, r4, r6\n\t"
  65187. #else
  65188. "add r4, r4, r6\n\t"
  65189. #endif
  65190. #ifdef WOLFSSL_KEIL
  65191. "adcs r2, r2, %[r]\n\t"
  65192. #elif defined(__clang__)
  65193. "adcs r2, %[r]\n\t"
  65194. #else
  65195. "adc r2, %[r]\n\t"
  65196. #endif
  65197. "uxth r6, r7\n\t"
  65198. #ifdef WOLFSSL_KEIL
  65199. "muls r5, r6, r5\n\t"
  65200. #elif defined(__clang__)
  65201. "muls r5, r6\n\t"
  65202. #else
  65203. "mul r5, r6\n\t"
  65204. #endif
  65205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65206. "lsrs r6, r5, #16\n\t"
  65207. #else
  65208. "lsr r6, r5, #16\n\t"
  65209. #endif
  65210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65211. "lsls r5, r5, #16\n\t"
  65212. #else
  65213. "lsl r5, r5, #16\n\t"
  65214. #endif
  65215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65216. "adds r3, r3, r5\n\t"
  65217. #else
  65218. "add r3, r3, r5\n\t"
  65219. #endif
  65220. #ifdef WOLFSSL_KEIL
  65221. "adcs r4, r4, r6\n\t"
  65222. #elif defined(__clang__)
  65223. "adcs r4, r6\n\t"
  65224. #else
  65225. "adc r4, r6\n\t"
  65226. #endif
  65227. #ifdef WOLFSSL_KEIL
  65228. "adcs r2, r2, %[r]\n\t"
  65229. #elif defined(__clang__)
  65230. "adcs r2, %[r]\n\t"
  65231. #else
  65232. "adc r2, %[r]\n\t"
  65233. #endif
  65234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65235. "adds r3, r3, r5\n\t"
  65236. #else
  65237. "add r3, r3, r5\n\t"
  65238. #endif
  65239. #ifdef WOLFSSL_KEIL
  65240. "adcs r4, r4, r6\n\t"
  65241. #elif defined(__clang__)
  65242. "adcs r4, r6\n\t"
  65243. #else
  65244. "adc r4, r6\n\t"
  65245. #endif
  65246. #ifdef WOLFSSL_KEIL
  65247. "adcs r2, r2, %[r]\n\t"
  65248. #elif defined(__clang__)
  65249. "adcs r2, %[r]\n\t"
  65250. #else
  65251. "adc r2, %[r]\n\t"
  65252. #endif
  65253. "mov %[r], r8\n\t"
  65254. "str r3, [%[r], #52]\n\t"
  65255. "movs %[r], #0\n\t"
  65256. "# A[11] * A[3]\n\t"
  65257. "movs r3, #0\n\t"
  65258. "mov %[a], r9\n\t"
  65259. "ldr r7, [%[a], #12]\n\t"
  65260. "mov %[a], lr\n\t"
  65261. "uxth r5, %[a]\n\t"
  65262. "uxth r6, r7\n\t"
  65263. #ifdef WOLFSSL_KEIL
  65264. "muls r6, r5, r6\n\t"
  65265. #elif defined(__clang__)
  65266. "muls r6, r5\n\t"
  65267. #else
  65268. "mul r6, r5\n\t"
  65269. #endif
  65270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65271. "adds r4, r4, r6\n\t"
  65272. #else
  65273. "add r4, r4, r6\n\t"
  65274. #endif
  65275. #ifdef WOLFSSL_KEIL
  65276. "adcs r2, r2, %[r]\n\t"
  65277. #elif defined(__clang__)
  65278. "adcs r2, %[r]\n\t"
  65279. #else
  65280. "adc r2, %[r]\n\t"
  65281. #endif
  65282. #ifdef WOLFSSL_KEIL
  65283. "adcs r3, r3, %[r]\n\t"
  65284. #elif defined(__clang__)
  65285. "adcs r3, %[r]\n\t"
  65286. #else
  65287. "adc r3, %[r]\n\t"
  65288. #endif
  65289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65290. "adds r4, r4, r6\n\t"
  65291. #else
  65292. "add r4, r4, r6\n\t"
  65293. #endif
  65294. #ifdef WOLFSSL_KEIL
  65295. "adcs r2, r2, %[r]\n\t"
  65296. #elif defined(__clang__)
  65297. "adcs r2, %[r]\n\t"
  65298. #else
  65299. "adc r2, %[r]\n\t"
  65300. #endif
  65301. #ifdef WOLFSSL_KEIL
  65302. "adcs r3, r3, %[r]\n\t"
  65303. #elif defined(__clang__)
  65304. "adcs r3, %[r]\n\t"
  65305. #else
  65306. "adc r3, %[r]\n\t"
  65307. #endif
  65308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65309. "lsrs r6, r7, #16\n\t"
  65310. #else
  65311. "lsr r6, r7, #16\n\t"
  65312. #endif
  65313. #ifdef WOLFSSL_KEIL
  65314. "muls r5, r6, r5\n\t"
  65315. #elif defined(__clang__)
  65316. "muls r5, r6\n\t"
  65317. #else
  65318. "mul r5, r6\n\t"
  65319. #endif
  65320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65321. "lsrs r6, r5, #16\n\t"
  65322. #else
  65323. "lsr r6, r5, #16\n\t"
  65324. #endif
  65325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65326. "lsls r5, r5, #16\n\t"
  65327. #else
  65328. "lsl r5, r5, #16\n\t"
  65329. #endif
  65330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65331. "adds r4, r4, r5\n\t"
  65332. #else
  65333. "add r4, r4, r5\n\t"
  65334. #endif
  65335. #ifdef WOLFSSL_KEIL
  65336. "adcs r2, r2, r6\n\t"
  65337. #elif defined(__clang__)
  65338. "adcs r2, r6\n\t"
  65339. #else
  65340. "adc r2, r6\n\t"
  65341. #endif
  65342. #ifdef WOLFSSL_KEIL
  65343. "adcs r3, r3, %[r]\n\t"
  65344. #elif defined(__clang__)
  65345. "adcs r3, %[r]\n\t"
  65346. #else
  65347. "adc r3, %[r]\n\t"
  65348. #endif
  65349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65350. "adds r4, r4, r5\n\t"
  65351. #else
  65352. "add r4, r4, r5\n\t"
  65353. #endif
  65354. #ifdef WOLFSSL_KEIL
  65355. "adcs r2, r2, r6\n\t"
  65356. #elif defined(__clang__)
  65357. "adcs r2, r6\n\t"
  65358. #else
  65359. "adc r2, r6\n\t"
  65360. #endif
  65361. #ifdef WOLFSSL_KEIL
  65362. "adcs r3, r3, %[r]\n\t"
  65363. #elif defined(__clang__)
  65364. "adcs r3, %[r]\n\t"
  65365. #else
  65366. "adc r3, %[r]\n\t"
  65367. #endif
  65368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65369. "lsrs r5, %[a], #16\n\t"
  65370. #else
  65371. "lsr r5, %[a], #16\n\t"
  65372. #endif
  65373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65374. "lsrs r6, r7, #16\n\t"
  65375. #else
  65376. "lsr r6, r7, #16\n\t"
  65377. #endif
  65378. #ifdef WOLFSSL_KEIL
  65379. "muls r6, r5, r6\n\t"
  65380. #elif defined(__clang__)
  65381. "muls r6, r5\n\t"
  65382. #else
  65383. "mul r6, r5\n\t"
  65384. #endif
  65385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65386. "adds r2, r2, r6\n\t"
  65387. #else
  65388. "add r2, r2, r6\n\t"
  65389. #endif
  65390. #ifdef WOLFSSL_KEIL
  65391. "adcs r3, r3, %[r]\n\t"
  65392. #elif defined(__clang__)
  65393. "adcs r3, %[r]\n\t"
  65394. #else
  65395. "adc r3, %[r]\n\t"
  65396. #endif
  65397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65398. "adds r2, r2, r6\n\t"
  65399. #else
  65400. "add r2, r2, r6\n\t"
  65401. #endif
  65402. #ifdef WOLFSSL_KEIL
  65403. "adcs r3, r3, %[r]\n\t"
  65404. #elif defined(__clang__)
  65405. "adcs r3, %[r]\n\t"
  65406. #else
  65407. "adc r3, %[r]\n\t"
  65408. #endif
  65409. "uxth r6, r7\n\t"
  65410. #ifdef WOLFSSL_KEIL
  65411. "muls r5, r6, r5\n\t"
  65412. #elif defined(__clang__)
  65413. "muls r5, r6\n\t"
  65414. #else
  65415. "mul r5, r6\n\t"
  65416. #endif
  65417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65418. "lsrs r6, r5, #16\n\t"
  65419. #else
  65420. "lsr r6, r5, #16\n\t"
  65421. #endif
  65422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65423. "lsls r5, r5, #16\n\t"
  65424. #else
  65425. "lsl r5, r5, #16\n\t"
  65426. #endif
  65427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65428. "adds r4, r4, r5\n\t"
  65429. #else
  65430. "add r4, r4, r5\n\t"
  65431. #endif
  65432. #ifdef WOLFSSL_KEIL
  65433. "adcs r2, r2, r6\n\t"
  65434. #elif defined(__clang__)
  65435. "adcs r2, r6\n\t"
  65436. #else
  65437. "adc r2, r6\n\t"
  65438. #endif
  65439. #ifdef WOLFSSL_KEIL
  65440. "adcs r3, r3, %[r]\n\t"
  65441. #elif defined(__clang__)
  65442. "adcs r3, %[r]\n\t"
  65443. #else
  65444. "adc r3, %[r]\n\t"
  65445. #endif
  65446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65447. "adds r4, r4, r5\n\t"
  65448. #else
  65449. "add r4, r4, r5\n\t"
  65450. #endif
  65451. #ifdef WOLFSSL_KEIL
  65452. "adcs r2, r2, r6\n\t"
  65453. #elif defined(__clang__)
  65454. "adcs r2, r6\n\t"
  65455. #else
  65456. "adc r2, r6\n\t"
  65457. #endif
  65458. #ifdef WOLFSSL_KEIL
  65459. "adcs r3, r3, %[r]\n\t"
  65460. #elif defined(__clang__)
  65461. "adcs r3, %[r]\n\t"
  65462. #else
  65463. "adc r3, %[r]\n\t"
  65464. #endif
  65465. "# A[10] * A[4]\n\t"
  65466. "mov %[a], r9\n\t"
  65467. "ldr r7, [%[a], #16]\n\t"
  65468. "mov %[a], r12\n\t"
  65469. "uxth r5, %[a]\n\t"
  65470. "uxth r6, r7\n\t"
  65471. #ifdef WOLFSSL_KEIL
  65472. "muls r6, r5, r6\n\t"
  65473. #elif defined(__clang__)
  65474. "muls r6, r5\n\t"
  65475. #else
  65476. "mul r6, r5\n\t"
  65477. #endif
  65478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65479. "adds r4, r4, r6\n\t"
  65480. #else
  65481. "add r4, r4, r6\n\t"
  65482. #endif
  65483. #ifdef WOLFSSL_KEIL
  65484. "adcs r2, r2, %[r]\n\t"
  65485. #elif defined(__clang__)
  65486. "adcs r2, %[r]\n\t"
  65487. #else
  65488. "adc r2, %[r]\n\t"
  65489. #endif
  65490. #ifdef WOLFSSL_KEIL
  65491. "adcs r3, r3, %[r]\n\t"
  65492. #elif defined(__clang__)
  65493. "adcs r3, %[r]\n\t"
  65494. #else
  65495. "adc r3, %[r]\n\t"
  65496. #endif
  65497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65498. "adds r4, r4, r6\n\t"
  65499. #else
  65500. "add r4, r4, r6\n\t"
  65501. #endif
  65502. #ifdef WOLFSSL_KEIL
  65503. "adcs r2, r2, %[r]\n\t"
  65504. #elif defined(__clang__)
  65505. "adcs r2, %[r]\n\t"
  65506. #else
  65507. "adc r2, %[r]\n\t"
  65508. #endif
  65509. #ifdef WOLFSSL_KEIL
  65510. "adcs r3, r3, %[r]\n\t"
  65511. #elif defined(__clang__)
  65512. "adcs r3, %[r]\n\t"
  65513. #else
  65514. "adc r3, %[r]\n\t"
  65515. #endif
  65516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65517. "lsrs r6, r7, #16\n\t"
  65518. #else
  65519. "lsr r6, r7, #16\n\t"
  65520. #endif
  65521. #ifdef WOLFSSL_KEIL
  65522. "muls r5, r6, r5\n\t"
  65523. #elif defined(__clang__)
  65524. "muls r5, r6\n\t"
  65525. #else
  65526. "mul r5, r6\n\t"
  65527. #endif
  65528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65529. "lsrs r6, r5, #16\n\t"
  65530. #else
  65531. "lsr r6, r5, #16\n\t"
  65532. #endif
  65533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65534. "lsls r5, r5, #16\n\t"
  65535. #else
  65536. "lsl r5, r5, #16\n\t"
  65537. #endif
  65538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65539. "adds r4, r4, r5\n\t"
  65540. #else
  65541. "add r4, r4, r5\n\t"
  65542. #endif
  65543. #ifdef WOLFSSL_KEIL
  65544. "adcs r2, r2, r6\n\t"
  65545. #elif defined(__clang__)
  65546. "adcs r2, r6\n\t"
  65547. #else
  65548. "adc r2, r6\n\t"
  65549. #endif
  65550. #ifdef WOLFSSL_KEIL
  65551. "adcs r3, r3, %[r]\n\t"
  65552. #elif defined(__clang__)
  65553. "adcs r3, %[r]\n\t"
  65554. #else
  65555. "adc r3, %[r]\n\t"
  65556. #endif
  65557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65558. "adds r4, r4, r5\n\t"
  65559. #else
  65560. "add r4, r4, r5\n\t"
  65561. #endif
  65562. #ifdef WOLFSSL_KEIL
  65563. "adcs r2, r2, r6\n\t"
  65564. #elif defined(__clang__)
  65565. "adcs r2, r6\n\t"
  65566. #else
  65567. "adc r2, r6\n\t"
  65568. #endif
  65569. #ifdef WOLFSSL_KEIL
  65570. "adcs r3, r3, %[r]\n\t"
  65571. #elif defined(__clang__)
  65572. "adcs r3, %[r]\n\t"
  65573. #else
  65574. "adc r3, %[r]\n\t"
  65575. #endif
  65576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65577. "lsrs r5, %[a], #16\n\t"
  65578. #else
  65579. "lsr r5, %[a], #16\n\t"
  65580. #endif
  65581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65582. "lsrs r6, r7, #16\n\t"
  65583. #else
  65584. "lsr r6, r7, #16\n\t"
  65585. #endif
  65586. #ifdef WOLFSSL_KEIL
  65587. "muls r6, r5, r6\n\t"
  65588. #elif defined(__clang__)
  65589. "muls r6, r5\n\t"
  65590. #else
  65591. "mul r6, r5\n\t"
  65592. #endif
  65593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65594. "adds r2, r2, r6\n\t"
  65595. #else
  65596. "add r2, r2, r6\n\t"
  65597. #endif
  65598. #ifdef WOLFSSL_KEIL
  65599. "adcs r3, r3, %[r]\n\t"
  65600. #elif defined(__clang__)
  65601. "adcs r3, %[r]\n\t"
  65602. #else
  65603. "adc r3, %[r]\n\t"
  65604. #endif
  65605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65606. "adds r2, r2, r6\n\t"
  65607. #else
  65608. "add r2, r2, r6\n\t"
  65609. #endif
  65610. #ifdef WOLFSSL_KEIL
  65611. "adcs r3, r3, %[r]\n\t"
  65612. #elif defined(__clang__)
  65613. "adcs r3, %[r]\n\t"
  65614. #else
  65615. "adc r3, %[r]\n\t"
  65616. #endif
  65617. "uxth r6, r7\n\t"
  65618. #ifdef WOLFSSL_KEIL
  65619. "muls r5, r6, r5\n\t"
  65620. #elif defined(__clang__)
  65621. "muls r5, r6\n\t"
  65622. #else
  65623. "mul r5, r6\n\t"
  65624. #endif
  65625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65626. "lsrs r6, r5, #16\n\t"
  65627. #else
  65628. "lsr r6, r5, #16\n\t"
  65629. #endif
  65630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65631. "lsls r5, r5, #16\n\t"
  65632. #else
  65633. "lsl r5, r5, #16\n\t"
  65634. #endif
  65635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65636. "adds r4, r4, r5\n\t"
  65637. #else
  65638. "add r4, r4, r5\n\t"
  65639. #endif
  65640. #ifdef WOLFSSL_KEIL
  65641. "adcs r2, r2, r6\n\t"
  65642. #elif defined(__clang__)
  65643. "adcs r2, r6\n\t"
  65644. #else
  65645. "adc r2, r6\n\t"
  65646. #endif
  65647. #ifdef WOLFSSL_KEIL
  65648. "adcs r3, r3, %[r]\n\t"
  65649. #elif defined(__clang__)
  65650. "adcs r3, %[r]\n\t"
  65651. #else
  65652. "adc r3, %[r]\n\t"
  65653. #endif
  65654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65655. "adds r4, r4, r5\n\t"
  65656. #else
  65657. "add r4, r4, r5\n\t"
  65658. #endif
  65659. #ifdef WOLFSSL_KEIL
  65660. "adcs r2, r2, r6\n\t"
  65661. #elif defined(__clang__)
  65662. "adcs r2, r6\n\t"
  65663. #else
  65664. "adc r2, r6\n\t"
  65665. #endif
  65666. #ifdef WOLFSSL_KEIL
  65667. "adcs r3, r3, %[r]\n\t"
  65668. #elif defined(__clang__)
  65669. "adcs r3, %[r]\n\t"
  65670. #else
  65671. "adc r3, %[r]\n\t"
  65672. #endif
  65673. "# A[9] * A[5]\n\t"
  65674. "mov %[a], r9\n\t"
  65675. "ldr r7, [%[a], #20]\n\t"
  65676. "mov %[a], r11\n\t"
  65677. "uxth r5, %[a]\n\t"
  65678. "uxth r6, r7\n\t"
  65679. #ifdef WOLFSSL_KEIL
  65680. "muls r6, r5, r6\n\t"
  65681. #elif defined(__clang__)
  65682. "muls r6, r5\n\t"
  65683. #else
  65684. "mul r6, r5\n\t"
  65685. #endif
  65686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65687. "adds r4, r4, r6\n\t"
  65688. #else
  65689. "add r4, r4, r6\n\t"
  65690. #endif
  65691. #ifdef WOLFSSL_KEIL
  65692. "adcs r2, r2, %[r]\n\t"
  65693. #elif defined(__clang__)
  65694. "adcs r2, %[r]\n\t"
  65695. #else
  65696. "adc r2, %[r]\n\t"
  65697. #endif
  65698. #ifdef WOLFSSL_KEIL
  65699. "adcs r3, r3, %[r]\n\t"
  65700. #elif defined(__clang__)
  65701. "adcs r3, %[r]\n\t"
  65702. #else
  65703. "adc r3, %[r]\n\t"
  65704. #endif
  65705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65706. "adds r4, r4, r6\n\t"
  65707. #else
  65708. "add r4, r4, r6\n\t"
  65709. #endif
  65710. #ifdef WOLFSSL_KEIL
  65711. "adcs r2, r2, %[r]\n\t"
  65712. #elif defined(__clang__)
  65713. "adcs r2, %[r]\n\t"
  65714. #else
  65715. "adc r2, %[r]\n\t"
  65716. #endif
  65717. #ifdef WOLFSSL_KEIL
  65718. "adcs r3, r3, %[r]\n\t"
  65719. #elif defined(__clang__)
  65720. "adcs r3, %[r]\n\t"
  65721. #else
  65722. "adc r3, %[r]\n\t"
  65723. #endif
  65724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65725. "lsrs r6, r7, #16\n\t"
  65726. #else
  65727. "lsr r6, r7, #16\n\t"
  65728. #endif
  65729. #ifdef WOLFSSL_KEIL
  65730. "muls r5, r6, r5\n\t"
  65731. #elif defined(__clang__)
  65732. "muls r5, r6\n\t"
  65733. #else
  65734. "mul r5, r6\n\t"
  65735. #endif
  65736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65737. "lsrs r6, r5, #16\n\t"
  65738. #else
  65739. "lsr r6, r5, #16\n\t"
  65740. #endif
  65741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65742. "lsls r5, r5, #16\n\t"
  65743. #else
  65744. "lsl r5, r5, #16\n\t"
  65745. #endif
  65746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65747. "adds r4, r4, r5\n\t"
  65748. #else
  65749. "add r4, r4, r5\n\t"
  65750. #endif
  65751. #ifdef WOLFSSL_KEIL
  65752. "adcs r2, r2, r6\n\t"
  65753. #elif defined(__clang__)
  65754. "adcs r2, r6\n\t"
  65755. #else
  65756. "adc r2, r6\n\t"
  65757. #endif
  65758. #ifdef WOLFSSL_KEIL
  65759. "adcs r3, r3, %[r]\n\t"
  65760. #elif defined(__clang__)
  65761. "adcs r3, %[r]\n\t"
  65762. #else
  65763. "adc r3, %[r]\n\t"
  65764. #endif
  65765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65766. "adds r4, r4, r5\n\t"
  65767. #else
  65768. "add r4, r4, r5\n\t"
  65769. #endif
  65770. #ifdef WOLFSSL_KEIL
  65771. "adcs r2, r2, r6\n\t"
  65772. #elif defined(__clang__)
  65773. "adcs r2, r6\n\t"
  65774. #else
  65775. "adc r2, r6\n\t"
  65776. #endif
  65777. #ifdef WOLFSSL_KEIL
  65778. "adcs r3, r3, %[r]\n\t"
  65779. #elif defined(__clang__)
  65780. "adcs r3, %[r]\n\t"
  65781. #else
  65782. "adc r3, %[r]\n\t"
  65783. #endif
  65784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65785. "lsrs r5, %[a], #16\n\t"
  65786. #else
  65787. "lsr r5, %[a], #16\n\t"
  65788. #endif
  65789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65790. "lsrs r6, r7, #16\n\t"
  65791. #else
  65792. "lsr r6, r7, #16\n\t"
  65793. #endif
  65794. #ifdef WOLFSSL_KEIL
  65795. "muls r6, r5, r6\n\t"
  65796. #elif defined(__clang__)
  65797. "muls r6, r5\n\t"
  65798. #else
  65799. "mul r6, r5\n\t"
  65800. #endif
  65801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65802. "adds r2, r2, r6\n\t"
  65803. #else
  65804. "add r2, r2, r6\n\t"
  65805. #endif
  65806. #ifdef WOLFSSL_KEIL
  65807. "adcs r3, r3, %[r]\n\t"
  65808. #elif defined(__clang__)
  65809. "adcs r3, %[r]\n\t"
  65810. #else
  65811. "adc r3, %[r]\n\t"
  65812. #endif
  65813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65814. "adds r2, r2, r6\n\t"
  65815. #else
  65816. "add r2, r2, r6\n\t"
  65817. #endif
  65818. #ifdef WOLFSSL_KEIL
  65819. "adcs r3, r3, %[r]\n\t"
  65820. #elif defined(__clang__)
  65821. "adcs r3, %[r]\n\t"
  65822. #else
  65823. "adc r3, %[r]\n\t"
  65824. #endif
  65825. "uxth r6, r7\n\t"
  65826. #ifdef WOLFSSL_KEIL
  65827. "muls r5, r6, r5\n\t"
  65828. #elif defined(__clang__)
  65829. "muls r5, r6\n\t"
  65830. #else
  65831. "mul r5, r6\n\t"
  65832. #endif
  65833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65834. "lsrs r6, r5, #16\n\t"
  65835. #else
  65836. "lsr r6, r5, #16\n\t"
  65837. #endif
  65838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65839. "lsls r5, r5, #16\n\t"
  65840. #else
  65841. "lsl r5, r5, #16\n\t"
  65842. #endif
  65843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65844. "adds r4, r4, r5\n\t"
  65845. #else
  65846. "add r4, r4, r5\n\t"
  65847. #endif
  65848. #ifdef WOLFSSL_KEIL
  65849. "adcs r2, r2, r6\n\t"
  65850. #elif defined(__clang__)
  65851. "adcs r2, r6\n\t"
  65852. #else
  65853. "adc r2, r6\n\t"
  65854. #endif
  65855. #ifdef WOLFSSL_KEIL
  65856. "adcs r3, r3, %[r]\n\t"
  65857. #elif defined(__clang__)
  65858. "adcs r3, %[r]\n\t"
  65859. #else
  65860. "adc r3, %[r]\n\t"
  65861. #endif
  65862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65863. "adds r4, r4, r5\n\t"
  65864. #else
  65865. "add r4, r4, r5\n\t"
  65866. #endif
  65867. #ifdef WOLFSSL_KEIL
  65868. "adcs r2, r2, r6\n\t"
  65869. #elif defined(__clang__)
  65870. "adcs r2, r6\n\t"
  65871. #else
  65872. "adc r2, r6\n\t"
  65873. #endif
  65874. #ifdef WOLFSSL_KEIL
  65875. "adcs r3, r3, %[r]\n\t"
  65876. #elif defined(__clang__)
  65877. "adcs r3, %[r]\n\t"
  65878. #else
  65879. "adc r3, %[r]\n\t"
  65880. #endif
  65881. "# A[8] * A[6]\n\t"
  65882. "mov %[a], r9\n\t"
  65883. "ldr r7, [%[a], #24]\n\t"
  65884. "mov %[a], r10\n\t"
  65885. "uxth r5, %[a]\n\t"
  65886. "uxth r6, r7\n\t"
  65887. #ifdef WOLFSSL_KEIL
  65888. "muls r6, r5, r6\n\t"
  65889. #elif defined(__clang__)
  65890. "muls r6, r5\n\t"
  65891. #else
  65892. "mul r6, r5\n\t"
  65893. #endif
  65894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65895. "adds r4, r4, r6\n\t"
  65896. #else
  65897. "add r4, r4, r6\n\t"
  65898. #endif
  65899. #ifdef WOLFSSL_KEIL
  65900. "adcs r2, r2, %[r]\n\t"
  65901. #elif defined(__clang__)
  65902. "adcs r2, %[r]\n\t"
  65903. #else
  65904. "adc r2, %[r]\n\t"
  65905. #endif
  65906. #ifdef WOLFSSL_KEIL
  65907. "adcs r3, r3, %[r]\n\t"
  65908. #elif defined(__clang__)
  65909. "adcs r3, %[r]\n\t"
  65910. #else
  65911. "adc r3, %[r]\n\t"
  65912. #endif
  65913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65914. "adds r4, r4, r6\n\t"
  65915. #else
  65916. "add r4, r4, r6\n\t"
  65917. #endif
  65918. #ifdef WOLFSSL_KEIL
  65919. "adcs r2, r2, %[r]\n\t"
  65920. #elif defined(__clang__)
  65921. "adcs r2, %[r]\n\t"
  65922. #else
  65923. "adc r2, %[r]\n\t"
  65924. #endif
  65925. #ifdef WOLFSSL_KEIL
  65926. "adcs r3, r3, %[r]\n\t"
  65927. #elif defined(__clang__)
  65928. "adcs r3, %[r]\n\t"
  65929. #else
  65930. "adc r3, %[r]\n\t"
  65931. #endif
  65932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65933. "lsrs r6, r7, #16\n\t"
  65934. #else
  65935. "lsr r6, r7, #16\n\t"
  65936. #endif
  65937. #ifdef WOLFSSL_KEIL
  65938. "muls r5, r6, r5\n\t"
  65939. #elif defined(__clang__)
  65940. "muls r5, r6\n\t"
  65941. #else
  65942. "mul r5, r6\n\t"
  65943. #endif
  65944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65945. "lsrs r6, r5, #16\n\t"
  65946. #else
  65947. "lsr r6, r5, #16\n\t"
  65948. #endif
  65949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65950. "lsls r5, r5, #16\n\t"
  65951. #else
  65952. "lsl r5, r5, #16\n\t"
  65953. #endif
  65954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65955. "adds r4, r4, r5\n\t"
  65956. #else
  65957. "add r4, r4, r5\n\t"
  65958. #endif
  65959. #ifdef WOLFSSL_KEIL
  65960. "adcs r2, r2, r6\n\t"
  65961. #elif defined(__clang__)
  65962. "adcs r2, r6\n\t"
  65963. #else
  65964. "adc r2, r6\n\t"
  65965. #endif
  65966. #ifdef WOLFSSL_KEIL
  65967. "adcs r3, r3, %[r]\n\t"
  65968. #elif defined(__clang__)
  65969. "adcs r3, %[r]\n\t"
  65970. #else
  65971. "adc r3, %[r]\n\t"
  65972. #endif
  65973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65974. "adds r4, r4, r5\n\t"
  65975. #else
  65976. "add r4, r4, r5\n\t"
  65977. #endif
  65978. #ifdef WOLFSSL_KEIL
  65979. "adcs r2, r2, r6\n\t"
  65980. #elif defined(__clang__)
  65981. "adcs r2, r6\n\t"
  65982. #else
  65983. "adc r2, r6\n\t"
  65984. #endif
  65985. #ifdef WOLFSSL_KEIL
  65986. "adcs r3, r3, %[r]\n\t"
  65987. #elif defined(__clang__)
  65988. "adcs r3, %[r]\n\t"
  65989. #else
  65990. "adc r3, %[r]\n\t"
  65991. #endif
  65992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65993. "lsrs r5, %[a], #16\n\t"
  65994. #else
  65995. "lsr r5, %[a], #16\n\t"
  65996. #endif
  65997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65998. "lsrs r6, r7, #16\n\t"
  65999. #else
  66000. "lsr r6, r7, #16\n\t"
  66001. #endif
  66002. #ifdef WOLFSSL_KEIL
  66003. "muls r6, r5, r6\n\t"
  66004. #elif defined(__clang__)
  66005. "muls r6, r5\n\t"
  66006. #else
  66007. "mul r6, r5\n\t"
  66008. #endif
  66009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66010. "adds r2, r2, r6\n\t"
  66011. #else
  66012. "add r2, r2, r6\n\t"
  66013. #endif
  66014. #ifdef WOLFSSL_KEIL
  66015. "adcs r3, r3, %[r]\n\t"
  66016. #elif defined(__clang__)
  66017. "adcs r3, %[r]\n\t"
  66018. #else
  66019. "adc r3, %[r]\n\t"
  66020. #endif
  66021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66022. "adds r2, r2, r6\n\t"
  66023. #else
  66024. "add r2, r2, r6\n\t"
  66025. #endif
  66026. #ifdef WOLFSSL_KEIL
  66027. "adcs r3, r3, %[r]\n\t"
  66028. #elif defined(__clang__)
  66029. "adcs r3, %[r]\n\t"
  66030. #else
  66031. "adc r3, %[r]\n\t"
  66032. #endif
  66033. "uxth r6, r7\n\t"
  66034. #ifdef WOLFSSL_KEIL
  66035. "muls r5, r6, r5\n\t"
  66036. #elif defined(__clang__)
  66037. "muls r5, r6\n\t"
  66038. #else
  66039. "mul r5, r6\n\t"
  66040. #endif
  66041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66042. "lsrs r6, r5, #16\n\t"
  66043. #else
  66044. "lsr r6, r5, #16\n\t"
  66045. #endif
  66046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66047. "lsls r5, r5, #16\n\t"
  66048. #else
  66049. "lsl r5, r5, #16\n\t"
  66050. #endif
  66051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66052. "adds r4, r4, r5\n\t"
  66053. #else
  66054. "add r4, r4, r5\n\t"
  66055. #endif
  66056. #ifdef WOLFSSL_KEIL
  66057. "adcs r2, r2, r6\n\t"
  66058. #elif defined(__clang__)
  66059. "adcs r2, r6\n\t"
  66060. #else
  66061. "adc r2, r6\n\t"
  66062. #endif
  66063. #ifdef WOLFSSL_KEIL
  66064. "adcs r3, r3, %[r]\n\t"
  66065. #elif defined(__clang__)
  66066. "adcs r3, %[r]\n\t"
  66067. #else
  66068. "adc r3, %[r]\n\t"
  66069. #endif
  66070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66071. "adds r4, r4, r5\n\t"
  66072. #else
  66073. "add r4, r4, r5\n\t"
  66074. #endif
  66075. #ifdef WOLFSSL_KEIL
  66076. "adcs r2, r2, r6\n\t"
  66077. #elif defined(__clang__)
  66078. "adcs r2, r6\n\t"
  66079. #else
  66080. "adc r2, r6\n\t"
  66081. #endif
  66082. #ifdef WOLFSSL_KEIL
  66083. "adcs r3, r3, %[r]\n\t"
  66084. #elif defined(__clang__)
  66085. "adcs r3, %[r]\n\t"
  66086. #else
  66087. "adc r3, %[r]\n\t"
  66088. #endif
  66089. "# A[7] * A[7]\n\t"
  66090. "mov %[a], r9\n\t"
  66091. "ldr r7, [%[a], #28]\n\t"
  66092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66093. "lsrs r6, r7, #16\n\t"
  66094. #else
  66095. "lsr r6, r7, #16\n\t"
  66096. #endif
  66097. "uxth r5, r7\n\t"
  66098. #ifdef WOLFSSL_KEIL
  66099. "muls r5, r5, r5\n\t"
  66100. #elif defined(__clang__)
  66101. "muls r5, r5\n\t"
  66102. #else
  66103. "mul r5, r5\n\t"
  66104. #endif
  66105. #ifdef WOLFSSL_KEIL
  66106. "muls r6, r6, r6\n\t"
  66107. #elif defined(__clang__)
  66108. "muls r6, r6\n\t"
  66109. #else
  66110. "mul r6, r6\n\t"
  66111. #endif
  66112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66113. "adds r4, r4, r5\n\t"
  66114. #else
  66115. "add r4, r4, r5\n\t"
  66116. #endif
  66117. #ifdef WOLFSSL_KEIL
  66118. "adcs r2, r2, r6\n\t"
  66119. #elif defined(__clang__)
  66120. "adcs r2, r6\n\t"
  66121. #else
  66122. "adc r2, r6\n\t"
  66123. #endif
  66124. #ifdef WOLFSSL_KEIL
  66125. "adcs r3, r3, %[r]\n\t"
  66126. #elif defined(__clang__)
  66127. "adcs r3, %[r]\n\t"
  66128. #else
  66129. "adc r3, %[r]\n\t"
  66130. #endif
  66131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66132. "lsrs r6, r7, #16\n\t"
  66133. #else
  66134. "lsr r6, r7, #16\n\t"
  66135. #endif
  66136. "uxth r5, r7\n\t"
  66137. #ifdef WOLFSSL_KEIL
  66138. "muls r5, r6, r5\n\t"
  66139. #elif defined(__clang__)
  66140. "muls r5, r6\n\t"
  66141. #else
  66142. "mul r5, r6\n\t"
  66143. #endif
  66144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66145. "lsrs r6, r5, #15\n\t"
  66146. #else
  66147. "lsr r6, r5, #15\n\t"
  66148. #endif
  66149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66150. "lsls r5, r5, #17\n\t"
  66151. #else
  66152. "lsl r5, r5, #17\n\t"
  66153. #endif
  66154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66155. "adds r4, r4, r5\n\t"
  66156. #else
  66157. "add r4, r4, r5\n\t"
  66158. #endif
  66159. #ifdef WOLFSSL_KEIL
  66160. "adcs r2, r2, r6\n\t"
  66161. #elif defined(__clang__)
  66162. "adcs r2, r6\n\t"
  66163. #else
  66164. "adc r2, r6\n\t"
  66165. #endif
  66166. #ifdef WOLFSSL_KEIL
  66167. "adcs r3, r3, %[r]\n\t"
  66168. #elif defined(__clang__)
  66169. "adcs r3, %[r]\n\t"
  66170. #else
  66171. "adc r3, %[r]\n\t"
  66172. #endif
  66173. "mov %[r], r8\n\t"
  66174. "str r4, [%[r], #56]\n\t"
  66175. "movs %[r], #0\n\t"
  66176. "# A[8] * A[7]\n\t"
  66177. "movs r4, #0\n\t"
  66178. "mov %[a], r10\n\t"
  66179. "uxth r5, %[a]\n\t"
  66180. "uxth r6, r7\n\t"
  66181. #ifdef WOLFSSL_KEIL
  66182. "muls r6, r5, r6\n\t"
  66183. #elif defined(__clang__)
  66184. "muls r6, r5\n\t"
  66185. #else
  66186. "mul r6, r5\n\t"
  66187. #endif
  66188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66189. "adds r2, r2, r6\n\t"
  66190. #else
  66191. "add r2, r2, r6\n\t"
  66192. #endif
  66193. #ifdef WOLFSSL_KEIL
  66194. "adcs r3, r3, %[r]\n\t"
  66195. #elif defined(__clang__)
  66196. "adcs r3, %[r]\n\t"
  66197. #else
  66198. "adc r3, %[r]\n\t"
  66199. #endif
  66200. #ifdef WOLFSSL_KEIL
  66201. "adcs r4, r4, %[r]\n\t"
  66202. #elif defined(__clang__)
  66203. "adcs r4, %[r]\n\t"
  66204. #else
  66205. "adc r4, %[r]\n\t"
  66206. #endif
  66207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66208. "adds r2, r2, r6\n\t"
  66209. #else
  66210. "add r2, r2, r6\n\t"
  66211. #endif
  66212. #ifdef WOLFSSL_KEIL
  66213. "adcs r3, r3, %[r]\n\t"
  66214. #elif defined(__clang__)
  66215. "adcs r3, %[r]\n\t"
  66216. #else
  66217. "adc r3, %[r]\n\t"
  66218. #endif
  66219. #ifdef WOLFSSL_KEIL
  66220. "adcs r4, r4, %[r]\n\t"
  66221. #elif defined(__clang__)
  66222. "adcs r4, %[r]\n\t"
  66223. #else
  66224. "adc r4, %[r]\n\t"
  66225. #endif
  66226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66227. "lsrs r6, r7, #16\n\t"
  66228. #else
  66229. "lsr r6, r7, #16\n\t"
  66230. #endif
  66231. #ifdef WOLFSSL_KEIL
  66232. "muls r5, r6, r5\n\t"
  66233. #elif defined(__clang__)
  66234. "muls r5, r6\n\t"
  66235. #else
  66236. "mul r5, r6\n\t"
  66237. #endif
  66238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66239. "lsrs r6, r5, #16\n\t"
  66240. #else
  66241. "lsr r6, r5, #16\n\t"
  66242. #endif
  66243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66244. "lsls r5, r5, #16\n\t"
  66245. #else
  66246. "lsl r5, r5, #16\n\t"
  66247. #endif
  66248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66249. "adds r2, r2, r5\n\t"
  66250. #else
  66251. "add r2, r2, r5\n\t"
  66252. #endif
  66253. #ifdef WOLFSSL_KEIL
  66254. "adcs r3, r3, r6\n\t"
  66255. #elif defined(__clang__)
  66256. "adcs r3, r6\n\t"
  66257. #else
  66258. "adc r3, r6\n\t"
  66259. #endif
  66260. #ifdef WOLFSSL_KEIL
  66261. "adcs r4, r4, %[r]\n\t"
  66262. #elif defined(__clang__)
  66263. "adcs r4, %[r]\n\t"
  66264. #else
  66265. "adc r4, %[r]\n\t"
  66266. #endif
  66267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66268. "adds r2, r2, r5\n\t"
  66269. #else
  66270. "add r2, r2, r5\n\t"
  66271. #endif
  66272. #ifdef WOLFSSL_KEIL
  66273. "adcs r3, r3, r6\n\t"
  66274. #elif defined(__clang__)
  66275. "adcs r3, r6\n\t"
  66276. #else
  66277. "adc r3, r6\n\t"
  66278. #endif
  66279. #ifdef WOLFSSL_KEIL
  66280. "adcs r4, r4, %[r]\n\t"
  66281. #elif defined(__clang__)
  66282. "adcs r4, %[r]\n\t"
  66283. #else
  66284. "adc r4, %[r]\n\t"
  66285. #endif
  66286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66287. "lsrs r5, %[a], #16\n\t"
  66288. #else
  66289. "lsr r5, %[a], #16\n\t"
  66290. #endif
  66291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66292. "lsrs r6, r7, #16\n\t"
  66293. #else
  66294. "lsr r6, r7, #16\n\t"
  66295. #endif
  66296. #ifdef WOLFSSL_KEIL
  66297. "muls r6, r5, r6\n\t"
  66298. #elif defined(__clang__)
  66299. "muls r6, r5\n\t"
  66300. #else
  66301. "mul r6, r5\n\t"
  66302. #endif
  66303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66304. "adds r3, r3, r6\n\t"
  66305. #else
  66306. "add r3, r3, r6\n\t"
  66307. #endif
  66308. #ifdef WOLFSSL_KEIL
  66309. "adcs r4, r4, %[r]\n\t"
  66310. #elif defined(__clang__)
  66311. "adcs r4, %[r]\n\t"
  66312. #else
  66313. "adc r4, %[r]\n\t"
  66314. #endif
  66315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66316. "adds r3, r3, r6\n\t"
  66317. #else
  66318. "add r3, r3, r6\n\t"
  66319. #endif
  66320. #ifdef WOLFSSL_KEIL
  66321. "adcs r4, r4, %[r]\n\t"
  66322. #elif defined(__clang__)
  66323. "adcs r4, %[r]\n\t"
  66324. #else
  66325. "adc r4, %[r]\n\t"
  66326. #endif
  66327. "uxth r6, r7\n\t"
  66328. #ifdef WOLFSSL_KEIL
  66329. "muls r5, r6, r5\n\t"
  66330. #elif defined(__clang__)
  66331. "muls r5, r6\n\t"
  66332. #else
  66333. "mul r5, r6\n\t"
  66334. #endif
  66335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66336. "lsrs r6, r5, #16\n\t"
  66337. #else
  66338. "lsr r6, r5, #16\n\t"
  66339. #endif
  66340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66341. "lsls r5, r5, #16\n\t"
  66342. #else
  66343. "lsl r5, r5, #16\n\t"
  66344. #endif
  66345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66346. "adds r2, r2, r5\n\t"
  66347. #else
  66348. "add r2, r2, r5\n\t"
  66349. #endif
  66350. #ifdef WOLFSSL_KEIL
  66351. "adcs r3, r3, r6\n\t"
  66352. #elif defined(__clang__)
  66353. "adcs r3, r6\n\t"
  66354. #else
  66355. "adc r3, r6\n\t"
  66356. #endif
  66357. #ifdef WOLFSSL_KEIL
  66358. "adcs r4, r4, %[r]\n\t"
  66359. #elif defined(__clang__)
  66360. "adcs r4, %[r]\n\t"
  66361. #else
  66362. "adc r4, %[r]\n\t"
  66363. #endif
  66364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66365. "adds r2, r2, r5\n\t"
  66366. #else
  66367. "add r2, r2, r5\n\t"
  66368. #endif
  66369. #ifdef WOLFSSL_KEIL
  66370. "adcs r3, r3, r6\n\t"
  66371. #elif defined(__clang__)
  66372. "adcs r3, r6\n\t"
  66373. #else
  66374. "adc r3, r6\n\t"
  66375. #endif
  66376. #ifdef WOLFSSL_KEIL
  66377. "adcs r4, r4, %[r]\n\t"
  66378. #elif defined(__clang__)
  66379. "adcs r4, %[r]\n\t"
  66380. #else
  66381. "adc r4, %[r]\n\t"
  66382. #endif
  66383. "# A[9] * A[6]\n\t"
  66384. "mov %[a], r9\n\t"
  66385. "ldr r7, [%[a], #24]\n\t"
  66386. "mov %[a], r11\n\t"
  66387. "uxth r5, %[a]\n\t"
  66388. "uxth r6, r7\n\t"
  66389. #ifdef WOLFSSL_KEIL
  66390. "muls r6, r5, r6\n\t"
  66391. #elif defined(__clang__)
  66392. "muls r6, r5\n\t"
  66393. #else
  66394. "mul r6, r5\n\t"
  66395. #endif
  66396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66397. "adds r2, r2, r6\n\t"
  66398. #else
  66399. "add r2, r2, r6\n\t"
  66400. #endif
  66401. #ifdef WOLFSSL_KEIL
  66402. "adcs r3, r3, %[r]\n\t"
  66403. #elif defined(__clang__)
  66404. "adcs r3, %[r]\n\t"
  66405. #else
  66406. "adc r3, %[r]\n\t"
  66407. #endif
  66408. #ifdef WOLFSSL_KEIL
  66409. "adcs r4, r4, %[r]\n\t"
  66410. #elif defined(__clang__)
  66411. "adcs r4, %[r]\n\t"
  66412. #else
  66413. "adc r4, %[r]\n\t"
  66414. #endif
  66415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66416. "adds r2, r2, r6\n\t"
  66417. #else
  66418. "add r2, r2, r6\n\t"
  66419. #endif
  66420. #ifdef WOLFSSL_KEIL
  66421. "adcs r3, r3, %[r]\n\t"
  66422. #elif defined(__clang__)
  66423. "adcs r3, %[r]\n\t"
  66424. #else
  66425. "adc r3, %[r]\n\t"
  66426. #endif
  66427. #ifdef WOLFSSL_KEIL
  66428. "adcs r4, r4, %[r]\n\t"
  66429. #elif defined(__clang__)
  66430. "adcs r4, %[r]\n\t"
  66431. #else
  66432. "adc r4, %[r]\n\t"
  66433. #endif
  66434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66435. "lsrs r6, r7, #16\n\t"
  66436. #else
  66437. "lsr r6, r7, #16\n\t"
  66438. #endif
  66439. #ifdef WOLFSSL_KEIL
  66440. "muls r5, r6, r5\n\t"
  66441. #elif defined(__clang__)
  66442. "muls r5, r6\n\t"
  66443. #else
  66444. "mul r5, r6\n\t"
  66445. #endif
  66446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66447. "lsrs r6, r5, #16\n\t"
  66448. #else
  66449. "lsr r6, r5, #16\n\t"
  66450. #endif
  66451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66452. "lsls r5, r5, #16\n\t"
  66453. #else
  66454. "lsl r5, r5, #16\n\t"
  66455. #endif
  66456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66457. "adds r2, r2, r5\n\t"
  66458. #else
  66459. "add r2, r2, r5\n\t"
  66460. #endif
  66461. #ifdef WOLFSSL_KEIL
  66462. "adcs r3, r3, r6\n\t"
  66463. #elif defined(__clang__)
  66464. "adcs r3, r6\n\t"
  66465. #else
  66466. "adc r3, r6\n\t"
  66467. #endif
  66468. #ifdef WOLFSSL_KEIL
  66469. "adcs r4, r4, %[r]\n\t"
  66470. #elif defined(__clang__)
  66471. "adcs r4, %[r]\n\t"
  66472. #else
  66473. "adc r4, %[r]\n\t"
  66474. #endif
  66475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66476. "adds r2, r2, r5\n\t"
  66477. #else
  66478. "add r2, r2, r5\n\t"
  66479. #endif
  66480. #ifdef WOLFSSL_KEIL
  66481. "adcs r3, r3, r6\n\t"
  66482. #elif defined(__clang__)
  66483. "adcs r3, r6\n\t"
  66484. #else
  66485. "adc r3, r6\n\t"
  66486. #endif
  66487. #ifdef WOLFSSL_KEIL
  66488. "adcs r4, r4, %[r]\n\t"
  66489. #elif defined(__clang__)
  66490. "adcs r4, %[r]\n\t"
  66491. #else
  66492. "adc r4, %[r]\n\t"
  66493. #endif
  66494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66495. "lsrs r5, %[a], #16\n\t"
  66496. #else
  66497. "lsr r5, %[a], #16\n\t"
  66498. #endif
  66499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66500. "lsrs r6, r7, #16\n\t"
  66501. #else
  66502. "lsr r6, r7, #16\n\t"
  66503. #endif
  66504. #ifdef WOLFSSL_KEIL
  66505. "muls r6, r5, r6\n\t"
  66506. #elif defined(__clang__)
  66507. "muls r6, r5\n\t"
  66508. #else
  66509. "mul r6, r5\n\t"
  66510. #endif
  66511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66512. "adds r3, r3, r6\n\t"
  66513. #else
  66514. "add r3, r3, r6\n\t"
  66515. #endif
  66516. #ifdef WOLFSSL_KEIL
  66517. "adcs r4, r4, %[r]\n\t"
  66518. #elif defined(__clang__)
  66519. "adcs r4, %[r]\n\t"
  66520. #else
  66521. "adc r4, %[r]\n\t"
  66522. #endif
  66523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66524. "adds r3, r3, r6\n\t"
  66525. #else
  66526. "add r3, r3, r6\n\t"
  66527. #endif
  66528. #ifdef WOLFSSL_KEIL
  66529. "adcs r4, r4, %[r]\n\t"
  66530. #elif defined(__clang__)
  66531. "adcs r4, %[r]\n\t"
  66532. #else
  66533. "adc r4, %[r]\n\t"
  66534. #endif
  66535. "uxth r6, r7\n\t"
  66536. #ifdef WOLFSSL_KEIL
  66537. "muls r5, r6, r5\n\t"
  66538. #elif defined(__clang__)
  66539. "muls r5, r6\n\t"
  66540. #else
  66541. "mul r5, r6\n\t"
  66542. #endif
  66543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66544. "lsrs r6, r5, #16\n\t"
  66545. #else
  66546. "lsr r6, r5, #16\n\t"
  66547. #endif
  66548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66549. "lsls r5, r5, #16\n\t"
  66550. #else
  66551. "lsl r5, r5, #16\n\t"
  66552. #endif
  66553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66554. "adds r2, r2, r5\n\t"
  66555. #else
  66556. "add r2, r2, r5\n\t"
  66557. #endif
  66558. #ifdef WOLFSSL_KEIL
  66559. "adcs r3, r3, r6\n\t"
  66560. #elif defined(__clang__)
  66561. "adcs r3, r6\n\t"
  66562. #else
  66563. "adc r3, r6\n\t"
  66564. #endif
  66565. #ifdef WOLFSSL_KEIL
  66566. "adcs r4, r4, %[r]\n\t"
  66567. #elif defined(__clang__)
  66568. "adcs r4, %[r]\n\t"
  66569. #else
  66570. "adc r4, %[r]\n\t"
  66571. #endif
  66572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66573. "adds r2, r2, r5\n\t"
  66574. #else
  66575. "add r2, r2, r5\n\t"
  66576. #endif
  66577. #ifdef WOLFSSL_KEIL
  66578. "adcs r3, r3, r6\n\t"
  66579. #elif defined(__clang__)
  66580. "adcs r3, r6\n\t"
  66581. #else
  66582. "adc r3, r6\n\t"
  66583. #endif
  66584. #ifdef WOLFSSL_KEIL
  66585. "adcs r4, r4, %[r]\n\t"
  66586. #elif defined(__clang__)
  66587. "adcs r4, %[r]\n\t"
  66588. #else
  66589. "adc r4, %[r]\n\t"
  66590. #endif
  66591. "# A[10] * A[5]\n\t"
  66592. "mov %[a], r9\n\t"
  66593. "ldr r7, [%[a], #20]\n\t"
  66594. "mov %[a], r12\n\t"
  66595. "uxth r5, %[a]\n\t"
  66596. "uxth r6, r7\n\t"
  66597. #ifdef WOLFSSL_KEIL
  66598. "muls r6, r5, r6\n\t"
  66599. #elif defined(__clang__)
  66600. "muls r6, r5\n\t"
  66601. #else
  66602. "mul r6, r5\n\t"
  66603. #endif
  66604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66605. "adds r2, r2, r6\n\t"
  66606. #else
  66607. "add r2, r2, r6\n\t"
  66608. #endif
  66609. #ifdef WOLFSSL_KEIL
  66610. "adcs r3, r3, %[r]\n\t"
  66611. #elif defined(__clang__)
  66612. "adcs r3, %[r]\n\t"
  66613. #else
  66614. "adc r3, %[r]\n\t"
  66615. #endif
  66616. #ifdef WOLFSSL_KEIL
  66617. "adcs r4, r4, %[r]\n\t"
  66618. #elif defined(__clang__)
  66619. "adcs r4, %[r]\n\t"
  66620. #else
  66621. "adc r4, %[r]\n\t"
  66622. #endif
  66623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66624. "adds r2, r2, r6\n\t"
  66625. #else
  66626. "add r2, r2, r6\n\t"
  66627. #endif
  66628. #ifdef WOLFSSL_KEIL
  66629. "adcs r3, r3, %[r]\n\t"
  66630. #elif defined(__clang__)
  66631. "adcs r3, %[r]\n\t"
  66632. #else
  66633. "adc r3, %[r]\n\t"
  66634. #endif
  66635. #ifdef WOLFSSL_KEIL
  66636. "adcs r4, r4, %[r]\n\t"
  66637. #elif defined(__clang__)
  66638. "adcs r4, %[r]\n\t"
  66639. #else
  66640. "adc r4, %[r]\n\t"
  66641. #endif
  66642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66643. "lsrs r6, r7, #16\n\t"
  66644. #else
  66645. "lsr r6, r7, #16\n\t"
  66646. #endif
  66647. #ifdef WOLFSSL_KEIL
  66648. "muls r5, r6, r5\n\t"
  66649. #elif defined(__clang__)
  66650. "muls r5, r6\n\t"
  66651. #else
  66652. "mul r5, r6\n\t"
  66653. #endif
  66654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66655. "lsrs r6, r5, #16\n\t"
  66656. #else
  66657. "lsr r6, r5, #16\n\t"
  66658. #endif
  66659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66660. "lsls r5, r5, #16\n\t"
  66661. #else
  66662. "lsl r5, r5, #16\n\t"
  66663. #endif
  66664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66665. "adds r2, r2, r5\n\t"
  66666. #else
  66667. "add r2, r2, r5\n\t"
  66668. #endif
  66669. #ifdef WOLFSSL_KEIL
  66670. "adcs r3, r3, r6\n\t"
  66671. #elif defined(__clang__)
  66672. "adcs r3, r6\n\t"
  66673. #else
  66674. "adc r3, r6\n\t"
  66675. #endif
  66676. #ifdef WOLFSSL_KEIL
  66677. "adcs r4, r4, %[r]\n\t"
  66678. #elif defined(__clang__)
  66679. "adcs r4, %[r]\n\t"
  66680. #else
  66681. "adc r4, %[r]\n\t"
  66682. #endif
  66683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66684. "adds r2, r2, r5\n\t"
  66685. #else
  66686. "add r2, r2, r5\n\t"
  66687. #endif
  66688. #ifdef WOLFSSL_KEIL
  66689. "adcs r3, r3, r6\n\t"
  66690. #elif defined(__clang__)
  66691. "adcs r3, r6\n\t"
  66692. #else
  66693. "adc r3, r6\n\t"
  66694. #endif
  66695. #ifdef WOLFSSL_KEIL
  66696. "adcs r4, r4, %[r]\n\t"
  66697. #elif defined(__clang__)
  66698. "adcs r4, %[r]\n\t"
  66699. #else
  66700. "adc r4, %[r]\n\t"
  66701. #endif
  66702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66703. "lsrs r5, %[a], #16\n\t"
  66704. #else
  66705. "lsr r5, %[a], #16\n\t"
  66706. #endif
  66707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66708. "lsrs r6, r7, #16\n\t"
  66709. #else
  66710. "lsr r6, r7, #16\n\t"
  66711. #endif
  66712. #ifdef WOLFSSL_KEIL
  66713. "muls r6, r5, r6\n\t"
  66714. #elif defined(__clang__)
  66715. "muls r6, r5\n\t"
  66716. #else
  66717. "mul r6, r5\n\t"
  66718. #endif
  66719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66720. "adds r3, r3, r6\n\t"
  66721. #else
  66722. "add r3, r3, r6\n\t"
  66723. #endif
  66724. #ifdef WOLFSSL_KEIL
  66725. "adcs r4, r4, %[r]\n\t"
  66726. #elif defined(__clang__)
  66727. "adcs r4, %[r]\n\t"
  66728. #else
  66729. "adc r4, %[r]\n\t"
  66730. #endif
  66731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66732. "adds r3, r3, r6\n\t"
  66733. #else
  66734. "add r3, r3, r6\n\t"
  66735. #endif
  66736. #ifdef WOLFSSL_KEIL
  66737. "adcs r4, r4, %[r]\n\t"
  66738. #elif defined(__clang__)
  66739. "adcs r4, %[r]\n\t"
  66740. #else
  66741. "adc r4, %[r]\n\t"
  66742. #endif
  66743. "uxth r6, r7\n\t"
  66744. #ifdef WOLFSSL_KEIL
  66745. "muls r5, r6, r5\n\t"
  66746. #elif defined(__clang__)
  66747. "muls r5, r6\n\t"
  66748. #else
  66749. "mul r5, r6\n\t"
  66750. #endif
  66751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66752. "lsrs r6, r5, #16\n\t"
  66753. #else
  66754. "lsr r6, r5, #16\n\t"
  66755. #endif
  66756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66757. "lsls r5, r5, #16\n\t"
  66758. #else
  66759. "lsl r5, r5, #16\n\t"
  66760. #endif
  66761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66762. "adds r2, r2, r5\n\t"
  66763. #else
  66764. "add r2, r2, r5\n\t"
  66765. #endif
  66766. #ifdef WOLFSSL_KEIL
  66767. "adcs r3, r3, r6\n\t"
  66768. #elif defined(__clang__)
  66769. "adcs r3, r6\n\t"
  66770. #else
  66771. "adc r3, r6\n\t"
  66772. #endif
  66773. #ifdef WOLFSSL_KEIL
  66774. "adcs r4, r4, %[r]\n\t"
  66775. #elif defined(__clang__)
  66776. "adcs r4, %[r]\n\t"
  66777. #else
  66778. "adc r4, %[r]\n\t"
  66779. #endif
  66780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66781. "adds r2, r2, r5\n\t"
  66782. #else
  66783. "add r2, r2, r5\n\t"
  66784. #endif
  66785. #ifdef WOLFSSL_KEIL
  66786. "adcs r3, r3, r6\n\t"
  66787. #elif defined(__clang__)
  66788. "adcs r3, r6\n\t"
  66789. #else
  66790. "adc r3, r6\n\t"
  66791. #endif
  66792. #ifdef WOLFSSL_KEIL
  66793. "adcs r4, r4, %[r]\n\t"
  66794. #elif defined(__clang__)
  66795. "adcs r4, %[r]\n\t"
  66796. #else
  66797. "adc r4, %[r]\n\t"
  66798. #endif
  66799. "# A[11] * A[4]\n\t"
  66800. "mov %[a], r9\n\t"
  66801. "ldr r7, [%[a], #16]\n\t"
  66802. "mov %[a], lr\n\t"
  66803. "uxth r5, %[a]\n\t"
  66804. "uxth r6, r7\n\t"
  66805. #ifdef WOLFSSL_KEIL
  66806. "muls r6, r5, r6\n\t"
  66807. #elif defined(__clang__)
  66808. "muls r6, r5\n\t"
  66809. #else
  66810. "mul r6, r5\n\t"
  66811. #endif
  66812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66813. "adds r2, r2, r6\n\t"
  66814. #else
  66815. "add r2, r2, r6\n\t"
  66816. #endif
  66817. #ifdef WOLFSSL_KEIL
  66818. "adcs r3, r3, %[r]\n\t"
  66819. #elif defined(__clang__)
  66820. "adcs r3, %[r]\n\t"
  66821. #else
  66822. "adc r3, %[r]\n\t"
  66823. #endif
  66824. #ifdef WOLFSSL_KEIL
  66825. "adcs r4, r4, %[r]\n\t"
  66826. #elif defined(__clang__)
  66827. "adcs r4, %[r]\n\t"
  66828. #else
  66829. "adc r4, %[r]\n\t"
  66830. #endif
  66831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66832. "adds r2, r2, r6\n\t"
  66833. #else
  66834. "add r2, r2, r6\n\t"
  66835. #endif
  66836. #ifdef WOLFSSL_KEIL
  66837. "adcs r3, r3, %[r]\n\t"
  66838. #elif defined(__clang__)
  66839. "adcs r3, %[r]\n\t"
  66840. #else
  66841. "adc r3, %[r]\n\t"
  66842. #endif
  66843. #ifdef WOLFSSL_KEIL
  66844. "adcs r4, r4, %[r]\n\t"
  66845. #elif defined(__clang__)
  66846. "adcs r4, %[r]\n\t"
  66847. #else
  66848. "adc r4, %[r]\n\t"
  66849. #endif
  66850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66851. "lsrs r6, r7, #16\n\t"
  66852. #else
  66853. "lsr r6, r7, #16\n\t"
  66854. #endif
  66855. #ifdef WOLFSSL_KEIL
  66856. "muls r5, r6, r5\n\t"
  66857. #elif defined(__clang__)
  66858. "muls r5, r6\n\t"
  66859. #else
  66860. "mul r5, r6\n\t"
  66861. #endif
  66862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66863. "lsrs r6, r5, #16\n\t"
  66864. #else
  66865. "lsr r6, r5, #16\n\t"
  66866. #endif
  66867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66868. "lsls r5, r5, #16\n\t"
  66869. #else
  66870. "lsl r5, r5, #16\n\t"
  66871. #endif
  66872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66873. "adds r2, r2, r5\n\t"
  66874. #else
  66875. "add r2, r2, r5\n\t"
  66876. #endif
  66877. #ifdef WOLFSSL_KEIL
  66878. "adcs r3, r3, r6\n\t"
  66879. #elif defined(__clang__)
  66880. "adcs r3, r6\n\t"
  66881. #else
  66882. "adc r3, r6\n\t"
  66883. #endif
  66884. #ifdef WOLFSSL_KEIL
  66885. "adcs r4, r4, %[r]\n\t"
  66886. #elif defined(__clang__)
  66887. "adcs r4, %[r]\n\t"
  66888. #else
  66889. "adc r4, %[r]\n\t"
  66890. #endif
  66891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66892. "adds r2, r2, r5\n\t"
  66893. #else
  66894. "add r2, r2, r5\n\t"
  66895. #endif
  66896. #ifdef WOLFSSL_KEIL
  66897. "adcs r3, r3, r6\n\t"
  66898. #elif defined(__clang__)
  66899. "adcs r3, r6\n\t"
  66900. #else
  66901. "adc r3, r6\n\t"
  66902. #endif
  66903. #ifdef WOLFSSL_KEIL
  66904. "adcs r4, r4, %[r]\n\t"
  66905. #elif defined(__clang__)
  66906. "adcs r4, %[r]\n\t"
  66907. #else
  66908. "adc r4, %[r]\n\t"
  66909. #endif
  66910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66911. "lsrs r5, %[a], #16\n\t"
  66912. #else
  66913. "lsr r5, %[a], #16\n\t"
  66914. #endif
  66915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66916. "lsrs r6, r7, #16\n\t"
  66917. #else
  66918. "lsr r6, r7, #16\n\t"
  66919. #endif
  66920. #ifdef WOLFSSL_KEIL
  66921. "muls r6, r5, r6\n\t"
  66922. #elif defined(__clang__)
  66923. "muls r6, r5\n\t"
  66924. #else
  66925. "mul r6, r5\n\t"
  66926. #endif
  66927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66928. "adds r3, r3, r6\n\t"
  66929. #else
  66930. "add r3, r3, r6\n\t"
  66931. #endif
  66932. #ifdef WOLFSSL_KEIL
  66933. "adcs r4, r4, %[r]\n\t"
  66934. #elif defined(__clang__)
  66935. "adcs r4, %[r]\n\t"
  66936. #else
  66937. "adc r4, %[r]\n\t"
  66938. #endif
  66939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66940. "adds r3, r3, r6\n\t"
  66941. #else
  66942. "add r3, r3, r6\n\t"
  66943. #endif
  66944. #ifdef WOLFSSL_KEIL
  66945. "adcs r4, r4, %[r]\n\t"
  66946. #elif defined(__clang__)
  66947. "adcs r4, %[r]\n\t"
  66948. #else
  66949. "adc r4, %[r]\n\t"
  66950. #endif
  66951. "uxth r6, r7\n\t"
  66952. #ifdef WOLFSSL_KEIL
  66953. "muls r5, r6, r5\n\t"
  66954. #elif defined(__clang__)
  66955. "muls r5, r6\n\t"
  66956. #else
  66957. "mul r5, r6\n\t"
  66958. #endif
  66959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66960. "lsrs r6, r5, #16\n\t"
  66961. #else
  66962. "lsr r6, r5, #16\n\t"
  66963. #endif
  66964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66965. "lsls r5, r5, #16\n\t"
  66966. #else
  66967. "lsl r5, r5, #16\n\t"
  66968. #endif
  66969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66970. "adds r2, r2, r5\n\t"
  66971. #else
  66972. "add r2, r2, r5\n\t"
  66973. #endif
  66974. #ifdef WOLFSSL_KEIL
  66975. "adcs r3, r3, r6\n\t"
  66976. #elif defined(__clang__)
  66977. "adcs r3, r6\n\t"
  66978. #else
  66979. "adc r3, r6\n\t"
  66980. #endif
  66981. #ifdef WOLFSSL_KEIL
  66982. "adcs r4, r4, %[r]\n\t"
  66983. #elif defined(__clang__)
  66984. "adcs r4, %[r]\n\t"
  66985. #else
  66986. "adc r4, %[r]\n\t"
  66987. #endif
  66988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66989. "adds r2, r2, r5\n\t"
  66990. #else
  66991. "add r2, r2, r5\n\t"
  66992. #endif
  66993. #ifdef WOLFSSL_KEIL
  66994. "adcs r3, r3, r6\n\t"
  66995. #elif defined(__clang__)
  66996. "adcs r3, r6\n\t"
  66997. #else
  66998. "adc r3, r6\n\t"
  66999. #endif
  67000. #ifdef WOLFSSL_KEIL
  67001. "adcs r4, r4, %[r]\n\t"
  67002. #elif defined(__clang__)
  67003. "adcs r4, %[r]\n\t"
  67004. #else
  67005. "adc r4, %[r]\n\t"
  67006. #endif
  67007. "mov %[r], r8\n\t"
  67008. "str r2, [%[r], #60]\n\t"
  67009. "movs %[r], #0\n\t"
  67010. "# A[11] * A[5]\n\t"
  67011. "movs r2, #0\n\t"
  67012. "mov %[a], r9\n\t"
  67013. "ldr r7, [%[a], #20]\n\t"
  67014. "mov %[a], lr\n\t"
  67015. "uxth r5, %[a]\n\t"
  67016. "uxth r6, r7\n\t"
  67017. #ifdef WOLFSSL_KEIL
  67018. "muls r6, r5, r6\n\t"
  67019. #elif defined(__clang__)
  67020. "muls r6, r5\n\t"
  67021. #else
  67022. "mul r6, r5\n\t"
  67023. #endif
  67024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67025. "adds r3, r3, r6\n\t"
  67026. #else
  67027. "add r3, r3, r6\n\t"
  67028. #endif
  67029. #ifdef WOLFSSL_KEIL
  67030. "adcs r4, r4, %[r]\n\t"
  67031. #elif defined(__clang__)
  67032. "adcs r4, %[r]\n\t"
  67033. #else
  67034. "adc r4, %[r]\n\t"
  67035. #endif
  67036. #ifdef WOLFSSL_KEIL
  67037. "adcs r2, r2, %[r]\n\t"
  67038. #elif defined(__clang__)
  67039. "adcs r2, %[r]\n\t"
  67040. #else
  67041. "adc r2, %[r]\n\t"
  67042. #endif
  67043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67044. "adds r3, r3, r6\n\t"
  67045. #else
  67046. "add r3, r3, r6\n\t"
  67047. #endif
  67048. #ifdef WOLFSSL_KEIL
  67049. "adcs r4, r4, %[r]\n\t"
  67050. #elif defined(__clang__)
  67051. "adcs r4, %[r]\n\t"
  67052. #else
  67053. "adc r4, %[r]\n\t"
  67054. #endif
  67055. #ifdef WOLFSSL_KEIL
  67056. "adcs r2, r2, %[r]\n\t"
  67057. #elif defined(__clang__)
  67058. "adcs r2, %[r]\n\t"
  67059. #else
  67060. "adc r2, %[r]\n\t"
  67061. #endif
  67062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67063. "lsrs r6, r7, #16\n\t"
  67064. #else
  67065. "lsr r6, r7, #16\n\t"
  67066. #endif
  67067. #ifdef WOLFSSL_KEIL
  67068. "muls r5, r6, r5\n\t"
  67069. #elif defined(__clang__)
  67070. "muls r5, r6\n\t"
  67071. #else
  67072. "mul r5, r6\n\t"
  67073. #endif
  67074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67075. "lsrs r6, r5, #16\n\t"
  67076. #else
  67077. "lsr r6, r5, #16\n\t"
  67078. #endif
  67079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67080. "lsls r5, r5, #16\n\t"
  67081. #else
  67082. "lsl r5, r5, #16\n\t"
  67083. #endif
  67084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67085. "adds r3, r3, r5\n\t"
  67086. #else
  67087. "add r3, r3, r5\n\t"
  67088. #endif
  67089. #ifdef WOLFSSL_KEIL
  67090. "adcs r4, r4, r6\n\t"
  67091. #elif defined(__clang__)
  67092. "adcs r4, r6\n\t"
  67093. #else
  67094. "adc r4, r6\n\t"
  67095. #endif
  67096. #ifdef WOLFSSL_KEIL
  67097. "adcs r2, r2, %[r]\n\t"
  67098. #elif defined(__clang__)
  67099. "adcs r2, %[r]\n\t"
  67100. #else
  67101. "adc r2, %[r]\n\t"
  67102. #endif
  67103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67104. "adds r3, r3, r5\n\t"
  67105. #else
  67106. "add r3, r3, r5\n\t"
  67107. #endif
  67108. #ifdef WOLFSSL_KEIL
  67109. "adcs r4, r4, r6\n\t"
  67110. #elif defined(__clang__)
  67111. "adcs r4, r6\n\t"
  67112. #else
  67113. "adc r4, r6\n\t"
  67114. #endif
  67115. #ifdef WOLFSSL_KEIL
  67116. "adcs r2, r2, %[r]\n\t"
  67117. #elif defined(__clang__)
  67118. "adcs r2, %[r]\n\t"
  67119. #else
  67120. "adc r2, %[r]\n\t"
  67121. #endif
  67122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67123. "lsrs r5, %[a], #16\n\t"
  67124. #else
  67125. "lsr r5, %[a], #16\n\t"
  67126. #endif
  67127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67128. "lsrs r6, r7, #16\n\t"
  67129. #else
  67130. "lsr r6, r7, #16\n\t"
  67131. #endif
  67132. #ifdef WOLFSSL_KEIL
  67133. "muls r6, r5, r6\n\t"
  67134. #elif defined(__clang__)
  67135. "muls r6, r5\n\t"
  67136. #else
  67137. "mul r6, r5\n\t"
  67138. #endif
  67139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67140. "adds r4, r4, r6\n\t"
  67141. #else
  67142. "add r4, r4, r6\n\t"
  67143. #endif
  67144. #ifdef WOLFSSL_KEIL
  67145. "adcs r2, r2, %[r]\n\t"
  67146. #elif defined(__clang__)
  67147. "adcs r2, %[r]\n\t"
  67148. #else
  67149. "adc r2, %[r]\n\t"
  67150. #endif
  67151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67152. "adds r4, r4, r6\n\t"
  67153. #else
  67154. "add r4, r4, r6\n\t"
  67155. #endif
  67156. #ifdef WOLFSSL_KEIL
  67157. "adcs r2, r2, %[r]\n\t"
  67158. #elif defined(__clang__)
  67159. "adcs r2, %[r]\n\t"
  67160. #else
  67161. "adc r2, %[r]\n\t"
  67162. #endif
  67163. "uxth r6, r7\n\t"
  67164. #ifdef WOLFSSL_KEIL
  67165. "muls r5, r6, r5\n\t"
  67166. #elif defined(__clang__)
  67167. "muls r5, r6\n\t"
  67168. #else
  67169. "mul r5, r6\n\t"
  67170. #endif
  67171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67172. "lsrs r6, r5, #16\n\t"
  67173. #else
  67174. "lsr r6, r5, #16\n\t"
  67175. #endif
  67176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67177. "lsls r5, r5, #16\n\t"
  67178. #else
  67179. "lsl r5, r5, #16\n\t"
  67180. #endif
  67181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67182. "adds r3, r3, r5\n\t"
  67183. #else
  67184. "add r3, r3, r5\n\t"
  67185. #endif
  67186. #ifdef WOLFSSL_KEIL
  67187. "adcs r4, r4, r6\n\t"
  67188. #elif defined(__clang__)
  67189. "adcs r4, r6\n\t"
  67190. #else
  67191. "adc r4, r6\n\t"
  67192. #endif
  67193. #ifdef WOLFSSL_KEIL
  67194. "adcs r2, r2, %[r]\n\t"
  67195. #elif defined(__clang__)
  67196. "adcs r2, %[r]\n\t"
  67197. #else
  67198. "adc r2, %[r]\n\t"
  67199. #endif
  67200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67201. "adds r3, r3, r5\n\t"
  67202. #else
  67203. "add r3, r3, r5\n\t"
  67204. #endif
  67205. #ifdef WOLFSSL_KEIL
  67206. "adcs r4, r4, r6\n\t"
  67207. #elif defined(__clang__)
  67208. "adcs r4, r6\n\t"
  67209. #else
  67210. "adc r4, r6\n\t"
  67211. #endif
  67212. #ifdef WOLFSSL_KEIL
  67213. "adcs r2, r2, %[r]\n\t"
  67214. #elif defined(__clang__)
  67215. "adcs r2, %[r]\n\t"
  67216. #else
  67217. "adc r2, %[r]\n\t"
  67218. #endif
  67219. "# A[10] * A[6]\n\t"
  67220. "mov %[a], r9\n\t"
  67221. "ldr r7, [%[a], #24]\n\t"
  67222. "mov %[a], r12\n\t"
  67223. "uxth r5, %[a]\n\t"
  67224. "uxth r6, r7\n\t"
  67225. #ifdef WOLFSSL_KEIL
  67226. "muls r6, r5, r6\n\t"
  67227. #elif defined(__clang__)
  67228. "muls r6, r5\n\t"
  67229. #else
  67230. "mul r6, r5\n\t"
  67231. #endif
  67232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67233. "adds r3, r3, r6\n\t"
  67234. #else
  67235. "add r3, r3, r6\n\t"
  67236. #endif
  67237. #ifdef WOLFSSL_KEIL
  67238. "adcs r4, r4, %[r]\n\t"
  67239. #elif defined(__clang__)
  67240. "adcs r4, %[r]\n\t"
  67241. #else
  67242. "adc r4, %[r]\n\t"
  67243. #endif
  67244. #ifdef WOLFSSL_KEIL
  67245. "adcs r2, r2, %[r]\n\t"
  67246. #elif defined(__clang__)
  67247. "adcs r2, %[r]\n\t"
  67248. #else
  67249. "adc r2, %[r]\n\t"
  67250. #endif
  67251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67252. "adds r3, r3, r6\n\t"
  67253. #else
  67254. "add r3, r3, r6\n\t"
  67255. #endif
  67256. #ifdef WOLFSSL_KEIL
  67257. "adcs r4, r4, %[r]\n\t"
  67258. #elif defined(__clang__)
  67259. "adcs r4, %[r]\n\t"
  67260. #else
  67261. "adc r4, %[r]\n\t"
  67262. #endif
  67263. #ifdef WOLFSSL_KEIL
  67264. "adcs r2, r2, %[r]\n\t"
  67265. #elif defined(__clang__)
  67266. "adcs r2, %[r]\n\t"
  67267. #else
  67268. "adc r2, %[r]\n\t"
  67269. #endif
  67270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67271. "lsrs r6, r7, #16\n\t"
  67272. #else
  67273. "lsr r6, r7, #16\n\t"
  67274. #endif
  67275. #ifdef WOLFSSL_KEIL
  67276. "muls r5, r6, r5\n\t"
  67277. #elif defined(__clang__)
  67278. "muls r5, r6\n\t"
  67279. #else
  67280. "mul r5, r6\n\t"
  67281. #endif
  67282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67283. "lsrs r6, r5, #16\n\t"
  67284. #else
  67285. "lsr r6, r5, #16\n\t"
  67286. #endif
  67287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67288. "lsls r5, r5, #16\n\t"
  67289. #else
  67290. "lsl r5, r5, #16\n\t"
  67291. #endif
  67292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67293. "adds r3, r3, r5\n\t"
  67294. #else
  67295. "add r3, r3, r5\n\t"
  67296. #endif
  67297. #ifdef WOLFSSL_KEIL
  67298. "adcs r4, r4, r6\n\t"
  67299. #elif defined(__clang__)
  67300. "adcs r4, r6\n\t"
  67301. #else
  67302. "adc r4, r6\n\t"
  67303. #endif
  67304. #ifdef WOLFSSL_KEIL
  67305. "adcs r2, r2, %[r]\n\t"
  67306. #elif defined(__clang__)
  67307. "adcs r2, %[r]\n\t"
  67308. #else
  67309. "adc r2, %[r]\n\t"
  67310. #endif
  67311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67312. "adds r3, r3, r5\n\t"
  67313. #else
  67314. "add r3, r3, r5\n\t"
  67315. #endif
  67316. #ifdef WOLFSSL_KEIL
  67317. "adcs r4, r4, r6\n\t"
  67318. #elif defined(__clang__)
  67319. "adcs r4, r6\n\t"
  67320. #else
  67321. "adc r4, r6\n\t"
  67322. #endif
  67323. #ifdef WOLFSSL_KEIL
  67324. "adcs r2, r2, %[r]\n\t"
  67325. #elif defined(__clang__)
  67326. "adcs r2, %[r]\n\t"
  67327. #else
  67328. "adc r2, %[r]\n\t"
  67329. #endif
  67330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67331. "lsrs r5, %[a], #16\n\t"
  67332. #else
  67333. "lsr r5, %[a], #16\n\t"
  67334. #endif
  67335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67336. "lsrs r6, r7, #16\n\t"
  67337. #else
  67338. "lsr r6, r7, #16\n\t"
  67339. #endif
  67340. #ifdef WOLFSSL_KEIL
  67341. "muls r6, r5, r6\n\t"
  67342. #elif defined(__clang__)
  67343. "muls r6, r5\n\t"
  67344. #else
  67345. "mul r6, r5\n\t"
  67346. #endif
  67347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67348. "adds r4, r4, r6\n\t"
  67349. #else
  67350. "add r4, r4, r6\n\t"
  67351. #endif
  67352. #ifdef WOLFSSL_KEIL
  67353. "adcs r2, r2, %[r]\n\t"
  67354. #elif defined(__clang__)
  67355. "adcs r2, %[r]\n\t"
  67356. #else
  67357. "adc r2, %[r]\n\t"
  67358. #endif
  67359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67360. "adds r4, r4, r6\n\t"
  67361. #else
  67362. "add r4, r4, r6\n\t"
  67363. #endif
  67364. #ifdef WOLFSSL_KEIL
  67365. "adcs r2, r2, %[r]\n\t"
  67366. #elif defined(__clang__)
  67367. "adcs r2, %[r]\n\t"
  67368. #else
  67369. "adc r2, %[r]\n\t"
  67370. #endif
  67371. "uxth r6, r7\n\t"
  67372. #ifdef WOLFSSL_KEIL
  67373. "muls r5, r6, r5\n\t"
  67374. #elif defined(__clang__)
  67375. "muls r5, r6\n\t"
  67376. #else
  67377. "mul r5, r6\n\t"
  67378. #endif
  67379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67380. "lsrs r6, r5, #16\n\t"
  67381. #else
  67382. "lsr r6, r5, #16\n\t"
  67383. #endif
  67384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67385. "lsls r5, r5, #16\n\t"
  67386. #else
  67387. "lsl r5, r5, #16\n\t"
  67388. #endif
  67389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67390. "adds r3, r3, r5\n\t"
  67391. #else
  67392. "add r3, r3, r5\n\t"
  67393. #endif
  67394. #ifdef WOLFSSL_KEIL
  67395. "adcs r4, r4, r6\n\t"
  67396. #elif defined(__clang__)
  67397. "adcs r4, r6\n\t"
  67398. #else
  67399. "adc r4, r6\n\t"
  67400. #endif
  67401. #ifdef WOLFSSL_KEIL
  67402. "adcs r2, r2, %[r]\n\t"
  67403. #elif defined(__clang__)
  67404. "adcs r2, %[r]\n\t"
  67405. #else
  67406. "adc r2, %[r]\n\t"
  67407. #endif
  67408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67409. "adds r3, r3, r5\n\t"
  67410. #else
  67411. "add r3, r3, r5\n\t"
  67412. #endif
  67413. #ifdef WOLFSSL_KEIL
  67414. "adcs r4, r4, r6\n\t"
  67415. #elif defined(__clang__)
  67416. "adcs r4, r6\n\t"
  67417. #else
  67418. "adc r4, r6\n\t"
  67419. #endif
  67420. #ifdef WOLFSSL_KEIL
  67421. "adcs r2, r2, %[r]\n\t"
  67422. #elif defined(__clang__)
  67423. "adcs r2, %[r]\n\t"
  67424. #else
  67425. "adc r2, %[r]\n\t"
  67426. #endif
  67427. "# A[9] * A[7]\n\t"
  67428. "mov %[a], r9\n\t"
  67429. "ldr r7, [%[a], #28]\n\t"
  67430. "mov %[a], r11\n\t"
  67431. "uxth r5, %[a]\n\t"
  67432. "uxth r6, r7\n\t"
  67433. #ifdef WOLFSSL_KEIL
  67434. "muls r6, r5, r6\n\t"
  67435. #elif defined(__clang__)
  67436. "muls r6, r5\n\t"
  67437. #else
  67438. "mul r6, r5\n\t"
  67439. #endif
  67440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67441. "adds r3, r3, r6\n\t"
  67442. #else
  67443. "add r3, r3, r6\n\t"
  67444. #endif
  67445. #ifdef WOLFSSL_KEIL
  67446. "adcs r4, r4, %[r]\n\t"
  67447. #elif defined(__clang__)
  67448. "adcs r4, %[r]\n\t"
  67449. #else
  67450. "adc r4, %[r]\n\t"
  67451. #endif
  67452. #ifdef WOLFSSL_KEIL
  67453. "adcs r2, r2, %[r]\n\t"
  67454. #elif defined(__clang__)
  67455. "adcs r2, %[r]\n\t"
  67456. #else
  67457. "adc r2, %[r]\n\t"
  67458. #endif
  67459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67460. "adds r3, r3, r6\n\t"
  67461. #else
  67462. "add r3, r3, r6\n\t"
  67463. #endif
  67464. #ifdef WOLFSSL_KEIL
  67465. "adcs r4, r4, %[r]\n\t"
  67466. #elif defined(__clang__)
  67467. "adcs r4, %[r]\n\t"
  67468. #else
  67469. "adc r4, %[r]\n\t"
  67470. #endif
  67471. #ifdef WOLFSSL_KEIL
  67472. "adcs r2, r2, %[r]\n\t"
  67473. #elif defined(__clang__)
  67474. "adcs r2, %[r]\n\t"
  67475. #else
  67476. "adc r2, %[r]\n\t"
  67477. #endif
  67478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67479. "lsrs r6, r7, #16\n\t"
  67480. #else
  67481. "lsr r6, r7, #16\n\t"
  67482. #endif
  67483. #ifdef WOLFSSL_KEIL
  67484. "muls r5, r6, r5\n\t"
  67485. #elif defined(__clang__)
  67486. "muls r5, r6\n\t"
  67487. #else
  67488. "mul r5, r6\n\t"
  67489. #endif
  67490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67491. "lsrs r6, r5, #16\n\t"
  67492. #else
  67493. "lsr r6, r5, #16\n\t"
  67494. #endif
  67495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67496. "lsls r5, r5, #16\n\t"
  67497. #else
  67498. "lsl r5, r5, #16\n\t"
  67499. #endif
  67500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67501. "adds r3, r3, r5\n\t"
  67502. #else
  67503. "add r3, r3, r5\n\t"
  67504. #endif
  67505. #ifdef WOLFSSL_KEIL
  67506. "adcs r4, r4, r6\n\t"
  67507. #elif defined(__clang__)
  67508. "adcs r4, r6\n\t"
  67509. #else
  67510. "adc r4, r6\n\t"
  67511. #endif
  67512. #ifdef WOLFSSL_KEIL
  67513. "adcs r2, r2, %[r]\n\t"
  67514. #elif defined(__clang__)
  67515. "adcs r2, %[r]\n\t"
  67516. #else
  67517. "adc r2, %[r]\n\t"
  67518. #endif
  67519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67520. "adds r3, r3, r5\n\t"
  67521. #else
  67522. "add r3, r3, r5\n\t"
  67523. #endif
  67524. #ifdef WOLFSSL_KEIL
  67525. "adcs r4, r4, r6\n\t"
  67526. #elif defined(__clang__)
  67527. "adcs r4, r6\n\t"
  67528. #else
  67529. "adc r4, r6\n\t"
  67530. #endif
  67531. #ifdef WOLFSSL_KEIL
  67532. "adcs r2, r2, %[r]\n\t"
  67533. #elif defined(__clang__)
  67534. "adcs r2, %[r]\n\t"
  67535. #else
  67536. "adc r2, %[r]\n\t"
  67537. #endif
  67538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67539. "lsrs r5, %[a], #16\n\t"
  67540. #else
  67541. "lsr r5, %[a], #16\n\t"
  67542. #endif
  67543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67544. "lsrs r6, r7, #16\n\t"
  67545. #else
  67546. "lsr r6, r7, #16\n\t"
  67547. #endif
  67548. #ifdef WOLFSSL_KEIL
  67549. "muls r6, r5, r6\n\t"
  67550. #elif defined(__clang__)
  67551. "muls r6, r5\n\t"
  67552. #else
  67553. "mul r6, r5\n\t"
  67554. #endif
  67555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67556. "adds r4, r4, r6\n\t"
  67557. #else
  67558. "add r4, r4, r6\n\t"
  67559. #endif
  67560. #ifdef WOLFSSL_KEIL
  67561. "adcs r2, r2, %[r]\n\t"
  67562. #elif defined(__clang__)
  67563. "adcs r2, %[r]\n\t"
  67564. #else
  67565. "adc r2, %[r]\n\t"
  67566. #endif
  67567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67568. "adds r4, r4, r6\n\t"
  67569. #else
  67570. "add r4, r4, r6\n\t"
  67571. #endif
  67572. #ifdef WOLFSSL_KEIL
  67573. "adcs r2, r2, %[r]\n\t"
  67574. #elif defined(__clang__)
  67575. "adcs r2, %[r]\n\t"
  67576. #else
  67577. "adc r2, %[r]\n\t"
  67578. #endif
  67579. "uxth r6, r7\n\t"
  67580. #ifdef WOLFSSL_KEIL
  67581. "muls r5, r6, r5\n\t"
  67582. #elif defined(__clang__)
  67583. "muls r5, r6\n\t"
  67584. #else
  67585. "mul r5, r6\n\t"
  67586. #endif
  67587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67588. "lsrs r6, r5, #16\n\t"
  67589. #else
  67590. "lsr r6, r5, #16\n\t"
  67591. #endif
  67592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67593. "lsls r5, r5, #16\n\t"
  67594. #else
  67595. "lsl r5, r5, #16\n\t"
  67596. #endif
  67597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67598. "adds r3, r3, r5\n\t"
  67599. #else
  67600. "add r3, r3, r5\n\t"
  67601. #endif
  67602. #ifdef WOLFSSL_KEIL
  67603. "adcs r4, r4, r6\n\t"
  67604. #elif defined(__clang__)
  67605. "adcs r4, r6\n\t"
  67606. #else
  67607. "adc r4, r6\n\t"
  67608. #endif
  67609. #ifdef WOLFSSL_KEIL
  67610. "adcs r2, r2, %[r]\n\t"
  67611. #elif defined(__clang__)
  67612. "adcs r2, %[r]\n\t"
  67613. #else
  67614. "adc r2, %[r]\n\t"
  67615. #endif
  67616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67617. "adds r3, r3, r5\n\t"
  67618. #else
  67619. "add r3, r3, r5\n\t"
  67620. #endif
  67621. #ifdef WOLFSSL_KEIL
  67622. "adcs r4, r4, r6\n\t"
  67623. #elif defined(__clang__)
  67624. "adcs r4, r6\n\t"
  67625. #else
  67626. "adc r4, r6\n\t"
  67627. #endif
  67628. #ifdef WOLFSSL_KEIL
  67629. "adcs r2, r2, %[r]\n\t"
  67630. #elif defined(__clang__)
  67631. "adcs r2, %[r]\n\t"
  67632. #else
  67633. "adc r2, %[r]\n\t"
  67634. #endif
  67635. "# A[8] * A[8]\n\t"
  67636. "mov r7, r10\n\t"
  67637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67638. "lsrs r6, r7, #16\n\t"
  67639. #else
  67640. "lsr r6, r7, #16\n\t"
  67641. #endif
  67642. "uxth r5, r7\n\t"
  67643. #ifdef WOLFSSL_KEIL
  67644. "muls r5, r5, r5\n\t"
  67645. #elif defined(__clang__)
  67646. "muls r5, r5\n\t"
  67647. #else
  67648. "mul r5, r5\n\t"
  67649. #endif
  67650. #ifdef WOLFSSL_KEIL
  67651. "muls r6, r6, r6\n\t"
  67652. #elif defined(__clang__)
  67653. "muls r6, r6\n\t"
  67654. #else
  67655. "mul r6, r6\n\t"
  67656. #endif
  67657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67658. "adds r3, r3, r5\n\t"
  67659. #else
  67660. "add r3, r3, r5\n\t"
  67661. #endif
  67662. #ifdef WOLFSSL_KEIL
  67663. "adcs r4, r4, r6\n\t"
  67664. #elif defined(__clang__)
  67665. "adcs r4, r6\n\t"
  67666. #else
  67667. "adc r4, r6\n\t"
  67668. #endif
  67669. #ifdef WOLFSSL_KEIL
  67670. "adcs r2, r2, %[r]\n\t"
  67671. #elif defined(__clang__)
  67672. "adcs r2, %[r]\n\t"
  67673. #else
  67674. "adc r2, %[r]\n\t"
  67675. #endif
  67676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67677. "lsrs r6, r7, #16\n\t"
  67678. #else
  67679. "lsr r6, r7, #16\n\t"
  67680. #endif
  67681. "uxth r5, r7\n\t"
  67682. #ifdef WOLFSSL_KEIL
  67683. "muls r5, r6, r5\n\t"
  67684. #elif defined(__clang__)
  67685. "muls r5, r6\n\t"
  67686. #else
  67687. "mul r5, r6\n\t"
  67688. #endif
  67689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67690. "lsrs r6, r5, #15\n\t"
  67691. #else
  67692. "lsr r6, r5, #15\n\t"
  67693. #endif
  67694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67695. "lsls r5, r5, #17\n\t"
  67696. #else
  67697. "lsl r5, r5, #17\n\t"
  67698. #endif
  67699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67700. "adds r3, r3, r5\n\t"
  67701. #else
  67702. "add r3, r3, r5\n\t"
  67703. #endif
  67704. #ifdef WOLFSSL_KEIL
  67705. "adcs r4, r4, r6\n\t"
  67706. #elif defined(__clang__)
  67707. "adcs r4, r6\n\t"
  67708. #else
  67709. "adc r4, r6\n\t"
  67710. #endif
  67711. #ifdef WOLFSSL_KEIL
  67712. "adcs r2, r2, %[r]\n\t"
  67713. #elif defined(__clang__)
  67714. "adcs r2, %[r]\n\t"
  67715. #else
  67716. "adc r2, %[r]\n\t"
  67717. #endif
  67718. "mov %[r], r8\n\t"
  67719. "str r3, [%[r], #64]\n\t"
  67720. "movs %[r], #0\n\t"
  67721. "# A[9] * A[8]\n\t"
  67722. "movs r3, #0\n\t"
  67723. "mov %[a], r9\n\t"
  67724. "mov %[a], r11\n\t"
  67725. "uxth r5, %[a]\n\t"
  67726. "uxth r6, r7\n\t"
  67727. #ifdef WOLFSSL_KEIL
  67728. "muls r6, r5, r6\n\t"
  67729. #elif defined(__clang__)
  67730. "muls r6, r5\n\t"
  67731. #else
  67732. "mul r6, r5\n\t"
  67733. #endif
  67734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67735. "adds r4, r4, r6\n\t"
  67736. #else
  67737. "add r4, r4, r6\n\t"
  67738. #endif
  67739. #ifdef WOLFSSL_KEIL
  67740. "adcs r2, r2, %[r]\n\t"
  67741. #elif defined(__clang__)
  67742. "adcs r2, %[r]\n\t"
  67743. #else
  67744. "adc r2, %[r]\n\t"
  67745. #endif
  67746. #ifdef WOLFSSL_KEIL
  67747. "adcs r3, r3, %[r]\n\t"
  67748. #elif defined(__clang__)
  67749. "adcs r3, %[r]\n\t"
  67750. #else
  67751. "adc r3, %[r]\n\t"
  67752. #endif
  67753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67754. "adds r4, r4, r6\n\t"
  67755. #else
  67756. "add r4, r4, r6\n\t"
  67757. #endif
  67758. #ifdef WOLFSSL_KEIL
  67759. "adcs r2, r2, %[r]\n\t"
  67760. #elif defined(__clang__)
  67761. "adcs r2, %[r]\n\t"
  67762. #else
  67763. "adc r2, %[r]\n\t"
  67764. #endif
  67765. #ifdef WOLFSSL_KEIL
  67766. "adcs r3, r3, %[r]\n\t"
  67767. #elif defined(__clang__)
  67768. "adcs r3, %[r]\n\t"
  67769. #else
  67770. "adc r3, %[r]\n\t"
  67771. #endif
  67772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67773. "lsrs r6, r7, #16\n\t"
  67774. #else
  67775. "lsr r6, r7, #16\n\t"
  67776. #endif
  67777. #ifdef WOLFSSL_KEIL
  67778. "muls r5, r6, r5\n\t"
  67779. #elif defined(__clang__)
  67780. "muls r5, r6\n\t"
  67781. #else
  67782. "mul r5, r6\n\t"
  67783. #endif
  67784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67785. "lsrs r6, r5, #16\n\t"
  67786. #else
  67787. "lsr r6, r5, #16\n\t"
  67788. #endif
  67789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67790. "lsls r5, r5, #16\n\t"
  67791. #else
  67792. "lsl r5, r5, #16\n\t"
  67793. #endif
  67794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67795. "adds r4, r4, r5\n\t"
  67796. #else
  67797. "add r4, r4, r5\n\t"
  67798. #endif
  67799. #ifdef WOLFSSL_KEIL
  67800. "adcs r2, r2, r6\n\t"
  67801. #elif defined(__clang__)
  67802. "adcs r2, r6\n\t"
  67803. #else
  67804. "adc r2, r6\n\t"
  67805. #endif
  67806. #ifdef WOLFSSL_KEIL
  67807. "adcs r3, r3, %[r]\n\t"
  67808. #elif defined(__clang__)
  67809. "adcs r3, %[r]\n\t"
  67810. #else
  67811. "adc r3, %[r]\n\t"
  67812. #endif
  67813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67814. "adds r4, r4, r5\n\t"
  67815. #else
  67816. "add r4, r4, r5\n\t"
  67817. #endif
  67818. #ifdef WOLFSSL_KEIL
  67819. "adcs r2, r2, r6\n\t"
  67820. #elif defined(__clang__)
  67821. "adcs r2, r6\n\t"
  67822. #else
  67823. "adc r2, r6\n\t"
  67824. #endif
  67825. #ifdef WOLFSSL_KEIL
  67826. "adcs r3, r3, %[r]\n\t"
  67827. #elif defined(__clang__)
  67828. "adcs r3, %[r]\n\t"
  67829. #else
  67830. "adc r3, %[r]\n\t"
  67831. #endif
  67832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67833. "lsrs r5, %[a], #16\n\t"
  67834. #else
  67835. "lsr r5, %[a], #16\n\t"
  67836. #endif
  67837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67838. "lsrs r6, r7, #16\n\t"
  67839. #else
  67840. "lsr r6, r7, #16\n\t"
  67841. #endif
  67842. #ifdef WOLFSSL_KEIL
  67843. "muls r6, r5, r6\n\t"
  67844. #elif defined(__clang__)
  67845. "muls r6, r5\n\t"
  67846. #else
  67847. "mul r6, r5\n\t"
  67848. #endif
  67849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67850. "adds r2, r2, r6\n\t"
  67851. #else
  67852. "add r2, r2, r6\n\t"
  67853. #endif
  67854. #ifdef WOLFSSL_KEIL
  67855. "adcs r3, r3, %[r]\n\t"
  67856. #elif defined(__clang__)
  67857. "adcs r3, %[r]\n\t"
  67858. #else
  67859. "adc r3, %[r]\n\t"
  67860. #endif
  67861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67862. "adds r2, r2, r6\n\t"
  67863. #else
  67864. "add r2, r2, r6\n\t"
  67865. #endif
  67866. #ifdef WOLFSSL_KEIL
  67867. "adcs r3, r3, %[r]\n\t"
  67868. #elif defined(__clang__)
  67869. "adcs r3, %[r]\n\t"
  67870. #else
  67871. "adc r3, %[r]\n\t"
  67872. #endif
  67873. "uxth r6, r7\n\t"
  67874. #ifdef WOLFSSL_KEIL
  67875. "muls r5, r6, r5\n\t"
  67876. #elif defined(__clang__)
  67877. "muls r5, r6\n\t"
  67878. #else
  67879. "mul r5, r6\n\t"
  67880. #endif
  67881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67882. "lsrs r6, r5, #16\n\t"
  67883. #else
  67884. "lsr r6, r5, #16\n\t"
  67885. #endif
  67886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67887. "lsls r5, r5, #16\n\t"
  67888. #else
  67889. "lsl r5, r5, #16\n\t"
  67890. #endif
  67891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67892. "adds r4, r4, r5\n\t"
  67893. #else
  67894. "add r4, r4, r5\n\t"
  67895. #endif
  67896. #ifdef WOLFSSL_KEIL
  67897. "adcs r2, r2, r6\n\t"
  67898. #elif defined(__clang__)
  67899. "adcs r2, r6\n\t"
  67900. #else
  67901. "adc r2, r6\n\t"
  67902. #endif
  67903. #ifdef WOLFSSL_KEIL
  67904. "adcs r3, r3, %[r]\n\t"
  67905. #elif defined(__clang__)
  67906. "adcs r3, %[r]\n\t"
  67907. #else
  67908. "adc r3, %[r]\n\t"
  67909. #endif
  67910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67911. "adds r4, r4, r5\n\t"
  67912. #else
  67913. "add r4, r4, r5\n\t"
  67914. #endif
  67915. #ifdef WOLFSSL_KEIL
  67916. "adcs r2, r2, r6\n\t"
  67917. #elif defined(__clang__)
  67918. "adcs r2, r6\n\t"
  67919. #else
  67920. "adc r2, r6\n\t"
  67921. #endif
  67922. #ifdef WOLFSSL_KEIL
  67923. "adcs r3, r3, %[r]\n\t"
  67924. #elif defined(__clang__)
  67925. "adcs r3, %[r]\n\t"
  67926. #else
  67927. "adc r3, %[r]\n\t"
  67928. #endif
  67929. "# A[10] * A[7]\n\t"
  67930. "mov %[a], r9\n\t"
  67931. "ldr r7, [%[a], #28]\n\t"
  67932. "mov %[a], r12\n\t"
  67933. "uxth r5, %[a]\n\t"
  67934. "uxth r6, r7\n\t"
  67935. #ifdef WOLFSSL_KEIL
  67936. "muls r6, r5, r6\n\t"
  67937. #elif defined(__clang__)
  67938. "muls r6, r5\n\t"
  67939. #else
  67940. "mul r6, r5\n\t"
  67941. #endif
  67942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67943. "adds r4, r4, r6\n\t"
  67944. #else
  67945. "add r4, r4, r6\n\t"
  67946. #endif
  67947. #ifdef WOLFSSL_KEIL
  67948. "adcs r2, r2, %[r]\n\t"
  67949. #elif defined(__clang__)
  67950. "adcs r2, %[r]\n\t"
  67951. #else
  67952. "adc r2, %[r]\n\t"
  67953. #endif
  67954. #ifdef WOLFSSL_KEIL
  67955. "adcs r3, r3, %[r]\n\t"
  67956. #elif defined(__clang__)
  67957. "adcs r3, %[r]\n\t"
  67958. #else
  67959. "adc r3, %[r]\n\t"
  67960. #endif
  67961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67962. "adds r4, r4, r6\n\t"
  67963. #else
  67964. "add r4, r4, r6\n\t"
  67965. #endif
  67966. #ifdef WOLFSSL_KEIL
  67967. "adcs r2, r2, %[r]\n\t"
  67968. #elif defined(__clang__)
  67969. "adcs r2, %[r]\n\t"
  67970. #else
  67971. "adc r2, %[r]\n\t"
  67972. #endif
  67973. #ifdef WOLFSSL_KEIL
  67974. "adcs r3, r3, %[r]\n\t"
  67975. #elif defined(__clang__)
  67976. "adcs r3, %[r]\n\t"
  67977. #else
  67978. "adc r3, %[r]\n\t"
  67979. #endif
  67980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67981. "lsrs r6, r7, #16\n\t"
  67982. #else
  67983. "lsr r6, r7, #16\n\t"
  67984. #endif
  67985. #ifdef WOLFSSL_KEIL
  67986. "muls r5, r6, r5\n\t"
  67987. #elif defined(__clang__)
  67988. "muls r5, r6\n\t"
  67989. #else
  67990. "mul r5, r6\n\t"
  67991. #endif
  67992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67993. "lsrs r6, r5, #16\n\t"
  67994. #else
  67995. "lsr r6, r5, #16\n\t"
  67996. #endif
  67997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67998. "lsls r5, r5, #16\n\t"
  67999. #else
  68000. "lsl r5, r5, #16\n\t"
  68001. #endif
  68002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68003. "adds r4, r4, r5\n\t"
  68004. #else
  68005. "add r4, r4, r5\n\t"
  68006. #endif
  68007. #ifdef WOLFSSL_KEIL
  68008. "adcs r2, r2, r6\n\t"
  68009. #elif defined(__clang__)
  68010. "adcs r2, r6\n\t"
  68011. #else
  68012. "adc r2, r6\n\t"
  68013. #endif
  68014. #ifdef WOLFSSL_KEIL
  68015. "adcs r3, r3, %[r]\n\t"
  68016. #elif defined(__clang__)
  68017. "adcs r3, %[r]\n\t"
  68018. #else
  68019. "adc r3, %[r]\n\t"
  68020. #endif
  68021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68022. "adds r4, r4, r5\n\t"
  68023. #else
  68024. "add r4, r4, r5\n\t"
  68025. #endif
  68026. #ifdef WOLFSSL_KEIL
  68027. "adcs r2, r2, r6\n\t"
  68028. #elif defined(__clang__)
  68029. "adcs r2, r6\n\t"
  68030. #else
  68031. "adc r2, r6\n\t"
  68032. #endif
  68033. #ifdef WOLFSSL_KEIL
  68034. "adcs r3, r3, %[r]\n\t"
  68035. #elif defined(__clang__)
  68036. "adcs r3, %[r]\n\t"
  68037. #else
  68038. "adc r3, %[r]\n\t"
  68039. #endif
  68040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68041. "lsrs r5, %[a], #16\n\t"
  68042. #else
  68043. "lsr r5, %[a], #16\n\t"
  68044. #endif
  68045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68046. "lsrs r6, r7, #16\n\t"
  68047. #else
  68048. "lsr r6, r7, #16\n\t"
  68049. #endif
  68050. #ifdef WOLFSSL_KEIL
  68051. "muls r6, r5, r6\n\t"
  68052. #elif defined(__clang__)
  68053. "muls r6, r5\n\t"
  68054. #else
  68055. "mul r6, r5\n\t"
  68056. #endif
  68057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68058. "adds r2, r2, r6\n\t"
  68059. #else
  68060. "add r2, r2, r6\n\t"
  68061. #endif
  68062. #ifdef WOLFSSL_KEIL
  68063. "adcs r3, r3, %[r]\n\t"
  68064. #elif defined(__clang__)
  68065. "adcs r3, %[r]\n\t"
  68066. #else
  68067. "adc r3, %[r]\n\t"
  68068. #endif
  68069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68070. "adds r2, r2, r6\n\t"
  68071. #else
  68072. "add r2, r2, r6\n\t"
  68073. #endif
  68074. #ifdef WOLFSSL_KEIL
  68075. "adcs r3, r3, %[r]\n\t"
  68076. #elif defined(__clang__)
  68077. "adcs r3, %[r]\n\t"
  68078. #else
  68079. "adc r3, %[r]\n\t"
  68080. #endif
  68081. "uxth r6, r7\n\t"
  68082. #ifdef WOLFSSL_KEIL
  68083. "muls r5, r6, r5\n\t"
  68084. #elif defined(__clang__)
  68085. "muls r5, r6\n\t"
  68086. #else
  68087. "mul r5, r6\n\t"
  68088. #endif
  68089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68090. "lsrs r6, r5, #16\n\t"
  68091. #else
  68092. "lsr r6, r5, #16\n\t"
  68093. #endif
  68094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68095. "lsls r5, r5, #16\n\t"
  68096. #else
  68097. "lsl r5, r5, #16\n\t"
  68098. #endif
  68099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68100. "adds r4, r4, r5\n\t"
  68101. #else
  68102. "add r4, r4, r5\n\t"
  68103. #endif
  68104. #ifdef WOLFSSL_KEIL
  68105. "adcs r2, r2, r6\n\t"
  68106. #elif defined(__clang__)
  68107. "adcs r2, r6\n\t"
  68108. #else
  68109. "adc r2, r6\n\t"
  68110. #endif
  68111. #ifdef WOLFSSL_KEIL
  68112. "adcs r3, r3, %[r]\n\t"
  68113. #elif defined(__clang__)
  68114. "adcs r3, %[r]\n\t"
  68115. #else
  68116. "adc r3, %[r]\n\t"
  68117. #endif
  68118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68119. "adds r4, r4, r5\n\t"
  68120. #else
  68121. "add r4, r4, r5\n\t"
  68122. #endif
  68123. #ifdef WOLFSSL_KEIL
  68124. "adcs r2, r2, r6\n\t"
  68125. #elif defined(__clang__)
  68126. "adcs r2, r6\n\t"
  68127. #else
  68128. "adc r2, r6\n\t"
  68129. #endif
  68130. #ifdef WOLFSSL_KEIL
  68131. "adcs r3, r3, %[r]\n\t"
  68132. #elif defined(__clang__)
  68133. "adcs r3, %[r]\n\t"
  68134. #else
  68135. "adc r3, %[r]\n\t"
  68136. #endif
  68137. "# A[11] * A[6]\n\t"
  68138. "mov %[a], r9\n\t"
  68139. "ldr r7, [%[a], #24]\n\t"
  68140. "mov %[a], lr\n\t"
  68141. "uxth r5, %[a]\n\t"
  68142. "uxth r6, r7\n\t"
  68143. #ifdef WOLFSSL_KEIL
  68144. "muls r6, r5, r6\n\t"
  68145. #elif defined(__clang__)
  68146. "muls r6, r5\n\t"
  68147. #else
  68148. "mul r6, r5\n\t"
  68149. #endif
  68150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68151. "adds r4, r4, r6\n\t"
  68152. #else
  68153. "add r4, r4, r6\n\t"
  68154. #endif
  68155. #ifdef WOLFSSL_KEIL
  68156. "adcs r2, r2, %[r]\n\t"
  68157. #elif defined(__clang__)
  68158. "adcs r2, %[r]\n\t"
  68159. #else
  68160. "adc r2, %[r]\n\t"
  68161. #endif
  68162. #ifdef WOLFSSL_KEIL
  68163. "adcs r3, r3, %[r]\n\t"
  68164. #elif defined(__clang__)
  68165. "adcs r3, %[r]\n\t"
  68166. #else
  68167. "adc r3, %[r]\n\t"
  68168. #endif
  68169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68170. "adds r4, r4, r6\n\t"
  68171. #else
  68172. "add r4, r4, r6\n\t"
  68173. #endif
  68174. #ifdef WOLFSSL_KEIL
  68175. "adcs r2, r2, %[r]\n\t"
  68176. #elif defined(__clang__)
  68177. "adcs r2, %[r]\n\t"
  68178. #else
  68179. "adc r2, %[r]\n\t"
  68180. #endif
  68181. #ifdef WOLFSSL_KEIL
  68182. "adcs r3, r3, %[r]\n\t"
  68183. #elif defined(__clang__)
  68184. "adcs r3, %[r]\n\t"
  68185. #else
  68186. "adc r3, %[r]\n\t"
  68187. #endif
  68188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68189. "lsrs r6, r7, #16\n\t"
  68190. #else
  68191. "lsr r6, r7, #16\n\t"
  68192. #endif
  68193. #ifdef WOLFSSL_KEIL
  68194. "muls r5, r6, r5\n\t"
  68195. #elif defined(__clang__)
  68196. "muls r5, r6\n\t"
  68197. #else
  68198. "mul r5, r6\n\t"
  68199. #endif
  68200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68201. "lsrs r6, r5, #16\n\t"
  68202. #else
  68203. "lsr r6, r5, #16\n\t"
  68204. #endif
  68205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68206. "lsls r5, r5, #16\n\t"
  68207. #else
  68208. "lsl r5, r5, #16\n\t"
  68209. #endif
  68210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68211. "adds r4, r4, r5\n\t"
  68212. #else
  68213. "add r4, r4, r5\n\t"
  68214. #endif
  68215. #ifdef WOLFSSL_KEIL
  68216. "adcs r2, r2, r6\n\t"
  68217. #elif defined(__clang__)
  68218. "adcs r2, r6\n\t"
  68219. #else
  68220. "adc r2, r6\n\t"
  68221. #endif
  68222. #ifdef WOLFSSL_KEIL
  68223. "adcs r3, r3, %[r]\n\t"
  68224. #elif defined(__clang__)
  68225. "adcs r3, %[r]\n\t"
  68226. #else
  68227. "adc r3, %[r]\n\t"
  68228. #endif
  68229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68230. "adds r4, r4, r5\n\t"
  68231. #else
  68232. "add r4, r4, r5\n\t"
  68233. #endif
  68234. #ifdef WOLFSSL_KEIL
  68235. "adcs r2, r2, r6\n\t"
  68236. #elif defined(__clang__)
  68237. "adcs r2, r6\n\t"
  68238. #else
  68239. "adc r2, r6\n\t"
  68240. #endif
  68241. #ifdef WOLFSSL_KEIL
  68242. "adcs r3, r3, %[r]\n\t"
  68243. #elif defined(__clang__)
  68244. "adcs r3, %[r]\n\t"
  68245. #else
  68246. "adc r3, %[r]\n\t"
  68247. #endif
  68248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68249. "lsrs r5, %[a], #16\n\t"
  68250. #else
  68251. "lsr r5, %[a], #16\n\t"
  68252. #endif
  68253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68254. "lsrs r6, r7, #16\n\t"
  68255. #else
  68256. "lsr r6, r7, #16\n\t"
  68257. #endif
  68258. #ifdef WOLFSSL_KEIL
  68259. "muls r6, r5, r6\n\t"
  68260. #elif defined(__clang__)
  68261. "muls r6, r5\n\t"
  68262. #else
  68263. "mul r6, r5\n\t"
  68264. #endif
  68265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68266. "adds r2, r2, r6\n\t"
  68267. #else
  68268. "add r2, r2, r6\n\t"
  68269. #endif
  68270. #ifdef WOLFSSL_KEIL
  68271. "adcs r3, r3, %[r]\n\t"
  68272. #elif defined(__clang__)
  68273. "adcs r3, %[r]\n\t"
  68274. #else
  68275. "adc r3, %[r]\n\t"
  68276. #endif
  68277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68278. "adds r2, r2, r6\n\t"
  68279. #else
  68280. "add r2, r2, r6\n\t"
  68281. #endif
  68282. #ifdef WOLFSSL_KEIL
  68283. "adcs r3, r3, %[r]\n\t"
  68284. #elif defined(__clang__)
  68285. "adcs r3, %[r]\n\t"
  68286. #else
  68287. "adc r3, %[r]\n\t"
  68288. #endif
  68289. "uxth r6, r7\n\t"
  68290. #ifdef WOLFSSL_KEIL
  68291. "muls r5, r6, r5\n\t"
  68292. #elif defined(__clang__)
  68293. "muls r5, r6\n\t"
  68294. #else
  68295. "mul r5, r6\n\t"
  68296. #endif
  68297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68298. "lsrs r6, r5, #16\n\t"
  68299. #else
  68300. "lsr r6, r5, #16\n\t"
  68301. #endif
  68302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68303. "lsls r5, r5, #16\n\t"
  68304. #else
  68305. "lsl r5, r5, #16\n\t"
  68306. #endif
  68307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68308. "adds r4, r4, r5\n\t"
  68309. #else
  68310. "add r4, r4, r5\n\t"
  68311. #endif
  68312. #ifdef WOLFSSL_KEIL
  68313. "adcs r2, r2, r6\n\t"
  68314. #elif defined(__clang__)
  68315. "adcs r2, r6\n\t"
  68316. #else
  68317. "adc r2, r6\n\t"
  68318. #endif
  68319. #ifdef WOLFSSL_KEIL
  68320. "adcs r3, r3, %[r]\n\t"
  68321. #elif defined(__clang__)
  68322. "adcs r3, %[r]\n\t"
  68323. #else
  68324. "adc r3, %[r]\n\t"
  68325. #endif
  68326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68327. "adds r4, r4, r5\n\t"
  68328. #else
  68329. "add r4, r4, r5\n\t"
  68330. #endif
  68331. #ifdef WOLFSSL_KEIL
  68332. "adcs r2, r2, r6\n\t"
  68333. #elif defined(__clang__)
  68334. "adcs r2, r6\n\t"
  68335. #else
  68336. "adc r2, r6\n\t"
  68337. #endif
  68338. #ifdef WOLFSSL_KEIL
  68339. "adcs r3, r3, %[r]\n\t"
  68340. #elif defined(__clang__)
  68341. "adcs r3, %[r]\n\t"
  68342. #else
  68343. "adc r3, %[r]\n\t"
  68344. #endif
  68345. "mov %[r], r8\n\t"
  68346. "str r4, [%[r], #68]\n\t"
  68347. "movs %[r], #0\n\t"
  68348. "# A[11] * A[7]\n\t"
  68349. "movs r4, #0\n\t"
  68350. "mov %[a], r9\n\t"
  68351. "ldr r7, [%[a], #28]\n\t"
  68352. "mov %[a], lr\n\t"
  68353. "uxth r5, %[a]\n\t"
  68354. "uxth r6, r7\n\t"
  68355. #ifdef WOLFSSL_KEIL
  68356. "muls r6, r5, r6\n\t"
  68357. #elif defined(__clang__)
  68358. "muls r6, r5\n\t"
  68359. #else
  68360. "mul r6, r5\n\t"
  68361. #endif
  68362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68363. "adds r2, r2, r6\n\t"
  68364. #else
  68365. "add r2, r2, r6\n\t"
  68366. #endif
  68367. #ifdef WOLFSSL_KEIL
  68368. "adcs r3, r3, %[r]\n\t"
  68369. #elif defined(__clang__)
  68370. "adcs r3, %[r]\n\t"
  68371. #else
  68372. "adc r3, %[r]\n\t"
  68373. #endif
  68374. #ifdef WOLFSSL_KEIL
  68375. "adcs r4, r4, %[r]\n\t"
  68376. #elif defined(__clang__)
  68377. "adcs r4, %[r]\n\t"
  68378. #else
  68379. "adc r4, %[r]\n\t"
  68380. #endif
  68381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68382. "adds r2, r2, r6\n\t"
  68383. #else
  68384. "add r2, r2, r6\n\t"
  68385. #endif
  68386. #ifdef WOLFSSL_KEIL
  68387. "adcs r3, r3, %[r]\n\t"
  68388. #elif defined(__clang__)
  68389. "adcs r3, %[r]\n\t"
  68390. #else
  68391. "adc r3, %[r]\n\t"
  68392. #endif
  68393. #ifdef WOLFSSL_KEIL
  68394. "adcs r4, r4, %[r]\n\t"
  68395. #elif defined(__clang__)
  68396. "adcs r4, %[r]\n\t"
  68397. #else
  68398. "adc r4, %[r]\n\t"
  68399. #endif
  68400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68401. "lsrs r6, r7, #16\n\t"
  68402. #else
  68403. "lsr r6, r7, #16\n\t"
  68404. #endif
  68405. #ifdef WOLFSSL_KEIL
  68406. "muls r5, r6, r5\n\t"
  68407. #elif defined(__clang__)
  68408. "muls r5, r6\n\t"
  68409. #else
  68410. "mul r5, r6\n\t"
  68411. #endif
  68412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68413. "lsrs r6, r5, #16\n\t"
  68414. #else
  68415. "lsr r6, r5, #16\n\t"
  68416. #endif
  68417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68418. "lsls r5, r5, #16\n\t"
  68419. #else
  68420. "lsl r5, r5, #16\n\t"
  68421. #endif
  68422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68423. "adds r2, r2, r5\n\t"
  68424. #else
  68425. "add r2, r2, r5\n\t"
  68426. #endif
  68427. #ifdef WOLFSSL_KEIL
  68428. "adcs r3, r3, r6\n\t"
  68429. #elif defined(__clang__)
  68430. "adcs r3, r6\n\t"
  68431. #else
  68432. "adc r3, r6\n\t"
  68433. #endif
  68434. #ifdef WOLFSSL_KEIL
  68435. "adcs r4, r4, %[r]\n\t"
  68436. #elif defined(__clang__)
  68437. "adcs r4, %[r]\n\t"
  68438. #else
  68439. "adc r4, %[r]\n\t"
  68440. #endif
  68441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68442. "adds r2, r2, r5\n\t"
  68443. #else
  68444. "add r2, r2, r5\n\t"
  68445. #endif
  68446. #ifdef WOLFSSL_KEIL
  68447. "adcs r3, r3, r6\n\t"
  68448. #elif defined(__clang__)
  68449. "adcs r3, r6\n\t"
  68450. #else
  68451. "adc r3, r6\n\t"
  68452. #endif
  68453. #ifdef WOLFSSL_KEIL
  68454. "adcs r4, r4, %[r]\n\t"
  68455. #elif defined(__clang__)
  68456. "adcs r4, %[r]\n\t"
  68457. #else
  68458. "adc r4, %[r]\n\t"
  68459. #endif
  68460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68461. "lsrs r5, %[a], #16\n\t"
  68462. #else
  68463. "lsr r5, %[a], #16\n\t"
  68464. #endif
  68465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68466. "lsrs r6, r7, #16\n\t"
  68467. #else
  68468. "lsr r6, r7, #16\n\t"
  68469. #endif
  68470. #ifdef WOLFSSL_KEIL
  68471. "muls r6, r5, r6\n\t"
  68472. #elif defined(__clang__)
  68473. "muls r6, r5\n\t"
  68474. #else
  68475. "mul r6, r5\n\t"
  68476. #endif
  68477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68478. "adds r3, r3, r6\n\t"
  68479. #else
  68480. "add r3, r3, r6\n\t"
  68481. #endif
  68482. #ifdef WOLFSSL_KEIL
  68483. "adcs r4, r4, %[r]\n\t"
  68484. #elif defined(__clang__)
  68485. "adcs r4, %[r]\n\t"
  68486. #else
  68487. "adc r4, %[r]\n\t"
  68488. #endif
  68489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68490. "adds r3, r3, r6\n\t"
  68491. #else
  68492. "add r3, r3, r6\n\t"
  68493. #endif
  68494. #ifdef WOLFSSL_KEIL
  68495. "adcs r4, r4, %[r]\n\t"
  68496. #elif defined(__clang__)
  68497. "adcs r4, %[r]\n\t"
  68498. #else
  68499. "adc r4, %[r]\n\t"
  68500. #endif
  68501. "uxth r6, r7\n\t"
  68502. #ifdef WOLFSSL_KEIL
  68503. "muls r5, r6, r5\n\t"
  68504. #elif defined(__clang__)
  68505. "muls r5, r6\n\t"
  68506. #else
  68507. "mul r5, r6\n\t"
  68508. #endif
  68509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68510. "lsrs r6, r5, #16\n\t"
  68511. #else
  68512. "lsr r6, r5, #16\n\t"
  68513. #endif
  68514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68515. "lsls r5, r5, #16\n\t"
  68516. #else
  68517. "lsl r5, r5, #16\n\t"
  68518. #endif
  68519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68520. "adds r2, r2, r5\n\t"
  68521. #else
  68522. "add r2, r2, r5\n\t"
  68523. #endif
  68524. #ifdef WOLFSSL_KEIL
  68525. "adcs r3, r3, r6\n\t"
  68526. #elif defined(__clang__)
  68527. "adcs r3, r6\n\t"
  68528. #else
  68529. "adc r3, r6\n\t"
  68530. #endif
  68531. #ifdef WOLFSSL_KEIL
  68532. "adcs r4, r4, %[r]\n\t"
  68533. #elif defined(__clang__)
  68534. "adcs r4, %[r]\n\t"
  68535. #else
  68536. "adc r4, %[r]\n\t"
  68537. #endif
  68538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68539. "adds r2, r2, r5\n\t"
  68540. #else
  68541. "add r2, r2, r5\n\t"
  68542. #endif
  68543. #ifdef WOLFSSL_KEIL
  68544. "adcs r3, r3, r6\n\t"
  68545. #elif defined(__clang__)
  68546. "adcs r3, r6\n\t"
  68547. #else
  68548. "adc r3, r6\n\t"
  68549. #endif
  68550. #ifdef WOLFSSL_KEIL
  68551. "adcs r4, r4, %[r]\n\t"
  68552. #elif defined(__clang__)
  68553. "adcs r4, %[r]\n\t"
  68554. #else
  68555. "adc r4, %[r]\n\t"
  68556. #endif
  68557. "# A[10] * A[8]\n\t"
  68558. "mov %[a], r9\n\t"
  68559. "mov r7, r10\n\t"
  68560. "mov %[a], r12\n\t"
  68561. "uxth r5, %[a]\n\t"
  68562. "uxth r6, r7\n\t"
  68563. #ifdef WOLFSSL_KEIL
  68564. "muls r6, r5, r6\n\t"
  68565. #elif defined(__clang__)
  68566. "muls r6, r5\n\t"
  68567. #else
  68568. "mul r6, r5\n\t"
  68569. #endif
  68570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68571. "adds r2, r2, r6\n\t"
  68572. #else
  68573. "add r2, r2, r6\n\t"
  68574. #endif
  68575. #ifdef WOLFSSL_KEIL
  68576. "adcs r3, r3, %[r]\n\t"
  68577. #elif defined(__clang__)
  68578. "adcs r3, %[r]\n\t"
  68579. #else
  68580. "adc r3, %[r]\n\t"
  68581. #endif
  68582. #ifdef WOLFSSL_KEIL
  68583. "adcs r4, r4, %[r]\n\t"
  68584. #elif defined(__clang__)
  68585. "adcs r4, %[r]\n\t"
  68586. #else
  68587. "adc r4, %[r]\n\t"
  68588. #endif
  68589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68590. "adds r2, r2, r6\n\t"
  68591. #else
  68592. "add r2, r2, r6\n\t"
  68593. #endif
  68594. #ifdef WOLFSSL_KEIL
  68595. "adcs r3, r3, %[r]\n\t"
  68596. #elif defined(__clang__)
  68597. "adcs r3, %[r]\n\t"
  68598. #else
  68599. "adc r3, %[r]\n\t"
  68600. #endif
  68601. #ifdef WOLFSSL_KEIL
  68602. "adcs r4, r4, %[r]\n\t"
  68603. #elif defined(__clang__)
  68604. "adcs r4, %[r]\n\t"
  68605. #else
  68606. "adc r4, %[r]\n\t"
  68607. #endif
  68608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68609. "lsrs r6, r7, #16\n\t"
  68610. #else
  68611. "lsr r6, r7, #16\n\t"
  68612. #endif
  68613. #ifdef WOLFSSL_KEIL
  68614. "muls r5, r6, r5\n\t"
  68615. #elif defined(__clang__)
  68616. "muls r5, r6\n\t"
  68617. #else
  68618. "mul r5, r6\n\t"
  68619. #endif
  68620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68621. "lsrs r6, r5, #16\n\t"
  68622. #else
  68623. "lsr r6, r5, #16\n\t"
  68624. #endif
  68625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68626. "lsls r5, r5, #16\n\t"
  68627. #else
  68628. "lsl r5, r5, #16\n\t"
  68629. #endif
  68630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68631. "adds r2, r2, r5\n\t"
  68632. #else
  68633. "add r2, r2, r5\n\t"
  68634. #endif
  68635. #ifdef WOLFSSL_KEIL
  68636. "adcs r3, r3, r6\n\t"
  68637. #elif defined(__clang__)
  68638. "adcs r3, r6\n\t"
  68639. #else
  68640. "adc r3, r6\n\t"
  68641. #endif
  68642. #ifdef WOLFSSL_KEIL
  68643. "adcs r4, r4, %[r]\n\t"
  68644. #elif defined(__clang__)
  68645. "adcs r4, %[r]\n\t"
  68646. #else
  68647. "adc r4, %[r]\n\t"
  68648. #endif
  68649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68650. "adds r2, r2, r5\n\t"
  68651. #else
  68652. "add r2, r2, r5\n\t"
  68653. #endif
  68654. #ifdef WOLFSSL_KEIL
  68655. "adcs r3, r3, r6\n\t"
  68656. #elif defined(__clang__)
  68657. "adcs r3, r6\n\t"
  68658. #else
  68659. "adc r3, r6\n\t"
  68660. #endif
  68661. #ifdef WOLFSSL_KEIL
  68662. "adcs r4, r4, %[r]\n\t"
  68663. #elif defined(__clang__)
  68664. "adcs r4, %[r]\n\t"
  68665. #else
  68666. "adc r4, %[r]\n\t"
  68667. #endif
  68668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68669. "lsrs r5, %[a], #16\n\t"
  68670. #else
  68671. "lsr r5, %[a], #16\n\t"
  68672. #endif
  68673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68674. "lsrs r6, r7, #16\n\t"
  68675. #else
  68676. "lsr r6, r7, #16\n\t"
  68677. #endif
  68678. #ifdef WOLFSSL_KEIL
  68679. "muls r6, r5, r6\n\t"
  68680. #elif defined(__clang__)
  68681. "muls r6, r5\n\t"
  68682. #else
  68683. "mul r6, r5\n\t"
  68684. #endif
  68685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68686. "adds r3, r3, r6\n\t"
  68687. #else
  68688. "add r3, r3, r6\n\t"
  68689. #endif
  68690. #ifdef WOLFSSL_KEIL
  68691. "adcs r4, r4, %[r]\n\t"
  68692. #elif defined(__clang__)
  68693. "adcs r4, %[r]\n\t"
  68694. #else
  68695. "adc r4, %[r]\n\t"
  68696. #endif
  68697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68698. "adds r3, r3, r6\n\t"
  68699. #else
  68700. "add r3, r3, r6\n\t"
  68701. #endif
  68702. #ifdef WOLFSSL_KEIL
  68703. "adcs r4, r4, %[r]\n\t"
  68704. #elif defined(__clang__)
  68705. "adcs r4, %[r]\n\t"
  68706. #else
  68707. "adc r4, %[r]\n\t"
  68708. #endif
  68709. "uxth r6, r7\n\t"
  68710. #ifdef WOLFSSL_KEIL
  68711. "muls r5, r6, r5\n\t"
  68712. #elif defined(__clang__)
  68713. "muls r5, r6\n\t"
  68714. #else
  68715. "mul r5, r6\n\t"
  68716. #endif
  68717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68718. "lsrs r6, r5, #16\n\t"
  68719. #else
  68720. "lsr r6, r5, #16\n\t"
  68721. #endif
  68722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68723. "lsls r5, r5, #16\n\t"
  68724. #else
  68725. "lsl r5, r5, #16\n\t"
  68726. #endif
  68727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68728. "adds r2, r2, r5\n\t"
  68729. #else
  68730. "add r2, r2, r5\n\t"
  68731. #endif
  68732. #ifdef WOLFSSL_KEIL
  68733. "adcs r3, r3, r6\n\t"
  68734. #elif defined(__clang__)
  68735. "adcs r3, r6\n\t"
  68736. #else
  68737. "adc r3, r6\n\t"
  68738. #endif
  68739. #ifdef WOLFSSL_KEIL
  68740. "adcs r4, r4, %[r]\n\t"
  68741. #elif defined(__clang__)
  68742. "adcs r4, %[r]\n\t"
  68743. #else
  68744. "adc r4, %[r]\n\t"
  68745. #endif
  68746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68747. "adds r2, r2, r5\n\t"
  68748. #else
  68749. "add r2, r2, r5\n\t"
  68750. #endif
  68751. #ifdef WOLFSSL_KEIL
  68752. "adcs r3, r3, r6\n\t"
  68753. #elif defined(__clang__)
  68754. "adcs r3, r6\n\t"
  68755. #else
  68756. "adc r3, r6\n\t"
  68757. #endif
  68758. #ifdef WOLFSSL_KEIL
  68759. "adcs r4, r4, %[r]\n\t"
  68760. #elif defined(__clang__)
  68761. "adcs r4, %[r]\n\t"
  68762. #else
  68763. "adc r4, %[r]\n\t"
  68764. #endif
  68765. "# A[9] * A[9]\n\t"
  68766. "mov r7, r11\n\t"
  68767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68768. "lsrs r6, r7, #16\n\t"
  68769. #else
  68770. "lsr r6, r7, #16\n\t"
  68771. #endif
  68772. "uxth r5, r7\n\t"
  68773. #ifdef WOLFSSL_KEIL
  68774. "muls r5, r5, r5\n\t"
  68775. #elif defined(__clang__)
  68776. "muls r5, r5\n\t"
  68777. #else
  68778. "mul r5, r5\n\t"
  68779. #endif
  68780. #ifdef WOLFSSL_KEIL
  68781. "muls r6, r6, r6\n\t"
  68782. #elif defined(__clang__)
  68783. "muls r6, r6\n\t"
  68784. #else
  68785. "mul r6, r6\n\t"
  68786. #endif
  68787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68788. "adds r2, r2, r5\n\t"
  68789. #else
  68790. "add r2, r2, r5\n\t"
  68791. #endif
  68792. #ifdef WOLFSSL_KEIL
  68793. "adcs r3, r3, r6\n\t"
  68794. #elif defined(__clang__)
  68795. "adcs r3, r6\n\t"
  68796. #else
  68797. "adc r3, r6\n\t"
  68798. #endif
  68799. #ifdef WOLFSSL_KEIL
  68800. "adcs r4, r4, %[r]\n\t"
  68801. #elif defined(__clang__)
  68802. "adcs r4, %[r]\n\t"
  68803. #else
  68804. "adc r4, %[r]\n\t"
  68805. #endif
  68806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68807. "lsrs r6, r7, #16\n\t"
  68808. #else
  68809. "lsr r6, r7, #16\n\t"
  68810. #endif
  68811. "uxth r5, r7\n\t"
  68812. #ifdef WOLFSSL_KEIL
  68813. "muls r5, r6, r5\n\t"
  68814. #elif defined(__clang__)
  68815. "muls r5, r6\n\t"
  68816. #else
  68817. "mul r5, r6\n\t"
  68818. #endif
  68819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68820. "lsrs r6, r5, #15\n\t"
  68821. #else
  68822. "lsr r6, r5, #15\n\t"
  68823. #endif
  68824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68825. "lsls r5, r5, #17\n\t"
  68826. #else
  68827. "lsl r5, r5, #17\n\t"
  68828. #endif
  68829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68830. "adds r2, r2, r5\n\t"
  68831. #else
  68832. "add r2, r2, r5\n\t"
  68833. #endif
  68834. #ifdef WOLFSSL_KEIL
  68835. "adcs r3, r3, r6\n\t"
  68836. #elif defined(__clang__)
  68837. "adcs r3, r6\n\t"
  68838. #else
  68839. "adc r3, r6\n\t"
  68840. #endif
  68841. #ifdef WOLFSSL_KEIL
  68842. "adcs r4, r4, %[r]\n\t"
  68843. #elif defined(__clang__)
  68844. "adcs r4, %[r]\n\t"
  68845. #else
  68846. "adc r4, %[r]\n\t"
  68847. #endif
  68848. "mov %[r], r8\n\t"
  68849. "str r2, [%[r], #72]\n\t"
  68850. "movs %[r], #0\n\t"
  68851. "# A[10] * A[9]\n\t"
  68852. "movs r2, #0\n\t"
  68853. "mov %[a], r9\n\t"
  68854. "mov %[a], r12\n\t"
  68855. "uxth r5, %[a]\n\t"
  68856. "uxth r6, r7\n\t"
  68857. #ifdef WOLFSSL_KEIL
  68858. "muls r6, r5, r6\n\t"
  68859. #elif defined(__clang__)
  68860. "muls r6, r5\n\t"
  68861. #else
  68862. "mul r6, r5\n\t"
  68863. #endif
  68864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68865. "adds r3, r3, r6\n\t"
  68866. #else
  68867. "add r3, r3, r6\n\t"
  68868. #endif
  68869. #ifdef WOLFSSL_KEIL
  68870. "adcs r4, r4, %[r]\n\t"
  68871. #elif defined(__clang__)
  68872. "adcs r4, %[r]\n\t"
  68873. #else
  68874. "adc r4, %[r]\n\t"
  68875. #endif
  68876. #ifdef WOLFSSL_KEIL
  68877. "adcs r2, r2, %[r]\n\t"
  68878. #elif defined(__clang__)
  68879. "adcs r2, %[r]\n\t"
  68880. #else
  68881. "adc r2, %[r]\n\t"
  68882. #endif
  68883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68884. "adds r3, r3, r6\n\t"
  68885. #else
  68886. "add r3, r3, r6\n\t"
  68887. #endif
  68888. #ifdef WOLFSSL_KEIL
  68889. "adcs r4, r4, %[r]\n\t"
  68890. #elif defined(__clang__)
  68891. "adcs r4, %[r]\n\t"
  68892. #else
  68893. "adc r4, %[r]\n\t"
  68894. #endif
  68895. #ifdef WOLFSSL_KEIL
  68896. "adcs r2, r2, %[r]\n\t"
  68897. #elif defined(__clang__)
  68898. "adcs r2, %[r]\n\t"
  68899. #else
  68900. "adc r2, %[r]\n\t"
  68901. #endif
  68902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68903. "lsrs r6, r7, #16\n\t"
  68904. #else
  68905. "lsr r6, r7, #16\n\t"
  68906. #endif
  68907. #ifdef WOLFSSL_KEIL
  68908. "muls r5, r6, r5\n\t"
  68909. #elif defined(__clang__)
  68910. "muls r5, r6\n\t"
  68911. #else
  68912. "mul r5, r6\n\t"
  68913. #endif
  68914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68915. "lsrs r6, r5, #16\n\t"
  68916. #else
  68917. "lsr r6, r5, #16\n\t"
  68918. #endif
  68919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68920. "lsls r5, r5, #16\n\t"
  68921. #else
  68922. "lsl r5, r5, #16\n\t"
  68923. #endif
  68924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68925. "adds r3, r3, r5\n\t"
  68926. #else
  68927. "add r3, r3, r5\n\t"
  68928. #endif
  68929. #ifdef WOLFSSL_KEIL
  68930. "adcs r4, r4, r6\n\t"
  68931. #elif defined(__clang__)
  68932. "adcs r4, r6\n\t"
  68933. #else
  68934. "adc r4, r6\n\t"
  68935. #endif
  68936. #ifdef WOLFSSL_KEIL
  68937. "adcs r2, r2, %[r]\n\t"
  68938. #elif defined(__clang__)
  68939. "adcs r2, %[r]\n\t"
  68940. #else
  68941. "adc r2, %[r]\n\t"
  68942. #endif
  68943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68944. "adds r3, r3, r5\n\t"
  68945. #else
  68946. "add r3, r3, r5\n\t"
  68947. #endif
  68948. #ifdef WOLFSSL_KEIL
  68949. "adcs r4, r4, r6\n\t"
  68950. #elif defined(__clang__)
  68951. "adcs r4, r6\n\t"
  68952. #else
  68953. "adc r4, r6\n\t"
  68954. #endif
  68955. #ifdef WOLFSSL_KEIL
  68956. "adcs r2, r2, %[r]\n\t"
  68957. #elif defined(__clang__)
  68958. "adcs r2, %[r]\n\t"
  68959. #else
  68960. "adc r2, %[r]\n\t"
  68961. #endif
  68962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68963. "lsrs r5, %[a], #16\n\t"
  68964. #else
  68965. "lsr r5, %[a], #16\n\t"
  68966. #endif
  68967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68968. "lsrs r6, r7, #16\n\t"
  68969. #else
  68970. "lsr r6, r7, #16\n\t"
  68971. #endif
  68972. #ifdef WOLFSSL_KEIL
  68973. "muls r6, r5, r6\n\t"
  68974. #elif defined(__clang__)
  68975. "muls r6, r5\n\t"
  68976. #else
  68977. "mul r6, r5\n\t"
  68978. #endif
  68979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68980. "adds r4, r4, r6\n\t"
  68981. #else
  68982. "add r4, r4, r6\n\t"
  68983. #endif
  68984. #ifdef WOLFSSL_KEIL
  68985. "adcs r2, r2, %[r]\n\t"
  68986. #elif defined(__clang__)
  68987. "adcs r2, %[r]\n\t"
  68988. #else
  68989. "adc r2, %[r]\n\t"
  68990. #endif
  68991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68992. "adds r4, r4, r6\n\t"
  68993. #else
  68994. "add r4, r4, r6\n\t"
  68995. #endif
  68996. #ifdef WOLFSSL_KEIL
  68997. "adcs r2, r2, %[r]\n\t"
  68998. #elif defined(__clang__)
  68999. "adcs r2, %[r]\n\t"
  69000. #else
  69001. "adc r2, %[r]\n\t"
  69002. #endif
  69003. "uxth r6, r7\n\t"
  69004. #ifdef WOLFSSL_KEIL
  69005. "muls r5, r6, r5\n\t"
  69006. #elif defined(__clang__)
  69007. "muls r5, r6\n\t"
  69008. #else
  69009. "mul r5, r6\n\t"
  69010. #endif
  69011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69012. "lsrs r6, r5, #16\n\t"
  69013. #else
  69014. "lsr r6, r5, #16\n\t"
  69015. #endif
  69016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69017. "lsls r5, r5, #16\n\t"
  69018. #else
  69019. "lsl r5, r5, #16\n\t"
  69020. #endif
  69021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69022. "adds r3, r3, r5\n\t"
  69023. #else
  69024. "add r3, r3, r5\n\t"
  69025. #endif
  69026. #ifdef WOLFSSL_KEIL
  69027. "adcs r4, r4, r6\n\t"
  69028. #elif defined(__clang__)
  69029. "adcs r4, r6\n\t"
  69030. #else
  69031. "adc r4, r6\n\t"
  69032. #endif
  69033. #ifdef WOLFSSL_KEIL
  69034. "adcs r2, r2, %[r]\n\t"
  69035. #elif defined(__clang__)
  69036. "adcs r2, %[r]\n\t"
  69037. #else
  69038. "adc r2, %[r]\n\t"
  69039. #endif
  69040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69041. "adds r3, r3, r5\n\t"
  69042. #else
  69043. "add r3, r3, r5\n\t"
  69044. #endif
  69045. #ifdef WOLFSSL_KEIL
  69046. "adcs r4, r4, r6\n\t"
  69047. #elif defined(__clang__)
  69048. "adcs r4, r6\n\t"
  69049. #else
  69050. "adc r4, r6\n\t"
  69051. #endif
  69052. #ifdef WOLFSSL_KEIL
  69053. "adcs r2, r2, %[r]\n\t"
  69054. #elif defined(__clang__)
  69055. "adcs r2, %[r]\n\t"
  69056. #else
  69057. "adc r2, %[r]\n\t"
  69058. #endif
  69059. "# A[11] * A[8]\n\t"
  69060. "mov %[a], r9\n\t"
  69061. "mov r7, r10\n\t"
  69062. "mov %[a], lr\n\t"
  69063. "uxth r5, %[a]\n\t"
  69064. "uxth r6, r7\n\t"
  69065. #ifdef WOLFSSL_KEIL
  69066. "muls r6, r5, r6\n\t"
  69067. #elif defined(__clang__)
  69068. "muls r6, r5\n\t"
  69069. #else
  69070. "mul r6, r5\n\t"
  69071. #endif
  69072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69073. "adds r3, r3, r6\n\t"
  69074. #else
  69075. "add r3, r3, r6\n\t"
  69076. #endif
  69077. #ifdef WOLFSSL_KEIL
  69078. "adcs r4, r4, %[r]\n\t"
  69079. #elif defined(__clang__)
  69080. "adcs r4, %[r]\n\t"
  69081. #else
  69082. "adc r4, %[r]\n\t"
  69083. #endif
  69084. #ifdef WOLFSSL_KEIL
  69085. "adcs r2, r2, %[r]\n\t"
  69086. #elif defined(__clang__)
  69087. "adcs r2, %[r]\n\t"
  69088. #else
  69089. "adc r2, %[r]\n\t"
  69090. #endif
  69091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69092. "adds r3, r3, r6\n\t"
  69093. #else
  69094. "add r3, r3, r6\n\t"
  69095. #endif
  69096. #ifdef WOLFSSL_KEIL
  69097. "adcs r4, r4, %[r]\n\t"
  69098. #elif defined(__clang__)
  69099. "adcs r4, %[r]\n\t"
  69100. #else
  69101. "adc r4, %[r]\n\t"
  69102. #endif
  69103. #ifdef WOLFSSL_KEIL
  69104. "adcs r2, r2, %[r]\n\t"
  69105. #elif defined(__clang__)
  69106. "adcs r2, %[r]\n\t"
  69107. #else
  69108. "adc r2, %[r]\n\t"
  69109. #endif
  69110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69111. "lsrs r6, r7, #16\n\t"
  69112. #else
  69113. "lsr r6, r7, #16\n\t"
  69114. #endif
  69115. #ifdef WOLFSSL_KEIL
  69116. "muls r5, r6, r5\n\t"
  69117. #elif defined(__clang__)
  69118. "muls r5, r6\n\t"
  69119. #else
  69120. "mul r5, r6\n\t"
  69121. #endif
  69122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69123. "lsrs r6, r5, #16\n\t"
  69124. #else
  69125. "lsr r6, r5, #16\n\t"
  69126. #endif
  69127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69128. "lsls r5, r5, #16\n\t"
  69129. #else
  69130. "lsl r5, r5, #16\n\t"
  69131. #endif
  69132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69133. "adds r3, r3, r5\n\t"
  69134. #else
  69135. "add r3, r3, r5\n\t"
  69136. #endif
  69137. #ifdef WOLFSSL_KEIL
  69138. "adcs r4, r4, r6\n\t"
  69139. #elif defined(__clang__)
  69140. "adcs r4, r6\n\t"
  69141. #else
  69142. "adc r4, r6\n\t"
  69143. #endif
  69144. #ifdef WOLFSSL_KEIL
  69145. "adcs r2, r2, %[r]\n\t"
  69146. #elif defined(__clang__)
  69147. "adcs r2, %[r]\n\t"
  69148. #else
  69149. "adc r2, %[r]\n\t"
  69150. #endif
  69151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69152. "adds r3, r3, r5\n\t"
  69153. #else
  69154. "add r3, r3, r5\n\t"
  69155. #endif
  69156. #ifdef WOLFSSL_KEIL
  69157. "adcs r4, r4, r6\n\t"
  69158. #elif defined(__clang__)
  69159. "adcs r4, r6\n\t"
  69160. #else
  69161. "adc r4, r6\n\t"
  69162. #endif
  69163. #ifdef WOLFSSL_KEIL
  69164. "adcs r2, r2, %[r]\n\t"
  69165. #elif defined(__clang__)
  69166. "adcs r2, %[r]\n\t"
  69167. #else
  69168. "adc r2, %[r]\n\t"
  69169. #endif
  69170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69171. "lsrs r5, %[a], #16\n\t"
  69172. #else
  69173. "lsr r5, %[a], #16\n\t"
  69174. #endif
  69175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69176. "lsrs r6, r7, #16\n\t"
  69177. #else
  69178. "lsr r6, r7, #16\n\t"
  69179. #endif
  69180. #ifdef WOLFSSL_KEIL
  69181. "muls r6, r5, r6\n\t"
  69182. #elif defined(__clang__)
  69183. "muls r6, r5\n\t"
  69184. #else
  69185. "mul r6, r5\n\t"
  69186. #endif
  69187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69188. "adds r4, r4, r6\n\t"
  69189. #else
  69190. "add r4, r4, r6\n\t"
  69191. #endif
  69192. #ifdef WOLFSSL_KEIL
  69193. "adcs r2, r2, %[r]\n\t"
  69194. #elif defined(__clang__)
  69195. "adcs r2, %[r]\n\t"
  69196. #else
  69197. "adc r2, %[r]\n\t"
  69198. #endif
  69199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69200. "adds r4, r4, r6\n\t"
  69201. #else
  69202. "add r4, r4, r6\n\t"
  69203. #endif
  69204. #ifdef WOLFSSL_KEIL
  69205. "adcs r2, r2, %[r]\n\t"
  69206. #elif defined(__clang__)
  69207. "adcs r2, %[r]\n\t"
  69208. #else
  69209. "adc r2, %[r]\n\t"
  69210. #endif
  69211. "uxth r6, r7\n\t"
  69212. #ifdef WOLFSSL_KEIL
  69213. "muls r5, r6, r5\n\t"
  69214. #elif defined(__clang__)
  69215. "muls r5, r6\n\t"
  69216. #else
  69217. "mul r5, r6\n\t"
  69218. #endif
  69219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69220. "lsrs r6, r5, #16\n\t"
  69221. #else
  69222. "lsr r6, r5, #16\n\t"
  69223. #endif
  69224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69225. "lsls r5, r5, #16\n\t"
  69226. #else
  69227. "lsl r5, r5, #16\n\t"
  69228. #endif
  69229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69230. "adds r3, r3, r5\n\t"
  69231. #else
  69232. "add r3, r3, r5\n\t"
  69233. #endif
  69234. #ifdef WOLFSSL_KEIL
  69235. "adcs r4, r4, r6\n\t"
  69236. #elif defined(__clang__)
  69237. "adcs r4, r6\n\t"
  69238. #else
  69239. "adc r4, r6\n\t"
  69240. #endif
  69241. #ifdef WOLFSSL_KEIL
  69242. "adcs r2, r2, %[r]\n\t"
  69243. #elif defined(__clang__)
  69244. "adcs r2, %[r]\n\t"
  69245. #else
  69246. "adc r2, %[r]\n\t"
  69247. #endif
  69248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69249. "adds r3, r3, r5\n\t"
  69250. #else
  69251. "add r3, r3, r5\n\t"
  69252. #endif
  69253. #ifdef WOLFSSL_KEIL
  69254. "adcs r4, r4, r6\n\t"
  69255. #elif defined(__clang__)
  69256. "adcs r4, r6\n\t"
  69257. #else
  69258. "adc r4, r6\n\t"
  69259. #endif
  69260. #ifdef WOLFSSL_KEIL
  69261. "adcs r2, r2, %[r]\n\t"
  69262. #elif defined(__clang__)
  69263. "adcs r2, %[r]\n\t"
  69264. #else
  69265. "adc r2, %[r]\n\t"
  69266. #endif
  69267. "mov %[r], r8\n\t"
  69268. "str r3, [%[r], #76]\n\t"
  69269. "movs %[r], #0\n\t"
  69270. "# A[11] * A[9]\n\t"
  69271. "movs r3, #0\n\t"
  69272. "mov %[a], r9\n\t"
  69273. "mov r7, r11\n\t"
  69274. "mov %[a], lr\n\t"
  69275. "uxth r5, %[a]\n\t"
  69276. "uxth r6, r7\n\t"
  69277. #ifdef WOLFSSL_KEIL
  69278. "muls r6, r5, r6\n\t"
  69279. #elif defined(__clang__)
  69280. "muls r6, r5\n\t"
  69281. #else
  69282. "mul r6, r5\n\t"
  69283. #endif
  69284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69285. "adds r4, r4, r6\n\t"
  69286. #else
  69287. "add r4, r4, r6\n\t"
  69288. #endif
  69289. #ifdef WOLFSSL_KEIL
  69290. "adcs r2, r2, %[r]\n\t"
  69291. #elif defined(__clang__)
  69292. "adcs r2, %[r]\n\t"
  69293. #else
  69294. "adc r2, %[r]\n\t"
  69295. #endif
  69296. #ifdef WOLFSSL_KEIL
  69297. "adcs r3, r3, %[r]\n\t"
  69298. #elif defined(__clang__)
  69299. "adcs r3, %[r]\n\t"
  69300. #else
  69301. "adc r3, %[r]\n\t"
  69302. #endif
  69303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69304. "adds r4, r4, r6\n\t"
  69305. #else
  69306. "add r4, r4, r6\n\t"
  69307. #endif
  69308. #ifdef WOLFSSL_KEIL
  69309. "adcs r2, r2, %[r]\n\t"
  69310. #elif defined(__clang__)
  69311. "adcs r2, %[r]\n\t"
  69312. #else
  69313. "adc r2, %[r]\n\t"
  69314. #endif
  69315. #ifdef WOLFSSL_KEIL
  69316. "adcs r3, r3, %[r]\n\t"
  69317. #elif defined(__clang__)
  69318. "adcs r3, %[r]\n\t"
  69319. #else
  69320. "adc r3, %[r]\n\t"
  69321. #endif
  69322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69323. "lsrs r6, r7, #16\n\t"
  69324. #else
  69325. "lsr r6, r7, #16\n\t"
  69326. #endif
  69327. #ifdef WOLFSSL_KEIL
  69328. "muls r5, r6, r5\n\t"
  69329. #elif defined(__clang__)
  69330. "muls r5, r6\n\t"
  69331. #else
  69332. "mul r5, r6\n\t"
  69333. #endif
  69334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69335. "lsrs r6, r5, #16\n\t"
  69336. #else
  69337. "lsr r6, r5, #16\n\t"
  69338. #endif
  69339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69340. "lsls r5, r5, #16\n\t"
  69341. #else
  69342. "lsl r5, r5, #16\n\t"
  69343. #endif
  69344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69345. "adds r4, r4, r5\n\t"
  69346. #else
  69347. "add r4, r4, r5\n\t"
  69348. #endif
  69349. #ifdef WOLFSSL_KEIL
  69350. "adcs r2, r2, r6\n\t"
  69351. #elif defined(__clang__)
  69352. "adcs r2, r6\n\t"
  69353. #else
  69354. "adc r2, r6\n\t"
  69355. #endif
  69356. #ifdef WOLFSSL_KEIL
  69357. "adcs r3, r3, %[r]\n\t"
  69358. #elif defined(__clang__)
  69359. "adcs r3, %[r]\n\t"
  69360. #else
  69361. "adc r3, %[r]\n\t"
  69362. #endif
  69363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69364. "adds r4, r4, r5\n\t"
  69365. #else
  69366. "add r4, r4, r5\n\t"
  69367. #endif
  69368. #ifdef WOLFSSL_KEIL
  69369. "adcs r2, r2, r6\n\t"
  69370. #elif defined(__clang__)
  69371. "adcs r2, r6\n\t"
  69372. #else
  69373. "adc r2, r6\n\t"
  69374. #endif
  69375. #ifdef WOLFSSL_KEIL
  69376. "adcs r3, r3, %[r]\n\t"
  69377. #elif defined(__clang__)
  69378. "adcs r3, %[r]\n\t"
  69379. #else
  69380. "adc r3, %[r]\n\t"
  69381. #endif
  69382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69383. "lsrs r5, %[a], #16\n\t"
  69384. #else
  69385. "lsr r5, %[a], #16\n\t"
  69386. #endif
  69387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69388. "lsrs r6, r7, #16\n\t"
  69389. #else
  69390. "lsr r6, r7, #16\n\t"
  69391. #endif
  69392. #ifdef WOLFSSL_KEIL
  69393. "muls r6, r5, r6\n\t"
  69394. #elif defined(__clang__)
  69395. "muls r6, r5\n\t"
  69396. #else
  69397. "mul r6, r5\n\t"
  69398. #endif
  69399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69400. "adds r2, r2, r6\n\t"
  69401. #else
  69402. "add r2, r2, r6\n\t"
  69403. #endif
  69404. #ifdef WOLFSSL_KEIL
  69405. "adcs r3, r3, %[r]\n\t"
  69406. #elif defined(__clang__)
  69407. "adcs r3, %[r]\n\t"
  69408. #else
  69409. "adc r3, %[r]\n\t"
  69410. #endif
  69411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69412. "adds r2, r2, r6\n\t"
  69413. #else
  69414. "add r2, r2, r6\n\t"
  69415. #endif
  69416. #ifdef WOLFSSL_KEIL
  69417. "adcs r3, r3, %[r]\n\t"
  69418. #elif defined(__clang__)
  69419. "adcs r3, %[r]\n\t"
  69420. #else
  69421. "adc r3, %[r]\n\t"
  69422. #endif
  69423. "uxth r6, r7\n\t"
  69424. #ifdef WOLFSSL_KEIL
  69425. "muls r5, r6, r5\n\t"
  69426. #elif defined(__clang__)
  69427. "muls r5, r6\n\t"
  69428. #else
  69429. "mul r5, r6\n\t"
  69430. #endif
  69431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69432. "lsrs r6, r5, #16\n\t"
  69433. #else
  69434. "lsr r6, r5, #16\n\t"
  69435. #endif
  69436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69437. "lsls r5, r5, #16\n\t"
  69438. #else
  69439. "lsl r5, r5, #16\n\t"
  69440. #endif
  69441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69442. "adds r4, r4, r5\n\t"
  69443. #else
  69444. "add r4, r4, r5\n\t"
  69445. #endif
  69446. #ifdef WOLFSSL_KEIL
  69447. "adcs r2, r2, r6\n\t"
  69448. #elif defined(__clang__)
  69449. "adcs r2, r6\n\t"
  69450. #else
  69451. "adc r2, r6\n\t"
  69452. #endif
  69453. #ifdef WOLFSSL_KEIL
  69454. "adcs r3, r3, %[r]\n\t"
  69455. #elif defined(__clang__)
  69456. "adcs r3, %[r]\n\t"
  69457. #else
  69458. "adc r3, %[r]\n\t"
  69459. #endif
  69460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69461. "adds r4, r4, r5\n\t"
  69462. #else
  69463. "add r4, r4, r5\n\t"
  69464. #endif
  69465. #ifdef WOLFSSL_KEIL
  69466. "adcs r2, r2, r6\n\t"
  69467. #elif defined(__clang__)
  69468. "adcs r2, r6\n\t"
  69469. #else
  69470. "adc r2, r6\n\t"
  69471. #endif
  69472. #ifdef WOLFSSL_KEIL
  69473. "adcs r3, r3, %[r]\n\t"
  69474. #elif defined(__clang__)
  69475. "adcs r3, %[r]\n\t"
  69476. #else
  69477. "adc r3, %[r]\n\t"
  69478. #endif
  69479. "# A[10] * A[10]\n\t"
  69480. "mov r7, r12\n\t"
  69481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69482. "lsrs r6, r7, #16\n\t"
  69483. #else
  69484. "lsr r6, r7, #16\n\t"
  69485. #endif
  69486. "uxth r5, r7\n\t"
  69487. #ifdef WOLFSSL_KEIL
  69488. "muls r5, r5, r5\n\t"
  69489. #elif defined(__clang__)
  69490. "muls r5, r5\n\t"
  69491. #else
  69492. "mul r5, r5\n\t"
  69493. #endif
  69494. #ifdef WOLFSSL_KEIL
  69495. "muls r6, r6, r6\n\t"
  69496. #elif defined(__clang__)
  69497. "muls r6, r6\n\t"
  69498. #else
  69499. "mul r6, r6\n\t"
  69500. #endif
  69501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69502. "adds r4, r4, r5\n\t"
  69503. #else
  69504. "add r4, r4, r5\n\t"
  69505. #endif
  69506. #ifdef WOLFSSL_KEIL
  69507. "adcs r2, r2, r6\n\t"
  69508. #elif defined(__clang__)
  69509. "adcs r2, r6\n\t"
  69510. #else
  69511. "adc r2, r6\n\t"
  69512. #endif
  69513. #ifdef WOLFSSL_KEIL
  69514. "adcs r3, r3, %[r]\n\t"
  69515. #elif defined(__clang__)
  69516. "adcs r3, %[r]\n\t"
  69517. #else
  69518. "adc r3, %[r]\n\t"
  69519. #endif
  69520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69521. "lsrs r6, r7, #16\n\t"
  69522. #else
  69523. "lsr r6, r7, #16\n\t"
  69524. #endif
  69525. "uxth r5, r7\n\t"
  69526. #ifdef WOLFSSL_KEIL
  69527. "muls r5, r6, r5\n\t"
  69528. #elif defined(__clang__)
  69529. "muls r5, r6\n\t"
  69530. #else
  69531. "mul r5, r6\n\t"
  69532. #endif
  69533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69534. "lsrs r6, r5, #15\n\t"
  69535. #else
  69536. "lsr r6, r5, #15\n\t"
  69537. #endif
  69538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69539. "lsls r5, r5, #17\n\t"
  69540. #else
  69541. "lsl r5, r5, #17\n\t"
  69542. #endif
  69543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69544. "adds r4, r4, r5\n\t"
  69545. #else
  69546. "add r4, r4, r5\n\t"
  69547. #endif
  69548. #ifdef WOLFSSL_KEIL
  69549. "adcs r2, r2, r6\n\t"
  69550. #elif defined(__clang__)
  69551. "adcs r2, r6\n\t"
  69552. #else
  69553. "adc r2, r6\n\t"
  69554. #endif
  69555. #ifdef WOLFSSL_KEIL
  69556. "adcs r3, r3, %[r]\n\t"
  69557. #elif defined(__clang__)
  69558. "adcs r3, %[r]\n\t"
  69559. #else
  69560. "adc r3, %[r]\n\t"
  69561. #endif
  69562. "mov %[r], r8\n\t"
  69563. "str r4, [%[r], #80]\n\t"
  69564. "movs %[r], #0\n\t"
  69565. "# A[11] * A[10]\n\t"
  69566. "movs r4, #0\n\t"
  69567. "mov %[a], r9\n\t"
  69568. "mov %[a], lr\n\t"
  69569. "uxth r5, %[a]\n\t"
  69570. "uxth r6, r7\n\t"
  69571. #ifdef WOLFSSL_KEIL
  69572. "muls r6, r5, r6\n\t"
  69573. #elif defined(__clang__)
  69574. "muls r6, r5\n\t"
  69575. #else
  69576. "mul r6, r5\n\t"
  69577. #endif
  69578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69579. "adds r2, r2, r6\n\t"
  69580. #else
  69581. "add r2, r2, r6\n\t"
  69582. #endif
  69583. #ifdef WOLFSSL_KEIL
  69584. "adcs r3, r3, %[r]\n\t"
  69585. #elif defined(__clang__)
  69586. "adcs r3, %[r]\n\t"
  69587. #else
  69588. "adc r3, %[r]\n\t"
  69589. #endif
  69590. #ifdef WOLFSSL_KEIL
  69591. "adcs r4, r4, %[r]\n\t"
  69592. #elif defined(__clang__)
  69593. "adcs r4, %[r]\n\t"
  69594. #else
  69595. "adc r4, %[r]\n\t"
  69596. #endif
  69597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69598. "adds r2, r2, r6\n\t"
  69599. #else
  69600. "add r2, r2, r6\n\t"
  69601. #endif
  69602. #ifdef WOLFSSL_KEIL
  69603. "adcs r3, r3, %[r]\n\t"
  69604. #elif defined(__clang__)
  69605. "adcs r3, %[r]\n\t"
  69606. #else
  69607. "adc r3, %[r]\n\t"
  69608. #endif
  69609. #ifdef WOLFSSL_KEIL
  69610. "adcs r4, r4, %[r]\n\t"
  69611. #elif defined(__clang__)
  69612. "adcs r4, %[r]\n\t"
  69613. #else
  69614. "adc r4, %[r]\n\t"
  69615. #endif
  69616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69617. "lsrs r6, r7, #16\n\t"
  69618. #else
  69619. "lsr r6, r7, #16\n\t"
  69620. #endif
  69621. #ifdef WOLFSSL_KEIL
  69622. "muls r5, r6, r5\n\t"
  69623. #elif defined(__clang__)
  69624. "muls r5, r6\n\t"
  69625. #else
  69626. "mul r5, r6\n\t"
  69627. #endif
  69628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69629. "lsrs r6, r5, #16\n\t"
  69630. #else
  69631. "lsr r6, r5, #16\n\t"
  69632. #endif
  69633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69634. "lsls r5, r5, #16\n\t"
  69635. #else
  69636. "lsl r5, r5, #16\n\t"
  69637. #endif
  69638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69639. "adds r2, r2, r5\n\t"
  69640. #else
  69641. "add r2, r2, r5\n\t"
  69642. #endif
  69643. #ifdef WOLFSSL_KEIL
  69644. "adcs r3, r3, r6\n\t"
  69645. #elif defined(__clang__)
  69646. "adcs r3, r6\n\t"
  69647. #else
  69648. "adc r3, r6\n\t"
  69649. #endif
  69650. #ifdef WOLFSSL_KEIL
  69651. "adcs r4, r4, %[r]\n\t"
  69652. #elif defined(__clang__)
  69653. "adcs r4, %[r]\n\t"
  69654. #else
  69655. "adc r4, %[r]\n\t"
  69656. #endif
  69657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69658. "adds r2, r2, r5\n\t"
  69659. #else
  69660. "add r2, r2, r5\n\t"
  69661. #endif
  69662. #ifdef WOLFSSL_KEIL
  69663. "adcs r3, r3, r6\n\t"
  69664. #elif defined(__clang__)
  69665. "adcs r3, r6\n\t"
  69666. #else
  69667. "adc r3, r6\n\t"
  69668. #endif
  69669. #ifdef WOLFSSL_KEIL
  69670. "adcs r4, r4, %[r]\n\t"
  69671. #elif defined(__clang__)
  69672. "adcs r4, %[r]\n\t"
  69673. #else
  69674. "adc r4, %[r]\n\t"
  69675. #endif
  69676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69677. "lsrs r5, %[a], #16\n\t"
  69678. #else
  69679. "lsr r5, %[a], #16\n\t"
  69680. #endif
  69681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69682. "lsrs r6, r7, #16\n\t"
  69683. #else
  69684. "lsr r6, r7, #16\n\t"
  69685. #endif
  69686. #ifdef WOLFSSL_KEIL
  69687. "muls r6, r5, r6\n\t"
  69688. #elif defined(__clang__)
  69689. "muls r6, r5\n\t"
  69690. #else
  69691. "mul r6, r5\n\t"
  69692. #endif
  69693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69694. "adds r3, r3, r6\n\t"
  69695. #else
  69696. "add r3, r3, r6\n\t"
  69697. #endif
  69698. #ifdef WOLFSSL_KEIL
  69699. "adcs r4, r4, %[r]\n\t"
  69700. #elif defined(__clang__)
  69701. "adcs r4, %[r]\n\t"
  69702. #else
  69703. "adc r4, %[r]\n\t"
  69704. #endif
  69705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69706. "adds r3, r3, r6\n\t"
  69707. #else
  69708. "add r3, r3, r6\n\t"
  69709. #endif
  69710. #ifdef WOLFSSL_KEIL
  69711. "adcs r4, r4, %[r]\n\t"
  69712. #elif defined(__clang__)
  69713. "adcs r4, %[r]\n\t"
  69714. #else
  69715. "adc r4, %[r]\n\t"
  69716. #endif
  69717. "uxth r6, r7\n\t"
  69718. #ifdef WOLFSSL_KEIL
  69719. "muls r5, r6, r5\n\t"
  69720. #elif defined(__clang__)
  69721. "muls r5, r6\n\t"
  69722. #else
  69723. "mul r5, r6\n\t"
  69724. #endif
  69725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69726. "lsrs r6, r5, #16\n\t"
  69727. #else
  69728. "lsr r6, r5, #16\n\t"
  69729. #endif
  69730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69731. "lsls r5, r5, #16\n\t"
  69732. #else
  69733. "lsl r5, r5, #16\n\t"
  69734. #endif
  69735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69736. "adds r2, r2, r5\n\t"
  69737. #else
  69738. "add r2, r2, r5\n\t"
  69739. #endif
  69740. #ifdef WOLFSSL_KEIL
  69741. "adcs r3, r3, r6\n\t"
  69742. #elif defined(__clang__)
  69743. "adcs r3, r6\n\t"
  69744. #else
  69745. "adc r3, r6\n\t"
  69746. #endif
  69747. #ifdef WOLFSSL_KEIL
  69748. "adcs r4, r4, %[r]\n\t"
  69749. #elif defined(__clang__)
  69750. "adcs r4, %[r]\n\t"
  69751. #else
  69752. "adc r4, %[r]\n\t"
  69753. #endif
  69754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69755. "adds r2, r2, r5\n\t"
  69756. #else
  69757. "add r2, r2, r5\n\t"
  69758. #endif
  69759. #ifdef WOLFSSL_KEIL
  69760. "adcs r3, r3, r6\n\t"
  69761. #elif defined(__clang__)
  69762. "adcs r3, r6\n\t"
  69763. #else
  69764. "adc r3, r6\n\t"
  69765. #endif
  69766. #ifdef WOLFSSL_KEIL
  69767. "adcs r4, r4, %[r]\n\t"
  69768. #elif defined(__clang__)
  69769. "adcs r4, %[r]\n\t"
  69770. #else
  69771. "adc r4, %[r]\n\t"
  69772. #endif
  69773. "mov %[r], r8\n\t"
  69774. "str r2, [%[r], #84]\n\t"
  69775. "movs %[r], #0\n\t"
  69776. "# A[11] * A[11]\n\t"
  69777. "mov %[a], r9\n\t"
  69778. "mov r7, lr\n\t"
  69779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69780. "lsrs r6, r7, #16\n\t"
  69781. #else
  69782. "lsr r6, r7, #16\n\t"
  69783. #endif
  69784. "uxth r5, r7\n\t"
  69785. #ifdef WOLFSSL_KEIL
  69786. "muls r5, r5, r5\n\t"
  69787. #elif defined(__clang__)
  69788. "muls r5, r5\n\t"
  69789. #else
  69790. "mul r5, r5\n\t"
  69791. #endif
  69792. #ifdef WOLFSSL_KEIL
  69793. "muls r6, r6, r6\n\t"
  69794. #elif defined(__clang__)
  69795. "muls r6, r6\n\t"
  69796. #else
  69797. "mul r6, r6\n\t"
  69798. #endif
  69799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69800. "adds r3, r3, r5\n\t"
  69801. #else
  69802. "add r3, r3, r5\n\t"
  69803. #endif
  69804. #ifdef WOLFSSL_KEIL
  69805. "adcs r4, r4, r6\n\t"
  69806. #elif defined(__clang__)
  69807. "adcs r4, r6\n\t"
  69808. #else
  69809. "adc r4, r6\n\t"
  69810. #endif
  69811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69812. "lsrs r6, r7, #16\n\t"
  69813. #else
  69814. "lsr r6, r7, #16\n\t"
  69815. #endif
  69816. "uxth r5, r7\n\t"
  69817. #ifdef WOLFSSL_KEIL
  69818. "muls r5, r6, r5\n\t"
  69819. #elif defined(__clang__)
  69820. "muls r5, r6\n\t"
  69821. #else
  69822. "mul r5, r6\n\t"
  69823. #endif
  69824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69825. "lsrs r6, r5, #15\n\t"
  69826. #else
  69827. "lsr r6, r5, #15\n\t"
  69828. #endif
  69829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69830. "lsls r5, r5, #17\n\t"
  69831. #else
  69832. "lsl r5, r5, #17\n\t"
  69833. #endif
  69834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69835. "adds r3, r3, r5\n\t"
  69836. #else
  69837. "add r3, r3, r5\n\t"
  69838. #endif
  69839. #ifdef WOLFSSL_KEIL
  69840. "adcs r4, r4, r6\n\t"
  69841. #elif defined(__clang__)
  69842. "adcs r4, r6\n\t"
  69843. #else
  69844. "adc r4, r6\n\t"
  69845. #endif
  69846. "mov %[r], r8\n\t"
  69847. "str r3, [%[r], #88]\n\t"
  69848. "str r4, [%[r], #92]\n\t"
  69849. "pop {r2, r3, r4, r5}\n\t"
  69850. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  69851. "pop {r2, r3, r4, r5}\n\t"
  69852. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  69853. "pop {r2, r3, r4, r5}\n\t"
  69854. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  69855. : [r] "+l" (r), [a] "+l" (a)
  69856. :
  69857. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  69858. );
  69859. }
  69860. #endif /* !WOLFSSL_SP_LARGE_CODE */
  69861. /* Sub b from a into r. (r = a - b)
  69862. *
  69863. * r A single precision integer.
  69864. * a A single precision integer.
  69865. * b A single precision integer.
  69866. */
  69867. SP_NOINLINE static sp_digit sp_3072_sub_12(sp_digit* r, const sp_digit* a,
  69868. const sp_digit* b)
  69869. {
  69870. __asm__ __volatile__ (
  69871. "ldm %[b]!, {r5, r6}\n\t"
  69872. "ldm %[a]!, {r3, r4}\n\t"
  69873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69874. "subs r3, r3, r5\n\t"
  69875. #else
  69876. "sub r3, r3, r5\n\t"
  69877. #endif
  69878. #ifdef WOLFSSL_KEIL
  69879. "sbcs r4, r4, r6\n\t"
  69880. #elif defined(__clang__)
  69881. "sbcs r4, r6\n\t"
  69882. #else
  69883. "sbc r4, r6\n\t"
  69884. #endif
  69885. "stm %[r]!, {r3, r4}\n\t"
  69886. "ldm %[b]!, {r5, r6}\n\t"
  69887. "ldm %[a]!, {r3, r4}\n\t"
  69888. #ifdef WOLFSSL_KEIL
  69889. "sbcs r3, r3, r5\n\t"
  69890. #elif defined(__clang__)
  69891. "sbcs r3, r5\n\t"
  69892. #else
  69893. "sbc r3, r5\n\t"
  69894. #endif
  69895. #ifdef WOLFSSL_KEIL
  69896. "sbcs r4, r4, r6\n\t"
  69897. #elif defined(__clang__)
  69898. "sbcs r4, r6\n\t"
  69899. #else
  69900. "sbc r4, r6\n\t"
  69901. #endif
  69902. "stm %[r]!, {r3, r4}\n\t"
  69903. "ldm %[b]!, {r5, r6}\n\t"
  69904. "ldm %[a]!, {r3, r4}\n\t"
  69905. #ifdef WOLFSSL_KEIL
  69906. "sbcs r3, r3, r5\n\t"
  69907. #elif defined(__clang__)
  69908. "sbcs r3, r5\n\t"
  69909. #else
  69910. "sbc r3, r5\n\t"
  69911. #endif
  69912. #ifdef WOLFSSL_KEIL
  69913. "sbcs r4, r4, r6\n\t"
  69914. #elif defined(__clang__)
  69915. "sbcs r4, r6\n\t"
  69916. #else
  69917. "sbc r4, r6\n\t"
  69918. #endif
  69919. "stm %[r]!, {r3, r4}\n\t"
  69920. "ldm %[b]!, {r5, r6}\n\t"
  69921. "ldm %[a]!, {r3, r4}\n\t"
  69922. #ifdef WOLFSSL_KEIL
  69923. "sbcs r3, r3, r5\n\t"
  69924. #elif defined(__clang__)
  69925. "sbcs r3, r5\n\t"
  69926. #else
  69927. "sbc r3, r5\n\t"
  69928. #endif
  69929. #ifdef WOLFSSL_KEIL
  69930. "sbcs r4, r4, r6\n\t"
  69931. #elif defined(__clang__)
  69932. "sbcs r4, r6\n\t"
  69933. #else
  69934. "sbc r4, r6\n\t"
  69935. #endif
  69936. "stm %[r]!, {r3, r4}\n\t"
  69937. "ldm %[b]!, {r5, r6}\n\t"
  69938. "ldm %[a]!, {r3, r4}\n\t"
  69939. #ifdef WOLFSSL_KEIL
  69940. "sbcs r3, r3, r5\n\t"
  69941. #elif defined(__clang__)
  69942. "sbcs r3, r5\n\t"
  69943. #else
  69944. "sbc r3, r5\n\t"
  69945. #endif
  69946. #ifdef WOLFSSL_KEIL
  69947. "sbcs r4, r4, r6\n\t"
  69948. #elif defined(__clang__)
  69949. "sbcs r4, r6\n\t"
  69950. #else
  69951. "sbc r4, r6\n\t"
  69952. #endif
  69953. "stm %[r]!, {r3, r4}\n\t"
  69954. "ldm %[b]!, {r5, r6}\n\t"
  69955. "ldm %[a]!, {r3, r4}\n\t"
  69956. #ifdef WOLFSSL_KEIL
  69957. "sbcs r3, r3, r5\n\t"
  69958. #elif defined(__clang__)
  69959. "sbcs r3, r5\n\t"
  69960. #else
  69961. "sbc r3, r5\n\t"
  69962. #endif
  69963. #ifdef WOLFSSL_KEIL
  69964. "sbcs r4, r4, r6\n\t"
  69965. #elif defined(__clang__)
  69966. "sbcs r4, r6\n\t"
  69967. #else
  69968. "sbc r4, r6\n\t"
  69969. #endif
  69970. "stm %[r]!, {r3, r4}\n\t"
  69971. #ifdef WOLFSSL_KEIL
  69972. "sbcs %[r], %[r], %[r]\n\t"
  69973. #elif defined(__clang__)
  69974. "sbcs %[r], %[r]\n\t"
  69975. #else
  69976. "sbc %[r], %[r]\n\t"
  69977. #endif
  69978. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  69979. :
  69980. : "memory", "r3", "r4", "r5", "r6"
  69981. );
  69982. return (uint32_t)(size_t)r;
  69983. }
  69984. /* Square a and put result in r. (r = a * a)
  69985. *
  69986. * r A single precision integer.
  69987. * a A single precision integer.
  69988. */
  69989. SP_NOINLINE static void sp_3072_sqr_24(sp_digit* r, const sp_digit* a)
  69990. {
  69991. sp_digit* z0 = r;
  69992. sp_digit* z2 = r + 24;
  69993. sp_digit z1[24];
  69994. sp_digit* a1 = z1;
  69995. sp_digit* zero = z1 + 12;
  69996. sp_digit u;
  69997. sp_digit mask;
  69998. sp_digit* p1;
  69999. sp_digit* p2;
  70000. XMEMSET(zero, 0, sizeof(sp_digit) * 12);
  70001. mask = sp_3072_sub_12(a1, a, &a[12]);
  70002. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  70003. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  70004. (void)sp_3072_sub_12(a1, p1, p2);
  70005. sp_3072_sqr_12(z2, &a[12]);
  70006. sp_3072_sqr_12(z0, a);
  70007. sp_3072_sqr_12(z1, a1);
  70008. u = 0;
  70009. u -= sp_3072_sub_in_place_24(z1, z2);
  70010. u -= sp_3072_sub_in_place_24(z1, z0);
  70011. u += sp_3072_sub_in_place_24(r + 12, z1);
  70012. sp_3072_add_word_12(r + 36, r + 36, u);
  70013. }
  70014. /* Sub b from a into r. (r = a - b)
  70015. *
  70016. * r A single precision integer.
  70017. * a A single precision integer.
  70018. * b A single precision integer.
  70019. */
  70020. SP_NOINLINE static sp_digit sp_3072_sub_24(sp_digit* r, const sp_digit* a,
  70021. const sp_digit* b)
  70022. {
  70023. __asm__ __volatile__ (
  70024. "ldm %[b]!, {r5, r6}\n\t"
  70025. "ldm %[a]!, {r3, r4}\n\t"
  70026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70027. "subs r3, r3, r5\n\t"
  70028. #else
  70029. "sub r3, r3, r5\n\t"
  70030. #endif
  70031. #ifdef WOLFSSL_KEIL
  70032. "sbcs r4, r4, r6\n\t"
  70033. #elif defined(__clang__)
  70034. "sbcs r4, r6\n\t"
  70035. #else
  70036. "sbc r4, r6\n\t"
  70037. #endif
  70038. "stm %[r]!, {r3, r4}\n\t"
  70039. "ldm %[b]!, {r5, r6}\n\t"
  70040. "ldm %[a]!, {r3, r4}\n\t"
  70041. #ifdef WOLFSSL_KEIL
  70042. "sbcs r3, r3, r5\n\t"
  70043. #elif defined(__clang__)
  70044. "sbcs r3, r5\n\t"
  70045. #else
  70046. "sbc r3, r5\n\t"
  70047. #endif
  70048. #ifdef WOLFSSL_KEIL
  70049. "sbcs r4, r4, r6\n\t"
  70050. #elif defined(__clang__)
  70051. "sbcs r4, r6\n\t"
  70052. #else
  70053. "sbc r4, r6\n\t"
  70054. #endif
  70055. "stm %[r]!, {r3, r4}\n\t"
  70056. "ldm %[b]!, {r5, r6}\n\t"
  70057. "ldm %[a]!, {r3, r4}\n\t"
  70058. #ifdef WOLFSSL_KEIL
  70059. "sbcs r3, r3, r5\n\t"
  70060. #elif defined(__clang__)
  70061. "sbcs r3, r5\n\t"
  70062. #else
  70063. "sbc r3, r5\n\t"
  70064. #endif
  70065. #ifdef WOLFSSL_KEIL
  70066. "sbcs r4, r4, r6\n\t"
  70067. #elif defined(__clang__)
  70068. "sbcs r4, r6\n\t"
  70069. #else
  70070. "sbc r4, r6\n\t"
  70071. #endif
  70072. "stm %[r]!, {r3, r4}\n\t"
  70073. "ldm %[b]!, {r5, r6}\n\t"
  70074. "ldm %[a]!, {r3, r4}\n\t"
  70075. #ifdef WOLFSSL_KEIL
  70076. "sbcs r3, r3, r5\n\t"
  70077. #elif defined(__clang__)
  70078. "sbcs r3, r5\n\t"
  70079. #else
  70080. "sbc r3, r5\n\t"
  70081. #endif
  70082. #ifdef WOLFSSL_KEIL
  70083. "sbcs r4, r4, r6\n\t"
  70084. #elif defined(__clang__)
  70085. "sbcs r4, r6\n\t"
  70086. #else
  70087. "sbc r4, r6\n\t"
  70088. #endif
  70089. "stm %[r]!, {r3, r4}\n\t"
  70090. "ldm %[b]!, {r5, r6}\n\t"
  70091. "ldm %[a]!, {r3, r4}\n\t"
  70092. #ifdef WOLFSSL_KEIL
  70093. "sbcs r3, r3, r5\n\t"
  70094. #elif defined(__clang__)
  70095. "sbcs r3, r5\n\t"
  70096. #else
  70097. "sbc r3, r5\n\t"
  70098. #endif
  70099. #ifdef WOLFSSL_KEIL
  70100. "sbcs r4, r4, r6\n\t"
  70101. #elif defined(__clang__)
  70102. "sbcs r4, r6\n\t"
  70103. #else
  70104. "sbc r4, r6\n\t"
  70105. #endif
  70106. "stm %[r]!, {r3, r4}\n\t"
  70107. "ldm %[b]!, {r5, r6}\n\t"
  70108. "ldm %[a]!, {r3, r4}\n\t"
  70109. #ifdef WOLFSSL_KEIL
  70110. "sbcs r3, r3, r5\n\t"
  70111. #elif defined(__clang__)
  70112. "sbcs r3, r5\n\t"
  70113. #else
  70114. "sbc r3, r5\n\t"
  70115. #endif
  70116. #ifdef WOLFSSL_KEIL
  70117. "sbcs r4, r4, r6\n\t"
  70118. #elif defined(__clang__)
  70119. "sbcs r4, r6\n\t"
  70120. #else
  70121. "sbc r4, r6\n\t"
  70122. #endif
  70123. "stm %[r]!, {r3, r4}\n\t"
  70124. "ldm %[b]!, {r5, r6}\n\t"
  70125. "ldm %[a]!, {r3, r4}\n\t"
  70126. #ifdef WOLFSSL_KEIL
  70127. "sbcs r3, r3, r5\n\t"
  70128. #elif defined(__clang__)
  70129. "sbcs r3, r5\n\t"
  70130. #else
  70131. "sbc r3, r5\n\t"
  70132. #endif
  70133. #ifdef WOLFSSL_KEIL
  70134. "sbcs r4, r4, r6\n\t"
  70135. #elif defined(__clang__)
  70136. "sbcs r4, r6\n\t"
  70137. #else
  70138. "sbc r4, r6\n\t"
  70139. #endif
  70140. "stm %[r]!, {r3, r4}\n\t"
  70141. "ldm %[b]!, {r5, r6}\n\t"
  70142. "ldm %[a]!, {r3, r4}\n\t"
  70143. #ifdef WOLFSSL_KEIL
  70144. "sbcs r3, r3, r5\n\t"
  70145. #elif defined(__clang__)
  70146. "sbcs r3, r5\n\t"
  70147. #else
  70148. "sbc r3, r5\n\t"
  70149. #endif
  70150. #ifdef WOLFSSL_KEIL
  70151. "sbcs r4, r4, r6\n\t"
  70152. #elif defined(__clang__)
  70153. "sbcs r4, r6\n\t"
  70154. #else
  70155. "sbc r4, r6\n\t"
  70156. #endif
  70157. "stm %[r]!, {r3, r4}\n\t"
  70158. "ldm %[b]!, {r5, r6}\n\t"
  70159. "ldm %[a]!, {r3, r4}\n\t"
  70160. #ifdef WOLFSSL_KEIL
  70161. "sbcs r3, r3, r5\n\t"
  70162. #elif defined(__clang__)
  70163. "sbcs r3, r5\n\t"
  70164. #else
  70165. "sbc r3, r5\n\t"
  70166. #endif
  70167. #ifdef WOLFSSL_KEIL
  70168. "sbcs r4, r4, r6\n\t"
  70169. #elif defined(__clang__)
  70170. "sbcs r4, r6\n\t"
  70171. #else
  70172. "sbc r4, r6\n\t"
  70173. #endif
  70174. "stm %[r]!, {r3, r4}\n\t"
  70175. "ldm %[b]!, {r5, r6}\n\t"
  70176. "ldm %[a]!, {r3, r4}\n\t"
  70177. #ifdef WOLFSSL_KEIL
  70178. "sbcs r3, r3, r5\n\t"
  70179. #elif defined(__clang__)
  70180. "sbcs r3, r5\n\t"
  70181. #else
  70182. "sbc r3, r5\n\t"
  70183. #endif
  70184. #ifdef WOLFSSL_KEIL
  70185. "sbcs r4, r4, r6\n\t"
  70186. #elif defined(__clang__)
  70187. "sbcs r4, r6\n\t"
  70188. #else
  70189. "sbc r4, r6\n\t"
  70190. #endif
  70191. "stm %[r]!, {r3, r4}\n\t"
  70192. "ldm %[b]!, {r5, r6}\n\t"
  70193. "ldm %[a]!, {r3, r4}\n\t"
  70194. #ifdef WOLFSSL_KEIL
  70195. "sbcs r3, r3, r5\n\t"
  70196. #elif defined(__clang__)
  70197. "sbcs r3, r5\n\t"
  70198. #else
  70199. "sbc r3, r5\n\t"
  70200. #endif
  70201. #ifdef WOLFSSL_KEIL
  70202. "sbcs r4, r4, r6\n\t"
  70203. #elif defined(__clang__)
  70204. "sbcs r4, r6\n\t"
  70205. #else
  70206. "sbc r4, r6\n\t"
  70207. #endif
  70208. "stm %[r]!, {r3, r4}\n\t"
  70209. "ldm %[b]!, {r5, r6}\n\t"
  70210. "ldm %[a]!, {r3, r4}\n\t"
  70211. #ifdef WOLFSSL_KEIL
  70212. "sbcs r3, r3, r5\n\t"
  70213. #elif defined(__clang__)
  70214. "sbcs r3, r5\n\t"
  70215. #else
  70216. "sbc r3, r5\n\t"
  70217. #endif
  70218. #ifdef WOLFSSL_KEIL
  70219. "sbcs r4, r4, r6\n\t"
  70220. #elif defined(__clang__)
  70221. "sbcs r4, r6\n\t"
  70222. #else
  70223. "sbc r4, r6\n\t"
  70224. #endif
  70225. "stm %[r]!, {r3, r4}\n\t"
  70226. #ifdef WOLFSSL_KEIL
  70227. "sbcs %[r], %[r], %[r]\n\t"
  70228. #elif defined(__clang__)
  70229. "sbcs %[r], %[r]\n\t"
  70230. #else
  70231. "sbc %[r], %[r]\n\t"
  70232. #endif
  70233. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  70234. :
  70235. : "memory", "r3", "r4", "r5", "r6"
  70236. );
  70237. return (uint32_t)(size_t)r;
  70238. }
  70239. /* Square a and put result in r. (r = a * a)
  70240. *
  70241. * r A single precision integer.
  70242. * a A single precision integer.
  70243. */
  70244. SP_NOINLINE static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a)
  70245. {
  70246. sp_digit* z0 = r;
  70247. sp_digit* z2 = r + 48;
  70248. sp_digit z1[48];
  70249. sp_digit* a1 = z1;
  70250. sp_digit* zero = z1 + 24;
  70251. sp_digit u;
  70252. sp_digit mask;
  70253. sp_digit* p1;
  70254. sp_digit* p2;
  70255. XMEMSET(zero, 0, sizeof(sp_digit) * 24);
  70256. mask = sp_3072_sub_24(a1, a, &a[24]);
  70257. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  70258. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  70259. (void)sp_3072_sub_24(a1, p1, p2);
  70260. sp_3072_sqr_24(z2, &a[24]);
  70261. sp_3072_sqr_24(z0, a);
  70262. sp_3072_sqr_24(z1, a1);
  70263. u = 0;
  70264. u -= sp_3072_sub_in_place_48(z1, z2);
  70265. u -= sp_3072_sub_in_place_48(z1, z0);
  70266. u += sp_3072_sub_in_place_48(r + 24, z1);
  70267. sp_3072_add_word_24(r + 72, r + 72, u);
  70268. }
  70269. /* Sub b from a into r. (r = a - b)
  70270. *
  70271. * r A single precision integer.
  70272. * a A single precision integer.
  70273. * b A single precision integer.
  70274. */
  70275. SP_NOINLINE static sp_digit sp_3072_sub_48(sp_digit* r, const sp_digit* a,
  70276. const sp_digit* b)
  70277. {
  70278. __asm__ __volatile__ (
  70279. "ldm %[b]!, {r5, r6}\n\t"
  70280. "ldm %[a]!, {r3, r4}\n\t"
  70281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70282. "subs r3, r3, r5\n\t"
  70283. #else
  70284. "sub r3, r3, r5\n\t"
  70285. #endif
  70286. #ifdef WOLFSSL_KEIL
  70287. "sbcs r4, r4, r6\n\t"
  70288. #elif defined(__clang__)
  70289. "sbcs r4, r6\n\t"
  70290. #else
  70291. "sbc r4, r6\n\t"
  70292. #endif
  70293. "stm %[r]!, {r3, r4}\n\t"
  70294. "ldm %[b]!, {r5, r6}\n\t"
  70295. "ldm %[a]!, {r3, r4}\n\t"
  70296. #ifdef WOLFSSL_KEIL
  70297. "sbcs r3, r3, r5\n\t"
  70298. #elif defined(__clang__)
  70299. "sbcs r3, r5\n\t"
  70300. #else
  70301. "sbc r3, r5\n\t"
  70302. #endif
  70303. #ifdef WOLFSSL_KEIL
  70304. "sbcs r4, r4, r6\n\t"
  70305. #elif defined(__clang__)
  70306. "sbcs r4, r6\n\t"
  70307. #else
  70308. "sbc r4, r6\n\t"
  70309. #endif
  70310. "stm %[r]!, {r3, r4}\n\t"
  70311. "ldm %[b]!, {r5, r6}\n\t"
  70312. "ldm %[a]!, {r3, r4}\n\t"
  70313. #ifdef WOLFSSL_KEIL
  70314. "sbcs r3, r3, r5\n\t"
  70315. #elif defined(__clang__)
  70316. "sbcs r3, r5\n\t"
  70317. #else
  70318. "sbc r3, r5\n\t"
  70319. #endif
  70320. #ifdef WOLFSSL_KEIL
  70321. "sbcs r4, r4, r6\n\t"
  70322. #elif defined(__clang__)
  70323. "sbcs r4, r6\n\t"
  70324. #else
  70325. "sbc r4, r6\n\t"
  70326. #endif
  70327. "stm %[r]!, {r3, r4}\n\t"
  70328. "ldm %[b]!, {r5, r6}\n\t"
  70329. "ldm %[a]!, {r3, r4}\n\t"
  70330. #ifdef WOLFSSL_KEIL
  70331. "sbcs r3, r3, r5\n\t"
  70332. #elif defined(__clang__)
  70333. "sbcs r3, r5\n\t"
  70334. #else
  70335. "sbc r3, r5\n\t"
  70336. #endif
  70337. #ifdef WOLFSSL_KEIL
  70338. "sbcs r4, r4, r6\n\t"
  70339. #elif defined(__clang__)
  70340. "sbcs r4, r6\n\t"
  70341. #else
  70342. "sbc r4, r6\n\t"
  70343. #endif
  70344. "stm %[r]!, {r3, r4}\n\t"
  70345. "ldm %[b]!, {r5, r6}\n\t"
  70346. "ldm %[a]!, {r3, r4}\n\t"
  70347. #ifdef WOLFSSL_KEIL
  70348. "sbcs r3, r3, r5\n\t"
  70349. #elif defined(__clang__)
  70350. "sbcs r3, r5\n\t"
  70351. #else
  70352. "sbc r3, r5\n\t"
  70353. #endif
  70354. #ifdef WOLFSSL_KEIL
  70355. "sbcs r4, r4, r6\n\t"
  70356. #elif defined(__clang__)
  70357. "sbcs r4, r6\n\t"
  70358. #else
  70359. "sbc r4, r6\n\t"
  70360. #endif
  70361. "stm %[r]!, {r3, r4}\n\t"
  70362. "ldm %[b]!, {r5, r6}\n\t"
  70363. "ldm %[a]!, {r3, r4}\n\t"
  70364. #ifdef WOLFSSL_KEIL
  70365. "sbcs r3, r3, r5\n\t"
  70366. #elif defined(__clang__)
  70367. "sbcs r3, r5\n\t"
  70368. #else
  70369. "sbc r3, r5\n\t"
  70370. #endif
  70371. #ifdef WOLFSSL_KEIL
  70372. "sbcs r4, r4, r6\n\t"
  70373. #elif defined(__clang__)
  70374. "sbcs r4, r6\n\t"
  70375. #else
  70376. "sbc r4, r6\n\t"
  70377. #endif
  70378. "stm %[r]!, {r3, r4}\n\t"
  70379. "ldm %[b]!, {r5, r6}\n\t"
  70380. "ldm %[a]!, {r3, r4}\n\t"
  70381. #ifdef WOLFSSL_KEIL
  70382. "sbcs r3, r3, r5\n\t"
  70383. #elif defined(__clang__)
  70384. "sbcs r3, r5\n\t"
  70385. #else
  70386. "sbc r3, r5\n\t"
  70387. #endif
  70388. #ifdef WOLFSSL_KEIL
  70389. "sbcs r4, r4, r6\n\t"
  70390. #elif defined(__clang__)
  70391. "sbcs r4, r6\n\t"
  70392. #else
  70393. "sbc r4, r6\n\t"
  70394. #endif
  70395. "stm %[r]!, {r3, r4}\n\t"
  70396. "ldm %[b]!, {r5, r6}\n\t"
  70397. "ldm %[a]!, {r3, r4}\n\t"
  70398. #ifdef WOLFSSL_KEIL
  70399. "sbcs r3, r3, r5\n\t"
  70400. #elif defined(__clang__)
  70401. "sbcs r3, r5\n\t"
  70402. #else
  70403. "sbc r3, r5\n\t"
  70404. #endif
  70405. #ifdef WOLFSSL_KEIL
  70406. "sbcs r4, r4, r6\n\t"
  70407. #elif defined(__clang__)
  70408. "sbcs r4, r6\n\t"
  70409. #else
  70410. "sbc r4, r6\n\t"
  70411. #endif
  70412. "stm %[r]!, {r3, r4}\n\t"
  70413. "ldm %[b]!, {r5, r6}\n\t"
  70414. "ldm %[a]!, {r3, r4}\n\t"
  70415. #ifdef WOLFSSL_KEIL
  70416. "sbcs r3, r3, r5\n\t"
  70417. #elif defined(__clang__)
  70418. "sbcs r3, r5\n\t"
  70419. #else
  70420. "sbc r3, r5\n\t"
  70421. #endif
  70422. #ifdef WOLFSSL_KEIL
  70423. "sbcs r4, r4, r6\n\t"
  70424. #elif defined(__clang__)
  70425. "sbcs r4, r6\n\t"
  70426. #else
  70427. "sbc r4, r6\n\t"
  70428. #endif
  70429. "stm %[r]!, {r3, r4}\n\t"
  70430. "ldm %[b]!, {r5, r6}\n\t"
  70431. "ldm %[a]!, {r3, r4}\n\t"
  70432. #ifdef WOLFSSL_KEIL
  70433. "sbcs r3, r3, r5\n\t"
  70434. #elif defined(__clang__)
  70435. "sbcs r3, r5\n\t"
  70436. #else
  70437. "sbc r3, r5\n\t"
  70438. #endif
  70439. #ifdef WOLFSSL_KEIL
  70440. "sbcs r4, r4, r6\n\t"
  70441. #elif defined(__clang__)
  70442. "sbcs r4, r6\n\t"
  70443. #else
  70444. "sbc r4, r6\n\t"
  70445. #endif
  70446. "stm %[r]!, {r3, r4}\n\t"
  70447. "ldm %[b]!, {r5, r6}\n\t"
  70448. "ldm %[a]!, {r3, r4}\n\t"
  70449. #ifdef WOLFSSL_KEIL
  70450. "sbcs r3, r3, r5\n\t"
  70451. #elif defined(__clang__)
  70452. "sbcs r3, r5\n\t"
  70453. #else
  70454. "sbc r3, r5\n\t"
  70455. #endif
  70456. #ifdef WOLFSSL_KEIL
  70457. "sbcs r4, r4, r6\n\t"
  70458. #elif defined(__clang__)
  70459. "sbcs r4, r6\n\t"
  70460. #else
  70461. "sbc r4, r6\n\t"
  70462. #endif
  70463. "stm %[r]!, {r3, r4}\n\t"
  70464. "ldm %[b]!, {r5, r6}\n\t"
  70465. "ldm %[a]!, {r3, r4}\n\t"
  70466. #ifdef WOLFSSL_KEIL
  70467. "sbcs r3, r3, r5\n\t"
  70468. #elif defined(__clang__)
  70469. "sbcs r3, r5\n\t"
  70470. #else
  70471. "sbc r3, r5\n\t"
  70472. #endif
  70473. #ifdef WOLFSSL_KEIL
  70474. "sbcs r4, r4, r6\n\t"
  70475. #elif defined(__clang__)
  70476. "sbcs r4, r6\n\t"
  70477. #else
  70478. "sbc r4, r6\n\t"
  70479. #endif
  70480. "stm %[r]!, {r3, r4}\n\t"
  70481. "ldm %[b]!, {r5, r6}\n\t"
  70482. "ldm %[a]!, {r3, r4}\n\t"
  70483. #ifdef WOLFSSL_KEIL
  70484. "sbcs r3, r3, r5\n\t"
  70485. #elif defined(__clang__)
  70486. "sbcs r3, r5\n\t"
  70487. #else
  70488. "sbc r3, r5\n\t"
  70489. #endif
  70490. #ifdef WOLFSSL_KEIL
  70491. "sbcs r4, r4, r6\n\t"
  70492. #elif defined(__clang__)
  70493. "sbcs r4, r6\n\t"
  70494. #else
  70495. "sbc r4, r6\n\t"
  70496. #endif
  70497. "stm %[r]!, {r3, r4}\n\t"
  70498. "ldm %[b]!, {r5, r6}\n\t"
  70499. "ldm %[a]!, {r3, r4}\n\t"
  70500. #ifdef WOLFSSL_KEIL
  70501. "sbcs r3, r3, r5\n\t"
  70502. #elif defined(__clang__)
  70503. "sbcs r3, r5\n\t"
  70504. #else
  70505. "sbc r3, r5\n\t"
  70506. #endif
  70507. #ifdef WOLFSSL_KEIL
  70508. "sbcs r4, r4, r6\n\t"
  70509. #elif defined(__clang__)
  70510. "sbcs r4, r6\n\t"
  70511. #else
  70512. "sbc r4, r6\n\t"
  70513. #endif
  70514. "stm %[r]!, {r3, r4}\n\t"
  70515. "ldm %[b]!, {r5, r6}\n\t"
  70516. "ldm %[a]!, {r3, r4}\n\t"
  70517. #ifdef WOLFSSL_KEIL
  70518. "sbcs r3, r3, r5\n\t"
  70519. #elif defined(__clang__)
  70520. "sbcs r3, r5\n\t"
  70521. #else
  70522. "sbc r3, r5\n\t"
  70523. #endif
  70524. #ifdef WOLFSSL_KEIL
  70525. "sbcs r4, r4, r6\n\t"
  70526. #elif defined(__clang__)
  70527. "sbcs r4, r6\n\t"
  70528. #else
  70529. "sbc r4, r6\n\t"
  70530. #endif
  70531. "stm %[r]!, {r3, r4}\n\t"
  70532. "ldm %[b]!, {r5, r6}\n\t"
  70533. "ldm %[a]!, {r3, r4}\n\t"
  70534. #ifdef WOLFSSL_KEIL
  70535. "sbcs r3, r3, r5\n\t"
  70536. #elif defined(__clang__)
  70537. "sbcs r3, r5\n\t"
  70538. #else
  70539. "sbc r3, r5\n\t"
  70540. #endif
  70541. #ifdef WOLFSSL_KEIL
  70542. "sbcs r4, r4, r6\n\t"
  70543. #elif defined(__clang__)
  70544. "sbcs r4, r6\n\t"
  70545. #else
  70546. "sbc r4, r6\n\t"
  70547. #endif
  70548. "stm %[r]!, {r3, r4}\n\t"
  70549. "ldm %[b]!, {r5, r6}\n\t"
  70550. "ldm %[a]!, {r3, r4}\n\t"
  70551. #ifdef WOLFSSL_KEIL
  70552. "sbcs r3, r3, r5\n\t"
  70553. #elif defined(__clang__)
  70554. "sbcs r3, r5\n\t"
  70555. #else
  70556. "sbc r3, r5\n\t"
  70557. #endif
  70558. #ifdef WOLFSSL_KEIL
  70559. "sbcs r4, r4, r6\n\t"
  70560. #elif defined(__clang__)
  70561. "sbcs r4, r6\n\t"
  70562. #else
  70563. "sbc r4, r6\n\t"
  70564. #endif
  70565. "stm %[r]!, {r3, r4}\n\t"
  70566. "ldm %[b]!, {r5, r6}\n\t"
  70567. "ldm %[a]!, {r3, r4}\n\t"
  70568. #ifdef WOLFSSL_KEIL
  70569. "sbcs r3, r3, r5\n\t"
  70570. #elif defined(__clang__)
  70571. "sbcs r3, r5\n\t"
  70572. #else
  70573. "sbc r3, r5\n\t"
  70574. #endif
  70575. #ifdef WOLFSSL_KEIL
  70576. "sbcs r4, r4, r6\n\t"
  70577. #elif defined(__clang__)
  70578. "sbcs r4, r6\n\t"
  70579. #else
  70580. "sbc r4, r6\n\t"
  70581. #endif
  70582. "stm %[r]!, {r3, r4}\n\t"
  70583. "ldm %[b]!, {r5, r6}\n\t"
  70584. "ldm %[a]!, {r3, r4}\n\t"
  70585. #ifdef WOLFSSL_KEIL
  70586. "sbcs r3, r3, r5\n\t"
  70587. #elif defined(__clang__)
  70588. "sbcs r3, r5\n\t"
  70589. #else
  70590. "sbc r3, r5\n\t"
  70591. #endif
  70592. #ifdef WOLFSSL_KEIL
  70593. "sbcs r4, r4, r6\n\t"
  70594. #elif defined(__clang__)
  70595. "sbcs r4, r6\n\t"
  70596. #else
  70597. "sbc r4, r6\n\t"
  70598. #endif
  70599. "stm %[r]!, {r3, r4}\n\t"
  70600. "ldm %[b]!, {r5, r6}\n\t"
  70601. "ldm %[a]!, {r3, r4}\n\t"
  70602. #ifdef WOLFSSL_KEIL
  70603. "sbcs r3, r3, r5\n\t"
  70604. #elif defined(__clang__)
  70605. "sbcs r3, r5\n\t"
  70606. #else
  70607. "sbc r3, r5\n\t"
  70608. #endif
  70609. #ifdef WOLFSSL_KEIL
  70610. "sbcs r4, r4, r6\n\t"
  70611. #elif defined(__clang__)
  70612. "sbcs r4, r6\n\t"
  70613. #else
  70614. "sbc r4, r6\n\t"
  70615. #endif
  70616. "stm %[r]!, {r3, r4}\n\t"
  70617. "ldm %[b]!, {r5, r6}\n\t"
  70618. "ldm %[a]!, {r3, r4}\n\t"
  70619. #ifdef WOLFSSL_KEIL
  70620. "sbcs r3, r3, r5\n\t"
  70621. #elif defined(__clang__)
  70622. "sbcs r3, r5\n\t"
  70623. #else
  70624. "sbc r3, r5\n\t"
  70625. #endif
  70626. #ifdef WOLFSSL_KEIL
  70627. "sbcs r4, r4, r6\n\t"
  70628. #elif defined(__clang__)
  70629. "sbcs r4, r6\n\t"
  70630. #else
  70631. "sbc r4, r6\n\t"
  70632. #endif
  70633. "stm %[r]!, {r3, r4}\n\t"
  70634. "ldm %[b]!, {r5, r6}\n\t"
  70635. "ldm %[a]!, {r3, r4}\n\t"
  70636. #ifdef WOLFSSL_KEIL
  70637. "sbcs r3, r3, r5\n\t"
  70638. #elif defined(__clang__)
  70639. "sbcs r3, r5\n\t"
  70640. #else
  70641. "sbc r3, r5\n\t"
  70642. #endif
  70643. #ifdef WOLFSSL_KEIL
  70644. "sbcs r4, r4, r6\n\t"
  70645. #elif defined(__clang__)
  70646. "sbcs r4, r6\n\t"
  70647. #else
  70648. "sbc r4, r6\n\t"
  70649. #endif
  70650. "stm %[r]!, {r3, r4}\n\t"
  70651. "ldm %[b]!, {r5, r6}\n\t"
  70652. "ldm %[a]!, {r3, r4}\n\t"
  70653. #ifdef WOLFSSL_KEIL
  70654. "sbcs r3, r3, r5\n\t"
  70655. #elif defined(__clang__)
  70656. "sbcs r3, r5\n\t"
  70657. #else
  70658. "sbc r3, r5\n\t"
  70659. #endif
  70660. #ifdef WOLFSSL_KEIL
  70661. "sbcs r4, r4, r6\n\t"
  70662. #elif defined(__clang__)
  70663. "sbcs r4, r6\n\t"
  70664. #else
  70665. "sbc r4, r6\n\t"
  70666. #endif
  70667. "stm %[r]!, {r3, r4}\n\t"
  70668. "ldm %[b]!, {r5, r6}\n\t"
  70669. "ldm %[a]!, {r3, r4}\n\t"
  70670. #ifdef WOLFSSL_KEIL
  70671. "sbcs r3, r3, r5\n\t"
  70672. #elif defined(__clang__)
  70673. "sbcs r3, r5\n\t"
  70674. #else
  70675. "sbc r3, r5\n\t"
  70676. #endif
  70677. #ifdef WOLFSSL_KEIL
  70678. "sbcs r4, r4, r6\n\t"
  70679. #elif defined(__clang__)
  70680. "sbcs r4, r6\n\t"
  70681. #else
  70682. "sbc r4, r6\n\t"
  70683. #endif
  70684. "stm %[r]!, {r3, r4}\n\t"
  70685. #ifdef WOLFSSL_KEIL
  70686. "sbcs %[r], %[r], %[r]\n\t"
  70687. #elif defined(__clang__)
  70688. "sbcs %[r], %[r]\n\t"
  70689. #else
  70690. "sbc %[r], %[r]\n\t"
  70691. #endif
  70692. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  70693. :
  70694. : "memory", "r3", "r4", "r5", "r6"
  70695. );
  70696. return (uint32_t)(size_t)r;
  70697. }
  70698. /* Square a and put result in r. (r = a * a)
  70699. *
  70700. * r A single precision integer.
  70701. * a A single precision integer.
  70702. */
  70703. SP_NOINLINE static void sp_3072_sqr_96(sp_digit* r, const sp_digit* a)
  70704. {
  70705. sp_digit* z0 = r;
  70706. sp_digit* z2 = r + 96;
  70707. sp_digit z1[96];
  70708. sp_digit* a1 = z1;
  70709. sp_digit* zero = z1 + 48;
  70710. sp_digit u;
  70711. sp_digit mask;
  70712. sp_digit* p1;
  70713. sp_digit* p2;
  70714. XMEMSET(zero, 0, sizeof(sp_digit) * 48);
  70715. mask = sp_3072_sub_48(a1, a, &a[48]);
  70716. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  70717. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  70718. (void)sp_3072_sub_48(a1, p1, p2);
  70719. sp_3072_sqr_48(z2, &a[48]);
  70720. sp_3072_sqr_48(z0, a);
  70721. sp_3072_sqr_48(z1, a1);
  70722. u = 0;
  70723. u -= sp_3072_sub_in_place_96(z1, z2);
  70724. u -= sp_3072_sub_in_place_96(z1, z0);
  70725. u += sp_3072_sub_in_place_96(r + 48, z1);
  70726. sp_3072_add_word_48(r + 144, r + 144, u);
  70727. }
  70728. #endif /* !WOLFSSL_SP_SMALL */
  70729. #ifdef WOLFSSL_SP_SMALL
  70730. /* Add b to a into r. (r = a + b)
  70731. *
  70732. * r A single precision integer.
  70733. * a A single precision integer.
  70734. * b A single precision integer.
  70735. */
  70736. SP_NOINLINE static sp_digit sp_3072_add_96(sp_digit* r, const sp_digit* a,
  70737. const sp_digit* b)
  70738. {
  70739. __asm__ __volatile__ (
  70740. "movs r6, %[a]\n\t"
  70741. "movs r7, #0\n\t"
  70742. "movs r3, #0\n\t"
  70743. "movs r4, #0xff\n\t"
  70744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70745. "adds r4, r4, #0x81\n\t"
  70746. #else
  70747. "add r4, r4, #0x81\n\t"
  70748. #endif
  70749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70750. "subs r7, r7, #1\n\t"
  70751. #else
  70752. "sub r7, r7, #1\n\t"
  70753. #endif
  70754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70755. "adds r6, r6, r4\n\t"
  70756. #else
  70757. "add r6, r6, r4\n\t"
  70758. #endif
  70759. "\n"
  70760. "L_sp_3072_add_96_word_%=:\n\t"
  70761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70762. "adds r3, r3, r7\n\t"
  70763. #else
  70764. "add r3, r3, r7\n\t"
  70765. #endif
  70766. "ldr r4, [%[a]]\n\t"
  70767. "ldr r5, [%[b]]\n\t"
  70768. #ifdef WOLFSSL_KEIL
  70769. "adcs r4, r4, r5\n\t"
  70770. #elif defined(__clang__)
  70771. "adcs r4, r5\n\t"
  70772. #else
  70773. "adc r4, r5\n\t"
  70774. #endif
  70775. "str r4, [%[r]]\n\t"
  70776. "movs r3, #0\n\t"
  70777. #ifdef WOLFSSL_KEIL
  70778. "adcs r3, r3, r3\n\t"
  70779. #elif defined(__clang__)
  70780. "adcs r3, r3\n\t"
  70781. #else
  70782. "adc r3, r3\n\t"
  70783. #endif
  70784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70785. "adds %[a], %[a], #4\n\t"
  70786. #else
  70787. "add %[a], %[a], #4\n\t"
  70788. #endif
  70789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70790. "adds %[b], %[b], #4\n\t"
  70791. #else
  70792. "add %[b], %[b], #4\n\t"
  70793. #endif
  70794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70795. "adds %[r], %[r], #4\n\t"
  70796. #else
  70797. "add %[r], %[r], #4\n\t"
  70798. #endif
  70799. "cmp %[a], r6\n\t"
  70800. "bne L_sp_3072_add_96_word_%=\n\t"
  70801. "movs %[r], r3\n\t"
  70802. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  70803. :
  70804. : "memory", "r3", "r4", "r5", "r6", "r7"
  70805. );
  70806. return (uint32_t)(size_t)r;
  70807. }
  70808. #endif /* WOLFSSL_SP_SMALL */
  70809. #ifdef WOLFSSL_SP_SMALL
  70810. /* Sub b from a into a. (a -= b)
  70811. *
  70812. * a A single precision integer.
  70813. * b A single precision integer.
  70814. */
  70815. SP_NOINLINE static sp_digit sp_3072_sub_in_place_96(sp_digit* a,
  70816. const sp_digit* b)
  70817. {
  70818. __asm__ __volatile__ (
  70819. "movs r7, %[a]\n\t"
  70820. "movs r2, #0\n\t"
  70821. "movs r5, #0xff\n\t"
  70822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70823. "adds r5, r5, #0x81\n\t"
  70824. #else
  70825. "add r5, r5, #0x81\n\t"
  70826. #endif
  70827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70828. "adds r7, r7, r5\n\t"
  70829. #else
  70830. "add r7, r7, r5\n\t"
  70831. #endif
  70832. "\n"
  70833. "L_sp_3072_sub_in_place_96_words_%=:\n\t"
  70834. "movs r5, #0\n\t"
  70835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70836. "subs r5, r5, r2\n\t"
  70837. #else
  70838. "sub r5, r5, r2\n\t"
  70839. #endif
  70840. "ldr r3, [%[a]]\n\t"
  70841. "ldr r4, [%[a], #4]\n\t"
  70842. "ldr r5, [%[b]]\n\t"
  70843. "ldr r6, [%[b], #4]\n\t"
  70844. #ifdef WOLFSSL_KEIL
  70845. "sbcs r3, r3, r5\n\t"
  70846. #elif defined(__clang__)
  70847. "sbcs r3, r5\n\t"
  70848. #else
  70849. "sbc r3, r5\n\t"
  70850. #endif
  70851. #ifdef WOLFSSL_KEIL
  70852. "sbcs r4, r4, r6\n\t"
  70853. #elif defined(__clang__)
  70854. "sbcs r4, r6\n\t"
  70855. #else
  70856. "sbc r4, r6\n\t"
  70857. #endif
  70858. "str r3, [%[a]]\n\t"
  70859. "str r4, [%[a], #4]\n\t"
  70860. #ifdef WOLFSSL_KEIL
  70861. "sbcs r2, r2, r2\n\t"
  70862. #elif defined(__clang__)
  70863. "sbcs r2, r2\n\t"
  70864. #else
  70865. "sbc r2, r2\n\t"
  70866. #endif
  70867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70868. "adds %[a], %[a], #8\n\t"
  70869. #else
  70870. "add %[a], %[a], #8\n\t"
  70871. #endif
  70872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70873. "adds %[b], %[b], #8\n\t"
  70874. #else
  70875. "add %[b], %[b], #8\n\t"
  70876. #endif
  70877. "cmp %[a], r7\n\t"
  70878. "bne L_sp_3072_sub_in_place_96_words_%=\n\t"
  70879. "movs %[a], r2\n\t"
  70880. : [a] "+l" (a), [b] "+l" (b)
  70881. :
  70882. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  70883. );
  70884. return (uint32_t)(size_t)a;
  70885. }
  70886. #endif /* WOLFSSL_SP_SMALL */
  70887. #ifdef WOLFSSL_SP_SMALL
  70888. /* Multiply a and b into r. (r = a * b)
  70889. *
  70890. * r A single precision integer.
  70891. * a A single precision integer.
  70892. * b A single precision integer.
  70893. */
  70894. SP_NOINLINE static void sp_3072_mul_96(sp_digit* r, const sp_digit* a,
  70895. const sp_digit* b)
  70896. {
  70897. sp_digit t[96 * 2];
  70898. sp_digit* tmp = t;
  70899. __asm__ __volatile__ (
  70900. "movs r3, #0\n\t"
  70901. "movs r4, #0\n\t"
  70902. "mov r8, r3\n\t"
  70903. "mov r11, %[tmp]\n\t"
  70904. "mov r9, %[a]\n\t"
  70905. "mov r10, %[b]\n\t"
  70906. "movs r6, #0xff\n\t"
  70907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70908. "adds r6, r6, #0x81\n\t"
  70909. #else
  70910. "add r6, r6, #0x81\n\t"
  70911. #endif
  70912. "add r6, r6, r9\n\t"
  70913. "mov r12, r6\n\t"
  70914. "\n"
  70915. "L_sp_3072_mul_96_words_%=:\n\t"
  70916. "movs %[tmp], #0\n\t"
  70917. "movs r5, #0\n\t"
  70918. "movs r6, #0xff\n\t"
  70919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70920. "adds r6, r6, #0x7d\n\t"
  70921. #else
  70922. "add r6, r6, #0x7d\n\t"
  70923. #endif
  70924. "mov %[a], r8\n\t"
  70925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70926. "subs %[a], %[a], r6\n\t"
  70927. #else
  70928. "sub %[a], %[a], r6\n\t"
  70929. #endif
  70930. #ifdef WOLFSSL_KEIL
  70931. "sbcs r6, r6, r6\n\t"
  70932. #elif defined(__clang__)
  70933. "sbcs r6, r6\n\t"
  70934. #else
  70935. "sbc r6, r6\n\t"
  70936. #endif
  70937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70938. "mvns r6, r6\n\t"
  70939. #else
  70940. "mvn r6, r6\n\t"
  70941. #endif
  70942. #ifdef WOLFSSL_KEIL
  70943. "ands %[a], %[a], r6\n\t"
  70944. #elif defined(__clang__)
  70945. "ands %[a], r6\n\t"
  70946. #else
  70947. "and %[a], r6\n\t"
  70948. #endif
  70949. "mov %[b], r8\n\t"
  70950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70951. "subs %[b], %[b], %[a]\n\t"
  70952. #else
  70953. "sub %[b], %[b], %[a]\n\t"
  70954. #endif
  70955. "add %[a], %[a], r9\n\t"
  70956. "add %[b], %[b], r10\n\t"
  70957. "\n"
  70958. "L_sp_3072_mul_96_mul_%=:\n\t"
  70959. "# Multiply Start\n\t"
  70960. "ldrh r6, [%[a]]\n\t"
  70961. "ldrh r7, [%[b]]\n\t"
  70962. #ifdef WOLFSSL_KEIL
  70963. "muls r7, r6, r7\n\t"
  70964. #elif defined(__clang__)
  70965. "muls r7, r6\n\t"
  70966. #else
  70967. "mul r7, r6\n\t"
  70968. #endif
  70969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70970. "adds r3, r3, r7\n\t"
  70971. #else
  70972. "add r3, r3, r7\n\t"
  70973. #endif
  70974. #ifdef WOLFSSL_KEIL
  70975. "adcs r4, r4, %[tmp]\n\t"
  70976. #elif defined(__clang__)
  70977. "adcs r4, %[tmp]\n\t"
  70978. #else
  70979. "adc r4, %[tmp]\n\t"
  70980. #endif
  70981. #ifdef WOLFSSL_KEIL
  70982. "adcs r5, r5, %[tmp]\n\t"
  70983. #elif defined(__clang__)
  70984. "adcs r5, %[tmp]\n\t"
  70985. #else
  70986. "adc r5, %[tmp]\n\t"
  70987. #endif
  70988. "ldr r7, [%[b]]\n\t"
  70989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70990. "lsrs r7, r7, #16\n\t"
  70991. #else
  70992. "lsr r7, r7, #16\n\t"
  70993. #endif
  70994. #ifdef WOLFSSL_KEIL
  70995. "muls r6, r7, r6\n\t"
  70996. #elif defined(__clang__)
  70997. "muls r6, r7\n\t"
  70998. #else
  70999. "mul r6, r7\n\t"
  71000. #endif
  71001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71002. "lsrs r7, r6, #16\n\t"
  71003. #else
  71004. "lsr r7, r6, #16\n\t"
  71005. #endif
  71006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71007. "lsls r6, r6, #16\n\t"
  71008. #else
  71009. "lsl r6, r6, #16\n\t"
  71010. #endif
  71011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71012. "adds r3, r3, r6\n\t"
  71013. #else
  71014. "add r3, r3, r6\n\t"
  71015. #endif
  71016. #ifdef WOLFSSL_KEIL
  71017. "adcs r4, r4, r7\n\t"
  71018. #elif defined(__clang__)
  71019. "adcs r4, r7\n\t"
  71020. #else
  71021. "adc r4, r7\n\t"
  71022. #endif
  71023. #ifdef WOLFSSL_KEIL
  71024. "adcs r5, r5, %[tmp]\n\t"
  71025. #elif defined(__clang__)
  71026. "adcs r5, %[tmp]\n\t"
  71027. #else
  71028. "adc r5, %[tmp]\n\t"
  71029. #endif
  71030. "ldr r6, [%[a]]\n\t"
  71031. "ldr r7, [%[b]]\n\t"
  71032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71033. "lsrs r6, r6, #16\n\t"
  71034. #else
  71035. "lsr r6, r6, #16\n\t"
  71036. #endif
  71037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71038. "lsrs r7, r7, #16\n\t"
  71039. #else
  71040. "lsr r7, r7, #16\n\t"
  71041. #endif
  71042. #ifdef WOLFSSL_KEIL
  71043. "muls r7, r6, r7\n\t"
  71044. #elif defined(__clang__)
  71045. "muls r7, r6\n\t"
  71046. #else
  71047. "mul r7, r6\n\t"
  71048. #endif
  71049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71050. "adds r4, r4, r7\n\t"
  71051. #else
  71052. "add r4, r4, r7\n\t"
  71053. #endif
  71054. #ifdef WOLFSSL_KEIL
  71055. "adcs r5, r5, %[tmp]\n\t"
  71056. #elif defined(__clang__)
  71057. "adcs r5, %[tmp]\n\t"
  71058. #else
  71059. "adc r5, %[tmp]\n\t"
  71060. #endif
  71061. "ldrh r7, [%[b]]\n\t"
  71062. #ifdef WOLFSSL_KEIL
  71063. "muls r6, r7, r6\n\t"
  71064. #elif defined(__clang__)
  71065. "muls r6, r7\n\t"
  71066. #else
  71067. "mul r6, r7\n\t"
  71068. #endif
  71069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71070. "lsrs r7, r6, #16\n\t"
  71071. #else
  71072. "lsr r7, r6, #16\n\t"
  71073. #endif
  71074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71075. "lsls r6, r6, #16\n\t"
  71076. #else
  71077. "lsl r6, r6, #16\n\t"
  71078. #endif
  71079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71080. "adds r3, r3, r6\n\t"
  71081. #else
  71082. "add r3, r3, r6\n\t"
  71083. #endif
  71084. #ifdef WOLFSSL_KEIL
  71085. "adcs r4, r4, r7\n\t"
  71086. #elif defined(__clang__)
  71087. "adcs r4, r7\n\t"
  71088. #else
  71089. "adc r4, r7\n\t"
  71090. #endif
  71091. #ifdef WOLFSSL_KEIL
  71092. "adcs r5, r5, %[tmp]\n\t"
  71093. #elif defined(__clang__)
  71094. "adcs r5, %[tmp]\n\t"
  71095. #else
  71096. "adc r5, %[tmp]\n\t"
  71097. #endif
  71098. "# Multiply Done\n\t"
  71099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71100. "adds %[a], %[a], #4\n\t"
  71101. #else
  71102. "add %[a], %[a], #4\n\t"
  71103. #endif
  71104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71105. "subs %[b], %[b], #4\n\t"
  71106. #else
  71107. "sub %[b], %[b], #4\n\t"
  71108. #endif
  71109. "cmp %[a], r12\n\t"
  71110. "beq L_sp_3072_mul_96_done_mul_%=\n\t"
  71111. "mov r6, r8\n\t"
  71112. "add r6, r6, r9\n\t"
  71113. "cmp %[a], r6\n\t"
  71114. "ble L_sp_3072_mul_96_mul_%=\n\t"
  71115. "\n"
  71116. "L_sp_3072_mul_96_done_mul_%=:\n\t"
  71117. "mov %[tmp], r11\n\t"
  71118. "mov r7, r8\n\t"
  71119. "str r3, [%[tmp], r7]\n\t"
  71120. "movs r3, r4\n\t"
  71121. "movs r4, r5\n\t"
  71122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71123. "adds r7, r7, #4\n\t"
  71124. #else
  71125. "add r7, r7, #4\n\t"
  71126. #endif
  71127. "mov r8, r7\n\t"
  71128. "movs r6, #2\n\t"
  71129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71130. "lsls r6, r6, #8\n\t"
  71131. #else
  71132. "lsl r6, r6, #8\n\t"
  71133. #endif
  71134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71135. "adds r6, r6, #0xf8\n\t"
  71136. #else
  71137. "add r6, r6, #0xf8\n\t"
  71138. #endif
  71139. "cmp r7, r6\n\t"
  71140. "ble L_sp_3072_mul_96_words_%=\n\t"
  71141. "str r3, [%[tmp], r7]\n\t"
  71142. "mov %[a], r9\n\t"
  71143. "mov %[b], r10\n\t"
  71144. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  71145. :
  71146. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  71147. );
  71148. XMEMCPY(r, t, sizeof(t));
  71149. }
  71150. /* Square a and put result in r. (r = a * a)
  71151. *
  71152. * r A single precision integer.
  71153. * a A single precision integer.
  71154. */
  71155. SP_NOINLINE static void sp_3072_sqr_96(sp_digit* r, const sp_digit* a)
  71156. {
  71157. __asm__ __volatile__ (
  71158. "movs r3, #0\n\t"
  71159. "movs r4, #0\n\t"
  71160. "movs r5, #0\n\t"
  71161. "mov r8, r3\n\t"
  71162. "mov r11, %[r]\n\t"
  71163. "movs r6, #3\n\t"
  71164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71165. "lsls r6, r6, #8\n\t"
  71166. #else
  71167. "lsl r6, r6, #8\n\t"
  71168. #endif
  71169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71170. "negs r6, r6\n\t"
  71171. #else
  71172. "neg r6, r6\n\t"
  71173. #endif
  71174. "add sp, sp, r6\n\t"
  71175. "mov r10, sp\n\t"
  71176. "mov r9, %[a]\n\t"
  71177. "\n"
  71178. "L_sp_3072_sqr_96_words_%=:\n\t"
  71179. "movs %[r], #0\n\t"
  71180. "movs r6, #0xff\n\t"
  71181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71182. "adds r6, r6, #0x7d\n\t"
  71183. #else
  71184. "add r6, r6, #0x7d\n\t"
  71185. #endif
  71186. "mov %[a], r8\n\t"
  71187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71188. "subs %[a], %[a], r6\n\t"
  71189. #else
  71190. "sub %[a], %[a], r6\n\t"
  71191. #endif
  71192. #ifdef WOLFSSL_KEIL
  71193. "sbcs r6, r6, r6\n\t"
  71194. #elif defined(__clang__)
  71195. "sbcs r6, r6\n\t"
  71196. #else
  71197. "sbc r6, r6\n\t"
  71198. #endif
  71199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71200. "mvns r6, r6\n\t"
  71201. #else
  71202. "mvn r6, r6\n\t"
  71203. #endif
  71204. #ifdef WOLFSSL_KEIL
  71205. "ands %[a], %[a], r6\n\t"
  71206. #elif defined(__clang__)
  71207. "ands %[a], r6\n\t"
  71208. #else
  71209. "and %[a], r6\n\t"
  71210. #endif
  71211. "mov r2, r8\n\t"
  71212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71213. "subs r2, r2, %[a]\n\t"
  71214. #else
  71215. "sub r2, r2, %[a]\n\t"
  71216. #endif
  71217. "add %[a], %[a], r9\n\t"
  71218. "add r2, r2, r9\n\t"
  71219. "\n"
  71220. "L_sp_3072_sqr_96_mul_%=:\n\t"
  71221. "cmp r2, %[a]\n\t"
  71222. "beq L_sp_3072_sqr_96_sqr_%=\n\t"
  71223. "# Multiply * 2: Start\n\t"
  71224. "ldrh r6, [%[a]]\n\t"
  71225. "ldrh r7, [r2]\n\t"
  71226. #ifdef WOLFSSL_KEIL
  71227. "muls r7, r6, r7\n\t"
  71228. #elif defined(__clang__)
  71229. "muls r7, r6\n\t"
  71230. #else
  71231. "mul r7, r6\n\t"
  71232. #endif
  71233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71234. "adds r3, r3, r7\n\t"
  71235. #else
  71236. "add r3, r3, r7\n\t"
  71237. #endif
  71238. #ifdef WOLFSSL_KEIL
  71239. "adcs r4, r4, %[r]\n\t"
  71240. #elif defined(__clang__)
  71241. "adcs r4, %[r]\n\t"
  71242. #else
  71243. "adc r4, %[r]\n\t"
  71244. #endif
  71245. #ifdef WOLFSSL_KEIL
  71246. "adcs r5, r5, %[r]\n\t"
  71247. #elif defined(__clang__)
  71248. "adcs r5, %[r]\n\t"
  71249. #else
  71250. "adc r5, %[r]\n\t"
  71251. #endif
  71252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71253. "adds r3, r3, r7\n\t"
  71254. #else
  71255. "add r3, r3, r7\n\t"
  71256. #endif
  71257. #ifdef WOLFSSL_KEIL
  71258. "adcs r4, r4, %[r]\n\t"
  71259. #elif defined(__clang__)
  71260. "adcs r4, %[r]\n\t"
  71261. #else
  71262. "adc r4, %[r]\n\t"
  71263. #endif
  71264. #ifdef WOLFSSL_KEIL
  71265. "adcs r5, r5, %[r]\n\t"
  71266. #elif defined(__clang__)
  71267. "adcs r5, %[r]\n\t"
  71268. #else
  71269. "adc r5, %[r]\n\t"
  71270. #endif
  71271. "ldr r7, [r2]\n\t"
  71272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71273. "lsrs r7, r7, #16\n\t"
  71274. #else
  71275. "lsr r7, r7, #16\n\t"
  71276. #endif
  71277. #ifdef WOLFSSL_KEIL
  71278. "muls r6, r7, r6\n\t"
  71279. #elif defined(__clang__)
  71280. "muls r6, r7\n\t"
  71281. #else
  71282. "mul r6, r7\n\t"
  71283. #endif
  71284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71285. "lsrs r7, r6, #16\n\t"
  71286. #else
  71287. "lsr r7, r6, #16\n\t"
  71288. #endif
  71289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71290. "lsls r6, r6, #16\n\t"
  71291. #else
  71292. "lsl r6, r6, #16\n\t"
  71293. #endif
  71294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71295. "adds r3, r3, r6\n\t"
  71296. #else
  71297. "add r3, r3, r6\n\t"
  71298. #endif
  71299. #ifdef WOLFSSL_KEIL
  71300. "adcs r4, r4, r7\n\t"
  71301. #elif defined(__clang__)
  71302. "adcs r4, r7\n\t"
  71303. #else
  71304. "adc r4, r7\n\t"
  71305. #endif
  71306. #ifdef WOLFSSL_KEIL
  71307. "adcs r5, r5, %[r]\n\t"
  71308. #elif defined(__clang__)
  71309. "adcs r5, %[r]\n\t"
  71310. #else
  71311. "adc r5, %[r]\n\t"
  71312. #endif
  71313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71314. "adds r3, r3, r6\n\t"
  71315. #else
  71316. "add r3, r3, r6\n\t"
  71317. #endif
  71318. #ifdef WOLFSSL_KEIL
  71319. "adcs r4, r4, r7\n\t"
  71320. #elif defined(__clang__)
  71321. "adcs r4, r7\n\t"
  71322. #else
  71323. "adc r4, r7\n\t"
  71324. #endif
  71325. #ifdef WOLFSSL_KEIL
  71326. "adcs r5, r5, %[r]\n\t"
  71327. #elif defined(__clang__)
  71328. "adcs r5, %[r]\n\t"
  71329. #else
  71330. "adc r5, %[r]\n\t"
  71331. #endif
  71332. "ldr r6, [%[a]]\n\t"
  71333. "ldr r7, [r2]\n\t"
  71334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71335. "lsrs r6, r6, #16\n\t"
  71336. #else
  71337. "lsr r6, r6, #16\n\t"
  71338. #endif
  71339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71340. "lsrs r7, r7, #16\n\t"
  71341. #else
  71342. "lsr r7, r7, #16\n\t"
  71343. #endif
  71344. #ifdef WOLFSSL_KEIL
  71345. "muls r7, r6, r7\n\t"
  71346. #elif defined(__clang__)
  71347. "muls r7, r6\n\t"
  71348. #else
  71349. "mul r7, r6\n\t"
  71350. #endif
  71351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71352. "adds r4, r4, r7\n\t"
  71353. #else
  71354. "add r4, r4, r7\n\t"
  71355. #endif
  71356. #ifdef WOLFSSL_KEIL
  71357. "adcs r5, r5, %[r]\n\t"
  71358. #elif defined(__clang__)
  71359. "adcs r5, %[r]\n\t"
  71360. #else
  71361. "adc r5, %[r]\n\t"
  71362. #endif
  71363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71364. "adds r4, r4, r7\n\t"
  71365. #else
  71366. "add r4, r4, r7\n\t"
  71367. #endif
  71368. #ifdef WOLFSSL_KEIL
  71369. "adcs r5, r5, %[r]\n\t"
  71370. #elif defined(__clang__)
  71371. "adcs r5, %[r]\n\t"
  71372. #else
  71373. "adc r5, %[r]\n\t"
  71374. #endif
  71375. "ldrh r7, [r2]\n\t"
  71376. #ifdef WOLFSSL_KEIL
  71377. "muls r6, r7, r6\n\t"
  71378. #elif defined(__clang__)
  71379. "muls r6, r7\n\t"
  71380. #else
  71381. "mul r6, r7\n\t"
  71382. #endif
  71383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71384. "lsrs r7, r6, #16\n\t"
  71385. #else
  71386. "lsr r7, r6, #16\n\t"
  71387. #endif
  71388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71389. "lsls r6, r6, #16\n\t"
  71390. #else
  71391. "lsl r6, r6, #16\n\t"
  71392. #endif
  71393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71394. "adds r3, r3, r6\n\t"
  71395. #else
  71396. "add r3, r3, r6\n\t"
  71397. #endif
  71398. #ifdef WOLFSSL_KEIL
  71399. "adcs r4, r4, r7\n\t"
  71400. #elif defined(__clang__)
  71401. "adcs r4, r7\n\t"
  71402. #else
  71403. "adc r4, r7\n\t"
  71404. #endif
  71405. #ifdef WOLFSSL_KEIL
  71406. "adcs r5, r5, %[r]\n\t"
  71407. #elif defined(__clang__)
  71408. "adcs r5, %[r]\n\t"
  71409. #else
  71410. "adc r5, %[r]\n\t"
  71411. #endif
  71412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71413. "adds r3, r3, r6\n\t"
  71414. #else
  71415. "add r3, r3, r6\n\t"
  71416. #endif
  71417. #ifdef WOLFSSL_KEIL
  71418. "adcs r4, r4, r7\n\t"
  71419. #elif defined(__clang__)
  71420. "adcs r4, r7\n\t"
  71421. #else
  71422. "adc r4, r7\n\t"
  71423. #endif
  71424. #ifdef WOLFSSL_KEIL
  71425. "adcs r5, r5, %[r]\n\t"
  71426. #elif defined(__clang__)
  71427. "adcs r5, %[r]\n\t"
  71428. #else
  71429. "adc r5, %[r]\n\t"
  71430. #endif
  71431. "# Multiply * 2: Done\n\t"
  71432. "bal L_sp_3072_sqr_96_done_sqr_%=\n\t"
  71433. "\n"
  71434. "L_sp_3072_sqr_96_sqr_%=:\n\t"
  71435. "mov r12, r2\n\t"
  71436. "ldr r2, [%[a]]\n\t"
  71437. "# Square: Start\n\t"
  71438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71439. "lsrs r7, r2, #16\n\t"
  71440. #else
  71441. "lsr r7, r2, #16\n\t"
  71442. #endif
  71443. "uxth r6, r2\n\t"
  71444. #ifdef WOLFSSL_KEIL
  71445. "muls r6, r6, r6\n\t"
  71446. #elif defined(__clang__)
  71447. "muls r6, r6\n\t"
  71448. #else
  71449. "mul r6, r6\n\t"
  71450. #endif
  71451. #ifdef WOLFSSL_KEIL
  71452. "muls r7, r7, r7\n\t"
  71453. #elif defined(__clang__)
  71454. "muls r7, r7\n\t"
  71455. #else
  71456. "mul r7, r7\n\t"
  71457. #endif
  71458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71459. "adds r3, r3, r6\n\t"
  71460. #else
  71461. "add r3, r3, r6\n\t"
  71462. #endif
  71463. #ifdef WOLFSSL_KEIL
  71464. "adcs r4, r4, r7\n\t"
  71465. #elif defined(__clang__)
  71466. "adcs r4, r7\n\t"
  71467. #else
  71468. "adc r4, r7\n\t"
  71469. #endif
  71470. #ifdef WOLFSSL_KEIL
  71471. "adcs r5, r5, %[r]\n\t"
  71472. #elif defined(__clang__)
  71473. "adcs r5, %[r]\n\t"
  71474. #else
  71475. "adc r5, %[r]\n\t"
  71476. #endif
  71477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71478. "lsrs r7, r2, #16\n\t"
  71479. #else
  71480. "lsr r7, r2, #16\n\t"
  71481. #endif
  71482. "uxth r6, r2\n\t"
  71483. #ifdef WOLFSSL_KEIL
  71484. "muls r6, r7, r6\n\t"
  71485. #elif defined(__clang__)
  71486. "muls r6, r7\n\t"
  71487. #else
  71488. "mul r6, r7\n\t"
  71489. #endif
  71490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71491. "lsrs r7, r6, #15\n\t"
  71492. #else
  71493. "lsr r7, r6, #15\n\t"
  71494. #endif
  71495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71496. "lsls r6, r6, #17\n\t"
  71497. #else
  71498. "lsl r6, r6, #17\n\t"
  71499. #endif
  71500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71501. "adds r3, r3, r6\n\t"
  71502. #else
  71503. "add r3, r3, r6\n\t"
  71504. #endif
  71505. #ifdef WOLFSSL_KEIL
  71506. "adcs r4, r4, r7\n\t"
  71507. #elif defined(__clang__)
  71508. "adcs r4, r7\n\t"
  71509. #else
  71510. "adc r4, r7\n\t"
  71511. #endif
  71512. #ifdef WOLFSSL_KEIL
  71513. "adcs r5, r5, %[r]\n\t"
  71514. #elif defined(__clang__)
  71515. "adcs r5, %[r]\n\t"
  71516. #else
  71517. "adc r5, %[r]\n\t"
  71518. #endif
  71519. "# Square: Done\n\t"
  71520. "mov r2, r12\n\t"
  71521. "\n"
  71522. "L_sp_3072_sqr_96_done_sqr_%=:\n\t"
  71523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71524. "adds %[a], %[a], #4\n\t"
  71525. #else
  71526. "add %[a], %[a], #4\n\t"
  71527. #endif
  71528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71529. "subs r2, r2, #4\n\t"
  71530. #else
  71531. "sub r2, r2, #4\n\t"
  71532. #endif
  71533. "movs r6, #0xff\n\t"
  71534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71535. "adds r6, r6, #0x81\n\t"
  71536. #else
  71537. "add r6, r6, #0x81\n\t"
  71538. #endif
  71539. "add r6, r6, r9\n\t"
  71540. "cmp %[a], r6\n\t"
  71541. "beq L_sp_3072_sqr_96_done_mul_%=\n\t"
  71542. "cmp %[a], r2\n\t"
  71543. "bgt L_sp_3072_sqr_96_done_mul_%=\n\t"
  71544. "mov r7, r8\n\t"
  71545. "add r7, r7, r9\n\t"
  71546. "cmp %[a], r7\n\t"
  71547. "ble L_sp_3072_sqr_96_mul_%=\n\t"
  71548. "\n"
  71549. "L_sp_3072_sqr_96_done_mul_%=:\n\t"
  71550. "mov %[r], r10\n\t"
  71551. "mov r7, r8\n\t"
  71552. "str r3, [%[r], r7]\n\t"
  71553. "movs r3, r4\n\t"
  71554. "movs r4, r5\n\t"
  71555. "movs r5, #0\n\t"
  71556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71557. "adds r7, r7, #4\n\t"
  71558. #else
  71559. "add r7, r7, #4\n\t"
  71560. #endif
  71561. "mov r8, r7\n\t"
  71562. "movs r6, #2\n\t"
  71563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71564. "lsls r6, r6, #8\n\t"
  71565. #else
  71566. "lsl r6, r6, #8\n\t"
  71567. #endif
  71568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71569. "adds r6, r6, #0xf8\n\t"
  71570. #else
  71571. "add r6, r6, #0xf8\n\t"
  71572. #endif
  71573. "cmp r7, r6\n\t"
  71574. "ble L_sp_3072_sqr_96_words_%=\n\t"
  71575. "mov %[a], r9\n\t"
  71576. "str r3, [%[r], r7]\n\t"
  71577. "mov %[r], r11\n\t"
  71578. "mov %[a], r10\n\t"
  71579. "movs r3, #2\n\t"
  71580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71581. "lsls r3, r3, #8\n\t"
  71582. #else
  71583. "lsl r3, r3, #8\n\t"
  71584. #endif
  71585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71586. "adds r3, r3, #0xfc\n\t"
  71587. #else
  71588. "add r3, r3, #0xfc\n\t"
  71589. #endif
  71590. "\n"
  71591. "L_sp_3072_sqr_96_store_%=:\n\t"
  71592. "ldr r6, [%[a], r3]\n\t"
  71593. "str r6, [%[r], r3]\n\t"
  71594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71595. "subs r3, r3, #4\n\t"
  71596. #else
  71597. "sub r3, r3, #4\n\t"
  71598. #endif
  71599. "bge L_sp_3072_sqr_96_store_%=\n\t"
  71600. "movs r6, #3\n\t"
  71601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71602. "lsls r6, r6, #8\n\t"
  71603. #else
  71604. "lsl r6, r6, #8\n\t"
  71605. #endif
  71606. "add sp, sp, r6\n\t"
  71607. : [r] "+l" (r), [a] "+l" (a)
  71608. :
  71609. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  71610. );
  71611. }
  71612. #endif /* WOLFSSL_SP_SMALL */
  71613. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  71614. #ifdef WOLFSSL_SP_SMALL
  71615. /* AND m into each word of a and store in r.
  71616. *
  71617. * r A single precision integer.
  71618. * a A single precision integer.
  71619. * m Mask to AND against each digit.
  71620. */
  71621. static void sp_3072_mask_48(sp_digit* r, const sp_digit* a, sp_digit m)
  71622. {
  71623. int i;
  71624. for (i=0; i<48; i++) {
  71625. r[i] = a[i] & m;
  71626. }
  71627. }
  71628. #endif /* WOLFSSL_SP_SMALL */
  71629. #ifdef WOLFSSL_SP_SMALL
  71630. /* Add b to a into r. (r = a + b)
  71631. *
  71632. * r A single precision integer.
  71633. * a A single precision integer.
  71634. * b A single precision integer.
  71635. */
  71636. SP_NOINLINE static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a,
  71637. const sp_digit* b)
  71638. {
  71639. __asm__ __volatile__ (
  71640. "movs r6, %[a]\n\t"
  71641. "movs r7, #0\n\t"
  71642. "movs r3, #0\n\t"
  71643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71644. "adds r6, r6, #0xc0\n\t"
  71645. #else
  71646. "add r6, r6, #0xc0\n\t"
  71647. #endif
  71648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71649. "subs r7, r7, #1\n\t"
  71650. #else
  71651. "sub r7, r7, #1\n\t"
  71652. #endif
  71653. "\n"
  71654. "L_sp_3072_add_48_word_%=:\n\t"
  71655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71656. "adds r3, r3, r7\n\t"
  71657. #else
  71658. "add r3, r3, r7\n\t"
  71659. #endif
  71660. "ldr r4, [%[a]]\n\t"
  71661. "ldr r5, [%[b]]\n\t"
  71662. #ifdef WOLFSSL_KEIL
  71663. "adcs r4, r4, r5\n\t"
  71664. #elif defined(__clang__)
  71665. "adcs r4, r5\n\t"
  71666. #else
  71667. "adc r4, r5\n\t"
  71668. #endif
  71669. "str r4, [%[r]]\n\t"
  71670. "movs r3, #0\n\t"
  71671. #ifdef WOLFSSL_KEIL
  71672. "adcs r3, r3, r3\n\t"
  71673. #elif defined(__clang__)
  71674. "adcs r3, r3\n\t"
  71675. #else
  71676. "adc r3, r3\n\t"
  71677. #endif
  71678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71679. "adds %[a], %[a], #4\n\t"
  71680. #else
  71681. "add %[a], %[a], #4\n\t"
  71682. #endif
  71683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71684. "adds %[b], %[b], #4\n\t"
  71685. #else
  71686. "add %[b], %[b], #4\n\t"
  71687. #endif
  71688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71689. "adds %[r], %[r], #4\n\t"
  71690. #else
  71691. "add %[r], %[r], #4\n\t"
  71692. #endif
  71693. "cmp %[a], r6\n\t"
  71694. "bne L_sp_3072_add_48_word_%=\n\t"
  71695. "movs %[r], r3\n\t"
  71696. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  71697. :
  71698. : "memory", "r3", "r4", "r5", "r6", "r7"
  71699. );
  71700. return (uint32_t)(size_t)r;
  71701. }
  71702. #endif /* WOLFSSL_SP_SMALL */
  71703. #ifdef WOLFSSL_SP_SMALL
  71704. /* Sub b from a into a. (a -= b)
  71705. *
  71706. * a A single precision integer.
  71707. * b A single precision integer.
  71708. */
  71709. SP_NOINLINE static sp_digit sp_3072_sub_in_place_48(sp_digit* a,
  71710. const sp_digit* b)
  71711. {
  71712. __asm__ __volatile__ (
  71713. "movs r7, %[a]\n\t"
  71714. "movs r2, #0\n\t"
  71715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71716. "adds r7, r7, #0xc0\n\t"
  71717. #else
  71718. "add r7, r7, #0xc0\n\t"
  71719. #endif
  71720. "\n"
  71721. "L_sp_3072_sub_in_place_48_words_%=:\n\t"
  71722. "movs r5, #0\n\t"
  71723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71724. "subs r5, r5, r2\n\t"
  71725. #else
  71726. "sub r5, r5, r2\n\t"
  71727. #endif
  71728. "ldr r3, [%[a]]\n\t"
  71729. "ldr r4, [%[a], #4]\n\t"
  71730. "ldr r5, [%[b]]\n\t"
  71731. "ldr r6, [%[b], #4]\n\t"
  71732. #ifdef WOLFSSL_KEIL
  71733. "sbcs r3, r3, r5\n\t"
  71734. #elif defined(__clang__)
  71735. "sbcs r3, r5\n\t"
  71736. #else
  71737. "sbc r3, r5\n\t"
  71738. #endif
  71739. #ifdef WOLFSSL_KEIL
  71740. "sbcs r4, r4, r6\n\t"
  71741. #elif defined(__clang__)
  71742. "sbcs r4, r6\n\t"
  71743. #else
  71744. "sbc r4, r6\n\t"
  71745. #endif
  71746. "str r3, [%[a]]\n\t"
  71747. "str r4, [%[a], #4]\n\t"
  71748. #ifdef WOLFSSL_KEIL
  71749. "sbcs r2, r2, r2\n\t"
  71750. #elif defined(__clang__)
  71751. "sbcs r2, r2\n\t"
  71752. #else
  71753. "sbc r2, r2\n\t"
  71754. #endif
  71755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71756. "adds %[a], %[a], #8\n\t"
  71757. #else
  71758. "add %[a], %[a], #8\n\t"
  71759. #endif
  71760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71761. "adds %[b], %[b], #8\n\t"
  71762. #else
  71763. "add %[b], %[b], #8\n\t"
  71764. #endif
  71765. "cmp %[a], r7\n\t"
  71766. "bne L_sp_3072_sub_in_place_48_words_%=\n\t"
  71767. "movs %[a], r2\n\t"
  71768. : [a] "+l" (a), [b] "+l" (b)
  71769. :
  71770. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  71771. );
  71772. return (uint32_t)(size_t)a;
  71773. }
  71774. #endif /* WOLFSSL_SP_SMALL */
  71775. #ifdef WOLFSSL_SP_SMALL
  71776. /* Multiply a and b into r. (r = a * b)
  71777. *
  71778. * r A single precision integer.
  71779. * a A single precision integer.
  71780. * b A single precision integer.
  71781. */
  71782. SP_NOINLINE static void sp_3072_mul_48(sp_digit* r, const sp_digit* a,
  71783. const sp_digit* b)
  71784. {
  71785. sp_digit t[48 * 2];
  71786. sp_digit* tmp = t;
  71787. __asm__ __volatile__ (
  71788. "movs r3, #0\n\t"
  71789. "movs r4, #0\n\t"
  71790. "mov r8, r3\n\t"
  71791. "mov r11, %[tmp]\n\t"
  71792. "mov r9, %[a]\n\t"
  71793. "mov r10, %[b]\n\t"
  71794. "movs r6, #0xc0\n\t"
  71795. "add r6, r6, r9\n\t"
  71796. "mov r12, r6\n\t"
  71797. "\n"
  71798. "L_sp_3072_mul_48_words_%=:\n\t"
  71799. "movs %[tmp], #0\n\t"
  71800. "movs r5, #0\n\t"
  71801. "movs r6, #0xbc\n\t"
  71802. "mov %[a], r8\n\t"
  71803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71804. "subs %[a], %[a], r6\n\t"
  71805. #else
  71806. "sub %[a], %[a], r6\n\t"
  71807. #endif
  71808. #ifdef WOLFSSL_KEIL
  71809. "sbcs r6, r6, r6\n\t"
  71810. #elif defined(__clang__)
  71811. "sbcs r6, r6\n\t"
  71812. #else
  71813. "sbc r6, r6\n\t"
  71814. #endif
  71815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71816. "mvns r6, r6\n\t"
  71817. #else
  71818. "mvn r6, r6\n\t"
  71819. #endif
  71820. #ifdef WOLFSSL_KEIL
  71821. "ands %[a], %[a], r6\n\t"
  71822. #elif defined(__clang__)
  71823. "ands %[a], r6\n\t"
  71824. #else
  71825. "and %[a], r6\n\t"
  71826. #endif
  71827. "mov %[b], r8\n\t"
  71828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71829. "subs %[b], %[b], %[a]\n\t"
  71830. #else
  71831. "sub %[b], %[b], %[a]\n\t"
  71832. #endif
  71833. "add %[a], %[a], r9\n\t"
  71834. "add %[b], %[b], r10\n\t"
  71835. "\n"
  71836. "L_sp_3072_mul_48_mul_%=:\n\t"
  71837. "# Multiply Start\n\t"
  71838. "ldrh r6, [%[a]]\n\t"
  71839. "ldrh r7, [%[b]]\n\t"
  71840. #ifdef WOLFSSL_KEIL
  71841. "muls r7, r6, r7\n\t"
  71842. #elif defined(__clang__)
  71843. "muls r7, r6\n\t"
  71844. #else
  71845. "mul r7, r6\n\t"
  71846. #endif
  71847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71848. "adds r3, r3, r7\n\t"
  71849. #else
  71850. "add r3, r3, r7\n\t"
  71851. #endif
  71852. #ifdef WOLFSSL_KEIL
  71853. "adcs r4, r4, %[tmp]\n\t"
  71854. #elif defined(__clang__)
  71855. "adcs r4, %[tmp]\n\t"
  71856. #else
  71857. "adc r4, %[tmp]\n\t"
  71858. #endif
  71859. #ifdef WOLFSSL_KEIL
  71860. "adcs r5, r5, %[tmp]\n\t"
  71861. #elif defined(__clang__)
  71862. "adcs r5, %[tmp]\n\t"
  71863. #else
  71864. "adc r5, %[tmp]\n\t"
  71865. #endif
  71866. "ldr r7, [%[b]]\n\t"
  71867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71868. "lsrs r7, r7, #16\n\t"
  71869. #else
  71870. "lsr r7, r7, #16\n\t"
  71871. #endif
  71872. #ifdef WOLFSSL_KEIL
  71873. "muls r6, r7, r6\n\t"
  71874. #elif defined(__clang__)
  71875. "muls r6, r7\n\t"
  71876. #else
  71877. "mul r6, r7\n\t"
  71878. #endif
  71879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71880. "lsrs r7, r6, #16\n\t"
  71881. #else
  71882. "lsr r7, r6, #16\n\t"
  71883. #endif
  71884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71885. "lsls r6, r6, #16\n\t"
  71886. #else
  71887. "lsl r6, r6, #16\n\t"
  71888. #endif
  71889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71890. "adds r3, r3, r6\n\t"
  71891. #else
  71892. "add r3, r3, r6\n\t"
  71893. #endif
  71894. #ifdef WOLFSSL_KEIL
  71895. "adcs r4, r4, r7\n\t"
  71896. #elif defined(__clang__)
  71897. "adcs r4, r7\n\t"
  71898. #else
  71899. "adc r4, r7\n\t"
  71900. #endif
  71901. #ifdef WOLFSSL_KEIL
  71902. "adcs r5, r5, %[tmp]\n\t"
  71903. #elif defined(__clang__)
  71904. "adcs r5, %[tmp]\n\t"
  71905. #else
  71906. "adc r5, %[tmp]\n\t"
  71907. #endif
  71908. "ldr r6, [%[a]]\n\t"
  71909. "ldr r7, [%[b]]\n\t"
  71910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71911. "lsrs r6, r6, #16\n\t"
  71912. #else
  71913. "lsr r6, r6, #16\n\t"
  71914. #endif
  71915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71916. "lsrs r7, r7, #16\n\t"
  71917. #else
  71918. "lsr r7, r7, #16\n\t"
  71919. #endif
  71920. #ifdef WOLFSSL_KEIL
  71921. "muls r7, r6, r7\n\t"
  71922. #elif defined(__clang__)
  71923. "muls r7, r6\n\t"
  71924. #else
  71925. "mul r7, r6\n\t"
  71926. #endif
  71927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71928. "adds r4, r4, r7\n\t"
  71929. #else
  71930. "add r4, r4, r7\n\t"
  71931. #endif
  71932. #ifdef WOLFSSL_KEIL
  71933. "adcs r5, r5, %[tmp]\n\t"
  71934. #elif defined(__clang__)
  71935. "adcs r5, %[tmp]\n\t"
  71936. #else
  71937. "adc r5, %[tmp]\n\t"
  71938. #endif
  71939. "ldrh r7, [%[b]]\n\t"
  71940. #ifdef WOLFSSL_KEIL
  71941. "muls r6, r7, r6\n\t"
  71942. #elif defined(__clang__)
  71943. "muls r6, r7\n\t"
  71944. #else
  71945. "mul r6, r7\n\t"
  71946. #endif
  71947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71948. "lsrs r7, r6, #16\n\t"
  71949. #else
  71950. "lsr r7, r6, #16\n\t"
  71951. #endif
  71952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71953. "lsls r6, r6, #16\n\t"
  71954. #else
  71955. "lsl r6, r6, #16\n\t"
  71956. #endif
  71957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71958. "adds r3, r3, r6\n\t"
  71959. #else
  71960. "add r3, r3, r6\n\t"
  71961. #endif
  71962. #ifdef WOLFSSL_KEIL
  71963. "adcs r4, r4, r7\n\t"
  71964. #elif defined(__clang__)
  71965. "adcs r4, r7\n\t"
  71966. #else
  71967. "adc r4, r7\n\t"
  71968. #endif
  71969. #ifdef WOLFSSL_KEIL
  71970. "adcs r5, r5, %[tmp]\n\t"
  71971. #elif defined(__clang__)
  71972. "adcs r5, %[tmp]\n\t"
  71973. #else
  71974. "adc r5, %[tmp]\n\t"
  71975. #endif
  71976. "# Multiply Done\n\t"
  71977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71978. "adds %[a], %[a], #4\n\t"
  71979. #else
  71980. "add %[a], %[a], #4\n\t"
  71981. #endif
  71982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71983. "subs %[b], %[b], #4\n\t"
  71984. #else
  71985. "sub %[b], %[b], #4\n\t"
  71986. #endif
  71987. "cmp %[a], r12\n\t"
  71988. "beq L_sp_3072_mul_48_done_mul_%=\n\t"
  71989. "mov r6, r8\n\t"
  71990. "add r6, r6, r9\n\t"
  71991. "cmp %[a], r6\n\t"
  71992. "ble L_sp_3072_mul_48_mul_%=\n\t"
  71993. "\n"
  71994. "L_sp_3072_mul_48_done_mul_%=:\n\t"
  71995. "mov %[tmp], r11\n\t"
  71996. "mov r7, r8\n\t"
  71997. "str r3, [%[tmp], r7]\n\t"
  71998. "movs r3, r4\n\t"
  71999. "movs r4, r5\n\t"
  72000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72001. "adds r7, r7, #4\n\t"
  72002. #else
  72003. "add r7, r7, #4\n\t"
  72004. #endif
  72005. "mov r8, r7\n\t"
  72006. "movs r6, #0xff\n\t"
  72007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72008. "adds r6, r6, #0x79\n\t"
  72009. #else
  72010. "add r6, r6, #0x79\n\t"
  72011. #endif
  72012. "cmp r7, r6\n\t"
  72013. "ble L_sp_3072_mul_48_words_%=\n\t"
  72014. "str r3, [%[tmp], r7]\n\t"
  72015. "mov %[a], r9\n\t"
  72016. "mov %[b], r10\n\t"
  72017. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  72018. :
  72019. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  72020. );
  72021. XMEMCPY(r, t, sizeof(t));
  72022. }
  72023. /* Square a and put result in r. (r = a * a)
  72024. *
  72025. * r A single precision integer.
  72026. * a A single precision integer.
  72027. */
  72028. SP_NOINLINE static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a)
  72029. {
  72030. __asm__ __volatile__ (
  72031. "movs r3, #0\n\t"
  72032. "movs r4, #0\n\t"
  72033. "movs r5, #0\n\t"
  72034. "mov r8, r3\n\t"
  72035. "mov r11, %[r]\n\t"
  72036. "movs r6, #0xff\n\t"
  72037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72038. "adds r6, r6, #0x81\n\t"
  72039. #else
  72040. "add r6, r6, #0x81\n\t"
  72041. #endif
  72042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72043. "negs r6, r6\n\t"
  72044. #else
  72045. "neg r6, r6\n\t"
  72046. #endif
  72047. "add sp, sp, r6\n\t"
  72048. "mov r10, sp\n\t"
  72049. "mov r9, %[a]\n\t"
  72050. "\n"
  72051. "L_sp_3072_sqr_48_words_%=:\n\t"
  72052. "movs %[r], #0\n\t"
  72053. "movs r6, #0xbc\n\t"
  72054. "mov %[a], r8\n\t"
  72055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72056. "subs %[a], %[a], r6\n\t"
  72057. #else
  72058. "sub %[a], %[a], r6\n\t"
  72059. #endif
  72060. #ifdef WOLFSSL_KEIL
  72061. "sbcs r6, r6, r6\n\t"
  72062. #elif defined(__clang__)
  72063. "sbcs r6, r6\n\t"
  72064. #else
  72065. "sbc r6, r6\n\t"
  72066. #endif
  72067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72068. "mvns r6, r6\n\t"
  72069. #else
  72070. "mvn r6, r6\n\t"
  72071. #endif
  72072. #ifdef WOLFSSL_KEIL
  72073. "ands %[a], %[a], r6\n\t"
  72074. #elif defined(__clang__)
  72075. "ands %[a], r6\n\t"
  72076. #else
  72077. "and %[a], r6\n\t"
  72078. #endif
  72079. "mov r2, r8\n\t"
  72080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72081. "subs r2, r2, %[a]\n\t"
  72082. #else
  72083. "sub r2, r2, %[a]\n\t"
  72084. #endif
  72085. "add %[a], %[a], r9\n\t"
  72086. "add r2, r2, r9\n\t"
  72087. "\n"
  72088. "L_sp_3072_sqr_48_mul_%=:\n\t"
  72089. "cmp r2, %[a]\n\t"
  72090. "beq L_sp_3072_sqr_48_sqr_%=\n\t"
  72091. "# Multiply * 2: Start\n\t"
  72092. "ldrh r6, [%[a]]\n\t"
  72093. "ldrh r7, [r2]\n\t"
  72094. #ifdef WOLFSSL_KEIL
  72095. "muls r7, r6, r7\n\t"
  72096. #elif defined(__clang__)
  72097. "muls r7, r6\n\t"
  72098. #else
  72099. "mul r7, r6\n\t"
  72100. #endif
  72101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72102. "adds r3, r3, r7\n\t"
  72103. #else
  72104. "add r3, r3, r7\n\t"
  72105. #endif
  72106. #ifdef WOLFSSL_KEIL
  72107. "adcs r4, r4, %[r]\n\t"
  72108. #elif defined(__clang__)
  72109. "adcs r4, %[r]\n\t"
  72110. #else
  72111. "adc r4, %[r]\n\t"
  72112. #endif
  72113. #ifdef WOLFSSL_KEIL
  72114. "adcs r5, r5, %[r]\n\t"
  72115. #elif defined(__clang__)
  72116. "adcs r5, %[r]\n\t"
  72117. #else
  72118. "adc r5, %[r]\n\t"
  72119. #endif
  72120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72121. "adds r3, r3, r7\n\t"
  72122. #else
  72123. "add r3, r3, r7\n\t"
  72124. #endif
  72125. #ifdef WOLFSSL_KEIL
  72126. "adcs r4, r4, %[r]\n\t"
  72127. #elif defined(__clang__)
  72128. "adcs r4, %[r]\n\t"
  72129. #else
  72130. "adc r4, %[r]\n\t"
  72131. #endif
  72132. #ifdef WOLFSSL_KEIL
  72133. "adcs r5, r5, %[r]\n\t"
  72134. #elif defined(__clang__)
  72135. "adcs r5, %[r]\n\t"
  72136. #else
  72137. "adc r5, %[r]\n\t"
  72138. #endif
  72139. "ldr r7, [r2]\n\t"
  72140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72141. "lsrs r7, r7, #16\n\t"
  72142. #else
  72143. "lsr r7, r7, #16\n\t"
  72144. #endif
  72145. #ifdef WOLFSSL_KEIL
  72146. "muls r6, r7, r6\n\t"
  72147. #elif defined(__clang__)
  72148. "muls r6, r7\n\t"
  72149. #else
  72150. "mul r6, r7\n\t"
  72151. #endif
  72152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72153. "lsrs r7, r6, #16\n\t"
  72154. #else
  72155. "lsr r7, r6, #16\n\t"
  72156. #endif
  72157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72158. "lsls r6, r6, #16\n\t"
  72159. #else
  72160. "lsl r6, r6, #16\n\t"
  72161. #endif
  72162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72163. "adds r3, r3, r6\n\t"
  72164. #else
  72165. "add r3, r3, r6\n\t"
  72166. #endif
  72167. #ifdef WOLFSSL_KEIL
  72168. "adcs r4, r4, r7\n\t"
  72169. #elif defined(__clang__)
  72170. "adcs r4, r7\n\t"
  72171. #else
  72172. "adc r4, r7\n\t"
  72173. #endif
  72174. #ifdef WOLFSSL_KEIL
  72175. "adcs r5, r5, %[r]\n\t"
  72176. #elif defined(__clang__)
  72177. "adcs r5, %[r]\n\t"
  72178. #else
  72179. "adc r5, %[r]\n\t"
  72180. #endif
  72181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72182. "adds r3, r3, r6\n\t"
  72183. #else
  72184. "add r3, r3, r6\n\t"
  72185. #endif
  72186. #ifdef WOLFSSL_KEIL
  72187. "adcs r4, r4, r7\n\t"
  72188. #elif defined(__clang__)
  72189. "adcs r4, r7\n\t"
  72190. #else
  72191. "adc r4, r7\n\t"
  72192. #endif
  72193. #ifdef WOLFSSL_KEIL
  72194. "adcs r5, r5, %[r]\n\t"
  72195. #elif defined(__clang__)
  72196. "adcs r5, %[r]\n\t"
  72197. #else
  72198. "adc r5, %[r]\n\t"
  72199. #endif
  72200. "ldr r6, [%[a]]\n\t"
  72201. "ldr r7, [r2]\n\t"
  72202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72203. "lsrs r6, r6, #16\n\t"
  72204. #else
  72205. "lsr r6, r6, #16\n\t"
  72206. #endif
  72207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72208. "lsrs r7, r7, #16\n\t"
  72209. #else
  72210. "lsr r7, r7, #16\n\t"
  72211. #endif
  72212. #ifdef WOLFSSL_KEIL
  72213. "muls r7, r6, r7\n\t"
  72214. #elif defined(__clang__)
  72215. "muls r7, r6\n\t"
  72216. #else
  72217. "mul r7, r6\n\t"
  72218. #endif
  72219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72220. "adds r4, r4, r7\n\t"
  72221. #else
  72222. "add r4, r4, r7\n\t"
  72223. #endif
  72224. #ifdef WOLFSSL_KEIL
  72225. "adcs r5, r5, %[r]\n\t"
  72226. #elif defined(__clang__)
  72227. "adcs r5, %[r]\n\t"
  72228. #else
  72229. "adc r5, %[r]\n\t"
  72230. #endif
  72231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72232. "adds r4, r4, r7\n\t"
  72233. #else
  72234. "add r4, r4, r7\n\t"
  72235. #endif
  72236. #ifdef WOLFSSL_KEIL
  72237. "adcs r5, r5, %[r]\n\t"
  72238. #elif defined(__clang__)
  72239. "adcs r5, %[r]\n\t"
  72240. #else
  72241. "adc r5, %[r]\n\t"
  72242. #endif
  72243. "ldrh r7, [r2]\n\t"
  72244. #ifdef WOLFSSL_KEIL
  72245. "muls r6, r7, r6\n\t"
  72246. #elif defined(__clang__)
  72247. "muls r6, r7\n\t"
  72248. #else
  72249. "mul r6, r7\n\t"
  72250. #endif
  72251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72252. "lsrs r7, r6, #16\n\t"
  72253. #else
  72254. "lsr r7, r6, #16\n\t"
  72255. #endif
  72256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72257. "lsls r6, r6, #16\n\t"
  72258. #else
  72259. "lsl r6, r6, #16\n\t"
  72260. #endif
  72261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72262. "adds r3, r3, r6\n\t"
  72263. #else
  72264. "add r3, r3, r6\n\t"
  72265. #endif
  72266. #ifdef WOLFSSL_KEIL
  72267. "adcs r4, r4, r7\n\t"
  72268. #elif defined(__clang__)
  72269. "adcs r4, r7\n\t"
  72270. #else
  72271. "adc r4, r7\n\t"
  72272. #endif
  72273. #ifdef WOLFSSL_KEIL
  72274. "adcs r5, r5, %[r]\n\t"
  72275. #elif defined(__clang__)
  72276. "adcs r5, %[r]\n\t"
  72277. #else
  72278. "adc r5, %[r]\n\t"
  72279. #endif
  72280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72281. "adds r3, r3, r6\n\t"
  72282. #else
  72283. "add r3, r3, r6\n\t"
  72284. #endif
  72285. #ifdef WOLFSSL_KEIL
  72286. "adcs r4, r4, r7\n\t"
  72287. #elif defined(__clang__)
  72288. "adcs r4, r7\n\t"
  72289. #else
  72290. "adc r4, r7\n\t"
  72291. #endif
  72292. #ifdef WOLFSSL_KEIL
  72293. "adcs r5, r5, %[r]\n\t"
  72294. #elif defined(__clang__)
  72295. "adcs r5, %[r]\n\t"
  72296. #else
  72297. "adc r5, %[r]\n\t"
  72298. #endif
  72299. "# Multiply * 2: Done\n\t"
  72300. "bal L_sp_3072_sqr_48_done_sqr_%=\n\t"
  72301. "\n"
  72302. "L_sp_3072_sqr_48_sqr_%=:\n\t"
  72303. "mov r12, r2\n\t"
  72304. "ldr r2, [%[a]]\n\t"
  72305. "# Square: Start\n\t"
  72306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72307. "lsrs r7, r2, #16\n\t"
  72308. #else
  72309. "lsr r7, r2, #16\n\t"
  72310. #endif
  72311. "uxth r6, r2\n\t"
  72312. #ifdef WOLFSSL_KEIL
  72313. "muls r6, r6, r6\n\t"
  72314. #elif defined(__clang__)
  72315. "muls r6, r6\n\t"
  72316. #else
  72317. "mul r6, r6\n\t"
  72318. #endif
  72319. #ifdef WOLFSSL_KEIL
  72320. "muls r7, r7, r7\n\t"
  72321. #elif defined(__clang__)
  72322. "muls r7, r7\n\t"
  72323. #else
  72324. "mul r7, r7\n\t"
  72325. #endif
  72326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72327. "adds r3, r3, r6\n\t"
  72328. #else
  72329. "add r3, r3, r6\n\t"
  72330. #endif
  72331. #ifdef WOLFSSL_KEIL
  72332. "adcs r4, r4, r7\n\t"
  72333. #elif defined(__clang__)
  72334. "adcs r4, r7\n\t"
  72335. #else
  72336. "adc r4, r7\n\t"
  72337. #endif
  72338. #ifdef WOLFSSL_KEIL
  72339. "adcs r5, r5, %[r]\n\t"
  72340. #elif defined(__clang__)
  72341. "adcs r5, %[r]\n\t"
  72342. #else
  72343. "adc r5, %[r]\n\t"
  72344. #endif
  72345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72346. "lsrs r7, r2, #16\n\t"
  72347. #else
  72348. "lsr r7, r2, #16\n\t"
  72349. #endif
  72350. "uxth r6, r2\n\t"
  72351. #ifdef WOLFSSL_KEIL
  72352. "muls r6, r7, r6\n\t"
  72353. #elif defined(__clang__)
  72354. "muls r6, r7\n\t"
  72355. #else
  72356. "mul r6, r7\n\t"
  72357. #endif
  72358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72359. "lsrs r7, r6, #15\n\t"
  72360. #else
  72361. "lsr r7, r6, #15\n\t"
  72362. #endif
  72363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72364. "lsls r6, r6, #17\n\t"
  72365. #else
  72366. "lsl r6, r6, #17\n\t"
  72367. #endif
  72368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72369. "adds r3, r3, r6\n\t"
  72370. #else
  72371. "add r3, r3, r6\n\t"
  72372. #endif
  72373. #ifdef WOLFSSL_KEIL
  72374. "adcs r4, r4, r7\n\t"
  72375. #elif defined(__clang__)
  72376. "adcs r4, r7\n\t"
  72377. #else
  72378. "adc r4, r7\n\t"
  72379. #endif
  72380. #ifdef WOLFSSL_KEIL
  72381. "adcs r5, r5, %[r]\n\t"
  72382. #elif defined(__clang__)
  72383. "adcs r5, %[r]\n\t"
  72384. #else
  72385. "adc r5, %[r]\n\t"
  72386. #endif
  72387. "# Square: Done\n\t"
  72388. "mov r2, r12\n\t"
  72389. "\n"
  72390. "L_sp_3072_sqr_48_done_sqr_%=:\n\t"
  72391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72392. "adds %[a], %[a], #4\n\t"
  72393. #else
  72394. "add %[a], %[a], #4\n\t"
  72395. #endif
  72396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72397. "subs r2, r2, #4\n\t"
  72398. #else
  72399. "sub r2, r2, #4\n\t"
  72400. #endif
  72401. "movs r6, #0xc0\n\t"
  72402. "add r6, r6, r9\n\t"
  72403. "cmp %[a], r6\n\t"
  72404. "beq L_sp_3072_sqr_48_done_mul_%=\n\t"
  72405. "cmp %[a], r2\n\t"
  72406. "bgt L_sp_3072_sqr_48_done_mul_%=\n\t"
  72407. "mov r7, r8\n\t"
  72408. "add r7, r7, r9\n\t"
  72409. "cmp %[a], r7\n\t"
  72410. "ble L_sp_3072_sqr_48_mul_%=\n\t"
  72411. "\n"
  72412. "L_sp_3072_sqr_48_done_mul_%=:\n\t"
  72413. "mov %[r], r10\n\t"
  72414. "mov r7, r8\n\t"
  72415. "str r3, [%[r], r7]\n\t"
  72416. "movs r3, r4\n\t"
  72417. "movs r4, r5\n\t"
  72418. "movs r5, #0\n\t"
  72419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72420. "adds r7, r7, #4\n\t"
  72421. #else
  72422. "add r7, r7, #4\n\t"
  72423. #endif
  72424. "mov r8, r7\n\t"
  72425. "movs r6, #0xff\n\t"
  72426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72427. "adds r6, r6, #0x79\n\t"
  72428. #else
  72429. "add r6, r6, #0x79\n\t"
  72430. #endif
  72431. "cmp r7, r6\n\t"
  72432. "ble L_sp_3072_sqr_48_words_%=\n\t"
  72433. "mov %[a], r9\n\t"
  72434. "str r3, [%[r], r7]\n\t"
  72435. "mov %[r], r11\n\t"
  72436. "mov %[a], r10\n\t"
  72437. "movs r3, #0xff\n\t"
  72438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72439. "adds r3, r3, #0x7d\n\t"
  72440. #else
  72441. "add r3, r3, #0x7d\n\t"
  72442. #endif
  72443. "\n"
  72444. "L_sp_3072_sqr_48_store_%=:\n\t"
  72445. "ldr r6, [%[a], r3]\n\t"
  72446. "str r6, [%[r], r3]\n\t"
  72447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72448. "subs r3, r3, #4\n\t"
  72449. #else
  72450. "sub r3, r3, #4\n\t"
  72451. #endif
  72452. "bge L_sp_3072_sqr_48_store_%=\n\t"
  72453. "movs r6, #0xff\n\t"
  72454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72455. "adds r6, r6, #0x81\n\t"
  72456. #else
  72457. "add r6, r6, #0x81\n\t"
  72458. #endif
  72459. "add sp, sp, r6\n\t"
  72460. : [r] "+l" (r), [a] "+l" (a)
  72461. :
  72462. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  72463. );
  72464. }
  72465. #endif /* WOLFSSL_SP_SMALL */
  72466. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  72467. /* Calculate the bottom digit of -1/a mod 2^n.
  72468. *
  72469. * a A single precision number.
  72470. * rho Bottom word of inverse.
  72471. */
  72472. static void sp_3072_mont_setup(const sp_digit* a, sp_digit* rho)
  72473. {
  72474. sp_digit x;
  72475. sp_digit b;
  72476. b = a[0];
  72477. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  72478. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  72479. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  72480. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  72481. /* rho = -1/m mod b */
  72482. *rho = (sp_digit)0 - x;
  72483. }
  72484. /* Mul a by digit b into r. (r = a * b)
  72485. *
  72486. * r A single precision integer.
  72487. * a A single precision integer.
  72488. * b A single precision digit.
  72489. */
  72490. SP_NOINLINE static void sp_3072_mul_d_96(sp_digit* r, const sp_digit* a,
  72491. sp_digit b)
  72492. {
  72493. __asm__ __volatile__ (
  72494. "movs r6, #0xff\n\t"
  72495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72496. "adds r6, r6, #0x81\n\t"
  72497. #else
  72498. "add r6, r6, #0x81\n\t"
  72499. #endif
  72500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72501. "adds r6, r6, %[a]\n\t"
  72502. #else
  72503. "add r6, r6, %[a]\n\t"
  72504. #endif
  72505. "mov r8, %[r]\n\t"
  72506. "mov r9, r6\n\t"
  72507. "movs r3, #0\n\t"
  72508. "movs r4, #0\n\t"
  72509. "\n"
  72510. "L_sp_3072_mul_d_96_%=:\n\t"
  72511. "movs %[r], #0\n\t"
  72512. "movs r5, #0\n\t"
  72513. "# A[] * B\n\t"
  72514. "ldrh r6, [%[a]]\n\t"
  72515. "uxth r7, %[b]\n\t"
  72516. #ifdef WOLFSSL_KEIL
  72517. "muls r7, r6, r7\n\t"
  72518. #elif defined(__clang__)
  72519. "muls r7, r6\n\t"
  72520. #else
  72521. "mul r7, r6\n\t"
  72522. #endif
  72523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72524. "adds r3, r3, r7\n\t"
  72525. #else
  72526. "add r3, r3, r7\n\t"
  72527. #endif
  72528. #ifdef WOLFSSL_KEIL
  72529. "adcs r4, r4, %[r]\n\t"
  72530. #elif defined(__clang__)
  72531. "adcs r4, %[r]\n\t"
  72532. #else
  72533. "adc r4, %[r]\n\t"
  72534. #endif
  72535. #ifdef WOLFSSL_KEIL
  72536. "adcs r5, r5, %[r]\n\t"
  72537. #elif defined(__clang__)
  72538. "adcs r5, %[r]\n\t"
  72539. #else
  72540. "adc r5, %[r]\n\t"
  72541. #endif
  72542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72543. "lsrs r7, %[b], #16\n\t"
  72544. #else
  72545. "lsr r7, %[b], #16\n\t"
  72546. #endif
  72547. #ifdef WOLFSSL_KEIL
  72548. "muls r6, r7, r6\n\t"
  72549. #elif defined(__clang__)
  72550. "muls r6, r7\n\t"
  72551. #else
  72552. "mul r6, r7\n\t"
  72553. #endif
  72554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72555. "lsrs r7, r6, #16\n\t"
  72556. #else
  72557. "lsr r7, r6, #16\n\t"
  72558. #endif
  72559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72560. "lsls r6, r6, #16\n\t"
  72561. #else
  72562. "lsl r6, r6, #16\n\t"
  72563. #endif
  72564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72565. "adds r3, r3, r6\n\t"
  72566. #else
  72567. "add r3, r3, r6\n\t"
  72568. #endif
  72569. #ifdef WOLFSSL_KEIL
  72570. "adcs r4, r4, r7\n\t"
  72571. #elif defined(__clang__)
  72572. "adcs r4, r7\n\t"
  72573. #else
  72574. "adc r4, r7\n\t"
  72575. #endif
  72576. #ifdef WOLFSSL_KEIL
  72577. "adcs r5, r5, %[r]\n\t"
  72578. #elif defined(__clang__)
  72579. "adcs r5, %[r]\n\t"
  72580. #else
  72581. "adc r5, %[r]\n\t"
  72582. #endif
  72583. "ldr r6, [%[a]]\n\t"
  72584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72585. "lsrs r6, r6, #16\n\t"
  72586. #else
  72587. "lsr r6, r6, #16\n\t"
  72588. #endif
  72589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72590. "lsrs r7, %[b], #16\n\t"
  72591. #else
  72592. "lsr r7, %[b], #16\n\t"
  72593. #endif
  72594. #ifdef WOLFSSL_KEIL
  72595. "muls r7, r6, r7\n\t"
  72596. #elif defined(__clang__)
  72597. "muls r7, r6\n\t"
  72598. #else
  72599. "mul r7, r6\n\t"
  72600. #endif
  72601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72602. "adds r4, r4, r7\n\t"
  72603. #else
  72604. "add r4, r4, r7\n\t"
  72605. #endif
  72606. #ifdef WOLFSSL_KEIL
  72607. "adcs r5, r5, %[r]\n\t"
  72608. #elif defined(__clang__)
  72609. "adcs r5, %[r]\n\t"
  72610. #else
  72611. "adc r5, %[r]\n\t"
  72612. #endif
  72613. "uxth r7, %[b]\n\t"
  72614. #ifdef WOLFSSL_KEIL
  72615. "muls r6, r7, r6\n\t"
  72616. #elif defined(__clang__)
  72617. "muls r6, r7\n\t"
  72618. #else
  72619. "mul r6, r7\n\t"
  72620. #endif
  72621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72622. "lsrs r7, r6, #16\n\t"
  72623. #else
  72624. "lsr r7, r6, #16\n\t"
  72625. #endif
  72626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72627. "lsls r6, r6, #16\n\t"
  72628. #else
  72629. "lsl r6, r6, #16\n\t"
  72630. #endif
  72631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72632. "adds r3, r3, r6\n\t"
  72633. #else
  72634. "add r3, r3, r6\n\t"
  72635. #endif
  72636. #ifdef WOLFSSL_KEIL
  72637. "adcs r4, r4, r7\n\t"
  72638. #elif defined(__clang__)
  72639. "adcs r4, r7\n\t"
  72640. #else
  72641. "adc r4, r7\n\t"
  72642. #endif
  72643. #ifdef WOLFSSL_KEIL
  72644. "adcs r5, r5, %[r]\n\t"
  72645. #elif defined(__clang__)
  72646. "adcs r5, %[r]\n\t"
  72647. #else
  72648. "adc r5, %[r]\n\t"
  72649. #endif
  72650. "# A[] * B - Done\n\t"
  72651. "mov %[r], r8\n\t"
  72652. "str r3, [%[r]]\n\t"
  72653. "movs r3, r4\n\t"
  72654. "movs r4, r5\n\t"
  72655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72656. "adds %[r], %[r], #4\n\t"
  72657. #else
  72658. "add %[r], %[r], #4\n\t"
  72659. #endif
  72660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72661. "adds %[a], %[a], #4\n\t"
  72662. #else
  72663. "add %[a], %[a], #4\n\t"
  72664. #endif
  72665. "mov r8, %[r]\n\t"
  72666. "cmp %[a], r9\n\t"
  72667. "blt L_sp_3072_mul_d_96_%=\n\t"
  72668. "str r3, [%[r]]\n\t"
  72669. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  72670. :
  72671. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  72672. );
  72673. }
  72674. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  72675. /* r = 2^n mod m where n is the number of bits to reduce by.
  72676. * Given m must be 3072 bits, just need to subtract.
  72677. *
  72678. * r A single precision number.
  72679. * m A single precision number.
  72680. */
  72681. static void sp_3072_mont_norm_48(sp_digit* r, const sp_digit* m)
  72682. {
  72683. XMEMSET(r, 0, sizeof(sp_digit) * 48);
  72684. /* r = 2^n mod m */
  72685. sp_3072_sub_in_place_48(r, m);
  72686. }
  72687. /* Conditionally subtract b from a using the mask m.
  72688. * m is -1 to subtract and 0 when not copying.
  72689. *
  72690. * r A single precision number representing condition subtract result.
  72691. * a A single precision number to subtract from.
  72692. * b A single precision number to subtract.
  72693. * m Mask value to apply.
  72694. */
  72695. SP_NOINLINE static sp_digit sp_3072_cond_sub_48(sp_digit* r, const sp_digit* a,
  72696. const sp_digit* b, sp_digit m)
  72697. {
  72698. __asm__ __volatile__ (
  72699. "movs r4, #0\n\t"
  72700. "movs r5, #0xc0\n\t"
  72701. "mov r8, r5\n\t"
  72702. "movs r7, #0\n\t"
  72703. "\n"
  72704. "L_sp_3072_cond_sub_48_words_%=:\n\t"
  72705. "ldr r6, [%[b], r7]\n\t"
  72706. #ifdef WOLFSSL_KEIL
  72707. "ands r6, r6, %[m]\n\t"
  72708. #elif defined(__clang__)
  72709. "ands r6, %[m]\n\t"
  72710. #else
  72711. "and r6, %[m]\n\t"
  72712. #endif
  72713. "movs r5, #0\n\t"
  72714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72715. "subs r5, r5, r4\n\t"
  72716. #else
  72717. "sub r5, r5, r4\n\t"
  72718. #endif
  72719. "ldr r5, [%[a], r7]\n\t"
  72720. #ifdef WOLFSSL_KEIL
  72721. "sbcs r5, r5, r6\n\t"
  72722. #elif defined(__clang__)
  72723. "sbcs r5, r6\n\t"
  72724. #else
  72725. "sbc r5, r6\n\t"
  72726. #endif
  72727. #ifdef WOLFSSL_KEIL
  72728. "sbcs r4, r4, r4\n\t"
  72729. #elif defined(__clang__)
  72730. "sbcs r4, r4\n\t"
  72731. #else
  72732. "sbc r4, r4\n\t"
  72733. #endif
  72734. "str r5, [%[r], r7]\n\t"
  72735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72736. "adds r7, r7, #4\n\t"
  72737. #else
  72738. "add r7, r7, #4\n\t"
  72739. #endif
  72740. "cmp r7, r8\n\t"
  72741. "blt L_sp_3072_cond_sub_48_words_%=\n\t"
  72742. "movs %[r], r4\n\t"
  72743. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  72744. :
  72745. : "memory", "r4", "r5", "r6", "r7", "r8"
  72746. );
  72747. return (uint32_t)(size_t)r;
  72748. }
  72749. #define sp_3072_mont_reduce_order_96 sp_3072_mont_reduce_96
  72750. /* Reduce the number back to 3072 bits using Montgomery reduction.
  72751. *
  72752. * a A single precision number to reduce in place.
  72753. * m The single precision number representing the modulus.
  72754. * mp The digit representing the negative inverse of m mod 2^n.
  72755. */
  72756. SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a, const sp_digit* m,
  72757. sp_digit mp)
  72758. {
  72759. __asm__ __volatile__ (
  72760. "movs r7, #0\n\t"
  72761. "mov r8, %[mp]\n\t"
  72762. "mov r12, r7\n\t"
  72763. "mov lr, %[m]\n\t"
  72764. "mov r9, %[a]\n\t"
  72765. "mov r11, %[a]\n\t"
  72766. "movs r5, #0xbc\n\t"
  72767. "movs r6, #0xc0\n\t"
  72768. "add r9, r9, r5\n\t"
  72769. "add r11, r11, r6\n\t"
  72770. "\n"
  72771. "L_sp_3072_mont_reduce_48_mod_%=:\n\t"
  72772. "movs r7, #0\n\t"
  72773. "movs r4, #0\n\t"
  72774. "# a[i] += m[0] * mu\n\t"
  72775. "ldm %[m]!, {%[mp]}\n\t"
  72776. "ldm %[a]!, {r3}\n\t"
  72777. "# mu = a[i] * mp\n\t"
  72778. "mov r5, r8\n\t"
  72779. #ifdef WOLFSSL_KEIL
  72780. "muls r5, r3, r5\n\t"
  72781. #elif defined(__clang__)
  72782. "muls r5, r3\n\t"
  72783. #else
  72784. "mul r5, r3\n\t"
  72785. #endif
  72786. "mov r10, r5\n\t"
  72787. "# Multiply m[0] and mu - Start\n\t"
  72788. "mov r5, r10\n\t"
  72789. "uxth r6, %[mp]\n\t"
  72790. "uxth r5, r5\n\t"
  72791. #ifdef WOLFSSL_KEIL
  72792. "muls r6, r5, r6\n\t"
  72793. #elif defined(__clang__)
  72794. "muls r6, r5\n\t"
  72795. #else
  72796. "mul r6, r5\n\t"
  72797. #endif
  72798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72799. "adds r3, r3, r6\n\t"
  72800. #else
  72801. "add r3, r3, r6\n\t"
  72802. #endif
  72803. #ifdef WOLFSSL_KEIL
  72804. "adcs r4, r4, r7\n\t"
  72805. #elif defined(__clang__)
  72806. "adcs r4, r7\n\t"
  72807. #else
  72808. "adc r4, r7\n\t"
  72809. #endif
  72810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72811. "lsrs r6, %[mp], #16\n\t"
  72812. #else
  72813. "lsr r6, %[mp], #16\n\t"
  72814. #endif
  72815. #ifdef WOLFSSL_KEIL
  72816. "muls r5, r6, r5\n\t"
  72817. #elif defined(__clang__)
  72818. "muls r5, r6\n\t"
  72819. #else
  72820. "mul r5, r6\n\t"
  72821. #endif
  72822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72823. "lsrs r6, r5, #16\n\t"
  72824. #else
  72825. "lsr r6, r5, #16\n\t"
  72826. #endif
  72827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72828. "lsls r5, r5, #16\n\t"
  72829. #else
  72830. "lsl r5, r5, #16\n\t"
  72831. #endif
  72832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72833. "adds r3, r3, r5\n\t"
  72834. #else
  72835. "add r3, r3, r5\n\t"
  72836. #endif
  72837. #ifdef WOLFSSL_KEIL
  72838. "adcs r4, r4, r6\n\t"
  72839. #elif defined(__clang__)
  72840. "adcs r4, r6\n\t"
  72841. #else
  72842. "adc r4, r6\n\t"
  72843. #endif
  72844. "mov r5, r10\n\t"
  72845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72846. "lsrs r6, %[mp], #16\n\t"
  72847. #else
  72848. "lsr r6, %[mp], #16\n\t"
  72849. #endif
  72850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72851. "lsrs r5, r5, #16\n\t"
  72852. #else
  72853. "lsr r5, r5, #16\n\t"
  72854. #endif
  72855. #ifdef WOLFSSL_KEIL
  72856. "muls r6, r5, r6\n\t"
  72857. #elif defined(__clang__)
  72858. "muls r6, r5\n\t"
  72859. #else
  72860. "mul r6, r5\n\t"
  72861. #endif
  72862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72863. "adds r4, r4, r6\n\t"
  72864. #else
  72865. "add r4, r4, r6\n\t"
  72866. #endif
  72867. "uxth r6, %[mp]\n\t"
  72868. #ifdef WOLFSSL_KEIL
  72869. "muls r5, r6, r5\n\t"
  72870. #elif defined(__clang__)
  72871. "muls r5, r6\n\t"
  72872. #else
  72873. "mul r5, r6\n\t"
  72874. #endif
  72875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72876. "lsrs r6, r5, #16\n\t"
  72877. #else
  72878. "lsr r6, r5, #16\n\t"
  72879. #endif
  72880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72881. "lsls r5, r5, #16\n\t"
  72882. #else
  72883. "lsl r5, r5, #16\n\t"
  72884. #endif
  72885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72886. "adds r3, r3, r5\n\t"
  72887. #else
  72888. "add r3, r3, r5\n\t"
  72889. #endif
  72890. #ifdef WOLFSSL_KEIL
  72891. "adcs r4, r4, r6\n\t"
  72892. #elif defined(__clang__)
  72893. "adcs r4, r6\n\t"
  72894. #else
  72895. "adc r4, r6\n\t"
  72896. #endif
  72897. "# Multiply m[0] and mu - Done\n\t"
  72898. "\n"
  72899. "L_sp_3072_mont_reduce_48_word_%=:\n\t"
  72900. "# a[i+j] += m[j] * mu\n\t"
  72901. "ldr r3, [%[a]]\n\t"
  72902. "ldm %[m]!, {%[mp]}\n\t"
  72903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72904. "adds r3, r3, r4\n\t"
  72905. #else
  72906. "add r3, r3, r4\n\t"
  72907. #endif
  72908. "movs r4, #0\n\t"
  72909. #ifdef WOLFSSL_KEIL
  72910. "adcs r4, r4, r7\n\t"
  72911. #elif defined(__clang__)
  72912. "adcs r4, r7\n\t"
  72913. #else
  72914. "adc r4, r7\n\t"
  72915. #endif
  72916. "# Multiply m[j] and mu - Start\n\t"
  72917. "mov r5, r10\n\t"
  72918. "uxth r6, %[mp]\n\t"
  72919. "uxth r5, r5\n\t"
  72920. #ifdef WOLFSSL_KEIL
  72921. "muls r6, r5, r6\n\t"
  72922. #elif defined(__clang__)
  72923. "muls r6, r5\n\t"
  72924. #else
  72925. "mul r6, r5\n\t"
  72926. #endif
  72927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72928. "adds r3, r3, r6\n\t"
  72929. #else
  72930. "add r3, r3, r6\n\t"
  72931. #endif
  72932. #ifdef WOLFSSL_KEIL
  72933. "adcs r4, r4, r7\n\t"
  72934. #elif defined(__clang__)
  72935. "adcs r4, r7\n\t"
  72936. #else
  72937. "adc r4, r7\n\t"
  72938. #endif
  72939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72940. "lsrs r6, %[mp], #16\n\t"
  72941. #else
  72942. "lsr r6, %[mp], #16\n\t"
  72943. #endif
  72944. #ifdef WOLFSSL_KEIL
  72945. "muls r5, r6, r5\n\t"
  72946. #elif defined(__clang__)
  72947. "muls r5, r6\n\t"
  72948. #else
  72949. "mul r5, r6\n\t"
  72950. #endif
  72951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72952. "lsrs r6, r5, #16\n\t"
  72953. #else
  72954. "lsr r6, r5, #16\n\t"
  72955. #endif
  72956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72957. "lsls r5, r5, #16\n\t"
  72958. #else
  72959. "lsl r5, r5, #16\n\t"
  72960. #endif
  72961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72962. "adds r3, r3, r5\n\t"
  72963. #else
  72964. "add r3, r3, r5\n\t"
  72965. #endif
  72966. #ifdef WOLFSSL_KEIL
  72967. "adcs r4, r4, r6\n\t"
  72968. #elif defined(__clang__)
  72969. "adcs r4, r6\n\t"
  72970. #else
  72971. "adc r4, r6\n\t"
  72972. #endif
  72973. "mov r5, r10\n\t"
  72974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72975. "lsrs r6, %[mp], #16\n\t"
  72976. #else
  72977. "lsr r6, %[mp], #16\n\t"
  72978. #endif
  72979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72980. "lsrs r5, r5, #16\n\t"
  72981. #else
  72982. "lsr r5, r5, #16\n\t"
  72983. #endif
  72984. #ifdef WOLFSSL_KEIL
  72985. "muls r6, r5, r6\n\t"
  72986. #elif defined(__clang__)
  72987. "muls r6, r5\n\t"
  72988. #else
  72989. "mul r6, r5\n\t"
  72990. #endif
  72991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72992. "adds r4, r4, r6\n\t"
  72993. #else
  72994. "add r4, r4, r6\n\t"
  72995. #endif
  72996. "uxth r6, %[mp]\n\t"
  72997. #ifdef WOLFSSL_KEIL
  72998. "muls r5, r6, r5\n\t"
  72999. #elif defined(__clang__)
  73000. "muls r5, r6\n\t"
  73001. #else
  73002. "mul r5, r6\n\t"
  73003. #endif
  73004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73005. "lsrs r6, r5, #16\n\t"
  73006. #else
  73007. "lsr r6, r5, #16\n\t"
  73008. #endif
  73009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73010. "lsls r5, r5, #16\n\t"
  73011. #else
  73012. "lsl r5, r5, #16\n\t"
  73013. #endif
  73014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73015. "adds r3, r3, r5\n\t"
  73016. #else
  73017. "add r3, r3, r5\n\t"
  73018. #endif
  73019. #ifdef WOLFSSL_KEIL
  73020. "adcs r4, r4, r6\n\t"
  73021. #elif defined(__clang__)
  73022. "adcs r4, r6\n\t"
  73023. #else
  73024. "adc r4, r6\n\t"
  73025. #endif
  73026. "# Multiply m[j] and mu - Done\n\t"
  73027. "stm %[a]!, {r3}\n\t"
  73028. "cmp %[a], r9\n\t"
  73029. "blt L_sp_3072_mont_reduce_48_word_%=\n\t"
  73030. "# a[i+47] += m[47] * mu\n\t"
  73031. "ldr %[mp], [%[m]]\n\t"
  73032. "mov r3, r12\n\t"
  73033. "# Multiply m[47] and mu - Start\n\t"
  73034. "mov r5, r10\n\t"
  73035. "uxth r6, %[mp]\n\t"
  73036. "uxth r5, r5\n\t"
  73037. #ifdef WOLFSSL_KEIL
  73038. "muls r6, r5, r6\n\t"
  73039. #elif defined(__clang__)
  73040. "muls r6, r5\n\t"
  73041. #else
  73042. "mul r6, r5\n\t"
  73043. #endif
  73044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73045. "adds r4, r4, r6\n\t"
  73046. #else
  73047. "add r4, r4, r6\n\t"
  73048. #endif
  73049. #ifdef WOLFSSL_KEIL
  73050. "adcs r3, r3, r7\n\t"
  73051. #elif defined(__clang__)
  73052. "adcs r3, r7\n\t"
  73053. #else
  73054. "adc r3, r7\n\t"
  73055. #endif
  73056. #ifdef WOLFSSL_KEIL
  73057. "adcs r7, r7, r7\n\t"
  73058. #elif defined(__clang__)
  73059. "adcs r7, r7\n\t"
  73060. #else
  73061. "adc r7, r7\n\t"
  73062. #endif
  73063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73064. "lsrs r6, %[mp], #16\n\t"
  73065. #else
  73066. "lsr r6, %[mp], #16\n\t"
  73067. #endif
  73068. #ifdef WOLFSSL_KEIL
  73069. "muls r5, r6, r5\n\t"
  73070. #elif defined(__clang__)
  73071. "muls r5, r6\n\t"
  73072. #else
  73073. "mul r5, r6\n\t"
  73074. #endif
  73075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73076. "lsrs r6, r5, #16\n\t"
  73077. #else
  73078. "lsr r6, r5, #16\n\t"
  73079. #endif
  73080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73081. "lsls r5, r5, #16\n\t"
  73082. #else
  73083. "lsl r5, r5, #16\n\t"
  73084. #endif
  73085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73086. "adds r4, r4, r5\n\t"
  73087. #else
  73088. "add r4, r4, r5\n\t"
  73089. #endif
  73090. #ifdef WOLFSSL_KEIL
  73091. "adcs r3, r3, r6\n\t"
  73092. #elif defined(__clang__)
  73093. "adcs r3, r6\n\t"
  73094. #else
  73095. "adc r3, r6\n\t"
  73096. #endif
  73097. #ifdef WOLFSSL_KEIL
  73098. "adcs r7, r7, r7\n\t"
  73099. #elif defined(__clang__)
  73100. "adcs r7, r7\n\t"
  73101. #else
  73102. "adc r7, r7\n\t"
  73103. #endif
  73104. "mov r5, r10\n\t"
  73105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73106. "lsrs r6, %[mp], #16\n\t"
  73107. #else
  73108. "lsr r6, %[mp], #16\n\t"
  73109. #endif
  73110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73111. "lsrs r5, r5, #16\n\t"
  73112. #else
  73113. "lsr r5, r5, #16\n\t"
  73114. #endif
  73115. #ifdef WOLFSSL_KEIL
  73116. "muls r6, r5, r6\n\t"
  73117. #elif defined(__clang__)
  73118. "muls r6, r5\n\t"
  73119. #else
  73120. "mul r6, r5\n\t"
  73121. #endif
  73122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73123. "adds r3, r3, r6\n\t"
  73124. #else
  73125. "add r3, r3, r6\n\t"
  73126. #endif
  73127. #ifdef WOLFSSL_KEIL
  73128. "adcs r7, r7, r7\n\t"
  73129. #elif defined(__clang__)
  73130. "adcs r7, r7\n\t"
  73131. #else
  73132. "adc r7, r7\n\t"
  73133. #endif
  73134. "uxth r6, %[mp]\n\t"
  73135. #ifdef WOLFSSL_KEIL
  73136. "muls r5, r6, r5\n\t"
  73137. #elif defined(__clang__)
  73138. "muls r5, r6\n\t"
  73139. #else
  73140. "mul r5, r6\n\t"
  73141. #endif
  73142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73143. "lsrs r6, r5, #16\n\t"
  73144. #else
  73145. "lsr r6, r5, #16\n\t"
  73146. #endif
  73147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73148. "lsls r5, r5, #16\n\t"
  73149. #else
  73150. "lsl r5, r5, #16\n\t"
  73151. #endif
  73152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73153. "adds r4, r4, r5\n\t"
  73154. #else
  73155. "add r4, r4, r5\n\t"
  73156. #endif
  73157. #ifdef WOLFSSL_KEIL
  73158. "adcs r3, r3, r6\n\t"
  73159. #elif defined(__clang__)
  73160. "adcs r3, r6\n\t"
  73161. #else
  73162. "adc r3, r6\n\t"
  73163. #endif
  73164. #ifdef WOLFSSL_KEIL
  73165. "adcs r7, r7, r7\n\t"
  73166. #elif defined(__clang__)
  73167. "adcs r7, r7\n\t"
  73168. #else
  73169. "adc r7, r7\n\t"
  73170. #endif
  73171. "# Multiply m[47] and mu - Done\n\t"
  73172. "ldr r5, [%[a]]\n\t"
  73173. "ldr r6, [%[a], #4]\n\t"
  73174. "movs %[mp], #0\n\t"
  73175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73176. "adds r5, r5, r4\n\t"
  73177. #else
  73178. "add r5, r5, r4\n\t"
  73179. #endif
  73180. #ifdef WOLFSSL_KEIL
  73181. "adcs r6, r6, r3\n\t"
  73182. #elif defined(__clang__)
  73183. "adcs r6, r3\n\t"
  73184. #else
  73185. "adc r6, r3\n\t"
  73186. #endif
  73187. #ifdef WOLFSSL_KEIL
  73188. "adcs r7, r7, %[mp]\n\t"
  73189. #elif defined(__clang__)
  73190. "adcs r7, %[mp]\n\t"
  73191. #else
  73192. "adc r7, %[mp]\n\t"
  73193. #endif
  73194. "stm %[a]!, {r5, r6}\n\t"
  73195. "# i += 1\n\t"
  73196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73197. "subs %[a], %[a], #4\n\t"
  73198. #else
  73199. "sub %[a], %[a], #4\n\t"
  73200. #endif
  73201. "movs r3, #0xbc\n\t"
  73202. "mov r9, %[a]\n\t"
  73203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73204. "subs %[a], %[a], r3\n\t"
  73205. #else
  73206. "sub %[a], %[a], r3\n\t"
  73207. #endif
  73208. "mov r12, r7\n\t"
  73209. "mov %[m], lr\n\t"
  73210. "cmp r11, %[a]\n\t"
  73211. "bgt L_sp_3072_mont_reduce_48_mod_%=\n\t"
  73212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73213. "negs r7, r7\n\t"
  73214. #else
  73215. "neg r7, r7\n\t"
  73216. #endif
  73217. "# Subtract masked modulus\n\t"
  73218. "movs r4, #0xc0\n\t"
  73219. "movs %[mp], #0\n\t"
  73220. "movs r3, #0\n\t"
  73221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73222. "subs %[a], %[a], r4\n\t"
  73223. #else
  73224. "sub %[a], %[a], r4\n\t"
  73225. #endif
  73226. #ifndef WOLFSSL_SP_LARGE_CODE
  73227. "\n"
  73228. "L_sp_3072_mont_reduce_48_sub_mask_%=:\n\t"
  73229. "ldm %[m]!, {r6}\n\t"
  73230. "movs r5, #0\n\t"
  73231. #ifdef WOLFSSL_KEIL
  73232. "ands r6, r6, r7\n\t"
  73233. #elif defined(__clang__)
  73234. "ands r6, r7\n\t"
  73235. #else
  73236. "and r6, r7\n\t"
  73237. #endif
  73238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73239. "subs r5, r5, %[mp]\n\t"
  73240. #else
  73241. "sub r5, r5, %[mp]\n\t"
  73242. #endif
  73243. "ldr r5, [%[a], r4]\n\t"
  73244. #ifdef WOLFSSL_KEIL
  73245. "sbcs r5, r5, r6\n\t"
  73246. #elif defined(__clang__)
  73247. "sbcs r5, r6\n\t"
  73248. #else
  73249. "sbc r5, r6\n\t"
  73250. #endif
  73251. #ifdef WOLFSSL_KEIL
  73252. "sbcs %[mp], %[mp], %[mp]\n\t"
  73253. #elif defined(__clang__)
  73254. "sbcs %[mp], %[mp]\n\t"
  73255. #else
  73256. "sbc %[mp], %[mp]\n\t"
  73257. #endif
  73258. "stm %[a]!, {r5}\n\t"
  73259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73260. "adds r3, r3, #4\n\t"
  73261. #else
  73262. "add r3, r3, #4\n\t"
  73263. #endif
  73264. "cmp r3, r4\n\t"
  73265. "blt L_sp_3072_mont_reduce_48_sub_mask_%=\n\t"
  73266. #else /* WOLFSSL_SP_LARGE_CODE */
  73267. "ldm %[m]!, {r6}\n\t"
  73268. #ifdef WOLFSSL_KEIL
  73269. "ands r6, r6, r7\n\t"
  73270. #elif defined(__clang__)
  73271. "ands r6, r7\n\t"
  73272. #else
  73273. "and r6, r7\n\t"
  73274. #endif
  73275. "ldr r5, [%[a], r4]\n\t"
  73276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73277. "subs r5, r5, r6\n\t"
  73278. #else
  73279. "sub r5, r5, r6\n\t"
  73280. #endif
  73281. "stm %[a]!, {r5}\n\t"
  73282. "ldm %[m]!, {r6}\n\t"
  73283. #ifdef WOLFSSL_KEIL
  73284. "ands r6, r6, r7\n\t"
  73285. #elif defined(__clang__)
  73286. "ands r6, r7\n\t"
  73287. #else
  73288. "and r6, r7\n\t"
  73289. #endif
  73290. "ldr r5, [%[a], r4]\n\t"
  73291. #ifdef WOLFSSL_KEIL
  73292. "sbcs r5, r5, r6\n\t"
  73293. #elif defined(__clang__)
  73294. "sbcs r5, r6\n\t"
  73295. #else
  73296. "sbc r5, r6\n\t"
  73297. #endif
  73298. "stm %[a]!, {r5}\n\t"
  73299. "ldm %[m]!, {r6}\n\t"
  73300. #ifdef WOLFSSL_KEIL
  73301. "ands r6, r6, r7\n\t"
  73302. #elif defined(__clang__)
  73303. "ands r6, r7\n\t"
  73304. #else
  73305. "and r6, r7\n\t"
  73306. #endif
  73307. "ldr r5, [%[a], r4]\n\t"
  73308. #ifdef WOLFSSL_KEIL
  73309. "sbcs r5, r5, r6\n\t"
  73310. #elif defined(__clang__)
  73311. "sbcs r5, r6\n\t"
  73312. #else
  73313. "sbc r5, r6\n\t"
  73314. #endif
  73315. "stm %[a]!, {r5}\n\t"
  73316. "ldm %[m]!, {r6}\n\t"
  73317. #ifdef WOLFSSL_KEIL
  73318. "ands r6, r6, r7\n\t"
  73319. #elif defined(__clang__)
  73320. "ands r6, r7\n\t"
  73321. #else
  73322. "and r6, r7\n\t"
  73323. #endif
  73324. "ldr r5, [%[a], r4]\n\t"
  73325. #ifdef WOLFSSL_KEIL
  73326. "sbcs r5, r5, r6\n\t"
  73327. #elif defined(__clang__)
  73328. "sbcs r5, r6\n\t"
  73329. #else
  73330. "sbc r5, r6\n\t"
  73331. #endif
  73332. "stm %[a]!, {r5}\n\t"
  73333. "ldm %[m]!, {r6}\n\t"
  73334. #ifdef WOLFSSL_KEIL
  73335. "ands r6, r6, r7\n\t"
  73336. #elif defined(__clang__)
  73337. "ands r6, r7\n\t"
  73338. #else
  73339. "and r6, r7\n\t"
  73340. #endif
  73341. "ldr r5, [%[a], r4]\n\t"
  73342. #ifdef WOLFSSL_KEIL
  73343. "sbcs r5, r5, r6\n\t"
  73344. #elif defined(__clang__)
  73345. "sbcs r5, r6\n\t"
  73346. #else
  73347. "sbc r5, r6\n\t"
  73348. #endif
  73349. "stm %[a]!, {r5}\n\t"
  73350. "ldm %[m]!, {r6}\n\t"
  73351. #ifdef WOLFSSL_KEIL
  73352. "ands r6, r6, r7\n\t"
  73353. #elif defined(__clang__)
  73354. "ands r6, r7\n\t"
  73355. #else
  73356. "and r6, r7\n\t"
  73357. #endif
  73358. "ldr r5, [%[a], r4]\n\t"
  73359. #ifdef WOLFSSL_KEIL
  73360. "sbcs r5, r5, r6\n\t"
  73361. #elif defined(__clang__)
  73362. "sbcs r5, r6\n\t"
  73363. #else
  73364. "sbc r5, r6\n\t"
  73365. #endif
  73366. "stm %[a]!, {r5}\n\t"
  73367. "ldm %[m]!, {r6}\n\t"
  73368. #ifdef WOLFSSL_KEIL
  73369. "ands r6, r6, r7\n\t"
  73370. #elif defined(__clang__)
  73371. "ands r6, r7\n\t"
  73372. #else
  73373. "and r6, r7\n\t"
  73374. #endif
  73375. "ldr r5, [%[a], r4]\n\t"
  73376. #ifdef WOLFSSL_KEIL
  73377. "sbcs r5, r5, r6\n\t"
  73378. #elif defined(__clang__)
  73379. "sbcs r5, r6\n\t"
  73380. #else
  73381. "sbc r5, r6\n\t"
  73382. #endif
  73383. "stm %[a]!, {r5}\n\t"
  73384. "ldm %[m]!, {r6}\n\t"
  73385. #ifdef WOLFSSL_KEIL
  73386. "ands r6, r6, r7\n\t"
  73387. #elif defined(__clang__)
  73388. "ands r6, r7\n\t"
  73389. #else
  73390. "and r6, r7\n\t"
  73391. #endif
  73392. "ldr r5, [%[a], r4]\n\t"
  73393. #ifdef WOLFSSL_KEIL
  73394. "sbcs r5, r5, r6\n\t"
  73395. #elif defined(__clang__)
  73396. "sbcs r5, r6\n\t"
  73397. #else
  73398. "sbc r5, r6\n\t"
  73399. #endif
  73400. "stm %[a]!, {r5}\n\t"
  73401. "ldm %[m]!, {r6}\n\t"
  73402. #ifdef WOLFSSL_KEIL
  73403. "ands r6, r6, r7\n\t"
  73404. #elif defined(__clang__)
  73405. "ands r6, r7\n\t"
  73406. #else
  73407. "and r6, r7\n\t"
  73408. #endif
  73409. "ldr r5, [%[a], r4]\n\t"
  73410. #ifdef WOLFSSL_KEIL
  73411. "sbcs r5, r5, r6\n\t"
  73412. #elif defined(__clang__)
  73413. "sbcs r5, r6\n\t"
  73414. #else
  73415. "sbc r5, r6\n\t"
  73416. #endif
  73417. "stm %[a]!, {r5}\n\t"
  73418. "ldm %[m]!, {r6}\n\t"
  73419. #ifdef WOLFSSL_KEIL
  73420. "ands r6, r6, r7\n\t"
  73421. #elif defined(__clang__)
  73422. "ands r6, r7\n\t"
  73423. #else
  73424. "and r6, r7\n\t"
  73425. #endif
  73426. "ldr r5, [%[a], r4]\n\t"
  73427. #ifdef WOLFSSL_KEIL
  73428. "sbcs r5, r5, r6\n\t"
  73429. #elif defined(__clang__)
  73430. "sbcs r5, r6\n\t"
  73431. #else
  73432. "sbc r5, r6\n\t"
  73433. #endif
  73434. "stm %[a]!, {r5}\n\t"
  73435. "ldm %[m]!, {r6}\n\t"
  73436. #ifdef WOLFSSL_KEIL
  73437. "ands r6, r6, r7\n\t"
  73438. #elif defined(__clang__)
  73439. "ands r6, r7\n\t"
  73440. #else
  73441. "and r6, r7\n\t"
  73442. #endif
  73443. "ldr r5, [%[a], r4]\n\t"
  73444. #ifdef WOLFSSL_KEIL
  73445. "sbcs r5, r5, r6\n\t"
  73446. #elif defined(__clang__)
  73447. "sbcs r5, r6\n\t"
  73448. #else
  73449. "sbc r5, r6\n\t"
  73450. #endif
  73451. "stm %[a]!, {r5}\n\t"
  73452. "ldm %[m]!, {r6}\n\t"
  73453. #ifdef WOLFSSL_KEIL
  73454. "ands r6, r6, r7\n\t"
  73455. #elif defined(__clang__)
  73456. "ands r6, r7\n\t"
  73457. #else
  73458. "and r6, r7\n\t"
  73459. #endif
  73460. "ldr r5, [%[a], r4]\n\t"
  73461. #ifdef WOLFSSL_KEIL
  73462. "sbcs r5, r5, r6\n\t"
  73463. #elif defined(__clang__)
  73464. "sbcs r5, r6\n\t"
  73465. #else
  73466. "sbc r5, r6\n\t"
  73467. #endif
  73468. "stm %[a]!, {r5}\n\t"
  73469. "ldm %[m]!, {r6}\n\t"
  73470. #ifdef WOLFSSL_KEIL
  73471. "ands r6, r6, r7\n\t"
  73472. #elif defined(__clang__)
  73473. "ands r6, r7\n\t"
  73474. #else
  73475. "and r6, r7\n\t"
  73476. #endif
  73477. "ldr r5, [%[a], r4]\n\t"
  73478. #ifdef WOLFSSL_KEIL
  73479. "sbcs r5, r5, r6\n\t"
  73480. #elif defined(__clang__)
  73481. "sbcs r5, r6\n\t"
  73482. #else
  73483. "sbc r5, r6\n\t"
  73484. #endif
  73485. "stm %[a]!, {r5}\n\t"
  73486. "ldm %[m]!, {r6}\n\t"
  73487. #ifdef WOLFSSL_KEIL
  73488. "ands r6, r6, r7\n\t"
  73489. #elif defined(__clang__)
  73490. "ands r6, r7\n\t"
  73491. #else
  73492. "and r6, r7\n\t"
  73493. #endif
  73494. "ldr r5, [%[a], r4]\n\t"
  73495. #ifdef WOLFSSL_KEIL
  73496. "sbcs r5, r5, r6\n\t"
  73497. #elif defined(__clang__)
  73498. "sbcs r5, r6\n\t"
  73499. #else
  73500. "sbc r5, r6\n\t"
  73501. #endif
  73502. "stm %[a]!, {r5}\n\t"
  73503. "ldm %[m]!, {r6}\n\t"
  73504. #ifdef WOLFSSL_KEIL
  73505. "ands r6, r6, r7\n\t"
  73506. #elif defined(__clang__)
  73507. "ands r6, r7\n\t"
  73508. #else
  73509. "and r6, r7\n\t"
  73510. #endif
  73511. "ldr r5, [%[a], r4]\n\t"
  73512. #ifdef WOLFSSL_KEIL
  73513. "sbcs r5, r5, r6\n\t"
  73514. #elif defined(__clang__)
  73515. "sbcs r5, r6\n\t"
  73516. #else
  73517. "sbc r5, r6\n\t"
  73518. #endif
  73519. "stm %[a]!, {r5}\n\t"
  73520. "ldm %[m]!, {r6}\n\t"
  73521. #ifdef WOLFSSL_KEIL
  73522. "ands r6, r6, r7\n\t"
  73523. #elif defined(__clang__)
  73524. "ands r6, r7\n\t"
  73525. #else
  73526. "and r6, r7\n\t"
  73527. #endif
  73528. "ldr r5, [%[a], r4]\n\t"
  73529. #ifdef WOLFSSL_KEIL
  73530. "sbcs r5, r5, r6\n\t"
  73531. #elif defined(__clang__)
  73532. "sbcs r5, r6\n\t"
  73533. #else
  73534. "sbc r5, r6\n\t"
  73535. #endif
  73536. "stm %[a]!, {r5}\n\t"
  73537. "ldm %[m]!, {r6}\n\t"
  73538. #ifdef WOLFSSL_KEIL
  73539. "ands r6, r6, r7\n\t"
  73540. #elif defined(__clang__)
  73541. "ands r6, r7\n\t"
  73542. #else
  73543. "and r6, r7\n\t"
  73544. #endif
  73545. "ldr r5, [%[a], r4]\n\t"
  73546. #ifdef WOLFSSL_KEIL
  73547. "sbcs r5, r5, r6\n\t"
  73548. #elif defined(__clang__)
  73549. "sbcs r5, r6\n\t"
  73550. #else
  73551. "sbc r5, r6\n\t"
  73552. #endif
  73553. "stm %[a]!, {r5}\n\t"
  73554. "ldm %[m]!, {r6}\n\t"
  73555. #ifdef WOLFSSL_KEIL
  73556. "ands r6, r6, r7\n\t"
  73557. #elif defined(__clang__)
  73558. "ands r6, r7\n\t"
  73559. #else
  73560. "and r6, r7\n\t"
  73561. #endif
  73562. "ldr r5, [%[a], r4]\n\t"
  73563. #ifdef WOLFSSL_KEIL
  73564. "sbcs r5, r5, r6\n\t"
  73565. #elif defined(__clang__)
  73566. "sbcs r5, r6\n\t"
  73567. #else
  73568. "sbc r5, r6\n\t"
  73569. #endif
  73570. "stm %[a]!, {r5}\n\t"
  73571. "ldm %[m]!, {r6}\n\t"
  73572. #ifdef WOLFSSL_KEIL
  73573. "ands r6, r6, r7\n\t"
  73574. #elif defined(__clang__)
  73575. "ands r6, r7\n\t"
  73576. #else
  73577. "and r6, r7\n\t"
  73578. #endif
  73579. "ldr r5, [%[a], r4]\n\t"
  73580. #ifdef WOLFSSL_KEIL
  73581. "sbcs r5, r5, r6\n\t"
  73582. #elif defined(__clang__)
  73583. "sbcs r5, r6\n\t"
  73584. #else
  73585. "sbc r5, r6\n\t"
  73586. #endif
  73587. "stm %[a]!, {r5}\n\t"
  73588. "ldm %[m]!, {r6}\n\t"
  73589. #ifdef WOLFSSL_KEIL
  73590. "ands r6, r6, r7\n\t"
  73591. #elif defined(__clang__)
  73592. "ands r6, r7\n\t"
  73593. #else
  73594. "and r6, r7\n\t"
  73595. #endif
  73596. "ldr r5, [%[a], r4]\n\t"
  73597. #ifdef WOLFSSL_KEIL
  73598. "sbcs r5, r5, r6\n\t"
  73599. #elif defined(__clang__)
  73600. "sbcs r5, r6\n\t"
  73601. #else
  73602. "sbc r5, r6\n\t"
  73603. #endif
  73604. "stm %[a]!, {r5}\n\t"
  73605. "ldm %[m]!, {r6}\n\t"
  73606. #ifdef WOLFSSL_KEIL
  73607. "ands r6, r6, r7\n\t"
  73608. #elif defined(__clang__)
  73609. "ands r6, r7\n\t"
  73610. #else
  73611. "and r6, r7\n\t"
  73612. #endif
  73613. "ldr r5, [%[a], r4]\n\t"
  73614. #ifdef WOLFSSL_KEIL
  73615. "sbcs r5, r5, r6\n\t"
  73616. #elif defined(__clang__)
  73617. "sbcs r5, r6\n\t"
  73618. #else
  73619. "sbc r5, r6\n\t"
  73620. #endif
  73621. "stm %[a]!, {r5}\n\t"
  73622. "ldm %[m]!, {r6}\n\t"
  73623. #ifdef WOLFSSL_KEIL
  73624. "ands r6, r6, r7\n\t"
  73625. #elif defined(__clang__)
  73626. "ands r6, r7\n\t"
  73627. #else
  73628. "and r6, r7\n\t"
  73629. #endif
  73630. "ldr r5, [%[a], r4]\n\t"
  73631. #ifdef WOLFSSL_KEIL
  73632. "sbcs r5, r5, r6\n\t"
  73633. #elif defined(__clang__)
  73634. "sbcs r5, r6\n\t"
  73635. #else
  73636. "sbc r5, r6\n\t"
  73637. #endif
  73638. "stm %[a]!, {r5}\n\t"
  73639. "ldm %[m]!, {r6}\n\t"
  73640. #ifdef WOLFSSL_KEIL
  73641. "ands r6, r6, r7\n\t"
  73642. #elif defined(__clang__)
  73643. "ands r6, r7\n\t"
  73644. #else
  73645. "and r6, r7\n\t"
  73646. #endif
  73647. "ldr r5, [%[a], r4]\n\t"
  73648. #ifdef WOLFSSL_KEIL
  73649. "sbcs r5, r5, r6\n\t"
  73650. #elif defined(__clang__)
  73651. "sbcs r5, r6\n\t"
  73652. #else
  73653. "sbc r5, r6\n\t"
  73654. #endif
  73655. "stm %[a]!, {r5}\n\t"
  73656. "ldm %[m]!, {r6}\n\t"
  73657. #ifdef WOLFSSL_KEIL
  73658. "ands r6, r6, r7\n\t"
  73659. #elif defined(__clang__)
  73660. "ands r6, r7\n\t"
  73661. #else
  73662. "and r6, r7\n\t"
  73663. #endif
  73664. "ldr r5, [%[a], r4]\n\t"
  73665. #ifdef WOLFSSL_KEIL
  73666. "sbcs r5, r5, r6\n\t"
  73667. #elif defined(__clang__)
  73668. "sbcs r5, r6\n\t"
  73669. #else
  73670. "sbc r5, r6\n\t"
  73671. #endif
  73672. "stm %[a]!, {r5}\n\t"
  73673. "ldm %[m]!, {r6}\n\t"
  73674. #ifdef WOLFSSL_KEIL
  73675. "ands r6, r6, r7\n\t"
  73676. #elif defined(__clang__)
  73677. "ands r6, r7\n\t"
  73678. #else
  73679. "and r6, r7\n\t"
  73680. #endif
  73681. "ldr r5, [%[a], r4]\n\t"
  73682. #ifdef WOLFSSL_KEIL
  73683. "sbcs r5, r5, r6\n\t"
  73684. #elif defined(__clang__)
  73685. "sbcs r5, r6\n\t"
  73686. #else
  73687. "sbc r5, r6\n\t"
  73688. #endif
  73689. "stm %[a]!, {r5}\n\t"
  73690. "ldm %[m]!, {r6}\n\t"
  73691. #ifdef WOLFSSL_KEIL
  73692. "ands r6, r6, r7\n\t"
  73693. #elif defined(__clang__)
  73694. "ands r6, r7\n\t"
  73695. #else
  73696. "and r6, r7\n\t"
  73697. #endif
  73698. "ldr r5, [%[a], r4]\n\t"
  73699. #ifdef WOLFSSL_KEIL
  73700. "sbcs r5, r5, r6\n\t"
  73701. #elif defined(__clang__)
  73702. "sbcs r5, r6\n\t"
  73703. #else
  73704. "sbc r5, r6\n\t"
  73705. #endif
  73706. "stm %[a]!, {r5}\n\t"
  73707. "ldm %[m]!, {r6}\n\t"
  73708. #ifdef WOLFSSL_KEIL
  73709. "ands r6, r6, r7\n\t"
  73710. #elif defined(__clang__)
  73711. "ands r6, r7\n\t"
  73712. #else
  73713. "and r6, r7\n\t"
  73714. #endif
  73715. "ldr r5, [%[a], r4]\n\t"
  73716. #ifdef WOLFSSL_KEIL
  73717. "sbcs r5, r5, r6\n\t"
  73718. #elif defined(__clang__)
  73719. "sbcs r5, r6\n\t"
  73720. #else
  73721. "sbc r5, r6\n\t"
  73722. #endif
  73723. "stm %[a]!, {r5}\n\t"
  73724. "ldm %[m]!, {r6}\n\t"
  73725. #ifdef WOLFSSL_KEIL
  73726. "ands r6, r6, r7\n\t"
  73727. #elif defined(__clang__)
  73728. "ands r6, r7\n\t"
  73729. #else
  73730. "and r6, r7\n\t"
  73731. #endif
  73732. "ldr r5, [%[a], r4]\n\t"
  73733. #ifdef WOLFSSL_KEIL
  73734. "sbcs r5, r5, r6\n\t"
  73735. #elif defined(__clang__)
  73736. "sbcs r5, r6\n\t"
  73737. #else
  73738. "sbc r5, r6\n\t"
  73739. #endif
  73740. "stm %[a]!, {r5}\n\t"
  73741. "ldm %[m]!, {r6}\n\t"
  73742. #ifdef WOLFSSL_KEIL
  73743. "ands r6, r6, r7\n\t"
  73744. #elif defined(__clang__)
  73745. "ands r6, r7\n\t"
  73746. #else
  73747. "and r6, r7\n\t"
  73748. #endif
  73749. "ldr r5, [%[a], r4]\n\t"
  73750. #ifdef WOLFSSL_KEIL
  73751. "sbcs r5, r5, r6\n\t"
  73752. #elif defined(__clang__)
  73753. "sbcs r5, r6\n\t"
  73754. #else
  73755. "sbc r5, r6\n\t"
  73756. #endif
  73757. "stm %[a]!, {r5}\n\t"
  73758. "ldm %[m]!, {r6}\n\t"
  73759. #ifdef WOLFSSL_KEIL
  73760. "ands r6, r6, r7\n\t"
  73761. #elif defined(__clang__)
  73762. "ands r6, r7\n\t"
  73763. #else
  73764. "and r6, r7\n\t"
  73765. #endif
  73766. "ldr r5, [%[a], r4]\n\t"
  73767. #ifdef WOLFSSL_KEIL
  73768. "sbcs r5, r5, r6\n\t"
  73769. #elif defined(__clang__)
  73770. "sbcs r5, r6\n\t"
  73771. #else
  73772. "sbc r5, r6\n\t"
  73773. #endif
  73774. "stm %[a]!, {r5}\n\t"
  73775. "ldm %[m]!, {r6}\n\t"
  73776. #ifdef WOLFSSL_KEIL
  73777. "ands r6, r6, r7\n\t"
  73778. #elif defined(__clang__)
  73779. "ands r6, r7\n\t"
  73780. #else
  73781. "and r6, r7\n\t"
  73782. #endif
  73783. "ldr r5, [%[a], r4]\n\t"
  73784. #ifdef WOLFSSL_KEIL
  73785. "sbcs r5, r5, r6\n\t"
  73786. #elif defined(__clang__)
  73787. "sbcs r5, r6\n\t"
  73788. #else
  73789. "sbc r5, r6\n\t"
  73790. #endif
  73791. "stm %[a]!, {r5}\n\t"
  73792. "ldm %[m]!, {r6}\n\t"
  73793. #ifdef WOLFSSL_KEIL
  73794. "ands r6, r6, r7\n\t"
  73795. #elif defined(__clang__)
  73796. "ands r6, r7\n\t"
  73797. #else
  73798. "and r6, r7\n\t"
  73799. #endif
  73800. "ldr r5, [%[a], r4]\n\t"
  73801. #ifdef WOLFSSL_KEIL
  73802. "sbcs r5, r5, r6\n\t"
  73803. #elif defined(__clang__)
  73804. "sbcs r5, r6\n\t"
  73805. #else
  73806. "sbc r5, r6\n\t"
  73807. #endif
  73808. "stm %[a]!, {r5}\n\t"
  73809. "ldm %[m]!, {r6}\n\t"
  73810. #ifdef WOLFSSL_KEIL
  73811. "ands r6, r6, r7\n\t"
  73812. #elif defined(__clang__)
  73813. "ands r6, r7\n\t"
  73814. #else
  73815. "and r6, r7\n\t"
  73816. #endif
  73817. "ldr r5, [%[a], r4]\n\t"
  73818. #ifdef WOLFSSL_KEIL
  73819. "sbcs r5, r5, r6\n\t"
  73820. #elif defined(__clang__)
  73821. "sbcs r5, r6\n\t"
  73822. #else
  73823. "sbc r5, r6\n\t"
  73824. #endif
  73825. "stm %[a]!, {r5}\n\t"
  73826. "ldm %[m]!, {r6}\n\t"
  73827. #ifdef WOLFSSL_KEIL
  73828. "ands r6, r6, r7\n\t"
  73829. #elif defined(__clang__)
  73830. "ands r6, r7\n\t"
  73831. #else
  73832. "and r6, r7\n\t"
  73833. #endif
  73834. "ldr r5, [%[a], r4]\n\t"
  73835. #ifdef WOLFSSL_KEIL
  73836. "sbcs r5, r5, r6\n\t"
  73837. #elif defined(__clang__)
  73838. "sbcs r5, r6\n\t"
  73839. #else
  73840. "sbc r5, r6\n\t"
  73841. #endif
  73842. "stm %[a]!, {r5}\n\t"
  73843. "ldm %[m]!, {r6}\n\t"
  73844. #ifdef WOLFSSL_KEIL
  73845. "ands r6, r6, r7\n\t"
  73846. #elif defined(__clang__)
  73847. "ands r6, r7\n\t"
  73848. #else
  73849. "and r6, r7\n\t"
  73850. #endif
  73851. "ldr r5, [%[a], r4]\n\t"
  73852. #ifdef WOLFSSL_KEIL
  73853. "sbcs r5, r5, r6\n\t"
  73854. #elif defined(__clang__)
  73855. "sbcs r5, r6\n\t"
  73856. #else
  73857. "sbc r5, r6\n\t"
  73858. #endif
  73859. "stm %[a]!, {r5}\n\t"
  73860. "ldm %[m]!, {r6}\n\t"
  73861. #ifdef WOLFSSL_KEIL
  73862. "ands r6, r6, r7\n\t"
  73863. #elif defined(__clang__)
  73864. "ands r6, r7\n\t"
  73865. #else
  73866. "and r6, r7\n\t"
  73867. #endif
  73868. "ldr r5, [%[a], r4]\n\t"
  73869. #ifdef WOLFSSL_KEIL
  73870. "sbcs r5, r5, r6\n\t"
  73871. #elif defined(__clang__)
  73872. "sbcs r5, r6\n\t"
  73873. #else
  73874. "sbc r5, r6\n\t"
  73875. #endif
  73876. "stm %[a]!, {r5}\n\t"
  73877. "ldm %[m]!, {r6}\n\t"
  73878. #ifdef WOLFSSL_KEIL
  73879. "ands r6, r6, r7\n\t"
  73880. #elif defined(__clang__)
  73881. "ands r6, r7\n\t"
  73882. #else
  73883. "and r6, r7\n\t"
  73884. #endif
  73885. "ldr r5, [%[a], r4]\n\t"
  73886. #ifdef WOLFSSL_KEIL
  73887. "sbcs r5, r5, r6\n\t"
  73888. #elif defined(__clang__)
  73889. "sbcs r5, r6\n\t"
  73890. #else
  73891. "sbc r5, r6\n\t"
  73892. #endif
  73893. "stm %[a]!, {r5}\n\t"
  73894. "ldm %[m]!, {r6}\n\t"
  73895. #ifdef WOLFSSL_KEIL
  73896. "ands r6, r6, r7\n\t"
  73897. #elif defined(__clang__)
  73898. "ands r6, r7\n\t"
  73899. #else
  73900. "and r6, r7\n\t"
  73901. #endif
  73902. "ldr r5, [%[a], r4]\n\t"
  73903. #ifdef WOLFSSL_KEIL
  73904. "sbcs r5, r5, r6\n\t"
  73905. #elif defined(__clang__)
  73906. "sbcs r5, r6\n\t"
  73907. #else
  73908. "sbc r5, r6\n\t"
  73909. #endif
  73910. "stm %[a]!, {r5}\n\t"
  73911. "ldm %[m]!, {r6}\n\t"
  73912. #ifdef WOLFSSL_KEIL
  73913. "ands r6, r6, r7\n\t"
  73914. #elif defined(__clang__)
  73915. "ands r6, r7\n\t"
  73916. #else
  73917. "and r6, r7\n\t"
  73918. #endif
  73919. "ldr r5, [%[a], r4]\n\t"
  73920. #ifdef WOLFSSL_KEIL
  73921. "sbcs r5, r5, r6\n\t"
  73922. #elif defined(__clang__)
  73923. "sbcs r5, r6\n\t"
  73924. #else
  73925. "sbc r5, r6\n\t"
  73926. #endif
  73927. "stm %[a]!, {r5}\n\t"
  73928. "ldm %[m]!, {r6}\n\t"
  73929. #ifdef WOLFSSL_KEIL
  73930. "ands r6, r6, r7\n\t"
  73931. #elif defined(__clang__)
  73932. "ands r6, r7\n\t"
  73933. #else
  73934. "and r6, r7\n\t"
  73935. #endif
  73936. "ldr r5, [%[a], r4]\n\t"
  73937. #ifdef WOLFSSL_KEIL
  73938. "sbcs r5, r5, r6\n\t"
  73939. #elif defined(__clang__)
  73940. "sbcs r5, r6\n\t"
  73941. #else
  73942. "sbc r5, r6\n\t"
  73943. #endif
  73944. "stm %[a]!, {r5}\n\t"
  73945. "ldm %[m]!, {r6}\n\t"
  73946. #ifdef WOLFSSL_KEIL
  73947. "ands r6, r6, r7\n\t"
  73948. #elif defined(__clang__)
  73949. "ands r6, r7\n\t"
  73950. #else
  73951. "and r6, r7\n\t"
  73952. #endif
  73953. "ldr r5, [%[a], r4]\n\t"
  73954. #ifdef WOLFSSL_KEIL
  73955. "sbcs r5, r5, r6\n\t"
  73956. #elif defined(__clang__)
  73957. "sbcs r5, r6\n\t"
  73958. #else
  73959. "sbc r5, r6\n\t"
  73960. #endif
  73961. "stm %[a]!, {r5}\n\t"
  73962. "ldm %[m]!, {r6}\n\t"
  73963. #ifdef WOLFSSL_KEIL
  73964. "ands r6, r6, r7\n\t"
  73965. #elif defined(__clang__)
  73966. "ands r6, r7\n\t"
  73967. #else
  73968. "and r6, r7\n\t"
  73969. #endif
  73970. "ldr r5, [%[a], r4]\n\t"
  73971. #ifdef WOLFSSL_KEIL
  73972. "sbcs r5, r5, r6\n\t"
  73973. #elif defined(__clang__)
  73974. "sbcs r5, r6\n\t"
  73975. #else
  73976. "sbc r5, r6\n\t"
  73977. #endif
  73978. "stm %[a]!, {r5}\n\t"
  73979. "ldm %[m]!, {r6}\n\t"
  73980. #ifdef WOLFSSL_KEIL
  73981. "ands r6, r6, r7\n\t"
  73982. #elif defined(__clang__)
  73983. "ands r6, r7\n\t"
  73984. #else
  73985. "and r6, r7\n\t"
  73986. #endif
  73987. "ldr r5, [%[a], r4]\n\t"
  73988. #ifdef WOLFSSL_KEIL
  73989. "sbcs r5, r5, r6\n\t"
  73990. #elif defined(__clang__)
  73991. "sbcs r5, r6\n\t"
  73992. #else
  73993. "sbc r5, r6\n\t"
  73994. #endif
  73995. "stm %[a]!, {r5}\n\t"
  73996. "ldm %[m]!, {r6}\n\t"
  73997. #ifdef WOLFSSL_KEIL
  73998. "ands r6, r6, r7\n\t"
  73999. #elif defined(__clang__)
  74000. "ands r6, r7\n\t"
  74001. #else
  74002. "and r6, r7\n\t"
  74003. #endif
  74004. "ldr r5, [%[a], r4]\n\t"
  74005. #ifdef WOLFSSL_KEIL
  74006. "sbcs r5, r5, r6\n\t"
  74007. #elif defined(__clang__)
  74008. "sbcs r5, r6\n\t"
  74009. #else
  74010. "sbc r5, r6\n\t"
  74011. #endif
  74012. "stm %[a]!, {r5}\n\t"
  74013. "ldm %[m]!, {r6}\n\t"
  74014. #ifdef WOLFSSL_KEIL
  74015. "ands r6, r6, r7\n\t"
  74016. #elif defined(__clang__)
  74017. "ands r6, r7\n\t"
  74018. #else
  74019. "and r6, r7\n\t"
  74020. #endif
  74021. "ldr r5, [%[a], r4]\n\t"
  74022. #ifdef WOLFSSL_KEIL
  74023. "sbcs r5, r5, r6\n\t"
  74024. #elif defined(__clang__)
  74025. "sbcs r5, r6\n\t"
  74026. #else
  74027. "sbc r5, r6\n\t"
  74028. #endif
  74029. "stm %[a]!, {r5}\n\t"
  74030. "ldm %[m]!, {r6}\n\t"
  74031. #ifdef WOLFSSL_KEIL
  74032. "ands r6, r6, r7\n\t"
  74033. #elif defined(__clang__)
  74034. "ands r6, r7\n\t"
  74035. #else
  74036. "and r6, r7\n\t"
  74037. #endif
  74038. "ldr r5, [%[a], r4]\n\t"
  74039. #ifdef WOLFSSL_KEIL
  74040. "sbcs r5, r5, r6\n\t"
  74041. #elif defined(__clang__)
  74042. "sbcs r5, r6\n\t"
  74043. #else
  74044. "sbc r5, r6\n\t"
  74045. #endif
  74046. "stm %[a]!, {r5}\n\t"
  74047. "ldm %[m]!, {r6}\n\t"
  74048. #ifdef WOLFSSL_KEIL
  74049. "ands r6, r6, r7\n\t"
  74050. #elif defined(__clang__)
  74051. "ands r6, r7\n\t"
  74052. #else
  74053. "and r6, r7\n\t"
  74054. #endif
  74055. "ldr r5, [%[a], r4]\n\t"
  74056. #ifdef WOLFSSL_KEIL
  74057. "sbcs r5, r5, r6\n\t"
  74058. #elif defined(__clang__)
  74059. "sbcs r5, r6\n\t"
  74060. #else
  74061. "sbc r5, r6\n\t"
  74062. #endif
  74063. "stm %[a]!, {r5}\n\t"
  74064. "ldm %[m]!, {r6}\n\t"
  74065. #ifdef WOLFSSL_KEIL
  74066. "ands r6, r6, r7\n\t"
  74067. #elif defined(__clang__)
  74068. "ands r6, r7\n\t"
  74069. #else
  74070. "and r6, r7\n\t"
  74071. #endif
  74072. "ldr r5, [%[a], r4]\n\t"
  74073. #ifdef WOLFSSL_KEIL
  74074. "sbcs r5, r5, r6\n\t"
  74075. #elif defined(__clang__)
  74076. "sbcs r5, r6\n\t"
  74077. #else
  74078. "sbc r5, r6\n\t"
  74079. #endif
  74080. "stm %[a]!, {r5}\n\t"
  74081. #endif /* WOLFSSL_SP_LARGE_CODE */
  74082. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  74083. :
  74084. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  74085. );
  74086. }
  74087. /* Multiply two Montgomery form numbers mod the modulus (prime).
  74088. * (r = a * b mod m)
  74089. *
  74090. * r Result of multiplication.
  74091. * a First number to multiply in Montgomery form.
  74092. * b Second number to multiply in Montgomery form.
  74093. * m Modulus (prime).
  74094. * mp Montgomery multiplier.
  74095. */
  74096. SP_NOINLINE static void sp_3072_mont_mul_48(sp_digit* r, const sp_digit* a,
  74097. const sp_digit* b, const sp_digit* m, sp_digit mp)
  74098. {
  74099. sp_3072_mul_48(r, a, b);
  74100. sp_3072_mont_reduce_48(r, m, mp);
  74101. }
  74102. /* Square the Montgomery form number. (r = a * a mod m)
  74103. *
  74104. * r Result of squaring.
  74105. * a Number to square in Montgomery form.
  74106. * m Modulus (prime).
  74107. * mp Montgomery multiplier.
  74108. */
  74109. SP_NOINLINE static void sp_3072_mont_sqr_48(sp_digit* r, const sp_digit* a,
  74110. const sp_digit* m, sp_digit mp)
  74111. {
  74112. sp_3072_sqr_48(r, a);
  74113. sp_3072_mont_reduce_48(r, m, mp);
  74114. }
  74115. /* Mul a by digit b into r. (r = a * b)
  74116. *
  74117. * r A single precision integer.
  74118. * a A single precision integer.
  74119. * b A single precision digit.
  74120. */
  74121. SP_NOINLINE static void sp_3072_mul_d_48(sp_digit* r, const sp_digit* a,
  74122. sp_digit b)
  74123. {
  74124. __asm__ __volatile__ (
  74125. "movs r6, #0xc0\n\t"
  74126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74127. "adds r6, r6, %[a]\n\t"
  74128. #else
  74129. "add r6, r6, %[a]\n\t"
  74130. #endif
  74131. "mov r8, %[r]\n\t"
  74132. "mov r9, r6\n\t"
  74133. "movs r3, #0\n\t"
  74134. "movs r4, #0\n\t"
  74135. "\n"
  74136. "L_sp_3072_mul_d_48_%=:\n\t"
  74137. "movs %[r], #0\n\t"
  74138. "movs r5, #0\n\t"
  74139. "# A[] * B\n\t"
  74140. "ldrh r6, [%[a]]\n\t"
  74141. "uxth r7, %[b]\n\t"
  74142. #ifdef WOLFSSL_KEIL
  74143. "muls r7, r6, r7\n\t"
  74144. #elif defined(__clang__)
  74145. "muls r7, r6\n\t"
  74146. #else
  74147. "mul r7, r6\n\t"
  74148. #endif
  74149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74150. "adds r3, r3, r7\n\t"
  74151. #else
  74152. "add r3, r3, r7\n\t"
  74153. #endif
  74154. #ifdef WOLFSSL_KEIL
  74155. "adcs r4, r4, %[r]\n\t"
  74156. #elif defined(__clang__)
  74157. "adcs r4, %[r]\n\t"
  74158. #else
  74159. "adc r4, %[r]\n\t"
  74160. #endif
  74161. #ifdef WOLFSSL_KEIL
  74162. "adcs r5, r5, %[r]\n\t"
  74163. #elif defined(__clang__)
  74164. "adcs r5, %[r]\n\t"
  74165. #else
  74166. "adc r5, %[r]\n\t"
  74167. #endif
  74168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74169. "lsrs r7, %[b], #16\n\t"
  74170. #else
  74171. "lsr r7, %[b], #16\n\t"
  74172. #endif
  74173. #ifdef WOLFSSL_KEIL
  74174. "muls r6, r7, r6\n\t"
  74175. #elif defined(__clang__)
  74176. "muls r6, r7\n\t"
  74177. #else
  74178. "mul r6, r7\n\t"
  74179. #endif
  74180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74181. "lsrs r7, r6, #16\n\t"
  74182. #else
  74183. "lsr r7, r6, #16\n\t"
  74184. #endif
  74185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74186. "lsls r6, r6, #16\n\t"
  74187. #else
  74188. "lsl r6, r6, #16\n\t"
  74189. #endif
  74190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74191. "adds r3, r3, r6\n\t"
  74192. #else
  74193. "add r3, r3, r6\n\t"
  74194. #endif
  74195. #ifdef WOLFSSL_KEIL
  74196. "adcs r4, r4, r7\n\t"
  74197. #elif defined(__clang__)
  74198. "adcs r4, r7\n\t"
  74199. #else
  74200. "adc r4, r7\n\t"
  74201. #endif
  74202. #ifdef WOLFSSL_KEIL
  74203. "adcs r5, r5, %[r]\n\t"
  74204. #elif defined(__clang__)
  74205. "adcs r5, %[r]\n\t"
  74206. #else
  74207. "adc r5, %[r]\n\t"
  74208. #endif
  74209. "ldr r6, [%[a]]\n\t"
  74210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74211. "lsrs r6, r6, #16\n\t"
  74212. #else
  74213. "lsr r6, r6, #16\n\t"
  74214. #endif
  74215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74216. "lsrs r7, %[b], #16\n\t"
  74217. #else
  74218. "lsr r7, %[b], #16\n\t"
  74219. #endif
  74220. #ifdef WOLFSSL_KEIL
  74221. "muls r7, r6, r7\n\t"
  74222. #elif defined(__clang__)
  74223. "muls r7, r6\n\t"
  74224. #else
  74225. "mul r7, r6\n\t"
  74226. #endif
  74227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74228. "adds r4, r4, r7\n\t"
  74229. #else
  74230. "add r4, r4, r7\n\t"
  74231. #endif
  74232. #ifdef WOLFSSL_KEIL
  74233. "adcs r5, r5, %[r]\n\t"
  74234. #elif defined(__clang__)
  74235. "adcs r5, %[r]\n\t"
  74236. #else
  74237. "adc r5, %[r]\n\t"
  74238. #endif
  74239. "uxth r7, %[b]\n\t"
  74240. #ifdef WOLFSSL_KEIL
  74241. "muls r6, r7, r6\n\t"
  74242. #elif defined(__clang__)
  74243. "muls r6, r7\n\t"
  74244. #else
  74245. "mul r6, r7\n\t"
  74246. #endif
  74247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74248. "lsrs r7, r6, #16\n\t"
  74249. #else
  74250. "lsr r7, r6, #16\n\t"
  74251. #endif
  74252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74253. "lsls r6, r6, #16\n\t"
  74254. #else
  74255. "lsl r6, r6, #16\n\t"
  74256. #endif
  74257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74258. "adds r3, r3, r6\n\t"
  74259. #else
  74260. "add r3, r3, r6\n\t"
  74261. #endif
  74262. #ifdef WOLFSSL_KEIL
  74263. "adcs r4, r4, r7\n\t"
  74264. #elif defined(__clang__)
  74265. "adcs r4, r7\n\t"
  74266. #else
  74267. "adc r4, r7\n\t"
  74268. #endif
  74269. #ifdef WOLFSSL_KEIL
  74270. "adcs r5, r5, %[r]\n\t"
  74271. #elif defined(__clang__)
  74272. "adcs r5, %[r]\n\t"
  74273. #else
  74274. "adc r5, %[r]\n\t"
  74275. #endif
  74276. "# A[] * B - Done\n\t"
  74277. "mov %[r], r8\n\t"
  74278. "str r3, [%[r]]\n\t"
  74279. "movs r3, r4\n\t"
  74280. "movs r4, r5\n\t"
  74281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74282. "adds %[r], %[r], #4\n\t"
  74283. #else
  74284. "add %[r], %[r], #4\n\t"
  74285. #endif
  74286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74287. "adds %[a], %[a], #4\n\t"
  74288. #else
  74289. "add %[a], %[a], #4\n\t"
  74290. #endif
  74291. "mov r8, %[r]\n\t"
  74292. "cmp %[a], r9\n\t"
  74293. "blt L_sp_3072_mul_d_48_%=\n\t"
  74294. "str r3, [%[r]]\n\t"
  74295. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  74296. :
  74297. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  74298. );
  74299. }
  74300. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  74301. *
  74302. * d1 The high order half of the number to divide.
  74303. * d0 The low order half of the number to divide.
  74304. * div The divisor.
  74305. * returns the result of the division.
  74306. *
  74307. * Note that this is an approximate div. It may give an answer 1 larger.
  74308. */
  74309. SP_NOINLINE static sp_digit div_3072_word_48(sp_digit d1, sp_digit d0,
  74310. sp_digit div)
  74311. {
  74312. __asm__ __volatile__ (
  74313. "movs r3, #0\n\t"
  74314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74315. "lsrs r5, %[div], #1\n\t"
  74316. #else
  74317. "lsr r5, %[div], #1\n\t"
  74318. #endif
  74319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74320. "adds r5, r5, #1\n\t"
  74321. #else
  74322. "add r5, r5, #1\n\t"
  74323. #endif
  74324. "mov r8, %[d0]\n\t"
  74325. "mov r9, %[d1]\n\t"
  74326. "# Do top 32\n\t"
  74327. "movs r6, r5\n\t"
  74328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74329. "subs r6, r6, %[d1]\n\t"
  74330. #else
  74331. "sub r6, r6, %[d1]\n\t"
  74332. #endif
  74333. #ifdef WOLFSSL_KEIL
  74334. "sbcs r6, r6, r6\n\t"
  74335. #elif defined(__clang__)
  74336. "sbcs r6, r6\n\t"
  74337. #else
  74338. "sbc r6, r6\n\t"
  74339. #endif
  74340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74341. "adds r3, r3, r3\n\t"
  74342. #else
  74343. "add r3, r3, r3\n\t"
  74344. #endif
  74345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74346. "subs r3, r3, r6\n\t"
  74347. #else
  74348. "sub r3, r3, r6\n\t"
  74349. #endif
  74350. #ifdef WOLFSSL_KEIL
  74351. "ands r6, r6, r5\n\t"
  74352. #elif defined(__clang__)
  74353. "ands r6, r5\n\t"
  74354. #else
  74355. "and r6, r5\n\t"
  74356. #endif
  74357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74358. "subs %[d1], %[d1], r6\n\t"
  74359. #else
  74360. "sub %[d1], %[d1], r6\n\t"
  74361. #endif
  74362. "movs r4, #29\n\t"
  74363. "\n"
  74364. "L_div_3072_word_48_loop_%=:\n\t"
  74365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74366. "lsls %[d0], %[d0], #1\n\t"
  74367. #else
  74368. "lsl %[d0], %[d0], #1\n\t"
  74369. #endif
  74370. #ifdef WOLFSSL_KEIL
  74371. "adcs %[d1], %[d1], %[d1]\n\t"
  74372. #elif defined(__clang__)
  74373. "adcs %[d1], %[d1]\n\t"
  74374. #else
  74375. "adc %[d1], %[d1]\n\t"
  74376. #endif
  74377. "movs r6, r5\n\t"
  74378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74379. "subs r6, r6, %[d1]\n\t"
  74380. #else
  74381. "sub r6, r6, %[d1]\n\t"
  74382. #endif
  74383. #ifdef WOLFSSL_KEIL
  74384. "sbcs r6, r6, r6\n\t"
  74385. #elif defined(__clang__)
  74386. "sbcs r6, r6\n\t"
  74387. #else
  74388. "sbc r6, r6\n\t"
  74389. #endif
  74390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74391. "adds r3, r3, r3\n\t"
  74392. #else
  74393. "add r3, r3, r3\n\t"
  74394. #endif
  74395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74396. "subs r3, r3, r6\n\t"
  74397. #else
  74398. "sub r3, r3, r6\n\t"
  74399. #endif
  74400. #ifdef WOLFSSL_KEIL
  74401. "ands r6, r6, r5\n\t"
  74402. #elif defined(__clang__)
  74403. "ands r6, r5\n\t"
  74404. #else
  74405. "and r6, r5\n\t"
  74406. #endif
  74407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74408. "subs %[d1], %[d1], r6\n\t"
  74409. #else
  74410. "sub %[d1], %[d1], r6\n\t"
  74411. #endif
  74412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74413. "subs r4, r4, #1\n\t"
  74414. #else
  74415. "sub r4, r4, #1\n\t"
  74416. #endif
  74417. "bpl L_div_3072_word_48_loop_%=\n\t"
  74418. "movs r7, #0\n\t"
  74419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74420. "adds r3, r3, r3\n\t"
  74421. #else
  74422. "add r3, r3, r3\n\t"
  74423. #endif
  74424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74425. "adds r3, r3, #1\n\t"
  74426. #else
  74427. "add r3, r3, #1\n\t"
  74428. #endif
  74429. "# r * div - Start\n\t"
  74430. "uxth %[d1], r3\n\t"
  74431. "uxth r4, %[div]\n\t"
  74432. #ifdef WOLFSSL_KEIL
  74433. "muls r4, %[d1], r4\n\t"
  74434. #elif defined(__clang__)
  74435. "muls r4, %[d1]\n\t"
  74436. #else
  74437. "mul r4, %[d1]\n\t"
  74438. #endif
  74439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74440. "lsrs r6, %[div], #16\n\t"
  74441. #else
  74442. "lsr r6, %[div], #16\n\t"
  74443. #endif
  74444. #ifdef WOLFSSL_KEIL
  74445. "muls %[d1], r6, %[d1]\n\t"
  74446. #elif defined(__clang__)
  74447. "muls %[d1], r6\n\t"
  74448. #else
  74449. "mul %[d1], r6\n\t"
  74450. #endif
  74451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74452. "lsrs r5, %[d1], #16\n\t"
  74453. #else
  74454. "lsr r5, %[d1], #16\n\t"
  74455. #endif
  74456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74457. "lsls %[d1], %[d1], #16\n\t"
  74458. #else
  74459. "lsl %[d1], %[d1], #16\n\t"
  74460. #endif
  74461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74462. "adds r4, r4, %[d1]\n\t"
  74463. #else
  74464. "add r4, r4, %[d1]\n\t"
  74465. #endif
  74466. #ifdef WOLFSSL_KEIL
  74467. "adcs r5, r5, r7\n\t"
  74468. #elif defined(__clang__)
  74469. "adcs r5, r7\n\t"
  74470. #else
  74471. "adc r5, r7\n\t"
  74472. #endif
  74473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74474. "lsrs %[d1], r3, #16\n\t"
  74475. #else
  74476. "lsr %[d1], r3, #16\n\t"
  74477. #endif
  74478. #ifdef WOLFSSL_KEIL
  74479. "muls r6, %[d1], r6\n\t"
  74480. #elif defined(__clang__)
  74481. "muls r6, %[d1]\n\t"
  74482. #else
  74483. "mul r6, %[d1]\n\t"
  74484. #endif
  74485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74486. "adds r5, r5, r6\n\t"
  74487. #else
  74488. "add r5, r5, r6\n\t"
  74489. #endif
  74490. "uxth r6, %[div]\n\t"
  74491. #ifdef WOLFSSL_KEIL
  74492. "muls %[d1], r6, %[d1]\n\t"
  74493. #elif defined(__clang__)
  74494. "muls %[d1], r6\n\t"
  74495. #else
  74496. "mul %[d1], r6\n\t"
  74497. #endif
  74498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74499. "lsrs r6, %[d1], #16\n\t"
  74500. #else
  74501. "lsr r6, %[d1], #16\n\t"
  74502. #endif
  74503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74504. "lsls %[d1], %[d1], #16\n\t"
  74505. #else
  74506. "lsl %[d1], %[d1], #16\n\t"
  74507. #endif
  74508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74509. "adds r4, r4, %[d1]\n\t"
  74510. #else
  74511. "add r4, r4, %[d1]\n\t"
  74512. #endif
  74513. #ifdef WOLFSSL_KEIL
  74514. "adcs r5, r5, r6\n\t"
  74515. #elif defined(__clang__)
  74516. "adcs r5, r6\n\t"
  74517. #else
  74518. "adc r5, r6\n\t"
  74519. #endif
  74520. "# r * div - Done\n\t"
  74521. "mov %[d1], r8\n\t"
  74522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74523. "subs %[d1], %[d1], r4\n\t"
  74524. #else
  74525. "sub %[d1], %[d1], r4\n\t"
  74526. #endif
  74527. "movs r4, %[d1]\n\t"
  74528. "mov %[d1], r9\n\t"
  74529. #ifdef WOLFSSL_KEIL
  74530. "sbcs %[d1], %[d1], r5\n\t"
  74531. #elif defined(__clang__)
  74532. "sbcs %[d1], r5\n\t"
  74533. #else
  74534. "sbc %[d1], r5\n\t"
  74535. #endif
  74536. "movs r5, %[d1]\n\t"
  74537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74538. "adds r3, r3, r5\n\t"
  74539. #else
  74540. "add r3, r3, r5\n\t"
  74541. #endif
  74542. "# r * div - Start\n\t"
  74543. "uxth %[d1], r3\n\t"
  74544. "uxth r4, %[div]\n\t"
  74545. #ifdef WOLFSSL_KEIL
  74546. "muls r4, %[d1], r4\n\t"
  74547. #elif defined(__clang__)
  74548. "muls r4, %[d1]\n\t"
  74549. #else
  74550. "mul r4, %[d1]\n\t"
  74551. #endif
  74552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74553. "lsrs r6, %[div], #16\n\t"
  74554. #else
  74555. "lsr r6, %[div], #16\n\t"
  74556. #endif
  74557. #ifdef WOLFSSL_KEIL
  74558. "muls %[d1], r6, %[d1]\n\t"
  74559. #elif defined(__clang__)
  74560. "muls %[d1], r6\n\t"
  74561. #else
  74562. "mul %[d1], r6\n\t"
  74563. #endif
  74564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74565. "lsrs r5, %[d1], #16\n\t"
  74566. #else
  74567. "lsr r5, %[d1], #16\n\t"
  74568. #endif
  74569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74570. "lsls %[d1], %[d1], #16\n\t"
  74571. #else
  74572. "lsl %[d1], %[d1], #16\n\t"
  74573. #endif
  74574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74575. "adds r4, r4, %[d1]\n\t"
  74576. #else
  74577. "add r4, r4, %[d1]\n\t"
  74578. #endif
  74579. #ifdef WOLFSSL_KEIL
  74580. "adcs r5, r5, r7\n\t"
  74581. #elif defined(__clang__)
  74582. "adcs r5, r7\n\t"
  74583. #else
  74584. "adc r5, r7\n\t"
  74585. #endif
  74586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74587. "lsrs %[d1], r3, #16\n\t"
  74588. #else
  74589. "lsr %[d1], r3, #16\n\t"
  74590. #endif
  74591. #ifdef WOLFSSL_KEIL
  74592. "muls r6, %[d1], r6\n\t"
  74593. #elif defined(__clang__)
  74594. "muls r6, %[d1]\n\t"
  74595. #else
  74596. "mul r6, %[d1]\n\t"
  74597. #endif
  74598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74599. "adds r5, r5, r6\n\t"
  74600. #else
  74601. "add r5, r5, r6\n\t"
  74602. #endif
  74603. "uxth r6, %[div]\n\t"
  74604. #ifdef WOLFSSL_KEIL
  74605. "muls %[d1], r6, %[d1]\n\t"
  74606. #elif defined(__clang__)
  74607. "muls %[d1], r6\n\t"
  74608. #else
  74609. "mul %[d1], r6\n\t"
  74610. #endif
  74611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74612. "lsrs r6, %[d1], #16\n\t"
  74613. #else
  74614. "lsr r6, %[d1], #16\n\t"
  74615. #endif
  74616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74617. "lsls %[d1], %[d1], #16\n\t"
  74618. #else
  74619. "lsl %[d1], %[d1], #16\n\t"
  74620. #endif
  74621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74622. "adds r4, r4, %[d1]\n\t"
  74623. #else
  74624. "add r4, r4, %[d1]\n\t"
  74625. #endif
  74626. #ifdef WOLFSSL_KEIL
  74627. "adcs r5, r5, r6\n\t"
  74628. #elif defined(__clang__)
  74629. "adcs r5, r6\n\t"
  74630. #else
  74631. "adc r5, r6\n\t"
  74632. #endif
  74633. "# r * div - Done\n\t"
  74634. "mov %[d1], r8\n\t"
  74635. "mov r6, r9\n\t"
  74636. #ifdef WOLFSSL_KEIL
  74637. "subs r4, %[d1], r4\n\t"
  74638. #else
  74639. #ifdef __clang__
  74640. "subs r4, %[d1], r4\n\t"
  74641. #else
  74642. "sub r4, %[d1], r4\n\t"
  74643. #endif
  74644. #endif
  74645. #ifdef WOLFSSL_KEIL
  74646. "sbcs r6, r6, r5\n\t"
  74647. #elif defined(__clang__)
  74648. "sbcs r6, r5\n\t"
  74649. #else
  74650. "sbc r6, r5\n\t"
  74651. #endif
  74652. "movs r5, r6\n\t"
  74653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74654. "adds r3, r3, r5\n\t"
  74655. #else
  74656. "add r3, r3, r5\n\t"
  74657. #endif
  74658. "# r * div - Start\n\t"
  74659. "uxth %[d1], r3\n\t"
  74660. "uxth r4, %[div]\n\t"
  74661. #ifdef WOLFSSL_KEIL
  74662. "muls r4, %[d1], r4\n\t"
  74663. #elif defined(__clang__)
  74664. "muls r4, %[d1]\n\t"
  74665. #else
  74666. "mul r4, %[d1]\n\t"
  74667. #endif
  74668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74669. "lsrs r6, %[div], #16\n\t"
  74670. #else
  74671. "lsr r6, %[div], #16\n\t"
  74672. #endif
  74673. #ifdef WOLFSSL_KEIL
  74674. "muls %[d1], r6, %[d1]\n\t"
  74675. #elif defined(__clang__)
  74676. "muls %[d1], r6\n\t"
  74677. #else
  74678. "mul %[d1], r6\n\t"
  74679. #endif
  74680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74681. "lsrs r5, %[d1], #16\n\t"
  74682. #else
  74683. "lsr r5, %[d1], #16\n\t"
  74684. #endif
  74685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74686. "lsls %[d1], %[d1], #16\n\t"
  74687. #else
  74688. "lsl %[d1], %[d1], #16\n\t"
  74689. #endif
  74690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74691. "adds r4, r4, %[d1]\n\t"
  74692. #else
  74693. "add r4, r4, %[d1]\n\t"
  74694. #endif
  74695. #ifdef WOLFSSL_KEIL
  74696. "adcs r5, r5, r7\n\t"
  74697. #elif defined(__clang__)
  74698. "adcs r5, r7\n\t"
  74699. #else
  74700. "adc r5, r7\n\t"
  74701. #endif
  74702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74703. "lsrs %[d1], r3, #16\n\t"
  74704. #else
  74705. "lsr %[d1], r3, #16\n\t"
  74706. #endif
  74707. #ifdef WOLFSSL_KEIL
  74708. "muls r6, %[d1], r6\n\t"
  74709. #elif defined(__clang__)
  74710. "muls r6, %[d1]\n\t"
  74711. #else
  74712. "mul r6, %[d1]\n\t"
  74713. #endif
  74714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74715. "adds r5, r5, r6\n\t"
  74716. #else
  74717. "add r5, r5, r6\n\t"
  74718. #endif
  74719. "uxth r6, %[div]\n\t"
  74720. #ifdef WOLFSSL_KEIL
  74721. "muls %[d1], r6, %[d1]\n\t"
  74722. #elif defined(__clang__)
  74723. "muls %[d1], r6\n\t"
  74724. #else
  74725. "mul %[d1], r6\n\t"
  74726. #endif
  74727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74728. "lsrs r6, %[d1], #16\n\t"
  74729. #else
  74730. "lsr r6, %[d1], #16\n\t"
  74731. #endif
  74732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74733. "lsls %[d1], %[d1], #16\n\t"
  74734. #else
  74735. "lsl %[d1], %[d1], #16\n\t"
  74736. #endif
  74737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74738. "adds r4, r4, %[d1]\n\t"
  74739. #else
  74740. "add r4, r4, %[d1]\n\t"
  74741. #endif
  74742. #ifdef WOLFSSL_KEIL
  74743. "adcs r5, r5, r6\n\t"
  74744. #elif defined(__clang__)
  74745. "adcs r5, r6\n\t"
  74746. #else
  74747. "adc r5, r6\n\t"
  74748. #endif
  74749. "# r * div - Done\n\t"
  74750. "mov %[d1], r8\n\t"
  74751. "mov r6, r9\n\t"
  74752. #ifdef WOLFSSL_KEIL
  74753. "subs r4, %[d1], r4\n\t"
  74754. #else
  74755. #ifdef __clang__
  74756. "subs r4, %[d1], r4\n\t"
  74757. #else
  74758. "sub r4, %[d1], r4\n\t"
  74759. #endif
  74760. #endif
  74761. #ifdef WOLFSSL_KEIL
  74762. "sbcs r6, r6, r5\n\t"
  74763. #elif defined(__clang__)
  74764. "sbcs r6, r5\n\t"
  74765. #else
  74766. "sbc r6, r5\n\t"
  74767. #endif
  74768. "movs r5, r6\n\t"
  74769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74770. "adds r3, r3, r5\n\t"
  74771. #else
  74772. "add r3, r3, r5\n\t"
  74773. #endif
  74774. "# r * div - Start\n\t"
  74775. "uxth %[d1], r3\n\t"
  74776. "uxth r4, %[div]\n\t"
  74777. #ifdef WOLFSSL_KEIL
  74778. "muls r4, %[d1], r4\n\t"
  74779. #elif defined(__clang__)
  74780. "muls r4, %[d1]\n\t"
  74781. #else
  74782. "mul r4, %[d1]\n\t"
  74783. #endif
  74784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74785. "lsrs r6, %[div], #16\n\t"
  74786. #else
  74787. "lsr r6, %[div], #16\n\t"
  74788. #endif
  74789. #ifdef WOLFSSL_KEIL
  74790. "muls %[d1], r6, %[d1]\n\t"
  74791. #elif defined(__clang__)
  74792. "muls %[d1], r6\n\t"
  74793. #else
  74794. "mul %[d1], r6\n\t"
  74795. #endif
  74796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74797. "lsrs r5, %[d1], #16\n\t"
  74798. #else
  74799. "lsr r5, %[d1], #16\n\t"
  74800. #endif
  74801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74802. "lsls %[d1], %[d1], #16\n\t"
  74803. #else
  74804. "lsl %[d1], %[d1], #16\n\t"
  74805. #endif
  74806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74807. "adds r4, r4, %[d1]\n\t"
  74808. #else
  74809. "add r4, r4, %[d1]\n\t"
  74810. #endif
  74811. #ifdef WOLFSSL_KEIL
  74812. "adcs r5, r5, r7\n\t"
  74813. #elif defined(__clang__)
  74814. "adcs r5, r7\n\t"
  74815. #else
  74816. "adc r5, r7\n\t"
  74817. #endif
  74818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74819. "lsrs %[d1], r3, #16\n\t"
  74820. #else
  74821. "lsr %[d1], r3, #16\n\t"
  74822. #endif
  74823. #ifdef WOLFSSL_KEIL
  74824. "muls r6, %[d1], r6\n\t"
  74825. #elif defined(__clang__)
  74826. "muls r6, %[d1]\n\t"
  74827. #else
  74828. "mul r6, %[d1]\n\t"
  74829. #endif
  74830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74831. "adds r5, r5, r6\n\t"
  74832. #else
  74833. "add r5, r5, r6\n\t"
  74834. #endif
  74835. "uxth r6, %[div]\n\t"
  74836. #ifdef WOLFSSL_KEIL
  74837. "muls %[d1], r6, %[d1]\n\t"
  74838. #elif defined(__clang__)
  74839. "muls %[d1], r6\n\t"
  74840. #else
  74841. "mul %[d1], r6\n\t"
  74842. #endif
  74843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74844. "lsrs r6, %[d1], #16\n\t"
  74845. #else
  74846. "lsr r6, %[d1], #16\n\t"
  74847. #endif
  74848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74849. "lsls %[d1], %[d1], #16\n\t"
  74850. #else
  74851. "lsl %[d1], %[d1], #16\n\t"
  74852. #endif
  74853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74854. "adds r4, r4, %[d1]\n\t"
  74855. #else
  74856. "add r4, r4, %[d1]\n\t"
  74857. #endif
  74858. #ifdef WOLFSSL_KEIL
  74859. "adcs r5, r5, r6\n\t"
  74860. #elif defined(__clang__)
  74861. "adcs r5, r6\n\t"
  74862. #else
  74863. "adc r5, r6\n\t"
  74864. #endif
  74865. "# r * div - Done\n\t"
  74866. "mov %[d1], r8\n\t"
  74867. "mov r6, r9\n\t"
  74868. #ifdef WOLFSSL_KEIL
  74869. "subs r4, %[d1], r4\n\t"
  74870. #else
  74871. #ifdef __clang__
  74872. "subs r4, %[d1], r4\n\t"
  74873. #else
  74874. "sub r4, %[d1], r4\n\t"
  74875. #endif
  74876. #endif
  74877. #ifdef WOLFSSL_KEIL
  74878. "sbcs r6, r6, r5\n\t"
  74879. #elif defined(__clang__)
  74880. "sbcs r6, r5\n\t"
  74881. #else
  74882. "sbc r6, r5\n\t"
  74883. #endif
  74884. "movs r5, r6\n\t"
  74885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74886. "adds r3, r3, r5\n\t"
  74887. #else
  74888. "add r3, r3, r5\n\t"
  74889. #endif
  74890. "movs r6, %[div]\n\t"
  74891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74892. "subs r6, r6, r4\n\t"
  74893. #else
  74894. "sub r6, r6, r4\n\t"
  74895. #endif
  74896. #ifdef WOLFSSL_KEIL
  74897. "sbcs r6, r6, r6\n\t"
  74898. #elif defined(__clang__)
  74899. "sbcs r6, r6\n\t"
  74900. #else
  74901. "sbc r6, r6\n\t"
  74902. #endif
  74903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74904. "subs r3, r3, r6\n\t"
  74905. #else
  74906. "sub r3, r3, r6\n\t"
  74907. #endif
  74908. "movs %[d1], r3\n\t"
  74909. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  74910. :
  74911. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  74912. );
  74913. return (uint32_t)(size_t)d1;
  74914. }
  74915. /* Compare a with b in constant time.
  74916. *
  74917. * a A single precision integer.
  74918. * b A single precision integer.
  74919. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  74920. * respectively.
  74921. */
  74922. SP_NOINLINE static sp_int32 sp_3072_cmp_48(const sp_digit* a, const sp_digit* b)
  74923. {
  74924. __asm__ __volatile__ (
  74925. "movs r2, #0\n\t"
  74926. "movs r3, #0\n\t"
  74927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74928. "mvns r3, r3\n\t"
  74929. #else
  74930. "mvn r3, r3\n\t"
  74931. #endif
  74932. "movs r6, #0xbc\n\t"
  74933. "\n"
  74934. "L_sp_3072_cmp_48_words_%=:\n\t"
  74935. "ldr r7, [%[a], r6]\n\t"
  74936. "ldr r5, [%[b], r6]\n\t"
  74937. #ifdef WOLFSSL_KEIL
  74938. "ands r7, r7, r3\n\t"
  74939. #elif defined(__clang__)
  74940. "ands r7, r3\n\t"
  74941. #else
  74942. "and r7, r3\n\t"
  74943. #endif
  74944. #ifdef WOLFSSL_KEIL
  74945. "ands r5, r5, r3\n\t"
  74946. #elif defined(__clang__)
  74947. "ands r5, r3\n\t"
  74948. #else
  74949. "and r5, r3\n\t"
  74950. #endif
  74951. "movs r4, r7\n\t"
  74952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74953. "subs r7, r7, r5\n\t"
  74954. #else
  74955. "sub r7, r7, r5\n\t"
  74956. #endif
  74957. #ifdef WOLFSSL_KEIL
  74958. "sbcs r7, r7, r7\n\t"
  74959. #elif defined(__clang__)
  74960. "sbcs r7, r7\n\t"
  74961. #else
  74962. "sbc r7, r7\n\t"
  74963. #endif
  74964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74965. "adds r2, r2, r7\n\t"
  74966. #else
  74967. "add r2, r2, r7\n\t"
  74968. #endif
  74969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74970. "mvns r7, r7\n\t"
  74971. #else
  74972. "mvn r7, r7\n\t"
  74973. #endif
  74974. #ifdef WOLFSSL_KEIL
  74975. "ands r3, r3, r7\n\t"
  74976. #elif defined(__clang__)
  74977. "ands r3, r7\n\t"
  74978. #else
  74979. "and r3, r7\n\t"
  74980. #endif
  74981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74982. "subs r5, r5, r4\n\t"
  74983. #else
  74984. "sub r5, r5, r4\n\t"
  74985. #endif
  74986. #ifdef WOLFSSL_KEIL
  74987. "sbcs r7, r7, r7\n\t"
  74988. #elif defined(__clang__)
  74989. "sbcs r7, r7\n\t"
  74990. #else
  74991. "sbc r7, r7\n\t"
  74992. #endif
  74993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74994. "subs r2, r2, r7\n\t"
  74995. #else
  74996. "sub r2, r2, r7\n\t"
  74997. #endif
  74998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74999. "mvns r7, r7\n\t"
  75000. #else
  75001. "mvn r7, r7\n\t"
  75002. #endif
  75003. #ifdef WOLFSSL_KEIL
  75004. "ands r3, r3, r7\n\t"
  75005. #elif defined(__clang__)
  75006. "ands r3, r7\n\t"
  75007. #else
  75008. "and r3, r7\n\t"
  75009. #endif
  75010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75011. "subs r6, r6, #4\n\t"
  75012. #else
  75013. "sub r6, r6, #4\n\t"
  75014. #endif
  75015. "bge L_sp_3072_cmp_48_words_%=\n\t"
  75016. "movs %[a], r2\n\t"
  75017. : [a] "+l" (a), [b] "+l" (b)
  75018. :
  75019. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  75020. );
  75021. return (uint32_t)(size_t)a;
  75022. }
  75023. /* Divide d in a and put remainder into r (m*d + r = a)
  75024. * m is not calculated as it is not needed at this time.
  75025. *
  75026. * a Number to be divided.
  75027. * d Number to divide with.
  75028. * m Multiplier result.
  75029. * r Remainder from the division.
  75030. * returns MP_OKAY indicating success.
  75031. */
  75032. static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d,
  75033. sp_digit* m, sp_digit* r)
  75034. {
  75035. sp_digit t1[96], t2[49];
  75036. sp_digit div, r1;
  75037. int i;
  75038. (void)m;
  75039. div = d[47];
  75040. XMEMCPY(t1, a, sizeof(*t1) * 2 * 48);
  75041. r1 = sp_3072_cmp_48(&t1[48], d) >= 0;
  75042. sp_3072_cond_sub_48(&t1[48], &t1[48], d, (sp_digit)0 - r1);
  75043. for (i = 47; i >= 0; i--) {
  75044. volatile sp_digit mask = (sp_digit)0 - (t1[48 + i] == div);
  75045. sp_digit hi = t1[48 + i] + mask;
  75046. r1 = div_3072_word_48(hi, t1[48 + i - 1], div);
  75047. r1 |= mask;
  75048. sp_3072_mul_d_48(t2, d, r1);
  75049. t1[48 + i] += sp_3072_sub_in_place_48(&t1[i], t2);
  75050. t1[48 + i] -= t2[48];
  75051. sp_3072_mask_48(t2, d, t1[48 + i]);
  75052. t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
  75053. sp_3072_mask_48(t2, d, t1[48 + i]);
  75054. t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
  75055. }
  75056. r1 = sp_3072_cmp_48(t1, d) >= 0;
  75057. sp_3072_cond_sub_48(r, t1, d, (sp_digit)0 - r1);
  75058. return MP_OKAY;
  75059. }
  75060. /* Reduce a modulo m into r. (r = a mod m)
  75061. *
  75062. * r A single precision number that is the reduced result.
  75063. * a A single precision number that is to be reduced.
  75064. * m A single precision number that is the modulus to reduce with.
  75065. * returns MP_OKAY indicating success.
  75066. */
  75067. static WC_INLINE int sp_3072_mod_48(sp_digit* r, const sp_digit* a, const sp_digit* m)
  75068. {
  75069. int ret;
  75070. ret = sp_3072_div_48(a, m, NULL, r);
  75071. return ret;
  75072. }
  75073. #ifdef WOLFSSL_SP_SMALL
  75074. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  75075. *
  75076. * r A single precision number that is the result of the operation.
  75077. * a A single precision number being exponentiated.
  75078. * e A single precision number that is the exponent.
  75079. * bits The number of bits in the exponent.
  75080. * m A single precision number that is the modulus.
  75081. * returns 0 on success.
  75082. * returns MEMORY_E on dynamic memory allocation failure.
  75083. * returns MP_VAL when base is even or exponent is 0.
  75084. */
  75085. static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
  75086. int bits, const sp_digit* m, int reduceA)
  75087. {
  75088. #ifdef WOLFSSL_SP_SMALL_STACK
  75089. sp_digit* td = NULL;
  75090. #else
  75091. sp_digit td[16 * 96];
  75092. #endif
  75093. sp_digit* t[16];
  75094. sp_digit* norm = NULL;
  75095. sp_digit mp = 1;
  75096. sp_digit n;
  75097. sp_digit mask;
  75098. int i;
  75099. int c;
  75100. byte y;
  75101. int err = MP_OKAY;
  75102. if (bits == 0) {
  75103. err = MP_VAL;
  75104. }
  75105. #ifdef WOLFSSL_SP_SMALL_STACK
  75106. if (err == MP_OKAY) {
  75107. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 96), NULL,
  75108. DYNAMIC_TYPE_TMP_BUFFER);
  75109. if (td == NULL)
  75110. err = MEMORY_E;
  75111. }
  75112. #endif
  75113. if (err == MP_OKAY) {
  75114. norm = td;
  75115. for (i=0; i<16; i++) {
  75116. t[i] = td + i * 96;
  75117. }
  75118. sp_3072_mont_setup(m, &mp);
  75119. sp_3072_mont_norm_48(norm, m);
  75120. XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
  75121. if (reduceA != 0) {
  75122. err = sp_3072_mod_48(t[1] + 48, a, m);
  75123. if (err == MP_OKAY) {
  75124. err = sp_3072_mod_48(t[1], t[1], m);
  75125. }
  75126. }
  75127. else {
  75128. XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
  75129. err = sp_3072_mod_48(t[1], t[1], m);
  75130. }
  75131. }
  75132. if (err == MP_OKAY) {
  75133. sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
  75134. sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
  75135. sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
  75136. sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
  75137. sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
  75138. sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
  75139. sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
  75140. sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
  75141. sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
  75142. sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
  75143. sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
  75144. sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
  75145. sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
  75146. sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
  75147. i = (bits - 1) / 32;
  75148. n = e[i--];
  75149. c = bits & 31;
  75150. if (c == 0) {
  75151. c = 32;
  75152. }
  75153. c -= bits % 4;
  75154. if (c == 32) {
  75155. c = 28;
  75156. }
  75157. if (c < 0) {
  75158. /* Number of bits in top word is less than number needed. */
  75159. c = -c;
  75160. y = (byte)(n << c);
  75161. n = e[i--];
  75162. y |= (byte)(n >> (64 - c));
  75163. n <<= c;
  75164. c = 64 - c;
  75165. }
  75166. else if (c == 0) {
  75167. /* All bits in top word used. */
  75168. y = (byte)n;
  75169. }
  75170. else {
  75171. y = (byte)(n >> c);
  75172. n <<= 32 - c;
  75173. }
  75174. XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
  75175. for (; i>=0 || c>=4; ) {
  75176. if (c == 0) {
  75177. n = e[i--];
  75178. y = (byte)(n >> 28);
  75179. n <<= 4;
  75180. c = 28;
  75181. }
  75182. else if (c < 4) {
  75183. y = (byte)(n >> 28);
  75184. n = e[i--];
  75185. c = 4 - c;
  75186. y |= (byte)(n >> (32 - c));
  75187. n <<= c;
  75188. c = 32 - c;
  75189. }
  75190. else {
  75191. y = (byte)((n >> 28) & 0xf);
  75192. n <<= 4;
  75193. c -= 4;
  75194. }
  75195. sp_3072_mont_sqr_48(r, r, m, mp);
  75196. sp_3072_mont_sqr_48(r, r, m, mp);
  75197. sp_3072_mont_sqr_48(r, r, m, mp);
  75198. sp_3072_mont_sqr_48(r, r, m, mp);
  75199. sp_3072_mont_mul_48(r, r, t[y], m, mp);
  75200. }
  75201. XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
  75202. sp_3072_mont_reduce_48(r, m, mp);
  75203. mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
  75204. sp_3072_cond_sub_48(r, r, m, mask);
  75205. }
  75206. #ifdef WOLFSSL_SP_SMALL_STACK
  75207. if (td != NULL)
  75208. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  75209. #endif
  75210. return err;
  75211. }
  75212. #else
  75213. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  75214. *
  75215. * r A single precision number that is the result of the operation.
  75216. * a A single precision number being exponentiated.
  75217. * e A single precision number that is the exponent.
  75218. * bits The number of bits in the exponent.
  75219. * m A single precision number that is the modulus.
  75220. * returns 0 on success.
  75221. * returns MEMORY_E on dynamic memory allocation failure.
  75222. * returns MP_VAL when base is even or exponent is 0.
  75223. */
  75224. static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
  75225. int bits, const sp_digit* m, int reduceA)
  75226. {
  75227. #ifdef WOLFSSL_SP_SMALL_STACK
  75228. sp_digit* td = NULL;
  75229. #else
  75230. sp_digit td[32 * 96];
  75231. #endif
  75232. sp_digit* t[32];
  75233. sp_digit* norm = NULL;
  75234. sp_digit mp = 1;
  75235. sp_digit n;
  75236. sp_digit mask;
  75237. int i;
  75238. int c;
  75239. byte y;
  75240. int err = MP_OKAY;
  75241. if (bits == 0) {
  75242. err = MP_VAL;
  75243. }
  75244. #ifdef WOLFSSL_SP_SMALL_STACK
  75245. if (err == MP_OKAY) {
  75246. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 96), NULL,
  75247. DYNAMIC_TYPE_TMP_BUFFER);
  75248. if (td == NULL)
  75249. err = MEMORY_E;
  75250. }
  75251. #endif
  75252. if (err == MP_OKAY) {
  75253. norm = td;
  75254. for (i=0; i<32; i++) {
  75255. t[i] = td + i * 96;
  75256. }
  75257. sp_3072_mont_setup(m, &mp);
  75258. sp_3072_mont_norm_48(norm, m);
  75259. XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
  75260. if (reduceA != 0) {
  75261. err = sp_3072_mod_48(t[1] + 48, a, m);
  75262. if (err == MP_OKAY) {
  75263. err = sp_3072_mod_48(t[1], t[1], m);
  75264. }
  75265. }
  75266. else {
  75267. XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
  75268. err = sp_3072_mod_48(t[1], t[1], m);
  75269. }
  75270. }
  75271. if (err == MP_OKAY) {
  75272. sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
  75273. sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
  75274. sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
  75275. sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
  75276. sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
  75277. sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
  75278. sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
  75279. sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
  75280. sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
  75281. sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
  75282. sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
  75283. sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
  75284. sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
  75285. sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
  75286. sp_3072_mont_sqr_48(t[16], t[ 8], m, mp);
  75287. sp_3072_mont_mul_48(t[17], t[ 9], t[ 8], m, mp);
  75288. sp_3072_mont_sqr_48(t[18], t[ 9], m, mp);
  75289. sp_3072_mont_mul_48(t[19], t[10], t[ 9], m, mp);
  75290. sp_3072_mont_sqr_48(t[20], t[10], m, mp);
  75291. sp_3072_mont_mul_48(t[21], t[11], t[10], m, mp);
  75292. sp_3072_mont_sqr_48(t[22], t[11], m, mp);
  75293. sp_3072_mont_mul_48(t[23], t[12], t[11], m, mp);
  75294. sp_3072_mont_sqr_48(t[24], t[12], m, mp);
  75295. sp_3072_mont_mul_48(t[25], t[13], t[12], m, mp);
  75296. sp_3072_mont_sqr_48(t[26], t[13], m, mp);
  75297. sp_3072_mont_mul_48(t[27], t[14], t[13], m, mp);
  75298. sp_3072_mont_sqr_48(t[28], t[14], m, mp);
  75299. sp_3072_mont_mul_48(t[29], t[15], t[14], m, mp);
  75300. sp_3072_mont_sqr_48(t[30], t[15], m, mp);
  75301. sp_3072_mont_mul_48(t[31], t[16], t[15], m, mp);
  75302. i = (bits - 1) / 32;
  75303. n = e[i--];
  75304. c = bits & 31;
  75305. if (c == 0) {
  75306. c = 32;
  75307. }
  75308. c -= bits % 5;
  75309. if (c == 32) {
  75310. c = 27;
  75311. }
  75312. if (c < 0) {
  75313. /* Number of bits in top word is less than number needed. */
  75314. c = -c;
  75315. y = (byte)(n << c);
  75316. n = e[i--];
  75317. y |= (byte)(n >> (64 - c));
  75318. n <<= c;
  75319. c = 64 - c;
  75320. }
  75321. else if (c == 0) {
  75322. /* All bits in top word used. */
  75323. y = (byte)n;
  75324. }
  75325. else {
  75326. y = (byte)(n >> c);
  75327. n <<= 32 - c;
  75328. }
  75329. XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
  75330. for (; i>=0 || c>=5; ) {
  75331. if (c == 0) {
  75332. n = e[i--];
  75333. y = (byte)(n >> 27);
  75334. n <<= 5;
  75335. c = 27;
  75336. }
  75337. else if (c < 5) {
  75338. y = (byte)(n >> 27);
  75339. n = e[i--];
  75340. c = 5 - c;
  75341. y |= (byte)(n >> (32 - c));
  75342. n <<= c;
  75343. c = 32 - c;
  75344. }
  75345. else {
  75346. y = (byte)((n >> 27) & 0x1f);
  75347. n <<= 5;
  75348. c -= 5;
  75349. }
  75350. sp_3072_mont_sqr_48(r, r, m, mp);
  75351. sp_3072_mont_sqr_48(r, r, m, mp);
  75352. sp_3072_mont_sqr_48(r, r, m, mp);
  75353. sp_3072_mont_sqr_48(r, r, m, mp);
  75354. sp_3072_mont_sqr_48(r, r, m, mp);
  75355. sp_3072_mont_mul_48(r, r, t[y], m, mp);
  75356. }
  75357. XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
  75358. sp_3072_mont_reduce_48(r, m, mp);
  75359. mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
  75360. sp_3072_cond_sub_48(r, r, m, mask);
  75361. }
  75362. #ifdef WOLFSSL_SP_SMALL_STACK
  75363. if (td != NULL)
  75364. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  75365. #endif
  75366. return err;
  75367. }
  75368. #endif /* WOLFSSL_SP_SMALL */
  75369. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  75370. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  75371. /* r = 2^n mod m where n is the number of bits to reduce by.
  75372. * Given m must be 3072 bits, just need to subtract.
  75373. *
  75374. * r A single precision number.
  75375. * m A single precision number.
  75376. */
  75377. static void sp_3072_mont_norm_96(sp_digit* r, const sp_digit* m)
  75378. {
  75379. XMEMSET(r, 0, sizeof(sp_digit) * 96);
  75380. /* r = 2^n mod m */
  75381. sp_3072_sub_in_place_96(r, m);
  75382. }
  75383. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  75384. /* Conditionally subtract b from a using the mask m.
  75385. * m is -1 to subtract and 0 when not copying.
  75386. *
  75387. * r A single precision number representing condition subtract result.
  75388. * a A single precision number to subtract from.
  75389. * b A single precision number to subtract.
  75390. * m Mask value to apply.
  75391. */
  75392. SP_NOINLINE static sp_digit sp_3072_cond_sub_96(sp_digit* r, const sp_digit* a,
  75393. const sp_digit* b, sp_digit m)
  75394. {
  75395. __asm__ __volatile__ (
  75396. "movs r4, #0\n\t"
  75397. "movs r5, #0xff\n\t"
  75398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75399. "adds r5, r5, #0x81\n\t"
  75400. #else
  75401. "add r5, r5, #0x81\n\t"
  75402. #endif
  75403. "mov r8, r5\n\t"
  75404. "movs r7, #0\n\t"
  75405. "\n"
  75406. "L_sp_3072_cond_sub_96_words_%=:\n\t"
  75407. "ldr r6, [%[b], r7]\n\t"
  75408. #ifdef WOLFSSL_KEIL
  75409. "ands r6, r6, %[m]\n\t"
  75410. #elif defined(__clang__)
  75411. "ands r6, %[m]\n\t"
  75412. #else
  75413. "and r6, %[m]\n\t"
  75414. #endif
  75415. "movs r5, #0\n\t"
  75416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75417. "subs r5, r5, r4\n\t"
  75418. #else
  75419. "sub r5, r5, r4\n\t"
  75420. #endif
  75421. "ldr r5, [%[a], r7]\n\t"
  75422. #ifdef WOLFSSL_KEIL
  75423. "sbcs r5, r5, r6\n\t"
  75424. #elif defined(__clang__)
  75425. "sbcs r5, r6\n\t"
  75426. #else
  75427. "sbc r5, r6\n\t"
  75428. #endif
  75429. #ifdef WOLFSSL_KEIL
  75430. "sbcs r4, r4, r4\n\t"
  75431. #elif defined(__clang__)
  75432. "sbcs r4, r4\n\t"
  75433. #else
  75434. "sbc r4, r4\n\t"
  75435. #endif
  75436. "str r5, [%[r], r7]\n\t"
  75437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75438. "adds r7, r7, #4\n\t"
  75439. #else
  75440. "add r7, r7, #4\n\t"
  75441. #endif
  75442. "cmp r7, r8\n\t"
  75443. "blt L_sp_3072_cond_sub_96_words_%=\n\t"
  75444. "movs %[r], r4\n\t"
  75445. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  75446. :
  75447. : "memory", "r4", "r5", "r6", "r7", "r8"
  75448. );
  75449. return (uint32_t)(size_t)r;
  75450. }
  75451. #define sp_3072_mont_reduce_order_96 sp_3072_mont_reduce_96
  75452. /* Reduce the number back to 3072 bits using Montgomery reduction.
  75453. *
  75454. * a A single precision number to reduce in place.
  75455. * m The single precision number representing the modulus.
  75456. * mp The digit representing the negative inverse of m mod 2^n.
  75457. */
  75458. SP_NOINLINE static void sp_3072_mont_reduce_96(sp_digit* a, const sp_digit* m,
  75459. sp_digit mp)
  75460. {
  75461. __asm__ __volatile__ (
  75462. "movs r7, #0\n\t"
  75463. "mov r8, %[mp]\n\t"
  75464. "mov r12, r7\n\t"
  75465. "mov lr, %[m]\n\t"
  75466. "mov r9, %[a]\n\t"
  75467. "mov r11, %[a]\n\t"
  75468. "movs r5, #0xff\n\t"
  75469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75470. "adds r5, r5, #0x7d\n\t"
  75471. #else
  75472. "add r5, r5, #0x7d\n\t"
  75473. #endif
  75474. "movs r6, #0xff\n\t"
  75475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75476. "adds r6, r6, #0x81\n\t"
  75477. #else
  75478. "add r6, r6, #0x81\n\t"
  75479. #endif
  75480. "add r9, r9, r5\n\t"
  75481. "add r11, r11, r6\n\t"
  75482. "\n"
  75483. "L_sp_3072_mont_reduce_96_mod_%=:\n\t"
  75484. "movs r7, #0\n\t"
  75485. "movs r4, #0\n\t"
  75486. "# a[i] += m[0] * mu\n\t"
  75487. "ldm %[m]!, {%[mp]}\n\t"
  75488. "ldm %[a]!, {r3}\n\t"
  75489. "# mu = a[i] * mp\n\t"
  75490. "mov r5, r8\n\t"
  75491. #ifdef WOLFSSL_KEIL
  75492. "muls r5, r3, r5\n\t"
  75493. #elif defined(__clang__)
  75494. "muls r5, r3\n\t"
  75495. #else
  75496. "mul r5, r3\n\t"
  75497. #endif
  75498. "mov r10, r5\n\t"
  75499. "# Multiply m[0] and mu - Start\n\t"
  75500. "mov r5, r10\n\t"
  75501. "uxth r6, %[mp]\n\t"
  75502. "uxth r5, r5\n\t"
  75503. #ifdef WOLFSSL_KEIL
  75504. "muls r6, r5, r6\n\t"
  75505. #elif defined(__clang__)
  75506. "muls r6, r5\n\t"
  75507. #else
  75508. "mul r6, r5\n\t"
  75509. #endif
  75510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75511. "adds r3, r3, r6\n\t"
  75512. #else
  75513. "add r3, r3, r6\n\t"
  75514. #endif
  75515. #ifdef WOLFSSL_KEIL
  75516. "adcs r4, r4, r7\n\t"
  75517. #elif defined(__clang__)
  75518. "adcs r4, r7\n\t"
  75519. #else
  75520. "adc r4, r7\n\t"
  75521. #endif
  75522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75523. "lsrs r6, %[mp], #16\n\t"
  75524. #else
  75525. "lsr r6, %[mp], #16\n\t"
  75526. #endif
  75527. #ifdef WOLFSSL_KEIL
  75528. "muls r5, r6, r5\n\t"
  75529. #elif defined(__clang__)
  75530. "muls r5, r6\n\t"
  75531. #else
  75532. "mul r5, r6\n\t"
  75533. #endif
  75534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75535. "lsrs r6, r5, #16\n\t"
  75536. #else
  75537. "lsr r6, r5, #16\n\t"
  75538. #endif
  75539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75540. "lsls r5, r5, #16\n\t"
  75541. #else
  75542. "lsl r5, r5, #16\n\t"
  75543. #endif
  75544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75545. "adds r3, r3, r5\n\t"
  75546. #else
  75547. "add r3, r3, r5\n\t"
  75548. #endif
  75549. #ifdef WOLFSSL_KEIL
  75550. "adcs r4, r4, r6\n\t"
  75551. #elif defined(__clang__)
  75552. "adcs r4, r6\n\t"
  75553. #else
  75554. "adc r4, r6\n\t"
  75555. #endif
  75556. "mov r5, r10\n\t"
  75557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75558. "lsrs r6, %[mp], #16\n\t"
  75559. #else
  75560. "lsr r6, %[mp], #16\n\t"
  75561. #endif
  75562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75563. "lsrs r5, r5, #16\n\t"
  75564. #else
  75565. "lsr r5, r5, #16\n\t"
  75566. #endif
  75567. #ifdef WOLFSSL_KEIL
  75568. "muls r6, r5, r6\n\t"
  75569. #elif defined(__clang__)
  75570. "muls r6, r5\n\t"
  75571. #else
  75572. "mul r6, r5\n\t"
  75573. #endif
  75574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75575. "adds r4, r4, r6\n\t"
  75576. #else
  75577. "add r4, r4, r6\n\t"
  75578. #endif
  75579. "uxth r6, %[mp]\n\t"
  75580. #ifdef WOLFSSL_KEIL
  75581. "muls r5, r6, r5\n\t"
  75582. #elif defined(__clang__)
  75583. "muls r5, r6\n\t"
  75584. #else
  75585. "mul r5, r6\n\t"
  75586. #endif
  75587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75588. "lsrs r6, r5, #16\n\t"
  75589. #else
  75590. "lsr r6, r5, #16\n\t"
  75591. #endif
  75592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75593. "lsls r5, r5, #16\n\t"
  75594. #else
  75595. "lsl r5, r5, #16\n\t"
  75596. #endif
  75597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75598. "adds r3, r3, r5\n\t"
  75599. #else
  75600. "add r3, r3, r5\n\t"
  75601. #endif
  75602. #ifdef WOLFSSL_KEIL
  75603. "adcs r4, r4, r6\n\t"
  75604. #elif defined(__clang__)
  75605. "adcs r4, r6\n\t"
  75606. #else
  75607. "adc r4, r6\n\t"
  75608. #endif
  75609. "# Multiply m[0] and mu - Done\n\t"
  75610. "\n"
  75611. "L_sp_3072_mont_reduce_96_word_%=:\n\t"
  75612. "# a[i+j] += m[j] * mu\n\t"
  75613. "ldr r3, [%[a]]\n\t"
  75614. "ldm %[m]!, {%[mp]}\n\t"
  75615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75616. "adds r3, r3, r4\n\t"
  75617. #else
  75618. "add r3, r3, r4\n\t"
  75619. #endif
  75620. "movs r4, #0\n\t"
  75621. #ifdef WOLFSSL_KEIL
  75622. "adcs r4, r4, r7\n\t"
  75623. #elif defined(__clang__)
  75624. "adcs r4, r7\n\t"
  75625. #else
  75626. "adc r4, r7\n\t"
  75627. #endif
  75628. "# Multiply m[j] and mu - Start\n\t"
  75629. "mov r5, r10\n\t"
  75630. "uxth r6, %[mp]\n\t"
  75631. "uxth r5, r5\n\t"
  75632. #ifdef WOLFSSL_KEIL
  75633. "muls r6, r5, r6\n\t"
  75634. #elif defined(__clang__)
  75635. "muls r6, r5\n\t"
  75636. #else
  75637. "mul r6, r5\n\t"
  75638. #endif
  75639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75640. "adds r3, r3, r6\n\t"
  75641. #else
  75642. "add r3, r3, r6\n\t"
  75643. #endif
  75644. #ifdef WOLFSSL_KEIL
  75645. "adcs r4, r4, r7\n\t"
  75646. #elif defined(__clang__)
  75647. "adcs r4, r7\n\t"
  75648. #else
  75649. "adc r4, r7\n\t"
  75650. #endif
  75651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75652. "lsrs r6, %[mp], #16\n\t"
  75653. #else
  75654. "lsr r6, %[mp], #16\n\t"
  75655. #endif
  75656. #ifdef WOLFSSL_KEIL
  75657. "muls r5, r6, r5\n\t"
  75658. #elif defined(__clang__)
  75659. "muls r5, r6\n\t"
  75660. #else
  75661. "mul r5, r6\n\t"
  75662. #endif
  75663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75664. "lsrs r6, r5, #16\n\t"
  75665. #else
  75666. "lsr r6, r5, #16\n\t"
  75667. #endif
  75668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75669. "lsls r5, r5, #16\n\t"
  75670. #else
  75671. "lsl r5, r5, #16\n\t"
  75672. #endif
  75673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75674. "adds r3, r3, r5\n\t"
  75675. #else
  75676. "add r3, r3, r5\n\t"
  75677. #endif
  75678. #ifdef WOLFSSL_KEIL
  75679. "adcs r4, r4, r6\n\t"
  75680. #elif defined(__clang__)
  75681. "adcs r4, r6\n\t"
  75682. #else
  75683. "adc r4, r6\n\t"
  75684. #endif
  75685. "mov r5, r10\n\t"
  75686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75687. "lsrs r6, %[mp], #16\n\t"
  75688. #else
  75689. "lsr r6, %[mp], #16\n\t"
  75690. #endif
  75691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75692. "lsrs r5, r5, #16\n\t"
  75693. #else
  75694. "lsr r5, r5, #16\n\t"
  75695. #endif
  75696. #ifdef WOLFSSL_KEIL
  75697. "muls r6, r5, r6\n\t"
  75698. #elif defined(__clang__)
  75699. "muls r6, r5\n\t"
  75700. #else
  75701. "mul r6, r5\n\t"
  75702. #endif
  75703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75704. "adds r4, r4, r6\n\t"
  75705. #else
  75706. "add r4, r4, r6\n\t"
  75707. #endif
  75708. "uxth r6, %[mp]\n\t"
  75709. #ifdef WOLFSSL_KEIL
  75710. "muls r5, r6, r5\n\t"
  75711. #elif defined(__clang__)
  75712. "muls r5, r6\n\t"
  75713. #else
  75714. "mul r5, r6\n\t"
  75715. #endif
  75716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75717. "lsrs r6, r5, #16\n\t"
  75718. #else
  75719. "lsr r6, r5, #16\n\t"
  75720. #endif
  75721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75722. "lsls r5, r5, #16\n\t"
  75723. #else
  75724. "lsl r5, r5, #16\n\t"
  75725. #endif
  75726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75727. "adds r3, r3, r5\n\t"
  75728. #else
  75729. "add r3, r3, r5\n\t"
  75730. #endif
  75731. #ifdef WOLFSSL_KEIL
  75732. "adcs r4, r4, r6\n\t"
  75733. #elif defined(__clang__)
  75734. "adcs r4, r6\n\t"
  75735. #else
  75736. "adc r4, r6\n\t"
  75737. #endif
  75738. "# Multiply m[j] and mu - Done\n\t"
  75739. "stm %[a]!, {r3}\n\t"
  75740. "cmp %[a], r9\n\t"
  75741. "blt L_sp_3072_mont_reduce_96_word_%=\n\t"
  75742. "# a[i+95] += m[95] * mu\n\t"
  75743. "ldr %[mp], [%[m]]\n\t"
  75744. "mov r3, r12\n\t"
  75745. "# Multiply m[95] and mu - Start\n\t"
  75746. "mov r5, r10\n\t"
  75747. "uxth r6, %[mp]\n\t"
  75748. "uxth r5, r5\n\t"
  75749. #ifdef WOLFSSL_KEIL
  75750. "muls r6, r5, r6\n\t"
  75751. #elif defined(__clang__)
  75752. "muls r6, r5\n\t"
  75753. #else
  75754. "mul r6, r5\n\t"
  75755. #endif
  75756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75757. "adds r4, r4, r6\n\t"
  75758. #else
  75759. "add r4, r4, r6\n\t"
  75760. #endif
  75761. #ifdef WOLFSSL_KEIL
  75762. "adcs r3, r3, r7\n\t"
  75763. #elif defined(__clang__)
  75764. "adcs r3, r7\n\t"
  75765. #else
  75766. "adc r3, r7\n\t"
  75767. #endif
  75768. #ifdef WOLFSSL_KEIL
  75769. "adcs r7, r7, r7\n\t"
  75770. #elif defined(__clang__)
  75771. "adcs r7, r7\n\t"
  75772. #else
  75773. "adc r7, r7\n\t"
  75774. #endif
  75775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75776. "lsrs r6, %[mp], #16\n\t"
  75777. #else
  75778. "lsr r6, %[mp], #16\n\t"
  75779. #endif
  75780. #ifdef WOLFSSL_KEIL
  75781. "muls r5, r6, r5\n\t"
  75782. #elif defined(__clang__)
  75783. "muls r5, r6\n\t"
  75784. #else
  75785. "mul r5, r6\n\t"
  75786. #endif
  75787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75788. "lsrs r6, r5, #16\n\t"
  75789. #else
  75790. "lsr r6, r5, #16\n\t"
  75791. #endif
  75792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75793. "lsls r5, r5, #16\n\t"
  75794. #else
  75795. "lsl r5, r5, #16\n\t"
  75796. #endif
  75797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75798. "adds r4, r4, r5\n\t"
  75799. #else
  75800. "add r4, r4, r5\n\t"
  75801. #endif
  75802. #ifdef WOLFSSL_KEIL
  75803. "adcs r3, r3, r6\n\t"
  75804. #elif defined(__clang__)
  75805. "adcs r3, r6\n\t"
  75806. #else
  75807. "adc r3, r6\n\t"
  75808. #endif
  75809. #ifdef WOLFSSL_KEIL
  75810. "adcs r7, r7, r7\n\t"
  75811. #elif defined(__clang__)
  75812. "adcs r7, r7\n\t"
  75813. #else
  75814. "adc r7, r7\n\t"
  75815. #endif
  75816. "mov r5, r10\n\t"
  75817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75818. "lsrs r6, %[mp], #16\n\t"
  75819. #else
  75820. "lsr r6, %[mp], #16\n\t"
  75821. #endif
  75822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75823. "lsrs r5, r5, #16\n\t"
  75824. #else
  75825. "lsr r5, r5, #16\n\t"
  75826. #endif
  75827. #ifdef WOLFSSL_KEIL
  75828. "muls r6, r5, r6\n\t"
  75829. #elif defined(__clang__)
  75830. "muls r6, r5\n\t"
  75831. #else
  75832. "mul r6, r5\n\t"
  75833. #endif
  75834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75835. "adds r3, r3, r6\n\t"
  75836. #else
  75837. "add r3, r3, r6\n\t"
  75838. #endif
  75839. #ifdef WOLFSSL_KEIL
  75840. "adcs r7, r7, r7\n\t"
  75841. #elif defined(__clang__)
  75842. "adcs r7, r7\n\t"
  75843. #else
  75844. "adc r7, r7\n\t"
  75845. #endif
  75846. "uxth r6, %[mp]\n\t"
  75847. #ifdef WOLFSSL_KEIL
  75848. "muls r5, r6, r5\n\t"
  75849. #elif defined(__clang__)
  75850. "muls r5, r6\n\t"
  75851. #else
  75852. "mul r5, r6\n\t"
  75853. #endif
  75854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75855. "lsrs r6, r5, #16\n\t"
  75856. #else
  75857. "lsr r6, r5, #16\n\t"
  75858. #endif
  75859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75860. "lsls r5, r5, #16\n\t"
  75861. #else
  75862. "lsl r5, r5, #16\n\t"
  75863. #endif
  75864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75865. "adds r4, r4, r5\n\t"
  75866. #else
  75867. "add r4, r4, r5\n\t"
  75868. #endif
  75869. #ifdef WOLFSSL_KEIL
  75870. "adcs r3, r3, r6\n\t"
  75871. #elif defined(__clang__)
  75872. "adcs r3, r6\n\t"
  75873. #else
  75874. "adc r3, r6\n\t"
  75875. #endif
  75876. #ifdef WOLFSSL_KEIL
  75877. "adcs r7, r7, r7\n\t"
  75878. #elif defined(__clang__)
  75879. "adcs r7, r7\n\t"
  75880. #else
  75881. "adc r7, r7\n\t"
  75882. #endif
  75883. "# Multiply m[95] and mu - Done\n\t"
  75884. "ldr r5, [%[a]]\n\t"
  75885. "ldr r6, [%[a], #4]\n\t"
  75886. "movs %[mp], #0\n\t"
  75887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75888. "adds r5, r5, r4\n\t"
  75889. #else
  75890. "add r5, r5, r4\n\t"
  75891. #endif
  75892. #ifdef WOLFSSL_KEIL
  75893. "adcs r6, r6, r3\n\t"
  75894. #elif defined(__clang__)
  75895. "adcs r6, r3\n\t"
  75896. #else
  75897. "adc r6, r3\n\t"
  75898. #endif
  75899. #ifdef WOLFSSL_KEIL
  75900. "adcs r7, r7, %[mp]\n\t"
  75901. #elif defined(__clang__)
  75902. "adcs r7, %[mp]\n\t"
  75903. #else
  75904. "adc r7, %[mp]\n\t"
  75905. #endif
  75906. "stm %[a]!, {r5, r6}\n\t"
  75907. "# i += 1\n\t"
  75908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75909. "subs %[a], %[a], #4\n\t"
  75910. #else
  75911. "sub %[a], %[a], #4\n\t"
  75912. #endif
  75913. "movs r3, #0xff\n\t"
  75914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75915. "adds r3, r3, #0x7d\n\t"
  75916. #else
  75917. "add r3, r3, #0x7d\n\t"
  75918. #endif
  75919. "mov r9, %[a]\n\t"
  75920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75921. "subs %[a], %[a], r3\n\t"
  75922. #else
  75923. "sub %[a], %[a], r3\n\t"
  75924. #endif
  75925. "mov r12, r7\n\t"
  75926. "mov %[m], lr\n\t"
  75927. "cmp r11, %[a]\n\t"
  75928. "bgt L_sp_3072_mont_reduce_96_mod_%=\n\t"
  75929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75930. "negs r7, r7\n\t"
  75931. #else
  75932. "neg r7, r7\n\t"
  75933. #endif
  75934. "# Subtract masked modulus\n\t"
  75935. "movs r4, #0xff\n\t"
  75936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75937. "adds r4, r4, #0x81\n\t"
  75938. #else
  75939. "add r4, r4, #0x81\n\t"
  75940. #endif
  75941. "movs %[mp], #0\n\t"
  75942. "movs r3, #0\n\t"
  75943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75944. "subs %[a], %[a], r4\n\t"
  75945. #else
  75946. "sub %[a], %[a], r4\n\t"
  75947. #endif
  75948. #ifndef WOLFSSL_SP_LARGE_CODE
  75949. "\n"
  75950. "L_sp_3072_mont_reduce_96_sub_mask_%=:\n\t"
  75951. "ldm %[m]!, {r6}\n\t"
  75952. "movs r5, #0\n\t"
  75953. #ifdef WOLFSSL_KEIL
  75954. "ands r6, r6, r7\n\t"
  75955. #elif defined(__clang__)
  75956. "ands r6, r7\n\t"
  75957. #else
  75958. "and r6, r7\n\t"
  75959. #endif
  75960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75961. "subs r5, r5, %[mp]\n\t"
  75962. #else
  75963. "sub r5, r5, %[mp]\n\t"
  75964. #endif
  75965. "ldr r5, [%[a], r4]\n\t"
  75966. #ifdef WOLFSSL_KEIL
  75967. "sbcs r5, r5, r6\n\t"
  75968. #elif defined(__clang__)
  75969. "sbcs r5, r6\n\t"
  75970. #else
  75971. "sbc r5, r6\n\t"
  75972. #endif
  75973. #ifdef WOLFSSL_KEIL
  75974. "sbcs %[mp], %[mp], %[mp]\n\t"
  75975. #elif defined(__clang__)
  75976. "sbcs %[mp], %[mp]\n\t"
  75977. #else
  75978. "sbc %[mp], %[mp]\n\t"
  75979. #endif
  75980. "stm %[a]!, {r5}\n\t"
  75981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75982. "adds r3, r3, #4\n\t"
  75983. #else
  75984. "add r3, r3, #4\n\t"
  75985. #endif
  75986. "cmp r3, r4\n\t"
  75987. "blt L_sp_3072_mont_reduce_96_sub_mask_%=\n\t"
  75988. #else /* WOLFSSL_SP_LARGE_CODE */
  75989. "ldm %[m]!, {r6}\n\t"
  75990. #ifdef WOLFSSL_KEIL
  75991. "ands r6, r6, r7\n\t"
  75992. #elif defined(__clang__)
  75993. "ands r6, r7\n\t"
  75994. #else
  75995. "and r6, r7\n\t"
  75996. #endif
  75997. "ldr r5, [%[a], r4]\n\t"
  75998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75999. "subs r5, r5, r6\n\t"
  76000. #else
  76001. "sub r5, r5, r6\n\t"
  76002. #endif
  76003. "stm %[a]!, {r5}\n\t"
  76004. "ldm %[m]!, {r6}\n\t"
  76005. #ifdef WOLFSSL_KEIL
  76006. "ands r6, r6, r7\n\t"
  76007. #elif defined(__clang__)
  76008. "ands r6, r7\n\t"
  76009. #else
  76010. "and r6, r7\n\t"
  76011. #endif
  76012. "ldr r5, [%[a], r4]\n\t"
  76013. #ifdef WOLFSSL_KEIL
  76014. "sbcs r5, r5, r6\n\t"
  76015. #elif defined(__clang__)
  76016. "sbcs r5, r6\n\t"
  76017. #else
  76018. "sbc r5, r6\n\t"
  76019. #endif
  76020. "stm %[a]!, {r5}\n\t"
  76021. "ldm %[m]!, {r6}\n\t"
  76022. #ifdef WOLFSSL_KEIL
  76023. "ands r6, r6, r7\n\t"
  76024. #elif defined(__clang__)
  76025. "ands r6, r7\n\t"
  76026. #else
  76027. "and r6, r7\n\t"
  76028. #endif
  76029. "ldr r5, [%[a], r4]\n\t"
  76030. #ifdef WOLFSSL_KEIL
  76031. "sbcs r5, r5, r6\n\t"
  76032. #elif defined(__clang__)
  76033. "sbcs r5, r6\n\t"
  76034. #else
  76035. "sbc r5, r6\n\t"
  76036. #endif
  76037. "stm %[a]!, {r5}\n\t"
  76038. "ldm %[m]!, {r6}\n\t"
  76039. #ifdef WOLFSSL_KEIL
  76040. "ands r6, r6, r7\n\t"
  76041. #elif defined(__clang__)
  76042. "ands r6, r7\n\t"
  76043. #else
  76044. "and r6, r7\n\t"
  76045. #endif
  76046. "ldr r5, [%[a], r4]\n\t"
  76047. #ifdef WOLFSSL_KEIL
  76048. "sbcs r5, r5, r6\n\t"
  76049. #elif defined(__clang__)
  76050. "sbcs r5, r6\n\t"
  76051. #else
  76052. "sbc r5, r6\n\t"
  76053. #endif
  76054. "stm %[a]!, {r5}\n\t"
  76055. "ldm %[m]!, {r6}\n\t"
  76056. #ifdef WOLFSSL_KEIL
  76057. "ands r6, r6, r7\n\t"
  76058. #elif defined(__clang__)
  76059. "ands r6, r7\n\t"
  76060. #else
  76061. "and r6, r7\n\t"
  76062. #endif
  76063. "ldr r5, [%[a], r4]\n\t"
  76064. #ifdef WOLFSSL_KEIL
  76065. "sbcs r5, r5, r6\n\t"
  76066. #elif defined(__clang__)
  76067. "sbcs r5, r6\n\t"
  76068. #else
  76069. "sbc r5, r6\n\t"
  76070. #endif
  76071. "stm %[a]!, {r5}\n\t"
  76072. "ldm %[m]!, {r6}\n\t"
  76073. #ifdef WOLFSSL_KEIL
  76074. "ands r6, r6, r7\n\t"
  76075. #elif defined(__clang__)
  76076. "ands r6, r7\n\t"
  76077. #else
  76078. "and r6, r7\n\t"
  76079. #endif
  76080. "ldr r5, [%[a], r4]\n\t"
  76081. #ifdef WOLFSSL_KEIL
  76082. "sbcs r5, r5, r6\n\t"
  76083. #elif defined(__clang__)
  76084. "sbcs r5, r6\n\t"
  76085. #else
  76086. "sbc r5, r6\n\t"
  76087. #endif
  76088. "stm %[a]!, {r5}\n\t"
  76089. "ldm %[m]!, {r6}\n\t"
  76090. #ifdef WOLFSSL_KEIL
  76091. "ands r6, r6, r7\n\t"
  76092. #elif defined(__clang__)
  76093. "ands r6, r7\n\t"
  76094. #else
  76095. "and r6, r7\n\t"
  76096. #endif
  76097. "ldr r5, [%[a], r4]\n\t"
  76098. #ifdef WOLFSSL_KEIL
  76099. "sbcs r5, r5, r6\n\t"
  76100. #elif defined(__clang__)
  76101. "sbcs r5, r6\n\t"
  76102. #else
  76103. "sbc r5, r6\n\t"
  76104. #endif
  76105. "stm %[a]!, {r5}\n\t"
  76106. "ldm %[m]!, {r6}\n\t"
  76107. #ifdef WOLFSSL_KEIL
  76108. "ands r6, r6, r7\n\t"
  76109. #elif defined(__clang__)
  76110. "ands r6, r7\n\t"
  76111. #else
  76112. "and r6, r7\n\t"
  76113. #endif
  76114. "ldr r5, [%[a], r4]\n\t"
  76115. #ifdef WOLFSSL_KEIL
  76116. "sbcs r5, r5, r6\n\t"
  76117. #elif defined(__clang__)
  76118. "sbcs r5, r6\n\t"
  76119. #else
  76120. "sbc r5, r6\n\t"
  76121. #endif
  76122. "stm %[a]!, {r5}\n\t"
  76123. "ldm %[m]!, {r6}\n\t"
  76124. #ifdef WOLFSSL_KEIL
  76125. "ands r6, r6, r7\n\t"
  76126. #elif defined(__clang__)
  76127. "ands r6, r7\n\t"
  76128. #else
  76129. "and r6, r7\n\t"
  76130. #endif
  76131. "ldr r5, [%[a], r4]\n\t"
  76132. #ifdef WOLFSSL_KEIL
  76133. "sbcs r5, r5, r6\n\t"
  76134. #elif defined(__clang__)
  76135. "sbcs r5, r6\n\t"
  76136. #else
  76137. "sbc r5, r6\n\t"
  76138. #endif
  76139. "stm %[a]!, {r5}\n\t"
  76140. "ldm %[m]!, {r6}\n\t"
  76141. #ifdef WOLFSSL_KEIL
  76142. "ands r6, r6, r7\n\t"
  76143. #elif defined(__clang__)
  76144. "ands r6, r7\n\t"
  76145. #else
  76146. "and r6, r7\n\t"
  76147. #endif
  76148. "ldr r5, [%[a], r4]\n\t"
  76149. #ifdef WOLFSSL_KEIL
  76150. "sbcs r5, r5, r6\n\t"
  76151. #elif defined(__clang__)
  76152. "sbcs r5, r6\n\t"
  76153. #else
  76154. "sbc r5, r6\n\t"
  76155. #endif
  76156. "stm %[a]!, {r5}\n\t"
  76157. "ldm %[m]!, {r6}\n\t"
  76158. #ifdef WOLFSSL_KEIL
  76159. "ands r6, r6, r7\n\t"
  76160. #elif defined(__clang__)
  76161. "ands r6, r7\n\t"
  76162. #else
  76163. "and r6, r7\n\t"
  76164. #endif
  76165. "ldr r5, [%[a], r4]\n\t"
  76166. #ifdef WOLFSSL_KEIL
  76167. "sbcs r5, r5, r6\n\t"
  76168. #elif defined(__clang__)
  76169. "sbcs r5, r6\n\t"
  76170. #else
  76171. "sbc r5, r6\n\t"
  76172. #endif
  76173. "stm %[a]!, {r5}\n\t"
  76174. "ldm %[m]!, {r6}\n\t"
  76175. #ifdef WOLFSSL_KEIL
  76176. "ands r6, r6, r7\n\t"
  76177. #elif defined(__clang__)
  76178. "ands r6, r7\n\t"
  76179. #else
  76180. "and r6, r7\n\t"
  76181. #endif
  76182. "ldr r5, [%[a], r4]\n\t"
  76183. #ifdef WOLFSSL_KEIL
  76184. "sbcs r5, r5, r6\n\t"
  76185. #elif defined(__clang__)
  76186. "sbcs r5, r6\n\t"
  76187. #else
  76188. "sbc r5, r6\n\t"
  76189. #endif
  76190. "stm %[a]!, {r5}\n\t"
  76191. "ldm %[m]!, {r6}\n\t"
  76192. #ifdef WOLFSSL_KEIL
  76193. "ands r6, r6, r7\n\t"
  76194. #elif defined(__clang__)
  76195. "ands r6, r7\n\t"
  76196. #else
  76197. "and r6, r7\n\t"
  76198. #endif
  76199. "ldr r5, [%[a], r4]\n\t"
  76200. #ifdef WOLFSSL_KEIL
  76201. "sbcs r5, r5, r6\n\t"
  76202. #elif defined(__clang__)
  76203. "sbcs r5, r6\n\t"
  76204. #else
  76205. "sbc r5, r6\n\t"
  76206. #endif
  76207. "stm %[a]!, {r5}\n\t"
  76208. "ldm %[m]!, {r6}\n\t"
  76209. #ifdef WOLFSSL_KEIL
  76210. "ands r6, r6, r7\n\t"
  76211. #elif defined(__clang__)
  76212. "ands r6, r7\n\t"
  76213. #else
  76214. "and r6, r7\n\t"
  76215. #endif
  76216. "ldr r5, [%[a], r4]\n\t"
  76217. #ifdef WOLFSSL_KEIL
  76218. "sbcs r5, r5, r6\n\t"
  76219. #elif defined(__clang__)
  76220. "sbcs r5, r6\n\t"
  76221. #else
  76222. "sbc r5, r6\n\t"
  76223. #endif
  76224. "stm %[a]!, {r5}\n\t"
  76225. "ldm %[m]!, {r6}\n\t"
  76226. #ifdef WOLFSSL_KEIL
  76227. "ands r6, r6, r7\n\t"
  76228. #elif defined(__clang__)
  76229. "ands r6, r7\n\t"
  76230. #else
  76231. "and r6, r7\n\t"
  76232. #endif
  76233. "ldr r5, [%[a], r4]\n\t"
  76234. #ifdef WOLFSSL_KEIL
  76235. "sbcs r5, r5, r6\n\t"
  76236. #elif defined(__clang__)
  76237. "sbcs r5, r6\n\t"
  76238. #else
  76239. "sbc r5, r6\n\t"
  76240. #endif
  76241. "stm %[a]!, {r5}\n\t"
  76242. "ldm %[m]!, {r6}\n\t"
  76243. #ifdef WOLFSSL_KEIL
  76244. "ands r6, r6, r7\n\t"
  76245. #elif defined(__clang__)
  76246. "ands r6, r7\n\t"
  76247. #else
  76248. "and r6, r7\n\t"
  76249. #endif
  76250. "ldr r5, [%[a], r4]\n\t"
  76251. #ifdef WOLFSSL_KEIL
  76252. "sbcs r5, r5, r6\n\t"
  76253. #elif defined(__clang__)
  76254. "sbcs r5, r6\n\t"
  76255. #else
  76256. "sbc r5, r6\n\t"
  76257. #endif
  76258. "stm %[a]!, {r5}\n\t"
  76259. "ldm %[m]!, {r6}\n\t"
  76260. #ifdef WOLFSSL_KEIL
  76261. "ands r6, r6, r7\n\t"
  76262. #elif defined(__clang__)
  76263. "ands r6, r7\n\t"
  76264. #else
  76265. "and r6, r7\n\t"
  76266. #endif
  76267. "ldr r5, [%[a], r4]\n\t"
  76268. #ifdef WOLFSSL_KEIL
  76269. "sbcs r5, r5, r6\n\t"
  76270. #elif defined(__clang__)
  76271. "sbcs r5, r6\n\t"
  76272. #else
  76273. "sbc r5, r6\n\t"
  76274. #endif
  76275. "stm %[a]!, {r5}\n\t"
  76276. "ldm %[m]!, {r6}\n\t"
  76277. #ifdef WOLFSSL_KEIL
  76278. "ands r6, r6, r7\n\t"
  76279. #elif defined(__clang__)
  76280. "ands r6, r7\n\t"
  76281. #else
  76282. "and r6, r7\n\t"
  76283. #endif
  76284. "ldr r5, [%[a], r4]\n\t"
  76285. #ifdef WOLFSSL_KEIL
  76286. "sbcs r5, r5, r6\n\t"
  76287. #elif defined(__clang__)
  76288. "sbcs r5, r6\n\t"
  76289. #else
  76290. "sbc r5, r6\n\t"
  76291. #endif
  76292. "stm %[a]!, {r5}\n\t"
  76293. "ldm %[m]!, {r6}\n\t"
  76294. #ifdef WOLFSSL_KEIL
  76295. "ands r6, r6, r7\n\t"
  76296. #elif defined(__clang__)
  76297. "ands r6, r7\n\t"
  76298. #else
  76299. "and r6, r7\n\t"
  76300. #endif
  76301. "ldr r5, [%[a], r4]\n\t"
  76302. #ifdef WOLFSSL_KEIL
  76303. "sbcs r5, r5, r6\n\t"
  76304. #elif defined(__clang__)
  76305. "sbcs r5, r6\n\t"
  76306. #else
  76307. "sbc r5, r6\n\t"
  76308. #endif
  76309. "stm %[a]!, {r5}\n\t"
  76310. "ldm %[m]!, {r6}\n\t"
  76311. #ifdef WOLFSSL_KEIL
  76312. "ands r6, r6, r7\n\t"
  76313. #elif defined(__clang__)
  76314. "ands r6, r7\n\t"
  76315. #else
  76316. "and r6, r7\n\t"
  76317. #endif
  76318. "ldr r5, [%[a], r4]\n\t"
  76319. #ifdef WOLFSSL_KEIL
  76320. "sbcs r5, r5, r6\n\t"
  76321. #elif defined(__clang__)
  76322. "sbcs r5, r6\n\t"
  76323. #else
  76324. "sbc r5, r6\n\t"
  76325. #endif
  76326. "stm %[a]!, {r5}\n\t"
  76327. "ldm %[m]!, {r6}\n\t"
  76328. #ifdef WOLFSSL_KEIL
  76329. "ands r6, r6, r7\n\t"
  76330. #elif defined(__clang__)
  76331. "ands r6, r7\n\t"
  76332. #else
  76333. "and r6, r7\n\t"
  76334. #endif
  76335. "ldr r5, [%[a], r4]\n\t"
  76336. #ifdef WOLFSSL_KEIL
  76337. "sbcs r5, r5, r6\n\t"
  76338. #elif defined(__clang__)
  76339. "sbcs r5, r6\n\t"
  76340. #else
  76341. "sbc r5, r6\n\t"
  76342. #endif
  76343. "stm %[a]!, {r5}\n\t"
  76344. "ldm %[m]!, {r6}\n\t"
  76345. #ifdef WOLFSSL_KEIL
  76346. "ands r6, r6, r7\n\t"
  76347. #elif defined(__clang__)
  76348. "ands r6, r7\n\t"
  76349. #else
  76350. "and r6, r7\n\t"
  76351. #endif
  76352. "ldr r5, [%[a], r4]\n\t"
  76353. #ifdef WOLFSSL_KEIL
  76354. "sbcs r5, r5, r6\n\t"
  76355. #elif defined(__clang__)
  76356. "sbcs r5, r6\n\t"
  76357. #else
  76358. "sbc r5, r6\n\t"
  76359. #endif
  76360. "stm %[a]!, {r5}\n\t"
  76361. "ldm %[m]!, {r6}\n\t"
  76362. #ifdef WOLFSSL_KEIL
  76363. "ands r6, r6, r7\n\t"
  76364. #elif defined(__clang__)
  76365. "ands r6, r7\n\t"
  76366. #else
  76367. "and r6, r7\n\t"
  76368. #endif
  76369. "ldr r5, [%[a], r4]\n\t"
  76370. #ifdef WOLFSSL_KEIL
  76371. "sbcs r5, r5, r6\n\t"
  76372. #elif defined(__clang__)
  76373. "sbcs r5, r6\n\t"
  76374. #else
  76375. "sbc r5, r6\n\t"
  76376. #endif
  76377. "stm %[a]!, {r5}\n\t"
  76378. "ldm %[m]!, {r6}\n\t"
  76379. #ifdef WOLFSSL_KEIL
  76380. "ands r6, r6, r7\n\t"
  76381. #elif defined(__clang__)
  76382. "ands r6, r7\n\t"
  76383. #else
  76384. "and r6, r7\n\t"
  76385. #endif
  76386. "ldr r5, [%[a], r4]\n\t"
  76387. #ifdef WOLFSSL_KEIL
  76388. "sbcs r5, r5, r6\n\t"
  76389. #elif defined(__clang__)
  76390. "sbcs r5, r6\n\t"
  76391. #else
  76392. "sbc r5, r6\n\t"
  76393. #endif
  76394. "stm %[a]!, {r5}\n\t"
  76395. "ldm %[m]!, {r6}\n\t"
  76396. #ifdef WOLFSSL_KEIL
  76397. "ands r6, r6, r7\n\t"
  76398. #elif defined(__clang__)
  76399. "ands r6, r7\n\t"
  76400. #else
  76401. "and r6, r7\n\t"
  76402. #endif
  76403. "ldr r5, [%[a], r4]\n\t"
  76404. #ifdef WOLFSSL_KEIL
  76405. "sbcs r5, r5, r6\n\t"
  76406. #elif defined(__clang__)
  76407. "sbcs r5, r6\n\t"
  76408. #else
  76409. "sbc r5, r6\n\t"
  76410. #endif
  76411. "stm %[a]!, {r5}\n\t"
  76412. "ldm %[m]!, {r6}\n\t"
  76413. #ifdef WOLFSSL_KEIL
  76414. "ands r6, r6, r7\n\t"
  76415. #elif defined(__clang__)
  76416. "ands r6, r7\n\t"
  76417. #else
  76418. "and r6, r7\n\t"
  76419. #endif
  76420. "ldr r5, [%[a], r4]\n\t"
  76421. #ifdef WOLFSSL_KEIL
  76422. "sbcs r5, r5, r6\n\t"
  76423. #elif defined(__clang__)
  76424. "sbcs r5, r6\n\t"
  76425. #else
  76426. "sbc r5, r6\n\t"
  76427. #endif
  76428. "stm %[a]!, {r5}\n\t"
  76429. "ldm %[m]!, {r6}\n\t"
  76430. #ifdef WOLFSSL_KEIL
  76431. "ands r6, r6, r7\n\t"
  76432. #elif defined(__clang__)
  76433. "ands r6, r7\n\t"
  76434. #else
  76435. "and r6, r7\n\t"
  76436. #endif
  76437. "ldr r5, [%[a], r4]\n\t"
  76438. #ifdef WOLFSSL_KEIL
  76439. "sbcs r5, r5, r6\n\t"
  76440. #elif defined(__clang__)
  76441. "sbcs r5, r6\n\t"
  76442. #else
  76443. "sbc r5, r6\n\t"
  76444. #endif
  76445. "stm %[a]!, {r5}\n\t"
  76446. "ldm %[m]!, {r6}\n\t"
  76447. #ifdef WOLFSSL_KEIL
  76448. "ands r6, r6, r7\n\t"
  76449. #elif defined(__clang__)
  76450. "ands r6, r7\n\t"
  76451. #else
  76452. "and r6, r7\n\t"
  76453. #endif
  76454. "ldr r5, [%[a], r4]\n\t"
  76455. #ifdef WOLFSSL_KEIL
  76456. "sbcs r5, r5, r6\n\t"
  76457. #elif defined(__clang__)
  76458. "sbcs r5, r6\n\t"
  76459. #else
  76460. "sbc r5, r6\n\t"
  76461. #endif
  76462. "stm %[a]!, {r5}\n\t"
  76463. "ldm %[m]!, {r6}\n\t"
  76464. #ifdef WOLFSSL_KEIL
  76465. "ands r6, r6, r7\n\t"
  76466. #elif defined(__clang__)
  76467. "ands r6, r7\n\t"
  76468. #else
  76469. "and r6, r7\n\t"
  76470. #endif
  76471. "ldr r5, [%[a], r4]\n\t"
  76472. #ifdef WOLFSSL_KEIL
  76473. "sbcs r5, r5, r6\n\t"
  76474. #elif defined(__clang__)
  76475. "sbcs r5, r6\n\t"
  76476. #else
  76477. "sbc r5, r6\n\t"
  76478. #endif
  76479. "stm %[a]!, {r5}\n\t"
  76480. "ldm %[m]!, {r6}\n\t"
  76481. #ifdef WOLFSSL_KEIL
  76482. "ands r6, r6, r7\n\t"
  76483. #elif defined(__clang__)
  76484. "ands r6, r7\n\t"
  76485. #else
  76486. "and r6, r7\n\t"
  76487. #endif
  76488. "ldr r5, [%[a], r4]\n\t"
  76489. #ifdef WOLFSSL_KEIL
  76490. "sbcs r5, r5, r6\n\t"
  76491. #elif defined(__clang__)
  76492. "sbcs r5, r6\n\t"
  76493. #else
  76494. "sbc r5, r6\n\t"
  76495. #endif
  76496. "stm %[a]!, {r5}\n\t"
  76497. "ldm %[m]!, {r6}\n\t"
  76498. #ifdef WOLFSSL_KEIL
  76499. "ands r6, r6, r7\n\t"
  76500. #elif defined(__clang__)
  76501. "ands r6, r7\n\t"
  76502. #else
  76503. "and r6, r7\n\t"
  76504. #endif
  76505. "ldr r5, [%[a], r4]\n\t"
  76506. #ifdef WOLFSSL_KEIL
  76507. "sbcs r5, r5, r6\n\t"
  76508. #elif defined(__clang__)
  76509. "sbcs r5, r6\n\t"
  76510. #else
  76511. "sbc r5, r6\n\t"
  76512. #endif
  76513. "stm %[a]!, {r5}\n\t"
  76514. "ldm %[m]!, {r6}\n\t"
  76515. #ifdef WOLFSSL_KEIL
  76516. "ands r6, r6, r7\n\t"
  76517. #elif defined(__clang__)
  76518. "ands r6, r7\n\t"
  76519. #else
  76520. "and r6, r7\n\t"
  76521. #endif
  76522. "ldr r5, [%[a], r4]\n\t"
  76523. #ifdef WOLFSSL_KEIL
  76524. "sbcs r5, r5, r6\n\t"
  76525. #elif defined(__clang__)
  76526. "sbcs r5, r6\n\t"
  76527. #else
  76528. "sbc r5, r6\n\t"
  76529. #endif
  76530. "stm %[a]!, {r5}\n\t"
  76531. "ldm %[m]!, {r6}\n\t"
  76532. #ifdef WOLFSSL_KEIL
  76533. "ands r6, r6, r7\n\t"
  76534. #elif defined(__clang__)
  76535. "ands r6, r7\n\t"
  76536. #else
  76537. "and r6, r7\n\t"
  76538. #endif
  76539. "ldr r5, [%[a], r4]\n\t"
  76540. #ifdef WOLFSSL_KEIL
  76541. "sbcs r5, r5, r6\n\t"
  76542. #elif defined(__clang__)
  76543. "sbcs r5, r6\n\t"
  76544. #else
  76545. "sbc r5, r6\n\t"
  76546. #endif
  76547. "stm %[a]!, {r5}\n\t"
  76548. "ldm %[m]!, {r6}\n\t"
  76549. #ifdef WOLFSSL_KEIL
  76550. "ands r6, r6, r7\n\t"
  76551. #elif defined(__clang__)
  76552. "ands r6, r7\n\t"
  76553. #else
  76554. "and r6, r7\n\t"
  76555. #endif
  76556. "ldr r5, [%[a], r4]\n\t"
  76557. #ifdef WOLFSSL_KEIL
  76558. "sbcs r5, r5, r6\n\t"
  76559. #elif defined(__clang__)
  76560. "sbcs r5, r6\n\t"
  76561. #else
  76562. "sbc r5, r6\n\t"
  76563. #endif
  76564. "stm %[a]!, {r5}\n\t"
  76565. "ldm %[m]!, {r6}\n\t"
  76566. #ifdef WOLFSSL_KEIL
  76567. "ands r6, r6, r7\n\t"
  76568. #elif defined(__clang__)
  76569. "ands r6, r7\n\t"
  76570. #else
  76571. "and r6, r7\n\t"
  76572. #endif
  76573. "ldr r5, [%[a], r4]\n\t"
  76574. #ifdef WOLFSSL_KEIL
  76575. "sbcs r5, r5, r6\n\t"
  76576. #elif defined(__clang__)
  76577. "sbcs r5, r6\n\t"
  76578. #else
  76579. "sbc r5, r6\n\t"
  76580. #endif
  76581. "stm %[a]!, {r5}\n\t"
  76582. "ldm %[m]!, {r6}\n\t"
  76583. #ifdef WOLFSSL_KEIL
  76584. "ands r6, r6, r7\n\t"
  76585. #elif defined(__clang__)
  76586. "ands r6, r7\n\t"
  76587. #else
  76588. "and r6, r7\n\t"
  76589. #endif
  76590. "ldr r5, [%[a], r4]\n\t"
  76591. #ifdef WOLFSSL_KEIL
  76592. "sbcs r5, r5, r6\n\t"
  76593. #elif defined(__clang__)
  76594. "sbcs r5, r6\n\t"
  76595. #else
  76596. "sbc r5, r6\n\t"
  76597. #endif
  76598. "stm %[a]!, {r5}\n\t"
  76599. "ldm %[m]!, {r6}\n\t"
  76600. #ifdef WOLFSSL_KEIL
  76601. "ands r6, r6, r7\n\t"
  76602. #elif defined(__clang__)
  76603. "ands r6, r7\n\t"
  76604. #else
  76605. "and r6, r7\n\t"
  76606. #endif
  76607. "ldr r5, [%[a], r4]\n\t"
  76608. #ifdef WOLFSSL_KEIL
  76609. "sbcs r5, r5, r6\n\t"
  76610. #elif defined(__clang__)
  76611. "sbcs r5, r6\n\t"
  76612. #else
  76613. "sbc r5, r6\n\t"
  76614. #endif
  76615. "stm %[a]!, {r5}\n\t"
  76616. "ldm %[m]!, {r6}\n\t"
  76617. #ifdef WOLFSSL_KEIL
  76618. "ands r6, r6, r7\n\t"
  76619. #elif defined(__clang__)
  76620. "ands r6, r7\n\t"
  76621. #else
  76622. "and r6, r7\n\t"
  76623. #endif
  76624. "ldr r5, [%[a], r4]\n\t"
  76625. #ifdef WOLFSSL_KEIL
  76626. "sbcs r5, r5, r6\n\t"
  76627. #elif defined(__clang__)
  76628. "sbcs r5, r6\n\t"
  76629. #else
  76630. "sbc r5, r6\n\t"
  76631. #endif
  76632. "stm %[a]!, {r5}\n\t"
  76633. "ldm %[m]!, {r6}\n\t"
  76634. #ifdef WOLFSSL_KEIL
  76635. "ands r6, r6, r7\n\t"
  76636. #elif defined(__clang__)
  76637. "ands r6, r7\n\t"
  76638. #else
  76639. "and r6, r7\n\t"
  76640. #endif
  76641. "ldr r5, [%[a], r4]\n\t"
  76642. #ifdef WOLFSSL_KEIL
  76643. "sbcs r5, r5, r6\n\t"
  76644. #elif defined(__clang__)
  76645. "sbcs r5, r6\n\t"
  76646. #else
  76647. "sbc r5, r6\n\t"
  76648. #endif
  76649. "stm %[a]!, {r5}\n\t"
  76650. "ldm %[m]!, {r6}\n\t"
  76651. #ifdef WOLFSSL_KEIL
  76652. "ands r6, r6, r7\n\t"
  76653. #elif defined(__clang__)
  76654. "ands r6, r7\n\t"
  76655. #else
  76656. "and r6, r7\n\t"
  76657. #endif
  76658. "ldr r5, [%[a], r4]\n\t"
  76659. #ifdef WOLFSSL_KEIL
  76660. "sbcs r5, r5, r6\n\t"
  76661. #elif defined(__clang__)
  76662. "sbcs r5, r6\n\t"
  76663. #else
  76664. "sbc r5, r6\n\t"
  76665. #endif
  76666. "stm %[a]!, {r5}\n\t"
  76667. "ldm %[m]!, {r6}\n\t"
  76668. #ifdef WOLFSSL_KEIL
  76669. "ands r6, r6, r7\n\t"
  76670. #elif defined(__clang__)
  76671. "ands r6, r7\n\t"
  76672. #else
  76673. "and r6, r7\n\t"
  76674. #endif
  76675. "ldr r5, [%[a], r4]\n\t"
  76676. #ifdef WOLFSSL_KEIL
  76677. "sbcs r5, r5, r6\n\t"
  76678. #elif defined(__clang__)
  76679. "sbcs r5, r6\n\t"
  76680. #else
  76681. "sbc r5, r6\n\t"
  76682. #endif
  76683. "stm %[a]!, {r5}\n\t"
  76684. "ldm %[m]!, {r6}\n\t"
  76685. #ifdef WOLFSSL_KEIL
  76686. "ands r6, r6, r7\n\t"
  76687. #elif defined(__clang__)
  76688. "ands r6, r7\n\t"
  76689. #else
  76690. "and r6, r7\n\t"
  76691. #endif
  76692. "ldr r5, [%[a], r4]\n\t"
  76693. #ifdef WOLFSSL_KEIL
  76694. "sbcs r5, r5, r6\n\t"
  76695. #elif defined(__clang__)
  76696. "sbcs r5, r6\n\t"
  76697. #else
  76698. "sbc r5, r6\n\t"
  76699. #endif
  76700. "stm %[a]!, {r5}\n\t"
  76701. "ldm %[m]!, {r6}\n\t"
  76702. #ifdef WOLFSSL_KEIL
  76703. "ands r6, r6, r7\n\t"
  76704. #elif defined(__clang__)
  76705. "ands r6, r7\n\t"
  76706. #else
  76707. "and r6, r7\n\t"
  76708. #endif
  76709. "ldr r5, [%[a], r4]\n\t"
  76710. #ifdef WOLFSSL_KEIL
  76711. "sbcs r5, r5, r6\n\t"
  76712. #elif defined(__clang__)
  76713. "sbcs r5, r6\n\t"
  76714. #else
  76715. "sbc r5, r6\n\t"
  76716. #endif
  76717. "stm %[a]!, {r5}\n\t"
  76718. "ldm %[m]!, {r6}\n\t"
  76719. #ifdef WOLFSSL_KEIL
  76720. "ands r6, r6, r7\n\t"
  76721. #elif defined(__clang__)
  76722. "ands r6, r7\n\t"
  76723. #else
  76724. "and r6, r7\n\t"
  76725. #endif
  76726. "ldr r5, [%[a], r4]\n\t"
  76727. #ifdef WOLFSSL_KEIL
  76728. "sbcs r5, r5, r6\n\t"
  76729. #elif defined(__clang__)
  76730. "sbcs r5, r6\n\t"
  76731. #else
  76732. "sbc r5, r6\n\t"
  76733. #endif
  76734. "stm %[a]!, {r5}\n\t"
  76735. "ldm %[m]!, {r6}\n\t"
  76736. #ifdef WOLFSSL_KEIL
  76737. "ands r6, r6, r7\n\t"
  76738. #elif defined(__clang__)
  76739. "ands r6, r7\n\t"
  76740. #else
  76741. "and r6, r7\n\t"
  76742. #endif
  76743. "ldr r5, [%[a], r4]\n\t"
  76744. #ifdef WOLFSSL_KEIL
  76745. "sbcs r5, r5, r6\n\t"
  76746. #elif defined(__clang__)
  76747. "sbcs r5, r6\n\t"
  76748. #else
  76749. "sbc r5, r6\n\t"
  76750. #endif
  76751. "stm %[a]!, {r5}\n\t"
  76752. "ldm %[m]!, {r6}\n\t"
  76753. #ifdef WOLFSSL_KEIL
  76754. "ands r6, r6, r7\n\t"
  76755. #elif defined(__clang__)
  76756. "ands r6, r7\n\t"
  76757. #else
  76758. "and r6, r7\n\t"
  76759. #endif
  76760. "ldr r5, [%[a], r4]\n\t"
  76761. #ifdef WOLFSSL_KEIL
  76762. "sbcs r5, r5, r6\n\t"
  76763. #elif defined(__clang__)
  76764. "sbcs r5, r6\n\t"
  76765. #else
  76766. "sbc r5, r6\n\t"
  76767. #endif
  76768. "stm %[a]!, {r5}\n\t"
  76769. "ldm %[m]!, {r6}\n\t"
  76770. #ifdef WOLFSSL_KEIL
  76771. "ands r6, r6, r7\n\t"
  76772. #elif defined(__clang__)
  76773. "ands r6, r7\n\t"
  76774. #else
  76775. "and r6, r7\n\t"
  76776. #endif
  76777. "ldr r5, [%[a], r4]\n\t"
  76778. #ifdef WOLFSSL_KEIL
  76779. "sbcs r5, r5, r6\n\t"
  76780. #elif defined(__clang__)
  76781. "sbcs r5, r6\n\t"
  76782. #else
  76783. "sbc r5, r6\n\t"
  76784. #endif
  76785. "stm %[a]!, {r5}\n\t"
  76786. "ldm %[m]!, {r6}\n\t"
  76787. #ifdef WOLFSSL_KEIL
  76788. "ands r6, r6, r7\n\t"
  76789. #elif defined(__clang__)
  76790. "ands r6, r7\n\t"
  76791. #else
  76792. "and r6, r7\n\t"
  76793. #endif
  76794. "ldr r5, [%[a], r4]\n\t"
  76795. #ifdef WOLFSSL_KEIL
  76796. "sbcs r5, r5, r6\n\t"
  76797. #elif defined(__clang__)
  76798. "sbcs r5, r6\n\t"
  76799. #else
  76800. "sbc r5, r6\n\t"
  76801. #endif
  76802. "stm %[a]!, {r5}\n\t"
  76803. "ldm %[m]!, {r6}\n\t"
  76804. #ifdef WOLFSSL_KEIL
  76805. "ands r6, r6, r7\n\t"
  76806. #elif defined(__clang__)
  76807. "ands r6, r7\n\t"
  76808. #else
  76809. "and r6, r7\n\t"
  76810. #endif
  76811. "ldr r5, [%[a], r4]\n\t"
  76812. #ifdef WOLFSSL_KEIL
  76813. "sbcs r5, r5, r6\n\t"
  76814. #elif defined(__clang__)
  76815. "sbcs r5, r6\n\t"
  76816. #else
  76817. "sbc r5, r6\n\t"
  76818. #endif
  76819. "stm %[a]!, {r5}\n\t"
  76820. "ldm %[m]!, {r6}\n\t"
  76821. #ifdef WOLFSSL_KEIL
  76822. "ands r6, r6, r7\n\t"
  76823. #elif defined(__clang__)
  76824. "ands r6, r7\n\t"
  76825. #else
  76826. "and r6, r7\n\t"
  76827. #endif
  76828. "ldr r5, [%[a], r4]\n\t"
  76829. #ifdef WOLFSSL_KEIL
  76830. "sbcs r5, r5, r6\n\t"
  76831. #elif defined(__clang__)
  76832. "sbcs r5, r6\n\t"
  76833. #else
  76834. "sbc r5, r6\n\t"
  76835. #endif
  76836. "stm %[a]!, {r5}\n\t"
  76837. "ldm %[m]!, {r6}\n\t"
  76838. #ifdef WOLFSSL_KEIL
  76839. "ands r6, r6, r7\n\t"
  76840. #elif defined(__clang__)
  76841. "ands r6, r7\n\t"
  76842. #else
  76843. "and r6, r7\n\t"
  76844. #endif
  76845. "ldr r5, [%[a], r4]\n\t"
  76846. #ifdef WOLFSSL_KEIL
  76847. "sbcs r5, r5, r6\n\t"
  76848. #elif defined(__clang__)
  76849. "sbcs r5, r6\n\t"
  76850. #else
  76851. "sbc r5, r6\n\t"
  76852. #endif
  76853. "stm %[a]!, {r5}\n\t"
  76854. "ldm %[m]!, {r6}\n\t"
  76855. #ifdef WOLFSSL_KEIL
  76856. "ands r6, r6, r7\n\t"
  76857. #elif defined(__clang__)
  76858. "ands r6, r7\n\t"
  76859. #else
  76860. "and r6, r7\n\t"
  76861. #endif
  76862. "ldr r5, [%[a], r4]\n\t"
  76863. #ifdef WOLFSSL_KEIL
  76864. "sbcs r5, r5, r6\n\t"
  76865. #elif defined(__clang__)
  76866. "sbcs r5, r6\n\t"
  76867. #else
  76868. "sbc r5, r6\n\t"
  76869. #endif
  76870. "stm %[a]!, {r5}\n\t"
  76871. "ldm %[m]!, {r6}\n\t"
  76872. #ifdef WOLFSSL_KEIL
  76873. "ands r6, r6, r7\n\t"
  76874. #elif defined(__clang__)
  76875. "ands r6, r7\n\t"
  76876. #else
  76877. "and r6, r7\n\t"
  76878. #endif
  76879. "ldr r5, [%[a], r4]\n\t"
  76880. #ifdef WOLFSSL_KEIL
  76881. "sbcs r5, r5, r6\n\t"
  76882. #elif defined(__clang__)
  76883. "sbcs r5, r6\n\t"
  76884. #else
  76885. "sbc r5, r6\n\t"
  76886. #endif
  76887. "stm %[a]!, {r5}\n\t"
  76888. "ldm %[m]!, {r6}\n\t"
  76889. #ifdef WOLFSSL_KEIL
  76890. "ands r6, r6, r7\n\t"
  76891. #elif defined(__clang__)
  76892. "ands r6, r7\n\t"
  76893. #else
  76894. "and r6, r7\n\t"
  76895. #endif
  76896. "ldr r5, [%[a], r4]\n\t"
  76897. #ifdef WOLFSSL_KEIL
  76898. "sbcs r5, r5, r6\n\t"
  76899. #elif defined(__clang__)
  76900. "sbcs r5, r6\n\t"
  76901. #else
  76902. "sbc r5, r6\n\t"
  76903. #endif
  76904. "stm %[a]!, {r5}\n\t"
  76905. "ldm %[m]!, {r6}\n\t"
  76906. #ifdef WOLFSSL_KEIL
  76907. "ands r6, r6, r7\n\t"
  76908. #elif defined(__clang__)
  76909. "ands r6, r7\n\t"
  76910. #else
  76911. "and r6, r7\n\t"
  76912. #endif
  76913. "ldr r5, [%[a], r4]\n\t"
  76914. #ifdef WOLFSSL_KEIL
  76915. "sbcs r5, r5, r6\n\t"
  76916. #elif defined(__clang__)
  76917. "sbcs r5, r6\n\t"
  76918. #else
  76919. "sbc r5, r6\n\t"
  76920. #endif
  76921. "stm %[a]!, {r5}\n\t"
  76922. "ldm %[m]!, {r6}\n\t"
  76923. #ifdef WOLFSSL_KEIL
  76924. "ands r6, r6, r7\n\t"
  76925. #elif defined(__clang__)
  76926. "ands r6, r7\n\t"
  76927. #else
  76928. "and r6, r7\n\t"
  76929. #endif
  76930. "ldr r5, [%[a], r4]\n\t"
  76931. #ifdef WOLFSSL_KEIL
  76932. "sbcs r5, r5, r6\n\t"
  76933. #elif defined(__clang__)
  76934. "sbcs r5, r6\n\t"
  76935. #else
  76936. "sbc r5, r6\n\t"
  76937. #endif
  76938. "stm %[a]!, {r5}\n\t"
  76939. "ldm %[m]!, {r6}\n\t"
  76940. #ifdef WOLFSSL_KEIL
  76941. "ands r6, r6, r7\n\t"
  76942. #elif defined(__clang__)
  76943. "ands r6, r7\n\t"
  76944. #else
  76945. "and r6, r7\n\t"
  76946. #endif
  76947. "ldr r5, [%[a], r4]\n\t"
  76948. #ifdef WOLFSSL_KEIL
  76949. "sbcs r5, r5, r6\n\t"
  76950. #elif defined(__clang__)
  76951. "sbcs r5, r6\n\t"
  76952. #else
  76953. "sbc r5, r6\n\t"
  76954. #endif
  76955. "stm %[a]!, {r5}\n\t"
  76956. "ldm %[m]!, {r6}\n\t"
  76957. #ifdef WOLFSSL_KEIL
  76958. "ands r6, r6, r7\n\t"
  76959. #elif defined(__clang__)
  76960. "ands r6, r7\n\t"
  76961. #else
  76962. "and r6, r7\n\t"
  76963. #endif
  76964. "ldr r5, [%[a], r4]\n\t"
  76965. #ifdef WOLFSSL_KEIL
  76966. "sbcs r5, r5, r6\n\t"
  76967. #elif defined(__clang__)
  76968. "sbcs r5, r6\n\t"
  76969. #else
  76970. "sbc r5, r6\n\t"
  76971. #endif
  76972. "stm %[a]!, {r5}\n\t"
  76973. "ldm %[m]!, {r6}\n\t"
  76974. #ifdef WOLFSSL_KEIL
  76975. "ands r6, r6, r7\n\t"
  76976. #elif defined(__clang__)
  76977. "ands r6, r7\n\t"
  76978. #else
  76979. "and r6, r7\n\t"
  76980. #endif
  76981. "ldr r5, [%[a], r4]\n\t"
  76982. #ifdef WOLFSSL_KEIL
  76983. "sbcs r5, r5, r6\n\t"
  76984. #elif defined(__clang__)
  76985. "sbcs r5, r6\n\t"
  76986. #else
  76987. "sbc r5, r6\n\t"
  76988. #endif
  76989. "stm %[a]!, {r5}\n\t"
  76990. "ldm %[m]!, {r6}\n\t"
  76991. #ifdef WOLFSSL_KEIL
  76992. "ands r6, r6, r7\n\t"
  76993. #elif defined(__clang__)
  76994. "ands r6, r7\n\t"
  76995. #else
  76996. "and r6, r7\n\t"
  76997. #endif
  76998. "ldr r5, [%[a], r4]\n\t"
  76999. #ifdef WOLFSSL_KEIL
  77000. "sbcs r5, r5, r6\n\t"
  77001. #elif defined(__clang__)
  77002. "sbcs r5, r6\n\t"
  77003. #else
  77004. "sbc r5, r6\n\t"
  77005. #endif
  77006. "stm %[a]!, {r5}\n\t"
  77007. "ldm %[m]!, {r6}\n\t"
  77008. #ifdef WOLFSSL_KEIL
  77009. "ands r6, r6, r7\n\t"
  77010. #elif defined(__clang__)
  77011. "ands r6, r7\n\t"
  77012. #else
  77013. "and r6, r7\n\t"
  77014. #endif
  77015. "ldr r5, [%[a], r4]\n\t"
  77016. #ifdef WOLFSSL_KEIL
  77017. "sbcs r5, r5, r6\n\t"
  77018. #elif defined(__clang__)
  77019. "sbcs r5, r6\n\t"
  77020. #else
  77021. "sbc r5, r6\n\t"
  77022. #endif
  77023. "stm %[a]!, {r5}\n\t"
  77024. "ldm %[m]!, {r6}\n\t"
  77025. #ifdef WOLFSSL_KEIL
  77026. "ands r6, r6, r7\n\t"
  77027. #elif defined(__clang__)
  77028. "ands r6, r7\n\t"
  77029. #else
  77030. "and r6, r7\n\t"
  77031. #endif
  77032. "ldr r5, [%[a], r4]\n\t"
  77033. #ifdef WOLFSSL_KEIL
  77034. "sbcs r5, r5, r6\n\t"
  77035. #elif defined(__clang__)
  77036. "sbcs r5, r6\n\t"
  77037. #else
  77038. "sbc r5, r6\n\t"
  77039. #endif
  77040. "stm %[a]!, {r5}\n\t"
  77041. "ldm %[m]!, {r6}\n\t"
  77042. #ifdef WOLFSSL_KEIL
  77043. "ands r6, r6, r7\n\t"
  77044. #elif defined(__clang__)
  77045. "ands r6, r7\n\t"
  77046. #else
  77047. "and r6, r7\n\t"
  77048. #endif
  77049. "ldr r5, [%[a], r4]\n\t"
  77050. #ifdef WOLFSSL_KEIL
  77051. "sbcs r5, r5, r6\n\t"
  77052. #elif defined(__clang__)
  77053. "sbcs r5, r6\n\t"
  77054. #else
  77055. "sbc r5, r6\n\t"
  77056. #endif
  77057. "stm %[a]!, {r5}\n\t"
  77058. "ldm %[m]!, {r6}\n\t"
  77059. #ifdef WOLFSSL_KEIL
  77060. "ands r6, r6, r7\n\t"
  77061. #elif defined(__clang__)
  77062. "ands r6, r7\n\t"
  77063. #else
  77064. "and r6, r7\n\t"
  77065. #endif
  77066. "ldr r5, [%[a], r4]\n\t"
  77067. #ifdef WOLFSSL_KEIL
  77068. "sbcs r5, r5, r6\n\t"
  77069. #elif defined(__clang__)
  77070. "sbcs r5, r6\n\t"
  77071. #else
  77072. "sbc r5, r6\n\t"
  77073. #endif
  77074. "stm %[a]!, {r5}\n\t"
  77075. "ldm %[m]!, {r6}\n\t"
  77076. #ifdef WOLFSSL_KEIL
  77077. "ands r6, r6, r7\n\t"
  77078. #elif defined(__clang__)
  77079. "ands r6, r7\n\t"
  77080. #else
  77081. "and r6, r7\n\t"
  77082. #endif
  77083. "ldr r5, [%[a], r4]\n\t"
  77084. #ifdef WOLFSSL_KEIL
  77085. "sbcs r5, r5, r6\n\t"
  77086. #elif defined(__clang__)
  77087. "sbcs r5, r6\n\t"
  77088. #else
  77089. "sbc r5, r6\n\t"
  77090. #endif
  77091. "stm %[a]!, {r5}\n\t"
  77092. "ldm %[m]!, {r6}\n\t"
  77093. #ifdef WOLFSSL_KEIL
  77094. "ands r6, r6, r7\n\t"
  77095. #elif defined(__clang__)
  77096. "ands r6, r7\n\t"
  77097. #else
  77098. "and r6, r7\n\t"
  77099. #endif
  77100. "ldr r5, [%[a], r4]\n\t"
  77101. #ifdef WOLFSSL_KEIL
  77102. "sbcs r5, r5, r6\n\t"
  77103. #elif defined(__clang__)
  77104. "sbcs r5, r6\n\t"
  77105. #else
  77106. "sbc r5, r6\n\t"
  77107. #endif
  77108. "stm %[a]!, {r5}\n\t"
  77109. "ldm %[m]!, {r6}\n\t"
  77110. #ifdef WOLFSSL_KEIL
  77111. "ands r6, r6, r7\n\t"
  77112. #elif defined(__clang__)
  77113. "ands r6, r7\n\t"
  77114. #else
  77115. "and r6, r7\n\t"
  77116. #endif
  77117. "ldr r5, [%[a], r4]\n\t"
  77118. #ifdef WOLFSSL_KEIL
  77119. "sbcs r5, r5, r6\n\t"
  77120. #elif defined(__clang__)
  77121. "sbcs r5, r6\n\t"
  77122. #else
  77123. "sbc r5, r6\n\t"
  77124. #endif
  77125. "stm %[a]!, {r5}\n\t"
  77126. "ldm %[m]!, {r6}\n\t"
  77127. #ifdef WOLFSSL_KEIL
  77128. "ands r6, r6, r7\n\t"
  77129. #elif defined(__clang__)
  77130. "ands r6, r7\n\t"
  77131. #else
  77132. "and r6, r7\n\t"
  77133. #endif
  77134. "ldr r5, [%[a], r4]\n\t"
  77135. #ifdef WOLFSSL_KEIL
  77136. "sbcs r5, r5, r6\n\t"
  77137. #elif defined(__clang__)
  77138. "sbcs r5, r6\n\t"
  77139. #else
  77140. "sbc r5, r6\n\t"
  77141. #endif
  77142. "stm %[a]!, {r5}\n\t"
  77143. "ldm %[m]!, {r6}\n\t"
  77144. #ifdef WOLFSSL_KEIL
  77145. "ands r6, r6, r7\n\t"
  77146. #elif defined(__clang__)
  77147. "ands r6, r7\n\t"
  77148. #else
  77149. "and r6, r7\n\t"
  77150. #endif
  77151. "ldr r5, [%[a], r4]\n\t"
  77152. #ifdef WOLFSSL_KEIL
  77153. "sbcs r5, r5, r6\n\t"
  77154. #elif defined(__clang__)
  77155. "sbcs r5, r6\n\t"
  77156. #else
  77157. "sbc r5, r6\n\t"
  77158. #endif
  77159. "stm %[a]!, {r5}\n\t"
  77160. "ldm %[m]!, {r6}\n\t"
  77161. #ifdef WOLFSSL_KEIL
  77162. "ands r6, r6, r7\n\t"
  77163. #elif defined(__clang__)
  77164. "ands r6, r7\n\t"
  77165. #else
  77166. "and r6, r7\n\t"
  77167. #endif
  77168. "ldr r5, [%[a], r4]\n\t"
  77169. #ifdef WOLFSSL_KEIL
  77170. "sbcs r5, r5, r6\n\t"
  77171. #elif defined(__clang__)
  77172. "sbcs r5, r6\n\t"
  77173. #else
  77174. "sbc r5, r6\n\t"
  77175. #endif
  77176. "stm %[a]!, {r5}\n\t"
  77177. "ldm %[m]!, {r6}\n\t"
  77178. #ifdef WOLFSSL_KEIL
  77179. "ands r6, r6, r7\n\t"
  77180. #elif defined(__clang__)
  77181. "ands r6, r7\n\t"
  77182. #else
  77183. "and r6, r7\n\t"
  77184. #endif
  77185. "ldr r5, [%[a], r4]\n\t"
  77186. #ifdef WOLFSSL_KEIL
  77187. "sbcs r5, r5, r6\n\t"
  77188. #elif defined(__clang__)
  77189. "sbcs r5, r6\n\t"
  77190. #else
  77191. "sbc r5, r6\n\t"
  77192. #endif
  77193. "stm %[a]!, {r5}\n\t"
  77194. "ldm %[m]!, {r6}\n\t"
  77195. #ifdef WOLFSSL_KEIL
  77196. "ands r6, r6, r7\n\t"
  77197. #elif defined(__clang__)
  77198. "ands r6, r7\n\t"
  77199. #else
  77200. "and r6, r7\n\t"
  77201. #endif
  77202. "ldr r5, [%[a], r4]\n\t"
  77203. #ifdef WOLFSSL_KEIL
  77204. "sbcs r5, r5, r6\n\t"
  77205. #elif defined(__clang__)
  77206. "sbcs r5, r6\n\t"
  77207. #else
  77208. "sbc r5, r6\n\t"
  77209. #endif
  77210. "stm %[a]!, {r5}\n\t"
  77211. "ldm %[m]!, {r6}\n\t"
  77212. #ifdef WOLFSSL_KEIL
  77213. "ands r6, r6, r7\n\t"
  77214. #elif defined(__clang__)
  77215. "ands r6, r7\n\t"
  77216. #else
  77217. "and r6, r7\n\t"
  77218. #endif
  77219. "ldr r5, [%[a], r4]\n\t"
  77220. #ifdef WOLFSSL_KEIL
  77221. "sbcs r5, r5, r6\n\t"
  77222. #elif defined(__clang__)
  77223. "sbcs r5, r6\n\t"
  77224. #else
  77225. "sbc r5, r6\n\t"
  77226. #endif
  77227. "stm %[a]!, {r5}\n\t"
  77228. "ldm %[m]!, {r6}\n\t"
  77229. #ifdef WOLFSSL_KEIL
  77230. "ands r6, r6, r7\n\t"
  77231. #elif defined(__clang__)
  77232. "ands r6, r7\n\t"
  77233. #else
  77234. "and r6, r7\n\t"
  77235. #endif
  77236. "ldr r5, [%[a], r4]\n\t"
  77237. #ifdef WOLFSSL_KEIL
  77238. "sbcs r5, r5, r6\n\t"
  77239. #elif defined(__clang__)
  77240. "sbcs r5, r6\n\t"
  77241. #else
  77242. "sbc r5, r6\n\t"
  77243. #endif
  77244. "stm %[a]!, {r5}\n\t"
  77245. "ldm %[m]!, {r6}\n\t"
  77246. #ifdef WOLFSSL_KEIL
  77247. "ands r6, r6, r7\n\t"
  77248. #elif defined(__clang__)
  77249. "ands r6, r7\n\t"
  77250. #else
  77251. "and r6, r7\n\t"
  77252. #endif
  77253. "ldr r5, [%[a], r4]\n\t"
  77254. #ifdef WOLFSSL_KEIL
  77255. "sbcs r5, r5, r6\n\t"
  77256. #elif defined(__clang__)
  77257. "sbcs r5, r6\n\t"
  77258. #else
  77259. "sbc r5, r6\n\t"
  77260. #endif
  77261. "stm %[a]!, {r5}\n\t"
  77262. "ldm %[m]!, {r6}\n\t"
  77263. #ifdef WOLFSSL_KEIL
  77264. "ands r6, r6, r7\n\t"
  77265. #elif defined(__clang__)
  77266. "ands r6, r7\n\t"
  77267. #else
  77268. "and r6, r7\n\t"
  77269. #endif
  77270. "ldr r5, [%[a], r4]\n\t"
  77271. #ifdef WOLFSSL_KEIL
  77272. "sbcs r5, r5, r6\n\t"
  77273. #elif defined(__clang__)
  77274. "sbcs r5, r6\n\t"
  77275. #else
  77276. "sbc r5, r6\n\t"
  77277. #endif
  77278. "stm %[a]!, {r5}\n\t"
  77279. "ldm %[m]!, {r6}\n\t"
  77280. #ifdef WOLFSSL_KEIL
  77281. "ands r6, r6, r7\n\t"
  77282. #elif defined(__clang__)
  77283. "ands r6, r7\n\t"
  77284. #else
  77285. "and r6, r7\n\t"
  77286. #endif
  77287. "ldr r5, [%[a], r4]\n\t"
  77288. #ifdef WOLFSSL_KEIL
  77289. "sbcs r5, r5, r6\n\t"
  77290. #elif defined(__clang__)
  77291. "sbcs r5, r6\n\t"
  77292. #else
  77293. "sbc r5, r6\n\t"
  77294. #endif
  77295. "stm %[a]!, {r5}\n\t"
  77296. "ldm %[m]!, {r6}\n\t"
  77297. #ifdef WOLFSSL_KEIL
  77298. "ands r6, r6, r7\n\t"
  77299. #elif defined(__clang__)
  77300. "ands r6, r7\n\t"
  77301. #else
  77302. "and r6, r7\n\t"
  77303. #endif
  77304. "ldr r5, [%[a], r4]\n\t"
  77305. #ifdef WOLFSSL_KEIL
  77306. "sbcs r5, r5, r6\n\t"
  77307. #elif defined(__clang__)
  77308. "sbcs r5, r6\n\t"
  77309. #else
  77310. "sbc r5, r6\n\t"
  77311. #endif
  77312. "stm %[a]!, {r5}\n\t"
  77313. "ldm %[m]!, {r6}\n\t"
  77314. #ifdef WOLFSSL_KEIL
  77315. "ands r6, r6, r7\n\t"
  77316. #elif defined(__clang__)
  77317. "ands r6, r7\n\t"
  77318. #else
  77319. "and r6, r7\n\t"
  77320. #endif
  77321. "ldr r5, [%[a], r4]\n\t"
  77322. #ifdef WOLFSSL_KEIL
  77323. "sbcs r5, r5, r6\n\t"
  77324. #elif defined(__clang__)
  77325. "sbcs r5, r6\n\t"
  77326. #else
  77327. "sbc r5, r6\n\t"
  77328. #endif
  77329. "stm %[a]!, {r5}\n\t"
  77330. "ldm %[m]!, {r6}\n\t"
  77331. #ifdef WOLFSSL_KEIL
  77332. "ands r6, r6, r7\n\t"
  77333. #elif defined(__clang__)
  77334. "ands r6, r7\n\t"
  77335. #else
  77336. "and r6, r7\n\t"
  77337. #endif
  77338. "ldr r5, [%[a], r4]\n\t"
  77339. #ifdef WOLFSSL_KEIL
  77340. "sbcs r5, r5, r6\n\t"
  77341. #elif defined(__clang__)
  77342. "sbcs r5, r6\n\t"
  77343. #else
  77344. "sbc r5, r6\n\t"
  77345. #endif
  77346. "stm %[a]!, {r5}\n\t"
  77347. "ldm %[m]!, {r6}\n\t"
  77348. #ifdef WOLFSSL_KEIL
  77349. "ands r6, r6, r7\n\t"
  77350. #elif defined(__clang__)
  77351. "ands r6, r7\n\t"
  77352. #else
  77353. "and r6, r7\n\t"
  77354. #endif
  77355. "ldr r5, [%[a], r4]\n\t"
  77356. #ifdef WOLFSSL_KEIL
  77357. "sbcs r5, r5, r6\n\t"
  77358. #elif defined(__clang__)
  77359. "sbcs r5, r6\n\t"
  77360. #else
  77361. "sbc r5, r6\n\t"
  77362. #endif
  77363. "stm %[a]!, {r5}\n\t"
  77364. "ldm %[m]!, {r6}\n\t"
  77365. #ifdef WOLFSSL_KEIL
  77366. "ands r6, r6, r7\n\t"
  77367. #elif defined(__clang__)
  77368. "ands r6, r7\n\t"
  77369. #else
  77370. "and r6, r7\n\t"
  77371. #endif
  77372. "ldr r5, [%[a], r4]\n\t"
  77373. #ifdef WOLFSSL_KEIL
  77374. "sbcs r5, r5, r6\n\t"
  77375. #elif defined(__clang__)
  77376. "sbcs r5, r6\n\t"
  77377. #else
  77378. "sbc r5, r6\n\t"
  77379. #endif
  77380. "stm %[a]!, {r5}\n\t"
  77381. "ldm %[m]!, {r6}\n\t"
  77382. #ifdef WOLFSSL_KEIL
  77383. "ands r6, r6, r7\n\t"
  77384. #elif defined(__clang__)
  77385. "ands r6, r7\n\t"
  77386. #else
  77387. "and r6, r7\n\t"
  77388. #endif
  77389. "ldr r5, [%[a], r4]\n\t"
  77390. #ifdef WOLFSSL_KEIL
  77391. "sbcs r5, r5, r6\n\t"
  77392. #elif defined(__clang__)
  77393. "sbcs r5, r6\n\t"
  77394. #else
  77395. "sbc r5, r6\n\t"
  77396. #endif
  77397. "stm %[a]!, {r5}\n\t"
  77398. "ldm %[m]!, {r6}\n\t"
  77399. #ifdef WOLFSSL_KEIL
  77400. "ands r6, r6, r7\n\t"
  77401. #elif defined(__clang__)
  77402. "ands r6, r7\n\t"
  77403. #else
  77404. "and r6, r7\n\t"
  77405. #endif
  77406. "ldr r5, [%[a], r4]\n\t"
  77407. #ifdef WOLFSSL_KEIL
  77408. "sbcs r5, r5, r6\n\t"
  77409. #elif defined(__clang__)
  77410. "sbcs r5, r6\n\t"
  77411. #else
  77412. "sbc r5, r6\n\t"
  77413. #endif
  77414. "stm %[a]!, {r5}\n\t"
  77415. "ldm %[m]!, {r6}\n\t"
  77416. #ifdef WOLFSSL_KEIL
  77417. "ands r6, r6, r7\n\t"
  77418. #elif defined(__clang__)
  77419. "ands r6, r7\n\t"
  77420. #else
  77421. "and r6, r7\n\t"
  77422. #endif
  77423. "ldr r5, [%[a], r4]\n\t"
  77424. #ifdef WOLFSSL_KEIL
  77425. "sbcs r5, r5, r6\n\t"
  77426. #elif defined(__clang__)
  77427. "sbcs r5, r6\n\t"
  77428. #else
  77429. "sbc r5, r6\n\t"
  77430. #endif
  77431. "stm %[a]!, {r5}\n\t"
  77432. "ldm %[m]!, {r6}\n\t"
  77433. #ifdef WOLFSSL_KEIL
  77434. "ands r6, r6, r7\n\t"
  77435. #elif defined(__clang__)
  77436. "ands r6, r7\n\t"
  77437. #else
  77438. "and r6, r7\n\t"
  77439. #endif
  77440. "ldr r5, [%[a], r4]\n\t"
  77441. #ifdef WOLFSSL_KEIL
  77442. "sbcs r5, r5, r6\n\t"
  77443. #elif defined(__clang__)
  77444. "sbcs r5, r6\n\t"
  77445. #else
  77446. "sbc r5, r6\n\t"
  77447. #endif
  77448. "stm %[a]!, {r5}\n\t"
  77449. "ldm %[m]!, {r6}\n\t"
  77450. #ifdef WOLFSSL_KEIL
  77451. "ands r6, r6, r7\n\t"
  77452. #elif defined(__clang__)
  77453. "ands r6, r7\n\t"
  77454. #else
  77455. "and r6, r7\n\t"
  77456. #endif
  77457. "ldr r5, [%[a], r4]\n\t"
  77458. #ifdef WOLFSSL_KEIL
  77459. "sbcs r5, r5, r6\n\t"
  77460. #elif defined(__clang__)
  77461. "sbcs r5, r6\n\t"
  77462. #else
  77463. "sbc r5, r6\n\t"
  77464. #endif
  77465. "stm %[a]!, {r5}\n\t"
  77466. "ldm %[m]!, {r6}\n\t"
  77467. #ifdef WOLFSSL_KEIL
  77468. "ands r6, r6, r7\n\t"
  77469. #elif defined(__clang__)
  77470. "ands r6, r7\n\t"
  77471. #else
  77472. "and r6, r7\n\t"
  77473. #endif
  77474. "ldr r5, [%[a], r4]\n\t"
  77475. #ifdef WOLFSSL_KEIL
  77476. "sbcs r5, r5, r6\n\t"
  77477. #elif defined(__clang__)
  77478. "sbcs r5, r6\n\t"
  77479. #else
  77480. "sbc r5, r6\n\t"
  77481. #endif
  77482. "stm %[a]!, {r5}\n\t"
  77483. "ldm %[m]!, {r6}\n\t"
  77484. #ifdef WOLFSSL_KEIL
  77485. "ands r6, r6, r7\n\t"
  77486. #elif defined(__clang__)
  77487. "ands r6, r7\n\t"
  77488. #else
  77489. "and r6, r7\n\t"
  77490. #endif
  77491. "ldr r5, [%[a], r4]\n\t"
  77492. #ifdef WOLFSSL_KEIL
  77493. "sbcs r5, r5, r6\n\t"
  77494. #elif defined(__clang__)
  77495. "sbcs r5, r6\n\t"
  77496. #else
  77497. "sbc r5, r6\n\t"
  77498. #endif
  77499. "stm %[a]!, {r5}\n\t"
  77500. "ldm %[m]!, {r6}\n\t"
  77501. #ifdef WOLFSSL_KEIL
  77502. "ands r6, r6, r7\n\t"
  77503. #elif defined(__clang__)
  77504. "ands r6, r7\n\t"
  77505. #else
  77506. "and r6, r7\n\t"
  77507. #endif
  77508. "ldr r5, [%[a], r4]\n\t"
  77509. #ifdef WOLFSSL_KEIL
  77510. "sbcs r5, r5, r6\n\t"
  77511. #elif defined(__clang__)
  77512. "sbcs r5, r6\n\t"
  77513. #else
  77514. "sbc r5, r6\n\t"
  77515. #endif
  77516. "stm %[a]!, {r5}\n\t"
  77517. "ldm %[m]!, {r6}\n\t"
  77518. #ifdef WOLFSSL_KEIL
  77519. "ands r6, r6, r7\n\t"
  77520. #elif defined(__clang__)
  77521. "ands r6, r7\n\t"
  77522. #else
  77523. "and r6, r7\n\t"
  77524. #endif
  77525. "ldr r5, [%[a], r4]\n\t"
  77526. #ifdef WOLFSSL_KEIL
  77527. "sbcs r5, r5, r6\n\t"
  77528. #elif defined(__clang__)
  77529. "sbcs r5, r6\n\t"
  77530. #else
  77531. "sbc r5, r6\n\t"
  77532. #endif
  77533. "stm %[a]!, {r5}\n\t"
  77534. "ldm %[m]!, {r6}\n\t"
  77535. #ifdef WOLFSSL_KEIL
  77536. "ands r6, r6, r7\n\t"
  77537. #elif defined(__clang__)
  77538. "ands r6, r7\n\t"
  77539. #else
  77540. "and r6, r7\n\t"
  77541. #endif
  77542. "ldr r5, [%[a], r4]\n\t"
  77543. #ifdef WOLFSSL_KEIL
  77544. "sbcs r5, r5, r6\n\t"
  77545. #elif defined(__clang__)
  77546. "sbcs r5, r6\n\t"
  77547. #else
  77548. "sbc r5, r6\n\t"
  77549. #endif
  77550. "stm %[a]!, {r5}\n\t"
  77551. "ldm %[m]!, {r6}\n\t"
  77552. #ifdef WOLFSSL_KEIL
  77553. "ands r6, r6, r7\n\t"
  77554. #elif defined(__clang__)
  77555. "ands r6, r7\n\t"
  77556. #else
  77557. "and r6, r7\n\t"
  77558. #endif
  77559. "ldr r5, [%[a], r4]\n\t"
  77560. #ifdef WOLFSSL_KEIL
  77561. "sbcs r5, r5, r6\n\t"
  77562. #elif defined(__clang__)
  77563. "sbcs r5, r6\n\t"
  77564. #else
  77565. "sbc r5, r6\n\t"
  77566. #endif
  77567. "stm %[a]!, {r5}\n\t"
  77568. "ldm %[m]!, {r6}\n\t"
  77569. #ifdef WOLFSSL_KEIL
  77570. "ands r6, r6, r7\n\t"
  77571. #elif defined(__clang__)
  77572. "ands r6, r7\n\t"
  77573. #else
  77574. "and r6, r7\n\t"
  77575. #endif
  77576. "ldr r5, [%[a], r4]\n\t"
  77577. #ifdef WOLFSSL_KEIL
  77578. "sbcs r5, r5, r6\n\t"
  77579. #elif defined(__clang__)
  77580. "sbcs r5, r6\n\t"
  77581. #else
  77582. "sbc r5, r6\n\t"
  77583. #endif
  77584. "stm %[a]!, {r5}\n\t"
  77585. "ldm %[m]!, {r6}\n\t"
  77586. #ifdef WOLFSSL_KEIL
  77587. "ands r6, r6, r7\n\t"
  77588. #elif defined(__clang__)
  77589. "ands r6, r7\n\t"
  77590. #else
  77591. "and r6, r7\n\t"
  77592. #endif
  77593. "ldr r5, [%[a], r4]\n\t"
  77594. #ifdef WOLFSSL_KEIL
  77595. "sbcs r5, r5, r6\n\t"
  77596. #elif defined(__clang__)
  77597. "sbcs r5, r6\n\t"
  77598. #else
  77599. "sbc r5, r6\n\t"
  77600. #endif
  77601. "stm %[a]!, {r5}\n\t"
  77602. "ldm %[m]!, {r6}\n\t"
  77603. #ifdef WOLFSSL_KEIL
  77604. "ands r6, r6, r7\n\t"
  77605. #elif defined(__clang__)
  77606. "ands r6, r7\n\t"
  77607. #else
  77608. "and r6, r7\n\t"
  77609. #endif
  77610. "ldr r5, [%[a], r4]\n\t"
  77611. #ifdef WOLFSSL_KEIL
  77612. "sbcs r5, r5, r6\n\t"
  77613. #elif defined(__clang__)
  77614. "sbcs r5, r6\n\t"
  77615. #else
  77616. "sbc r5, r6\n\t"
  77617. #endif
  77618. "stm %[a]!, {r5}\n\t"
  77619. #endif /* WOLFSSL_SP_LARGE_CODE */
  77620. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  77621. :
  77622. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  77623. );
  77624. }
  77625. /* Multiply two Montgomery form numbers mod the modulus (prime).
  77626. * (r = a * b mod m)
  77627. *
  77628. * r Result of multiplication.
  77629. * a First number to multiply in Montgomery form.
  77630. * b Second number to multiply in Montgomery form.
  77631. * m Modulus (prime).
  77632. * mp Montgomery multiplier.
  77633. */
  77634. SP_NOINLINE static void sp_3072_mont_mul_96(sp_digit* r, const sp_digit* a,
  77635. const sp_digit* b, const sp_digit* m, sp_digit mp)
  77636. {
  77637. sp_3072_mul_96(r, a, b);
  77638. sp_3072_mont_reduce_96(r, m, mp);
  77639. }
  77640. /* Square the Montgomery form number. (r = a * a mod m)
  77641. *
  77642. * r Result of squaring.
  77643. * a Number to square in Montgomery form.
  77644. * m Modulus (prime).
  77645. * mp Montgomery multiplier.
  77646. */
  77647. SP_NOINLINE static void sp_3072_mont_sqr_96(sp_digit* r, const sp_digit* a,
  77648. const sp_digit* m, sp_digit mp)
  77649. {
  77650. sp_3072_sqr_96(r, a);
  77651. sp_3072_mont_reduce_96(r, m, mp);
  77652. }
  77653. #ifdef WOLFSSL_SP_SMALL
  77654. /* Sub b from a into r. (r = a - b)
  77655. *
  77656. * r A single precision integer.
  77657. * a A single precision integer.
  77658. * b A single precision integer.
  77659. */
  77660. SP_NOINLINE static sp_digit sp_3072_sub_96(sp_digit* r, const sp_digit* a,
  77661. const sp_digit* b)
  77662. {
  77663. __asm__ __volatile__ (
  77664. "movs r6, %[a]\n\t"
  77665. "movs r3, #0\n\t"
  77666. "movs r5, #0xff\n\t"
  77667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77668. "adds r5, r5, #0x81\n\t"
  77669. #else
  77670. "add r5, r5, #0x81\n\t"
  77671. #endif
  77672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77673. "adds r6, r6, r5\n\t"
  77674. #else
  77675. "add r6, r6, r5\n\t"
  77676. #endif
  77677. "\n"
  77678. "L_sp_3072_sub_96_word_%=:\n\t"
  77679. "movs r5, #0\n\t"
  77680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77681. "subs r5, r5, r3\n\t"
  77682. #else
  77683. "sub r5, r5, r3\n\t"
  77684. #endif
  77685. "ldr r4, [%[a]]\n\t"
  77686. "ldr r5, [%[b]]\n\t"
  77687. #ifdef WOLFSSL_KEIL
  77688. "sbcs r4, r4, r5\n\t"
  77689. #elif defined(__clang__)
  77690. "sbcs r4, r5\n\t"
  77691. #else
  77692. "sbc r4, r5\n\t"
  77693. #endif
  77694. "str r4, [%[r]]\n\t"
  77695. #ifdef WOLFSSL_KEIL
  77696. "sbcs r3, r3, r3\n\t"
  77697. #elif defined(__clang__)
  77698. "sbcs r3, r3\n\t"
  77699. #else
  77700. "sbc r3, r3\n\t"
  77701. #endif
  77702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77703. "adds %[a], %[a], #4\n\t"
  77704. #else
  77705. "add %[a], %[a], #4\n\t"
  77706. #endif
  77707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77708. "adds %[b], %[b], #4\n\t"
  77709. #else
  77710. "add %[b], %[b], #4\n\t"
  77711. #endif
  77712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77713. "adds %[r], %[r], #4\n\t"
  77714. #else
  77715. "add %[r], %[r], #4\n\t"
  77716. #endif
  77717. "cmp %[a], r6\n\t"
  77718. "bne L_sp_3072_sub_96_word_%=\n\t"
  77719. "movs %[r], r3\n\t"
  77720. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  77721. :
  77722. : "memory", "r3", "r4", "r5", "r6"
  77723. );
  77724. return (uint32_t)(size_t)r;
  77725. }
  77726. #else
  77727. /* Sub b from a into r. (r = a - b)
  77728. *
  77729. * r A single precision integer.
  77730. * a A single precision integer.
  77731. * b A single precision integer.
  77732. */
  77733. SP_NOINLINE static sp_digit sp_3072_sub_96(sp_digit* r, const sp_digit* a,
  77734. const sp_digit* b)
  77735. {
  77736. __asm__ __volatile__ (
  77737. "ldm %[b]!, {r5, r6}\n\t"
  77738. "ldm %[a]!, {r3, r4}\n\t"
  77739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77740. "subs r3, r3, r5\n\t"
  77741. #else
  77742. "sub r3, r3, r5\n\t"
  77743. #endif
  77744. #ifdef WOLFSSL_KEIL
  77745. "sbcs r4, r4, r6\n\t"
  77746. #elif defined(__clang__)
  77747. "sbcs r4, r6\n\t"
  77748. #else
  77749. "sbc r4, r6\n\t"
  77750. #endif
  77751. "stm %[r]!, {r3, r4}\n\t"
  77752. "ldm %[b]!, {r5, r6}\n\t"
  77753. "ldm %[a]!, {r3, r4}\n\t"
  77754. #ifdef WOLFSSL_KEIL
  77755. "sbcs r3, r3, r5\n\t"
  77756. #elif defined(__clang__)
  77757. "sbcs r3, r5\n\t"
  77758. #else
  77759. "sbc r3, r5\n\t"
  77760. #endif
  77761. #ifdef WOLFSSL_KEIL
  77762. "sbcs r4, r4, r6\n\t"
  77763. #elif defined(__clang__)
  77764. "sbcs r4, r6\n\t"
  77765. #else
  77766. "sbc r4, r6\n\t"
  77767. #endif
  77768. "stm %[r]!, {r3, r4}\n\t"
  77769. "ldm %[b]!, {r5, r6}\n\t"
  77770. "ldm %[a]!, {r3, r4}\n\t"
  77771. #ifdef WOLFSSL_KEIL
  77772. "sbcs r3, r3, r5\n\t"
  77773. #elif defined(__clang__)
  77774. "sbcs r3, r5\n\t"
  77775. #else
  77776. "sbc r3, r5\n\t"
  77777. #endif
  77778. #ifdef WOLFSSL_KEIL
  77779. "sbcs r4, r4, r6\n\t"
  77780. #elif defined(__clang__)
  77781. "sbcs r4, r6\n\t"
  77782. #else
  77783. "sbc r4, r6\n\t"
  77784. #endif
  77785. "stm %[r]!, {r3, r4}\n\t"
  77786. "ldm %[b]!, {r5, r6}\n\t"
  77787. "ldm %[a]!, {r3, r4}\n\t"
  77788. #ifdef WOLFSSL_KEIL
  77789. "sbcs r3, r3, r5\n\t"
  77790. #elif defined(__clang__)
  77791. "sbcs r3, r5\n\t"
  77792. #else
  77793. "sbc r3, r5\n\t"
  77794. #endif
  77795. #ifdef WOLFSSL_KEIL
  77796. "sbcs r4, r4, r6\n\t"
  77797. #elif defined(__clang__)
  77798. "sbcs r4, r6\n\t"
  77799. #else
  77800. "sbc r4, r6\n\t"
  77801. #endif
  77802. "stm %[r]!, {r3, r4}\n\t"
  77803. "ldm %[b]!, {r5, r6}\n\t"
  77804. "ldm %[a]!, {r3, r4}\n\t"
  77805. #ifdef WOLFSSL_KEIL
  77806. "sbcs r3, r3, r5\n\t"
  77807. #elif defined(__clang__)
  77808. "sbcs r3, r5\n\t"
  77809. #else
  77810. "sbc r3, r5\n\t"
  77811. #endif
  77812. #ifdef WOLFSSL_KEIL
  77813. "sbcs r4, r4, r6\n\t"
  77814. #elif defined(__clang__)
  77815. "sbcs r4, r6\n\t"
  77816. #else
  77817. "sbc r4, r6\n\t"
  77818. #endif
  77819. "stm %[r]!, {r3, r4}\n\t"
  77820. "ldm %[b]!, {r5, r6}\n\t"
  77821. "ldm %[a]!, {r3, r4}\n\t"
  77822. #ifdef WOLFSSL_KEIL
  77823. "sbcs r3, r3, r5\n\t"
  77824. #elif defined(__clang__)
  77825. "sbcs r3, r5\n\t"
  77826. #else
  77827. "sbc r3, r5\n\t"
  77828. #endif
  77829. #ifdef WOLFSSL_KEIL
  77830. "sbcs r4, r4, r6\n\t"
  77831. #elif defined(__clang__)
  77832. "sbcs r4, r6\n\t"
  77833. #else
  77834. "sbc r4, r6\n\t"
  77835. #endif
  77836. "stm %[r]!, {r3, r4}\n\t"
  77837. "ldm %[b]!, {r5, r6}\n\t"
  77838. "ldm %[a]!, {r3, r4}\n\t"
  77839. #ifdef WOLFSSL_KEIL
  77840. "sbcs r3, r3, r5\n\t"
  77841. #elif defined(__clang__)
  77842. "sbcs r3, r5\n\t"
  77843. #else
  77844. "sbc r3, r5\n\t"
  77845. #endif
  77846. #ifdef WOLFSSL_KEIL
  77847. "sbcs r4, r4, r6\n\t"
  77848. #elif defined(__clang__)
  77849. "sbcs r4, r6\n\t"
  77850. #else
  77851. "sbc r4, r6\n\t"
  77852. #endif
  77853. "stm %[r]!, {r3, r4}\n\t"
  77854. "ldm %[b]!, {r5, r6}\n\t"
  77855. "ldm %[a]!, {r3, r4}\n\t"
  77856. #ifdef WOLFSSL_KEIL
  77857. "sbcs r3, r3, r5\n\t"
  77858. #elif defined(__clang__)
  77859. "sbcs r3, r5\n\t"
  77860. #else
  77861. "sbc r3, r5\n\t"
  77862. #endif
  77863. #ifdef WOLFSSL_KEIL
  77864. "sbcs r4, r4, r6\n\t"
  77865. #elif defined(__clang__)
  77866. "sbcs r4, r6\n\t"
  77867. #else
  77868. "sbc r4, r6\n\t"
  77869. #endif
  77870. "stm %[r]!, {r3, r4}\n\t"
  77871. "ldm %[b]!, {r5, r6}\n\t"
  77872. "ldm %[a]!, {r3, r4}\n\t"
  77873. #ifdef WOLFSSL_KEIL
  77874. "sbcs r3, r3, r5\n\t"
  77875. #elif defined(__clang__)
  77876. "sbcs r3, r5\n\t"
  77877. #else
  77878. "sbc r3, r5\n\t"
  77879. #endif
  77880. #ifdef WOLFSSL_KEIL
  77881. "sbcs r4, r4, r6\n\t"
  77882. #elif defined(__clang__)
  77883. "sbcs r4, r6\n\t"
  77884. #else
  77885. "sbc r4, r6\n\t"
  77886. #endif
  77887. "stm %[r]!, {r3, r4}\n\t"
  77888. "ldm %[b]!, {r5, r6}\n\t"
  77889. "ldm %[a]!, {r3, r4}\n\t"
  77890. #ifdef WOLFSSL_KEIL
  77891. "sbcs r3, r3, r5\n\t"
  77892. #elif defined(__clang__)
  77893. "sbcs r3, r5\n\t"
  77894. #else
  77895. "sbc r3, r5\n\t"
  77896. #endif
  77897. #ifdef WOLFSSL_KEIL
  77898. "sbcs r4, r4, r6\n\t"
  77899. #elif defined(__clang__)
  77900. "sbcs r4, r6\n\t"
  77901. #else
  77902. "sbc r4, r6\n\t"
  77903. #endif
  77904. "stm %[r]!, {r3, r4}\n\t"
  77905. "ldm %[b]!, {r5, r6}\n\t"
  77906. "ldm %[a]!, {r3, r4}\n\t"
  77907. #ifdef WOLFSSL_KEIL
  77908. "sbcs r3, r3, r5\n\t"
  77909. #elif defined(__clang__)
  77910. "sbcs r3, r5\n\t"
  77911. #else
  77912. "sbc r3, r5\n\t"
  77913. #endif
  77914. #ifdef WOLFSSL_KEIL
  77915. "sbcs r4, r4, r6\n\t"
  77916. #elif defined(__clang__)
  77917. "sbcs r4, r6\n\t"
  77918. #else
  77919. "sbc r4, r6\n\t"
  77920. #endif
  77921. "stm %[r]!, {r3, r4}\n\t"
  77922. "ldm %[b]!, {r5, r6}\n\t"
  77923. "ldm %[a]!, {r3, r4}\n\t"
  77924. #ifdef WOLFSSL_KEIL
  77925. "sbcs r3, r3, r5\n\t"
  77926. #elif defined(__clang__)
  77927. "sbcs r3, r5\n\t"
  77928. #else
  77929. "sbc r3, r5\n\t"
  77930. #endif
  77931. #ifdef WOLFSSL_KEIL
  77932. "sbcs r4, r4, r6\n\t"
  77933. #elif defined(__clang__)
  77934. "sbcs r4, r6\n\t"
  77935. #else
  77936. "sbc r4, r6\n\t"
  77937. #endif
  77938. "stm %[r]!, {r3, r4}\n\t"
  77939. "ldm %[b]!, {r5, r6}\n\t"
  77940. "ldm %[a]!, {r3, r4}\n\t"
  77941. #ifdef WOLFSSL_KEIL
  77942. "sbcs r3, r3, r5\n\t"
  77943. #elif defined(__clang__)
  77944. "sbcs r3, r5\n\t"
  77945. #else
  77946. "sbc r3, r5\n\t"
  77947. #endif
  77948. #ifdef WOLFSSL_KEIL
  77949. "sbcs r4, r4, r6\n\t"
  77950. #elif defined(__clang__)
  77951. "sbcs r4, r6\n\t"
  77952. #else
  77953. "sbc r4, r6\n\t"
  77954. #endif
  77955. "stm %[r]!, {r3, r4}\n\t"
  77956. "ldm %[b]!, {r5, r6}\n\t"
  77957. "ldm %[a]!, {r3, r4}\n\t"
  77958. #ifdef WOLFSSL_KEIL
  77959. "sbcs r3, r3, r5\n\t"
  77960. #elif defined(__clang__)
  77961. "sbcs r3, r5\n\t"
  77962. #else
  77963. "sbc r3, r5\n\t"
  77964. #endif
  77965. #ifdef WOLFSSL_KEIL
  77966. "sbcs r4, r4, r6\n\t"
  77967. #elif defined(__clang__)
  77968. "sbcs r4, r6\n\t"
  77969. #else
  77970. "sbc r4, r6\n\t"
  77971. #endif
  77972. "stm %[r]!, {r3, r4}\n\t"
  77973. "ldm %[b]!, {r5, r6}\n\t"
  77974. "ldm %[a]!, {r3, r4}\n\t"
  77975. #ifdef WOLFSSL_KEIL
  77976. "sbcs r3, r3, r5\n\t"
  77977. #elif defined(__clang__)
  77978. "sbcs r3, r5\n\t"
  77979. #else
  77980. "sbc r3, r5\n\t"
  77981. #endif
  77982. #ifdef WOLFSSL_KEIL
  77983. "sbcs r4, r4, r6\n\t"
  77984. #elif defined(__clang__)
  77985. "sbcs r4, r6\n\t"
  77986. #else
  77987. "sbc r4, r6\n\t"
  77988. #endif
  77989. "stm %[r]!, {r3, r4}\n\t"
  77990. "ldm %[b]!, {r5, r6}\n\t"
  77991. "ldm %[a]!, {r3, r4}\n\t"
  77992. #ifdef WOLFSSL_KEIL
  77993. "sbcs r3, r3, r5\n\t"
  77994. #elif defined(__clang__)
  77995. "sbcs r3, r5\n\t"
  77996. #else
  77997. "sbc r3, r5\n\t"
  77998. #endif
  77999. #ifdef WOLFSSL_KEIL
  78000. "sbcs r4, r4, r6\n\t"
  78001. #elif defined(__clang__)
  78002. "sbcs r4, r6\n\t"
  78003. #else
  78004. "sbc r4, r6\n\t"
  78005. #endif
  78006. "stm %[r]!, {r3, r4}\n\t"
  78007. "ldm %[b]!, {r5, r6}\n\t"
  78008. "ldm %[a]!, {r3, r4}\n\t"
  78009. #ifdef WOLFSSL_KEIL
  78010. "sbcs r3, r3, r5\n\t"
  78011. #elif defined(__clang__)
  78012. "sbcs r3, r5\n\t"
  78013. #else
  78014. "sbc r3, r5\n\t"
  78015. #endif
  78016. #ifdef WOLFSSL_KEIL
  78017. "sbcs r4, r4, r6\n\t"
  78018. #elif defined(__clang__)
  78019. "sbcs r4, r6\n\t"
  78020. #else
  78021. "sbc r4, r6\n\t"
  78022. #endif
  78023. "stm %[r]!, {r3, r4}\n\t"
  78024. "ldm %[b]!, {r5, r6}\n\t"
  78025. "ldm %[a]!, {r3, r4}\n\t"
  78026. #ifdef WOLFSSL_KEIL
  78027. "sbcs r3, r3, r5\n\t"
  78028. #elif defined(__clang__)
  78029. "sbcs r3, r5\n\t"
  78030. #else
  78031. "sbc r3, r5\n\t"
  78032. #endif
  78033. #ifdef WOLFSSL_KEIL
  78034. "sbcs r4, r4, r6\n\t"
  78035. #elif defined(__clang__)
  78036. "sbcs r4, r6\n\t"
  78037. #else
  78038. "sbc r4, r6\n\t"
  78039. #endif
  78040. "stm %[r]!, {r3, r4}\n\t"
  78041. "ldm %[b]!, {r5, r6}\n\t"
  78042. "ldm %[a]!, {r3, r4}\n\t"
  78043. #ifdef WOLFSSL_KEIL
  78044. "sbcs r3, r3, r5\n\t"
  78045. #elif defined(__clang__)
  78046. "sbcs r3, r5\n\t"
  78047. #else
  78048. "sbc r3, r5\n\t"
  78049. #endif
  78050. #ifdef WOLFSSL_KEIL
  78051. "sbcs r4, r4, r6\n\t"
  78052. #elif defined(__clang__)
  78053. "sbcs r4, r6\n\t"
  78054. #else
  78055. "sbc r4, r6\n\t"
  78056. #endif
  78057. "stm %[r]!, {r3, r4}\n\t"
  78058. "ldm %[b]!, {r5, r6}\n\t"
  78059. "ldm %[a]!, {r3, r4}\n\t"
  78060. #ifdef WOLFSSL_KEIL
  78061. "sbcs r3, r3, r5\n\t"
  78062. #elif defined(__clang__)
  78063. "sbcs r3, r5\n\t"
  78064. #else
  78065. "sbc r3, r5\n\t"
  78066. #endif
  78067. #ifdef WOLFSSL_KEIL
  78068. "sbcs r4, r4, r6\n\t"
  78069. #elif defined(__clang__)
  78070. "sbcs r4, r6\n\t"
  78071. #else
  78072. "sbc r4, r6\n\t"
  78073. #endif
  78074. "stm %[r]!, {r3, r4}\n\t"
  78075. "ldm %[b]!, {r5, r6}\n\t"
  78076. "ldm %[a]!, {r3, r4}\n\t"
  78077. #ifdef WOLFSSL_KEIL
  78078. "sbcs r3, r3, r5\n\t"
  78079. #elif defined(__clang__)
  78080. "sbcs r3, r5\n\t"
  78081. #else
  78082. "sbc r3, r5\n\t"
  78083. #endif
  78084. #ifdef WOLFSSL_KEIL
  78085. "sbcs r4, r4, r6\n\t"
  78086. #elif defined(__clang__)
  78087. "sbcs r4, r6\n\t"
  78088. #else
  78089. "sbc r4, r6\n\t"
  78090. #endif
  78091. "stm %[r]!, {r3, r4}\n\t"
  78092. "ldm %[b]!, {r5, r6}\n\t"
  78093. "ldm %[a]!, {r3, r4}\n\t"
  78094. #ifdef WOLFSSL_KEIL
  78095. "sbcs r3, r3, r5\n\t"
  78096. #elif defined(__clang__)
  78097. "sbcs r3, r5\n\t"
  78098. #else
  78099. "sbc r3, r5\n\t"
  78100. #endif
  78101. #ifdef WOLFSSL_KEIL
  78102. "sbcs r4, r4, r6\n\t"
  78103. #elif defined(__clang__)
  78104. "sbcs r4, r6\n\t"
  78105. #else
  78106. "sbc r4, r6\n\t"
  78107. #endif
  78108. "stm %[r]!, {r3, r4}\n\t"
  78109. "ldm %[b]!, {r5, r6}\n\t"
  78110. "ldm %[a]!, {r3, r4}\n\t"
  78111. #ifdef WOLFSSL_KEIL
  78112. "sbcs r3, r3, r5\n\t"
  78113. #elif defined(__clang__)
  78114. "sbcs r3, r5\n\t"
  78115. #else
  78116. "sbc r3, r5\n\t"
  78117. #endif
  78118. #ifdef WOLFSSL_KEIL
  78119. "sbcs r4, r4, r6\n\t"
  78120. #elif defined(__clang__)
  78121. "sbcs r4, r6\n\t"
  78122. #else
  78123. "sbc r4, r6\n\t"
  78124. #endif
  78125. "stm %[r]!, {r3, r4}\n\t"
  78126. "ldm %[b]!, {r5, r6}\n\t"
  78127. "ldm %[a]!, {r3, r4}\n\t"
  78128. #ifdef WOLFSSL_KEIL
  78129. "sbcs r3, r3, r5\n\t"
  78130. #elif defined(__clang__)
  78131. "sbcs r3, r5\n\t"
  78132. #else
  78133. "sbc r3, r5\n\t"
  78134. #endif
  78135. #ifdef WOLFSSL_KEIL
  78136. "sbcs r4, r4, r6\n\t"
  78137. #elif defined(__clang__)
  78138. "sbcs r4, r6\n\t"
  78139. #else
  78140. "sbc r4, r6\n\t"
  78141. #endif
  78142. "stm %[r]!, {r3, r4}\n\t"
  78143. "ldm %[b]!, {r5, r6}\n\t"
  78144. "ldm %[a]!, {r3, r4}\n\t"
  78145. #ifdef WOLFSSL_KEIL
  78146. "sbcs r3, r3, r5\n\t"
  78147. #elif defined(__clang__)
  78148. "sbcs r3, r5\n\t"
  78149. #else
  78150. "sbc r3, r5\n\t"
  78151. #endif
  78152. #ifdef WOLFSSL_KEIL
  78153. "sbcs r4, r4, r6\n\t"
  78154. #elif defined(__clang__)
  78155. "sbcs r4, r6\n\t"
  78156. #else
  78157. "sbc r4, r6\n\t"
  78158. #endif
  78159. "stm %[r]!, {r3, r4}\n\t"
  78160. "ldm %[b]!, {r5, r6}\n\t"
  78161. "ldm %[a]!, {r3, r4}\n\t"
  78162. #ifdef WOLFSSL_KEIL
  78163. "sbcs r3, r3, r5\n\t"
  78164. #elif defined(__clang__)
  78165. "sbcs r3, r5\n\t"
  78166. #else
  78167. "sbc r3, r5\n\t"
  78168. #endif
  78169. #ifdef WOLFSSL_KEIL
  78170. "sbcs r4, r4, r6\n\t"
  78171. #elif defined(__clang__)
  78172. "sbcs r4, r6\n\t"
  78173. #else
  78174. "sbc r4, r6\n\t"
  78175. #endif
  78176. "stm %[r]!, {r3, r4}\n\t"
  78177. "ldm %[b]!, {r5, r6}\n\t"
  78178. "ldm %[a]!, {r3, r4}\n\t"
  78179. #ifdef WOLFSSL_KEIL
  78180. "sbcs r3, r3, r5\n\t"
  78181. #elif defined(__clang__)
  78182. "sbcs r3, r5\n\t"
  78183. #else
  78184. "sbc r3, r5\n\t"
  78185. #endif
  78186. #ifdef WOLFSSL_KEIL
  78187. "sbcs r4, r4, r6\n\t"
  78188. #elif defined(__clang__)
  78189. "sbcs r4, r6\n\t"
  78190. #else
  78191. "sbc r4, r6\n\t"
  78192. #endif
  78193. "stm %[r]!, {r3, r4}\n\t"
  78194. "ldm %[b]!, {r5, r6}\n\t"
  78195. "ldm %[a]!, {r3, r4}\n\t"
  78196. #ifdef WOLFSSL_KEIL
  78197. "sbcs r3, r3, r5\n\t"
  78198. #elif defined(__clang__)
  78199. "sbcs r3, r5\n\t"
  78200. #else
  78201. "sbc r3, r5\n\t"
  78202. #endif
  78203. #ifdef WOLFSSL_KEIL
  78204. "sbcs r4, r4, r6\n\t"
  78205. #elif defined(__clang__)
  78206. "sbcs r4, r6\n\t"
  78207. #else
  78208. "sbc r4, r6\n\t"
  78209. #endif
  78210. "stm %[r]!, {r3, r4}\n\t"
  78211. "ldm %[b]!, {r5, r6}\n\t"
  78212. "ldm %[a]!, {r3, r4}\n\t"
  78213. #ifdef WOLFSSL_KEIL
  78214. "sbcs r3, r3, r5\n\t"
  78215. #elif defined(__clang__)
  78216. "sbcs r3, r5\n\t"
  78217. #else
  78218. "sbc r3, r5\n\t"
  78219. #endif
  78220. #ifdef WOLFSSL_KEIL
  78221. "sbcs r4, r4, r6\n\t"
  78222. #elif defined(__clang__)
  78223. "sbcs r4, r6\n\t"
  78224. #else
  78225. "sbc r4, r6\n\t"
  78226. #endif
  78227. "stm %[r]!, {r3, r4}\n\t"
  78228. "ldm %[b]!, {r5, r6}\n\t"
  78229. "ldm %[a]!, {r3, r4}\n\t"
  78230. #ifdef WOLFSSL_KEIL
  78231. "sbcs r3, r3, r5\n\t"
  78232. #elif defined(__clang__)
  78233. "sbcs r3, r5\n\t"
  78234. #else
  78235. "sbc r3, r5\n\t"
  78236. #endif
  78237. #ifdef WOLFSSL_KEIL
  78238. "sbcs r4, r4, r6\n\t"
  78239. #elif defined(__clang__)
  78240. "sbcs r4, r6\n\t"
  78241. #else
  78242. "sbc r4, r6\n\t"
  78243. #endif
  78244. "stm %[r]!, {r3, r4}\n\t"
  78245. "ldm %[b]!, {r5, r6}\n\t"
  78246. "ldm %[a]!, {r3, r4}\n\t"
  78247. #ifdef WOLFSSL_KEIL
  78248. "sbcs r3, r3, r5\n\t"
  78249. #elif defined(__clang__)
  78250. "sbcs r3, r5\n\t"
  78251. #else
  78252. "sbc r3, r5\n\t"
  78253. #endif
  78254. #ifdef WOLFSSL_KEIL
  78255. "sbcs r4, r4, r6\n\t"
  78256. #elif defined(__clang__)
  78257. "sbcs r4, r6\n\t"
  78258. #else
  78259. "sbc r4, r6\n\t"
  78260. #endif
  78261. "stm %[r]!, {r3, r4}\n\t"
  78262. "ldm %[b]!, {r5, r6}\n\t"
  78263. "ldm %[a]!, {r3, r4}\n\t"
  78264. #ifdef WOLFSSL_KEIL
  78265. "sbcs r3, r3, r5\n\t"
  78266. #elif defined(__clang__)
  78267. "sbcs r3, r5\n\t"
  78268. #else
  78269. "sbc r3, r5\n\t"
  78270. #endif
  78271. #ifdef WOLFSSL_KEIL
  78272. "sbcs r4, r4, r6\n\t"
  78273. #elif defined(__clang__)
  78274. "sbcs r4, r6\n\t"
  78275. #else
  78276. "sbc r4, r6\n\t"
  78277. #endif
  78278. "stm %[r]!, {r3, r4}\n\t"
  78279. "ldm %[b]!, {r5, r6}\n\t"
  78280. "ldm %[a]!, {r3, r4}\n\t"
  78281. #ifdef WOLFSSL_KEIL
  78282. "sbcs r3, r3, r5\n\t"
  78283. #elif defined(__clang__)
  78284. "sbcs r3, r5\n\t"
  78285. #else
  78286. "sbc r3, r5\n\t"
  78287. #endif
  78288. #ifdef WOLFSSL_KEIL
  78289. "sbcs r4, r4, r6\n\t"
  78290. #elif defined(__clang__)
  78291. "sbcs r4, r6\n\t"
  78292. #else
  78293. "sbc r4, r6\n\t"
  78294. #endif
  78295. "stm %[r]!, {r3, r4}\n\t"
  78296. "ldm %[b]!, {r5, r6}\n\t"
  78297. "ldm %[a]!, {r3, r4}\n\t"
  78298. #ifdef WOLFSSL_KEIL
  78299. "sbcs r3, r3, r5\n\t"
  78300. #elif defined(__clang__)
  78301. "sbcs r3, r5\n\t"
  78302. #else
  78303. "sbc r3, r5\n\t"
  78304. #endif
  78305. #ifdef WOLFSSL_KEIL
  78306. "sbcs r4, r4, r6\n\t"
  78307. #elif defined(__clang__)
  78308. "sbcs r4, r6\n\t"
  78309. #else
  78310. "sbc r4, r6\n\t"
  78311. #endif
  78312. "stm %[r]!, {r3, r4}\n\t"
  78313. "ldm %[b]!, {r5, r6}\n\t"
  78314. "ldm %[a]!, {r3, r4}\n\t"
  78315. #ifdef WOLFSSL_KEIL
  78316. "sbcs r3, r3, r5\n\t"
  78317. #elif defined(__clang__)
  78318. "sbcs r3, r5\n\t"
  78319. #else
  78320. "sbc r3, r5\n\t"
  78321. #endif
  78322. #ifdef WOLFSSL_KEIL
  78323. "sbcs r4, r4, r6\n\t"
  78324. #elif defined(__clang__)
  78325. "sbcs r4, r6\n\t"
  78326. #else
  78327. "sbc r4, r6\n\t"
  78328. #endif
  78329. "stm %[r]!, {r3, r4}\n\t"
  78330. "ldm %[b]!, {r5, r6}\n\t"
  78331. "ldm %[a]!, {r3, r4}\n\t"
  78332. #ifdef WOLFSSL_KEIL
  78333. "sbcs r3, r3, r5\n\t"
  78334. #elif defined(__clang__)
  78335. "sbcs r3, r5\n\t"
  78336. #else
  78337. "sbc r3, r5\n\t"
  78338. #endif
  78339. #ifdef WOLFSSL_KEIL
  78340. "sbcs r4, r4, r6\n\t"
  78341. #elif defined(__clang__)
  78342. "sbcs r4, r6\n\t"
  78343. #else
  78344. "sbc r4, r6\n\t"
  78345. #endif
  78346. "stm %[r]!, {r3, r4}\n\t"
  78347. "ldm %[b]!, {r5, r6}\n\t"
  78348. "ldm %[a]!, {r3, r4}\n\t"
  78349. #ifdef WOLFSSL_KEIL
  78350. "sbcs r3, r3, r5\n\t"
  78351. #elif defined(__clang__)
  78352. "sbcs r3, r5\n\t"
  78353. #else
  78354. "sbc r3, r5\n\t"
  78355. #endif
  78356. #ifdef WOLFSSL_KEIL
  78357. "sbcs r4, r4, r6\n\t"
  78358. #elif defined(__clang__)
  78359. "sbcs r4, r6\n\t"
  78360. #else
  78361. "sbc r4, r6\n\t"
  78362. #endif
  78363. "stm %[r]!, {r3, r4}\n\t"
  78364. "ldm %[b]!, {r5, r6}\n\t"
  78365. "ldm %[a]!, {r3, r4}\n\t"
  78366. #ifdef WOLFSSL_KEIL
  78367. "sbcs r3, r3, r5\n\t"
  78368. #elif defined(__clang__)
  78369. "sbcs r3, r5\n\t"
  78370. #else
  78371. "sbc r3, r5\n\t"
  78372. #endif
  78373. #ifdef WOLFSSL_KEIL
  78374. "sbcs r4, r4, r6\n\t"
  78375. #elif defined(__clang__)
  78376. "sbcs r4, r6\n\t"
  78377. #else
  78378. "sbc r4, r6\n\t"
  78379. #endif
  78380. "stm %[r]!, {r3, r4}\n\t"
  78381. "ldm %[b]!, {r5, r6}\n\t"
  78382. "ldm %[a]!, {r3, r4}\n\t"
  78383. #ifdef WOLFSSL_KEIL
  78384. "sbcs r3, r3, r5\n\t"
  78385. #elif defined(__clang__)
  78386. "sbcs r3, r5\n\t"
  78387. #else
  78388. "sbc r3, r5\n\t"
  78389. #endif
  78390. #ifdef WOLFSSL_KEIL
  78391. "sbcs r4, r4, r6\n\t"
  78392. #elif defined(__clang__)
  78393. "sbcs r4, r6\n\t"
  78394. #else
  78395. "sbc r4, r6\n\t"
  78396. #endif
  78397. "stm %[r]!, {r3, r4}\n\t"
  78398. "ldm %[b]!, {r5, r6}\n\t"
  78399. "ldm %[a]!, {r3, r4}\n\t"
  78400. #ifdef WOLFSSL_KEIL
  78401. "sbcs r3, r3, r5\n\t"
  78402. #elif defined(__clang__)
  78403. "sbcs r3, r5\n\t"
  78404. #else
  78405. "sbc r3, r5\n\t"
  78406. #endif
  78407. #ifdef WOLFSSL_KEIL
  78408. "sbcs r4, r4, r6\n\t"
  78409. #elif defined(__clang__)
  78410. "sbcs r4, r6\n\t"
  78411. #else
  78412. "sbc r4, r6\n\t"
  78413. #endif
  78414. "stm %[r]!, {r3, r4}\n\t"
  78415. "ldm %[b]!, {r5, r6}\n\t"
  78416. "ldm %[a]!, {r3, r4}\n\t"
  78417. #ifdef WOLFSSL_KEIL
  78418. "sbcs r3, r3, r5\n\t"
  78419. #elif defined(__clang__)
  78420. "sbcs r3, r5\n\t"
  78421. #else
  78422. "sbc r3, r5\n\t"
  78423. #endif
  78424. #ifdef WOLFSSL_KEIL
  78425. "sbcs r4, r4, r6\n\t"
  78426. #elif defined(__clang__)
  78427. "sbcs r4, r6\n\t"
  78428. #else
  78429. "sbc r4, r6\n\t"
  78430. #endif
  78431. "stm %[r]!, {r3, r4}\n\t"
  78432. "ldm %[b]!, {r5, r6}\n\t"
  78433. "ldm %[a]!, {r3, r4}\n\t"
  78434. #ifdef WOLFSSL_KEIL
  78435. "sbcs r3, r3, r5\n\t"
  78436. #elif defined(__clang__)
  78437. "sbcs r3, r5\n\t"
  78438. #else
  78439. "sbc r3, r5\n\t"
  78440. #endif
  78441. #ifdef WOLFSSL_KEIL
  78442. "sbcs r4, r4, r6\n\t"
  78443. #elif defined(__clang__)
  78444. "sbcs r4, r6\n\t"
  78445. #else
  78446. "sbc r4, r6\n\t"
  78447. #endif
  78448. "stm %[r]!, {r3, r4}\n\t"
  78449. "ldm %[b]!, {r5, r6}\n\t"
  78450. "ldm %[a]!, {r3, r4}\n\t"
  78451. #ifdef WOLFSSL_KEIL
  78452. "sbcs r3, r3, r5\n\t"
  78453. #elif defined(__clang__)
  78454. "sbcs r3, r5\n\t"
  78455. #else
  78456. "sbc r3, r5\n\t"
  78457. #endif
  78458. #ifdef WOLFSSL_KEIL
  78459. "sbcs r4, r4, r6\n\t"
  78460. #elif defined(__clang__)
  78461. "sbcs r4, r6\n\t"
  78462. #else
  78463. "sbc r4, r6\n\t"
  78464. #endif
  78465. "stm %[r]!, {r3, r4}\n\t"
  78466. "ldm %[b]!, {r5, r6}\n\t"
  78467. "ldm %[a]!, {r3, r4}\n\t"
  78468. #ifdef WOLFSSL_KEIL
  78469. "sbcs r3, r3, r5\n\t"
  78470. #elif defined(__clang__)
  78471. "sbcs r3, r5\n\t"
  78472. #else
  78473. "sbc r3, r5\n\t"
  78474. #endif
  78475. #ifdef WOLFSSL_KEIL
  78476. "sbcs r4, r4, r6\n\t"
  78477. #elif defined(__clang__)
  78478. "sbcs r4, r6\n\t"
  78479. #else
  78480. "sbc r4, r6\n\t"
  78481. #endif
  78482. "stm %[r]!, {r3, r4}\n\t"
  78483. "ldm %[b]!, {r5, r6}\n\t"
  78484. "ldm %[a]!, {r3, r4}\n\t"
  78485. #ifdef WOLFSSL_KEIL
  78486. "sbcs r3, r3, r5\n\t"
  78487. #elif defined(__clang__)
  78488. "sbcs r3, r5\n\t"
  78489. #else
  78490. "sbc r3, r5\n\t"
  78491. #endif
  78492. #ifdef WOLFSSL_KEIL
  78493. "sbcs r4, r4, r6\n\t"
  78494. #elif defined(__clang__)
  78495. "sbcs r4, r6\n\t"
  78496. #else
  78497. "sbc r4, r6\n\t"
  78498. #endif
  78499. "stm %[r]!, {r3, r4}\n\t"
  78500. "ldm %[b]!, {r5, r6}\n\t"
  78501. "ldm %[a]!, {r3, r4}\n\t"
  78502. #ifdef WOLFSSL_KEIL
  78503. "sbcs r3, r3, r5\n\t"
  78504. #elif defined(__clang__)
  78505. "sbcs r3, r5\n\t"
  78506. #else
  78507. "sbc r3, r5\n\t"
  78508. #endif
  78509. #ifdef WOLFSSL_KEIL
  78510. "sbcs r4, r4, r6\n\t"
  78511. #elif defined(__clang__)
  78512. "sbcs r4, r6\n\t"
  78513. #else
  78514. "sbc r4, r6\n\t"
  78515. #endif
  78516. "stm %[r]!, {r3, r4}\n\t"
  78517. "ldm %[b]!, {r5, r6}\n\t"
  78518. "ldm %[a]!, {r3, r4}\n\t"
  78519. #ifdef WOLFSSL_KEIL
  78520. "sbcs r3, r3, r5\n\t"
  78521. #elif defined(__clang__)
  78522. "sbcs r3, r5\n\t"
  78523. #else
  78524. "sbc r3, r5\n\t"
  78525. #endif
  78526. #ifdef WOLFSSL_KEIL
  78527. "sbcs r4, r4, r6\n\t"
  78528. #elif defined(__clang__)
  78529. "sbcs r4, r6\n\t"
  78530. #else
  78531. "sbc r4, r6\n\t"
  78532. #endif
  78533. "stm %[r]!, {r3, r4}\n\t"
  78534. "ldm %[b]!, {r5, r6}\n\t"
  78535. "ldm %[a]!, {r3, r4}\n\t"
  78536. #ifdef WOLFSSL_KEIL
  78537. "sbcs r3, r3, r5\n\t"
  78538. #elif defined(__clang__)
  78539. "sbcs r3, r5\n\t"
  78540. #else
  78541. "sbc r3, r5\n\t"
  78542. #endif
  78543. #ifdef WOLFSSL_KEIL
  78544. "sbcs r4, r4, r6\n\t"
  78545. #elif defined(__clang__)
  78546. "sbcs r4, r6\n\t"
  78547. #else
  78548. "sbc r4, r6\n\t"
  78549. #endif
  78550. "stm %[r]!, {r3, r4}\n\t"
  78551. #ifdef WOLFSSL_KEIL
  78552. "sbcs %[r], %[r], %[r]\n\t"
  78553. #elif defined(__clang__)
  78554. "sbcs %[r], %[r]\n\t"
  78555. #else
  78556. "sbc %[r], %[r]\n\t"
  78557. #endif
  78558. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  78559. :
  78560. : "memory", "r3", "r4", "r5", "r6"
  78561. );
  78562. return (uint32_t)(size_t)r;
  78563. }
  78564. #endif /* WOLFSSL_SP_SMALL */
  78565. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  78566. *
  78567. * d1 The high order half of the number to divide.
  78568. * d0 The low order half of the number to divide.
  78569. * div The divisor.
  78570. * returns the result of the division.
  78571. *
  78572. * Note that this is an approximate div. It may give an answer 1 larger.
  78573. */
  78574. SP_NOINLINE static sp_digit div_3072_word_96(sp_digit d1, sp_digit d0,
  78575. sp_digit div)
  78576. {
  78577. __asm__ __volatile__ (
  78578. "movs r3, #0\n\t"
  78579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78580. "lsrs r5, %[div], #1\n\t"
  78581. #else
  78582. "lsr r5, %[div], #1\n\t"
  78583. #endif
  78584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78585. "adds r5, r5, #1\n\t"
  78586. #else
  78587. "add r5, r5, #1\n\t"
  78588. #endif
  78589. "mov r8, %[d0]\n\t"
  78590. "mov r9, %[d1]\n\t"
  78591. "# Do top 32\n\t"
  78592. "movs r6, r5\n\t"
  78593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78594. "subs r6, r6, %[d1]\n\t"
  78595. #else
  78596. "sub r6, r6, %[d1]\n\t"
  78597. #endif
  78598. #ifdef WOLFSSL_KEIL
  78599. "sbcs r6, r6, r6\n\t"
  78600. #elif defined(__clang__)
  78601. "sbcs r6, r6\n\t"
  78602. #else
  78603. "sbc r6, r6\n\t"
  78604. #endif
  78605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78606. "adds r3, r3, r3\n\t"
  78607. #else
  78608. "add r3, r3, r3\n\t"
  78609. #endif
  78610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78611. "subs r3, r3, r6\n\t"
  78612. #else
  78613. "sub r3, r3, r6\n\t"
  78614. #endif
  78615. #ifdef WOLFSSL_KEIL
  78616. "ands r6, r6, r5\n\t"
  78617. #elif defined(__clang__)
  78618. "ands r6, r5\n\t"
  78619. #else
  78620. "and r6, r5\n\t"
  78621. #endif
  78622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78623. "subs %[d1], %[d1], r6\n\t"
  78624. #else
  78625. "sub %[d1], %[d1], r6\n\t"
  78626. #endif
  78627. "movs r4, #29\n\t"
  78628. "\n"
  78629. "L_div_3072_word_96_loop_%=:\n\t"
  78630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78631. "lsls %[d0], %[d0], #1\n\t"
  78632. #else
  78633. "lsl %[d0], %[d0], #1\n\t"
  78634. #endif
  78635. #ifdef WOLFSSL_KEIL
  78636. "adcs %[d1], %[d1], %[d1]\n\t"
  78637. #elif defined(__clang__)
  78638. "adcs %[d1], %[d1]\n\t"
  78639. #else
  78640. "adc %[d1], %[d1]\n\t"
  78641. #endif
  78642. "movs r6, r5\n\t"
  78643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78644. "subs r6, r6, %[d1]\n\t"
  78645. #else
  78646. "sub r6, r6, %[d1]\n\t"
  78647. #endif
  78648. #ifdef WOLFSSL_KEIL
  78649. "sbcs r6, r6, r6\n\t"
  78650. #elif defined(__clang__)
  78651. "sbcs r6, r6\n\t"
  78652. #else
  78653. "sbc r6, r6\n\t"
  78654. #endif
  78655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78656. "adds r3, r3, r3\n\t"
  78657. #else
  78658. "add r3, r3, r3\n\t"
  78659. #endif
  78660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78661. "subs r3, r3, r6\n\t"
  78662. #else
  78663. "sub r3, r3, r6\n\t"
  78664. #endif
  78665. #ifdef WOLFSSL_KEIL
  78666. "ands r6, r6, r5\n\t"
  78667. #elif defined(__clang__)
  78668. "ands r6, r5\n\t"
  78669. #else
  78670. "and r6, r5\n\t"
  78671. #endif
  78672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78673. "subs %[d1], %[d1], r6\n\t"
  78674. #else
  78675. "sub %[d1], %[d1], r6\n\t"
  78676. #endif
  78677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78678. "subs r4, r4, #1\n\t"
  78679. #else
  78680. "sub r4, r4, #1\n\t"
  78681. #endif
  78682. "bpl L_div_3072_word_96_loop_%=\n\t"
  78683. "movs r7, #0\n\t"
  78684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78685. "adds r3, r3, r3\n\t"
  78686. #else
  78687. "add r3, r3, r3\n\t"
  78688. #endif
  78689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78690. "adds r3, r3, #1\n\t"
  78691. #else
  78692. "add r3, r3, #1\n\t"
  78693. #endif
  78694. "# r * div - Start\n\t"
  78695. "uxth %[d1], r3\n\t"
  78696. "uxth r4, %[div]\n\t"
  78697. #ifdef WOLFSSL_KEIL
  78698. "muls r4, %[d1], r4\n\t"
  78699. #elif defined(__clang__)
  78700. "muls r4, %[d1]\n\t"
  78701. #else
  78702. "mul r4, %[d1]\n\t"
  78703. #endif
  78704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78705. "lsrs r6, %[div], #16\n\t"
  78706. #else
  78707. "lsr r6, %[div], #16\n\t"
  78708. #endif
  78709. #ifdef WOLFSSL_KEIL
  78710. "muls %[d1], r6, %[d1]\n\t"
  78711. #elif defined(__clang__)
  78712. "muls %[d1], r6\n\t"
  78713. #else
  78714. "mul %[d1], r6\n\t"
  78715. #endif
  78716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78717. "lsrs r5, %[d1], #16\n\t"
  78718. #else
  78719. "lsr r5, %[d1], #16\n\t"
  78720. #endif
  78721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78722. "lsls %[d1], %[d1], #16\n\t"
  78723. #else
  78724. "lsl %[d1], %[d1], #16\n\t"
  78725. #endif
  78726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78727. "adds r4, r4, %[d1]\n\t"
  78728. #else
  78729. "add r4, r4, %[d1]\n\t"
  78730. #endif
  78731. #ifdef WOLFSSL_KEIL
  78732. "adcs r5, r5, r7\n\t"
  78733. #elif defined(__clang__)
  78734. "adcs r5, r7\n\t"
  78735. #else
  78736. "adc r5, r7\n\t"
  78737. #endif
  78738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78739. "lsrs %[d1], r3, #16\n\t"
  78740. #else
  78741. "lsr %[d1], r3, #16\n\t"
  78742. #endif
  78743. #ifdef WOLFSSL_KEIL
  78744. "muls r6, %[d1], r6\n\t"
  78745. #elif defined(__clang__)
  78746. "muls r6, %[d1]\n\t"
  78747. #else
  78748. "mul r6, %[d1]\n\t"
  78749. #endif
  78750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78751. "adds r5, r5, r6\n\t"
  78752. #else
  78753. "add r5, r5, r6\n\t"
  78754. #endif
  78755. "uxth r6, %[div]\n\t"
  78756. #ifdef WOLFSSL_KEIL
  78757. "muls %[d1], r6, %[d1]\n\t"
  78758. #elif defined(__clang__)
  78759. "muls %[d1], r6\n\t"
  78760. #else
  78761. "mul %[d1], r6\n\t"
  78762. #endif
  78763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78764. "lsrs r6, %[d1], #16\n\t"
  78765. #else
  78766. "lsr r6, %[d1], #16\n\t"
  78767. #endif
  78768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78769. "lsls %[d1], %[d1], #16\n\t"
  78770. #else
  78771. "lsl %[d1], %[d1], #16\n\t"
  78772. #endif
  78773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78774. "adds r4, r4, %[d1]\n\t"
  78775. #else
  78776. "add r4, r4, %[d1]\n\t"
  78777. #endif
  78778. #ifdef WOLFSSL_KEIL
  78779. "adcs r5, r5, r6\n\t"
  78780. #elif defined(__clang__)
  78781. "adcs r5, r6\n\t"
  78782. #else
  78783. "adc r5, r6\n\t"
  78784. #endif
  78785. "# r * div - Done\n\t"
  78786. "mov %[d1], r8\n\t"
  78787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78788. "subs %[d1], %[d1], r4\n\t"
  78789. #else
  78790. "sub %[d1], %[d1], r4\n\t"
  78791. #endif
  78792. "movs r4, %[d1]\n\t"
  78793. "mov %[d1], r9\n\t"
  78794. #ifdef WOLFSSL_KEIL
  78795. "sbcs %[d1], %[d1], r5\n\t"
  78796. #elif defined(__clang__)
  78797. "sbcs %[d1], r5\n\t"
  78798. #else
  78799. "sbc %[d1], r5\n\t"
  78800. #endif
  78801. "movs r5, %[d1]\n\t"
  78802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78803. "adds r3, r3, r5\n\t"
  78804. #else
  78805. "add r3, r3, r5\n\t"
  78806. #endif
  78807. "# r * div - Start\n\t"
  78808. "uxth %[d1], r3\n\t"
  78809. "uxth r4, %[div]\n\t"
  78810. #ifdef WOLFSSL_KEIL
  78811. "muls r4, %[d1], r4\n\t"
  78812. #elif defined(__clang__)
  78813. "muls r4, %[d1]\n\t"
  78814. #else
  78815. "mul r4, %[d1]\n\t"
  78816. #endif
  78817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78818. "lsrs r6, %[div], #16\n\t"
  78819. #else
  78820. "lsr r6, %[div], #16\n\t"
  78821. #endif
  78822. #ifdef WOLFSSL_KEIL
  78823. "muls %[d1], r6, %[d1]\n\t"
  78824. #elif defined(__clang__)
  78825. "muls %[d1], r6\n\t"
  78826. #else
  78827. "mul %[d1], r6\n\t"
  78828. #endif
  78829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78830. "lsrs r5, %[d1], #16\n\t"
  78831. #else
  78832. "lsr r5, %[d1], #16\n\t"
  78833. #endif
  78834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78835. "lsls %[d1], %[d1], #16\n\t"
  78836. #else
  78837. "lsl %[d1], %[d1], #16\n\t"
  78838. #endif
  78839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78840. "adds r4, r4, %[d1]\n\t"
  78841. #else
  78842. "add r4, r4, %[d1]\n\t"
  78843. #endif
  78844. #ifdef WOLFSSL_KEIL
  78845. "adcs r5, r5, r7\n\t"
  78846. #elif defined(__clang__)
  78847. "adcs r5, r7\n\t"
  78848. #else
  78849. "adc r5, r7\n\t"
  78850. #endif
  78851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78852. "lsrs %[d1], r3, #16\n\t"
  78853. #else
  78854. "lsr %[d1], r3, #16\n\t"
  78855. #endif
  78856. #ifdef WOLFSSL_KEIL
  78857. "muls r6, %[d1], r6\n\t"
  78858. #elif defined(__clang__)
  78859. "muls r6, %[d1]\n\t"
  78860. #else
  78861. "mul r6, %[d1]\n\t"
  78862. #endif
  78863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78864. "adds r5, r5, r6\n\t"
  78865. #else
  78866. "add r5, r5, r6\n\t"
  78867. #endif
  78868. "uxth r6, %[div]\n\t"
  78869. #ifdef WOLFSSL_KEIL
  78870. "muls %[d1], r6, %[d1]\n\t"
  78871. #elif defined(__clang__)
  78872. "muls %[d1], r6\n\t"
  78873. #else
  78874. "mul %[d1], r6\n\t"
  78875. #endif
  78876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78877. "lsrs r6, %[d1], #16\n\t"
  78878. #else
  78879. "lsr r6, %[d1], #16\n\t"
  78880. #endif
  78881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78882. "lsls %[d1], %[d1], #16\n\t"
  78883. #else
  78884. "lsl %[d1], %[d1], #16\n\t"
  78885. #endif
  78886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78887. "adds r4, r4, %[d1]\n\t"
  78888. #else
  78889. "add r4, r4, %[d1]\n\t"
  78890. #endif
  78891. #ifdef WOLFSSL_KEIL
  78892. "adcs r5, r5, r6\n\t"
  78893. #elif defined(__clang__)
  78894. "adcs r5, r6\n\t"
  78895. #else
  78896. "adc r5, r6\n\t"
  78897. #endif
  78898. "# r * div - Done\n\t"
  78899. "mov %[d1], r8\n\t"
  78900. "mov r6, r9\n\t"
  78901. #ifdef WOLFSSL_KEIL
  78902. "subs r4, %[d1], r4\n\t"
  78903. #else
  78904. #ifdef __clang__
  78905. "subs r4, %[d1], r4\n\t"
  78906. #else
  78907. "sub r4, %[d1], r4\n\t"
  78908. #endif
  78909. #endif
  78910. #ifdef WOLFSSL_KEIL
  78911. "sbcs r6, r6, r5\n\t"
  78912. #elif defined(__clang__)
  78913. "sbcs r6, r5\n\t"
  78914. #else
  78915. "sbc r6, r5\n\t"
  78916. #endif
  78917. "movs r5, r6\n\t"
  78918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78919. "adds r3, r3, r5\n\t"
  78920. #else
  78921. "add r3, r3, r5\n\t"
  78922. #endif
  78923. "# r * div - Start\n\t"
  78924. "uxth %[d1], r3\n\t"
  78925. "uxth r4, %[div]\n\t"
  78926. #ifdef WOLFSSL_KEIL
  78927. "muls r4, %[d1], r4\n\t"
  78928. #elif defined(__clang__)
  78929. "muls r4, %[d1]\n\t"
  78930. #else
  78931. "mul r4, %[d1]\n\t"
  78932. #endif
  78933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78934. "lsrs r6, %[div], #16\n\t"
  78935. #else
  78936. "lsr r6, %[div], #16\n\t"
  78937. #endif
  78938. #ifdef WOLFSSL_KEIL
  78939. "muls %[d1], r6, %[d1]\n\t"
  78940. #elif defined(__clang__)
  78941. "muls %[d1], r6\n\t"
  78942. #else
  78943. "mul %[d1], r6\n\t"
  78944. #endif
  78945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78946. "lsrs r5, %[d1], #16\n\t"
  78947. #else
  78948. "lsr r5, %[d1], #16\n\t"
  78949. #endif
  78950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78951. "lsls %[d1], %[d1], #16\n\t"
  78952. #else
  78953. "lsl %[d1], %[d1], #16\n\t"
  78954. #endif
  78955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78956. "adds r4, r4, %[d1]\n\t"
  78957. #else
  78958. "add r4, r4, %[d1]\n\t"
  78959. #endif
  78960. #ifdef WOLFSSL_KEIL
  78961. "adcs r5, r5, r7\n\t"
  78962. #elif defined(__clang__)
  78963. "adcs r5, r7\n\t"
  78964. #else
  78965. "adc r5, r7\n\t"
  78966. #endif
  78967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78968. "lsrs %[d1], r3, #16\n\t"
  78969. #else
  78970. "lsr %[d1], r3, #16\n\t"
  78971. #endif
  78972. #ifdef WOLFSSL_KEIL
  78973. "muls r6, %[d1], r6\n\t"
  78974. #elif defined(__clang__)
  78975. "muls r6, %[d1]\n\t"
  78976. #else
  78977. "mul r6, %[d1]\n\t"
  78978. #endif
  78979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78980. "adds r5, r5, r6\n\t"
  78981. #else
  78982. "add r5, r5, r6\n\t"
  78983. #endif
  78984. "uxth r6, %[div]\n\t"
  78985. #ifdef WOLFSSL_KEIL
  78986. "muls %[d1], r6, %[d1]\n\t"
  78987. #elif defined(__clang__)
  78988. "muls %[d1], r6\n\t"
  78989. #else
  78990. "mul %[d1], r6\n\t"
  78991. #endif
  78992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78993. "lsrs r6, %[d1], #16\n\t"
  78994. #else
  78995. "lsr r6, %[d1], #16\n\t"
  78996. #endif
  78997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78998. "lsls %[d1], %[d1], #16\n\t"
  78999. #else
  79000. "lsl %[d1], %[d1], #16\n\t"
  79001. #endif
  79002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79003. "adds r4, r4, %[d1]\n\t"
  79004. #else
  79005. "add r4, r4, %[d1]\n\t"
  79006. #endif
  79007. #ifdef WOLFSSL_KEIL
  79008. "adcs r5, r5, r6\n\t"
  79009. #elif defined(__clang__)
  79010. "adcs r5, r6\n\t"
  79011. #else
  79012. "adc r5, r6\n\t"
  79013. #endif
  79014. "# r * div - Done\n\t"
  79015. "mov %[d1], r8\n\t"
  79016. "mov r6, r9\n\t"
  79017. #ifdef WOLFSSL_KEIL
  79018. "subs r4, %[d1], r4\n\t"
  79019. #else
  79020. #ifdef __clang__
  79021. "subs r4, %[d1], r4\n\t"
  79022. #else
  79023. "sub r4, %[d1], r4\n\t"
  79024. #endif
  79025. #endif
  79026. #ifdef WOLFSSL_KEIL
  79027. "sbcs r6, r6, r5\n\t"
  79028. #elif defined(__clang__)
  79029. "sbcs r6, r5\n\t"
  79030. #else
  79031. "sbc r6, r5\n\t"
  79032. #endif
  79033. "movs r5, r6\n\t"
  79034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79035. "adds r3, r3, r5\n\t"
  79036. #else
  79037. "add r3, r3, r5\n\t"
  79038. #endif
  79039. "# r * div - Start\n\t"
  79040. "uxth %[d1], r3\n\t"
  79041. "uxth r4, %[div]\n\t"
  79042. #ifdef WOLFSSL_KEIL
  79043. "muls r4, %[d1], r4\n\t"
  79044. #elif defined(__clang__)
  79045. "muls r4, %[d1]\n\t"
  79046. #else
  79047. "mul r4, %[d1]\n\t"
  79048. #endif
  79049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79050. "lsrs r6, %[div], #16\n\t"
  79051. #else
  79052. "lsr r6, %[div], #16\n\t"
  79053. #endif
  79054. #ifdef WOLFSSL_KEIL
  79055. "muls %[d1], r6, %[d1]\n\t"
  79056. #elif defined(__clang__)
  79057. "muls %[d1], r6\n\t"
  79058. #else
  79059. "mul %[d1], r6\n\t"
  79060. #endif
  79061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79062. "lsrs r5, %[d1], #16\n\t"
  79063. #else
  79064. "lsr r5, %[d1], #16\n\t"
  79065. #endif
  79066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79067. "lsls %[d1], %[d1], #16\n\t"
  79068. #else
  79069. "lsl %[d1], %[d1], #16\n\t"
  79070. #endif
  79071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79072. "adds r4, r4, %[d1]\n\t"
  79073. #else
  79074. "add r4, r4, %[d1]\n\t"
  79075. #endif
  79076. #ifdef WOLFSSL_KEIL
  79077. "adcs r5, r5, r7\n\t"
  79078. #elif defined(__clang__)
  79079. "adcs r5, r7\n\t"
  79080. #else
  79081. "adc r5, r7\n\t"
  79082. #endif
  79083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79084. "lsrs %[d1], r3, #16\n\t"
  79085. #else
  79086. "lsr %[d1], r3, #16\n\t"
  79087. #endif
  79088. #ifdef WOLFSSL_KEIL
  79089. "muls r6, %[d1], r6\n\t"
  79090. #elif defined(__clang__)
  79091. "muls r6, %[d1]\n\t"
  79092. #else
  79093. "mul r6, %[d1]\n\t"
  79094. #endif
  79095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79096. "adds r5, r5, r6\n\t"
  79097. #else
  79098. "add r5, r5, r6\n\t"
  79099. #endif
  79100. "uxth r6, %[div]\n\t"
  79101. #ifdef WOLFSSL_KEIL
  79102. "muls %[d1], r6, %[d1]\n\t"
  79103. #elif defined(__clang__)
  79104. "muls %[d1], r6\n\t"
  79105. #else
  79106. "mul %[d1], r6\n\t"
  79107. #endif
  79108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79109. "lsrs r6, %[d1], #16\n\t"
  79110. #else
  79111. "lsr r6, %[d1], #16\n\t"
  79112. #endif
  79113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79114. "lsls %[d1], %[d1], #16\n\t"
  79115. #else
  79116. "lsl %[d1], %[d1], #16\n\t"
  79117. #endif
  79118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79119. "adds r4, r4, %[d1]\n\t"
  79120. #else
  79121. "add r4, r4, %[d1]\n\t"
  79122. #endif
  79123. #ifdef WOLFSSL_KEIL
  79124. "adcs r5, r5, r6\n\t"
  79125. #elif defined(__clang__)
  79126. "adcs r5, r6\n\t"
  79127. #else
  79128. "adc r5, r6\n\t"
  79129. #endif
  79130. "# r * div - Done\n\t"
  79131. "mov %[d1], r8\n\t"
  79132. "mov r6, r9\n\t"
  79133. #ifdef WOLFSSL_KEIL
  79134. "subs r4, %[d1], r4\n\t"
  79135. #else
  79136. #ifdef __clang__
  79137. "subs r4, %[d1], r4\n\t"
  79138. #else
  79139. "sub r4, %[d1], r4\n\t"
  79140. #endif
  79141. #endif
  79142. #ifdef WOLFSSL_KEIL
  79143. "sbcs r6, r6, r5\n\t"
  79144. #elif defined(__clang__)
  79145. "sbcs r6, r5\n\t"
  79146. #else
  79147. "sbc r6, r5\n\t"
  79148. #endif
  79149. "movs r5, r6\n\t"
  79150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79151. "adds r3, r3, r5\n\t"
  79152. #else
  79153. "add r3, r3, r5\n\t"
  79154. #endif
  79155. "movs r6, %[div]\n\t"
  79156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79157. "subs r6, r6, r4\n\t"
  79158. #else
  79159. "sub r6, r6, r4\n\t"
  79160. #endif
  79161. #ifdef WOLFSSL_KEIL
  79162. "sbcs r6, r6, r6\n\t"
  79163. #elif defined(__clang__)
  79164. "sbcs r6, r6\n\t"
  79165. #else
  79166. "sbc r6, r6\n\t"
  79167. #endif
  79168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79169. "subs r3, r3, r6\n\t"
  79170. #else
  79171. "sub r3, r3, r6\n\t"
  79172. #endif
  79173. "movs %[d1], r3\n\t"
  79174. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  79175. :
  79176. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  79177. );
  79178. return (uint32_t)(size_t)d1;
  79179. }
  79180. /* Divide d in a and put remainder into r (m*d + r = a)
  79181. * m is not calculated as it is not needed at this time.
  79182. *
  79183. * a Number to be divided.
  79184. * d Number to divide with.
  79185. * m Multiplier result.
  79186. * r Remainder from the division.
  79187. * returns MP_OKAY indicating success.
  79188. */
  79189. static WC_INLINE int sp_3072_div_96_cond(const sp_digit* a, const sp_digit* d,
  79190. sp_digit* m, sp_digit* r)
  79191. {
  79192. sp_digit t1[192], t2[97];
  79193. sp_digit div, r1;
  79194. int i;
  79195. (void)m;
  79196. div = d[95];
  79197. XMEMCPY(t1, a, sizeof(*t1) * 2 * 96);
  79198. for (i = 95; i > 0; i--) {
  79199. if (t1[i + 96] != d[i])
  79200. break;
  79201. }
  79202. if (t1[i + 96] >= d[i]) {
  79203. sp_3072_sub_in_place_96(&t1[96], d);
  79204. }
  79205. for (i = 95; i >= 0; i--) {
  79206. if (t1[96 + i] == div) {
  79207. r1 = SP_DIGIT_MAX;
  79208. }
  79209. else {
  79210. r1 = div_3072_word_96(t1[96 + i], t1[96 + i - 1], div);
  79211. }
  79212. sp_3072_mul_d_96(t2, d, r1);
  79213. t1[96 + i] += sp_3072_sub_in_place_96(&t1[i], t2);
  79214. t1[96 + i] -= t2[96];
  79215. if (t1[96 + i] != 0) {
  79216. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], d);
  79217. if (t1[96 + i] != 0)
  79218. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], d);
  79219. }
  79220. }
  79221. for (i = 95; i > 0; i--) {
  79222. if (t1[i] != d[i])
  79223. break;
  79224. }
  79225. if (t1[i] >= d[i]) {
  79226. sp_3072_sub_96(r, t1, d);
  79227. }
  79228. else {
  79229. XMEMCPY(r, t1, sizeof(*t1) * 96);
  79230. }
  79231. return MP_OKAY;
  79232. }
  79233. /* Reduce a modulo m into r. (r = a mod m)
  79234. *
  79235. * r A single precision number that is the reduced result.
  79236. * a A single precision number that is to be reduced.
  79237. * m A single precision number that is the modulus to reduce with.
  79238. * returns MP_OKAY indicating success.
  79239. */
  79240. static WC_INLINE int sp_3072_mod_96_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
  79241. {
  79242. int ret;
  79243. ret = sp_3072_div_96_cond(a, m, NULL, r);
  79244. return ret;
  79245. }
  79246. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  79247. /* AND m into each word of a and store in r.
  79248. *
  79249. * r A single precision integer.
  79250. * a A single precision integer.
  79251. * m Mask to AND against each digit.
  79252. */
  79253. static void sp_3072_mask_96(sp_digit* r, const sp_digit* a, sp_digit m)
  79254. {
  79255. #ifdef WOLFSSL_SP_SMALL
  79256. int i;
  79257. for (i=0; i<96; i++) {
  79258. r[i] = a[i] & m;
  79259. }
  79260. #else
  79261. int i;
  79262. for (i = 0; i < 96; i += 8) {
  79263. r[i+0] = a[i+0] & m;
  79264. r[i+1] = a[i+1] & m;
  79265. r[i+2] = a[i+2] & m;
  79266. r[i+3] = a[i+3] & m;
  79267. r[i+4] = a[i+4] & m;
  79268. r[i+5] = a[i+5] & m;
  79269. r[i+6] = a[i+6] & m;
  79270. r[i+7] = a[i+7] & m;
  79271. }
  79272. #endif
  79273. }
  79274. /* Compare a with b in constant time.
  79275. *
  79276. * a A single precision integer.
  79277. * b A single precision integer.
  79278. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  79279. * respectively.
  79280. */
  79281. SP_NOINLINE static sp_int32 sp_3072_cmp_96(const sp_digit* a, const sp_digit* b)
  79282. {
  79283. __asm__ __volatile__ (
  79284. "movs r2, #0\n\t"
  79285. "movs r3, #0\n\t"
  79286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79287. "mvns r3, r3\n\t"
  79288. #else
  79289. "mvn r3, r3\n\t"
  79290. #endif
  79291. "movs r6, #0xff\n\t"
  79292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79293. "adds r6, r6, #0x7d\n\t"
  79294. #else
  79295. "add r6, r6, #0x7d\n\t"
  79296. #endif
  79297. "\n"
  79298. "L_sp_3072_cmp_96_words_%=:\n\t"
  79299. "ldr r7, [%[a], r6]\n\t"
  79300. "ldr r5, [%[b], r6]\n\t"
  79301. #ifdef WOLFSSL_KEIL
  79302. "ands r7, r7, r3\n\t"
  79303. #elif defined(__clang__)
  79304. "ands r7, r3\n\t"
  79305. #else
  79306. "and r7, r3\n\t"
  79307. #endif
  79308. #ifdef WOLFSSL_KEIL
  79309. "ands r5, r5, r3\n\t"
  79310. #elif defined(__clang__)
  79311. "ands r5, r3\n\t"
  79312. #else
  79313. "and r5, r3\n\t"
  79314. #endif
  79315. "movs r4, r7\n\t"
  79316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79317. "subs r7, r7, r5\n\t"
  79318. #else
  79319. "sub r7, r7, r5\n\t"
  79320. #endif
  79321. #ifdef WOLFSSL_KEIL
  79322. "sbcs r7, r7, r7\n\t"
  79323. #elif defined(__clang__)
  79324. "sbcs r7, r7\n\t"
  79325. #else
  79326. "sbc r7, r7\n\t"
  79327. #endif
  79328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79329. "adds r2, r2, r7\n\t"
  79330. #else
  79331. "add r2, r2, r7\n\t"
  79332. #endif
  79333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79334. "mvns r7, r7\n\t"
  79335. #else
  79336. "mvn r7, r7\n\t"
  79337. #endif
  79338. #ifdef WOLFSSL_KEIL
  79339. "ands r3, r3, r7\n\t"
  79340. #elif defined(__clang__)
  79341. "ands r3, r7\n\t"
  79342. #else
  79343. "and r3, r7\n\t"
  79344. #endif
  79345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79346. "subs r5, r5, r4\n\t"
  79347. #else
  79348. "sub r5, r5, r4\n\t"
  79349. #endif
  79350. #ifdef WOLFSSL_KEIL
  79351. "sbcs r7, r7, r7\n\t"
  79352. #elif defined(__clang__)
  79353. "sbcs r7, r7\n\t"
  79354. #else
  79355. "sbc r7, r7\n\t"
  79356. #endif
  79357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79358. "subs r2, r2, r7\n\t"
  79359. #else
  79360. "sub r2, r2, r7\n\t"
  79361. #endif
  79362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79363. "mvns r7, r7\n\t"
  79364. #else
  79365. "mvn r7, r7\n\t"
  79366. #endif
  79367. #ifdef WOLFSSL_KEIL
  79368. "ands r3, r3, r7\n\t"
  79369. #elif defined(__clang__)
  79370. "ands r3, r7\n\t"
  79371. #else
  79372. "and r3, r7\n\t"
  79373. #endif
  79374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79375. "subs r6, r6, #4\n\t"
  79376. #else
  79377. "sub r6, r6, #4\n\t"
  79378. #endif
  79379. "bge L_sp_3072_cmp_96_words_%=\n\t"
  79380. "movs %[a], r2\n\t"
  79381. : [a] "+l" (a), [b] "+l" (b)
  79382. :
  79383. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  79384. );
  79385. return (uint32_t)(size_t)a;
  79386. }
  79387. /* Divide d in a and put remainder into r (m*d + r = a)
  79388. * m is not calculated as it is not needed at this time.
  79389. *
  79390. * a Number to be divided.
  79391. * d Number to divide with.
  79392. * m Multiplier result.
  79393. * r Remainder from the division.
  79394. * returns MP_OKAY indicating success.
  79395. */
  79396. static WC_INLINE int sp_3072_div_96(const sp_digit* a, const sp_digit* d,
  79397. sp_digit* m, sp_digit* r)
  79398. {
  79399. sp_digit t1[192], t2[97];
  79400. sp_digit div, r1;
  79401. int i;
  79402. (void)m;
  79403. div = d[95];
  79404. XMEMCPY(t1, a, sizeof(*t1) * 2 * 96);
  79405. r1 = sp_3072_cmp_96(&t1[96], d) >= 0;
  79406. sp_3072_cond_sub_96(&t1[96], &t1[96], d, (sp_digit)0 - r1);
  79407. for (i = 95; i >= 0; i--) {
  79408. volatile sp_digit mask = (sp_digit)0 - (t1[96 + i] == div);
  79409. sp_digit hi = t1[96 + i] + mask;
  79410. r1 = div_3072_word_96(hi, t1[96 + i - 1], div);
  79411. r1 |= mask;
  79412. sp_3072_mul_d_96(t2, d, r1);
  79413. t1[96 + i] += sp_3072_sub_in_place_96(&t1[i], t2);
  79414. t1[96 + i] -= t2[96];
  79415. sp_3072_mask_96(t2, d, t1[96 + i]);
  79416. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], t2);
  79417. sp_3072_mask_96(t2, d, t1[96 + i]);
  79418. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], t2);
  79419. }
  79420. r1 = sp_3072_cmp_96(t1, d) >= 0;
  79421. sp_3072_cond_sub_96(r, t1, d, (sp_digit)0 - r1);
  79422. return MP_OKAY;
  79423. }
  79424. /* Reduce a modulo m into r. (r = a mod m)
  79425. *
  79426. * r A single precision number that is the reduced result.
  79427. * a A single precision number that is to be reduced.
  79428. * m A single precision number that is the modulus to reduce with.
  79429. * returns MP_OKAY indicating success.
  79430. */
  79431. static WC_INLINE int sp_3072_mod_96(sp_digit* r, const sp_digit* a, const sp_digit* m)
  79432. {
  79433. int ret;
  79434. ret = sp_3072_div_96(a, m, NULL, r);
  79435. return ret;
  79436. }
  79437. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  79438. defined(WOLFSSL_HAVE_SP_DH)
  79439. #ifdef WOLFSSL_SP_SMALL
  79440. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  79441. *
  79442. * r A single precision number that is the result of the operation.
  79443. * a A single precision number being exponentiated.
  79444. * e A single precision number that is the exponent.
  79445. * bits The number of bits in the exponent.
  79446. * m A single precision number that is the modulus.
  79447. * returns 0 on success.
  79448. * returns MEMORY_E on dynamic memory allocation failure.
  79449. * returns MP_VAL when base is even or exponent is 0.
  79450. */
  79451. static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e,
  79452. int bits, const sp_digit* m, int reduceA)
  79453. {
  79454. #ifdef WOLFSSL_SP_SMALL_STACK
  79455. sp_digit* td = NULL;
  79456. #else
  79457. sp_digit td[8 * 192];
  79458. #endif
  79459. sp_digit* t[8];
  79460. sp_digit* norm = NULL;
  79461. sp_digit mp = 1;
  79462. sp_digit n;
  79463. sp_digit mask;
  79464. int i;
  79465. int c;
  79466. byte y;
  79467. int err = MP_OKAY;
  79468. if (bits == 0) {
  79469. err = MP_VAL;
  79470. }
  79471. #ifdef WOLFSSL_SP_SMALL_STACK
  79472. if (err == MP_OKAY) {
  79473. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 192), NULL,
  79474. DYNAMIC_TYPE_TMP_BUFFER);
  79475. if (td == NULL)
  79476. err = MEMORY_E;
  79477. }
  79478. #endif
  79479. if (err == MP_OKAY) {
  79480. norm = td;
  79481. for (i=0; i<8; i++) {
  79482. t[i] = td + i * 192;
  79483. }
  79484. sp_3072_mont_setup(m, &mp);
  79485. sp_3072_mont_norm_96(norm, m);
  79486. XMEMSET(t[1], 0, sizeof(sp_digit) * 96U);
  79487. if (reduceA != 0) {
  79488. err = sp_3072_mod_96(t[1] + 96, a, m);
  79489. if (err == MP_OKAY) {
  79490. err = sp_3072_mod_96(t[1], t[1], m);
  79491. }
  79492. }
  79493. else {
  79494. XMEMCPY(t[1] + 96, a, sizeof(sp_digit) * 96);
  79495. err = sp_3072_mod_96(t[1], t[1], m);
  79496. }
  79497. }
  79498. if (err == MP_OKAY) {
  79499. sp_3072_mont_sqr_96(t[ 2], t[ 1], m, mp);
  79500. sp_3072_mont_mul_96(t[ 3], t[ 2], t[ 1], m, mp);
  79501. sp_3072_mont_sqr_96(t[ 4], t[ 2], m, mp);
  79502. sp_3072_mont_mul_96(t[ 5], t[ 3], t[ 2], m, mp);
  79503. sp_3072_mont_sqr_96(t[ 6], t[ 3], m, mp);
  79504. sp_3072_mont_mul_96(t[ 7], t[ 4], t[ 3], m, mp);
  79505. i = (bits - 1) / 32;
  79506. n = e[i--];
  79507. c = bits & 31;
  79508. if (c == 0) {
  79509. c = 32;
  79510. }
  79511. c -= bits % 3;
  79512. if (c == 32) {
  79513. c = 29;
  79514. }
  79515. if (c < 0) {
  79516. /* Number of bits in top word is less than number needed. */
  79517. c = -c;
  79518. y = (byte)(n << c);
  79519. n = e[i--];
  79520. y |= (byte)(n >> (64 - c));
  79521. n <<= c;
  79522. c = 64 - c;
  79523. }
  79524. else if (c == 0) {
  79525. /* All bits in top word used. */
  79526. y = (byte)n;
  79527. }
  79528. else {
  79529. y = (byte)(n >> c);
  79530. n <<= 32 - c;
  79531. }
  79532. XMEMCPY(r, t[y], sizeof(sp_digit) * 96);
  79533. for (; i>=0 || c>=3; ) {
  79534. if (c == 0) {
  79535. n = e[i--];
  79536. y = (byte)(n >> 29);
  79537. n <<= 3;
  79538. c = 29;
  79539. }
  79540. else if (c < 3) {
  79541. y = (byte)(n >> 29);
  79542. n = e[i--];
  79543. c = 3 - c;
  79544. y |= (byte)(n >> (32 - c));
  79545. n <<= c;
  79546. c = 32 - c;
  79547. }
  79548. else {
  79549. y = (byte)((n >> 29) & 0x7);
  79550. n <<= 3;
  79551. c -= 3;
  79552. }
  79553. sp_3072_mont_sqr_96(r, r, m, mp);
  79554. sp_3072_mont_sqr_96(r, r, m, mp);
  79555. sp_3072_mont_sqr_96(r, r, m, mp);
  79556. sp_3072_mont_mul_96(r, r, t[y], m, mp);
  79557. }
  79558. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  79559. sp_3072_mont_reduce_96(r, m, mp);
  79560. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  79561. sp_3072_cond_sub_96(r, r, m, mask);
  79562. }
  79563. #ifdef WOLFSSL_SP_SMALL_STACK
  79564. if (td != NULL)
  79565. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  79566. #endif
  79567. return err;
  79568. }
  79569. #else
  79570. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  79571. *
  79572. * r A single precision number that is the result of the operation.
  79573. * a A single precision number being exponentiated.
  79574. * e A single precision number that is the exponent.
  79575. * bits The number of bits in the exponent.
  79576. * m A single precision number that is the modulus.
  79577. * returns 0 on success.
  79578. * returns MEMORY_E on dynamic memory allocation failure.
  79579. * returns MP_VAL when base is even or exponent is 0.
  79580. */
  79581. static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e,
  79582. int bits, const sp_digit* m, int reduceA)
  79583. {
  79584. #ifdef WOLFSSL_SP_SMALL_STACK
  79585. sp_digit* td = NULL;
  79586. #else
  79587. sp_digit td[16 * 192];
  79588. #endif
  79589. sp_digit* t[16];
  79590. sp_digit* norm = NULL;
  79591. sp_digit mp = 1;
  79592. sp_digit n;
  79593. sp_digit mask;
  79594. int i;
  79595. int c;
  79596. byte y;
  79597. int err = MP_OKAY;
  79598. if (bits == 0) {
  79599. err = MP_VAL;
  79600. }
  79601. #ifdef WOLFSSL_SP_SMALL_STACK
  79602. if (err == MP_OKAY) {
  79603. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 192), NULL,
  79604. DYNAMIC_TYPE_TMP_BUFFER);
  79605. if (td == NULL)
  79606. err = MEMORY_E;
  79607. }
  79608. #endif
  79609. if (err == MP_OKAY) {
  79610. norm = td;
  79611. for (i=0; i<16; i++) {
  79612. t[i] = td + i * 192;
  79613. }
  79614. sp_3072_mont_setup(m, &mp);
  79615. sp_3072_mont_norm_96(norm, m);
  79616. XMEMSET(t[1], 0, sizeof(sp_digit) * 96U);
  79617. if (reduceA != 0) {
  79618. err = sp_3072_mod_96(t[1] + 96, a, m);
  79619. if (err == MP_OKAY) {
  79620. err = sp_3072_mod_96(t[1], t[1], m);
  79621. }
  79622. }
  79623. else {
  79624. XMEMCPY(t[1] + 96, a, sizeof(sp_digit) * 96);
  79625. err = sp_3072_mod_96(t[1], t[1], m);
  79626. }
  79627. }
  79628. if (err == MP_OKAY) {
  79629. sp_3072_mont_sqr_96(t[ 2], t[ 1], m, mp);
  79630. sp_3072_mont_mul_96(t[ 3], t[ 2], t[ 1], m, mp);
  79631. sp_3072_mont_sqr_96(t[ 4], t[ 2], m, mp);
  79632. sp_3072_mont_mul_96(t[ 5], t[ 3], t[ 2], m, mp);
  79633. sp_3072_mont_sqr_96(t[ 6], t[ 3], m, mp);
  79634. sp_3072_mont_mul_96(t[ 7], t[ 4], t[ 3], m, mp);
  79635. sp_3072_mont_sqr_96(t[ 8], t[ 4], m, mp);
  79636. sp_3072_mont_mul_96(t[ 9], t[ 5], t[ 4], m, mp);
  79637. sp_3072_mont_sqr_96(t[10], t[ 5], m, mp);
  79638. sp_3072_mont_mul_96(t[11], t[ 6], t[ 5], m, mp);
  79639. sp_3072_mont_sqr_96(t[12], t[ 6], m, mp);
  79640. sp_3072_mont_mul_96(t[13], t[ 7], t[ 6], m, mp);
  79641. sp_3072_mont_sqr_96(t[14], t[ 7], m, mp);
  79642. sp_3072_mont_mul_96(t[15], t[ 8], t[ 7], m, mp);
  79643. i = (bits - 1) / 32;
  79644. n = e[i--];
  79645. c = bits & 31;
  79646. if (c == 0) {
  79647. c = 32;
  79648. }
  79649. c -= bits % 4;
  79650. if (c == 32) {
  79651. c = 28;
  79652. }
  79653. if (c < 0) {
  79654. /* Number of bits in top word is less than number needed. */
  79655. c = -c;
  79656. y = (byte)(n << c);
  79657. n = e[i--];
  79658. y |= (byte)(n >> (64 - c));
  79659. n <<= c;
  79660. c = 64 - c;
  79661. }
  79662. else if (c == 0) {
  79663. /* All bits in top word used. */
  79664. y = (byte)n;
  79665. }
  79666. else {
  79667. y = (byte)(n >> c);
  79668. n <<= 32 - c;
  79669. }
  79670. XMEMCPY(r, t[y], sizeof(sp_digit) * 96);
  79671. for (; i>=0 || c>=4; ) {
  79672. if (c == 0) {
  79673. n = e[i--];
  79674. y = (byte)(n >> 28);
  79675. n <<= 4;
  79676. c = 28;
  79677. }
  79678. else if (c < 4) {
  79679. y = (byte)(n >> 28);
  79680. n = e[i--];
  79681. c = 4 - c;
  79682. y |= (byte)(n >> (32 - c));
  79683. n <<= c;
  79684. c = 32 - c;
  79685. }
  79686. else {
  79687. y = (byte)((n >> 28) & 0xf);
  79688. n <<= 4;
  79689. c -= 4;
  79690. }
  79691. sp_3072_mont_sqr_96(r, r, m, mp);
  79692. sp_3072_mont_sqr_96(r, r, m, mp);
  79693. sp_3072_mont_sqr_96(r, r, m, mp);
  79694. sp_3072_mont_sqr_96(r, r, m, mp);
  79695. sp_3072_mont_mul_96(r, r, t[y], m, mp);
  79696. }
  79697. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  79698. sp_3072_mont_reduce_96(r, m, mp);
  79699. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  79700. sp_3072_cond_sub_96(r, r, m, mask);
  79701. }
  79702. #ifdef WOLFSSL_SP_SMALL_STACK
  79703. if (td != NULL)
  79704. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  79705. #endif
  79706. return err;
  79707. }
  79708. #endif /* WOLFSSL_SP_SMALL */
  79709. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  79710. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  79711. #ifdef WOLFSSL_HAVE_SP_RSA
  79712. /* RSA public key operation.
  79713. *
  79714. * in Array of bytes representing the number to exponentiate, base.
  79715. * inLen Number of bytes in base.
  79716. * em Public exponent.
  79717. * mm Modulus.
  79718. * out Buffer to hold big-endian bytes of exponentiation result.
  79719. * Must be at least 384 bytes long.
  79720. * outLen Number of bytes in result.
  79721. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  79722. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  79723. */
  79724. int sp_RsaPublic_3072(const byte* in, word32 inLen, const mp_int* em,
  79725. const mp_int* mm, byte* out, word32* outLen)
  79726. {
  79727. #ifdef WOLFSSL_SP_SMALL_STACK
  79728. sp_digit* a = NULL;
  79729. #else
  79730. sp_digit a[96 * 5];
  79731. #endif
  79732. sp_digit* m = NULL;
  79733. sp_digit* r = NULL;
  79734. sp_digit *ah = NULL;
  79735. sp_digit e[1] = {0};
  79736. int err = MP_OKAY;
  79737. if (*outLen < 384) {
  79738. err = MP_TO_E;
  79739. }
  79740. else if (mp_count_bits(em) > 32 || inLen > 384 ||
  79741. mp_count_bits(mm) != 3072) {
  79742. err = MP_READ_E;
  79743. }
  79744. else if (mp_iseven(mm)) {
  79745. err = MP_VAL;
  79746. }
  79747. #ifdef WOLFSSL_SP_SMALL_STACK
  79748. if (err == MP_OKAY) {
  79749. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 5, NULL,
  79750. DYNAMIC_TYPE_RSA);
  79751. if (a == NULL)
  79752. err = MEMORY_E;
  79753. }
  79754. #endif
  79755. if (err == MP_OKAY) {
  79756. ah = a + 96;
  79757. r = a + 96 * 2;
  79758. m = r + 96 * 2;
  79759. sp_3072_from_bin(ah, 96, in, inLen);
  79760. #if DIGIT_BIT >= 32
  79761. e[0] = em->dp[0];
  79762. #else
  79763. e[0] = em->dp[0];
  79764. if (em->used > 1) {
  79765. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  79766. }
  79767. #endif
  79768. if (e[0] == 0) {
  79769. err = MP_EXPTMOD_E;
  79770. }
  79771. }
  79772. if (err == MP_OKAY) {
  79773. sp_3072_from_mp(m, 96, mm);
  79774. if (e[0] == 0x10001) {
  79775. int i;
  79776. sp_digit mp;
  79777. sp_3072_mont_setup(m, &mp);
  79778. /* Convert to Montgomery form. */
  79779. XMEMSET(a, 0, sizeof(sp_digit) * 96);
  79780. err = sp_3072_mod_96_cond(r, a, m);
  79781. /* Montgomery form: r = a.R mod m */
  79782. if (err == MP_OKAY) {
  79783. /* r = a ^ 0x10000 => r = a squared 16 times */
  79784. for (i = 15; i >= 0; i--) {
  79785. sp_3072_mont_sqr_96(r, r, m, mp);
  79786. }
  79787. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  79788. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  79789. */
  79790. sp_3072_mont_mul_96(r, r, ah, m, mp);
  79791. for (i = 95; i > 0; i--) {
  79792. if (r[i] != m[i]) {
  79793. break;
  79794. }
  79795. }
  79796. if (r[i] >= m[i]) {
  79797. sp_3072_sub_in_place_96(r, m);
  79798. }
  79799. }
  79800. }
  79801. else if (e[0] == 0x3) {
  79802. if (err == MP_OKAY) {
  79803. sp_3072_sqr_96(r, ah);
  79804. err = sp_3072_mod_96_cond(r, r, m);
  79805. }
  79806. if (err == MP_OKAY) {
  79807. sp_3072_mul_96(r, ah, r);
  79808. err = sp_3072_mod_96_cond(r, r, m);
  79809. }
  79810. }
  79811. else {
  79812. int i;
  79813. sp_digit mp;
  79814. sp_3072_mont_setup(m, &mp);
  79815. /* Convert to Montgomery form. */
  79816. XMEMSET(a, 0, sizeof(sp_digit) * 96);
  79817. err = sp_3072_mod_96_cond(a, a, m);
  79818. if (err == MP_OKAY) {
  79819. for (i = 31; i >= 0; i--) {
  79820. if (e[0] >> i) {
  79821. break;
  79822. }
  79823. }
  79824. XMEMCPY(r, a, sizeof(sp_digit) * 96);
  79825. for (i--; i >= 0; i--) {
  79826. sp_3072_mont_sqr_96(r, r, m, mp);
  79827. if (((e[0] >> i) & 1) == 1) {
  79828. sp_3072_mont_mul_96(r, r, a, m, mp);
  79829. }
  79830. }
  79831. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96);
  79832. sp_3072_mont_reduce_96(r, m, mp);
  79833. for (i = 95; i > 0; i--) {
  79834. if (r[i] != m[i]) {
  79835. break;
  79836. }
  79837. }
  79838. if (r[i] >= m[i]) {
  79839. sp_3072_sub_in_place_96(r, m);
  79840. }
  79841. }
  79842. }
  79843. }
  79844. if (err == MP_OKAY) {
  79845. sp_3072_to_bin_96(r, out);
  79846. *outLen = 384;
  79847. }
  79848. #ifdef WOLFSSL_SP_SMALL_STACK
  79849. if (a != NULL)
  79850. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  79851. #endif
  79852. return err;
  79853. }
  79854. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  79855. /* Conditionally add a and b using the mask m.
  79856. * m is -1 to add and 0 when not.
  79857. *
  79858. * r A single precision number representing conditional add result.
  79859. * a A single precision number to add with.
  79860. * b A single precision number to add.
  79861. * m Mask value to apply.
  79862. */
  79863. SP_NOINLINE static sp_digit sp_3072_cond_add_48(sp_digit* r, const sp_digit* a,
  79864. const sp_digit* b, sp_digit m)
  79865. {
  79866. __asm__ __volatile__ (
  79867. "movs r4, #0\n\t"
  79868. "movs r5, #0xc0\n\t"
  79869. "mov r8, r5\n\t"
  79870. "movs r7, #0\n\t"
  79871. "\n"
  79872. "L_sp_3072_cond_add_48_words_%=:\n\t"
  79873. "ldr r6, [%[b], r7]\n\t"
  79874. #ifdef WOLFSSL_KEIL
  79875. "ands r6, r6, %[m]\n\t"
  79876. #elif defined(__clang__)
  79877. "ands r6, %[m]\n\t"
  79878. #else
  79879. "and r6, %[m]\n\t"
  79880. #endif
  79881. "movs r5, #0\n\t"
  79882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79883. "subs r5, r5, #1\n\t"
  79884. #else
  79885. "sub r5, r5, #1\n\t"
  79886. #endif
  79887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79888. "adds r5, r5, r4\n\t"
  79889. #else
  79890. "add r5, r5, r4\n\t"
  79891. #endif
  79892. "ldr r5, [%[a], r7]\n\t"
  79893. #ifdef WOLFSSL_KEIL
  79894. "adcs r5, r5, r6\n\t"
  79895. #elif defined(__clang__)
  79896. "adcs r5, r6\n\t"
  79897. #else
  79898. "adc r5, r6\n\t"
  79899. #endif
  79900. "movs r4, #0\n\t"
  79901. #ifdef WOLFSSL_KEIL
  79902. "adcs r4, r4, r4\n\t"
  79903. #elif defined(__clang__)
  79904. "adcs r4, r4\n\t"
  79905. #else
  79906. "adc r4, r4\n\t"
  79907. #endif
  79908. "str r5, [%[r], r7]\n\t"
  79909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79910. "adds r7, r7, #4\n\t"
  79911. #else
  79912. "add r7, r7, #4\n\t"
  79913. #endif
  79914. "cmp r7, r8\n\t"
  79915. "blt L_sp_3072_cond_add_48_words_%=\n\t"
  79916. "movs %[r], r4\n\t"
  79917. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  79918. :
  79919. : "memory", "r4", "r5", "r6", "r7", "r8"
  79920. );
  79921. return (uint32_t)(size_t)r;
  79922. }
  79923. /* RSA private key operation.
  79924. *
  79925. * in Array of bytes representing the number to exponentiate, base.
  79926. * inLen Number of bytes in base.
  79927. * dm Private exponent.
  79928. * pm First prime.
  79929. * qm Second prime.
  79930. * dpm First prime's CRT exponent.
  79931. * dqm Second prime's CRT exponent.
  79932. * qim Inverse of second prime mod p.
  79933. * mm Modulus.
  79934. * out Buffer to hold big-endian bytes of exponentiation result.
  79935. * Must be at least 384 bytes long.
  79936. * outLen Number of bytes in result.
  79937. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  79938. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  79939. */
  79940. int sp_RsaPrivate_3072(const byte* in, word32 inLen, const mp_int* dm,
  79941. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  79942. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  79943. {
  79944. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  79945. #ifdef WOLFSSL_SP_SMALL_STACK
  79946. sp_digit* d = NULL;
  79947. #else
  79948. sp_digit d[96 * 4];
  79949. #endif
  79950. sp_digit* a = NULL;
  79951. sp_digit* m = NULL;
  79952. sp_digit* r = NULL;
  79953. int err = MP_OKAY;
  79954. (void)pm;
  79955. (void)qm;
  79956. (void)dpm;
  79957. (void)dqm;
  79958. (void)qim;
  79959. if (*outLen < 384U) {
  79960. err = MP_TO_E;
  79961. }
  79962. if (err == MP_OKAY) {
  79963. if (mp_count_bits(dm) > 3072) {
  79964. err = MP_READ_E;
  79965. }
  79966. else if (inLen > 384) {
  79967. err = MP_READ_E;
  79968. }
  79969. else if (mp_count_bits(mm) != 3072) {
  79970. err = MP_READ_E;
  79971. }
  79972. else if (mp_iseven(mm)) {
  79973. err = MP_VAL;
  79974. }
  79975. }
  79976. #ifdef WOLFSSL_SP_SMALL_STACK
  79977. if (err == MP_OKAY) {
  79978. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 4, NULL,
  79979. DYNAMIC_TYPE_RSA);
  79980. if (d == NULL)
  79981. err = MEMORY_E;
  79982. }
  79983. #endif
  79984. if (err == MP_OKAY) {
  79985. a = d + 96;
  79986. m = a + 192;
  79987. r = a;
  79988. sp_3072_from_bin(a, 96, in, inLen);
  79989. sp_3072_from_mp(d, 96, dm);
  79990. sp_3072_from_mp(m, 96, mm);
  79991. err = sp_3072_mod_exp_96(r, a, d, 3072, m, 0);
  79992. }
  79993. if (err == MP_OKAY) {
  79994. sp_3072_to_bin_96(r, out);
  79995. *outLen = 384;
  79996. }
  79997. #ifdef WOLFSSL_SP_SMALL_STACK
  79998. if (d != NULL)
  79999. #endif
  80000. {
  80001. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  80002. if (a != NULL)
  80003. ForceZero(a, sizeof(sp_digit) * 96);
  80004. #ifdef WOLFSSL_SP_SMALL_STACK
  80005. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  80006. #endif
  80007. }
  80008. return err;
  80009. #else
  80010. #ifdef WOLFSSL_SP_SMALL_STACK
  80011. sp_digit* a = NULL;
  80012. #else
  80013. sp_digit a[48 * 11];
  80014. #endif
  80015. sp_digit* p = NULL;
  80016. sp_digit* q = NULL;
  80017. sp_digit* dp = NULL;
  80018. sp_digit* tmpa = NULL;
  80019. sp_digit* tmpb = NULL;
  80020. sp_digit* r = NULL;
  80021. sp_digit* qi = NULL;
  80022. sp_digit* dq = NULL;
  80023. sp_digit c;
  80024. int err = MP_OKAY;
  80025. (void)dm;
  80026. (void)mm;
  80027. if (*outLen < 384) {
  80028. err = MP_TO_E;
  80029. }
  80030. else if (inLen > 384 || mp_count_bits(mm) != 3072) {
  80031. err = MP_READ_E;
  80032. }
  80033. else if (mp_iseven(mm)) {
  80034. err = MP_VAL;
  80035. }
  80036. else if (mp_iseven(pm)) {
  80037. err = MP_VAL;
  80038. }
  80039. else if (mp_iseven(qm)) {
  80040. err = MP_VAL;
  80041. }
  80042. #ifdef WOLFSSL_SP_SMALL_STACK
  80043. if (err == MP_OKAY) {
  80044. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 48 * 11, NULL,
  80045. DYNAMIC_TYPE_RSA);
  80046. if (a == NULL)
  80047. err = MEMORY_E;
  80048. }
  80049. #endif
  80050. if (err == MP_OKAY) {
  80051. p = a + 96 * 2;
  80052. q = p + 48;
  80053. qi = dq = dp = q + 48;
  80054. tmpa = qi + 48;
  80055. tmpb = tmpa + 96;
  80056. r = a;
  80057. sp_3072_from_bin(a, 96, in, inLen);
  80058. sp_3072_from_mp(p, 48, pm);
  80059. sp_3072_from_mp(q, 48, qm);
  80060. sp_3072_from_mp(dp, 48, dpm);
  80061. err = sp_3072_mod_exp_48(tmpa, a, dp, 1536, p, 1);
  80062. }
  80063. if (err == MP_OKAY) {
  80064. sp_3072_from_mp(dq, 48, dqm);
  80065. err = sp_3072_mod_exp_48(tmpb, a, dq, 1536, q, 1);
  80066. }
  80067. if (err == MP_OKAY) {
  80068. c = sp_3072_sub_in_place_48(tmpa, tmpb);
  80069. c += sp_3072_cond_add_48(tmpa, tmpa, p, c);
  80070. sp_3072_cond_add_48(tmpa, tmpa, p, c);
  80071. sp_3072_from_mp(qi, 48, qim);
  80072. sp_3072_mul_48(tmpa, tmpa, qi);
  80073. err = sp_3072_mod_48(tmpa, tmpa, p);
  80074. }
  80075. if (err == MP_OKAY) {
  80076. sp_3072_mul_48(tmpa, q, tmpa);
  80077. XMEMSET(&tmpb[48], 0, sizeof(sp_digit) * 48);
  80078. sp_3072_add_96(r, tmpb, tmpa);
  80079. sp_3072_to_bin_96(r, out);
  80080. *outLen = 384;
  80081. }
  80082. #ifdef WOLFSSL_SP_SMALL_STACK
  80083. if (a != NULL)
  80084. #endif
  80085. {
  80086. ForceZero(a, sizeof(sp_digit) * 48 * 11);
  80087. #ifdef WOLFSSL_SP_SMALL_STACK
  80088. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  80089. #endif
  80090. }
  80091. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  80092. return err;
  80093. }
  80094. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  80095. #endif /* WOLFSSL_HAVE_SP_RSA */
  80096. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  80097. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  80098. /* Convert an array of sp_digit to an mp_int.
  80099. *
  80100. * a A single precision integer.
  80101. * r A multi-precision integer.
  80102. */
  80103. static int sp_3072_to_mp(const sp_digit* a, mp_int* r)
  80104. {
  80105. int err;
  80106. err = mp_grow(r, (3072 + DIGIT_BIT - 1) / DIGIT_BIT);
  80107. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  80108. #if DIGIT_BIT == 32
  80109. XMEMCPY(r->dp, a, sizeof(sp_digit) * 96);
  80110. r->used = 96;
  80111. mp_clamp(r);
  80112. #elif DIGIT_BIT < 32
  80113. int i;
  80114. int j = 0;
  80115. int s = 0;
  80116. r->dp[0] = 0;
  80117. for (i = 0; i < 96; i++) {
  80118. r->dp[j] |= (mp_digit)(a[i] << s);
  80119. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  80120. s = DIGIT_BIT - s;
  80121. r->dp[++j] = (mp_digit)(a[i] >> s);
  80122. while (s + DIGIT_BIT <= 32) {
  80123. s += DIGIT_BIT;
  80124. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  80125. if (s == SP_WORD_SIZE) {
  80126. r->dp[j] = 0;
  80127. }
  80128. else {
  80129. r->dp[j] = (mp_digit)(a[i] >> s);
  80130. }
  80131. }
  80132. s = 32 - s;
  80133. }
  80134. r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
  80135. mp_clamp(r);
  80136. #else
  80137. int i;
  80138. int j = 0;
  80139. int s = 0;
  80140. r->dp[0] = 0;
  80141. for (i = 0; i < 96; i++) {
  80142. r->dp[j] |= ((mp_digit)a[i]) << s;
  80143. if (s + 32 >= DIGIT_BIT) {
  80144. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  80145. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  80146. #endif
  80147. s = DIGIT_BIT - s;
  80148. r->dp[++j] = a[i] >> s;
  80149. s = 32 - s;
  80150. }
  80151. else {
  80152. s += 32;
  80153. }
  80154. }
  80155. r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
  80156. mp_clamp(r);
  80157. #endif
  80158. }
  80159. return err;
  80160. }
  80161. /* Perform the modular exponentiation for Diffie-Hellman.
  80162. *
  80163. * base Base. MP integer.
  80164. * exp Exponent. MP integer.
  80165. * mod Modulus. MP integer.
  80166. * res Result. MP integer.
  80167. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  80168. * and MEMORY_E if memory allocation fails.
  80169. */
  80170. int sp_ModExp_3072(const mp_int* base, const mp_int* exp, const mp_int* mod,
  80171. mp_int* res)
  80172. {
  80173. int err = MP_OKAY;
  80174. sp_digit b[192];
  80175. sp_digit e[96];
  80176. sp_digit m[96];
  80177. sp_digit* r = b;
  80178. int expBits = mp_count_bits(exp);
  80179. if (mp_count_bits(base) > 3072) {
  80180. err = MP_READ_E;
  80181. }
  80182. else if (expBits > 3072) {
  80183. err = MP_READ_E;
  80184. }
  80185. else if (mp_count_bits(mod) != 3072) {
  80186. err = MP_READ_E;
  80187. }
  80188. else if (mp_iseven(mod)) {
  80189. err = MP_VAL;
  80190. }
  80191. if (err == MP_OKAY) {
  80192. sp_3072_from_mp(b, 96, base);
  80193. sp_3072_from_mp(e, 96, exp);
  80194. sp_3072_from_mp(m, 96, mod);
  80195. err = sp_3072_mod_exp_96(r, b, e, expBits, m, 0);
  80196. }
  80197. if (err == MP_OKAY) {
  80198. err = sp_3072_to_mp(r, res);
  80199. }
  80200. XMEMSET(e, 0, sizeof(e));
  80201. return err;
  80202. }
  80203. #ifdef WOLFSSL_HAVE_SP_DH
  80204. #ifdef HAVE_FFDHE_3072
  80205. /* Lefy shift a by n bits into r. (r = a << n)
  80206. *
  80207. * r A single precision integer.
  80208. * a A single precision integer.
  80209. * n Integer representing number of bits to shift.
  80210. */
  80211. static void sp_3072_lshift_96(sp_digit* r, const sp_digit* a, byte n)
  80212. {
  80213. __asm__ __volatile__ (
  80214. "movs r7, #31\n\t"
  80215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80216. "subs r7, r7, %[n]\n\t"
  80217. #else
  80218. "sub r7, r7, %[n]\n\t"
  80219. #endif
  80220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80221. "adds %[a], %[a], #0xff\n\t"
  80222. #else
  80223. "add %[a], %[a], #0xff\n\t"
  80224. #endif
  80225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80226. "adds %[r], %[r], #0xff\n\t"
  80227. #else
  80228. "add %[r], %[r], #0xff\n\t"
  80229. #endif
  80230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80231. "adds %[a], %[a], #0x41\n\t"
  80232. #else
  80233. "add %[a], %[a], #0x41\n\t"
  80234. #endif
  80235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80236. "adds %[r], %[r], #0x41\n\t"
  80237. #else
  80238. "add %[r], %[r], #0x41\n\t"
  80239. #endif
  80240. "ldr r4, [%[a], #60]\n\t"
  80241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80242. "lsrs r5, r4, #1\n\t"
  80243. #else
  80244. "lsr r5, r4, #1\n\t"
  80245. #endif
  80246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80247. "lsls r4, r4, %[n]\n\t"
  80248. #else
  80249. "lsl r4, r4, %[n]\n\t"
  80250. #endif
  80251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80252. "lsrs r5, r5, r7\n\t"
  80253. #else
  80254. "lsr r5, r5, r7\n\t"
  80255. #endif
  80256. "ldr r3, [%[a], #56]\n\t"
  80257. "str r5, [%[r], #64]\n\t"
  80258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80259. "lsrs r6, r3, #1\n\t"
  80260. #else
  80261. "lsr r6, r3, #1\n\t"
  80262. #endif
  80263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80264. "lsls r3, r3, %[n]\n\t"
  80265. #else
  80266. "lsl r3, r3, %[n]\n\t"
  80267. #endif
  80268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80269. "lsrs r6, r6, r7\n\t"
  80270. #else
  80271. "lsr r6, r6, r7\n\t"
  80272. #endif
  80273. #ifdef WOLFSSL_KEIL
  80274. "orrs r4, r4, r6\n\t"
  80275. #elif defined(__clang__)
  80276. "orrs r4, r6\n\t"
  80277. #else
  80278. "orr r4, r6\n\t"
  80279. #endif
  80280. "ldr r5, [%[a], #52]\n\t"
  80281. "str r4, [%[r], #60]\n\t"
  80282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80283. "lsrs r6, r5, #1\n\t"
  80284. #else
  80285. "lsr r6, r5, #1\n\t"
  80286. #endif
  80287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80288. "lsls r5, r5, %[n]\n\t"
  80289. #else
  80290. "lsl r5, r5, %[n]\n\t"
  80291. #endif
  80292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80293. "lsrs r6, r6, r7\n\t"
  80294. #else
  80295. "lsr r6, r6, r7\n\t"
  80296. #endif
  80297. #ifdef WOLFSSL_KEIL
  80298. "orrs r3, r3, r6\n\t"
  80299. #elif defined(__clang__)
  80300. "orrs r3, r6\n\t"
  80301. #else
  80302. "orr r3, r6\n\t"
  80303. #endif
  80304. "ldr r4, [%[a], #48]\n\t"
  80305. "str r3, [%[r], #56]\n\t"
  80306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80307. "lsrs r6, r4, #1\n\t"
  80308. #else
  80309. "lsr r6, r4, #1\n\t"
  80310. #endif
  80311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80312. "lsls r4, r4, %[n]\n\t"
  80313. #else
  80314. "lsl r4, r4, %[n]\n\t"
  80315. #endif
  80316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80317. "lsrs r6, r6, r7\n\t"
  80318. #else
  80319. "lsr r6, r6, r7\n\t"
  80320. #endif
  80321. #ifdef WOLFSSL_KEIL
  80322. "orrs r5, r5, r6\n\t"
  80323. #elif defined(__clang__)
  80324. "orrs r5, r6\n\t"
  80325. #else
  80326. "orr r5, r6\n\t"
  80327. #endif
  80328. "ldr r3, [%[a], #44]\n\t"
  80329. "str r5, [%[r], #52]\n\t"
  80330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80331. "lsrs r6, r3, #1\n\t"
  80332. #else
  80333. "lsr r6, r3, #1\n\t"
  80334. #endif
  80335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80336. "lsls r3, r3, %[n]\n\t"
  80337. #else
  80338. "lsl r3, r3, %[n]\n\t"
  80339. #endif
  80340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80341. "lsrs r6, r6, r7\n\t"
  80342. #else
  80343. "lsr r6, r6, r7\n\t"
  80344. #endif
  80345. #ifdef WOLFSSL_KEIL
  80346. "orrs r4, r4, r6\n\t"
  80347. #elif defined(__clang__)
  80348. "orrs r4, r6\n\t"
  80349. #else
  80350. "orr r4, r6\n\t"
  80351. #endif
  80352. "ldr r5, [%[a], #40]\n\t"
  80353. "str r4, [%[r], #48]\n\t"
  80354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80355. "lsrs r6, r5, #1\n\t"
  80356. #else
  80357. "lsr r6, r5, #1\n\t"
  80358. #endif
  80359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80360. "lsls r5, r5, %[n]\n\t"
  80361. #else
  80362. "lsl r5, r5, %[n]\n\t"
  80363. #endif
  80364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80365. "lsrs r6, r6, r7\n\t"
  80366. #else
  80367. "lsr r6, r6, r7\n\t"
  80368. #endif
  80369. #ifdef WOLFSSL_KEIL
  80370. "orrs r3, r3, r6\n\t"
  80371. #elif defined(__clang__)
  80372. "orrs r3, r6\n\t"
  80373. #else
  80374. "orr r3, r6\n\t"
  80375. #endif
  80376. "ldr r4, [%[a], #36]\n\t"
  80377. "str r3, [%[r], #44]\n\t"
  80378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80379. "lsrs r6, r4, #1\n\t"
  80380. #else
  80381. "lsr r6, r4, #1\n\t"
  80382. #endif
  80383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80384. "lsls r4, r4, %[n]\n\t"
  80385. #else
  80386. "lsl r4, r4, %[n]\n\t"
  80387. #endif
  80388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80389. "lsrs r6, r6, r7\n\t"
  80390. #else
  80391. "lsr r6, r6, r7\n\t"
  80392. #endif
  80393. #ifdef WOLFSSL_KEIL
  80394. "orrs r5, r5, r6\n\t"
  80395. #elif defined(__clang__)
  80396. "orrs r5, r6\n\t"
  80397. #else
  80398. "orr r5, r6\n\t"
  80399. #endif
  80400. "ldr r3, [%[a], #32]\n\t"
  80401. "str r5, [%[r], #40]\n\t"
  80402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80403. "lsrs r6, r3, #1\n\t"
  80404. #else
  80405. "lsr r6, r3, #1\n\t"
  80406. #endif
  80407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80408. "lsls r3, r3, %[n]\n\t"
  80409. #else
  80410. "lsl r3, r3, %[n]\n\t"
  80411. #endif
  80412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80413. "lsrs r6, r6, r7\n\t"
  80414. #else
  80415. "lsr r6, r6, r7\n\t"
  80416. #endif
  80417. #ifdef WOLFSSL_KEIL
  80418. "orrs r4, r4, r6\n\t"
  80419. #elif defined(__clang__)
  80420. "orrs r4, r6\n\t"
  80421. #else
  80422. "orr r4, r6\n\t"
  80423. #endif
  80424. "ldr r5, [%[a], #28]\n\t"
  80425. "str r4, [%[r], #36]\n\t"
  80426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80427. "lsrs r6, r5, #1\n\t"
  80428. #else
  80429. "lsr r6, r5, #1\n\t"
  80430. #endif
  80431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80432. "lsls r5, r5, %[n]\n\t"
  80433. #else
  80434. "lsl r5, r5, %[n]\n\t"
  80435. #endif
  80436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80437. "lsrs r6, r6, r7\n\t"
  80438. #else
  80439. "lsr r6, r6, r7\n\t"
  80440. #endif
  80441. #ifdef WOLFSSL_KEIL
  80442. "orrs r3, r3, r6\n\t"
  80443. #elif defined(__clang__)
  80444. "orrs r3, r6\n\t"
  80445. #else
  80446. "orr r3, r6\n\t"
  80447. #endif
  80448. "ldr r4, [%[a], #24]\n\t"
  80449. "str r3, [%[r], #32]\n\t"
  80450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80451. "lsrs r6, r4, #1\n\t"
  80452. #else
  80453. "lsr r6, r4, #1\n\t"
  80454. #endif
  80455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80456. "lsls r4, r4, %[n]\n\t"
  80457. #else
  80458. "lsl r4, r4, %[n]\n\t"
  80459. #endif
  80460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80461. "lsrs r6, r6, r7\n\t"
  80462. #else
  80463. "lsr r6, r6, r7\n\t"
  80464. #endif
  80465. #ifdef WOLFSSL_KEIL
  80466. "orrs r5, r5, r6\n\t"
  80467. #elif defined(__clang__)
  80468. "orrs r5, r6\n\t"
  80469. #else
  80470. "orr r5, r6\n\t"
  80471. #endif
  80472. "ldr r3, [%[a], #20]\n\t"
  80473. "str r5, [%[r], #28]\n\t"
  80474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80475. "lsrs r6, r3, #1\n\t"
  80476. #else
  80477. "lsr r6, r3, #1\n\t"
  80478. #endif
  80479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80480. "lsls r3, r3, %[n]\n\t"
  80481. #else
  80482. "lsl r3, r3, %[n]\n\t"
  80483. #endif
  80484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80485. "lsrs r6, r6, r7\n\t"
  80486. #else
  80487. "lsr r6, r6, r7\n\t"
  80488. #endif
  80489. #ifdef WOLFSSL_KEIL
  80490. "orrs r4, r4, r6\n\t"
  80491. #elif defined(__clang__)
  80492. "orrs r4, r6\n\t"
  80493. #else
  80494. "orr r4, r6\n\t"
  80495. #endif
  80496. "ldr r5, [%[a], #16]\n\t"
  80497. "str r4, [%[r], #24]\n\t"
  80498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80499. "lsrs r6, r5, #1\n\t"
  80500. #else
  80501. "lsr r6, r5, #1\n\t"
  80502. #endif
  80503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80504. "lsls r5, r5, %[n]\n\t"
  80505. #else
  80506. "lsl r5, r5, %[n]\n\t"
  80507. #endif
  80508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80509. "lsrs r6, r6, r7\n\t"
  80510. #else
  80511. "lsr r6, r6, r7\n\t"
  80512. #endif
  80513. #ifdef WOLFSSL_KEIL
  80514. "orrs r3, r3, r6\n\t"
  80515. #elif defined(__clang__)
  80516. "orrs r3, r6\n\t"
  80517. #else
  80518. "orr r3, r6\n\t"
  80519. #endif
  80520. "ldr r4, [%[a], #12]\n\t"
  80521. "str r3, [%[r], #20]\n\t"
  80522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80523. "lsrs r6, r4, #1\n\t"
  80524. #else
  80525. "lsr r6, r4, #1\n\t"
  80526. #endif
  80527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80528. "lsls r4, r4, %[n]\n\t"
  80529. #else
  80530. "lsl r4, r4, %[n]\n\t"
  80531. #endif
  80532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80533. "lsrs r6, r6, r7\n\t"
  80534. #else
  80535. "lsr r6, r6, r7\n\t"
  80536. #endif
  80537. #ifdef WOLFSSL_KEIL
  80538. "orrs r5, r5, r6\n\t"
  80539. #elif defined(__clang__)
  80540. "orrs r5, r6\n\t"
  80541. #else
  80542. "orr r5, r6\n\t"
  80543. #endif
  80544. "ldr r3, [%[a], #8]\n\t"
  80545. "str r5, [%[r], #16]\n\t"
  80546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80547. "lsrs r6, r3, #1\n\t"
  80548. #else
  80549. "lsr r6, r3, #1\n\t"
  80550. #endif
  80551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80552. "lsls r3, r3, %[n]\n\t"
  80553. #else
  80554. "lsl r3, r3, %[n]\n\t"
  80555. #endif
  80556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80557. "lsrs r6, r6, r7\n\t"
  80558. #else
  80559. "lsr r6, r6, r7\n\t"
  80560. #endif
  80561. #ifdef WOLFSSL_KEIL
  80562. "orrs r4, r4, r6\n\t"
  80563. #elif defined(__clang__)
  80564. "orrs r4, r6\n\t"
  80565. #else
  80566. "orr r4, r6\n\t"
  80567. #endif
  80568. "ldr r5, [%[a], #4]\n\t"
  80569. "str r4, [%[r], #12]\n\t"
  80570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80571. "lsrs r6, r5, #1\n\t"
  80572. #else
  80573. "lsr r6, r5, #1\n\t"
  80574. #endif
  80575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80576. "lsls r5, r5, %[n]\n\t"
  80577. #else
  80578. "lsl r5, r5, %[n]\n\t"
  80579. #endif
  80580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80581. "lsrs r6, r6, r7\n\t"
  80582. #else
  80583. "lsr r6, r6, r7\n\t"
  80584. #endif
  80585. #ifdef WOLFSSL_KEIL
  80586. "orrs r3, r3, r6\n\t"
  80587. #elif defined(__clang__)
  80588. "orrs r3, r6\n\t"
  80589. #else
  80590. "orr r3, r6\n\t"
  80591. #endif
  80592. "ldr r4, [%[a]]\n\t"
  80593. "str r3, [%[r], #8]\n\t"
  80594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80595. "lsrs r6, r4, #1\n\t"
  80596. #else
  80597. "lsr r6, r4, #1\n\t"
  80598. #endif
  80599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80600. "lsls r4, r4, %[n]\n\t"
  80601. #else
  80602. "lsl r4, r4, %[n]\n\t"
  80603. #endif
  80604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80605. "lsrs r6, r6, r7\n\t"
  80606. #else
  80607. "lsr r6, r6, r7\n\t"
  80608. #endif
  80609. #ifdef WOLFSSL_KEIL
  80610. "orrs r5, r5, r6\n\t"
  80611. #elif defined(__clang__)
  80612. "orrs r5, r6\n\t"
  80613. #else
  80614. "orr r5, r6\n\t"
  80615. #endif
  80616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80617. "subs %[a], %[a], #0x40\n\t"
  80618. #else
  80619. "sub %[a], %[a], #0x40\n\t"
  80620. #endif
  80621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80622. "subs %[r], %[r], #0x40\n\t"
  80623. #else
  80624. "sub %[r], %[r], #0x40\n\t"
  80625. #endif
  80626. "ldr r3, [%[a], #60]\n\t"
  80627. "str r5, [%[r], #68]\n\t"
  80628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80629. "lsrs r6, r3, #1\n\t"
  80630. #else
  80631. "lsr r6, r3, #1\n\t"
  80632. #endif
  80633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80634. "lsls r3, r3, %[n]\n\t"
  80635. #else
  80636. "lsl r3, r3, %[n]\n\t"
  80637. #endif
  80638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80639. "lsrs r6, r6, r7\n\t"
  80640. #else
  80641. "lsr r6, r6, r7\n\t"
  80642. #endif
  80643. #ifdef WOLFSSL_KEIL
  80644. "orrs r4, r4, r6\n\t"
  80645. #elif defined(__clang__)
  80646. "orrs r4, r6\n\t"
  80647. #else
  80648. "orr r4, r6\n\t"
  80649. #endif
  80650. "ldr r5, [%[a], #56]\n\t"
  80651. "str r4, [%[r], #64]\n\t"
  80652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80653. "lsrs r6, r5, #1\n\t"
  80654. #else
  80655. "lsr r6, r5, #1\n\t"
  80656. #endif
  80657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80658. "lsls r5, r5, %[n]\n\t"
  80659. #else
  80660. "lsl r5, r5, %[n]\n\t"
  80661. #endif
  80662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80663. "lsrs r6, r6, r7\n\t"
  80664. #else
  80665. "lsr r6, r6, r7\n\t"
  80666. #endif
  80667. #ifdef WOLFSSL_KEIL
  80668. "orrs r3, r3, r6\n\t"
  80669. #elif defined(__clang__)
  80670. "orrs r3, r6\n\t"
  80671. #else
  80672. "orr r3, r6\n\t"
  80673. #endif
  80674. "ldr r4, [%[a], #52]\n\t"
  80675. "str r3, [%[r], #60]\n\t"
  80676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80677. "lsrs r6, r4, #1\n\t"
  80678. #else
  80679. "lsr r6, r4, #1\n\t"
  80680. #endif
  80681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80682. "lsls r4, r4, %[n]\n\t"
  80683. #else
  80684. "lsl r4, r4, %[n]\n\t"
  80685. #endif
  80686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80687. "lsrs r6, r6, r7\n\t"
  80688. #else
  80689. "lsr r6, r6, r7\n\t"
  80690. #endif
  80691. #ifdef WOLFSSL_KEIL
  80692. "orrs r5, r5, r6\n\t"
  80693. #elif defined(__clang__)
  80694. "orrs r5, r6\n\t"
  80695. #else
  80696. "orr r5, r6\n\t"
  80697. #endif
  80698. "ldr r3, [%[a], #48]\n\t"
  80699. "str r5, [%[r], #56]\n\t"
  80700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80701. "lsrs r6, r3, #1\n\t"
  80702. #else
  80703. "lsr r6, r3, #1\n\t"
  80704. #endif
  80705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80706. "lsls r3, r3, %[n]\n\t"
  80707. #else
  80708. "lsl r3, r3, %[n]\n\t"
  80709. #endif
  80710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80711. "lsrs r6, r6, r7\n\t"
  80712. #else
  80713. "lsr r6, r6, r7\n\t"
  80714. #endif
  80715. #ifdef WOLFSSL_KEIL
  80716. "orrs r4, r4, r6\n\t"
  80717. #elif defined(__clang__)
  80718. "orrs r4, r6\n\t"
  80719. #else
  80720. "orr r4, r6\n\t"
  80721. #endif
  80722. "ldr r5, [%[a], #44]\n\t"
  80723. "str r4, [%[r], #52]\n\t"
  80724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80725. "lsrs r6, r5, #1\n\t"
  80726. #else
  80727. "lsr r6, r5, #1\n\t"
  80728. #endif
  80729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80730. "lsls r5, r5, %[n]\n\t"
  80731. #else
  80732. "lsl r5, r5, %[n]\n\t"
  80733. #endif
  80734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80735. "lsrs r6, r6, r7\n\t"
  80736. #else
  80737. "lsr r6, r6, r7\n\t"
  80738. #endif
  80739. #ifdef WOLFSSL_KEIL
  80740. "orrs r3, r3, r6\n\t"
  80741. #elif defined(__clang__)
  80742. "orrs r3, r6\n\t"
  80743. #else
  80744. "orr r3, r6\n\t"
  80745. #endif
  80746. "ldr r4, [%[a], #40]\n\t"
  80747. "str r3, [%[r], #48]\n\t"
  80748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80749. "lsrs r6, r4, #1\n\t"
  80750. #else
  80751. "lsr r6, r4, #1\n\t"
  80752. #endif
  80753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80754. "lsls r4, r4, %[n]\n\t"
  80755. #else
  80756. "lsl r4, r4, %[n]\n\t"
  80757. #endif
  80758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80759. "lsrs r6, r6, r7\n\t"
  80760. #else
  80761. "lsr r6, r6, r7\n\t"
  80762. #endif
  80763. #ifdef WOLFSSL_KEIL
  80764. "orrs r5, r5, r6\n\t"
  80765. #elif defined(__clang__)
  80766. "orrs r5, r6\n\t"
  80767. #else
  80768. "orr r5, r6\n\t"
  80769. #endif
  80770. "ldr r3, [%[a], #36]\n\t"
  80771. "str r5, [%[r], #44]\n\t"
  80772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80773. "lsrs r6, r3, #1\n\t"
  80774. #else
  80775. "lsr r6, r3, #1\n\t"
  80776. #endif
  80777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80778. "lsls r3, r3, %[n]\n\t"
  80779. #else
  80780. "lsl r3, r3, %[n]\n\t"
  80781. #endif
  80782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80783. "lsrs r6, r6, r7\n\t"
  80784. #else
  80785. "lsr r6, r6, r7\n\t"
  80786. #endif
  80787. #ifdef WOLFSSL_KEIL
  80788. "orrs r4, r4, r6\n\t"
  80789. #elif defined(__clang__)
  80790. "orrs r4, r6\n\t"
  80791. #else
  80792. "orr r4, r6\n\t"
  80793. #endif
  80794. "ldr r5, [%[a], #32]\n\t"
  80795. "str r4, [%[r], #40]\n\t"
  80796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80797. "lsrs r6, r5, #1\n\t"
  80798. #else
  80799. "lsr r6, r5, #1\n\t"
  80800. #endif
  80801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80802. "lsls r5, r5, %[n]\n\t"
  80803. #else
  80804. "lsl r5, r5, %[n]\n\t"
  80805. #endif
  80806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80807. "lsrs r6, r6, r7\n\t"
  80808. #else
  80809. "lsr r6, r6, r7\n\t"
  80810. #endif
  80811. #ifdef WOLFSSL_KEIL
  80812. "orrs r3, r3, r6\n\t"
  80813. #elif defined(__clang__)
  80814. "orrs r3, r6\n\t"
  80815. #else
  80816. "orr r3, r6\n\t"
  80817. #endif
  80818. "ldr r4, [%[a], #28]\n\t"
  80819. "str r3, [%[r], #36]\n\t"
  80820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80821. "lsrs r6, r4, #1\n\t"
  80822. #else
  80823. "lsr r6, r4, #1\n\t"
  80824. #endif
  80825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80826. "lsls r4, r4, %[n]\n\t"
  80827. #else
  80828. "lsl r4, r4, %[n]\n\t"
  80829. #endif
  80830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80831. "lsrs r6, r6, r7\n\t"
  80832. #else
  80833. "lsr r6, r6, r7\n\t"
  80834. #endif
  80835. #ifdef WOLFSSL_KEIL
  80836. "orrs r5, r5, r6\n\t"
  80837. #elif defined(__clang__)
  80838. "orrs r5, r6\n\t"
  80839. #else
  80840. "orr r5, r6\n\t"
  80841. #endif
  80842. "ldr r3, [%[a], #24]\n\t"
  80843. "str r5, [%[r], #32]\n\t"
  80844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80845. "lsrs r6, r3, #1\n\t"
  80846. #else
  80847. "lsr r6, r3, #1\n\t"
  80848. #endif
  80849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80850. "lsls r3, r3, %[n]\n\t"
  80851. #else
  80852. "lsl r3, r3, %[n]\n\t"
  80853. #endif
  80854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80855. "lsrs r6, r6, r7\n\t"
  80856. #else
  80857. "lsr r6, r6, r7\n\t"
  80858. #endif
  80859. #ifdef WOLFSSL_KEIL
  80860. "orrs r4, r4, r6\n\t"
  80861. #elif defined(__clang__)
  80862. "orrs r4, r6\n\t"
  80863. #else
  80864. "orr r4, r6\n\t"
  80865. #endif
  80866. "ldr r5, [%[a], #20]\n\t"
  80867. "str r4, [%[r], #28]\n\t"
  80868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80869. "lsrs r6, r5, #1\n\t"
  80870. #else
  80871. "lsr r6, r5, #1\n\t"
  80872. #endif
  80873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80874. "lsls r5, r5, %[n]\n\t"
  80875. #else
  80876. "lsl r5, r5, %[n]\n\t"
  80877. #endif
  80878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80879. "lsrs r6, r6, r7\n\t"
  80880. #else
  80881. "lsr r6, r6, r7\n\t"
  80882. #endif
  80883. #ifdef WOLFSSL_KEIL
  80884. "orrs r3, r3, r6\n\t"
  80885. #elif defined(__clang__)
  80886. "orrs r3, r6\n\t"
  80887. #else
  80888. "orr r3, r6\n\t"
  80889. #endif
  80890. "ldr r4, [%[a], #16]\n\t"
  80891. "str r3, [%[r], #24]\n\t"
  80892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80893. "lsrs r6, r4, #1\n\t"
  80894. #else
  80895. "lsr r6, r4, #1\n\t"
  80896. #endif
  80897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80898. "lsls r4, r4, %[n]\n\t"
  80899. #else
  80900. "lsl r4, r4, %[n]\n\t"
  80901. #endif
  80902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80903. "lsrs r6, r6, r7\n\t"
  80904. #else
  80905. "lsr r6, r6, r7\n\t"
  80906. #endif
  80907. #ifdef WOLFSSL_KEIL
  80908. "orrs r5, r5, r6\n\t"
  80909. #elif defined(__clang__)
  80910. "orrs r5, r6\n\t"
  80911. #else
  80912. "orr r5, r6\n\t"
  80913. #endif
  80914. "ldr r3, [%[a], #12]\n\t"
  80915. "str r5, [%[r], #20]\n\t"
  80916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80917. "lsrs r6, r3, #1\n\t"
  80918. #else
  80919. "lsr r6, r3, #1\n\t"
  80920. #endif
  80921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80922. "lsls r3, r3, %[n]\n\t"
  80923. #else
  80924. "lsl r3, r3, %[n]\n\t"
  80925. #endif
  80926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80927. "lsrs r6, r6, r7\n\t"
  80928. #else
  80929. "lsr r6, r6, r7\n\t"
  80930. #endif
  80931. #ifdef WOLFSSL_KEIL
  80932. "orrs r4, r4, r6\n\t"
  80933. #elif defined(__clang__)
  80934. "orrs r4, r6\n\t"
  80935. #else
  80936. "orr r4, r6\n\t"
  80937. #endif
  80938. "ldr r5, [%[a], #8]\n\t"
  80939. "str r4, [%[r], #16]\n\t"
  80940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80941. "lsrs r6, r5, #1\n\t"
  80942. #else
  80943. "lsr r6, r5, #1\n\t"
  80944. #endif
  80945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80946. "lsls r5, r5, %[n]\n\t"
  80947. #else
  80948. "lsl r5, r5, %[n]\n\t"
  80949. #endif
  80950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80951. "lsrs r6, r6, r7\n\t"
  80952. #else
  80953. "lsr r6, r6, r7\n\t"
  80954. #endif
  80955. #ifdef WOLFSSL_KEIL
  80956. "orrs r3, r3, r6\n\t"
  80957. #elif defined(__clang__)
  80958. "orrs r3, r6\n\t"
  80959. #else
  80960. "orr r3, r6\n\t"
  80961. #endif
  80962. "ldr r4, [%[a], #4]\n\t"
  80963. "str r3, [%[r], #12]\n\t"
  80964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80965. "lsrs r6, r4, #1\n\t"
  80966. #else
  80967. "lsr r6, r4, #1\n\t"
  80968. #endif
  80969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80970. "lsls r4, r4, %[n]\n\t"
  80971. #else
  80972. "lsl r4, r4, %[n]\n\t"
  80973. #endif
  80974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80975. "lsrs r6, r6, r7\n\t"
  80976. #else
  80977. "lsr r6, r6, r7\n\t"
  80978. #endif
  80979. #ifdef WOLFSSL_KEIL
  80980. "orrs r5, r5, r6\n\t"
  80981. #elif defined(__clang__)
  80982. "orrs r5, r6\n\t"
  80983. #else
  80984. "orr r5, r6\n\t"
  80985. #endif
  80986. "ldr r3, [%[a]]\n\t"
  80987. "str r5, [%[r], #8]\n\t"
  80988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80989. "lsrs r6, r3, #1\n\t"
  80990. #else
  80991. "lsr r6, r3, #1\n\t"
  80992. #endif
  80993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80994. "lsls r3, r3, %[n]\n\t"
  80995. #else
  80996. "lsl r3, r3, %[n]\n\t"
  80997. #endif
  80998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80999. "lsrs r6, r6, r7\n\t"
  81000. #else
  81001. "lsr r6, r6, r7\n\t"
  81002. #endif
  81003. #ifdef WOLFSSL_KEIL
  81004. "orrs r4, r4, r6\n\t"
  81005. #elif defined(__clang__)
  81006. "orrs r4, r6\n\t"
  81007. #else
  81008. "orr r4, r6\n\t"
  81009. #endif
  81010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81011. "subs %[a], %[a], #0x40\n\t"
  81012. #else
  81013. "sub %[a], %[a], #0x40\n\t"
  81014. #endif
  81015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81016. "subs %[r], %[r], #0x40\n\t"
  81017. #else
  81018. "sub %[r], %[r], #0x40\n\t"
  81019. #endif
  81020. "ldr r5, [%[a], #60]\n\t"
  81021. "str r4, [%[r], #68]\n\t"
  81022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81023. "lsrs r6, r5, #1\n\t"
  81024. #else
  81025. "lsr r6, r5, #1\n\t"
  81026. #endif
  81027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81028. "lsls r5, r5, %[n]\n\t"
  81029. #else
  81030. "lsl r5, r5, %[n]\n\t"
  81031. #endif
  81032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81033. "lsrs r6, r6, r7\n\t"
  81034. #else
  81035. "lsr r6, r6, r7\n\t"
  81036. #endif
  81037. #ifdef WOLFSSL_KEIL
  81038. "orrs r3, r3, r6\n\t"
  81039. #elif defined(__clang__)
  81040. "orrs r3, r6\n\t"
  81041. #else
  81042. "orr r3, r6\n\t"
  81043. #endif
  81044. "ldr r4, [%[a], #56]\n\t"
  81045. "str r3, [%[r], #64]\n\t"
  81046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81047. "lsrs r6, r4, #1\n\t"
  81048. #else
  81049. "lsr r6, r4, #1\n\t"
  81050. #endif
  81051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81052. "lsls r4, r4, %[n]\n\t"
  81053. #else
  81054. "lsl r4, r4, %[n]\n\t"
  81055. #endif
  81056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81057. "lsrs r6, r6, r7\n\t"
  81058. #else
  81059. "lsr r6, r6, r7\n\t"
  81060. #endif
  81061. #ifdef WOLFSSL_KEIL
  81062. "orrs r5, r5, r6\n\t"
  81063. #elif defined(__clang__)
  81064. "orrs r5, r6\n\t"
  81065. #else
  81066. "orr r5, r6\n\t"
  81067. #endif
  81068. "ldr r3, [%[a], #52]\n\t"
  81069. "str r5, [%[r], #60]\n\t"
  81070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81071. "lsrs r6, r3, #1\n\t"
  81072. #else
  81073. "lsr r6, r3, #1\n\t"
  81074. #endif
  81075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81076. "lsls r3, r3, %[n]\n\t"
  81077. #else
  81078. "lsl r3, r3, %[n]\n\t"
  81079. #endif
  81080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81081. "lsrs r6, r6, r7\n\t"
  81082. #else
  81083. "lsr r6, r6, r7\n\t"
  81084. #endif
  81085. #ifdef WOLFSSL_KEIL
  81086. "orrs r4, r4, r6\n\t"
  81087. #elif defined(__clang__)
  81088. "orrs r4, r6\n\t"
  81089. #else
  81090. "orr r4, r6\n\t"
  81091. #endif
  81092. "ldr r5, [%[a], #48]\n\t"
  81093. "str r4, [%[r], #56]\n\t"
  81094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81095. "lsrs r6, r5, #1\n\t"
  81096. #else
  81097. "lsr r6, r5, #1\n\t"
  81098. #endif
  81099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81100. "lsls r5, r5, %[n]\n\t"
  81101. #else
  81102. "lsl r5, r5, %[n]\n\t"
  81103. #endif
  81104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81105. "lsrs r6, r6, r7\n\t"
  81106. #else
  81107. "lsr r6, r6, r7\n\t"
  81108. #endif
  81109. #ifdef WOLFSSL_KEIL
  81110. "orrs r3, r3, r6\n\t"
  81111. #elif defined(__clang__)
  81112. "orrs r3, r6\n\t"
  81113. #else
  81114. "orr r3, r6\n\t"
  81115. #endif
  81116. "ldr r4, [%[a], #44]\n\t"
  81117. "str r3, [%[r], #52]\n\t"
  81118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81119. "lsrs r6, r4, #1\n\t"
  81120. #else
  81121. "lsr r6, r4, #1\n\t"
  81122. #endif
  81123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81124. "lsls r4, r4, %[n]\n\t"
  81125. #else
  81126. "lsl r4, r4, %[n]\n\t"
  81127. #endif
  81128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81129. "lsrs r6, r6, r7\n\t"
  81130. #else
  81131. "lsr r6, r6, r7\n\t"
  81132. #endif
  81133. #ifdef WOLFSSL_KEIL
  81134. "orrs r5, r5, r6\n\t"
  81135. #elif defined(__clang__)
  81136. "orrs r5, r6\n\t"
  81137. #else
  81138. "orr r5, r6\n\t"
  81139. #endif
  81140. "ldr r3, [%[a], #40]\n\t"
  81141. "str r5, [%[r], #48]\n\t"
  81142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81143. "lsrs r6, r3, #1\n\t"
  81144. #else
  81145. "lsr r6, r3, #1\n\t"
  81146. #endif
  81147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81148. "lsls r3, r3, %[n]\n\t"
  81149. #else
  81150. "lsl r3, r3, %[n]\n\t"
  81151. #endif
  81152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81153. "lsrs r6, r6, r7\n\t"
  81154. #else
  81155. "lsr r6, r6, r7\n\t"
  81156. #endif
  81157. #ifdef WOLFSSL_KEIL
  81158. "orrs r4, r4, r6\n\t"
  81159. #elif defined(__clang__)
  81160. "orrs r4, r6\n\t"
  81161. #else
  81162. "orr r4, r6\n\t"
  81163. #endif
  81164. "ldr r5, [%[a], #36]\n\t"
  81165. "str r4, [%[r], #44]\n\t"
  81166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81167. "lsrs r6, r5, #1\n\t"
  81168. #else
  81169. "lsr r6, r5, #1\n\t"
  81170. #endif
  81171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81172. "lsls r5, r5, %[n]\n\t"
  81173. #else
  81174. "lsl r5, r5, %[n]\n\t"
  81175. #endif
  81176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81177. "lsrs r6, r6, r7\n\t"
  81178. #else
  81179. "lsr r6, r6, r7\n\t"
  81180. #endif
  81181. #ifdef WOLFSSL_KEIL
  81182. "orrs r3, r3, r6\n\t"
  81183. #elif defined(__clang__)
  81184. "orrs r3, r6\n\t"
  81185. #else
  81186. "orr r3, r6\n\t"
  81187. #endif
  81188. "ldr r4, [%[a], #32]\n\t"
  81189. "str r3, [%[r], #40]\n\t"
  81190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81191. "lsrs r6, r4, #1\n\t"
  81192. #else
  81193. "lsr r6, r4, #1\n\t"
  81194. #endif
  81195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81196. "lsls r4, r4, %[n]\n\t"
  81197. #else
  81198. "lsl r4, r4, %[n]\n\t"
  81199. #endif
  81200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81201. "lsrs r6, r6, r7\n\t"
  81202. #else
  81203. "lsr r6, r6, r7\n\t"
  81204. #endif
  81205. #ifdef WOLFSSL_KEIL
  81206. "orrs r5, r5, r6\n\t"
  81207. #elif defined(__clang__)
  81208. "orrs r5, r6\n\t"
  81209. #else
  81210. "orr r5, r6\n\t"
  81211. #endif
  81212. "ldr r3, [%[a], #28]\n\t"
  81213. "str r5, [%[r], #36]\n\t"
  81214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81215. "lsrs r6, r3, #1\n\t"
  81216. #else
  81217. "lsr r6, r3, #1\n\t"
  81218. #endif
  81219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81220. "lsls r3, r3, %[n]\n\t"
  81221. #else
  81222. "lsl r3, r3, %[n]\n\t"
  81223. #endif
  81224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81225. "lsrs r6, r6, r7\n\t"
  81226. #else
  81227. "lsr r6, r6, r7\n\t"
  81228. #endif
  81229. #ifdef WOLFSSL_KEIL
  81230. "orrs r4, r4, r6\n\t"
  81231. #elif defined(__clang__)
  81232. "orrs r4, r6\n\t"
  81233. #else
  81234. "orr r4, r6\n\t"
  81235. #endif
  81236. "ldr r5, [%[a], #24]\n\t"
  81237. "str r4, [%[r], #32]\n\t"
  81238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81239. "lsrs r6, r5, #1\n\t"
  81240. #else
  81241. "lsr r6, r5, #1\n\t"
  81242. #endif
  81243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81244. "lsls r5, r5, %[n]\n\t"
  81245. #else
  81246. "lsl r5, r5, %[n]\n\t"
  81247. #endif
  81248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81249. "lsrs r6, r6, r7\n\t"
  81250. #else
  81251. "lsr r6, r6, r7\n\t"
  81252. #endif
  81253. #ifdef WOLFSSL_KEIL
  81254. "orrs r3, r3, r6\n\t"
  81255. #elif defined(__clang__)
  81256. "orrs r3, r6\n\t"
  81257. #else
  81258. "orr r3, r6\n\t"
  81259. #endif
  81260. "ldr r4, [%[a], #20]\n\t"
  81261. "str r3, [%[r], #28]\n\t"
  81262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81263. "lsrs r6, r4, #1\n\t"
  81264. #else
  81265. "lsr r6, r4, #1\n\t"
  81266. #endif
  81267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81268. "lsls r4, r4, %[n]\n\t"
  81269. #else
  81270. "lsl r4, r4, %[n]\n\t"
  81271. #endif
  81272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81273. "lsrs r6, r6, r7\n\t"
  81274. #else
  81275. "lsr r6, r6, r7\n\t"
  81276. #endif
  81277. #ifdef WOLFSSL_KEIL
  81278. "orrs r5, r5, r6\n\t"
  81279. #elif defined(__clang__)
  81280. "orrs r5, r6\n\t"
  81281. #else
  81282. "orr r5, r6\n\t"
  81283. #endif
  81284. "ldr r3, [%[a], #16]\n\t"
  81285. "str r5, [%[r], #24]\n\t"
  81286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81287. "lsrs r6, r3, #1\n\t"
  81288. #else
  81289. "lsr r6, r3, #1\n\t"
  81290. #endif
  81291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81292. "lsls r3, r3, %[n]\n\t"
  81293. #else
  81294. "lsl r3, r3, %[n]\n\t"
  81295. #endif
  81296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81297. "lsrs r6, r6, r7\n\t"
  81298. #else
  81299. "lsr r6, r6, r7\n\t"
  81300. #endif
  81301. #ifdef WOLFSSL_KEIL
  81302. "orrs r4, r4, r6\n\t"
  81303. #elif defined(__clang__)
  81304. "orrs r4, r6\n\t"
  81305. #else
  81306. "orr r4, r6\n\t"
  81307. #endif
  81308. "ldr r5, [%[a], #12]\n\t"
  81309. "str r4, [%[r], #20]\n\t"
  81310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81311. "lsrs r6, r5, #1\n\t"
  81312. #else
  81313. "lsr r6, r5, #1\n\t"
  81314. #endif
  81315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81316. "lsls r5, r5, %[n]\n\t"
  81317. #else
  81318. "lsl r5, r5, %[n]\n\t"
  81319. #endif
  81320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81321. "lsrs r6, r6, r7\n\t"
  81322. #else
  81323. "lsr r6, r6, r7\n\t"
  81324. #endif
  81325. #ifdef WOLFSSL_KEIL
  81326. "orrs r3, r3, r6\n\t"
  81327. #elif defined(__clang__)
  81328. "orrs r3, r6\n\t"
  81329. #else
  81330. "orr r3, r6\n\t"
  81331. #endif
  81332. "ldr r4, [%[a], #8]\n\t"
  81333. "str r3, [%[r], #16]\n\t"
  81334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81335. "lsrs r6, r4, #1\n\t"
  81336. #else
  81337. "lsr r6, r4, #1\n\t"
  81338. #endif
  81339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81340. "lsls r4, r4, %[n]\n\t"
  81341. #else
  81342. "lsl r4, r4, %[n]\n\t"
  81343. #endif
  81344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81345. "lsrs r6, r6, r7\n\t"
  81346. #else
  81347. "lsr r6, r6, r7\n\t"
  81348. #endif
  81349. #ifdef WOLFSSL_KEIL
  81350. "orrs r5, r5, r6\n\t"
  81351. #elif defined(__clang__)
  81352. "orrs r5, r6\n\t"
  81353. #else
  81354. "orr r5, r6\n\t"
  81355. #endif
  81356. "ldr r3, [%[a], #4]\n\t"
  81357. "str r5, [%[r], #12]\n\t"
  81358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81359. "lsrs r6, r3, #1\n\t"
  81360. #else
  81361. "lsr r6, r3, #1\n\t"
  81362. #endif
  81363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81364. "lsls r3, r3, %[n]\n\t"
  81365. #else
  81366. "lsl r3, r3, %[n]\n\t"
  81367. #endif
  81368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81369. "lsrs r6, r6, r7\n\t"
  81370. #else
  81371. "lsr r6, r6, r7\n\t"
  81372. #endif
  81373. #ifdef WOLFSSL_KEIL
  81374. "orrs r4, r4, r6\n\t"
  81375. #elif defined(__clang__)
  81376. "orrs r4, r6\n\t"
  81377. #else
  81378. "orr r4, r6\n\t"
  81379. #endif
  81380. "ldr r5, [%[a]]\n\t"
  81381. "str r4, [%[r], #8]\n\t"
  81382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81383. "lsrs r6, r5, #1\n\t"
  81384. #else
  81385. "lsr r6, r5, #1\n\t"
  81386. #endif
  81387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81388. "lsls r5, r5, %[n]\n\t"
  81389. #else
  81390. "lsl r5, r5, %[n]\n\t"
  81391. #endif
  81392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81393. "lsrs r6, r6, r7\n\t"
  81394. #else
  81395. "lsr r6, r6, r7\n\t"
  81396. #endif
  81397. #ifdef WOLFSSL_KEIL
  81398. "orrs r3, r3, r6\n\t"
  81399. #elif defined(__clang__)
  81400. "orrs r3, r6\n\t"
  81401. #else
  81402. "orr r3, r6\n\t"
  81403. #endif
  81404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81405. "subs %[a], %[a], #0x40\n\t"
  81406. #else
  81407. "sub %[a], %[a], #0x40\n\t"
  81408. #endif
  81409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81410. "subs %[r], %[r], #0x40\n\t"
  81411. #else
  81412. "sub %[r], %[r], #0x40\n\t"
  81413. #endif
  81414. "ldr r4, [%[a], #60]\n\t"
  81415. "str r3, [%[r], #68]\n\t"
  81416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81417. "lsrs r6, r4, #1\n\t"
  81418. #else
  81419. "lsr r6, r4, #1\n\t"
  81420. #endif
  81421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81422. "lsls r4, r4, %[n]\n\t"
  81423. #else
  81424. "lsl r4, r4, %[n]\n\t"
  81425. #endif
  81426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81427. "lsrs r6, r6, r7\n\t"
  81428. #else
  81429. "lsr r6, r6, r7\n\t"
  81430. #endif
  81431. #ifdef WOLFSSL_KEIL
  81432. "orrs r5, r5, r6\n\t"
  81433. #elif defined(__clang__)
  81434. "orrs r5, r6\n\t"
  81435. #else
  81436. "orr r5, r6\n\t"
  81437. #endif
  81438. "ldr r3, [%[a], #56]\n\t"
  81439. "str r5, [%[r], #64]\n\t"
  81440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81441. "lsrs r6, r3, #1\n\t"
  81442. #else
  81443. "lsr r6, r3, #1\n\t"
  81444. #endif
  81445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81446. "lsls r3, r3, %[n]\n\t"
  81447. #else
  81448. "lsl r3, r3, %[n]\n\t"
  81449. #endif
  81450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81451. "lsrs r6, r6, r7\n\t"
  81452. #else
  81453. "lsr r6, r6, r7\n\t"
  81454. #endif
  81455. #ifdef WOLFSSL_KEIL
  81456. "orrs r4, r4, r6\n\t"
  81457. #elif defined(__clang__)
  81458. "orrs r4, r6\n\t"
  81459. #else
  81460. "orr r4, r6\n\t"
  81461. #endif
  81462. "ldr r5, [%[a], #52]\n\t"
  81463. "str r4, [%[r], #60]\n\t"
  81464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81465. "lsrs r6, r5, #1\n\t"
  81466. #else
  81467. "lsr r6, r5, #1\n\t"
  81468. #endif
  81469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81470. "lsls r5, r5, %[n]\n\t"
  81471. #else
  81472. "lsl r5, r5, %[n]\n\t"
  81473. #endif
  81474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81475. "lsrs r6, r6, r7\n\t"
  81476. #else
  81477. "lsr r6, r6, r7\n\t"
  81478. #endif
  81479. #ifdef WOLFSSL_KEIL
  81480. "orrs r3, r3, r6\n\t"
  81481. #elif defined(__clang__)
  81482. "orrs r3, r6\n\t"
  81483. #else
  81484. "orr r3, r6\n\t"
  81485. #endif
  81486. "ldr r4, [%[a], #48]\n\t"
  81487. "str r3, [%[r], #56]\n\t"
  81488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81489. "lsrs r6, r4, #1\n\t"
  81490. #else
  81491. "lsr r6, r4, #1\n\t"
  81492. #endif
  81493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81494. "lsls r4, r4, %[n]\n\t"
  81495. #else
  81496. "lsl r4, r4, %[n]\n\t"
  81497. #endif
  81498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81499. "lsrs r6, r6, r7\n\t"
  81500. #else
  81501. "lsr r6, r6, r7\n\t"
  81502. #endif
  81503. #ifdef WOLFSSL_KEIL
  81504. "orrs r5, r5, r6\n\t"
  81505. #elif defined(__clang__)
  81506. "orrs r5, r6\n\t"
  81507. #else
  81508. "orr r5, r6\n\t"
  81509. #endif
  81510. "ldr r3, [%[a], #44]\n\t"
  81511. "str r5, [%[r], #52]\n\t"
  81512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81513. "lsrs r6, r3, #1\n\t"
  81514. #else
  81515. "lsr r6, r3, #1\n\t"
  81516. #endif
  81517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81518. "lsls r3, r3, %[n]\n\t"
  81519. #else
  81520. "lsl r3, r3, %[n]\n\t"
  81521. #endif
  81522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81523. "lsrs r6, r6, r7\n\t"
  81524. #else
  81525. "lsr r6, r6, r7\n\t"
  81526. #endif
  81527. #ifdef WOLFSSL_KEIL
  81528. "orrs r4, r4, r6\n\t"
  81529. #elif defined(__clang__)
  81530. "orrs r4, r6\n\t"
  81531. #else
  81532. "orr r4, r6\n\t"
  81533. #endif
  81534. "ldr r5, [%[a], #40]\n\t"
  81535. "str r4, [%[r], #48]\n\t"
  81536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81537. "lsrs r6, r5, #1\n\t"
  81538. #else
  81539. "lsr r6, r5, #1\n\t"
  81540. #endif
  81541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81542. "lsls r5, r5, %[n]\n\t"
  81543. #else
  81544. "lsl r5, r5, %[n]\n\t"
  81545. #endif
  81546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81547. "lsrs r6, r6, r7\n\t"
  81548. #else
  81549. "lsr r6, r6, r7\n\t"
  81550. #endif
  81551. #ifdef WOLFSSL_KEIL
  81552. "orrs r3, r3, r6\n\t"
  81553. #elif defined(__clang__)
  81554. "orrs r3, r6\n\t"
  81555. #else
  81556. "orr r3, r6\n\t"
  81557. #endif
  81558. "ldr r4, [%[a], #36]\n\t"
  81559. "str r3, [%[r], #44]\n\t"
  81560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81561. "lsrs r6, r4, #1\n\t"
  81562. #else
  81563. "lsr r6, r4, #1\n\t"
  81564. #endif
  81565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81566. "lsls r4, r4, %[n]\n\t"
  81567. #else
  81568. "lsl r4, r4, %[n]\n\t"
  81569. #endif
  81570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81571. "lsrs r6, r6, r7\n\t"
  81572. #else
  81573. "lsr r6, r6, r7\n\t"
  81574. #endif
  81575. #ifdef WOLFSSL_KEIL
  81576. "orrs r5, r5, r6\n\t"
  81577. #elif defined(__clang__)
  81578. "orrs r5, r6\n\t"
  81579. #else
  81580. "orr r5, r6\n\t"
  81581. #endif
  81582. "ldr r3, [%[a], #32]\n\t"
  81583. "str r5, [%[r], #40]\n\t"
  81584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81585. "lsrs r6, r3, #1\n\t"
  81586. #else
  81587. "lsr r6, r3, #1\n\t"
  81588. #endif
  81589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81590. "lsls r3, r3, %[n]\n\t"
  81591. #else
  81592. "lsl r3, r3, %[n]\n\t"
  81593. #endif
  81594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81595. "lsrs r6, r6, r7\n\t"
  81596. #else
  81597. "lsr r6, r6, r7\n\t"
  81598. #endif
  81599. #ifdef WOLFSSL_KEIL
  81600. "orrs r4, r4, r6\n\t"
  81601. #elif defined(__clang__)
  81602. "orrs r4, r6\n\t"
  81603. #else
  81604. "orr r4, r6\n\t"
  81605. #endif
  81606. "ldr r5, [%[a], #28]\n\t"
  81607. "str r4, [%[r], #36]\n\t"
  81608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81609. "lsrs r6, r5, #1\n\t"
  81610. #else
  81611. "lsr r6, r5, #1\n\t"
  81612. #endif
  81613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81614. "lsls r5, r5, %[n]\n\t"
  81615. #else
  81616. "lsl r5, r5, %[n]\n\t"
  81617. #endif
  81618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81619. "lsrs r6, r6, r7\n\t"
  81620. #else
  81621. "lsr r6, r6, r7\n\t"
  81622. #endif
  81623. #ifdef WOLFSSL_KEIL
  81624. "orrs r3, r3, r6\n\t"
  81625. #elif defined(__clang__)
  81626. "orrs r3, r6\n\t"
  81627. #else
  81628. "orr r3, r6\n\t"
  81629. #endif
  81630. "ldr r4, [%[a], #24]\n\t"
  81631. "str r3, [%[r], #32]\n\t"
  81632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81633. "lsrs r6, r4, #1\n\t"
  81634. #else
  81635. "lsr r6, r4, #1\n\t"
  81636. #endif
  81637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81638. "lsls r4, r4, %[n]\n\t"
  81639. #else
  81640. "lsl r4, r4, %[n]\n\t"
  81641. #endif
  81642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81643. "lsrs r6, r6, r7\n\t"
  81644. #else
  81645. "lsr r6, r6, r7\n\t"
  81646. #endif
  81647. #ifdef WOLFSSL_KEIL
  81648. "orrs r5, r5, r6\n\t"
  81649. #elif defined(__clang__)
  81650. "orrs r5, r6\n\t"
  81651. #else
  81652. "orr r5, r6\n\t"
  81653. #endif
  81654. "ldr r3, [%[a], #20]\n\t"
  81655. "str r5, [%[r], #28]\n\t"
  81656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81657. "lsrs r6, r3, #1\n\t"
  81658. #else
  81659. "lsr r6, r3, #1\n\t"
  81660. #endif
  81661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81662. "lsls r3, r3, %[n]\n\t"
  81663. #else
  81664. "lsl r3, r3, %[n]\n\t"
  81665. #endif
  81666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81667. "lsrs r6, r6, r7\n\t"
  81668. #else
  81669. "lsr r6, r6, r7\n\t"
  81670. #endif
  81671. #ifdef WOLFSSL_KEIL
  81672. "orrs r4, r4, r6\n\t"
  81673. #elif defined(__clang__)
  81674. "orrs r4, r6\n\t"
  81675. #else
  81676. "orr r4, r6\n\t"
  81677. #endif
  81678. "ldr r5, [%[a], #16]\n\t"
  81679. "str r4, [%[r], #24]\n\t"
  81680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81681. "lsrs r6, r5, #1\n\t"
  81682. #else
  81683. "lsr r6, r5, #1\n\t"
  81684. #endif
  81685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81686. "lsls r5, r5, %[n]\n\t"
  81687. #else
  81688. "lsl r5, r5, %[n]\n\t"
  81689. #endif
  81690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81691. "lsrs r6, r6, r7\n\t"
  81692. #else
  81693. "lsr r6, r6, r7\n\t"
  81694. #endif
  81695. #ifdef WOLFSSL_KEIL
  81696. "orrs r3, r3, r6\n\t"
  81697. #elif defined(__clang__)
  81698. "orrs r3, r6\n\t"
  81699. #else
  81700. "orr r3, r6\n\t"
  81701. #endif
  81702. "ldr r4, [%[a], #12]\n\t"
  81703. "str r3, [%[r], #20]\n\t"
  81704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81705. "lsrs r6, r4, #1\n\t"
  81706. #else
  81707. "lsr r6, r4, #1\n\t"
  81708. #endif
  81709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81710. "lsls r4, r4, %[n]\n\t"
  81711. #else
  81712. "lsl r4, r4, %[n]\n\t"
  81713. #endif
  81714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81715. "lsrs r6, r6, r7\n\t"
  81716. #else
  81717. "lsr r6, r6, r7\n\t"
  81718. #endif
  81719. #ifdef WOLFSSL_KEIL
  81720. "orrs r5, r5, r6\n\t"
  81721. #elif defined(__clang__)
  81722. "orrs r5, r6\n\t"
  81723. #else
  81724. "orr r5, r6\n\t"
  81725. #endif
  81726. "ldr r3, [%[a], #8]\n\t"
  81727. "str r5, [%[r], #16]\n\t"
  81728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81729. "lsrs r6, r3, #1\n\t"
  81730. #else
  81731. "lsr r6, r3, #1\n\t"
  81732. #endif
  81733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81734. "lsls r3, r3, %[n]\n\t"
  81735. #else
  81736. "lsl r3, r3, %[n]\n\t"
  81737. #endif
  81738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81739. "lsrs r6, r6, r7\n\t"
  81740. #else
  81741. "lsr r6, r6, r7\n\t"
  81742. #endif
  81743. #ifdef WOLFSSL_KEIL
  81744. "orrs r4, r4, r6\n\t"
  81745. #elif defined(__clang__)
  81746. "orrs r4, r6\n\t"
  81747. #else
  81748. "orr r4, r6\n\t"
  81749. #endif
  81750. "ldr r5, [%[a], #4]\n\t"
  81751. "str r4, [%[r], #12]\n\t"
  81752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81753. "lsrs r6, r5, #1\n\t"
  81754. #else
  81755. "lsr r6, r5, #1\n\t"
  81756. #endif
  81757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81758. "lsls r5, r5, %[n]\n\t"
  81759. #else
  81760. "lsl r5, r5, %[n]\n\t"
  81761. #endif
  81762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81763. "lsrs r6, r6, r7\n\t"
  81764. #else
  81765. "lsr r6, r6, r7\n\t"
  81766. #endif
  81767. #ifdef WOLFSSL_KEIL
  81768. "orrs r3, r3, r6\n\t"
  81769. #elif defined(__clang__)
  81770. "orrs r3, r6\n\t"
  81771. #else
  81772. "orr r3, r6\n\t"
  81773. #endif
  81774. "ldr r4, [%[a]]\n\t"
  81775. "str r3, [%[r], #8]\n\t"
  81776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81777. "lsrs r6, r4, #1\n\t"
  81778. #else
  81779. "lsr r6, r4, #1\n\t"
  81780. #endif
  81781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81782. "lsls r4, r4, %[n]\n\t"
  81783. #else
  81784. "lsl r4, r4, %[n]\n\t"
  81785. #endif
  81786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81787. "lsrs r6, r6, r7\n\t"
  81788. #else
  81789. "lsr r6, r6, r7\n\t"
  81790. #endif
  81791. #ifdef WOLFSSL_KEIL
  81792. "orrs r5, r5, r6\n\t"
  81793. #elif defined(__clang__)
  81794. "orrs r5, r6\n\t"
  81795. #else
  81796. "orr r5, r6\n\t"
  81797. #endif
  81798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81799. "subs %[a], %[a], #0x40\n\t"
  81800. #else
  81801. "sub %[a], %[a], #0x40\n\t"
  81802. #endif
  81803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81804. "subs %[r], %[r], #0x40\n\t"
  81805. #else
  81806. "sub %[r], %[r], #0x40\n\t"
  81807. #endif
  81808. "ldr r3, [%[a], #60]\n\t"
  81809. "str r5, [%[r], #68]\n\t"
  81810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81811. "lsrs r6, r3, #1\n\t"
  81812. #else
  81813. "lsr r6, r3, #1\n\t"
  81814. #endif
  81815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81816. "lsls r3, r3, %[n]\n\t"
  81817. #else
  81818. "lsl r3, r3, %[n]\n\t"
  81819. #endif
  81820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81821. "lsrs r6, r6, r7\n\t"
  81822. #else
  81823. "lsr r6, r6, r7\n\t"
  81824. #endif
  81825. #ifdef WOLFSSL_KEIL
  81826. "orrs r4, r4, r6\n\t"
  81827. #elif defined(__clang__)
  81828. "orrs r4, r6\n\t"
  81829. #else
  81830. "orr r4, r6\n\t"
  81831. #endif
  81832. "ldr r5, [%[a], #56]\n\t"
  81833. "str r4, [%[r], #64]\n\t"
  81834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81835. "lsrs r6, r5, #1\n\t"
  81836. #else
  81837. "lsr r6, r5, #1\n\t"
  81838. #endif
  81839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81840. "lsls r5, r5, %[n]\n\t"
  81841. #else
  81842. "lsl r5, r5, %[n]\n\t"
  81843. #endif
  81844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81845. "lsrs r6, r6, r7\n\t"
  81846. #else
  81847. "lsr r6, r6, r7\n\t"
  81848. #endif
  81849. #ifdef WOLFSSL_KEIL
  81850. "orrs r3, r3, r6\n\t"
  81851. #elif defined(__clang__)
  81852. "orrs r3, r6\n\t"
  81853. #else
  81854. "orr r3, r6\n\t"
  81855. #endif
  81856. "ldr r4, [%[a], #52]\n\t"
  81857. "str r3, [%[r], #60]\n\t"
  81858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81859. "lsrs r6, r4, #1\n\t"
  81860. #else
  81861. "lsr r6, r4, #1\n\t"
  81862. #endif
  81863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81864. "lsls r4, r4, %[n]\n\t"
  81865. #else
  81866. "lsl r4, r4, %[n]\n\t"
  81867. #endif
  81868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81869. "lsrs r6, r6, r7\n\t"
  81870. #else
  81871. "lsr r6, r6, r7\n\t"
  81872. #endif
  81873. #ifdef WOLFSSL_KEIL
  81874. "orrs r5, r5, r6\n\t"
  81875. #elif defined(__clang__)
  81876. "orrs r5, r6\n\t"
  81877. #else
  81878. "orr r5, r6\n\t"
  81879. #endif
  81880. "ldr r3, [%[a], #48]\n\t"
  81881. "str r5, [%[r], #56]\n\t"
  81882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81883. "lsrs r6, r3, #1\n\t"
  81884. #else
  81885. "lsr r6, r3, #1\n\t"
  81886. #endif
  81887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81888. "lsls r3, r3, %[n]\n\t"
  81889. #else
  81890. "lsl r3, r3, %[n]\n\t"
  81891. #endif
  81892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81893. "lsrs r6, r6, r7\n\t"
  81894. #else
  81895. "lsr r6, r6, r7\n\t"
  81896. #endif
  81897. #ifdef WOLFSSL_KEIL
  81898. "orrs r4, r4, r6\n\t"
  81899. #elif defined(__clang__)
  81900. "orrs r4, r6\n\t"
  81901. #else
  81902. "orr r4, r6\n\t"
  81903. #endif
  81904. "ldr r5, [%[a], #44]\n\t"
  81905. "str r4, [%[r], #52]\n\t"
  81906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81907. "lsrs r6, r5, #1\n\t"
  81908. #else
  81909. "lsr r6, r5, #1\n\t"
  81910. #endif
  81911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81912. "lsls r5, r5, %[n]\n\t"
  81913. #else
  81914. "lsl r5, r5, %[n]\n\t"
  81915. #endif
  81916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81917. "lsrs r6, r6, r7\n\t"
  81918. #else
  81919. "lsr r6, r6, r7\n\t"
  81920. #endif
  81921. #ifdef WOLFSSL_KEIL
  81922. "orrs r3, r3, r6\n\t"
  81923. #elif defined(__clang__)
  81924. "orrs r3, r6\n\t"
  81925. #else
  81926. "orr r3, r6\n\t"
  81927. #endif
  81928. "ldr r4, [%[a], #40]\n\t"
  81929. "str r3, [%[r], #48]\n\t"
  81930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81931. "lsrs r6, r4, #1\n\t"
  81932. #else
  81933. "lsr r6, r4, #1\n\t"
  81934. #endif
  81935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81936. "lsls r4, r4, %[n]\n\t"
  81937. #else
  81938. "lsl r4, r4, %[n]\n\t"
  81939. #endif
  81940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81941. "lsrs r6, r6, r7\n\t"
  81942. #else
  81943. "lsr r6, r6, r7\n\t"
  81944. #endif
  81945. #ifdef WOLFSSL_KEIL
  81946. "orrs r5, r5, r6\n\t"
  81947. #elif defined(__clang__)
  81948. "orrs r5, r6\n\t"
  81949. #else
  81950. "orr r5, r6\n\t"
  81951. #endif
  81952. "ldr r3, [%[a], #36]\n\t"
  81953. "str r5, [%[r], #44]\n\t"
  81954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81955. "lsrs r6, r3, #1\n\t"
  81956. #else
  81957. "lsr r6, r3, #1\n\t"
  81958. #endif
  81959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81960. "lsls r3, r3, %[n]\n\t"
  81961. #else
  81962. "lsl r3, r3, %[n]\n\t"
  81963. #endif
  81964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81965. "lsrs r6, r6, r7\n\t"
  81966. #else
  81967. "lsr r6, r6, r7\n\t"
  81968. #endif
  81969. #ifdef WOLFSSL_KEIL
  81970. "orrs r4, r4, r6\n\t"
  81971. #elif defined(__clang__)
  81972. "orrs r4, r6\n\t"
  81973. #else
  81974. "orr r4, r6\n\t"
  81975. #endif
  81976. "ldr r5, [%[a], #32]\n\t"
  81977. "str r4, [%[r], #40]\n\t"
  81978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81979. "lsrs r6, r5, #1\n\t"
  81980. #else
  81981. "lsr r6, r5, #1\n\t"
  81982. #endif
  81983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81984. "lsls r5, r5, %[n]\n\t"
  81985. #else
  81986. "lsl r5, r5, %[n]\n\t"
  81987. #endif
  81988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81989. "lsrs r6, r6, r7\n\t"
  81990. #else
  81991. "lsr r6, r6, r7\n\t"
  81992. #endif
  81993. #ifdef WOLFSSL_KEIL
  81994. "orrs r3, r3, r6\n\t"
  81995. #elif defined(__clang__)
  81996. "orrs r3, r6\n\t"
  81997. #else
  81998. "orr r3, r6\n\t"
  81999. #endif
  82000. "ldr r4, [%[a], #28]\n\t"
  82001. "str r3, [%[r], #36]\n\t"
  82002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82003. "lsrs r6, r4, #1\n\t"
  82004. #else
  82005. "lsr r6, r4, #1\n\t"
  82006. #endif
  82007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82008. "lsls r4, r4, %[n]\n\t"
  82009. #else
  82010. "lsl r4, r4, %[n]\n\t"
  82011. #endif
  82012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82013. "lsrs r6, r6, r7\n\t"
  82014. #else
  82015. "lsr r6, r6, r7\n\t"
  82016. #endif
  82017. #ifdef WOLFSSL_KEIL
  82018. "orrs r5, r5, r6\n\t"
  82019. #elif defined(__clang__)
  82020. "orrs r5, r6\n\t"
  82021. #else
  82022. "orr r5, r6\n\t"
  82023. #endif
  82024. "ldr r3, [%[a], #24]\n\t"
  82025. "str r5, [%[r], #32]\n\t"
  82026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82027. "lsrs r6, r3, #1\n\t"
  82028. #else
  82029. "lsr r6, r3, #1\n\t"
  82030. #endif
  82031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82032. "lsls r3, r3, %[n]\n\t"
  82033. #else
  82034. "lsl r3, r3, %[n]\n\t"
  82035. #endif
  82036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82037. "lsrs r6, r6, r7\n\t"
  82038. #else
  82039. "lsr r6, r6, r7\n\t"
  82040. #endif
  82041. #ifdef WOLFSSL_KEIL
  82042. "orrs r4, r4, r6\n\t"
  82043. #elif defined(__clang__)
  82044. "orrs r4, r6\n\t"
  82045. #else
  82046. "orr r4, r6\n\t"
  82047. #endif
  82048. "ldr r5, [%[a], #20]\n\t"
  82049. "str r4, [%[r], #28]\n\t"
  82050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82051. "lsrs r6, r5, #1\n\t"
  82052. #else
  82053. "lsr r6, r5, #1\n\t"
  82054. #endif
  82055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82056. "lsls r5, r5, %[n]\n\t"
  82057. #else
  82058. "lsl r5, r5, %[n]\n\t"
  82059. #endif
  82060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82061. "lsrs r6, r6, r7\n\t"
  82062. #else
  82063. "lsr r6, r6, r7\n\t"
  82064. #endif
  82065. #ifdef WOLFSSL_KEIL
  82066. "orrs r3, r3, r6\n\t"
  82067. #elif defined(__clang__)
  82068. "orrs r3, r6\n\t"
  82069. #else
  82070. "orr r3, r6\n\t"
  82071. #endif
  82072. "ldr r4, [%[a], #16]\n\t"
  82073. "str r3, [%[r], #24]\n\t"
  82074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82075. "lsrs r6, r4, #1\n\t"
  82076. #else
  82077. "lsr r6, r4, #1\n\t"
  82078. #endif
  82079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82080. "lsls r4, r4, %[n]\n\t"
  82081. #else
  82082. "lsl r4, r4, %[n]\n\t"
  82083. #endif
  82084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82085. "lsrs r6, r6, r7\n\t"
  82086. #else
  82087. "lsr r6, r6, r7\n\t"
  82088. #endif
  82089. #ifdef WOLFSSL_KEIL
  82090. "orrs r5, r5, r6\n\t"
  82091. #elif defined(__clang__)
  82092. "orrs r5, r6\n\t"
  82093. #else
  82094. "orr r5, r6\n\t"
  82095. #endif
  82096. "ldr r3, [%[a], #12]\n\t"
  82097. "str r5, [%[r], #20]\n\t"
  82098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82099. "lsrs r6, r3, #1\n\t"
  82100. #else
  82101. "lsr r6, r3, #1\n\t"
  82102. #endif
  82103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82104. "lsls r3, r3, %[n]\n\t"
  82105. #else
  82106. "lsl r3, r3, %[n]\n\t"
  82107. #endif
  82108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82109. "lsrs r6, r6, r7\n\t"
  82110. #else
  82111. "lsr r6, r6, r7\n\t"
  82112. #endif
  82113. #ifdef WOLFSSL_KEIL
  82114. "orrs r4, r4, r6\n\t"
  82115. #elif defined(__clang__)
  82116. "orrs r4, r6\n\t"
  82117. #else
  82118. "orr r4, r6\n\t"
  82119. #endif
  82120. "ldr r5, [%[a], #8]\n\t"
  82121. "str r4, [%[r], #16]\n\t"
  82122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82123. "lsrs r6, r5, #1\n\t"
  82124. #else
  82125. "lsr r6, r5, #1\n\t"
  82126. #endif
  82127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82128. "lsls r5, r5, %[n]\n\t"
  82129. #else
  82130. "lsl r5, r5, %[n]\n\t"
  82131. #endif
  82132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82133. "lsrs r6, r6, r7\n\t"
  82134. #else
  82135. "lsr r6, r6, r7\n\t"
  82136. #endif
  82137. #ifdef WOLFSSL_KEIL
  82138. "orrs r3, r3, r6\n\t"
  82139. #elif defined(__clang__)
  82140. "orrs r3, r6\n\t"
  82141. #else
  82142. "orr r3, r6\n\t"
  82143. #endif
  82144. "ldr r4, [%[a], #4]\n\t"
  82145. "str r3, [%[r], #12]\n\t"
  82146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82147. "lsrs r6, r4, #1\n\t"
  82148. #else
  82149. "lsr r6, r4, #1\n\t"
  82150. #endif
  82151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82152. "lsls r4, r4, %[n]\n\t"
  82153. #else
  82154. "lsl r4, r4, %[n]\n\t"
  82155. #endif
  82156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82157. "lsrs r6, r6, r7\n\t"
  82158. #else
  82159. "lsr r6, r6, r7\n\t"
  82160. #endif
  82161. #ifdef WOLFSSL_KEIL
  82162. "orrs r5, r5, r6\n\t"
  82163. #elif defined(__clang__)
  82164. "orrs r5, r6\n\t"
  82165. #else
  82166. "orr r5, r6\n\t"
  82167. #endif
  82168. "ldr r3, [%[a]]\n\t"
  82169. "str r5, [%[r], #8]\n\t"
  82170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82171. "lsrs r6, r3, #1\n\t"
  82172. #else
  82173. "lsr r6, r3, #1\n\t"
  82174. #endif
  82175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82176. "lsls r3, r3, %[n]\n\t"
  82177. #else
  82178. "lsl r3, r3, %[n]\n\t"
  82179. #endif
  82180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82181. "lsrs r6, r6, r7\n\t"
  82182. #else
  82183. "lsr r6, r6, r7\n\t"
  82184. #endif
  82185. #ifdef WOLFSSL_KEIL
  82186. "orrs r4, r4, r6\n\t"
  82187. #elif defined(__clang__)
  82188. "orrs r4, r6\n\t"
  82189. #else
  82190. "orr r4, r6\n\t"
  82191. #endif
  82192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82193. "subs %[a], %[a], #0x40\n\t"
  82194. #else
  82195. "sub %[a], %[a], #0x40\n\t"
  82196. #endif
  82197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82198. "subs %[r], %[r], #0x40\n\t"
  82199. #else
  82200. "sub %[r], %[r], #0x40\n\t"
  82201. #endif
  82202. "ldr r5, [%[a], #60]\n\t"
  82203. "str r4, [%[r], #68]\n\t"
  82204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82205. "lsrs r6, r5, #1\n\t"
  82206. #else
  82207. "lsr r6, r5, #1\n\t"
  82208. #endif
  82209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82210. "lsls r5, r5, %[n]\n\t"
  82211. #else
  82212. "lsl r5, r5, %[n]\n\t"
  82213. #endif
  82214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82215. "lsrs r6, r6, r7\n\t"
  82216. #else
  82217. "lsr r6, r6, r7\n\t"
  82218. #endif
  82219. #ifdef WOLFSSL_KEIL
  82220. "orrs r3, r3, r6\n\t"
  82221. #elif defined(__clang__)
  82222. "orrs r3, r6\n\t"
  82223. #else
  82224. "orr r3, r6\n\t"
  82225. #endif
  82226. "ldr r4, [%[a], #56]\n\t"
  82227. "str r3, [%[r], #64]\n\t"
  82228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82229. "lsrs r6, r4, #1\n\t"
  82230. #else
  82231. "lsr r6, r4, #1\n\t"
  82232. #endif
  82233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82234. "lsls r4, r4, %[n]\n\t"
  82235. #else
  82236. "lsl r4, r4, %[n]\n\t"
  82237. #endif
  82238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82239. "lsrs r6, r6, r7\n\t"
  82240. #else
  82241. "lsr r6, r6, r7\n\t"
  82242. #endif
  82243. #ifdef WOLFSSL_KEIL
  82244. "orrs r5, r5, r6\n\t"
  82245. #elif defined(__clang__)
  82246. "orrs r5, r6\n\t"
  82247. #else
  82248. "orr r5, r6\n\t"
  82249. #endif
  82250. "ldr r3, [%[a], #52]\n\t"
  82251. "str r5, [%[r], #60]\n\t"
  82252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82253. "lsrs r6, r3, #1\n\t"
  82254. #else
  82255. "lsr r6, r3, #1\n\t"
  82256. #endif
  82257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82258. "lsls r3, r3, %[n]\n\t"
  82259. #else
  82260. "lsl r3, r3, %[n]\n\t"
  82261. #endif
  82262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82263. "lsrs r6, r6, r7\n\t"
  82264. #else
  82265. "lsr r6, r6, r7\n\t"
  82266. #endif
  82267. #ifdef WOLFSSL_KEIL
  82268. "orrs r4, r4, r6\n\t"
  82269. #elif defined(__clang__)
  82270. "orrs r4, r6\n\t"
  82271. #else
  82272. "orr r4, r6\n\t"
  82273. #endif
  82274. "ldr r5, [%[a], #48]\n\t"
  82275. "str r4, [%[r], #56]\n\t"
  82276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82277. "lsrs r6, r5, #1\n\t"
  82278. #else
  82279. "lsr r6, r5, #1\n\t"
  82280. #endif
  82281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82282. "lsls r5, r5, %[n]\n\t"
  82283. #else
  82284. "lsl r5, r5, %[n]\n\t"
  82285. #endif
  82286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82287. "lsrs r6, r6, r7\n\t"
  82288. #else
  82289. "lsr r6, r6, r7\n\t"
  82290. #endif
  82291. #ifdef WOLFSSL_KEIL
  82292. "orrs r3, r3, r6\n\t"
  82293. #elif defined(__clang__)
  82294. "orrs r3, r6\n\t"
  82295. #else
  82296. "orr r3, r6\n\t"
  82297. #endif
  82298. "ldr r4, [%[a], #44]\n\t"
  82299. "str r3, [%[r], #52]\n\t"
  82300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82301. "lsrs r6, r4, #1\n\t"
  82302. #else
  82303. "lsr r6, r4, #1\n\t"
  82304. #endif
  82305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82306. "lsls r4, r4, %[n]\n\t"
  82307. #else
  82308. "lsl r4, r4, %[n]\n\t"
  82309. #endif
  82310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82311. "lsrs r6, r6, r7\n\t"
  82312. #else
  82313. "lsr r6, r6, r7\n\t"
  82314. #endif
  82315. #ifdef WOLFSSL_KEIL
  82316. "orrs r5, r5, r6\n\t"
  82317. #elif defined(__clang__)
  82318. "orrs r5, r6\n\t"
  82319. #else
  82320. "orr r5, r6\n\t"
  82321. #endif
  82322. "ldr r3, [%[a], #40]\n\t"
  82323. "str r5, [%[r], #48]\n\t"
  82324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82325. "lsrs r6, r3, #1\n\t"
  82326. #else
  82327. "lsr r6, r3, #1\n\t"
  82328. #endif
  82329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82330. "lsls r3, r3, %[n]\n\t"
  82331. #else
  82332. "lsl r3, r3, %[n]\n\t"
  82333. #endif
  82334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82335. "lsrs r6, r6, r7\n\t"
  82336. #else
  82337. "lsr r6, r6, r7\n\t"
  82338. #endif
  82339. #ifdef WOLFSSL_KEIL
  82340. "orrs r4, r4, r6\n\t"
  82341. #elif defined(__clang__)
  82342. "orrs r4, r6\n\t"
  82343. #else
  82344. "orr r4, r6\n\t"
  82345. #endif
  82346. "ldr r5, [%[a], #36]\n\t"
  82347. "str r4, [%[r], #44]\n\t"
  82348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82349. "lsrs r6, r5, #1\n\t"
  82350. #else
  82351. "lsr r6, r5, #1\n\t"
  82352. #endif
  82353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82354. "lsls r5, r5, %[n]\n\t"
  82355. #else
  82356. "lsl r5, r5, %[n]\n\t"
  82357. #endif
  82358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82359. "lsrs r6, r6, r7\n\t"
  82360. #else
  82361. "lsr r6, r6, r7\n\t"
  82362. #endif
  82363. #ifdef WOLFSSL_KEIL
  82364. "orrs r3, r3, r6\n\t"
  82365. #elif defined(__clang__)
  82366. "orrs r3, r6\n\t"
  82367. #else
  82368. "orr r3, r6\n\t"
  82369. #endif
  82370. "ldr r4, [%[a], #32]\n\t"
  82371. "str r3, [%[r], #40]\n\t"
  82372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82373. "lsrs r6, r4, #1\n\t"
  82374. #else
  82375. "lsr r6, r4, #1\n\t"
  82376. #endif
  82377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82378. "lsls r4, r4, %[n]\n\t"
  82379. #else
  82380. "lsl r4, r4, %[n]\n\t"
  82381. #endif
  82382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82383. "lsrs r6, r6, r7\n\t"
  82384. #else
  82385. "lsr r6, r6, r7\n\t"
  82386. #endif
  82387. #ifdef WOLFSSL_KEIL
  82388. "orrs r5, r5, r6\n\t"
  82389. #elif defined(__clang__)
  82390. "orrs r5, r6\n\t"
  82391. #else
  82392. "orr r5, r6\n\t"
  82393. #endif
  82394. "ldr r3, [%[a], #28]\n\t"
  82395. "str r5, [%[r], #36]\n\t"
  82396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82397. "lsrs r6, r3, #1\n\t"
  82398. #else
  82399. "lsr r6, r3, #1\n\t"
  82400. #endif
  82401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82402. "lsls r3, r3, %[n]\n\t"
  82403. #else
  82404. "lsl r3, r3, %[n]\n\t"
  82405. #endif
  82406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82407. "lsrs r6, r6, r7\n\t"
  82408. #else
  82409. "lsr r6, r6, r7\n\t"
  82410. #endif
  82411. #ifdef WOLFSSL_KEIL
  82412. "orrs r4, r4, r6\n\t"
  82413. #elif defined(__clang__)
  82414. "orrs r4, r6\n\t"
  82415. #else
  82416. "orr r4, r6\n\t"
  82417. #endif
  82418. "ldr r5, [%[a], #24]\n\t"
  82419. "str r4, [%[r], #32]\n\t"
  82420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82421. "lsrs r6, r5, #1\n\t"
  82422. #else
  82423. "lsr r6, r5, #1\n\t"
  82424. #endif
  82425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82426. "lsls r5, r5, %[n]\n\t"
  82427. #else
  82428. "lsl r5, r5, %[n]\n\t"
  82429. #endif
  82430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82431. "lsrs r6, r6, r7\n\t"
  82432. #else
  82433. "lsr r6, r6, r7\n\t"
  82434. #endif
  82435. #ifdef WOLFSSL_KEIL
  82436. "orrs r3, r3, r6\n\t"
  82437. #elif defined(__clang__)
  82438. "orrs r3, r6\n\t"
  82439. #else
  82440. "orr r3, r6\n\t"
  82441. #endif
  82442. "ldr r4, [%[a], #20]\n\t"
  82443. "str r3, [%[r], #28]\n\t"
  82444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82445. "lsrs r6, r4, #1\n\t"
  82446. #else
  82447. "lsr r6, r4, #1\n\t"
  82448. #endif
  82449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82450. "lsls r4, r4, %[n]\n\t"
  82451. #else
  82452. "lsl r4, r4, %[n]\n\t"
  82453. #endif
  82454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82455. "lsrs r6, r6, r7\n\t"
  82456. #else
  82457. "lsr r6, r6, r7\n\t"
  82458. #endif
  82459. #ifdef WOLFSSL_KEIL
  82460. "orrs r5, r5, r6\n\t"
  82461. #elif defined(__clang__)
  82462. "orrs r5, r6\n\t"
  82463. #else
  82464. "orr r5, r6\n\t"
  82465. #endif
  82466. "ldr r3, [%[a], #16]\n\t"
  82467. "str r5, [%[r], #24]\n\t"
  82468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82469. "lsrs r6, r3, #1\n\t"
  82470. #else
  82471. "lsr r6, r3, #1\n\t"
  82472. #endif
  82473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82474. "lsls r3, r3, %[n]\n\t"
  82475. #else
  82476. "lsl r3, r3, %[n]\n\t"
  82477. #endif
  82478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82479. "lsrs r6, r6, r7\n\t"
  82480. #else
  82481. "lsr r6, r6, r7\n\t"
  82482. #endif
  82483. #ifdef WOLFSSL_KEIL
  82484. "orrs r4, r4, r6\n\t"
  82485. #elif defined(__clang__)
  82486. "orrs r4, r6\n\t"
  82487. #else
  82488. "orr r4, r6\n\t"
  82489. #endif
  82490. "ldr r5, [%[a], #12]\n\t"
  82491. "str r4, [%[r], #20]\n\t"
  82492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82493. "lsrs r6, r5, #1\n\t"
  82494. #else
  82495. "lsr r6, r5, #1\n\t"
  82496. #endif
  82497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82498. "lsls r5, r5, %[n]\n\t"
  82499. #else
  82500. "lsl r5, r5, %[n]\n\t"
  82501. #endif
  82502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82503. "lsrs r6, r6, r7\n\t"
  82504. #else
  82505. "lsr r6, r6, r7\n\t"
  82506. #endif
  82507. #ifdef WOLFSSL_KEIL
  82508. "orrs r3, r3, r6\n\t"
  82509. #elif defined(__clang__)
  82510. "orrs r3, r6\n\t"
  82511. #else
  82512. "orr r3, r6\n\t"
  82513. #endif
  82514. "ldr r4, [%[a], #8]\n\t"
  82515. "str r3, [%[r], #16]\n\t"
  82516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82517. "lsrs r6, r4, #1\n\t"
  82518. #else
  82519. "lsr r6, r4, #1\n\t"
  82520. #endif
  82521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82522. "lsls r4, r4, %[n]\n\t"
  82523. #else
  82524. "lsl r4, r4, %[n]\n\t"
  82525. #endif
  82526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82527. "lsrs r6, r6, r7\n\t"
  82528. #else
  82529. "lsr r6, r6, r7\n\t"
  82530. #endif
  82531. #ifdef WOLFSSL_KEIL
  82532. "orrs r5, r5, r6\n\t"
  82533. #elif defined(__clang__)
  82534. "orrs r5, r6\n\t"
  82535. #else
  82536. "orr r5, r6\n\t"
  82537. #endif
  82538. "ldr r3, [%[a], #4]\n\t"
  82539. "str r5, [%[r], #12]\n\t"
  82540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82541. "lsrs r6, r3, #1\n\t"
  82542. #else
  82543. "lsr r6, r3, #1\n\t"
  82544. #endif
  82545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82546. "lsls r3, r3, %[n]\n\t"
  82547. #else
  82548. "lsl r3, r3, %[n]\n\t"
  82549. #endif
  82550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82551. "lsrs r6, r6, r7\n\t"
  82552. #else
  82553. "lsr r6, r6, r7\n\t"
  82554. #endif
  82555. #ifdef WOLFSSL_KEIL
  82556. "orrs r4, r4, r6\n\t"
  82557. #elif defined(__clang__)
  82558. "orrs r4, r6\n\t"
  82559. #else
  82560. "orr r4, r6\n\t"
  82561. #endif
  82562. "ldr r5, [%[a]]\n\t"
  82563. "str r4, [%[r], #8]\n\t"
  82564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82565. "lsrs r6, r5, #1\n\t"
  82566. #else
  82567. "lsr r6, r5, #1\n\t"
  82568. #endif
  82569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82570. "lsls r5, r5, %[n]\n\t"
  82571. #else
  82572. "lsl r5, r5, %[n]\n\t"
  82573. #endif
  82574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82575. "lsrs r6, r6, r7\n\t"
  82576. #else
  82577. "lsr r6, r6, r7\n\t"
  82578. #endif
  82579. #ifdef WOLFSSL_KEIL
  82580. "orrs r3, r3, r6\n\t"
  82581. #elif defined(__clang__)
  82582. "orrs r3, r6\n\t"
  82583. #else
  82584. "orr r3, r6\n\t"
  82585. #endif
  82586. "str r5, [%[r]]\n\t"
  82587. "str r3, [%[r], #4]\n\t"
  82588. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  82589. :
  82590. : "memory", "r3", "r4", "r5", "r6", "r7"
  82591. );
  82592. }
  82593. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  82594. *
  82595. * r A single precision number that is the result of the operation.
  82596. * e A single precision number that is the exponent.
  82597. * bits The number of bits in the exponent.
  82598. * m A single precision number that is the modulus.
  82599. * returns 0 on success.
  82600. * returns MEMORY_E on dynamic memory allocation failure.
  82601. * returns MP_VAL when base is even.
  82602. */
  82603. static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits,
  82604. const sp_digit* m)
  82605. {
  82606. #ifdef WOLFSSL_SP_SMALL_STACK
  82607. sp_digit* td = NULL;
  82608. #else
  82609. sp_digit td[289];
  82610. #endif
  82611. sp_digit* norm = NULL;
  82612. sp_digit* tmp = NULL;
  82613. sp_digit mp = 1;
  82614. sp_digit n;
  82615. sp_digit o;
  82616. sp_digit mask;
  82617. int i;
  82618. int c;
  82619. byte y;
  82620. int err = MP_OKAY;
  82621. if (bits == 0) {
  82622. err = MP_VAL;
  82623. }
  82624. #ifdef WOLFSSL_SP_SMALL_STACK
  82625. if (err == MP_OKAY) {
  82626. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 289, NULL,
  82627. DYNAMIC_TYPE_TMP_BUFFER);
  82628. if (td == NULL)
  82629. err = MEMORY_E;
  82630. }
  82631. #endif
  82632. if (err == MP_OKAY) {
  82633. norm = td;
  82634. tmp = td + 192;
  82635. sp_3072_mont_setup(m, &mp);
  82636. sp_3072_mont_norm_96(norm, m);
  82637. i = (bits - 1) / 32;
  82638. n = e[i--];
  82639. c = bits & 31;
  82640. if (c == 0) {
  82641. c = 32;
  82642. }
  82643. c -= bits % 5;
  82644. if (c == 32) {
  82645. c = 27;
  82646. }
  82647. if (c < 0) {
  82648. /* Number of bits in top word is less than number needed. */
  82649. c = -c;
  82650. y = (byte)(n << c);
  82651. n = e[i--];
  82652. y |= (byte)(n >> (64 - c));
  82653. n <<= c;
  82654. c = 64 - c;
  82655. }
  82656. else if (c == 0) {
  82657. /* All bits in top word used. */
  82658. y = (byte)n;
  82659. }
  82660. else {
  82661. y = (byte)(n >> c);
  82662. n <<= 32 - c;
  82663. }
  82664. sp_3072_lshift_96(r, norm, y);
  82665. for (; i>=0 || c>=5; ) {
  82666. if (c == 0) {
  82667. n = e[i--];
  82668. y = (byte)(n >> 27);
  82669. n <<= 5;
  82670. c = 27;
  82671. }
  82672. else if (c < 5) {
  82673. y = (byte)(n >> 27);
  82674. n = e[i--];
  82675. c = 5 - c;
  82676. y |= (byte)(n >> (32 - c));
  82677. n <<= c;
  82678. c = 32 - c;
  82679. }
  82680. else {
  82681. y = (byte)((n >> 27) & 0x1f);
  82682. n <<= 5;
  82683. c -= 5;
  82684. }
  82685. sp_3072_mont_sqr_96(r, r, m, mp);
  82686. sp_3072_mont_sqr_96(r, r, m, mp);
  82687. sp_3072_mont_sqr_96(r, r, m, mp);
  82688. sp_3072_mont_sqr_96(r, r, m, mp);
  82689. sp_3072_mont_sqr_96(r, r, m, mp);
  82690. sp_3072_lshift_96(r, r, y);
  82691. sp_3072_mul_d_96(tmp, norm, r[96]);
  82692. r[96] = 0;
  82693. o = sp_3072_add_96(r, r, tmp);
  82694. sp_3072_cond_sub_96(r, r, m, (sp_digit)0 - o);
  82695. }
  82696. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  82697. sp_3072_mont_reduce_96(r, m, mp);
  82698. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  82699. sp_3072_cond_sub_96(r, r, m, mask);
  82700. }
  82701. #ifdef WOLFSSL_SP_SMALL_STACK
  82702. if (td != NULL)
  82703. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  82704. #endif
  82705. return err;
  82706. }
  82707. #endif /* HAVE_FFDHE_3072 */
  82708. /* Perform the modular exponentiation for Diffie-Hellman.
  82709. *
  82710. * base Base.
  82711. * exp Array of bytes that is the exponent.
  82712. * expLen Length of data, in bytes, in exponent.
  82713. * mod Modulus.
  82714. * out Buffer to hold big-endian bytes of exponentiation result.
  82715. * Must be at least 384 bytes long.
  82716. * outLen Length, in bytes, of exponentiation result.
  82717. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  82718. * and MEMORY_E if memory allocation fails.
  82719. */
  82720. int sp_DhExp_3072(const mp_int* base, const byte* exp, word32 expLen,
  82721. const mp_int* mod, byte* out, word32* outLen)
  82722. {
  82723. int err = MP_OKAY;
  82724. sp_digit b[192];
  82725. sp_digit e[96];
  82726. sp_digit m[96];
  82727. sp_digit* r = b;
  82728. word32 i;
  82729. if (mp_count_bits(base) > 3072) {
  82730. err = MP_READ_E;
  82731. }
  82732. else if (expLen > 384) {
  82733. err = MP_READ_E;
  82734. }
  82735. else if (mp_count_bits(mod) != 3072) {
  82736. err = MP_READ_E;
  82737. }
  82738. else if (mp_iseven(mod)) {
  82739. err = MP_VAL;
  82740. }
  82741. if (err == MP_OKAY) {
  82742. sp_3072_from_mp(b, 96, base);
  82743. sp_3072_from_bin(e, 96, exp, expLen);
  82744. sp_3072_from_mp(m, 96, mod);
  82745. #ifdef HAVE_FFDHE_3072
  82746. if (base->used == 1 && base->dp[0] == 2 && m[95] == (sp_digit)-1)
  82747. err = sp_3072_mod_exp_2_96(r, e, expLen * 8, m);
  82748. else
  82749. #endif
  82750. err = sp_3072_mod_exp_96(r, b, e, expLen * 8, m, 0);
  82751. }
  82752. if (err == MP_OKAY) {
  82753. sp_3072_to_bin_96(r, out);
  82754. *outLen = 384;
  82755. for (i=0; i<384 && out[i] == 0; i++) {
  82756. /* Search for first non-zero. */
  82757. }
  82758. *outLen -= i;
  82759. XMEMMOVE(out, out + i, *outLen);
  82760. }
  82761. XMEMSET(e, 0, sizeof(e));
  82762. return err;
  82763. }
  82764. #endif /* WOLFSSL_HAVE_SP_DH */
  82765. /* Perform the modular exponentiation for Diffie-Hellman.
  82766. *
  82767. * base Base. MP integer.
  82768. * exp Exponent. MP integer.
  82769. * mod Modulus. MP integer.
  82770. * res Result. MP integer.
  82771. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  82772. * and MEMORY_E if memory allocation fails.
  82773. */
  82774. int sp_ModExp_1536(const mp_int* base, const mp_int* exp, const mp_int* mod,
  82775. mp_int* res)
  82776. {
  82777. int err = MP_OKAY;
  82778. sp_digit b[96];
  82779. sp_digit e[48];
  82780. sp_digit m[48];
  82781. sp_digit* r = b;
  82782. int expBits = mp_count_bits(exp);
  82783. if (mp_count_bits(base) > 1536) {
  82784. err = MP_READ_E;
  82785. }
  82786. else if (expBits > 1536) {
  82787. err = MP_READ_E;
  82788. }
  82789. else if (mp_count_bits(mod) != 1536) {
  82790. err = MP_READ_E;
  82791. }
  82792. else if (mp_iseven(mod)) {
  82793. err = MP_VAL;
  82794. }
  82795. if (err == MP_OKAY) {
  82796. sp_3072_from_mp(b, 48, base);
  82797. sp_3072_from_mp(e, 48, exp);
  82798. sp_3072_from_mp(m, 48, mod);
  82799. err = sp_3072_mod_exp_48(r, b, e, expBits, m, 0);
  82800. }
  82801. if (err == MP_OKAY) {
  82802. XMEMSET(r + 48, 0, sizeof(*r) * 48U);
  82803. err = sp_3072_to_mp(r, res);
  82804. res->used = mod->used;
  82805. mp_clamp(res);
  82806. }
  82807. XMEMSET(e, 0, sizeof(e));
  82808. return err;
  82809. }
  82810. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  82811. #endif /* !WOLFSSL_SP_NO_3072 */
  82812. #ifdef WOLFSSL_SP_4096
  82813. /* Read big endian unsigned byte array into r.
  82814. *
  82815. * r A single precision integer.
  82816. * size Maximum number of bytes to convert
  82817. * a Byte array.
  82818. * n Number of bytes in array to read.
  82819. */
  82820. static void sp_4096_from_bin(sp_digit* r, int size, const byte* a, int n)
  82821. {
  82822. int i;
  82823. int j;
  82824. byte* d;
  82825. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  82826. r[j] = ((sp_digit)a[i - 0] << 0) |
  82827. ((sp_digit)a[i - 1] << 8) |
  82828. ((sp_digit)a[i - 2] << 16) |
  82829. ((sp_digit)a[i - 3] << 24);
  82830. j++;
  82831. }
  82832. if (i >= 0) {
  82833. r[j] = 0;
  82834. d = (byte*)r;
  82835. switch (i) {
  82836. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  82837. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  82838. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  82839. }
  82840. j++;
  82841. }
  82842. for (; j < size; j++) {
  82843. r[j] = 0;
  82844. }
  82845. }
  82846. /* Convert an mp_int to an array of sp_digit.
  82847. *
  82848. * r A single precision integer.
  82849. * size Maximum number of bytes to convert
  82850. * a A multi-precision integer.
  82851. */
  82852. static void sp_4096_from_mp(sp_digit* r, int size, const mp_int* a)
  82853. {
  82854. #if DIGIT_BIT == 32
  82855. int i;
  82856. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  82857. int o = 0;
  82858. for (i = 0; i < size; i++) {
  82859. sp_digit mask = (sp_digit)0 - (j >> 31);
  82860. r[i] = a->dp[o] & mask;
  82861. j++;
  82862. o += (int)(j >> 31);
  82863. }
  82864. #elif DIGIT_BIT > 32
  82865. unsigned int i;
  82866. int j = 0;
  82867. word32 s = 0;
  82868. r[0] = 0;
  82869. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  82870. r[j] |= ((sp_digit)a->dp[i] << s);
  82871. r[j] &= 0xffffffff;
  82872. s = 32U - s;
  82873. if (j + 1 >= size) {
  82874. break;
  82875. }
  82876. /* lint allow cast of mismatch word32 and mp_digit */
  82877. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  82878. while ((s + 32U) <= (word32)DIGIT_BIT) {
  82879. s += 32U;
  82880. r[j] &= 0xffffffff;
  82881. if (j + 1 >= size) {
  82882. break;
  82883. }
  82884. if (s < (word32)DIGIT_BIT) {
  82885. /* lint allow cast of mismatch word32 and mp_digit */
  82886. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  82887. }
  82888. else {
  82889. r[++j] = (sp_digit)0;
  82890. }
  82891. }
  82892. s = (word32)DIGIT_BIT - s;
  82893. }
  82894. for (j++; j < size; j++) {
  82895. r[j] = 0;
  82896. }
  82897. #else
  82898. unsigned int i;
  82899. int j = 0;
  82900. int s = 0;
  82901. r[0] = 0;
  82902. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  82903. r[j] |= ((sp_digit)a->dp[i]) << s;
  82904. if (s + DIGIT_BIT >= 32) {
  82905. r[j] &= 0xffffffff;
  82906. if (j + 1 >= size) {
  82907. break;
  82908. }
  82909. s = 32 - s;
  82910. if (s == DIGIT_BIT) {
  82911. r[++j] = 0;
  82912. s = 0;
  82913. }
  82914. else {
  82915. r[++j] = a->dp[i] >> s;
  82916. s = DIGIT_BIT - s;
  82917. }
  82918. }
  82919. else {
  82920. s += DIGIT_BIT;
  82921. }
  82922. }
  82923. for (j++; j < size; j++) {
  82924. r[j] = 0;
  82925. }
  82926. #endif
  82927. }
  82928. /* Write r as big endian to byte array.
  82929. * Fixed length number of bytes written: 512
  82930. *
  82931. * r A single precision integer.
  82932. * a Byte array.
  82933. */
  82934. static void sp_4096_to_bin_128(sp_digit* r, byte* a)
  82935. {
  82936. int i;
  82937. int j = 0;
  82938. for (i = 127; i >= 0; i--) {
  82939. a[j++] = r[i] >> 24;
  82940. a[j++] = r[i] >> 16;
  82941. a[j++] = r[i] >> 8;
  82942. a[j++] = r[i] >> 0;
  82943. }
  82944. }
  82945. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  82946. /* Normalize the values in each word to 32.
  82947. *
  82948. * a Array of sp_digit to normalize.
  82949. */
  82950. #define sp_4096_norm_128(a)
  82951. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  82952. /* Normalize the values in each word to 32.
  82953. *
  82954. * a Array of sp_digit to normalize.
  82955. */
  82956. #define sp_4096_norm_128(a)
  82957. #ifndef WOLFSSL_SP_SMALL
  82958. /* Add b to a into r. (r = a + b)
  82959. *
  82960. * r A single precision integer.
  82961. * a A single precision integer.
  82962. * b A single precision integer.
  82963. */
  82964. SP_NOINLINE static sp_digit sp_4096_add_word_64(sp_digit* r, const sp_digit* a,
  82965. sp_digit b)
  82966. {
  82967. __asm__ __volatile__ (
  82968. "movs r5, #0\n\t"
  82969. "ldm %[a]!, {r3, r4}\n\t"
  82970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82971. "adds r3, r3, %[b]\n\t"
  82972. #else
  82973. "add r3, r3, %[b]\n\t"
  82974. #endif
  82975. #ifdef WOLFSSL_KEIL
  82976. "adcs r4, r4, r5\n\t"
  82977. #elif defined(__clang__)
  82978. "adcs r4, r5\n\t"
  82979. #else
  82980. "adc r4, r5\n\t"
  82981. #endif
  82982. "stm %[r]!, {r3, r4}\n\t"
  82983. "ldm %[a]!, {r3, r4}\n\t"
  82984. #ifdef WOLFSSL_KEIL
  82985. "adcs r3, r3, r5\n\t"
  82986. #elif defined(__clang__)
  82987. "adcs r3, r5\n\t"
  82988. #else
  82989. "adc r3, r5\n\t"
  82990. #endif
  82991. #ifdef WOLFSSL_KEIL
  82992. "adcs r4, r4, r5\n\t"
  82993. #elif defined(__clang__)
  82994. "adcs r4, r5\n\t"
  82995. #else
  82996. "adc r4, r5\n\t"
  82997. #endif
  82998. "stm %[r]!, {r3, r4}\n\t"
  82999. "ldm %[a]!, {r3, r4}\n\t"
  83000. #ifdef WOLFSSL_KEIL
  83001. "adcs r3, r3, r5\n\t"
  83002. #elif defined(__clang__)
  83003. "adcs r3, r5\n\t"
  83004. #else
  83005. "adc r3, r5\n\t"
  83006. #endif
  83007. #ifdef WOLFSSL_KEIL
  83008. "adcs r4, r4, r5\n\t"
  83009. #elif defined(__clang__)
  83010. "adcs r4, r5\n\t"
  83011. #else
  83012. "adc r4, r5\n\t"
  83013. #endif
  83014. "stm %[r]!, {r3, r4}\n\t"
  83015. "ldm %[a]!, {r3, r4}\n\t"
  83016. #ifdef WOLFSSL_KEIL
  83017. "adcs r3, r3, r5\n\t"
  83018. #elif defined(__clang__)
  83019. "adcs r3, r5\n\t"
  83020. #else
  83021. "adc r3, r5\n\t"
  83022. #endif
  83023. #ifdef WOLFSSL_KEIL
  83024. "adcs r4, r4, r5\n\t"
  83025. #elif defined(__clang__)
  83026. "adcs r4, r5\n\t"
  83027. #else
  83028. "adc r4, r5\n\t"
  83029. #endif
  83030. "stm %[r]!, {r3, r4}\n\t"
  83031. "ldm %[a]!, {r3, r4}\n\t"
  83032. #ifdef WOLFSSL_KEIL
  83033. "adcs r3, r3, r5\n\t"
  83034. #elif defined(__clang__)
  83035. "adcs r3, r5\n\t"
  83036. #else
  83037. "adc r3, r5\n\t"
  83038. #endif
  83039. #ifdef WOLFSSL_KEIL
  83040. "adcs r4, r4, r5\n\t"
  83041. #elif defined(__clang__)
  83042. "adcs r4, r5\n\t"
  83043. #else
  83044. "adc r4, r5\n\t"
  83045. #endif
  83046. "stm %[r]!, {r3, r4}\n\t"
  83047. "ldm %[a]!, {r3, r4}\n\t"
  83048. #ifdef WOLFSSL_KEIL
  83049. "adcs r3, r3, r5\n\t"
  83050. #elif defined(__clang__)
  83051. "adcs r3, r5\n\t"
  83052. #else
  83053. "adc r3, r5\n\t"
  83054. #endif
  83055. #ifdef WOLFSSL_KEIL
  83056. "adcs r4, r4, r5\n\t"
  83057. #elif defined(__clang__)
  83058. "adcs r4, r5\n\t"
  83059. #else
  83060. "adc r4, r5\n\t"
  83061. #endif
  83062. "stm %[r]!, {r3, r4}\n\t"
  83063. "ldm %[a]!, {r3, r4}\n\t"
  83064. #ifdef WOLFSSL_KEIL
  83065. "adcs r3, r3, r5\n\t"
  83066. #elif defined(__clang__)
  83067. "adcs r3, r5\n\t"
  83068. #else
  83069. "adc r3, r5\n\t"
  83070. #endif
  83071. #ifdef WOLFSSL_KEIL
  83072. "adcs r4, r4, r5\n\t"
  83073. #elif defined(__clang__)
  83074. "adcs r4, r5\n\t"
  83075. #else
  83076. "adc r4, r5\n\t"
  83077. #endif
  83078. "stm %[r]!, {r3, r4}\n\t"
  83079. "ldm %[a]!, {r3, r4}\n\t"
  83080. #ifdef WOLFSSL_KEIL
  83081. "adcs r3, r3, r5\n\t"
  83082. #elif defined(__clang__)
  83083. "adcs r3, r5\n\t"
  83084. #else
  83085. "adc r3, r5\n\t"
  83086. #endif
  83087. #ifdef WOLFSSL_KEIL
  83088. "adcs r4, r4, r5\n\t"
  83089. #elif defined(__clang__)
  83090. "adcs r4, r5\n\t"
  83091. #else
  83092. "adc r4, r5\n\t"
  83093. #endif
  83094. "stm %[r]!, {r3, r4}\n\t"
  83095. "ldm %[a]!, {r3, r4}\n\t"
  83096. #ifdef WOLFSSL_KEIL
  83097. "adcs r3, r3, r5\n\t"
  83098. #elif defined(__clang__)
  83099. "adcs r3, r5\n\t"
  83100. #else
  83101. "adc r3, r5\n\t"
  83102. #endif
  83103. #ifdef WOLFSSL_KEIL
  83104. "adcs r4, r4, r5\n\t"
  83105. #elif defined(__clang__)
  83106. "adcs r4, r5\n\t"
  83107. #else
  83108. "adc r4, r5\n\t"
  83109. #endif
  83110. "stm %[r]!, {r3, r4}\n\t"
  83111. "ldm %[a]!, {r3, r4}\n\t"
  83112. #ifdef WOLFSSL_KEIL
  83113. "adcs r3, r3, r5\n\t"
  83114. #elif defined(__clang__)
  83115. "adcs r3, r5\n\t"
  83116. #else
  83117. "adc r3, r5\n\t"
  83118. #endif
  83119. #ifdef WOLFSSL_KEIL
  83120. "adcs r4, r4, r5\n\t"
  83121. #elif defined(__clang__)
  83122. "adcs r4, r5\n\t"
  83123. #else
  83124. "adc r4, r5\n\t"
  83125. #endif
  83126. "stm %[r]!, {r3, r4}\n\t"
  83127. "ldm %[a]!, {r3, r4}\n\t"
  83128. #ifdef WOLFSSL_KEIL
  83129. "adcs r3, r3, r5\n\t"
  83130. #elif defined(__clang__)
  83131. "adcs r3, r5\n\t"
  83132. #else
  83133. "adc r3, r5\n\t"
  83134. #endif
  83135. #ifdef WOLFSSL_KEIL
  83136. "adcs r4, r4, r5\n\t"
  83137. #elif defined(__clang__)
  83138. "adcs r4, r5\n\t"
  83139. #else
  83140. "adc r4, r5\n\t"
  83141. #endif
  83142. "stm %[r]!, {r3, r4}\n\t"
  83143. "ldm %[a]!, {r3, r4}\n\t"
  83144. #ifdef WOLFSSL_KEIL
  83145. "adcs r3, r3, r5\n\t"
  83146. #elif defined(__clang__)
  83147. "adcs r3, r5\n\t"
  83148. #else
  83149. "adc r3, r5\n\t"
  83150. #endif
  83151. #ifdef WOLFSSL_KEIL
  83152. "adcs r4, r4, r5\n\t"
  83153. #elif defined(__clang__)
  83154. "adcs r4, r5\n\t"
  83155. #else
  83156. "adc r4, r5\n\t"
  83157. #endif
  83158. "stm %[r]!, {r3, r4}\n\t"
  83159. "ldm %[a]!, {r3, r4}\n\t"
  83160. #ifdef WOLFSSL_KEIL
  83161. "adcs r3, r3, r5\n\t"
  83162. #elif defined(__clang__)
  83163. "adcs r3, r5\n\t"
  83164. #else
  83165. "adc r3, r5\n\t"
  83166. #endif
  83167. #ifdef WOLFSSL_KEIL
  83168. "adcs r4, r4, r5\n\t"
  83169. #elif defined(__clang__)
  83170. "adcs r4, r5\n\t"
  83171. #else
  83172. "adc r4, r5\n\t"
  83173. #endif
  83174. "stm %[r]!, {r3, r4}\n\t"
  83175. "ldm %[a]!, {r3, r4}\n\t"
  83176. #ifdef WOLFSSL_KEIL
  83177. "adcs r3, r3, r5\n\t"
  83178. #elif defined(__clang__)
  83179. "adcs r3, r5\n\t"
  83180. #else
  83181. "adc r3, r5\n\t"
  83182. #endif
  83183. #ifdef WOLFSSL_KEIL
  83184. "adcs r4, r4, r5\n\t"
  83185. #elif defined(__clang__)
  83186. "adcs r4, r5\n\t"
  83187. #else
  83188. "adc r4, r5\n\t"
  83189. #endif
  83190. "stm %[r]!, {r3, r4}\n\t"
  83191. "ldm %[a]!, {r3, r4}\n\t"
  83192. #ifdef WOLFSSL_KEIL
  83193. "adcs r3, r3, r5\n\t"
  83194. #elif defined(__clang__)
  83195. "adcs r3, r5\n\t"
  83196. #else
  83197. "adc r3, r5\n\t"
  83198. #endif
  83199. #ifdef WOLFSSL_KEIL
  83200. "adcs r4, r4, r5\n\t"
  83201. #elif defined(__clang__)
  83202. "adcs r4, r5\n\t"
  83203. #else
  83204. "adc r4, r5\n\t"
  83205. #endif
  83206. "stm %[r]!, {r3, r4}\n\t"
  83207. "ldm %[a]!, {r3, r4}\n\t"
  83208. #ifdef WOLFSSL_KEIL
  83209. "adcs r3, r3, r5\n\t"
  83210. #elif defined(__clang__)
  83211. "adcs r3, r5\n\t"
  83212. #else
  83213. "adc r3, r5\n\t"
  83214. #endif
  83215. #ifdef WOLFSSL_KEIL
  83216. "adcs r4, r4, r5\n\t"
  83217. #elif defined(__clang__)
  83218. "adcs r4, r5\n\t"
  83219. #else
  83220. "adc r4, r5\n\t"
  83221. #endif
  83222. "stm %[r]!, {r3, r4}\n\t"
  83223. "ldm %[a]!, {r3, r4}\n\t"
  83224. #ifdef WOLFSSL_KEIL
  83225. "adcs r3, r3, r5\n\t"
  83226. #elif defined(__clang__)
  83227. "adcs r3, r5\n\t"
  83228. #else
  83229. "adc r3, r5\n\t"
  83230. #endif
  83231. #ifdef WOLFSSL_KEIL
  83232. "adcs r4, r4, r5\n\t"
  83233. #elif defined(__clang__)
  83234. "adcs r4, r5\n\t"
  83235. #else
  83236. "adc r4, r5\n\t"
  83237. #endif
  83238. "stm %[r]!, {r3, r4}\n\t"
  83239. "ldm %[a]!, {r3, r4}\n\t"
  83240. #ifdef WOLFSSL_KEIL
  83241. "adcs r3, r3, r5\n\t"
  83242. #elif defined(__clang__)
  83243. "adcs r3, r5\n\t"
  83244. #else
  83245. "adc r3, r5\n\t"
  83246. #endif
  83247. #ifdef WOLFSSL_KEIL
  83248. "adcs r4, r4, r5\n\t"
  83249. #elif defined(__clang__)
  83250. "adcs r4, r5\n\t"
  83251. #else
  83252. "adc r4, r5\n\t"
  83253. #endif
  83254. "stm %[r]!, {r3, r4}\n\t"
  83255. "ldm %[a]!, {r3, r4}\n\t"
  83256. #ifdef WOLFSSL_KEIL
  83257. "adcs r3, r3, r5\n\t"
  83258. #elif defined(__clang__)
  83259. "adcs r3, r5\n\t"
  83260. #else
  83261. "adc r3, r5\n\t"
  83262. #endif
  83263. #ifdef WOLFSSL_KEIL
  83264. "adcs r4, r4, r5\n\t"
  83265. #elif defined(__clang__)
  83266. "adcs r4, r5\n\t"
  83267. #else
  83268. "adc r4, r5\n\t"
  83269. #endif
  83270. "stm %[r]!, {r3, r4}\n\t"
  83271. "ldm %[a]!, {r3, r4}\n\t"
  83272. #ifdef WOLFSSL_KEIL
  83273. "adcs r3, r3, r5\n\t"
  83274. #elif defined(__clang__)
  83275. "adcs r3, r5\n\t"
  83276. #else
  83277. "adc r3, r5\n\t"
  83278. #endif
  83279. #ifdef WOLFSSL_KEIL
  83280. "adcs r4, r4, r5\n\t"
  83281. #elif defined(__clang__)
  83282. "adcs r4, r5\n\t"
  83283. #else
  83284. "adc r4, r5\n\t"
  83285. #endif
  83286. "stm %[r]!, {r3, r4}\n\t"
  83287. "ldm %[a]!, {r3, r4}\n\t"
  83288. #ifdef WOLFSSL_KEIL
  83289. "adcs r3, r3, r5\n\t"
  83290. #elif defined(__clang__)
  83291. "adcs r3, r5\n\t"
  83292. #else
  83293. "adc r3, r5\n\t"
  83294. #endif
  83295. #ifdef WOLFSSL_KEIL
  83296. "adcs r4, r4, r5\n\t"
  83297. #elif defined(__clang__)
  83298. "adcs r4, r5\n\t"
  83299. #else
  83300. "adc r4, r5\n\t"
  83301. #endif
  83302. "stm %[r]!, {r3, r4}\n\t"
  83303. "ldm %[a]!, {r3, r4}\n\t"
  83304. #ifdef WOLFSSL_KEIL
  83305. "adcs r3, r3, r5\n\t"
  83306. #elif defined(__clang__)
  83307. "adcs r3, r5\n\t"
  83308. #else
  83309. "adc r3, r5\n\t"
  83310. #endif
  83311. #ifdef WOLFSSL_KEIL
  83312. "adcs r4, r4, r5\n\t"
  83313. #elif defined(__clang__)
  83314. "adcs r4, r5\n\t"
  83315. #else
  83316. "adc r4, r5\n\t"
  83317. #endif
  83318. "stm %[r]!, {r3, r4}\n\t"
  83319. "ldm %[a]!, {r3, r4}\n\t"
  83320. #ifdef WOLFSSL_KEIL
  83321. "adcs r3, r3, r5\n\t"
  83322. #elif defined(__clang__)
  83323. "adcs r3, r5\n\t"
  83324. #else
  83325. "adc r3, r5\n\t"
  83326. #endif
  83327. #ifdef WOLFSSL_KEIL
  83328. "adcs r4, r4, r5\n\t"
  83329. #elif defined(__clang__)
  83330. "adcs r4, r5\n\t"
  83331. #else
  83332. "adc r4, r5\n\t"
  83333. #endif
  83334. "stm %[r]!, {r3, r4}\n\t"
  83335. "ldm %[a]!, {r3, r4}\n\t"
  83336. #ifdef WOLFSSL_KEIL
  83337. "adcs r3, r3, r5\n\t"
  83338. #elif defined(__clang__)
  83339. "adcs r3, r5\n\t"
  83340. #else
  83341. "adc r3, r5\n\t"
  83342. #endif
  83343. #ifdef WOLFSSL_KEIL
  83344. "adcs r4, r4, r5\n\t"
  83345. #elif defined(__clang__)
  83346. "adcs r4, r5\n\t"
  83347. #else
  83348. "adc r4, r5\n\t"
  83349. #endif
  83350. "stm %[r]!, {r3, r4}\n\t"
  83351. "ldm %[a]!, {r3, r4}\n\t"
  83352. #ifdef WOLFSSL_KEIL
  83353. "adcs r3, r3, r5\n\t"
  83354. #elif defined(__clang__)
  83355. "adcs r3, r5\n\t"
  83356. #else
  83357. "adc r3, r5\n\t"
  83358. #endif
  83359. #ifdef WOLFSSL_KEIL
  83360. "adcs r4, r4, r5\n\t"
  83361. #elif defined(__clang__)
  83362. "adcs r4, r5\n\t"
  83363. #else
  83364. "adc r4, r5\n\t"
  83365. #endif
  83366. "stm %[r]!, {r3, r4}\n\t"
  83367. "ldm %[a]!, {r3, r4}\n\t"
  83368. #ifdef WOLFSSL_KEIL
  83369. "adcs r3, r3, r5\n\t"
  83370. #elif defined(__clang__)
  83371. "adcs r3, r5\n\t"
  83372. #else
  83373. "adc r3, r5\n\t"
  83374. #endif
  83375. #ifdef WOLFSSL_KEIL
  83376. "adcs r4, r4, r5\n\t"
  83377. #elif defined(__clang__)
  83378. "adcs r4, r5\n\t"
  83379. #else
  83380. "adc r4, r5\n\t"
  83381. #endif
  83382. "stm %[r]!, {r3, r4}\n\t"
  83383. "ldm %[a]!, {r3, r4}\n\t"
  83384. #ifdef WOLFSSL_KEIL
  83385. "adcs r3, r3, r5\n\t"
  83386. #elif defined(__clang__)
  83387. "adcs r3, r5\n\t"
  83388. #else
  83389. "adc r3, r5\n\t"
  83390. #endif
  83391. #ifdef WOLFSSL_KEIL
  83392. "adcs r4, r4, r5\n\t"
  83393. #elif defined(__clang__)
  83394. "adcs r4, r5\n\t"
  83395. #else
  83396. "adc r4, r5\n\t"
  83397. #endif
  83398. "stm %[r]!, {r3, r4}\n\t"
  83399. "ldm %[a]!, {r3, r4}\n\t"
  83400. #ifdef WOLFSSL_KEIL
  83401. "adcs r3, r3, r5\n\t"
  83402. #elif defined(__clang__)
  83403. "adcs r3, r5\n\t"
  83404. #else
  83405. "adc r3, r5\n\t"
  83406. #endif
  83407. #ifdef WOLFSSL_KEIL
  83408. "adcs r4, r4, r5\n\t"
  83409. #elif defined(__clang__)
  83410. "adcs r4, r5\n\t"
  83411. #else
  83412. "adc r4, r5\n\t"
  83413. #endif
  83414. "stm %[r]!, {r3, r4}\n\t"
  83415. "ldm %[a]!, {r3, r4}\n\t"
  83416. #ifdef WOLFSSL_KEIL
  83417. "adcs r3, r3, r5\n\t"
  83418. #elif defined(__clang__)
  83419. "adcs r3, r5\n\t"
  83420. #else
  83421. "adc r3, r5\n\t"
  83422. #endif
  83423. #ifdef WOLFSSL_KEIL
  83424. "adcs r4, r4, r5\n\t"
  83425. #elif defined(__clang__)
  83426. "adcs r4, r5\n\t"
  83427. #else
  83428. "adc r4, r5\n\t"
  83429. #endif
  83430. "stm %[r]!, {r3, r4}\n\t"
  83431. "ldm %[a]!, {r3, r4}\n\t"
  83432. #ifdef WOLFSSL_KEIL
  83433. "adcs r3, r3, r5\n\t"
  83434. #elif defined(__clang__)
  83435. "adcs r3, r5\n\t"
  83436. #else
  83437. "adc r3, r5\n\t"
  83438. #endif
  83439. #ifdef WOLFSSL_KEIL
  83440. "adcs r4, r4, r5\n\t"
  83441. #elif defined(__clang__)
  83442. "adcs r4, r5\n\t"
  83443. #else
  83444. "adc r4, r5\n\t"
  83445. #endif
  83446. "stm %[r]!, {r3, r4}\n\t"
  83447. "ldm %[a]!, {r3, r4}\n\t"
  83448. #ifdef WOLFSSL_KEIL
  83449. "adcs r3, r3, r5\n\t"
  83450. #elif defined(__clang__)
  83451. "adcs r3, r5\n\t"
  83452. #else
  83453. "adc r3, r5\n\t"
  83454. #endif
  83455. #ifdef WOLFSSL_KEIL
  83456. "adcs r4, r4, r5\n\t"
  83457. #elif defined(__clang__)
  83458. "adcs r4, r5\n\t"
  83459. #else
  83460. "adc r4, r5\n\t"
  83461. #endif
  83462. "stm %[r]!, {r3, r4}\n\t"
  83463. "ldm %[a]!, {r3, r4}\n\t"
  83464. #ifdef WOLFSSL_KEIL
  83465. "adcs r3, r3, r5\n\t"
  83466. #elif defined(__clang__)
  83467. "adcs r3, r5\n\t"
  83468. #else
  83469. "adc r3, r5\n\t"
  83470. #endif
  83471. #ifdef WOLFSSL_KEIL
  83472. "adcs r4, r4, r5\n\t"
  83473. #elif defined(__clang__)
  83474. "adcs r4, r5\n\t"
  83475. #else
  83476. "adc r4, r5\n\t"
  83477. #endif
  83478. "stm %[r]!, {r3, r4}\n\t"
  83479. "movs %[r], #0\n\t"
  83480. #ifdef WOLFSSL_KEIL
  83481. "adcs %[r], %[r], %[r]\n\t"
  83482. #elif defined(__clang__)
  83483. "adcs %[r], %[r]\n\t"
  83484. #else
  83485. "adc %[r], %[r]\n\t"
  83486. #endif
  83487. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  83488. :
  83489. : "memory", "r3", "r4", "r5"
  83490. );
  83491. return (uint32_t)(size_t)r;
  83492. }
  83493. /* Sub b from a into a. (a -= b)
  83494. *
  83495. * a A single precision integer.
  83496. * b A single precision integer.
  83497. */
  83498. SP_NOINLINE static sp_digit sp_4096_sub_in_place_128(sp_digit* a,
  83499. const sp_digit* b)
  83500. {
  83501. __asm__ __volatile__ (
  83502. "ldm %[b]!, {r4, r5}\n\t"
  83503. "ldr r2, [%[a]]\n\t"
  83504. "ldr r3, [%[a], #4]\n\t"
  83505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  83506. "subs r2, r2, r4\n\t"
  83507. #else
  83508. "sub r2, r2, r4\n\t"
  83509. #endif
  83510. #ifdef WOLFSSL_KEIL
  83511. "sbcs r3, r3, r5\n\t"
  83512. #elif defined(__clang__)
  83513. "sbcs r3, r5\n\t"
  83514. #else
  83515. "sbc r3, r5\n\t"
  83516. #endif
  83517. "stm %[a]!, {r2, r3}\n\t"
  83518. "ldm %[b]!, {r4, r5}\n\t"
  83519. "ldr r2, [%[a]]\n\t"
  83520. "ldr r3, [%[a], #4]\n\t"
  83521. #ifdef WOLFSSL_KEIL
  83522. "sbcs r2, r2, r4\n\t"
  83523. #elif defined(__clang__)
  83524. "sbcs r2, r4\n\t"
  83525. #else
  83526. "sbc r2, r4\n\t"
  83527. #endif
  83528. #ifdef WOLFSSL_KEIL
  83529. "sbcs r3, r3, r5\n\t"
  83530. #elif defined(__clang__)
  83531. "sbcs r3, r5\n\t"
  83532. #else
  83533. "sbc r3, r5\n\t"
  83534. #endif
  83535. "stm %[a]!, {r2, r3}\n\t"
  83536. "ldm %[b]!, {r4, r5}\n\t"
  83537. "ldr r2, [%[a]]\n\t"
  83538. "ldr r3, [%[a], #4]\n\t"
  83539. #ifdef WOLFSSL_KEIL
  83540. "sbcs r2, r2, r4\n\t"
  83541. #elif defined(__clang__)
  83542. "sbcs r2, r4\n\t"
  83543. #else
  83544. "sbc r2, r4\n\t"
  83545. #endif
  83546. #ifdef WOLFSSL_KEIL
  83547. "sbcs r3, r3, r5\n\t"
  83548. #elif defined(__clang__)
  83549. "sbcs r3, r5\n\t"
  83550. #else
  83551. "sbc r3, r5\n\t"
  83552. #endif
  83553. "stm %[a]!, {r2, r3}\n\t"
  83554. "ldm %[b]!, {r4, r5}\n\t"
  83555. "ldr r2, [%[a]]\n\t"
  83556. "ldr r3, [%[a], #4]\n\t"
  83557. #ifdef WOLFSSL_KEIL
  83558. "sbcs r2, r2, r4\n\t"
  83559. #elif defined(__clang__)
  83560. "sbcs r2, r4\n\t"
  83561. #else
  83562. "sbc r2, r4\n\t"
  83563. #endif
  83564. #ifdef WOLFSSL_KEIL
  83565. "sbcs r3, r3, r5\n\t"
  83566. #elif defined(__clang__)
  83567. "sbcs r3, r5\n\t"
  83568. #else
  83569. "sbc r3, r5\n\t"
  83570. #endif
  83571. "stm %[a]!, {r2, r3}\n\t"
  83572. "ldm %[b]!, {r4, r5}\n\t"
  83573. "ldr r2, [%[a]]\n\t"
  83574. "ldr r3, [%[a], #4]\n\t"
  83575. #ifdef WOLFSSL_KEIL
  83576. "sbcs r2, r2, r4\n\t"
  83577. #elif defined(__clang__)
  83578. "sbcs r2, r4\n\t"
  83579. #else
  83580. "sbc r2, r4\n\t"
  83581. #endif
  83582. #ifdef WOLFSSL_KEIL
  83583. "sbcs r3, r3, r5\n\t"
  83584. #elif defined(__clang__)
  83585. "sbcs r3, r5\n\t"
  83586. #else
  83587. "sbc r3, r5\n\t"
  83588. #endif
  83589. "stm %[a]!, {r2, r3}\n\t"
  83590. "ldm %[b]!, {r4, r5}\n\t"
  83591. "ldr r2, [%[a]]\n\t"
  83592. "ldr r3, [%[a], #4]\n\t"
  83593. #ifdef WOLFSSL_KEIL
  83594. "sbcs r2, r2, r4\n\t"
  83595. #elif defined(__clang__)
  83596. "sbcs r2, r4\n\t"
  83597. #else
  83598. "sbc r2, r4\n\t"
  83599. #endif
  83600. #ifdef WOLFSSL_KEIL
  83601. "sbcs r3, r3, r5\n\t"
  83602. #elif defined(__clang__)
  83603. "sbcs r3, r5\n\t"
  83604. #else
  83605. "sbc r3, r5\n\t"
  83606. #endif
  83607. "stm %[a]!, {r2, r3}\n\t"
  83608. "ldm %[b]!, {r4, r5}\n\t"
  83609. "ldr r2, [%[a]]\n\t"
  83610. "ldr r3, [%[a], #4]\n\t"
  83611. #ifdef WOLFSSL_KEIL
  83612. "sbcs r2, r2, r4\n\t"
  83613. #elif defined(__clang__)
  83614. "sbcs r2, r4\n\t"
  83615. #else
  83616. "sbc r2, r4\n\t"
  83617. #endif
  83618. #ifdef WOLFSSL_KEIL
  83619. "sbcs r3, r3, r5\n\t"
  83620. #elif defined(__clang__)
  83621. "sbcs r3, r5\n\t"
  83622. #else
  83623. "sbc r3, r5\n\t"
  83624. #endif
  83625. "stm %[a]!, {r2, r3}\n\t"
  83626. "ldm %[b]!, {r4, r5}\n\t"
  83627. "ldr r2, [%[a]]\n\t"
  83628. "ldr r3, [%[a], #4]\n\t"
  83629. #ifdef WOLFSSL_KEIL
  83630. "sbcs r2, r2, r4\n\t"
  83631. #elif defined(__clang__)
  83632. "sbcs r2, r4\n\t"
  83633. #else
  83634. "sbc r2, r4\n\t"
  83635. #endif
  83636. #ifdef WOLFSSL_KEIL
  83637. "sbcs r3, r3, r5\n\t"
  83638. #elif defined(__clang__)
  83639. "sbcs r3, r5\n\t"
  83640. #else
  83641. "sbc r3, r5\n\t"
  83642. #endif
  83643. "stm %[a]!, {r2, r3}\n\t"
  83644. "ldm %[b]!, {r4, r5}\n\t"
  83645. "ldr r2, [%[a]]\n\t"
  83646. "ldr r3, [%[a], #4]\n\t"
  83647. #ifdef WOLFSSL_KEIL
  83648. "sbcs r2, r2, r4\n\t"
  83649. #elif defined(__clang__)
  83650. "sbcs r2, r4\n\t"
  83651. #else
  83652. "sbc r2, r4\n\t"
  83653. #endif
  83654. #ifdef WOLFSSL_KEIL
  83655. "sbcs r3, r3, r5\n\t"
  83656. #elif defined(__clang__)
  83657. "sbcs r3, r5\n\t"
  83658. #else
  83659. "sbc r3, r5\n\t"
  83660. #endif
  83661. "stm %[a]!, {r2, r3}\n\t"
  83662. "ldm %[b]!, {r4, r5}\n\t"
  83663. "ldr r2, [%[a]]\n\t"
  83664. "ldr r3, [%[a], #4]\n\t"
  83665. #ifdef WOLFSSL_KEIL
  83666. "sbcs r2, r2, r4\n\t"
  83667. #elif defined(__clang__)
  83668. "sbcs r2, r4\n\t"
  83669. #else
  83670. "sbc r2, r4\n\t"
  83671. #endif
  83672. #ifdef WOLFSSL_KEIL
  83673. "sbcs r3, r3, r5\n\t"
  83674. #elif defined(__clang__)
  83675. "sbcs r3, r5\n\t"
  83676. #else
  83677. "sbc r3, r5\n\t"
  83678. #endif
  83679. "stm %[a]!, {r2, r3}\n\t"
  83680. "ldm %[b]!, {r4, r5}\n\t"
  83681. "ldr r2, [%[a]]\n\t"
  83682. "ldr r3, [%[a], #4]\n\t"
  83683. #ifdef WOLFSSL_KEIL
  83684. "sbcs r2, r2, r4\n\t"
  83685. #elif defined(__clang__)
  83686. "sbcs r2, r4\n\t"
  83687. #else
  83688. "sbc r2, r4\n\t"
  83689. #endif
  83690. #ifdef WOLFSSL_KEIL
  83691. "sbcs r3, r3, r5\n\t"
  83692. #elif defined(__clang__)
  83693. "sbcs r3, r5\n\t"
  83694. #else
  83695. "sbc r3, r5\n\t"
  83696. #endif
  83697. "stm %[a]!, {r2, r3}\n\t"
  83698. "ldm %[b]!, {r4, r5}\n\t"
  83699. "ldr r2, [%[a]]\n\t"
  83700. "ldr r3, [%[a], #4]\n\t"
  83701. #ifdef WOLFSSL_KEIL
  83702. "sbcs r2, r2, r4\n\t"
  83703. #elif defined(__clang__)
  83704. "sbcs r2, r4\n\t"
  83705. #else
  83706. "sbc r2, r4\n\t"
  83707. #endif
  83708. #ifdef WOLFSSL_KEIL
  83709. "sbcs r3, r3, r5\n\t"
  83710. #elif defined(__clang__)
  83711. "sbcs r3, r5\n\t"
  83712. #else
  83713. "sbc r3, r5\n\t"
  83714. #endif
  83715. "stm %[a]!, {r2, r3}\n\t"
  83716. "ldm %[b]!, {r4, r5}\n\t"
  83717. "ldr r2, [%[a]]\n\t"
  83718. "ldr r3, [%[a], #4]\n\t"
  83719. #ifdef WOLFSSL_KEIL
  83720. "sbcs r2, r2, r4\n\t"
  83721. #elif defined(__clang__)
  83722. "sbcs r2, r4\n\t"
  83723. #else
  83724. "sbc r2, r4\n\t"
  83725. #endif
  83726. #ifdef WOLFSSL_KEIL
  83727. "sbcs r3, r3, r5\n\t"
  83728. #elif defined(__clang__)
  83729. "sbcs r3, r5\n\t"
  83730. #else
  83731. "sbc r3, r5\n\t"
  83732. #endif
  83733. "stm %[a]!, {r2, r3}\n\t"
  83734. "ldm %[b]!, {r4, r5}\n\t"
  83735. "ldr r2, [%[a]]\n\t"
  83736. "ldr r3, [%[a], #4]\n\t"
  83737. #ifdef WOLFSSL_KEIL
  83738. "sbcs r2, r2, r4\n\t"
  83739. #elif defined(__clang__)
  83740. "sbcs r2, r4\n\t"
  83741. #else
  83742. "sbc r2, r4\n\t"
  83743. #endif
  83744. #ifdef WOLFSSL_KEIL
  83745. "sbcs r3, r3, r5\n\t"
  83746. #elif defined(__clang__)
  83747. "sbcs r3, r5\n\t"
  83748. #else
  83749. "sbc r3, r5\n\t"
  83750. #endif
  83751. "stm %[a]!, {r2, r3}\n\t"
  83752. "ldm %[b]!, {r4, r5}\n\t"
  83753. "ldr r2, [%[a]]\n\t"
  83754. "ldr r3, [%[a], #4]\n\t"
  83755. #ifdef WOLFSSL_KEIL
  83756. "sbcs r2, r2, r4\n\t"
  83757. #elif defined(__clang__)
  83758. "sbcs r2, r4\n\t"
  83759. #else
  83760. "sbc r2, r4\n\t"
  83761. #endif
  83762. #ifdef WOLFSSL_KEIL
  83763. "sbcs r3, r3, r5\n\t"
  83764. #elif defined(__clang__)
  83765. "sbcs r3, r5\n\t"
  83766. #else
  83767. "sbc r3, r5\n\t"
  83768. #endif
  83769. "stm %[a]!, {r2, r3}\n\t"
  83770. "ldm %[b]!, {r4, r5}\n\t"
  83771. "ldr r2, [%[a]]\n\t"
  83772. "ldr r3, [%[a], #4]\n\t"
  83773. #ifdef WOLFSSL_KEIL
  83774. "sbcs r2, r2, r4\n\t"
  83775. #elif defined(__clang__)
  83776. "sbcs r2, r4\n\t"
  83777. #else
  83778. "sbc r2, r4\n\t"
  83779. #endif
  83780. #ifdef WOLFSSL_KEIL
  83781. "sbcs r3, r3, r5\n\t"
  83782. #elif defined(__clang__)
  83783. "sbcs r3, r5\n\t"
  83784. #else
  83785. "sbc r3, r5\n\t"
  83786. #endif
  83787. "stm %[a]!, {r2, r3}\n\t"
  83788. "ldm %[b]!, {r4, r5}\n\t"
  83789. "ldr r2, [%[a]]\n\t"
  83790. "ldr r3, [%[a], #4]\n\t"
  83791. #ifdef WOLFSSL_KEIL
  83792. "sbcs r2, r2, r4\n\t"
  83793. #elif defined(__clang__)
  83794. "sbcs r2, r4\n\t"
  83795. #else
  83796. "sbc r2, r4\n\t"
  83797. #endif
  83798. #ifdef WOLFSSL_KEIL
  83799. "sbcs r3, r3, r5\n\t"
  83800. #elif defined(__clang__)
  83801. "sbcs r3, r5\n\t"
  83802. #else
  83803. "sbc r3, r5\n\t"
  83804. #endif
  83805. "stm %[a]!, {r2, r3}\n\t"
  83806. "ldm %[b]!, {r4, r5}\n\t"
  83807. "ldr r2, [%[a]]\n\t"
  83808. "ldr r3, [%[a], #4]\n\t"
  83809. #ifdef WOLFSSL_KEIL
  83810. "sbcs r2, r2, r4\n\t"
  83811. #elif defined(__clang__)
  83812. "sbcs r2, r4\n\t"
  83813. #else
  83814. "sbc r2, r4\n\t"
  83815. #endif
  83816. #ifdef WOLFSSL_KEIL
  83817. "sbcs r3, r3, r5\n\t"
  83818. #elif defined(__clang__)
  83819. "sbcs r3, r5\n\t"
  83820. #else
  83821. "sbc r3, r5\n\t"
  83822. #endif
  83823. "stm %[a]!, {r2, r3}\n\t"
  83824. "ldm %[b]!, {r4, r5}\n\t"
  83825. "ldr r2, [%[a]]\n\t"
  83826. "ldr r3, [%[a], #4]\n\t"
  83827. #ifdef WOLFSSL_KEIL
  83828. "sbcs r2, r2, r4\n\t"
  83829. #elif defined(__clang__)
  83830. "sbcs r2, r4\n\t"
  83831. #else
  83832. "sbc r2, r4\n\t"
  83833. #endif
  83834. #ifdef WOLFSSL_KEIL
  83835. "sbcs r3, r3, r5\n\t"
  83836. #elif defined(__clang__)
  83837. "sbcs r3, r5\n\t"
  83838. #else
  83839. "sbc r3, r5\n\t"
  83840. #endif
  83841. "stm %[a]!, {r2, r3}\n\t"
  83842. "ldm %[b]!, {r4, r5}\n\t"
  83843. "ldr r2, [%[a]]\n\t"
  83844. "ldr r3, [%[a], #4]\n\t"
  83845. #ifdef WOLFSSL_KEIL
  83846. "sbcs r2, r2, r4\n\t"
  83847. #elif defined(__clang__)
  83848. "sbcs r2, r4\n\t"
  83849. #else
  83850. "sbc r2, r4\n\t"
  83851. #endif
  83852. #ifdef WOLFSSL_KEIL
  83853. "sbcs r3, r3, r5\n\t"
  83854. #elif defined(__clang__)
  83855. "sbcs r3, r5\n\t"
  83856. #else
  83857. "sbc r3, r5\n\t"
  83858. #endif
  83859. "stm %[a]!, {r2, r3}\n\t"
  83860. "ldm %[b]!, {r4, r5}\n\t"
  83861. "ldr r2, [%[a]]\n\t"
  83862. "ldr r3, [%[a], #4]\n\t"
  83863. #ifdef WOLFSSL_KEIL
  83864. "sbcs r2, r2, r4\n\t"
  83865. #elif defined(__clang__)
  83866. "sbcs r2, r4\n\t"
  83867. #else
  83868. "sbc r2, r4\n\t"
  83869. #endif
  83870. #ifdef WOLFSSL_KEIL
  83871. "sbcs r3, r3, r5\n\t"
  83872. #elif defined(__clang__)
  83873. "sbcs r3, r5\n\t"
  83874. #else
  83875. "sbc r3, r5\n\t"
  83876. #endif
  83877. "stm %[a]!, {r2, r3}\n\t"
  83878. "ldm %[b]!, {r4, r5}\n\t"
  83879. "ldr r2, [%[a]]\n\t"
  83880. "ldr r3, [%[a], #4]\n\t"
  83881. #ifdef WOLFSSL_KEIL
  83882. "sbcs r2, r2, r4\n\t"
  83883. #elif defined(__clang__)
  83884. "sbcs r2, r4\n\t"
  83885. #else
  83886. "sbc r2, r4\n\t"
  83887. #endif
  83888. #ifdef WOLFSSL_KEIL
  83889. "sbcs r3, r3, r5\n\t"
  83890. #elif defined(__clang__)
  83891. "sbcs r3, r5\n\t"
  83892. #else
  83893. "sbc r3, r5\n\t"
  83894. #endif
  83895. "stm %[a]!, {r2, r3}\n\t"
  83896. "ldm %[b]!, {r4, r5}\n\t"
  83897. "ldr r2, [%[a]]\n\t"
  83898. "ldr r3, [%[a], #4]\n\t"
  83899. #ifdef WOLFSSL_KEIL
  83900. "sbcs r2, r2, r4\n\t"
  83901. #elif defined(__clang__)
  83902. "sbcs r2, r4\n\t"
  83903. #else
  83904. "sbc r2, r4\n\t"
  83905. #endif
  83906. #ifdef WOLFSSL_KEIL
  83907. "sbcs r3, r3, r5\n\t"
  83908. #elif defined(__clang__)
  83909. "sbcs r3, r5\n\t"
  83910. #else
  83911. "sbc r3, r5\n\t"
  83912. #endif
  83913. "stm %[a]!, {r2, r3}\n\t"
  83914. "ldm %[b]!, {r4, r5}\n\t"
  83915. "ldr r2, [%[a]]\n\t"
  83916. "ldr r3, [%[a], #4]\n\t"
  83917. #ifdef WOLFSSL_KEIL
  83918. "sbcs r2, r2, r4\n\t"
  83919. #elif defined(__clang__)
  83920. "sbcs r2, r4\n\t"
  83921. #else
  83922. "sbc r2, r4\n\t"
  83923. #endif
  83924. #ifdef WOLFSSL_KEIL
  83925. "sbcs r3, r3, r5\n\t"
  83926. #elif defined(__clang__)
  83927. "sbcs r3, r5\n\t"
  83928. #else
  83929. "sbc r3, r5\n\t"
  83930. #endif
  83931. "stm %[a]!, {r2, r3}\n\t"
  83932. "ldm %[b]!, {r4, r5}\n\t"
  83933. "ldr r2, [%[a]]\n\t"
  83934. "ldr r3, [%[a], #4]\n\t"
  83935. #ifdef WOLFSSL_KEIL
  83936. "sbcs r2, r2, r4\n\t"
  83937. #elif defined(__clang__)
  83938. "sbcs r2, r4\n\t"
  83939. #else
  83940. "sbc r2, r4\n\t"
  83941. #endif
  83942. #ifdef WOLFSSL_KEIL
  83943. "sbcs r3, r3, r5\n\t"
  83944. #elif defined(__clang__)
  83945. "sbcs r3, r5\n\t"
  83946. #else
  83947. "sbc r3, r5\n\t"
  83948. #endif
  83949. "stm %[a]!, {r2, r3}\n\t"
  83950. "ldm %[b]!, {r4, r5}\n\t"
  83951. "ldr r2, [%[a]]\n\t"
  83952. "ldr r3, [%[a], #4]\n\t"
  83953. #ifdef WOLFSSL_KEIL
  83954. "sbcs r2, r2, r4\n\t"
  83955. #elif defined(__clang__)
  83956. "sbcs r2, r4\n\t"
  83957. #else
  83958. "sbc r2, r4\n\t"
  83959. #endif
  83960. #ifdef WOLFSSL_KEIL
  83961. "sbcs r3, r3, r5\n\t"
  83962. #elif defined(__clang__)
  83963. "sbcs r3, r5\n\t"
  83964. #else
  83965. "sbc r3, r5\n\t"
  83966. #endif
  83967. "stm %[a]!, {r2, r3}\n\t"
  83968. "ldm %[b]!, {r4, r5}\n\t"
  83969. "ldr r2, [%[a]]\n\t"
  83970. "ldr r3, [%[a], #4]\n\t"
  83971. #ifdef WOLFSSL_KEIL
  83972. "sbcs r2, r2, r4\n\t"
  83973. #elif defined(__clang__)
  83974. "sbcs r2, r4\n\t"
  83975. #else
  83976. "sbc r2, r4\n\t"
  83977. #endif
  83978. #ifdef WOLFSSL_KEIL
  83979. "sbcs r3, r3, r5\n\t"
  83980. #elif defined(__clang__)
  83981. "sbcs r3, r5\n\t"
  83982. #else
  83983. "sbc r3, r5\n\t"
  83984. #endif
  83985. "stm %[a]!, {r2, r3}\n\t"
  83986. "ldm %[b]!, {r4, r5}\n\t"
  83987. "ldr r2, [%[a]]\n\t"
  83988. "ldr r3, [%[a], #4]\n\t"
  83989. #ifdef WOLFSSL_KEIL
  83990. "sbcs r2, r2, r4\n\t"
  83991. #elif defined(__clang__)
  83992. "sbcs r2, r4\n\t"
  83993. #else
  83994. "sbc r2, r4\n\t"
  83995. #endif
  83996. #ifdef WOLFSSL_KEIL
  83997. "sbcs r3, r3, r5\n\t"
  83998. #elif defined(__clang__)
  83999. "sbcs r3, r5\n\t"
  84000. #else
  84001. "sbc r3, r5\n\t"
  84002. #endif
  84003. "stm %[a]!, {r2, r3}\n\t"
  84004. "ldm %[b]!, {r4, r5}\n\t"
  84005. "ldr r2, [%[a]]\n\t"
  84006. "ldr r3, [%[a], #4]\n\t"
  84007. #ifdef WOLFSSL_KEIL
  84008. "sbcs r2, r2, r4\n\t"
  84009. #elif defined(__clang__)
  84010. "sbcs r2, r4\n\t"
  84011. #else
  84012. "sbc r2, r4\n\t"
  84013. #endif
  84014. #ifdef WOLFSSL_KEIL
  84015. "sbcs r3, r3, r5\n\t"
  84016. #elif defined(__clang__)
  84017. "sbcs r3, r5\n\t"
  84018. #else
  84019. "sbc r3, r5\n\t"
  84020. #endif
  84021. "stm %[a]!, {r2, r3}\n\t"
  84022. "ldm %[b]!, {r4, r5}\n\t"
  84023. "ldr r2, [%[a]]\n\t"
  84024. "ldr r3, [%[a], #4]\n\t"
  84025. #ifdef WOLFSSL_KEIL
  84026. "sbcs r2, r2, r4\n\t"
  84027. #elif defined(__clang__)
  84028. "sbcs r2, r4\n\t"
  84029. #else
  84030. "sbc r2, r4\n\t"
  84031. #endif
  84032. #ifdef WOLFSSL_KEIL
  84033. "sbcs r3, r3, r5\n\t"
  84034. #elif defined(__clang__)
  84035. "sbcs r3, r5\n\t"
  84036. #else
  84037. "sbc r3, r5\n\t"
  84038. #endif
  84039. "stm %[a]!, {r2, r3}\n\t"
  84040. "ldm %[b]!, {r4, r5}\n\t"
  84041. "ldr r2, [%[a]]\n\t"
  84042. "ldr r3, [%[a], #4]\n\t"
  84043. #ifdef WOLFSSL_KEIL
  84044. "sbcs r2, r2, r4\n\t"
  84045. #elif defined(__clang__)
  84046. "sbcs r2, r4\n\t"
  84047. #else
  84048. "sbc r2, r4\n\t"
  84049. #endif
  84050. #ifdef WOLFSSL_KEIL
  84051. "sbcs r3, r3, r5\n\t"
  84052. #elif defined(__clang__)
  84053. "sbcs r3, r5\n\t"
  84054. #else
  84055. "sbc r3, r5\n\t"
  84056. #endif
  84057. "stm %[a]!, {r2, r3}\n\t"
  84058. "ldm %[b]!, {r4, r5}\n\t"
  84059. "ldr r2, [%[a]]\n\t"
  84060. "ldr r3, [%[a], #4]\n\t"
  84061. #ifdef WOLFSSL_KEIL
  84062. "sbcs r2, r2, r4\n\t"
  84063. #elif defined(__clang__)
  84064. "sbcs r2, r4\n\t"
  84065. #else
  84066. "sbc r2, r4\n\t"
  84067. #endif
  84068. #ifdef WOLFSSL_KEIL
  84069. "sbcs r3, r3, r5\n\t"
  84070. #elif defined(__clang__)
  84071. "sbcs r3, r5\n\t"
  84072. #else
  84073. "sbc r3, r5\n\t"
  84074. #endif
  84075. "stm %[a]!, {r2, r3}\n\t"
  84076. "ldm %[b]!, {r4, r5}\n\t"
  84077. "ldr r2, [%[a]]\n\t"
  84078. "ldr r3, [%[a], #4]\n\t"
  84079. #ifdef WOLFSSL_KEIL
  84080. "sbcs r2, r2, r4\n\t"
  84081. #elif defined(__clang__)
  84082. "sbcs r2, r4\n\t"
  84083. #else
  84084. "sbc r2, r4\n\t"
  84085. #endif
  84086. #ifdef WOLFSSL_KEIL
  84087. "sbcs r3, r3, r5\n\t"
  84088. #elif defined(__clang__)
  84089. "sbcs r3, r5\n\t"
  84090. #else
  84091. "sbc r3, r5\n\t"
  84092. #endif
  84093. "stm %[a]!, {r2, r3}\n\t"
  84094. "ldm %[b]!, {r4, r5}\n\t"
  84095. "ldr r2, [%[a]]\n\t"
  84096. "ldr r3, [%[a], #4]\n\t"
  84097. #ifdef WOLFSSL_KEIL
  84098. "sbcs r2, r2, r4\n\t"
  84099. #elif defined(__clang__)
  84100. "sbcs r2, r4\n\t"
  84101. #else
  84102. "sbc r2, r4\n\t"
  84103. #endif
  84104. #ifdef WOLFSSL_KEIL
  84105. "sbcs r3, r3, r5\n\t"
  84106. #elif defined(__clang__)
  84107. "sbcs r3, r5\n\t"
  84108. #else
  84109. "sbc r3, r5\n\t"
  84110. #endif
  84111. "stm %[a]!, {r2, r3}\n\t"
  84112. "ldm %[b]!, {r4, r5}\n\t"
  84113. "ldr r2, [%[a]]\n\t"
  84114. "ldr r3, [%[a], #4]\n\t"
  84115. #ifdef WOLFSSL_KEIL
  84116. "sbcs r2, r2, r4\n\t"
  84117. #elif defined(__clang__)
  84118. "sbcs r2, r4\n\t"
  84119. #else
  84120. "sbc r2, r4\n\t"
  84121. #endif
  84122. #ifdef WOLFSSL_KEIL
  84123. "sbcs r3, r3, r5\n\t"
  84124. #elif defined(__clang__)
  84125. "sbcs r3, r5\n\t"
  84126. #else
  84127. "sbc r3, r5\n\t"
  84128. #endif
  84129. "stm %[a]!, {r2, r3}\n\t"
  84130. "ldm %[b]!, {r4, r5}\n\t"
  84131. "ldr r2, [%[a]]\n\t"
  84132. "ldr r3, [%[a], #4]\n\t"
  84133. #ifdef WOLFSSL_KEIL
  84134. "sbcs r2, r2, r4\n\t"
  84135. #elif defined(__clang__)
  84136. "sbcs r2, r4\n\t"
  84137. #else
  84138. "sbc r2, r4\n\t"
  84139. #endif
  84140. #ifdef WOLFSSL_KEIL
  84141. "sbcs r3, r3, r5\n\t"
  84142. #elif defined(__clang__)
  84143. "sbcs r3, r5\n\t"
  84144. #else
  84145. "sbc r3, r5\n\t"
  84146. #endif
  84147. "stm %[a]!, {r2, r3}\n\t"
  84148. "ldm %[b]!, {r4, r5}\n\t"
  84149. "ldr r2, [%[a]]\n\t"
  84150. "ldr r3, [%[a], #4]\n\t"
  84151. #ifdef WOLFSSL_KEIL
  84152. "sbcs r2, r2, r4\n\t"
  84153. #elif defined(__clang__)
  84154. "sbcs r2, r4\n\t"
  84155. #else
  84156. "sbc r2, r4\n\t"
  84157. #endif
  84158. #ifdef WOLFSSL_KEIL
  84159. "sbcs r3, r3, r5\n\t"
  84160. #elif defined(__clang__)
  84161. "sbcs r3, r5\n\t"
  84162. #else
  84163. "sbc r3, r5\n\t"
  84164. #endif
  84165. "stm %[a]!, {r2, r3}\n\t"
  84166. "ldm %[b]!, {r4, r5}\n\t"
  84167. "ldr r2, [%[a]]\n\t"
  84168. "ldr r3, [%[a], #4]\n\t"
  84169. #ifdef WOLFSSL_KEIL
  84170. "sbcs r2, r2, r4\n\t"
  84171. #elif defined(__clang__)
  84172. "sbcs r2, r4\n\t"
  84173. #else
  84174. "sbc r2, r4\n\t"
  84175. #endif
  84176. #ifdef WOLFSSL_KEIL
  84177. "sbcs r3, r3, r5\n\t"
  84178. #elif defined(__clang__)
  84179. "sbcs r3, r5\n\t"
  84180. #else
  84181. "sbc r3, r5\n\t"
  84182. #endif
  84183. "stm %[a]!, {r2, r3}\n\t"
  84184. "ldm %[b]!, {r4, r5}\n\t"
  84185. "ldr r2, [%[a]]\n\t"
  84186. "ldr r3, [%[a], #4]\n\t"
  84187. #ifdef WOLFSSL_KEIL
  84188. "sbcs r2, r2, r4\n\t"
  84189. #elif defined(__clang__)
  84190. "sbcs r2, r4\n\t"
  84191. #else
  84192. "sbc r2, r4\n\t"
  84193. #endif
  84194. #ifdef WOLFSSL_KEIL
  84195. "sbcs r3, r3, r5\n\t"
  84196. #elif defined(__clang__)
  84197. "sbcs r3, r5\n\t"
  84198. #else
  84199. "sbc r3, r5\n\t"
  84200. #endif
  84201. "stm %[a]!, {r2, r3}\n\t"
  84202. "ldm %[b]!, {r4, r5}\n\t"
  84203. "ldr r2, [%[a]]\n\t"
  84204. "ldr r3, [%[a], #4]\n\t"
  84205. #ifdef WOLFSSL_KEIL
  84206. "sbcs r2, r2, r4\n\t"
  84207. #elif defined(__clang__)
  84208. "sbcs r2, r4\n\t"
  84209. #else
  84210. "sbc r2, r4\n\t"
  84211. #endif
  84212. #ifdef WOLFSSL_KEIL
  84213. "sbcs r3, r3, r5\n\t"
  84214. #elif defined(__clang__)
  84215. "sbcs r3, r5\n\t"
  84216. #else
  84217. "sbc r3, r5\n\t"
  84218. #endif
  84219. "stm %[a]!, {r2, r3}\n\t"
  84220. "ldm %[b]!, {r4, r5}\n\t"
  84221. "ldr r2, [%[a]]\n\t"
  84222. "ldr r3, [%[a], #4]\n\t"
  84223. #ifdef WOLFSSL_KEIL
  84224. "sbcs r2, r2, r4\n\t"
  84225. #elif defined(__clang__)
  84226. "sbcs r2, r4\n\t"
  84227. #else
  84228. "sbc r2, r4\n\t"
  84229. #endif
  84230. #ifdef WOLFSSL_KEIL
  84231. "sbcs r3, r3, r5\n\t"
  84232. #elif defined(__clang__)
  84233. "sbcs r3, r5\n\t"
  84234. #else
  84235. "sbc r3, r5\n\t"
  84236. #endif
  84237. "stm %[a]!, {r2, r3}\n\t"
  84238. "ldm %[b]!, {r4, r5}\n\t"
  84239. "ldr r2, [%[a]]\n\t"
  84240. "ldr r3, [%[a], #4]\n\t"
  84241. #ifdef WOLFSSL_KEIL
  84242. "sbcs r2, r2, r4\n\t"
  84243. #elif defined(__clang__)
  84244. "sbcs r2, r4\n\t"
  84245. #else
  84246. "sbc r2, r4\n\t"
  84247. #endif
  84248. #ifdef WOLFSSL_KEIL
  84249. "sbcs r3, r3, r5\n\t"
  84250. #elif defined(__clang__)
  84251. "sbcs r3, r5\n\t"
  84252. #else
  84253. "sbc r3, r5\n\t"
  84254. #endif
  84255. "stm %[a]!, {r2, r3}\n\t"
  84256. "ldm %[b]!, {r4, r5}\n\t"
  84257. "ldr r2, [%[a]]\n\t"
  84258. "ldr r3, [%[a], #4]\n\t"
  84259. #ifdef WOLFSSL_KEIL
  84260. "sbcs r2, r2, r4\n\t"
  84261. #elif defined(__clang__)
  84262. "sbcs r2, r4\n\t"
  84263. #else
  84264. "sbc r2, r4\n\t"
  84265. #endif
  84266. #ifdef WOLFSSL_KEIL
  84267. "sbcs r3, r3, r5\n\t"
  84268. #elif defined(__clang__)
  84269. "sbcs r3, r5\n\t"
  84270. #else
  84271. "sbc r3, r5\n\t"
  84272. #endif
  84273. "stm %[a]!, {r2, r3}\n\t"
  84274. "ldm %[b]!, {r4, r5}\n\t"
  84275. "ldr r2, [%[a]]\n\t"
  84276. "ldr r3, [%[a], #4]\n\t"
  84277. #ifdef WOLFSSL_KEIL
  84278. "sbcs r2, r2, r4\n\t"
  84279. #elif defined(__clang__)
  84280. "sbcs r2, r4\n\t"
  84281. #else
  84282. "sbc r2, r4\n\t"
  84283. #endif
  84284. #ifdef WOLFSSL_KEIL
  84285. "sbcs r3, r3, r5\n\t"
  84286. #elif defined(__clang__)
  84287. "sbcs r3, r5\n\t"
  84288. #else
  84289. "sbc r3, r5\n\t"
  84290. #endif
  84291. "stm %[a]!, {r2, r3}\n\t"
  84292. "ldm %[b]!, {r4, r5}\n\t"
  84293. "ldr r2, [%[a]]\n\t"
  84294. "ldr r3, [%[a], #4]\n\t"
  84295. #ifdef WOLFSSL_KEIL
  84296. "sbcs r2, r2, r4\n\t"
  84297. #elif defined(__clang__)
  84298. "sbcs r2, r4\n\t"
  84299. #else
  84300. "sbc r2, r4\n\t"
  84301. #endif
  84302. #ifdef WOLFSSL_KEIL
  84303. "sbcs r3, r3, r5\n\t"
  84304. #elif defined(__clang__)
  84305. "sbcs r3, r5\n\t"
  84306. #else
  84307. "sbc r3, r5\n\t"
  84308. #endif
  84309. "stm %[a]!, {r2, r3}\n\t"
  84310. "ldm %[b]!, {r4, r5}\n\t"
  84311. "ldr r2, [%[a]]\n\t"
  84312. "ldr r3, [%[a], #4]\n\t"
  84313. #ifdef WOLFSSL_KEIL
  84314. "sbcs r2, r2, r4\n\t"
  84315. #elif defined(__clang__)
  84316. "sbcs r2, r4\n\t"
  84317. #else
  84318. "sbc r2, r4\n\t"
  84319. #endif
  84320. #ifdef WOLFSSL_KEIL
  84321. "sbcs r3, r3, r5\n\t"
  84322. #elif defined(__clang__)
  84323. "sbcs r3, r5\n\t"
  84324. #else
  84325. "sbc r3, r5\n\t"
  84326. #endif
  84327. "stm %[a]!, {r2, r3}\n\t"
  84328. "ldm %[b]!, {r4, r5}\n\t"
  84329. "ldr r2, [%[a]]\n\t"
  84330. "ldr r3, [%[a], #4]\n\t"
  84331. #ifdef WOLFSSL_KEIL
  84332. "sbcs r2, r2, r4\n\t"
  84333. #elif defined(__clang__)
  84334. "sbcs r2, r4\n\t"
  84335. #else
  84336. "sbc r2, r4\n\t"
  84337. #endif
  84338. #ifdef WOLFSSL_KEIL
  84339. "sbcs r3, r3, r5\n\t"
  84340. #elif defined(__clang__)
  84341. "sbcs r3, r5\n\t"
  84342. #else
  84343. "sbc r3, r5\n\t"
  84344. #endif
  84345. "stm %[a]!, {r2, r3}\n\t"
  84346. "ldm %[b]!, {r4, r5}\n\t"
  84347. "ldr r2, [%[a]]\n\t"
  84348. "ldr r3, [%[a], #4]\n\t"
  84349. #ifdef WOLFSSL_KEIL
  84350. "sbcs r2, r2, r4\n\t"
  84351. #elif defined(__clang__)
  84352. "sbcs r2, r4\n\t"
  84353. #else
  84354. "sbc r2, r4\n\t"
  84355. #endif
  84356. #ifdef WOLFSSL_KEIL
  84357. "sbcs r3, r3, r5\n\t"
  84358. #elif defined(__clang__)
  84359. "sbcs r3, r5\n\t"
  84360. #else
  84361. "sbc r3, r5\n\t"
  84362. #endif
  84363. "stm %[a]!, {r2, r3}\n\t"
  84364. "ldm %[b]!, {r4, r5}\n\t"
  84365. "ldr r2, [%[a]]\n\t"
  84366. "ldr r3, [%[a], #4]\n\t"
  84367. #ifdef WOLFSSL_KEIL
  84368. "sbcs r2, r2, r4\n\t"
  84369. #elif defined(__clang__)
  84370. "sbcs r2, r4\n\t"
  84371. #else
  84372. "sbc r2, r4\n\t"
  84373. #endif
  84374. #ifdef WOLFSSL_KEIL
  84375. "sbcs r3, r3, r5\n\t"
  84376. #elif defined(__clang__)
  84377. "sbcs r3, r5\n\t"
  84378. #else
  84379. "sbc r3, r5\n\t"
  84380. #endif
  84381. "stm %[a]!, {r2, r3}\n\t"
  84382. "ldm %[b]!, {r4, r5}\n\t"
  84383. "ldr r2, [%[a]]\n\t"
  84384. "ldr r3, [%[a], #4]\n\t"
  84385. #ifdef WOLFSSL_KEIL
  84386. "sbcs r2, r2, r4\n\t"
  84387. #elif defined(__clang__)
  84388. "sbcs r2, r4\n\t"
  84389. #else
  84390. "sbc r2, r4\n\t"
  84391. #endif
  84392. #ifdef WOLFSSL_KEIL
  84393. "sbcs r3, r3, r5\n\t"
  84394. #elif defined(__clang__)
  84395. "sbcs r3, r5\n\t"
  84396. #else
  84397. "sbc r3, r5\n\t"
  84398. #endif
  84399. "stm %[a]!, {r2, r3}\n\t"
  84400. "ldm %[b]!, {r4, r5}\n\t"
  84401. "ldr r2, [%[a]]\n\t"
  84402. "ldr r3, [%[a], #4]\n\t"
  84403. #ifdef WOLFSSL_KEIL
  84404. "sbcs r2, r2, r4\n\t"
  84405. #elif defined(__clang__)
  84406. "sbcs r2, r4\n\t"
  84407. #else
  84408. "sbc r2, r4\n\t"
  84409. #endif
  84410. #ifdef WOLFSSL_KEIL
  84411. "sbcs r3, r3, r5\n\t"
  84412. #elif defined(__clang__)
  84413. "sbcs r3, r5\n\t"
  84414. #else
  84415. "sbc r3, r5\n\t"
  84416. #endif
  84417. "stm %[a]!, {r2, r3}\n\t"
  84418. "ldm %[b]!, {r4, r5}\n\t"
  84419. "ldr r2, [%[a]]\n\t"
  84420. "ldr r3, [%[a], #4]\n\t"
  84421. #ifdef WOLFSSL_KEIL
  84422. "sbcs r2, r2, r4\n\t"
  84423. #elif defined(__clang__)
  84424. "sbcs r2, r4\n\t"
  84425. #else
  84426. "sbc r2, r4\n\t"
  84427. #endif
  84428. #ifdef WOLFSSL_KEIL
  84429. "sbcs r3, r3, r5\n\t"
  84430. #elif defined(__clang__)
  84431. "sbcs r3, r5\n\t"
  84432. #else
  84433. "sbc r3, r5\n\t"
  84434. #endif
  84435. "stm %[a]!, {r2, r3}\n\t"
  84436. "ldm %[b]!, {r4, r5}\n\t"
  84437. "ldr r2, [%[a]]\n\t"
  84438. "ldr r3, [%[a], #4]\n\t"
  84439. #ifdef WOLFSSL_KEIL
  84440. "sbcs r2, r2, r4\n\t"
  84441. #elif defined(__clang__)
  84442. "sbcs r2, r4\n\t"
  84443. #else
  84444. "sbc r2, r4\n\t"
  84445. #endif
  84446. #ifdef WOLFSSL_KEIL
  84447. "sbcs r3, r3, r5\n\t"
  84448. #elif defined(__clang__)
  84449. "sbcs r3, r5\n\t"
  84450. #else
  84451. "sbc r3, r5\n\t"
  84452. #endif
  84453. "stm %[a]!, {r2, r3}\n\t"
  84454. "ldm %[b]!, {r4, r5}\n\t"
  84455. "ldr r2, [%[a]]\n\t"
  84456. "ldr r3, [%[a], #4]\n\t"
  84457. #ifdef WOLFSSL_KEIL
  84458. "sbcs r2, r2, r4\n\t"
  84459. #elif defined(__clang__)
  84460. "sbcs r2, r4\n\t"
  84461. #else
  84462. "sbc r2, r4\n\t"
  84463. #endif
  84464. #ifdef WOLFSSL_KEIL
  84465. "sbcs r3, r3, r5\n\t"
  84466. #elif defined(__clang__)
  84467. "sbcs r3, r5\n\t"
  84468. #else
  84469. "sbc r3, r5\n\t"
  84470. #endif
  84471. "stm %[a]!, {r2, r3}\n\t"
  84472. "ldm %[b]!, {r4, r5}\n\t"
  84473. "ldr r2, [%[a]]\n\t"
  84474. "ldr r3, [%[a], #4]\n\t"
  84475. #ifdef WOLFSSL_KEIL
  84476. "sbcs r2, r2, r4\n\t"
  84477. #elif defined(__clang__)
  84478. "sbcs r2, r4\n\t"
  84479. #else
  84480. "sbc r2, r4\n\t"
  84481. #endif
  84482. #ifdef WOLFSSL_KEIL
  84483. "sbcs r3, r3, r5\n\t"
  84484. #elif defined(__clang__)
  84485. "sbcs r3, r5\n\t"
  84486. #else
  84487. "sbc r3, r5\n\t"
  84488. #endif
  84489. "stm %[a]!, {r2, r3}\n\t"
  84490. "ldm %[b]!, {r4, r5}\n\t"
  84491. "ldr r2, [%[a]]\n\t"
  84492. "ldr r3, [%[a], #4]\n\t"
  84493. #ifdef WOLFSSL_KEIL
  84494. "sbcs r2, r2, r4\n\t"
  84495. #elif defined(__clang__)
  84496. "sbcs r2, r4\n\t"
  84497. #else
  84498. "sbc r2, r4\n\t"
  84499. #endif
  84500. #ifdef WOLFSSL_KEIL
  84501. "sbcs r3, r3, r5\n\t"
  84502. #elif defined(__clang__)
  84503. "sbcs r3, r5\n\t"
  84504. #else
  84505. "sbc r3, r5\n\t"
  84506. #endif
  84507. "stm %[a]!, {r2, r3}\n\t"
  84508. "ldm %[b]!, {r4, r5}\n\t"
  84509. "ldr r2, [%[a]]\n\t"
  84510. "ldr r3, [%[a], #4]\n\t"
  84511. #ifdef WOLFSSL_KEIL
  84512. "sbcs r2, r2, r4\n\t"
  84513. #elif defined(__clang__)
  84514. "sbcs r2, r4\n\t"
  84515. #else
  84516. "sbc r2, r4\n\t"
  84517. #endif
  84518. #ifdef WOLFSSL_KEIL
  84519. "sbcs r3, r3, r5\n\t"
  84520. #elif defined(__clang__)
  84521. "sbcs r3, r5\n\t"
  84522. #else
  84523. "sbc r3, r5\n\t"
  84524. #endif
  84525. "stm %[a]!, {r2, r3}\n\t"
  84526. "ldm %[b]!, {r4, r5}\n\t"
  84527. "ldr r2, [%[a]]\n\t"
  84528. "ldr r3, [%[a], #4]\n\t"
  84529. #ifdef WOLFSSL_KEIL
  84530. "sbcs r2, r2, r4\n\t"
  84531. #elif defined(__clang__)
  84532. "sbcs r2, r4\n\t"
  84533. #else
  84534. "sbc r2, r4\n\t"
  84535. #endif
  84536. #ifdef WOLFSSL_KEIL
  84537. "sbcs r3, r3, r5\n\t"
  84538. #elif defined(__clang__)
  84539. "sbcs r3, r5\n\t"
  84540. #else
  84541. "sbc r3, r5\n\t"
  84542. #endif
  84543. "stm %[a]!, {r2, r3}\n\t"
  84544. "ldm %[b]!, {r4, r5}\n\t"
  84545. "ldr r2, [%[a]]\n\t"
  84546. "ldr r3, [%[a], #4]\n\t"
  84547. #ifdef WOLFSSL_KEIL
  84548. "sbcs r2, r2, r4\n\t"
  84549. #elif defined(__clang__)
  84550. "sbcs r2, r4\n\t"
  84551. #else
  84552. "sbc r2, r4\n\t"
  84553. #endif
  84554. #ifdef WOLFSSL_KEIL
  84555. "sbcs r3, r3, r5\n\t"
  84556. #elif defined(__clang__)
  84557. "sbcs r3, r5\n\t"
  84558. #else
  84559. "sbc r3, r5\n\t"
  84560. #endif
  84561. "stm %[a]!, {r2, r3}\n\t"
  84562. "ldm %[b]!, {r4, r5}\n\t"
  84563. "ldr r2, [%[a]]\n\t"
  84564. "ldr r3, [%[a], #4]\n\t"
  84565. #ifdef WOLFSSL_KEIL
  84566. "sbcs r2, r2, r4\n\t"
  84567. #elif defined(__clang__)
  84568. "sbcs r2, r4\n\t"
  84569. #else
  84570. "sbc r2, r4\n\t"
  84571. #endif
  84572. #ifdef WOLFSSL_KEIL
  84573. "sbcs r3, r3, r5\n\t"
  84574. #elif defined(__clang__)
  84575. "sbcs r3, r5\n\t"
  84576. #else
  84577. "sbc r3, r5\n\t"
  84578. #endif
  84579. "stm %[a]!, {r2, r3}\n\t"
  84580. "ldm %[b]!, {r4, r5}\n\t"
  84581. "ldr r2, [%[a]]\n\t"
  84582. "ldr r3, [%[a], #4]\n\t"
  84583. #ifdef WOLFSSL_KEIL
  84584. "sbcs r2, r2, r4\n\t"
  84585. #elif defined(__clang__)
  84586. "sbcs r2, r4\n\t"
  84587. #else
  84588. "sbc r2, r4\n\t"
  84589. #endif
  84590. #ifdef WOLFSSL_KEIL
  84591. "sbcs r3, r3, r5\n\t"
  84592. #elif defined(__clang__)
  84593. "sbcs r3, r5\n\t"
  84594. #else
  84595. "sbc r3, r5\n\t"
  84596. #endif
  84597. "stm %[a]!, {r2, r3}\n\t"
  84598. "ldm %[b]!, {r4, r5}\n\t"
  84599. "ldr r2, [%[a]]\n\t"
  84600. "ldr r3, [%[a], #4]\n\t"
  84601. #ifdef WOLFSSL_KEIL
  84602. "sbcs r2, r2, r4\n\t"
  84603. #elif defined(__clang__)
  84604. "sbcs r2, r4\n\t"
  84605. #else
  84606. "sbc r2, r4\n\t"
  84607. #endif
  84608. #ifdef WOLFSSL_KEIL
  84609. "sbcs r3, r3, r5\n\t"
  84610. #elif defined(__clang__)
  84611. "sbcs r3, r5\n\t"
  84612. #else
  84613. "sbc r3, r5\n\t"
  84614. #endif
  84615. "stm %[a]!, {r2, r3}\n\t"
  84616. "ldm %[b]!, {r4, r5}\n\t"
  84617. "ldr r2, [%[a]]\n\t"
  84618. "ldr r3, [%[a], #4]\n\t"
  84619. #ifdef WOLFSSL_KEIL
  84620. "sbcs r2, r2, r4\n\t"
  84621. #elif defined(__clang__)
  84622. "sbcs r2, r4\n\t"
  84623. #else
  84624. "sbc r2, r4\n\t"
  84625. #endif
  84626. #ifdef WOLFSSL_KEIL
  84627. "sbcs r3, r3, r5\n\t"
  84628. #elif defined(__clang__)
  84629. "sbcs r3, r5\n\t"
  84630. #else
  84631. "sbc r3, r5\n\t"
  84632. #endif
  84633. "stm %[a]!, {r2, r3}\n\t"
  84634. "ldm %[b]!, {r4, r5}\n\t"
  84635. "ldr r2, [%[a]]\n\t"
  84636. "ldr r3, [%[a], #4]\n\t"
  84637. #ifdef WOLFSSL_KEIL
  84638. "sbcs r2, r2, r4\n\t"
  84639. #elif defined(__clang__)
  84640. "sbcs r2, r4\n\t"
  84641. #else
  84642. "sbc r2, r4\n\t"
  84643. #endif
  84644. #ifdef WOLFSSL_KEIL
  84645. "sbcs r3, r3, r5\n\t"
  84646. #elif defined(__clang__)
  84647. "sbcs r3, r5\n\t"
  84648. #else
  84649. "sbc r3, r5\n\t"
  84650. #endif
  84651. "stm %[a]!, {r2, r3}\n\t"
  84652. #ifdef WOLFSSL_KEIL
  84653. "sbcs %[a], %[a], %[a]\n\t"
  84654. #elif defined(__clang__)
  84655. "sbcs %[a], %[a]\n\t"
  84656. #else
  84657. "sbc %[a], %[a]\n\t"
  84658. #endif
  84659. : [a] "+l" (a), [b] "+l" (b)
  84660. :
  84661. : "memory", "r2", "r3", "r4", "r5"
  84662. );
  84663. return (uint32_t)(size_t)a;
  84664. }
  84665. /* Add b to a into r. (r = a + b)
  84666. *
  84667. * r A single precision integer.
  84668. * a A single precision integer.
  84669. * b A single precision integer.
  84670. */
  84671. SP_NOINLINE static sp_digit sp_4096_add_128(sp_digit* r, const sp_digit* a,
  84672. const sp_digit* b)
  84673. {
  84674. __asm__ __volatile__ (
  84675. "ldm %[b]!, {r5, r6}\n\t"
  84676. "ldm %[a]!, {r3, r4}\n\t"
  84677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  84678. "adds r3, r3, r5\n\t"
  84679. #else
  84680. "add r3, r3, r5\n\t"
  84681. #endif
  84682. #ifdef WOLFSSL_KEIL
  84683. "adcs r4, r4, r6\n\t"
  84684. #elif defined(__clang__)
  84685. "adcs r4, r6\n\t"
  84686. #else
  84687. "adc r4, r6\n\t"
  84688. #endif
  84689. "stm %[r]!, {r3, r4}\n\t"
  84690. "ldm %[b]!, {r5, r6}\n\t"
  84691. "ldm %[a]!, {r3, r4}\n\t"
  84692. #ifdef WOLFSSL_KEIL
  84693. "adcs r3, r3, r5\n\t"
  84694. #elif defined(__clang__)
  84695. "adcs r3, r5\n\t"
  84696. #else
  84697. "adc r3, r5\n\t"
  84698. #endif
  84699. #ifdef WOLFSSL_KEIL
  84700. "adcs r4, r4, r6\n\t"
  84701. #elif defined(__clang__)
  84702. "adcs r4, r6\n\t"
  84703. #else
  84704. "adc r4, r6\n\t"
  84705. #endif
  84706. "stm %[r]!, {r3, r4}\n\t"
  84707. "ldm %[b]!, {r5, r6}\n\t"
  84708. "ldm %[a]!, {r3, r4}\n\t"
  84709. #ifdef WOLFSSL_KEIL
  84710. "adcs r3, r3, r5\n\t"
  84711. #elif defined(__clang__)
  84712. "adcs r3, r5\n\t"
  84713. #else
  84714. "adc r3, r5\n\t"
  84715. #endif
  84716. #ifdef WOLFSSL_KEIL
  84717. "adcs r4, r4, r6\n\t"
  84718. #elif defined(__clang__)
  84719. "adcs r4, r6\n\t"
  84720. #else
  84721. "adc r4, r6\n\t"
  84722. #endif
  84723. "stm %[r]!, {r3, r4}\n\t"
  84724. "ldm %[b]!, {r5, r6}\n\t"
  84725. "ldm %[a]!, {r3, r4}\n\t"
  84726. #ifdef WOLFSSL_KEIL
  84727. "adcs r3, r3, r5\n\t"
  84728. #elif defined(__clang__)
  84729. "adcs r3, r5\n\t"
  84730. #else
  84731. "adc r3, r5\n\t"
  84732. #endif
  84733. #ifdef WOLFSSL_KEIL
  84734. "adcs r4, r4, r6\n\t"
  84735. #elif defined(__clang__)
  84736. "adcs r4, r6\n\t"
  84737. #else
  84738. "adc r4, r6\n\t"
  84739. #endif
  84740. "stm %[r]!, {r3, r4}\n\t"
  84741. "ldm %[b]!, {r5, r6}\n\t"
  84742. "ldm %[a]!, {r3, r4}\n\t"
  84743. #ifdef WOLFSSL_KEIL
  84744. "adcs r3, r3, r5\n\t"
  84745. #elif defined(__clang__)
  84746. "adcs r3, r5\n\t"
  84747. #else
  84748. "adc r3, r5\n\t"
  84749. #endif
  84750. #ifdef WOLFSSL_KEIL
  84751. "adcs r4, r4, r6\n\t"
  84752. #elif defined(__clang__)
  84753. "adcs r4, r6\n\t"
  84754. #else
  84755. "adc r4, r6\n\t"
  84756. #endif
  84757. "stm %[r]!, {r3, r4}\n\t"
  84758. "ldm %[b]!, {r5, r6}\n\t"
  84759. "ldm %[a]!, {r3, r4}\n\t"
  84760. #ifdef WOLFSSL_KEIL
  84761. "adcs r3, r3, r5\n\t"
  84762. #elif defined(__clang__)
  84763. "adcs r3, r5\n\t"
  84764. #else
  84765. "adc r3, r5\n\t"
  84766. #endif
  84767. #ifdef WOLFSSL_KEIL
  84768. "adcs r4, r4, r6\n\t"
  84769. #elif defined(__clang__)
  84770. "adcs r4, r6\n\t"
  84771. #else
  84772. "adc r4, r6\n\t"
  84773. #endif
  84774. "stm %[r]!, {r3, r4}\n\t"
  84775. "ldm %[b]!, {r5, r6}\n\t"
  84776. "ldm %[a]!, {r3, r4}\n\t"
  84777. #ifdef WOLFSSL_KEIL
  84778. "adcs r3, r3, r5\n\t"
  84779. #elif defined(__clang__)
  84780. "adcs r3, r5\n\t"
  84781. #else
  84782. "adc r3, r5\n\t"
  84783. #endif
  84784. #ifdef WOLFSSL_KEIL
  84785. "adcs r4, r4, r6\n\t"
  84786. #elif defined(__clang__)
  84787. "adcs r4, r6\n\t"
  84788. #else
  84789. "adc r4, r6\n\t"
  84790. #endif
  84791. "stm %[r]!, {r3, r4}\n\t"
  84792. "ldm %[b]!, {r5, r6}\n\t"
  84793. "ldm %[a]!, {r3, r4}\n\t"
  84794. #ifdef WOLFSSL_KEIL
  84795. "adcs r3, r3, r5\n\t"
  84796. #elif defined(__clang__)
  84797. "adcs r3, r5\n\t"
  84798. #else
  84799. "adc r3, r5\n\t"
  84800. #endif
  84801. #ifdef WOLFSSL_KEIL
  84802. "adcs r4, r4, r6\n\t"
  84803. #elif defined(__clang__)
  84804. "adcs r4, r6\n\t"
  84805. #else
  84806. "adc r4, r6\n\t"
  84807. #endif
  84808. "stm %[r]!, {r3, r4}\n\t"
  84809. "ldm %[b]!, {r5, r6}\n\t"
  84810. "ldm %[a]!, {r3, r4}\n\t"
  84811. #ifdef WOLFSSL_KEIL
  84812. "adcs r3, r3, r5\n\t"
  84813. #elif defined(__clang__)
  84814. "adcs r3, r5\n\t"
  84815. #else
  84816. "adc r3, r5\n\t"
  84817. #endif
  84818. #ifdef WOLFSSL_KEIL
  84819. "adcs r4, r4, r6\n\t"
  84820. #elif defined(__clang__)
  84821. "adcs r4, r6\n\t"
  84822. #else
  84823. "adc r4, r6\n\t"
  84824. #endif
  84825. "stm %[r]!, {r3, r4}\n\t"
  84826. "ldm %[b]!, {r5, r6}\n\t"
  84827. "ldm %[a]!, {r3, r4}\n\t"
  84828. #ifdef WOLFSSL_KEIL
  84829. "adcs r3, r3, r5\n\t"
  84830. #elif defined(__clang__)
  84831. "adcs r3, r5\n\t"
  84832. #else
  84833. "adc r3, r5\n\t"
  84834. #endif
  84835. #ifdef WOLFSSL_KEIL
  84836. "adcs r4, r4, r6\n\t"
  84837. #elif defined(__clang__)
  84838. "adcs r4, r6\n\t"
  84839. #else
  84840. "adc r4, r6\n\t"
  84841. #endif
  84842. "stm %[r]!, {r3, r4}\n\t"
  84843. "ldm %[b]!, {r5, r6}\n\t"
  84844. "ldm %[a]!, {r3, r4}\n\t"
  84845. #ifdef WOLFSSL_KEIL
  84846. "adcs r3, r3, r5\n\t"
  84847. #elif defined(__clang__)
  84848. "adcs r3, r5\n\t"
  84849. #else
  84850. "adc r3, r5\n\t"
  84851. #endif
  84852. #ifdef WOLFSSL_KEIL
  84853. "adcs r4, r4, r6\n\t"
  84854. #elif defined(__clang__)
  84855. "adcs r4, r6\n\t"
  84856. #else
  84857. "adc r4, r6\n\t"
  84858. #endif
  84859. "stm %[r]!, {r3, r4}\n\t"
  84860. "ldm %[b]!, {r5, r6}\n\t"
  84861. "ldm %[a]!, {r3, r4}\n\t"
  84862. #ifdef WOLFSSL_KEIL
  84863. "adcs r3, r3, r5\n\t"
  84864. #elif defined(__clang__)
  84865. "adcs r3, r5\n\t"
  84866. #else
  84867. "adc r3, r5\n\t"
  84868. #endif
  84869. #ifdef WOLFSSL_KEIL
  84870. "adcs r4, r4, r6\n\t"
  84871. #elif defined(__clang__)
  84872. "adcs r4, r6\n\t"
  84873. #else
  84874. "adc r4, r6\n\t"
  84875. #endif
  84876. "stm %[r]!, {r3, r4}\n\t"
  84877. "ldm %[b]!, {r5, r6}\n\t"
  84878. "ldm %[a]!, {r3, r4}\n\t"
  84879. #ifdef WOLFSSL_KEIL
  84880. "adcs r3, r3, r5\n\t"
  84881. #elif defined(__clang__)
  84882. "adcs r3, r5\n\t"
  84883. #else
  84884. "adc r3, r5\n\t"
  84885. #endif
  84886. #ifdef WOLFSSL_KEIL
  84887. "adcs r4, r4, r6\n\t"
  84888. #elif defined(__clang__)
  84889. "adcs r4, r6\n\t"
  84890. #else
  84891. "adc r4, r6\n\t"
  84892. #endif
  84893. "stm %[r]!, {r3, r4}\n\t"
  84894. "ldm %[b]!, {r5, r6}\n\t"
  84895. "ldm %[a]!, {r3, r4}\n\t"
  84896. #ifdef WOLFSSL_KEIL
  84897. "adcs r3, r3, r5\n\t"
  84898. #elif defined(__clang__)
  84899. "adcs r3, r5\n\t"
  84900. #else
  84901. "adc r3, r5\n\t"
  84902. #endif
  84903. #ifdef WOLFSSL_KEIL
  84904. "adcs r4, r4, r6\n\t"
  84905. #elif defined(__clang__)
  84906. "adcs r4, r6\n\t"
  84907. #else
  84908. "adc r4, r6\n\t"
  84909. #endif
  84910. "stm %[r]!, {r3, r4}\n\t"
  84911. "ldm %[b]!, {r5, r6}\n\t"
  84912. "ldm %[a]!, {r3, r4}\n\t"
  84913. #ifdef WOLFSSL_KEIL
  84914. "adcs r3, r3, r5\n\t"
  84915. #elif defined(__clang__)
  84916. "adcs r3, r5\n\t"
  84917. #else
  84918. "adc r3, r5\n\t"
  84919. #endif
  84920. #ifdef WOLFSSL_KEIL
  84921. "adcs r4, r4, r6\n\t"
  84922. #elif defined(__clang__)
  84923. "adcs r4, r6\n\t"
  84924. #else
  84925. "adc r4, r6\n\t"
  84926. #endif
  84927. "stm %[r]!, {r3, r4}\n\t"
  84928. "ldm %[b]!, {r5, r6}\n\t"
  84929. "ldm %[a]!, {r3, r4}\n\t"
  84930. #ifdef WOLFSSL_KEIL
  84931. "adcs r3, r3, r5\n\t"
  84932. #elif defined(__clang__)
  84933. "adcs r3, r5\n\t"
  84934. #else
  84935. "adc r3, r5\n\t"
  84936. #endif
  84937. #ifdef WOLFSSL_KEIL
  84938. "adcs r4, r4, r6\n\t"
  84939. #elif defined(__clang__)
  84940. "adcs r4, r6\n\t"
  84941. #else
  84942. "adc r4, r6\n\t"
  84943. #endif
  84944. "stm %[r]!, {r3, r4}\n\t"
  84945. "ldm %[b]!, {r5, r6}\n\t"
  84946. "ldm %[a]!, {r3, r4}\n\t"
  84947. #ifdef WOLFSSL_KEIL
  84948. "adcs r3, r3, r5\n\t"
  84949. #elif defined(__clang__)
  84950. "adcs r3, r5\n\t"
  84951. #else
  84952. "adc r3, r5\n\t"
  84953. #endif
  84954. #ifdef WOLFSSL_KEIL
  84955. "adcs r4, r4, r6\n\t"
  84956. #elif defined(__clang__)
  84957. "adcs r4, r6\n\t"
  84958. #else
  84959. "adc r4, r6\n\t"
  84960. #endif
  84961. "stm %[r]!, {r3, r4}\n\t"
  84962. "ldm %[b]!, {r5, r6}\n\t"
  84963. "ldm %[a]!, {r3, r4}\n\t"
  84964. #ifdef WOLFSSL_KEIL
  84965. "adcs r3, r3, r5\n\t"
  84966. #elif defined(__clang__)
  84967. "adcs r3, r5\n\t"
  84968. #else
  84969. "adc r3, r5\n\t"
  84970. #endif
  84971. #ifdef WOLFSSL_KEIL
  84972. "adcs r4, r4, r6\n\t"
  84973. #elif defined(__clang__)
  84974. "adcs r4, r6\n\t"
  84975. #else
  84976. "adc r4, r6\n\t"
  84977. #endif
  84978. "stm %[r]!, {r3, r4}\n\t"
  84979. "ldm %[b]!, {r5, r6}\n\t"
  84980. "ldm %[a]!, {r3, r4}\n\t"
  84981. #ifdef WOLFSSL_KEIL
  84982. "adcs r3, r3, r5\n\t"
  84983. #elif defined(__clang__)
  84984. "adcs r3, r5\n\t"
  84985. #else
  84986. "adc r3, r5\n\t"
  84987. #endif
  84988. #ifdef WOLFSSL_KEIL
  84989. "adcs r4, r4, r6\n\t"
  84990. #elif defined(__clang__)
  84991. "adcs r4, r6\n\t"
  84992. #else
  84993. "adc r4, r6\n\t"
  84994. #endif
  84995. "stm %[r]!, {r3, r4}\n\t"
  84996. "ldm %[b]!, {r5, r6}\n\t"
  84997. "ldm %[a]!, {r3, r4}\n\t"
  84998. #ifdef WOLFSSL_KEIL
  84999. "adcs r3, r3, r5\n\t"
  85000. #elif defined(__clang__)
  85001. "adcs r3, r5\n\t"
  85002. #else
  85003. "adc r3, r5\n\t"
  85004. #endif
  85005. #ifdef WOLFSSL_KEIL
  85006. "adcs r4, r4, r6\n\t"
  85007. #elif defined(__clang__)
  85008. "adcs r4, r6\n\t"
  85009. #else
  85010. "adc r4, r6\n\t"
  85011. #endif
  85012. "stm %[r]!, {r3, r4}\n\t"
  85013. "ldm %[b]!, {r5, r6}\n\t"
  85014. "ldm %[a]!, {r3, r4}\n\t"
  85015. #ifdef WOLFSSL_KEIL
  85016. "adcs r3, r3, r5\n\t"
  85017. #elif defined(__clang__)
  85018. "adcs r3, r5\n\t"
  85019. #else
  85020. "adc r3, r5\n\t"
  85021. #endif
  85022. #ifdef WOLFSSL_KEIL
  85023. "adcs r4, r4, r6\n\t"
  85024. #elif defined(__clang__)
  85025. "adcs r4, r6\n\t"
  85026. #else
  85027. "adc r4, r6\n\t"
  85028. #endif
  85029. "stm %[r]!, {r3, r4}\n\t"
  85030. "ldm %[b]!, {r5, r6}\n\t"
  85031. "ldm %[a]!, {r3, r4}\n\t"
  85032. #ifdef WOLFSSL_KEIL
  85033. "adcs r3, r3, r5\n\t"
  85034. #elif defined(__clang__)
  85035. "adcs r3, r5\n\t"
  85036. #else
  85037. "adc r3, r5\n\t"
  85038. #endif
  85039. #ifdef WOLFSSL_KEIL
  85040. "adcs r4, r4, r6\n\t"
  85041. #elif defined(__clang__)
  85042. "adcs r4, r6\n\t"
  85043. #else
  85044. "adc r4, r6\n\t"
  85045. #endif
  85046. "stm %[r]!, {r3, r4}\n\t"
  85047. "ldm %[b]!, {r5, r6}\n\t"
  85048. "ldm %[a]!, {r3, r4}\n\t"
  85049. #ifdef WOLFSSL_KEIL
  85050. "adcs r3, r3, r5\n\t"
  85051. #elif defined(__clang__)
  85052. "adcs r3, r5\n\t"
  85053. #else
  85054. "adc r3, r5\n\t"
  85055. #endif
  85056. #ifdef WOLFSSL_KEIL
  85057. "adcs r4, r4, r6\n\t"
  85058. #elif defined(__clang__)
  85059. "adcs r4, r6\n\t"
  85060. #else
  85061. "adc r4, r6\n\t"
  85062. #endif
  85063. "stm %[r]!, {r3, r4}\n\t"
  85064. "ldm %[b]!, {r5, r6}\n\t"
  85065. "ldm %[a]!, {r3, r4}\n\t"
  85066. #ifdef WOLFSSL_KEIL
  85067. "adcs r3, r3, r5\n\t"
  85068. #elif defined(__clang__)
  85069. "adcs r3, r5\n\t"
  85070. #else
  85071. "adc r3, r5\n\t"
  85072. #endif
  85073. #ifdef WOLFSSL_KEIL
  85074. "adcs r4, r4, r6\n\t"
  85075. #elif defined(__clang__)
  85076. "adcs r4, r6\n\t"
  85077. #else
  85078. "adc r4, r6\n\t"
  85079. #endif
  85080. "stm %[r]!, {r3, r4}\n\t"
  85081. "ldm %[b]!, {r5, r6}\n\t"
  85082. "ldm %[a]!, {r3, r4}\n\t"
  85083. #ifdef WOLFSSL_KEIL
  85084. "adcs r3, r3, r5\n\t"
  85085. #elif defined(__clang__)
  85086. "adcs r3, r5\n\t"
  85087. #else
  85088. "adc r3, r5\n\t"
  85089. #endif
  85090. #ifdef WOLFSSL_KEIL
  85091. "adcs r4, r4, r6\n\t"
  85092. #elif defined(__clang__)
  85093. "adcs r4, r6\n\t"
  85094. #else
  85095. "adc r4, r6\n\t"
  85096. #endif
  85097. "stm %[r]!, {r3, r4}\n\t"
  85098. "ldm %[b]!, {r5, r6}\n\t"
  85099. "ldm %[a]!, {r3, r4}\n\t"
  85100. #ifdef WOLFSSL_KEIL
  85101. "adcs r3, r3, r5\n\t"
  85102. #elif defined(__clang__)
  85103. "adcs r3, r5\n\t"
  85104. #else
  85105. "adc r3, r5\n\t"
  85106. #endif
  85107. #ifdef WOLFSSL_KEIL
  85108. "adcs r4, r4, r6\n\t"
  85109. #elif defined(__clang__)
  85110. "adcs r4, r6\n\t"
  85111. #else
  85112. "adc r4, r6\n\t"
  85113. #endif
  85114. "stm %[r]!, {r3, r4}\n\t"
  85115. "ldm %[b]!, {r5, r6}\n\t"
  85116. "ldm %[a]!, {r3, r4}\n\t"
  85117. #ifdef WOLFSSL_KEIL
  85118. "adcs r3, r3, r5\n\t"
  85119. #elif defined(__clang__)
  85120. "adcs r3, r5\n\t"
  85121. #else
  85122. "adc r3, r5\n\t"
  85123. #endif
  85124. #ifdef WOLFSSL_KEIL
  85125. "adcs r4, r4, r6\n\t"
  85126. #elif defined(__clang__)
  85127. "adcs r4, r6\n\t"
  85128. #else
  85129. "adc r4, r6\n\t"
  85130. #endif
  85131. "stm %[r]!, {r3, r4}\n\t"
  85132. "ldm %[b]!, {r5, r6}\n\t"
  85133. "ldm %[a]!, {r3, r4}\n\t"
  85134. #ifdef WOLFSSL_KEIL
  85135. "adcs r3, r3, r5\n\t"
  85136. #elif defined(__clang__)
  85137. "adcs r3, r5\n\t"
  85138. #else
  85139. "adc r3, r5\n\t"
  85140. #endif
  85141. #ifdef WOLFSSL_KEIL
  85142. "adcs r4, r4, r6\n\t"
  85143. #elif defined(__clang__)
  85144. "adcs r4, r6\n\t"
  85145. #else
  85146. "adc r4, r6\n\t"
  85147. #endif
  85148. "stm %[r]!, {r3, r4}\n\t"
  85149. "ldm %[b]!, {r5, r6}\n\t"
  85150. "ldm %[a]!, {r3, r4}\n\t"
  85151. #ifdef WOLFSSL_KEIL
  85152. "adcs r3, r3, r5\n\t"
  85153. #elif defined(__clang__)
  85154. "adcs r3, r5\n\t"
  85155. #else
  85156. "adc r3, r5\n\t"
  85157. #endif
  85158. #ifdef WOLFSSL_KEIL
  85159. "adcs r4, r4, r6\n\t"
  85160. #elif defined(__clang__)
  85161. "adcs r4, r6\n\t"
  85162. #else
  85163. "adc r4, r6\n\t"
  85164. #endif
  85165. "stm %[r]!, {r3, r4}\n\t"
  85166. "ldm %[b]!, {r5, r6}\n\t"
  85167. "ldm %[a]!, {r3, r4}\n\t"
  85168. #ifdef WOLFSSL_KEIL
  85169. "adcs r3, r3, r5\n\t"
  85170. #elif defined(__clang__)
  85171. "adcs r3, r5\n\t"
  85172. #else
  85173. "adc r3, r5\n\t"
  85174. #endif
  85175. #ifdef WOLFSSL_KEIL
  85176. "adcs r4, r4, r6\n\t"
  85177. #elif defined(__clang__)
  85178. "adcs r4, r6\n\t"
  85179. #else
  85180. "adc r4, r6\n\t"
  85181. #endif
  85182. "stm %[r]!, {r3, r4}\n\t"
  85183. "ldm %[b]!, {r5, r6}\n\t"
  85184. "ldm %[a]!, {r3, r4}\n\t"
  85185. #ifdef WOLFSSL_KEIL
  85186. "adcs r3, r3, r5\n\t"
  85187. #elif defined(__clang__)
  85188. "adcs r3, r5\n\t"
  85189. #else
  85190. "adc r3, r5\n\t"
  85191. #endif
  85192. #ifdef WOLFSSL_KEIL
  85193. "adcs r4, r4, r6\n\t"
  85194. #elif defined(__clang__)
  85195. "adcs r4, r6\n\t"
  85196. #else
  85197. "adc r4, r6\n\t"
  85198. #endif
  85199. "stm %[r]!, {r3, r4}\n\t"
  85200. "ldm %[b]!, {r5, r6}\n\t"
  85201. "ldm %[a]!, {r3, r4}\n\t"
  85202. #ifdef WOLFSSL_KEIL
  85203. "adcs r3, r3, r5\n\t"
  85204. #elif defined(__clang__)
  85205. "adcs r3, r5\n\t"
  85206. #else
  85207. "adc r3, r5\n\t"
  85208. #endif
  85209. #ifdef WOLFSSL_KEIL
  85210. "adcs r4, r4, r6\n\t"
  85211. #elif defined(__clang__)
  85212. "adcs r4, r6\n\t"
  85213. #else
  85214. "adc r4, r6\n\t"
  85215. #endif
  85216. "stm %[r]!, {r3, r4}\n\t"
  85217. "ldm %[b]!, {r5, r6}\n\t"
  85218. "ldm %[a]!, {r3, r4}\n\t"
  85219. #ifdef WOLFSSL_KEIL
  85220. "adcs r3, r3, r5\n\t"
  85221. #elif defined(__clang__)
  85222. "adcs r3, r5\n\t"
  85223. #else
  85224. "adc r3, r5\n\t"
  85225. #endif
  85226. #ifdef WOLFSSL_KEIL
  85227. "adcs r4, r4, r6\n\t"
  85228. #elif defined(__clang__)
  85229. "adcs r4, r6\n\t"
  85230. #else
  85231. "adc r4, r6\n\t"
  85232. #endif
  85233. "stm %[r]!, {r3, r4}\n\t"
  85234. "ldm %[b]!, {r5, r6}\n\t"
  85235. "ldm %[a]!, {r3, r4}\n\t"
  85236. #ifdef WOLFSSL_KEIL
  85237. "adcs r3, r3, r5\n\t"
  85238. #elif defined(__clang__)
  85239. "adcs r3, r5\n\t"
  85240. #else
  85241. "adc r3, r5\n\t"
  85242. #endif
  85243. #ifdef WOLFSSL_KEIL
  85244. "adcs r4, r4, r6\n\t"
  85245. #elif defined(__clang__)
  85246. "adcs r4, r6\n\t"
  85247. #else
  85248. "adc r4, r6\n\t"
  85249. #endif
  85250. "stm %[r]!, {r3, r4}\n\t"
  85251. "ldm %[b]!, {r5, r6}\n\t"
  85252. "ldm %[a]!, {r3, r4}\n\t"
  85253. #ifdef WOLFSSL_KEIL
  85254. "adcs r3, r3, r5\n\t"
  85255. #elif defined(__clang__)
  85256. "adcs r3, r5\n\t"
  85257. #else
  85258. "adc r3, r5\n\t"
  85259. #endif
  85260. #ifdef WOLFSSL_KEIL
  85261. "adcs r4, r4, r6\n\t"
  85262. #elif defined(__clang__)
  85263. "adcs r4, r6\n\t"
  85264. #else
  85265. "adc r4, r6\n\t"
  85266. #endif
  85267. "stm %[r]!, {r3, r4}\n\t"
  85268. "ldm %[b]!, {r5, r6}\n\t"
  85269. "ldm %[a]!, {r3, r4}\n\t"
  85270. #ifdef WOLFSSL_KEIL
  85271. "adcs r3, r3, r5\n\t"
  85272. #elif defined(__clang__)
  85273. "adcs r3, r5\n\t"
  85274. #else
  85275. "adc r3, r5\n\t"
  85276. #endif
  85277. #ifdef WOLFSSL_KEIL
  85278. "adcs r4, r4, r6\n\t"
  85279. #elif defined(__clang__)
  85280. "adcs r4, r6\n\t"
  85281. #else
  85282. "adc r4, r6\n\t"
  85283. #endif
  85284. "stm %[r]!, {r3, r4}\n\t"
  85285. "ldm %[b]!, {r5, r6}\n\t"
  85286. "ldm %[a]!, {r3, r4}\n\t"
  85287. #ifdef WOLFSSL_KEIL
  85288. "adcs r3, r3, r5\n\t"
  85289. #elif defined(__clang__)
  85290. "adcs r3, r5\n\t"
  85291. #else
  85292. "adc r3, r5\n\t"
  85293. #endif
  85294. #ifdef WOLFSSL_KEIL
  85295. "adcs r4, r4, r6\n\t"
  85296. #elif defined(__clang__)
  85297. "adcs r4, r6\n\t"
  85298. #else
  85299. "adc r4, r6\n\t"
  85300. #endif
  85301. "stm %[r]!, {r3, r4}\n\t"
  85302. "ldm %[b]!, {r5, r6}\n\t"
  85303. "ldm %[a]!, {r3, r4}\n\t"
  85304. #ifdef WOLFSSL_KEIL
  85305. "adcs r3, r3, r5\n\t"
  85306. #elif defined(__clang__)
  85307. "adcs r3, r5\n\t"
  85308. #else
  85309. "adc r3, r5\n\t"
  85310. #endif
  85311. #ifdef WOLFSSL_KEIL
  85312. "adcs r4, r4, r6\n\t"
  85313. #elif defined(__clang__)
  85314. "adcs r4, r6\n\t"
  85315. #else
  85316. "adc r4, r6\n\t"
  85317. #endif
  85318. "stm %[r]!, {r3, r4}\n\t"
  85319. "ldm %[b]!, {r5, r6}\n\t"
  85320. "ldm %[a]!, {r3, r4}\n\t"
  85321. #ifdef WOLFSSL_KEIL
  85322. "adcs r3, r3, r5\n\t"
  85323. #elif defined(__clang__)
  85324. "adcs r3, r5\n\t"
  85325. #else
  85326. "adc r3, r5\n\t"
  85327. #endif
  85328. #ifdef WOLFSSL_KEIL
  85329. "adcs r4, r4, r6\n\t"
  85330. #elif defined(__clang__)
  85331. "adcs r4, r6\n\t"
  85332. #else
  85333. "adc r4, r6\n\t"
  85334. #endif
  85335. "stm %[r]!, {r3, r4}\n\t"
  85336. "ldm %[b]!, {r5, r6}\n\t"
  85337. "ldm %[a]!, {r3, r4}\n\t"
  85338. #ifdef WOLFSSL_KEIL
  85339. "adcs r3, r3, r5\n\t"
  85340. #elif defined(__clang__)
  85341. "adcs r3, r5\n\t"
  85342. #else
  85343. "adc r3, r5\n\t"
  85344. #endif
  85345. #ifdef WOLFSSL_KEIL
  85346. "adcs r4, r4, r6\n\t"
  85347. #elif defined(__clang__)
  85348. "adcs r4, r6\n\t"
  85349. #else
  85350. "adc r4, r6\n\t"
  85351. #endif
  85352. "stm %[r]!, {r3, r4}\n\t"
  85353. "ldm %[b]!, {r5, r6}\n\t"
  85354. "ldm %[a]!, {r3, r4}\n\t"
  85355. #ifdef WOLFSSL_KEIL
  85356. "adcs r3, r3, r5\n\t"
  85357. #elif defined(__clang__)
  85358. "adcs r3, r5\n\t"
  85359. #else
  85360. "adc r3, r5\n\t"
  85361. #endif
  85362. #ifdef WOLFSSL_KEIL
  85363. "adcs r4, r4, r6\n\t"
  85364. #elif defined(__clang__)
  85365. "adcs r4, r6\n\t"
  85366. #else
  85367. "adc r4, r6\n\t"
  85368. #endif
  85369. "stm %[r]!, {r3, r4}\n\t"
  85370. "ldm %[b]!, {r5, r6}\n\t"
  85371. "ldm %[a]!, {r3, r4}\n\t"
  85372. #ifdef WOLFSSL_KEIL
  85373. "adcs r3, r3, r5\n\t"
  85374. #elif defined(__clang__)
  85375. "adcs r3, r5\n\t"
  85376. #else
  85377. "adc r3, r5\n\t"
  85378. #endif
  85379. #ifdef WOLFSSL_KEIL
  85380. "adcs r4, r4, r6\n\t"
  85381. #elif defined(__clang__)
  85382. "adcs r4, r6\n\t"
  85383. #else
  85384. "adc r4, r6\n\t"
  85385. #endif
  85386. "stm %[r]!, {r3, r4}\n\t"
  85387. "ldm %[b]!, {r5, r6}\n\t"
  85388. "ldm %[a]!, {r3, r4}\n\t"
  85389. #ifdef WOLFSSL_KEIL
  85390. "adcs r3, r3, r5\n\t"
  85391. #elif defined(__clang__)
  85392. "adcs r3, r5\n\t"
  85393. #else
  85394. "adc r3, r5\n\t"
  85395. #endif
  85396. #ifdef WOLFSSL_KEIL
  85397. "adcs r4, r4, r6\n\t"
  85398. #elif defined(__clang__)
  85399. "adcs r4, r6\n\t"
  85400. #else
  85401. "adc r4, r6\n\t"
  85402. #endif
  85403. "stm %[r]!, {r3, r4}\n\t"
  85404. "ldm %[b]!, {r5, r6}\n\t"
  85405. "ldm %[a]!, {r3, r4}\n\t"
  85406. #ifdef WOLFSSL_KEIL
  85407. "adcs r3, r3, r5\n\t"
  85408. #elif defined(__clang__)
  85409. "adcs r3, r5\n\t"
  85410. #else
  85411. "adc r3, r5\n\t"
  85412. #endif
  85413. #ifdef WOLFSSL_KEIL
  85414. "adcs r4, r4, r6\n\t"
  85415. #elif defined(__clang__)
  85416. "adcs r4, r6\n\t"
  85417. #else
  85418. "adc r4, r6\n\t"
  85419. #endif
  85420. "stm %[r]!, {r3, r4}\n\t"
  85421. "ldm %[b]!, {r5, r6}\n\t"
  85422. "ldm %[a]!, {r3, r4}\n\t"
  85423. #ifdef WOLFSSL_KEIL
  85424. "adcs r3, r3, r5\n\t"
  85425. #elif defined(__clang__)
  85426. "adcs r3, r5\n\t"
  85427. #else
  85428. "adc r3, r5\n\t"
  85429. #endif
  85430. #ifdef WOLFSSL_KEIL
  85431. "adcs r4, r4, r6\n\t"
  85432. #elif defined(__clang__)
  85433. "adcs r4, r6\n\t"
  85434. #else
  85435. "adc r4, r6\n\t"
  85436. #endif
  85437. "stm %[r]!, {r3, r4}\n\t"
  85438. "ldm %[b]!, {r5, r6}\n\t"
  85439. "ldm %[a]!, {r3, r4}\n\t"
  85440. #ifdef WOLFSSL_KEIL
  85441. "adcs r3, r3, r5\n\t"
  85442. #elif defined(__clang__)
  85443. "adcs r3, r5\n\t"
  85444. #else
  85445. "adc r3, r5\n\t"
  85446. #endif
  85447. #ifdef WOLFSSL_KEIL
  85448. "adcs r4, r4, r6\n\t"
  85449. #elif defined(__clang__)
  85450. "adcs r4, r6\n\t"
  85451. #else
  85452. "adc r4, r6\n\t"
  85453. #endif
  85454. "stm %[r]!, {r3, r4}\n\t"
  85455. "ldm %[b]!, {r5, r6}\n\t"
  85456. "ldm %[a]!, {r3, r4}\n\t"
  85457. #ifdef WOLFSSL_KEIL
  85458. "adcs r3, r3, r5\n\t"
  85459. #elif defined(__clang__)
  85460. "adcs r3, r5\n\t"
  85461. #else
  85462. "adc r3, r5\n\t"
  85463. #endif
  85464. #ifdef WOLFSSL_KEIL
  85465. "adcs r4, r4, r6\n\t"
  85466. #elif defined(__clang__)
  85467. "adcs r4, r6\n\t"
  85468. #else
  85469. "adc r4, r6\n\t"
  85470. #endif
  85471. "stm %[r]!, {r3, r4}\n\t"
  85472. "ldm %[b]!, {r5, r6}\n\t"
  85473. "ldm %[a]!, {r3, r4}\n\t"
  85474. #ifdef WOLFSSL_KEIL
  85475. "adcs r3, r3, r5\n\t"
  85476. #elif defined(__clang__)
  85477. "adcs r3, r5\n\t"
  85478. #else
  85479. "adc r3, r5\n\t"
  85480. #endif
  85481. #ifdef WOLFSSL_KEIL
  85482. "adcs r4, r4, r6\n\t"
  85483. #elif defined(__clang__)
  85484. "adcs r4, r6\n\t"
  85485. #else
  85486. "adc r4, r6\n\t"
  85487. #endif
  85488. "stm %[r]!, {r3, r4}\n\t"
  85489. "ldm %[b]!, {r5, r6}\n\t"
  85490. "ldm %[a]!, {r3, r4}\n\t"
  85491. #ifdef WOLFSSL_KEIL
  85492. "adcs r3, r3, r5\n\t"
  85493. #elif defined(__clang__)
  85494. "adcs r3, r5\n\t"
  85495. #else
  85496. "adc r3, r5\n\t"
  85497. #endif
  85498. #ifdef WOLFSSL_KEIL
  85499. "adcs r4, r4, r6\n\t"
  85500. #elif defined(__clang__)
  85501. "adcs r4, r6\n\t"
  85502. #else
  85503. "adc r4, r6\n\t"
  85504. #endif
  85505. "stm %[r]!, {r3, r4}\n\t"
  85506. "ldm %[b]!, {r5, r6}\n\t"
  85507. "ldm %[a]!, {r3, r4}\n\t"
  85508. #ifdef WOLFSSL_KEIL
  85509. "adcs r3, r3, r5\n\t"
  85510. #elif defined(__clang__)
  85511. "adcs r3, r5\n\t"
  85512. #else
  85513. "adc r3, r5\n\t"
  85514. #endif
  85515. #ifdef WOLFSSL_KEIL
  85516. "adcs r4, r4, r6\n\t"
  85517. #elif defined(__clang__)
  85518. "adcs r4, r6\n\t"
  85519. #else
  85520. "adc r4, r6\n\t"
  85521. #endif
  85522. "stm %[r]!, {r3, r4}\n\t"
  85523. "ldm %[b]!, {r5, r6}\n\t"
  85524. "ldm %[a]!, {r3, r4}\n\t"
  85525. #ifdef WOLFSSL_KEIL
  85526. "adcs r3, r3, r5\n\t"
  85527. #elif defined(__clang__)
  85528. "adcs r3, r5\n\t"
  85529. #else
  85530. "adc r3, r5\n\t"
  85531. #endif
  85532. #ifdef WOLFSSL_KEIL
  85533. "adcs r4, r4, r6\n\t"
  85534. #elif defined(__clang__)
  85535. "adcs r4, r6\n\t"
  85536. #else
  85537. "adc r4, r6\n\t"
  85538. #endif
  85539. "stm %[r]!, {r3, r4}\n\t"
  85540. "ldm %[b]!, {r5, r6}\n\t"
  85541. "ldm %[a]!, {r3, r4}\n\t"
  85542. #ifdef WOLFSSL_KEIL
  85543. "adcs r3, r3, r5\n\t"
  85544. #elif defined(__clang__)
  85545. "adcs r3, r5\n\t"
  85546. #else
  85547. "adc r3, r5\n\t"
  85548. #endif
  85549. #ifdef WOLFSSL_KEIL
  85550. "adcs r4, r4, r6\n\t"
  85551. #elif defined(__clang__)
  85552. "adcs r4, r6\n\t"
  85553. #else
  85554. "adc r4, r6\n\t"
  85555. #endif
  85556. "stm %[r]!, {r3, r4}\n\t"
  85557. "ldm %[b]!, {r5, r6}\n\t"
  85558. "ldm %[a]!, {r3, r4}\n\t"
  85559. #ifdef WOLFSSL_KEIL
  85560. "adcs r3, r3, r5\n\t"
  85561. #elif defined(__clang__)
  85562. "adcs r3, r5\n\t"
  85563. #else
  85564. "adc r3, r5\n\t"
  85565. #endif
  85566. #ifdef WOLFSSL_KEIL
  85567. "adcs r4, r4, r6\n\t"
  85568. #elif defined(__clang__)
  85569. "adcs r4, r6\n\t"
  85570. #else
  85571. "adc r4, r6\n\t"
  85572. #endif
  85573. "stm %[r]!, {r3, r4}\n\t"
  85574. "ldm %[b]!, {r5, r6}\n\t"
  85575. "ldm %[a]!, {r3, r4}\n\t"
  85576. #ifdef WOLFSSL_KEIL
  85577. "adcs r3, r3, r5\n\t"
  85578. #elif defined(__clang__)
  85579. "adcs r3, r5\n\t"
  85580. #else
  85581. "adc r3, r5\n\t"
  85582. #endif
  85583. #ifdef WOLFSSL_KEIL
  85584. "adcs r4, r4, r6\n\t"
  85585. #elif defined(__clang__)
  85586. "adcs r4, r6\n\t"
  85587. #else
  85588. "adc r4, r6\n\t"
  85589. #endif
  85590. "stm %[r]!, {r3, r4}\n\t"
  85591. "ldm %[b]!, {r5, r6}\n\t"
  85592. "ldm %[a]!, {r3, r4}\n\t"
  85593. #ifdef WOLFSSL_KEIL
  85594. "adcs r3, r3, r5\n\t"
  85595. #elif defined(__clang__)
  85596. "adcs r3, r5\n\t"
  85597. #else
  85598. "adc r3, r5\n\t"
  85599. #endif
  85600. #ifdef WOLFSSL_KEIL
  85601. "adcs r4, r4, r6\n\t"
  85602. #elif defined(__clang__)
  85603. "adcs r4, r6\n\t"
  85604. #else
  85605. "adc r4, r6\n\t"
  85606. #endif
  85607. "stm %[r]!, {r3, r4}\n\t"
  85608. "ldm %[b]!, {r5, r6}\n\t"
  85609. "ldm %[a]!, {r3, r4}\n\t"
  85610. #ifdef WOLFSSL_KEIL
  85611. "adcs r3, r3, r5\n\t"
  85612. #elif defined(__clang__)
  85613. "adcs r3, r5\n\t"
  85614. #else
  85615. "adc r3, r5\n\t"
  85616. #endif
  85617. #ifdef WOLFSSL_KEIL
  85618. "adcs r4, r4, r6\n\t"
  85619. #elif defined(__clang__)
  85620. "adcs r4, r6\n\t"
  85621. #else
  85622. "adc r4, r6\n\t"
  85623. #endif
  85624. "stm %[r]!, {r3, r4}\n\t"
  85625. "ldm %[b]!, {r5, r6}\n\t"
  85626. "ldm %[a]!, {r3, r4}\n\t"
  85627. #ifdef WOLFSSL_KEIL
  85628. "adcs r3, r3, r5\n\t"
  85629. #elif defined(__clang__)
  85630. "adcs r3, r5\n\t"
  85631. #else
  85632. "adc r3, r5\n\t"
  85633. #endif
  85634. #ifdef WOLFSSL_KEIL
  85635. "adcs r4, r4, r6\n\t"
  85636. #elif defined(__clang__)
  85637. "adcs r4, r6\n\t"
  85638. #else
  85639. "adc r4, r6\n\t"
  85640. #endif
  85641. "stm %[r]!, {r3, r4}\n\t"
  85642. "ldm %[b]!, {r5, r6}\n\t"
  85643. "ldm %[a]!, {r3, r4}\n\t"
  85644. #ifdef WOLFSSL_KEIL
  85645. "adcs r3, r3, r5\n\t"
  85646. #elif defined(__clang__)
  85647. "adcs r3, r5\n\t"
  85648. #else
  85649. "adc r3, r5\n\t"
  85650. #endif
  85651. #ifdef WOLFSSL_KEIL
  85652. "adcs r4, r4, r6\n\t"
  85653. #elif defined(__clang__)
  85654. "adcs r4, r6\n\t"
  85655. #else
  85656. "adc r4, r6\n\t"
  85657. #endif
  85658. "stm %[r]!, {r3, r4}\n\t"
  85659. "ldm %[b]!, {r5, r6}\n\t"
  85660. "ldm %[a]!, {r3, r4}\n\t"
  85661. #ifdef WOLFSSL_KEIL
  85662. "adcs r3, r3, r5\n\t"
  85663. #elif defined(__clang__)
  85664. "adcs r3, r5\n\t"
  85665. #else
  85666. "adc r3, r5\n\t"
  85667. #endif
  85668. #ifdef WOLFSSL_KEIL
  85669. "adcs r4, r4, r6\n\t"
  85670. #elif defined(__clang__)
  85671. "adcs r4, r6\n\t"
  85672. #else
  85673. "adc r4, r6\n\t"
  85674. #endif
  85675. "stm %[r]!, {r3, r4}\n\t"
  85676. "ldm %[b]!, {r5, r6}\n\t"
  85677. "ldm %[a]!, {r3, r4}\n\t"
  85678. #ifdef WOLFSSL_KEIL
  85679. "adcs r3, r3, r5\n\t"
  85680. #elif defined(__clang__)
  85681. "adcs r3, r5\n\t"
  85682. #else
  85683. "adc r3, r5\n\t"
  85684. #endif
  85685. #ifdef WOLFSSL_KEIL
  85686. "adcs r4, r4, r6\n\t"
  85687. #elif defined(__clang__)
  85688. "adcs r4, r6\n\t"
  85689. #else
  85690. "adc r4, r6\n\t"
  85691. #endif
  85692. "stm %[r]!, {r3, r4}\n\t"
  85693. "ldm %[b]!, {r5, r6}\n\t"
  85694. "ldm %[a]!, {r3, r4}\n\t"
  85695. #ifdef WOLFSSL_KEIL
  85696. "adcs r3, r3, r5\n\t"
  85697. #elif defined(__clang__)
  85698. "adcs r3, r5\n\t"
  85699. #else
  85700. "adc r3, r5\n\t"
  85701. #endif
  85702. #ifdef WOLFSSL_KEIL
  85703. "adcs r4, r4, r6\n\t"
  85704. #elif defined(__clang__)
  85705. "adcs r4, r6\n\t"
  85706. #else
  85707. "adc r4, r6\n\t"
  85708. #endif
  85709. "stm %[r]!, {r3, r4}\n\t"
  85710. "ldm %[b]!, {r5, r6}\n\t"
  85711. "ldm %[a]!, {r3, r4}\n\t"
  85712. #ifdef WOLFSSL_KEIL
  85713. "adcs r3, r3, r5\n\t"
  85714. #elif defined(__clang__)
  85715. "adcs r3, r5\n\t"
  85716. #else
  85717. "adc r3, r5\n\t"
  85718. #endif
  85719. #ifdef WOLFSSL_KEIL
  85720. "adcs r4, r4, r6\n\t"
  85721. #elif defined(__clang__)
  85722. "adcs r4, r6\n\t"
  85723. #else
  85724. "adc r4, r6\n\t"
  85725. #endif
  85726. "stm %[r]!, {r3, r4}\n\t"
  85727. "ldm %[b]!, {r5, r6}\n\t"
  85728. "ldm %[a]!, {r3, r4}\n\t"
  85729. #ifdef WOLFSSL_KEIL
  85730. "adcs r3, r3, r5\n\t"
  85731. #elif defined(__clang__)
  85732. "adcs r3, r5\n\t"
  85733. #else
  85734. "adc r3, r5\n\t"
  85735. #endif
  85736. #ifdef WOLFSSL_KEIL
  85737. "adcs r4, r4, r6\n\t"
  85738. #elif defined(__clang__)
  85739. "adcs r4, r6\n\t"
  85740. #else
  85741. "adc r4, r6\n\t"
  85742. #endif
  85743. "stm %[r]!, {r3, r4}\n\t"
  85744. "ldm %[b]!, {r5, r6}\n\t"
  85745. "ldm %[a]!, {r3, r4}\n\t"
  85746. #ifdef WOLFSSL_KEIL
  85747. "adcs r3, r3, r5\n\t"
  85748. #elif defined(__clang__)
  85749. "adcs r3, r5\n\t"
  85750. #else
  85751. "adc r3, r5\n\t"
  85752. #endif
  85753. #ifdef WOLFSSL_KEIL
  85754. "adcs r4, r4, r6\n\t"
  85755. #elif defined(__clang__)
  85756. "adcs r4, r6\n\t"
  85757. #else
  85758. "adc r4, r6\n\t"
  85759. #endif
  85760. "stm %[r]!, {r3, r4}\n\t"
  85761. "movs %[r], #0\n\t"
  85762. #ifdef WOLFSSL_KEIL
  85763. "adcs %[r], %[r], %[r]\n\t"
  85764. #elif defined(__clang__)
  85765. "adcs %[r], %[r]\n\t"
  85766. #else
  85767. "adc %[r], %[r]\n\t"
  85768. #endif
  85769. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  85770. :
  85771. : "memory", "r3", "r4", "r5", "r6"
  85772. );
  85773. return (uint32_t)(size_t)r;
  85774. }
  85775. /* Multiply a and b into r. (r = a * b)
  85776. *
  85777. * r A single precision integer.
  85778. * a A single precision integer.
  85779. * b A single precision integer.
  85780. */
  85781. SP_NOINLINE static void sp_4096_mul_128(sp_digit* r, const sp_digit* a,
  85782. const sp_digit* b)
  85783. {
  85784. sp_digit* z0 = r;
  85785. sp_digit z1[128];
  85786. sp_digit a1[64];
  85787. sp_digit b1[64];
  85788. sp_digit* z2 = r + 128;
  85789. sp_digit u;
  85790. sp_digit ca;
  85791. sp_digit cb;
  85792. ca = sp_2048_add_64(a1, a, &a[64]);
  85793. cb = sp_2048_add_64(b1, b, &b[64]);
  85794. u = ca & cb;
  85795. sp_2048_mul_64(z2, &a[64], &b[64]);
  85796. sp_2048_mul_64(z0, a, b);
  85797. sp_2048_mul_64(z1, a1, b1);
  85798. u += sp_4096_sub_in_place_128(z1, z0);
  85799. u += sp_4096_sub_in_place_128(z1, z2);
  85800. sp_2048_mask_64(a1, a1, 0 - cb);
  85801. u += sp_2048_add_64(z1 + 64, z1 + 64, a1);
  85802. sp_2048_mask_64(b1, b1, 0 - ca);
  85803. u += sp_2048_add_64(z1 + 64, z1 + 64, b1);
  85804. u += sp_4096_add_128(r + 64, r + 64, z1);
  85805. (void)sp_4096_add_word_64(r + 192, r + 192, u);
  85806. }
  85807. /* Square a and put result in r. (r = a * a)
  85808. *
  85809. * r A single precision integer.
  85810. * a A single precision integer.
  85811. */
  85812. SP_NOINLINE static void sp_4096_sqr_128(sp_digit* r, const sp_digit* a)
  85813. {
  85814. sp_digit* z0 = r;
  85815. sp_digit* z2 = r + 128;
  85816. sp_digit z1[128];
  85817. sp_digit* a1 = z1;
  85818. sp_digit* zero = z1 + 64;
  85819. sp_digit u;
  85820. sp_digit mask;
  85821. sp_digit* p1;
  85822. sp_digit* p2;
  85823. XMEMSET(zero, 0, sizeof(sp_digit) * 64);
  85824. mask = sp_2048_sub_64(a1, a, &a[64]);
  85825. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  85826. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  85827. (void)sp_2048_sub_64(a1, p1, p2);
  85828. sp_2048_sqr_64(z2, &a[64]);
  85829. sp_2048_sqr_64(z0, a);
  85830. sp_2048_sqr_64(z1, a1);
  85831. u = 0;
  85832. u -= sp_4096_sub_in_place_128(z1, z2);
  85833. u -= sp_4096_sub_in_place_128(z1, z0);
  85834. u += sp_4096_sub_in_place_128(r + 64, z1);
  85835. sp_4096_add_word_64(r + 192, r + 192, u);
  85836. }
  85837. #endif /* !WOLFSSL_SP_SMALL */
  85838. #ifdef WOLFSSL_SP_SMALL
  85839. /* Add b to a into r. (r = a + b)
  85840. *
  85841. * r A single precision integer.
  85842. * a A single precision integer.
  85843. * b A single precision integer.
  85844. */
  85845. SP_NOINLINE static sp_digit sp_4096_add_128(sp_digit* r, const sp_digit* a,
  85846. const sp_digit* b)
  85847. {
  85848. __asm__ __volatile__ (
  85849. "movs r6, %[a]\n\t"
  85850. "movs r7, #0\n\t"
  85851. "movs r3, #0\n\t"
  85852. "movs r4, #2\n\t"
  85853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85854. "lsls r4, r4, #8\n\t"
  85855. #else
  85856. "lsl r4, r4, #8\n\t"
  85857. #endif
  85858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85859. "subs r7, r7, #1\n\t"
  85860. #else
  85861. "sub r7, r7, #1\n\t"
  85862. #endif
  85863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85864. "adds r6, r6, r4\n\t"
  85865. #else
  85866. "add r6, r6, r4\n\t"
  85867. #endif
  85868. "\n"
  85869. "L_sp_4096_add_128_word_%=:\n\t"
  85870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85871. "adds r3, r3, r7\n\t"
  85872. #else
  85873. "add r3, r3, r7\n\t"
  85874. #endif
  85875. "ldr r4, [%[a]]\n\t"
  85876. "ldr r5, [%[b]]\n\t"
  85877. #ifdef WOLFSSL_KEIL
  85878. "adcs r4, r4, r5\n\t"
  85879. #elif defined(__clang__)
  85880. "adcs r4, r5\n\t"
  85881. #else
  85882. "adc r4, r5\n\t"
  85883. #endif
  85884. "str r4, [%[r]]\n\t"
  85885. "movs r3, #0\n\t"
  85886. #ifdef WOLFSSL_KEIL
  85887. "adcs r3, r3, r3\n\t"
  85888. #elif defined(__clang__)
  85889. "adcs r3, r3\n\t"
  85890. #else
  85891. "adc r3, r3\n\t"
  85892. #endif
  85893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85894. "adds %[a], %[a], #4\n\t"
  85895. #else
  85896. "add %[a], %[a], #4\n\t"
  85897. #endif
  85898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85899. "adds %[b], %[b], #4\n\t"
  85900. #else
  85901. "add %[b], %[b], #4\n\t"
  85902. #endif
  85903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85904. "adds %[r], %[r], #4\n\t"
  85905. #else
  85906. "add %[r], %[r], #4\n\t"
  85907. #endif
  85908. "cmp %[a], r6\n\t"
  85909. "bne L_sp_4096_add_128_word_%=\n\t"
  85910. "movs %[r], r3\n\t"
  85911. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  85912. :
  85913. : "memory", "r3", "r4", "r5", "r6", "r7"
  85914. );
  85915. return (uint32_t)(size_t)r;
  85916. }
  85917. #endif /* WOLFSSL_SP_SMALL */
  85918. #ifdef WOLFSSL_SP_SMALL
  85919. /* Sub b from a into a. (a -= b)
  85920. *
  85921. * a A single precision integer.
  85922. * b A single precision integer.
  85923. */
  85924. SP_NOINLINE static sp_digit sp_4096_sub_in_place_128(sp_digit* a,
  85925. const sp_digit* b)
  85926. {
  85927. __asm__ __volatile__ (
  85928. "movs r7, %[a]\n\t"
  85929. "movs r2, #0\n\t"
  85930. "movs r5, #2\n\t"
  85931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85932. "lsls r5, r5, #8\n\t"
  85933. #else
  85934. "lsl r5, r5, #8\n\t"
  85935. #endif
  85936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85937. "adds r7, r7, r5\n\t"
  85938. #else
  85939. "add r7, r7, r5\n\t"
  85940. #endif
  85941. "\n"
  85942. "L_sp_4096_sub_in_place_128_words_%=:\n\t"
  85943. "movs r5, #0\n\t"
  85944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85945. "subs r5, r5, r2\n\t"
  85946. #else
  85947. "sub r5, r5, r2\n\t"
  85948. #endif
  85949. "ldr r3, [%[a]]\n\t"
  85950. "ldr r4, [%[a], #4]\n\t"
  85951. "ldr r5, [%[b]]\n\t"
  85952. "ldr r6, [%[b], #4]\n\t"
  85953. #ifdef WOLFSSL_KEIL
  85954. "sbcs r3, r3, r5\n\t"
  85955. #elif defined(__clang__)
  85956. "sbcs r3, r5\n\t"
  85957. #else
  85958. "sbc r3, r5\n\t"
  85959. #endif
  85960. #ifdef WOLFSSL_KEIL
  85961. "sbcs r4, r4, r6\n\t"
  85962. #elif defined(__clang__)
  85963. "sbcs r4, r6\n\t"
  85964. #else
  85965. "sbc r4, r6\n\t"
  85966. #endif
  85967. "str r3, [%[a]]\n\t"
  85968. "str r4, [%[a], #4]\n\t"
  85969. #ifdef WOLFSSL_KEIL
  85970. "sbcs r2, r2, r2\n\t"
  85971. #elif defined(__clang__)
  85972. "sbcs r2, r2\n\t"
  85973. #else
  85974. "sbc r2, r2\n\t"
  85975. #endif
  85976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85977. "adds %[a], %[a], #8\n\t"
  85978. #else
  85979. "add %[a], %[a], #8\n\t"
  85980. #endif
  85981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85982. "adds %[b], %[b], #8\n\t"
  85983. #else
  85984. "add %[b], %[b], #8\n\t"
  85985. #endif
  85986. "cmp %[a], r7\n\t"
  85987. "bne L_sp_4096_sub_in_place_128_words_%=\n\t"
  85988. "movs %[a], r2\n\t"
  85989. : [a] "+l" (a), [b] "+l" (b)
  85990. :
  85991. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  85992. );
  85993. return (uint32_t)(size_t)a;
  85994. }
  85995. #endif /* WOLFSSL_SP_SMALL */
  85996. #ifdef WOLFSSL_SP_SMALL
  85997. /* Multiply a and b into r. (r = a * b)
  85998. *
  85999. * r A single precision integer.
  86000. * a A single precision integer.
  86001. * b A single precision integer.
  86002. */
  86003. SP_NOINLINE static void sp_4096_mul_128(sp_digit* r, const sp_digit* a,
  86004. const sp_digit* b)
  86005. {
  86006. sp_digit t[128 * 2];
  86007. sp_digit* tmp = t;
  86008. __asm__ __volatile__ (
  86009. "movs r3, #0\n\t"
  86010. "movs r4, #0\n\t"
  86011. "mov r8, r3\n\t"
  86012. "mov r11, %[tmp]\n\t"
  86013. "mov r9, %[a]\n\t"
  86014. "mov r10, %[b]\n\t"
  86015. "movs r6, #2\n\t"
  86016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86017. "lsls r6, r6, #8\n\t"
  86018. #else
  86019. "lsl r6, r6, #8\n\t"
  86020. #endif
  86021. "add r6, r6, r9\n\t"
  86022. "mov r12, r6\n\t"
  86023. "\n"
  86024. "L_sp_4096_mul_128_words_%=:\n\t"
  86025. "movs %[tmp], #0\n\t"
  86026. "movs r5, #0\n\t"
  86027. "movs r6, #0xff\n\t"
  86028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86029. "adds r6, r6, #0xfd\n\t"
  86030. #else
  86031. "add r6, r6, #0xfd\n\t"
  86032. #endif
  86033. "mov %[a], r8\n\t"
  86034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86035. "subs %[a], %[a], r6\n\t"
  86036. #else
  86037. "sub %[a], %[a], r6\n\t"
  86038. #endif
  86039. #ifdef WOLFSSL_KEIL
  86040. "sbcs r6, r6, r6\n\t"
  86041. #elif defined(__clang__)
  86042. "sbcs r6, r6\n\t"
  86043. #else
  86044. "sbc r6, r6\n\t"
  86045. #endif
  86046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86047. "mvns r6, r6\n\t"
  86048. #else
  86049. "mvn r6, r6\n\t"
  86050. #endif
  86051. #ifdef WOLFSSL_KEIL
  86052. "ands %[a], %[a], r6\n\t"
  86053. #elif defined(__clang__)
  86054. "ands %[a], r6\n\t"
  86055. #else
  86056. "and %[a], r6\n\t"
  86057. #endif
  86058. "mov %[b], r8\n\t"
  86059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86060. "subs %[b], %[b], %[a]\n\t"
  86061. #else
  86062. "sub %[b], %[b], %[a]\n\t"
  86063. #endif
  86064. "add %[a], %[a], r9\n\t"
  86065. "add %[b], %[b], r10\n\t"
  86066. "\n"
  86067. "L_sp_4096_mul_128_mul_%=:\n\t"
  86068. "# Multiply Start\n\t"
  86069. "ldrh r6, [%[a]]\n\t"
  86070. "ldrh r7, [%[b]]\n\t"
  86071. #ifdef WOLFSSL_KEIL
  86072. "muls r7, r6, r7\n\t"
  86073. #elif defined(__clang__)
  86074. "muls r7, r6\n\t"
  86075. #else
  86076. "mul r7, r6\n\t"
  86077. #endif
  86078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86079. "adds r3, r3, r7\n\t"
  86080. #else
  86081. "add r3, r3, r7\n\t"
  86082. #endif
  86083. #ifdef WOLFSSL_KEIL
  86084. "adcs r4, r4, %[tmp]\n\t"
  86085. #elif defined(__clang__)
  86086. "adcs r4, %[tmp]\n\t"
  86087. #else
  86088. "adc r4, %[tmp]\n\t"
  86089. #endif
  86090. #ifdef WOLFSSL_KEIL
  86091. "adcs r5, r5, %[tmp]\n\t"
  86092. #elif defined(__clang__)
  86093. "adcs r5, %[tmp]\n\t"
  86094. #else
  86095. "adc r5, %[tmp]\n\t"
  86096. #endif
  86097. "ldr r7, [%[b]]\n\t"
  86098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86099. "lsrs r7, r7, #16\n\t"
  86100. #else
  86101. "lsr r7, r7, #16\n\t"
  86102. #endif
  86103. #ifdef WOLFSSL_KEIL
  86104. "muls r6, r7, r6\n\t"
  86105. #elif defined(__clang__)
  86106. "muls r6, r7\n\t"
  86107. #else
  86108. "mul r6, r7\n\t"
  86109. #endif
  86110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86111. "lsrs r7, r6, #16\n\t"
  86112. #else
  86113. "lsr r7, r6, #16\n\t"
  86114. #endif
  86115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86116. "lsls r6, r6, #16\n\t"
  86117. #else
  86118. "lsl r6, r6, #16\n\t"
  86119. #endif
  86120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86121. "adds r3, r3, r6\n\t"
  86122. #else
  86123. "add r3, r3, r6\n\t"
  86124. #endif
  86125. #ifdef WOLFSSL_KEIL
  86126. "adcs r4, r4, r7\n\t"
  86127. #elif defined(__clang__)
  86128. "adcs r4, r7\n\t"
  86129. #else
  86130. "adc r4, r7\n\t"
  86131. #endif
  86132. #ifdef WOLFSSL_KEIL
  86133. "adcs r5, r5, %[tmp]\n\t"
  86134. #elif defined(__clang__)
  86135. "adcs r5, %[tmp]\n\t"
  86136. #else
  86137. "adc r5, %[tmp]\n\t"
  86138. #endif
  86139. "ldr r6, [%[a]]\n\t"
  86140. "ldr r7, [%[b]]\n\t"
  86141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86142. "lsrs r6, r6, #16\n\t"
  86143. #else
  86144. "lsr r6, r6, #16\n\t"
  86145. #endif
  86146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86147. "lsrs r7, r7, #16\n\t"
  86148. #else
  86149. "lsr r7, r7, #16\n\t"
  86150. #endif
  86151. #ifdef WOLFSSL_KEIL
  86152. "muls r7, r6, r7\n\t"
  86153. #elif defined(__clang__)
  86154. "muls r7, r6\n\t"
  86155. #else
  86156. "mul r7, r6\n\t"
  86157. #endif
  86158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86159. "adds r4, r4, r7\n\t"
  86160. #else
  86161. "add r4, r4, r7\n\t"
  86162. #endif
  86163. #ifdef WOLFSSL_KEIL
  86164. "adcs r5, r5, %[tmp]\n\t"
  86165. #elif defined(__clang__)
  86166. "adcs r5, %[tmp]\n\t"
  86167. #else
  86168. "adc r5, %[tmp]\n\t"
  86169. #endif
  86170. "ldrh r7, [%[b]]\n\t"
  86171. #ifdef WOLFSSL_KEIL
  86172. "muls r6, r7, r6\n\t"
  86173. #elif defined(__clang__)
  86174. "muls r6, r7\n\t"
  86175. #else
  86176. "mul r6, r7\n\t"
  86177. #endif
  86178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86179. "lsrs r7, r6, #16\n\t"
  86180. #else
  86181. "lsr r7, r6, #16\n\t"
  86182. #endif
  86183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86184. "lsls r6, r6, #16\n\t"
  86185. #else
  86186. "lsl r6, r6, #16\n\t"
  86187. #endif
  86188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86189. "adds r3, r3, r6\n\t"
  86190. #else
  86191. "add r3, r3, r6\n\t"
  86192. #endif
  86193. #ifdef WOLFSSL_KEIL
  86194. "adcs r4, r4, r7\n\t"
  86195. #elif defined(__clang__)
  86196. "adcs r4, r7\n\t"
  86197. #else
  86198. "adc r4, r7\n\t"
  86199. #endif
  86200. #ifdef WOLFSSL_KEIL
  86201. "adcs r5, r5, %[tmp]\n\t"
  86202. #elif defined(__clang__)
  86203. "adcs r5, %[tmp]\n\t"
  86204. #else
  86205. "adc r5, %[tmp]\n\t"
  86206. #endif
  86207. "# Multiply Done\n\t"
  86208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86209. "adds %[a], %[a], #4\n\t"
  86210. #else
  86211. "add %[a], %[a], #4\n\t"
  86212. #endif
  86213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86214. "subs %[b], %[b], #4\n\t"
  86215. #else
  86216. "sub %[b], %[b], #4\n\t"
  86217. #endif
  86218. "cmp %[a], r12\n\t"
  86219. "beq L_sp_4096_mul_128_done_mul_%=\n\t"
  86220. "mov r6, r8\n\t"
  86221. "add r6, r6, r9\n\t"
  86222. "cmp %[a], r6\n\t"
  86223. "ble L_sp_4096_mul_128_mul_%=\n\t"
  86224. "\n"
  86225. "L_sp_4096_mul_128_done_mul_%=:\n\t"
  86226. "mov %[tmp], r11\n\t"
  86227. "mov r7, r8\n\t"
  86228. "str r3, [%[tmp], r7]\n\t"
  86229. "movs r3, r4\n\t"
  86230. "movs r4, r5\n\t"
  86231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86232. "adds r7, r7, #4\n\t"
  86233. #else
  86234. "add r7, r7, #4\n\t"
  86235. #endif
  86236. "mov r8, r7\n\t"
  86237. "movs r6, #3\n\t"
  86238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86239. "lsls r6, r6, #8\n\t"
  86240. #else
  86241. "lsl r6, r6, #8\n\t"
  86242. #endif
  86243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86244. "adds r6, r6, #0xf8\n\t"
  86245. #else
  86246. "add r6, r6, #0xf8\n\t"
  86247. #endif
  86248. "cmp r7, r6\n\t"
  86249. "ble L_sp_4096_mul_128_words_%=\n\t"
  86250. "str r3, [%[tmp], r7]\n\t"
  86251. "mov %[a], r9\n\t"
  86252. "mov %[b], r10\n\t"
  86253. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  86254. :
  86255. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  86256. );
  86257. XMEMCPY(r, t, sizeof(t));
  86258. }
  86259. /* Square a and put result in r. (r = a * a)
  86260. *
  86261. * r A single precision integer.
  86262. * a A single precision integer.
  86263. */
  86264. SP_NOINLINE static void sp_4096_sqr_128(sp_digit* r, const sp_digit* a)
  86265. {
  86266. __asm__ __volatile__ (
  86267. "movs r3, #0\n\t"
  86268. "movs r4, #0\n\t"
  86269. "movs r5, #0\n\t"
  86270. "mov r8, r3\n\t"
  86271. "mov r11, %[r]\n\t"
  86272. "movs r6, #4\n\t"
  86273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86274. "lsls r6, r6, #8\n\t"
  86275. #else
  86276. "lsl r6, r6, #8\n\t"
  86277. #endif
  86278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86279. "negs r6, r6\n\t"
  86280. #else
  86281. "neg r6, r6\n\t"
  86282. #endif
  86283. "add sp, sp, r6\n\t"
  86284. "mov r10, sp\n\t"
  86285. "mov r9, %[a]\n\t"
  86286. "\n"
  86287. "L_sp_4096_sqr_128_words_%=:\n\t"
  86288. "movs %[r], #0\n\t"
  86289. "movs r6, #0xff\n\t"
  86290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86291. "adds r6, r6, #0xfd\n\t"
  86292. #else
  86293. "add r6, r6, #0xfd\n\t"
  86294. #endif
  86295. "mov %[a], r8\n\t"
  86296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86297. "subs %[a], %[a], r6\n\t"
  86298. #else
  86299. "sub %[a], %[a], r6\n\t"
  86300. #endif
  86301. #ifdef WOLFSSL_KEIL
  86302. "sbcs r6, r6, r6\n\t"
  86303. #elif defined(__clang__)
  86304. "sbcs r6, r6\n\t"
  86305. #else
  86306. "sbc r6, r6\n\t"
  86307. #endif
  86308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86309. "mvns r6, r6\n\t"
  86310. #else
  86311. "mvn r6, r6\n\t"
  86312. #endif
  86313. #ifdef WOLFSSL_KEIL
  86314. "ands %[a], %[a], r6\n\t"
  86315. #elif defined(__clang__)
  86316. "ands %[a], r6\n\t"
  86317. #else
  86318. "and %[a], r6\n\t"
  86319. #endif
  86320. "mov r2, r8\n\t"
  86321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86322. "subs r2, r2, %[a]\n\t"
  86323. #else
  86324. "sub r2, r2, %[a]\n\t"
  86325. #endif
  86326. "add %[a], %[a], r9\n\t"
  86327. "add r2, r2, r9\n\t"
  86328. "\n"
  86329. "L_sp_4096_sqr_128_mul_%=:\n\t"
  86330. "cmp r2, %[a]\n\t"
  86331. "beq L_sp_4096_sqr_128_sqr_%=\n\t"
  86332. "# Multiply * 2: Start\n\t"
  86333. "ldrh r6, [%[a]]\n\t"
  86334. "ldrh r7, [r2]\n\t"
  86335. #ifdef WOLFSSL_KEIL
  86336. "muls r7, r6, r7\n\t"
  86337. #elif defined(__clang__)
  86338. "muls r7, r6\n\t"
  86339. #else
  86340. "mul r7, r6\n\t"
  86341. #endif
  86342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86343. "adds r3, r3, r7\n\t"
  86344. #else
  86345. "add r3, r3, r7\n\t"
  86346. #endif
  86347. #ifdef WOLFSSL_KEIL
  86348. "adcs r4, r4, %[r]\n\t"
  86349. #elif defined(__clang__)
  86350. "adcs r4, %[r]\n\t"
  86351. #else
  86352. "adc r4, %[r]\n\t"
  86353. #endif
  86354. #ifdef WOLFSSL_KEIL
  86355. "adcs r5, r5, %[r]\n\t"
  86356. #elif defined(__clang__)
  86357. "adcs r5, %[r]\n\t"
  86358. #else
  86359. "adc r5, %[r]\n\t"
  86360. #endif
  86361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86362. "adds r3, r3, r7\n\t"
  86363. #else
  86364. "add r3, r3, r7\n\t"
  86365. #endif
  86366. #ifdef WOLFSSL_KEIL
  86367. "adcs r4, r4, %[r]\n\t"
  86368. #elif defined(__clang__)
  86369. "adcs r4, %[r]\n\t"
  86370. #else
  86371. "adc r4, %[r]\n\t"
  86372. #endif
  86373. #ifdef WOLFSSL_KEIL
  86374. "adcs r5, r5, %[r]\n\t"
  86375. #elif defined(__clang__)
  86376. "adcs r5, %[r]\n\t"
  86377. #else
  86378. "adc r5, %[r]\n\t"
  86379. #endif
  86380. "ldr r7, [r2]\n\t"
  86381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86382. "lsrs r7, r7, #16\n\t"
  86383. #else
  86384. "lsr r7, r7, #16\n\t"
  86385. #endif
  86386. #ifdef WOLFSSL_KEIL
  86387. "muls r6, r7, r6\n\t"
  86388. #elif defined(__clang__)
  86389. "muls r6, r7\n\t"
  86390. #else
  86391. "mul r6, r7\n\t"
  86392. #endif
  86393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86394. "lsrs r7, r6, #16\n\t"
  86395. #else
  86396. "lsr r7, r6, #16\n\t"
  86397. #endif
  86398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86399. "lsls r6, r6, #16\n\t"
  86400. #else
  86401. "lsl r6, r6, #16\n\t"
  86402. #endif
  86403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86404. "adds r3, r3, r6\n\t"
  86405. #else
  86406. "add r3, r3, r6\n\t"
  86407. #endif
  86408. #ifdef WOLFSSL_KEIL
  86409. "adcs r4, r4, r7\n\t"
  86410. #elif defined(__clang__)
  86411. "adcs r4, r7\n\t"
  86412. #else
  86413. "adc r4, r7\n\t"
  86414. #endif
  86415. #ifdef WOLFSSL_KEIL
  86416. "adcs r5, r5, %[r]\n\t"
  86417. #elif defined(__clang__)
  86418. "adcs r5, %[r]\n\t"
  86419. #else
  86420. "adc r5, %[r]\n\t"
  86421. #endif
  86422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86423. "adds r3, r3, r6\n\t"
  86424. #else
  86425. "add r3, r3, r6\n\t"
  86426. #endif
  86427. #ifdef WOLFSSL_KEIL
  86428. "adcs r4, r4, r7\n\t"
  86429. #elif defined(__clang__)
  86430. "adcs r4, r7\n\t"
  86431. #else
  86432. "adc r4, r7\n\t"
  86433. #endif
  86434. #ifdef WOLFSSL_KEIL
  86435. "adcs r5, r5, %[r]\n\t"
  86436. #elif defined(__clang__)
  86437. "adcs r5, %[r]\n\t"
  86438. #else
  86439. "adc r5, %[r]\n\t"
  86440. #endif
  86441. "ldr r6, [%[a]]\n\t"
  86442. "ldr r7, [r2]\n\t"
  86443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86444. "lsrs r6, r6, #16\n\t"
  86445. #else
  86446. "lsr r6, r6, #16\n\t"
  86447. #endif
  86448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86449. "lsrs r7, r7, #16\n\t"
  86450. #else
  86451. "lsr r7, r7, #16\n\t"
  86452. #endif
  86453. #ifdef WOLFSSL_KEIL
  86454. "muls r7, r6, r7\n\t"
  86455. #elif defined(__clang__)
  86456. "muls r7, r6\n\t"
  86457. #else
  86458. "mul r7, r6\n\t"
  86459. #endif
  86460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86461. "adds r4, r4, r7\n\t"
  86462. #else
  86463. "add r4, r4, r7\n\t"
  86464. #endif
  86465. #ifdef WOLFSSL_KEIL
  86466. "adcs r5, r5, %[r]\n\t"
  86467. #elif defined(__clang__)
  86468. "adcs r5, %[r]\n\t"
  86469. #else
  86470. "adc r5, %[r]\n\t"
  86471. #endif
  86472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86473. "adds r4, r4, r7\n\t"
  86474. #else
  86475. "add r4, r4, r7\n\t"
  86476. #endif
  86477. #ifdef WOLFSSL_KEIL
  86478. "adcs r5, r5, %[r]\n\t"
  86479. #elif defined(__clang__)
  86480. "adcs r5, %[r]\n\t"
  86481. #else
  86482. "adc r5, %[r]\n\t"
  86483. #endif
  86484. "ldrh r7, [r2]\n\t"
  86485. #ifdef WOLFSSL_KEIL
  86486. "muls r6, r7, r6\n\t"
  86487. #elif defined(__clang__)
  86488. "muls r6, r7\n\t"
  86489. #else
  86490. "mul r6, r7\n\t"
  86491. #endif
  86492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86493. "lsrs r7, r6, #16\n\t"
  86494. #else
  86495. "lsr r7, r6, #16\n\t"
  86496. #endif
  86497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86498. "lsls r6, r6, #16\n\t"
  86499. #else
  86500. "lsl r6, r6, #16\n\t"
  86501. #endif
  86502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86503. "adds r3, r3, r6\n\t"
  86504. #else
  86505. "add r3, r3, r6\n\t"
  86506. #endif
  86507. #ifdef WOLFSSL_KEIL
  86508. "adcs r4, r4, r7\n\t"
  86509. #elif defined(__clang__)
  86510. "adcs r4, r7\n\t"
  86511. #else
  86512. "adc r4, r7\n\t"
  86513. #endif
  86514. #ifdef WOLFSSL_KEIL
  86515. "adcs r5, r5, %[r]\n\t"
  86516. #elif defined(__clang__)
  86517. "adcs r5, %[r]\n\t"
  86518. #else
  86519. "adc r5, %[r]\n\t"
  86520. #endif
  86521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86522. "adds r3, r3, r6\n\t"
  86523. #else
  86524. "add r3, r3, r6\n\t"
  86525. #endif
  86526. #ifdef WOLFSSL_KEIL
  86527. "adcs r4, r4, r7\n\t"
  86528. #elif defined(__clang__)
  86529. "adcs r4, r7\n\t"
  86530. #else
  86531. "adc r4, r7\n\t"
  86532. #endif
  86533. #ifdef WOLFSSL_KEIL
  86534. "adcs r5, r5, %[r]\n\t"
  86535. #elif defined(__clang__)
  86536. "adcs r5, %[r]\n\t"
  86537. #else
  86538. "adc r5, %[r]\n\t"
  86539. #endif
  86540. "# Multiply * 2: Done\n\t"
  86541. "bal L_sp_4096_sqr_128_done_sqr_%=\n\t"
  86542. "\n"
  86543. "L_sp_4096_sqr_128_sqr_%=:\n\t"
  86544. "mov r12, r2\n\t"
  86545. "ldr r2, [%[a]]\n\t"
  86546. "# Square: Start\n\t"
  86547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86548. "lsrs r7, r2, #16\n\t"
  86549. #else
  86550. "lsr r7, r2, #16\n\t"
  86551. #endif
  86552. "uxth r6, r2\n\t"
  86553. #ifdef WOLFSSL_KEIL
  86554. "muls r6, r6, r6\n\t"
  86555. #elif defined(__clang__)
  86556. "muls r6, r6\n\t"
  86557. #else
  86558. "mul r6, r6\n\t"
  86559. #endif
  86560. #ifdef WOLFSSL_KEIL
  86561. "muls r7, r7, r7\n\t"
  86562. #elif defined(__clang__)
  86563. "muls r7, r7\n\t"
  86564. #else
  86565. "mul r7, r7\n\t"
  86566. #endif
  86567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86568. "adds r3, r3, r6\n\t"
  86569. #else
  86570. "add r3, r3, r6\n\t"
  86571. #endif
  86572. #ifdef WOLFSSL_KEIL
  86573. "adcs r4, r4, r7\n\t"
  86574. #elif defined(__clang__)
  86575. "adcs r4, r7\n\t"
  86576. #else
  86577. "adc r4, r7\n\t"
  86578. #endif
  86579. #ifdef WOLFSSL_KEIL
  86580. "adcs r5, r5, %[r]\n\t"
  86581. #elif defined(__clang__)
  86582. "adcs r5, %[r]\n\t"
  86583. #else
  86584. "adc r5, %[r]\n\t"
  86585. #endif
  86586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86587. "lsrs r7, r2, #16\n\t"
  86588. #else
  86589. "lsr r7, r2, #16\n\t"
  86590. #endif
  86591. "uxth r6, r2\n\t"
  86592. #ifdef WOLFSSL_KEIL
  86593. "muls r6, r7, r6\n\t"
  86594. #elif defined(__clang__)
  86595. "muls r6, r7\n\t"
  86596. #else
  86597. "mul r6, r7\n\t"
  86598. #endif
  86599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86600. "lsrs r7, r6, #15\n\t"
  86601. #else
  86602. "lsr r7, r6, #15\n\t"
  86603. #endif
  86604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86605. "lsls r6, r6, #17\n\t"
  86606. #else
  86607. "lsl r6, r6, #17\n\t"
  86608. #endif
  86609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86610. "adds r3, r3, r6\n\t"
  86611. #else
  86612. "add r3, r3, r6\n\t"
  86613. #endif
  86614. #ifdef WOLFSSL_KEIL
  86615. "adcs r4, r4, r7\n\t"
  86616. #elif defined(__clang__)
  86617. "adcs r4, r7\n\t"
  86618. #else
  86619. "adc r4, r7\n\t"
  86620. #endif
  86621. #ifdef WOLFSSL_KEIL
  86622. "adcs r5, r5, %[r]\n\t"
  86623. #elif defined(__clang__)
  86624. "adcs r5, %[r]\n\t"
  86625. #else
  86626. "adc r5, %[r]\n\t"
  86627. #endif
  86628. "# Square: Done\n\t"
  86629. "mov r2, r12\n\t"
  86630. "\n"
  86631. "L_sp_4096_sqr_128_done_sqr_%=:\n\t"
  86632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86633. "adds %[a], %[a], #4\n\t"
  86634. #else
  86635. "add %[a], %[a], #4\n\t"
  86636. #endif
  86637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86638. "subs r2, r2, #4\n\t"
  86639. #else
  86640. "sub r2, r2, #4\n\t"
  86641. #endif
  86642. "movs r6, #2\n\t"
  86643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86644. "lsls r6, r6, #8\n\t"
  86645. #else
  86646. "lsl r6, r6, #8\n\t"
  86647. #endif
  86648. "add r6, r6, r9\n\t"
  86649. "cmp %[a], r6\n\t"
  86650. "beq L_sp_4096_sqr_128_done_mul_%=\n\t"
  86651. "cmp %[a], r2\n\t"
  86652. "bgt L_sp_4096_sqr_128_done_mul_%=\n\t"
  86653. "mov r7, r8\n\t"
  86654. "add r7, r7, r9\n\t"
  86655. "cmp %[a], r7\n\t"
  86656. "ble L_sp_4096_sqr_128_mul_%=\n\t"
  86657. "\n"
  86658. "L_sp_4096_sqr_128_done_mul_%=:\n\t"
  86659. "mov %[r], r10\n\t"
  86660. "mov r7, r8\n\t"
  86661. "str r3, [%[r], r7]\n\t"
  86662. "movs r3, r4\n\t"
  86663. "movs r4, r5\n\t"
  86664. "movs r5, #0\n\t"
  86665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86666. "adds r7, r7, #4\n\t"
  86667. #else
  86668. "add r7, r7, #4\n\t"
  86669. #endif
  86670. "mov r8, r7\n\t"
  86671. "movs r6, #3\n\t"
  86672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86673. "lsls r6, r6, #8\n\t"
  86674. #else
  86675. "lsl r6, r6, #8\n\t"
  86676. #endif
  86677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86678. "adds r6, r6, #0xf8\n\t"
  86679. #else
  86680. "add r6, r6, #0xf8\n\t"
  86681. #endif
  86682. "cmp r7, r6\n\t"
  86683. "ble L_sp_4096_sqr_128_words_%=\n\t"
  86684. "mov %[a], r9\n\t"
  86685. "str r3, [%[r], r7]\n\t"
  86686. "mov %[r], r11\n\t"
  86687. "mov %[a], r10\n\t"
  86688. "movs r3, #3\n\t"
  86689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86690. "lsls r3, r3, #8\n\t"
  86691. #else
  86692. "lsl r3, r3, #8\n\t"
  86693. #endif
  86694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86695. "adds r3, r3, #0xfc\n\t"
  86696. #else
  86697. "add r3, r3, #0xfc\n\t"
  86698. #endif
  86699. "\n"
  86700. "L_sp_4096_sqr_128_store_%=:\n\t"
  86701. "ldr r6, [%[a], r3]\n\t"
  86702. "str r6, [%[r], r3]\n\t"
  86703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86704. "subs r3, r3, #4\n\t"
  86705. #else
  86706. "sub r3, r3, #4\n\t"
  86707. #endif
  86708. "bge L_sp_4096_sqr_128_store_%=\n\t"
  86709. "movs r6, #4\n\t"
  86710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86711. "lsls r6, r6, #8\n\t"
  86712. #else
  86713. "lsl r6, r6, #8\n\t"
  86714. #endif
  86715. "add sp, sp, r6\n\t"
  86716. : [r] "+l" (r), [a] "+l" (a)
  86717. :
  86718. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  86719. );
  86720. }
  86721. #endif /* WOLFSSL_SP_SMALL */
  86722. /* Calculate the bottom digit of -1/a mod 2^n.
  86723. *
  86724. * a A single precision number.
  86725. * rho Bottom word of inverse.
  86726. */
  86727. static void sp_4096_mont_setup(const sp_digit* a, sp_digit* rho)
  86728. {
  86729. sp_digit x;
  86730. sp_digit b;
  86731. b = a[0];
  86732. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  86733. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  86734. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  86735. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  86736. /* rho = -1/m mod b */
  86737. *rho = (sp_digit)0 - x;
  86738. }
  86739. /* Mul a by digit b into r. (r = a * b)
  86740. *
  86741. * r A single precision integer.
  86742. * a A single precision integer.
  86743. * b A single precision digit.
  86744. */
  86745. SP_NOINLINE static void sp_4096_mul_d_128(sp_digit* r, const sp_digit* a,
  86746. sp_digit b)
  86747. {
  86748. __asm__ __volatile__ (
  86749. "movs r6, #2\n\t"
  86750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86751. "lsls r6, r6, #8\n\t"
  86752. #else
  86753. "lsl r6, r6, #8\n\t"
  86754. #endif
  86755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86756. "adds r6, r6, %[a]\n\t"
  86757. #else
  86758. "add r6, r6, %[a]\n\t"
  86759. #endif
  86760. "mov r8, %[r]\n\t"
  86761. "mov r9, r6\n\t"
  86762. "movs r3, #0\n\t"
  86763. "movs r4, #0\n\t"
  86764. "\n"
  86765. "L_sp_4096_mul_d_128_%=:\n\t"
  86766. "movs %[r], #0\n\t"
  86767. "movs r5, #0\n\t"
  86768. "# A[] * B\n\t"
  86769. "ldrh r6, [%[a]]\n\t"
  86770. "uxth r7, %[b]\n\t"
  86771. #ifdef WOLFSSL_KEIL
  86772. "muls r7, r6, r7\n\t"
  86773. #elif defined(__clang__)
  86774. "muls r7, r6\n\t"
  86775. #else
  86776. "mul r7, r6\n\t"
  86777. #endif
  86778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86779. "adds r3, r3, r7\n\t"
  86780. #else
  86781. "add r3, r3, r7\n\t"
  86782. #endif
  86783. #ifdef WOLFSSL_KEIL
  86784. "adcs r4, r4, %[r]\n\t"
  86785. #elif defined(__clang__)
  86786. "adcs r4, %[r]\n\t"
  86787. #else
  86788. "adc r4, %[r]\n\t"
  86789. #endif
  86790. #ifdef WOLFSSL_KEIL
  86791. "adcs r5, r5, %[r]\n\t"
  86792. #elif defined(__clang__)
  86793. "adcs r5, %[r]\n\t"
  86794. #else
  86795. "adc r5, %[r]\n\t"
  86796. #endif
  86797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86798. "lsrs r7, %[b], #16\n\t"
  86799. #else
  86800. "lsr r7, %[b], #16\n\t"
  86801. #endif
  86802. #ifdef WOLFSSL_KEIL
  86803. "muls r6, r7, r6\n\t"
  86804. #elif defined(__clang__)
  86805. "muls r6, r7\n\t"
  86806. #else
  86807. "mul r6, r7\n\t"
  86808. #endif
  86809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86810. "lsrs r7, r6, #16\n\t"
  86811. #else
  86812. "lsr r7, r6, #16\n\t"
  86813. #endif
  86814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86815. "lsls r6, r6, #16\n\t"
  86816. #else
  86817. "lsl r6, r6, #16\n\t"
  86818. #endif
  86819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86820. "adds r3, r3, r6\n\t"
  86821. #else
  86822. "add r3, r3, r6\n\t"
  86823. #endif
  86824. #ifdef WOLFSSL_KEIL
  86825. "adcs r4, r4, r7\n\t"
  86826. #elif defined(__clang__)
  86827. "adcs r4, r7\n\t"
  86828. #else
  86829. "adc r4, r7\n\t"
  86830. #endif
  86831. #ifdef WOLFSSL_KEIL
  86832. "adcs r5, r5, %[r]\n\t"
  86833. #elif defined(__clang__)
  86834. "adcs r5, %[r]\n\t"
  86835. #else
  86836. "adc r5, %[r]\n\t"
  86837. #endif
  86838. "ldr r6, [%[a]]\n\t"
  86839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86840. "lsrs r6, r6, #16\n\t"
  86841. #else
  86842. "lsr r6, r6, #16\n\t"
  86843. #endif
  86844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86845. "lsrs r7, %[b], #16\n\t"
  86846. #else
  86847. "lsr r7, %[b], #16\n\t"
  86848. #endif
  86849. #ifdef WOLFSSL_KEIL
  86850. "muls r7, r6, r7\n\t"
  86851. #elif defined(__clang__)
  86852. "muls r7, r6\n\t"
  86853. #else
  86854. "mul r7, r6\n\t"
  86855. #endif
  86856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86857. "adds r4, r4, r7\n\t"
  86858. #else
  86859. "add r4, r4, r7\n\t"
  86860. #endif
  86861. #ifdef WOLFSSL_KEIL
  86862. "adcs r5, r5, %[r]\n\t"
  86863. #elif defined(__clang__)
  86864. "adcs r5, %[r]\n\t"
  86865. #else
  86866. "adc r5, %[r]\n\t"
  86867. #endif
  86868. "uxth r7, %[b]\n\t"
  86869. #ifdef WOLFSSL_KEIL
  86870. "muls r6, r7, r6\n\t"
  86871. #elif defined(__clang__)
  86872. "muls r6, r7\n\t"
  86873. #else
  86874. "mul r6, r7\n\t"
  86875. #endif
  86876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86877. "lsrs r7, r6, #16\n\t"
  86878. #else
  86879. "lsr r7, r6, #16\n\t"
  86880. #endif
  86881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86882. "lsls r6, r6, #16\n\t"
  86883. #else
  86884. "lsl r6, r6, #16\n\t"
  86885. #endif
  86886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86887. "adds r3, r3, r6\n\t"
  86888. #else
  86889. "add r3, r3, r6\n\t"
  86890. #endif
  86891. #ifdef WOLFSSL_KEIL
  86892. "adcs r4, r4, r7\n\t"
  86893. #elif defined(__clang__)
  86894. "adcs r4, r7\n\t"
  86895. #else
  86896. "adc r4, r7\n\t"
  86897. #endif
  86898. #ifdef WOLFSSL_KEIL
  86899. "adcs r5, r5, %[r]\n\t"
  86900. #elif defined(__clang__)
  86901. "adcs r5, %[r]\n\t"
  86902. #else
  86903. "adc r5, %[r]\n\t"
  86904. #endif
  86905. "# A[] * B - Done\n\t"
  86906. "mov %[r], r8\n\t"
  86907. "str r3, [%[r]]\n\t"
  86908. "movs r3, r4\n\t"
  86909. "movs r4, r5\n\t"
  86910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86911. "adds %[r], %[r], #4\n\t"
  86912. #else
  86913. "add %[r], %[r], #4\n\t"
  86914. #endif
  86915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86916. "adds %[a], %[a], #4\n\t"
  86917. #else
  86918. "add %[a], %[a], #4\n\t"
  86919. #endif
  86920. "mov r8, %[r]\n\t"
  86921. "cmp %[a], r9\n\t"
  86922. "blt L_sp_4096_mul_d_128_%=\n\t"
  86923. "str r3, [%[r]]\n\t"
  86924. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  86925. :
  86926. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  86927. );
  86928. }
  86929. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  86930. /* r = 2^n mod m where n is the number of bits to reduce by.
  86931. * Given m must be 4096 bits, just need to subtract.
  86932. *
  86933. * r A single precision number.
  86934. * m A single precision number.
  86935. */
  86936. static void sp_4096_mont_norm_128(sp_digit* r, const sp_digit* m)
  86937. {
  86938. XMEMSET(r, 0, sizeof(sp_digit) * 128);
  86939. /* r = 2^n mod m */
  86940. sp_4096_sub_in_place_128(r, m);
  86941. }
  86942. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  86943. /* Conditionally subtract b from a using the mask m.
  86944. * m is -1 to subtract and 0 when not copying.
  86945. *
  86946. * r A single precision number representing condition subtract result.
  86947. * a A single precision number to subtract from.
  86948. * b A single precision number to subtract.
  86949. * m Mask value to apply.
  86950. */
  86951. SP_NOINLINE static sp_digit sp_4096_cond_sub_128(sp_digit* r, const sp_digit* a,
  86952. const sp_digit* b, sp_digit m)
  86953. {
  86954. __asm__ __volatile__ (
  86955. "movs r4, #0\n\t"
  86956. "movs r5, #2\n\t"
  86957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86958. "lsls r5, r5, #8\n\t"
  86959. #else
  86960. "lsl r5, r5, #8\n\t"
  86961. #endif
  86962. "mov r8, r5\n\t"
  86963. "movs r7, #0\n\t"
  86964. "\n"
  86965. "L_sp_4096_cond_sub_128_words_%=:\n\t"
  86966. "ldr r6, [%[b], r7]\n\t"
  86967. #ifdef WOLFSSL_KEIL
  86968. "ands r6, r6, %[m]\n\t"
  86969. #elif defined(__clang__)
  86970. "ands r6, %[m]\n\t"
  86971. #else
  86972. "and r6, %[m]\n\t"
  86973. #endif
  86974. "movs r5, #0\n\t"
  86975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86976. "subs r5, r5, r4\n\t"
  86977. #else
  86978. "sub r5, r5, r4\n\t"
  86979. #endif
  86980. "ldr r5, [%[a], r7]\n\t"
  86981. #ifdef WOLFSSL_KEIL
  86982. "sbcs r5, r5, r6\n\t"
  86983. #elif defined(__clang__)
  86984. "sbcs r5, r6\n\t"
  86985. #else
  86986. "sbc r5, r6\n\t"
  86987. #endif
  86988. #ifdef WOLFSSL_KEIL
  86989. "sbcs r4, r4, r4\n\t"
  86990. #elif defined(__clang__)
  86991. "sbcs r4, r4\n\t"
  86992. #else
  86993. "sbc r4, r4\n\t"
  86994. #endif
  86995. "str r5, [%[r], r7]\n\t"
  86996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86997. "adds r7, r7, #4\n\t"
  86998. #else
  86999. "add r7, r7, #4\n\t"
  87000. #endif
  87001. "cmp r7, r8\n\t"
  87002. "blt L_sp_4096_cond_sub_128_words_%=\n\t"
  87003. "movs %[r], r4\n\t"
  87004. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  87005. :
  87006. : "memory", "r4", "r5", "r6", "r7", "r8"
  87007. );
  87008. return (uint32_t)(size_t)r;
  87009. }
  87010. #define sp_4096_mont_reduce_order_128 sp_4096_mont_reduce_128
  87011. /* Reduce the number back to 4096 bits using Montgomery reduction.
  87012. *
  87013. * a A single precision number to reduce in place.
  87014. * m The single precision number representing the modulus.
  87015. * mp The digit representing the negative inverse of m mod 2^n.
  87016. */
  87017. SP_NOINLINE static void sp_4096_mont_reduce_128(sp_digit* a, const sp_digit* m,
  87018. sp_digit mp)
  87019. {
  87020. __asm__ __volatile__ (
  87021. "movs r7, #0\n\t"
  87022. "mov r8, %[mp]\n\t"
  87023. "mov r12, r7\n\t"
  87024. "mov lr, %[m]\n\t"
  87025. "mov r9, %[a]\n\t"
  87026. "mov r11, %[a]\n\t"
  87027. "movs r5, #0xff\n\t"
  87028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87029. "adds r5, r5, #0xfd\n\t"
  87030. #else
  87031. "add r5, r5, #0xfd\n\t"
  87032. #endif
  87033. "movs r6, #2\n\t"
  87034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87035. "lsls r6, r6, #8\n\t"
  87036. #else
  87037. "lsl r6, r6, #8\n\t"
  87038. #endif
  87039. "add r9, r9, r5\n\t"
  87040. "add r11, r11, r6\n\t"
  87041. "\n"
  87042. "L_sp_4096_mont_reduce_128_mod_%=:\n\t"
  87043. "movs r7, #0\n\t"
  87044. "movs r4, #0\n\t"
  87045. "# a[i] += m[0] * mu\n\t"
  87046. "ldm %[m]!, {%[mp]}\n\t"
  87047. "ldm %[a]!, {r3}\n\t"
  87048. "# mu = a[i] * mp\n\t"
  87049. "mov r5, r8\n\t"
  87050. #ifdef WOLFSSL_KEIL
  87051. "muls r5, r3, r5\n\t"
  87052. #elif defined(__clang__)
  87053. "muls r5, r3\n\t"
  87054. #else
  87055. "mul r5, r3\n\t"
  87056. #endif
  87057. "mov r10, r5\n\t"
  87058. "# Multiply m[0] and mu - Start\n\t"
  87059. "mov r5, r10\n\t"
  87060. "uxth r6, %[mp]\n\t"
  87061. "uxth r5, r5\n\t"
  87062. #ifdef WOLFSSL_KEIL
  87063. "muls r6, r5, r6\n\t"
  87064. #elif defined(__clang__)
  87065. "muls r6, r5\n\t"
  87066. #else
  87067. "mul r6, r5\n\t"
  87068. #endif
  87069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87070. "adds r3, r3, r6\n\t"
  87071. #else
  87072. "add r3, r3, r6\n\t"
  87073. #endif
  87074. #ifdef WOLFSSL_KEIL
  87075. "adcs r4, r4, r7\n\t"
  87076. #elif defined(__clang__)
  87077. "adcs r4, r7\n\t"
  87078. #else
  87079. "adc r4, r7\n\t"
  87080. #endif
  87081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87082. "lsrs r6, %[mp], #16\n\t"
  87083. #else
  87084. "lsr r6, %[mp], #16\n\t"
  87085. #endif
  87086. #ifdef WOLFSSL_KEIL
  87087. "muls r5, r6, r5\n\t"
  87088. #elif defined(__clang__)
  87089. "muls r5, r6\n\t"
  87090. #else
  87091. "mul r5, r6\n\t"
  87092. #endif
  87093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87094. "lsrs r6, r5, #16\n\t"
  87095. #else
  87096. "lsr r6, r5, #16\n\t"
  87097. #endif
  87098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87099. "lsls r5, r5, #16\n\t"
  87100. #else
  87101. "lsl r5, r5, #16\n\t"
  87102. #endif
  87103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87104. "adds r3, r3, r5\n\t"
  87105. #else
  87106. "add r3, r3, r5\n\t"
  87107. #endif
  87108. #ifdef WOLFSSL_KEIL
  87109. "adcs r4, r4, r6\n\t"
  87110. #elif defined(__clang__)
  87111. "adcs r4, r6\n\t"
  87112. #else
  87113. "adc r4, r6\n\t"
  87114. #endif
  87115. "mov r5, r10\n\t"
  87116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87117. "lsrs r6, %[mp], #16\n\t"
  87118. #else
  87119. "lsr r6, %[mp], #16\n\t"
  87120. #endif
  87121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87122. "lsrs r5, r5, #16\n\t"
  87123. #else
  87124. "lsr r5, r5, #16\n\t"
  87125. #endif
  87126. #ifdef WOLFSSL_KEIL
  87127. "muls r6, r5, r6\n\t"
  87128. #elif defined(__clang__)
  87129. "muls r6, r5\n\t"
  87130. #else
  87131. "mul r6, r5\n\t"
  87132. #endif
  87133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87134. "adds r4, r4, r6\n\t"
  87135. #else
  87136. "add r4, r4, r6\n\t"
  87137. #endif
  87138. "uxth r6, %[mp]\n\t"
  87139. #ifdef WOLFSSL_KEIL
  87140. "muls r5, r6, r5\n\t"
  87141. #elif defined(__clang__)
  87142. "muls r5, r6\n\t"
  87143. #else
  87144. "mul r5, r6\n\t"
  87145. #endif
  87146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87147. "lsrs r6, r5, #16\n\t"
  87148. #else
  87149. "lsr r6, r5, #16\n\t"
  87150. #endif
  87151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87152. "lsls r5, r5, #16\n\t"
  87153. #else
  87154. "lsl r5, r5, #16\n\t"
  87155. #endif
  87156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87157. "adds r3, r3, r5\n\t"
  87158. #else
  87159. "add r3, r3, r5\n\t"
  87160. #endif
  87161. #ifdef WOLFSSL_KEIL
  87162. "adcs r4, r4, r6\n\t"
  87163. #elif defined(__clang__)
  87164. "adcs r4, r6\n\t"
  87165. #else
  87166. "adc r4, r6\n\t"
  87167. #endif
  87168. "# Multiply m[0] and mu - Done\n\t"
  87169. "\n"
  87170. "L_sp_4096_mont_reduce_128_word_%=:\n\t"
  87171. "# a[i+j] += m[j] * mu\n\t"
  87172. "ldr r3, [%[a]]\n\t"
  87173. "ldm %[m]!, {%[mp]}\n\t"
  87174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87175. "adds r3, r3, r4\n\t"
  87176. #else
  87177. "add r3, r3, r4\n\t"
  87178. #endif
  87179. "movs r4, #0\n\t"
  87180. #ifdef WOLFSSL_KEIL
  87181. "adcs r4, r4, r7\n\t"
  87182. #elif defined(__clang__)
  87183. "adcs r4, r7\n\t"
  87184. #else
  87185. "adc r4, r7\n\t"
  87186. #endif
  87187. "# Multiply m[j] and mu - Start\n\t"
  87188. "mov r5, r10\n\t"
  87189. "uxth r6, %[mp]\n\t"
  87190. "uxth r5, r5\n\t"
  87191. #ifdef WOLFSSL_KEIL
  87192. "muls r6, r5, r6\n\t"
  87193. #elif defined(__clang__)
  87194. "muls r6, r5\n\t"
  87195. #else
  87196. "mul r6, r5\n\t"
  87197. #endif
  87198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87199. "adds r3, r3, r6\n\t"
  87200. #else
  87201. "add r3, r3, r6\n\t"
  87202. #endif
  87203. #ifdef WOLFSSL_KEIL
  87204. "adcs r4, r4, r7\n\t"
  87205. #elif defined(__clang__)
  87206. "adcs r4, r7\n\t"
  87207. #else
  87208. "adc r4, r7\n\t"
  87209. #endif
  87210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87211. "lsrs r6, %[mp], #16\n\t"
  87212. #else
  87213. "lsr r6, %[mp], #16\n\t"
  87214. #endif
  87215. #ifdef WOLFSSL_KEIL
  87216. "muls r5, r6, r5\n\t"
  87217. #elif defined(__clang__)
  87218. "muls r5, r6\n\t"
  87219. #else
  87220. "mul r5, r6\n\t"
  87221. #endif
  87222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87223. "lsrs r6, r5, #16\n\t"
  87224. #else
  87225. "lsr r6, r5, #16\n\t"
  87226. #endif
  87227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87228. "lsls r5, r5, #16\n\t"
  87229. #else
  87230. "lsl r5, r5, #16\n\t"
  87231. #endif
  87232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87233. "adds r3, r3, r5\n\t"
  87234. #else
  87235. "add r3, r3, r5\n\t"
  87236. #endif
  87237. #ifdef WOLFSSL_KEIL
  87238. "adcs r4, r4, r6\n\t"
  87239. #elif defined(__clang__)
  87240. "adcs r4, r6\n\t"
  87241. #else
  87242. "adc r4, r6\n\t"
  87243. #endif
  87244. "mov r5, r10\n\t"
  87245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87246. "lsrs r6, %[mp], #16\n\t"
  87247. #else
  87248. "lsr r6, %[mp], #16\n\t"
  87249. #endif
  87250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87251. "lsrs r5, r5, #16\n\t"
  87252. #else
  87253. "lsr r5, r5, #16\n\t"
  87254. #endif
  87255. #ifdef WOLFSSL_KEIL
  87256. "muls r6, r5, r6\n\t"
  87257. #elif defined(__clang__)
  87258. "muls r6, r5\n\t"
  87259. #else
  87260. "mul r6, r5\n\t"
  87261. #endif
  87262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87263. "adds r4, r4, r6\n\t"
  87264. #else
  87265. "add r4, r4, r6\n\t"
  87266. #endif
  87267. "uxth r6, %[mp]\n\t"
  87268. #ifdef WOLFSSL_KEIL
  87269. "muls r5, r6, r5\n\t"
  87270. #elif defined(__clang__)
  87271. "muls r5, r6\n\t"
  87272. #else
  87273. "mul r5, r6\n\t"
  87274. #endif
  87275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87276. "lsrs r6, r5, #16\n\t"
  87277. #else
  87278. "lsr r6, r5, #16\n\t"
  87279. #endif
  87280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87281. "lsls r5, r5, #16\n\t"
  87282. #else
  87283. "lsl r5, r5, #16\n\t"
  87284. #endif
  87285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87286. "adds r3, r3, r5\n\t"
  87287. #else
  87288. "add r3, r3, r5\n\t"
  87289. #endif
  87290. #ifdef WOLFSSL_KEIL
  87291. "adcs r4, r4, r6\n\t"
  87292. #elif defined(__clang__)
  87293. "adcs r4, r6\n\t"
  87294. #else
  87295. "adc r4, r6\n\t"
  87296. #endif
  87297. "# Multiply m[j] and mu - Done\n\t"
  87298. "stm %[a]!, {r3}\n\t"
  87299. "cmp %[a], r9\n\t"
  87300. "blt L_sp_4096_mont_reduce_128_word_%=\n\t"
  87301. "# a[i+127] += m[127] * mu\n\t"
  87302. "ldr %[mp], [%[m]]\n\t"
  87303. "mov r3, r12\n\t"
  87304. "# Multiply m[127] and mu - Start\n\t"
  87305. "mov r5, r10\n\t"
  87306. "uxth r6, %[mp]\n\t"
  87307. "uxth r5, r5\n\t"
  87308. #ifdef WOLFSSL_KEIL
  87309. "muls r6, r5, r6\n\t"
  87310. #elif defined(__clang__)
  87311. "muls r6, r5\n\t"
  87312. #else
  87313. "mul r6, r5\n\t"
  87314. #endif
  87315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87316. "adds r4, r4, r6\n\t"
  87317. #else
  87318. "add r4, r4, r6\n\t"
  87319. #endif
  87320. #ifdef WOLFSSL_KEIL
  87321. "adcs r3, r3, r7\n\t"
  87322. #elif defined(__clang__)
  87323. "adcs r3, r7\n\t"
  87324. #else
  87325. "adc r3, r7\n\t"
  87326. #endif
  87327. #ifdef WOLFSSL_KEIL
  87328. "adcs r7, r7, r7\n\t"
  87329. #elif defined(__clang__)
  87330. "adcs r7, r7\n\t"
  87331. #else
  87332. "adc r7, r7\n\t"
  87333. #endif
  87334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87335. "lsrs r6, %[mp], #16\n\t"
  87336. #else
  87337. "lsr r6, %[mp], #16\n\t"
  87338. #endif
  87339. #ifdef WOLFSSL_KEIL
  87340. "muls r5, r6, r5\n\t"
  87341. #elif defined(__clang__)
  87342. "muls r5, r6\n\t"
  87343. #else
  87344. "mul r5, r6\n\t"
  87345. #endif
  87346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87347. "lsrs r6, r5, #16\n\t"
  87348. #else
  87349. "lsr r6, r5, #16\n\t"
  87350. #endif
  87351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87352. "lsls r5, r5, #16\n\t"
  87353. #else
  87354. "lsl r5, r5, #16\n\t"
  87355. #endif
  87356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87357. "adds r4, r4, r5\n\t"
  87358. #else
  87359. "add r4, r4, r5\n\t"
  87360. #endif
  87361. #ifdef WOLFSSL_KEIL
  87362. "adcs r3, r3, r6\n\t"
  87363. #elif defined(__clang__)
  87364. "adcs r3, r6\n\t"
  87365. #else
  87366. "adc r3, r6\n\t"
  87367. #endif
  87368. #ifdef WOLFSSL_KEIL
  87369. "adcs r7, r7, r7\n\t"
  87370. #elif defined(__clang__)
  87371. "adcs r7, r7\n\t"
  87372. #else
  87373. "adc r7, r7\n\t"
  87374. #endif
  87375. "mov r5, r10\n\t"
  87376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87377. "lsrs r6, %[mp], #16\n\t"
  87378. #else
  87379. "lsr r6, %[mp], #16\n\t"
  87380. #endif
  87381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87382. "lsrs r5, r5, #16\n\t"
  87383. #else
  87384. "lsr r5, r5, #16\n\t"
  87385. #endif
  87386. #ifdef WOLFSSL_KEIL
  87387. "muls r6, r5, r6\n\t"
  87388. #elif defined(__clang__)
  87389. "muls r6, r5\n\t"
  87390. #else
  87391. "mul r6, r5\n\t"
  87392. #endif
  87393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87394. "adds r3, r3, r6\n\t"
  87395. #else
  87396. "add r3, r3, r6\n\t"
  87397. #endif
  87398. #ifdef WOLFSSL_KEIL
  87399. "adcs r7, r7, r7\n\t"
  87400. #elif defined(__clang__)
  87401. "adcs r7, r7\n\t"
  87402. #else
  87403. "adc r7, r7\n\t"
  87404. #endif
  87405. "uxth r6, %[mp]\n\t"
  87406. #ifdef WOLFSSL_KEIL
  87407. "muls r5, r6, r5\n\t"
  87408. #elif defined(__clang__)
  87409. "muls r5, r6\n\t"
  87410. #else
  87411. "mul r5, r6\n\t"
  87412. #endif
  87413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87414. "lsrs r6, r5, #16\n\t"
  87415. #else
  87416. "lsr r6, r5, #16\n\t"
  87417. #endif
  87418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87419. "lsls r5, r5, #16\n\t"
  87420. #else
  87421. "lsl r5, r5, #16\n\t"
  87422. #endif
  87423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87424. "adds r4, r4, r5\n\t"
  87425. #else
  87426. "add r4, r4, r5\n\t"
  87427. #endif
  87428. #ifdef WOLFSSL_KEIL
  87429. "adcs r3, r3, r6\n\t"
  87430. #elif defined(__clang__)
  87431. "adcs r3, r6\n\t"
  87432. #else
  87433. "adc r3, r6\n\t"
  87434. #endif
  87435. #ifdef WOLFSSL_KEIL
  87436. "adcs r7, r7, r7\n\t"
  87437. #elif defined(__clang__)
  87438. "adcs r7, r7\n\t"
  87439. #else
  87440. "adc r7, r7\n\t"
  87441. #endif
  87442. "# Multiply m[127] and mu - Done\n\t"
  87443. "ldr r5, [%[a]]\n\t"
  87444. "ldr r6, [%[a], #4]\n\t"
  87445. "movs %[mp], #0\n\t"
  87446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87447. "adds r5, r5, r4\n\t"
  87448. #else
  87449. "add r5, r5, r4\n\t"
  87450. #endif
  87451. #ifdef WOLFSSL_KEIL
  87452. "adcs r6, r6, r3\n\t"
  87453. #elif defined(__clang__)
  87454. "adcs r6, r3\n\t"
  87455. #else
  87456. "adc r6, r3\n\t"
  87457. #endif
  87458. #ifdef WOLFSSL_KEIL
  87459. "adcs r7, r7, %[mp]\n\t"
  87460. #elif defined(__clang__)
  87461. "adcs r7, %[mp]\n\t"
  87462. #else
  87463. "adc r7, %[mp]\n\t"
  87464. #endif
  87465. "stm %[a]!, {r5, r6}\n\t"
  87466. "# i += 1\n\t"
  87467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87468. "subs %[a], %[a], #4\n\t"
  87469. #else
  87470. "sub %[a], %[a], #4\n\t"
  87471. #endif
  87472. "movs r3, #0xff\n\t"
  87473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87474. "adds r3, r3, #0xfd\n\t"
  87475. #else
  87476. "add r3, r3, #0xfd\n\t"
  87477. #endif
  87478. "mov r9, %[a]\n\t"
  87479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87480. "subs %[a], %[a], r3\n\t"
  87481. #else
  87482. "sub %[a], %[a], r3\n\t"
  87483. #endif
  87484. "mov r12, r7\n\t"
  87485. "mov %[m], lr\n\t"
  87486. "cmp r11, %[a]\n\t"
  87487. "bgt L_sp_4096_mont_reduce_128_mod_%=\n\t"
  87488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87489. "negs r7, r7\n\t"
  87490. #else
  87491. "neg r7, r7\n\t"
  87492. #endif
  87493. "# Subtract masked modulus\n\t"
  87494. "movs r4, #2\n\t"
  87495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87496. "lsls r4, r4, #8\n\t"
  87497. #else
  87498. "lsl r4, r4, #8\n\t"
  87499. #endif
  87500. "movs %[mp], #0\n\t"
  87501. "movs r3, #0\n\t"
  87502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87503. "subs %[a], %[a], r4\n\t"
  87504. #else
  87505. "sub %[a], %[a], r4\n\t"
  87506. #endif
  87507. #ifndef WOLFSSL_SP_LARGE_CODE
  87508. "\n"
  87509. "L_sp_4096_mont_reduce_128_sub_mask_%=:\n\t"
  87510. "ldm %[m]!, {r6}\n\t"
  87511. "movs r5, #0\n\t"
  87512. #ifdef WOLFSSL_KEIL
  87513. "ands r6, r6, r7\n\t"
  87514. #elif defined(__clang__)
  87515. "ands r6, r7\n\t"
  87516. #else
  87517. "and r6, r7\n\t"
  87518. #endif
  87519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87520. "subs r5, r5, %[mp]\n\t"
  87521. #else
  87522. "sub r5, r5, %[mp]\n\t"
  87523. #endif
  87524. "ldr r5, [%[a], r4]\n\t"
  87525. #ifdef WOLFSSL_KEIL
  87526. "sbcs r5, r5, r6\n\t"
  87527. #elif defined(__clang__)
  87528. "sbcs r5, r6\n\t"
  87529. #else
  87530. "sbc r5, r6\n\t"
  87531. #endif
  87532. #ifdef WOLFSSL_KEIL
  87533. "sbcs %[mp], %[mp], %[mp]\n\t"
  87534. #elif defined(__clang__)
  87535. "sbcs %[mp], %[mp]\n\t"
  87536. #else
  87537. "sbc %[mp], %[mp]\n\t"
  87538. #endif
  87539. "stm %[a]!, {r5}\n\t"
  87540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87541. "adds r3, r3, #4\n\t"
  87542. #else
  87543. "add r3, r3, #4\n\t"
  87544. #endif
  87545. "cmp r3, r4\n\t"
  87546. "blt L_sp_4096_mont_reduce_128_sub_mask_%=\n\t"
  87547. #else /* WOLFSSL_SP_LARGE_CODE */
  87548. "ldm %[m]!, {r6}\n\t"
  87549. #ifdef WOLFSSL_KEIL
  87550. "ands r6, r6, r7\n\t"
  87551. #elif defined(__clang__)
  87552. "ands r6, r7\n\t"
  87553. #else
  87554. "and r6, r7\n\t"
  87555. #endif
  87556. "ldr r5, [%[a], r4]\n\t"
  87557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87558. "subs r5, r5, r6\n\t"
  87559. #else
  87560. "sub r5, r5, r6\n\t"
  87561. #endif
  87562. "stm %[a]!, {r5}\n\t"
  87563. "ldm %[m]!, {r6}\n\t"
  87564. #ifdef WOLFSSL_KEIL
  87565. "ands r6, r6, r7\n\t"
  87566. #elif defined(__clang__)
  87567. "ands r6, r7\n\t"
  87568. #else
  87569. "and r6, r7\n\t"
  87570. #endif
  87571. "ldr r5, [%[a], r4]\n\t"
  87572. #ifdef WOLFSSL_KEIL
  87573. "sbcs r5, r5, r6\n\t"
  87574. #elif defined(__clang__)
  87575. "sbcs r5, r6\n\t"
  87576. #else
  87577. "sbc r5, r6\n\t"
  87578. #endif
  87579. "stm %[a]!, {r5}\n\t"
  87580. "ldm %[m]!, {r6}\n\t"
  87581. #ifdef WOLFSSL_KEIL
  87582. "ands r6, r6, r7\n\t"
  87583. #elif defined(__clang__)
  87584. "ands r6, r7\n\t"
  87585. #else
  87586. "and r6, r7\n\t"
  87587. #endif
  87588. "ldr r5, [%[a], r4]\n\t"
  87589. #ifdef WOLFSSL_KEIL
  87590. "sbcs r5, r5, r6\n\t"
  87591. #elif defined(__clang__)
  87592. "sbcs r5, r6\n\t"
  87593. #else
  87594. "sbc r5, r6\n\t"
  87595. #endif
  87596. "stm %[a]!, {r5}\n\t"
  87597. "ldm %[m]!, {r6}\n\t"
  87598. #ifdef WOLFSSL_KEIL
  87599. "ands r6, r6, r7\n\t"
  87600. #elif defined(__clang__)
  87601. "ands r6, r7\n\t"
  87602. #else
  87603. "and r6, r7\n\t"
  87604. #endif
  87605. "ldr r5, [%[a], r4]\n\t"
  87606. #ifdef WOLFSSL_KEIL
  87607. "sbcs r5, r5, r6\n\t"
  87608. #elif defined(__clang__)
  87609. "sbcs r5, r6\n\t"
  87610. #else
  87611. "sbc r5, r6\n\t"
  87612. #endif
  87613. "stm %[a]!, {r5}\n\t"
  87614. "ldm %[m]!, {r6}\n\t"
  87615. #ifdef WOLFSSL_KEIL
  87616. "ands r6, r6, r7\n\t"
  87617. #elif defined(__clang__)
  87618. "ands r6, r7\n\t"
  87619. #else
  87620. "and r6, r7\n\t"
  87621. #endif
  87622. "ldr r5, [%[a], r4]\n\t"
  87623. #ifdef WOLFSSL_KEIL
  87624. "sbcs r5, r5, r6\n\t"
  87625. #elif defined(__clang__)
  87626. "sbcs r5, r6\n\t"
  87627. #else
  87628. "sbc r5, r6\n\t"
  87629. #endif
  87630. "stm %[a]!, {r5}\n\t"
  87631. "ldm %[m]!, {r6}\n\t"
  87632. #ifdef WOLFSSL_KEIL
  87633. "ands r6, r6, r7\n\t"
  87634. #elif defined(__clang__)
  87635. "ands r6, r7\n\t"
  87636. #else
  87637. "and r6, r7\n\t"
  87638. #endif
  87639. "ldr r5, [%[a], r4]\n\t"
  87640. #ifdef WOLFSSL_KEIL
  87641. "sbcs r5, r5, r6\n\t"
  87642. #elif defined(__clang__)
  87643. "sbcs r5, r6\n\t"
  87644. #else
  87645. "sbc r5, r6\n\t"
  87646. #endif
  87647. "stm %[a]!, {r5}\n\t"
  87648. "ldm %[m]!, {r6}\n\t"
  87649. #ifdef WOLFSSL_KEIL
  87650. "ands r6, r6, r7\n\t"
  87651. #elif defined(__clang__)
  87652. "ands r6, r7\n\t"
  87653. #else
  87654. "and r6, r7\n\t"
  87655. #endif
  87656. "ldr r5, [%[a], r4]\n\t"
  87657. #ifdef WOLFSSL_KEIL
  87658. "sbcs r5, r5, r6\n\t"
  87659. #elif defined(__clang__)
  87660. "sbcs r5, r6\n\t"
  87661. #else
  87662. "sbc r5, r6\n\t"
  87663. #endif
  87664. "stm %[a]!, {r5}\n\t"
  87665. "ldm %[m]!, {r6}\n\t"
  87666. #ifdef WOLFSSL_KEIL
  87667. "ands r6, r6, r7\n\t"
  87668. #elif defined(__clang__)
  87669. "ands r6, r7\n\t"
  87670. #else
  87671. "and r6, r7\n\t"
  87672. #endif
  87673. "ldr r5, [%[a], r4]\n\t"
  87674. #ifdef WOLFSSL_KEIL
  87675. "sbcs r5, r5, r6\n\t"
  87676. #elif defined(__clang__)
  87677. "sbcs r5, r6\n\t"
  87678. #else
  87679. "sbc r5, r6\n\t"
  87680. #endif
  87681. "stm %[a]!, {r5}\n\t"
  87682. "ldm %[m]!, {r6}\n\t"
  87683. #ifdef WOLFSSL_KEIL
  87684. "ands r6, r6, r7\n\t"
  87685. #elif defined(__clang__)
  87686. "ands r6, r7\n\t"
  87687. #else
  87688. "and r6, r7\n\t"
  87689. #endif
  87690. "ldr r5, [%[a], r4]\n\t"
  87691. #ifdef WOLFSSL_KEIL
  87692. "sbcs r5, r5, r6\n\t"
  87693. #elif defined(__clang__)
  87694. "sbcs r5, r6\n\t"
  87695. #else
  87696. "sbc r5, r6\n\t"
  87697. #endif
  87698. "stm %[a]!, {r5}\n\t"
  87699. "ldm %[m]!, {r6}\n\t"
  87700. #ifdef WOLFSSL_KEIL
  87701. "ands r6, r6, r7\n\t"
  87702. #elif defined(__clang__)
  87703. "ands r6, r7\n\t"
  87704. #else
  87705. "and r6, r7\n\t"
  87706. #endif
  87707. "ldr r5, [%[a], r4]\n\t"
  87708. #ifdef WOLFSSL_KEIL
  87709. "sbcs r5, r5, r6\n\t"
  87710. #elif defined(__clang__)
  87711. "sbcs r5, r6\n\t"
  87712. #else
  87713. "sbc r5, r6\n\t"
  87714. #endif
  87715. "stm %[a]!, {r5}\n\t"
  87716. "ldm %[m]!, {r6}\n\t"
  87717. #ifdef WOLFSSL_KEIL
  87718. "ands r6, r6, r7\n\t"
  87719. #elif defined(__clang__)
  87720. "ands r6, r7\n\t"
  87721. #else
  87722. "and r6, r7\n\t"
  87723. #endif
  87724. "ldr r5, [%[a], r4]\n\t"
  87725. #ifdef WOLFSSL_KEIL
  87726. "sbcs r5, r5, r6\n\t"
  87727. #elif defined(__clang__)
  87728. "sbcs r5, r6\n\t"
  87729. #else
  87730. "sbc r5, r6\n\t"
  87731. #endif
  87732. "stm %[a]!, {r5}\n\t"
  87733. "ldm %[m]!, {r6}\n\t"
  87734. #ifdef WOLFSSL_KEIL
  87735. "ands r6, r6, r7\n\t"
  87736. #elif defined(__clang__)
  87737. "ands r6, r7\n\t"
  87738. #else
  87739. "and r6, r7\n\t"
  87740. #endif
  87741. "ldr r5, [%[a], r4]\n\t"
  87742. #ifdef WOLFSSL_KEIL
  87743. "sbcs r5, r5, r6\n\t"
  87744. #elif defined(__clang__)
  87745. "sbcs r5, r6\n\t"
  87746. #else
  87747. "sbc r5, r6\n\t"
  87748. #endif
  87749. "stm %[a]!, {r5}\n\t"
  87750. "ldm %[m]!, {r6}\n\t"
  87751. #ifdef WOLFSSL_KEIL
  87752. "ands r6, r6, r7\n\t"
  87753. #elif defined(__clang__)
  87754. "ands r6, r7\n\t"
  87755. #else
  87756. "and r6, r7\n\t"
  87757. #endif
  87758. "ldr r5, [%[a], r4]\n\t"
  87759. #ifdef WOLFSSL_KEIL
  87760. "sbcs r5, r5, r6\n\t"
  87761. #elif defined(__clang__)
  87762. "sbcs r5, r6\n\t"
  87763. #else
  87764. "sbc r5, r6\n\t"
  87765. #endif
  87766. "stm %[a]!, {r5}\n\t"
  87767. "ldm %[m]!, {r6}\n\t"
  87768. #ifdef WOLFSSL_KEIL
  87769. "ands r6, r6, r7\n\t"
  87770. #elif defined(__clang__)
  87771. "ands r6, r7\n\t"
  87772. #else
  87773. "and r6, r7\n\t"
  87774. #endif
  87775. "ldr r5, [%[a], r4]\n\t"
  87776. #ifdef WOLFSSL_KEIL
  87777. "sbcs r5, r5, r6\n\t"
  87778. #elif defined(__clang__)
  87779. "sbcs r5, r6\n\t"
  87780. #else
  87781. "sbc r5, r6\n\t"
  87782. #endif
  87783. "stm %[a]!, {r5}\n\t"
  87784. "ldm %[m]!, {r6}\n\t"
  87785. #ifdef WOLFSSL_KEIL
  87786. "ands r6, r6, r7\n\t"
  87787. #elif defined(__clang__)
  87788. "ands r6, r7\n\t"
  87789. #else
  87790. "and r6, r7\n\t"
  87791. #endif
  87792. "ldr r5, [%[a], r4]\n\t"
  87793. #ifdef WOLFSSL_KEIL
  87794. "sbcs r5, r5, r6\n\t"
  87795. #elif defined(__clang__)
  87796. "sbcs r5, r6\n\t"
  87797. #else
  87798. "sbc r5, r6\n\t"
  87799. #endif
  87800. "stm %[a]!, {r5}\n\t"
  87801. "ldm %[m]!, {r6}\n\t"
  87802. #ifdef WOLFSSL_KEIL
  87803. "ands r6, r6, r7\n\t"
  87804. #elif defined(__clang__)
  87805. "ands r6, r7\n\t"
  87806. #else
  87807. "and r6, r7\n\t"
  87808. #endif
  87809. "ldr r5, [%[a], r4]\n\t"
  87810. #ifdef WOLFSSL_KEIL
  87811. "sbcs r5, r5, r6\n\t"
  87812. #elif defined(__clang__)
  87813. "sbcs r5, r6\n\t"
  87814. #else
  87815. "sbc r5, r6\n\t"
  87816. #endif
  87817. "stm %[a]!, {r5}\n\t"
  87818. "ldm %[m]!, {r6}\n\t"
  87819. #ifdef WOLFSSL_KEIL
  87820. "ands r6, r6, r7\n\t"
  87821. #elif defined(__clang__)
  87822. "ands r6, r7\n\t"
  87823. #else
  87824. "and r6, r7\n\t"
  87825. #endif
  87826. "ldr r5, [%[a], r4]\n\t"
  87827. #ifdef WOLFSSL_KEIL
  87828. "sbcs r5, r5, r6\n\t"
  87829. #elif defined(__clang__)
  87830. "sbcs r5, r6\n\t"
  87831. #else
  87832. "sbc r5, r6\n\t"
  87833. #endif
  87834. "stm %[a]!, {r5}\n\t"
  87835. "ldm %[m]!, {r6}\n\t"
  87836. #ifdef WOLFSSL_KEIL
  87837. "ands r6, r6, r7\n\t"
  87838. #elif defined(__clang__)
  87839. "ands r6, r7\n\t"
  87840. #else
  87841. "and r6, r7\n\t"
  87842. #endif
  87843. "ldr r5, [%[a], r4]\n\t"
  87844. #ifdef WOLFSSL_KEIL
  87845. "sbcs r5, r5, r6\n\t"
  87846. #elif defined(__clang__)
  87847. "sbcs r5, r6\n\t"
  87848. #else
  87849. "sbc r5, r6\n\t"
  87850. #endif
  87851. "stm %[a]!, {r5}\n\t"
  87852. "ldm %[m]!, {r6}\n\t"
  87853. #ifdef WOLFSSL_KEIL
  87854. "ands r6, r6, r7\n\t"
  87855. #elif defined(__clang__)
  87856. "ands r6, r7\n\t"
  87857. #else
  87858. "and r6, r7\n\t"
  87859. #endif
  87860. "ldr r5, [%[a], r4]\n\t"
  87861. #ifdef WOLFSSL_KEIL
  87862. "sbcs r5, r5, r6\n\t"
  87863. #elif defined(__clang__)
  87864. "sbcs r5, r6\n\t"
  87865. #else
  87866. "sbc r5, r6\n\t"
  87867. #endif
  87868. "stm %[a]!, {r5}\n\t"
  87869. "ldm %[m]!, {r6}\n\t"
  87870. #ifdef WOLFSSL_KEIL
  87871. "ands r6, r6, r7\n\t"
  87872. #elif defined(__clang__)
  87873. "ands r6, r7\n\t"
  87874. #else
  87875. "and r6, r7\n\t"
  87876. #endif
  87877. "ldr r5, [%[a], r4]\n\t"
  87878. #ifdef WOLFSSL_KEIL
  87879. "sbcs r5, r5, r6\n\t"
  87880. #elif defined(__clang__)
  87881. "sbcs r5, r6\n\t"
  87882. #else
  87883. "sbc r5, r6\n\t"
  87884. #endif
  87885. "stm %[a]!, {r5}\n\t"
  87886. "ldm %[m]!, {r6}\n\t"
  87887. #ifdef WOLFSSL_KEIL
  87888. "ands r6, r6, r7\n\t"
  87889. #elif defined(__clang__)
  87890. "ands r6, r7\n\t"
  87891. #else
  87892. "and r6, r7\n\t"
  87893. #endif
  87894. "ldr r5, [%[a], r4]\n\t"
  87895. #ifdef WOLFSSL_KEIL
  87896. "sbcs r5, r5, r6\n\t"
  87897. #elif defined(__clang__)
  87898. "sbcs r5, r6\n\t"
  87899. #else
  87900. "sbc r5, r6\n\t"
  87901. #endif
  87902. "stm %[a]!, {r5}\n\t"
  87903. "ldm %[m]!, {r6}\n\t"
  87904. #ifdef WOLFSSL_KEIL
  87905. "ands r6, r6, r7\n\t"
  87906. #elif defined(__clang__)
  87907. "ands r6, r7\n\t"
  87908. #else
  87909. "and r6, r7\n\t"
  87910. #endif
  87911. "ldr r5, [%[a], r4]\n\t"
  87912. #ifdef WOLFSSL_KEIL
  87913. "sbcs r5, r5, r6\n\t"
  87914. #elif defined(__clang__)
  87915. "sbcs r5, r6\n\t"
  87916. #else
  87917. "sbc r5, r6\n\t"
  87918. #endif
  87919. "stm %[a]!, {r5}\n\t"
  87920. "ldm %[m]!, {r6}\n\t"
  87921. #ifdef WOLFSSL_KEIL
  87922. "ands r6, r6, r7\n\t"
  87923. #elif defined(__clang__)
  87924. "ands r6, r7\n\t"
  87925. #else
  87926. "and r6, r7\n\t"
  87927. #endif
  87928. "ldr r5, [%[a], r4]\n\t"
  87929. #ifdef WOLFSSL_KEIL
  87930. "sbcs r5, r5, r6\n\t"
  87931. #elif defined(__clang__)
  87932. "sbcs r5, r6\n\t"
  87933. #else
  87934. "sbc r5, r6\n\t"
  87935. #endif
  87936. "stm %[a]!, {r5}\n\t"
  87937. "ldm %[m]!, {r6}\n\t"
  87938. #ifdef WOLFSSL_KEIL
  87939. "ands r6, r6, r7\n\t"
  87940. #elif defined(__clang__)
  87941. "ands r6, r7\n\t"
  87942. #else
  87943. "and r6, r7\n\t"
  87944. #endif
  87945. "ldr r5, [%[a], r4]\n\t"
  87946. #ifdef WOLFSSL_KEIL
  87947. "sbcs r5, r5, r6\n\t"
  87948. #elif defined(__clang__)
  87949. "sbcs r5, r6\n\t"
  87950. #else
  87951. "sbc r5, r6\n\t"
  87952. #endif
  87953. "stm %[a]!, {r5}\n\t"
  87954. "ldm %[m]!, {r6}\n\t"
  87955. #ifdef WOLFSSL_KEIL
  87956. "ands r6, r6, r7\n\t"
  87957. #elif defined(__clang__)
  87958. "ands r6, r7\n\t"
  87959. #else
  87960. "and r6, r7\n\t"
  87961. #endif
  87962. "ldr r5, [%[a], r4]\n\t"
  87963. #ifdef WOLFSSL_KEIL
  87964. "sbcs r5, r5, r6\n\t"
  87965. #elif defined(__clang__)
  87966. "sbcs r5, r6\n\t"
  87967. #else
  87968. "sbc r5, r6\n\t"
  87969. #endif
  87970. "stm %[a]!, {r5}\n\t"
  87971. "ldm %[m]!, {r6}\n\t"
  87972. #ifdef WOLFSSL_KEIL
  87973. "ands r6, r6, r7\n\t"
  87974. #elif defined(__clang__)
  87975. "ands r6, r7\n\t"
  87976. #else
  87977. "and r6, r7\n\t"
  87978. #endif
  87979. "ldr r5, [%[a], r4]\n\t"
  87980. #ifdef WOLFSSL_KEIL
  87981. "sbcs r5, r5, r6\n\t"
  87982. #elif defined(__clang__)
  87983. "sbcs r5, r6\n\t"
  87984. #else
  87985. "sbc r5, r6\n\t"
  87986. #endif
  87987. "stm %[a]!, {r5}\n\t"
  87988. "ldm %[m]!, {r6}\n\t"
  87989. #ifdef WOLFSSL_KEIL
  87990. "ands r6, r6, r7\n\t"
  87991. #elif defined(__clang__)
  87992. "ands r6, r7\n\t"
  87993. #else
  87994. "and r6, r7\n\t"
  87995. #endif
  87996. "ldr r5, [%[a], r4]\n\t"
  87997. #ifdef WOLFSSL_KEIL
  87998. "sbcs r5, r5, r6\n\t"
  87999. #elif defined(__clang__)
  88000. "sbcs r5, r6\n\t"
  88001. #else
  88002. "sbc r5, r6\n\t"
  88003. #endif
  88004. "stm %[a]!, {r5}\n\t"
  88005. "ldm %[m]!, {r6}\n\t"
  88006. #ifdef WOLFSSL_KEIL
  88007. "ands r6, r6, r7\n\t"
  88008. #elif defined(__clang__)
  88009. "ands r6, r7\n\t"
  88010. #else
  88011. "and r6, r7\n\t"
  88012. #endif
  88013. "ldr r5, [%[a], r4]\n\t"
  88014. #ifdef WOLFSSL_KEIL
  88015. "sbcs r5, r5, r6\n\t"
  88016. #elif defined(__clang__)
  88017. "sbcs r5, r6\n\t"
  88018. #else
  88019. "sbc r5, r6\n\t"
  88020. #endif
  88021. "stm %[a]!, {r5}\n\t"
  88022. "ldm %[m]!, {r6}\n\t"
  88023. #ifdef WOLFSSL_KEIL
  88024. "ands r6, r6, r7\n\t"
  88025. #elif defined(__clang__)
  88026. "ands r6, r7\n\t"
  88027. #else
  88028. "and r6, r7\n\t"
  88029. #endif
  88030. "ldr r5, [%[a], r4]\n\t"
  88031. #ifdef WOLFSSL_KEIL
  88032. "sbcs r5, r5, r6\n\t"
  88033. #elif defined(__clang__)
  88034. "sbcs r5, r6\n\t"
  88035. #else
  88036. "sbc r5, r6\n\t"
  88037. #endif
  88038. "stm %[a]!, {r5}\n\t"
  88039. "ldm %[m]!, {r6}\n\t"
  88040. #ifdef WOLFSSL_KEIL
  88041. "ands r6, r6, r7\n\t"
  88042. #elif defined(__clang__)
  88043. "ands r6, r7\n\t"
  88044. #else
  88045. "and r6, r7\n\t"
  88046. #endif
  88047. "ldr r5, [%[a], r4]\n\t"
  88048. #ifdef WOLFSSL_KEIL
  88049. "sbcs r5, r5, r6\n\t"
  88050. #elif defined(__clang__)
  88051. "sbcs r5, r6\n\t"
  88052. #else
  88053. "sbc r5, r6\n\t"
  88054. #endif
  88055. "stm %[a]!, {r5}\n\t"
  88056. "ldm %[m]!, {r6}\n\t"
  88057. #ifdef WOLFSSL_KEIL
  88058. "ands r6, r6, r7\n\t"
  88059. #elif defined(__clang__)
  88060. "ands r6, r7\n\t"
  88061. #else
  88062. "and r6, r7\n\t"
  88063. #endif
  88064. "ldr r5, [%[a], r4]\n\t"
  88065. #ifdef WOLFSSL_KEIL
  88066. "sbcs r5, r5, r6\n\t"
  88067. #elif defined(__clang__)
  88068. "sbcs r5, r6\n\t"
  88069. #else
  88070. "sbc r5, r6\n\t"
  88071. #endif
  88072. "stm %[a]!, {r5}\n\t"
  88073. "ldm %[m]!, {r6}\n\t"
  88074. #ifdef WOLFSSL_KEIL
  88075. "ands r6, r6, r7\n\t"
  88076. #elif defined(__clang__)
  88077. "ands r6, r7\n\t"
  88078. #else
  88079. "and r6, r7\n\t"
  88080. #endif
  88081. "ldr r5, [%[a], r4]\n\t"
  88082. #ifdef WOLFSSL_KEIL
  88083. "sbcs r5, r5, r6\n\t"
  88084. #elif defined(__clang__)
  88085. "sbcs r5, r6\n\t"
  88086. #else
  88087. "sbc r5, r6\n\t"
  88088. #endif
  88089. "stm %[a]!, {r5}\n\t"
  88090. "ldm %[m]!, {r6}\n\t"
  88091. #ifdef WOLFSSL_KEIL
  88092. "ands r6, r6, r7\n\t"
  88093. #elif defined(__clang__)
  88094. "ands r6, r7\n\t"
  88095. #else
  88096. "and r6, r7\n\t"
  88097. #endif
  88098. "ldr r5, [%[a], r4]\n\t"
  88099. #ifdef WOLFSSL_KEIL
  88100. "sbcs r5, r5, r6\n\t"
  88101. #elif defined(__clang__)
  88102. "sbcs r5, r6\n\t"
  88103. #else
  88104. "sbc r5, r6\n\t"
  88105. #endif
  88106. "stm %[a]!, {r5}\n\t"
  88107. "ldm %[m]!, {r6}\n\t"
  88108. #ifdef WOLFSSL_KEIL
  88109. "ands r6, r6, r7\n\t"
  88110. #elif defined(__clang__)
  88111. "ands r6, r7\n\t"
  88112. #else
  88113. "and r6, r7\n\t"
  88114. #endif
  88115. "ldr r5, [%[a], r4]\n\t"
  88116. #ifdef WOLFSSL_KEIL
  88117. "sbcs r5, r5, r6\n\t"
  88118. #elif defined(__clang__)
  88119. "sbcs r5, r6\n\t"
  88120. #else
  88121. "sbc r5, r6\n\t"
  88122. #endif
  88123. "stm %[a]!, {r5}\n\t"
  88124. "ldm %[m]!, {r6}\n\t"
  88125. #ifdef WOLFSSL_KEIL
  88126. "ands r6, r6, r7\n\t"
  88127. #elif defined(__clang__)
  88128. "ands r6, r7\n\t"
  88129. #else
  88130. "and r6, r7\n\t"
  88131. #endif
  88132. "ldr r5, [%[a], r4]\n\t"
  88133. #ifdef WOLFSSL_KEIL
  88134. "sbcs r5, r5, r6\n\t"
  88135. #elif defined(__clang__)
  88136. "sbcs r5, r6\n\t"
  88137. #else
  88138. "sbc r5, r6\n\t"
  88139. #endif
  88140. "stm %[a]!, {r5}\n\t"
  88141. "ldm %[m]!, {r6}\n\t"
  88142. #ifdef WOLFSSL_KEIL
  88143. "ands r6, r6, r7\n\t"
  88144. #elif defined(__clang__)
  88145. "ands r6, r7\n\t"
  88146. #else
  88147. "and r6, r7\n\t"
  88148. #endif
  88149. "ldr r5, [%[a], r4]\n\t"
  88150. #ifdef WOLFSSL_KEIL
  88151. "sbcs r5, r5, r6\n\t"
  88152. #elif defined(__clang__)
  88153. "sbcs r5, r6\n\t"
  88154. #else
  88155. "sbc r5, r6\n\t"
  88156. #endif
  88157. "stm %[a]!, {r5}\n\t"
  88158. "ldm %[m]!, {r6}\n\t"
  88159. #ifdef WOLFSSL_KEIL
  88160. "ands r6, r6, r7\n\t"
  88161. #elif defined(__clang__)
  88162. "ands r6, r7\n\t"
  88163. #else
  88164. "and r6, r7\n\t"
  88165. #endif
  88166. "ldr r5, [%[a], r4]\n\t"
  88167. #ifdef WOLFSSL_KEIL
  88168. "sbcs r5, r5, r6\n\t"
  88169. #elif defined(__clang__)
  88170. "sbcs r5, r6\n\t"
  88171. #else
  88172. "sbc r5, r6\n\t"
  88173. #endif
  88174. "stm %[a]!, {r5}\n\t"
  88175. "ldm %[m]!, {r6}\n\t"
  88176. #ifdef WOLFSSL_KEIL
  88177. "ands r6, r6, r7\n\t"
  88178. #elif defined(__clang__)
  88179. "ands r6, r7\n\t"
  88180. #else
  88181. "and r6, r7\n\t"
  88182. #endif
  88183. "ldr r5, [%[a], r4]\n\t"
  88184. #ifdef WOLFSSL_KEIL
  88185. "sbcs r5, r5, r6\n\t"
  88186. #elif defined(__clang__)
  88187. "sbcs r5, r6\n\t"
  88188. #else
  88189. "sbc r5, r6\n\t"
  88190. #endif
  88191. "stm %[a]!, {r5}\n\t"
  88192. "ldm %[m]!, {r6}\n\t"
  88193. #ifdef WOLFSSL_KEIL
  88194. "ands r6, r6, r7\n\t"
  88195. #elif defined(__clang__)
  88196. "ands r6, r7\n\t"
  88197. #else
  88198. "and r6, r7\n\t"
  88199. #endif
  88200. "ldr r5, [%[a], r4]\n\t"
  88201. #ifdef WOLFSSL_KEIL
  88202. "sbcs r5, r5, r6\n\t"
  88203. #elif defined(__clang__)
  88204. "sbcs r5, r6\n\t"
  88205. #else
  88206. "sbc r5, r6\n\t"
  88207. #endif
  88208. "stm %[a]!, {r5}\n\t"
  88209. "ldm %[m]!, {r6}\n\t"
  88210. #ifdef WOLFSSL_KEIL
  88211. "ands r6, r6, r7\n\t"
  88212. #elif defined(__clang__)
  88213. "ands r6, r7\n\t"
  88214. #else
  88215. "and r6, r7\n\t"
  88216. #endif
  88217. "ldr r5, [%[a], r4]\n\t"
  88218. #ifdef WOLFSSL_KEIL
  88219. "sbcs r5, r5, r6\n\t"
  88220. #elif defined(__clang__)
  88221. "sbcs r5, r6\n\t"
  88222. #else
  88223. "sbc r5, r6\n\t"
  88224. #endif
  88225. "stm %[a]!, {r5}\n\t"
  88226. "ldm %[m]!, {r6}\n\t"
  88227. #ifdef WOLFSSL_KEIL
  88228. "ands r6, r6, r7\n\t"
  88229. #elif defined(__clang__)
  88230. "ands r6, r7\n\t"
  88231. #else
  88232. "and r6, r7\n\t"
  88233. #endif
  88234. "ldr r5, [%[a], r4]\n\t"
  88235. #ifdef WOLFSSL_KEIL
  88236. "sbcs r5, r5, r6\n\t"
  88237. #elif defined(__clang__)
  88238. "sbcs r5, r6\n\t"
  88239. #else
  88240. "sbc r5, r6\n\t"
  88241. #endif
  88242. "stm %[a]!, {r5}\n\t"
  88243. "ldm %[m]!, {r6}\n\t"
  88244. #ifdef WOLFSSL_KEIL
  88245. "ands r6, r6, r7\n\t"
  88246. #elif defined(__clang__)
  88247. "ands r6, r7\n\t"
  88248. #else
  88249. "and r6, r7\n\t"
  88250. #endif
  88251. "ldr r5, [%[a], r4]\n\t"
  88252. #ifdef WOLFSSL_KEIL
  88253. "sbcs r5, r5, r6\n\t"
  88254. #elif defined(__clang__)
  88255. "sbcs r5, r6\n\t"
  88256. #else
  88257. "sbc r5, r6\n\t"
  88258. #endif
  88259. "stm %[a]!, {r5}\n\t"
  88260. "ldm %[m]!, {r6}\n\t"
  88261. #ifdef WOLFSSL_KEIL
  88262. "ands r6, r6, r7\n\t"
  88263. #elif defined(__clang__)
  88264. "ands r6, r7\n\t"
  88265. #else
  88266. "and r6, r7\n\t"
  88267. #endif
  88268. "ldr r5, [%[a], r4]\n\t"
  88269. #ifdef WOLFSSL_KEIL
  88270. "sbcs r5, r5, r6\n\t"
  88271. #elif defined(__clang__)
  88272. "sbcs r5, r6\n\t"
  88273. #else
  88274. "sbc r5, r6\n\t"
  88275. #endif
  88276. "stm %[a]!, {r5}\n\t"
  88277. "ldm %[m]!, {r6}\n\t"
  88278. #ifdef WOLFSSL_KEIL
  88279. "ands r6, r6, r7\n\t"
  88280. #elif defined(__clang__)
  88281. "ands r6, r7\n\t"
  88282. #else
  88283. "and r6, r7\n\t"
  88284. #endif
  88285. "ldr r5, [%[a], r4]\n\t"
  88286. #ifdef WOLFSSL_KEIL
  88287. "sbcs r5, r5, r6\n\t"
  88288. #elif defined(__clang__)
  88289. "sbcs r5, r6\n\t"
  88290. #else
  88291. "sbc r5, r6\n\t"
  88292. #endif
  88293. "stm %[a]!, {r5}\n\t"
  88294. "ldm %[m]!, {r6}\n\t"
  88295. #ifdef WOLFSSL_KEIL
  88296. "ands r6, r6, r7\n\t"
  88297. #elif defined(__clang__)
  88298. "ands r6, r7\n\t"
  88299. #else
  88300. "and r6, r7\n\t"
  88301. #endif
  88302. "ldr r5, [%[a], r4]\n\t"
  88303. #ifdef WOLFSSL_KEIL
  88304. "sbcs r5, r5, r6\n\t"
  88305. #elif defined(__clang__)
  88306. "sbcs r5, r6\n\t"
  88307. #else
  88308. "sbc r5, r6\n\t"
  88309. #endif
  88310. "stm %[a]!, {r5}\n\t"
  88311. "ldm %[m]!, {r6}\n\t"
  88312. #ifdef WOLFSSL_KEIL
  88313. "ands r6, r6, r7\n\t"
  88314. #elif defined(__clang__)
  88315. "ands r6, r7\n\t"
  88316. #else
  88317. "and r6, r7\n\t"
  88318. #endif
  88319. "ldr r5, [%[a], r4]\n\t"
  88320. #ifdef WOLFSSL_KEIL
  88321. "sbcs r5, r5, r6\n\t"
  88322. #elif defined(__clang__)
  88323. "sbcs r5, r6\n\t"
  88324. #else
  88325. "sbc r5, r6\n\t"
  88326. #endif
  88327. "stm %[a]!, {r5}\n\t"
  88328. "ldm %[m]!, {r6}\n\t"
  88329. #ifdef WOLFSSL_KEIL
  88330. "ands r6, r6, r7\n\t"
  88331. #elif defined(__clang__)
  88332. "ands r6, r7\n\t"
  88333. #else
  88334. "and r6, r7\n\t"
  88335. #endif
  88336. "ldr r5, [%[a], r4]\n\t"
  88337. #ifdef WOLFSSL_KEIL
  88338. "sbcs r5, r5, r6\n\t"
  88339. #elif defined(__clang__)
  88340. "sbcs r5, r6\n\t"
  88341. #else
  88342. "sbc r5, r6\n\t"
  88343. #endif
  88344. "stm %[a]!, {r5}\n\t"
  88345. "ldm %[m]!, {r6}\n\t"
  88346. #ifdef WOLFSSL_KEIL
  88347. "ands r6, r6, r7\n\t"
  88348. #elif defined(__clang__)
  88349. "ands r6, r7\n\t"
  88350. #else
  88351. "and r6, r7\n\t"
  88352. #endif
  88353. "ldr r5, [%[a], r4]\n\t"
  88354. #ifdef WOLFSSL_KEIL
  88355. "sbcs r5, r5, r6\n\t"
  88356. #elif defined(__clang__)
  88357. "sbcs r5, r6\n\t"
  88358. #else
  88359. "sbc r5, r6\n\t"
  88360. #endif
  88361. "stm %[a]!, {r5}\n\t"
  88362. "ldm %[m]!, {r6}\n\t"
  88363. #ifdef WOLFSSL_KEIL
  88364. "ands r6, r6, r7\n\t"
  88365. #elif defined(__clang__)
  88366. "ands r6, r7\n\t"
  88367. #else
  88368. "and r6, r7\n\t"
  88369. #endif
  88370. "ldr r5, [%[a], r4]\n\t"
  88371. #ifdef WOLFSSL_KEIL
  88372. "sbcs r5, r5, r6\n\t"
  88373. #elif defined(__clang__)
  88374. "sbcs r5, r6\n\t"
  88375. #else
  88376. "sbc r5, r6\n\t"
  88377. #endif
  88378. "stm %[a]!, {r5}\n\t"
  88379. "ldm %[m]!, {r6}\n\t"
  88380. #ifdef WOLFSSL_KEIL
  88381. "ands r6, r6, r7\n\t"
  88382. #elif defined(__clang__)
  88383. "ands r6, r7\n\t"
  88384. #else
  88385. "and r6, r7\n\t"
  88386. #endif
  88387. "ldr r5, [%[a], r4]\n\t"
  88388. #ifdef WOLFSSL_KEIL
  88389. "sbcs r5, r5, r6\n\t"
  88390. #elif defined(__clang__)
  88391. "sbcs r5, r6\n\t"
  88392. #else
  88393. "sbc r5, r6\n\t"
  88394. #endif
  88395. "stm %[a]!, {r5}\n\t"
  88396. "ldm %[m]!, {r6}\n\t"
  88397. #ifdef WOLFSSL_KEIL
  88398. "ands r6, r6, r7\n\t"
  88399. #elif defined(__clang__)
  88400. "ands r6, r7\n\t"
  88401. #else
  88402. "and r6, r7\n\t"
  88403. #endif
  88404. "ldr r5, [%[a], r4]\n\t"
  88405. #ifdef WOLFSSL_KEIL
  88406. "sbcs r5, r5, r6\n\t"
  88407. #elif defined(__clang__)
  88408. "sbcs r5, r6\n\t"
  88409. #else
  88410. "sbc r5, r6\n\t"
  88411. #endif
  88412. "stm %[a]!, {r5}\n\t"
  88413. "ldm %[m]!, {r6}\n\t"
  88414. #ifdef WOLFSSL_KEIL
  88415. "ands r6, r6, r7\n\t"
  88416. #elif defined(__clang__)
  88417. "ands r6, r7\n\t"
  88418. #else
  88419. "and r6, r7\n\t"
  88420. #endif
  88421. "ldr r5, [%[a], r4]\n\t"
  88422. #ifdef WOLFSSL_KEIL
  88423. "sbcs r5, r5, r6\n\t"
  88424. #elif defined(__clang__)
  88425. "sbcs r5, r6\n\t"
  88426. #else
  88427. "sbc r5, r6\n\t"
  88428. #endif
  88429. "stm %[a]!, {r5}\n\t"
  88430. "ldm %[m]!, {r6}\n\t"
  88431. #ifdef WOLFSSL_KEIL
  88432. "ands r6, r6, r7\n\t"
  88433. #elif defined(__clang__)
  88434. "ands r6, r7\n\t"
  88435. #else
  88436. "and r6, r7\n\t"
  88437. #endif
  88438. "ldr r5, [%[a], r4]\n\t"
  88439. #ifdef WOLFSSL_KEIL
  88440. "sbcs r5, r5, r6\n\t"
  88441. #elif defined(__clang__)
  88442. "sbcs r5, r6\n\t"
  88443. #else
  88444. "sbc r5, r6\n\t"
  88445. #endif
  88446. "stm %[a]!, {r5}\n\t"
  88447. "ldm %[m]!, {r6}\n\t"
  88448. #ifdef WOLFSSL_KEIL
  88449. "ands r6, r6, r7\n\t"
  88450. #elif defined(__clang__)
  88451. "ands r6, r7\n\t"
  88452. #else
  88453. "and r6, r7\n\t"
  88454. #endif
  88455. "ldr r5, [%[a], r4]\n\t"
  88456. #ifdef WOLFSSL_KEIL
  88457. "sbcs r5, r5, r6\n\t"
  88458. #elif defined(__clang__)
  88459. "sbcs r5, r6\n\t"
  88460. #else
  88461. "sbc r5, r6\n\t"
  88462. #endif
  88463. "stm %[a]!, {r5}\n\t"
  88464. "ldm %[m]!, {r6}\n\t"
  88465. #ifdef WOLFSSL_KEIL
  88466. "ands r6, r6, r7\n\t"
  88467. #elif defined(__clang__)
  88468. "ands r6, r7\n\t"
  88469. #else
  88470. "and r6, r7\n\t"
  88471. #endif
  88472. "ldr r5, [%[a], r4]\n\t"
  88473. #ifdef WOLFSSL_KEIL
  88474. "sbcs r5, r5, r6\n\t"
  88475. #elif defined(__clang__)
  88476. "sbcs r5, r6\n\t"
  88477. #else
  88478. "sbc r5, r6\n\t"
  88479. #endif
  88480. "stm %[a]!, {r5}\n\t"
  88481. "ldm %[m]!, {r6}\n\t"
  88482. #ifdef WOLFSSL_KEIL
  88483. "ands r6, r6, r7\n\t"
  88484. #elif defined(__clang__)
  88485. "ands r6, r7\n\t"
  88486. #else
  88487. "and r6, r7\n\t"
  88488. #endif
  88489. "ldr r5, [%[a], r4]\n\t"
  88490. #ifdef WOLFSSL_KEIL
  88491. "sbcs r5, r5, r6\n\t"
  88492. #elif defined(__clang__)
  88493. "sbcs r5, r6\n\t"
  88494. #else
  88495. "sbc r5, r6\n\t"
  88496. #endif
  88497. "stm %[a]!, {r5}\n\t"
  88498. "ldm %[m]!, {r6}\n\t"
  88499. #ifdef WOLFSSL_KEIL
  88500. "ands r6, r6, r7\n\t"
  88501. #elif defined(__clang__)
  88502. "ands r6, r7\n\t"
  88503. #else
  88504. "and r6, r7\n\t"
  88505. #endif
  88506. "ldr r5, [%[a], r4]\n\t"
  88507. #ifdef WOLFSSL_KEIL
  88508. "sbcs r5, r5, r6\n\t"
  88509. #elif defined(__clang__)
  88510. "sbcs r5, r6\n\t"
  88511. #else
  88512. "sbc r5, r6\n\t"
  88513. #endif
  88514. "stm %[a]!, {r5}\n\t"
  88515. "ldm %[m]!, {r6}\n\t"
  88516. #ifdef WOLFSSL_KEIL
  88517. "ands r6, r6, r7\n\t"
  88518. #elif defined(__clang__)
  88519. "ands r6, r7\n\t"
  88520. #else
  88521. "and r6, r7\n\t"
  88522. #endif
  88523. "ldr r5, [%[a], r4]\n\t"
  88524. #ifdef WOLFSSL_KEIL
  88525. "sbcs r5, r5, r6\n\t"
  88526. #elif defined(__clang__)
  88527. "sbcs r5, r6\n\t"
  88528. #else
  88529. "sbc r5, r6\n\t"
  88530. #endif
  88531. "stm %[a]!, {r5}\n\t"
  88532. "ldm %[m]!, {r6}\n\t"
  88533. #ifdef WOLFSSL_KEIL
  88534. "ands r6, r6, r7\n\t"
  88535. #elif defined(__clang__)
  88536. "ands r6, r7\n\t"
  88537. #else
  88538. "and r6, r7\n\t"
  88539. #endif
  88540. "ldr r5, [%[a], r4]\n\t"
  88541. #ifdef WOLFSSL_KEIL
  88542. "sbcs r5, r5, r6\n\t"
  88543. #elif defined(__clang__)
  88544. "sbcs r5, r6\n\t"
  88545. #else
  88546. "sbc r5, r6\n\t"
  88547. #endif
  88548. "stm %[a]!, {r5}\n\t"
  88549. "ldm %[m]!, {r6}\n\t"
  88550. #ifdef WOLFSSL_KEIL
  88551. "ands r6, r6, r7\n\t"
  88552. #elif defined(__clang__)
  88553. "ands r6, r7\n\t"
  88554. #else
  88555. "and r6, r7\n\t"
  88556. #endif
  88557. "ldr r5, [%[a], r4]\n\t"
  88558. #ifdef WOLFSSL_KEIL
  88559. "sbcs r5, r5, r6\n\t"
  88560. #elif defined(__clang__)
  88561. "sbcs r5, r6\n\t"
  88562. #else
  88563. "sbc r5, r6\n\t"
  88564. #endif
  88565. "stm %[a]!, {r5}\n\t"
  88566. "ldm %[m]!, {r6}\n\t"
  88567. #ifdef WOLFSSL_KEIL
  88568. "ands r6, r6, r7\n\t"
  88569. #elif defined(__clang__)
  88570. "ands r6, r7\n\t"
  88571. #else
  88572. "and r6, r7\n\t"
  88573. #endif
  88574. "ldr r5, [%[a], r4]\n\t"
  88575. #ifdef WOLFSSL_KEIL
  88576. "sbcs r5, r5, r6\n\t"
  88577. #elif defined(__clang__)
  88578. "sbcs r5, r6\n\t"
  88579. #else
  88580. "sbc r5, r6\n\t"
  88581. #endif
  88582. "stm %[a]!, {r5}\n\t"
  88583. "ldm %[m]!, {r6}\n\t"
  88584. #ifdef WOLFSSL_KEIL
  88585. "ands r6, r6, r7\n\t"
  88586. #elif defined(__clang__)
  88587. "ands r6, r7\n\t"
  88588. #else
  88589. "and r6, r7\n\t"
  88590. #endif
  88591. "ldr r5, [%[a], r4]\n\t"
  88592. #ifdef WOLFSSL_KEIL
  88593. "sbcs r5, r5, r6\n\t"
  88594. #elif defined(__clang__)
  88595. "sbcs r5, r6\n\t"
  88596. #else
  88597. "sbc r5, r6\n\t"
  88598. #endif
  88599. "stm %[a]!, {r5}\n\t"
  88600. "ldm %[m]!, {r6}\n\t"
  88601. #ifdef WOLFSSL_KEIL
  88602. "ands r6, r6, r7\n\t"
  88603. #elif defined(__clang__)
  88604. "ands r6, r7\n\t"
  88605. #else
  88606. "and r6, r7\n\t"
  88607. #endif
  88608. "ldr r5, [%[a], r4]\n\t"
  88609. #ifdef WOLFSSL_KEIL
  88610. "sbcs r5, r5, r6\n\t"
  88611. #elif defined(__clang__)
  88612. "sbcs r5, r6\n\t"
  88613. #else
  88614. "sbc r5, r6\n\t"
  88615. #endif
  88616. "stm %[a]!, {r5}\n\t"
  88617. "ldm %[m]!, {r6}\n\t"
  88618. #ifdef WOLFSSL_KEIL
  88619. "ands r6, r6, r7\n\t"
  88620. #elif defined(__clang__)
  88621. "ands r6, r7\n\t"
  88622. #else
  88623. "and r6, r7\n\t"
  88624. #endif
  88625. "ldr r5, [%[a], r4]\n\t"
  88626. #ifdef WOLFSSL_KEIL
  88627. "sbcs r5, r5, r6\n\t"
  88628. #elif defined(__clang__)
  88629. "sbcs r5, r6\n\t"
  88630. #else
  88631. "sbc r5, r6\n\t"
  88632. #endif
  88633. "stm %[a]!, {r5}\n\t"
  88634. "ldm %[m]!, {r6}\n\t"
  88635. #ifdef WOLFSSL_KEIL
  88636. "ands r6, r6, r7\n\t"
  88637. #elif defined(__clang__)
  88638. "ands r6, r7\n\t"
  88639. #else
  88640. "and r6, r7\n\t"
  88641. #endif
  88642. "ldr r5, [%[a], r4]\n\t"
  88643. #ifdef WOLFSSL_KEIL
  88644. "sbcs r5, r5, r6\n\t"
  88645. #elif defined(__clang__)
  88646. "sbcs r5, r6\n\t"
  88647. #else
  88648. "sbc r5, r6\n\t"
  88649. #endif
  88650. "stm %[a]!, {r5}\n\t"
  88651. "ldm %[m]!, {r6}\n\t"
  88652. #ifdef WOLFSSL_KEIL
  88653. "ands r6, r6, r7\n\t"
  88654. #elif defined(__clang__)
  88655. "ands r6, r7\n\t"
  88656. #else
  88657. "and r6, r7\n\t"
  88658. #endif
  88659. "ldr r5, [%[a], r4]\n\t"
  88660. #ifdef WOLFSSL_KEIL
  88661. "sbcs r5, r5, r6\n\t"
  88662. #elif defined(__clang__)
  88663. "sbcs r5, r6\n\t"
  88664. #else
  88665. "sbc r5, r6\n\t"
  88666. #endif
  88667. "stm %[a]!, {r5}\n\t"
  88668. "ldm %[m]!, {r6}\n\t"
  88669. #ifdef WOLFSSL_KEIL
  88670. "ands r6, r6, r7\n\t"
  88671. #elif defined(__clang__)
  88672. "ands r6, r7\n\t"
  88673. #else
  88674. "and r6, r7\n\t"
  88675. #endif
  88676. "ldr r5, [%[a], r4]\n\t"
  88677. #ifdef WOLFSSL_KEIL
  88678. "sbcs r5, r5, r6\n\t"
  88679. #elif defined(__clang__)
  88680. "sbcs r5, r6\n\t"
  88681. #else
  88682. "sbc r5, r6\n\t"
  88683. #endif
  88684. "stm %[a]!, {r5}\n\t"
  88685. "ldm %[m]!, {r6}\n\t"
  88686. #ifdef WOLFSSL_KEIL
  88687. "ands r6, r6, r7\n\t"
  88688. #elif defined(__clang__)
  88689. "ands r6, r7\n\t"
  88690. #else
  88691. "and r6, r7\n\t"
  88692. #endif
  88693. "ldr r5, [%[a], r4]\n\t"
  88694. #ifdef WOLFSSL_KEIL
  88695. "sbcs r5, r5, r6\n\t"
  88696. #elif defined(__clang__)
  88697. "sbcs r5, r6\n\t"
  88698. #else
  88699. "sbc r5, r6\n\t"
  88700. #endif
  88701. "stm %[a]!, {r5}\n\t"
  88702. "ldm %[m]!, {r6}\n\t"
  88703. #ifdef WOLFSSL_KEIL
  88704. "ands r6, r6, r7\n\t"
  88705. #elif defined(__clang__)
  88706. "ands r6, r7\n\t"
  88707. #else
  88708. "and r6, r7\n\t"
  88709. #endif
  88710. "ldr r5, [%[a], r4]\n\t"
  88711. #ifdef WOLFSSL_KEIL
  88712. "sbcs r5, r5, r6\n\t"
  88713. #elif defined(__clang__)
  88714. "sbcs r5, r6\n\t"
  88715. #else
  88716. "sbc r5, r6\n\t"
  88717. #endif
  88718. "stm %[a]!, {r5}\n\t"
  88719. "ldm %[m]!, {r6}\n\t"
  88720. #ifdef WOLFSSL_KEIL
  88721. "ands r6, r6, r7\n\t"
  88722. #elif defined(__clang__)
  88723. "ands r6, r7\n\t"
  88724. #else
  88725. "and r6, r7\n\t"
  88726. #endif
  88727. "ldr r5, [%[a], r4]\n\t"
  88728. #ifdef WOLFSSL_KEIL
  88729. "sbcs r5, r5, r6\n\t"
  88730. #elif defined(__clang__)
  88731. "sbcs r5, r6\n\t"
  88732. #else
  88733. "sbc r5, r6\n\t"
  88734. #endif
  88735. "stm %[a]!, {r5}\n\t"
  88736. "ldm %[m]!, {r6}\n\t"
  88737. #ifdef WOLFSSL_KEIL
  88738. "ands r6, r6, r7\n\t"
  88739. #elif defined(__clang__)
  88740. "ands r6, r7\n\t"
  88741. #else
  88742. "and r6, r7\n\t"
  88743. #endif
  88744. "ldr r5, [%[a], r4]\n\t"
  88745. #ifdef WOLFSSL_KEIL
  88746. "sbcs r5, r5, r6\n\t"
  88747. #elif defined(__clang__)
  88748. "sbcs r5, r6\n\t"
  88749. #else
  88750. "sbc r5, r6\n\t"
  88751. #endif
  88752. "stm %[a]!, {r5}\n\t"
  88753. "ldm %[m]!, {r6}\n\t"
  88754. #ifdef WOLFSSL_KEIL
  88755. "ands r6, r6, r7\n\t"
  88756. #elif defined(__clang__)
  88757. "ands r6, r7\n\t"
  88758. #else
  88759. "and r6, r7\n\t"
  88760. #endif
  88761. "ldr r5, [%[a], r4]\n\t"
  88762. #ifdef WOLFSSL_KEIL
  88763. "sbcs r5, r5, r6\n\t"
  88764. #elif defined(__clang__)
  88765. "sbcs r5, r6\n\t"
  88766. #else
  88767. "sbc r5, r6\n\t"
  88768. #endif
  88769. "stm %[a]!, {r5}\n\t"
  88770. "ldm %[m]!, {r6}\n\t"
  88771. #ifdef WOLFSSL_KEIL
  88772. "ands r6, r6, r7\n\t"
  88773. #elif defined(__clang__)
  88774. "ands r6, r7\n\t"
  88775. #else
  88776. "and r6, r7\n\t"
  88777. #endif
  88778. "ldr r5, [%[a], r4]\n\t"
  88779. #ifdef WOLFSSL_KEIL
  88780. "sbcs r5, r5, r6\n\t"
  88781. #elif defined(__clang__)
  88782. "sbcs r5, r6\n\t"
  88783. #else
  88784. "sbc r5, r6\n\t"
  88785. #endif
  88786. "stm %[a]!, {r5}\n\t"
  88787. "ldm %[m]!, {r6}\n\t"
  88788. #ifdef WOLFSSL_KEIL
  88789. "ands r6, r6, r7\n\t"
  88790. #elif defined(__clang__)
  88791. "ands r6, r7\n\t"
  88792. #else
  88793. "and r6, r7\n\t"
  88794. #endif
  88795. "ldr r5, [%[a], r4]\n\t"
  88796. #ifdef WOLFSSL_KEIL
  88797. "sbcs r5, r5, r6\n\t"
  88798. #elif defined(__clang__)
  88799. "sbcs r5, r6\n\t"
  88800. #else
  88801. "sbc r5, r6\n\t"
  88802. #endif
  88803. "stm %[a]!, {r5}\n\t"
  88804. "ldm %[m]!, {r6}\n\t"
  88805. #ifdef WOLFSSL_KEIL
  88806. "ands r6, r6, r7\n\t"
  88807. #elif defined(__clang__)
  88808. "ands r6, r7\n\t"
  88809. #else
  88810. "and r6, r7\n\t"
  88811. #endif
  88812. "ldr r5, [%[a], r4]\n\t"
  88813. #ifdef WOLFSSL_KEIL
  88814. "sbcs r5, r5, r6\n\t"
  88815. #elif defined(__clang__)
  88816. "sbcs r5, r6\n\t"
  88817. #else
  88818. "sbc r5, r6\n\t"
  88819. #endif
  88820. "stm %[a]!, {r5}\n\t"
  88821. "ldm %[m]!, {r6}\n\t"
  88822. #ifdef WOLFSSL_KEIL
  88823. "ands r6, r6, r7\n\t"
  88824. #elif defined(__clang__)
  88825. "ands r6, r7\n\t"
  88826. #else
  88827. "and r6, r7\n\t"
  88828. #endif
  88829. "ldr r5, [%[a], r4]\n\t"
  88830. #ifdef WOLFSSL_KEIL
  88831. "sbcs r5, r5, r6\n\t"
  88832. #elif defined(__clang__)
  88833. "sbcs r5, r6\n\t"
  88834. #else
  88835. "sbc r5, r6\n\t"
  88836. #endif
  88837. "stm %[a]!, {r5}\n\t"
  88838. "ldm %[m]!, {r6}\n\t"
  88839. #ifdef WOLFSSL_KEIL
  88840. "ands r6, r6, r7\n\t"
  88841. #elif defined(__clang__)
  88842. "ands r6, r7\n\t"
  88843. #else
  88844. "and r6, r7\n\t"
  88845. #endif
  88846. "ldr r5, [%[a], r4]\n\t"
  88847. #ifdef WOLFSSL_KEIL
  88848. "sbcs r5, r5, r6\n\t"
  88849. #elif defined(__clang__)
  88850. "sbcs r5, r6\n\t"
  88851. #else
  88852. "sbc r5, r6\n\t"
  88853. #endif
  88854. "stm %[a]!, {r5}\n\t"
  88855. "ldm %[m]!, {r6}\n\t"
  88856. #ifdef WOLFSSL_KEIL
  88857. "ands r6, r6, r7\n\t"
  88858. #elif defined(__clang__)
  88859. "ands r6, r7\n\t"
  88860. #else
  88861. "and r6, r7\n\t"
  88862. #endif
  88863. "ldr r5, [%[a], r4]\n\t"
  88864. #ifdef WOLFSSL_KEIL
  88865. "sbcs r5, r5, r6\n\t"
  88866. #elif defined(__clang__)
  88867. "sbcs r5, r6\n\t"
  88868. #else
  88869. "sbc r5, r6\n\t"
  88870. #endif
  88871. "stm %[a]!, {r5}\n\t"
  88872. "ldm %[m]!, {r6}\n\t"
  88873. #ifdef WOLFSSL_KEIL
  88874. "ands r6, r6, r7\n\t"
  88875. #elif defined(__clang__)
  88876. "ands r6, r7\n\t"
  88877. #else
  88878. "and r6, r7\n\t"
  88879. #endif
  88880. "ldr r5, [%[a], r4]\n\t"
  88881. #ifdef WOLFSSL_KEIL
  88882. "sbcs r5, r5, r6\n\t"
  88883. #elif defined(__clang__)
  88884. "sbcs r5, r6\n\t"
  88885. #else
  88886. "sbc r5, r6\n\t"
  88887. #endif
  88888. "stm %[a]!, {r5}\n\t"
  88889. "ldm %[m]!, {r6}\n\t"
  88890. #ifdef WOLFSSL_KEIL
  88891. "ands r6, r6, r7\n\t"
  88892. #elif defined(__clang__)
  88893. "ands r6, r7\n\t"
  88894. #else
  88895. "and r6, r7\n\t"
  88896. #endif
  88897. "ldr r5, [%[a], r4]\n\t"
  88898. #ifdef WOLFSSL_KEIL
  88899. "sbcs r5, r5, r6\n\t"
  88900. #elif defined(__clang__)
  88901. "sbcs r5, r6\n\t"
  88902. #else
  88903. "sbc r5, r6\n\t"
  88904. #endif
  88905. "stm %[a]!, {r5}\n\t"
  88906. "ldm %[m]!, {r6}\n\t"
  88907. #ifdef WOLFSSL_KEIL
  88908. "ands r6, r6, r7\n\t"
  88909. #elif defined(__clang__)
  88910. "ands r6, r7\n\t"
  88911. #else
  88912. "and r6, r7\n\t"
  88913. #endif
  88914. "ldr r5, [%[a], r4]\n\t"
  88915. #ifdef WOLFSSL_KEIL
  88916. "sbcs r5, r5, r6\n\t"
  88917. #elif defined(__clang__)
  88918. "sbcs r5, r6\n\t"
  88919. #else
  88920. "sbc r5, r6\n\t"
  88921. #endif
  88922. "stm %[a]!, {r5}\n\t"
  88923. "ldm %[m]!, {r6}\n\t"
  88924. #ifdef WOLFSSL_KEIL
  88925. "ands r6, r6, r7\n\t"
  88926. #elif defined(__clang__)
  88927. "ands r6, r7\n\t"
  88928. #else
  88929. "and r6, r7\n\t"
  88930. #endif
  88931. "ldr r5, [%[a], r4]\n\t"
  88932. #ifdef WOLFSSL_KEIL
  88933. "sbcs r5, r5, r6\n\t"
  88934. #elif defined(__clang__)
  88935. "sbcs r5, r6\n\t"
  88936. #else
  88937. "sbc r5, r6\n\t"
  88938. #endif
  88939. "stm %[a]!, {r5}\n\t"
  88940. "ldm %[m]!, {r6}\n\t"
  88941. #ifdef WOLFSSL_KEIL
  88942. "ands r6, r6, r7\n\t"
  88943. #elif defined(__clang__)
  88944. "ands r6, r7\n\t"
  88945. #else
  88946. "and r6, r7\n\t"
  88947. #endif
  88948. "ldr r5, [%[a], r4]\n\t"
  88949. #ifdef WOLFSSL_KEIL
  88950. "sbcs r5, r5, r6\n\t"
  88951. #elif defined(__clang__)
  88952. "sbcs r5, r6\n\t"
  88953. #else
  88954. "sbc r5, r6\n\t"
  88955. #endif
  88956. "stm %[a]!, {r5}\n\t"
  88957. "ldm %[m]!, {r6}\n\t"
  88958. #ifdef WOLFSSL_KEIL
  88959. "ands r6, r6, r7\n\t"
  88960. #elif defined(__clang__)
  88961. "ands r6, r7\n\t"
  88962. #else
  88963. "and r6, r7\n\t"
  88964. #endif
  88965. "ldr r5, [%[a], r4]\n\t"
  88966. #ifdef WOLFSSL_KEIL
  88967. "sbcs r5, r5, r6\n\t"
  88968. #elif defined(__clang__)
  88969. "sbcs r5, r6\n\t"
  88970. #else
  88971. "sbc r5, r6\n\t"
  88972. #endif
  88973. "stm %[a]!, {r5}\n\t"
  88974. "ldm %[m]!, {r6}\n\t"
  88975. #ifdef WOLFSSL_KEIL
  88976. "ands r6, r6, r7\n\t"
  88977. #elif defined(__clang__)
  88978. "ands r6, r7\n\t"
  88979. #else
  88980. "and r6, r7\n\t"
  88981. #endif
  88982. "ldr r5, [%[a], r4]\n\t"
  88983. #ifdef WOLFSSL_KEIL
  88984. "sbcs r5, r5, r6\n\t"
  88985. #elif defined(__clang__)
  88986. "sbcs r5, r6\n\t"
  88987. #else
  88988. "sbc r5, r6\n\t"
  88989. #endif
  88990. "stm %[a]!, {r5}\n\t"
  88991. "ldm %[m]!, {r6}\n\t"
  88992. #ifdef WOLFSSL_KEIL
  88993. "ands r6, r6, r7\n\t"
  88994. #elif defined(__clang__)
  88995. "ands r6, r7\n\t"
  88996. #else
  88997. "and r6, r7\n\t"
  88998. #endif
  88999. "ldr r5, [%[a], r4]\n\t"
  89000. #ifdef WOLFSSL_KEIL
  89001. "sbcs r5, r5, r6\n\t"
  89002. #elif defined(__clang__)
  89003. "sbcs r5, r6\n\t"
  89004. #else
  89005. "sbc r5, r6\n\t"
  89006. #endif
  89007. "stm %[a]!, {r5}\n\t"
  89008. "ldm %[m]!, {r6}\n\t"
  89009. #ifdef WOLFSSL_KEIL
  89010. "ands r6, r6, r7\n\t"
  89011. #elif defined(__clang__)
  89012. "ands r6, r7\n\t"
  89013. #else
  89014. "and r6, r7\n\t"
  89015. #endif
  89016. "ldr r5, [%[a], r4]\n\t"
  89017. #ifdef WOLFSSL_KEIL
  89018. "sbcs r5, r5, r6\n\t"
  89019. #elif defined(__clang__)
  89020. "sbcs r5, r6\n\t"
  89021. #else
  89022. "sbc r5, r6\n\t"
  89023. #endif
  89024. "stm %[a]!, {r5}\n\t"
  89025. "ldm %[m]!, {r6}\n\t"
  89026. #ifdef WOLFSSL_KEIL
  89027. "ands r6, r6, r7\n\t"
  89028. #elif defined(__clang__)
  89029. "ands r6, r7\n\t"
  89030. #else
  89031. "and r6, r7\n\t"
  89032. #endif
  89033. "ldr r5, [%[a], r4]\n\t"
  89034. #ifdef WOLFSSL_KEIL
  89035. "sbcs r5, r5, r6\n\t"
  89036. #elif defined(__clang__)
  89037. "sbcs r5, r6\n\t"
  89038. #else
  89039. "sbc r5, r6\n\t"
  89040. #endif
  89041. "stm %[a]!, {r5}\n\t"
  89042. "ldm %[m]!, {r6}\n\t"
  89043. #ifdef WOLFSSL_KEIL
  89044. "ands r6, r6, r7\n\t"
  89045. #elif defined(__clang__)
  89046. "ands r6, r7\n\t"
  89047. #else
  89048. "and r6, r7\n\t"
  89049. #endif
  89050. "ldr r5, [%[a], r4]\n\t"
  89051. #ifdef WOLFSSL_KEIL
  89052. "sbcs r5, r5, r6\n\t"
  89053. #elif defined(__clang__)
  89054. "sbcs r5, r6\n\t"
  89055. #else
  89056. "sbc r5, r6\n\t"
  89057. #endif
  89058. "stm %[a]!, {r5}\n\t"
  89059. "ldm %[m]!, {r6}\n\t"
  89060. #ifdef WOLFSSL_KEIL
  89061. "ands r6, r6, r7\n\t"
  89062. #elif defined(__clang__)
  89063. "ands r6, r7\n\t"
  89064. #else
  89065. "and r6, r7\n\t"
  89066. #endif
  89067. "ldr r5, [%[a], r4]\n\t"
  89068. #ifdef WOLFSSL_KEIL
  89069. "sbcs r5, r5, r6\n\t"
  89070. #elif defined(__clang__)
  89071. "sbcs r5, r6\n\t"
  89072. #else
  89073. "sbc r5, r6\n\t"
  89074. #endif
  89075. "stm %[a]!, {r5}\n\t"
  89076. "ldm %[m]!, {r6}\n\t"
  89077. #ifdef WOLFSSL_KEIL
  89078. "ands r6, r6, r7\n\t"
  89079. #elif defined(__clang__)
  89080. "ands r6, r7\n\t"
  89081. #else
  89082. "and r6, r7\n\t"
  89083. #endif
  89084. "ldr r5, [%[a], r4]\n\t"
  89085. #ifdef WOLFSSL_KEIL
  89086. "sbcs r5, r5, r6\n\t"
  89087. #elif defined(__clang__)
  89088. "sbcs r5, r6\n\t"
  89089. #else
  89090. "sbc r5, r6\n\t"
  89091. #endif
  89092. "stm %[a]!, {r5}\n\t"
  89093. "ldm %[m]!, {r6}\n\t"
  89094. #ifdef WOLFSSL_KEIL
  89095. "ands r6, r6, r7\n\t"
  89096. #elif defined(__clang__)
  89097. "ands r6, r7\n\t"
  89098. #else
  89099. "and r6, r7\n\t"
  89100. #endif
  89101. "ldr r5, [%[a], r4]\n\t"
  89102. #ifdef WOLFSSL_KEIL
  89103. "sbcs r5, r5, r6\n\t"
  89104. #elif defined(__clang__)
  89105. "sbcs r5, r6\n\t"
  89106. #else
  89107. "sbc r5, r6\n\t"
  89108. #endif
  89109. "stm %[a]!, {r5}\n\t"
  89110. "ldm %[m]!, {r6}\n\t"
  89111. #ifdef WOLFSSL_KEIL
  89112. "ands r6, r6, r7\n\t"
  89113. #elif defined(__clang__)
  89114. "ands r6, r7\n\t"
  89115. #else
  89116. "and r6, r7\n\t"
  89117. #endif
  89118. "ldr r5, [%[a], r4]\n\t"
  89119. #ifdef WOLFSSL_KEIL
  89120. "sbcs r5, r5, r6\n\t"
  89121. #elif defined(__clang__)
  89122. "sbcs r5, r6\n\t"
  89123. #else
  89124. "sbc r5, r6\n\t"
  89125. #endif
  89126. "stm %[a]!, {r5}\n\t"
  89127. "ldm %[m]!, {r6}\n\t"
  89128. #ifdef WOLFSSL_KEIL
  89129. "ands r6, r6, r7\n\t"
  89130. #elif defined(__clang__)
  89131. "ands r6, r7\n\t"
  89132. #else
  89133. "and r6, r7\n\t"
  89134. #endif
  89135. "ldr r5, [%[a], r4]\n\t"
  89136. #ifdef WOLFSSL_KEIL
  89137. "sbcs r5, r5, r6\n\t"
  89138. #elif defined(__clang__)
  89139. "sbcs r5, r6\n\t"
  89140. #else
  89141. "sbc r5, r6\n\t"
  89142. #endif
  89143. "stm %[a]!, {r5}\n\t"
  89144. "ldm %[m]!, {r6}\n\t"
  89145. #ifdef WOLFSSL_KEIL
  89146. "ands r6, r6, r7\n\t"
  89147. #elif defined(__clang__)
  89148. "ands r6, r7\n\t"
  89149. #else
  89150. "and r6, r7\n\t"
  89151. #endif
  89152. "ldr r5, [%[a], r4]\n\t"
  89153. #ifdef WOLFSSL_KEIL
  89154. "sbcs r5, r5, r6\n\t"
  89155. #elif defined(__clang__)
  89156. "sbcs r5, r6\n\t"
  89157. #else
  89158. "sbc r5, r6\n\t"
  89159. #endif
  89160. "stm %[a]!, {r5}\n\t"
  89161. "ldm %[m]!, {r6}\n\t"
  89162. #ifdef WOLFSSL_KEIL
  89163. "ands r6, r6, r7\n\t"
  89164. #elif defined(__clang__)
  89165. "ands r6, r7\n\t"
  89166. #else
  89167. "and r6, r7\n\t"
  89168. #endif
  89169. "ldr r5, [%[a], r4]\n\t"
  89170. #ifdef WOLFSSL_KEIL
  89171. "sbcs r5, r5, r6\n\t"
  89172. #elif defined(__clang__)
  89173. "sbcs r5, r6\n\t"
  89174. #else
  89175. "sbc r5, r6\n\t"
  89176. #endif
  89177. "stm %[a]!, {r5}\n\t"
  89178. "ldm %[m]!, {r6}\n\t"
  89179. #ifdef WOLFSSL_KEIL
  89180. "ands r6, r6, r7\n\t"
  89181. #elif defined(__clang__)
  89182. "ands r6, r7\n\t"
  89183. #else
  89184. "and r6, r7\n\t"
  89185. #endif
  89186. "ldr r5, [%[a], r4]\n\t"
  89187. #ifdef WOLFSSL_KEIL
  89188. "sbcs r5, r5, r6\n\t"
  89189. #elif defined(__clang__)
  89190. "sbcs r5, r6\n\t"
  89191. #else
  89192. "sbc r5, r6\n\t"
  89193. #endif
  89194. "stm %[a]!, {r5}\n\t"
  89195. "ldm %[m]!, {r6}\n\t"
  89196. #ifdef WOLFSSL_KEIL
  89197. "ands r6, r6, r7\n\t"
  89198. #elif defined(__clang__)
  89199. "ands r6, r7\n\t"
  89200. #else
  89201. "and r6, r7\n\t"
  89202. #endif
  89203. "ldr r5, [%[a], r4]\n\t"
  89204. #ifdef WOLFSSL_KEIL
  89205. "sbcs r5, r5, r6\n\t"
  89206. #elif defined(__clang__)
  89207. "sbcs r5, r6\n\t"
  89208. #else
  89209. "sbc r5, r6\n\t"
  89210. #endif
  89211. "stm %[a]!, {r5}\n\t"
  89212. "ldm %[m]!, {r6}\n\t"
  89213. #ifdef WOLFSSL_KEIL
  89214. "ands r6, r6, r7\n\t"
  89215. #elif defined(__clang__)
  89216. "ands r6, r7\n\t"
  89217. #else
  89218. "and r6, r7\n\t"
  89219. #endif
  89220. "ldr r5, [%[a], r4]\n\t"
  89221. #ifdef WOLFSSL_KEIL
  89222. "sbcs r5, r5, r6\n\t"
  89223. #elif defined(__clang__)
  89224. "sbcs r5, r6\n\t"
  89225. #else
  89226. "sbc r5, r6\n\t"
  89227. #endif
  89228. "stm %[a]!, {r5}\n\t"
  89229. "ldm %[m]!, {r6}\n\t"
  89230. #ifdef WOLFSSL_KEIL
  89231. "ands r6, r6, r7\n\t"
  89232. #elif defined(__clang__)
  89233. "ands r6, r7\n\t"
  89234. #else
  89235. "and r6, r7\n\t"
  89236. #endif
  89237. "ldr r5, [%[a], r4]\n\t"
  89238. #ifdef WOLFSSL_KEIL
  89239. "sbcs r5, r5, r6\n\t"
  89240. #elif defined(__clang__)
  89241. "sbcs r5, r6\n\t"
  89242. #else
  89243. "sbc r5, r6\n\t"
  89244. #endif
  89245. "stm %[a]!, {r5}\n\t"
  89246. "ldm %[m]!, {r6}\n\t"
  89247. #ifdef WOLFSSL_KEIL
  89248. "ands r6, r6, r7\n\t"
  89249. #elif defined(__clang__)
  89250. "ands r6, r7\n\t"
  89251. #else
  89252. "and r6, r7\n\t"
  89253. #endif
  89254. "ldr r5, [%[a], r4]\n\t"
  89255. #ifdef WOLFSSL_KEIL
  89256. "sbcs r5, r5, r6\n\t"
  89257. #elif defined(__clang__)
  89258. "sbcs r5, r6\n\t"
  89259. #else
  89260. "sbc r5, r6\n\t"
  89261. #endif
  89262. "stm %[a]!, {r5}\n\t"
  89263. "ldm %[m]!, {r6}\n\t"
  89264. #ifdef WOLFSSL_KEIL
  89265. "ands r6, r6, r7\n\t"
  89266. #elif defined(__clang__)
  89267. "ands r6, r7\n\t"
  89268. #else
  89269. "and r6, r7\n\t"
  89270. #endif
  89271. "ldr r5, [%[a], r4]\n\t"
  89272. #ifdef WOLFSSL_KEIL
  89273. "sbcs r5, r5, r6\n\t"
  89274. #elif defined(__clang__)
  89275. "sbcs r5, r6\n\t"
  89276. #else
  89277. "sbc r5, r6\n\t"
  89278. #endif
  89279. "stm %[a]!, {r5}\n\t"
  89280. "ldm %[m]!, {r6}\n\t"
  89281. #ifdef WOLFSSL_KEIL
  89282. "ands r6, r6, r7\n\t"
  89283. #elif defined(__clang__)
  89284. "ands r6, r7\n\t"
  89285. #else
  89286. "and r6, r7\n\t"
  89287. #endif
  89288. "ldr r5, [%[a], r4]\n\t"
  89289. #ifdef WOLFSSL_KEIL
  89290. "sbcs r5, r5, r6\n\t"
  89291. #elif defined(__clang__)
  89292. "sbcs r5, r6\n\t"
  89293. #else
  89294. "sbc r5, r6\n\t"
  89295. #endif
  89296. "stm %[a]!, {r5}\n\t"
  89297. "ldm %[m]!, {r6}\n\t"
  89298. #ifdef WOLFSSL_KEIL
  89299. "ands r6, r6, r7\n\t"
  89300. #elif defined(__clang__)
  89301. "ands r6, r7\n\t"
  89302. #else
  89303. "and r6, r7\n\t"
  89304. #endif
  89305. "ldr r5, [%[a], r4]\n\t"
  89306. #ifdef WOLFSSL_KEIL
  89307. "sbcs r5, r5, r6\n\t"
  89308. #elif defined(__clang__)
  89309. "sbcs r5, r6\n\t"
  89310. #else
  89311. "sbc r5, r6\n\t"
  89312. #endif
  89313. "stm %[a]!, {r5}\n\t"
  89314. "ldm %[m]!, {r6}\n\t"
  89315. #ifdef WOLFSSL_KEIL
  89316. "ands r6, r6, r7\n\t"
  89317. #elif defined(__clang__)
  89318. "ands r6, r7\n\t"
  89319. #else
  89320. "and r6, r7\n\t"
  89321. #endif
  89322. "ldr r5, [%[a], r4]\n\t"
  89323. #ifdef WOLFSSL_KEIL
  89324. "sbcs r5, r5, r6\n\t"
  89325. #elif defined(__clang__)
  89326. "sbcs r5, r6\n\t"
  89327. #else
  89328. "sbc r5, r6\n\t"
  89329. #endif
  89330. "stm %[a]!, {r5}\n\t"
  89331. "ldm %[m]!, {r6}\n\t"
  89332. #ifdef WOLFSSL_KEIL
  89333. "ands r6, r6, r7\n\t"
  89334. #elif defined(__clang__)
  89335. "ands r6, r7\n\t"
  89336. #else
  89337. "and r6, r7\n\t"
  89338. #endif
  89339. "ldr r5, [%[a], r4]\n\t"
  89340. #ifdef WOLFSSL_KEIL
  89341. "sbcs r5, r5, r6\n\t"
  89342. #elif defined(__clang__)
  89343. "sbcs r5, r6\n\t"
  89344. #else
  89345. "sbc r5, r6\n\t"
  89346. #endif
  89347. "stm %[a]!, {r5}\n\t"
  89348. "ldm %[m]!, {r6}\n\t"
  89349. #ifdef WOLFSSL_KEIL
  89350. "ands r6, r6, r7\n\t"
  89351. #elif defined(__clang__)
  89352. "ands r6, r7\n\t"
  89353. #else
  89354. "and r6, r7\n\t"
  89355. #endif
  89356. "ldr r5, [%[a], r4]\n\t"
  89357. #ifdef WOLFSSL_KEIL
  89358. "sbcs r5, r5, r6\n\t"
  89359. #elif defined(__clang__)
  89360. "sbcs r5, r6\n\t"
  89361. #else
  89362. "sbc r5, r6\n\t"
  89363. #endif
  89364. "stm %[a]!, {r5}\n\t"
  89365. "ldm %[m]!, {r6}\n\t"
  89366. #ifdef WOLFSSL_KEIL
  89367. "ands r6, r6, r7\n\t"
  89368. #elif defined(__clang__)
  89369. "ands r6, r7\n\t"
  89370. #else
  89371. "and r6, r7\n\t"
  89372. #endif
  89373. "ldr r5, [%[a], r4]\n\t"
  89374. #ifdef WOLFSSL_KEIL
  89375. "sbcs r5, r5, r6\n\t"
  89376. #elif defined(__clang__)
  89377. "sbcs r5, r6\n\t"
  89378. #else
  89379. "sbc r5, r6\n\t"
  89380. #endif
  89381. "stm %[a]!, {r5}\n\t"
  89382. "ldm %[m]!, {r6}\n\t"
  89383. #ifdef WOLFSSL_KEIL
  89384. "ands r6, r6, r7\n\t"
  89385. #elif defined(__clang__)
  89386. "ands r6, r7\n\t"
  89387. #else
  89388. "and r6, r7\n\t"
  89389. #endif
  89390. "ldr r5, [%[a], r4]\n\t"
  89391. #ifdef WOLFSSL_KEIL
  89392. "sbcs r5, r5, r6\n\t"
  89393. #elif defined(__clang__)
  89394. "sbcs r5, r6\n\t"
  89395. #else
  89396. "sbc r5, r6\n\t"
  89397. #endif
  89398. "stm %[a]!, {r5}\n\t"
  89399. "ldm %[m]!, {r6}\n\t"
  89400. #ifdef WOLFSSL_KEIL
  89401. "ands r6, r6, r7\n\t"
  89402. #elif defined(__clang__)
  89403. "ands r6, r7\n\t"
  89404. #else
  89405. "and r6, r7\n\t"
  89406. #endif
  89407. "ldr r5, [%[a], r4]\n\t"
  89408. #ifdef WOLFSSL_KEIL
  89409. "sbcs r5, r5, r6\n\t"
  89410. #elif defined(__clang__)
  89411. "sbcs r5, r6\n\t"
  89412. #else
  89413. "sbc r5, r6\n\t"
  89414. #endif
  89415. "stm %[a]!, {r5}\n\t"
  89416. "ldm %[m]!, {r6}\n\t"
  89417. #ifdef WOLFSSL_KEIL
  89418. "ands r6, r6, r7\n\t"
  89419. #elif defined(__clang__)
  89420. "ands r6, r7\n\t"
  89421. #else
  89422. "and r6, r7\n\t"
  89423. #endif
  89424. "ldr r5, [%[a], r4]\n\t"
  89425. #ifdef WOLFSSL_KEIL
  89426. "sbcs r5, r5, r6\n\t"
  89427. #elif defined(__clang__)
  89428. "sbcs r5, r6\n\t"
  89429. #else
  89430. "sbc r5, r6\n\t"
  89431. #endif
  89432. "stm %[a]!, {r5}\n\t"
  89433. "ldm %[m]!, {r6}\n\t"
  89434. #ifdef WOLFSSL_KEIL
  89435. "ands r6, r6, r7\n\t"
  89436. #elif defined(__clang__)
  89437. "ands r6, r7\n\t"
  89438. #else
  89439. "and r6, r7\n\t"
  89440. #endif
  89441. "ldr r5, [%[a], r4]\n\t"
  89442. #ifdef WOLFSSL_KEIL
  89443. "sbcs r5, r5, r6\n\t"
  89444. #elif defined(__clang__)
  89445. "sbcs r5, r6\n\t"
  89446. #else
  89447. "sbc r5, r6\n\t"
  89448. #endif
  89449. "stm %[a]!, {r5}\n\t"
  89450. "ldm %[m]!, {r6}\n\t"
  89451. #ifdef WOLFSSL_KEIL
  89452. "ands r6, r6, r7\n\t"
  89453. #elif defined(__clang__)
  89454. "ands r6, r7\n\t"
  89455. #else
  89456. "and r6, r7\n\t"
  89457. #endif
  89458. "ldr r5, [%[a], r4]\n\t"
  89459. #ifdef WOLFSSL_KEIL
  89460. "sbcs r5, r5, r6\n\t"
  89461. #elif defined(__clang__)
  89462. "sbcs r5, r6\n\t"
  89463. #else
  89464. "sbc r5, r6\n\t"
  89465. #endif
  89466. "stm %[a]!, {r5}\n\t"
  89467. "ldm %[m]!, {r6}\n\t"
  89468. #ifdef WOLFSSL_KEIL
  89469. "ands r6, r6, r7\n\t"
  89470. #elif defined(__clang__)
  89471. "ands r6, r7\n\t"
  89472. #else
  89473. "and r6, r7\n\t"
  89474. #endif
  89475. "ldr r5, [%[a], r4]\n\t"
  89476. #ifdef WOLFSSL_KEIL
  89477. "sbcs r5, r5, r6\n\t"
  89478. #elif defined(__clang__)
  89479. "sbcs r5, r6\n\t"
  89480. #else
  89481. "sbc r5, r6\n\t"
  89482. #endif
  89483. "stm %[a]!, {r5}\n\t"
  89484. "ldm %[m]!, {r6}\n\t"
  89485. #ifdef WOLFSSL_KEIL
  89486. "ands r6, r6, r7\n\t"
  89487. #elif defined(__clang__)
  89488. "ands r6, r7\n\t"
  89489. #else
  89490. "and r6, r7\n\t"
  89491. #endif
  89492. "ldr r5, [%[a], r4]\n\t"
  89493. #ifdef WOLFSSL_KEIL
  89494. "sbcs r5, r5, r6\n\t"
  89495. #elif defined(__clang__)
  89496. "sbcs r5, r6\n\t"
  89497. #else
  89498. "sbc r5, r6\n\t"
  89499. #endif
  89500. "stm %[a]!, {r5}\n\t"
  89501. "ldm %[m]!, {r6}\n\t"
  89502. #ifdef WOLFSSL_KEIL
  89503. "ands r6, r6, r7\n\t"
  89504. #elif defined(__clang__)
  89505. "ands r6, r7\n\t"
  89506. #else
  89507. "and r6, r7\n\t"
  89508. #endif
  89509. "ldr r5, [%[a], r4]\n\t"
  89510. #ifdef WOLFSSL_KEIL
  89511. "sbcs r5, r5, r6\n\t"
  89512. #elif defined(__clang__)
  89513. "sbcs r5, r6\n\t"
  89514. #else
  89515. "sbc r5, r6\n\t"
  89516. #endif
  89517. "stm %[a]!, {r5}\n\t"
  89518. "ldm %[m]!, {r6}\n\t"
  89519. #ifdef WOLFSSL_KEIL
  89520. "ands r6, r6, r7\n\t"
  89521. #elif defined(__clang__)
  89522. "ands r6, r7\n\t"
  89523. #else
  89524. "and r6, r7\n\t"
  89525. #endif
  89526. "ldr r5, [%[a], r4]\n\t"
  89527. #ifdef WOLFSSL_KEIL
  89528. "sbcs r5, r5, r6\n\t"
  89529. #elif defined(__clang__)
  89530. "sbcs r5, r6\n\t"
  89531. #else
  89532. "sbc r5, r6\n\t"
  89533. #endif
  89534. "stm %[a]!, {r5}\n\t"
  89535. "ldm %[m]!, {r6}\n\t"
  89536. #ifdef WOLFSSL_KEIL
  89537. "ands r6, r6, r7\n\t"
  89538. #elif defined(__clang__)
  89539. "ands r6, r7\n\t"
  89540. #else
  89541. "and r6, r7\n\t"
  89542. #endif
  89543. "ldr r5, [%[a], r4]\n\t"
  89544. #ifdef WOLFSSL_KEIL
  89545. "sbcs r5, r5, r6\n\t"
  89546. #elif defined(__clang__)
  89547. "sbcs r5, r6\n\t"
  89548. #else
  89549. "sbc r5, r6\n\t"
  89550. #endif
  89551. "stm %[a]!, {r5}\n\t"
  89552. "ldm %[m]!, {r6}\n\t"
  89553. #ifdef WOLFSSL_KEIL
  89554. "ands r6, r6, r7\n\t"
  89555. #elif defined(__clang__)
  89556. "ands r6, r7\n\t"
  89557. #else
  89558. "and r6, r7\n\t"
  89559. #endif
  89560. "ldr r5, [%[a], r4]\n\t"
  89561. #ifdef WOLFSSL_KEIL
  89562. "sbcs r5, r5, r6\n\t"
  89563. #elif defined(__clang__)
  89564. "sbcs r5, r6\n\t"
  89565. #else
  89566. "sbc r5, r6\n\t"
  89567. #endif
  89568. "stm %[a]!, {r5}\n\t"
  89569. "ldm %[m]!, {r6}\n\t"
  89570. #ifdef WOLFSSL_KEIL
  89571. "ands r6, r6, r7\n\t"
  89572. #elif defined(__clang__)
  89573. "ands r6, r7\n\t"
  89574. #else
  89575. "and r6, r7\n\t"
  89576. #endif
  89577. "ldr r5, [%[a], r4]\n\t"
  89578. #ifdef WOLFSSL_KEIL
  89579. "sbcs r5, r5, r6\n\t"
  89580. #elif defined(__clang__)
  89581. "sbcs r5, r6\n\t"
  89582. #else
  89583. "sbc r5, r6\n\t"
  89584. #endif
  89585. "stm %[a]!, {r5}\n\t"
  89586. "ldm %[m]!, {r6}\n\t"
  89587. #ifdef WOLFSSL_KEIL
  89588. "ands r6, r6, r7\n\t"
  89589. #elif defined(__clang__)
  89590. "ands r6, r7\n\t"
  89591. #else
  89592. "and r6, r7\n\t"
  89593. #endif
  89594. "ldr r5, [%[a], r4]\n\t"
  89595. #ifdef WOLFSSL_KEIL
  89596. "sbcs r5, r5, r6\n\t"
  89597. #elif defined(__clang__)
  89598. "sbcs r5, r6\n\t"
  89599. #else
  89600. "sbc r5, r6\n\t"
  89601. #endif
  89602. "stm %[a]!, {r5}\n\t"
  89603. "ldm %[m]!, {r6}\n\t"
  89604. #ifdef WOLFSSL_KEIL
  89605. "ands r6, r6, r7\n\t"
  89606. #elif defined(__clang__)
  89607. "ands r6, r7\n\t"
  89608. #else
  89609. "and r6, r7\n\t"
  89610. #endif
  89611. "ldr r5, [%[a], r4]\n\t"
  89612. #ifdef WOLFSSL_KEIL
  89613. "sbcs r5, r5, r6\n\t"
  89614. #elif defined(__clang__)
  89615. "sbcs r5, r6\n\t"
  89616. #else
  89617. "sbc r5, r6\n\t"
  89618. #endif
  89619. "stm %[a]!, {r5}\n\t"
  89620. "ldm %[m]!, {r6}\n\t"
  89621. #ifdef WOLFSSL_KEIL
  89622. "ands r6, r6, r7\n\t"
  89623. #elif defined(__clang__)
  89624. "ands r6, r7\n\t"
  89625. #else
  89626. "and r6, r7\n\t"
  89627. #endif
  89628. "ldr r5, [%[a], r4]\n\t"
  89629. #ifdef WOLFSSL_KEIL
  89630. "sbcs r5, r5, r6\n\t"
  89631. #elif defined(__clang__)
  89632. "sbcs r5, r6\n\t"
  89633. #else
  89634. "sbc r5, r6\n\t"
  89635. #endif
  89636. "stm %[a]!, {r5}\n\t"
  89637. "ldm %[m]!, {r6}\n\t"
  89638. #ifdef WOLFSSL_KEIL
  89639. "ands r6, r6, r7\n\t"
  89640. #elif defined(__clang__)
  89641. "ands r6, r7\n\t"
  89642. #else
  89643. "and r6, r7\n\t"
  89644. #endif
  89645. "ldr r5, [%[a], r4]\n\t"
  89646. #ifdef WOLFSSL_KEIL
  89647. "sbcs r5, r5, r6\n\t"
  89648. #elif defined(__clang__)
  89649. "sbcs r5, r6\n\t"
  89650. #else
  89651. "sbc r5, r6\n\t"
  89652. #endif
  89653. "stm %[a]!, {r5}\n\t"
  89654. "ldm %[m]!, {r6}\n\t"
  89655. #ifdef WOLFSSL_KEIL
  89656. "ands r6, r6, r7\n\t"
  89657. #elif defined(__clang__)
  89658. "ands r6, r7\n\t"
  89659. #else
  89660. "and r6, r7\n\t"
  89661. #endif
  89662. "ldr r5, [%[a], r4]\n\t"
  89663. #ifdef WOLFSSL_KEIL
  89664. "sbcs r5, r5, r6\n\t"
  89665. #elif defined(__clang__)
  89666. "sbcs r5, r6\n\t"
  89667. #else
  89668. "sbc r5, r6\n\t"
  89669. #endif
  89670. "stm %[a]!, {r5}\n\t"
  89671. "ldm %[m]!, {r6}\n\t"
  89672. #ifdef WOLFSSL_KEIL
  89673. "ands r6, r6, r7\n\t"
  89674. #elif defined(__clang__)
  89675. "ands r6, r7\n\t"
  89676. #else
  89677. "and r6, r7\n\t"
  89678. #endif
  89679. "ldr r5, [%[a], r4]\n\t"
  89680. #ifdef WOLFSSL_KEIL
  89681. "sbcs r5, r5, r6\n\t"
  89682. #elif defined(__clang__)
  89683. "sbcs r5, r6\n\t"
  89684. #else
  89685. "sbc r5, r6\n\t"
  89686. #endif
  89687. "stm %[a]!, {r5}\n\t"
  89688. "ldm %[m]!, {r6}\n\t"
  89689. #ifdef WOLFSSL_KEIL
  89690. "ands r6, r6, r7\n\t"
  89691. #elif defined(__clang__)
  89692. "ands r6, r7\n\t"
  89693. #else
  89694. "and r6, r7\n\t"
  89695. #endif
  89696. "ldr r5, [%[a], r4]\n\t"
  89697. #ifdef WOLFSSL_KEIL
  89698. "sbcs r5, r5, r6\n\t"
  89699. #elif defined(__clang__)
  89700. "sbcs r5, r6\n\t"
  89701. #else
  89702. "sbc r5, r6\n\t"
  89703. #endif
  89704. "stm %[a]!, {r5}\n\t"
  89705. "ldm %[m]!, {r6}\n\t"
  89706. #ifdef WOLFSSL_KEIL
  89707. "ands r6, r6, r7\n\t"
  89708. #elif defined(__clang__)
  89709. "ands r6, r7\n\t"
  89710. #else
  89711. "and r6, r7\n\t"
  89712. #endif
  89713. "ldr r5, [%[a], r4]\n\t"
  89714. #ifdef WOLFSSL_KEIL
  89715. "sbcs r5, r5, r6\n\t"
  89716. #elif defined(__clang__)
  89717. "sbcs r5, r6\n\t"
  89718. #else
  89719. "sbc r5, r6\n\t"
  89720. #endif
  89721. "stm %[a]!, {r5}\n\t"
  89722. #endif /* WOLFSSL_SP_LARGE_CODE */
  89723. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  89724. :
  89725. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  89726. );
  89727. }
  89728. /* Multiply two Montgomery form numbers mod the modulus (prime).
  89729. * (r = a * b mod m)
  89730. *
  89731. * r Result of multiplication.
  89732. * a First number to multiply in Montgomery form.
  89733. * b Second number to multiply in Montgomery form.
  89734. * m Modulus (prime).
  89735. * mp Montgomery multiplier.
  89736. */
  89737. SP_NOINLINE static void sp_4096_mont_mul_128(sp_digit* r, const sp_digit* a,
  89738. const sp_digit* b, const sp_digit* m, sp_digit mp)
  89739. {
  89740. sp_4096_mul_128(r, a, b);
  89741. sp_4096_mont_reduce_128(r, m, mp);
  89742. }
  89743. /* Square the Montgomery form number. (r = a * a mod m)
  89744. *
  89745. * r Result of squaring.
  89746. * a Number to square in Montgomery form.
  89747. * m Modulus (prime).
  89748. * mp Montgomery multiplier.
  89749. */
  89750. SP_NOINLINE static void sp_4096_mont_sqr_128(sp_digit* r, const sp_digit* a,
  89751. const sp_digit* m, sp_digit mp)
  89752. {
  89753. sp_4096_sqr_128(r, a);
  89754. sp_4096_mont_reduce_128(r, m, mp);
  89755. }
  89756. #ifdef WOLFSSL_SP_SMALL
  89757. /* Sub b from a into r. (r = a - b)
  89758. *
  89759. * r A single precision integer.
  89760. * a A single precision integer.
  89761. * b A single precision integer.
  89762. */
  89763. SP_NOINLINE static sp_digit sp_4096_sub_128(sp_digit* r, const sp_digit* a,
  89764. const sp_digit* b)
  89765. {
  89766. __asm__ __volatile__ (
  89767. "movs r6, %[a]\n\t"
  89768. "movs r3, #0\n\t"
  89769. "movs r5, #2\n\t"
  89770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89771. "lsls r5, r5, #8\n\t"
  89772. #else
  89773. "lsl r5, r5, #8\n\t"
  89774. #endif
  89775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89776. "adds r6, r6, r5\n\t"
  89777. #else
  89778. "add r6, r6, r5\n\t"
  89779. #endif
  89780. "\n"
  89781. "L_sp_4096_sub_128_word_%=:\n\t"
  89782. "movs r5, #0\n\t"
  89783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89784. "subs r5, r5, r3\n\t"
  89785. #else
  89786. "sub r5, r5, r3\n\t"
  89787. #endif
  89788. "ldr r4, [%[a]]\n\t"
  89789. "ldr r5, [%[b]]\n\t"
  89790. #ifdef WOLFSSL_KEIL
  89791. "sbcs r4, r4, r5\n\t"
  89792. #elif defined(__clang__)
  89793. "sbcs r4, r5\n\t"
  89794. #else
  89795. "sbc r4, r5\n\t"
  89796. #endif
  89797. "str r4, [%[r]]\n\t"
  89798. #ifdef WOLFSSL_KEIL
  89799. "sbcs r3, r3, r3\n\t"
  89800. #elif defined(__clang__)
  89801. "sbcs r3, r3\n\t"
  89802. #else
  89803. "sbc r3, r3\n\t"
  89804. #endif
  89805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89806. "adds %[a], %[a], #4\n\t"
  89807. #else
  89808. "add %[a], %[a], #4\n\t"
  89809. #endif
  89810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89811. "adds %[b], %[b], #4\n\t"
  89812. #else
  89813. "add %[b], %[b], #4\n\t"
  89814. #endif
  89815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89816. "adds %[r], %[r], #4\n\t"
  89817. #else
  89818. "add %[r], %[r], #4\n\t"
  89819. #endif
  89820. "cmp %[a], r6\n\t"
  89821. "bne L_sp_4096_sub_128_word_%=\n\t"
  89822. "movs %[r], r3\n\t"
  89823. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  89824. :
  89825. : "memory", "r3", "r4", "r5", "r6"
  89826. );
  89827. return (uint32_t)(size_t)r;
  89828. }
  89829. #else
  89830. /* Sub b from a into r. (r = a - b)
  89831. *
  89832. * r A single precision integer.
  89833. * a A single precision integer.
  89834. * b A single precision integer.
  89835. */
  89836. SP_NOINLINE static sp_digit sp_4096_sub_128(sp_digit* r, const sp_digit* a,
  89837. const sp_digit* b)
  89838. {
  89839. __asm__ __volatile__ (
  89840. "ldm %[b]!, {r5, r6}\n\t"
  89841. "ldm %[a]!, {r3, r4}\n\t"
  89842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89843. "subs r3, r3, r5\n\t"
  89844. #else
  89845. "sub r3, r3, r5\n\t"
  89846. #endif
  89847. #ifdef WOLFSSL_KEIL
  89848. "sbcs r4, r4, r6\n\t"
  89849. #elif defined(__clang__)
  89850. "sbcs r4, r6\n\t"
  89851. #else
  89852. "sbc r4, r6\n\t"
  89853. #endif
  89854. "stm %[r]!, {r3, r4}\n\t"
  89855. "ldm %[b]!, {r5, r6}\n\t"
  89856. "ldm %[a]!, {r3, r4}\n\t"
  89857. #ifdef WOLFSSL_KEIL
  89858. "sbcs r3, r3, r5\n\t"
  89859. #elif defined(__clang__)
  89860. "sbcs r3, r5\n\t"
  89861. #else
  89862. "sbc r3, r5\n\t"
  89863. #endif
  89864. #ifdef WOLFSSL_KEIL
  89865. "sbcs r4, r4, r6\n\t"
  89866. #elif defined(__clang__)
  89867. "sbcs r4, r6\n\t"
  89868. #else
  89869. "sbc r4, r6\n\t"
  89870. #endif
  89871. "stm %[r]!, {r3, r4}\n\t"
  89872. "ldm %[b]!, {r5, r6}\n\t"
  89873. "ldm %[a]!, {r3, r4}\n\t"
  89874. #ifdef WOLFSSL_KEIL
  89875. "sbcs r3, r3, r5\n\t"
  89876. #elif defined(__clang__)
  89877. "sbcs r3, r5\n\t"
  89878. #else
  89879. "sbc r3, r5\n\t"
  89880. #endif
  89881. #ifdef WOLFSSL_KEIL
  89882. "sbcs r4, r4, r6\n\t"
  89883. #elif defined(__clang__)
  89884. "sbcs r4, r6\n\t"
  89885. #else
  89886. "sbc r4, r6\n\t"
  89887. #endif
  89888. "stm %[r]!, {r3, r4}\n\t"
  89889. "ldm %[b]!, {r5, r6}\n\t"
  89890. "ldm %[a]!, {r3, r4}\n\t"
  89891. #ifdef WOLFSSL_KEIL
  89892. "sbcs r3, r3, r5\n\t"
  89893. #elif defined(__clang__)
  89894. "sbcs r3, r5\n\t"
  89895. #else
  89896. "sbc r3, r5\n\t"
  89897. #endif
  89898. #ifdef WOLFSSL_KEIL
  89899. "sbcs r4, r4, r6\n\t"
  89900. #elif defined(__clang__)
  89901. "sbcs r4, r6\n\t"
  89902. #else
  89903. "sbc r4, r6\n\t"
  89904. #endif
  89905. "stm %[r]!, {r3, r4}\n\t"
  89906. "ldm %[b]!, {r5, r6}\n\t"
  89907. "ldm %[a]!, {r3, r4}\n\t"
  89908. #ifdef WOLFSSL_KEIL
  89909. "sbcs r3, r3, r5\n\t"
  89910. #elif defined(__clang__)
  89911. "sbcs r3, r5\n\t"
  89912. #else
  89913. "sbc r3, r5\n\t"
  89914. #endif
  89915. #ifdef WOLFSSL_KEIL
  89916. "sbcs r4, r4, r6\n\t"
  89917. #elif defined(__clang__)
  89918. "sbcs r4, r6\n\t"
  89919. #else
  89920. "sbc r4, r6\n\t"
  89921. #endif
  89922. "stm %[r]!, {r3, r4}\n\t"
  89923. "ldm %[b]!, {r5, r6}\n\t"
  89924. "ldm %[a]!, {r3, r4}\n\t"
  89925. #ifdef WOLFSSL_KEIL
  89926. "sbcs r3, r3, r5\n\t"
  89927. #elif defined(__clang__)
  89928. "sbcs r3, r5\n\t"
  89929. #else
  89930. "sbc r3, r5\n\t"
  89931. #endif
  89932. #ifdef WOLFSSL_KEIL
  89933. "sbcs r4, r4, r6\n\t"
  89934. #elif defined(__clang__)
  89935. "sbcs r4, r6\n\t"
  89936. #else
  89937. "sbc r4, r6\n\t"
  89938. #endif
  89939. "stm %[r]!, {r3, r4}\n\t"
  89940. "ldm %[b]!, {r5, r6}\n\t"
  89941. "ldm %[a]!, {r3, r4}\n\t"
  89942. #ifdef WOLFSSL_KEIL
  89943. "sbcs r3, r3, r5\n\t"
  89944. #elif defined(__clang__)
  89945. "sbcs r3, r5\n\t"
  89946. #else
  89947. "sbc r3, r5\n\t"
  89948. #endif
  89949. #ifdef WOLFSSL_KEIL
  89950. "sbcs r4, r4, r6\n\t"
  89951. #elif defined(__clang__)
  89952. "sbcs r4, r6\n\t"
  89953. #else
  89954. "sbc r4, r6\n\t"
  89955. #endif
  89956. "stm %[r]!, {r3, r4}\n\t"
  89957. "ldm %[b]!, {r5, r6}\n\t"
  89958. "ldm %[a]!, {r3, r4}\n\t"
  89959. #ifdef WOLFSSL_KEIL
  89960. "sbcs r3, r3, r5\n\t"
  89961. #elif defined(__clang__)
  89962. "sbcs r3, r5\n\t"
  89963. #else
  89964. "sbc r3, r5\n\t"
  89965. #endif
  89966. #ifdef WOLFSSL_KEIL
  89967. "sbcs r4, r4, r6\n\t"
  89968. #elif defined(__clang__)
  89969. "sbcs r4, r6\n\t"
  89970. #else
  89971. "sbc r4, r6\n\t"
  89972. #endif
  89973. "stm %[r]!, {r3, r4}\n\t"
  89974. "ldm %[b]!, {r5, r6}\n\t"
  89975. "ldm %[a]!, {r3, r4}\n\t"
  89976. #ifdef WOLFSSL_KEIL
  89977. "sbcs r3, r3, r5\n\t"
  89978. #elif defined(__clang__)
  89979. "sbcs r3, r5\n\t"
  89980. #else
  89981. "sbc r3, r5\n\t"
  89982. #endif
  89983. #ifdef WOLFSSL_KEIL
  89984. "sbcs r4, r4, r6\n\t"
  89985. #elif defined(__clang__)
  89986. "sbcs r4, r6\n\t"
  89987. #else
  89988. "sbc r4, r6\n\t"
  89989. #endif
  89990. "stm %[r]!, {r3, r4}\n\t"
  89991. "ldm %[b]!, {r5, r6}\n\t"
  89992. "ldm %[a]!, {r3, r4}\n\t"
  89993. #ifdef WOLFSSL_KEIL
  89994. "sbcs r3, r3, r5\n\t"
  89995. #elif defined(__clang__)
  89996. "sbcs r3, r5\n\t"
  89997. #else
  89998. "sbc r3, r5\n\t"
  89999. #endif
  90000. #ifdef WOLFSSL_KEIL
  90001. "sbcs r4, r4, r6\n\t"
  90002. #elif defined(__clang__)
  90003. "sbcs r4, r6\n\t"
  90004. #else
  90005. "sbc r4, r6\n\t"
  90006. #endif
  90007. "stm %[r]!, {r3, r4}\n\t"
  90008. "ldm %[b]!, {r5, r6}\n\t"
  90009. "ldm %[a]!, {r3, r4}\n\t"
  90010. #ifdef WOLFSSL_KEIL
  90011. "sbcs r3, r3, r5\n\t"
  90012. #elif defined(__clang__)
  90013. "sbcs r3, r5\n\t"
  90014. #else
  90015. "sbc r3, r5\n\t"
  90016. #endif
  90017. #ifdef WOLFSSL_KEIL
  90018. "sbcs r4, r4, r6\n\t"
  90019. #elif defined(__clang__)
  90020. "sbcs r4, r6\n\t"
  90021. #else
  90022. "sbc r4, r6\n\t"
  90023. #endif
  90024. "stm %[r]!, {r3, r4}\n\t"
  90025. "ldm %[b]!, {r5, r6}\n\t"
  90026. "ldm %[a]!, {r3, r4}\n\t"
  90027. #ifdef WOLFSSL_KEIL
  90028. "sbcs r3, r3, r5\n\t"
  90029. #elif defined(__clang__)
  90030. "sbcs r3, r5\n\t"
  90031. #else
  90032. "sbc r3, r5\n\t"
  90033. #endif
  90034. #ifdef WOLFSSL_KEIL
  90035. "sbcs r4, r4, r6\n\t"
  90036. #elif defined(__clang__)
  90037. "sbcs r4, r6\n\t"
  90038. #else
  90039. "sbc r4, r6\n\t"
  90040. #endif
  90041. "stm %[r]!, {r3, r4}\n\t"
  90042. "ldm %[b]!, {r5, r6}\n\t"
  90043. "ldm %[a]!, {r3, r4}\n\t"
  90044. #ifdef WOLFSSL_KEIL
  90045. "sbcs r3, r3, r5\n\t"
  90046. #elif defined(__clang__)
  90047. "sbcs r3, r5\n\t"
  90048. #else
  90049. "sbc r3, r5\n\t"
  90050. #endif
  90051. #ifdef WOLFSSL_KEIL
  90052. "sbcs r4, r4, r6\n\t"
  90053. #elif defined(__clang__)
  90054. "sbcs r4, r6\n\t"
  90055. #else
  90056. "sbc r4, r6\n\t"
  90057. #endif
  90058. "stm %[r]!, {r3, r4}\n\t"
  90059. "ldm %[b]!, {r5, r6}\n\t"
  90060. "ldm %[a]!, {r3, r4}\n\t"
  90061. #ifdef WOLFSSL_KEIL
  90062. "sbcs r3, r3, r5\n\t"
  90063. #elif defined(__clang__)
  90064. "sbcs r3, r5\n\t"
  90065. #else
  90066. "sbc r3, r5\n\t"
  90067. #endif
  90068. #ifdef WOLFSSL_KEIL
  90069. "sbcs r4, r4, r6\n\t"
  90070. #elif defined(__clang__)
  90071. "sbcs r4, r6\n\t"
  90072. #else
  90073. "sbc r4, r6\n\t"
  90074. #endif
  90075. "stm %[r]!, {r3, r4}\n\t"
  90076. "ldm %[b]!, {r5, r6}\n\t"
  90077. "ldm %[a]!, {r3, r4}\n\t"
  90078. #ifdef WOLFSSL_KEIL
  90079. "sbcs r3, r3, r5\n\t"
  90080. #elif defined(__clang__)
  90081. "sbcs r3, r5\n\t"
  90082. #else
  90083. "sbc r3, r5\n\t"
  90084. #endif
  90085. #ifdef WOLFSSL_KEIL
  90086. "sbcs r4, r4, r6\n\t"
  90087. #elif defined(__clang__)
  90088. "sbcs r4, r6\n\t"
  90089. #else
  90090. "sbc r4, r6\n\t"
  90091. #endif
  90092. "stm %[r]!, {r3, r4}\n\t"
  90093. "ldm %[b]!, {r5, r6}\n\t"
  90094. "ldm %[a]!, {r3, r4}\n\t"
  90095. #ifdef WOLFSSL_KEIL
  90096. "sbcs r3, r3, r5\n\t"
  90097. #elif defined(__clang__)
  90098. "sbcs r3, r5\n\t"
  90099. #else
  90100. "sbc r3, r5\n\t"
  90101. #endif
  90102. #ifdef WOLFSSL_KEIL
  90103. "sbcs r4, r4, r6\n\t"
  90104. #elif defined(__clang__)
  90105. "sbcs r4, r6\n\t"
  90106. #else
  90107. "sbc r4, r6\n\t"
  90108. #endif
  90109. "stm %[r]!, {r3, r4}\n\t"
  90110. "ldm %[b]!, {r5, r6}\n\t"
  90111. "ldm %[a]!, {r3, r4}\n\t"
  90112. #ifdef WOLFSSL_KEIL
  90113. "sbcs r3, r3, r5\n\t"
  90114. #elif defined(__clang__)
  90115. "sbcs r3, r5\n\t"
  90116. #else
  90117. "sbc r3, r5\n\t"
  90118. #endif
  90119. #ifdef WOLFSSL_KEIL
  90120. "sbcs r4, r4, r6\n\t"
  90121. #elif defined(__clang__)
  90122. "sbcs r4, r6\n\t"
  90123. #else
  90124. "sbc r4, r6\n\t"
  90125. #endif
  90126. "stm %[r]!, {r3, r4}\n\t"
  90127. "ldm %[b]!, {r5, r6}\n\t"
  90128. "ldm %[a]!, {r3, r4}\n\t"
  90129. #ifdef WOLFSSL_KEIL
  90130. "sbcs r3, r3, r5\n\t"
  90131. #elif defined(__clang__)
  90132. "sbcs r3, r5\n\t"
  90133. #else
  90134. "sbc r3, r5\n\t"
  90135. #endif
  90136. #ifdef WOLFSSL_KEIL
  90137. "sbcs r4, r4, r6\n\t"
  90138. #elif defined(__clang__)
  90139. "sbcs r4, r6\n\t"
  90140. #else
  90141. "sbc r4, r6\n\t"
  90142. #endif
  90143. "stm %[r]!, {r3, r4}\n\t"
  90144. "ldm %[b]!, {r5, r6}\n\t"
  90145. "ldm %[a]!, {r3, r4}\n\t"
  90146. #ifdef WOLFSSL_KEIL
  90147. "sbcs r3, r3, r5\n\t"
  90148. #elif defined(__clang__)
  90149. "sbcs r3, r5\n\t"
  90150. #else
  90151. "sbc r3, r5\n\t"
  90152. #endif
  90153. #ifdef WOLFSSL_KEIL
  90154. "sbcs r4, r4, r6\n\t"
  90155. #elif defined(__clang__)
  90156. "sbcs r4, r6\n\t"
  90157. #else
  90158. "sbc r4, r6\n\t"
  90159. #endif
  90160. "stm %[r]!, {r3, r4}\n\t"
  90161. "ldm %[b]!, {r5, r6}\n\t"
  90162. "ldm %[a]!, {r3, r4}\n\t"
  90163. #ifdef WOLFSSL_KEIL
  90164. "sbcs r3, r3, r5\n\t"
  90165. #elif defined(__clang__)
  90166. "sbcs r3, r5\n\t"
  90167. #else
  90168. "sbc r3, r5\n\t"
  90169. #endif
  90170. #ifdef WOLFSSL_KEIL
  90171. "sbcs r4, r4, r6\n\t"
  90172. #elif defined(__clang__)
  90173. "sbcs r4, r6\n\t"
  90174. #else
  90175. "sbc r4, r6\n\t"
  90176. #endif
  90177. "stm %[r]!, {r3, r4}\n\t"
  90178. "ldm %[b]!, {r5, r6}\n\t"
  90179. "ldm %[a]!, {r3, r4}\n\t"
  90180. #ifdef WOLFSSL_KEIL
  90181. "sbcs r3, r3, r5\n\t"
  90182. #elif defined(__clang__)
  90183. "sbcs r3, r5\n\t"
  90184. #else
  90185. "sbc r3, r5\n\t"
  90186. #endif
  90187. #ifdef WOLFSSL_KEIL
  90188. "sbcs r4, r4, r6\n\t"
  90189. #elif defined(__clang__)
  90190. "sbcs r4, r6\n\t"
  90191. #else
  90192. "sbc r4, r6\n\t"
  90193. #endif
  90194. "stm %[r]!, {r3, r4}\n\t"
  90195. "ldm %[b]!, {r5, r6}\n\t"
  90196. "ldm %[a]!, {r3, r4}\n\t"
  90197. #ifdef WOLFSSL_KEIL
  90198. "sbcs r3, r3, r5\n\t"
  90199. #elif defined(__clang__)
  90200. "sbcs r3, r5\n\t"
  90201. #else
  90202. "sbc r3, r5\n\t"
  90203. #endif
  90204. #ifdef WOLFSSL_KEIL
  90205. "sbcs r4, r4, r6\n\t"
  90206. #elif defined(__clang__)
  90207. "sbcs r4, r6\n\t"
  90208. #else
  90209. "sbc r4, r6\n\t"
  90210. #endif
  90211. "stm %[r]!, {r3, r4}\n\t"
  90212. "ldm %[b]!, {r5, r6}\n\t"
  90213. "ldm %[a]!, {r3, r4}\n\t"
  90214. #ifdef WOLFSSL_KEIL
  90215. "sbcs r3, r3, r5\n\t"
  90216. #elif defined(__clang__)
  90217. "sbcs r3, r5\n\t"
  90218. #else
  90219. "sbc r3, r5\n\t"
  90220. #endif
  90221. #ifdef WOLFSSL_KEIL
  90222. "sbcs r4, r4, r6\n\t"
  90223. #elif defined(__clang__)
  90224. "sbcs r4, r6\n\t"
  90225. #else
  90226. "sbc r4, r6\n\t"
  90227. #endif
  90228. "stm %[r]!, {r3, r4}\n\t"
  90229. "ldm %[b]!, {r5, r6}\n\t"
  90230. "ldm %[a]!, {r3, r4}\n\t"
  90231. #ifdef WOLFSSL_KEIL
  90232. "sbcs r3, r3, r5\n\t"
  90233. #elif defined(__clang__)
  90234. "sbcs r3, r5\n\t"
  90235. #else
  90236. "sbc r3, r5\n\t"
  90237. #endif
  90238. #ifdef WOLFSSL_KEIL
  90239. "sbcs r4, r4, r6\n\t"
  90240. #elif defined(__clang__)
  90241. "sbcs r4, r6\n\t"
  90242. #else
  90243. "sbc r4, r6\n\t"
  90244. #endif
  90245. "stm %[r]!, {r3, r4}\n\t"
  90246. "ldm %[b]!, {r5, r6}\n\t"
  90247. "ldm %[a]!, {r3, r4}\n\t"
  90248. #ifdef WOLFSSL_KEIL
  90249. "sbcs r3, r3, r5\n\t"
  90250. #elif defined(__clang__)
  90251. "sbcs r3, r5\n\t"
  90252. #else
  90253. "sbc r3, r5\n\t"
  90254. #endif
  90255. #ifdef WOLFSSL_KEIL
  90256. "sbcs r4, r4, r6\n\t"
  90257. #elif defined(__clang__)
  90258. "sbcs r4, r6\n\t"
  90259. #else
  90260. "sbc r4, r6\n\t"
  90261. #endif
  90262. "stm %[r]!, {r3, r4}\n\t"
  90263. "ldm %[b]!, {r5, r6}\n\t"
  90264. "ldm %[a]!, {r3, r4}\n\t"
  90265. #ifdef WOLFSSL_KEIL
  90266. "sbcs r3, r3, r5\n\t"
  90267. #elif defined(__clang__)
  90268. "sbcs r3, r5\n\t"
  90269. #else
  90270. "sbc r3, r5\n\t"
  90271. #endif
  90272. #ifdef WOLFSSL_KEIL
  90273. "sbcs r4, r4, r6\n\t"
  90274. #elif defined(__clang__)
  90275. "sbcs r4, r6\n\t"
  90276. #else
  90277. "sbc r4, r6\n\t"
  90278. #endif
  90279. "stm %[r]!, {r3, r4}\n\t"
  90280. "ldm %[b]!, {r5, r6}\n\t"
  90281. "ldm %[a]!, {r3, r4}\n\t"
  90282. #ifdef WOLFSSL_KEIL
  90283. "sbcs r3, r3, r5\n\t"
  90284. #elif defined(__clang__)
  90285. "sbcs r3, r5\n\t"
  90286. #else
  90287. "sbc r3, r5\n\t"
  90288. #endif
  90289. #ifdef WOLFSSL_KEIL
  90290. "sbcs r4, r4, r6\n\t"
  90291. #elif defined(__clang__)
  90292. "sbcs r4, r6\n\t"
  90293. #else
  90294. "sbc r4, r6\n\t"
  90295. #endif
  90296. "stm %[r]!, {r3, r4}\n\t"
  90297. "ldm %[b]!, {r5, r6}\n\t"
  90298. "ldm %[a]!, {r3, r4}\n\t"
  90299. #ifdef WOLFSSL_KEIL
  90300. "sbcs r3, r3, r5\n\t"
  90301. #elif defined(__clang__)
  90302. "sbcs r3, r5\n\t"
  90303. #else
  90304. "sbc r3, r5\n\t"
  90305. #endif
  90306. #ifdef WOLFSSL_KEIL
  90307. "sbcs r4, r4, r6\n\t"
  90308. #elif defined(__clang__)
  90309. "sbcs r4, r6\n\t"
  90310. #else
  90311. "sbc r4, r6\n\t"
  90312. #endif
  90313. "stm %[r]!, {r3, r4}\n\t"
  90314. "ldm %[b]!, {r5, r6}\n\t"
  90315. "ldm %[a]!, {r3, r4}\n\t"
  90316. #ifdef WOLFSSL_KEIL
  90317. "sbcs r3, r3, r5\n\t"
  90318. #elif defined(__clang__)
  90319. "sbcs r3, r5\n\t"
  90320. #else
  90321. "sbc r3, r5\n\t"
  90322. #endif
  90323. #ifdef WOLFSSL_KEIL
  90324. "sbcs r4, r4, r6\n\t"
  90325. #elif defined(__clang__)
  90326. "sbcs r4, r6\n\t"
  90327. #else
  90328. "sbc r4, r6\n\t"
  90329. #endif
  90330. "stm %[r]!, {r3, r4}\n\t"
  90331. "ldm %[b]!, {r5, r6}\n\t"
  90332. "ldm %[a]!, {r3, r4}\n\t"
  90333. #ifdef WOLFSSL_KEIL
  90334. "sbcs r3, r3, r5\n\t"
  90335. #elif defined(__clang__)
  90336. "sbcs r3, r5\n\t"
  90337. #else
  90338. "sbc r3, r5\n\t"
  90339. #endif
  90340. #ifdef WOLFSSL_KEIL
  90341. "sbcs r4, r4, r6\n\t"
  90342. #elif defined(__clang__)
  90343. "sbcs r4, r6\n\t"
  90344. #else
  90345. "sbc r4, r6\n\t"
  90346. #endif
  90347. "stm %[r]!, {r3, r4}\n\t"
  90348. "ldm %[b]!, {r5, r6}\n\t"
  90349. "ldm %[a]!, {r3, r4}\n\t"
  90350. #ifdef WOLFSSL_KEIL
  90351. "sbcs r3, r3, r5\n\t"
  90352. #elif defined(__clang__)
  90353. "sbcs r3, r5\n\t"
  90354. #else
  90355. "sbc r3, r5\n\t"
  90356. #endif
  90357. #ifdef WOLFSSL_KEIL
  90358. "sbcs r4, r4, r6\n\t"
  90359. #elif defined(__clang__)
  90360. "sbcs r4, r6\n\t"
  90361. #else
  90362. "sbc r4, r6\n\t"
  90363. #endif
  90364. "stm %[r]!, {r3, r4}\n\t"
  90365. "ldm %[b]!, {r5, r6}\n\t"
  90366. "ldm %[a]!, {r3, r4}\n\t"
  90367. #ifdef WOLFSSL_KEIL
  90368. "sbcs r3, r3, r5\n\t"
  90369. #elif defined(__clang__)
  90370. "sbcs r3, r5\n\t"
  90371. #else
  90372. "sbc r3, r5\n\t"
  90373. #endif
  90374. #ifdef WOLFSSL_KEIL
  90375. "sbcs r4, r4, r6\n\t"
  90376. #elif defined(__clang__)
  90377. "sbcs r4, r6\n\t"
  90378. #else
  90379. "sbc r4, r6\n\t"
  90380. #endif
  90381. "stm %[r]!, {r3, r4}\n\t"
  90382. "ldm %[b]!, {r5, r6}\n\t"
  90383. "ldm %[a]!, {r3, r4}\n\t"
  90384. #ifdef WOLFSSL_KEIL
  90385. "sbcs r3, r3, r5\n\t"
  90386. #elif defined(__clang__)
  90387. "sbcs r3, r5\n\t"
  90388. #else
  90389. "sbc r3, r5\n\t"
  90390. #endif
  90391. #ifdef WOLFSSL_KEIL
  90392. "sbcs r4, r4, r6\n\t"
  90393. #elif defined(__clang__)
  90394. "sbcs r4, r6\n\t"
  90395. #else
  90396. "sbc r4, r6\n\t"
  90397. #endif
  90398. "stm %[r]!, {r3, r4}\n\t"
  90399. "ldm %[b]!, {r5, r6}\n\t"
  90400. "ldm %[a]!, {r3, r4}\n\t"
  90401. #ifdef WOLFSSL_KEIL
  90402. "sbcs r3, r3, r5\n\t"
  90403. #elif defined(__clang__)
  90404. "sbcs r3, r5\n\t"
  90405. #else
  90406. "sbc r3, r5\n\t"
  90407. #endif
  90408. #ifdef WOLFSSL_KEIL
  90409. "sbcs r4, r4, r6\n\t"
  90410. #elif defined(__clang__)
  90411. "sbcs r4, r6\n\t"
  90412. #else
  90413. "sbc r4, r6\n\t"
  90414. #endif
  90415. "stm %[r]!, {r3, r4}\n\t"
  90416. "ldm %[b]!, {r5, r6}\n\t"
  90417. "ldm %[a]!, {r3, r4}\n\t"
  90418. #ifdef WOLFSSL_KEIL
  90419. "sbcs r3, r3, r5\n\t"
  90420. #elif defined(__clang__)
  90421. "sbcs r3, r5\n\t"
  90422. #else
  90423. "sbc r3, r5\n\t"
  90424. #endif
  90425. #ifdef WOLFSSL_KEIL
  90426. "sbcs r4, r4, r6\n\t"
  90427. #elif defined(__clang__)
  90428. "sbcs r4, r6\n\t"
  90429. #else
  90430. "sbc r4, r6\n\t"
  90431. #endif
  90432. "stm %[r]!, {r3, r4}\n\t"
  90433. "ldm %[b]!, {r5, r6}\n\t"
  90434. "ldm %[a]!, {r3, r4}\n\t"
  90435. #ifdef WOLFSSL_KEIL
  90436. "sbcs r3, r3, r5\n\t"
  90437. #elif defined(__clang__)
  90438. "sbcs r3, r5\n\t"
  90439. #else
  90440. "sbc r3, r5\n\t"
  90441. #endif
  90442. #ifdef WOLFSSL_KEIL
  90443. "sbcs r4, r4, r6\n\t"
  90444. #elif defined(__clang__)
  90445. "sbcs r4, r6\n\t"
  90446. #else
  90447. "sbc r4, r6\n\t"
  90448. #endif
  90449. "stm %[r]!, {r3, r4}\n\t"
  90450. "ldm %[b]!, {r5, r6}\n\t"
  90451. "ldm %[a]!, {r3, r4}\n\t"
  90452. #ifdef WOLFSSL_KEIL
  90453. "sbcs r3, r3, r5\n\t"
  90454. #elif defined(__clang__)
  90455. "sbcs r3, r5\n\t"
  90456. #else
  90457. "sbc r3, r5\n\t"
  90458. #endif
  90459. #ifdef WOLFSSL_KEIL
  90460. "sbcs r4, r4, r6\n\t"
  90461. #elif defined(__clang__)
  90462. "sbcs r4, r6\n\t"
  90463. #else
  90464. "sbc r4, r6\n\t"
  90465. #endif
  90466. "stm %[r]!, {r3, r4}\n\t"
  90467. "ldm %[b]!, {r5, r6}\n\t"
  90468. "ldm %[a]!, {r3, r4}\n\t"
  90469. #ifdef WOLFSSL_KEIL
  90470. "sbcs r3, r3, r5\n\t"
  90471. #elif defined(__clang__)
  90472. "sbcs r3, r5\n\t"
  90473. #else
  90474. "sbc r3, r5\n\t"
  90475. #endif
  90476. #ifdef WOLFSSL_KEIL
  90477. "sbcs r4, r4, r6\n\t"
  90478. #elif defined(__clang__)
  90479. "sbcs r4, r6\n\t"
  90480. #else
  90481. "sbc r4, r6\n\t"
  90482. #endif
  90483. "stm %[r]!, {r3, r4}\n\t"
  90484. "ldm %[b]!, {r5, r6}\n\t"
  90485. "ldm %[a]!, {r3, r4}\n\t"
  90486. #ifdef WOLFSSL_KEIL
  90487. "sbcs r3, r3, r5\n\t"
  90488. #elif defined(__clang__)
  90489. "sbcs r3, r5\n\t"
  90490. #else
  90491. "sbc r3, r5\n\t"
  90492. #endif
  90493. #ifdef WOLFSSL_KEIL
  90494. "sbcs r4, r4, r6\n\t"
  90495. #elif defined(__clang__)
  90496. "sbcs r4, r6\n\t"
  90497. #else
  90498. "sbc r4, r6\n\t"
  90499. #endif
  90500. "stm %[r]!, {r3, r4}\n\t"
  90501. "ldm %[b]!, {r5, r6}\n\t"
  90502. "ldm %[a]!, {r3, r4}\n\t"
  90503. #ifdef WOLFSSL_KEIL
  90504. "sbcs r3, r3, r5\n\t"
  90505. #elif defined(__clang__)
  90506. "sbcs r3, r5\n\t"
  90507. #else
  90508. "sbc r3, r5\n\t"
  90509. #endif
  90510. #ifdef WOLFSSL_KEIL
  90511. "sbcs r4, r4, r6\n\t"
  90512. #elif defined(__clang__)
  90513. "sbcs r4, r6\n\t"
  90514. #else
  90515. "sbc r4, r6\n\t"
  90516. #endif
  90517. "stm %[r]!, {r3, r4}\n\t"
  90518. "ldm %[b]!, {r5, r6}\n\t"
  90519. "ldm %[a]!, {r3, r4}\n\t"
  90520. #ifdef WOLFSSL_KEIL
  90521. "sbcs r3, r3, r5\n\t"
  90522. #elif defined(__clang__)
  90523. "sbcs r3, r5\n\t"
  90524. #else
  90525. "sbc r3, r5\n\t"
  90526. #endif
  90527. #ifdef WOLFSSL_KEIL
  90528. "sbcs r4, r4, r6\n\t"
  90529. #elif defined(__clang__)
  90530. "sbcs r4, r6\n\t"
  90531. #else
  90532. "sbc r4, r6\n\t"
  90533. #endif
  90534. "stm %[r]!, {r3, r4}\n\t"
  90535. "ldm %[b]!, {r5, r6}\n\t"
  90536. "ldm %[a]!, {r3, r4}\n\t"
  90537. #ifdef WOLFSSL_KEIL
  90538. "sbcs r3, r3, r5\n\t"
  90539. #elif defined(__clang__)
  90540. "sbcs r3, r5\n\t"
  90541. #else
  90542. "sbc r3, r5\n\t"
  90543. #endif
  90544. #ifdef WOLFSSL_KEIL
  90545. "sbcs r4, r4, r6\n\t"
  90546. #elif defined(__clang__)
  90547. "sbcs r4, r6\n\t"
  90548. #else
  90549. "sbc r4, r6\n\t"
  90550. #endif
  90551. "stm %[r]!, {r3, r4}\n\t"
  90552. "ldm %[b]!, {r5, r6}\n\t"
  90553. "ldm %[a]!, {r3, r4}\n\t"
  90554. #ifdef WOLFSSL_KEIL
  90555. "sbcs r3, r3, r5\n\t"
  90556. #elif defined(__clang__)
  90557. "sbcs r3, r5\n\t"
  90558. #else
  90559. "sbc r3, r5\n\t"
  90560. #endif
  90561. #ifdef WOLFSSL_KEIL
  90562. "sbcs r4, r4, r6\n\t"
  90563. #elif defined(__clang__)
  90564. "sbcs r4, r6\n\t"
  90565. #else
  90566. "sbc r4, r6\n\t"
  90567. #endif
  90568. "stm %[r]!, {r3, r4}\n\t"
  90569. "ldm %[b]!, {r5, r6}\n\t"
  90570. "ldm %[a]!, {r3, r4}\n\t"
  90571. #ifdef WOLFSSL_KEIL
  90572. "sbcs r3, r3, r5\n\t"
  90573. #elif defined(__clang__)
  90574. "sbcs r3, r5\n\t"
  90575. #else
  90576. "sbc r3, r5\n\t"
  90577. #endif
  90578. #ifdef WOLFSSL_KEIL
  90579. "sbcs r4, r4, r6\n\t"
  90580. #elif defined(__clang__)
  90581. "sbcs r4, r6\n\t"
  90582. #else
  90583. "sbc r4, r6\n\t"
  90584. #endif
  90585. "stm %[r]!, {r3, r4}\n\t"
  90586. "ldm %[b]!, {r5, r6}\n\t"
  90587. "ldm %[a]!, {r3, r4}\n\t"
  90588. #ifdef WOLFSSL_KEIL
  90589. "sbcs r3, r3, r5\n\t"
  90590. #elif defined(__clang__)
  90591. "sbcs r3, r5\n\t"
  90592. #else
  90593. "sbc r3, r5\n\t"
  90594. #endif
  90595. #ifdef WOLFSSL_KEIL
  90596. "sbcs r4, r4, r6\n\t"
  90597. #elif defined(__clang__)
  90598. "sbcs r4, r6\n\t"
  90599. #else
  90600. "sbc r4, r6\n\t"
  90601. #endif
  90602. "stm %[r]!, {r3, r4}\n\t"
  90603. "ldm %[b]!, {r5, r6}\n\t"
  90604. "ldm %[a]!, {r3, r4}\n\t"
  90605. #ifdef WOLFSSL_KEIL
  90606. "sbcs r3, r3, r5\n\t"
  90607. #elif defined(__clang__)
  90608. "sbcs r3, r5\n\t"
  90609. #else
  90610. "sbc r3, r5\n\t"
  90611. #endif
  90612. #ifdef WOLFSSL_KEIL
  90613. "sbcs r4, r4, r6\n\t"
  90614. #elif defined(__clang__)
  90615. "sbcs r4, r6\n\t"
  90616. #else
  90617. "sbc r4, r6\n\t"
  90618. #endif
  90619. "stm %[r]!, {r3, r4}\n\t"
  90620. "ldm %[b]!, {r5, r6}\n\t"
  90621. "ldm %[a]!, {r3, r4}\n\t"
  90622. #ifdef WOLFSSL_KEIL
  90623. "sbcs r3, r3, r5\n\t"
  90624. #elif defined(__clang__)
  90625. "sbcs r3, r5\n\t"
  90626. #else
  90627. "sbc r3, r5\n\t"
  90628. #endif
  90629. #ifdef WOLFSSL_KEIL
  90630. "sbcs r4, r4, r6\n\t"
  90631. #elif defined(__clang__)
  90632. "sbcs r4, r6\n\t"
  90633. #else
  90634. "sbc r4, r6\n\t"
  90635. #endif
  90636. "stm %[r]!, {r3, r4}\n\t"
  90637. "ldm %[b]!, {r5, r6}\n\t"
  90638. "ldm %[a]!, {r3, r4}\n\t"
  90639. #ifdef WOLFSSL_KEIL
  90640. "sbcs r3, r3, r5\n\t"
  90641. #elif defined(__clang__)
  90642. "sbcs r3, r5\n\t"
  90643. #else
  90644. "sbc r3, r5\n\t"
  90645. #endif
  90646. #ifdef WOLFSSL_KEIL
  90647. "sbcs r4, r4, r6\n\t"
  90648. #elif defined(__clang__)
  90649. "sbcs r4, r6\n\t"
  90650. #else
  90651. "sbc r4, r6\n\t"
  90652. #endif
  90653. "stm %[r]!, {r3, r4}\n\t"
  90654. "ldm %[b]!, {r5, r6}\n\t"
  90655. "ldm %[a]!, {r3, r4}\n\t"
  90656. #ifdef WOLFSSL_KEIL
  90657. "sbcs r3, r3, r5\n\t"
  90658. #elif defined(__clang__)
  90659. "sbcs r3, r5\n\t"
  90660. #else
  90661. "sbc r3, r5\n\t"
  90662. #endif
  90663. #ifdef WOLFSSL_KEIL
  90664. "sbcs r4, r4, r6\n\t"
  90665. #elif defined(__clang__)
  90666. "sbcs r4, r6\n\t"
  90667. #else
  90668. "sbc r4, r6\n\t"
  90669. #endif
  90670. "stm %[r]!, {r3, r4}\n\t"
  90671. "ldm %[b]!, {r5, r6}\n\t"
  90672. "ldm %[a]!, {r3, r4}\n\t"
  90673. #ifdef WOLFSSL_KEIL
  90674. "sbcs r3, r3, r5\n\t"
  90675. #elif defined(__clang__)
  90676. "sbcs r3, r5\n\t"
  90677. #else
  90678. "sbc r3, r5\n\t"
  90679. #endif
  90680. #ifdef WOLFSSL_KEIL
  90681. "sbcs r4, r4, r6\n\t"
  90682. #elif defined(__clang__)
  90683. "sbcs r4, r6\n\t"
  90684. #else
  90685. "sbc r4, r6\n\t"
  90686. #endif
  90687. "stm %[r]!, {r3, r4}\n\t"
  90688. "ldm %[b]!, {r5, r6}\n\t"
  90689. "ldm %[a]!, {r3, r4}\n\t"
  90690. #ifdef WOLFSSL_KEIL
  90691. "sbcs r3, r3, r5\n\t"
  90692. #elif defined(__clang__)
  90693. "sbcs r3, r5\n\t"
  90694. #else
  90695. "sbc r3, r5\n\t"
  90696. #endif
  90697. #ifdef WOLFSSL_KEIL
  90698. "sbcs r4, r4, r6\n\t"
  90699. #elif defined(__clang__)
  90700. "sbcs r4, r6\n\t"
  90701. #else
  90702. "sbc r4, r6\n\t"
  90703. #endif
  90704. "stm %[r]!, {r3, r4}\n\t"
  90705. "ldm %[b]!, {r5, r6}\n\t"
  90706. "ldm %[a]!, {r3, r4}\n\t"
  90707. #ifdef WOLFSSL_KEIL
  90708. "sbcs r3, r3, r5\n\t"
  90709. #elif defined(__clang__)
  90710. "sbcs r3, r5\n\t"
  90711. #else
  90712. "sbc r3, r5\n\t"
  90713. #endif
  90714. #ifdef WOLFSSL_KEIL
  90715. "sbcs r4, r4, r6\n\t"
  90716. #elif defined(__clang__)
  90717. "sbcs r4, r6\n\t"
  90718. #else
  90719. "sbc r4, r6\n\t"
  90720. #endif
  90721. "stm %[r]!, {r3, r4}\n\t"
  90722. "ldm %[b]!, {r5, r6}\n\t"
  90723. "ldm %[a]!, {r3, r4}\n\t"
  90724. #ifdef WOLFSSL_KEIL
  90725. "sbcs r3, r3, r5\n\t"
  90726. #elif defined(__clang__)
  90727. "sbcs r3, r5\n\t"
  90728. #else
  90729. "sbc r3, r5\n\t"
  90730. #endif
  90731. #ifdef WOLFSSL_KEIL
  90732. "sbcs r4, r4, r6\n\t"
  90733. #elif defined(__clang__)
  90734. "sbcs r4, r6\n\t"
  90735. #else
  90736. "sbc r4, r6\n\t"
  90737. #endif
  90738. "stm %[r]!, {r3, r4}\n\t"
  90739. "ldm %[b]!, {r5, r6}\n\t"
  90740. "ldm %[a]!, {r3, r4}\n\t"
  90741. #ifdef WOLFSSL_KEIL
  90742. "sbcs r3, r3, r5\n\t"
  90743. #elif defined(__clang__)
  90744. "sbcs r3, r5\n\t"
  90745. #else
  90746. "sbc r3, r5\n\t"
  90747. #endif
  90748. #ifdef WOLFSSL_KEIL
  90749. "sbcs r4, r4, r6\n\t"
  90750. #elif defined(__clang__)
  90751. "sbcs r4, r6\n\t"
  90752. #else
  90753. "sbc r4, r6\n\t"
  90754. #endif
  90755. "stm %[r]!, {r3, r4}\n\t"
  90756. "ldm %[b]!, {r5, r6}\n\t"
  90757. "ldm %[a]!, {r3, r4}\n\t"
  90758. #ifdef WOLFSSL_KEIL
  90759. "sbcs r3, r3, r5\n\t"
  90760. #elif defined(__clang__)
  90761. "sbcs r3, r5\n\t"
  90762. #else
  90763. "sbc r3, r5\n\t"
  90764. #endif
  90765. #ifdef WOLFSSL_KEIL
  90766. "sbcs r4, r4, r6\n\t"
  90767. #elif defined(__clang__)
  90768. "sbcs r4, r6\n\t"
  90769. #else
  90770. "sbc r4, r6\n\t"
  90771. #endif
  90772. "stm %[r]!, {r3, r4}\n\t"
  90773. "ldm %[b]!, {r5, r6}\n\t"
  90774. "ldm %[a]!, {r3, r4}\n\t"
  90775. #ifdef WOLFSSL_KEIL
  90776. "sbcs r3, r3, r5\n\t"
  90777. #elif defined(__clang__)
  90778. "sbcs r3, r5\n\t"
  90779. #else
  90780. "sbc r3, r5\n\t"
  90781. #endif
  90782. #ifdef WOLFSSL_KEIL
  90783. "sbcs r4, r4, r6\n\t"
  90784. #elif defined(__clang__)
  90785. "sbcs r4, r6\n\t"
  90786. #else
  90787. "sbc r4, r6\n\t"
  90788. #endif
  90789. "stm %[r]!, {r3, r4}\n\t"
  90790. "ldm %[b]!, {r5, r6}\n\t"
  90791. "ldm %[a]!, {r3, r4}\n\t"
  90792. #ifdef WOLFSSL_KEIL
  90793. "sbcs r3, r3, r5\n\t"
  90794. #elif defined(__clang__)
  90795. "sbcs r3, r5\n\t"
  90796. #else
  90797. "sbc r3, r5\n\t"
  90798. #endif
  90799. #ifdef WOLFSSL_KEIL
  90800. "sbcs r4, r4, r6\n\t"
  90801. #elif defined(__clang__)
  90802. "sbcs r4, r6\n\t"
  90803. #else
  90804. "sbc r4, r6\n\t"
  90805. #endif
  90806. "stm %[r]!, {r3, r4}\n\t"
  90807. "ldm %[b]!, {r5, r6}\n\t"
  90808. "ldm %[a]!, {r3, r4}\n\t"
  90809. #ifdef WOLFSSL_KEIL
  90810. "sbcs r3, r3, r5\n\t"
  90811. #elif defined(__clang__)
  90812. "sbcs r3, r5\n\t"
  90813. #else
  90814. "sbc r3, r5\n\t"
  90815. #endif
  90816. #ifdef WOLFSSL_KEIL
  90817. "sbcs r4, r4, r6\n\t"
  90818. #elif defined(__clang__)
  90819. "sbcs r4, r6\n\t"
  90820. #else
  90821. "sbc r4, r6\n\t"
  90822. #endif
  90823. "stm %[r]!, {r3, r4}\n\t"
  90824. "ldm %[b]!, {r5, r6}\n\t"
  90825. "ldm %[a]!, {r3, r4}\n\t"
  90826. #ifdef WOLFSSL_KEIL
  90827. "sbcs r3, r3, r5\n\t"
  90828. #elif defined(__clang__)
  90829. "sbcs r3, r5\n\t"
  90830. #else
  90831. "sbc r3, r5\n\t"
  90832. #endif
  90833. #ifdef WOLFSSL_KEIL
  90834. "sbcs r4, r4, r6\n\t"
  90835. #elif defined(__clang__)
  90836. "sbcs r4, r6\n\t"
  90837. #else
  90838. "sbc r4, r6\n\t"
  90839. #endif
  90840. "stm %[r]!, {r3, r4}\n\t"
  90841. "ldm %[b]!, {r5, r6}\n\t"
  90842. "ldm %[a]!, {r3, r4}\n\t"
  90843. #ifdef WOLFSSL_KEIL
  90844. "sbcs r3, r3, r5\n\t"
  90845. #elif defined(__clang__)
  90846. "sbcs r3, r5\n\t"
  90847. #else
  90848. "sbc r3, r5\n\t"
  90849. #endif
  90850. #ifdef WOLFSSL_KEIL
  90851. "sbcs r4, r4, r6\n\t"
  90852. #elif defined(__clang__)
  90853. "sbcs r4, r6\n\t"
  90854. #else
  90855. "sbc r4, r6\n\t"
  90856. #endif
  90857. "stm %[r]!, {r3, r4}\n\t"
  90858. "ldm %[b]!, {r5, r6}\n\t"
  90859. "ldm %[a]!, {r3, r4}\n\t"
  90860. #ifdef WOLFSSL_KEIL
  90861. "sbcs r3, r3, r5\n\t"
  90862. #elif defined(__clang__)
  90863. "sbcs r3, r5\n\t"
  90864. #else
  90865. "sbc r3, r5\n\t"
  90866. #endif
  90867. #ifdef WOLFSSL_KEIL
  90868. "sbcs r4, r4, r6\n\t"
  90869. #elif defined(__clang__)
  90870. "sbcs r4, r6\n\t"
  90871. #else
  90872. "sbc r4, r6\n\t"
  90873. #endif
  90874. "stm %[r]!, {r3, r4}\n\t"
  90875. "ldm %[b]!, {r5, r6}\n\t"
  90876. "ldm %[a]!, {r3, r4}\n\t"
  90877. #ifdef WOLFSSL_KEIL
  90878. "sbcs r3, r3, r5\n\t"
  90879. #elif defined(__clang__)
  90880. "sbcs r3, r5\n\t"
  90881. #else
  90882. "sbc r3, r5\n\t"
  90883. #endif
  90884. #ifdef WOLFSSL_KEIL
  90885. "sbcs r4, r4, r6\n\t"
  90886. #elif defined(__clang__)
  90887. "sbcs r4, r6\n\t"
  90888. #else
  90889. "sbc r4, r6\n\t"
  90890. #endif
  90891. "stm %[r]!, {r3, r4}\n\t"
  90892. "ldm %[b]!, {r5, r6}\n\t"
  90893. "ldm %[a]!, {r3, r4}\n\t"
  90894. #ifdef WOLFSSL_KEIL
  90895. "sbcs r3, r3, r5\n\t"
  90896. #elif defined(__clang__)
  90897. "sbcs r3, r5\n\t"
  90898. #else
  90899. "sbc r3, r5\n\t"
  90900. #endif
  90901. #ifdef WOLFSSL_KEIL
  90902. "sbcs r4, r4, r6\n\t"
  90903. #elif defined(__clang__)
  90904. "sbcs r4, r6\n\t"
  90905. #else
  90906. "sbc r4, r6\n\t"
  90907. #endif
  90908. "stm %[r]!, {r3, r4}\n\t"
  90909. "ldm %[b]!, {r5, r6}\n\t"
  90910. "ldm %[a]!, {r3, r4}\n\t"
  90911. #ifdef WOLFSSL_KEIL
  90912. "sbcs r3, r3, r5\n\t"
  90913. #elif defined(__clang__)
  90914. "sbcs r3, r5\n\t"
  90915. #else
  90916. "sbc r3, r5\n\t"
  90917. #endif
  90918. #ifdef WOLFSSL_KEIL
  90919. "sbcs r4, r4, r6\n\t"
  90920. #elif defined(__clang__)
  90921. "sbcs r4, r6\n\t"
  90922. #else
  90923. "sbc r4, r6\n\t"
  90924. #endif
  90925. "stm %[r]!, {r3, r4}\n\t"
  90926. #ifdef WOLFSSL_KEIL
  90927. "sbcs %[r], %[r], %[r]\n\t"
  90928. #elif defined(__clang__)
  90929. "sbcs %[r], %[r]\n\t"
  90930. #else
  90931. "sbc %[r], %[r]\n\t"
  90932. #endif
  90933. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  90934. :
  90935. : "memory", "r3", "r4", "r5", "r6"
  90936. );
  90937. return (uint32_t)(size_t)r;
  90938. }
  90939. #endif /* WOLFSSL_SP_SMALL */
  90940. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  90941. *
  90942. * d1 The high order half of the number to divide.
  90943. * d0 The low order half of the number to divide.
  90944. * div The divisor.
  90945. * returns the result of the division.
  90946. *
  90947. * Note that this is an approximate div. It may give an answer 1 larger.
  90948. */
  90949. SP_NOINLINE static sp_digit div_4096_word_128(sp_digit d1, sp_digit d0,
  90950. sp_digit div)
  90951. {
  90952. __asm__ __volatile__ (
  90953. "movs r3, #0\n\t"
  90954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90955. "lsrs r5, %[div], #1\n\t"
  90956. #else
  90957. "lsr r5, %[div], #1\n\t"
  90958. #endif
  90959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90960. "adds r5, r5, #1\n\t"
  90961. #else
  90962. "add r5, r5, #1\n\t"
  90963. #endif
  90964. "mov r8, %[d0]\n\t"
  90965. "mov r9, %[d1]\n\t"
  90966. "# Do top 32\n\t"
  90967. "movs r6, r5\n\t"
  90968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90969. "subs r6, r6, %[d1]\n\t"
  90970. #else
  90971. "sub r6, r6, %[d1]\n\t"
  90972. #endif
  90973. #ifdef WOLFSSL_KEIL
  90974. "sbcs r6, r6, r6\n\t"
  90975. #elif defined(__clang__)
  90976. "sbcs r6, r6\n\t"
  90977. #else
  90978. "sbc r6, r6\n\t"
  90979. #endif
  90980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90981. "adds r3, r3, r3\n\t"
  90982. #else
  90983. "add r3, r3, r3\n\t"
  90984. #endif
  90985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90986. "subs r3, r3, r6\n\t"
  90987. #else
  90988. "sub r3, r3, r6\n\t"
  90989. #endif
  90990. #ifdef WOLFSSL_KEIL
  90991. "ands r6, r6, r5\n\t"
  90992. #elif defined(__clang__)
  90993. "ands r6, r5\n\t"
  90994. #else
  90995. "and r6, r5\n\t"
  90996. #endif
  90997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90998. "subs %[d1], %[d1], r6\n\t"
  90999. #else
  91000. "sub %[d1], %[d1], r6\n\t"
  91001. #endif
  91002. "movs r4, #29\n\t"
  91003. "\n"
  91004. "L_div_4096_word_128_loop_%=:\n\t"
  91005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91006. "lsls %[d0], %[d0], #1\n\t"
  91007. #else
  91008. "lsl %[d0], %[d0], #1\n\t"
  91009. #endif
  91010. #ifdef WOLFSSL_KEIL
  91011. "adcs %[d1], %[d1], %[d1]\n\t"
  91012. #elif defined(__clang__)
  91013. "adcs %[d1], %[d1]\n\t"
  91014. #else
  91015. "adc %[d1], %[d1]\n\t"
  91016. #endif
  91017. "movs r6, r5\n\t"
  91018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91019. "subs r6, r6, %[d1]\n\t"
  91020. #else
  91021. "sub r6, r6, %[d1]\n\t"
  91022. #endif
  91023. #ifdef WOLFSSL_KEIL
  91024. "sbcs r6, r6, r6\n\t"
  91025. #elif defined(__clang__)
  91026. "sbcs r6, r6\n\t"
  91027. #else
  91028. "sbc r6, r6\n\t"
  91029. #endif
  91030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91031. "adds r3, r3, r3\n\t"
  91032. #else
  91033. "add r3, r3, r3\n\t"
  91034. #endif
  91035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91036. "subs r3, r3, r6\n\t"
  91037. #else
  91038. "sub r3, r3, r6\n\t"
  91039. #endif
  91040. #ifdef WOLFSSL_KEIL
  91041. "ands r6, r6, r5\n\t"
  91042. #elif defined(__clang__)
  91043. "ands r6, r5\n\t"
  91044. #else
  91045. "and r6, r5\n\t"
  91046. #endif
  91047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91048. "subs %[d1], %[d1], r6\n\t"
  91049. #else
  91050. "sub %[d1], %[d1], r6\n\t"
  91051. #endif
  91052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91053. "subs r4, r4, #1\n\t"
  91054. #else
  91055. "sub r4, r4, #1\n\t"
  91056. #endif
  91057. "bpl L_div_4096_word_128_loop_%=\n\t"
  91058. "movs r7, #0\n\t"
  91059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91060. "adds r3, r3, r3\n\t"
  91061. #else
  91062. "add r3, r3, r3\n\t"
  91063. #endif
  91064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91065. "adds r3, r3, #1\n\t"
  91066. #else
  91067. "add r3, r3, #1\n\t"
  91068. #endif
  91069. "# r * div - Start\n\t"
  91070. "uxth %[d1], r3\n\t"
  91071. "uxth r4, %[div]\n\t"
  91072. #ifdef WOLFSSL_KEIL
  91073. "muls r4, %[d1], r4\n\t"
  91074. #elif defined(__clang__)
  91075. "muls r4, %[d1]\n\t"
  91076. #else
  91077. "mul r4, %[d1]\n\t"
  91078. #endif
  91079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91080. "lsrs r6, %[div], #16\n\t"
  91081. #else
  91082. "lsr r6, %[div], #16\n\t"
  91083. #endif
  91084. #ifdef WOLFSSL_KEIL
  91085. "muls %[d1], r6, %[d1]\n\t"
  91086. #elif defined(__clang__)
  91087. "muls %[d1], r6\n\t"
  91088. #else
  91089. "mul %[d1], r6\n\t"
  91090. #endif
  91091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91092. "lsrs r5, %[d1], #16\n\t"
  91093. #else
  91094. "lsr r5, %[d1], #16\n\t"
  91095. #endif
  91096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91097. "lsls %[d1], %[d1], #16\n\t"
  91098. #else
  91099. "lsl %[d1], %[d1], #16\n\t"
  91100. #endif
  91101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91102. "adds r4, r4, %[d1]\n\t"
  91103. #else
  91104. "add r4, r4, %[d1]\n\t"
  91105. #endif
  91106. #ifdef WOLFSSL_KEIL
  91107. "adcs r5, r5, r7\n\t"
  91108. #elif defined(__clang__)
  91109. "adcs r5, r7\n\t"
  91110. #else
  91111. "adc r5, r7\n\t"
  91112. #endif
  91113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91114. "lsrs %[d1], r3, #16\n\t"
  91115. #else
  91116. "lsr %[d1], r3, #16\n\t"
  91117. #endif
  91118. #ifdef WOLFSSL_KEIL
  91119. "muls r6, %[d1], r6\n\t"
  91120. #elif defined(__clang__)
  91121. "muls r6, %[d1]\n\t"
  91122. #else
  91123. "mul r6, %[d1]\n\t"
  91124. #endif
  91125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91126. "adds r5, r5, r6\n\t"
  91127. #else
  91128. "add r5, r5, r6\n\t"
  91129. #endif
  91130. "uxth r6, %[div]\n\t"
  91131. #ifdef WOLFSSL_KEIL
  91132. "muls %[d1], r6, %[d1]\n\t"
  91133. #elif defined(__clang__)
  91134. "muls %[d1], r6\n\t"
  91135. #else
  91136. "mul %[d1], r6\n\t"
  91137. #endif
  91138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91139. "lsrs r6, %[d1], #16\n\t"
  91140. #else
  91141. "lsr r6, %[d1], #16\n\t"
  91142. #endif
  91143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91144. "lsls %[d1], %[d1], #16\n\t"
  91145. #else
  91146. "lsl %[d1], %[d1], #16\n\t"
  91147. #endif
  91148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91149. "adds r4, r4, %[d1]\n\t"
  91150. #else
  91151. "add r4, r4, %[d1]\n\t"
  91152. #endif
  91153. #ifdef WOLFSSL_KEIL
  91154. "adcs r5, r5, r6\n\t"
  91155. #elif defined(__clang__)
  91156. "adcs r5, r6\n\t"
  91157. #else
  91158. "adc r5, r6\n\t"
  91159. #endif
  91160. "# r * div - Done\n\t"
  91161. "mov %[d1], r8\n\t"
  91162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91163. "subs %[d1], %[d1], r4\n\t"
  91164. #else
  91165. "sub %[d1], %[d1], r4\n\t"
  91166. #endif
  91167. "movs r4, %[d1]\n\t"
  91168. "mov %[d1], r9\n\t"
  91169. #ifdef WOLFSSL_KEIL
  91170. "sbcs %[d1], %[d1], r5\n\t"
  91171. #elif defined(__clang__)
  91172. "sbcs %[d1], r5\n\t"
  91173. #else
  91174. "sbc %[d1], r5\n\t"
  91175. #endif
  91176. "movs r5, %[d1]\n\t"
  91177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91178. "adds r3, r3, r5\n\t"
  91179. #else
  91180. "add r3, r3, r5\n\t"
  91181. #endif
  91182. "# r * div - Start\n\t"
  91183. "uxth %[d1], r3\n\t"
  91184. "uxth r4, %[div]\n\t"
  91185. #ifdef WOLFSSL_KEIL
  91186. "muls r4, %[d1], r4\n\t"
  91187. #elif defined(__clang__)
  91188. "muls r4, %[d1]\n\t"
  91189. #else
  91190. "mul r4, %[d1]\n\t"
  91191. #endif
  91192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91193. "lsrs r6, %[div], #16\n\t"
  91194. #else
  91195. "lsr r6, %[div], #16\n\t"
  91196. #endif
  91197. #ifdef WOLFSSL_KEIL
  91198. "muls %[d1], r6, %[d1]\n\t"
  91199. #elif defined(__clang__)
  91200. "muls %[d1], r6\n\t"
  91201. #else
  91202. "mul %[d1], r6\n\t"
  91203. #endif
  91204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91205. "lsrs r5, %[d1], #16\n\t"
  91206. #else
  91207. "lsr r5, %[d1], #16\n\t"
  91208. #endif
  91209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91210. "lsls %[d1], %[d1], #16\n\t"
  91211. #else
  91212. "lsl %[d1], %[d1], #16\n\t"
  91213. #endif
  91214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91215. "adds r4, r4, %[d1]\n\t"
  91216. #else
  91217. "add r4, r4, %[d1]\n\t"
  91218. #endif
  91219. #ifdef WOLFSSL_KEIL
  91220. "adcs r5, r5, r7\n\t"
  91221. #elif defined(__clang__)
  91222. "adcs r5, r7\n\t"
  91223. #else
  91224. "adc r5, r7\n\t"
  91225. #endif
  91226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91227. "lsrs %[d1], r3, #16\n\t"
  91228. #else
  91229. "lsr %[d1], r3, #16\n\t"
  91230. #endif
  91231. #ifdef WOLFSSL_KEIL
  91232. "muls r6, %[d1], r6\n\t"
  91233. #elif defined(__clang__)
  91234. "muls r6, %[d1]\n\t"
  91235. #else
  91236. "mul r6, %[d1]\n\t"
  91237. #endif
  91238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91239. "adds r5, r5, r6\n\t"
  91240. #else
  91241. "add r5, r5, r6\n\t"
  91242. #endif
  91243. "uxth r6, %[div]\n\t"
  91244. #ifdef WOLFSSL_KEIL
  91245. "muls %[d1], r6, %[d1]\n\t"
  91246. #elif defined(__clang__)
  91247. "muls %[d1], r6\n\t"
  91248. #else
  91249. "mul %[d1], r6\n\t"
  91250. #endif
  91251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91252. "lsrs r6, %[d1], #16\n\t"
  91253. #else
  91254. "lsr r6, %[d1], #16\n\t"
  91255. #endif
  91256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91257. "lsls %[d1], %[d1], #16\n\t"
  91258. #else
  91259. "lsl %[d1], %[d1], #16\n\t"
  91260. #endif
  91261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91262. "adds r4, r4, %[d1]\n\t"
  91263. #else
  91264. "add r4, r4, %[d1]\n\t"
  91265. #endif
  91266. #ifdef WOLFSSL_KEIL
  91267. "adcs r5, r5, r6\n\t"
  91268. #elif defined(__clang__)
  91269. "adcs r5, r6\n\t"
  91270. #else
  91271. "adc r5, r6\n\t"
  91272. #endif
  91273. "# r * div - Done\n\t"
  91274. "mov %[d1], r8\n\t"
  91275. "mov r6, r9\n\t"
  91276. #ifdef WOLFSSL_KEIL
  91277. "subs r4, %[d1], r4\n\t"
  91278. #else
  91279. #ifdef __clang__
  91280. "subs r4, %[d1], r4\n\t"
  91281. #else
  91282. "sub r4, %[d1], r4\n\t"
  91283. #endif
  91284. #endif
  91285. #ifdef WOLFSSL_KEIL
  91286. "sbcs r6, r6, r5\n\t"
  91287. #elif defined(__clang__)
  91288. "sbcs r6, r5\n\t"
  91289. #else
  91290. "sbc r6, r5\n\t"
  91291. #endif
  91292. "movs r5, r6\n\t"
  91293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91294. "adds r3, r3, r5\n\t"
  91295. #else
  91296. "add r3, r3, r5\n\t"
  91297. #endif
  91298. "# r * div - Start\n\t"
  91299. "uxth %[d1], r3\n\t"
  91300. "uxth r4, %[div]\n\t"
  91301. #ifdef WOLFSSL_KEIL
  91302. "muls r4, %[d1], r4\n\t"
  91303. #elif defined(__clang__)
  91304. "muls r4, %[d1]\n\t"
  91305. #else
  91306. "mul r4, %[d1]\n\t"
  91307. #endif
  91308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91309. "lsrs r6, %[div], #16\n\t"
  91310. #else
  91311. "lsr r6, %[div], #16\n\t"
  91312. #endif
  91313. #ifdef WOLFSSL_KEIL
  91314. "muls %[d1], r6, %[d1]\n\t"
  91315. #elif defined(__clang__)
  91316. "muls %[d1], r6\n\t"
  91317. #else
  91318. "mul %[d1], r6\n\t"
  91319. #endif
  91320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91321. "lsrs r5, %[d1], #16\n\t"
  91322. #else
  91323. "lsr r5, %[d1], #16\n\t"
  91324. #endif
  91325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91326. "lsls %[d1], %[d1], #16\n\t"
  91327. #else
  91328. "lsl %[d1], %[d1], #16\n\t"
  91329. #endif
  91330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91331. "adds r4, r4, %[d1]\n\t"
  91332. #else
  91333. "add r4, r4, %[d1]\n\t"
  91334. #endif
  91335. #ifdef WOLFSSL_KEIL
  91336. "adcs r5, r5, r7\n\t"
  91337. #elif defined(__clang__)
  91338. "adcs r5, r7\n\t"
  91339. #else
  91340. "adc r5, r7\n\t"
  91341. #endif
  91342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91343. "lsrs %[d1], r3, #16\n\t"
  91344. #else
  91345. "lsr %[d1], r3, #16\n\t"
  91346. #endif
  91347. #ifdef WOLFSSL_KEIL
  91348. "muls r6, %[d1], r6\n\t"
  91349. #elif defined(__clang__)
  91350. "muls r6, %[d1]\n\t"
  91351. #else
  91352. "mul r6, %[d1]\n\t"
  91353. #endif
  91354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91355. "adds r5, r5, r6\n\t"
  91356. #else
  91357. "add r5, r5, r6\n\t"
  91358. #endif
  91359. "uxth r6, %[div]\n\t"
  91360. #ifdef WOLFSSL_KEIL
  91361. "muls %[d1], r6, %[d1]\n\t"
  91362. #elif defined(__clang__)
  91363. "muls %[d1], r6\n\t"
  91364. #else
  91365. "mul %[d1], r6\n\t"
  91366. #endif
  91367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91368. "lsrs r6, %[d1], #16\n\t"
  91369. #else
  91370. "lsr r6, %[d1], #16\n\t"
  91371. #endif
  91372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91373. "lsls %[d1], %[d1], #16\n\t"
  91374. #else
  91375. "lsl %[d1], %[d1], #16\n\t"
  91376. #endif
  91377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91378. "adds r4, r4, %[d1]\n\t"
  91379. #else
  91380. "add r4, r4, %[d1]\n\t"
  91381. #endif
  91382. #ifdef WOLFSSL_KEIL
  91383. "adcs r5, r5, r6\n\t"
  91384. #elif defined(__clang__)
  91385. "adcs r5, r6\n\t"
  91386. #else
  91387. "adc r5, r6\n\t"
  91388. #endif
  91389. "# r * div - Done\n\t"
  91390. "mov %[d1], r8\n\t"
  91391. "mov r6, r9\n\t"
  91392. #ifdef WOLFSSL_KEIL
  91393. "subs r4, %[d1], r4\n\t"
  91394. #else
  91395. #ifdef __clang__
  91396. "subs r4, %[d1], r4\n\t"
  91397. #else
  91398. "sub r4, %[d1], r4\n\t"
  91399. #endif
  91400. #endif
  91401. #ifdef WOLFSSL_KEIL
  91402. "sbcs r6, r6, r5\n\t"
  91403. #elif defined(__clang__)
  91404. "sbcs r6, r5\n\t"
  91405. #else
  91406. "sbc r6, r5\n\t"
  91407. #endif
  91408. "movs r5, r6\n\t"
  91409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91410. "adds r3, r3, r5\n\t"
  91411. #else
  91412. "add r3, r3, r5\n\t"
  91413. #endif
  91414. "# r * div - Start\n\t"
  91415. "uxth %[d1], r3\n\t"
  91416. "uxth r4, %[div]\n\t"
  91417. #ifdef WOLFSSL_KEIL
  91418. "muls r4, %[d1], r4\n\t"
  91419. #elif defined(__clang__)
  91420. "muls r4, %[d1]\n\t"
  91421. #else
  91422. "mul r4, %[d1]\n\t"
  91423. #endif
  91424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91425. "lsrs r6, %[div], #16\n\t"
  91426. #else
  91427. "lsr r6, %[div], #16\n\t"
  91428. #endif
  91429. #ifdef WOLFSSL_KEIL
  91430. "muls %[d1], r6, %[d1]\n\t"
  91431. #elif defined(__clang__)
  91432. "muls %[d1], r6\n\t"
  91433. #else
  91434. "mul %[d1], r6\n\t"
  91435. #endif
  91436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91437. "lsrs r5, %[d1], #16\n\t"
  91438. #else
  91439. "lsr r5, %[d1], #16\n\t"
  91440. #endif
  91441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91442. "lsls %[d1], %[d1], #16\n\t"
  91443. #else
  91444. "lsl %[d1], %[d1], #16\n\t"
  91445. #endif
  91446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91447. "adds r4, r4, %[d1]\n\t"
  91448. #else
  91449. "add r4, r4, %[d1]\n\t"
  91450. #endif
  91451. #ifdef WOLFSSL_KEIL
  91452. "adcs r5, r5, r7\n\t"
  91453. #elif defined(__clang__)
  91454. "adcs r5, r7\n\t"
  91455. #else
  91456. "adc r5, r7\n\t"
  91457. #endif
  91458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91459. "lsrs %[d1], r3, #16\n\t"
  91460. #else
  91461. "lsr %[d1], r3, #16\n\t"
  91462. #endif
  91463. #ifdef WOLFSSL_KEIL
  91464. "muls r6, %[d1], r6\n\t"
  91465. #elif defined(__clang__)
  91466. "muls r6, %[d1]\n\t"
  91467. #else
  91468. "mul r6, %[d1]\n\t"
  91469. #endif
  91470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91471. "adds r5, r5, r6\n\t"
  91472. #else
  91473. "add r5, r5, r6\n\t"
  91474. #endif
  91475. "uxth r6, %[div]\n\t"
  91476. #ifdef WOLFSSL_KEIL
  91477. "muls %[d1], r6, %[d1]\n\t"
  91478. #elif defined(__clang__)
  91479. "muls %[d1], r6\n\t"
  91480. #else
  91481. "mul %[d1], r6\n\t"
  91482. #endif
  91483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91484. "lsrs r6, %[d1], #16\n\t"
  91485. #else
  91486. "lsr r6, %[d1], #16\n\t"
  91487. #endif
  91488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91489. "lsls %[d1], %[d1], #16\n\t"
  91490. #else
  91491. "lsl %[d1], %[d1], #16\n\t"
  91492. #endif
  91493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91494. "adds r4, r4, %[d1]\n\t"
  91495. #else
  91496. "add r4, r4, %[d1]\n\t"
  91497. #endif
  91498. #ifdef WOLFSSL_KEIL
  91499. "adcs r5, r5, r6\n\t"
  91500. #elif defined(__clang__)
  91501. "adcs r5, r6\n\t"
  91502. #else
  91503. "adc r5, r6\n\t"
  91504. #endif
  91505. "# r * div - Done\n\t"
  91506. "mov %[d1], r8\n\t"
  91507. "mov r6, r9\n\t"
  91508. #ifdef WOLFSSL_KEIL
  91509. "subs r4, %[d1], r4\n\t"
  91510. #else
  91511. #ifdef __clang__
  91512. "subs r4, %[d1], r4\n\t"
  91513. #else
  91514. "sub r4, %[d1], r4\n\t"
  91515. #endif
  91516. #endif
  91517. #ifdef WOLFSSL_KEIL
  91518. "sbcs r6, r6, r5\n\t"
  91519. #elif defined(__clang__)
  91520. "sbcs r6, r5\n\t"
  91521. #else
  91522. "sbc r6, r5\n\t"
  91523. #endif
  91524. "movs r5, r6\n\t"
  91525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91526. "adds r3, r3, r5\n\t"
  91527. #else
  91528. "add r3, r3, r5\n\t"
  91529. #endif
  91530. "movs r6, %[div]\n\t"
  91531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91532. "subs r6, r6, r4\n\t"
  91533. #else
  91534. "sub r6, r6, r4\n\t"
  91535. #endif
  91536. #ifdef WOLFSSL_KEIL
  91537. "sbcs r6, r6, r6\n\t"
  91538. #elif defined(__clang__)
  91539. "sbcs r6, r6\n\t"
  91540. #else
  91541. "sbc r6, r6\n\t"
  91542. #endif
  91543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91544. "subs r3, r3, r6\n\t"
  91545. #else
  91546. "sub r3, r3, r6\n\t"
  91547. #endif
  91548. "movs %[d1], r3\n\t"
  91549. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  91550. :
  91551. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  91552. );
  91553. return (uint32_t)(size_t)d1;
  91554. }
  91555. /* Divide d in a and put remainder into r (m*d + r = a)
  91556. * m is not calculated as it is not needed at this time.
  91557. *
  91558. * a Number to be divided.
  91559. * d Number to divide with.
  91560. * m Multiplier result.
  91561. * r Remainder from the division.
  91562. * returns MP_OKAY indicating success.
  91563. */
  91564. static WC_INLINE int sp_4096_div_128_cond(const sp_digit* a, const sp_digit* d,
  91565. sp_digit* m, sp_digit* r)
  91566. {
  91567. sp_digit t1[256], t2[129];
  91568. sp_digit div, r1;
  91569. int i;
  91570. (void)m;
  91571. div = d[127];
  91572. XMEMCPY(t1, a, sizeof(*t1) * 2 * 128);
  91573. for (i = 127; i > 0; i--) {
  91574. if (t1[i + 128] != d[i])
  91575. break;
  91576. }
  91577. if (t1[i + 128] >= d[i]) {
  91578. sp_4096_sub_in_place_128(&t1[128], d);
  91579. }
  91580. for (i = 127; i >= 0; i--) {
  91581. if (t1[128 + i] == div) {
  91582. r1 = SP_DIGIT_MAX;
  91583. }
  91584. else {
  91585. r1 = div_4096_word_128(t1[128 + i], t1[128 + i - 1], div);
  91586. }
  91587. sp_4096_mul_d_128(t2, d, r1);
  91588. t1[128 + i] += sp_4096_sub_in_place_128(&t1[i], t2);
  91589. t1[128 + i] -= t2[128];
  91590. if (t1[128 + i] != 0) {
  91591. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], d);
  91592. if (t1[128 + i] != 0)
  91593. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], d);
  91594. }
  91595. }
  91596. for (i = 127; i > 0; i--) {
  91597. if (t1[i] != d[i])
  91598. break;
  91599. }
  91600. if (t1[i] >= d[i]) {
  91601. sp_4096_sub_128(r, t1, d);
  91602. }
  91603. else {
  91604. XMEMCPY(r, t1, sizeof(*t1) * 128);
  91605. }
  91606. return MP_OKAY;
  91607. }
  91608. /* Reduce a modulo m into r. (r = a mod m)
  91609. *
  91610. * r A single precision number that is the reduced result.
  91611. * a A single precision number that is to be reduced.
  91612. * m A single precision number that is the modulus to reduce with.
  91613. * returns MP_OKAY indicating success.
  91614. */
  91615. static WC_INLINE int sp_4096_mod_128_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
  91616. {
  91617. int ret;
  91618. ret = sp_4096_div_128_cond(a, m, NULL, r);
  91619. return ret;
  91620. }
  91621. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  91622. /* AND m into each word of a and store in r.
  91623. *
  91624. * r A single precision integer.
  91625. * a A single precision integer.
  91626. * m Mask to AND against each digit.
  91627. */
  91628. static void sp_4096_mask_128(sp_digit* r, const sp_digit* a, sp_digit m)
  91629. {
  91630. #ifdef WOLFSSL_SP_SMALL
  91631. int i;
  91632. for (i=0; i<128; i++) {
  91633. r[i] = a[i] & m;
  91634. }
  91635. #else
  91636. int i;
  91637. for (i = 0; i < 128; i += 8) {
  91638. r[i+0] = a[i+0] & m;
  91639. r[i+1] = a[i+1] & m;
  91640. r[i+2] = a[i+2] & m;
  91641. r[i+3] = a[i+3] & m;
  91642. r[i+4] = a[i+4] & m;
  91643. r[i+5] = a[i+5] & m;
  91644. r[i+6] = a[i+6] & m;
  91645. r[i+7] = a[i+7] & m;
  91646. }
  91647. #endif
  91648. }
  91649. /* Compare a with b in constant time.
  91650. *
  91651. * a A single precision integer.
  91652. * b A single precision integer.
  91653. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  91654. * respectively.
  91655. */
  91656. SP_NOINLINE static sp_int32 sp_4096_cmp_128(const sp_digit* a,
  91657. const sp_digit* b)
  91658. {
  91659. __asm__ __volatile__ (
  91660. "movs r2, #0\n\t"
  91661. "movs r3, #0\n\t"
  91662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91663. "mvns r3, r3\n\t"
  91664. #else
  91665. "mvn r3, r3\n\t"
  91666. #endif
  91667. "movs r6, #0xff\n\t"
  91668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91669. "adds r6, r6, #0xfd\n\t"
  91670. #else
  91671. "add r6, r6, #0xfd\n\t"
  91672. #endif
  91673. "\n"
  91674. "L_sp_4096_cmp_128_words_%=:\n\t"
  91675. "ldr r7, [%[a], r6]\n\t"
  91676. "ldr r5, [%[b], r6]\n\t"
  91677. #ifdef WOLFSSL_KEIL
  91678. "ands r7, r7, r3\n\t"
  91679. #elif defined(__clang__)
  91680. "ands r7, r3\n\t"
  91681. #else
  91682. "and r7, r3\n\t"
  91683. #endif
  91684. #ifdef WOLFSSL_KEIL
  91685. "ands r5, r5, r3\n\t"
  91686. #elif defined(__clang__)
  91687. "ands r5, r3\n\t"
  91688. #else
  91689. "and r5, r3\n\t"
  91690. #endif
  91691. "movs r4, r7\n\t"
  91692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91693. "subs r7, r7, r5\n\t"
  91694. #else
  91695. "sub r7, r7, r5\n\t"
  91696. #endif
  91697. #ifdef WOLFSSL_KEIL
  91698. "sbcs r7, r7, r7\n\t"
  91699. #elif defined(__clang__)
  91700. "sbcs r7, r7\n\t"
  91701. #else
  91702. "sbc r7, r7\n\t"
  91703. #endif
  91704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91705. "adds r2, r2, r7\n\t"
  91706. #else
  91707. "add r2, r2, r7\n\t"
  91708. #endif
  91709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91710. "mvns r7, r7\n\t"
  91711. #else
  91712. "mvn r7, r7\n\t"
  91713. #endif
  91714. #ifdef WOLFSSL_KEIL
  91715. "ands r3, r3, r7\n\t"
  91716. #elif defined(__clang__)
  91717. "ands r3, r7\n\t"
  91718. #else
  91719. "and r3, r7\n\t"
  91720. #endif
  91721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91722. "subs r5, r5, r4\n\t"
  91723. #else
  91724. "sub r5, r5, r4\n\t"
  91725. #endif
  91726. #ifdef WOLFSSL_KEIL
  91727. "sbcs r7, r7, r7\n\t"
  91728. #elif defined(__clang__)
  91729. "sbcs r7, r7\n\t"
  91730. #else
  91731. "sbc r7, r7\n\t"
  91732. #endif
  91733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91734. "subs r2, r2, r7\n\t"
  91735. #else
  91736. "sub r2, r2, r7\n\t"
  91737. #endif
  91738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91739. "mvns r7, r7\n\t"
  91740. #else
  91741. "mvn r7, r7\n\t"
  91742. #endif
  91743. #ifdef WOLFSSL_KEIL
  91744. "ands r3, r3, r7\n\t"
  91745. #elif defined(__clang__)
  91746. "ands r3, r7\n\t"
  91747. #else
  91748. "and r3, r7\n\t"
  91749. #endif
  91750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91751. "subs r6, r6, #4\n\t"
  91752. #else
  91753. "sub r6, r6, #4\n\t"
  91754. #endif
  91755. "bge L_sp_4096_cmp_128_words_%=\n\t"
  91756. "movs %[a], r2\n\t"
  91757. : [a] "+l" (a), [b] "+l" (b)
  91758. :
  91759. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  91760. );
  91761. return (uint32_t)(size_t)a;
  91762. }
  91763. /* Divide d in a and put remainder into r (m*d + r = a)
  91764. * m is not calculated as it is not needed at this time.
  91765. *
  91766. * a Number to be divided.
  91767. * d Number to divide with.
  91768. * m Multiplier result.
  91769. * r Remainder from the division.
  91770. * returns MP_OKAY indicating success.
  91771. */
  91772. static WC_INLINE int sp_4096_div_128(const sp_digit* a, const sp_digit* d,
  91773. sp_digit* m, sp_digit* r)
  91774. {
  91775. sp_digit t1[256], t2[129];
  91776. sp_digit div, r1;
  91777. int i;
  91778. (void)m;
  91779. div = d[127];
  91780. XMEMCPY(t1, a, sizeof(*t1) * 2 * 128);
  91781. r1 = sp_4096_cmp_128(&t1[128], d) >= 0;
  91782. sp_4096_cond_sub_128(&t1[128], &t1[128], d, (sp_digit)0 - r1);
  91783. for (i = 127; i >= 0; i--) {
  91784. volatile sp_digit mask = (sp_digit)0 - (t1[128 + i] == div);
  91785. sp_digit hi = t1[128 + i] + mask;
  91786. r1 = div_4096_word_128(hi, t1[128 + i - 1], div);
  91787. r1 |= mask;
  91788. sp_4096_mul_d_128(t2, d, r1);
  91789. t1[128 + i] += sp_4096_sub_in_place_128(&t1[i], t2);
  91790. t1[128 + i] -= t2[128];
  91791. sp_4096_mask_128(t2, d, t1[128 + i]);
  91792. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], t2);
  91793. sp_4096_mask_128(t2, d, t1[128 + i]);
  91794. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], t2);
  91795. }
  91796. r1 = sp_4096_cmp_128(t1, d) >= 0;
  91797. sp_4096_cond_sub_128(r, t1, d, (sp_digit)0 - r1);
  91798. return MP_OKAY;
  91799. }
  91800. /* Reduce a modulo m into r. (r = a mod m)
  91801. *
  91802. * r A single precision number that is the reduced result.
  91803. * a A single precision number that is to be reduced.
  91804. * m A single precision number that is the modulus to reduce with.
  91805. * returns MP_OKAY indicating success.
  91806. */
  91807. static WC_INLINE int sp_4096_mod_128(sp_digit* r, const sp_digit* a, const sp_digit* m)
  91808. {
  91809. int ret;
  91810. ret = sp_4096_div_128(a, m, NULL, r);
  91811. return ret;
  91812. }
  91813. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  91814. defined(WOLFSSL_HAVE_SP_DH)
  91815. #ifdef WOLFSSL_SP_SMALL
  91816. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  91817. *
  91818. * r A single precision number that is the result of the operation.
  91819. * a A single precision number being exponentiated.
  91820. * e A single precision number that is the exponent.
  91821. * bits The number of bits in the exponent.
  91822. * m A single precision number that is the modulus.
  91823. * returns 0 on success.
  91824. * returns MEMORY_E on dynamic memory allocation failure.
  91825. * returns MP_VAL when base is even or exponent is 0.
  91826. */
  91827. static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e,
  91828. int bits, const sp_digit* m, int reduceA)
  91829. {
  91830. #ifdef WOLFSSL_SP_SMALL_STACK
  91831. sp_digit* td = NULL;
  91832. #else
  91833. sp_digit td[8 * 256];
  91834. #endif
  91835. sp_digit* t[8];
  91836. sp_digit* norm = NULL;
  91837. sp_digit mp = 1;
  91838. sp_digit n;
  91839. sp_digit mask;
  91840. int i;
  91841. int c;
  91842. byte y;
  91843. int err = MP_OKAY;
  91844. if (bits == 0) {
  91845. err = MP_VAL;
  91846. }
  91847. #ifdef WOLFSSL_SP_SMALL_STACK
  91848. if (err == MP_OKAY) {
  91849. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 256), NULL,
  91850. DYNAMIC_TYPE_TMP_BUFFER);
  91851. if (td == NULL)
  91852. err = MEMORY_E;
  91853. }
  91854. #endif
  91855. if (err == MP_OKAY) {
  91856. norm = td;
  91857. for (i=0; i<8; i++) {
  91858. t[i] = td + i * 256;
  91859. }
  91860. sp_4096_mont_setup(m, &mp);
  91861. sp_4096_mont_norm_128(norm, m);
  91862. XMEMSET(t[1], 0, sizeof(sp_digit) * 128U);
  91863. if (reduceA != 0) {
  91864. err = sp_4096_mod_128(t[1] + 128, a, m);
  91865. if (err == MP_OKAY) {
  91866. err = sp_4096_mod_128(t[1], t[1], m);
  91867. }
  91868. }
  91869. else {
  91870. XMEMCPY(t[1] + 128, a, sizeof(sp_digit) * 128);
  91871. err = sp_4096_mod_128(t[1], t[1], m);
  91872. }
  91873. }
  91874. if (err == MP_OKAY) {
  91875. sp_4096_mont_sqr_128(t[ 2], t[ 1], m, mp);
  91876. sp_4096_mont_mul_128(t[ 3], t[ 2], t[ 1], m, mp);
  91877. sp_4096_mont_sqr_128(t[ 4], t[ 2], m, mp);
  91878. sp_4096_mont_mul_128(t[ 5], t[ 3], t[ 2], m, mp);
  91879. sp_4096_mont_sqr_128(t[ 6], t[ 3], m, mp);
  91880. sp_4096_mont_mul_128(t[ 7], t[ 4], t[ 3], m, mp);
  91881. i = (bits - 1) / 32;
  91882. n = e[i--];
  91883. c = bits & 31;
  91884. if (c == 0) {
  91885. c = 32;
  91886. }
  91887. c -= bits % 3;
  91888. if (c == 32) {
  91889. c = 29;
  91890. }
  91891. if (c < 0) {
  91892. /* Number of bits in top word is less than number needed. */
  91893. c = -c;
  91894. y = (byte)(n << c);
  91895. n = e[i--];
  91896. y |= (byte)(n >> (64 - c));
  91897. n <<= c;
  91898. c = 64 - c;
  91899. }
  91900. else if (c == 0) {
  91901. /* All bits in top word used. */
  91902. y = (byte)n;
  91903. }
  91904. else {
  91905. y = (byte)(n >> c);
  91906. n <<= 32 - c;
  91907. }
  91908. XMEMCPY(r, t[y], sizeof(sp_digit) * 128);
  91909. for (; i>=0 || c>=3; ) {
  91910. if (c == 0) {
  91911. n = e[i--];
  91912. y = (byte)(n >> 29);
  91913. n <<= 3;
  91914. c = 29;
  91915. }
  91916. else if (c < 3) {
  91917. y = (byte)(n >> 29);
  91918. n = e[i--];
  91919. c = 3 - c;
  91920. y |= (byte)(n >> (32 - c));
  91921. n <<= c;
  91922. c = 32 - c;
  91923. }
  91924. else {
  91925. y = (byte)((n >> 29) & 0x7);
  91926. n <<= 3;
  91927. c -= 3;
  91928. }
  91929. sp_4096_mont_sqr_128(r, r, m, mp);
  91930. sp_4096_mont_sqr_128(r, r, m, mp);
  91931. sp_4096_mont_sqr_128(r, r, m, mp);
  91932. sp_4096_mont_mul_128(r, r, t[y], m, mp);
  91933. }
  91934. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  91935. sp_4096_mont_reduce_128(r, m, mp);
  91936. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  91937. sp_4096_cond_sub_128(r, r, m, mask);
  91938. }
  91939. #ifdef WOLFSSL_SP_SMALL_STACK
  91940. if (td != NULL)
  91941. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  91942. #endif
  91943. return err;
  91944. }
  91945. #else
  91946. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  91947. *
  91948. * r A single precision number that is the result of the operation.
  91949. * a A single precision number being exponentiated.
  91950. * e A single precision number that is the exponent.
  91951. * bits The number of bits in the exponent.
  91952. * m A single precision number that is the modulus.
  91953. * returns 0 on success.
  91954. * returns MEMORY_E on dynamic memory allocation failure.
  91955. * returns MP_VAL when base is even or exponent is 0.
  91956. */
  91957. static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e,
  91958. int bits, const sp_digit* m, int reduceA)
  91959. {
  91960. #ifdef WOLFSSL_SP_SMALL_STACK
  91961. sp_digit* td = NULL;
  91962. #else
  91963. sp_digit td[16 * 256];
  91964. #endif
  91965. sp_digit* t[16];
  91966. sp_digit* norm = NULL;
  91967. sp_digit mp = 1;
  91968. sp_digit n;
  91969. sp_digit mask;
  91970. int i;
  91971. int c;
  91972. byte y;
  91973. int err = MP_OKAY;
  91974. if (bits == 0) {
  91975. err = MP_VAL;
  91976. }
  91977. #ifdef WOLFSSL_SP_SMALL_STACK
  91978. if (err == MP_OKAY) {
  91979. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 256), NULL,
  91980. DYNAMIC_TYPE_TMP_BUFFER);
  91981. if (td == NULL)
  91982. err = MEMORY_E;
  91983. }
  91984. #endif
  91985. if (err == MP_OKAY) {
  91986. norm = td;
  91987. for (i=0; i<16; i++) {
  91988. t[i] = td + i * 256;
  91989. }
  91990. sp_4096_mont_setup(m, &mp);
  91991. sp_4096_mont_norm_128(norm, m);
  91992. XMEMSET(t[1], 0, sizeof(sp_digit) * 128U);
  91993. if (reduceA != 0) {
  91994. err = sp_4096_mod_128(t[1] + 128, a, m);
  91995. if (err == MP_OKAY) {
  91996. err = sp_4096_mod_128(t[1], t[1], m);
  91997. }
  91998. }
  91999. else {
  92000. XMEMCPY(t[1] + 128, a, sizeof(sp_digit) * 128);
  92001. err = sp_4096_mod_128(t[1], t[1], m);
  92002. }
  92003. }
  92004. if (err == MP_OKAY) {
  92005. sp_4096_mont_sqr_128(t[ 2], t[ 1], m, mp);
  92006. sp_4096_mont_mul_128(t[ 3], t[ 2], t[ 1], m, mp);
  92007. sp_4096_mont_sqr_128(t[ 4], t[ 2], m, mp);
  92008. sp_4096_mont_mul_128(t[ 5], t[ 3], t[ 2], m, mp);
  92009. sp_4096_mont_sqr_128(t[ 6], t[ 3], m, mp);
  92010. sp_4096_mont_mul_128(t[ 7], t[ 4], t[ 3], m, mp);
  92011. sp_4096_mont_sqr_128(t[ 8], t[ 4], m, mp);
  92012. sp_4096_mont_mul_128(t[ 9], t[ 5], t[ 4], m, mp);
  92013. sp_4096_mont_sqr_128(t[10], t[ 5], m, mp);
  92014. sp_4096_mont_mul_128(t[11], t[ 6], t[ 5], m, mp);
  92015. sp_4096_mont_sqr_128(t[12], t[ 6], m, mp);
  92016. sp_4096_mont_mul_128(t[13], t[ 7], t[ 6], m, mp);
  92017. sp_4096_mont_sqr_128(t[14], t[ 7], m, mp);
  92018. sp_4096_mont_mul_128(t[15], t[ 8], t[ 7], m, mp);
  92019. i = (bits - 1) / 32;
  92020. n = e[i--];
  92021. c = bits & 31;
  92022. if (c == 0) {
  92023. c = 32;
  92024. }
  92025. c -= bits % 4;
  92026. if (c == 32) {
  92027. c = 28;
  92028. }
  92029. if (c < 0) {
  92030. /* Number of bits in top word is less than number needed. */
  92031. c = -c;
  92032. y = (byte)(n << c);
  92033. n = e[i--];
  92034. y |= (byte)(n >> (64 - c));
  92035. n <<= c;
  92036. c = 64 - c;
  92037. }
  92038. else if (c == 0) {
  92039. /* All bits in top word used. */
  92040. y = (byte)n;
  92041. }
  92042. else {
  92043. y = (byte)(n >> c);
  92044. n <<= 32 - c;
  92045. }
  92046. XMEMCPY(r, t[y], sizeof(sp_digit) * 128);
  92047. for (; i>=0 || c>=4; ) {
  92048. if (c == 0) {
  92049. n = e[i--];
  92050. y = (byte)(n >> 28);
  92051. n <<= 4;
  92052. c = 28;
  92053. }
  92054. else if (c < 4) {
  92055. y = (byte)(n >> 28);
  92056. n = e[i--];
  92057. c = 4 - c;
  92058. y |= (byte)(n >> (32 - c));
  92059. n <<= c;
  92060. c = 32 - c;
  92061. }
  92062. else {
  92063. y = (byte)((n >> 28) & 0xf);
  92064. n <<= 4;
  92065. c -= 4;
  92066. }
  92067. sp_4096_mont_sqr_128(r, r, m, mp);
  92068. sp_4096_mont_sqr_128(r, r, m, mp);
  92069. sp_4096_mont_sqr_128(r, r, m, mp);
  92070. sp_4096_mont_sqr_128(r, r, m, mp);
  92071. sp_4096_mont_mul_128(r, r, t[y], m, mp);
  92072. }
  92073. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  92074. sp_4096_mont_reduce_128(r, m, mp);
  92075. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  92076. sp_4096_cond_sub_128(r, r, m, mask);
  92077. }
  92078. #ifdef WOLFSSL_SP_SMALL_STACK
  92079. if (td != NULL)
  92080. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  92081. #endif
  92082. return err;
  92083. }
  92084. #endif /* WOLFSSL_SP_SMALL */
  92085. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  92086. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  92087. #ifdef WOLFSSL_HAVE_SP_RSA
  92088. /* RSA public key operation.
  92089. *
  92090. * in Array of bytes representing the number to exponentiate, base.
  92091. * inLen Number of bytes in base.
  92092. * em Public exponent.
  92093. * mm Modulus.
  92094. * out Buffer to hold big-endian bytes of exponentiation result.
  92095. * Must be at least 512 bytes long.
  92096. * outLen Number of bytes in result.
  92097. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  92098. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  92099. */
  92100. int sp_RsaPublic_4096(const byte* in, word32 inLen, const mp_int* em,
  92101. const mp_int* mm, byte* out, word32* outLen)
  92102. {
  92103. #ifdef WOLFSSL_SP_SMALL_STACK
  92104. sp_digit* a = NULL;
  92105. #else
  92106. sp_digit a[128 * 5];
  92107. #endif
  92108. sp_digit* m = NULL;
  92109. sp_digit* r = NULL;
  92110. sp_digit *ah = NULL;
  92111. sp_digit e[1] = {0};
  92112. int err = MP_OKAY;
  92113. if (*outLen < 512) {
  92114. err = MP_TO_E;
  92115. }
  92116. else if (mp_count_bits(em) > 32 || inLen > 512 ||
  92117. mp_count_bits(mm) != 4096) {
  92118. err = MP_READ_E;
  92119. }
  92120. else if (mp_iseven(mm)) {
  92121. err = MP_VAL;
  92122. }
  92123. #ifdef WOLFSSL_SP_SMALL_STACK
  92124. if (err == MP_OKAY) {
  92125. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 5, NULL,
  92126. DYNAMIC_TYPE_RSA);
  92127. if (a == NULL)
  92128. err = MEMORY_E;
  92129. }
  92130. #endif
  92131. if (err == MP_OKAY) {
  92132. ah = a + 128;
  92133. r = a + 128 * 2;
  92134. m = r + 128 * 2;
  92135. sp_4096_from_bin(ah, 128, in, inLen);
  92136. #if DIGIT_BIT >= 32
  92137. e[0] = em->dp[0];
  92138. #else
  92139. e[0] = em->dp[0];
  92140. if (em->used > 1) {
  92141. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  92142. }
  92143. #endif
  92144. if (e[0] == 0) {
  92145. err = MP_EXPTMOD_E;
  92146. }
  92147. }
  92148. if (err == MP_OKAY) {
  92149. sp_4096_from_mp(m, 128, mm);
  92150. if (e[0] == 0x10001) {
  92151. int i;
  92152. sp_digit mp;
  92153. sp_4096_mont_setup(m, &mp);
  92154. /* Convert to Montgomery form. */
  92155. XMEMSET(a, 0, sizeof(sp_digit) * 128);
  92156. err = sp_4096_mod_128_cond(r, a, m);
  92157. /* Montgomery form: r = a.R mod m */
  92158. if (err == MP_OKAY) {
  92159. /* r = a ^ 0x10000 => r = a squared 16 times */
  92160. for (i = 15; i >= 0; i--) {
  92161. sp_4096_mont_sqr_128(r, r, m, mp);
  92162. }
  92163. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  92164. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  92165. */
  92166. sp_4096_mont_mul_128(r, r, ah, m, mp);
  92167. for (i = 127; i > 0; i--) {
  92168. if (r[i] != m[i]) {
  92169. break;
  92170. }
  92171. }
  92172. if (r[i] >= m[i]) {
  92173. sp_4096_sub_in_place_128(r, m);
  92174. }
  92175. }
  92176. }
  92177. else if (e[0] == 0x3) {
  92178. if (err == MP_OKAY) {
  92179. sp_4096_sqr_128(r, ah);
  92180. err = sp_4096_mod_128_cond(r, r, m);
  92181. }
  92182. if (err == MP_OKAY) {
  92183. sp_4096_mul_128(r, ah, r);
  92184. err = sp_4096_mod_128_cond(r, r, m);
  92185. }
  92186. }
  92187. else {
  92188. int i;
  92189. sp_digit mp;
  92190. sp_4096_mont_setup(m, &mp);
  92191. /* Convert to Montgomery form. */
  92192. XMEMSET(a, 0, sizeof(sp_digit) * 128);
  92193. err = sp_4096_mod_128_cond(a, a, m);
  92194. if (err == MP_OKAY) {
  92195. for (i = 31; i >= 0; i--) {
  92196. if (e[0] >> i) {
  92197. break;
  92198. }
  92199. }
  92200. XMEMCPY(r, a, sizeof(sp_digit) * 128);
  92201. for (i--; i >= 0; i--) {
  92202. sp_4096_mont_sqr_128(r, r, m, mp);
  92203. if (((e[0] >> i) & 1) == 1) {
  92204. sp_4096_mont_mul_128(r, r, a, m, mp);
  92205. }
  92206. }
  92207. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128);
  92208. sp_4096_mont_reduce_128(r, m, mp);
  92209. for (i = 127; i > 0; i--) {
  92210. if (r[i] != m[i]) {
  92211. break;
  92212. }
  92213. }
  92214. if (r[i] >= m[i]) {
  92215. sp_4096_sub_in_place_128(r, m);
  92216. }
  92217. }
  92218. }
  92219. }
  92220. if (err == MP_OKAY) {
  92221. sp_4096_to_bin_128(r, out);
  92222. *outLen = 512;
  92223. }
  92224. #ifdef WOLFSSL_SP_SMALL_STACK
  92225. if (a != NULL)
  92226. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  92227. #endif
  92228. return err;
  92229. }
  92230. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  92231. /* Conditionally add a and b using the mask m.
  92232. * m is -1 to add and 0 when not.
  92233. *
  92234. * r A single precision number representing conditional add result.
  92235. * a A single precision number to add with.
  92236. * b A single precision number to add.
  92237. * m Mask value to apply.
  92238. */
  92239. SP_NOINLINE static sp_digit sp_4096_cond_add_64(sp_digit* r, const sp_digit* a,
  92240. const sp_digit* b, sp_digit m)
  92241. {
  92242. __asm__ __volatile__ (
  92243. "movs r4, #0\n\t"
  92244. "movs r5, #0xff\n\t"
  92245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92246. "adds r5, r5, #1\n\t"
  92247. #else
  92248. "add r5, r5, #1\n\t"
  92249. #endif
  92250. "mov r8, r5\n\t"
  92251. "movs r7, #0\n\t"
  92252. "\n"
  92253. "L_sp_4096_cond_add_64_words_%=:\n\t"
  92254. "ldr r6, [%[b], r7]\n\t"
  92255. #ifdef WOLFSSL_KEIL
  92256. "ands r6, r6, %[m]\n\t"
  92257. #elif defined(__clang__)
  92258. "ands r6, %[m]\n\t"
  92259. #else
  92260. "and r6, %[m]\n\t"
  92261. #endif
  92262. "movs r5, #0\n\t"
  92263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92264. "subs r5, r5, #1\n\t"
  92265. #else
  92266. "sub r5, r5, #1\n\t"
  92267. #endif
  92268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92269. "adds r5, r5, r4\n\t"
  92270. #else
  92271. "add r5, r5, r4\n\t"
  92272. #endif
  92273. "ldr r5, [%[a], r7]\n\t"
  92274. #ifdef WOLFSSL_KEIL
  92275. "adcs r5, r5, r6\n\t"
  92276. #elif defined(__clang__)
  92277. "adcs r5, r6\n\t"
  92278. #else
  92279. "adc r5, r6\n\t"
  92280. #endif
  92281. "movs r4, #0\n\t"
  92282. #ifdef WOLFSSL_KEIL
  92283. "adcs r4, r4, r4\n\t"
  92284. #elif defined(__clang__)
  92285. "adcs r4, r4\n\t"
  92286. #else
  92287. "adc r4, r4\n\t"
  92288. #endif
  92289. "str r5, [%[r], r7]\n\t"
  92290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92291. "adds r7, r7, #4\n\t"
  92292. #else
  92293. "add r7, r7, #4\n\t"
  92294. #endif
  92295. "cmp r7, r8\n\t"
  92296. "blt L_sp_4096_cond_add_64_words_%=\n\t"
  92297. "movs %[r], r4\n\t"
  92298. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  92299. :
  92300. : "memory", "r4", "r5", "r6", "r7", "r8"
  92301. );
  92302. return (uint32_t)(size_t)r;
  92303. }
  92304. /* RSA private key operation.
  92305. *
  92306. * in Array of bytes representing the number to exponentiate, base.
  92307. * inLen Number of bytes in base.
  92308. * dm Private exponent.
  92309. * pm First prime.
  92310. * qm Second prime.
  92311. * dpm First prime's CRT exponent.
  92312. * dqm Second prime's CRT exponent.
  92313. * qim Inverse of second prime mod p.
  92314. * mm Modulus.
  92315. * out Buffer to hold big-endian bytes of exponentiation result.
  92316. * Must be at least 512 bytes long.
  92317. * outLen Number of bytes in result.
  92318. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  92319. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  92320. */
  92321. int sp_RsaPrivate_4096(const byte* in, word32 inLen, const mp_int* dm,
  92322. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  92323. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  92324. {
  92325. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  92326. #ifdef WOLFSSL_SP_SMALL_STACK
  92327. sp_digit* d = NULL;
  92328. #else
  92329. sp_digit d[128 * 4];
  92330. #endif
  92331. sp_digit* a = NULL;
  92332. sp_digit* m = NULL;
  92333. sp_digit* r = NULL;
  92334. int err = MP_OKAY;
  92335. (void)pm;
  92336. (void)qm;
  92337. (void)dpm;
  92338. (void)dqm;
  92339. (void)qim;
  92340. if (*outLen < 512U) {
  92341. err = MP_TO_E;
  92342. }
  92343. if (err == MP_OKAY) {
  92344. if (mp_count_bits(dm) > 4096) {
  92345. err = MP_READ_E;
  92346. }
  92347. else if (inLen > 512) {
  92348. err = MP_READ_E;
  92349. }
  92350. else if (mp_count_bits(mm) != 4096) {
  92351. err = MP_READ_E;
  92352. }
  92353. else if (mp_iseven(mm)) {
  92354. err = MP_VAL;
  92355. }
  92356. }
  92357. #ifdef WOLFSSL_SP_SMALL_STACK
  92358. if (err == MP_OKAY) {
  92359. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 4, NULL,
  92360. DYNAMIC_TYPE_RSA);
  92361. if (d == NULL)
  92362. err = MEMORY_E;
  92363. }
  92364. #endif
  92365. if (err == MP_OKAY) {
  92366. a = d + 128;
  92367. m = a + 256;
  92368. r = a;
  92369. sp_4096_from_bin(a, 128, in, inLen);
  92370. sp_4096_from_mp(d, 128, dm);
  92371. sp_4096_from_mp(m, 128, mm);
  92372. err = sp_4096_mod_exp_128(r, a, d, 4096, m, 0);
  92373. }
  92374. if (err == MP_OKAY) {
  92375. sp_4096_to_bin_128(r, out);
  92376. *outLen = 512;
  92377. }
  92378. #ifdef WOLFSSL_SP_SMALL_STACK
  92379. if (d != NULL)
  92380. #endif
  92381. {
  92382. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  92383. if (a != NULL)
  92384. ForceZero(a, sizeof(sp_digit) * 128);
  92385. #ifdef WOLFSSL_SP_SMALL_STACK
  92386. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  92387. #endif
  92388. }
  92389. return err;
  92390. #else
  92391. #ifdef WOLFSSL_SP_SMALL_STACK
  92392. sp_digit* a = NULL;
  92393. #else
  92394. sp_digit a[64 * 11];
  92395. #endif
  92396. sp_digit* p = NULL;
  92397. sp_digit* q = NULL;
  92398. sp_digit* dp = NULL;
  92399. sp_digit* tmpa = NULL;
  92400. sp_digit* tmpb = NULL;
  92401. sp_digit* r = NULL;
  92402. sp_digit* qi = NULL;
  92403. sp_digit* dq = NULL;
  92404. sp_digit c;
  92405. int err = MP_OKAY;
  92406. (void)dm;
  92407. (void)mm;
  92408. if (*outLen < 512) {
  92409. err = MP_TO_E;
  92410. }
  92411. else if (inLen > 512 || mp_count_bits(mm) != 4096) {
  92412. err = MP_READ_E;
  92413. }
  92414. else if (mp_iseven(mm)) {
  92415. err = MP_VAL;
  92416. }
  92417. else if (mp_iseven(pm)) {
  92418. err = MP_VAL;
  92419. }
  92420. else if (mp_iseven(qm)) {
  92421. err = MP_VAL;
  92422. }
  92423. #ifdef WOLFSSL_SP_SMALL_STACK
  92424. if (err == MP_OKAY) {
  92425. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 11, NULL,
  92426. DYNAMIC_TYPE_RSA);
  92427. if (a == NULL)
  92428. err = MEMORY_E;
  92429. }
  92430. #endif
  92431. if (err == MP_OKAY) {
  92432. p = a + 128 * 2;
  92433. q = p + 64;
  92434. qi = dq = dp = q + 64;
  92435. tmpa = qi + 64;
  92436. tmpb = tmpa + 128;
  92437. r = a;
  92438. sp_4096_from_bin(a, 128, in, inLen);
  92439. sp_4096_from_mp(p, 64, pm);
  92440. sp_4096_from_mp(q, 64, qm);
  92441. sp_4096_from_mp(dp, 64, dpm);
  92442. err = sp_2048_mod_exp_64(tmpa, a, dp, 2048, p, 1);
  92443. }
  92444. if (err == MP_OKAY) {
  92445. sp_4096_from_mp(dq, 64, dqm);
  92446. err = sp_2048_mod_exp_64(tmpb, a, dq, 2048, q, 1);
  92447. }
  92448. if (err == MP_OKAY) {
  92449. c = sp_2048_sub_in_place_64(tmpa, tmpb);
  92450. c += sp_4096_cond_add_64(tmpa, tmpa, p, c);
  92451. sp_4096_cond_add_64(tmpa, tmpa, p, c);
  92452. sp_2048_from_mp(qi, 64, qim);
  92453. sp_2048_mul_64(tmpa, tmpa, qi);
  92454. err = sp_2048_mod_64(tmpa, tmpa, p);
  92455. }
  92456. if (err == MP_OKAY) {
  92457. sp_2048_mul_64(tmpa, q, tmpa);
  92458. XMEMSET(&tmpb[64], 0, sizeof(sp_digit) * 64);
  92459. sp_4096_add_128(r, tmpb, tmpa);
  92460. sp_4096_to_bin_128(r, out);
  92461. *outLen = 512;
  92462. }
  92463. #ifdef WOLFSSL_SP_SMALL_STACK
  92464. if (a != NULL)
  92465. #endif
  92466. {
  92467. ForceZero(a, sizeof(sp_digit) * 64 * 11);
  92468. #ifdef WOLFSSL_SP_SMALL_STACK
  92469. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  92470. #endif
  92471. }
  92472. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  92473. return err;
  92474. }
  92475. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  92476. #endif /* WOLFSSL_HAVE_SP_RSA */
  92477. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  92478. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  92479. /* Convert an array of sp_digit to an mp_int.
  92480. *
  92481. * a A single precision integer.
  92482. * r A multi-precision integer.
  92483. */
  92484. static int sp_4096_to_mp(const sp_digit* a, mp_int* r)
  92485. {
  92486. int err;
  92487. err = mp_grow(r, (4096 + DIGIT_BIT - 1) / DIGIT_BIT);
  92488. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  92489. #if DIGIT_BIT == 32
  92490. XMEMCPY(r->dp, a, sizeof(sp_digit) * 128);
  92491. r->used = 128;
  92492. mp_clamp(r);
  92493. #elif DIGIT_BIT < 32
  92494. int i;
  92495. int j = 0;
  92496. int s = 0;
  92497. r->dp[0] = 0;
  92498. for (i = 0; i < 128; i++) {
  92499. r->dp[j] |= (mp_digit)(a[i] << s);
  92500. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  92501. s = DIGIT_BIT - s;
  92502. r->dp[++j] = (mp_digit)(a[i] >> s);
  92503. while (s + DIGIT_BIT <= 32) {
  92504. s += DIGIT_BIT;
  92505. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  92506. if (s == SP_WORD_SIZE) {
  92507. r->dp[j] = 0;
  92508. }
  92509. else {
  92510. r->dp[j] = (mp_digit)(a[i] >> s);
  92511. }
  92512. }
  92513. s = 32 - s;
  92514. }
  92515. r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
  92516. mp_clamp(r);
  92517. #else
  92518. int i;
  92519. int j = 0;
  92520. int s = 0;
  92521. r->dp[0] = 0;
  92522. for (i = 0; i < 128; i++) {
  92523. r->dp[j] |= ((mp_digit)a[i]) << s;
  92524. if (s + 32 >= DIGIT_BIT) {
  92525. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  92526. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  92527. #endif
  92528. s = DIGIT_BIT - s;
  92529. r->dp[++j] = a[i] >> s;
  92530. s = 32 - s;
  92531. }
  92532. else {
  92533. s += 32;
  92534. }
  92535. }
  92536. r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
  92537. mp_clamp(r);
  92538. #endif
  92539. }
  92540. return err;
  92541. }
  92542. /* Perform the modular exponentiation for Diffie-Hellman.
  92543. *
  92544. * base Base. MP integer.
  92545. * exp Exponent. MP integer.
  92546. * mod Modulus. MP integer.
  92547. * res Result. MP integer.
  92548. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  92549. * and MEMORY_E if memory allocation fails.
  92550. */
  92551. int sp_ModExp_4096(const mp_int* base, const mp_int* exp, const mp_int* mod,
  92552. mp_int* res)
  92553. {
  92554. int err = MP_OKAY;
  92555. sp_digit b[256];
  92556. sp_digit e[128];
  92557. sp_digit m[128];
  92558. sp_digit* r = b;
  92559. int expBits = mp_count_bits(exp);
  92560. if (mp_count_bits(base) > 4096) {
  92561. err = MP_READ_E;
  92562. }
  92563. else if (expBits > 4096) {
  92564. err = MP_READ_E;
  92565. }
  92566. else if (mp_count_bits(mod) != 4096) {
  92567. err = MP_READ_E;
  92568. }
  92569. else if (mp_iseven(mod)) {
  92570. err = MP_VAL;
  92571. }
  92572. if (err == MP_OKAY) {
  92573. sp_4096_from_mp(b, 128, base);
  92574. sp_4096_from_mp(e, 128, exp);
  92575. sp_4096_from_mp(m, 128, mod);
  92576. err = sp_4096_mod_exp_128(r, b, e, expBits, m, 0);
  92577. }
  92578. if (err == MP_OKAY) {
  92579. err = sp_4096_to_mp(r, res);
  92580. }
  92581. XMEMSET(e, 0, sizeof(e));
  92582. return err;
  92583. }
  92584. #ifdef WOLFSSL_HAVE_SP_DH
  92585. #ifdef HAVE_FFDHE_4096
  92586. /* Lefy shift a by n bits into r. (r = a << n)
  92587. *
  92588. * r A single precision integer.
  92589. * a A single precision integer.
  92590. * n Integer representing number of bits to shift.
  92591. */
  92592. static void sp_4096_lshift_128(sp_digit* r, const sp_digit* a, byte n)
  92593. {
  92594. __asm__ __volatile__ (
  92595. "movs r7, #31\n\t"
  92596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92597. "subs r7, r7, %[n]\n\t"
  92598. #else
  92599. "sub r7, r7, %[n]\n\t"
  92600. #endif
  92601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92602. "adds %[a], %[a], #0xff\n\t"
  92603. #else
  92604. "add %[a], %[a], #0xff\n\t"
  92605. #endif
  92606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92607. "adds %[r], %[r], #0xff\n\t"
  92608. #else
  92609. "add %[r], %[r], #0xff\n\t"
  92610. #endif
  92611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92612. "adds %[a], %[a], #0xc1\n\t"
  92613. #else
  92614. "add %[a], %[a], #0xc1\n\t"
  92615. #endif
  92616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92617. "adds %[r], %[r], #0xc1\n\t"
  92618. #else
  92619. "add %[r], %[r], #0xc1\n\t"
  92620. #endif
  92621. "ldr r4, [%[a], #60]\n\t"
  92622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92623. "lsrs r5, r4, #1\n\t"
  92624. #else
  92625. "lsr r5, r4, #1\n\t"
  92626. #endif
  92627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92628. "lsls r4, r4, %[n]\n\t"
  92629. #else
  92630. "lsl r4, r4, %[n]\n\t"
  92631. #endif
  92632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92633. "lsrs r5, r5, r7\n\t"
  92634. #else
  92635. "lsr r5, r5, r7\n\t"
  92636. #endif
  92637. "ldr r3, [%[a], #56]\n\t"
  92638. "str r5, [%[r], #64]\n\t"
  92639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92640. "lsrs r6, r3, #1\n\t"
  92641. #else
  92642. "lsr r6, r3, #1\n\t"
  92643. #endif
  92644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92645. "lsls r3, r3, %[n]\n\t"
  92646. #else
  92647. "lsl r3, r3, %[n]\n\t"
  92648. #endif
  92649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92650. "lsrs r6, r6, r7\n\t"
  92651. #else
  92652. "lsr r6, r6, r7\n\t"
  92653. #endif
  92654. #ifdef WOLFSSL_KEIL
  92655. "orrs r4, r4, r6\n\t"
  92656. #elif defined(__clang__)
  92657. "orrs r4, r6\n\t"
  92658. #else
  92659. "orr r4, r6\n\t"
  92660. #endif
  92661. "ldr r5, [%[a], #52]\n\t"
  92662. "str r4, [%[r], #60]\n\t"
  92663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92664. "lsrs r6, r5, #1\n\t"
  92665. #else
  92666. "lsr r6, r5, #1\n\t"
  92667. #endif
  92668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92669. "lsls r5, r5, %[n]\n\t"
  92670. #else
  92671. "lsl r5, r5, %[n]\n\t"
  92672. #endif
  92673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92674. "lsrs r6, r6, r7\n\t"
  92675. #else
  92676. "lsr r6, r6, r7\n\t"
  92677. #endif
  92678. #ifdef WOLFSSL_KEIL
  92679. "orrs r3, r3, r6\n\t"
  92680. #elif defined(__clang__)
  92681. "orrs r3, r6\n\t"
  92682. #else
  92683. "orr r3, r6\n\t"
  92684. #endif
  92685. "ldr r4, [%[a], #48]\n\t"
  92686. "str r3, [%[r], #56]\n\t"
  92687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92688. "lsrs r6, r4, #1\n\t"
  92689. #else
  92690. "lsr r6, r4, #1\n\t"
  92691. #endif
  92692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92693. "lsls r4, r4, %[n]\n\t"
  92694. #else
  92695. "lsl r4, r4, %[n]\n\t"
  92696. #endif
  92697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92698. "lsrs r6, r6, r7\n\t"
  92699. #else
  92700. "lsr r6, r6, r7\n\t"
  92701. #endif
  92702. #ifdef WOLFSSL_KEIL
  92703. "orrs r5, r5, r6\n\t"
  92704. #elif defined(__clang__)
  92705. "orrs r5, r6\n\t"
  92706. #else
  92707. "orr r5, r6\n\t"
  92708. #endif
  92709. "ldr r3, [%[a], #44]\n\t"
  92710. "str r5, [%[r], #52]\n\t"
  92711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92712. "lsrs r6, r3, #1\n\t"
  92713. #else
  92714. "lsr r6, r3, #1\n\t"
  92715. #endif
  92716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92717. "lsls r3, r3, %[n]\n\t"
  92718. #else
  92719. "lsl r3, r3, %[n]\n\t"
  92720. #endif
  92721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92722. "lsrs r6, r6, r7\n\t"
  92723. #else
  92724. "lsr r6, r6, r7\n\t"
  92725. #endif
  92726. #ifdef WOLFSSL_KEIL
  92727. "orrs r4, r4, r6\n\t"
  92728. #elif defined(__clang__)
  92729. "orrs r4, r6\n\t"
  92730. #else
  92731. "orr r4, r6\n\t"
  92732. #endif
  92733. "ldr r5, [%[a], #40]\n\t"
  92734. "str r4, [%[r], #48]\n\t"
  92735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92736. "lsrs r6, r5, #1\n\t"
  92737. #else
  92738. "lsr r6, r5, #1\n\t"
  92739. #endif
  92740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92741. "lsls r5, r5, %[n]\n\t"
  92742. #else
  92743. "lsl r5, r5, %[n]\n\t"
  92744. #endif
  92745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92746. "lsrs r6, r6, r7\n\t"
  92747. #else
  92748. "lsr r6, r6, r7\n\t"
  92749. #endif
  92750. #ifdef WOLFSSL_KEIL
  92751. "orrs r3, r3, r6\n\t"
  92752. #elif defined(__clang__)
  92753. "orrs r3, r6\n\t"
  92754. #else
  92755. "orr r3, r6\n\t"
  92756. #endif
  92757. "ldr r4, [%[a], #36]\n\t"
  92758. "str r3, [%[r], #44]\n\t"
  92759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92760. "lsrs r6, r4, #1\n\t"
  92761. #else
  92762. "lsr r6, r4, #1\n\t"
  92763. #endif
  92764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92765. "lsls r4, r4, %[n]\n\t"
  92766. #else
  92767. "lsl r4, r4, %[n]\n\t"
  92768. #endif
  92769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92770. "lsrs r6, r6, r7\n\t"
  92771. #else
  92772. "lsr r6, r6, r7\n\t"
  92773. #endif
  92774. #ifdef WOLFSSL_KEIL
  92775. "orrs r5, r5, r6\n\t"
  92776. #elif defined(__clang__)
  92777. "orrs r5, r6\n\t"
  92778. #else
  92779. "orr r5, r6\n\t"
  92780. #endif
  92781. "ldr r3, [%[a], #32]\n\t"
  92782. "str r5, [%[r], #40]\n\t"
  92783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92784. "lsrs r6, r3, #1\n\t"
  92785. #else
  92786. "lsr r6, r3, #1\n\t"
  92787. #endif
  92788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92789. "lsls r3, r3, %[n]\n\t"
  92790. #else
  92791. "lsl r3, r3, %[n]\n\t"
  92792. #endif
  92793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92794. "lsrs r6, r6, r7\n\t"
  92795. #else
  92796. "lsr r6, r6, r7\n\t"
  92797. #endif
  92798. #ifdef WOLFSSL_KEIL
  92799. "orrs r4, r4, r6\n\t"
  92800. #elif defined(__clang__)
  92801. "orrs r4, r6\n\t"
  92802. #else
  92803. "orr r4, r6\n\t"
  92804. #endif
  92805. "ldr r5, [%[a], #28]\n\t"
  92806. "str r4, [%[r], #36]\n\t"
  92807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92808. "lsrs r6, r5, #1\n\t"
  92809. #else
  92810. "lsr r6, r5, #1\n\t"
  92811. #endif
  92812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92813. "lsls r5, r5, %[n]\n\t"
  92814. #else
  92815. "lsl r5, r5, %[n]\n\t"
  92816. #endif
  92817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92818. "lsrs r6, r6, r7\n\t"
  92819. #else
  92820. "lsr r6, r6, r7\n\t"
  92821. #endif
  92822. #ifdef WOLFSSL_KEIL
  92823. "orrs r3, r3, r6\n\t"
  92824. #elif defined(__clang__)
  92825. "orrs r3, r6\n\t"
  92826. #else
  92827. "orr r3, r6\n\t"
  92828. #endif
  92829. "ldr r4, [%[a], #24]\n\t"
  92830. "str r3, [%[r], #32]\n\t"
  92831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92832. "lsrs r6, r4, #1\n\t"
  92833. #else
  92834. "lsr r6, r4, #1\n\t"
  92835. #endif
  92836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92837. "lsls r4, r4, %[n]\n\t"
  92838. #else
  92839. "lsl r4, r4, %[n]\n\t"
  92840. #endif
  92841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92842. "lsrs r6, r6, r7\n\t"
  92843. #else
  92844. "lsr r6, r6, r7\n\t"
  92845. #endif
  92846. #ifdef WOLFSSL_KEIL
  92847. "orrs r5, r5, r6\n\t"
  92848. #elif defined(__clang__)
  92849. "orrs r5, r6\n\t"
  92850. #else
  92851. "orr r5, r6\n\t"
  92852. #endif
  92853. "ldr r3, [%[a], #20]\n\t"
  92854. "str r5, [%[r], #28]\n\t"
  92855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92856. "lsrs r6, r3, #1\n\t"
  92857. #else
  92858. "lsr r6, r3, #1\n\t"
  92859. #endif
  92860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92861. "lsls r3, r3, %[n]\n\t"
  92862. #else
  92863. "lsl r3, r3, %[n]\n\t"
  92864. #endif
  92865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92866. "lsrs r6, r6, r7\n\t"
  92867. #else
  92868. "lsr r6, r6, r7\n\t"
  92869. #endif
  92870. #ifdef WOLFSSL_KEIL
  92871. "orrs r4, r4, r6\n\t"
  92872. #elif defined(__clang__)
  92873. "orrs r4, r6\n\t"
  92874. #else
  92875. "orr r4, r6\n\t"
  92876. #endif
  92877. "ldr r5, [%[a], #16]\n\t"
  92878. "str r4, [%[r], #24]\n\t"
  92879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92880. "lsrs r6, r5, #1\n\t"
  92881. #else
  92882. "lsr r6, r5, #1\n\t"
  92883. #endif
  92884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92885. "lsls r5, r5, %[n]\n\t"
  92886. #else
  92887. "lsl r5, r5, %[n]\n\t"
  92888. #endif
  92889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92890. "lsrs r6, r6, r7\n\t"
  92891. #else
  92892. "lsr r6, r6, r7\n\t"
  92893. #endif
  92894. #ifdef WOLFSSL_KEIL
  92895. "orrs r3, r3, r6\n\t"
  92896. #elif defined(__clang__)
  92897. "orrs r3, r6\n\t"
  92898. #else
  92899. "orr r3, r6\n\t"
  92900. #endif
  92901. "ldr r4, [%[a], #12]\n\t"
  92902. "str r3, [%[r], #20]\n\t"
  92903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92904. "lsrs r6, r4, #1\n\t"
  92905. #else
  92906. "lsr r6, r4, #1\n\t"
  92907. #endif
  92908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92909. "lsls r4, r4, %[n]\n\t"
  92910. #else
  92911. "lsl r4, r4, %[n]\n\t"
  92912. #endif
  92913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92914. "lsrs r6, r6, r7\n\t"
  92915. #else
  92916. "lsr r6, r6, r7\n\t"
  92917. #endif
  92918. #ifdef WOLFSSL_KEIL
  92919. "orrs r5, r5, r6\n\t"
  92920. #elif defined(__clang__)
  92921. "orrs r5, r6\n\t"
  92922. #else
  92923. "orr r5, r6\n\t"
  92924. #endif
  92925. "ldr r3, [%[a], #8]\n\t"
  92926. "str r5, [%[r], #16]\n\t"
  92927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92928. "lsrs r6, r3, #1\n\t"
  92929. #else
  92930. "lsr r6, r3, #1\n\t"
  92931. #endif
  92932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92933. "lsls r3, r3, %[n]\n\t"
  92934. #else
  92935. "lsl r3, r3, %[n]\n\t"
  92936. #endif
  92937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92938. "lsrs r6, r6, r7\n\t"
  92939. #else
  92940. "lsr r6, r6, r7\n\t"
  92941. #endif
  92942. #ifdef WOLFSSL_KEIL
  92943. "orrs r4, r4, r6\n\t"
  92944. #elif defined(__clang__)
  92945. "orrs r4, r6\n\t"
  92946. #else
  92947. "orr r4, r6\n\t"
  92948. #endif
  92949. "ldr r5, [%[a], #4]\n\t"
  92950. "str r4, [%[r], #12]\n\t"
  92951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92952. "lsrs r6, r5, #1\n\t"
  92953. #else
  92954. "lsr r6, r5, #1\n\t"
  92955. #endif
  92956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92957. "lsls r5, r5, %[n]\n\t"
  92958. #else
  92959. "lsl r5, r5, %[n]\n\t"
  92960. #endif
  92961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92962. "lsrs r6, r6, r7\n\t"
  92963. #else
  92964. "lsr r6, r6, r7\n\t"
  92965. #endif
  92966. #ifdef WOLFSSL_KEIL
  92967. "orrs r3, r3, r6\n\t"
  92968. #elif defined(__clang__)
  92969. "orrs r3, r6\n\t"
  92970. #else
  92971. "orr r3, r6\n\t"
  92972. #endif
  92973. "ldr r4, [%[a]]\n\t"
  92974. "str r3, [%[r], #8]\n\t"
  92975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92976. "lsrs r6, r4, #1\n\t"
  92977. #else
  92978. "lsr r6, r4, #1\n\t"
  92979. #endif
  92980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92981. "lsls r4, r4, %[n]\n\t"
  92982. #else
  92983. "lsl r4, r4, %[n]\n\t"
  92984. #endif
  92985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92986. "lsrs r6, r6, r7\n\t"
  92987. #else
  92988. "lsr r6, r6, r7\n\t"
  92989. #endif
  92990. #ifdef WOLFSSL_KEIL
  92991. "orrs r5, r5, r6\n\t"
  92992. #elif defined(__clang__)
  92993. "orrs r5, r6\n\t"
  92994. #else
  92995. "orr r5, r6\n\t"
  92996. #endif
  92997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92998. "subs %[a], %[a], #0x40\n\t"
  92999. #else
  93000. "sub %[a], %[a], #0x40\n\t"
  93001. #endif
  93002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93003. "subs %[r], %[r], #0x40\n\t"
  93004. #else
  93005. "sub %[r], %[r], #0x40\n\t"
  93006. #endif
  93007. "ldr r3, [%[a], #60]\n\t"
  93008. "str r5, [%[r], #68]\n\t"
  93009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93010. "lsrs r6, r3, #1\n\t"
  93011. #else
  93012. "lsr r6, r3, #1\n\t"
  93013. #endif
  93014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93015. "lsls r3, r3, %[n]\n\t"
  93016. #else
  93017. "lsl r3, r3, %[n]\n\t"
  93018. #endif
  93019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93020. "lsrs r6, r6, r7\n\t"
  93021. #else
  93022. "lsr r6, r6, r7\n\t"
  93023. #endif
  93024. #ifdef WOLFSSL_KEIL
  93025. "orrs r4, r4, r6\n\t"
  93026. #elif defined(__clang__)
  93027. "orrs r4, r6\n\t"
  93028. #else
  93029. "orr r4, r6\n\t"
  93030. #endif
  93031. "ldr r5, [%[a], #56]\n\t"
  93032. "str r4, [%[r], #64]\n\t"
  93033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93034. "lsrs r6, r5, #1\n\t"
  93035. #else
  93036. "lsr r6, r5, #1\n\t"
  93037. #endif
  93038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93039. "lsls r5, r5, %[n]\n\t"
  93040. #else
  93041. "lsl r5, r5, %[n]\n\t"
  93042. #endif
  93043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93044. "lsrs r6, r6, r7\n\t"
  93045. #else
  93046. "lsr r6, r6, r7\n\t"
  93047. #endif
  93048. #ifdef WOLFSSL_KEIL
  93049. "orrs r3, r3, r6\n\t"
  93050. #elif defined(__clang__)
  93051. "orrs r3, r6\n\t"
  93052. #else
  93053. "orr r3, r6\n\t"
  93054. #endif
  93055. "ldr r4, [%[a], #52]\n\t"
  93056. "str r3, [%[r], #60]\n\t"
  93057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93058. "lsrs r6, r4, #1\n\t"
  93059. #else
  93060. "lsr r6, r4, #1\n\t"
  93061. #endif
  93062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93063. "lsls r4, r4, %[n]\n\t"
  93064. #else
  93065. "lsl r4, r4, %[n]\n\t"
  93066. #endif
  93067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93068. "lsrs r6, r6, r7\n\t"
  93069. #else
  93070. "lsr r6, r6, r7\n\t"
  93071. #endif
  93072. #ifdef WOLFSSL_KEIL
  93073. "orrs r5, r5, r6\n\t"
  93074. #elif defined(__clang__)
  93075. "orrs r5, r6\n\t"
  93076. #else
  93077. "orr r5, r6\n\t"
  93078. #endif
  93079. "ldr r3, [%[a], #48]\n\t"
  93080. "str r5, [%[r], #56]\n\t"
  93081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93082. "lsrs r6, r3, #1\n\t"
  93083. #else
  93084. "lsr r6, r3, #1\n\t"
  93085. #endif
  93086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93087. "lsls r3, r3, %[n]\n\t"
  93088. #else
  93089. "lsl r3, r3, %[n]\n\t"
  93090. #endif
  93091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93092. "lsrs r6, r6, r7\n\t"
  93093. #else
  93094. "lsr r6, r6, r7\n\t"
  93095. #endif
  93096. #ifdef WOLFSSL_KEIL
  93097. "orrs r4, r4, r6\n\t"
  93098. #elif defined(__clang__)
  93099. "orrs r4, r6\n\t"
  93100. #else
  93101. "orr r4, r6\n\t"
  93102. #endif
  93103. "ldr r5, [%[a], #44]\n\t"
  93104. "str r4, [%[r], #52]\n\t"
  93105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93106. "lsrs r6, r5, #1\n\t"
  93107. #else
  93108. "lsr r6, r5, #1\n\t"
  93109. #endif
  93110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93111. "lsls r5, r5, %[n]\n\t"
  93112. #else
  93113. "lsl r5, r5, %[n]\n\t"
  93114. #endif
  93115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93116. "lsrs r6, r6, r7\n\t"
  93117. #else
  93118. "lsr r6, r6, r7\n\t"
  93119. #endif
  93120. #ifdef WOLFSSL_KEIL
  93121. "orrs r3, r3, r6\n\t"
  93122. #elif defined(__clang__)
  93123. "orrs r3, r6\n\t"
  93124. #else
  93125. "orr r3, r6\n\t"
  93126. #endif
  93127. "ldr r4, [%[a], #40]\n\t"
  93128. "str r3, [%[r], #48]\n\t"
  93129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93130. "lsrs r6, r4, #1\n\t"
  93131. #else
  93132. "lsr r6, r4, #1\n\t"
  93133. #endif
  93134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93135. "lsls r4, r4, %[n]\n\t"
  93136. #else
  93137. "lsl r4, r4, %[n]\n\t"
  93138. #endif
  93139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93140. "lsrs r6, r6, r7\n\t"
  93141. #else
  93142. "lsr r6, r6, r7\n\t"
  93143. #endif
  93144. #ifdef WOLFSSL_KEIL
  93145. "orrs r5, r5, r6\n\t"
  93146. #elif defined(__clang__)
  93147. "orrs r5, r6\n\t"
  93148. #else
  93149. "orr r5, r6\n\t"
  93150. #endif
  93151. "ldr r3, [%[a], #36]\n\t"
  93152. "str r5, [%[r], #44]\n\t"
  93153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93154. "lsrs r6, r3, #1\n\t"
  93155. #else
  93156. "lsr r6, r3, #1\n\t"
  93157. #endif
  93158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93159. "lsls r3, r3, %[n]\n\t"
  93160. #else
  93161. "lsl r3, r3, %[n]\n\t"
  93162. #endif
  93163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93164. "lsrs r6, r6, r7\n\t"
  93165. #else
  93166. "lsr r6, r6, r7\n\t"
  93167. #endif
  93168. #ifdef WOLFSSL_KEIL
  93169. "orrs r4, r4, r6\n\t"
  93170. #elif defined(__clang__)
  93171. "orrs r4, r6\n\t"
  93172. #else
  93173. "orr r4, r6\n\t"
  93174. #endif
  93175. "ldr r5, [%[a], #32]\n\t"
  93176. "str r4, [%[r], #40]\n\t"
  93177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93178. "lsrs r6, r5, #1\n\t"
  93179. #else
  93180. "lsr r6, r5, #1\n\t"
  93181. #endif
  93182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93183. "lsls r5, r5, %[n]\n\t"
  93184. #else
  93185. "lsl r5, r5, %[n]\n\t"
  93186. #endif
  93187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93188. "lsrs r6, r6, r7\n\t"
  93189. #else
  93190. "lsr r6, r6, r7\n\t"
  93191. #endif
  93192. #ifdef WOLFSSL_KEIL
  93193. "orrs r3, r3, r6\n\t"
  93194. #elif defined(__clang__)
  93195. "orrs r3, r6\n\t"
  93196. #else
  93197. "orr r3, r6\n\t"
  93198. #endif
  93199. "ldr r4, [%[a], #28]\n\t"
  93200. "str r3, [%[r], #36]\n\t"
  93201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93202. "lsrs r6, r4, #1\n\t"
  93203. #else
  93204. "lsr r6, r4, #1\n\t"
  93205. #endif
  93206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93207. "lsls r4, r4, %[n]\n\t"
  93208. #else
  93209. "lsl r4, r4, %[n]\n\t"
  93210. #endif
  93211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93212. "lsrs r6, r6, r7\n\t"
  93213. #else
  93214. "lsr r6, r6, r7\n\t"
  93215. #endif
  93216. #ifdef WOLFSSL_KEIL
  93217. "orrs r5, r5, r6\n\t"
  93218. #elif defined(__clang__)
  93219. "orrs r5, r6\n\t"
  93220. #else
  93221. "orr r5, r6\n\t"
  93222. #endif
  93223. "ldr r3, [%[a], #24]\n\t"
  93224. "str r5, [%[r], #32]\n\t"
  93225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93226. "lsrs r6, r3, #1\n\t"
  93227. #else
  93228. "lsr r6, r3, #1\n\t"
  93229. #endif
  93230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93231. "lsls r3, r3, %[n]\n\t"
  93232. #else
  93233. "lsl r3, r3, %[n]\n\t"
  93234. #endif
  93235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93236. "lsrs r6, r6, r7\n\t"
  93237. #else
  93238. "lsr r6, r6, r7\n\t"
  93239. #endif
  93240. #ifdef WOLFSSL_KEIL
  93241. "orrs r4, r4, r6\n\t"
  93242. #elif defined(__clang__)
  93243. "orrs r4, r6\n\t"
  93244. #else
  93245. "orr r4, r6\n\t"
  93246. #endif
  93247. "ldr r5, [%[a], #20]\n\t"
  93248. "str r4, [%[r], #28]\n\t"
  93249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93250. "lsrs r6, r5, #1\n\t"
  93251. #else
  93252. "lsr r6, r5, #1\n\t"
  93253. #endif
  93254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93255. "lsls r5, r5, %[n]\n\t"
  93256. #else
  93257. "lsl r5, r5, %[n]\n\t"
  93258. #endif
  93259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93260. "lsrs r6, r6, r7\n\t"
  93261. #else
  93262. "lsr r6, r6, r7\n\t"
  93263. #endif
  93264. #ifdef WOLFSSL_KEIL
  93265. "orrs r3, r3, r6\n\t"
  93266. #elif defined(__clang__)
  93267. "orrs r3, r6\n\t"
  93268. #else
  93269. "orr r3, r6\n\t"
  93270. #endif
  93271. "ldr r4, [%[a], #16]\n\t"
  93272. "str r3, [%[r], #24]\n\t"
  93273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93274. "lsrs r6, r4, #1\n\t"
  93275. #else
  93276. "lsr r6, r4, #1\n\t"
  93277. #endif
  93278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93279. "lsls r4, r4, %[n]\n\t"
  93280. #else
  93281. "lsl r4, r4, %[n]\n\t"
  93282. #endif
  93283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93284. "lsrs r6, r6, r7\n\t"
  93285. #else
  93286. "lsr r6, r6, r7\n\t"
  93287. #endif
  93288. #ifdef WOLFSSL_KEIL
  93289. "orrs r5, r5, r6\n\t"
  93290. #elif defined(__clang__)
  93291. "orrs r5, r6\n\t"
  93292. #else
  93293. "orr r5, r6\n\t"
  93294. #endif
  93295. "ldr r3, [%[a], #12]\n\t"
  93296. "str r5, [%[r], #20]\n\t"
  93297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93298. "lsrs r6, r3, #1\n\t"
  93299. #else
  93300. "lsr r6, r3, #1\n\t"
  93301. #endif
  93302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93303. "lsls r3, r3, %[n]\n\t"
  93304. #else
  93305. "lsl r3, r3, %[n]\n\t"
  93306. #endif
  93307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93308. "lsrs r6, r6, r7\n\t"
  93309. #else
  93310. "lsr r6, r6, r7\n\t"
  93311. #endif
  93312. #ifdef WOLFSSL_KEIL
  93313. "orrs r4, r4, r6\n\t"
  93314. #elif defined(__clang__)
  93315. "orrs r4, r6\n\t"
  93316. #else
  93317. "orr r4, r6\n\t"
  93318. #endif
  93319. "ldr r5, [%[a], #8]\n\t"
  93320. "str r4, [%[r], #16]\n\t"
  93321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93322. "lsrs r6, r5, #1\n\t"
  93323. #else
  93324. "lsr r6, r5, #1\n\t"
  93325. #endif
  93326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93327. "lsls r5, r5, %[n]\n\t"
  93328. #else
  93329. "lsl r5, r5, %[n]\n\t"
  93330. #endif
  93331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93332. "lsrs r6, r6, r7\n\t"
  93333. #else
  93334. "lsr r6, r6, r7\n\t"
  93335. #endif
  93336. #ifdef WOLFSSL_KEIL
  93337. "orrs r3, r3, r6\n\t"
  93338. #elif defined(__clang__)
  93339. "orrs r3, r6\n\t"
  93340. #else
  93341. "orr r3, r6\n\t"
  93342. #endif
  93343. "ldr r4, [%[a], #4]\n\t"
  93344. "str r3, [%[r], #12]\n\t"
  93345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93346. "lsrs r6, r4, #1\n\t"
  93347. #else
  93348. "lsr r6, r4, #1\n\t"
  93349. #endif
  93350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93351. "lsls r4, r4, %[n]\n\t"
  93352. #else
  93353. "lsl r4, r4, %[n]\n\t"
  93354. #endif
  93355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93356. "lsrs r6, r6, r7\n\t"
  93357. #else
  93358. "lsr r6, r6, r7\n\t"
  93359. #endif
  93360. #ifdef WOLFSSL_KEIL
  93361. "orrs r5, r5, r6\n\t"
  93362. #elif defined(__clang__)
  93363. "orrs r5, r6\n\t"
  93364. #else
  93365. "orr r5, r6\n\t"
  93366. #endif
  93367. "ldr r3, [%[a]]\n\t"
  93368. "str r5, [%[r], #8]\n\t"
  93369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93370. "lsrs r6, r3, #1\n\t"
  93371. #else
  93372. "lsr r6, r3, #1\n\t"
  93373. #endif
  93374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93375. "lsls r3, r3, %[n]\n\t"
  93376. #else
  93377. "lsl r3, r3, %[n]\n\t"
  93378. #endif
  93379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93380. "lsrs r6, r6, r7\n\t"
  93381. #else
  93382. "lsr r6, r6, r7\n\t"
  93383. #endif
  93384. #ifdef WOLFSSL_KEIL
  93385. "orrs r4, r4, r6\n\t"
  93386. #elif defined(__clang__)
  93387. "orrs r4, r6\n\t"
  93388. #else
  93389. "orr r4, r6\n\t"
  93390. #endif
  93391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93392. "subs %[a], %[a], #0x40\n\t"
  93393. #else
  93394. "sub %[a], %[a], #0x40\n\t"
  93395. #endif
  93396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93397. "subs %[r], %[r], #0x40\n\t"
  93398. #else
  93399. "sub %[r], %[r], #0x40\n\t"
  93400. #endif
  93401. "ldr r5, [%[a], #60]\n\t"
  93402. "str r4, [%[r], #68]\n\t"
  93403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93404. "lsrs r6, r5, #1\n\t"
  93405. #else
  93406. "lsr r6, r5, #1\n\t"
  93407. #endif
  93408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93409. "lsls r5, r5, %[n]\n\t"
  93410. #else
  93411. "lsl r5, r5, %[n]\n\t"
  93412. #endif
  93413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93414. "lsrs r6, r6, r7\n\t"
  93415. #else
  93416. "lsr r6, r6, r7\n\t"
  93417. #endif
  93418. #ifdef WOLFSSL_KEIL
  93419. "orrs r3, r3, r6\n\t"
  93420. #elif defined(__clang__)
  93421. "orrs r3, r6\n\t"
  93422. #else
  93423. "orr r3, r6\n\t"
  93424. #endif
  93425. "ldr r4, [%[a], #56]\n\t"
  93426. "str r3, [%[r], #64]\n\t"
  93427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93428. "lsrs r6, r4, #1\n\t"
  93429. #else
  93430. "lsr r6, r4, #1\n\t"
  93431. #endif
  93432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93433. "lsls r4, r4, %[n]\n\t"
  93434. #else
  93435. "lsl r4, r4, %[n]\n\t"
  93436. #endif
  93437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93438. "lsrs r6, r6, r7\n\t"
  93439. #else
  93440. "lsr r6, r6, r7\n\t"
  93441. #endif
  93442. #ifdef WOLFSSL_KEIL
  93443. "orrs r5, r5, r6\n\t"
  93444. #elif defined(__clang__)
  93445. "orrs r5, r6\n\t"
  93446. #else
  93447. "orr r5, r6\n\t"
  93448. #endif
  93449. "ldr r3, [%[a], #52]\n\t"
  93450. "str r5, [%[r], #60]\n\t"
  93451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93452. "lsrs r6, r3, #1\n\t"
  93453. #else
  93454. "lsr r6, r3, #1\n\t"
  93455. #endif
  93456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93457. "lsls r3, r3, %[n]\n\t"
  93458. #else
  93459. "lsl r3, r3, %[n]\n\t"
  93460. #endif
  93461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93462. "lsrs r6, r6, r7\n\t"
  93463. #else
  93464. "lsr r6, r6, r7\n\t"
  93465. #endif
  93466. #ifdef WOLFSSL_KEIL
  93467. "orrs r4, r4, r6\n\t"
  93468. #elif defined(__clang__)
  93469. "orrs r4, r6\n\t"
  93470. #else
  93471. "orr r4, r6\n\t"
  93472. #endif
  93473. "ldr r5, [%[a], #48]\n\t"
  93474. "str r4, [%[r], #56]\n\t"
  93475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93476. "lsrs r6, r5, #1\n\t"
  93477. #else
  93478. "lsr r6, r5, #1\n\t"
  93479. #endif
  93480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93481. "lsls r5, r5, %[n]\n\t"
  93482. #else
  93483. "lsl r5, r5, %[n]\n\t"
  93484. #endif
  93485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93486. "lsrs r6, r6, r7\n\t"
  93487. #else
  93488. "lsr r6, r6, r7\n\t"
  93489. #endif
  93490. #ifdef WOLFSSL_KEIL
  93491. "orrs r3, r3, r6\n\t"
  93492. #elif defined(__clang__)
  93493. "orrs r3, r6\n\t"
  93494. #else
  93495. "orr r3, r6\n\t"
  93496. #endif
  93497. "ldr r4, [%[a], #44]\n\t"
  93498. "str r3, [%[r], #52]\n\t"
  93499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93500. "lsrs r6, r4, #1\n\t"
  93501. #else
  93502. "lsr r6, r4, #1\n\t"
  93503. #endif
  93504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93505. "lsls r4, r4, %[n]\n\t"
  93506. #else
  93507. "lsl r4, r4, %[n]\n\t"
  93508. #endif
  93509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93510. "lsrs r6, r6, r7\n\t"
  93511. #else
  93512. "lsr r6, r6, r7\n\t"
  93513. #endif
  93514. #ifdef WOLFSSL_KEIL
  93515. "orrs r5, r5, r6\n\t"
  93516. #elif defined(__clang__)
  93517. "orrs r5, r6\n\t"
  93518. #else
  93519. "orr r5, r6\n\t"
  93520. #endif
  93521. "ldr r3, [%[a], #40]\n\t"
  93522. "str r5, [%[r], #48]\n\t"
  93523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93524. "lsrs r6, r3, #1\n\t"
  93525. #else
  93526. "lsr r6, r3, #1\n\t"
  93527. #endif
  93528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93529. "lsls r3, r3, %[n]\n\t"
  93530. #else
  93531. "lsl r3, r3, %[n]\n\t"
  93532. #endif
  93533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93534. "lsrs r6, r6, r7\n\t"
  93535. #else
  93536. "lsr r6, r6, r7\n\t"
  93537. #endif
  93538. #ifdef WOLFSSL_KEIL
  93539. "orrs r4, r4, r6\n\t"
  93540. #elif defined(__clang__)
  93541. "orrs r4, r6\n\t"
  93542. #else
  93543. "orr r4, r6\n\t"
  93544. #endif
  93545. "ldr r5, [%[a], #36]\n\t"
  93546. "str r4, [%[r], #44]\n\t"
  93547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93548. "lsrs r6, r5, #1\n\t"
  93549. #else
  93550. "lsr r6, r5, #1\n\t"
  93551. #endif
  93552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93553. "lsls r5, r5, %[n]\n\t"
  93554. #else
  93555. "lsl r5, r5, %[n]\n\t"
  93556. #endif
  93557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93558. "lsrs r6, r6, r7\n\t"
  93559. #else
  93560. "lsr r6, r6, r7\n\t"
  93561. #endif
  93562. #ifdef WOLFSSL_KEIL
  93563. "orrs r3, r3, r6\n\t"
  93564. #elif defined(__clang__)
  93565. "orrs r3, r6\n\t"
  93566. #else
  93567. "orr r3, r6\n\t"
  93568. #endif
  93569. "ldr r4, [%[a], #32]\n\t"
  93570. "str r3, [%[r], #40]\n\t"
  93571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93572. "lsrs r6, r4, #1\n\t"
  93573. #else
  93574. "lsr r6, r4, #1\n\t"
  93575. #endif
  93576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93577. "lsls r4, r4, %[n]\n\t"
  93578. #else
  93579. "lsl r4, r4, %[n]\n\t"
  93580. #endif
  93581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93582. "lsrs r6, r6, r7\n\t"
  93583. #else
  93584. "lsr r6, r6, r7\n\t"
  93585. #endif
  93586. #ifdef WOLFSSL_KEIL
  93587. "orrs r5, r5, r6\n\t"
  93588. #elif defined(__clang__)
  93589. "orrs r5, r6\n\t"
  93590. #else
  93591. "orr r5, r6\n\t"
  93592. #endif
  93593. "ldr r3, [%[a], #28]\n\t"
  93594. "str r5, [%[r], #36]\n\t"
  93595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93596. "lsrs r6, r3, #1\n\t"
  93597. #else
  93598. "lsr r6, r3, #1\n\t"
  93599. #endif
  93600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93601. "lsls r3, r3, %[n]\n\t"
  93602. #else
  93603. "lsl r3, r3, %[n]\n\t"
  93604. #endif
  93605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93606. "lsrs r6, r6, r7\n\t"
  93607. #else
  93608. "lsr r6, r6, r7\n\t"
  93609. #endif
  93610. #ifdef WOLFSSL_KEIL
  93611. "orrs r4, r4, r6\n\t"
  93612. #elif defined(__clang__)
  93613. "orrs r4, r6\n\t"
  93614. #else
  93615. "orr r4, r6\n\t"
  93616. #endif
  93617. "ldr r5, [%[a], #24]\n\t"
  93618. "str r4, [%[r], #32]\n\t"
  93619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93620. "lsrs r6, r5, #1\n\t"
  93621. #else
  93622. "lsr r6, r5, #1\n\t"
  93623. #endif
  93624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93625. "lsls r5, r5, %[n]\n\t"
  93626. #else
  93627. "lsl r5, r5, %[n]\n\t"
  93628. #endif
  93629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93630. "lsrs r6, r6, r7\n\t"
  93631. #else
  93632. "lsr r6, r6, r7\n\t"
  93633. #endif
  93634. #ifdef WOLFSSL_KEIL
  93635. "orrs r3, r3, r6\n\t"
  93636. #elif defined(__clang__)
  93637. "orrs r3, r6\n\t"
  93638. #else
  93639. "orr r3, r6\n\t"
  93640. #endif
  93641. "ldr r4, [%[a], #20]\n\t"
  93642. "str r3, [%[r], #28]\n\t"
  93643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93644. "lsrs r6, r4, #1\n\t"
  93645. #else
  93646. "lsr r6, r4, #1\n\t"
  93647. #endif
  93648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93649. "lsls r4, r4, %[n]\n\t"
  93650. #else
  93651. "lsl r4, r4, %[n]\n\t"
  93652. #endif
  93653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93654. "lsrs r6, r6, r7\n\t"
  93655. #else
  93656. "lsr r6, r6, r7\n\t"
  93657. #endif
  93658. #ifdef WOLFSSL_KEIL
  93659. "orrs r5, r5, r6\n\t"
  93660. #elif defined(__clang__)
  93661. "orrs r5, r6\n\t"
  93662. #else
  93663. "orr r5, r6\n\t"
  93664. #endif
  93665. "ldr r3, [%[a], #16]\n\t"
  93666. "str r5, [%[r], #24]\n\t"
  93667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93668. "lsrs r6, r3, #1\n\t"
  93669. #else
  93670. "lsr r6, r3, #1\n\t"
  93671. #endif
  93672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93673. "lsls r3, r3, %[n]\n\t"
  93674. #else
  93675. "lsl r3, r3, %[n]\n\t"
  93676. #endif
  93677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93678. "lsrs r6, r6, r7\n\t"
  93679. #else
  93680. "lsr r6, r6, r7\n\t"
  93681. #endif
  93682. #ifdef WOLFSSL_KEIL
  93683. "orrs r4, r4, r6\n\t"
  93684. #elif defined(__clang__)
  93685. "orrs r4, r6\n\t"
  93686. #else
  93687. "orr r4, r6\n\t"
  93688. #endif
  93689. "ldr r5, [%[a], #12]\n\t"
  93690. "str r4, [%[r], #20]\n\t"
  93691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93692. "lsrs r6, r5, #1\n\t"
  93693. #else
  93694. "lsr r6, r5, #1\n\t"
  93695. #endif
  93696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93697. "lsls r5, r5, %[n]\n\t"
  93698. #else
  93699. "lsl r5, r5, %[n]\n\t"
  93700. #endif
  93701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93702. "lsrs r6, r6, r7\n\t"
  93703. #else
  93704. "lsr r6, r6, r7\n\t"
  93705. #endif
  93706. #ifdef WOLFSSL_KEIL
  93707. "orrs r3, r3, r6\n\t"
  93708. #elif defined(__clang__)
  93709. "orrs r3, r6\n\t"
  93710. #else
  93711. "orr r3, r6\n\t"
  93712. #endif
  93713. "ldr r4, [%[a], #8]\n\t"
  93714. "str r3, [%[r], #16]\n\t"
  93715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93716. "lsrs r6, r4, #1\n\t"
  93717. #else
  93718. "lsr r6, r4, #1\n\t"
  93719. #endif
  93720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93721. "lsls r4, r4, %[n]\n\t"
  93722. #else
  93723. "lsl r4, r4, %[n]\n\t"
  93724. #endif
  93725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93726. "lsrs r6, r6, r7\n\t"
  93727. #else
  93728. "lsr r6, r6, r7\n\t"
  93729. #endif
  93730. #ifdef WOLFSSL_KEIL
  93731. "orrs r5, r5, r6\n\t"
  93732. #elif defined(__clang__)
  93733. "orrs r5, r6\n\t"
  93734. #else
  93735. "orr r5, r6\n\t"
  93736. #endif
  93737. "ldr r3, [%[a], #4]\n\t"
  93738. "str r5, [%[r], #12]\n\t"
  93739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93740. "lsrs r6, r3, #1\n\t"
  93741. #else
  93742. "lsr r6, r3, #1\n\t"
  93743. #endif
  93744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93745. "lsls r3, r3, %[n]\n\t"
  93746. #else
  93747. "lsl r3, r3, %[n]\n\t"
  93748. #endif
  93749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93750. "lsrs r6, r6, r7\n\t"
  93751. #else
  93752. "lsr r6, r6, r7\n\t"
  93753. #endif
  93754. #ifdef WOLFSSL_KEIL
  93755. "orrs r4, r4, r6\n\t"
  93756. #elif defined(__clang__)
  93757. "orrs r4, r6\n\t"
  93758. #else
  93759. "orr r4, r6\n\t"
  93760. #endif
  93761. "ldr r5, [%[a]]\n\t"
  93762. "str r4, [%[r], #8]\n\t"
  93763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93764. "lsrs r6, r5, #1\n\t"
  93765. #else
  93766. "lsr r6, r5, #1\n\t"
  93767. #endif
  93768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93769. "lsls r5, r5, %[n]\n\t"
  93770. #else
  93771. "lsl r5, r5, %[n]\n\t"
  93772. #endif
  93773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93774. "lsrs r6, r6, r7\n\t"
  93775. #else
  93776. "lsr r6, r6, r7\n\t"
  93777. #endif
  93778. #ifdef WOLFSSL_KEIL
  93779. "orrs r3, r3, r6\n\t"
  93780. #elif defined(__clang__)
  93781. "orrs r3, r6\n\t"
  93782. #else
  93783. "orr r3, r6\n\t"
  93784. #endif
  93785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93786. "subs %[a], %[a], #0x40\n\t"
  93787. #else
  93788. "sub %[a], %[a], #0x40\n\t"
  93789. #endif
  93790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93791. "subs %[r], %[r], #0x40\n\t"
  93792. #else
  93793. "sub %[r], %[r], #0x40\n\t"
  93794. #endif
  93795. "ldr r4, [%[a], #60]\n\t"
  93796. "str r3, [%[r], #68]\n\t"
  93797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93798. "lsrs r6, r4, #1\n\t"
  93799. #else
  93800. "lsr r6, r4, #1\n\t"
  93801. #endif
  93802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93803. "lsls r4, r4, %[n]\n\t"
  93804. #else
  93805. "lsl r4, r4, %[n]\n\t"
  93806. #endif
  93807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93808. "lsrs r6, r6, r7\n\t"
  93809. #else
  93810. "lsr r6, r6, r7\n\t"
  93811. #endif
  93812. #ifdef WOLFSSL_KEIL
  93813. "orrs r5, r5, r6\n\t"
  93814. #elif defined(__clang__)
  93815. "orrs r5, r6\n\t"
  93816. #else
  93817. "orr r5, r6\n\t"
  93818. #endif
  93819. "ldr r3, [%[a], #56]\n\t"
  93820. "str r5, [%[r], #64]\n\t"
  93821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93822. "lsrs r6, r3, #1\n\t"
  93823. #else
  93824. "lsr r6, r3, #1\n\t"
  93825. #endif
  93826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93827. "lsls r3, r3, %[n]\n\t"
  93828. #else
  93829. "lsl r3, r3, %[n]\n\t"
  93830. #endif
  93831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93832. "lsrs r6, r6, r7\n\t"
  93833. #else
  93834. "lsr r6, r6, r7\n\t"
  93835. #endif
  93836. #ifdef WOLFSSL_KEIL
  93837. "orrs r4, r4, r6\n\t"
  93838. #elif defined(__clang__)
  93839. "orrs r4, r6\n\t"
  93840. #else
  93841. "orr r4, r6\n\t"
  93842. #endif
  93843. "ldr r5, [%[a], #52]\n\t"
  93844. "str r4, [%[r], #60]\n\t"
  93845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93846. "lsrs r6, r5, #1\n\t"
  93847. #else
  93848. "lsr r6, r5, #1\n\t"
  93849. #endif
  93850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93851. "lsls r5, r5, %[n]\n\t"
  93852. #else
  93853. "lsl r5, r5, %[n]\n\t"
  93854. #endif
  93855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93856. "lsrs r6, r6, r7\n\t"
  93857. #else
  93858. "lsr r6, r6, r7\n\t"
  93859. #endif
  93860. #ifdef WOLFSSL_KEIL
  93861. "orrs r3, r3, r6\n\t"
  93862. #elif defined(__clang__)
  93863. "orrs r3, r6\n\t"
  93864. #else
  93865. "orr r3, r6\n\t"
  93866. #endif
  93867. "ldr r4, [%[a], #48]\n\t"
  93868. "str r3, [%[r], #56]\n\t"
  93869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93870. "lsrs r6, r4, #1\n\t"
  93871. #else
  93872. "lsr r6, r4, #1\n\t"
  93873. #endif
  93874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93875. "lsls r4, r4, %[n]\n\t"
  93876. #else
  93877. "lsl r4, r4, %[n]\n\t"
  93878. #endif
  93879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93880. "lsrs r6, r6, r7\n\t"
  93881. #else
  93882. "lsr r6, r6, r7\n\t"
  93883. #endif
  93884. #ifdef WOLFSSL_KEIL
  93885. "orrs r5, r5, r6\n\t"
  93886. #elif defined(__clang__)
  93887. "orrs r5, r6\n\t"
  93888. #else
  93889. "orr r5, r6\n\t"
  93890. #endif
  93891. "ldr r3, [%[a], #44]\n\t"
  93892. "str r5, [%[r], #52]\n\t"
  93893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93894. "lsrs r6, r3, #1\n\t"
  93895. #else
  93896. "lsr r6, r3, #1\n\t"
  93897. #endif
  93898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93899. "lsls r3, r3, %[n]\n\t"
  93900. #else
  93901. "lsl r3, r3, %[n]\n\t"
  93902. #endif
  93903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93904. "lsrs r6, r6, r7\n\t"
  93905. #else
  93906. "lsr r6, r6, r7\n\t"
  93907. #endif
  93908. #ifdef WOLFSSL_KEIL
  93909. "orrs r4, r4, r6\n\t"
  93910. #elif defined(__clang__)
  93911. "orrs r4, r6\n\t"
  93912. #else
  93913. "orr r4, r6\n\t"
  93914. #endif
  93915. "ldr r5, [%[a], #40]\n\t"
  93916. "str r4, [%[r], #48]\n\t"
  93917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93918. "lsrs r6, r5, #1\n\t"
  93919. #else
  93920. "lsr r6, r5, #1\n\t"
  93921. #endif
  93922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93923. "lsls r5, r5, %[n]\n\t"
  93924. #else
  93925. "lsl r5, r5, %[n]\n\t"
  93926. #endif
  93927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93928. "lsrs r6, r6, r7\n\t"
  93929. #else
  93930. "lsr r6, r6, r7\n\t"
  93931. #endif
  93932. #ifdef WOLFSSL_KEIL
  93933. "orrs r3, r3, r6\n\t"
  93934. #elif defined(__clang__)
  93935. "orrs r3, r6\n\t"
  93936. #else
  93937. "orr r3, r6\n\t"
  93938. #endif
  93939. "ldr r4, [%[a], #36]\n\t"
  93940. "str r3, [%[r], #44]\n\t"
  93941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93942. "lsrs r6, r4, #1\n\t"
  93943. #else
  93944. "lsr r6, r4, #1\n\t"
  93945. #endif
  93946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93947. "lsls r4, r4, %[n]\n\t"
  93948. #else
  93949. "lsl r4, r4, %[n]\n\t"
  93950. #endif
  93951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93952. "lsrs r6, r6, r7\n\t"
  93953. #else
  93954. "lsr r6, r6, r7\n\t"
  93955. #endif
  93956. #ifdef WOLFSSL_KEIL
  93957. "orrs r5, r5, r6\n\t"
  93958. #elif defined(__clang__)
  93959. "orrs r5, r6\n\t"
  93960. #else
  93961. "orr r5, r6\n\t"
  93962. #endif
  93963. "ldr r3, [%[a], #32]\n\t"
  93964. "str r5, [%[r], #40]\n\t"
  93965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93966. "lsrs r6, r3, #1\n\t"
  93967. #else
  93968. "lsr r6, r3, #1\n\t"
  93969. #endif
  93970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93971. "lsls r3, r3, %[n]\n\t"
  93972. #else
  93973. "lsl r3, r3, %[n]\n\t"
  93974. #endif
  93975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93976. "lsrs r6, r6, r7\n\t"
  93977. #else
  93978. "lsr r6, r6, r7\n\t"
  93979. #endif
  93980. #ifdef WOLFSSL_KEIL
  93981. "orrs r4, r4, r6\n\t"
  93982. #elif defined(__clang__)
  93983. "orrs r4, r6\n\t"
  93984. #else
  93985. "orr r4, r6\n\t"
  93986. #endif
  93987. "ldr r5, [%[a], #28]\n\t"
  93988. "str r4, [%[r], #36]\n\t"
  93989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93990. "lsrs r6, r5, #1\n\t"
  93991. #else
  93992. "lsr r6, r5, #1\n\t"
  93993. #endif
  93994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93995. "lsls r5, r5, %[n]\n\t"
  93996. #else
  93997. "lsl r5, r5, %[n]\n\t"
  93998. #endif
  93999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94000. "lsrs r6, r6, r7\n\t"
  94001. #else
  94002. "lsr r6, r6, r7\n\t"
  94003. #endif
  94004. #ifdef WOLFSSL_KEIL
  94005. "orrs r3, r3, r6\n\t"
  94006. #elif defined(__clang__)
  94007. "orrs r3, r6\n\t"
  94008. #else
  94009. "orr r3, r6\n\t"
  94010. #endif
  94011. "ldr r4, [%[a], #24]\n\t"
  94012. "str r3, [%[r], #32]\n\t"
  94013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94014. "lsrs r6, r4, #1\n\t"
  94015. #else
  94016. "lsr r6, r4, #1\n\t"
  94017. #endif
  94018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94019. "lsls r4, r4, %[n]\n\t"
  94020. #else
  94021. "lsl r4, r4, %[n]\n\t"
  94022. #endif
  94023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94024. "lsrs r6, r6, r7\n\t"
  94025. #else
  94026. "lsr r6, r6, r7\n\t"
  94027. #endif
  94028. #ifdef WOLFSSL_KEIL
  94029. "orrs r5, r5, r6\n\t"
  94030. #elif defined(__clang__)
  94031. "orrs r5, r6\n\t"
  94032. #else
  94033. "orr r5, r6\n\t"
  94034. #endif
  94035. "ldr r3, [%[a], #20]\n\t"
  94036. "str r5, [%[r], #28]\n\t"
  94037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94038. "lsrs r6, r3, #1\n\t"
  94039. #else
  94040. "lsr r6, r3, #1\n\t"
  94041. #endif
  94042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94043. "lsls r3, r3, %[n]\n\t"
  94044. #else
  94045. "lsl r3, r3, %[n]\n\t"
  94046. #endif
  94047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94048. "lsrs r6, r6, r7\n\t"
  94049. #else
  94050. "lsr r6, r6, r7\n\t"
  94051. #endif
  94052. #ifdef WOLFSSL_KEIL
  94053. "orrs r4, r4, r6\n\t"
  94054. #elif defined(__clang__)
  94055. "orrs r4, r6\n\t"
  94056. #else
  94057. "orr r4, r6\n\t"
  94058. #endif
  94059. "ldr r5, [%[a], #16]\n\t"
  94060. "str r4, [%[r], #24]\n\t"
  94061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94062. "lsrs r6, r5, #1\n\t"
  94063. #else
  94064. "lsr r6, r5, #1\n\t"
  94065. #endif
  94066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94067. "lsls r5, r5, %[n]\n\t"
  94068. #else
  94069. "lsl r5, r5, %[n]\n\t"
  94070. #endif
  94071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94072. "lsrs r6, r6, r7\n\t"
  94073. #else
  94074. "lsr r6, r6, r7\n\t"
  94075. #endif
  94076. #ifdef WOLFSSL_KEIL
  94077. "orrs r3, r3, r6\n\t"
  94078. #elif defined(__clang__)
  94079. "orrs r3, r6\n\t"
  94080. #else
  94081. "orr r3, r6\n\t"
  94082. #endif
  94083. "ldr r4, [%[a], #12]\n\t"
  94084. "str r3, [%[r], #20]\n\t"
  94085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94086. "lsrs r6, r4, #1\n\t"
  94087. #else
  94088. "lsr r6, r4, #1\n\t"
  94089. #endif
  94090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94091. "lsls r4, r4, %[n]\n\t"
  94092. #else
  94093. "lsl r4, r4, %[n]\n\t"
  94094. #endif
  94095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94096. "lsrs r6, r6, r7\n\t"
  94097. #else
  94098. "lsr r6, r6, r7\n\t"
  94099. #endif
  94100. #ifdef WOLFSSL_KEIL
  94101. "orrs r5, r5, r6\n\t"
  94102. #elif defined(__clang__)
  94103. "orrs r5, r6\n\t"
  94104. #else
  94105. "orr r5, r6\n\t"
  94106. #endif
  94107. "ldr r3, [%[a], #8]\n\t"
  94108. "str r5, [%[r], #16]\n\t"
  94109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94110. "lsrs r6, r3, #1\n\t"
  94111. #else
  94112. "lsr r6, r3, #1\n\t"
  94113. #endif
  94114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94115. "lsls r3, r3, %[n]\n\t"
  94116. #else
  94117. "lsl r3, r3, %[n]\n\t"
  94118. #endif
  94119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94120. "lsrs r6, r6, r7\n\t"
  94121. #else
  94122. "lsr r6, r6, r7\n\t"
  94123. #endif
  94124. #ifdef WOLFSSL_KEIL
  94125. "orrs r4, r4, r6\n\t"
  94126. #elif defined(__clang__)
  94127. "orrs r4, r6\n\t"
  94128. #else
  94129. "orr r4, r6\n\t"
  94130. #endif
  94131. "ldr r5, [%[a], #4]\n\t"
  94132. "str r4, [%[r], #12]\n\t"
  94133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94134. "lsrs r6, r5, #1\n\t"
  94135. #else
  94136. "lsr r6, r5, #1\n\t"
  94137. #endif
  94138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94139. "lsls r5, r5, %[n]\n\t"
  94140. #else
  94141. "lsl r5, r5, %[n]\n\t"
  94142. #endif
  94143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94144. "lsrs r6, r6, r7\n\t"
  94145. #else
  94146. "lsr r6, r6, r7\n\t"
  94147. #endif
  94148. #ifdef WOLFSSL_KEIL
  94149. "orrs r3, r3, r6\n\t"
  94150. #elif defined(__clang__)
  94151. "orrs r3, r6\n\t"
  94152. #else
  94153. "orr r3, r6\n\t"
  94154. #endif
  94155. "ldr r4, [%[a]]\n\t"
  94156. "str r3, [%[r], #8]\n\t"
  94157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94158. "lsrs r6, r4, #1\n\t"
  94159. #else
  94160. "lsr r6, r4, #1\n\t"
  94161. #endif
  94162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94163. "lsls r4, r4, %[n]\n\t"
  94164. #else
  94165. "lsl r4, r4, %[n]\n\t"
  94166. #endif
  94167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94168. "lsrs r6, r6, r7\n\t"
  94169. #else
  94170. "lsr r6, r6, r7\n\t"
  94171. #endif
  94172. #ifdef WOLFSSL_KEIL
  94173. "orrs r5, r5, r6\n\t"
  94174. #elif defined(__clang__)
  94175. "orrs r5, r6\n\t"
  94176. #else
  94177. "orr r5, r6\n\t"
  94178. #endif
  94179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94180. "subs %[a], %[a], #0x40\n\t"
  94181. #else
  94182. "sub %[a], %[a], #0x40\n\t"
  94183. #endif
  94184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94185. "subs %[r], %[r], #0x40\n\t"
  94186. #else
  94187. "sub %[r], %[r], #0x40\n\t"
  94188. #endif
  94189. "ldr r3, [%[a], #60]\n\t"
  94190. "str r5, [%[r], #68]\n\t"
  94191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94192. "lsrs r6, r3, #1\n\t"
  94193. #else
  94194. "lsr r6, r3, #1\n\t"
  94195. #endif
  94196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94197. "lsls r3, r3, %[n]\n\t"
  94198. #else
  94199. "lsl r3, r3, %[n]\n\t"
  94200. #endif
  94201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94202. "lsrs r6, r6, r7\n\t"
  94203. #else
  94204. "lsr r6, r6, r7\n\t"
  94205. #endif
  94206. #ifdef WOLFSSL_KEIL
  94207. "orrs r4, r4, r6\n\t"
  94208. #elif defined(__clang__)
  94209. "orrs r4, r6\n\t"
  94210. #else
  94211. "orr r4, r6\n\t"
  94212. #endif
  94213. "ldr r5, [%[a], #56]\n\t"
  94214. "str r4, [%[r], #64]\n\t"
  94215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94216. "lsrs r6, r5, #1\n\t"
  94217. #else
  94218. "lsr r6, r5, #1\n\t"
  94219. #endif
  94220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94221. "lsls r5, r5, %[n]\n\t"
  94222. #else
  94223. "lsl r5, r5, %[n]\n\t"
  94224. #endif
  94225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94226. "lsrs r6, r6, r7\n\t"
  94227. #else
  94228. "lsr r6, r6, r7\n\t"
  94229. #endif
  94230. #ifdef WOLFSSL_KEIL
  94231. "orrs r3, r3, r6\n\t"
  94232. #elif defined(__clang__)
  94233. "orrs r3, r6\n\t"
  94234. #else
  94235. "orr r3, r6\n\t"
  94236. #endif
  94237. "ldr r4, [%[a], #52]\n\t"
  94238. "str r3, [%[r], #60]\n\t"
  94239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94240. "lsrs r6, r4, #1\n\t"
  94241. #else
  94242. "lsr r6, r4, #1\n\t"
  94243. #endif
  94244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94245. "lsls r4, r4, %[n]\n\t"
  94246. #else
  94247. "lsl r4, r4, %[n]\n\t"
  94248. #endif
  94249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94250. "lsrs r6, r6, r7\n\t"
  94251. #else
  94252. "lsr r6, r6, r7\n\t"
  94253. #endif
  94254. #ifdef WOLFSSL_KEIL
  94255. "orrs r5, r5, r6\n\t"
  94256. #elif defined(__clang__)
  94257. "orrs r5, r6\n\t"
  94258. #else
  94259. "orr r5, r6\n\t"
  94260. #endif
  94261. "ldr r3, [%[a], #48]\n\t"
  94262. "str r5, [%[r], #56]\n\t"
  94263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94264. "lsrs r6, r3, #1\n\t"
  94265. #else
  94266. "lsr r6, r3, #1\n\t"
  94267. #endif
  94268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94269. "lsls r3, r3, %[n]\n\t"
  94270. #else
  94271. "lsl r3, r3, %[n]\n\t"
  94272. #endif
  94273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94274. "lsrs r6, r6, r7\n\t"
  94275. #else
  94276. "lsr r6, r6, r7\n\t"
  94277. #endif
  94278. #ifdef WOLFSSL_KEIL
  94279. "orrs r4, r4, r6\n\t"
  94280. #elif defined(__clang__)
  94281. "orrs r4, r6\n\t"
  94282. #else
  94283. "orr r4, r6\n\t"
  94284. #endif
  94285. "ldr r5, [%[a], #44]\n\t"
  94286. "str r4, [%[r], #52]\n\t"
  94287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94288. "lsrs r6, r5, #1\n\t"
  94289. #else
  94290. "lsr r6, r5, #1\n\t"
  94291. #endif
  94292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94293. "lsls r5, r5, %[n]\n\t"
  94294. #else
  94295. "lsl r5, r5, %[n]\n\t"
  94296. #endif
  94297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94298. "lsrs r6, r6, r7\n\t"
  94299. #else
  94300. "lsr r6, r6, r7\n\t"
  94301. #endif
  94302. #ifdef WOLFSSL_KEIL
  94303. "orrs r3, r3, r6\n\t"
  94304. #elif defined(__clang__)
  94305. "orrs r3, r6\n\t"
  94306. #else
  94307. "orr r3, r6\n\t"
  94308. #endif
  94309. "ldr r4, [%[a], #40]\n\t"
  94310. "str r3, [%[r], #48]\n\t"
  94311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94312. "lsrs r6, r4, #1\n\t"
  94313. #else
  94314. "lsr r6, r4, #1\n\t"
  94315. #endif
  94316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94317. "lsls r4, r4, %[n]\n\t"
  94318. #else
  94319. "lsl r4, r4, %[n]\n\t"
  94320. #endif
  94321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94322. "lsrs r6, r6, r7\n\t"
  94323. #else
  94324. "lsr r6, r6, r7\n\t"
  94325. #endif
  94326. #ifdef WOLFSSL_KEIL
  94327. "orrs r5, r5, r6\n\t"
  94328. #elif defined(__clang__)
  94329. "orrs r5, r6\n\t"
  94330. #else
  94331. "orr r5, r6\n\t"
  94332. #endif
  94333. "ldr r3, [%[a], #36]\n\t"
  94334. "str r5, [%[r], #44]\n\t"
  94335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94336. "lsrs r6, r3, #1\n\t"
  94337. #else
  94338. "lsr r6, r3, #1\n\t"
  94339. #endif
  94340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94341. "lsls r3, r3, %[n]\n\t"
  94342. #else
  94343. "lsl r3, r3, %[n]\n\t"
  94344. #endif
  94345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94346. "lsrs r6, r6, r7\n\t"
  94347. #else
  94348. "lsr r6, r6, r7\n\t"
  94349. #endif
  94350. #ifdef WOLFSSL_KEIL
  94351. "orrs r4, r4, r6\n\t"
  94352. #elif defined(__clang__)
  94353. "orrs r4, r6\n\t"
  94354. #else
  94355. "orr r4, r6\n\t"
  94356. #endif
  94357. "ldr r5, [%[a], #32]\n\t"
  94358. "str r4, [%[r], #40]\n\t"
  94359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94360. "lsrs r6, r5, #1\n\t"
  94361. #else
  94362. "lsr r6, r5, #1\n\t"
  94363. #endif
  94364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94365. "lsls r5, r5, %[n]\n\t"
  94366. #else
  94367. "lsl r5, r5, %[n]\n\t"
  94368. #endif
  94369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94370. "lsrs r6, r6, r7\n\t"
  94371. #else
  94372. "lsr r6, r6, r7\n\t"
  94373. #endif
  94374. #ifdef WOLFSSL_KEIL
  94375. "orrs r3, r3, r6\n\t"
  94376. #elif defined(__clang__)
  94377. "orrs r3, r6\n\t"
  94378. #else
  94379. "orr r3, r6\n\t"
  94380. #endif
  94381. "ldr r4, [%[a], #28]\n\t"
  94382. "str r3, [%[r], #36]\n\t"
  94383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94384. "lsrs r6, r4, #1\n\t"
  94385. #else
  94386. "lsr r6, r4, #1\n\t"
  94387. #endif
  94388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94389. "lsls r4, r4, %[n]\n\t"
  94390. #else
  94391. "lsl r4, r4, %[n]\n\t"
  94392. #endif
  94393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94394. "lsrs r6, r6, r7\n\t"
  94395. #else
  94396. "lsr r6, r6, r7\n\t"
  94397. #endif
  94398. #ifdef WOLFSSL_KEIL
  94399. "orrs r5, r5, r6\n\t"
  94400. #elif defined(__clang__)
  94401. "orrs r5, r6\n\t"
  94402. #else
  94403. "orr r5, r6\n\t"
  94404. #endif
  94405. "ldr r3, [%[a], #24]\n\t"
  94406. "str r5, [%[r], #32]\n\t"
  94407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94408. "lsrs r6, r3, #1\n\t"
  94409. #else
  94410. "lsr r6, r3, #1\n\t"
  94411. #endif
  94412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94413. "lsls r3, r3, %[n]\n\t"
  94414. #else
  94415. "lsl r3, r3, %[n]\n\t"
  94416. #endif
  94417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94418. "lsrs r6, r6, r7\n\t"
  94419. #else
  94420. "lsr r6, r6, r7\n\t"
  94421. #endif
  94422. #ifdef WOLFSSL_KEIL
  94423. "orrs r4, r4, r6\n\t"
  94424. #elif defined(__clang__)
  94425. "orrs r4, r6\n\t"
  94426. #else
  94427. "orr r4, r6\n\t"
  94428. #endif
  94429. "ldr r5, [%[a], #20]\n\t"
  94430. "str r4, [%[r], #28]\n\t"
  94431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94432. "lsrs r6, r5, #1\n\t"
  94433. #else
  94434. "lsr r6, r5, #1\n\t"
  94435. #endif
  94436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94437. "lsls r5, r5, %[n]\n\t"
  94438. #else
  94439. "lsl r5, r5, %[n]\n\t"
  94440. #endif
  94441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94442. "lsrs r6, r6, r7\n\t"
  94443. #else
  94444. "lsr r6, r6, r7\n\t"
  94445. #endif
  94446. #ifdef WOLFSSL_KEIL
  94447. "orrs r3, r3, r6\n\t"
  94448. #elif defined(__clang__)
  94449. "orrs r3, r6\n\t"
  94450. #else
  94451. "orr r3, r6\n\t"
  94452. #endif
  94453. "ldr r4, [%[a], #16]\n\t"
  94454. "str r3, [%[r], #24]\n\t"
  94455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94456. "lsrs r6, r4, #1\n\t"
  94457. #else
  94458. "lsr r6, r4, #1\n\t"
  94459. #endif
  94460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94461. "lsls r4, r4, %[n]\n\t"
  94462. #else
  94463. "lsl r4, r4, %[n]\n\t"
  94464. #endif
  94465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94466. "lsrs r6, r6, r7\n\t"
  94467. #else
  94468. "lsr r6, r6, r7\n\t"
  94469. #endif
  94470. #ifdef WOLFSSL_KEIL
  94471. "orrs r5, r5, r6\n\t"
  94472. #elif defined(__clang__)
  94473. "orrs r5, r6\n\t"
  94474. #else
  94475. "orr r5, r6\n\t"
  94476. #endif
  94477. "ldr r3, [%[a], #12]\n\t"
  94478. "str r5, [%[r], #20]\n\t"
  94479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94480. "lsrs r6, r3, #1\n\t"
  94481. #else
  94482. "lsr r6, r3, #1\n\t"
  94483. #endif
  94484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94485. "lsls r3, r3, %[n]\n\t"
  94486. #else
  94487. "lsl r3, r3, %[n]\n\t"
  94488. #endif
  94489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94490. "lsrs r6, r6, r7\n\t"
  94491. #else
  94492. "lsr r6, r6, r7\n\t"
  94493. #endif
  94494. #ifdef WOLFSSL_KEIL
  94495. "orrs r4, r4, r6\n\t"
  94496. #elif defined(__clang__)
  94497. "orrs r4, r6\n\t"
  94498. #else
  94499. "orr r4, r6\n\t"
  94500. #endif
  94501. "ldr r5, [%[a], #8]\n\t"
  94502. "str r4, [%[r], #16]\n\t"
  94503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94504. "lsrs r6, r5, #1\n\t"
  94505. #else
  94506. "lsr r6, r5, #1\n\t"
  94507. #endif
  94508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94509. "lsls r5, r5, %[n]\n\t"
  94510. #else
  94511. "lsl r5, r5, %[n]\n\t"
  94512. #endif
  94513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94514. "lsrs r6, r6, r7\n\t"
  94515. #else
  94516. "lsr r6, r6, r7\n\t"
  94517. #endif
  94518. #ifdef WOLFSSL_KEIL
  94519. "orrs r3, r3, r6\n\t"
  94520. #elif defined(__clang__)
  94521. "orrs r3, r6\n\t"
  94522. #else
  94523. "orr r3, r6\n\t"
  94524. #endif
  94525. "ldr r4, [%[a], #4]\n\t"
  94526. "str r3, [%[r], #12]\n\t"
  94527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94528. "lsrs r6, r4, #1\n\t"
  94529. #else
  94530. "lsr r6, r4, #1\n\t"
  94531. #endif
  94532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94533. "lsls r4, r4, %[n]\n\t"
  94534. #else
  94535. "lsl r4, r4, %[n]\n\t"
  94536. #endif
  94537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94538. "lsrs r6, r6, r7\n\t"
  94539. #else
  94540. "lsr r6, r6, r7\n\t"
  94541. #endif
  94542. #ifdef WOLFSSL_KEIL
  94543. "orrs r5, r5, r6\n\t"
  94544. #elif defined(__clang__)
  94545. "orrs r5, r6\n\t"
  94546. #else
  94547. "orr r5, r6\n\t"
  94548. #endif
  94549. "ldr r3, [%[a]]\n\t"
  94550. "str r5, [%[r], #8]\n\t"
  94551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94552. "lsrs r6, r3, #1\n\t"
  94553. #else
  94554. "lsr r6, r3, #1\n\t"
  94555. #endif
  94556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94557. "lsls r3, r3, %[n]\n\t"
  94558. #else
  94559. "lsl r3, r3, %[n]\n\t"
  94560. #endif
  94561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94562. "lsrs r6, r6, r7\n\t"
  94563. #else
  94564. "lsr r6, r6, r7\n\t"
  94565. #endif
  94566. #ifdef WOLFSSL_KEIL
  94567. "orrs r4, r4, r6\n\t"
  94568. #elif defined(__clang__)
  94569. "orrs r4, r6\n\t"
  94570. #else
  94571. "orr r4, r6\n\t"
  94572. #endif
  94573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94574. "subs %[a], %[a], #0x40\n\t"
  94575. #else
  94576. "sub %[a], %[a], #0x40\n\t"
  94577. #endif
  94578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94579. "subs %[r], %[r], #0x40\n\t"
  94580. #else
  94581. "sub %[r], %[r], #0x40\n\t"
  94582. #endif
  94583. "ldr r5, [%[a], #60]\n\t"
  94584. "str r4, [%[r], #68]\n\t"
  94585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94586. "lsrs r6, r5, #1\n\t"
  94587. #else
  94588. "lsr r6, r5, #1\n\t"
  94589. #endif
  94590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94591. "lsls r5, r5, %[n]\n\t"
  94592. #else
  94593. "lsl r5, r5, %[n]\n\t"
  94594. #endif
  94595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94596. "lsrs r6, r6, r7\n\t"
  94597. #else
  94598. "lsr r6, r6, r7\n\t"
  94599. #endif
  94600. #ifdef WOLFSSL_KEIL
  94601. "orrs r3, r3, r6\n\t"
  94602. #elif defined(__clang__)
  94603. "orrs r3, r6\n\t"
  94604. #else
  94605. "orr r3, r6\n\t"
  94606. #endif
  94607. "ldr r4, [%[a], #56]\n\t"
  94608. "str r3, [%[r], #64]\n\t"
  94609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94610. "lsrs r6, r4, #1\n\t"
  94611. #else
  94612. "lsr r6, r4, #1\n\t"
  94613. #endif
  94614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94615. "lsls r4, r4, %[n]\n\t"
  94616. #else
  94617. "lsl r4, r4, %[n]\n\t"
  94618. #endif
  94619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94620. "lsrs r6, r6, r7\n\t"
  94621. #else
  94622. "lsr r6, r6, r7\n\t"
  94623. #endif
  94624. #ifdef WOLFSSL_KEIL
  94625. "orrs r5, r5, r6\n\t"
  94626. #elif defined(__clang__)
  94627. "orrs r5, r6\n\t"
  94628. #else
  94629. "orr r5, r6\n\t"
  94630. #endif
  94631. "ldr r3, [%[a], #52]\n\t"
  94632. "str r5, [%[r], #60]\n\t"
  94633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94634. "lsrs r6, r3, #1\n\t"
  94635. #else
  94636. "lsr r6, r3, #1\n\t"
  94637. #endif
  94638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94639. "lsls r3, r3, %[n]\n\t"
  94640. #else
  94641. "lsl r3, r3, %[n]\n\t"
  94642. #endif
  94643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94644. "lsrs r6, r6, r7\n\t"
  94645. #else
  94646. "lsr r6, r6, r7\n\t"
  94647. #endif
  94648. #ifdef WOLFSSL_KEIL
  94649. "orrs r4, r4, r6\n\t"
  94650. #elif defined(__clang__)
  94651. "orrs r4, r6\n\t"
  94652. #else
  94653. "orr r4, r6\n\t"
  94654. #endif
  94655. "ldr r5, [%[a], #48]\n\t"
  94656. "str r4, [%[r], #56]\n\t"
  94657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94658. "lsrs r6, r5, #1\n\t"
  94659. #else
  94660. "lsr r6, r5, #1\n\t"
  94661. #endif
  94662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94663. "lsls r5, r5, %[n]\n\t"
  94664. #else
  94665. "lsl r5, r5, %[n]\n\t"
  94666. #endif
  94667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94668. "lsrs r6, r6, r7\n\t"
  94669. #else
  94670. "lsr r6, r6, r7\n\t"
  94671. #endif
  94672. #ifdef WOLFSSL_KEIL
  94673. "orrs r3, r3, r6\n\t"
  94674. #elif defined(__clang__)
  94675. "orrs r3, r6\n\t"
  94676. #else
  94677. "orr r3, r6\n\t"
  94678. #endif
  94679. "ldr r4, [%[a], #44]\n\t"
  94680. "str r3, [%[r], #52]\n\t"
  94681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94682. "lsrs r6, r4, #1\n\t"
  94683. #else
  94684. "lsr r6, r4, #1\n\t"
  94685. #endif
  94686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94687. "lsls r4, r4, %[n]\n\t"
  94688. #else
  94689. "lsl r4, r4, %[n]\n\t"
  94690. #endif
  94691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94692. "lsrs r6, r6, r7\n\t"
  94693. #else
  94694. "lsr r6, r6, r7\n\t"
  94695. #endif
  94696. #ifdef WOLFSSL_KEIL
  94697. "orrs r5, r5, r6\n\t"
  94698. #elif defined(__clang__)
  94699. "orrs r5, r6\n\t"
  94700. #else
  94701. "orr r5, r6\n\t"
  94702. #endif
  94703. "ldr r3, [%[a], #40]\n\t"
  94704. "str r5, [%[r], #48]\n\t"
  94705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94706. "lsrs r6, r3, #1\n\t"
  94707. #else
  94708. "lsr r6, r3, #1\n\t"
  94709. #endif
  94710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94711. "lsls r3, r3, %[n]\n\t"
  94712. #else
  94713. "lsl r3, r3, %[n]\n\t"
  94714. #endif
  94715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94716. "lsrs r6, r6, r7\n\t"
  94717. #else
  94718. "lsr r6, r6, r7\n\t"
  94719. #endif
  94720. #ifdef WOLFSSL_KEIL
  94721. "orrs r4, r4, r6\n\t"
  94722. #elif defined(__clang__)
  94723. "orrs r4, r6\n\t"
  94724. #else
  94725. "orr r4, r6\n\t"
  94726. #endif
  94727. "ldr r5, [%[a], #36]\n\t"
  94728. "str r4, [%[r], #44]\n\t"
  94729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94730. "lsrs r6, r5, #1\n\t"
  94731. #else
  94732. "lsr r6, r5, #1\n\t"
  94733. #endif
  94734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94735. "lsls r5, r5, %[n]\n\t"
  94736. #else
  94737. "lsl r5, r5, %[n]\n\t"
  94738. #endif
  94739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94740. "lsrs r6, r6, r7\n\t"
  94741. #else
  94742. "lsr r6, r6, r7\n\t"
  94743. #endif
  94744. #ifdef WOLFSSL_KEIL
  94745. "orrs r3, r3, r6\n\t"
  94746. #elif defined(__clang__)
  94747. "orrs r3, r6\n\t"
  94748. #else
  94749. "orr r3, r6\n\t"
  94750. #endif
  94751. "ldr r4, [%[a], #32]\n\t"
  94752. "str r3, [%[r], #40]\n\t"
  94753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94754. "lsrs r6, r4, #1\n\t"
  94755. #else
  94756. "lsr r6, r4, #1\n\t"
  94757. #endif
  94758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94759. "lsls r4, r4, %[n]\n\t"
  94760. #else
  94761. "lsl r4, r4, %[n]\n\t"
  94762. #endif
  94763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94764. "lsrs r6, r6, r7\n\t"
  94765. #else
  94766. "lsr r6, r6, r7\n\t"
  94767. #endif
  94768. #ifdef WOLFSSL_KEIL
  94769. "orrs r5, r5, r6\n\t"
  94770. #elif defined(__clang__)
  94771. "orrs r5, r6\n\t"
  94772. #else
  94773. "orr r5, r6\n\t"
  94774. #endif
  94775. "ldr r3, [%[a], #28]\n\t"
  94776. "str r5, [%[r], #36]\n\t"
  94777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94778. "lsrs r6, r3, #1\n\t"
  94779. #else
  94780. "lsr r6, r3, #1\n\t"
  94781. #endif
  94782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94783. "lsls r3, r3, %[n]\n\t"
  94784. #else
  94785. "lsl r3, r3, %[n]\n\t"
  94786. #endif
  94787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94788. "lsrs r6, r6, r7\n\t"
  94789. #else
  94790. "lsr r6, r6, r7\n\t"
  94791. #endif
  94792. #ifdef WOLFSSL_KEIL
  94793. "orrs r4, r4, r6\n\t"
  94794. #elif defined(__clang__)
  94795. "orrs r4, r6\n\t"
  94796. #else
  94797. "orr r4, r6\n\t"
  94798. #endif
  94799. "ldr r5, [%[a], #24]\n\t"
  94800. "str r4, [%[r], #32]\n\t"
  94801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94802. "lsrs r6, r5, #1\n\t"
  94803. #else
  94804. "lsr r6, r5, #1\n\t"
  94805. #endif
  94806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94807. "lsls r5, r5, %[n]\n\t"
  94808. #else
  94809. "lsl r5, r5, %[n]\n\t"
  94810. #endif
  94811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94812. "lsrs r6, r6, r7\n\t"
  94813. #else
  94814. "lsr r6, r6, r7\n\t"
  94815. #endif
  94816. #ifdef WOLFSSL_KEIL
  94817. "orrs r3, r3, r6\n\t"
  94818. #elif defined(__clang__)
  94819. "orrs r3, r6\n\t"
  94820. #else
  94821. "orr r3, r6\n\t"
  94822. #endif
  94823. "ldr r4, [%[a], #20]\n\t"
  94824. "str r3, [%[r], #28]\n\t"
  94825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94826. "lsrs r6, r4, #1\n\t"
  94827. #else
  94828. "lsr r6, r4, #1\n\t"
  94829. #endif
  94830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94831. "lsls r4, r4, %[n]\n\t"
  94832. #else
  94833. "lsl r4, r4, %[n]\n\t"
  94834. #endif
  94835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94836. "lsrs r6, r6, r7\n\t"
  94837. #else
  94838. "lsr r6, r6, r7\n\t"
  94839. #endif
  94840. #ifdef WOLFSSL_KEIL
  94841. "orrs r5, r5, r6\n\t"
  94842. #elif defined(__clang__)
  94843. "orrs r5, r6\n\t"
  94844. #else
  94845. "orr r5, r6\n\t"
  94846. #endif
  94847. "ldr r3, [%[a], #16]\n\t"
  94848. "str r5, [%[r], #24]\n\t"
  94849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94850. "lsrs r6, r3, #1\n\t"
  94851. #else
  94852. "lsr r6, r3, #1\n\t"
  94853. #endif
  94854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94855. "lsls r3, r3, %[n]\n\t"
  94856. #else
  94857. "lsl r3, r3, %[n]\n\t"
  94858. #endif
  94859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94860. "lsrs r6, r6, r7\n\t"
  94861. #else
  94862. "lsr r6, r6, r7\n\t"
  94863. #endif
  94864. #ifdef WOLFSSL_KEIL
  94865. "orrs r4, r4, r6\n\t"
  94866. #elif defined(__clang__)
  94867. "orrs r4, r6\n\t"
  94868. #else
  94869. "orr r4, r6\n\t"
  94870. #endif
  94871. "ldr r5, [%[a], #12]\n\t"
  94872. "str r4, [%[r], #20]\n\t"
  94873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94874. "lsrs r6, r5, #1\n\t"
  94875. #else
  94876. "lsr r6, r5, #1\n\t"
  94877. #endif
  94878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94879. "lsls r5, r5, %[n]\n\t"
  94880. #else
  94881. "lsl r5, r5, %[n]\n\t"
  94882. #endif
  94883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94884. "lsrs r6, r6, r7\n\t"
  94885. #else
  94886. "lsr r6, r6, r7\n\t"
  94887. #endif
  94888. #ifdef WOLFSSL_KEIL
  94889. "orrs r3, r3, r6\n\t"
  94890. #elif defined(__clang__)
  94891. "orrs r3, r6\n\t"
  94892. #else
  94893. "orr r3, r6\n\t"
  94894. #endif
  94895. "ldr r4, [%[a], #8]\n\t"
  94896. "str r3, [%[r], #16]\n\t"
  94897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94898. "lsrs r6, r4, #1\n\t"
  94899. #else
  94900. "lsr r6, r4, #1\n\t"
  94901. #endif
  94902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94903. "lsls r4, r4, %[n]\n\t"
  94904. #else
  94905. "lsl r4, r4, %[n]\n\t"
  94906. #endif
  94907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94908. "lsrs r6, r6, r7\n\t"
  94909. #else
  94910. "lsr r6, r6, r7\n\t"
  94911. #endif
  94912. #ifdef WOLFSSL_KEIL
  94913. "orrs r5, r5, r6\n\t"
  94914. #elif defined(__clang__)
  94915. "orrs r5, r6\n\t"
  94916. #else
  94917. "orr r5, r6\n\t"
  94918. #endif
  94919. "ldr r3, [%[a], #4]\n\t"
  94920. "str r5, [%[r], #12]\n\t"
  94921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94922. "lsrs r6, r3, #1\n\t"
  94923. #else
  94924. "lsr r6, r3, #1\n\t"
  94925. #endif
  94926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94927. "lsls r3, r3, %[n]\n\t"
  94928. #else
  94929. "lsl r3, r3, %[n]\n\t"
  94930. #endif
  94931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94932. "lsrs r6, r6, r7\n\t"
  94933. #else
  94934. "lsr r6, r6, r7\n\t"
  94935. #endif
  94936. #ifdef WOLFSSL_KEIL
  94937. "orrs r4, r4, r6\n\t"
  94938. #elif defined(__clang__)
  94939. "orrs r4, r6\n\t"
  94940. #else
  94941. "orr r4, r6\n\t"
  94942. #endif
  94943. "ldr r5, [%[a]]\n\t"
  94944. "str r4, [%[r], #8]\n\t"
  94945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94946. "lsrs r6, r5, #1\n\t"
  94947. #else
  94948. "lsr r6, r5, #1\n\t"
  94949. #endif
  94950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94951. "lsls r5, r5, %[n]\n\t"
  94952. #else
  94953. "lsl r5, r5, %[n]\n\t"
  94954. #endif
  94955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94956. "lsrs r6, r6, r7\n\t"
  94957. #else
  94958. "lsr r6, r6, r7\n\t"
  94959. #endif
  94960. #ifdef WOLFSSL_KEIL
  94961. "orrs r3, r3, r6\n\t"
  94962. #elif defined(__clang__)
  94963. "orrs r3, r6\n\t"
  94964. #else
  94965. "orr r3, r6\n\t"
  94966. #endif
  94967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94968. "subs %[a], %[a], #0x40\n\t"
  94969. #else
  94970. "sub %[a], %[a], #0x40\n\t"
  94971. #endif
  94972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94973. "subs %[r], %[r], #0x40\n\t"
  94974. #else
  94975. "sub %[r], %[r], #0x40\n\t"
  94976. #endif
  94977. "ldr r4, [%[a], #60]\n\t"
  94978. "str r3, [%[r], #68]\n\t"
  94979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94980. "lsrs r6, r4, #1\n\t"
  94981. #else
  94982. "lsr r6, r4, #1\n\t"
  94983. #endif
  94984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94985. "lsls r4, r4, %[n]\n\t"
  94986. #else
  94987. "lsl r4, r4, %[n]\n\t"
  94988. #endif
  94989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94990. "lsrs r6, r6, r7\n\t"
  94991. #else
  94992. "lsr r6, r6, r7\n\t"
  94993. #endif
  94994. #ifdef WOLFSSL_KEIL
  94995. "orrs r5, r5, r6\n\t"
  94996. #elif defined(__clang__)
  94997. "orrs r5, r6\n\t"
  94998. #else
  94999. "orr r5, r6\n\t"
  95000. #endif
  95001. "ldr r3, [%[a], #56]\n\t"
  95002. "str r5, [%[r], #64]\n\t"
  95003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95004. "lsrs r6, r3, #1\n\t"
  95005. #else
  95006. "lsr r6, r3, #1\n\t"
  95007. #endif
  95008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95009. "lsls r3, r3, %[n]\n\t"
  95010. #else
  95011. "lsl r3, r3, %[n]\n\t"
  95012. #endif
  95013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95014. "lsrs r6, r6, r7\n\t"
  95015. #else
  95016. "lsr r6, r6, r7\n\t"
  95017. #endif
  95018. #ifdef WOLFSSL_KEIL
  95019. "orrs r4, r4, r6\n\t"
  95020. #elif defined(__clang__)
  95021. "orrs r4, r6\n\t"
  95022. #else
  95023. "orr r4, r6\n\t"
  95024. #endif
  95025. "ldr r5, [%[a], #52]\n\t"
  95026. "str r4, [%[r], #60]\n\t"
  95027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95028. "lsrs r6, r5, #1\n\t"
  95029. #else
  95030. "lsr r6, r5, #1\n\t"
  95031. #endif
  95032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95033. "lsls r5, r5, %[n]\n\t"
  95034. #else
  95035. "lsl r5, r5, %[n]\n\t"
  95036. #endif
  95037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95038. "lsrs r6, r6, r7\n\t"
  95039. #else
  95040. "lsr r6, r6, r7\n\t"
  95041. #endif
  95042. #ifdef WOLFSSL_KEIL
  95043. "orrs r3, r3, r6\n\t"
  95044. #elif defined(__clang__)
  95045. "orrs r3, r6\n\t"
  95046. #else
  95047. "orr r3, r6\n\t"
  95048. #endif
  95049. "ldr r4, [%[a], #48]\n\t"
  95050. "str r3, [%[r], #56]\n\t"
  95051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95052. "lsrs r6, r4, #1\n\t"
  95053. #else
  95054. "lsr r6, r4, #1\n\t"
  95055. #endif
  95056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95057. "lsls r4, r4, %[n]\n\t"
  95058. #else
  95059. "lsl r4, r4, %[n]\n\t"
  95060. #endif
  95061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95062. "lsrs r6, r6, r7\n\t"
  95063. #else
  95064. "lsr r6, r6, r7\n\t"
  95065. #endif
  95066. #ifdef WOLFSSL_KEIL
  95067. "orrs r5, r5, r6\n\t"
  95068. #elif defined(__clang__)
  95069. "orrs r5, r6\n\t"
  95070. #else
  95071. "orr r5, r6\n\t"
  95072. #endif
  95073. "ldr r3, [%[a], #44]\n\t"
  95074. "str r5, [%[r], #52]\n\t"
  95075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95076. "lsrs r6, r3, #1\n\t"
  95077. #else
  95078. "lsr r6, r3, #1\n\t"
  95079. #endif
  95080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95081. "lsls r3, r3, %[n]\n\t"
  95082. #else
  95083. "lsl r3, r3, %[n]\n\t"
  95084. #endif
  95085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95086. "lsrs r6, r6, r7\n\t"
  95087. #else
  95088. "lsr r6, r6, r7\n\t"
  95089. #endif
  95090. #ifdef WOLFSSL_KEIL
  95091. "orrs r4, r4, r6\n\t"
  95092. #elif defined(__clang__)
  95093. "orrs r4, r6\n\t"
  95094. #else
  95095. "orr r4, r6\n\t"
  95096. #endif
  95097. "ldr r5, [%[a], #40]\n\t"
  95098. "str r4, [%[r], #48]\n\t"
  95099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95100. "lsrs r6, r5, #1\n\t"
  95101. #else
  95102. "lsr r6, r5, #1\n\t"
  95103. #endif
  95104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95105. "lsls r5, r5, %[n]\n\t"
  95106. #else
  95107. "lsl r5, r5, %[n]\n\t"
  95108. #endif
  95109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95110. "lsrs r6, r6, r7\n\t"
  95111. #else
  95112. "lsr r6, r6, r7\n\t"
  95113. #endif
  95114. #ifdef WOLFSSL_KEIL
  95115. "orrs r3, r3, r6\n\t"
  95116. #elif defined(__clang__)
  95117. "orrs r3, r6\n\t"
  95118. #else
  95119. "orr r3, r6\n\t"
  95120. #endif
  95121. "ldr r4, [%[a], #36]\n\t"
  95122. "str r3, [%[r], #44]\n\t"
  95123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95124. "lsrs r6, r4, #1\n\t"
  95125. #else
  95126. "lsr r6, r4, #1\n\t"
  95127. #endif
  95128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95129. "lsls r4, r4, %[n]\n\t"
  95130. #else
  95131. "lsl r4, r4, %[n]\n\t"
  95132. #endif
  95133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95134. "lsrs r6, r6, r7\n\t"
  95135. #else
  95136. "lsr r6, r6, r7\n\t"
  95137. #endif
  95138. #ifdef WOLFSSL_KEIL
  95139. "orrs r5, r5, r6\n\t"
  95140. #elif defined(__clang__)
  95141. "orrs r5, r6\n\t"
  95142. #else
  95143. "orr r5, r6\n\t"
  95144. #endif
  95145. "ldr r3, [%[a], #32]\n\t"
  95146. "str r5, [%[r], #40]\n\t"
  95147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95148. "lsrs r6, r3, #1\n\t"
  95149. #else
  95150. "lsr r6, r3, #1\n\t"
  95151. #endif
  95152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95153. "lsls r3, r3, %[n]\n\t"
  95154. #else
  95155. "lsl r3, r3, %[n]\n\t"
  95156. #endif
  95157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95158. "lsrs r6, r6, r7\n\t"
  95159. #else
  95160. "lsr r6, r6, r7\n\t"
  95161. #endif
  95162. #ifdef WOLFSSL_KEIL
  95163. "orrs r4, r4, r6\n\t"
  95164. #elif defined(__clang__)
  95165. "orrs r4, r6\n\t"
  95166. #else
  95167. "orr r4, r6\n\t"
  95168. #endif
  95169. "ldr r5, [%[a], #28]\n\t"
  95170. "str r4, [%[r], #36]\n\t"
  95171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95172. "lsrs r6, r5, #1\n\t"
  95173. #else
  95174. "lsr r6, r5, #1\n\t"
  95175. #endif
  95176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95177. "lsls r5, r5, %[n]\n\t"
  95178. #else
  95179. "lsl r5, r5, %[n]\n\t"
  95180. #endif
  95181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95182. "lsrs r6, r6, r7\n\t"
  95183. #else
  95184. "lsr r6, r6, r7\n\t"
  95185. #endif
  95186. #ifdef WOLFSSL_KEIL
  95187. "orrs r3, r3, r6\n\t"
  95188. #elif defined(__clang__)
  95189. "orrs r3, r6\n\t"
  95190. #else
  95191. "orr r3, r6\n\t"
  95192. #endif
  95193. "ldr r4, [%[a], #24]\n\t"
  95194. "str r3, [%[r], #32]\n\t"
  95195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95196. "lsrs r6, r4, #1\n\t"
  95197. #else
  95198. "lsr r6, r4, #1\n\t"
  95199. #endif
  95200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95201. "lsls r4, r4, %[n]\n\t"
  95202. #else
  95203. "lsl r4, r4, %[n]\n\t"
  95204. #endif
  95205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95206. "lsrs r6, r6, r7\n\t"
  95207. #else
  95208. "lsr r6, r6, r7\n\t"
  95209. #endif
  95210. #ifdef WOLFSSL_KEIL
  95211. "orrs r5, r5, r6\n\t"
  95212. #elif defined(__clang__)
  95213. "orrs r5, r6\n\t"
  95214. #else
  95215. "orr r5, r6\n\t"
  95216. #endif
  95217. "ldr r3, [%[a], #20]\n\t"
  95218. "str r5, [%[r], #28]\n\t"
  95219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95220. "lsrs r6, r3, #1\n\t"
  95221. #else
  95222. "lsr r6, r3, #1\n\t"
  95223. #endif
  95224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95225. "lsls r3, r3, %[n]\n\t"
  95226. #else
  95227. "lsl r3, r3, %[n]\n\t"
  95228. #endif
  95229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95230. "lsrs r6, r6, r7\n\t"
  95231. #else
  95232. "lsr r6, r6, r7\n\t"
  95233. #endif
  95234. #ifdef WOLFSSL_KEIL
  95235. "orrs r4, r4, r6\n\t"
  95236. #elif defined(__clang__)
  95237. "orrs r4, r6\n\t"
  95238. #else
  95239. "orr r4, r6\n\t"
  95240. #endif
  95241. "ldr r5, [%[a], #16]\n\t"
  95242. "str r4, [%[r], #24]\n\t"
  95243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95244. "lsrs r6, r5, #1\n\t"
  95245. #else
  95246. "lsr r6, r5, #1\n\t"
  95247. #endif
  95248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95249. "lsls r5, r5, %[n]\n\t"
  95250. #else
  95251. "lsl r5, r5, %[n]\n\t"
  95252. #endif
  95253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95254. "lsrs r6, r6, r7\n\t"
  95255. #else
  95256. "lsr r6, r6, r7\n\t"
  95257. #endif
  95258. #ifdef WOLFSSL_KEIL
  95259. "orrs r3, r3, r6\n\t"
  95260. #elif defined(__clang__)
  95261. "orrs r3, r6\n\t"
  95262. #else
  95263. "orr r3, r6\n\t"
  95264. #endif
  95265. "ldr r4, [%[a], #12]\n\t"
  95266. "str r3, [%[r], #20]\n\t"
  95267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95268. "lsrs r6, r4, #1\n\t"
  95269. #else
  95270. "lsr r6, r4, #1\n\t"
  95271. #endif
  95272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95273. "lsls r4, r4, %[n]\n\t"
  95274. #else
  95275. "lsl r4, r4, %[n]\n\t"
  95276. #endif
  95277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95278. "lsrs r6, r6, r7\n\t"
  95279. #else
  95280. "lsr r6, r6, r7\n\t"
  95281. #endif
  95282. #ifdef WOLFSSL_KEIL
  95283. "orrs r5, r5, r6\n\t"
  95284. #elif defined(__clang__)
  95285. "orrs r5, r6\n\t"
  95286. #else
  95287. "orr r5, r6\n\t"
  95288. #endif
  95289. "ldr r3, [%[a], #8]\n\t"
  95290. "str r5, [%[r], #16]\n\t"
  95291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95292. "lsrs r6, r3, #1\n\t"
  95293. #else
  95294. "lsr r6, r3, #1\n\t"
  95295. #endif
  95296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95297. "lsls r3, r3, %[n]\n\t"
  95298. #else
  95299. "lsl r3, r3, %[n]\n\t"
  95300. #endif
  95301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95302. "lsrs r6, r6, r7\n\t"
  95303. #else
  95304. "lsr r6, r6, r7\n\t"
  95305. #endif
  95306. #ifdef WOLFSSL_KEIL
  95307. "orrs r4, r4, r6\n\t"
  95308. #elif defined(__clang__)
  95309. "orrs r4, r6\n\t"
  95310. #else
  95311. "orr r4, r6\n\t"
  95312. #endif
  95313. "ldr r5, [%[a], #4]\n\t"
  95314. "str r4, [%[r], #12]\n\t"
  95315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95316. "lsrs r6, r5, #1\n\t"
  95317. #else
  95318. "lsr r6, r5, #1\n\t"
  95319. #endif
  95320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95321. "lsls r5, r5, %[n]\n\t"
  95322. #else
  95323. "lsl r5, r5, %[n]\n\t"
  95324. #endif
  95325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95326. "lsrs r6, r6, r7\n\t"
  95327. #else
  95328. "lsr r6, r6, r7\n\t"
  95329. #endif
  95330. #ifdef WOLFSSL_KEIL
  95331. "orrs r3, r3, r6\n\t"
  95332. #elif defined(__clang__)
  95333. "orrs r3, r6\n\t"
  95334. #else
  95335. "orr r3, r6\n\t"
  95336. #endif
  95337. "ldr r4, [%[a]]\n\t"
  95338. "str r3, [%[r], #8]\n\t"
  95339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95340. "lsrs r6, r4, #1\n\t"
  95341. #else
  95342. "lsr r6, r4, #1\n\t"
  95343. #endif
  95344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95345. "lsls r4, r4, %[n]\n\t"
  95346. #else
  95347. "lsl r4, r4, %[n]\n\t"
  95348. #endif
  95349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95350. "lsrs r6, r6, r7\n\t"
  95351. #else
  95352. "lsr r6, r6, r7\n\t"
  95353. #endif
  95354. #ifdef WOLFSSL_KEIL
  95355. "orrs r5, r5, r6\n\t"
  95356. #elif defined(__clang__)
  95357. "orrs r5, r6\n\t"
  95358. #else
  95359. "orr r5, r6\n\t"
  95360. #endif
  95361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95362. "subs %[a], %[a], #0x40\n\t"
  95363. #else
  95364. "sub %[a], %[a], #0x40\n\t"
  95365. #endif
  95366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95367. "subs %[r], %[r], #0x40\n\t"
  95368. #else
  95369. "sub %[r], %[r], #0x40\n\t"
  95370. #endif
  95371. "ldr r3, [%[a], #60]\n\t"
  95372. "str r5, [%[r], #68]\n\t"
  95373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95374. "lsrs r6, r3, #1\n\t"
  95375. #else
  95376. "lsr r6, r3, #1\n\t"
  95377. #endif
  95378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95379. "lsls r3, r3, %[n]\n\t"
  95380. #else
  95381. "lsl r3, r3, %[n]\n\t"
  95382. #endif
  95383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95384. "lsrs r6, r6, r7\n\t"
  95385. #else
  95386. "lsr r6, r6, r7\n\t"
  95387. #endif
  95388. #ifdef WOLFSSL_KEIL
  95389. "orrs r4, r4, r6\n\t"
  95390. #elif defined(__clang__)
  95391. "orrs r4, r6\n\t"
  95392. #else
  95393. "orr r4, r6\n\t"
  95394. #endif
  95395. "ldr r5, [%[a], #56]\n\t"
  95396. "str r4, [%[r], #64]\n\t"
  95397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95398. "lsrs r6, r5, #1\n\t"
  95399. #else
  95400. "lsr r6, r5, #1\n\t"
  95401. #endif
  95402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95403. "lsls r5, r5, %[n]\n\t"
  95404. #else
  95405. "lsl r5, r5, %[n]\n\t"
  95406. #endif
  95407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95408. "lsrs r6, r6, r7\n\t"
  95409. #else
  95410. "lsr r6, r6, r7\n\t"
  95411. #endif
  95412. #ifdef WOLFSSL_KEIL
  95413. "orrs r3, r3, r6\n\t"
  95414. #elif defined(__clang__)
  95415. "orrs r3, r6\n\t"
  95416. #else
  95417. "orr r3, r6\n\t"
  95418. #endif
  95419. "ldr r4, [%[a], #52]\n\t"
  95420. "str r3, [%[r], #60]\n\t"
  95421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95422. "lsrs r6, r4, #1\n\t"
  95423. #else
  95424. "lsr r6, r4, #1\n\t"
  95425. #endif
  95426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95427. "lsls r4, r4, %[n]\n\t"
  95428. #else
  95429. "lsl r4, r4, %[n]\n\t"
  95430. #endif
  95431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95432. "lsrs r6, r6, r7\n\t"
  95433. #else
  95434. "lsr r6, r6, r7\n\t"
  95435. #endif
  95436. #ifdef WOLFSSL_KEIL
  95437. "orrs r5, r5, r6\n\t"
  95438. #elif defined(__clang__)
  95439. "orrs r5, r6\n\t"
  95440. #else
  95441. "orr r5, r6\n\t"
  95442. #endif
  95443. "ldr r3, [%[a], #48]\n\t"
  95444. "str r5, [%[r], #56]\n\t"
  95445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95446. "lsrs r6, r3, #1\n\t"
  95447. #else
  95448. "lsr r6, r3, #1\n\t"
  95449. #endif
  95450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95451. "lsls r3, r3, %[n]\n\t"
  95452. #else
  95453. "lsl r3, r3, %[n]\n\t"
  95454. #endif
  95455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95456. "lsrs r6, r6, r7\n\t"
  95457. #else
  95458. "lsr r6, r6, r7\n\t"
  95459. #endif
  95460. #ifdef WOLFSSL_KEIL
  95461. "orrs r4, r4, r6\n\t"
  95462. #elif defined(__clang__)
  95463. "orrs r4, r6\n\t"
  95464. #else
  95465. "orr r4, r6\n\t"
  95466. #endif
  95467. "ldr r5, [%[a], #44]\n\t"
  95468. "str r4, [%[r], #52]\n\t"
  95469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95470. "lsrs r6, r5, #1\n\t"
  95471. #else
  95472. "lsr r6, r5, #1\n\t"
  95473. #endif
  95474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95475. "lsls r5, r5, %[n]\n\t"
  95476. #else
  95477. "lsl r5, r5, %[n]\n\t"
  95478. #endif
  95479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95480. "lsrs r6, r6, r7\n\t"
  95481. #else
  95482. "lsr r6, r6, r7\n\t"
  95483. #endif
  95484. #ifdef WOLFSSL_KEIL
  95485. "orrs r3, r3, r6\n\t"
  95486. #elif defined(__clang__)
  95487. "orrs r3, r6\n\t"
  95488. #else
  95489. "orr r3, r6\n\t"
  95490. #endif
  95491. "ldr r4, [%[a], #40]\n\t"
  95492. "str r3, [%[r], #48]\n\t"
  95493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95494. "lsrs r6, r4, #1\n\t"
  95495. #else
  95496. "lsr r6, r4, #1\n\t"
  95497. #endif
  95498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95499. "lsls r4, r4, %[n]\n\t"
  95500. #else
  95501. "lsl r4, r4, %[n]\n\t"
  95502. #endif
  95503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95504. "lsrs r6, r6, r7\n\t"
  95505. #else
  95506. "lsr r6, r6, r7\n\t"
  95507. #endif
  95508. #ifdef WOLFSSL_KEIL
  95509. "orrs r5, r5, r6\n\t"
  95510. #elif defined(__clang__)
  95511. "orrs r5, r6\n\t"
  95512. #else
  95513. "orr r5, r6\n\t"
  95514. #endif
  95515. "ldr r3, [%[a], #36]\n\t"
  95516. "str r5, [%[r], #44]\n\t"
  95517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95518. "lsrs r6, r3, #1\n\t"
  95519. #else
  95520. "lsr r6, r3, #1\n\t"
  95521. #endif
  95522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95523. "lsls r3, r3, %[n]\n\t"
  95524. #else
  95525. "lsl r3, r3, %[n]\n\t"
  95526. #endif
  95527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95528. "lsrs r6, r6, r7\n\t"
  95529. #else
  95530. "lsr r6, r6, r7\n\t"
  95531. #endif
  95532. #ifdef WOLFSSL_KEIL
  95533. "orrs r4, r4, r6\n\t"
  95534. #elif defined(__clang__)
  95535. "orrs r4, r6\n\t"
  95536. #else
  95537. "orr r4, r6\n\t"
  95538. #endif
  95539. "ldr r5, [%[a], #32]\n\t"
  95540. "str r4, [%[r], #40]\n\t"
  95541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95542. "lsrs r6, r5, #1\n\t"
  95543. #else
  95544. "lsr r6, r5, #1\n\t"
  95545. #endif
  95546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95547. "lsls r5, r5, %[n]\n\t"
  95548. #else
  95549. "lsl r5, r5, %[n]\n\t"
  95550. #endif
  95551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95552. "lsrs r6, r6, r7\n\t"
  95553. #else
  95554. "lsr r6, r6, r7\n\t"
  95555. #endif
  95556. #ifdef WOLFSSL_KEIL
  95557. "orrs r3, r3, r6\n\t"
  95558. #elif defined(__clang__)
  95559. "orrs r3, r6\n\t"
  95560. #else
  95561. "orr r3, r6\n\t"
  95562. #endif
  95563. "ldr r4, [%[a], #28]\n\t"
  95564. "str r3, [%[r], #36]\n\t"
  95565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95566. "lsrs r6, r4, #1\n\t"
  95567. #else
  95568. "lsr r6, r4, #1\n\t"
  95569. #endif
  95570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95571. "lsls r4, r4, %[n]\n\t"
  95572. #else
  95573. "lsl r4, r4, %[n]\n\t"
  95574. #endif
  95575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95576. "lsrs r6, r6, r7\n\t"
  95577. #else
  95578. "lsr r6, r6, r7\n\t"
  95579. #endif
  95580. #ifdef WOLFSSL_KEIL
  95581. "orrs r5, r5, r6\n\t"
  95582. #elif defined(__clang__)
  95583. "orrs r5, r6\n\t"
  95584. #else
  95585. "orr r5, r6\n\t"
  95586. #endif
  95587. "ldr r3, [%[a], #24]\n\t"
  95588. "str r5, [%[r], #32]\n\t"
  95589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95590. "lsrs r6, r3, #1\n\t"
  95591. #else
  95592. "lsr r6, r3, #1\n\t"
  95593. #endif
  95594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95595. "lsls r3, r3, %[n]\n\t"
  95596. #else
  95597. "lsl r3, r3, %[n]\n\t"
  95598. #endif
  95599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95600. "lsrs r6, r6, r7\n\t"
  95601. #else
  95602. "lsr r6, r6, r7\n\t"
  95603. #endif
  95604. #ifdef WOLFSSL_KEIL
  95605. "orrs r4, r4, r6\n\t"
  95606. #elif defined(__clang__)
  95607. "orrs r4, r6\n\t"
  95608. #else
  95609. "orr r4, r6\n\t"
  95610. #endif
  95611. "ldr r5, [%[a], #20]\n\t"
  95612. "str r4, [%[r], #28]\n\t"
  95613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95614. "lsrs r6, r5, #1\n\t"
  95615. #else
  95616. "lsr r6, r5, #1\n\t"
  95617. #endif
  95618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95619. "lsls r5, r5, %[n]\n\t"
  95620. #else
  95621. "lsl r5, r5, %[n]\n\t"
  95622. #endif
  95623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95624. "lsrs r6, r6, r7\n\t"
  95625. #else
  95626. "lsr r6, r6, r7\n\t"
  95627. #endif
  95628. #ifdef WOLFSSL_KEIL
  95629. "orrs r3, r3, r6\n\t"
  95630. #elif defined(__clang__)
  95631. "orrs r3, r6\n\t"
  95632. #else
  95633. "orr r3, r6\n\t"
  95634. #endif
  95635. "ldr r4, [%[a], #16]\n\t"
  95636. "str r3, [%[r], #24]\n\t"
  95637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95638. "lsrs r6, r4, #1\n\t"
  95639. #else
  95640. "lsr r6, r4, #1\n\t"
  95641. #endif
  95642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95643. "lsls r4, r4, %[n]\n\t"
  95644. #else
  95645. "lsl r4, r4, %[n]\n\t"
  95646. #endif
  95647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95648. "lsrs r6, r6, r7\n\t"
  95649. #else
  95650. "lsr r6, r6, r7\n\t"
  95651. #endif
  95652. #ifdef WOLFSSL_KEIL
  95653. "orrs r5, r5, r6\n\t"
  95654. #elif defined(__clang__)
  95655. "orrs r5, r6\n\t"
  95656. #else
  95657. "orr r5, r6\n\t"
  95658. #endif
  95659. "ldr r3, [%[a], #12]\n\t"
  95660. "str r5, [%[r], #20]\n\t"
  95661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95662. "lsrs r6, r3, #1\n\t"
  95663. #else
  95664. "lsr r6, r3, #1\n\t"
  95665. #endif
  95666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95667. "lsls r3, r3, %[n]\n\t"
  95668. #else
  95669. "lsl r3, r3, %[n]\n\t"
  95670. #endif
  95671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95672. "lsrs r6, r6, r7\n\t"
  95673. #else
  95674. "lsr r6, r6, r7\n\t"
  95675. #endif
  95676. #ifdef WOLFSSL_KEIL
  95677. "orrs r4, r4, r6\n\t"
  95678. #elif defined(__clang__)
  95679. "orrs r4, r6\n\t"
  95680. #else
  95681. "orr r4, r6\n\t"
  95682. #endif
  95683. "ldr r5, [%[a], #8]\n\t"
  95684. "str r4, [%[r], #16]\n\t"
  95685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95686. "lsrs r6, r5, #1\n\t"
  95687. #else
  95688. "lsr r6, r5, #1\n\t"
  95689. #endif
  95690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95691. "lsls r5, r5, %[n]\n\t"
  95692. #else
  95693. "lsl r5, r5, %[n]\n\t"
  95694. #endif
  95695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95696. "lsrs r6, r6, r7\n\t"
  95697. #else
  95698. "lsr r6, r6, r7\n\t"
  95699. #endif
  95700. #ifdef WOLFSSL_KEIL
  95701. "orrs r3, r3, r6\n\t"
  95702. #elif defined(__clang__)
  95703. "orrs r3, r6\n\t"
  95704. #else
  95705. "orr r3, r6\n\t"
  95706. #endif
  95707. "ldr r4, [%[a], #4]\n\t"
  95708. "str r3, [%[r], #12]\n\t"
  95709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95710. "lsrs r6, r4, #1\n\t"
  95711. #else
  95712. "lsr r6, r4, #1\n\t"
  95713. #endif
  95714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95715. "lsls r4, r4, %[n]\n\t"
  95716. #else
  95717. "lsl r4, r4, %[n]\n\t"
  95718. #endif
  95719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95720. "lsrs r6, r6, r7\n\t"
  95721. #else
  95722. "lsr r6, r6, r7\n\t"
  95723. #endif
  95724. #ifdef WOLFSSL_KEIL
  95725. "orrs r5, r5, r6\n\t"
  95726. #elif defined(__clang__)
  95727. "orrs r5, r6\n\t"
  95728. #else
  95729. "orr r5, r6\n\t"
  95730. #endif
  95731. "ldr r3, [%[a]]\n\t"
  95732. "str r5, [%[r], #8]\n\t"
  95733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95734. "lsrs r6, r3, #1\n\t"
  95735. #else
  95736. "lsr r6, r3, #1\n\t"
  95737. #endif
  95738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95739. "lsls r3, r3, %[n]\n\t"
  95740. #else
  95741. "lsl r3, r3, %[n]\n\t"
  95742. #endif
  95743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95744. "lsrs r6, r6, r7\n\t"
  95745. #else
  95746. "lsr r6, r6, r7\n\t"
  95747. #endif
  95748. #ifdef WOLFSSL_KEIL
  95749. "orrs r4, r4, r6\n\t"
  95750. #elif defined(__clang__)
  95751. "orrs r4, r6\n\t"
  95752. #else
  95753. "orr r4, r6\n\t"
  95754. #endif
  95755. "str r3, [%[r]]\n\t"
  95756. "str r4, [%[r], #4]\n\t"
  95757. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  95758. :
  95759. : "memory", "r3", "r4", "r5", "r6", "r7"
  95760. );
  95761. }
  95762. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  95763. *
  95764. * r A single precision number that is the result of the operation.
  95765. * e A single precision number that is the exponent.
  95766. * bits The number of bits in the exponent.
  95767. * m A single precision number that is the modulus.
  95768. * returns 0 on success.
  95769. * returns MEMORY_E on dynamic memory allocation failure.
  95770. * returns MP_VAL when base is even.
  95771. */
  95772. static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits,
  95773. const sp_digit* m)
  95774. {
  95775. #ifdef WOLFSSL_SP_SMALL_STACK
  95776. sp_digit* td = NULL;
  95777. #else
  95778. sp_digit td[385];
  95779. #endif
  95780. sp_digit* norm = NULL;
  95781. sp_digit* tmp = NULL;
  95782. sp_digit mp = 1;
  95783. sp_digit n;
  95784. sp_digit o;
  95785. sp_digit mask;
  95786. int i;
  95787. int c;
  95788. byte y;
  95789. int err = MP_OKAY;
  95790. if (bits == 0) {
  95791. err = MP_VAL;
  95792. }
  95793. #ifdef WOLFSSL_SP_SMALL_STACK
  95794. if (err == MP_OKAY) {
  95795. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 385, NULL,
  95796. DYNAMIC_TYPE_TMP_BUFFER);
  95797. if (td == NULL)
  95798. err = MEMORY_E;
  95799. }
  95800. #endif
  95801. if (err == MP_OKAY) {
  95802. norm = td;
  95803. tmp = td + 256;
  95804. sp_4096_mont_setup(m, &mp);
  95805. sp_4096_mont_norm_128(norm, m);
  95806. i = (bits - 1) / 32;
  95807. n = e[i--];
  95808. c = bits & 31;
  95809. if (c == 0) {
  95810. c = 32;
  95811. }
  95812. c -= bits % 5;
  95813. if (c == 32) {
  95814. c = 27;
  95815. }
  95816. if (c < 0) {
  95817. /* Number of bits in top word is less than number needed. */
  95818. c = -c;
  95819. y = (byte)(n << c);
  95820. n = e[i--];
  95821. y |= (byte)(n >> (64 - c));
  95822. n <<= c;
  95823. c = 64 - c;
  95824. }
  95825. else if (c == 0) {
  95826. /* All bits in top word used. */
  95827. y = (byte)n;
  95828. }
  95829. else {
  95830. y = (byte)(n >> c);
  95831. n <<= 32 - c;
  95832. }
  95833. sp_4096_lshift_128(r, norm, y);
  95834. for (; i>=0 || c>=5; ) {
  95835. if (c == 0) {
  95836. n = e[i--];
  95837. y = (byte)(n >> 27);
  95838. n <<= 5;
  95839. c = 27;
  95840. }
  95841. else if (c < 5) {
  95842. y = (byte)(n >> 27);
  95843. n = e[i--];
  95844. c = 5 - c;
  95845. y |= (byte)(n >> (32 - c));
  95846. n <<= c;
  95847. c = 32 - c;
  95848. }
  95849. else {
  95850. y = (byte)((n >> 27) & 0x1f);
  95851. n <<= 5;
  95852. c -= 5;
  95853. }
  95854. sp_4096_mont_sqr_128(r, r, m, mp);
  95855. sp_4096_mont_sqr_128(r, r, m, mp);
  95856. sp_4096_mont_sqr_128(r, r, m, mp);
  95857. sp_4096_mont_sqr_128(r, r, m, mp);
  95858. sp_4096_mont_sqr_128(r, r, m, mp);
  95859. sp_4096_lshift_128(r, r, y);
  95860. sp_4096_mul_d_128(tmp, norm, r[128]);
  95861. r[128] = 0;
  95862. o = sp_4096_add_128(r, r, tmp);
  95863. sp_4096_cond_sub_128(r, r, m, (sp_digit)0 - o);
  95864. }
  95865. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  95866. sp_4096_mont_reduce_128(r, m, mp);
  95867. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  95868. sp_4096_cond_sub_128(r, r, m, mask);
  95869. }
  95870. #ifdef WOLFSSL_SP_SMALL_STACK
  95871. if (td != NULL)
  95872. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  95873. #endif
  95874. return err;
  95875. }
  95876. #endif /* HAVE_FFDHE_4096 */
  95877. /* Perform the modular exponentiation for Diffie-Hellman.
  95878. *
  95879. * base Base.
  95880. * exp Array of bytes that is the exponent.
  95881. * expLen Length of data, in bytes, in exponent.
  95882. * mod Modulus.
  95883. * out Buffer to hold big-endian bytes of exponentiation result.
  95884. * Must be at least 512 bytes long.
  95885. * outLen Length, in bytes, of exponentiation result.
  95886. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  95887. * and MEMORY_E if memory allocation fails.
  95888. */
  95889. int sp_DhExp_4096(const mp_int* base, const byte* exp, word32 expLen,
  95890. const mp_int* mod, byte* out, word32* outLen)
  95891. {
  95892. int err = MP_OKAY;
  95893. sp_digit b[256];
  95894. sp_digit e[128];
  95895. sp_digit m[128];
  95896. sp_digit* r = b;
  95897. word32 i;
  95898. if (mp_count_bits(base) > 4096) {
  95899. err = MP_READ_E;
  95900. }
  95901. else if (expLen > 512) {
  95902. err = MP_READ_E;
  95903. }
  95904. else if (mp_count_bits(mod) != 4096) {
  95905. err = MP_READ_E;
  95906. }
  95907. else if (mp_iseven(mod)) {
  95908. err = MP_VAL;
  95909. }
  95910. if (err == MP_OKAY) {
  95911. sp_4096_from_mp(b, 128, base);
  95912. sp_4096_from_bin(e, 128, exp, expLen);
  95913. sp_4096_from_mp(m, 128, mod);
  95914. #ifdef HAVE_FFDHE_4096
  95915. if (base->used == 1 && base->dp[0] == 2 && m[127] == (sp_digit)-1)
  95916. err = sp_4096_mod_exp_2_128(r, e, expLen * 8, m);
  95917. else
  95918. #endif
  95919. err = sp_4096_mod_exp_128(r, b, e, expLen * 8, m, 0);
  95920. }
  95921. if (err == MP_OKAY) {
  95922. sp_4096_to_bin_128(r, out);
  95923. *outLen = 512;
  95924. for (i=0; i<512 && out[i] == 0; i++) {
  95925. /* Search for first non-zero. */
  95926. }
  95927. *outLen -= i;
  95928. XMEMMOVE(out, out + i, *outLen);
  95929. }
  95930. XMEMSET(e, 0, sizeof(e));
  95931. return err;
  95932. }
  95933. #endif /* WOLFSSL_HAVE_SP_DH */
  95934. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  95935. #endif /* WOLFSSL_SP_4096 */
  95936. #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH */
  95937. #ifdef WOLFSSL_HAVE_SP_ECC
  95938. #ifndef WOLFSSL_SP_NO_256
  95939. /* Point structure to use. */
  95940. typedef struct sp_point_256 {
  95941. /* X ordinate of point. */
  95942. sp_digit x[2 * 8];
  95943. /* Y ordinate of point. */
  95944. sp_digit y[2 * 8];
  95945. /* Z ordinate of point. */
  95946. sp_digit z[2 * 8];
  95947. /* Indicates point is at infinity. */
  95948. int infinity;
  95949. } sp_point_256;
  95950. /* The modulus (prime) of the curve P256. */
  95951. static const sp_digit p256_mod[8] = {
  95952. 0xffffffff,0xffffffff,0xffffffff,0x00000000,0x00000000,0x00000000,
  95953. 0x00000001,0xffffffff
  95954. };
  95955. /* The Montgomery normalizer for modulus of the curve P256. */
  95956. static const sp_digit p256_norm_mod[8] = {
  95957. 0x00000001,0x00000000,0x00000000,0xffffffff,0xffffffff,0xffffffff,
  95958. 0xfffffffe,0x00000000
  95959. };
  95960. /* The Montgomery multiplier for modulus of the curve P256. */
  95961. static const sp_digit p256_mp_mod = 0x00000001;
  95962. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  95963. defined(HAVE_ECC_VERIFY)
  95964. /* The order of the curve P256. */
  95965. static const sp_digit p256_order[8] = {
  95966. 0xfc632551,0xf3b9cac2,0xa7179e84,0xbce6faad,0xffffffff,0xffffffff,
  95967. 0x00000000,0xffffffff
  95968. };
  95969. #endif
  95970. /* The order of the curve P256 minus 2. */
  95971. static const sp_digit p256_order2[8] = {
  95972. 0xfc63254f,0xf3b9cac2,0xa7179e84,0xbce6faad,0xffffffff,0xffffffff,
  95973. 0x00000000,0xffffffff
  95974. };
  95975. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  95976. /* The Montgomery normalizer for order of the curve P256. */
  95977. static const sp_digit p256_norm_order[8] = {
  95978. 0x039cdaaf,0x0c46353d,0x58e8617b,0x43190552,0x00000000,0x00000000,
  95979. 0xffffffff,0x00000000
  95980. };
  95981. #endif
  95982. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  95983. /* The Montgomery multiplier for order of the curve P256. */
  95984. static const sp_digit p256_mp_order = 0xee00bc4f;
  95985. #endif
  95986. /* The base point of curve P256. */
  95987. static const sp_point_256 p256_base = {
  95988. /* X ordinate */
  95989. {
  95990. 0xd898c296,0xf4a13945,0x2deb33a0,0x77037d81,0x63a440f2,0xf8bce6e5,
  95991. 0xe12c4247,0x6b17d1f2,
  95992. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  95993. (sp_digit)0, (sp_digit)0, (sp_digit)0
  95994. },
  95995. /* Y ordinate */
  95996. {
  95997. 0x37bf51f5,0xcbb64068,0x6b315ece,0x2bce3357,0x7c0f9e16,0x8ee7eb4a,
  95998. 0xfe1a7f9b,0x4fe342e2,
  95999. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96000. (sp_digit)0, (sp_digit)0, (sp_digit)0
  96001. },
  96002. /* Z ordinate */
  96003. {
  96004. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  96005. 0x00000000,0x00000000,
  96006. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  96007. (sp_digit)0, (sp_digit)0, (sp_digit)0
  96008. },
  96009. /* infinity */
  96010. 0
  96011. };
  96012. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  96013. static const sp_digit p256_b[8] = {
  96014. 0x27d2604b,0x3bce3c3e,0xcc53b0f6,0x651d06b0,0x769886bc,0xb3ebbd55,
  96015. 0xaa3a93e7,0x5ac635d8
  96016. };
  96017. #endif
  96018. /* Multiply a and b into r. (r = a * b)
  96019. *
  96020. * r A single precision integer.
  96021. * a A single precision integer.
  96022. * b A single precision integer.
  96023. */
  96024. SP_NOINLINE static void sp_256_mul_8(sp_digit* r, const sp_digit* a,
  96025. const sp_digit* b)
  96026. {
  96027. sp_digit t[8 * 2];
  96028. sp_digit* tmp = t;
  96029. __asm__ __volatile__ (
  96030. "movs r3, #0\n\t"
  96031. "movs r4, #0\n\t"
  96032. "mov r8, r3\n\t"
  96033. "mov r11, %[tmp]\n\t"
  96034. "mov r9, %[a]\n\t"
  96035. "mov r10, %[b]\n\t"
  96036. "movs r6, #32\n\t"
  96037. "add r6, r6, r9\n\t"
  96038. "mov r12, r6\n\t"
  96039. "\n"
  96040. "L_sp_256_mul_8_words_%=:\n\t"
  96041. "movs %[tmp], #0\n\t"
  96042. "movs r5, #0\n\t"
  96043. "movs r6, #28\n\t"
  96044. "mov %[a], r8\n\t"
  96045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96046. "subs %[a], %[a], r6\n\t"
  96047. #else
  96048. "sub %[a], %[a], r6\n\t"
  96049. #endif
  96050. #ifdef WOLFSSL_KEIL
  96051. "sbcs r6, r6, r6\n\t"
  96052. #elif defined(__clang__)
  96053. "sbcs r6, r6\n\t"
  96054. #else
  96055. "sbc r6, r6\n\t"
  96056. #endif
  96057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96058. "mvns r6, r6\n\t"
  96059. #else
  96060. "mvn r6, r6\n\t"
  96061. #endif
  96062. #ifdef WOLFSSL_KEIL
  96063. "ands %[a], %[a], r6\n\t"
  96064. #elif defined(__clang__)
  96065. "ands %[a], r6\n\t"
  96066. #else
  96067. "and %[a], r6\n\t"
  96068. #endif
  96069. "mov %[b], r8\n\t"
  96070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96071. "subs %[b], %[b], %[a]\n\t"
  96072. #else
  96073. "sub %[b], %[b], %[a]\n\t"
  96074. #endif
  96075. "add %[a], %[a], r9\n\t"
  96076. "add %[b], %[b], r10\n\t"
  96077. "\n"
  96078. "L_sp_256_mul_8_mul_%=:\n\t"
  96079. "# Multiply Start\n\t"
  96080. "ldrh r6, [%[a]]\n\t"
  96081. "ldrh r7, [%[b]]\n\t"
  96082. #ifdef WOLFSSL_KEIL
  96083. "muls r7, r6, r7\n\t"
  96084. #elif defined(__clang__)
  96085. "muls r7, r6\n\t"
  96086. #else
  96087. "mul r7, r6\n\t"
  96088. #endif
  96089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96090. "adds r3, r3, r7\n\t"
  96091. #else
  96092. "add r3, r3, r7\n\t"
  96093. #endif
  96094. #ifdef WOLFSSL_KEIL
  96095. "adcs r4, r4, %[tmp]\n\t"
  96096. #elif defined(__clang__)
  96097. "adcs r4, %[tmp]\n\t"
  96098. #else
  96099. "adc r4, %[tmp]\n\t"
  96100. #endif
  96101. #ifdef WOLFSSL_KEIL
  96102. "adcs r5, r5, %[tmp]\n\t"
  96103. #elif defined(__clang__)
  96104. "adcs r5, %[tmp]\n\t"
  96105. #else
  96106. "adc r5, %[tmp]\n\t"
  96107. #endif
  96108. "ldr r7, [%[b]]\n\t"
  96109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96110. "lsrs r7, r7, #16\n\t"
  96111. #else
  96112. "lsr r7, r7, #16\n\t"
  96113. #endif
  96114. #ifdef WOLFSSL_KEIL
  96115. "muls r6, r7, r6\n\t"
  96116. #elif defined(__clang__)
  96117. "muls r6, r7\n\t"
  96118. #else
  96119. "mul r6, r7\n\t"
  96120. #endif
  96121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96122. "lsrs r7, r6, #16\n\t"
  96123. #else
  96124. "lsr r7, r6, #16\n\t"
  96125. #endif
  96126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96127. "lsls r6, r6, #16\n\t"
  96128. #else
  96129. "lsl r6, r6, #16\n\t"
  96130. #endif
  96131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96132. "adds r3, r3, r6\n\t"
  96133. #else
  96134. "add r3, r3, r6\n\t"
  96135. #endif
  96136. #ifdef WOLFSSL_KEIL
  96137. "adcs r4, r4, r7\n\t"
  96138. #elif defined(__clang__)
  96139. "adcs r4, r7\n\t"
  96140. #else
  96141. "adc r4, r7\n\t"
  96142. #endif
  96143. #ifdef WOLFSSL_KEIL
  96144. "adcs r5, r5, %[tmp]\n\t"
  96145. #elif defined(__clang__)
  96146. "adcs r5, %[tmp]\n\t"
  96147. #else
  96148. "adc r5, %[tmp]\n\t"
  96149. #endif
  96150. "ldr r6, [%[a]]\n\t"
  96151. "ldr r7, [%[b]]\n\t"
  96152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96153. "lsrs r6, r6, #16\n\t"
  96154. #else
  96155. "lsr r6, r6, #16\n\t"
  96156. #endif
  96157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96158. "lsrs r7, r7, #16\n\t"
  96159. #else
  96160. "lsr r7, r7, #16\n\t"
  96161. #endif
  96162. #ifdef WOLFSSL_KEIL
  96163. "muls r7, r6, r7\n\t"
  96164. #elif defined(__clang__)
  96165. "muls r7, r6\n\t"
  96166. #else
  96167. "mul r7, r6\n\t"
  96168. #endif
  96169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96170. "adds r4, r4, r7\n\t"
  96171. #else
  96172. "add r4, r4, r7\n\t"
  96173. #endif
  96174. #ifdef WOLFSSL_KEIL
  96175. "adcs r5, r5, %[tmp]\n\t"
  96176. #elif defined(__clang__)
  96177. "adcs r5, %[tmp]\n\t"
  96178. #else
  96179. "adc r5, %[tmp]\n\t"
  96180. #endif
  96181. "ldrh r7, [%[b]]\n\t"
  96182. #ifdef WOLFSSL_KEIL
  96183. "muls r6, r7, r6\n\t"
  96184. #elif defined(__clang__)
  96185. "muls r6, r7\n\t"
  96186. #else
  96187. "mul r6, r7\n\t"
  96188. #endif
  96189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96190. "lsrs r7, r6, #16\n\t"
  96191. #else
  96192. "lsr r7, r6, #16\n\t"
  96193. #endif
  96194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96195. "lsls r6, r6, #16\n\t"
  96196. #else
  96197. "lsl r6, r6, #16\n\t"
  96198. #endif
  96199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96200. "adds r3, r3, r6\n\t"
  96201. #else
  96202. "add r3, r3, r6\n\t"
  96203. #endif
  96204. #ifdef WOLFSSL_KEIL
  96205. "adcs r4, r4, r7\n\t"
  96206. #elif defined(__clang__)
  96207. "adcs r4, r7\n\t"
  96208. #else
  96209. "adc r4, r7\n\t"
  96210. #endif
  96211. #ifdef WOLFSSL_KEIL
  96212. "adcs r5, r5, %[tmp]\n\t"
  96213. #elif defined(__clang__)
  96214. "adcs r5, %[tmp]\n\t"
  96215. #else
  96216. "adc r5, %[tmp]\n\t"
  96217. #endif
  96218. "# Multiply Done\n\t"
  96219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96220. "adds %[a], %[a], #4\n\t"
  96221. #else
  96222. "add %[a], %[a], #4\n\t"
  96223. #endif
  96224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96225. "subs %[b], %[b], #4\n\t"
  96226. #else
  96227. "sub %[b], %[b], #4\n\t"
  96228. #endif
  96229. "cmp %[a], r12\n\t"
  96230. "beq L_sp_256_mul_8_done_mul_%=\n\t"
  96231. "mov r6, r8\n\t"
  96232. "add r6, r6, r9\n\t"
  96233. "cmp %[a], r6\n\t"
  96234. "ble L_sp_256_mul_8_mul_%=\n\t"
  96235. "\n"
  96236. "L_sp_256_mul_8_done_mul_%=:\n\t"
  96237. "mov %[tmp], r11\n\t"
  96238. "mov r7, r8\n\t"
  96239. "str r3, [%[tmp], r7]\n\t"
  96240. "movs r3, r4\n\t"
  96241. "movs r4, r5\n\t"
  96242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96243. "adds r7, r7, #4\n\t"
  96244. #else
  96245. "add r7, r7, #4\n\t"
  96246. #endif
  96247. "mov r8, r7\n\t"
  96248. "movs r6, #56\n\t"
  96249. "cmp r7, r6\n\t"
  96250. "ble L_sp_256_mul_8_words_%=\n\t"
  96251. "str r3, [%[tmp], r7]\n\t"
  96252. "mov %[a], r9\n\t"
  96253. "mov %[b], r10\n\t"
  96254. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  96255. :
  96256. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  96257. );
  96258. XMEMCPY(r, t, sizeof(t));
  96259. }
  96260. /* Square a and put result in r. (r = a * a)
  96261. *
  96262. * r A single precision integer.
  96263. * a A single precision integer.
  96264. */
  96265. SP_NOINLINE static void sp_256_sqr_8(sp_digit* r, const sp_digit* a)
  96266. {
  96267. __asm__ __volatile__ (
  96268. "movs r3, #0\n\t"
  96269. "movs r4, #0\n\t"
  96270. "movs r5, #0\n\t"
  96271. "mov r8, r3\n\t"
  96272. "mov r11, %[r]\n\t"
  96273. "movs r6, #0x40\n\t"
  96274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96275. "negs r6, r6\n\t"
  96276. #else
  96277. "neg r6, r6\n\t"
  96278. #endif
  96279. "add sp, sp, r6\n\t"
  96280. "mov r10, sp\n\t"
  96281. "mov r9, %[a]\n\t"
  96282. "\n"
  96283. "L_sp_256_sqr_8_words_%=:\n\t"
  96284. "movs %[r], #0\n\t"
  96285. "movs r6, #28\n\t"
  96286. "mov %[a], r8\n\t"
  96287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96288. "subs %[a], %[a], r6\n\t"
  96289. #else
  96290. "sub %[a], %[a], r6\n\t"
  96291. #endif
  96292. #ifdef WOLFSSL_KEIL
  96293. "sbcs r6, r6, r6\n\t"
  96294. #elif defined(__clang__)
  96295. "sbcs r6, r6\n\t"
  96296. #else
  96297. "sbc r6, r6\n\t"
  96298. #endif
  96299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96300. "mvns r6, r6\n\t"
  96301. #else
  96302. "mvn r6, r6\n\t"
  96303. #endif
  96304. #ifdef WOLFSSL_KEIL
  96305. "ands %[a], %[a], r6\n\t"
  96306. #elif defined(__clang__)
  96307. "ands %[a], r6\n\t"
  96308. #else
  96309. "and %[a], r6\n\t"
  96310. #endif
  96311. "mov r2, r8\n\t"
  96312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96313. "subs r2, r2, %[a]\n\t"
  96314. #else
  96315. "sub r2, r2, %[a]\n\t"
  96316. #endif
  96317. "add %[a], %[a], r9\n\t"
  96318. "add r2, r2, r9\n\t"
  96319. "\n"
  96320. "L_sp_256_sqr_8_mul_%=:\n\t"
  96321. "cmp r2, %[a]\n\t"
  96322. "beq L_sp_256_sqr_8_sqr_%=\n\t"
  96323. "# Multiply * 2: Start\n\t"
  96324. "ldrh r6, [%[a]]\n\t"
  96325. "ldrh r7, [r2]\n\t"
  96326. #ifdef WOLFSSL_KEIL
  96327. "muls r7, r6, r7\n\t"
  96328. #elif defined(__clang__)
  96329. "muls r7, r6\n\t"
  96330. #else
  96331. "mul r7, r6\n\t"
  96332. #endif
  96333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96334. "adds r3, r3, r7\n\t"
  96335. #else
  96336. "add r3, r3, r7\n\t"
  96337. #endif
  96338. #ifdef WOLFSSL_KEIL
  96339. "adcs r4, r4, %[r]\n\t"
  96340. #elif defined(__clang__)
  96341. "adcs r4, %[r]\n\t"
  96342. #else
  96343. "adc r4, %[r]\n\t"
  96344. #endif
  96345. #ifdef WOLFSSL_KEIL
  96346. "adcs r5, r5, %[r]\n\t"
  96347. #elif defined(__clang__)
  96348. "adcs r5, %[r]\n\t"
  96349. #else
  96350. "adc r5, %[r]\n\t"
  96351. #endif
  96352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96353. "adds r3, r3, r7\n\t"
  96354. #else
  96355. "add r3, r3, r7\n\t"
  96356. #endif
  96357. #ifdef WOLFSSL_KEIL
  96358. "adcs r4, r4, %[r]\n\t"
  96359. #elif defined(__clang__)
  96360. "adcs r4, %[r]\n\t"
  96361. #else
  96362. "adc r4, %[r]\n\t"
  96363. #endif
  96364. #ifdef WOLFSSL_KEIL
  96365. "adcs r5, r5, %[r]\n\t"
  96366. #elif defined(__clang__)
  96367. "adcs r5, %[r]\n\t"
  96368. #else
  96369. "adc r5, %[r]\n\t"
  96370. #endif
  96371. "ldr r7, [r2]\n\t"
  96372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96373. "lsrs r7, r7, #16\n\t"
  96374. #else
  96375. "lsr r7, r7, #16\n\t"
  96376. #endif
  96377. #ifdef WOLFSSL_KEIL
  96378. "muls r6, r7, r6\n\t"
  96379. #elif defined(__clang__)
  96380. "muls r6, r7\n\t"
  96381. #else
  96382. "mul r6, r7\n\t"
  96383. #endif
  96384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96385. "lsrs r7, r6, #16\n\t"
  96386. #else
  96387. "lsr r7, r6, #16\n\t"
  96388. #endif
  96389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96390. "lsls r6, r6, #16\n\t"
  96391. #else
  96392. "lsl r6, r6, #16\n\t"
  96393. #endif
  96394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96395. "adds r3, r3, r6\n\t"
  96396. #else
  96397. "add r3, r3, r6\n\t"
  96398. #endif
  96399. #ifdef WOLFSSL_KEIL
  96400. "adcs r4, r4, r7\n\t"
  96401. #elif defined(__clang__)
  96402. "adcs r4, r7\n\t"
  96403. #else
  96404. "adc r4, r7\n\t"
  96405. #endif
  96406. #ifdef WOLFSSL_KEIL
  96407. "adcs r5, r5, %[r]\n\t"
  96408. #elif defined(__clang__)
  96409. "adcs r5, %[r]\n\t"
  96410. #else
  96411. "adc r5, %[r]\n\t"
  96412. #endif
  96413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96414. "adds r3, r3, r6\n\t"
  96415. #else
  96416. "add r3, r3, r6\n\t"
  96417. #endif
  96418. #ifdef WOLFSSL_KEIL
  96419. "adcs r4, r4, r7\n\t"
  96420. #elif defined(__clang__)
  96421. "adcs r4, r7\n\t"
  96422. #else
  96423. "adc r4, r7\n\t"
  96424. #endif
  96425. #ifdef WOLFSSL_KEIL
  96426. "adcs r5, r5, %[r]\n\t"
  96427. #elif defined(__clang__)
  96428. "adcs r5, %[r]\n\t"
  96429. #else
  96430. "adc r5, %[r]\n\t"
  96431. #endif
  96432. "ldr r6, [%[a]]\n\t"
  96433. "ldr r7, [r2]\n\t"
  96434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96435. "lsrs r6, r6, #16\n\t"
  96436. #else
  96437. "lsr r6, r6, #16\n\t"
  96438. #endif
  96439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96440. "lsrs r7, r7, #16\n\t"
  96441. #else
  96442. "lsr r7, r7, #16\n\t"
  96443. #endif
  96444. #ifdef WOLFSSL_KEIL
  96445. "muls r7, r6, r7\n\t"
  96446. #elif defined(__clang__)
  96447. "muls r7, r6\n\t"
  96448. #else
  96449. "mul r7, r6\n\t"
  96450. #endif
  96451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96452. "adds r4, r4, r7\n\t"
  96453. #else
  96454. "add r4, r4, r7\n\t"
  96455. #endif
  96456. #ifdef WOLFSSL_KEIL
  96457. "adcs r5, r5, %[r]\n\t"
  96458. #elif defined(__clang__)
  96459. "adcs r5, %[r]\n\t"
  96460. #else
  96461. "adc r5, %[r]\n\t"
  96462. #endif
  96463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96464. "adds r4, r4, r7\n\t"
  96465. #else
  96466. "add r4, r4, r7\n\t"
  96467. #endif
  96468. #ifdef WOLFSSL_KEIL
  96469. "adcs r5, r5, %[r]\n\t"
  96470. #elif defined(__clang__)
  96471. "adcs r5, %[r]\n\t"
  96472. #else
  96473. "adc r5, %[r]\n\t"
  96474. #endif
  96475. "ldrh r7, [r2]\n\t"
  96476. #ifdef WOLFSSL_KEIL
  96477. "muls r6, r7, r6\n\t"
  96478. #elif defined(__clang__)
  96479. "muls r6, r7\n\t"
  96480. #else
  96481. "mul r6, r7\n\t"
  96482. #endif
  96483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96484. "lsrs r7, r6, #16\n\t"
  96485. #else
  96486. "lsr r7, r6, #16\n\t"
  96487. #endif
  96488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96489. "lsls r6, r6, #16\n\t"
  96490. #else
  96491. "lsl r6, r6, #16\n\t"
  96492. #endif
  96493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96494. "adds r3, r3, r6\n\t"
  96495. #else
  96496. "add r3, r3, r6\n\t"
  96497. #endif
  96498. #ifdef WOLFSSL_KEIL
  96499. "adcs r4, r4, r7\n\t"
  96500. #elif defined(__clang__)
  96501. "adcs r4, r7\n\t"
  96502. #else
  96503. "adc r4, r7\n\t"
  96504. #endif
  96505. #ifdef WOLFSSL_KEIL
  96506. "adcs r5, r5, %[r]\n\t"
  96507. #elif defined(__clang__)
  96508. "adcs r5, %[r]\n\t"
  96509. #else
  96510. "adc r5, %[r]\n\t"
  96511. #endif
  96512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96513. "adds r3, r3, r6\n\t"
  96514. #else
  96515. "add r3, r3, r6\n\t"
  96516. #endif
  96517. #ifdef WOLFSSL_KEIL
  96518. "adcs r4, r4, r7\n\t"
  96519. #elif defined(__clang__)
  96520. "adcs r4, r7\n\t"
  96521. #else
  96522. "adc r4, r7\n\t"
  96523. #endif
  96524. #ifdef WOLFSSL_KEIL
  96525. "adcs r5, r5, %[r]\n\t"
  96526. #elif defined(__clang__)
  96527. "adcs r5, %[r]\n\t"
  96528. #else
  96529. "adc r5, %[r]\n\t"
  96530. #endif
  96531. "# Multiply * 2: Done\n\t"
  96532. "bal L_sp_256_sqr_8_done_sqr_%=\n\t"
  96533. "\n"
  96534. "L_sp_256_sqr_8_sqr_%=:\n\t"
  96535. "mov r12, r2\n\t"
  96536. "ldr r2, [%[a]]\n\t"
  96537. "# Square: Start\n\t"
  96538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96539. "lsrs r7, r2, #16\n\t"
  96540. #else
  96541. "lsr r7, r2, #16\n\t"
  96542. #endif
  96543. "uxth r6, r2\n\t"
  96544. #ifdef WOLFSSL_KEIL
  96545. "muls r6, r6, r6\n\t"
  96546. #elif defined(__clang__)
  96547. "muls r6, r6\n\t"
  96548. #else
  96549. "mul r6, r6\n\t"
  96550. #endif
  96551. #ifdef WOLFSSL_KEIL
  96552. "muls r7, r7, r7\n\t"
  96553. #elif defined(__clang__)
  96554. "muls r7, r7\n\t"
  96555. #else
  96556. "mul r7, r7\n\t"
  96557. #endif
  96558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96559. "adds r3, r3, r6\n\t"
  96560. #else
  96561. "add r3, r3, r6\n\t"
  96562. #endif
  96563. #ifdef WOLFSSL_KEIL
  96564. "adcs r4, r4, r7\n\t"
  96565. #elif defined(__clang__)
  96566. "adcs r4, r7\n\t"
  96567. #else
  96568. "adc r4, r7\n\t"
  96569. #endif
  96570. #ifdef WOLFSSL_KEIL
  96571. "adcs r5, r5, %[r]\n\t"
  96572. #elif defined(__clang__)
  96573. "adcs r5, %[r]\n\t"
  96574. #else
  96575. "adc r5, %[r]\n\t"
  96576. #endif
  96577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96578. "lsrs r7, r2, #16\n\t"
  96579. #else
  96580. "lsr r7, r2, #16\n\t"
  96581. #endif
  96582. "uxth r6, r2\n\t"
  96583. #ifdef WOLFSSL_KEIL
  96584. "muls r6, r7, r6\n\t"
  96585. #elif defined(__clang__)
  96586. "muls r6, r7\n\t"
  96587. #else
  96588. "mul r6, r7\n\t"
  96589. #endif
  96590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96591. "lsrs r7, r6, #15\n\t"
  96592. #else
  96593. "lsr r7, r6, #15\n\t"
  96594. #endif
  96595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96596. "lsls r6, r6, #17\n\t"
  96597. #else
  96598. "lsl r6, r6, #17\n\t"
  96599. #endif
  96600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96601. "adds r3, r3, r6\n\t"
  96602. #else
  96603. "add r3, r3, r6\n\t"
  96604. #endif
  96605. #ifdef WOLFSSL_KEIL
  96606. "adcs r4, r4, r7\n\t"
  96607. #elif defined(__clang__)
  96608. "adcs r4, r7\n\t"
  96609. #else
  96610. "adc r4, r7\n\t"
  96611. #endif
  96612. #ifdef WOLFSSL_KEIL
  96613. "adcs r5, r5, %[r]\n\t"
  96614. #elif defined(__clang__)
  96615. "adcs r5, %[r]\n\t"
  96616. #else
  96617. "adc r5, %[r]\n\t"
  96618. #endif
  96619. "# Square: Done\n\t"
  96620. "mov r2, r12\n\t"
  96621. "\n"
  96622. "L_sp_256_sqr_8_done_sqr_%=:\n\t"
  96623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96624. "adds %[a], %[a], #4\n\t"
  96625. #else
  96626. "add %[a], %[a], #4\n\t"
  96627. #endif
  96628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96629. "subs r2, r2, #4\n\t"
  96630. #else
  96631. "sub r2, r2, #4\n\t"
  96632. #endif
  96633. "movs r6, #32\n\t"
  96634. "add r6, r6, r9\n\t"
  96635. "cmp %[a], r6\n\t"
  96636. "beq L_sp_256_sqr_8_done_mul_%=\n\t"
  96637. "cmp %[a], r2\n\t"
  96638. "bgt L_sp_256_sqr_8_done_mul_%=\n\t"
  96639. "mov r7, r8\n\t"
  96640. "add r7, r7, r9\n\t"
  96641. "cmp %[a], r7\n\t"
  96642. "ble L_sp_256_sqr_8_mul_%=\n\t"
  96643. "\n"
  96644. "L_sp_256_sqr_8_done_mul_%=:\n\t"
  96645. "mov %[r], r10\n\t"
  96646. "mov r7, r8\n\t"
  96647. "str r3, [%[r], r7]\n\t"
  96648. "movs r3, r4\n\t"
  96649. "movs r4, r5\n\t"
  96650. "movs r5, #0\n\t"
  96651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96652. "adds r7, r7, #4\n\t"
  96653. #else
  96654. "add r7, r7, #4\n\t"
  96655. #endif
  96656. "mov r8, r7\n\t"
  96657. "movs r6, #56\n\t"
  96658. "cmp r7, r6\n\t"
  96659. "ble L_sp_256_sqr_8_words_%=\n\t"
  96660. "mov %[a], r9\n\t"
  96661. "str r3, [%[r], r7]\n\t"
  96662. "mov %[r], r11\n\t"
  96663. "mov %[a], r10\n\t"
  96664. "movs r3, #60\n\t"
  96665. "\n"
  96666. "L_sp_256_sqr_8_store_%=:\n\t"
  96667. "ldr r6, [%[a], r3]\n\t"
  96668. "str r6, [%[r], r3]\n\t"
  96669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96670. "subs r3, r3, #4\n\t"
  96671. #else
  96672. "sub r3, r3, #4\n\t"
  96673. #endif
  96674. "bge L_sp_256_sqr_8_store_%=\n\t"
  96675. "movs r6, #0x40\n\t"
  96676. "add sp, sp, r6\n\t"
  96677. : [r] "+l" (r), [a] "+l" (a)
  96678. :
  96679. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  96680. );
  96681. }
  96682. #ifdef WOLFSSL_SP_SMALL
  96683. /* Add b to a into r. (r = a + b)
  96684. *
  96685. * r A single precision integer.
  96686. * a A single precision integer.
  96687. * b A single precision integer.
  96688. */
  96689. SP_NOINLINE static sp_digit sp_256_add_8(sp_digit* r, const sp_digit* a,
  96690. const sp_digit* b)
  96691. {
  96692. __asm__ __volatile__ (
  96693. "movs r6, %[a]\n\t"
  96694. "movs r7, #0\n\t"
  96695. "movs r3, #0\n\t"
  96696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96697. "adds r6, r6, #32\n\t"
  96698. #else
  96699. "add r6, r6, #32\n\t"
  96700. #endif
  96701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96702. "subs r7, r7, #1\n\t"
  96703. #else
  96704. "sub r7, r7, #1\n\t"
  96705. #endif
  96706. "\n"
  96707. "L_sp_256_add_8_word_%=:\n\t"
  96708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96709. "adds r3, r3, r7\n\t"
  96710. #else
  96711. "add r3, r3, r7\n\t"
  96712. #endif
  96713. "ldr r4, [%[a]]\n\t"
  96714. "ldr r5, [%[b]]\n\t"
  96715. #ifdef WOLFSSL_KEIL
  96716. "adcs r4, r4, r5\n\t"
  96717. #elif defined(__clang__)
  96718. "adcs r4, r5\n\t"
  96719. #else
  96720. "adc r4, r5\n\t"
  96721. #endif
  96722. "str r4, [%[r]]\n\t"
  96723. "movs r3, #0\n\t"
  96724. #ifdef WOLFSSL_KEIL
  96725. "adcs r3, r3, r3\n\t"
  96726. #elif defined(__clang__)
  96727. "adcs r3, r3\n\t"
  96728. #else
  96729. "adc r3, r3\n\t"
  96730. #endif
  96731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96732. "adds %[a], %[a], #4\n\t"
  96733. #else
  96734. "add %[a], %[a], #4\n\t"
  96735. #endif
  96736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96737. "adds %[b], %[b], #4\n\t"
  96738. #else
  96739. "add %[b], %[b], #4\n\t"
  96740. #endif
  96741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96742. "adds %[r], %[r], #4\n\t"
  96743. #else
  96744. "add %[r], %[r], #4\n\t"
  96745. #endif
  96746. "cmp %[a], r6\n\t"
  96747. "bne L_sp_256_add_8_word_%=\n\t"
  96748. "movs %[r], r3\n\t"
  96749. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  96750. :
  96751. : "memory", "r3", "r4", "r5", "r6", "r7"
  96752. );
  96753. return (uint32_t)(size_t)r;
  96754. }
  96755. #else
  96756. /* Add b to a into r. (r = a + b)
  96757. *
  96758. * r A single precision integer.
  96759. * a A single precision integer.
  96760. * b A single precision integer.
  96761. */
  96762. SP_NOINLINE static sp_digit sp_256_add_8(sp_digit* r, const sp_digit* a,
  96763. const sp_digit* b)
  96764. {
  96765. __asm__ __volatile__ (
  96766. "ldm %[b]!, {r5, r6}\n\t"
  96767. "ldm %[a]!, {r3, r4}\n\t"
  96768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96769. "adds r3, r3, r5\n\t"
  96770. #else
  96771. "add r3, r3, r5\n\t"
  96772. #endif
  96773. #ifdef WOLFSSL_KEIL
  96774. "adcs r4, r4, r6\n\t"
  96775. #elif defined(__clang__)
  96776. "adcs r4, r6\n\t"
  96777. #else
  96778. "adc r4, r6\n\t"
  96779. #endif
  96780. "stm %[r]!, {r3, r4}\n\t"
  96781. "ldm %[b]!, {r5, r6}\n\t"
  96782. "ldm %[a]!, {r3, r4}\n\t"
  96783. #ifdef WOLFSSL_KEIL
  96784. "adcs r3, r3, r5\n\t"
  96785. #elif defined(__clang__)
  96786. "adcs r3, r5\n\t"
  96787. #else
  96788. "adc r3, r5\n\t"
  96789. #endif
  96790. #ifdef WOLFSSL_KEIL
  96791. "adcs r4, r4, r6\n\t"
  96792. #elif defined(__clang__)
  96793. "adcs r4, r6\n\t"
  96794. #else
  96795. "adc r4, r6\n\t"
  96796. #endif
  96797. "stm %[r]!, {r3, r4}\n\t"
  96798. "ldm %[b]!, {r5, r6}\n\t"
  96799. "ldm %[a]!, {r3, r4}\n\t"
  96800. #ifdef WOLFSSL_KEIL
  96801. "adcs r3, r3, r5\n\t"
  96802. #elif defined(__clang__)
  96803. "adcs r3, r5\n\t"
  96804. #else
  96805. "adc r3, r5\n\t"
  96806. #endif
  96807. #ifdef WOLFSSL_KEIL
  96808. "adcs r4, r4, r6\n\t"
  96809. #elif defined(__clang__)
  96810. "adcs r4, r6\n\t"
  96811. #else
  96812. "adc r4, r6\n\t"
  96813. #endif
  96814. "stm %[r]!, {r3, r4}\n\t"
  96815. "ldm %[b]!, {r5, r6}\n\t"
  96816. "ldm %[a]!, {r3, r4}\n\t"
  96817. #ifdef WOLFSSL_KEIL
  96818. "adcs r3, r3, r5\n\t"
  96819. #elif defined(__clang__)
  96820. "adcs r3, r5\n\t"
  96821. #else
  96822. "adc r3, r5\n\t"
  96823. #endif
  96824. #ifdef WOLFSSL_KEIL
  96825. "adcs r4, r4, r6\n\t"
  96826. #elif defined(__clang__)
  96827. "adcs r4, r6\n\t"
  96828. #else
  96829. "adc r4, r6\n\t"
  96830. #endif
  96831. "stm %[r]!, {r3, r4}\n\t"
  96832. "movs %[r], #0\n\t"
  96833. #ifdef WOLFSSL_KEIL
  96834. "adcs %[r], %[r], %[r]\n\t"
  96835. #elif defined(__clang__)
  96836. "adcs %[r], %[r]\n\t"
  96837. #else
  96838. "adc %[r], %[r]\n\t"
  96839. #endif
  96840. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  96841. :
  96842. : "memory", "r3", "r4", "r5", "r6"
  96843. );
  96844. return (uint32_t)(size_t)r;
  96845. }
  96846. #endif /* WOLFSSL_SP_SMALL */
  96847. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  96848. *
  96849. * r The resulting Montgomery form number.
  96850. * a The number to convert.
  96851. * m The modulus (prime).
  96852. */
  96853. static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  96854. {
  96855. int64_t t[8];
  96856. int64_t a64[8];
  96857. int64_t o;
  96858. (void)m;
  96859. a64[0] = a[0];
  96860. a64[1] = a[1];
  96861. a64[2] = a[2];
  96862. a64[3] = a[3];
  96863. a64[4] = a[4];
  96864. a64[5] = a[5];
  96865. a64[6] = a[6];
  96866. a64[7] = a[7];
  96867. /* 1 1 0 -1 -1 -1 -1 0 */
  96868. t[0] = 0 + a64[0] + a64[1] - a64[3] - a64[4] - a64[5] - a64[6];
  96869. /* 0 1 1 0 -1 -1 -1 -1 */
  96870. t[1] = 0 + a64[1] + a64[2] - a64[4] - a64[5] - a64[6] - a64[7];
  96871. /* 0 0 1 1 0 -1 -1 -1 */
  96872. t[2] = 0 + a64[2] + a64[3] - a64[5] - a64[6] - a64[7];
  96873. /* -1 -1 0 2 2 1 0 -1 */
  96874. t[3] = 0 - a64[0] - a64[1] + 2 * a64[3] + 2 * a64[4] + a64[5] - a64[7];
  96875. /* 0 -1 -1 0 2 2 1 0 */
  96876. t[4] = 0 - a64[1] - a64[2] + 2 * a64[4] + 2 * a64[5] + a64[6];
  96877. /* 0 0 -1 -1 0 2 2 1 */
  96878. t[5] = 0 - a64[2] - a64[3] + 2 * a64[5] + 2 * a64[6] + a64[7];
  96879. /* -1 -1 0 0 0 1 3 2 */
  96880. t[6] = 0 - a64[0] - a64[1] + a64[5] + 3 * a64[6] + 2 * a64[7];
  96881. /* 1 0 -1 -1 -1 -1 0 3 */
  96882. t[7] = 0 + a64[0] - a64[2] - a64[3] - a64[4] - a64[5] + 3 * a64[7];
  96883. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  96884. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  96885. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  96886. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  96887. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  96888. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  96889. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  96890. o = t[7] >> 32; t[7] &= 0xffffffff;
  96891. t[0] += o;
  96892. t[3] -= o;
  96893. t[6] -= o;
  96894. t[7] += o;
  96895. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  96896. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  96897. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  96898. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  96899. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  96900. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  96901. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  96902. o = t[7] >> 32; t[7] &= 0xffffffff;
  96903. t[0] += o;
  96904. t[3] -= o;
  96905. t[6] -= o;
  96906. t[7] += o;
  96907. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  96908. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  96909. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  96910. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  96911. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  96912. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  96913. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  96914. r[0] = (sp_digit)t[0];
  96915. r[1] = (sp_digit)t[1];
  96916. r[2] = (sp_digit)t[2];
  96917. r[3] = (sp_digit)t[3];
  96918. r[4] = (sp_digit)t[4];
  96919. r[5] = (sp_digit)t[5];
  96920. r[6] = (sp_digit)t[6];
  96921. r[7] = (sp_digit)t[7];
  96922. return MP_OKAY;
  96923. }
  96924. /* Convert an mp_int to an array of sp_digit.
  96925. *
  96926. * r A single precision integer.
  96927. * size Maximum number of bytes to convert
  96928. * a A multi-precision integer.
  96929. */
  96930. static void sp_256_from_mp(sp_digit* r, int size, const mp_int* a)
  96931. {
  96932. #if DIGIT_BIT == 32
  96933. int i;
  96934. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  96935. int o = 0;
  96936. for (i = 0; i < size; i++) {
  96937. sp_digit mask = (sp_digit)0 - (j >> 31);
  96938. r[i] = a->dp[o] & mask;
  96939. j++;
  96940. o += (int)(j >> 31);
  96941. }
  96942. #elif DIGIT_BIT > 32
  96943. unsigned int i;
  96944. int j = 0;
  96945. word32 s = 0;
  96946. r[0] = 0;
  96947. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  96948. r[j] |= ((sp_digit)a->dp[i] << s);
  96949. r[j] &= 0xffffffff;
  96950. s = 32U - s;
  96951. if (j + 1 >= size) {
  96952. break;
  96953. }
  96954. /* lint allow cast of mismatch word32 and mp_digit */
  96955. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  96956. while ((s + 32U) <= (word32)DIGIT_BIT) {
  96957. s += 32U;
  96958. r[j] &= 0xffffffff;
  96959. if (j + 1 >= size) {
  96960. break;
  96961. }
  96962. if (s < (word32)DIGIT_BIT) {
  96963. /* lint allow cast of mismatch word32 and mp_digit */
  96964. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  96965. }
  96966. else {
  96967. r[++j] = (sp_digit)0;
  96968. }
  96969. }
  96970. s = (word32)DIGIT_BIT - s;
  96971. }
  96972. for (j++; j < size; j++) {
  96973. r[j] = 0;
  96974. }
  96975. #else
  96976. unsigned int i;
  96977. int j = 0;
  96978. int s = 0;
  96979. r[0] = 0;
  96980. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  96981. r[j] |= ((sp_digit)a->dp[i]) << s;
  96982. if (s + DIGIT_BIT >= 32) {
  96983. r[j] &= 0xffffffff;
  96984. if (j + 1 >= size) {
  96985. break;
  96986. }
  96987. s = 32 - s;
  96988. if (s == DIGIT_BIT) {
  96989. r[++j] = 0;
  96990. s = 0;
  96991. }
  96992. else {
  96993. r[++j] = a->dp[i] >> s;
  96994. s = DIGIT_BIT - s;
  96995. }
  96996. }
  96997. else {
  96998. s += DIGIT_BIT;
  96999. }
  97000. }
  97001. for (j++; j < size; j++) {
  97002. r[j] = 0;
  97003. }
  97004. #endif
  97005. }
  97006. /* Convert a point of type ecc_point to type sp_point_256.
  97007. *
  97008. * p Point of type sp_point_256 (result).
  97009. * pm Point of type ecc_point.
  97010. */
  97011. static void sp_256_point_from_ecc_point_8(sp_point_256* p,
  97012. const ecc_point* pm)
  97013. {
  97014. XMEMSET(p->x, 0, sizeof(p->x));
  97015. XMEMSET(p->y, 0, sizeof(p->y));
  97016. XMEMSET(p->z, 0, sizeof(p->z));
  97017. sp_256_from_mp(p->x, 8, pm->x);
  97018. sp_256_from_mp(p->y, 8, pm->y);
  97019. sp_256_from_mp(p->z, 8, pm->z);
  97020. p->infinity = 0;
  97021. }
  97022. /* Convert an array of sp_digit to an mp_int.
  97023. *
  97024. * a A single precision integer.
  97025. * r A multi-precision integer.
  97026. */
  97027. static int sp_256_to_mp(const sp_digit* a, mp_int* r)
  97028. {
  97029. int err;
  97030. err = mp_grow(r, (256 + DIGIT_BIT - 1) / DIGIT_BIT);
  97031. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  97032. #if DIGIT_BIT == 32
  97033. XMEMCPY(r->dp, a, sizeof(sp_digit) * 8);
  97034. r->used = 8;
  97035. mp_clamp(r);
  97036. #elif DIGIT_BIT < 32
  97037. int i;
  97038. int j = 0;
  97039. int s = 0;
  97040. r->dp[0] = 0;
  97041. for (i = 0; i < 8; i++) {
  97042. r->dp[j] |= (mp_digit)(a[i] << s);
  97043. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  97044. s = DIGIT_BIT - s;
  97045. r->dp[++j] = (mp_digit)(a[i] >> s);
  97046. while (s + DIGIT_BIT <= 32) {
  97047. s += DIGIT_BIT;
  97048. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  97049. if (s == SP_WORD_SIZE) {
  97050. r->dp[j] = 0;
  97051. }
  97052. else {
  97053. r->dp[j] = (mp_digit)(a[i] >> s);
  97054. }
  97055. }
  97056. s = 32 - s;
  97057. }
  97058. r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
  97059. mp_clamp(r);
  97060. #else
  97061. int i;
  97062. int j = 0;
  97063. int s = 0;
  97064. r->dp[0] = 0;
  97065. for (i = 0; i < 8; i++) {
  97066. r->dp[j] |= ((mp_digit)a[i]) << s;
  97067. if (s + 32 >= DIGIT_BIT) {
  97068. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  97069. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  97070. #endif
  97071. s = DIGIT_BIT - s;
  97072. r->dp[++j] = a[i] >> s;
  97073. s = 32 - s;
  97074. }
  97075. else {
  97076. s += 32;
  97077. }
  97078. }
  97079. r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
  97080. mp_clamp(r);
  97081. #endif
  97082. }
  97083. return err;
  97084. }
  97085. /* Convert a point of type sp_point_256 to type ecc_point.
  97086. *
  97087. * p Point of type sp_point_256.
  97088. * pm Point of type ecc_point (result).
  97089. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  97090. * MP_OKAY.
  97091. */
  97092. static int sp_256_point_to_ecc_point_8(const sp_point_256* p, ecc_point* pm)
  97093. {
  97094. int err;
  97095. err = sp_256_to_mp(p->x, pm->x);
  97096. if (err == MP_OKAY) {
  97097. err = sp_256_to_mp(p->y, pm->y);
  97098. }
  97099. if (err == MP_OKAY) {
  97100. err = sp_256_to_mp(p->z, pm->z);
  97101. }
  97102. return err;
  97103. }
  97104. /* Reduce the number back to 256 bits using Montgomery reduction.
  97105. *
  97106. * a A single precision number to reduce in place.
  97107. * m The single precision number representing the modulus.
  97108. * mp The digit representing the negative inverse of m mod 2^n.
  97109. */
  97110. SP_NOINLINE static void sp_256_mont_reduce_8(sp_digit* a, const sp_digit* m,
  97111. sp_digit mp)
  97112. {
  97113. (void)mp;
  97114. (void)m;
  97115. __asm__ __volatile__ (
  97116. "movs r2, #0\n\t"
  97117. "movs r1, #0\n\t"
  97118. "# i = 0\n\t"
  97119. "mov r8, r2\n\t"
  97120. "\n"
  97121. "L_sp_256_mont_reduce_8_mod_%=:\n\t"
  97122. "movs r4, #0\n\t"
  97123. "# mu = a[i] * 1 (mp) = a[i]\n\t"
  97124. "ldr r3, [%[a]]\n\t"
  97125. "# a[i+0] += -1 * mu\n\t"
  97126. "movs r5, r3\n\t"
  97127. "str r4, [%[a]]\n\t"
  97128. "# a[i+1] += -1 * mu\n\t"
  97129. "ldr r6, [%[a], #4]\n\t"
  97130. "movs r4, r3\n\t"
  97131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97132. "subs r5, r5, r3\n\t"
  97133. #else
  97134. "sub r5, r5, r3\n\t"
  97135. #endif
  97136. #ifdef WOLFSSL_KEIL
  97137. "sbcs r4, r4, r2\n\t"
  97138. #elif defined(__clang__)
  97139. "sbcs r4, r2\n\t"
  97140. #else
  97141. "sbc r4, r2\n\t"
  97142. #endif
  97143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97144. "adds r5, r5, r6\n\t"
  97145. #else
  97146. "add r5, r5, r6\n\t"
  97147. #endif
  97148. #ifdef WOLFSSL_KEIL
  97149. "adcs r4, r4, r2\n\t"
  97150. #elif defined(__clang__)
  97151. "adcs r4, r2\n\t"
  97152. #else
  97153. "adc r4, r2\n\t"
  97154. #endif
  97155. "str r5, [%[a], #4]\n\t"
  97156. "# a[i+2] += -1 * mu\n\t"
  97157. "ldr r6, [%[a], #8]\n\t"
  97158. "movs r5, r3\n\t"
  97159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97160. "subs r4, r4, r3\n\t"
  97161. #else
  97162. "sub r4, r4, r3\n\t"
  97163. #endif
  97164. #ifdef WOLFSSL_KEIL
  97165. "sbcs r5, r5, r2\n\t"
  97166. #elif defined(__clang__)
  97167. "sbcs r5, r2\n\t"
  97168. #else
  97169. "sbc r5, r2\n\t"
  97170. #endif
  97171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97172. "adds r4, r4, r6\n\t"
  97173. #else
  97174. "add r4, r4, r6\n\t"
  97175. #endif
  97176. #ifdef WOLFSSL_KEIL
  97177. "adcs r5, r5, r2\n\t"
  97178. #elif defined(__clang__)
  97179. "adcs r5, r2\n\t"
  97180. #else
  97181. "adc r5, r2\n\t"
  97182. #endif
  97183. "str r4, [%[a], #8]\n\t"
  97184. "# a[i+3] += 0 * mu\n\t"
  97185. "ldr r6, [%[a], #12]\n\t"
  97186. "movs r4, #0\n\t"
  97187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97188. "adds r5, r5, r6\n\t"
  97189. #else
  97190. "add r5, r5, r6\n\t"
  97191. #endif
  97192. #ifdef WOLFSSL_KEIL
  97193. "adcs r4, r4, r2\n\t"
  97194. #elif defined(__clang__)
  97195. "adcs r4, r2\n\t"
  97196. #else
  97197. "adc r4, r2\n\t"
  97198. #endif
  97199. "str r5, [%[a], #12]\n\t"
  97200. "# a[i+4] += 0 * mu\n\t"
  97201. "ldr r6, [%[a], #16]\n\t"
  97202. "movs r5, #0\n\t"
  97203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97204. "adds r4, r4, r6\n\t"
  97205. #else
  97206. "add r4, r4, r6\n\t"
  97207. #endif
  97208. #ifdef WOLFSSL_KEIL
  97209. "adcs r5, r5, r2\n\t"
  97210. #elif defined(__clang__)
  97211. "adcs r5, r2\n\t"
  97212. #else
  97213. "adc r5, r2\n\t"
  97214. #endif
  97215. "str r4, [%[a], #16]\n\t"
  97216. "# a[i+5] += 0 * mu\n\t"
  97217. "ldr r6, [%[a], #20]\n\t"
  97218. "movs r4, #0\n\t"
  97219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97220. "adds r5, r5, r6\n\t"
  97221. #else
  97222. "add r5, r5, r6\n\t"
  97223. #endif
  97224. #ifdef WOLFSSL_KEIL
  97225. "adcs r4, r4, r2\n\t"
  97226. #elif defined(__clang__)
  97227. "adcs r4, r2\n\t"
  97228. #else
  97229. "adc r4, r2\n\t"
  97230. #endif
  97231. "str r5, [%[a], #20]\n\t"
  97232. "# a[i+6] += 1 * mu\n\t"
  97233. "ldr r6, [%[a], #24]\n\t"
  97234. "movs r5, #0\n\t"
  97235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97236. "adds r4, r4, r3\n\t"
  97237. #else
  97238. "add r4, r4, r3\n\t"
  97239. #endif
  97240. #ifdef WOLFSSL_KEIL
  97241. "adcs r5, r5, r2\n\t"
  97242. #elif defined(__clang__)
  97243. "adcs r5, r2\n\t"
  97244. #else
  97245. "adc r5, r2\n\t"
  97246. #endif
  97247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97248. "adds r4, r4, r6\n\t"
  97249. #else
  97250. "add r4, r4, r6\n\t"
  97251. #endif
  97252. #ifdef WOLFSSL_KEIL
  97253. "adcs r5, r5, r2\n\t"
  97254. #elif defined(__clang__)
  97255. "adcs r5, r2\n\t"
  97256. #else
  97257. "adc r5, r2\n\t"
  97258. #endif
  97259. "str r4, [%[a], #24]\n\t"
  97260. "# a[i+7] += -1 * mu\n\t"
  97261. "ldr r6, [%[a], #28]\n\t"
  97262. "ldr r7, [%[a], #32]\n\t"
  97263. #ifdef WOLFSSL_KEIL
  97264. "adds r4, r1, r3\n\t"
  97265. #else
  97266. #ifdef __clang__
  97267. "adds r4, r1, r3\n\t"
  97268. #else
  97269. "add r4, r1, r3\n\t"
  97270. #endif
  97271. #endif
  97272. "movs r1, #0\n\t"
  97273. #ifdef WOLFSSL_KEIL
  97274. "adcs r1, r1, r2\n\t"
  97275. #elif defined(__clang__)
  97276. "adcs r1, r2\n\t"
  97277. #else
  97278. "adc r1, r2\n\t"
  97279. #endif
  97280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97281. "subs r5, r5, r3\n\t"
  97282. #else
  97283. "sub r5, r5, r3\n\t"
  97284. #endif
  97285. #ifdef WOLFSSL_KEIL
  97286. "sbcs r4, r4, r2\n\t"
  97287. #elif defined(__clang__)
  97288. "sbcs r4, r2\n\t"
  97289. #else
  97290. "sbc r4, r2\n\t"
  97291. #endif
  97292. #ifdef WOLFSSL_KEIL
  97293. "sbcs r1, r1, r2\n\t"
  97294. #elif defined(__clang__)
  97295. "sbcs r1, r2\n\t"
  97296. #else
  97297. "sbc r1, r2\n\t"
  97298. #endif
  97299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97300. "adds r5, r5, r6\n\t"
  97301. #else
  97302. "add r5, r5, r6\n\t"
  97303. #endif
  97304. #ifdef WOLFSSL_KEIL
  97305. "adcs r4, r4, r7\n\t"
  97306. #elif defined(__clang__)
  97307. "adcs r4, r7\n\t"
  97308. #else
  97309. "adc r4, r7\n\t"
  97310. #endif
  97311. #ifdef WOLFSSL_KEIL
  97312. "adcs r1, r1, r2\n\t"
  97313. #elif defined(__clang__)
  97314. "adcs r1, r2\n\t"
  97315. #else
  97316. "adc r1, r2\n\t"
  97317. #endif
  97318. "str r5, [%[a], #28]\n\t"
  97319. "str r4, [%[a], #32]\n\t"
  97320. "# i += 1\n\t"
  97321. "movs r6, #4\n\t"
  97322. "add r8, r8, r6\n\t"
  97323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97324. "adds %[a], %[a], #4\n\t"
  97325. #else
  97326. "add %[a], %[a], #4\n\t"
  97327. #endif
  97328. "movs r6, #32\n\t"
  97329. "cmp r8, r6\n\t"
  97330. "blt L_sp_256_mont_reduce_8_mod_%=\n\t"
  97331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97332. "subs %[a], %[a], #32\n\t"
  97333. #else
  97334. "sub %[a], %[a], #32\n\t"
  97335. #endif
  97336. "movs r3, r1\n\t"
  97337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97338. "subs r1, r1, #1\n\t"
  97339. #else
  97340. "sub r1, r1, #1\n\t"
  97341. #endif
  97342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97343. "mvns r1, r1\n\t"
  97344. #else
  97345. "mvn r1, r1\n\t"
  97346. #endif
  97347. "ldr r5, [%[a], #32]\n\t"
  97348. "ldr r4, [%[a], #36]\n\t"
  97349. "ldr r6, [%[a], #40]\n\t"
  97350. "ldr r7, [%[a], #44]\n\t"
  97351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97352. "subs r5, r5, r1\n\t"
  97353. #else
  97354. "sub r5, r5, r1\n\t"
  97355. #endif
  97356. #ifdef WOLFSSL_KEIL
  97357. "sbcs r4, r4, r1\n\t"
  97358. #elif defined(__clang__)
  97359. "sbcs r4, r1\n\t"
  97360. #else
  97361. "sbc r4, r1\n\t"
  97362. #endif
  97363. #ifdef WOLFSSL_KEIL
  97364. "sbcs r6, r6, r1\n\t"
  97365. #elif defined(__clang__)
  97366. "sbcs r6, r1\n\t"
  97367. #else
  97368. "sbc r6, r1\n\t"
  97369. #endif
  97370. #ifdef WOLFSSL_KEIL
  97371. "sbcs r7, r7, r2\n\t"
  97372. #elif defined(__clang__)
  97373. "sbcs r7, r2\n\t"
  97374. #else
  97375. "sbc r7, r2\n\t"
  97376. #endif
  97377. "str r5, [%[a]]\n\t"
  97378. "str r4, [%[a], #4]\n\t"
  97379. "str r6, [%[a], #8]\n\t"
  97380. "str r7, [%[a], #12]\n\t"
  97381. "ldr r5, [%[a], #48]\n\t"
  97382. "ldr r4, [%[a], #52]\n\t"
  97383. "ldr r6, [%[a], #56]\n\t"
  97384. "ldr r7, [%[a], #60]\n\t"
  97385. #ifdef WOLFSSL_KEIL
  97386. "sbcs r5, r5, r2\n\t"
  97387. #elif defined(__clang__)
  97388. "sbcs r5, r2\n\t"
  97389. #else
  97390. "sbc r5, r2\n\t"
  97391. #endif
  97392. #ifdef WOLFSSL_KEIL
  97393. "sbcs r4, r4, r2\n\t"
  97394. #elif defined(__clang__)
  97395. "sbcs r4, r2\n\t"
  97396. #else
  97397. "sbc r4, r2\n\t"
  97398. #endif
  97399. #ifdef WOLFSSL_KEIL
  97400. "sbcs r6, r6, r3\n\t"
  97401. #elif defined(__clang__)
  97402. "sbcs r6, r3\n\t"
  97403. #else
  97404. "sbc r6, r3\n\t"
  97405. #endif
  97406. #ifdef WOLFSSL_KEIL
  97407. "sbcs r7, r7, r1\n\t"
  97408. #elif defined(__clang__)
  97409. "sbcs r7, r1\n\t"
  97410. #else
  97411. "sbc r7, r1\n\t"
  97412. #endif
  97413. "str r5, [%[a], #16]\n\t"
  97414. "str r4, [%[a], #20]\n\t"
  97415. "str r6, [%[a], #24]\n\t"
  97416. "str r7, [%[a], #28]\n\t"
  97417. : [a] "+l" (a)
  97418. :
  97419. : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8"
  97420. );
  97421. }
  97422. /* Reduce the number back to 256 bits using Montgomery reduction.
  97423. *
  97424. * a A single precision number to reduce in place.
  97425. * m The single precision number representing the modulus.
  97426. * mp The digit representing the negative inverse of m mod 2^n.
  97427. */
  97428. SP_NOINLINE static void sp_256_mont_reduce_order_8(sp_digit* a,
  97429. const sp_digit* m, sp_digit mp)
  97430. {
  97431. __asm__ __volatile__ (
  97432. "movs r7, #0\n\t"
  97433. "mov r8, %[mp]\n\t"
  97434. "mov r12, r7\n\t"
  97435. "mov lr, %[m]\n\t"
  97436. "mov r9, %[a]\n\t"
  97437. "mov r11, %[a]\n\t"
  97438. "movs r5, #28\n\t"
  97439. "movs r6, #32\n\t"
  97440. "add r9, r9, r5\n\t"
  97441. "add r11, r11, r6\n\t"
  97442. "\n"
  97443. "L_sp_256_mont_reduce_order_8_mod_%=:\n\t"
  97444. "movs r7, #0\n\t"
  97445. "movs r4, #0\n\t"
  97446. "# a[i] += m[0] * mu\n\t"
  97447. "ldm %[m]!, {%[mp]}\n\t"
  97448. "ldm %[a]!, {r3}\n\t"
  97449. "# mu = a[i] * mp\n\t"
  97450. "mov r5, r8\n\t"
  97451. #ifdef WOLFSSL_KEIL
  97452. "muls r5, r3, r5\n\t"
  97453. #elif defined(__clang__)
  97454. "muls r5, r3\n\t"
  97455. #else
  97456. "mul r5, r3\n\t"
  97457. #endif
  97458. "mov r10, r5\n\t"
  97459. "# Multiply m[0] and mu - Start\n\t"
  97460. "mov r5, r10\n\t"
  97461. "uxth r6, %[mp]\n\t"
  97462. "uxth r5, r5\n\t"
  97463. #ifdef WOLFSSL_KEIL
  97464. "muls r6, r5, r6\n\t"
  97465. #elif defined(__clang__)
  97466. "muls r6, r5\n\t"
  97467. #else
  97468. "mul r6, r5\n\t"
  97469. #endif
  97470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97471. "adds r3, r3, r6\n\t"
  97472. #else
  97473. "add r3, r3, r6\n\t"
  97474. #endif
  97475. #ifdef WOLFSSL_KEIL
  97476. "adcs r4, r4, r7\n\t"
  97477. #elif defined(__clang__)
  97478. "adcs r4, r7\n\t"
  97479. #else
  97480. "adc r4, r7\n\t"
  97481. #endif
  97482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97483. "lsrs r6, %[mp], #16\n\t"
  97484. #else
  97485. "lsr r6, %[mp], #16\n\t"
  97486. #endif
  97487. #ifdef WOLFSSL_KEIL
  97488. "muls r5, r6, r5\n\t"
  97489. #elif defined(__clang__)
  97490. "muls r5, r6\n\t"
  97491. #else
  97492. "mul r5, r6\n\t"
  97493. #endif
  97494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97495. "lsrs r6, r5, #16\n\t"
  97496. #else
  97497. "lsr r6, r5, #16\n\t"
  97498. #endif
  97499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97500. "lsls r5, r5, #16\n\t"
  97501. #else
  97502. "lsl r5, r5, #16\n\t"
  97503. #endif
  97504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97505. "adds r3, r3, r5\n\t"
  97506. #else
  97507. "add r3, r3, r5\n\t"
  97508. #endif
  97509. #ifdef WOLFSSL_KEIL
  97510. "adcs r4, r4, r6\n\t"
  97511. #elif defined(__clang__)
  97512. "adcs r4, r6\n\t"
  97513. #else
  97514. "adc r4, r6\n\t"
  97515. #endif
  97516. "mov r5, r10\n\t"
  97517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97518. "lsrs r6, %[mp], #16\n\t"
  97519. #else
  97520. "lsr r6, %[mp], #16\n\t"
  97521. #endif
  97522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97523. "lsrs r5, r5, #16\n\t"
  97524. #else
  97525. "lsr r5, r5, #16\n\t"
  97526. #endif
  97527. #ifdef WOLFSSL_KEIL
  97528. "muls r6, r5, r6\n\t"
  97529. #elif defined(__clang__)
  97530. "muls r6, r5\n\t"
  97531. #else
  97532. "mul r6, r5\n\t"
  97533. #endif
  97534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97535. "adds r4, r4, r6\n\t"
  97536. #else
  97537. "add r4, r4, r6\n\t"
  97538. #endif
  97539. "uxth r6, %[mp]\n\t"
  97540. #ifdef WOLFSSL_KEIL
  97541. "muls r5, r6, r5\n\t"
  97542. #elif defined(__clang__)
  97543. "muls r5, r6\n\t"
  97544. #else
  97545. "mul r5, r6\n\t"
  97546. #endif
  97547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97548. "lsrs r6, r5, #16\n\t"
  97549. #else
  97550. "lsr r6, r5, #16\n\t"
  97551. #endif
  97552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97553. "lsls r5, r5, #16\n\t"
  97554. #else
  97555. "lsl r5, r5, #16\n\t"
  97556. #endif
  97557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97558. "adds r3, r3, r5\n\t"
  97559. #else
  97560. "add r3, r3, r5\n\t"
  97561. #endif
  97562. #ifdef WOLFSSL_KEIL
  97563. "adcs r4, r4, r6\n\t"
  97564. #elif defined(__clang__)
  97565. "adcs r4, r6\n\t"
  97566. #else
  97567. "adc r4, r6\n\t"
  97568. #endif
  97569. "# Multiply m[0] and mu - Done\n\t"
  97570. "\n"
  97571. "L_sp_256_mont_reduce_order_8_word_%=:\n\t"
  97572. "# a[i+j] += m[j] * mu\n\t"
  97573. "ldr r3, [%[a]]\n\t"
  97574. "ldm %[m]!, {%[mp]}\n\t"
  97575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97576. "adds r3, r3, r4\n\t"
  97577. #else
  97578. "add r3, r3, r4\n\t"
  97579. #endif
  97580. "movs r4, #0\n\t"
  97581. #ifdef WOLFSSL_KEIL
  97582. "adcs r4, r4, r7\n\t"
  97583. #elif defined(__clang__)
  97584. "adcs r4, r7\n\t"
  97585. #else
  97586. "adc r4, r7\n\t"
  97587. #endif
  97588. "# Multiply m[j] and mu - Start\n\t"
  97589. "mov r5, r10\n\t"
  97590. "uxth r6, %[mp]\n\t"
  97591. "uxth r5, r5\n\t"
  97592. #ifdef WOLFSSL_KEIL
  97593. "muls r6, r5, r6\n\t"
  97594. #elif defined(__clang__)
  97595. "muls r6, r5\n\t"
  97596. #else
  97597. "mul r6, r5\n\t"
  97598. #endif
  97599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97600. "adds r3, r3, r6\n\t"
  97601. #else
  97602. "add r3, r3, r6\n\t"
  97603. #endif
  97604. #ifdef WOLFSSL_KEIL
  97605. "adcs r4, r4, r7\n\t"
  97606. #elif defined(__clang__)
  97607. "adcs r4, r7\n\t"
  97608. #else
  97609. "adc r4, r7\n\t"
  97610. #endif
  97611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97612. "lsrs r6, %[mp], #16\n\t"
  97613. #else
  97614. "lsr r6, %[mp], #16\n\t"
  97615. #endif
  97616. #ifdef WOLFSSL_KEIL
  97617. "muls r5, r6, r5\n\t"
  97618. #elif defined(__clang__)
  97619. "muls r5, r6\n\t"
  97620. #else
  97621. "mul r5, r6\n\t"
  97622. #endif
  97623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97624. "lsrs r6, r5, #16\n\t"
  97625. #else
  97626. "lsr r6, r5, #16\n\t"
  97627. #endif
  97628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97629. "lsls r5, r5, #16\n\t"
  97630. #else
  97631. "lsl r5, r5, #16\n\t"
  97632. #endif
  97633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97634. "adds r3, r3, r5\n\t"
  97635. #else
  97636. "add r3, r3, r5\n\t"
  97637. #endif
  97638. #ifdef WOLFSSL_KEIL
  97639. "adcs r4, r4, r6\n\t"
  97640. #elif defined(__clang__)
  97641. "adcs r4, r6\n\t"
  97642. #else
  97643. "adc r4, r6\n\t"
  97644. #endif
  97645. "mov r5, r10\n\t"
  97646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97647. "lsrs r6, %[mp], #16\n\t"
  97648. #else
  97649. "lsr r6, %[mp], #16\n\t"
  97650. #endif
  97651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97652. "lsrs r5, r5, #16\n\t"
  97653. #else
  97654. "lsr r5, r5, #16\n\t"
  97655. #endif
  97656. #ifdef WOLFSSL_KEIL
  97657. "muls r6, r5, r6\n\t"
  97658. #elif defined(__clang__)
  97659. "muls r6, r5\n\t"
  97660. #else
  97661. "mul r6, r5\n\t"
  97662. #endif
  97663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97664. "adds r4, r4, r6\n\t"
  97665. #else
  97666. "add r4, r4, r6\n\t"
  97667. #endif
  97668. "uxth r6, %[mp]\n\t"
  97669. #ifdef WOLFSSL_KEIL
  97670. "muls r5, r6, r5\n\t"
  97671. #elif defined(__clang__)
  97672. "muls r5, r6\n\t"
  97673. #else
  97674. "mul r5, r6\n\t"
  97675. #endif
  97676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97677. "lsrs r6, r5, #16\n\t"
  97678. #else
  97679. "lsr r6, r5, #16\n\t"
  97680. #endif
  97681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97682. "lsls r5, r5, #16\n\t"
  97683. #else
  97684. "lsl r5, r5, #16\n\t"
  97685. #endif
  97686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97687. "adds r3, r3, r5\n\t"
  97688. #else
  97689. "add r3, r3, r5\n\t"
  97690. #endif
  97691. #ifdef WOLFSSL_KEIL
  97692. "adcs r4, r4, r6\n\t"
  97693. #elif defined(__clang__)
  97694. "adcs r4, r6\n\t"
  97695. #else
  97696. "adc r4, r6\n\t"
  97697. #endif
  97698. "# Multiply m[j] and mu - Done\n\t"
  97699. "stm %[a]!, {r3}\n\t"
  97700. "cmp %[a], r9\n\t"
  97701. "blt L_sp_256_mont_reduce_order_8_word_%=\n\t"
  97702. "# a[i+7] += m[7] * mu\n\t"
  97703. "ldr %[mp], [%[m]]\n\t"
  97704. "mov r3, r12\n\t"
  97705. "# Multiply m[7] and mu - Start\n\t"
  97706. "mov r5, r10\n\t"
  97707. "uxth r6, %[mp]\n\t"
  97708. "uxth r5, r5\n\t"
  97709. #ifdef WOLFSSL_KEIL
  97710. "muls r6, r5, r6\n\t"
  97711. #elif defined(__clang__)
  97712. "muls r6, r5\n\t"
  97713. #else
  97714. "mul r6, r5\n\t"
  97715. #endif
  97716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97717. "adds r4, r4, r6\n\t"
  97718. #else
  97719. "add r4, r4, r6\n\t"
  97720. #endif
  97721. #ifdef WOLFSSL_KEIL
  97722. "adcs r3, r3, r7\n\t"
  97723. #elif defined(__clang__)
  97724. "adcs r3, r7\n\t"
  97725. #else
  97726. "adc r3, r7\n\t"
  97727. #endif
  97728. #ifdef WOLFSSL_KEIL
  97729. "adcs r7, r7, r7\n\t"
  97730. #elif defined(__clang__)
  97731. "adcs r7, r7\n\t"
  97732. #else
  97733. "adc r7, r7\n\t"
  97734. #endif
  97735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97736. "lsrs r6, %[mp], #16\n\t"
  97737. #else
  97738. "lsr r6, %[mp], #16\n\t"
  97739. #endif
  97740. #ifdef WOLFSSL_KEIL
  97741. "muls r5, r6, r5\n\t"
  97742. #elif defined(__clang__)
  97743. "muls r5, r6\n\t"
  97744. #else
  97745. "mul r5, r6\n\t"
  97746. #endif
  97747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97748. "lsrs r6, r5, #16\n\t"
  97749. #else
  97750. "lsr r6, r5, #16\n\t"
  97751. #endif
  97752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97753. "lsls r5, r5, #16\n\t"
  97754. #else
  97755. "lsl r5, r5, #16\n\t"
  97756. #endif
  97757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97758. "adds r4, r4, r5\n\t"
  97759. #else
  97760. "add r4, r4, r5\n\t"
  97761. #endif
  97762. #ifdef WOLFSSL_KEIL
  97763. "adcs r3, r3, r6\n\t"
  97764. #elif defined(__clang__)
  97765. "adcs r3, r6\n\t"
  97766. #else
  97767. "adc r3, r6\n\t"
  97768. #endif
  97769. #ifdef WOLFSSL_KEIL
  97770. "adcs r7, r7, r7\n\t"
  97771. #elif defined(__clang__)
  97772. "adcs r7, r7\n\t"
  97773. #else
  97774. "adc r7, r7\n\t"
  97775. #endif
  97776. "mov r5, r10\n\t"
  97777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97778. "lsrs r6, %[mp], #16\n\t"
  97779. #else
  97780. "lsr r6, %[mp], #16\n\t"
  97781. #endif
  97782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97783. "lsrs r5, r5, #16\n\t"
  97784. #else
  97785. "lsr r5, r5, #16\n\t"
  97786. #endif
  97787. #ifdef WOLFSSL_KEIL
  97788. "muls r6, r5, r6\n\t"
  97789. #elif defined(__clang__)
  97790. "muls r6, r5\n\t"
  97791. #else
  97792. "mul r6, r5\n\t"
  97793. #endif
  97794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97795. "adds r3, r3, r6\n\t"
  97796. #else
  97797. "add r3, r3, r6\n\t"
  97798. #endif
  97799. #ifdef WOLFSSL_KEIL
  97800. "adcs r7, r7, r7\n\t"
  97801. #elif defined(__clang__)
  97802. "adcs r7, r7\n\t"
  97803. #else
  97804. "adc r7, r7\n\t"
  97805. #endif
  97806. "uxth r6, %[mp]\n\t"
  97807. #ifdef WOLFSSL_KEIL
  97808. "muls r5, r6, r5\n\t"
  97809. #elif defined(__clang__)
  97810. "muls r5, r6\n\t"
  97811. #else
  97812. "mul r5, r6\n\t"
  97813. #endif
  97814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97815. "lsrs r6, r5, #16\n\t"
  97816. #else
  97817. "lsr r6, r5, #16\n\t"
  97818. #endif
  97819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97820. "lsls r5, r5, #16\n\t"
  97821. #else
  97822. "lsl r5, r5, #16\n\t"
  97823. #endif
  97824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97825. "adds r4, r4, r5\n\t"
  97826. #else
  97827. "add r4, r4, r5\n\t"
  97828. #endif
  97829. #ifdef WOLFSSL_KEIL
  97830. "adcs r3, r3, r6\n\t"
  97831. #elif defined(__clang__)
  97832. "adcs r3, r6\n\t"
  97833. #else
  97834. "adc r3, r6\n\t"
  97835. #endif
  97836. #ifdef WOLFSSL_KEIL
  97837. "adcs r7, r7, r7\n\t"
  97838. #elif defined(__clang__)
  97839. "adcs r7, r7\n\t"
  97840. #else
  97841. "adc r7, r7\n\t"
  97842. #endif
  97843. "# Multiply m[7] and mu - Done\n\t"
  97844. "ldr r5, [%[a]]\n\t"
  97845. "ldr r6, [%[a], #4]\n\t"
  97846. "movs %[mp], #0\n\t"
  97847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97848. "adds r5, r5, r4\n\t"
  97849. #else
  97850. "add r5, r5, r4\n\t"
  97851. #endif
  97852. #ifdef WOLFSSL_KEIL
  97853. "adcs r6, r6, r3\n\t"
  97854. #elif defined(__clang__)
  97855. "adcs r6, r3\n\t"
  97856. #else
  97857. "adc r6, r3\n\t"
  97858. #endif
  97859. #ifdef WOLFSSL_KEIL
  97860. "adcs r7, r7, %[mp]\n\t"
  97861. #elif defined(__clang__)
  97862. "adcs r7, %[mp]\n\t"
  97863. #else
  97864. "adc r7, %[mp]\n\t"
  97865. #endif
  97866. "stm %[a]!, {r5, r6}\n\t"
  97867. "# i += 1\n\t"
  97868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97869. "subs %[a], %[a], #4\n\t"
  97870. #else
  97871. "sub %[a], %[a], #4\n\t"
  97872. #endif
  97873. "movs r3, #28\n\t"
  97874. "mov r9, %[a]\n\t"
  97875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97876. "subs %[a], %[a], r3\n\t"
  97877. #else
  97878. "sub %[a], %[a], r3\n\t"
  97879. #endif
  97880. "mov r12, r7\n\t"
  97881. "mov %[m], lr\n\t"
  97882. "cmp r11, %[a]\n\t"
  97883. "bgt L_sp_256_mont_reduce_order_8_mod_%=\n\t"
  97884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97885. "negs r7, r7\n\t"
  97886. #else
  97887. "neg r7, r7\n\t"
  97888. #endif
  97889. "# Subtract masked modulus\n\t"
  97890. "movs r4, #32\n\t"
  97891. "movs %[mp], #0\n\t"
  97892. "movs r3, #0\n\t"
  97893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97894. "subs %[a], %[a], r4\n\t"
  97895. #else
  97896. "sub %[a], %[a], r4\n\t"
  97897. #endif
  97898. #ifndef WOLFSSL_SP_LARGE_CODE
  97899. "\n"
  97900. "L_sp_256_mont_reduce_order_8_sub_mask_%=:\n\t"
  97901. "ldm %[m]!, {r6}\n\t"
  97902. "movs r5, #0\n\t"
  97903. #ifdef WOLFSSL_KEIL
  97904. "ands r6, r6, r7\n\t"
  97905. #elif defined(__clang__)
  97906. "ands r6, r7\n\t"
  97907. #else
  97908. "and r6, r7\n\t"
  97909. #endif
  97910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97911. "subs r5, r5, %[mp]\n\t"
  97912. #else
  97913. "sub r5, r5, %[mp]\n\t"
  97914. #endif
  97915. "ldr r5, [%[a], r4]\n\t"
  97916. #ifdef WOLFSSL_KEIL
  97917. "sbcs r5, r5, r6\n\t"
  97918. #elif defined(__clang__)
  97919. "sbcs r5, r6\n\t"
  97920. #else
  97921. "sbc r5, r6\n\t"
  97922. #endif
  97923. #ifdef WOLFSSL_KEIL
  97924. "sbcs %[mp], %[mp], %[mp]\n\t"
  97925. #elif defined(__clang__)
  97926. "sbcs %[mp], %[mp]\n\t"
  97927. #else
  97928. "sbc %[mp], %[mp]\n\t"
  97929. #endif
  97930. "stm %[a]!, {r5}\n\t"
  97931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97932. "adds r3, r3, #4\n\t"
  97933. #else
  97934. "add r3, r3, #4\n\t"
  97935. #endif
  97936. "cmp r3, r4\n\t"
  97937. "blt L_sp_256_mont_reduce_order_8_sub_mask_%=\n\t"
  97938. #else /* WOLFSSL_SP_LARGE_CODE */
  97939. "ldm %[m]!, {r6}\n\t"
  97940. #ifdef WOLFSSL_KEIL
  97941. "ands r6, r6, r7\n\t"
  97942. #elif defined(__clang__)
  97943. "ands r6, r7\n\t"
  97944. #else
  97945. "and r6, r7\n\t"
  97946. #endif
  97947. "ldr r5, [%[a], r4]\n\t"
  97948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97949. "subs r5, r5, r6\n\t"
  97950. #else
  97951. "sub r5, r5, r6\n\t"
  97952. #endif
  97953. "stm %[a]!, {r5}\n\t"
  97954. "ldm %[m]!, {r6}\n\t"
  97955. #ifdef WOLFSSL_KEIL
  97956. "ands r6, r6, r7\n\t"
  97957. #elif defined(__clang__)
  97958. "ands r6, r7\n\t"
  97959. #else
  97960. "and r6, r7\n\t"
  97961. #endif
  97962. "ldr r5, [%[a], r4]\n\t"
  97963. #ifdef WOLFSSL_KEIL
  97964. "sbcs r5, r5, r6\n\t"
  97965. #elif defined(__clang__)
  97966. "sbcs r5, r6\n\t"
  97967. #else
  97968. "sbc r5, r6\n\t"
  97969. #endif
  97970. "stm %[a]!, {r5}\n\t"
  97971. "ldm %[m]!, {r6}\n\t"
  97972. #ifdef WOLFSSL_KEIL
  97973. "ands r6, r6, r7\n\t"
  97974. #elif defined(__clang__)
  97975. "ands r6, r7\n\t"
  97976. #else
  97977. "and r6, r7\n\t"
  97978. #endif
  97979. "ldr r5, [%[a], r4]\n\t"
  97980. #ifdef WOLFSSL_KEIL
  97981. "sbcs r5, r5, r6\n\t"
  97982. #elif defined(__clang__)
  97983. "sbcs r5, r6\n\t"
  97984. #else
  97985. "sbc r5, r6\n\t"
  97986. #endif
  97987. "stm %[a]!, {r5}\n\t"
  97988. "ldm %[m]!, {r6}\n\t"
  97989. #ifdef WOLFSSL_KEIL
  97990. "ands r6, r6, r7\n\t"
  97991. #elif defined(__clang__)
  97992. "ands r6, r7\n\t"
  97993. #else
  97994. "and r6, r7\n\t"
  97995. #endif
  97996. "ldr r5, [%[a], r4]\n\t"
  97997. #ifdef WOLFSSL_KEIL
  97998. "sbcs r5, r5, r6\n\t"
  97999. #elif defined(__clang__)
  98000. "sbcs r5, r6\n\t"
  98001. #else
  98002. "sbc r5, r6\n\t"
  98003. #endif
  98004. "stm %[a]!, {r5}\n\t"
  98005. "ldm %[m]!, {r6}\n\t"
  98006. #ifdef WOLFSSL_KEIL
  98007. "ands r6, r6, r7\n\t"
  98008. #elif defined(__clang__)
  98009. "ands r6, r7\n\t"
  98010. #else
  98011. "and r6, r7\n\t"
  98012. #endif
  98013. "ldr r5, [%[a], r4]\n\t"
  98014. #ifdef WOLFSSL_KEIL
  98015. "sbcs r5, r5, r6\n\t"
  98016. #elif defined(__clang__)
  98017. "sbcs r5, r6\n\t"
  98018. #else
  98019. "sbc r5, r6\n\t"
  98020. #endif
  98021. "stm %[a]!, {r5}\n\t"
  98022. "ldm %[m]!, {r6}\n\t"
  98023. #ifdef WOLFSSL_KEIL
  98024. "ands r6, r6, r7\n\t"
  98025. #elif defined(__clang__)
  98026. "ands r6, r7\n\t"
  98027. #else
  98028. "and r6, r7\n\t"
  98029. #endif
  98030. "ldr r5, [%[a], r4]\n\t"
  98031. #ifdef WOLFSSL_KEIL
  98032. "sbcs r5, r5, r6\n\t"
  98033. #elif defined(__clang__)
  98034. "sbcs r5, r6\n\t"
  98035. #else
  98036. "sbc r5, r6\n\t"
  98037. #endif
  98038. "stm %[a]!, {r5}\n\t"
  98039. "ldm %[m]!, {r6}\n\t"
  98040. #ifdef WOLFSSL_KEIL
  98041. "ands r6, r6, r7\n\t"
  98042. #elif defined(__clang__)
  98043. "ands r6, r7\n\t"
  98044. #else
  98045. "and r6, r7\n\t"
  98046. #endif
  98047. "ldr r5, [%[a], r4]\n\t"
  98048. #ifdef WOLFSSL_KEIL
  98049. "sbcs r5, r5, r6\n\t"
  98050. #elif defined(__clang__)
  98051. "sbcs r5, r6\n\t"
  98052. #else
  98053. "sbc r5, r6\n\t"
  98054. #endif
  98055. "stm %[a]!, {r5}\n\t"
  98056. "ldm %[m]!, {r6}\n\t"
  98057. #ifdef WOLFSSL_KEIL
  98058. "ands r6, r6, r7\n\t"
  98059. #elif defined(__clang__)
  98060. "ands r6, r7\n\t"
  98061. #else
  98062. "and r6, r7\n\t"
  98063. #endif
  98064. "ldr r5, [%[a], r4]\n\t"
  98065. #ifdef WOLFSSL_KEIL
  98066. "sbcs r5, r5, r6\n\t"
  98067. #elif defined(__clang__)
  98068. "sbcs r5, r6\n\t"
  98069. #else
  98070. "sbc r5, r6\n\t"
  98071. #endif
  98072. "stm %[a]!, {r5}\n\t"
  98073. #endif /* WOLFSSL_SP_LARGE_CODE */
  98074. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  98075. :
  98076. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  98077. );
  98078. }
  98079. /* Multiply two Montgomery form numbers mod the modulus (prime).
  98080. * (r = a * b mod m)
  98081. *
  98082. * r Result of multiplication.
  98083. * a First number to multiply in Montgomery form.
  98084. * b Second number to multiply in Montgomery form.
  98085. * m Modulus (prime).
  98086. * mp Montgomery multiplier.
  98087. */
  98088. SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a,
  98089. const sp_digit* b, const sp_digit* m, sp_digit mp)
  98090. {
  98091. sp_256_mul_8(r, a, b);
  98092. sp_256_mont_reduce_8(r, m, mp);
  98093. }
  98094. /* Square the Montgomery form number. (r = a * a mod m)
  98095. *
  98096. * r Result of squaring.
  98097. * a Number to square in Montgomery form.
  98098. * m Modulus (prime).
  98099. * mp Montgomery multiplier.
  98100. */
  98101. SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a,
  98102. const sp_digit* m, sp_digit mp)
  98103. {
  98104. sp_256_sqr_8(r, a);
  98105. sp_256_mont_reduce_8(r, m, mp);
  98106. }
  98107. #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
  98108. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  98109. *
  98110. * r Result of squaring.
  98111. * a Number to square in Montgomery form.
  98112. * n Number of times to square.
  98113. * m Modulus (prime).
  98114. * mp Montgomery multiplier.
  98115. */
  98116. SP_NOINLINE static void sp_256_mont_sqr_n_8(sp_digit* r,
  98117. const sp_digit* a, int n, const sp_digit* m, sp_digit mp)
  98118. {
  98119. sp_256_mont_sqr_8(r, a, m, mp);
  98120. for (; n > 1; n--) {
  98121. sp_256_mont_sqr_8(r, r, m, mp);
  98122. }
  98123. }
  98124. #endif /* !WOLFSSL_SP_SMALL || HAVE_COMP_KEY */
  98125. #ifdef WOLFSSL_SP_SMALL
  98126. /* Mod-2 for the P256 curve. */
  98127. static const uint32_t p256_mod_minus_2[8] = {
  98128. 0xfffffffdU,0xffffffffU,0xffffffffU,0x00000000U,0x00000000U,0x00000000U,
  98129. 0x00000001U,0xffffffffU
  98130. };
  98131. #endif /* !WOLFSSL_SP_SMALL */
  98132. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  98133. * P256 curve. (r = 1 / a mod m)
  98134. *
  98135. * r Inverse result.
  98136. * a Number to invert.
  98137. * td Temporary data.
  98138. */
  98139. static void sp_256_mont_inv_8(sp_digit* r, const sp_digit* a, sp_digit* td)
  98140. {
  98141. #ifdef WOLFSSL_SP_SMALL
  98142. sp_digit* t = td;
  98143. int i;
  98144. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  98145. for (i=254; i>=0; i--) {
  98146. sp_256_mont_sqr_8(t, t, p256_mod, p256_mp_mod);
  98147. if (p256_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  98148. sp_256_mont_mul_8(t, t, a, p256_mod, p256_mp_mod);
  98149. }
  98150. XMEMCPY(r, t, sizeof(sp_digit) * 8);
  98151. #else
  98152. sp_digit* t1 = td;
  98153. sp_digit* t2 = td + 2 * 8;
  98154. sp_digit* t3 = td + 4 * 8;
  98155. /* 0x2 */
  98156. sp_256_mont_sqr_8(t1, a, p256_mod, p256_mp_mod);
  98157. /* 0x3 */
  98158. sp_256_mont_mul_8(t2, t1, a, p256_mod, p256_mp_mod);
  98159. /* 0xc */
  98160. sp_256_mont_sqr_n_8(t1, t2, 2, p256_mod, p256_mp_mod);
  98161. /* 0xd */
  98162. sp_256_mont_mul_8(t3, t1, a, p256_mod, p256_mp_mod);
  98163. /* 0xf */
  98164. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  98165. /* 0xf0 */
  98166. sp_256_mont_sqr_n_8(t1, t2, 4, p256_mod, p256_mp_mod);
  98167. /* 0xfd */
  98168. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  98169. /* 0xff */
  98170. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  98171. /* 0xff00 */
  98172. sp_256_mont_sqr_n_8(t1, t2, 8, p256_mod, p256_mp_mod);
  98173. /* 0xfffd */
  98174. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  98175. /* 0xffff */
  98176. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  98177. /* 0xffff0000 */
  98178. sp_256_mont_sqr_n_8(t1, t2, 16, p256_mod, p256_mp_mod);
  98179. /* 0xfffffffd */
  98180. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  98181. /* 0xffffffff */
  98182. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  98183. /* 0xffffffff00000000 */
  98184. sp_256_mont_sqr_n_8(t1, t2, 32, p256_mod, p256_mp_mod);
  98185. /* 0xffffffffffffffff */
  98186. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  98187. /* 0xffffffff00000001 */
  98188. sp_256_mont_mul_8(r, t1, a, p256_mod, p256_mp_mod);
  98189. /* 0xffffffff000000010000000000000000000000000000000000000000 */
  98190. sp_256_mont_sqr_n_8(r, r, 160, p256_mod, p256_mp_mod);
  98191. /* 0xffffffff00000001000000000000000000000000ffffffffffffffff */
  98192. sp_256_mont_mul_8(r, r, t2, p256_mod, p256_mp_mod);
  98193. /* 0xffffffff00000001000000000000000000000000ffffffffffffffff00000000 */
  98194. sp_256_mont_sqr_n_8(r, r, 32, p256_mod, p256_mp_mod);
  98195. /* 0xffffffff00000001000000000000000000000000fffffffffffffffffffffffd */
  98196. sp_256_mont_mul_8(r, r, t3, p256_mod, p256_mp_mod);
  98197. #endif /* WOLFSSL_SP_SMALL */
  98198. }
  98199. /* Compare a with b in constant time.
  98200. *
  98201. * a A single precision integer.
  98202. * b A single precision integer.
  98203. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  98204. * respectively.
  98205. */
  98206. SP_NOINLINE static sp_int32 sp_256_cmp_8(const sp_digit* a, const sp_digit* b)
  98207. {
  98208. __asm__ __volatile__ (
  98209. "movs r2, #0\n\t"
  98210. "movs r3, #0\n\t"
  98211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98212. "mvns r3, r3\n\t"
  98213. #else
  98214. "mvn r3, r3\n\t"
  98215. #endif
  98216. "movs r6, #28\n\t"
  98217. "\n"
  98218. "L_sp_256_cmp_8_words_%=:\n\t"
  98219. "ldr r7, [%[a], r6]\n\t"
  98220. "ldr r5, [%[b], r6]\n\t"
  98221. #ifdef WOLFSSL_KEIL
  98222. "ands r7, r7, r3\n\t"
  98223. #elif defined(__clang__)
  98224. "ands r7, r3\n\t"
  98225. #else
  98226. "and r7, r3\n\t"
  98227. #endif
  98228. #ifdef WOLFSSL_KEIL
  98229. "ands r5, r5, r3\n\t"
  98230. #elif defined(__clang__)
  98231. "ands r5, r3\n\t"
  98232. #else
  98233. "and r5, r3\n\t"
  98234. #endif
  98235. "movs r4, r7\n\t"
  98236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98237. "subs r7, r7, r5\n\t"
  98238. #else
  98239. "sub r7, r7, r5\n\t"
  98240. #endif
  98241. #ifdef WOLFSSL_KEIL
  98242. "sbcs r7, r7, r7\n\t"
  98243. #elif defined(__clang__)
  98244. "sbcs r7, r7\n\t"
  98245. #else
  98246. "sbc r7, r7\n\t"
  98247. #endif
  98248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98249. "adds r2, r2, r7\n\t"
  98250. #else
  98251. "add r2, r2, r7\n\t"
  98252. #endif
  98253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98254. "mvns r7, r7\n\t"
  98255. #else
  98256. "mvn r7, r7\n\t"
  98257. #endif
  98258. #ifdef WOLFSSL_KEIL
  98259. "ands r3, r3, r7\n\t"
  98260. #elif defined(__clang__)
  98261. "ands r3, r7\n\t"
  98262. #else
  98263. "and r3, r7\n\t"
  98264. #endif
  98265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98266. "subs r5, r5, r4\n\t"
  98267. #else
  98268. "sub r5, r5, r4\n\t"
  98269. #endif
  98270. #ifdef WOLFSSL_KEIL
  98271. "sbcs r7, r7, r7\n\t"
  98272. #elif defined(__clang__)
  98273. "sbcs r7, r7\n\t"
  98274. #else
  98275. "sbc r7, r7\n\t"
  98276. #endif
  98277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98278. "subs r2, r2, r7\n\t"
  98279. #else
  98280. "sub r2, r2, r7\n\t"
  98281. #endif
  98282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98283. "mvns r7, r7\n\t"
  98284. #else
  98285. "mvn r7, r7\n\t"
  98286. #endif
  98287. #ifdef WOLFSSL_KEIL
  98288. "ands r3, r3, r7\n\t"
  98289. #elif defined(__clang__)
  98290. "ands r3, r7\n\t"
  98291. #else
  98292. "and r3, r7\n\t"
  98293. #endif
  98294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98295. "subs r6, r6, #4\n\t"
  98296. #else
  98297. "sub r6, r6, #4\n\t"
  98298. #endif
  98299. "bge L_sp_256_cmp_8_words_%=\n\t"
  98300. "movs %[a], r2\n\t"
  98301. : [a] "+l" (a), [b] "+l" (b)
  98302. :
  98303. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  98304. );
  98305. return (uint32_t)(size_t)a;
  98306. }
  98307. /* Normalize the values in each word to 32.
  98308. *
  98309. * a Array of sp_digit to normalize.
  98310. */
  98311. #define sp_256_norm_8(a)
  98312. /* Conditionally subtract b from a using the mask m.
  98313. * m is -1 to subtract and 0 when not copying.
  98314. *
  98315. * r A single precision number representing condition subtract result.
  98316. * a A single precision number to subtract from.
  98317. * b A single precision number to subtract.
  98318. * m Mask value to apply.
  98319. */
  98320. SP_NOINLINE static sp_digit sp_256_cond_sub_8(sp_digit* r, const sp_digit* a,
  98321. const sp_digit* b, sp_digit m)
  98322. {
  98323. __asm__ __volatile__ (
  98324. "movs r4, #0\n\t"
  98325. "movs r5, #32\n\t"
  98326. "mov r8, r5\n\t"
  98327. "movs r7, #0\n\t"
  98328. "\n"
  98329. "L_sp_256_cond_sub_8_words_%=:\n\t"
  98330. "ldr r6, [%[b], r7]\n\t"
  98331. #ifdef WOLFSSL_KEIL
  98332. "ands r6, r6, %[m]\n\t"
  98333. #elif defined(__clang__)
  98334. "ands r6, %[m]\n\t"
  98335. #else
  98336. "and r6, %[m]\n\t"
  98337. #endif
  98338. "movs r5, #0\n\t"
  98339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98340. "subs r5, r5, r4\n\t"
  98341. #else
  98342. "sub r5, r5, r4\n\t"
  98343. #endif
  98344. "ldr r5, [%[a], r7]\n\t"
  98345. #ifdef WOLFSSL_KEIL
  98346. "sbcs r5, r5, r6\n\t"
  98347. #elif defined(__clang__)
  98348. "sbcs r5, r6\n\t"
  98349. #else
  98350. "sbc r5, r6\n\t"
  98351. #endif
  98352. #ifdef WOLFSSL_KEIL
  98353. "sbcs r4, r4, r4\n\t"
  98354. #elif defined(__clang__)
  98355. "sbcs r4, r4\n\t"
  98356. #else
  98357. "sbc r4, r4\n\t"
  98358. #endif
  98359. "str r5, [%[r], r7]\n\t"
  98360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98361. "adds r7, r7, #4\n\t"
  98362. #else
  98363. "add r7, r7, #4\n\t"
  98364. #endif
  98365. "cmp r7, r8\n\t"
  98366. "blt L_sp_256_cond_sub_8_words_%=\n\t"
  98367. "movs %[r], r4\n\t"
  98368. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  98369. :
  98370. : "memory", "r4", "r5", "r6", "r7", "r8"
  98371. );
  98372. return (uint32_t)(size_t)r;
  98373. }
  98374. /* Map the Montgomery form projective coordinate point to an affine point.
  98375. *
  98376. * r Resulting affine coordinate point.
  98377. * p Montgomery form projective coordinate point.
  98378. * t Temporary ordinate data.
  98379. */
  98380. static void sp_256_map_8(sp_point_256* r, const sp_point_256* p,
  98381. sp_digit* t)
  98382. {
  98383. sp_digit* t1 = t;
  98384. sp_digit* t2 = t + 2*8;
  98385. sp_int32 n;
  98386. sp_256_mont_inv_8(t1, p->z, t + 2*8);
  98387. sp_256_mont_sqr_8(t2, t1, p256_mod, p256_mp_mod);
  98388. sp_256_mont_mul_8(t1, t2, t1, p256_mod, p256_mp_mod);
  98389. /* x /= z^2 */
  98390. sp_256_mont_mul_8(r->x, p->x, t2, p256_mod, p256_mp_mod);
  98391. XMEMSET(r->x + 8, 0, sizeof(sp_digit) * 8U);
  98392. sp_256_mont_reduce_8(r->x, p256_mod, p256_mp_mod);
  98393. /* Reduce x to less than modulus */
  98394. n = sp_256_cmp_8(r->x, p256_mod);
  98395. sp_256_cond_sub_8(r->x, r->x, p256_mod, ~(n >> 31));
  98396. sp_256_norm_8(r->x);
  98397. /* y /= z^3 */
  98398. sp_256_mont_mul_8(r->y, p->y, t1, p256_mod, p256_mp_mod);
  98399. XMEMSET(r->y + 8, 0, sizeof(sp_digit) * 8U);
  98400. sp_256_mont_reduce_8(r->y, p256_mod, p256_mp_mod);
  98401. /* Reduce y to less than modulus */
  98402. n = sp_256_cmp_8(r->y, p256_mod);
  98403. sp_256_cond_sub_8(r->y, r->y, p256_mod, ~(n >> 31));
  98404. sp_256_norm_8(r->y);
  98405. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  98406. r->z[0] = 1;
  98407. }
  98408. /* Add two Montgomery form numbers (r = a + b % m).
  98409. *
  98410. * r Result of addition.
  98411. * a First number to add in Montgomery form.
  98412. * b Second number to add in Montgomery form.
  98413. * m Modulus (prime).
  98414. */
  98415. SP_NOINLINE static void sp_256_mont_add_8(sp_digit* r, const sp_digit* a,
  98416. const sp_digit* b, const sp_digit* m)
  98417. {
  98418. (void)m;
  98419. __asm__ __volatile__ (
  98420. "movs r3, #0\n\t"
  98421. "ldr r4, [%[a]]\n\t"
  98422. "ldr r5, [%[a], #4]\n\t"
  98423. "ldr r6, [%[b]]\n\t"
  98424. "ldr r7, [%[b], #4]\n\t"
  98425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98426. "adds r4, r4, r6\n\t"
  98427. #else
  98428. "add r4, r4, r6\n\t"
  98429. #endif
  98430. #ifdef WOLFSSL_KEIL
  98431. "adcs r5, r5, r7\n\t"
  98432. #elif defined(__clang__)
  98433. "adcs r5, r7\n\t"
  98434. #else
  98435. "adc r5, r7\n\t"
  98436. #endif
  98437. "str r4, [%[r]]\n\t"
  98438. "str r5, [%[r], #4]\n\t"
  98439. "ldr r4, [%[a], #8]\n\t"
  98440. "ldr r5, [%[a], #12]\n\t"
  98441. "ldr r6, [%[b], #8]\n\t"
  98442. "ldr r7, [%[b], #12]\n\t"
  98443. #ifdef WOLFSSL_KEIL
  98444. "adcs r4, r4, r6\n\t"
  98445. #elif defined(__clang__)
  98446. "adcs r4, r6\n\t"
  98447. #else
  98448. "adc r4, r6\n\t"
  98449. #endif
  98450. #ifdef WOLFSSL_KEIL
  98451. "adcs r5, r5, r7\n\t"
  98452. #elif defined(__clang__)
  98453. "adcs r5, r7\n\t"
  98454. #else
  98455. "adc r5, r7\n\t"
  98456. #endif
  98457. "str r4, [%[r], #8]\n\t"
  98458. "str r5, [%[r], #12]\n\t"
  98459. "ldr r4, [%[a], #16]\n\t"
  98460. "ldr r5, [%[a], #20]\n\t"
  98461. "ldr r6, [%[b], #16]\n\t"
  98462. "ldr r7, [%[b], #20]\n\t"
  98463. #ifdef WOLFSSL_KEIL
  98464. "adcs r4, r4, r6\n\t"
  98465. #elif defined(__clang__)
  98466. "adcs r4, r6\n\t"
  98467. #else
  98468. "adc r4, r6\n\t"
  98469. #endif
  98470. #ifdef WOLFSSL_KEIL
  98471. "adcs r5, r5, r7\n\t"
  98472. #elif defined(__clang__)
  98473. "adcs r5, r7\n\t"
  98474. #else
  98475. "adc r5, r7\n\t"
  98476. #endif
  98477. "mov r8, r4\n\t"
  98478. "mov r9, r5\n\t"
  98479. "ldr r4, [%[a], #24]\n\t"
  98480. "ldr r5, [%[a], #28]\n\t"
  98481. "ldr r6, [%[b], #24]\n\t"
  98482. "ldr r7, [%[b], #28]\n\t"
  98483. #ifdef WOLFSSL_KEIL
  98484. "adcs r4, r4, r6\n\t"
  98485. #elif defined(__clang__)
  98486. "adcs r4, r6\n\t"
  98487. #else
  98488. "adc r4, r6\n\t"
  98489. #endif
  98490. #ifdef WOLFSSL_KEIL
  98491. "adcs r5, r5, r7\n\t"
  98492. #elif defined(__clang__)
  98493. "adcs r5, r7\n\t"
  98494. #else
  98495. "adc r5, r7\n\t"
  98496. #endif
  98497. "mov r10, r4\n\t"
  98498. "mov r11, r5\n\t"
  98499. #ifdef WOLFSSL_KEIL
  98500. "adcs r3, r3, r3\n\t"
  98501. #elif defined(__clang__)
  98502. "adcs r3, r3\n\t"
  98503. #else
  98504. "adc r3, r3\n\t"
  98505. #endif
  98506. "movs r6, r3\n\t"
  98507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98508. "subs r3, r3, #1\n\t"
  98509. #else
  98510. "sub r3, r3, #1\n\t"
  98511. #endif
  98512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98513. "mvns r3, r3\n\t"
  98514. #else
  98515. "mvn r3, r3\n\t"
  98516. #endif
  98517. "movs r7, #0\n\t"
  98518. "ldr r4, [%[r]]\n\t"
  98519. "ldr r5, [%[r], #4]\n\t"
  98520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98521. "subs r4, r4, r3\n\t"
  98522. #else
  98523. "sub r4, r4, r3\n\t"
  98524. #endif
  98525. #ifdef WOLFSSL_KEIL
  98526. "sbcs r5, r5, r3\n\t"
  98527. #elif defined(__clang__)
  98528. "sbcs r5, r3\n\t"
  98529. #else
  98530. "sbc r5, r3\n\t"
  98531. #endif
  98532. "str r4, [%[r]]\n\t"
  98533. "str r5, [%[r], #4]\n\t"
  98534. "ldr r4, [%[r], #8]\n\t"
  98535. "ldr r5, [%[r], #12]\n\t"
  98536. #ifdef WOLFSSL_KEIL
  98537. "sbcs r4, r4, r3\n\t"
  98538. #elif defined(__clang__)
  98539. "sbcs r4, r3\n\t"
  98540. #else
  98541. "sbc r4, r3\n\t"
  98542. #endif
  98543. #ifdef WOLFSSL_KEIL
  98544. "sbcs r5, r5, r7\n\t"
  98545. #elif defined(__clang__)
  98546. "sbcs r5, r7\n\t"
  98547. #else
  98548. "sbc r5, r7\n\t"
  98549. #endif
  98550. "str r4, [%[r], #8]\n\t"
  98551. "str r5, [%[r], #12]\n\t"
  98552. "mov r4, r8\n\t"
  98553. "mov r5, r9\n\t"
  98554. #ifdef WOLFSSL_KEIL
  98555. "sbcs r4, r4, r7\n\t"
  98556. #elif defined(__clang__)
  98557. "sbcs r4, r7\n\t"
  98558. #else
  98559. "sbc r4, r7\n\t"
  98560. #endif
  98561. #ifdef WOLFSSL_KEIL
  98562. "sbcs r5, r5, r7\n\t"
  98563. #elif defined(__clang__)
  98564. "sbcs r5, r7\n\t"
  98565. #else
  98566. "sbc r5, r7\n\t"
  98567. #endif
  98568. "str r4, [%[r], #16]\n\t"
  98569. "str r5, [%[r], #20]\n\t"
  98570. "mov r4, r10\n\t"
  98571. "mov r5, r11\n\t"
  98572. #ifdef WOLFSSL_KEIL
  98573. "sbcs r4, r4, r6\n\t"
  98574. #elif defined(__clang__)
  98575. "sbcs r4, r6\n\t"
  98576. #else
  98577. "sbc r4, r6\n\t"
  98578. #endif
  98579. #ifdef WOLFSSL_KEIL
  98580. "sbcs r5, r5, r3\n\t"
  98581. #elif defined(__clang__)
  98582. "sbcs r5, r3\n\t"
  98583. #else
  98584. "sbc r5, r3\n\t"
  98585. #endif
  98586. "str r4, [%[r], #24]\n\t"
  98587. "str r5, [%[r], #28]\n\t"
  98588. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  98589. :
  98590. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  98591. );
  98592. }
  98593. /* Double a Montgomery form number (r = a + a % m).
  98594. *
  98595. * r Result of doubling.
  98596. * a Number to double in Montgomery form.
  98597. * m Modulus (prime).
  98598. */
  98599. SP_NOINLINE static void sp_256_mont_dbl_8(sp_digit* r, const sp_digit* a,
  98600. const sp_digit* m)
  98601. {
  98602. (void)m;
  98603. __asm__ __volatile__ (
  98604. "ldr r4, [%[a]]\n\t"
  98605. "ldr r5, [%[a], #4]\n\t"
  98606. "ldr r6, [%[a], #8]\n\t"
  98607. "ldr r7, [%[a], #12]\n\t"
  98608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98609. "adds r4, r4, r4\n\t"
  98610. #else
  98611. "add r4, r4, r4\n\t"
  98612. #endif
  98613. #ifdef WOLFSSL_KEIL
  98614. "adcs r5, r5, r5\n\t"
  98615. #elif defined(__clang__)
  98616. "adcs r5, r5\n\t"
  98617. #else
  98618. "adc r5, r5\n\t"
  98619. #endif
  98620. #ifdef WOLFSSL_KEIL
  98621. "adcs r6, r6, r6\n\t"
  98622. #elif defined(__clang__)
  98623. "adcs r6, r6\n\t"
  98624. #else
  98625. "adc r6, r6\n\t"
  98626. #endif
  98627. #ifdef WOLFSSL_KEIL
  98628. "adcs r7, r7, r7\n\t"
  98629. #elif defined(__clang__)
  98630. "adcs r7, r7\n\t"
  98631. #else
  98632. "adc r7, r7\n\t"
  98633. #endif
  98634. "str r4, [%[r]]\n\t"
  98635. "str r5, [%[r], #4]\n\t"
  98636. "str r6, [%[r], #8]\n\t"
  98637. "str r7, [%[r], #12]\n\t"
  98638. "ldr r4, [%[a], #16]\n\t"
  98639. "ldr r5, [%[a], #20]\n\t"
  98640. "ldr r6, [%[a], #24]\n\t"
  98641. "ldr r7, [%[a], #28]\n\t"
  98642. #ifdef WOLFSSL_KEIL
  98643. "adcs r4, r4, r4\n\t"
  98644. #elif defined(__clang__)
  98645. "adcs r4, r4\n\t"
  98646. #else
  98647. "adc r4, r4\n\t"
  98648. #endif
  98649. #ifdef WOLFSSL_KEIL
  98650. "adcs r5, r5, r5\n\t"
  98651. #elif defined(__clang__)
  98652. "adcs r5, r5\n\t"
  98653. #else
  98654. "adc r5, r5\n\t"
  98655. #endif
  98656. #ifdef WOLFSSL_KEIL
  98657. "adcs r6, r6, r6\n\t"
  98658. #elif defined(__clang__)
  98659. "adcs r6, r6\n\t"
  98660. #else
  98661. "adc r6, r6\n\t"
  98662. #endif
  98663. #ifdef WOLFSSL_KEIL
  98664. "adcs r7, r7, r7\n\t"
  98665. #elif defined(__clang__)
  98666. "adcs r7, r7\n\t"
  98667. #else
  98668. "adc r7, r7\n\t"
  98669. #endif
  98670. "mov r8, r4\n\t"
  98671. "mov r9, r5\n\t"
  98672. "mov r10, r6\n\t"
  98673. "mov r11, r7\n\t"
  98674. "movs r3, #0\n\t"
  98675. "movs r7, #0\n\t"
  98676. #ifdef WOLFSSL_KEIL
  98677. "adcs r3, r3, r3\n\t"
  98678. #elif defined(__clang__)
  98679. "adcs r3, r3\n\t"
  98680. #else
  98681. "adc r3, r3\n\t"
  98682. #endif
  98683. "movs r2, r3\n\t"
  98684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98685. "subs r3, r3, #1\n\t"
  98686. #else
  98687. "sub r3, r3, #1\n\t"
  98688. #endif
  98689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98690. "mvns r3, r3\n\t"
  98691. #else
  98692. "mvn r3, r3\n\t"
  98693. #endif
  98694. "ldr r4, [%[r]]\n\t"
  98695. "ldr r5, [%[r], #4]\n\t"
  98696. "ldr r6, [%[r], #8]\n\t"
  98697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98698. "subs r4, r4, r3\n\t"
  98699. #else
  98700. "sub r4, r4, r3\n\t"
  98701. #endif
  98702. #ifdef WOLFSSL_KEIL
  98703. "sbcs r5, r5, r3\n\t"
  98704. #elif defined(__clang__)
  98705. "sbcs r5, r3\n\t"
  98706. #else
  98707. "sbc r5, r3\n\t"
  98708. #endif
  98709. #ifdef WOLFSSL_KEIL
  98710. "sbcs r6, r6, r3\n\t"
  98711. #elif defined(__clang__)
  98712. "sbcs r6, r3\n\t"
  98713. #else
  98714. "sbc r6, r3\n\t"
  98715. #endif
  98716. "str r4, [%[r]]\n\t"
  98717. "str r5, [%[r], #4]\n\t"
  98718. "str r6, [%[r], #8]\n\t"
  98719. "ldr r4, [%[r], #12]\n\t"
  98720. "mov r5, r8\n\t"
  98721. "mov r6, r9\n\t"
  98722. #ifdef WOLFSSL_KEIL
  98723. "sbcs r4, r4, r7\n\t"
  98724. #elif defined(__clang__)
  98725. "sbcs r4, r7\n\t"
  98726. #else
  98727. "sbc r4, r7\n\t"
  98728. #endif
  98729. #ifdef WOLFSSL_KEIL
  98730. "sbcs r5, r5, r7\n\t"
  98731. #elif defined(__clang__)
  98732. "sbcs r5, r7\n\t"
  98733. #else
  98734. "sbc r5, r7\n\t"
  98735. #endif
  98736. #ifdef WOLFSSL_KEIL
  98737. "sbcs r6, r6, r7\n\t"
  98738. #elif defined(__clang__)
  98739. "sbcs r6, r7\n\t"
  98740. #else
  98741. "sbc r6, r7\n\t"
  98742. #endif
  98743. "str r4, [%[r], #12]\n\t"
  98744. "str r5, [%[r], #16]\n\t"
  98745. "str r6, [%[r], #20]\n\t"
  98746. "mov r4, r10\n\t"
  98747. "mov r5, r11\n\t"
  98748. #ifdef WOLFSSL_KEIL
  98749. "sbcs r4, r4, r2\n\t"
  98750. #elif defined(__clang__)
  98751. "sbcs r4, r2\n\t"
  98752. #else
  98753. "sbc r4, r2\n\t"
  98754. #endif
  98755. #ifdef WOLFSSL_KEIL
  98756. "sbcs r5, r5, r3\n\t"
  98757. #elif defined(__clang__)
  98758. "sbcs r5, r3\n\t"
  98759. #else
  98760. "sbc r5, r3\n\t"
  98761. #endif
  98762. "str r4, [%[r], #24]\n\t"
  98763. "str r5, [%[r], #28]\n\t"
  98764. : [r] "+l" (r), [a] "+l" (a)
  98765. :
  98766. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  98767. );
  98768. }
  98769. /* Triple a Montgomery form number (r = a + a + a % m).
  98770. *
  98771. * r Result of Tripling.
  98772. * a Number to triple in Montgomery form.
  98773. * m Modulus (prime).
  98774. */
  98775. SP_NOINLINE static void sp_256_mont_tpl_8(sp_digit* r, const sp_digit* a,
  98776. const sp_digit* m)
  98777. {
  98778. (void)m;
  98779. __asm__ __volatile__ (
  98780. "ldr r6, [%[a]]\n\t"
  98781. "ldr r7, [%[a], #4]\n\t"
  98782. "ldr r4, [%[a], #8]\n\t"
  98783. "ldr r5, [%[a], #12]\n\t"
  98784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98785. "adds r6, r6, r6\n\t"
  98786. #else
  98787. "add r6, r6, r6\n\t"
  98788. #endif
  98789. #ifdef WOLFSSL_KEIL
  98790. "adcs r7, r7, r7\n\t"
  98791. #elif defined(__clang__)
  98792. "adcs r7, r7\n\t"
  98793. #else
  98794. "adc r7, r7\n\t"
  98795. #endif
  98796. #ifdef WOLFSSL_KEIL
  98797. "adcs r4, r4, r4\n\t"
  98798. #elif defined(__clang__)
  98799. "adcs r4, r4\n\t"
  98800. #else
  98801. "adc r4, r4\n\t"
  98802. #endif
  98803. #ifdef WOLFSSL_KEIL
  98804. "adcs r5, r5, r5\n\t"
  98805. #elif defined(__clang__)
  98806. "adcs r5, r5\n\t"
  98807. #else
  98808. "adc r5, r5\n\t"
  98809. #endif
  98810. "mov r8, r4\n\t"
  98811. "mov r9, r5\n\t"
  98812. "ldr r2, [%[a], #16]\n\t"
  98813. "ldr r3, [%[a], #20]\n\t"
  98814. "ldr r4, [%[a], #24]\n\t"
  98815. "ldr r5, [%[a], #28]\n\t"
  98816. #ifdef WOLFSSL_KEIL
  98817. "adcs r2, r2, r2\n\t"
  98818. #elif defined(__clang__)
  98819. "adcs r2, r2\n\t"
  98820. #else
  98821. "adc r2, r2\n\t"
  98822. #endif
  98823. #ifdef WOLFSSL_KEIL
  98824. "adcs r3, r3, r3\n\t"
  98825. #elif defined(__clang__)
  98826. "adcs r3, r3\n\t"
  98827. #else
  98828. "adc r3, r3\n\t"
  98829. #endif
  98830. #ifdef WOLFSSL_KEIL
  98831. "adcs r4, r4, r4\n\t"
  98832. #elif defined(__clang__)
  98833. "adcs r4, r4\n\t"
  98834. #else
  98835. "adc r4, r4\n\t"
  98836. #endif
  98837. #ifdef WOLFSSL_KEIL
  98838. "adcs r5, r5, r5\n\t"
  98839. #elif defined(__clang__)
  98840. "adcs r5, r5\n\t"
  98841. #else
  98842. "adc r5, r5\n\t"
  98843. #endif
  98844. "mov r10, r2\n\t"
  98845. "mov r11, r3\n\t"
  98846. "mov r12, r4\n\t"
  98847. "mov lr, r5\n\t"
  98848. "movs r3, #0\n\t"
  98849. "movs r5, #0\n\t"
  98850. #ifdef WOLFSSL_KEIL
  98851. "adcs r3, r3, r3\n\t"
  98852. #elif defined(__clang__)
  98853. "adcs r3, r3\n\t"
  98854. #else
  98855. "adc r3, r3\n\t"
  98856. #endif
  98857. "movs r4, r3\n\t"
  98858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98859. "subs r3, r3, #1\n\t"
  98860. #else
  98861. "sub r3, r3, #1\n\t"
  98862. #endif
  98863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98864. "mvns r3, r3\n\t"
  98865. #else
  98866. "mvn r3, r3\n\t"
  98867. #endif
  98868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98869. "subs r6, r6, r3\n\t"
  98870. #else
  98871. "sub r6, r6, r3\n\t"
  98872. #endif
  98873. #ifdef WOLFSSL_KEIL
  98874. "sbcs r7, r7, r3\n\t"
  98875. #elif defined(__clang__)
  98876. "sbcs r7, r3\n\t"
  98877. #else
  98878. "sbc r7, r3\n\t"
  98879. #endif
  98880. "mov r2, r8\n\t"
  98881. #ifdef WOLFSSL_KEIL
  98882. "sbcs r2, r2, r3\n\t"
  98883. #elif defined(__clang__)
  98884. "sbcs r2, r3\n\t"
  98885. #else
  98886. "sbc r2, r3\n\t"
  98887. #endif
  98888. "mov r8, r2\n\t"
  98889. "mov r2, r9\n\t"
  98890. #ifdef WOLFSSL_KEIL
  98891. "sbcs r2, r2, r5\n\t"
  98892. #elif defined(__clang__)
  98893. "sbcs r2, r5\n\t"
  98894. #else
  98895. "sbc r2, r5\n\t"
  98896. #endif
  98897. "mov r9, r2\n\t"
  98898. "mov r2, r10\n\t"
  98899. #ifdef WOLFSSL_KEIL
  98900. "sbcs r2, r2, r5\n\t"
  98901. #elif defined(__clang__)
  98902. "sbcs r2, r5\n\t"
  98903. #else
  98904. "sbc r2, r5\n\t"
  98905. #endif
  98906. "mov r10, r2\n\t"
  98907. "mov r2, r11\n\t"
  98908. #ifdef WOLFSSL_KEIL
  98909. "sbcs r2, r2, r5\n\t"
  98910. #elif defined(__clang__)
  98911. "sbcs r2, r5\n\t"
  98912. #else
  98913. "sbc r2, r5\n\t"
  98914. #endif
  98915. "mov r11, r2\n\t"
  98916. "mov r2, r12\n\t"
  98917. #ifdef WOLFSSL_KEIL
  98918. "sbcs r2, r2, r4\n\t"
  98919. #elif defined(__clang__)
  98920. "sbcs r2, r4\n\t"
  98921. #else
  98922. "sbc r2, r4\n\t"
  98923. #endif
  98924. "mov r12, r2\n\t"
  98925. "mov r2, lr\n\t"
  98926. #ifdef WOLFSSL_KEIL
  98927. "sbcs r2, r2, r3\n\t"
  98928. #elif defined(__clang__)
  98929. "sbcs r2, r3\n\t"
  98930. #else
  98931. "sbc r2, r3\n\t"
  98932. #endif
  98933. "mov lr, r2\n\t"
  98934. "ldr r2, [%[a]]\n\t"
  98935. "ldr r3, [%[a], #4]\n\t"
  98936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98937. "adds r6, r6, r2\n\t"
  98938. #else
  98939. "add r6, r6, r2\n\t"
  98940. #endif
  98941. #ifdef WOLFSSL_KEIL
  98942. "adcs r7, r7, r3\n\t"
  98943. #elif defined(__clang__)
  98944. "adcs r7, r3\n\t"
  98945. #else
  98946. "adc r7, r3\n\t"
  98947. #endif
  98948. "ldr r2, [%[a], #8]\n\t"
  98949. "ldr r3, [%[a], #12]\n\t"
  98950. "mov r4, r8\n\t"
  98951. "mov r5, r9\n\t"
  98952. #ifdef WOLFSSL_KEIL
  98953. "adcs r2, r2, r4\n\t"
  98954. #elif defined(__clang__)
  98955. "adcs r2, r4\n\t"
  98956. #else
  98957. "adc r2, r4\n\t"
  98958. #endif
  98959. #ifdef WOLFSSL_KEIL
  98960. "adcs r3, r3, r5\n\t"
  98961. #elif defined(__clang__)
  98962. "adcs r3, r5\n\t"
  98963. #else
  98964. "adc r3, r5\n\t"
  98965. #endif
  98966. "mov r8, r2\n\t"
  98967. "mov r9, r3\n\t"
  98968. "ldr r2, [%[a], #16]\n\t"
  98969. "ldr r3, [%[a], #20]\n\t"
  98970. "mov r4, r10\n\t"
  98971. "mov r5, r11\n\t"
  98972. #ifdef WOLFSSL_KEIL
  98973. "adcs r2, r2, r4\n\t"
  98974. #elif defined(__clang__)
  98975. "adcs r2, r4\n\t"
  98976. #else
  98977. "adc r2, r4\n\t"
  98978. #endif
  98979. #ifdef WOLFSSL_KEIL
  98980. "adcs r3, r3, r5\n\t"
  98981. #elif defined(__clang__)
  98982. "adcs r3, r5\n\t"
  98983. #else
  98984. "adc r3, r5\n\t"
  98985. #endif
  98986. "mov r10, r2\n\t"
  98987. "mov r11, r3\n\t"
  98988. "ldr r2, [%[a], #24]\n\t"
  98989. "ldr r3, [%[a], #28]\n\t"
  98990. "mov r4, r12\n\t"
  98991. "mov r5, lr\n\t"
  98992. #ifdef WOLFSSL_KEIL
  98993. "adcs r2, r2, r4\n\t"
  98994. #elif defined(__clang__)
  98995. "adcs r2, r4\n\t"
  98996. #else
  98997. "adc r2, r4\n\t"
  98998. #endif
  98999. #ifdef WOLFSSL_KEIL
  99000. "adcs r3, r3, r5\n\t"
  99001. #elif defined(__clang__)
  99002. "adcs r3, r5\n\t"
  99003. #else
  99004. "adc r3, r5\n\t"
  99005. #endif
  99006. "mov r12, r2\n\t"
  99007. "mov lr, r3\n\t"
  99008. "movs r3, #0\n\t"
  99009. "movs r5, #0\n\t"
  99010. #ifdef WOLFSSL_KEIL
  99011. "adcs r3, r3, r3\n\t"
  99012. #elif defined(__clang__)
  99013. "adcs r3, r3\n\t"
  99014. #else
  99015. "adc r3, r3\n\t"
  99016. #endif
  99017. "movs r4, r3\n\t"
  99018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99019. "subs r3, r3, #1\n\t"
  99020. #else
  99021. "sub r3, r3, #1\n\t"
  99022. #endif
  99023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99024. "mvns r3, r3\n\t"
  99025. #else
  99026. "mvn r3, r3\n\t"
  99027. #endif
  99028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99029. "subs r6, r6, r3\n\t"
  99030. #else
  99031. "sub r6, r6, r3\n\t"
  99032. #endif
  99033. "str r6, [%[r]]\n\t"
  99034. #ifdef WOLFSSL_KEIL
  99035. "sbcs r7, r7, r3\n\t"
  99036. #elif defined(__clang__)
  99037. "sbcs r7, r3\n\t"
  99038. #else
  99039. "sbc r7, r3\n\t"
  99040. #endif
  99041. "str r7, [%[r], #4]\n\t"
  99042. "mov r2, r8\n\t"
  99043. #ifdef WOLFSSL_KEIL
  99044. "sbcs r2, r2, r3\n\t"
  99045. #elif defined(__clang__)
  99046. "sbcs r2, r3\n\t"
  99047. #else
  99048. "sbc r2, r3\n\t"
  99049. #endif
  99050. "str r2, [%[r], #8]\n\t"
  99051. "mov r2, r9\n\t"
  99052. #ifdef WOLFSSL_KEIL
  99053. "sbcs r2, r2, r5\n\t"
  99054. #elif defined(__clang__)
  99055. "sbcs r2, r5\n\t"
  99056. #else
  99057. "sbc r2, r5\n\t"
  99058. #endif
  99059. "str r2, [%[r], #12]\n\t"
  99060. "mov r2, r10\n\t"
  99061. #ifdef WOLFSSL_KEIL
  99062. "sbcs r2, r2, r5\n\t"
  99063. #elif defined(__clang__)
  99064. "sbcs r2, r5\n\t"
  99065. #else
  99066. "sbc r2, r5\n\t"
  99067. #endif
  99068. "str r2, [%[r], #16]\n\t"
  99069. "mov r2, r11\n\t"
  99070. #ifdef WOLFSSL_KEIL
  99071. "sbcs r2, r2, r5\n\t"
  99072. #elif defined(__clang__)
  99073. "sbcs r2, r5\n\t"
  99074. #else
  99075. "sbc r2, r5\n\t"
  99076. #endif
  99077. "str r2, [%[r], #20]\n\t"
  99078. "mov r2, r12\n\t"
  99079. #ifdef WOLFSSL_KEIL
  99080. "sbcs r2, r2, r4\n\t"
  99081. #elif defined(__clang__)
  99082. "sbcs r2, r4\n\t"
  99083. #else
  99084. "sbc r2, r4\n\t"
  99085. #endif
  99086. "str r2, [%[r], #24]\n\t"
  99087. "mov r2, lr\n\t"
  99088. #ifdef WOLFSSL_KEIL
  99089. "sbcs r2, r2, r3\n\t"
  99090. #elif defined(__clang__)
  99091. "sbcs r2, r3\n\t"
  99092. #else
  99093. "sbc r2, r3\n\t"
  99094. #endif
  99095. "str r2, [%[r], #28]\n\t"
  99096. : [r] "+l" (r), [a] "+l" (a)
  99097. :
  99098. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  99099. );
  99100. }
  99101. /* Subtract two Montgomery form numbers (r = a - b % m).
  99102. *
  99103. * r Result of subtration.
  99104. * a Number to subtract from in Montgomery form.
  99105. * b Number to subtract with in Montgomery form.
  99106. * m Modulus (prime).
  99107. */
  99108. SP_NOINLINE static void sp_256_mont_sub_8(sp_digit* r, const sp_digit* a,
  99109. const sp_digit* b, const sp_digit* m)
  99110. {
  99111. (void)m;
  99112. __asm__ __volatile__ (
  99113. "ldr r4, [%[a]]\n\t"
  99114. "ldr r5, [%[a], #4]\n\t"
  99115. "ldr r6, [%[b]]\n\t"
  99116. "ldr r7, [%[b], #4]\n\t"
  99117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99118. "subs r4, r4, r6\n\t"
  99119. #else
  99120. "sub r4, r4, r6\n\t"
  99121. #endif
  99122. #ifdef WOLFSSL_KEIL
  99123. "sbcs r5, r5, r7\n\t"
  99124. #elif defined(__clang__)
  99125. "sbcs r5, r7\n\t"
  99126. #else
  99127. "sbc r5, r7\n\t"
  99128. #endif
  99129. "str r4, [%[r]]\n\t"
  99130. "str r5, [%[r], #4]\n\t"
  99131. "ldr r4, [%[a], #8]\n\t"
  99132. "ldr r5, [%[a], #12]\n\t"
  99133. "ldr r6, [%[b], #8]\n\t"
  99134. "ldr r7, [%[b], #12]\n\t"
  99135. #ifdef WOLFSSL_KEIL
  99136. "sbcs r4, r4, r6\n\t"
  99137. #elif defined(__clang__)
  99138. "sbcs r4, r6\n\t"
  99139. #else
  99140. "sbc r4, r6\n\t"
  99141. #endif
  99142. #ifdef WOLFSSL_KEIL
  99143. "sbcs r5, r5, r7\n\t"
  99144. #elif defined(__clang__)
  99145. "sbcs r5, r7\n\t"
  99146. #else
  99147. "sbc r5, r7\n\t"
  99148. #endif
  99149. "str r4, [%[r], #8]\n\t"
  99150. "str r5, [%[r], #12]\n\t"
  99151. "ldr r4, [%[a], #16]\n\t"
  99152. "ldr r5, [%[a], #20]\n\t"
  99153. "ldr r6, [%[b], #16]\n\t"
  99154. "ldr r7, [%[b], #20]\n\t"
  99155. #ifdef WOLFSSL_KEIL
  99156. "sbcs r4, r4, r6\n\t"
  99157. #elif defined(__clang__)
  99158. "sbcs r4, r6\n\t"
  99159. #else
  99160. "sbc r4, r6\n\t"
  99161. #endif
  99162. #ifdef WOLFSSL_KEIL
  99163. "sbcs r5, r5, r7\n\t"
  99164. #elif defined(__clang__)
  99165. "sbcs r5, r7\n\t"
  99166. #else
  99167. "sbc r5, r7\n\t"
  99168. #endif
  99169. "mov r8, r4\n\t"
  99170. "mov r9, r5\n\t"
  99171. "ldr r4, [%[a], #24]\n\t"
  99172. "ldr r5, [%[a], #28]\n\t"
  99173. "ldr r6, [%[b], #24]\n\t"
  99174. "ldr r7, [%[b], #28]\n\t"
  99175. #ifdef WOLFSSL_KEIL
  99176. "sbcs r4, r4, r6\n\t"
  99177. #elif defined(__clang__)
  99178. "sbcs r4, r6\n\t"
  99179. #else
  99180. "sbc r4, r6\n\t"
  99181. #endif
  99182. #ifdef WOLFSSL_KEIL
  99183. "sbcs r5, r5, r7\n\t"
  99184. #elif defined(__clang__)
  99185. "sbcs r5, r7\n\t"
  99186. #else
  99187. "sbc r5, r7\n\t"
  99188. #endif
  99189. "mov r10, r4\n\t"
  99190. "mov r11, r5\n\t"
  99191. #ifdef WOLFSSL_KEIL
  99192. "sbcs r3, r3, r3\n\t"
  99193. #elif defined(__clang__)
  99194. "sbcs r3, r3\n\t"
  99195. #else
  99196. "sbc r3, r3\n\t"
  99197. #endif
  99198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99199. "lsrs r7, r3, #31\n\t"
  99200. #else
  99201. "lsr r7, r3, #31\n\t"
  99202. #endif
  99203. "movs r6, #0\n\t"
  99204. "ldr r4, [%[r]]\n\t"
  99205. "ldr r5, [%[r], #4]\n\t"
  99206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99207. "adds r4, r4, r3\n\t"
  99208. #else
  99209. "add r4, r4, r3\n\t"
  99210. #endif
  99211. #ifdef WOLFSSL_KEIL
  99212. "adcs r5, r5, r3\n\t"
  99213. #elif defined(__clang__)
  99214. "adcs r5, r3\n\t"
  99215. #else
  99216. "adc r5, r3\n\t"
  99217. #endif
  99218. "str r4, [%[r]]\n\t"
  99219. "str r5, [%[r], #4]\n\t"
  99220. "ldr r4, [%[r], #8]\n\t"
  99221. "ldr r5, [%[r], #12]\n\t"
  99222. #ifdef WOLFSSL_KEIL
  99223. "adcs r4, r4, r3\n\t"
  99224. #elif defined(__clang__)
  99225. "adcs r4, r3\n\t"
  99226. #else
  99227. "adc r4, r3\n\t"
  99228. #endif
  99229. #ifdef WOLFSSL_KEIL
  99230. "adcs r5, r5, r6\n\t"
  99231. #elif defined(__clang__)
  99232. "adcs r5, r6\n\t"
  99233. #else
  99234. "adc r5, r6\n\t"
  99235. #endif
  99236. "str r4, [%[r], #8]\n\t"
  99237. "str r5, [%[r], #12]\n\t"
  99238. "mov r4, r8\n\t"
  99239. "mov r5, r9\n\t"
  99240. #ifdef WOLFSSL_KEIL
  99241. "adcs r4, r4, r6\n\t"
  99242. #elif defined(__clang__)
  99243. "adcs r4, r6\n\t"
  99244. #else
  99245. "adc r4, r6\n\t"
  99246. #endif
  99247. #ifdef WOLFSSL_KEIL
  99248. "adcs r5, r5, r6\n\t"
  99249. #elif defined(__clang__)
  99250. "adcs r5, r6\n\t"
  99251. #else
  99252. "adc r5, r6\n\t"
  99253. #endif
  99254. "str r4, [%[r], #16]\n\t"
  99255. "str r5, [%[r], #20]\n\t"
  99256. "mov r4, r10\n\t"
  99257. "mov r5, r11\n\t"
  99258. #ifdef WOLFSSL_KEIL
  99259. "adcs r4, r4, r7\n\t"
  99260. #elif defined(__clang__)
  99261. "adcs r4, r7\n\t"
  99262. #else
  99263. "adc r4, r7\n\t"
  99264. #endif
  99265. #ifdef WOLFSSL_KEIL
  99266. "adcs r5, r5, r3\n\t"
  99267. #elif defined(__clang__)
  99268. "adcs r5, r3\n\t"
  99269. #else
  99270. "adc r5, r3\n\t"
  99271. #endif
  99272. "str r4, [%[r], #24]\n\t"
  99273. "str r5, [%[r], #28]\n\t"
  99274. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  99275. :
  99276. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  99277. );
  99278. }
  99279. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  99280. *
  99281. * r Result of division by 2.
  99282. * a Number to divide.
  99283. * m Modulus (prime).
  99284. */
  99285. SP_NOINLINE static void sp_256_mont_div2_8(sp_digit* r, const sp_digit* a,
  99286. const sp_digit* m)
  99287. {
  99288. (void)m;
  99289. __asm__ __volatile__ (
  99290. "ldr r6, [%[a]]\n\t"
  99291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99292. "lsls r6, r6, #31\n\t"
  99293. #else
  99294. "lsl r6, r6, #31\n\t"
  99295. #endif
  99296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99297. "lsrs r6, r6, #31\n\t"
  99298. #else
  99299. "lsr r6, r6, #31\n\t"
  99300. #endif
  99301. "movs r4, #0\n\t"
  99302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99303. "subs r4, r4, r6\n\t"
  99304. #else
  99305. "sub r4, r4, r6\n\t"
  99306. #endif
  99307. "movs r6, #0\n\t"
  99308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99309. "lsls r5, r4, #31\n\t"
  99310. #else
  99311. "lsl r5, r4, #31\n\t"
  99312. #endif
  99313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99314. "lsrs r5, r5, #31\n\t"
  99315. #else
  99316. "lsr r5, r5, #31\n\t"
  99317. #endif
  99318. "ldr r2, [%[a]]\n\t"
  99319. "ldr r3, [%[a], #4]\n\t"
  99320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99321. "adds r2, r2, r4\n\t"
  99322. #else
  99323. "add r2, r2, r4\n\t"
  99324. #endif
  99325. #ifdef WOLFSSL_KEIL
  99326. "adcs r3, r3, r4\n\t"
  99327. #elif defined(__clang__)
  99328. "adcs r3, r4\n\t"
  99329. #else
  99330. "adc r3, r4\n\t"
  99331. #endif
  99332. "str r2, [%[r]]\n\t"
  99333. "str r3, [%[r], #4]\n\t"
  99334. "ldr r2, [%[a], #8]\n\t"
  99335. "ldr r3, [%[a], #12]\n\t"
  99336. #ifdef WOLFSSL_KEIL
  99337. "adcs r2, r2, r4\n\t"
  99338. #elif defined(__clang__)
  99339. "adcs r2, r4\n\t"
  99340. #else
  99341. "adc r2, r4\n\t"
  99342. #endif
  99343. #ifdef WOLFSSL_KEIL
  99344. "adcs r3, r3, r6\n\t"
  99345. #elif defined(__clang__)
  99346. "adcs r3, r6\n\t"
  99347. #else
  99348. "adc r3, r6\n\t"
  99349. #endif
  99350. "str r2, [%[r], #8]\n\t"
  99351. "str r3, [%[r], #12]\n\t"
  99352. "ldr r2, [%[a], #16]\n\t"
  99353. "ldr r3, [%[a], #20]\n\t"
  99354. #ifdef WOLFSSL_KEIL
  99355. "adcs r2, r2, r6\n\t"
  99356. #elif defined(__clang__)
  99357. "adcs r2, r6\n\t"
  99358. #else
  99359. "adc r2, r6\n\t"
  99360. #endif
  99361. #ifdef WOLFSSL_KEIL
  99362. "adcs r3, r3, r6\n\t"
  99363. #elif defined(__clang__)
  99364. "adcs r3, r6\n\t"
  99365. #else
  99366. "adc r3, r6\n\t"
  99367. #endif
  99368. "str r2, [%[r], #16]\n\t"
  99369. "str r3, [%[r], #20]\n\t"
  99370. "ldr r2, [%[a], #24]\n\t"
  99371. "ldr r3, [%[a], #28]\n\t"
  99372. #ifdef WOLFSSL_KEIL
  99373. "adcs r2, r2, r5\n\t"
  99374. #elif defined(__clang__)
  99375. "adcs r2, r5\n\t"
  99376. #else
  99377. "adc r2, r5\n\t"
  99378. #endif
  99379. #ifdef WOLFSSL_KEIL
  99380. "adcs r3, r3, r4\n\t"
  99381. #elif defined(__clang__)
  99382. "adcs r3, r4\n\t"
  99383. #else
  99384. "adc r3, r4\n\t"
  99385. #endif
  99386. #ifdef WOLFSSL_KEIL
  99387. "adcs r6, r6, r6\n\t"
  99388. #elif defined(__clang__)
  99389. "adcs r6, r6\n\t"
  99390. #else
  99391. "adc r6, r6\n\t"
  99392. #endif
  99393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99394. "lsls r6, r6, #31\n\t"
  99395. #else
  99396. "lsl r6, r6, #31\n\t"
  99397. #endif
  99398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99399. "lsrs r4, r2, #1\n\t"
  99400. #else
  99401. "lsr r4, r2, #1\n\t"
  99402. #endif
  99403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99404. "lsls r2, r2, #31\n\t"
  99405. #else
  99406. "lsl r2, r2, #31\n\t"
  99407. #endif
  99408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99409. "lsrs r5, r3, #1\n\t"
  99410. #else
  99411. "lsr r5, r3, #1\n\t"
  99412. #endif
  99413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99414. "lsls r3, r3, #31\n\t"
  99415. #else
  99416. "lsl r3, r3, #31\n\t"
  99417. #endif
  99418. #ifdef WOLFSSL_KEIL
  99419. "orrs r4, r4, r3\n\t"
  99420. #elif defined(__clang__)
  99421. "orrs r4, r3\n\t"
  99422. #else
  99423. "orr r4, r3\n\t"
  99424. #endif
  99425. #ifdef WOLFSSL_KEIL
  99426. "orrs r5, r5, r6\n\t"
  99427. #elif defined(__clang__)
  99428. "orrs r5, r6\n\t"
  99429. #else
  99430. "orr r5, r6\n\t"
  99431. #endif
  99432. "movs r6, r2\n\t"
  99433. "str r4, [%[r], #24]\n\t"
  99434. "str r5, [%[r], #28]\n\t"
  99435. "ldr r2, [%[r], #16]\n\t"
  99436. "ldr r3, [%[r], #20]\n\t"
  99437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99438. "lsrs r4, r2, #1\n\t"
  99439. #else
  99440. "lsr r4, r2, #1\n\t"
  99441. #endif
  99442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99443. "lsls r2, r2, #31\n\t"
  99444. #else
  99445. "lsl r2, r2, #31\n\t"
  99446. #endif
  99447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99448. "lsrs r5, r3, #1\n\t"
  99449. #else
  99450. "lsr r5, r3, #1\n\t"
  99451. #endif
  99452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99453. "lsls r3, r3, #31\n\t"
  99454. #else
  99455. "lsl r3, r3, #31\n\t"
  99456. #endif
  99457. #ifdef WOLFSSL_KEIL
  99458. "orrs r4, r4, r3\n\t"
  99459. #elif defined(__clang__)
  99460. "orrs r4, r3\n\t"
  99461. #else
  99462. "orr r4, r3\n\t"
  99463. #endif
  99464. #ifdef WOLFSSL_KEIL
  99465. "orrs r5, r5, r6\n\t"
  99466. #elif defined(__clang__)
  99467. "orrs r5, r6\n\t"
  99468. #else
  99469. "orr r5, r6\n\t"
  99470. #endif
  99471. "movs r6, r2\n\t"
  99472. "str r4, [%[r], #16]\n\t"
  99473. "str r5, [%[r], #20]\n\t"
  99474. "ldr r2, [%[r], #8]\n\t"
  99475. "ldr r3, [%[r], #12]\n\t"
  99476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99477. "lsrs r4, r2, #1\n\t"
  99478. #else
  99479. "lsr r4, r2, #1\n\t"
  99480. #endif
  99481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99482. "lsls r2, r2, #31\n\t"
  99483. #else
  99484. "lsl r2, r2, #31\n\t"
  99485. #endif
  99486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99487. "lsrs r5, r3, #1\n\t"
  99488. #else
  99489. "lsr r5, r3, #1\n\t"
  99490. #endif
  99491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99492. "lsls r3, r3, #31\n\t"
  99493. #else
  99494. "lsl r3, r3, #31\n\t"
  99495. #endif
  99496. #ifdef WOLFSSL_KEIL
  99497. "orrs r4, r4, r3\n\t"
  99498. #elif defined(__clang__)
  99499. "orrs r4, r3\n\t"
  99500. #else
  99501. "orr r4, r3\n\t"
  99502. #endif
  99503. #ifdef WOLFSSL_KEIL
  99504. "orrs r5, r5, r6\n\t"
  99505. #elif defined(__clang__)
  99506. "orrs r5, r6\n\t"
  99507. #else
  99508. "orr r5, r6\n\t"
  99509. #endif
  99510. "movs r6, r2\n\t"
  99511. "str r4, [%[r], #8]\n\t"
  99512. "str r5, [%[r], #12]\n\t"
  99513. "ldr r2, [%[r]]\n\t"
  99514. "ldr r3, [%[r], #4]\n\t"
  99515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99516. "lsrs r4, r2, #1\n\t"
  99517. #else
  99518. "lsr r4, r2, #1\n\t"
  99519. #endif
  99520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99521. "lsrs r5, r3, #1\n\t"
  99522. #else
  99523. "lsr r5, r3, #1\n\t"
  99524. #endif
  99525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99526. "lsls r3, r3, #31\n\t"
  99527. #else
  99528. "lsl r3, r3, #31\n\t"
  99529. #endif
  99530. #ifdef WOLFSSL_KEIL
  99531. "orrs r4, r4, r3\n\t"
  99532. #elif defined(__clang__)
  99533. "orrs r4, r3\n\t"
  99534. #else
  99535. "orr r4, r3\n\t"
  99536. #endif
  99537. #ifdef WOLFSSL_KEIL
  99538. "orrs r5, r5, r6\n\t"
  99539. #elif defined(__clang__)
  99540. "orrs r5, r6\n\t"
  99541. #else
  99542. "orr r5, r6\n\t"
  99543. #endif
  99544. "str r4, [%[r]]\n\t"
  99545. "str r5, [%[r], #4]\n\t"
  99546. : [r] "+l" (r), [a] "+l" (a)
  99547. :
  99548. : "memory", "r2", "r3", "r4", "r5", "r6"
  99549. );
  99550. }
  99551. /* Double the Montgomery form projective point p.
  99552. *
  99553. * r Result of doubling point.
  99554. * p Point to double.
  99555. * t Temporary ordinate data.
  99556. */
  99557. static void sp_256_proj_point_dbl_8(sp_point_256* r, const sp_point_256* p,
  99558. sp_digit* t)
  99559. {
  99560. sp_digit* t1 = t;
  99561. sp_digit* t2 = t + 2*8;
  99562. sp_digit* x;
  99563. sp_digit* y;
  99564. sp_digit* z;
  99565. x = r->x;
  99566. y = r->y;
  99567. z = r->z;
  99568. /* Put infinity into result. */
  99569. if (r != p) {
  99570. r->infinity = p->infinity;
  99571. }
  99572. /* T1 = Z * Z */
  99573. sp_256_mont_sqr_8(t1, p->z, p256_mod, p256_mp_mod);
  99574. /* Z = Y * Z */
  99575. sp_256_mont_mul_8(z, p->y, p->z, p256_mod, p256_mp_mod);
  99576. /* Z = 2Z */
  99577. sp_256_mont_dbl_8(z, z, p256_mod);
  99578. /* T2 = X - T1 */
  99579. sp_256_mont_sub_8(t2, p->x, t1, p256_mod);
  99580. /* T1 = X + T1 */
  99581. sp_256_mont_add_8(t1, p->x, t1, p256_mod);
  99582. /* T2 = T1 * T2 */
  99583. sp_256_mont_mul_8(t2, t1, t2, p256_mod, p256_mp_mod);
  99584. /* T1 = 3T2 */
  99585. sp_256_mont_tpl_8(t1, t2, p256_mod);
  99586. /* Y = 2Y */
  99587. sp_256_mont_dbl_8(y, p->y, p256_mod);
  99588. /* Y = Y * Y */
  99589. sp_256_mont_sqr_8(y, y, p256_mod, p256_mp_mod);
  99590. /* T2 = Y * Y */
  99591. sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod);
  99592. /* T2 = T2/2 */
  99593. sp_256_mont_div2_8(t2, t2, p256_mod);
  99594. /* Y = Y * X */
  99595. sp_256_mont_mul_8(y, y, p->x, p256_mod, p256_mp_mod);
  99596. /* X = T1 * T1 */
  99597. sp_256_mont_sqr_8(x, t1, p256_mod, p256_mp_mod);
  99598. /* X = X - Y */
  99599. sp_256_mont_sub_8(x, x, y, p256_mod);
  99600. /* X = X - Y */
  99601. sp_256_mont_sub_8(x, x, y, p256_mod);
  99602. /* Y = Y - X */
  99603. sp_256_mont_sub_8(y, y, x, p256_mod);
  99604. /* Y = Y * T1 */
  99605. sp_256_mont_mul_8(y, y, t1, p256_mod, p256_mp_mod);
  99606. /* Y = Y - T2 */
  99607. sp_256_mont_sub_8(y, y, t2, p256_mod);
  99608. }
  99609. #ifdef WOLFSSL_SP_NONBLOCK
  99610. typedef struct sp_256_proj_point_dbl_8_ctx {
  99611. int state;
  99612. sp_digit* t1;
  99613. sp_digit* t2;
  99614. sp_digit* x;
  99615. sp_digit* y;
  99616. sp_digit* z;
  99617. } sp_256_proj_point_dbl_8_ctx;
  99618. /* Double the Montgomery form projective point p.
  99619. *
  99620. * r Result of doubling point.
  99621. * p Point to double.
  99622. * t Temporary ordinate data.
  99623. */
  99624. static int sp_256_proj_point_dbl_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r,
  99625. const sp_point_256* p, sp_digit* t)
  99626. {
  99627. int err = FP_WOULDBLOCK;
  99628. sp_256_proj_point_dbl_8_ctx* ctx = (sp_256_proj_point_dbl_8_ctx*)sp_ctx->data;
  99629. typedef char ctx_size_test[sizeof(sp_256_proj_point_dbl_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  99630. (void)sizeof(ctx_size_test);
  99631. switch (ctx->state) {
  99632. case 0:
  99633. ctx->t1 = t;
  99634. ctx->t2 = t + 2*8;
  99635. ctx->x = r->x;
  99636. ctx->y = r->y;
  99637. ctx->z = r->z;
  99638. /* Put infinity into result. */
  99639. if (r != p) {
  99640. r->infinity = p->infinity;
  99641. }
  99642. ctx->state = 1;
  99643. break;
  99644. case 1:
  99645. /* T1 = Z * Z */
  99646. sp_256_mont_sqr_8(ctx->t1, p->z, p256_mod, p256_mp_mod);
  99647. ctx->state = 2;
  99648. break;
  99649. case 2:
  99650. /* Z = Y * Z */
  99651. sp_256_mont_mul_8(ctx->z, p->y, p->z, p256_mod, p256_mp_mod);
  99652. ctx->state = 3;
  99653. break;
  99654. case 3:
  99655. /* Z = 2Z */
  99656. sp_256_mont_dbl_8(ctx->z, ctx->z, p256_mod);
  99657. ctx->state = 4;
  99658. break;
  99659. case 4:
  99660. /* T2 = X - T1 */
  99661. sp_256_mont_sub_8(ctx->t2, p->x, ctx->t1, p256_mod);
  99662. ctx->state = 5;
  99663. break;
  99664. case 5:
  99665. /* T1 = X + T1 */
  99666. sp_256_mont_add_8(ctx->t1, p->x, ctx->t1, p256_mod);
  99667. ctx->state = 6;
  99668. break;
  99669. case 6:
  99670. /* T2 = T1 * T2 */
  99671. sp_256_mont_mul_8(ctx->t2, ctx->t1, ctx->t2, p256_mod, p256_mp_mod);
  99672. ctx->state = 7;
  99673. break;
  99674. case 7:
  99675. /* T1 = 3T2 */
  99676. sp_256_mont_tpl_8(ctx->t1, ctx->t2, p256_mod);
  99677. ctx->state = 8;
  99678. break;
  99679. case 8:
  99680. /* Y = 2Y */
  99681. sp_256_mont_dbl_8(ctx->y, p->y, p256_mod);
  99682. ctx->state = 9;
  99683. break;
  99684. case 9:
  99685. /* Y = Y * Y */
  99686. sp_256_mont_sqr_8(ctx->y, ctx->y, p256_mod, p256_mp_mod);
  99687. ctx->state = 10;
  99688. break;
  99689. case 10:
  99690. /* T2 = Y * Y */
  99691. sp_256_mont_sqr_8(ctx->t2, ctx->y, p256_mod, p256_mp_mod);
  99692. ctx->state = 11;
  99693. break;
  99694. case 11:
  99695. /* T2 = T2/2 */
  99696. sp_256_mont_div2_8(ctx->t2, ctx->t2, p256_mod);
  99697. ctx->state = 12;
  99698. break;
  99699. case 12:
  99700. /* Y = Y * X */
  99701. sp_256_mont_mul_8(ctx->y, ctx->y, p->x, p256_mod, p256_mp_mod);
  99702. ctx->state = 13;
  99703. break;
  99704. case 13:
  99705. /* X = T1 * T1 */
  99706. sp_256_mont_sqr_8(ctx->x, ctx->t1, p256_mod, p256_mp_mod);
  99707. ctx->state = 14;
  99708. break;
  99709. case 14:
  99710. /* X = X - Y */
  99711. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->y, p256_mod);
  99712. ctx->state = 15;
  99713. break;
  99714. case 15:
  99715. /* X = X - Y */
  99716. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->y, p256_mod);
  99717. ctx->state = 16;
  99718. break;
  99719. case 16:
  99720. /* Y = Y - X */
  99721. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->x, p256_mod);
  99722. ctx->state = 17;
  99723. break;
  99724. case 17:
  99725. /* Y = Y * T1 */
  99726. sp_256_mont_mul_8(ctx->y, ctx->y, ctx->t1, p256_mod, p256_mp_mod);
  99727. ctx->state = 18;
  99728. break;
  99729. case 18:
  99730. /* Y = Y - T2 */
  99731. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->t2, p256_mod);
  99732. ctx->state = 19;
  99733. /* fall-through */
  99734. case 19:
  99735. err = MP_OKAY;
  99736. break;
  99737. }
  99738. if (err == MP_OKAY && ctx->state != 19) {
  99739. err = FP_WOULDBLOCK;
  99740. }
  99741. return err;
  99742. }
  99743. #endif /* WOLFSSL_SP_NONBLOCK */
  99744. /* Compare two numbers to determine if they are equal.
  99745. * Constant time implementation.
  99746. *
  99747. * a First number to compare.
  99748. * b Second number to compare.
  99749. * returns 1 when equal and 0 otherwise.
  99750. */
  99751. static int sp_256_cmp_equal_8(const sp_digit* a, const sp_digit* b)
  99752. {
  99753. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  99754. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  99755. (a[6] ^ b[6]) | (a[7] ^ b[7])) == 0;
  99756. }
  99757. /* Returns 1 if the number of zero.
  99758. * Implementation is constant time.
  99759. *
  99760. * a Number to check.
  99761. * returns 1 if the number is zero and 0 otherwise.
  99762. */
  99763. static int sp_256_iszero_8(const sp_digit* a)
  99764. {
  99765. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7]) == 0;
  99766. }
  99767. /* Add two Montgomery form projective points.
  99768. *
  99769. * r Result of addition.
  99770. * p First point to add.
  99771. * q Second point to add.
  99772. * t Temporary ordinate data.
  99773. */
  99774. static void sp_256_proj_point_add_8(sp_point_256* r,
  99775. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  99776. {
  99777. sp_digit* t6 = t;
  99778. sp_digit* t1 = t + 2*8;
  99779. sp_digit* t2 = t + 4*8;
  99780. sp_digit* t3 = t + 6*8;
  99781. sp_digit* t4 = t + 8*8;
  99782. sp_digit* t5 = t + 10*8;
  99783. /* U1 = X1*Z2^2 */
  99784. sp_256_mont_sqr_8(t1, q->z, p256_mod, p256_mp_mod);
  99785. sp_256_mont_mul_8(t3, t1, q->z, p256_mod, p256_mp_mod);
  99786. sp_256_mont_mul_8(t1, t1, p->x, p256_mod, p256_mp_mod);
  99787. /* U2 = X2*Z1^2 */
  99788. sp_256_mont_sqr_8(t2, p->z, p256_mod, p256_mp_mod);
  99789. sp_256_mont_mul_8(t4, t2, p->z, p256_mod, p256_mp_mod);
  99790. sp_256_mont_mul_8(t2, t2, q->x, p256_mod, p256_mp_mod);
  99791. /* S1 = Y1*Z2^3 */
  99792. sp_256_mont_mul_8(t3, t3, p->y, p256_mod, p256_mp_mod);
  99793. /* S2 = Y2*Z1^3 */
  99794. sp_256_mont_mul_8(t4, t4, q->y, p256_mod, p256_mp_mod);
  99795. /* Check double */
  99796. if ((~p->infinity) & (~q->infinity) &
  99797. sp_256_cmp_equal_8(t2, t1) &
  99798. sp_256_cmp_equal_8(t4, t3)) {
  99799. sp_256_proj_point_dbl_8(r, p, t);
  99800. }
  99801. else {
  99802. sp_digit* x = t6;
  99803. sp_digit* y = t1;
  99804. sp_digit* z = t2;
  99805. /* H = U2 - U1 */
  99806. sp_256_mont_sub_8(t2, t2, t1, p256_mod);
  99807. /* R = S2 - S1 */
  99808. sp_256_mont_sub_8(t4, t4, t3, p256_mod);
  99809. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  99810. sp_256_mont_sqr_8(t5, t2, p256_mod, p256_mp_mod);
  99811. sp_256_mont_mul_8(y, t1, t5, p256_mod, p256_mp_mod);
  99812. sp_256_mont_mul_8(t5, t5, t2, p256_mod, p256_mp_mod);
  99813. /* Z3 = H*Z1*Z2 */
  99814. sp_256_mont_mul_8(z, p->z, t2, p256_mod, p256_mp_mod);
  99815. sp_256_mont_mul_8(z, z, q->z, p256_mod, p256_mp_mod);
  99816. sp_256_mont_sqr_8(x, t4, p256_mod, p256_mp_mod);
  99817. sp_256_mont_sub_8(x, x, t5, p256_mod);
  99818. sp_256_mont_mul_8(t5, t5, t3, p256_mod, p256_mp_mod);
  99819. sp_256_mont_dbl_8(t3, y, p256_mod);
  99820. sp_256_mont_sub_8(x, x, t3, p256_mod);
  99821. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  99822. sp_256_mont_sub_8(y, y, x, p256_mod);
  99823. sp_256_mont_mul_8(y, y, t4, p256_mod, p256_mp_mod);
  99824. sp_256_mont_sub_8(y, y, t5, p256_mod);
  99825. {
  99826. int i;
  99827. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  99828. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  99829. sp_digit maskt = ~(maskp | maskq);
  99830. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  99831. for (i = 0; i < 8; i++) {
  99832. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  99833. (x[i] & maskt);
  99834. }
  99835. for (i = 0; i < 8; i++) {
  99836. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  99837. (y[i] & maskt);
  99838. }
  99839. for (i = 0; i < 8; i++) {
  99840. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  99841. (z[i] & maskt);
  99842. }
  99843. r->z[0] |= inf;
  99844. r->infinity = (word32)inf;
  99845. }
  99846. }
  99847. }
  99848. #ifdef WOLFSSL_SP_NONBLOCK
  99849. typedef struct sp_256_proj_point_add_8_ctx {
  99850. int state;
  99851. sp_256_proj_point_dbl_8_ctx dbl_ctx;
  99852. const sp_point_256* ap[2];
  99853. sp_point_256* rp[2];
  99854. sp_digit* t1;
  99855. sp_digit* t2;
  99856. sp_digit* t3;
  99857. sp_digit* t4;
  99858. sp_digit* t5;
  99859. sp_digit* t6;
  99860. sp_digit* x;
  99861. sp_digit* y;
  99862. sp_digit* z;
  99863. } sp_256_proj_point_add_8_ctx;
  99864. /* Add two Montgomery form projective points.
  99865. *
  99866. * r Result of addition.
  99867. * p First point to add.
  99868. * q Second point to add.
  99869. * t Temporary ordinate data.
  99870. */
  99871. static int sp_256_proj_point_add_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r,
  99872. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  99873. {
  99874. int err = FP_WOULDBLOCK;
  99875. sp_256_proj_point_add_8_ctx* ctx = (sp_256_proj_point_add_8_ctx*)sp_ctx->data;
  99876. /* Ensure only the first point is the same as the result. */
  99877. if (q == r) {
  99878. const sp_point_256* a = p;
  99879. p = q;
  99880. q = a;
  99881. }
  99882. typedef char ctx_size_test[sizeof(sp_256_proj_point_add_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  99883. (void)sizeof(ctx_size_test);
  99884. switch (ctx->state) {
  99885. case 0: /* INIT */
  99886. ctx->t6 = t;
  99887. ctx->t1 = t + 2*8;
  99888. ctx->t2 = t + 4*8;
  99889. ctx->t3 = t + 6*8;
  99890. ctx->t4 = t + 8*8;
  99891. ctx->t5 = t + 10*8;
  99892. ctx->x = ctx->t6;
  99893. ctx->y = ctx->t1;
  99894. ctx->z = ctx->t2;
  99895. ctx->state = 1;
  99896. break;
  99897. case 1:
  99898. /* U1 = X1*Z2^2 */
  99899. sp_256_mont_sqr_8(ctx->t1, q->z, p256_mod, p256_mp_mod);
  99900. ctx->state = 2;
  99901. break;
  99902. case 2:
  99903. sp_256_mont_mul_8(ctx->t3, ctx->t1, q->z, p256_mod, p256_mp_mod);
  99904. ctx->state = 3;
  99905. break;
  99906. case 3:
  99907. sp_256_mont_mul_8(ctx->t1, ctx->t1, p->x, p256_mod, p256_mp_mod);
  99908. ctx->state = 4;
  99909. break;
  99910. case 4:
  99911. /* U2 = X2*Z1^2 */
  99912. sp_256_mont_sqr_8(ctx->t2, p->z, p256_mod, p256_mp_mod);
  99913. ctx->state = 5;
  99914. break;
  99915. case 5:
  99916. sp_256_mont_mul_8(ctx->t4, ctx->t2, p->z, p256_mod, p256_mp_mod);
  99917. ctx->state = 6;
  99918. break;
  99919. case 6:
  99920. sp_256_mont_mul_8(ctx->t2, ctx->t2, q->x, p256_mod, p256_mp_mod);
  99921. ctx->state = 7;
  99922. break;
  99923. case 7:
  99924. /* S1 = Y1*Z2^3 */
  99925. sp_256_mont_mul_8(ctx->t3, ctx->t3, p->y, p256_mod, p256_mp_mod);
  99926. ctx->state = 8;
  99927. break;
  99928. case 8:
  99929. /* S2 = Y2*Z1^3 */
  99930. sp_256_mont_mul_8(ctx->t4, ctx->t4, q->y, p256_mod, p256_mp_mod);
  99931. ctx->state = 9;
  99932. break;
  99933. case 9:
  99934. /* Check double */
  99935. if ((~p->infinity) & (~q->infinity) &
  99936. sp_256_cmp_equal_8(ctx->t2, ctx->t1) &
  99937. sp_256_cmp_equal_8(ctx->t4, ctx->t3)) {
  99938. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  99939. sp_256_proj_point_dbl_8(r, p, t);
  99940. ctx->state = 25;
  99941. }
  99942. else {
  99943. ctx->state = 10;
  99944. }
  99945. break;
  99946. case 10:
  99947. /* H = U2 - U1 */
  99948. sp_256_mont_sub_8(ctx->t2, ctx->t2, ctx->t1, p256_mod);
  99949. ctx->state = 11;
  99950. break;
  99951. case 11:
  99952. /* R = S2 - S1 */
  99953. sp_256_mont_sub_8(ctx->t4, ctx->t4, ctx->t3, p256_mod);
  99954. ctx->state = 12;
  99955. break;
  99956. case 12:
  99957. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  99958. sp_256_mont_sqr_8(ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
  99959. ctx->state = 13;
  99960. break;
  99961. case 13:
  99962. sp_256_mont_mul_8(ctx->y, ctx->t1, ctx->t5, p256_mod, p256_mp_mod);
  99963. ctx->state = 14;
  99964. break;
  99965. case 14:
  99966. sp_256_mont_mul_8(ctx->t5, ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
  99967. ctx->state = 15;
  99968. break;
  99969. case 15:
  99970. /* Z3 = H*Z1*Z2 */
  99971. sp_256_mont_mul_8(ctx->z, p->z, ctx->t2, p256_mod, p256_mp_mod);
  99972. ctx->state = 16;
  99973. break;
  99974. case 16:
  99975. sp_256_mont_mul_8(ctx->z, ctx->z, q->z, p256_mod, p256_mp_mod);
  99976. ctx->state = 17;
  99977. break;
  99978. case 17:
  99979. sp_256_mont_sqr_8(ctx->x, ctx->t4, p256_mod, p256_mp_mod);
  99980. ctx->state = 18;
  99981. break;
  99982. case 18:
  99983. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->t5, p256_mod);
  99984. ctx->state = 19;
  99985. break;
  99986. case 19:
  99987. sp_256_mont_mul_8(ctx->t5, ctx->t5, ctx->t3, p256_mod, p256_mp_mod);
  99988. ctx->state = 20;
  99989. break;
  99990. case 20:
  99991. sp_256_mont_dbl_8(ctx->t3, ctx->y, p256_mod);
  99992. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->t3, p256_mod);
  99993. ctx->state = 21;
  99994. break;
  99995. case 21:
  99996. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  99997. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->x, p256_mod);
  99998. ctx->state = 22;
  99999. break;
  100000. case 22:
  100001. sp_256_mont_mul_8(ctx->y, ctx->y, ctx->t4, p256_mod, p256_mp_mod);
  100002. ctx->state = 23;
  100003. break;
  100004. case 23:
  100005. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->t5, p256_mod);
  100006. ctx->state = 24;
  100007. break;
  100008. case 24:
  100009. {
  100010. {
  100011. int i;
  100012. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  100013. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  100014. sp_digit maskt = ~(maskp | maskq);
  100015. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  100016. for (i = 0; i < 8; i++) {
  100017. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  100018. (ctx->x[i] & maskt);
  100019. }
  100020. for (i = 0; i < 8; i++) {
  100021. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  100022. (ctx->y[i] & maskt);
  100023. }
  100024. for (i = 0; i < 8; i++) {
  100025. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  100026. (ctx->z[i] & maskt);
  100027. }
  100028. r->z[0] |= inf;
  100029. r->infinity = (word32)inf;
  100030. }
  100031. ctx->state = 25;
  100032. break;
  100033. }
  100034. case 25:
  100035. err = MP_OKAY;
  100036. break;
  100037. }
  100038. if (err == MP_OKAY && ctx->state != 25) {
  100039. err = FP_WOULDBLOCK;
  100040. }
  100041. return err;
  100042. }
  100043. #endif /* WOLFSSL_SP_NONBLOCK */
  100044. #ifndef WC_NO_CACHE_RESISTANT
  100045. /* Touch each possible point that could be being copied.
  100046. *
  100047. * r Point to copy into.
  100048. * table Table - start of the entries to access
  100049. * idx Index of entry to retrieve.
  100050. */
  100051. static void sp_256_get_point_16_8(sp_point_256* r, const sp_point_256* table,
  100052. int idx)
  100053. {
  100054. int i;
  100055. sp_digit mask;
  100056. r->x[0] = 0;
  100057. r->x[1] = 0;
  100058. r->x[2] = 0;
  100059. r->x[3] = 0;
  100060. r->x[4] = 0;
  100061. r->x[5] = 0;
  100062. r->x[6] = 0;
  100063. r->x[7] = 0;
  100064. r->y[0] = 0;
  100065. r->y[1] = 0;
  100066. r->y[2] = 0;
  100067. r->y[3] = 0;
  100068. r->y[4] = 0;
  100069. r->y[5] = 0;
  100070. r->y[6] = 0;
  100071. r->y[7] = 0;
  100072. r->z[0] = 0;
  100073. r->z[1] = 0;
  100074. r->z[2] = 0;
  100075. r->z[3] = 0;
  100076. r->z[4] = 0;
  100077. r->z[5] = 0;
  100078. r->z[6] = 0;
  100079. r->z[7] = 0;
  100080. for (i = 1; i < 16; i++) {
  100081. mask = 0 - (i == idx);
  100082. r->x[0] |= mask & table[i].x[0];
  100083. r->x[1] |= mask & table[i].x[1];
  100084. r->x[2] |= mask & table[i].x[2];
  100085. r->x[3] |= mask & table[i].x[3];
  100086. r->x[4] |= mask & table[i].x[4];
  100087. r->x[5] |= mask & table[i].x[5];
  100088. r->x[6] |= mask & table[i].x[6];
  100089. r->x[7] |= mask & table[i].x[7];
  100090. r->y[0] |= mask & table[i].y[0];
  100091. r->y[1] |= mask & table[i].y[1];
  100092. r->y[2] |= mask & table[i].y[2];
  100093. r->y[3] |= mask & table[i].y[3];
  100094. r->y[4] |= mask & table[i].y[4];
  100095. r->y[5] |= mask & table[i].y[5];
  100096. r->y[6] |= mask & table[i].y[6];
  100097. r->y[7] |= mask & table[i].y[7];
  100098. r->z[0] |= mask & table[i].z[0];
  100099. r->z[1] |= mask & table[i].z[1];
  100100. r->z[2] |= mask & table[i].z[2];
  100101. r->z[3] |= mask & table[i].z[3];
  100102. r->z[4] |= mask & table[i].z[4];
  100103. r->z[5] |= mask & table[i].z[5];
  100104. r->z[6] |= mask & table[i].z[6];
  100105. r->z[7] |= mask & table[i].z[7];
  100106. }
  100107. }
  100108. #endif /* !WC_NO_CACHE_RESISTANT */
  100109. /* Multiply the point by the scalar and return the result.
  100110. * If map is true then convert result to affine coordinates.
  100111. *
  100112. * Fast implementation that generates a pre-computation table.
  100113. * 4 bits of window (no sliding!).
  100114. * Uses add and double for calculating table.
  100115. * 256 doubles.
  100116. * 76 adds.
  100117. *
  100118. * r Resulting point.
  100119. * g Point to multiply.
  100120. * k Scalar to multiply by.
  100121. * map Indicates whether to convert result to affine.
  100122. * ct Constant time required.
  100123. * heap Heap to use for allocation.
  100124. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  100125. */
  100126. static int sp_256_ecc_mulmod_fast_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
  100127. int map, int ct, void* heap)
  100128. {
  100129. #ifdef WOLFSSL_SP_SMALL_STACK
  100130. sp_point_256* t = NULL;
  100131. sp_digit* tmp = NULL;
  100132. #else
  100133. sp_point_256 t[16 + 1];
  100134. sp_digit tmp[2 * 8 * 6];
  100135. #endif
  100136. sp_point_256* rt = NULL;
  100137. #ifndef WC_NO_CACHE_RESISTANT
  100138. #ifdef WOLFSSL_SP_SMALL_STACK
  100139. sp_point_256* p = NULL;
  100140. #else
  100141. sp_point_256 p[1];
  100142. #endif
  100143. #endif /* !WC_NO_CACHE_RESISTANT */
  100144. sp_digit n;
  100145. int i;
  100146. int c;
  100147. int y;
  100148. int err = MP_OKAY;
  100149. /* Constant time used for cache attack resistance implementation. */
  100150. (void)ct;
  100151. (void)heap;
  100152. #ifdef WOLFSSL_SP_SMALL_STACK
  100153. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * (16 + 1),
  100154. heap, DYNAMIC_TYPE_ECC);
  100155. if (t == NULL)
  100156. err = MEMORY_E;
  100157. #ifndef WC_NO_CACHE_RESISTANT
  100158. if (err == MP_OKAY) {
  100159. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256),
  100160. heap, DYNAMIC_TYPE_ECC);
  100161. if (p == NULL)
  100162. err = MEMORY_E;
  100163. }
  100164. #endif
  100165. if (err == MP_OKAY) {
  100166. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  100167. DYNAMIC_TYPE_ECC);
  100168. if (tmp == NULL)
  100169. err = MEMORY_E;
  100170. }
  100171. #endif
  100172. if (err == MP_OKAY) {
  100173. rt = t + 16;
  100174. /* t[0] = {0, 0, 1} * norm */
  100175. XMEMSET(&t[0], 0, sizeof(t[0]));
  100176. t[0].infinity = 1;
  100177. /* t[1] = {g->x, g->y, g->z} * norm */
  100178. (void)sp_256_mod_mul_norm_8(t[1].x, g->x, p256_mod);
  100179. (void)sp_256_mod_mul_norm_8(t[1].y, g->y, p256_mod);
  100180. (void)sp_256_mod_mul_norm_8(t[1].z, g->z, p256_mod);
  100181. t[1].infinity = 0;
  100182. sp_256_proj_point_dbl_8(&t[ 2], &t[ 1], tmp);
  100183. t[ 2].infinity = 0;
  100184. sp_256_proj_point_add_8(&t[ 3], &t[ 2], &t[ 1], tmp);
  100185. t[ 3].infinity = 0;
  100186. sp_256_proj_point_dbl_8(&t[ 4], &t[ 2], tmp);
  100187. t[ 4].infinity = 0;
  100188. sp_256_proj_point_add_8(&t[ 5], &t[ 3], &t[ 2], tmp);
  100189. t[ 5].infinity = 0;
  100190. sp_256_proj_point_dbl_8(&t[ 6], &t[ 3], tmp);
  100191. t[ 6].infinity = 0;
  100192. sp_256_proj_point_add_8(&t[ 7], &t[ 4], &t[ 3], tmp);
  100193. t[ 7].infinity = 0;
  100194. sp_256_proj_point_dbl_8(&t[ 8], &t[ 4], tmp);
  100195. t[ 8].infinity = 0;
  100196. sp_256_proj_point_add_8(&t[ 9], &t[ 5], &t[ 4], tmp);
  100197. t[ 9].infinity = 0;
  100198. sp_256_proj_point_dbl_8(&t[10], &t[ 5], tmp);
  100199. t[10].infinity = 0;
  100200. sp_256_proj_point_add_8(&t[11], &t[ 6], &t[ 5], tmp);
  100201. t[11].infinity = 0;
  100202. sp_256_proj_point_dbl_8(&t[12], &t[ 6], tmp);
  100203. t[12].infinity = 0;
  100204. sp_256_proj_point_add_8(&t[13], &t[ 7], &t[ 6], tmp);
  100205. t[13].infinity = 0;
  100206. sp_256_proj_point_dbl_8(&t[14], &t[ 7], tmp);
  100207. t[14].infinity = 0;
  100208. sp_256_proj_point_add_8(&t[15], &t[ 8], &t[ 7], tmp);
  100209. t[15].infinity = 0;
  100210. i = 6;
  100211. n = k[i+1] << 0;
  100212. c = 28;
  100213. y = (int)(n >> 28);
  100214. #ifndef WC_NO_CACHE_RESISTANT
  100215. if (ct) {
  100216. sp_256_get_point_16_8(rt, t, y);
  100217. rt->infinity = !y;
  100218. }
  100219. else
  100220. #endif
  100221. {
  100222. XMEMCPY(rt, &t[y], sizeof(sp_point_256));
  100223. }
  100224. n <<= 4;
  100225. for (; i>=0 || c>=4; ) {
  100226. if (c < 4) {
  100227. n |= k[i--];
  100228. c += 32;
  100229. }
  100230. y = (n >> 28) & 0xf;
  100231. n <<= 4;
  100232. c -= 4;
  100233. sp_256_proj_point_dbl_8(rt, rt, tmp);
  100234. sp_256_proj_point_dbl_8(rt, rt, tmp);
  100235. sp_256_proj_point_dbl_8(rt, rt, tmp);
  100236. sp_256_proj_point_dbl_8(rt, rt, tmp);
  100237. #ifndef WC_NO_CACHE_RESISTANT
  100238. if (ct) {
  100239. sp_256_get_point_16_8(p, t, y);
  100240. p->infinity = !y;
  100241. sp_256_proj_point_add_8(rt, rt, p, tmp);
  100242. }
  100243. else
  100244. #endif
  100245. {
  100246. sp_256_proj_point_add_8(rt, rt, &t[y], tmp);
  100247. }
  100248. }
  100249. if (map != 0) {
  100250. sp_256_map_8(r, rt, tmp);
  100251. }
  100252. else {
  100253. XMEMCPY(r, rt, sizeof(sp_point_256));
  100254. }
  100255. }
  100256. #ifdef WOLFSSL_SP_SMALL_STACK
  100257. if (tmp != NULL)
  100258. #endif
  100259. {
  100260. ForceZero(tmp, sizeof(sp_digit) * 2 * 8 * 6);
  100261. #ifdef WOLFSSL_SP_SMALL_STACK
  100262. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  100263. #endif
  100264. }
  100265. #ifndef WC_NO_CACHE_RESISTANT
  100266. #ifdef WOLFSSL_SP_SMALL_STACK
  100267. if (p != NULL)
  100268. #endif
  100269. {
  100270. ForceZero(p, sizeof(sp_point_256));
  100271. #ifdef WOLFSSL_SP_SMALL_STACK
  100272. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  100273. #endif
  100274. }
  100275. #endif /* !WC_NO_CACHE_RESISTANT */
  100276. #ifdef WOLFSSL_SP_SMALL_STACK
  100277. if (t != NULL)
  100278. #endif
  100279. {
  100280. ForceZero(t, sizeof(sp_point_256) * 17);
  100281. #ifdef WOLFSSL_SP_SMALL_STACK
  100282. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  100283. #endif
  100284. }
  100285. return err;
  100286. }
  100287. #ifdef FP_ECC
  100288. /* Double the Montgomery form projective point p a number of times.
  100289. *
  100290. * r Result of repeated doubling of point.
  100291. * p Point to double.
  100292. * n Number of times to double
  100293. * t Temporary ordinate data.
  100294. */
  100295. static void sp_256_proj_point_dbl_n_8(sp_point_256* p, int i,
  100296. sp_digit* t)
  100297. {
  100298. sp_digit* w = t;
  100299. sp_digit* a = t + 2*8;
  100300. sp_digit* b = t + 4*8;
  100301. sp_digit* t1 = t + 6*8;
  100302. sp_digit* t2 = t + 8*8;
  100303. sp_digit* x;
  100304. sp_digit* y;
  100305. sp_digit* z;
  100306. volatile int n = i;
  100307. x = p->x;
  100308. y = p->y;
  100309. z = p->z;
  100310. /* Y = 2*Y */
  100311. sp_256_mont_dbl_8(y, y, p256_mod);
  100312. /* W = Z^4 */
  100313. sp_256_mont_sqr_8(w, z, p256_mod, p256_mp_mod);
  100314. sp_256_mont_sqr_8(w, w, p256_mod, p256_mp_mod);
  100315. #ifndef WOLFSSL_SP_SMALL
  100316. while (--n > 0)
  100317. #else
  100318. while (--n >= 0)
  100319. #endif
  100320. {
  100321. /* A = 3*(X^2 - W) */
  100322. sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod);
  100323. sp_256_mont_sub_8(t1, t1, w, p256_mod);
  100324. sp_256_mont_tpl_8(a, t1, p256_mod);
  100325. /* B = X*Y^2 */
  100326. sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod);
  100327. sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod);
  100328. /* X = A^2 - 2B */
  100329. sp_256_mont_sqr_8(x, a, p256_mod, p256_mp_mod);
  100330. sp_256_mont_dbl_8(t2, b, p256_mod);
  100331. sp_256_mont_sub_8(x, x, t2, p256_mod);
  100332. /* B = 2.(B - X) */
  100333. sp_256_mont_sub_8(t2, b, x, p256_mod);
  100334. sp_256_mont_dbl_8(b, t2, p256_mod);
  100335. /* Z = Z*Y */
  100336. sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod);
  100337. /* t1 = Y^4 */
  100338. sp_256_mont_sqr_8(t1, t1, p256_mod, p256_mp_mod);
  100339. #ifdef WOLFSSL_SP_SMALL
  100340. if (n != 0)
  100341. #endif
  100342. {
  100343. /* W = W*Y^4 */
  100344. sp_256_mont_mul_8(w, w, t1, p256_mod, p256_mp_mod);
  100345. }
  100346. /* y = 2*A*(B - X) - Y^4 */
  100347. sp_256_mont_mul_8(y, b, a, p256_mod, p256_mp_mod);
  100348. sp_256_mont_sub_8(y, y, t1, p256_mod);
  100349. }
  100350. #ifndef WOLFSSL_SP_SMALL
  100351. /* A = 3*(X^2 - W) */
  100352. sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod);
  100353. sp_256_mont_sub_8(t1, t1, w, p256_mod);
  100354. sp_256_mont_tpl_8(a, t1, p256_mod);
  100355. /* B = X*Y^2 */
  100356. sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod);
  100357. sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod);
  100358. /* X = A^2 - 2B */
  100359. sp_256_mont_sqr_8(x, a, p256_mod, p256_mp_mod);
  100360. sp_256_mont_dbl_8(t2, b, p256_mod);
  100361. sp_256_mont_sub_8(x, x, t2, p256_mod);
  100362. /* B = 2.(B - X) */
  100363. sp_256_mont_sub_8(t2, b, x, p256_mod);
  100364. sp_256_mont_dbl_8(b, t2, p256_mod);
  100365. /* Z = Z*Y */
  100366. sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod);
  100367. /* t1 = Y^4 */
  100368. sp_256_mont_sqr_8(t1, t1, p256_mod, p256_mp_mod);
  100369. /* y = 2*A*(B - X) - Y^4 */
  100370. sp_256_mont_mul_8(y, b, a, p256_mod, p256_mp_mod);
  100371. sp_256_mont_sub_8(y, y, t1, p256_mod);
  100372. #endif /* WOLFSSL_SP_SMALL */
  100373. /* Y = Y/2 */
  100374. sp_256_mont_div2_8(y, y, p256_mod);
  100375. }
  100376. /* Convert the projective point to affine.
  100377. * Ordinates are in Montgomery form.
  100378. *
  100379. * a Point to convert.
  100380. * t Temporary data.
  100381. */
  100382. static void sp_256_proj_to_affine_8(sp_point_256* a, sp_digit* t)
  100383. {
  100384. sp_digit* t1 = t;
  100385. sp_digit* t2 = t + 2 * 8;
  100386. sp_digit* tmp = t + 4 * 8;
  100387. sp_256_mont_inv_8(t1, a->z, tmp);
  100388. sp_256_mont_sqr_8(t2, t1, p256_mod, p256_mp_mod);
  100389. sp_256_mont_mul_8(t1, t2, t1, p256_mod, p256_mp_mod);
  100390. sp_256_mont_mul_8(a->x, a->x, t2, p256_mod, p256_mp_mod);
  100391. sp_256_mont_mul_8(a->y, a->y, t1, p256_mod, p256_mp_mod);
  100392. XMEMCPY(a->z, p256_norm_mod, sizeof(p256_norm_mod));
  100393. }
  100394. #endif /* FP_ECC */
  100395. /* A table entry for pre-computed points. */
  100396. typedef struct sp_table_entry_256 {
  100397. sp_digit x[8];
  100398. sp_digit y[8];
  100399. } sp_table_entry_256;
  100400. #ifdef FP_ECC
  100401. #endif /* FP_ECC */
  100402. /* Add two Montgomery form projective points. The second point has a q value of
  100403. * one.
  100404. * Only the first point can be the same pointer as the result point.
  100405. *
  100406. * r Result of addition.
  100407. * p First point to add.
  100408. * q Second point to add.
  100409. * t Temporary ordinate data.
  100410. */
  100411. static void sp_256_proj_point_add_qz1_8(sp_point_256* r,
  100412. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  100413. {
  100414. sp_digit* t2 = t;
  100415. sp_digit* t3 = t + 2*8;
  100416. sp_digit* t6 = t + 4*8;
  100417. sp_digit* t1 = t + 6*8;
  100418. sp_digit* t4 = t + 8*8;
  100419. sp_digit* t5 = t + 10*8;
  100420. /* Calculate values to subtract from P->x and P->y. */
  100421. /* U2 = X2*Z1^2 */
  100422. sp_256_mont_sqr_8(t2, p->z, p256_mod, p256_mp_mod);
  100423. sp_256_mont_mul_8(t4, t2, p->z, p256_mod, p256_mp_mod);
  100424. sp_256_mont_mul_8(t2, t2, q->x, p256_mod, p256_mp_mod);
  100425. /* S2 = Y2*Z1^3 */
  100426. sp_256_mont_mul_8(t4, t4, q->y, p256_mod, p256_mp_mod);
  100427. if ((~p->infinity) & (~q->infinity) &
  100428. sp_256_cmp_equal_8(p->x, t2) &
  100429. sp_256_cmp_equal_8(p->y, t4)) {
  100430. sp_256_proj_point_dbl_8(r, p, t);
  100431. }
  100432. else {
  100433. sp_digit* x = t2;
  100434. sp_digit* y = t3;
  100435. sp_digit* z = t6;
  100436. /* H = U2 - X1 */
  100437. sp_256_mont_sub_8(t2, t2, p->x, p256_mod);
  100438. /* R = S2 - Y1 */
  100439. sp_256_mont_sub_8(t4, t4, p->y, p256_mod);
  100440. /* Z3 = H*Z1 */
  100441. sp_256_mont_mul_8(z, p->z, t2, p256_mod, p256_mp_mod);
  100442. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  100443. sp_256_mont_sqr_8(t1, t2, p256_mod, p256_mp_mod);
  100444. sp_256_mont_mul_8(t3, p->x, t1, p256_mod, p256_mp_mod);
  100445. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  100446. sp_256_mont_sqr_8(t2, t4, p256_mod, p256_mp_mod);
  100447. sp_256_mont_sub_8(t2, t2, t1, p256_mod);
  100448. sp_256_mont_dbl_8(t5, t3, p256_mod);
  100449. sp_256_mont_sub_8(x, t2, t5, p256_mod);
  100450. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  100451. sp_256_mont_sub_8(t3, t3, x, p256_mod);
  100452. sp_256_mont_mul_8(t3, t3, t4, p256_mod, p256_mp_mod);
  100453. sp_256_mont_mul_8(t1, t1, p->y, p256_mod, p256_mp_mod);
  100454. sp_256_mont_sub_8(y, t3, t1, p256_mod);
  100455. {
  100456. int i;
  100457. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  100458. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  100459. sp_digit maskt = ~(maskp | maskq);
  100460. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  100461. for (i = 0; i < 8; i++) {
  100462. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  100463. (x[i] & maskt);
  100464. }
  100465. for (i = 0; i < 8; i++) {
  100466. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  100467. (y[i] & maskt);
  100468. }
  100469. for (i = 0; i < 8; i++) {
  100470. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  100471. (z[i] & maskt);
  100472. }
  100473. r->z[0] |= inf;
  100474. r->infinity = (word32)inf;
  100475. }
  100476. }
  100477. }
  100478. #ifdef WOLFSSL_SP_SMALL
  100479. #ifdef FP_ECC
  100480. /* Generate the pre-computed table of points for the base point.
  100481. *
  100482. * width = 4
  100483. * 16 entries
  100484. * 64 bits between
  100485. *
  100486. * a The base point.
  100487. * table Place to store generated point data.
  100488. * tmp Temporary data.
  100489. * heap Heap to use for allocation.
  100490. */
  100491. static int sp_256_gen_stripe_table_8(const sp_point_256* a,
  100492. sp_table_entry_256* table, sp_digit* tmp, void* heap)
  100493. {
  100494. #ifdef WOLFSSL_SP_SMALL_STACK
  100495. sp_point_256* t = NULL;
  100496. #else
  100497. sp_point_256 t[3];
  100498. #endif
  100499. sp_point_256* s1 = NULL;
  100500. sp_point_256* s2 = NULL;
  100501. int i;
  100502. int j;
  100503. int err = MP_OKAY;
  100504. (void)heap;
  100505. #ifdef WOLFSSL_SP_SMALL_STACK
  100506. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
  100507. DYNAMIC_TYPE_ECC);
  100508. if (t == NULL)
  100509. err = MEMORY_E;
  100510. #endif
  100511. if (err == MP_OKAY) {
  100512. s1 = t + 1;
  100513. s2 = t + 2;
  100514. err = sp_256_mod_mul_norm_8(t->x, a->x, p256_mod);
  100515. }
  100516. if (err == MP_OKAY) {
  100517. err = sp_256_mod_mul_norm_8(t->y, a->y, p256_mod);
  100518. }
  100519. if (err == MP_OKAY) {
  100520. err = sp_256_mod_mul_norm_8(t->z, a->z, p256_mod);
  100521. }
  100522. if (err == MP_OKAY) {
  100523. t->infinity = 0;
  100524. sp_256_proj_to_affine_8(t, tmp);
  100525. XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
  100526. s1->infinity = 0;
  100527. XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
  100528. s2->infinity = 0;
  100529. /* table[0] = {0, 0, infinity} */
  100530. XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
  100531. /* table[1] = Affine version of 'a' in Montgomery form */
  100532. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  100533. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  100534. for (i=1; i<4; i++) {
  100535. sp_256_proj_point_dbl_n_8(t, 64, tmp);
  100536. sp_256_proj_to_affine_8(t, tmp);
  100537. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  100538. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  100539. }
  100540. for (i=1; i<4; i++) {
  100541. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  100542. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  100543. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  100544. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  100545. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  100546. sp_256_proj_point_add_qz1_8(t, s1, s2, tmp);
  100547. sp_256_proj_to_affine_8(t, tmp);
  100548. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  100549. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  100550. }
  100551. }
  100552. }
  100553. #ifdef WOLFSSL_SP_SMALL_STACK
  100554. if (t != NULL)
  100555. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  100556. #endif
  100557. return err;
  100558. }
  100559. #endif /* FP_ECC */
  100560. #ifndef WC_NO_CACHE_RESISTANT
  100561. /* Touch each possible entry that could be being copied.
  100562. *
  100563. * r Point to copy into.
  100564. * table Table - start of the entries to access
  100565. * idx Index of entry to retrieve.
  100566. */
  100567. static void sp_256_get_entry_16_8(sp_point_256* r,
  100568. const sp_table_entry_256* table, int idx)
  100569. {
  100570. int i;
  100571. sp_digit mask;
  100572. r->x[0] = 0;
  100573. r->x[1] = 0;
  100574. r->x[2] = 0;
  100575. r->x[3] = 0;
  100576. r->x[4] = 0;
  100577. r->x[5] = 0;
  100578. r->x[6] = 0;
  100579. r->x[7] = 0;
  100580. r->y[0] = 0;
  100581. r->y[1] = 0;
  100582. r->y[2] = 0;
  100583. r->y[3] = 0;
  100584. r->y[4] = 0;
  100585. r->y[5] = 0;
  100586. r->y[6] = 0;
  100587. r->y[7] = 0;
  100588. for (i = 1; i < 16; i++) {
  100589. mask = 0 - (i == idx);
  100590. r->x[0] |= mask & table[i].x[0];
  100591. r->x[1] |= mask & table[i].x[1];
  100592. r->x[2] |= mask & table[i].x[2];
  100593. r->x[3] |= mask & table[i].x[3];
  100594. r->x[4] |= mask & table[i].x[4];
  100595. r->x[5] |= mask & table[i].x[5];
  100596. r->x[6] |= mask & table[i].x[6];
  100597. r->x[7] |= mask & table[i].x[7];
  100598. r->y[0] |= mask & table[i].y[0];
  100599. r->y[1] |= mask & table[i].y[1];
  100600. r->y[2] |= mask & table[i].y[2];
  100601. r->y[3] |= mask & table[i].y[3];
  100602. r->y[4] |= mask & table[i].y[4];
  100603. r->y[5] |= mask & table[i].y[5];
  100604. r->y[6] |= mask & table[i].y[6];
  100605. r->y[7] |= mask & table[i].y[7];
  100606. }
  100607. }
  100608. #endif /* !WC_NO_CACHE_RESISTANT */
  100609. /* Multiply the point by the scalar and return the result.
  100610. * If map is true then convert result to affine coordinates.
  100611. *
  100612. * Stripe implementation.
  100613. * Pre-generated: 2^0, 2^64, ...
  100614. * Pre-generated: products of all combinations of above.
  100615. * 4 doubles and adds (with qz=1)
  100616. *
  100617. * r Resulting point.
  100618. * k Scalar to multiply by.
  100619. * table Pre-computed table.
  100620. * map Indicates whether to convert result to affine.
  100621. * ct Constant time required.
  100622. * heap Heap to use for allocation.
  100623. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  100624. */
  100625. static int sp_256_ecc_mulmod_stripe_8(sp_point_256* r, const sp_point_256* g,
  100626. const sp_table_entry_256* table, const sp_digit* k, int map,
  100627. int ct, void* heap)
  100628. {
  100629. #ifdef WOLFSSL_SP_SMALL_STACK
  100630. sp_point_256* rt = NULL;
  100631. sp_digit* t = NULL;
  100632. #else
  100633. sp_point_256 rt[2];
  100634. sp_digit t[2 * 8 * 6];
  100635. #endif
  100636. sp_point_256* p = NULL;
  100637. int i;
  100638. int j;
  100639. int y;
  100640. int x;
  100641. int err = MP_OKAY;
  100642. (void)g;
  100643. /* Constant time used for cache attack resistance implementation. */
  100644. (void)ct;
  100645. (void)heap;
  100646. #ifdef WOLFSSL_SP_SMALL_STACK
  100647. rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  100648. DYNAMIC_TYPE_ECC);
  100649. if (rt == NULL)
  100650. err = MEMORY_E;
  100651. if (err == MP_OKAY) {
  100652. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  100653. DYNAMIC_TYPE_ECC);
  100654. if (t == NULL)
  100655. err = MEMORY_E;
  100656. }
  100657. #endif
  100658. if (err == MP_OKAY) {
  100659. p = rt + 1;
  100660. XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
  100661. XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
  100662. y = 0;
  100663. x = 63;
  100664. for (j=0; j<4; j++) {
  100665. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  100666. x += 64;
  100667. }
  100668. #ifndef WC_NO_CACHE_RESISTANT
  100669. if (ct) {
  100670. sp_256_get_entry_16_8(rt, table, y);
  100671. } else
  100672. #endif
  100673. {
  100674. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  100675. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  100676. }
  100677. rt->infinity = !y;
  100678. for (i=62; i>=0; i--) {
  100679. y = 0;
  100680. x = i;
  100681. for (j=0; j<4; j++) {
  100682. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  100683. x += 64;
  100684. }
  100685. sp_256_proj_point_dbl_8(rt, rt, t);
  100686. #ifndef WC_NO_CACHE_RESISTANT
  100687. if (ct) {
  100688. sp_256_get_entry_16_8(p, table, y);
  100689. }
  100690. else
  100691. #endif
  100692. {
  100693. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  100694. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  100695. }
  100696. p->infinity = !y;
  100697. sp_256_proj_point_add_qz1_8(rt, rt, p, t);
  100698. }
  100699. if (map != 0) {
  100700. sp_256_map_8(r, rt, t);
  100701. }
  100702. else {
  100703. XMEMCPY(r, rt, sizeof(sp_point_256));
  100704. }
  100705. }
  100706. #ifdef WOLFSSL_SP_SMALL_STACK
  100707. if (t != NULL)
  100708. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  100709. if (rt != NULL)
  100710. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  100711. #endif
  100712. return err;
  100713. }
  100714. #ifdef FP_ECC
  100715. #ifndef FP_ENTRIES
  100716. #define FP_ENTRIES 16
  100717. #endif
  100718. /* Cache entry - holds precomputation tables for a point. */
  100719. typedef struct sp_cache_256_t {
  100720. /* X ordinate of point that table was generated from. */
  100721. sp_digit x[8];
  100722. /* Y ordinate of point that table was generated from. */
  100723. sp_digit y[8];
  100724. /* Precomputation table for point. */
  100725. sp_table_entry_256 table[16];
  100726. /* Count of entries in table. */
  100727. uint32_t cnt;
  100728. /* Point and table set in entry. */
  100729. int set;
  100730. } sp_cache_256_t;
  100731. /* Cache of tables. */
  100732. static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
  100733. /* Index of last entry in cache. */
  100734. static THREAD_LS_T int sp_cache_256_last = -1;
  100735. /* Cache has been initialized. */
  100736. static THREAD_LS_T int sp_cache_256_inited = 0;
  100737. #ifndef HAVE_THREAD_LS
  100738. static volatile int initCacheMutex_256 = 0;
  100739. static wolfSSL_Mutex sp_cache_256_lock;
  100740. #endif
  100741. /* Get the cache entry for the point.
  100742. *
  100743. * g [in] Point scalar multiplying.
  100744. * cache [out] Cache table to use.
  100745. */
  100746. static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
  100747. {
  100748. int i;
  100749. int j;
  100750. uint32_t least;
  100751. if (sp_cache_256_inited == 0) {
  100752. for (i=0; i<FP_ENTRIES; i++) {
  100753. sp_cache_256[i].set = 0;
  100754. }
  100755. sp_cache_256_inited = 1;
  100756. }
  100757. /* Compare point with those in cache. */
  100758. for (i=0; i<FP_ENTRIES; i++) {
  100759. if (!sp_cache_256[i].set)
  100760. continue;
  100761. if (sp_256_cmp_equal_8(g->x, sp_cache_256[i].x) &
  100762. sp_256_cmp_equal_8(g->y, sp_cache_256[i].y)) {
  100763. sp_cache_256[i].cnt++;
  100764. break;
  100765. }
  100766. }
  100767. /* No match. */
  100768. if (i == FP_ENTRIES) {
  100769. /* Find empty entry. */
  100770. i = (sp_cache_256_last + 1) % FP_ENTRIES;
  100771. for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
  100772. if (!sp_cache_256[i].set) {
  100773. break;
  100774. }
  100775. }
  100776. /* Evict least used. */
  100777. if (i == sp_cache_256_last) {
  100778. least = sp_cache_256[0].cnt;
  100779. for (j=1; j<FP_ENTRIES; j++) {
  100780. if (sp_cache_256[j].cnt < least) {
  100781. i = j;
  100782. least = sp_cache_256[i].cnt;
  100783. }
  100784. }
  100785. }
  100786. XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
  100787. XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
  100788. sp_cache_256[i].set = 1;
  100789. sp_cache_256[i].cnt = 1;
  100790. }
  100791. *cache = &sp_cache_256[i];
  100792. sp_cache_256_last = i;
  100793. }
  100794. #endif /* FP_ECC */
  100795. /* Multiply the base point of P256 by the scalar and return the result.
  100796. * If map is true then convert result to affine coordinates.
  100797. *
  100798. * r Resulting point.
  100799. * g Point to multiply.
  100800. * k Scalar to multiply by.
  100801. * map Indicates whether to convert result to affine.
  100802. * ct Constant time required.
  100803. * heap Heap to use for allocation.
  100804. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  100805. */
  100806. static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g,
  100807. const sp_digit* k, int map, int ct, void* heap)
  100808. {
  100809. #ifndef FP_ECC
  100810. return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  100811. #else
  100812. #ifdef WOLFSSL_SP_SMALL_STACK
  100813. sp_digit* tmp;
  100814. #else
  100815. sp_digit tmp[2 * 8 * 6];
  100816. #endif
  100817. sp_cache_256_t* cache;
  100818. int err = MP_OKAY;
  100819. #ifdef WOLFSSL_SP_SMALL_STACK
  100820. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap, DYNAMIC_TYPE_ECC);
  100821. if (tmp == NULL) {
  100822. err = MEMORY_E;
  100823. }
  100824. #endif
  100825. #ifndef HAVE_THREAD_LS
  100826. if (err == MP_OKAY) {
  100827. if (initCacheMutex_256 == 0) {
  100828. wc_InitMutex(&sp_cache_256_lock);
  100829. initCacheMutex_256 = 1;
  100830. }
  100831. if (wc_LockMutex(&sp_cache_256_lock) != 0) {
  100832. err = BAD_MUTEX_E;
  100833. }
  100834. }
  100835. #endif /* HAVE_THREAD_LS */
  100836. if (err == MP_OKAY) {
  100837. sp_ecc_get_cache_256(g, &cache);
  100838. if (cache->cnt == 2)
  100839. sp_256_gen_stripe_table_8(g, cache->table, tmp, heap);
  100840. #ifndef HAVE_THREAD_LS
  100841. wc_UnLockMutex(&sp_cache_256_lock);
  100842. #endif /* HAVE_THREAD_LS */
  100843. if (cache->cnt < 2) {
  100844. err = sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  100845. }
  100846. else {
  100847. err = sp_256_ecc_mulmod_stripe_8(r, g, cache->table, k,
  100848. map, ct, heap);
  100849. }
  100850. }
  100851. #ifdef WOLFSSL_SP_SMALL_STACK
  100852. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  100853. #endif
  100854. return err;
  100855. #endif
  100856. }
  100857. #else
  100858. #ifdef FP_ECC
  100859. /* Generate the pre-computed table of points for the base point.
  100860. *
  100861. * width = 8
  100862. * 256 entries
  100863. * 32 bits between
  100864. *
  100865. * a The base point.
  100866. * table Place to store generated point data.
  100867. * tmp Temporary data.
  100868. * heap Heap to use for allocation.
  100869. */
  100870. static int sp_256_gen_stripe_table_8(const sp_point_256* a,
  100871. sp_table_entry_256* table, sp_digit* tmp, void* heap)
  100872. {
  100873. #ifdef WOLFSSL_SP_SMALL_STACK
  100874. sp_point_256* t = NULL;
  100875. #else
  100876. sp_point_256 t[3];
  100877. #endif
  100878. sp_point_256* s1 = NULL;
  100879. sp_point_256* s2 = NULL;
  100880. int i;
  100881. int j;
  100882. int err = MP_OKAY;
  100883. (void)heap;
  100884. #ifdef WOLFSSL_SP_SMALL_STACK
  100885. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
  100886. DYNAMIC_TYPE_ECC);
  100887. if (t == NULL)
  100888. err = MEMORY_E;
  100889. #endif
  100890. if (err == MP_OKAY) {
  100891. s1 = t + 1;
  100892. s2 = t + 2;
  100893. err = sp_256_mod_mul_norm_8(t->x, a->x, p256_mod);
  100894. }
  100895. if (err == MP_OKAY) {
  100896. err = sp_256_mod_mul_norm_8(t->y, a->y, p256_mod);
  100897. }
  100898. if (err == MP_OKAY) {
  100899. err = sp_256_mod_mul_norm_8(t->z, a->z, p256_mod);
  100900. }
  100901. if (err == MP_OKAY) {
  100902. t->infinity = 0;
  100903. sp_256_proj_to_affine_8(t, tmp);
  100904. XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
  100905. s1->infinity = 0;
  100906. XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
  100907. s2->infinity = 0;
  100908. /* table[0] = {0, 0, infinity} */
  100909. XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
  100910. /* table[1] = Affine version of 'a' in Montgomery form */
  100911. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  100912. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  100913. for (i=1; i<8; i++) {
  100914. sp_256_proj_point_dbl_n_8(t, 32, tmp);
  100915. sp_256_proj_to_affine_8(t, tmp);
  100916. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  100917. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  100918. }
  100919. for (i=1; i<8; i++) {
  100920. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  100921. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  100922. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  100923. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  100924. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  100925. sp_256_proj_point_add_qz1_8(t, s1, s2, tmp);
  100926. sp_256_proj_to_affine_8(t, tmp);
  100927. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  100928. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  100929. }
  100930. }
  100931. }
  100932. #ifdef WOLFSSL_SP_SMALL_STACK
  100933. if (t != NULL)
  100934. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  100935. #endif
  100936. return err;
  100937. }
  100938. #endif /* FP_ECC */
  100939. #ifndef WC_NO_CACHE_RESISTANT
  100940. /* Touch each possible entry that could be being copied.
  100941. *
  100942. * r Point to copy into.
  100943. * table Table - start of the entries to access
  100944. * idx Index of entry to retrieve.
  100945. */
  100946. static void sp_256_get_entry_256_8(sp_point_256* r,
  100947. const sp_table_entry_256* table, int idx)
  100948. {
  100949. int i;
  100950. sp_digit mask;
  100951. r->x[0] = 0;
  100952. r->x[1] = 0;
  100953. r->x[2] = 0;
  100954. r->x[3] = 0;
  100955. r->x[4] = 0;
  100956. r->x[5] = 0;
  100957. r->x[6] = 0;
  100958. r->x[7] = 0;
  100959. r->y[0] = 0;
  100960. r->y[1] = 0;
  100961. r->y[2] = 0;
  100962. r->y[3] = 0;
  100963. r->y[4] = 0;
  100964. r->y[5] = 0;
  100965. r->y[6] = 0;
  100966. r->y[7] = 0;
  100967. for (i = 1; i < 256; i++) {
  100968. mask = 0 - (i == idx);
  100969. r->x[0] |= mask & table[i].x[0];
  100970. r->x[1] |= mask & table[i].x[1];
  100971. r->x[2] |= mask & table[i].x[2];
  100972. r->x[3] |= mask & table[i].x[3];
  100973. r->x[4] |= mask & table[i].x[4];
  100974. r->x[5] |= mask & table[i].x[5];
  100975. r->x[6] |= mask & table[i].x[6];
  100976. r->x[7] |= mask & table[i].x[7];
  100977. r->y[0] |= mask & table[i].y[0];
  100978. r->y[1] |= mask & table[i].y[1];
  100979. r->y[2] |= mask & table[i].y[2];
  100980. r->y[3] |= mask & table[i].y[3];
  100981. r->y[4] |= mask & table[i].y[4];
  100982. r->y[5] |= mask & table[i].y[5];
  100983. r->y[6] |= mask & table[i].y[6];
  100984. r->y[7] |= mask & table[i].y[7];
  100985. }
  100986. }
  100987. #endif /* !WC_NO_CACHE_RESISTANT */
  100988. /* Multiply the point by the scalar and return the result.
  100989. * If map is true then convert result to affine coordinates.
  100990. *
  100991. * Stripe implementation.
  100992. * Pre-generated: 2^0, 2^32, ...
  100993. * Pre-generated: products of all combinations of above.
  100994. * 8 doubles and adds (with qz=1)
  100995. *
  100996. * r Resulting point.
  100997. * k Scalar to multiply by.
  100998. * table Pre-computed table.
  100999. * map Indicates whether to convert result to affine.
  101000. * ct Constant time required.
  101001. * heap Heap to use for allocation.
  101002. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101003. */
  101004. static int sp_256_ecc_mulmod_stripe_8(sp_point_256* r, const sp_point_256* g,
  101005. const sp_table_entry_256* table, const sp_digit* k, int map,
  101006. int ct, void* heap)
  101007. {
  101008. #ifdef WOLFSSL_SP_SMALL_STACK
  101009. sp_point_256* rt = NULL;
  101010. sp_digit* t = NULL;
  101011. #else
  101012. sp_point_256 rt[2];
  101013. sp_digit t[2 * 8 * 6];
  101014. #endif
  101015. sp_point_256* p = NULL;
  101016. int i;
  101017. int j;
  101018. int y;
  101019. int x;
  101020. int err = MP_OKAY;
  101021. (void)g;
  101022. /* Constant time used for cache attack resistance implementation. */
  101023. (void)ct;
  101024. (void)heap;
  101025. #ifdef WOLFSSL_SP_SMALL_STACK
  101026. rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  101027. DYNAMIC_TYPE_ECC);
  101028. if (rt == NULL)
  101029. err = MEMORY_E;
  101030. if (err == MP_OKAY) {
  101031. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  101032. DYNAMIC_TYPE_ECC);
  101033. if (t == NULL)
  101034. err = MEMORY_E;
  101035. }
  101036. #endif
  101037. if (err == MP_OKAY) {
  101038. p = rt + 1;
  101039. XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
  101040. XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
  101041. y = 0;
  101042. x = 31;
  101043. for (j=0; j<8; j++) {
  101044. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  101045. x += 32;
  101046. }
  101047. #ifndef WC_NO_CACHE_RESISTANT
  101048. if (ct) {
  101049. sp_256_get_entry_256_8(rt, table, y);
  101050. } else
  101051. #endif
  101052. {
  101053. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  101054. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  101055. }
  101056. rt->infinity = !y;
  101057. for (i=30; i>=0; i--) {
  101058. y = 0;
  101059. x = i;
  101060. for (j=0; j<8; j++) {
  101061. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  101062. x += 32;
  101063. }
  101064. sp_256_proj_point_dbl_8(rt, rt, t);
  101065. #ifndef WC_NO_CACHE_RESISTANT
  101066. if (ct) {
  101067. sp_256_get_entry_256_8(p, table, y);
  101068. }
  101069. else
  101070. #endif
  101071. {
  101072. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  101073. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  101074. }
  101075. p->infinity = !y;
  101076. sp_256_proj_point_add_qz1_8(rt, rt, p, t);
  101077. }
  101078. if (map != 0) {
  101079. sp_256_map_8(r, rt, t);
  101080. }
  101081. else {
  101082. XMEMCPY(r, rt, sizeof(sp_point_256));
  101083. }
  101084. }
  101085. #ifdef WOLFSSL_SP_SMALL_STACK
  101086. if (t != NULL)
  101087. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  101088. if (rt != NULL)
  101089. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  101090. #endif
  101091. return err;
  101092. }
  101093. #ifdef FP_ECC
  101094. #ifndef FP_ENTRIES
  101095. #define FP_ENTRIES 16
  101096. #endif
  101097. /* Cache entry - holds precomputation tables for a point. */
  101098. typedef struct sp_cache_256_t {
  101099. /* X ordinate of point that table was generated from. */
  101100. sp_digit x[8];
  101101. /* Y ordinate of point that table was generated from. */
  101102. sp_digit y[8];
  101103. /* Precomputation table for point. */
  101104. sp_table_entry_256 table[256];
  101105. /* Count of entries in table. */
  101106. uint32_t cnt;
  101107. /* Point and table set in entry. */
  101108. int set;
  101109. } sp_cache_256_t;
  101110. /* Cache of tables. */
  101111. static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
  101112. /* Index of last entry in cache. */
  101113. static THREAD_LS_T int sp_cache_256_last = -1;
  101114. /* Cache has been initialized. */
  101115. static THREAD_LS_T int sp_cache_256_inited = 0;
  101116. #ifndef HAVE_THREAD_LS
  101117. static volatile int initCacheMutex_256 = 0;
  101118. static wolfSSL_Mutex sp_cache_256_lock;
  101119. #endif
  101120. /* Get the cache entry for the point.
  101121. *
  101122. * g [in] Point scalar multiplying.
  101123. * cache [out] Cache table to use.
  101124. */
  101125. static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
  101126. {
  101127. int i;
  101128. int j;
  101129. uint32_t least;
  101130. if (sp_cache_256_inited == 0) {
  101131. for (i=0; i<FP_ENTRIES; i++) {
  101132. sp_cache_256[i].set = 0;
  101133. }
  101134. sp_cache_256_inited = 1;
  101135. }
  101136. /* Compare point with those in cache. */
  101137. for (i=0; i<FP_ENTRIES; i++) {
  101138. if (!sp_cache_256[i].set)
  101139. continue;
  101140. if (sp_256_cmp_equal_8(g->x, sp_cache_256[i].x) &
  101141. sp_256_cmp_equal_8(g->y, sp_cache_256[i].y)) {
  101142. sp_cache_256[i].cnt++;
  101143. break;
  101144. }
  101145. }
  101146. /* No match. */
  101147. if (i == FP_ENTRIES) {
  101148. /* Find empty entry. */
  101149. i = (sp_cache_256_last + 1) % FP_ENTRIES;
  101150. for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
  101151. if (!sp_cache_256[i].set) {
  101152. break;
  101153. }
  101154. }
  101155. /* Evict least used. */
  101156. if (i == sp_cache_256_last) {
  101157. least = sp_cache_256[0].cnt;
  101158. for (j=1; j<FP_ENTRIES; j++) {
  101159. if (sp_cache_256[j].cnt < least) {
  101160. i = j;
  101161. least = sp_cache_256[i].cnt;
  101162. }
  101163. }
  101164. }
  101165. XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
  101166. XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
  101167. sp_cache_256[i].set = 1;
  101168. sp_cache_256[i].cnt = 1;
  101169. }
  101170. *cache = &sp_cache_256[i];
  101171. sp_cache_256_last = i;
  101172. }
  101173. #endif /* FP_ECC */
  101174. /* Multiply the base point of P256 by the scalar and return the result.
  101175. * If map is true then convert result to affine coordinates.
  101176. *
  101177. * r Resulting point.
  101178. * g Point to multiply.
  101179. * k Scalar to multiply by.
  101180. * map Indicates whether to convert result to affine.
  101181. * ct Constant time required.
  101182. * heap Heap to use for allocation.
  101183. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101184. */
  101185. static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g,
  101186. const sp_digit* k, int map, int ct, void* heap)
  101187. {
  101188. #ifndef FP_ECC
  101189. return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  101190. #else
  101191. #ifdef WOLFSSL_SP_SMALL_STACK
  101192. sp_digit* tmp;
  101193. #else
  101194. sp_digit tmp[2 * 8 * 6];
  101195. #endif
  101196. sp_cache_256_t* cache;
  101197. int err = MP_OKAY;
  101198. #ifdef WOLFSSL_SP_SMALL_STACK
  101199. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap, DYNAMIC_TYPE_ECC);
  101200. if (tmp == NULL) {
  101201. err = MEMORY_E;
  101202. }
  101203. #endif
  101204. #ifndef HAVE_THREAD_LS
  101205. if (err == MP_OKAY) {
  101206. if (initCacheMutex_256 == 0) {
  101207. wc_InitMutex(&sp_cache_256_lock);
  101208. initCacheMutex_256 = 1;
  101209. }
  101210. if (wc_LockMutex(&sp_cache_256_lock) != 0) {
  101211. err = BAD_MUTEX_E;
  101212. }
  101213. }
  101214. #endif /* HAVE_THREAD_LS */
  101215. if (err == MP_OKAY) {
  101216. sp_ecc_get_cache_256(g, &cache);
  101217. if (cache->cnt == 2)
  101218. sp_256_gen_stripe_table_8(g, cache->table, tmp, heap);
  101219. #ifndef HAVE_THREAD_LS
  101220. wc_UnLockMutex(&sp_cache_256_lock);
  101221. #endif /* HAVE_THREAD_LS */
  101222. if (cache->cnt < 2) {
  101223. err = sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  101224. }
  101225. else {
  101226. err = sp_256_ecc_mulmod_stripe_8(r, g, cache->table, k,
  101227. map, ct, heap);
  101228. }
  101229. }
  101230. #ifdef WOLFSSL_SP_SMALL_STACK
  101231. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  101232. #endif
  101233. return err;
  101234. #endif
  101235. }
  101236. #endif /* WOLFSSL_SP_SMALL */
  101237. /* Multiply the point by the scalar and return the result.
  101238. * If map is true then convert result to affine coordinates.
  101239. *
  101240. * km Scalar to multiply by.
  101241. * p Point to multiply.
  101242. * r Resulting point.
  101243. * map Indicates whether to convert result to affine.
  101244. * heap Heap to use for allocation.
  101245. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101246. */
  101247. int sp_ecc_mulmod_256(const mp_int* km, const ecc_point* gm, ecc_point* r,
  101248. int map, void* heap)
  101249. {
  101250. #ifdef WOLFSSL_SP_SMALL_STACK
  101251. sp_point_256* point = NULL;
  101252. sp_digit* k = NULL;
  101253. #else
  101254. sp_point_256 point[1];
  101255. sp_digit k[8];
  101256. #endif
  101257. int err = MP_OKAY;
  101258. #ifdef WOLFSSL_SP_SMALL_STACK
  101259. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  101260. DYNAMIC_TYPE_ECC);
  101261. if (point == NULL)
  101262. err = MEMORY_E;
  101263. if (err == MP_OKAY) {
  101264. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  101265. DYNAMIC_TYPE_ECC);
  101266. if (k == NULL)
  101267. err = MEMORY_E;
  101268. }
  101269. #endif
  101270. if (err == MP_OKAY) {
  101271. sp_256_from_mp(k, 8, km);
  101272. sp_256_point_from_ecc_point_8(point, gm);
  101273. err = sp_256_ecc_mulmod_8(point, point, k, map, 1, heap);
  101274. }
  101275. if (err == MP_OKAY) {
  101276. err = sp_256_point_to_ecc_point_8(point, r);
  101277. }
  101278. #ifdef WOLFSSL_SP_SMALL_STACK
  101279. if (k != NULL)
  101280. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  101281. if (point != NULL)
  101282. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  101283. #endif
  101284. return err;
  101285. }
  101286. /* Multiply the point by the scalar, add point a and return the result.
  101287. * If map is true then convert result to affine coordinates.
  101288. *
  101289. * km Scalar to multiply by.
  101290. * p Point to multiply.
  101291. * am Point to add to scalar multiply result.
  101292. * inMont Point to add is in montgomery form.
  101293. * r Resulting point.
  101294. * map Indicates whether to convert result to affine.
  101295. * heap Heap to use for allocation.
  101296. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101297. */
  101298. int sp_ecc_mulmod_add_256(const mp_int* km, const ecc_point* gm,
  101299. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  101300. {
  101301. #ifdef WOLFSSL_SP_SMALL_STACK
  101302. sp_point_256* point = NULL;
  101303. sp_digit* k = NULL;
  101304. #else
  101305. sp_point_256 point[2];
  101306. sp_digit k[8 + 8 * 2 * 6];
  101307. #endif
  101308. sp_point_256* addP = NULL;
  101309. sp_digit* tmp = NULL;
  101310. int err = MP_OKAY;
  101311. #ifdef WOLFSSL_SP_SMALL_STACK
  101312. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  101313. DYNAMIC_TYPE_ECC);
  101314. if (point == NULL)
  101315. err = MEMORY_E;
  101316. if (err == MP_OKAY) {
  101317. k = (sp_digit*)XMALLOC(
  101318. sizeof(sp_digit) * (8 + 8 * 2 * 6), heap,
  101319. DYNAMIC_TYPE_ECC);
  101320. if (k == NULL)
  101321. err = MEMORY_E;
  101322. }
  101323. #endif
  101324. if (err == MP_OKAY) {
  101325. addP = point + 1;
  101326. tmp = k + 8;
  101327. sp_256_from_mp(k, 8, km);
  101328. sp_256_point_from_ecc_point_8(point, gm);
  101329. sp_256_point_from_ecc_point_8(addP, am);
  101330. }
  101331. if ((err == MP_OKAY) && (!inMont)) {
  101332. err = sp_256_mod_mul_norm_8(addP->x, addP->x, p256_mod);
  101333. }
  101334. if ((err == MP_OKAY) && (!inMont)) {
  101335. err = sp_256_mod_mul_norm_8(addP->y, addP->y, p256_mod);
  101336. }
  101337. if ((err == MP_OKAY) && (!inMont)) {
  101338. err = sp_256_mod_mul_norm_8(addP->z, addP->z, p256_mod);
  101339. }
  101340. if (err == MP_OKAY) {
  101341. err = sp_256_ecc_mulmod_8(point, point, k, 0, 0, heap);
  101342. }
  101343. if (err == MP_OKAY) {
  101344. sp_256_proj_point_add_8(point, point, addP, tmp);
  101345. if (map) {
  101346. sp_256_map_8(point, point, tmp);
  101347. }
  101348. err = sp_256_point_to_ecc_point_8(point, r);
  101349. }
  101350. #ifdef WOLFSSL_SP_SMALL_STACK
  101351. if (k != NULL)
  101352. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  101353. if (point != NULL)
  101354. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  101355. #endif
  101356. return err;
  101357. }
  101358. #ifdef WOLFSSL_SP_SMALL
  101359. /* Striping precomputation table.
  101360. * 4 points combined into a table of 16 points.
  101361. * Distance of 64 between points.
  101362. */
  101363. static const sp_table_entry_256 p256_table[16] = {
  101364. /* 0 */
  101365. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  101366. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  101367. /* 1 */
  101368. { { 0x18a9143c,0x79e730d4,0x5fedb601,0x75ba95fc,0x77622510,0x79fb732b,
  101369. 0xa53755c6,0x18905f76 },
  101370. { 0xce95560a,0xddf25357,0xba19e45c,0x8b4ab8e4,0xdd21f325,0xd2e88688,
  101371. 0x25885d85,0x8571ff18 } },
  101372. /* 2 */
  101373. { { 0x16a0d2bb,0x4f922fc5,0x1a623499,0x0d5cc16c,0x57c62c8b,0x9241cf3a,
  101374. 0xfd1b667f,0x2f5e6961 },
  101375. { 0xf5a01797,0x5c15c70b,0x60956192,0x3d20b44d,0x071fdb52,0x04911b37,
  101376. 0x8d6f0f7b,0xf648f916 } },
  101377. /* 3 */
  101378. { { 0xe137bbbc,0x9e566847,0x8a6a0bec,0xe434469e,0x79d73463,0xb1c42761,
  101379. 0x133d0015,0x5abe0285 },
  101380. { 0xc04c7dab,0x92aa837c,0x43260c07,0x573d9f4c,0x78e6cc37,0x0c931562,
  101381. 0x6b6f7383,0x94bb725b } },
  101382. /* 4 */
  101383. { { 0xbfe20925,0x62a8c244,0x8fdce867,0x91c19ac3,0xdd387063,0x5a96a5d5,
  101384. 0x21d324f6,0x61d587d4 },
  101385. { 0xa37173ea,0xe87673a2,0x53778b65,0x23848008,0x05bab43e,0x10f8441e,
  101386. 0x4621efbe,0xfa11fe12 } },
  101387. /* 5 */
  101388. { { 0x2cb19ffd,0x1c891f2b,0xb1923c23,0x01ba8d5b,0x8ac5ca8e,0xb6d03d67,
  101389. 0x1f13bedc,0x586eb04c },
  101390. { 0x27e8ed09,0x0c35c6e5,0x1819ede2,0x1e81a33c,0x56c652fa,0x278fd6c0,
  101391. 0x70864f11,0x19d5ac08 } },
  101392. /* 6 */
  101393. { { 0xd2b533d5,0x62577734,0xa1bdddc0,0x673b8af6,0xa79ec293,0x577e7c9a,
  101394. 0xc3b266b1,0xbb6de651 },
  101395. { 0xb65259b3,0xe7e9303a,0xd03a7480,0xd6a0afd3,0x9b3cfc27,0xc5ac83d1,
  101396. 0x5d18b99b,0x60b4619a } },
  101397. /* 7 */
  101398. { { 0x1ae5aa1c,0xbd6a38e1,0x49e73658,0xb8b7652b,0xee5f87ed,0x0b130014,
  101399. 0xaeebffcd,0x9d0f27b2 },
  101400. { 0x7a730a55,0xca924631,0xddbbc83a,0x9c955b2f,0xac019a71,0x07c1dfe0,
  101401. 0x356ec48d,0x244a566d } },
  101402. /* 8 */
  101403. { { 0xf4f8b16a,0x56f8410e,0xc47b266a,0x97241afe,0x6d9c87c1,0x0a406b8e,
  101404. 0xcd42ab1b,0x803f3e02 },
  101405. { 0x04dbec69,0x7f0309a8,0x3bbad05f,0xa83b85f7,0xad8e197f,0xc6097273,
  101406. 0x5067adc1,0xc097440e } },
  101407. /* 9 */
  101408. { { 0xc379ab34,0x846a56f2,0x841df8d1,0xa8ee068b,0x176c68ef,0x20314459,
  101409. 0x915f1f30,0xf1af32d5 },
  101410. { 0x5d75bd50,0x99c37531,0xf72f67bc,0x837cffba,0x48d7723f,0x0613a418,
  101411. 0xe2d41c8b,0x23d0f130 } },
  101412. /* 10 */
  101413. { { 0xd5be5a2b,0xed93e225,0x5934f3c6,0x6fe79983,0x22626ffc,0x43140926,
  101414. 0x7990216a,0x50bbb4d9 },
  101415. { 0xe57ec63e,0x378191c6,0x181dcdb2,0x65422c40,0x0236e0f6,0x41a8099b,
  101416. 0x01fe49c3,0x2b100118 } },
  101417. /* 11 */
  101418. { { 0x9b391593,0xfc68b5c5,0x598270fc,0xc385f5a2,0xd19adcbb,0x7144f3aa,
  101419. 0x83fbae0c,0xdd558999 },
  101420. { 0x74b82ff4,0x93b88b8e,0x71e734c9,0xd2e03c40,0x43c0322a,0x9a7a9eaf,
  101421. 0x149d6041,0xe6e4c551 } },
  101422. /* 12 */
  101423. { { 0x80ec21fe,0x5fe14bfe,0xc255be82,0xf6ce116a,0x2f4a5d67,0x98bc5a07,
  101424. 0xdb7e63af,0xfad27148 },
  101425. { 0x29ab05b3,0x90c0b6ac,0x4e251ae6,0x37a9a83c,0xc2aade7d,0x0a7dc875,
  101426. 0x9f0e1a84,0x77387de3 } },
  101427. /* 13 */
  101428. { { 0xa56c0dd7,0x1e9ecc49,0x46086c74,0xa5cffcd8,0xf505aece,0x8f7a1408,
  101429. 0xbef0c47e,0xb37b85c0 },
  101430. { 0xcc0e6a8f,0x3596b6e4,0x6b388f23,0xfd6d4bbf,0xc39cef4e,0xaba453fa,
  101431. 0xf9f628d5,0x9c135ac8 } },
  101432. /* 14 */
  101433. { { 0x95c8f8be,0x0a1c7294,0x3bf362bf,0x2961c480,0xdf63d4ac,0x9e418403,
  101434. 0x91ece900,0xc109f9cb },
  101435. { 0x58945705,0xc2d095d0,0xddeb85c0,0xb9083d96,0x7a40449b,0x84692b8d,
  101436. 0x2eee1ee1,0x9bc3344f } },
  101437. /* 15 */
  101438. { { 0x42913074,0x0d5ae356,0x48a542b1,0x55491b27,0xb310732a,0x469ca665,
  101439. 0x5f1a4cc1,0x29591d52 },
  101440. { 0xb84f983f,0xe76f5b6b,0x9f5f84e1,0xbe7eef41,0x80baa189,0x1200d496,
  101441. 0x18ef332c,0x6376551f } },
  101442. };
  101443. /* Multiply the base point of P256 by the scalar and return the result.
  101444. * If map is true then convert result to affine coordinates.
  101445. *
  101446. * Stripe implementation.
  101447. * Pre-generated: 2^0, 2^64, ...
  101448. * Pre-generated: products of all combinations of above.
  101449. * 4 doubles and adds (with qz=1)
  101450. *
  101451. * r Resulting point.
  101452. * k Scalar to multiply by.
  101453. * map Indicates whether to convert result to affine.
  101454. * ct Constant time required.
  101455. * heap Heap to use for allocation.
  101456. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101457. */
  101458. static int sp_256_ecc_mulmod_base_8(sp_point_256* r, const sp_digit* k,
  101459. int map, int ct, void* heap)
  101460. {
  101461. return sp_256_ecc_mulmod_stripe_8(r, &p256_base, p256_table,
  101462. k, map, ct, heap);
  101463. }
  101464. #else
  101465. /* Striping precomputation table.
  101466. * 8 points combined into a table of 256 points.
  101467. * Distance of 32 between points.
  101468. */
  101469. static const sp_table_entry_256 p256_table[256] = {
  101470. /* 0 */
  101471. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  101472. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  101473. /* 1 */
  101474. { { 0x18a9143c,0x79e730d4,0x5fedb601,0x75ba95fc,0x77622510,0x79fb732b,
  101475. 0xa53755c6,0x18905f76 },
  101476. { 0xce95560a,0xddf25357,0xba19e45c,0x8b4ab8e4,0xdd21f325,0xd2e88688,
  101477. 0x25885d85,0x8571ff18 } },
  101478. /* 2 */
  101479. { { 0x4147519a,0x20288602,0x26b372f0,0xd0981eac,0xa785ebc8,0xa9d4a7ca,
  101480. 0xdbdf58e9,0xd953c50d },
  101481. { 0xfd590f8f,0x9d6361cc,0x44e6c917,0x72e9626b,0x22eb64cf,0x7fd96110,
  101482. 0x9eb288f3,0x863ebb7e } },
  101483. /* 3 */
  101484. { { 0x5cdb6485,0x7856b623,0x2f0a2f97,0x808f0ea2,0x4f7e300b,0x3e68d954,
  101485. 0xb5ff80a0,0x00076055 },
  101486. { 0x838d2010,0x7634eb9b,0x3243708a,0x54014fbb,0x842a6606,0xe0e47d39,
  101487. 0x34373ee0,0x83087761 } },
  101488. /* 4 */
  101489. { { 0x16a0d2bb,0x4f922fc5,0x1a623499,0x0d5cc16c,0x57c62c8b,0x9241cf3a,
  101490. 0xfd1b667f,0x2f5e6961 },
  101491. { 0xf5a01797,0x5c15c70b,0x60956192,0x3d20b44d,0x071fdb52,0x04911b37,
  101492. 0x8d6f0f7b,0xf648f916 } },
  101493. /* 5 */
  101494. { { 0xe137bbbc,0x9e566847,0x8a6a0bec,0xe434469e,0x79d73463,0xb1c42761,
  101495. 0x133d0015,0x5abe0285 },
  101496. { 0xc04c7dab,0x92aa837c,0x43260c07,0x573d9f4c,0x78e6cc37,0x0c931562,
  101497. 0x6b6f7383,0x94bb725b } },
  101498. /* 6 */
  101499. { { 0x720f141c,0xbbf9b48f,0x2df5bc74,0x6199b3cd,0x411045c4,0xdc3f6129,
  101500. 0x2f7dc4ef,0xcdd6bbcb },
  101501. { 0xeaf436fd,0xcca6700b,0xb99326be,0x6f647f6d,0x014f2522,0x0c0fa792,
  101502. 0x4bdae5f6,0xa361bebd } },
  101503. /* 7 */
  101504. { { 0x597c13c7,0x28aa2558,0x50b7c3e1,0xc38d635f,0xf3c09d1d,0x07039aec,
  101505. 0xc4b5292c,0xba12ca09 },
  101506. { 0x59f91dfd,0x9e408fa4,0xceea07fb,0x3af43b66,0x9d780b29,0x1eceb089,
  101507. 0x701fef4b,0x53ebb99d } },
  101508. /* 8 */
  101509. { { 0xb0e63d34,0x4fe7ee31,0xa9e54fab,0xf4600572,0xd5e7b5a4,0xc0493334,
  101510. 0x06d54831,0x8589fb92 },
  101511. { 0x6583553a,0xaa70f5cc,0xe25649e5,0x0879094a,0x10044652,0xcc904507,
  101512. 0x02541c4f,0xebb0696d } },
  101513. /* 9 */
  101514. { { 0xac1647c5,0x4616ca15,0xc4cf5799,0xb8127d47,0x764dfbac,0xdc666aa3,
  101515. 0xd1b27da3,0xeb2820cb },
  101516. { 0x6a87e008,0x9406f8d8,0x922378f3,0xd87dfa9d,0x80ccecb2,0x56ed2e42,
  101517. 0x55a7da1d,0x1f28289b } },
  101518. /* 10 */
  101519. { { 0x3b89da99,0xabbaa0c0,0xb8284022,0xa6f2d79e,0xb81c05e8,0x27847862,
  101520. 0x05e54d63,0x337a4b59 },
  101521. { 0x21f7794a,0x3c67500d,0x7d6d7f61,0x207005b7,0x04cfd6e8,0x0a5a3781,
  101522. 0xf4c2fbd6,0x0d65e0d5 } },
  101523. /* 11 */
  101524. { { 0xb5275d38,0xd9d09bbe,0x0be0a358,0x4268a745,0x973eb265,0xf0762ff4,
  101525. 0x52f4a232,0xc23da242 },
  101526. { 0x0b94520c,0x5da1b84f,0xb05bd78e,0x09666763,0x94d29ea1,0x3a4dcb86,
  101527. 0xc790cff1,0x19de3b8c } },
  101528. /* 12 */
  101529. { { 0x26c5fe04,0x183a716c,0x3bba1bdb,0x3b28de0b,0xa4cb712c,0x7432c586,
  101530. 0x91fccbfd,0xe34dcbd4 },
  101531. { 0xaaa58403,0xb408d46b,0x82e97a53,0x9a697486,0x36aaa8af,0x9e390127,
  101532. 0x7b4e0f7f,0xe7641f44 } },
  101533. /* 13 */
  101534. { { 0xdf64ba59,0x7d753941,0x0b0242fc,0xd33f10ec,0xa1581859,0x4f06dfc6,
  101535. 0x052a57bf,0x4a12df57 },
  101536. { 0x9439dbd0,0xbfa6338f,0xbde53e1f,0xd3c24bd4,0x21f1b314,0xfd5e4ffa,
  101537. 0xbb5bea46,0x6af5aa93 } },
  101538. /* 14 */
  101539. { { 0x10c91999,0xda10b699,0x2a580491,0x0a24b440,0xb8cc2090,0x3e0094b4,
  101540. 0x66a44013,0x5fe3475a },
  101541. { 0xf93e7b4b,0xb0f8cabd,0x7c23f91a,0x292b501a,0xcd1e6263,0x42e889ae,
  101542. 0xecfea916,0xb544e308 } },
  101543. /* 15 */
  101544. { { 0x16ddfdce,0x6478c6e9,0xf89179e6,0x2c329166,0x4d4e67e1,0x4e8d6e76,
  101545. 0xa6b0c20b,0xe0b6b2bd },
  101546. { 0xbb7efb57,0x0d312df2,0x790c4007,0x1aac0dde,0x679bc944,0xf90336ad,
  101547. 0x25a63774,0x71c023de } },
  101548. /* 16 */
  101549. { { 0xbfe20925,0x62a8c244,0x8fdce867,0x91c19ac3,0xdd387063,0x5a96a5d5,
  101550. 0x21d324f6,0x61d587d4 },
  101551. { 0xa37173ea,0xe87673a2,0x53778b65,0x23848008,0x05bab43e,0x10f8441e,
  101552. 0x4621efbe,0xfa11fe12 } },
  101553. /* 17 */
  101554. { { 0x2cb19ffd,0x1c891f2b,0xb1923c23,0x01ba8d5b,0x8ac5ca8e,0xb6d03d67,
  101555. 0x1f13bedc,0x586eb04c },
  101556. { 0x27e8ed09,0x0c35c6e5,0x1819ede2,0x1e81a33c,0x56c652fa,0x278fd6c0,
  101557. 0x70864f11,0x19d5ac08 } },
  101558. /* 18 */
  101559. { { 0x309a4e1f,0x1e99f581,0xe9270074,0xab7de71b,0xefd28d20,0x26a5ef0b,
  101560. 0x7f9c563f,0xe7c0073f },
  101561. { 0x0ef59f76,0x1f6d663a,0x20fcb050,0x669b3b54,0x7a6602d4,0xc08c1f7a,
  101562. 0xc65b3c0a,0xe08504fe } },
  101563. /* 19 */
  101564. { { 0xa031b3ca,0xf098f68d,0xe6da6d66,0x6d1cab9e,0x94f246e8,0x5bfd81fa,
  101565. 0x5b0996b4,0x78f01882 },
  101566. { 0x3a25787f,0xb7eefde4,0x1dccac9b,0x8016f80d,0xb35bfc36,0x0cea4877,
  101567. 0x7e94747a,0x43a773b8 } },
  101568. /* 20 */
  101569. { { 0xd2b533d5,0x62577734,0xa1bdddc0,0x673b8af6,0xa79ec293,0x577e7c9a,
  101570. 0xc3b266b1,0xbb6de651 },
  101571. { 0xb65259b3,0xe7e9303a,0xd03a7480,0xd6a0afd3,0x9b3cfc27,0xc5ac83d1,
  101572. 0x5d18b99b,0x60b4619a } },
  101573. /* 21 */
  101574. { { 0x1ae5aa1c,0xbd6a38e1,0x49e73658,0xb8b7652b,0xee5f87ed,0x0b130014,
  101575. 0xaeebffcd,0x9d0f27b2 },
  101576. { 0x7a730a55,0xca924631,0xddbbc83a,0x9c955b2f,0xac019a71,0x07c1dfe0,
  101577. 0x356ec48d,0x244a566d } },
  101578. /* 22 */
  101579. { { 0xeacf1f96,0x6db0394a,0x024c271c,0x9f2122a9,0x82cbd3b9,0x2626ac1b,
  101580. 0x3581ef69,0x45e58c87 },
  101581. { 0xa38f9dbc,0xd3ff479d,0xe888a040,0xa8aaf146,0x46e0bed7,0x945adfb2,
  101582. 0xc1e4b7a4,0xc040e21c } },
  101583. /* 23 */
  101584. { { 0x6f8117b6,0x847af000,0x73a35433,0x651969ff,0x1d9475eb,0x482b3576,
  101585. 0x682c6ec7,0x1cdf5c97 },
  101586. { 0x11f04839,0x7db775b4,0x48de1698,0x7dbeacf4,0xb70b3219,0xb2921dd1,
  101587. 0xa92dff3d,0x046755f8 } },
  101588. /* 24 */
  101589. { { 0xbce8ffcd,0xcc8ac5d2,0x2fe61a82,0x0d53c48b,0x7202d6c7,0xf6f16172,
  101590. 0x3b83a5f3,0x046e5e11 },
  101591. { 0xd8007f01,0xe7b8ff64,0x5af43183,0x7fb1ef12,0x35e1a03c,0x045c5ea6,
  101592. 0x303d005b,0x6e0106c3 } },
  101593. /* 25 */
  101594. { { 0x88dd73b1,0x48c73584,0x995ed0d9,0x7670708f,0xc56a2ab7,0x38385ea8,
  101595. 0xe901cf1f,0x442594ed },
  101596. { 0x12d4b65b,0xf8faa2c9,0x96c90c37,0x94c2343b,0x5e978d1f,0xd326e4a1,
  101597. 0x4c2ee68e,0xa796fa51 } },
  101598. /* 26 */
  101599. { { 0x823addd7,0x359fb604,0xe56693b3,0x9e2a6183,0x3cbf3c80,0xf885b78e,
  101600. 0xc69766e9,0xe4ad2da9 },
  101601. { 0x8e048a61,0x357f7f42,0xc092d9a0,0x082d198c,0xc03ed8ef,0xfc3a1af4,
  101602. 0xc37b5143,0xc5e94046 } },
  101603. /* 27 */
  101604. { { 0x2be75f9e,0x476a538c,0xcb123a78,0x6fd1a9e8,0xb109c04b,0xd85e4df0,
  101605. 0xdb464747,0x63283daf },
  101606. { 0xbaf2df15,0xce728cf7,0x0ad9a7f4,0xe592c455,0xe834bcc3,0xfab226ad,
  101607. 0x1981a938,0x68bd19ab } },
  101608. /* 28 */
  101609. { { 0x1887d659,0xc08ead51,0xb359305a,0x3374d5f4,0xcfe74fe3,0x96986981,
  101610. 0x3c6fdfd6,0x495292f5 },
  101611. { 0x1acec896,0x4a878c9e,0xec5b4484,0xd964b210,0x664d60a7,0x6696f7e2,
  101612. 0x26036837,0x0ec7530d } },
  101613. /* 29 */
  101614. { { 0xad2687bb,0x2da13a05,0xf32e21fa,0xa1f83b6a,0x1dd4607b,0x390f5ef5,
  101615. 0x64863f0b,0x0f6207a6 },
  101616. { 0x0f138233,0xbd67e3bb,0x272aa718,0xdd66b96c,0x26ec88ae,0x8ed00407,
  101617. 0x08ed6dcf,0xff0db072 } },
  101618. /* 30 */
  101619. { { 0x4c95d553,0x749fa101,0x5d680a8a,0xa44052fd,0xff3b566f,0x183b4317,
  101620. 0x88740ea3,0x313b513c },
  101621. { 0x08d11549,0xb402e2ac,0xb4dee21c,0x071ee10b,0x47f2320e,0x26b987dd,
  101622. 0x86f19f81,0x2d3abcf9 } },
  101623. /* 31 */
  101624. { { 0x815581a2,0x4c288501,0x632211af,0x9a0a6d56,0x0cab2e99,0x19ba7a0f,
  101625. 0xded98cdf,0xc036fa10 },
  101626. { 0xc1fbd009,0x29ae08ba,0x06d15816,0x0b68b190,0x9b9e0d8f,0xc2eb3277,
  101627. 0xb6d40194,0xa6b2a2c4 } },
  101628. /* 32 */
  101629. { { 0x6d3549cf,0xd433e50f,0xfacd665e,0x6f33696f,0xce11fcb4,0x695bfdac,
  101630. 0xaf7c9860,0x810ee252 },
  101631. { 0x7159bb2c,0x65450fe1,0x758b357b,0xf7dfbebe,0xd69fea72,0x2b057e74,
  101632. 0x92731745,0xd485717a } },
  101633. /* 33 */
  101634. { { 0xf0cb5a98,0x11741a8a,0x1f3110bf,0xd3da8f93,0xab382adf,0x1994e2cb,
  101635. 0x2f9a604e,0x6a6045a7 },
  101636. { 0xa2b2411d,0x170c0d3f,0x510e96e0,0xbe0eb83e,0x8865b3cc,0x3bcc9f73,
  101637. 0xf9e15790,0xd3e45cfa } },
  101638. /* 34 */
  101639. { { 0xe83f7669,0xce1f69bb,0x72877d6b,0x09f8ae82,0x3244278d,0x9548ae54,
  101640. 0xe3c2c19c,0x207755de },
  101641. { 0x6fef1945,0x87bd61d9,0xb12d28c3,0x18813cef,0x72df64aa,0x9fbcd1d6,
  101642. 0x7154b00d,0x48dc5ee5 } },
  101643. /* 35 */
  101644. { { 0xf7e5a199,0x123790bf,0x989ccbb7,0xe0efb8cf,0x0a519c79,0xc27a2bfe,
  101645. 0xdff6f445,0xf2fb0aed },
  101646. { 0xf0b5025f,0x41c09575,0x40fa9f22,0x550543d7,0x380bfbd0,0x8fa3c8ad,
  101647. 0xdb28d525,0xa13e9015 } },
  101648. /* 36 */
  101649. { { 0xa2b65cbc,0xf9f7a350,0x2a464226,0x0b04b972,0xe23f07a1,0x265ce241,
  101650. 0x1497526f,0x2bf0d6b0 },
  101651. { 0x4b216fb7,0xd3d4dd3f,0xfbdda26a,0xf7d7b867,0x6708505c,0xaeb7b83f,
  101652. 0x162fe89f,0x42a94a5a } },
  101653. /* 37 */
  101654. { { 0xeaadf191,0x5846ad0b,0x25a268d7,0x0f8a4890,0x494dc1f6,0xe8603050,
  101655. 0xc65ede3d,0x2c2dd969 },
  101656. { 0x93849c17,0x6d02171d,0x1da250dd,0x460488ba,0x3c3a5485,0x4810c706,
  101657. 0x42c56dbc,0xf437fa1f } },
  101658. /* 38 */
  101659. { { 0x4a0f7dab,0x6aa0d714,0x1776e9ac,0x0f049793,0xf5f39786,0x52c0a050,
  101660. 0x54707aa8,0xaaf45b33 },
  101661. { 0xc18d364a,0x85e37c33,0x3e497165,0xd40b9b06,0x15ec5444,0xf4171681,
  101662. 0xf4f272bc,0xcdf6310d } },
  101663. /* 39 */
  101664. { { 0x8ea8b7ef,0x7473c623,0x85bc2287,0x08e93518,0x2bda8e34,0x41956772,
  101665. 0xda9e2ff2,0xf0d008ba },
  101666. { 0x2414d3b1,0x2912671d,0xb019ea76,0xb3754985,0x453bcbdb,0x5c61b96d,
  101667. 0xca887b8b,0x5bd5c2f5 } },
  101668. /* 40 */
  101669. { { 0xf49a3154,0xef0f469e,0x6e2b2e9a,0x3e85a595,0xaa924a9c,0x45aaec1e,
  101670. 0xa09e4719,0xaa12dfc8 },
  101671. { 0x4df69f1d,0x26f27227,0xa2ff5e73,0xe0e4c82c,0xb7a9dd44,0xb9d8ce73,
  101672. 0xe48ca901,0x6c036e73 } },
  101673. /* 41 */
  101674. { { 0x0f6e3138,0x5cfae12a,0x25ad345a,0x6966ef00,0x45672bc5,0x8993c64b,
  101675. 0x96afbe24,0x292ff658 },
  101676. { 0x5e213402,0xd5250d44,0x4392c9fe,0xf6580e27,0xda1c72e8,0x097b397f,
  101677. 0x311b7276,0x644e0c90 } },
  101678. /* 42 */
  101679. { { 0xa47153f0,0xe1e421e1,0x920418c9,0xb86c3b79,0x705d7672,0x93bdce87,
  101680. 0xcab79a77,0xf25ae793 },
  101681. { 0x6d869d0c,0x1f3194a3,0x4986c264,0x9d55c882,0x096e945e,0x49fb5ea3,
  101682. 0x13db0a3e,0x39b8e653 } },
  101683. /* 43 */
  101684. { { 0xb6fd2e59,0x37754200,0x9255c98f,0x35e2c066,0x0e2a5739,0xd9dab21a,
  101685. 0x0f19db06,0x39122f2f },
  101686. { 0x03cad53c,0xcfbce1e0,0xe65c17e3,0x225b2c0f,0x9aa13877,0x72baf1d2,
  101687. 0xce80ff8d,0x8de80af8 } },
  101688. /* 44 */
  101689. { { 0x207bbb76,0xafbea8d9,0x21782758,0x921c7e7c,0x1c0436b1,0xdfa2b74b,
  101690. 0x2e368c04,0x87194906 },
  101691. { 0xa3993df5,0xb5f928bb,0xf3b3d26a,0x639d75b5,0x85b55050,0x011aa78a,
  101692. 0x5b74fde1,0xfc315e6a } },
  101693. /* 45 */
  101694. { { 0xe8d6ecfa,0x561fd41a,0x1aec7f86,0x5f8c44f6,0x4924741d,0x98452a7b,
  101695. 0xee389088,0xe6d4a7ad },
  101696. { 0x4593c75d,0x60552ed1,0xdd271162,0x70a70da4,0x7ba2c7db,0xd2aede93,
  101697. 0x9be2ae57,0x35dfaf9a } },
  101698. /* 46 */
  101699. { { 0xaa736636,0x6b956fcd,0xae2cab7e,0x09f51d97,0x0f349966,0xfb10bf41,
  101700. 0x1c830d2b,0x1da5c7d7 },
  101701. { 0x3cce6825,0x5c41e483,0xf9573c3b,0x15ad118f,0xf23036b8,0xa28552c7,
  101702. 0xdbf4b9d6,0x7077c0fd } },
  101703. /* 47 */
  101704. { { 0x46b9661c,0xbf63ff8d,0x0d2cfd71,0xa1dfd36b,0xa847f8f7,0x0373e140,
  101705. 0xe50efe44,0x53a8632e },
  101706. { 0x696d8051,0x0976ff68,0xc74f468a,0xdaec0c95,0x5e4e26bd,0x62994dc3,
  101707. 0x34e1fcc1,0x028ca76d } },
  101708. /* 48 */
  101709. { { 0xfc9877ee,0xd11d47dc,0x801d0002,0xc8b36210,0x54c260b6,0xd002c117,
  101710. 0x6962f046,0x04c17cd8 },
  101711. { 0xb0daddf5,0x6d9bd094,0x24ce55c0,0xbea23575,0x72da03b5,0x663356e6,
  101712. 0xfed97474,0xf7ba4de9 } },
  101713. /* 49 */
  101714. { { 0xebe1263f,0xd0dbfa34,0x71ae7ce6,0x55763735,0x82a6f523,0xd2440553,
  101715. 0x52131c41,0xe31f9600 },
  101716. { 0xea6b6ec6,0xd1bb9216,0x73c2fc44,0x37a1d12e,0x89d0a294,0xc10e7eac,
  101717. 0xce34d47b,0xaa3a6259 } },
  101718. /* 50 */
  101719. { { 0x36f3dcd3,0xfbcf9df5,0xd2bf7360,0x6ceded50,0xdf504f5b,0x491710fa,
  101720. 0x7e79daee,0x2398dd62 },
  101721. { 0x6d09569e,0xcf4705a3,0x5149f769,0xea0619bb,0x35f6034c,0xff9c0377,
  101722. 0x1c046210,0x5717f5b2 } },
  101723. /* 51 */
  101724. { { 0x21dd895e,0x9fe229c9,0x40c28451,0x8e518500,0x1d637ecd,0xfa13d239,
  101725. 0x0e3c28de,0x660a2c56 },
  101726. { 0xd67fcbd0,0x9cca88ae,0x0ea9f096,0xc8472478,0x72e92b4d,0x32b2f481,
  101727. 0x4f522453,0x624ee54c } },
  101728. /* 52 */
  101729. { { 0xd897eccc,0x09549ce4,0x3f9880aa,0x4d49d1d9,0x043a7c20,0x723c2423,
  101730. 0x92bdfbc0,0x4f392afb },
  101731. { 0x7de44fd9,0x6969f8fa,0x57b32156,0xb66cfbe4,0x368ebc3c,0xdb2fa803,
  101732. 0xccdb399c,0x8a3e7977 } },
  101733. /* 53 */
  101734. { { 0x06c4b125,0xdde1881f,0xf6e3ca8c,0xae34e300,0x5c7a13e9,0xef6999de,
  101735. 0x70c24404,0x3888d023 },
  101736. { 0x44f91081,0x76280356,0x5f015504,0x3d9fcf61,0x632cd36e,0x1827edc8,
  101737. 0x18102336,0xa5e62e47 } },
  101738. /* 54 */
  101739. { { 0x2facd6c8,0x1a825ee3,0x54bcbc66,0x699c6354,0x98df9931,0x0ce3edf7,
  101740. 0x466a5adc,0x2c4768e6 },
  101741. { 0x90a64bc9,0xb346ff8c,0xe4779f5c,0x630a6020,0xbc05e884,0xd949d064,
  101742. 0xf9e652a0,0x7b5e6441 } },
  101743. /* 55 */
  101744. { { 0x1d28444a,0x2169422c,0xbe136a39,0xe996c5d8,0xfb0c7fce,0x2387afe5,
  101745. 0x0c8d744a,0xb8af73cb },
  101746. { 0x338b86fd,0x5fde83aa,0xa58a5cff,0xfee3f158,0x20ac9433,0xc9ee8f6f,
  101747. 0x7f3f0895,0xa036395f } },
  101748. /* 56 */
  101749. { { 0xa10f7770,0x8c73c6bb,0xa12a0e24,0xa6f16d81,0x51bc2b9f,0x100df682,
  101750. 0x875fb533,0x4be36b01 },
  101751. { 0x9fb56dbb,0x9226086e,0x07e7a4f8,0x306fef8b,0x66d52f20,0xeeaccc05,
  101752. 0x1bdc00c0,0x8cbc9a87 } },
  101753. /* 57 */
  101754. { { 0xc0dac4ab,0xe131895c,0x712ff112,0xa874a440,0x6a1cee57,0x6332ae7c,
  101755. 0x0c0835f8,0x44e7553e },
  101756. { 0x7734002d,0x6d503fff,0x0b34425c,0x9d35cb8b,0x0e8738b5,0x95f70276,
  101757. 0x5eb8fc18,0x470a683a } },
  101758. /* 58 */
  101759. { { 0x90513482,0x81b761dc,0x01e9276a,0x0287202a,0x0ce73083,0xcda441ee,
  101760. 0xc63dc6ef,0x16410690 },
  101761. { 0x6d06a2ed,0xf5034a06,0x189b100b,0xdd4d7745,0xab8218c9,0xd914ae72,
  101762. 0x7abcbb4f,0xd73479fd } },
  101763. /* 59 */
  101764. { { 0x5ad4c6e5,0x7edefb16,0x5b06d04d,0x262cf08f,0x8575cb14,0x12ed5bb1,
  101765. 0x0771666b,0x816469e3 },
  101766. { 0x561e291e,0xd7ab9d79,0xc1de1661,0xeb9daf22,0x135e0513,0xf49827eb,
  101767. 0xf0dd3f9c,0x0a36dd23 } },
  101768. /* 60 */
  101769. { { 0x41d5533c,0x098d32c7,0x8684628f,0x7c5f5a9e,0xe349bd11,0x39a228ad,
  101770. 0xfdbab118,0xe331dfd6 },
  101771. { 0x6bcc6ed8,0x5100ab68,0xef7a260e,0x7160c3bd,0xbce850d7,0x9063d9a7,
  101772. 0x492e3389,0xd3b4782a } },
  101773. /* 61 */
  101774. { { 0xf3821f90,0xa149b6e8,0x66eb7aad,0x92edd9ed,0x1a013116,0x0bb66953,
  101775. 0x4c86a5bd,0x7281275a },
  101776. { 0xd3ff47e5,0x503858f7,0x61016441,0x5e1616bc,0x7dfd9bb1,0x62b0f11a,
  101777. 0xce145059,0x2c062e7e } },
  101778. /* 62 */
  101779. { { 0x0159ac2e,0xa76f996f,0xcbdb2713,0x281e7736,0x08e46047,0x2ad6d288,
  101780. 0x2c4e7ef1,0x282a35f9 },
  101781. { 0xc0ce5cd2,0x9c354b1e,0x1379c229,0xcf99efc9,0x3e82c11e,0x992caf38,
  101782. 0x554d2abd,0xc71cd513 } },
  101783. /* 63 */
  101784. { { 0x09b578f4,0x4885de9c,0xe3affa7a,0x1884e258,0x59182f1f,0x8f76b1b7,
  101785. 0xcf47f3a3,0xc50f6740 },
  101786. { 0x374b68ea,0xa9c4adf3,0x69965fe2,0xa406f323,0x85a53050,0x2f86a222,
  101787. 0x212958dc,0xb9ecb3a7 } },
  101788. /* 64 */
  101789. { { 0xf4f8b16a,0x56f8410e,0xc47b266a,0x97241afe,0x6d9c87c1,0x0a406b8e,
  101790. 0xcd42ab1b,0x803f3e02 },
  101791. { 0x04dbec69,0x7f0309a8,0x3bbad05f,0xa83b85f7,0xad8e197f,0xc6097273,
  101792. 0x5067adc1,0xc097440e } },
  101793. /* 65 */
  101794. { { 0xc379ab34,0x846a56f2,0x841df8d1,0xa8ee068b,0x176c68ef,0x20314459,
  101795. 0x915f1f30,0xf1af32d5 },
  101796. { 0x5d75bd50,0x99c37531,0xf72f67bc,0x837cffba,0x48d7723f,0x0613a418,
  101797. 0xe2d41c8b,0x23d0f130 } },
  101798. /* 66 */
  101799. { { 0xf41500d9,0x857ab6ed,0xfcbeada8,0x0d890ae5,0x89725951,0x52fe8648,
  101800. 0xc0a3fadd,0xb0288dd6 },
  101801. { 0x650bcb08,0x85320f30,0x695d6e16,0x71af6313,0xb989aa76,0x31f520a7,
  101802. 0xf408c8d2,0xffd3724f } },
  101803. /* 67 */
  101804. { { 0xb458e6cb,0x53968e64,0x317a5d28,0x992dad20,0x7aa75f56,0x3814ae0b,
  101805. 0xd78c26df,0xf5590f4a },
  101806. { 0xcf0ba55a,0x0fc24bd3,0x0c778bae,0x0fc4724a,0x683b674a,0x1ce9864f,
  101807. 0xf6f74a20,0x18d6da54 } },
  101808. /* 68 */
  101809. { { 0xd5be5a2b,0xed93e225,0x5934f3c6,0x6fe79983,0x22626ffc,0x43140926,
  101810. 0x7990216a,0x50bbb4d9 },
  101811. { 0xe57ec63e,0x378191c6,0x181dcdb2,0x65422c40,0x0236e0f6,0x41a8099b,
  101812. 0x01fe49c3,0x2b100118 } },
  101813. /* 69 */
  101814. { { 0x9b391593,0xfc68b5c5,0x598270fc,0xc385f5a2,0xd19adcbb,0x7144f3aa,
  101815. 0x83fbae0c,0xdd558999 },
  101816. { 0x74b82ff4,0x93b88b8e,0x71e734c9,0xd2e03c40,0x43c0322a,0x9a7a9eaf,
  101817. 0x149d6041,0xe6e4c551 } },
  101818. /* 70 */
  101819. { { 0x1e9af288,0x55f655bb,0xf7ada931,0x647e1a64,0xcb2820e5,0x43697e4b,
  101820. 0x07ed56ff,0x51e00db1 },
  101821. { 0x771c327e,0x43d169b8,0x4a96c2ad,0x29cdb20b,0x3deb4779,0xc07d51f5,
  101822. 0x49829177,0xe22f4241 } },
  101823. /* 71 */
  101824. { { 0x635f1abb,0xcd45e8f4,0x68538874,0x7edc0cb5,0xb5a8034d,0xc9472c1f,
  101825. 0x52dc48c9,0xf709373d },
  101826. { 0xa8af30d6,0x401966bb,0xf137b69c,0x95bf5f4a,0x9361c47e,0x3966162a,
  101827. 0xe7275b11,0xbd52d288 } },
  101828. /* 72 */
  101829. { { 0x9c5fa877,0xab155c7a,0x7d3a3d48,0x17dad672,0x73d189d8,0x43f43f9e,
  101830. 0xc8aa77a6,0xa0d0f8e4 },
  101831. { 0xcc94f92d,0x0bbeafd8,0x0c4ddb3a,0xd818c8be,0xb82eba14,0x22cc65f8,
  101832. 0x946d6a00,0xa56c78c7 } },
  101833. /* 73 */
  101834. { { 0x0dd09529,0x2962391b,0x3daddfcf,0x803e0ea6,0x5b5bf481,0x2c77351f,
  101835. 0x731a367a,0xd8befdf8 },
  101836. { 0xfc0157f4,0xab919d42,0xfec8e650,0xf51caed7,0x02d48b0a,0xcdf9cb40,
  101837. 0xce9f6478,0x854a68a5 } },
  101838. /* 74 */
  101839. { { 0x63506ea5,0xdc35f67b,0xa4fe0d66,0x9286c489,0xfe95cd4d,0x3f101d3b,
  101840. 0x98846a95,0x5cacea0b },
  101841. { 0x9ceac44d,0xa90df60c,0x354d1c3a,0x3db29af4,0xad5dbabe,0x08dd3de8,
  101842. 0x35e4efa9,0xe4982d12 } },
  101843. /* 75 */
  101844. { { 0xc34cd55e,0x23104a22,0x2680d132,0x58695bb3,0x1fa1d943,0xfb345afa,
  101845. 0x16b20499,0x8046b7f6 },
  101846. { 0x38e7d098,0xb533581e,0xf46f0b70,0xd7f61e8d,0x44cb78c4,0x30dea9ea,
  101847. 0x9082af55,0xeb17ca7b } },
  101848. /* 76 */
  101849. { { 0x76a145b9,0x1751b598,0xc1bc71ec,0xa5cf6b0f,0x392715bb,0xd3e03565,
  101850. 0xfab5e131,0x097b00ba },
  101851. { 0x565f69e1,0xaa66c8e9,0xb5be5199,0x77e8f75a,0xda4fd984,0x6033ba11,
  101852. 0xafdbcc9e,0xf95c747b } },
  101853. /* 77 */
  101854. { { 0xbebae45e,0x558f01d3,0xc4bc6955,0xa8ebe9f0,0xdbc64fc6,0xaeb705b1,
  101855. 0x566ed837,0x3512601e },
  101856. { 0xfa1161cd,0x9336f1e1,0x4c65ef87,0x328ab8d5,0x724f21e5,0x4757eee2,
  101857. 0x6068ab6b,0x0ef97123 } },
  101858. /* 78 */
  101859. { { 0x54ca4226,0x02598cf7,0xf8642c8e,0x5eede138,0x468e1790,0x48963f74,
  101860. 0x3b4fbc95,0xfc16d933 },
  101861. { 0xe7c800ca,0xbe96fb31,0x2678adaa,0x13806331,0x6ff3e8b5,0x3d624497,
  101862. 0xb95d7a17,0x14ca4af1 } },
  101863. /* 79 */
  101864. { { 0xbd2f81d5,0x7a4771ba,0x01f7d196,0x1a5f9d69,0xcad9c907,0xd898bef7,
  101865. 0xf59c231d,0x4057b063 },
  101866. { 0x89c05c0a,0xbffd82fe,0x1dc0df85,0xe4911c6f,0xa35a16db,0x3befccae,
  101867. 0xf1330b13,0x1c3b5d64 } },
  101868. /* 80 */
  101869. { { 0x80ec21fe,0x5fe14bfe,0xc255be82,0xf6ce116a,0x2f4a5d67,0x98bc5a07,
  101870. 0xdb7e63af,0xfad27148 },
  101871. { 0x29ab05b3,0x90c0b6ac,0x4e251ae6,0x37a9a83c,0xc2aade7d,0x0a7dc875,
  101872. 0x9f0e1a84,0x77387de3 } },
  101873. /* 81 */
  101874. { { 0xa56c0dd7,0x1e9ecc49,0x46086c74,0xa5cffcd8,0xf505aece,0x8f7a1408,
  101875. 0xbef0c47e,0xb37b85c0 },
  101876. { 0xcc0e6a8f,0x3596b6e4,0x6b388f23,0xfd6d4bbf,0xc39cef4e,0xaba453fa,
  101877. 0xf9f628d5,0x9c135ac8 } },
  101878. /* 82 */
  101879. { { 0x84e35743,0x32aa3202,0x85a3cdef,0x320d6ab1,0x1df19819,0xb821b176,
  101880. 0xc433851f,0x5721361f },
  101881. { 0x71fc9168,0x1f0db36a,0x5e5c403c,0x5f98ba73,0x37bcd8f5,0xf64ca87e,
  101882. 0xe6bb11bd,0xdcbac3c9 } },
  101883. /* 83 */
  101884. { { 0x4518cbe2,0xf01d9968,0x9c9eb04e,0xd242fc18,0xe47feebf,0x727663c7,
  101885. 0x2d626862,0xb8c1c89e },
  101886. { 0xc8e1d569,0x51a58bdd,0xb7d88cd0,0x563809c8,0xf11f31eb,0x26c27fd9,
  101887. 0x2f9422d4,0x5d23bbda } },
  101888. /* 84 */
  101889. { { 0x95c8f8be,0x0a1c7294,0x3bf362bf,0x2961c480,0xdf63d4ac,0x9e418403,
  101890. 0x91ece900,0xc109f9cb },
  101891. { 0x58945705,0xc2d095d0,0xddeb85c0,0xb9083d96,0x7a40449b,0x84692b8d,
  101892. 0x2eee1ee1,0x9bc3344f } },
  101893. /* 85 */
  101894. { { 0x42913074,0x0d5ae356,0x48a542b1,0x55491b27,0xb310732a,0x469ca665,
  101895. 0x5f1a4cc1,0x29591d52 },
  101896. { 0xb84f983f,0xe76f5b6b,0x9f5f84e1,0xbe7eef41,0x80baa189,0x1200d496,
  101897. 0x18ef332c,0x6376551f } },
  101898. /* 86 */
  101899. { { 0x562976cc,0xbda5f14e,0x0ef12c38,0x22bca3e6,0x6cca9852,0xbbfa3064,
  101900. 0x08e2987a,0xbdb79dc8 },
  101901. { 0xcb06a772,0xfd2cb5c9,0xfe536dce,0x38f475aa,0x7c2b5db8,0xc2a3e022,
  101902. 0xadd3c14a,0x8ee86001 } },
  101903. /* 87 */
  101904. { { 0xa4ade873,0xcbe96981,0xc4fba48c,0x7ee9aa4d,0x5a054ba5,0x2cee2899,
  101905. 0x6f77aa4b,0x92e51d7a },
  101906. { 0x7190a34d,0x948bafa8,0xf6bd1ed1,0xd698f75b,0x0caf1144,0xd00ee6e3,
  101907. 0x0a56aaaa,0x5182f86f } },
  101908. /* 88 */
  101909. { { 0x7a4cc99c,0xfba6212c,0x3e6d9ca1,0xff609b68,0x5ac98c5a,0x5dbb27cb,
  101910. 0x4073a6f2,0x91dcab5d },
  101911. { 0x5f575a70,0x01b6cc3d,0x6f8d87fa,0x0cb36139,0x89981736,0x165d4e8c,
  101912. 0x97974f2b,0x17a0cedb } },
  101913. /* 89 */
  101914. { { 0x076c8d3a,0x38861e2a,0x210f924b,0x701aad39,0x13a835d9,0x94d0eae4,
  101915. 0x7f4cdf41,0x2e8ce36c },
  101916. { 0x037a862b,0x91273dab,0x60e4c8fa,0x01ba9bb7,0x33baf2dd,0xf9645388,
  101917. 0x34f668f3,0xf4ccc6cb } },
  101918. /* 90 */
  101919. { { 0xf1f79687,0x44ef525c,0x92efa815,0x7c595495,0xa5c78d29,0xe1231741,
  101920. 0x9a0df3c9,0xac0db488 },
  101921. { 0xdf01747f,0x86bfc711,0xef17df13,0x592b9358,0x5ccb6bb5,0xe5880e4f,
  101922. 0x94c974a2,0x95a64a61 } },
  101923. /* 91 */
  101924. { { 0xc15a4c93,0x72c1efda,0x82585141,0x40269b73,0x16cb0bad,0x6a8dfb1c,
  101925. 0x29210677,0x231e54ba },
  101926. { 0x8ae6d2dc,0xa70df917,0x39112918,0x4d6aa63f,0x5e5b7223,0xf627726b,
  101927. 0xd8a731e1,0xab0be032 } },
  101928. /* 92 */
  101929. { { 0x8d131f2d,0x097ad0e9,0x3b04f101,0x637f09e3,0xd5e9a748,0x1ac86196,
  101930. 0x2cf6a679,0xf1bcc880 },
  101931. { 0xe8daacb4,0x25c69140,0x60f65009,0x3c4e4055,0x477937a6,0x591cc8fc,
  101932. 0x5aebb271,0x85169469 } },
  101933. /* 93 */
  101934. { { 0xf1dcf593,0xde35c143,0xb018be3b,0x78202b29,0x9bdd9d3d,0xe9cdadc2,
  101935. 0xdaad55d8,0x8f67d9d2 },
  101936. { 0x7481ea5f,0x84111656,0xe34c590c,0xe7d2dde9,0x05053fa8,0xffdd43f4,
  101937. 0xc0728b5d,0xf84572b9 } },
  101938. /* 94 */
  101939. { { 0x97af71c9,0x5e1a7a71,0x7a736565,0xa1449444,0x0e1d5063,0xa1b4ae07,
  101940. 0x616b2c19,0xedee2710 },
  101941. { 0x11734121,0xb2f034f5,0x4a25e9f0,0x1cac6e55,0xa40c2ecf,0x8dc148f3,
  101942. 0x44ebd7f4,0x9fd27e9b } },
  101943. /* 95 */
  101944. { { 0xf6e2cb16,0x3cc7658a,0xfe5919b6,0xe3eb7d2c,0x168d5583,0x5a8c5816,
  101945. 0x958ff387,0xa40c2fb6 },
  101946. { 0xfedcc158,0x8c9ec560,0x55f23056,0x7ad804c6,0x9a307e12,0xd9396704,
  101947. 0x7dc6decf,0x99bc9bb8 } },
  101948. /* 96 */
  101949. { { 0x927dafc6,0x84a9521d,0x5c09cd19,0x52c1fb69,0xf9366dde,0x9d9581a0,
  101950. 0xa16d7e64,0x9abe210b },
  101951. { 0x48915220,0x480af84a,0x4dd816c6,0xfa73176a,0x1681ca5a,0xc7d53987,
  101952. 0x87f344b0,0x7881c257 } },
  101953. /* 97 */
  101954. { { 0xe0bcf3ff,0x93399b51,0x127f74f6,0x0d02cbc5,0xdd01d968,0x8fb465a2,
  101955. 0xa30e8940,0x15e6e319 },
  101956. { 0x3e0e05f4,0x646d6e0d,0x43588404,0xfad7bddc,0xc4f850d3,0xbe61c7d1,
  101957. 0x191172ce,0x0e55facf } },
  101958. /* 98 */
  101959. { { 0xf8787564,0x7e9d9806,0x31e85ce6,0x1a331721,0xb819e8d6,0x6b0158ca,
  101960. 0x6fe96577,0xd73d0976 },
  101961. { 0x1eb7206e,0x42483425,0xc618bb42,0xa519290f,0x5e30a520,0x5dcbb859,
  101962. 0x8f15a50b,0x9250a374 } },
  101963. /* 99 */
  101964. { { 0xbe577410,0xcaff08f8,0x5077a8c6,0xfd408a03,0xec0a63a4,0xf1f63289,
  101965. 0xc1cc8c0b,0x77414082 },
  101966. { 0xeb0991cd,0x05a40fa6,0x49fdc296,0xc1ca0866,0xb324fd40,0x3a68a3c7,
  101967. 0x12eb20b9,0x8cb04f4d } },
  101968. /* 100 */
  101969. { { 0x6906171c,0xb1c2d055,0xb0240c3f,0x9073e9cd,0xd8906841,0xdb8e6b4f,
  101970. 0x47123b51,0xe4e429ef },
  101971. { 0x38ec36f4,0x0b8dd53c,0xff4b6a27,0xf9d2dc01,0x879a9a48,0x5d066e07,
  101972. 0x3c6e6552,0x37bca2ff } },
  101973. /* 101 */
  101974. { { 0xdf562470,0x4cd2e3c7,0xc0964ac9,0x44f272a2,0x80c793be,0x7c6d5df9,
  101975. 0x3002b22a,0x59913edc },
  101976. { 0x5750592a,0x7a139a83,0xe783de02,0x99e01d80,0xea05d64f,0xcf8c0375,
  101977. 0xb013e226,0x43786e4a } },
  101978. /* 102 */
  101979. { { 0x9e56b5a6,0xff32b0ed,0xd9fc68f9,0x0750d9a6,0x597846a7,0xec15e845,
  101980. 0xb7e79e7a,0x8638ca98 },
  101981. { 0x0afc24b2,0x2f5ae096,0x4dace8f2,0x05398eaf,0xaecba78f,0x3b765dd0,
  101982. 0x7b3aa6f0,0x1ecdd36a } },
  101983. /* 103 */
  101984. { { 0x6c5ff2f3,0x5d3acd62,0x2873a978,0xa2d516c0,0xd2110d54,0xad94c9fa,
  101985. 0xd459f32d,0xd85d0f85 },
  101986. { 0x10b11da3,0x9f700b8d,0xa78318c4,0xd2c22c30,0x9208decd,0x556988f4,
  101987. 0xb4ed3c62,0xa04f19c3 } },
  101988. /* 104 */
  101989. { { 0xed7f93bd,0x087924c8,0x392f51f6,0xcb64ac5d,0x821b71af,0x7cae330a,
  101990. 0x5c0950b0,0x92b2eeea },
  101991. { 0x85b6e235,0x85ac4c94,0x2936c0f0,0xab2ca4a9,0xe0508891,0x80faa6b3,
  101992. 0x5834276c,0x1ee78221 } },
  101993. /* 105 */
  101994. { { 0xe63e79f7,0xa60a2e00,0xf399d906,0xf590e7b2,0x6607c09d,0x9021054a,
  101995. 0x57a6e150,0xf3f2ced8 },
  101996. { 0xf10d9b55,0x200510f3,0xd8642648,0x9d2fcfac,0xe8bd0e7c,0xe5631aa7,
  101997. 0x3da3e210,0x0f56a454 } },
  101998. /* 106 */
  101999. { { 0x1043e0df,0x5b21bffa,0x9c007e6d,0x6c74b6cc,0xd4a8517a,0x1a656ec0,
  102000. 0x1969e263,0xbd8f1741 },
  102001. { 0xbeb7494a,0x8a9bbb86,0x45f3b838,0x1567d46f,0xa4e5a79a,0xdf7a12a7,
  102002. 0x30ccfa09,0x2d1a1c35 } },
  102003. /* 107 */
  102004. { { 0x506508da,0x192e3813,0xa1d795a7,0x336180c4,0x7a9944b3,0xcddb5949,
  102005. 0xb91fba46,0xa107a65e },
  102006. { 0x0f94d639,0xe6d1d1c5,0x8a58b7d7,0x8b4af375,0xbd37ca1c,0x1a7c5584,
  102007. 0xf87a9af2,0x183d760a } },
  102008. /* 108 */
  102009. { { 0x0dde59a4,0x29d69711,0x0e8bef87,0xf1ad8d07,0x4f2ebe78,0x229b4963,
  102010. 0xc269d754,0x1d44179d },
  102011. { 0x8390d30e,0xb32dc0cf,0x0de8110c,0x0a3b2753,0x2bc0339a,0x31af1dc5,
  102012. 0x9606d262,0x771f9cc2 } },
  102013. /* 109 */
  102014. { { 0x85040739,0x99993e77,0x8026a939,0x44539db9,0xf5f8fc26,0xcf40f6f2,
  102015. 0x0362718e,0x64427a31 },
  102016. { 0x85428aa8,0x4f4f2d87,0xebfb49a8,0x7b7adc3f,0xf23d01ac,0x201b2c6d,
  102017. 0x6ae90d6d,0x49d9b749 } },
  102018. /* 110 */
  102019. { { 0x435d1099,0xcc78d8bc,0x8e8d1a08,0x2adbcd4e,0x2cb68a41,0x02c2e2a0,
  102020. 0x3f605445,0x9037d81b },
  102021. { 0x074c7b61,0x7cdbac27,0x57bfd72e,0xfe2031ab,0x596d5352,0x61ccec96,
  102022. 0x7cc0639c,0x08c3de6a } },
  102023. /* 111 */
  102024. { { 0xf6d552ab,0x20fdd020,0x05cd81f1,0x56baff98,0x91351291,0x06fb7c3e,
  102025. 0x45796b2f,0xc6909442 },
  102026. { 0x41231bd1,0x17b3ae9c,0x5cc58205,0x1eac6e87,0xf9d6a122,0x208837ab,
  102027. 0xcafe3ac0,0x3fa3db02 } },
  102028. /* 112 */
  102029. { { 0x05058880,0xd75a3e65,0x643943f2,0x7da365ef,0xfab24925,0x4147861c,
  102030. 0xfdb808ff,0xc5c4bdb0 },
  102031. { 0xb272b56b,0x73513e34,0x11b9043a,0xc8327e95,0xf8844969,0xfd8ce37d,
  102032. 0x46c2b6b5,0x2d56db94 } },
  102033. /* 113 */
  102034. { { 0xff46ac6b,0x2461782f,0x07a2e425,0xd19f7926,0x09a48de1,0xfafea3c4,
  102035. 0xe503ba42,0x0f56bd9d },
  102036. { 0x345cda49,0x137d4ed1,0x816f299d,0x821158fc,0xaeb43402,0xe7c6a54a,
  102037. 0x1173b5f1,0x4003bb9d } },
  102038. /* 114 */
  102039. { { 0xa0803387,0x3b8e8189,0x39cbd404,0xece115f5,0xd2877f21,0x4297208d,
  102040. 0xa07f2f9e,0x53765522 },
  102041. { 0xa8a4182d,0xa4980a21,0x3219df79,0xa2bbd07a,0x1a19a2d4,0x674d0a2e,
  102042. 0x6c5d4549,0x7a056f58 } },
  102043. /* 115 */
  102044. { { 0x9d8a2a47,0x646b2558,0xc3df2773,0x5b582948,0xabf0d539,0x51ec000e,
  102045. 0x7a1a2675,0x77d482f1 },
  102046. { 0x87853948,0xb8a1bd95,0x6cfbffee,0xa6f817bd,0x80681e47,0xab6ec057,
  102047. 0x2b38b0e4,0x4115012b } },
  102048. /* 116 */
  102049. { { 0x6de28ced,0x3c73f0f4,0x9b13ec47,0x1d5da760,0x6e5c6392,0x61b8ce9e,
  102050. 0xfbea0946,0xcdf04572 },
  102051. { 0x6c53c3b0,0x1cb3c58b,0x447b843c,0x97fe3c10,0x2cb9780e,0xfb2b8ae1,
  102052. 0x97383109,0xee703dda } },
  102053. /* 117 */
  102054. { { 0xff57e43a,0x34515140,0xb1b811b8,0xd44660d3,0x8f42b986,0x2b3b5dff,
  102055. 0xa162ce21,0x2a0ad89d },
  102056. { 0x6bc277ba,0x64e4a694,0xc141c276,0xc788c954,0xcabf6274,0x141aa64c,
  102057. 0xac2b4659,0xd62d0b67 } },
  102058. /* 118 */
  102059. { { 0x2c054ac4,0x39c5d87b,0xf27df788,0x57005859,0xb18128d6,0xedf7cbf3,
  102060. 0x991c2426,0xb39a23f2 },
  102061. { 0xf0b16ae5,0x95284a15,0xa136f51b,0x0c6a05b1,0xf2700783,0x1d63c137,
  102062. 0xc0674cc5,0x04ed0092 } },
  102063. /* 119 */
  102064. { { 0x9ae90393,0x1f4185d1,0x4a3d64e6,0x3047b429,0x9854fc14,0xae0001a6,
  102065. 0x0177c387,0xa0a91fc1 },
  102066. { 0xae2c831e,0xff0a3f01,0x2b727e16,0xbb76ae82,0x5a3075b4,0x8f12c8a1,
  102067. 0x9ed20c41,0x084cf988 } },
  102068. /* 120 */
  102069. { { 0xfca6becf,0xd98509de,0x7dffb328,0x2fceae80,0x4778e8b9,0x5d8a15c4,
  102070. 0x73abf77e,0xd57955b2 },
  102071. { 0x31b5d4f1,0x210da79e,0x3cfa7a1c,0xaa52f04b,0xdc27c20b,0xd4d12089,
  102072. 0x02d141f1,0x8e14ea42 } },
  102073. /* 121 */
  102074. { { 0xf2897042,0xeed50345,0x43402c4a,0x8d05331f,0xc8bdfb21,0xc8d9c194,
  102075. 0x2aa4d158,0x597e1a37 },
  102076. { 0xcf0bd68c,0x0327ec1a,0xab024945,0x6d4be0dc,0xc9fe3e84,0x5b9c8d7a,
  102077. 0x199b4dea,0xca3f0236 } },
  102078. /* 122 */
  102079. { { 0x6170bd20,0x592a10b5,0x6d3f5de7,0x0ea897f1,0x44b2ade2,0xa3363ff1,
  102080. 0x309c07e4,0xbde7fd7e },
  102081. { 0xb8f5432c,0x516bb6d2,0xe043444b,0x210dc1cb,0xf8f95b5a,0x3db01e6f,
  102082. 0x0a7dd198,0xb623ad0e } },
  102083. /* 123 */
  102084. { { 0x60c7b65b,0xa75bd675,0x23a4a289,0xab8c5590,0xd7b26795,0xf8220fd0,
  102085. 0x58ec137b,0xd6aa2e46 },
  102086. { 0x5138bb85,0x10abc00b,0xd833a95c,0x8c31d121,0x1702a32e,0xb24ff00b,
  102087. 0x2dcc513a,0x111662e0 } },
  102088. /* 124 */
  102089. { { 0xefb42b87,0x78114015,0x1b6c4dff,0xbd9f5d70,0xa7d7c129,0x66ecccd7,
  102090. 0x94b750f8,0xdb3ee1cb },
  102091. { 0xf34837cf,0xb26f3db0,0xb9578d4f,0xe7eed18b,0x7c56657d,0x5d2cdf93,
  102092. 0x52206a59,0x886a6442 } },
  102093. /* 125 */
  102094. { { 0x65b569ea,0x3c234cfb,0xf72119c1,0x20011141,0xa15a619e,0x8badc85d,
  102095. 0x018a17bc,0xa70cf4eb },
  102096. { 0x8c4a6a65,0x224f97ae,0x0134378f,0x36e5cf27,0x4f7e0960,0xbe3a609e,
  102097. 0xd1747b77,0xaa4772ab } },
  102098. /* 126 */
  102099. { { 0x7aa60cc0,0x67676131,0x0368115f,0xc7916361,0xbbc1bb5a,0xded98bb4,
  102100. 0x30faf974,0x611a6ddc },
  102101. { 0xc15ee47a,0x30e78cbc,0x4e0d96a5,0x2e896282,0x3dd9ed88,0x36f35adf,
  102102. 0x16429c88,0x5cfffaf8 } },
  102103. /* 127 */
  102104. { { 0x9b7a99cd,0xc0d54cff,0x843c45a1,0x7bf3b99d,0x62c739e1,0x038a908f,
  102105. 0x7dc1994c,0x6e5a6b23 },
  102106. { 0x0ba5db77,0xef8b454e,0xacf60d63,0xb7b8807f,0x76608378,0xe591c0c6,
  102107. 0x242dabcc,0x481a238d } },
  102108. /* 128 */
  102109. { { 0x35d0b34a,0xe3417bc0,0x8327c0a7,0x440b386b,0xac0362d1,0x8fb7262d,
  102110. 0xe0cdf943,0x2c41114c },
  102111. { 0xad95a0b1,0x2ba5cef1,0x67d54362,0xc09b37a8,0x01e486c9,0x26d6cdd2,
  102112. 0x42ff9297,0x20477abf } },
  102113. /* 129 */
  102114. { { 0x18d65dbf,0x2f75173c,0x339edad8,0x77bf940e,0xdcf1001c,0x7022d26b,
  102115. 0xc77396b6,0xac66409a },
  102116. { 0xc6261cc3,0x8b0bb36f,0x190e7e90,0x213f7bc9,0xa45e6c10,0x6541ceba,
  102117. 0xcc122f85,0xce8e6975 } },
  102118. /* 130 */
  102119. { { 0xbc0a67d2,0x0f121b41,0x444d248a,0x62d4760a,0x659b4737,0x0e044f1d,
  102120. 0x250bb4a8,0x08fde365 },
  102121. { 0x848bf287,0xaceec3da,0xd3369d6e,0xc2a62182,0x92449482,0x3582dfdc,
  102122. 0x565d6cd7,0x2f7e2fd2 } },
  102123. /* 131 */
  102124. { { 0xc3770fa7,0xae4b92db,0x379043f9,0x095e8d5c,0x17761171,0x54f34e9d,
  102125. 0x907702ae,0xc65be92e },
  102126. { 0xf6fd0a40,0x2758a303,0xbcce784b,0xe7d822e3,0x4f9767bf,0x7ae4f585,
  102127. 0xd1193b3a,0x4bff8e47 } },
  102128. /* 132 */
  102129. { { 0x00ff1480,0xcd41d21f,0x0754db16,0x2ab8fb7d,0xbbe0f3ea,0xac81d2ef,
  102130. 0x5772967d,0x3e4e4ae6 },
  102131. { 0x3c5303e6,0x7e18f36d,0x92262397,0x3bd9994b,0x1324c3c0,0x9ed70e26,
  102132. 0x58ec6028,0x5388aefd } },
  102133. /* 133 */
  102134. { { 0x5e5d7713,0xad1317eb,0x75de49da,0x09b985ee,0xc74fb261,0x32f5bc4f,
  102135. 0x4f75be0e,0x5cf908d1 },
  102136. { 0x8e657b12,0x76043510,0xb96ed9e6,0xbfd421a5,0x8970ccc2,0x0e29f51f,
  102137. 0x60f00ce2,0xa698ba40 } },
  102138. /* 134 */
  102139. { { 0xef748fec,0x73db1686,0x7e9d2cf9,0xe6e755a2,0xce265eff,0x630b6544,
  102140. 0x7aebad8d,0xb142ef8a },
  102141. { 0x17d5770a,0xad31af9f,0x2cb3412f,0x66af3b67,0xdf3359de,0x6bd60d1b,
  102142. 0x58515075,0xd1896a96 } },
  102143. /* 135 */
  102144. { { 0x33c41c08,0xec5957ab,0x5468e2e1,0x87de94ac,0xac472f6c,0x18816b73,
  102145. 0x7981da39,0x267b0e0b },
  102146. { 0x8e62b988,0x6e554e5d,0x116d21e7,0xd8ddc755,0x3d2a6f99,0x4610faf0,
  102147. 0xa1119393,0xb54e287a } },
  102148. /* 136 */
  102149. { { 0x178a876b,0x0a0122b5,0x085104b4,0x51ff96ff,0x14f29f76,0x050b31ab,
  102150. 0x5f87d4e6,0x84abb28b },
  102151. { 0x8270790a,0xd5ed439f,0x85e3f46b,0x2d6cb59d,0x6c1e2212,0x75f55c1b,
  102152. 0x17655640,0xe5436f67 } },
  102153. /* 137 */
  102154. { { 0x2286e8d5,0x53f9025e,0x864453be,0x353c95b4,0xe408e3a0,0xd832f5bd,
  102155. 0x5b9ce99e,0x0404f68b },
  102156. { 0xa781e8e5,0xcad33bde,0x163c2f5b,0x3cdf5018,0x0119caa3,0x57576960,
  102157. 0x0ac1c701,0x3a4263df } },
  102158. /* 138 */
  102159. { { 0x9aeb596d,0xc2965ecc,0x023c92b4,0x01ea03e7,0x2e013961,0x4704b4b6,
  102160. 0x905ea367,0x0ca8fd3f },
  102161. { 0x551b2b61,0x92523a42,0x390fcd06,0x1eb7a89c,0x0392a63e,0xe7f1d2be,
  102162. 0x4ddb0c33,0x96dca264 } },
  102163. /* 139 */
  102164. { { 0x387510af,0x203bb43a,0xa9a36a01,0x846feaa8,0x2f950378,0xd23a5770,
  102165. 0x3aad59dc,0x4363e212 },
  102166. { 0x40246a47,0xca43a1c7,0xe55dd24d,0xb362b8d2,0x5d8faf96,0xf9b08604,
  102167. 0xd8bb98c4,0x840e115c } },
  102168. /* 140 */
  102169. { { 0x1023e8a7,0xf12205e2,0xd8dc7a0b,0xc808a8cd,0x163a5ddf,0xe292a272,
  102170. 0x30ded6d4,0x5e0d6abd },
  102171. { 0x7cfc0f64,0x07a721c2,0x0e55ed88,0x42eec01d,0x1d1f9db2,0x26a7bef9,
  102172. 0x2945a25a,0x7dea48f4 } },
  102173. /* 141 */
  102174. { { 0xe5060a81,0xabdf6f1c,0xf8f95615,0xe79f9c72,0x06ac268b,0xcfd36c54,
  102175. 0xebfd16d1,0xabc2a2be },
  102176. { 0xd3e2eac7,0x8ac66f91,0xd2dd0466,0x6f10ba63,0x0282d31b,0x6790e377,
  102177. 0x6c7eefc1,0x4ea35394 } },
  102178. /* 142 */
  102179. { { 0x5266309d,0xed8a2f8d,0x81945a3e,0x0a51c6c0,0x578c5dc1,0xcecaf45a,
  102180. 0x1c94ffc3,0x3a76e689 },
  102181. { 0x7d7b0d0f,0x9aace8a4,0x8f584a5f,0x963ace96,0x4e697fbe,0x51a30c72,
  102182. 0x465e6464,0x8212a10a } },
  102183. /* 143 */
  102184. { { 0xcfab8caa,0xef7c61c3,0x0e142390,0x18eb8e84,0x7e9733ca,0xcd1dff67,
  102185. 0x599cb164,0xaa7cab71 },
  102186. { 0xbc837bd1,0x02fc9273,0xc36af5d7,0xc06407d0,0xf423da49,0x17621292,
  102187. 0xfe0617c3,0x40e38073 } },
  102188. /* 144 */
  102189. { { 0xa7bf9b7c,0xf4f80824,0x3fbe30d0,0x365d2320,0x97cf9ce3,0xbfbe5320,
  102190. 0xb3055526,0xe3604700 },
  102191. { 0x6cc6c2c7,0x4dcb9911,0xba4cbee6,0x72683708,0x637ad9ec,0xdcded434,
  102192. 0xa3dee15f,0x6542d677 } },
  102193. /* 145 */
  102194. { { 0x7b6c377a,0x3f32b6d0,0x903448be,0x6cb03847,0x20da8af7,0xd6fdd3a8,
  102195. 0x09bb6f21,0xa6534aee },
  102196. { 0x1035facf,0x30a1780d,0x9dcb47e6,0x35e55a33,0xc447f393,0x6ea50fe1,
  102197. 0xdc9aef22,0xf3cb672f } },
  102198. /* 146 */
  102199. { { 0x3b55fd83,0xeb3719fe,0x875ddd10,0xe0d7a46c,0x05cea784,0x33ac9fa9,
  102200. 0xaae870e7,0x7cafaa2e },
  102201. { 0x1d53b338,0x9b814d04,0xef87e6c6,0xe0acc0a0,0x11672b0f,0xfb93d108,
  102202. 0xb9bd522e,0x0aab13c1 } },
  102203. /* 147 */
  102204. { { 0xd2681297,0xddcce278,0xb509546a,0xcb350eb1,0x7661aaf2,0x2dc43173,
  102205. 0x847012e9,0x4b91a602 },
  102206. { 0x72f8ddcf,0xdcff1095,0x9a911af4,0x08ebf61e,0xc372430e,0x48f4360a,
  102207. 0x72321cab,0x49534c53 } },
  102208. /* 148 */
  102209. { { 0xf07b7e9d,0x83df7d71,0x13cd516f,0xa478efa3,0x6c047ee3,0x78ef264b,
  102210. 0xd65ac5ee,0xcaf46c4f },
  102211. { 0x92aa8266,0xa04d0c77,0x913684bb,0xedf45466,0xae4b16b0,0x56e65168,
  102212. 0x04c6770f,0x14ce9e57 } },
  102213. /* 149 */
  102214. { { 0x965e8f91,0x99445e3e,0xcb0f2492,0xd3aca1ba,0x90c8a0a0,0xd31cc70f,
  102215. 0x3e4c9a71,0x1bb708a5 },
  102216. { 0x558bdd7a,0xd5ca9e69,0x018a26b1,0x734a0508,0x4c9cf1ec,0xb093aa71,
  102217. 0xda300102,0xf9d126f2 } },
  102218. /* 150 */
  102219. { { 0xaff9563e,0x749bca7a,0xb49914a0,0xdd077afe,0xbf5f1671,0xe27a0311,
  102220. 0x729ecc69,0x807afcb9 },
  102221. { 0xc9b08b77,0x7f8a9337,0x443c7e38,0x86c3a785,0x476fd8ba,0x85fafa59,
  102222. 0x6568cd8c,0x751adcd1 } },
  102223. /* 151 */
  102224. { { 0x10715c0d,0x8aea38b4,0x8f7697f7,0xd113ea71,0x93fbf06d,0x665eab14,
  102225. 0x2537743f,0x29ec4468 },
  102226. { 0xb50bebbc,0x3d94719c,0xe4505422,0x399ee5bf,0x8d2dedb1,0x90cd5b3a,
  102227. 0x92a4077d,0xff9370e3 } },
  102228. /* 152 */
  102229. { { 0xc6b75b65,0x59a2d69b,0x266651c5,0x4188f8d5,0x3de9d7d2,0x28a9f33e,
  102230. 0xa2a9d01a,0x9776478b },
  102231. { 0x929af2c7,0x8852622d,0x4e690923,0x334f5d6d,0xa89a51e9,0xce6cc7e5,
  102232. 0xac2f82fa,0x74a6313f } },
  102233. /* 153 */
  102234. { { 0xb75f079c,0xb2f4dfdd,0x18e36fbb,0x85b07c95,0xe7cd36dd,0x1b6cfcf0,
  102235. 0x0ff4863d,0xab75be15 },
  102236. { 0x173fc9b7,0x81b367c0,0xd2594fd0,0xb90a7420,0xc4091236,0x15fdbf03,
  102237. 0x0b4459f6,0x4ebeac2e } },
  102238. /* 154 */
  102239. { { 0x5c9f2c53,0xeb6c5fe7,0x8eae9411,0xd2522011,0xf95ac5d8,0xc8887633,
  102240. 0x2c1baffc,0xdf99887b },
  102241. { 0x850aaecb,0xbb78eed2,0x01d6a272,0x9d49181b,0xb1cdbcac,0x978dd511,
  102242. 0x779f4058,0x27b040a7 } },
  102243. /* 155 */
  102244. { { 0xf73b2eb2,0x90405db7,0x8e1b2118,0xe0df8508,0x5962327e,0x501b7152,
  102245. 0xe4cfa3f5,0xb393dd37 },
  102246. { 0x3fd75165,0xa1230e7b,0xbcd33554,0xd66344c2,0x0f7b5022,0x6c36f1be,
  102247. 0xd0463419,0x09588c12 } },
  102248. /* 156 */
  102249. { { 0x02601c3b,0xe086093f,0xcf5c335f,0xfb0252f8,0x894aff28,0x955cf280,
  102250. 0xdb9f648b,0x81c879a9 },
  102251. { 0xc6f56c51,0x040e687c,0x3f17618c,0xfed47169,0x9059353b,0x44f88a41,
  102252. 0x5fc11bc4,0xfa0d48f5 } },
  102253. /* 157 */
  102254. { { 0xe1608e4d,0xbc6e1c9d,0x3582822c,0x010dda11,0x157ec2d7,0xf6b7ddc1,
  102255. 0xb6a367d6,0x8ea0e156 },
  102256. { 0x2383b3b4,0xa354e02f,0x3f01f53c,0x69966b94,0x2de03ca5,0x4ff6632b,
  102257. 0xfa00b5ac,0x3f5ab924 } },
  102258. /* 158 */
  102259. { { 0x59739efb,0x337bb0d9,0xe7ebec0d,0xc751b0f4,0x411a67d1,0x2da52dd6,
  102260. 0x2b74256e,0x8bc76887 },
  102261. { 0x82d3d253,0xa5be3b72,0xf58d779f,0xa9f679a1,0xe16767bb,0xa1cac168,
  102262. 0x60fcf34f,0xb386f190 } },
  102263. /* 159 */
  102264. { { 0x2fedcfc2,0x31f3c135,0x62f8af0d,0x5396bf62,0xe57288c2,0x9a02b4ea,
  102265. 0x1b069c4d,0x4cb460f7 },
  102266. { 0x5b8095ea,0xae67b4d3,0x6fc07603,0x92bbf859,0xb614a165,0xe1475f66,
  102267. 0x95ef5223,0x52c0d508 } },
  102268. /* 160 */
  102269. { { 0x15339848,0x231c210e,0x70778c8d,0xe87a28e8,0x6956e170,0x9d1de661,
  102270. 0x2bb09c0b,0x4ac3c938 },
  102271. { 0x6998987d,0x19be0551,0xae09f4d6,0x8b2376c4,0x1a3f933d,0x1de0b765,
  102272. 0xe39705f4,0x380d94c7 } },
  102273. /* 161 */
  102274. { { 0x81542e75,0x01a355aa,0xee01b9b7,0x96c724a1,0x624d7087,0x6b3a2977,
  102275. 0xde2637af,0x2ce3e171 },
  102276. { 0xf5d5bc1a,0xcfefeb49,0x2777e2b5,0xa655607e,0x9513756c,0x4feaac2f,
  102277. 0x0b624e4d,0x2e6cd852 } },
  102278. /* 162 */
  102279. { { 0x8c31c31d,0x3685954b,0x5bf21a0c,0x68533d00,0x75c79ec9,0x0bd7626e,
  102280. 0x42c69d54,0xca177547 },
  102281. { 0xf6d2dbb2,0xcc6edaff,0x174a9d18,0xfd0d8cbd,0xaa4578e8,0x875e8793,
  102282. 0x9cab2ce6,0xa976a713 } },
  102283. /* 163 */
  102284. { { 0x93fb353d,0x0a651f1b,0x57fcfa72,0xd75cab8b,0x31b15281,0xaa88cfa7,
  102285. 0x0a1f4999,0x8720a717 },
  102286. { 0x693e1b90,0x8c3e8d37,0x16f6dfc3,0xd345dc0b,0xb52a8742,0x8ea8d00a,
  102287. 0xc769893c,0x9719ef29 } },
  102288. /* 164 */
  102289. { { 0x58e35909,0x820eed8d,0x33ddc116,0x9366d8dc,0x6e205026,0xd7f999d0,
  102290. 0xe15704c1,0xa5072976 },
  102291. { 0xc4e70b2e,0x002a37ea,0x6890aa8a,0x84dcf657,0x645b2a5c,0xcd71bf18,
  102292. 0xf7b77725,0x99389c9d } },
  102293. /* 165 */
  102294. { { 0x7ada7a4b,0x238c08f2,0xfd389366,0x3abe9d03,0x766f512c,0x6b672e89,
  102295. 0x202c82e4,0xa88806aa },
  102296. { 0xd380184e,0x6602044a,0x126a8b85,0xa8cb78c4,0xad844f17,0x79d670c0,
  102297. 0x4738dcfe,0x0043bffb } },
  102298. /* 166 */
  102299. { { 0x36d5192e,0x8d59b5dc,0x4590b2af,0xacf885d3,0x11601781,0x83566d0a,
  102300. 0xba6c4866,0x52f3ef01 },
  102301. { 0x0edcb64d,0x3986732a,0x8068379f,0x0a482c23,0x7040f309,0x16cbe5fa,
  102302. 0x9ef27e75,0x3296bd89 } },
  102303. /* 167 */
  102304. { { 0x454d81d7,0x476aba89,0x51eb9b3c,0x9eade7ef,0x81c57986,0x619a21cd,
  102305. 0xaee571e9,0x3b90febf },
  102306. { 0x5496f7cb,0x9393023e,0x7fb51bc4,0x55be41d8,0x99beb5ce,0x03f1dd48,
  102307. 0x9f810b18,0x6e88069d } },
  102308. /* 168 */
  102309. { { 0xb43ea1db,0xce37ab11,0x5259d292,0x0a7ff1a9,0x8f84f186,0x851b0221,
  102310. 0xdefaad13,0xa7222bea },
  102311. { 0x2b0a9144,0xa2ac78ec,0xf2fa59c5,0x5a024051,0x6147ce38,0x91d1eca5,
  102312. 0xbc2ac690,0xbe94d523 } },
  102313. /* 169 */
  102314. { { 0x0b226ce7,0x72f4945e,0x967e8b70,0xb8afd747,0x85a6c63e,0xedea46f1,
  102315. 0x9be8c766,0x7782defe },
  102316. { 0x3db38626,0x760d2aa4,0x76f67ad1,0x460ae787,0x54499cdb,0x341b86fc,
  102317. 0xa2892e4b,0x03838567 } },
  102318. /* 170 */
  102319. { { 0x79ec1a0f,0x2d8daefd,0xceb39c97,0x3bbcd6fd,0x58f61a95,0xf5575ffc,
  102320. 0xadf7b420,0xdbd986c4 },
  102321. { 0x15f39eb7,0x81aa8814,0xb98d976c,0x6ee2fcf5,0xcf2f717d,0x5465475d,
  102322. 0x6860bbd0,0x8e24d3c4 } },
  102323. /* 171 */
  102324. { { 0x9a587390,0x749d8e54,0x0cbec588,0x12bb194f,0xb25983c6,0x46e07da4,
  102325. 0x407bafc8,0x541a99c4 },
  102326. { 0x624c8842,0xdb241692,0xd86c05ff,0x6044c12a,0x4f7fcf62,0xc59d14b4,
  102327. 0xf57d35d1,0xc0092c49 } },
  102328. /* 172 */
  102329. { { 0xdf2e61ef,0xd3cc75c3,0x2e1b35ca,0x7e8841c8,0x909f29f4,0xc62d30d1,
  102330. 0x7286944d,0x75e40634 },
  102331. { 0xbbc237d0,0xe7d41fc5,0xec4f01c9,0xc9537bf0,0x282bd534,0x91c51a16,
  102332. 0xc7848586,0x5b7cb658 } },
  102333. /* 173 */
  102334. { { 0x8a28ead1,0x964a7084,0xfd3b47f6,0x802dc508,0x767e5b39,0x9ae4bfd1,
  102335. 0x8df097a1,0x7ae13eba },
  102336. { 0xeadd384e,0xfd216ef8,0xb6b2ff06,0x0361a2d9,0x4bcdb5f3,0x204b9878,
  102337. 0xe2a8e3fd,0x787d8074 } },
  102338. /* 174 */
  102339. { { 0x757fbb1c,0xc5e25d6b,0xca201deb,0xe47bddb2,0x6d2233ff,0x4a55e9a3,
  102340. 0x9ef28484,0x5c222819 },
  102341. { 0x88315250,0x773d4a85,0x827097c1,0x21b21a2b,0xdef5d33f,0xab7c4ea1,
  102342. 0xbaf0f2b0,0xe45d37ab } },
  102343. /* 175 */
  102344. { { 0x28511c8a,0xd2df1e34,0xbdca6cd3,0xebb229c8,0x627c39a7,0x578a71a7,
  102345. 0x84dfb9d3,0xed7bc122 },
  102346. { 0x93dea561,0xcf22a6df,0xd48f0ed1,0x5443f18d,0x5bad23e8,0xd8b86140,
  102347. 0x45ca6d27,0xaac97cc9 } },
  102348. /* 176 */
  102349. { { 0xa16bd00a,0xeb54ea74,0xf5c0bcc1,0xd839e9ad,0x1f9bfc06,0x092bb7f1,
  102350. 0x1163dc4e,0x318f97b3 },
  102351. { 0xc30d7138,0xecc0c5be,0xabc30220,0x44e8df23,0xb0223606,0x2bb7972f,
  102352. 0x9a84ff4d,0xfa41faa1 } },
  102353. /* 177 */
  102354. { { 0xa6642269,0x4402d974,0x9bb783bd,0xc81814ce,0x7941e60b,0x398d38e4,
  102355. 0x1d26e9e2,0x38bb6b2c },
  102356. { 0x6a577f87,0xc64e4a25,0xdc11fe1c,0x8b52d253,0x62280728,0xff336abf,
  102357. 0xce7601a5,0x94dd0905 } },
  102358. /* 178 */
  102359. { { 0xde93f92a,0x156cf7dc,0x89b5f315,0xa01333cb,0xc995e750,0x02404df9,
  102360. 0xd25c2ae9,0x92077867 },
  102361. { 0x0bf39d44,0xe2471e01,0x96bb53d7,0x5f2c9020,0x5c9c3d8f,0x4c44b7b3,
  102362. 0xd29beb51,0x81e8428b } },
  102363. /* 179 */
  102364. { { 0xc477199f,0x6dd9c2ba,0x6b5ecdd9,0x8cb8eeee,0xee40fd0e,0x8af7db3f,
  102365. 0xdbbfa4b1,0x1b94ab62 },
  102366. { 0xce47f143,0x44f0d8b3,0x63f46163,0x51e623fc,0xcc599383,0xf18f270f,
  102367. 0x055590ee,0x06a38e28 } },
  102368. /* 180 */
  102369. { { 0xb3355b49,0x2e5b0139,0xb4ebf99b,0x20e26560,0xd269f3dc,0xc08ffa6b,
  102370. 0x83d9d4f8,0xa7b36c20 },
  102371. { 0x1b3e8830,0x64d15c3a,0xa89f9c0b,0xd5fceae1,0xe2d16930,0xcfeee4a2,
  102372. 0xa2822a20,0xbe54c6b4 } },
  102373. /* 181 */
  102374. { { 0x8d91167c,0xd6cdb3df,0xe7a6625e,0x517c3f79,0x346ac7f4,0x7105648f,
  102375. 0xeae022bb,0xbf30a5ab },
  102376. { 0x93828a68,0x8e7785be,0x7f3ef036,0x5161c332,0x592146b2,0xe11b5feb,
  102377. 0x2732d13a,0xd1c820de } },
  102378. /* 182 */
  102379. { { 0x9038b363,0x043e1347,0x6b05e519,0x58c11f54,0x6026cad1,0x4fe57abe,
  102380. 0x68a18da3,0xb7d17bed },
  102381. { 0xe29c2559,0x44ca5891,0x5bfffd84,0x4f7a0376,0x74e46948,0x498de4af,
  102382. 0x6412cc64,0x3997fd5e } },
  102383. /* 183 */
  102384. { { 0x8bd61507,0xf2074682,0x34a64d2a,0x29e132d5,0x8a8a15e3,0xffeddfb0,
  102385. 0x3c6c13e8,0x0eeb8929 },
  102386. { 0xa7e259f8,0xe9b69a3e,0xd13e7e67,0xce1db7e6,0xad1fa685,0x277318f6,
  102387. 0xc922b6ef,0x228916f8 } },
  102388. /* 184 */
  102389. { { 0x0a12ab5b,0x959ae25b,0x957bc136,0xcc11171f,0xd16e2b0c,0x8058429e,
  102390. 0x6e93097e,0xec05ad1d },
  102391. { 0xac3f3708,0x157ba5be,0x30b59d77,0x31baf935,0x118234e5,0x47b55237,
  102392. 0x7ff11b37,0x7d314156 } },
  102393. /* 185 */
  102394. { { 0xf6dfefab,0x7bd9c05c,0xdcb37707,0xbe2f2268,0x3a38bb95,0xe53ead97,
  102395. 0x9bc1d7a3,0xe9ce66fc },
  102396. { 0x6f6a02a1,0x75aa1576,0x60e600ed,0x38c087df,0x68cdc1b9,0xf8947f34,
  102397. 0x72280651,0xd9650b01 } },
  102398. /* 186 */
  102399. { { 0x5a057e60,0x504b4c4a,0x8def25e4,0xcbccc3be,0x17c1ccbd,0xa6353208,
  102400. 0x804eb7a2,0x14d6699a },
  102401. { 0xdb1f411a,0x2c8a8415,0xf80d769c,0x09fbaf0b,0x1c2f77ad,0xb4deef90,
  102402. 0x0d43598a,0x6f4c6841 } },
  102403. /* 187 */
  102404. { { 0x96c24a96,0x8726df4e,0xfcbd99a3,0x534dbc85,0x8b2ae30a,0x3c466ef2,
  102405. 0x61189abb,0x4c4350fd },
  102406. { 0xf855b8da,0x2967f716,0x463c38a1,0x41a42394,0xeae93343,0xc37e1413,
  102407. 0x5a3118b5,0xa726d242 } },
  102408. /* 188 */
  102409. { { 0x948c1086,0xdae6b3ee,0xcbd3a2e1,0xf1de503d,0x03d022f3,0x3f35ed3f,
  102410. 0xcc6cf392,0x13639e82 },
  102411. { 0xcdafaa86,0x9ac938fb,0x2654a258,0xf45bc5fb,0x45051329,0x1963b26e,
  102412. 0xc1a335a3,0xca9365e1 } },
  102413. /* 189 */
  102414. { { 0x4c3b2d20,0x3615ac75,0x904e241b,0x742a5417,0xcc9d071d,0xb08521c4,
  102415. 0x970b72a5,0x9ce29c34 },
  102416. { 0x6d3e0ad6,0x8cc81f73,0xf2f8434c,0x8060da9e,0x6ce862d9,0x35ed1d1a,
  102417. 0xab42af98,0x48c4abd7 } },
  102418. /* 190 */
  102419. { { 0x40c7485a,0xd221b0cc,0xe5274dbf,0xead455bb,0x9263d2e8,0x493c7698,
  102420. 0xf67b33cb,0x78017c32 },
  102421. { 0x930cb5ee,0xb9d35769,0x0c408ed2,0xc0d14e94,0x272f1a4d,0xf8b7bf55,
  102422. 0xde5c1c04,0x53cd0454 } },
  102423. /* 191 */
  102424. { { 0x5d28ccac,0xbcd585fa,0x005b746e,0x5f823e56,0xcd0123aa,0x7c79f0a1,
  102425. 0xd3d7fa8f,0xeea465c1 },
  102426. { 0x0551803b,0x7810659f,0x7ce6af70,0x6c0b599f,0x29288e70,0x4195a770,
  102427. 0x7ae69193,0x1b6e42a4 } },
  102428. /* 192 */
  102429. { { 0xf67d04c3,0x2e80937c,0x89eeb811,0x1e312be2,0x92594d60,0x56b5d887,
  102430. 0x187fbd3d,0x0224da14 },
  102431. { 0x0c5fe36f,0x87abb863,0x4ef51f5f,0x580f3c60,0xb3b429ec,0x964fb1bf,
  102432. 0x42bfff33,0x60838ef0 } },
  102433. /* 193 */
  102434. { { 0x7e0bbe99,0x432cb2f2,0x04aa39ee,0x7bda44f3,0x9fa93903,0x5f497c7a,
  102435. 0x2d331643,0x636eb202 },
  102436. { 0x93ae00aa,0xfcfd0e61,0x31ae6d2f,0x875a00fe,0x9f93901c,0xf43658a2,
  102437. 0x39218bac,0x8844eeb6 } },
  102438. /* 194 */
  102439. { { 0x6b3bae58,0x114171d2,0x17e39f3e,0x7db3df71,0x81a8eada,0xcd37bc7f,
  102440. 0x51fb789e,0x27ba83dc },
  102441. { 0xfbf54de5,0xa7df439f,0xb5fe1a71,0x7277030b,0xdb297a48,0x42ee8e35,
  102442. 0x87f3a4ab,0xadb62d34 } },
  102443. /* 195 */
  102444. { { 0xa175df2a,0x9b1168a2,0x618c32e9,0x082aa04f,0x146b0916,0xc9e4f2e7,
  102445. 0x75e7c8b2,0xb990fd76 },
  102446. { 0x4df37313,0x0829d96b,0xd0b40789,0x1c205579,0x78087711,0x66c9ae4a,
  102447. 0x4d10d18d,0x81707ef9 } },
  102448. /* 196 */
  102449. { { 0x03d6ff96,0x97d7cab2,0x0d843360,0x5b851bfc,0xd042db4b,0x268823c4,
  102450. 0xd5a8aa5c,0x3792daea },
  102451. { 0x941afa0b,0x52818865,0x42d83671,0xf3e9e741,0x5be4e0a7,0x17c82527,
  102452. 0x94b001ba,0x5abd635e } },
  102453. /* 197 */
  102454. { { 0x0ac4927c,0x727fa84e,0xa7c8cf23,0xe3886035,0x4adca0df,0xa4bcd5ea,
  102455. 0x846ab610,0x5995bf21 },
  102456. { 0x829dfa33,0xe90f860b,0x958fc18b,0xcaafe2ae,0x78630366,0x9b3baf44,
  102457. 0xd483411e,0x44c32ca2 } },
  102458. /* 198 */
  102459. { { 0xe40ed80c,0xa74a97f1,0x31d2ca82,0x5f938cb1,0x7c2d6ad9,0x53f2124b,
  102460. 0x8082a54c,0x1f2162fb },
  102461. { 0x720b173e,0x7e467cc5,0x085f12f9,0x40e8a666,0x4c9d65dc,0x8cebc20e,
  102462. 0xc3e907c9,0x8f1d402b } },
  102463. /* 199 */
  102464. { { 0xfbc4058a,0x4f592f9c,0x292f5670,0xb15e14b6,0xbc1d8c57,0xc55cfe37,
  102465. 0x926edbf9,0xb1980f43 },
  102466. { 0x32c76b09,0x98c33e09,0x33b07f78,0x1df5279d,0x863bb461,0x6f08ead4,
  102467. 0x37448e45,0x2828ad9b } },
  102468. /* 200 */
  102469. { { 0xc4cf4ac5,0x696722c4,0xdde64afb,0xf5ac1a3f,0xe0890832,0x0551baa2,
  102470. 0x5a14b390,0x4973f127 },
  102471. { 0x322eac5d,0xe59d8335,0x0bd9b568,0x5e07eef5,0xa2588393,0xab36720f,
  102472. 0xdb168ac7,0x6dac8ed0 } },
  102473. /* 201 */
  102474. { { 0xeda835ef,0xf7b545ae,0x1d10ed51,0x4aa113d2,0x13741b09,0x035a65e0,
  102475. 0x20b9de4c,0x4b23ef59 },
  102476. { 0x3c4c7341,0xe82bb680,0x3f58bc37,0xd457706d,0xa51e3ee8,0x73527863,
  102477. 0xddf49a4e,0x4dd71534 } },
  102478. /* 202 */
  102479. { { 0x95476cd9,0xbf944672,0xe31a725b,0x648d072f,0xfc4b67e0,0x1441c8b8,
  102480. 0x2f4a4dbb,0xfd317000 },
  102481. { 0x8995d0e1,0x1cb43ff4,0x0ef729aa,0x76e695d1,0x41798982,0xe0d5f976,
  102482. 0x9569f365,0x14fac58c } },
  102483. /* 203 */
  102484. { { 0xf312ae18,0xad9a0065,0xfcc93fc9,0x51958dc0,0x8a7d2846,0xd9a14240,
  102485. 0x36abda50,0xed7c7651 },
  102486. { 0x25d4abbc,0x46270f1a,0xf1a113ea,0x9b5dd8f3,0x5b51952f,0xc609b075,
  102487. 0x4d2e9f53,0xfefcb7f7 } },
  102488. /* 204 */
  102489. { { 0xba119185,0xbd09497a,0xaac45ba4,0xd54e8c30,0xaa521179,0x492479de,
  102490. 0x87e0d80b,0x1801a57e },
  102491. { 0xfcafffb0,0x073d3f8d,0xae255240,0x6cf33c0b,0x5b5fdfbc,0x781d763b,
  102492. 0x1ead1064,0x9f8fc11e } },
  102493. /* 205 */
  102494. { { 0x5e69544c,0x1583a171,0xf04b7813,0x0eaf8567,0x278a4c32,0x1e22a8fd,
  102495. 0x3d3a69a9,0xa9d3809d },
  102496. { 0x59a2da3b,0x936c2c2c,0x1895c847,0x38ccbcf6,0x63d50869,0x5e65244e,
  102497. 0xe1178ef7,0x3006b9ae } },
  102498. /* 206 */
  102499. { { 0xc9eead28,0x0bb1f2b0,0x89f4dfbc,0x7eef635d,0xb2ce8939,0x074757fd,
  102500. 0x45f8f761,0x0ab85fd7 },
  102501. { 0x3e5b4549,0xecda7c93,0x97922f21,0x4be2bb5c,0xb43b8040,0x261a1274,
  102502. 0x11e942c2,0xb122d675 } },
  102503. /* 207 */
  102504. { { 0x66a5ae7a,0x3be607be,0x76adcbe3,0x01e703fa,0x4eb6e5c5,0xaf904301,
  102505. 0x097dbaec,0x9f599dc1 },
  102506. { 0x0ff250ed,0x6d75b718,0x349a20dc,0x8eb91574,0x10b227a3,0x425605a4,
  102507. 0x8a294b78,0x7d5528e0 } },
  102508. /* 208 */
  102509. { { 0x20c26def,0xf0f58f66,0x582b2d1e,0x025585ea,0x01ce3881,0xfbe7d79b,
  102510. 0x303f1730,0x28ccea01 },
  102511. { 0x79644ba5,0xd1dabcd1,0x06fff0b8,0x1fc643e8,0x66b3e17b,0xa60a76fc,
  102512. 0xa1d013bf,0xc18baf48 } },
  102513. /* 209 */
  102514. { { 0x5dc4216d,0x34e638c8,0x206142ac,0x00c01067,0x95f5064a,0xd453a171,
  102515. 0xb7a9596b,0x9def809d },
  102516. { 0x67ab8d2c,0x41e8642e,0x6237a2b6,0xb4240433,0x64c4218b,0x7d506a6d,
  102517. 0x68808ce5,0x0357f8b0 } },
  102518. /* 210 */
  102519. { { 0x4cd2cc88,0x8e9dbe64,0xf0b8f39d,0xcc61c28d,0xcd30a0c8,0x4a309874,
  102520. 0x1b489887,0xe4a01add },
  102521. { 0xf57cd8f9,0x2ed1eeac,0xbd594c48,0x1b767d3e,0x7bd2f787,0xa7295c71,
  102522. 0xce10cc30,0x466d7d79 } },
  102523. /* 211 */
  102524. { { 0x9dada2c7,0x47d31892,0x8f9aa27d,0x4fa0a6c3,0x820a59e1,0x90e4fd28,
  102525. 0x451ead1a,0xc672a522 },
  102526. { 0x5d86b655,0x30607cc8,0xf9ad4af1,0xf0235d3b,0x571172a6,0x99a08680,
  102527. 0xf2a67513,0x5e3d64fa } },
  102528. /* 212 */
  102529. { { 0x9b3b4416,0xaa6410c7,0xeab26d99,0xcd8fcf85,0xdb656a74,0x5ebff74a,
  102530. 0xeb8e42fc,0x6c8a7a95 },
  102531. { 0xb02a63bd,0x10c60ba7,0x8b8f0047,0x6b2f2303,0x312d90b0,0x8c6c3738,
  102532. 0xad82ca91,0x348ae422 } },
  102533. /* 213 */
  102534. { { 0x5ccda2fb,0x7f474663,0x8e0726d2,0x22accaa1,0x492b1f20,0x85adf782,
  102535. 0xd9ef2d2e,0xc1074de0 },
  102536. { 0xae9a65b3,0xfcf3ce44,0x05d7151b,0xfd71e4ac,0xce6a9788,0xd4711f50,
  102537. 0xc9e54ffc,0xfbadfbdb } },
  102538. /* 214 */
  102539. { { 0x20a99363,0x1713f1cd,0x6cf22775,0xb915658f,0x24d359b2,0x968175cd,
  102540. 0x83716fcd,0xb7f976b4 },
  102541. { 0x5d6dbf74,0x5758e24d,0x71c3af36,0x8d23bafd,0x0243dfe3,0x48f47760,
  102542. 0xcafcc805,0xf4d41b2e } },
  102543. /* 215 */
  102544. { { 0xfdabd48d,0x51f1cf28,0x32c078a4,0xce81be36,0x117146e9,0x6ace2974,
  102545. 0xe0160f10,0x180824ea },
  102546. { 0x66e58358,0x0387698b,0xce6ca358,0x63568752,0x5e41e6c5,0x82380e34,
  102547. 0x83cf6d25,0x67e5f639 } },
  102548. /* 216 */
  102549. { { 0xcf4899ef,0xf89ccb8d,0x9ebb44c0,0x949015f0,0xb2598ec9,0x546f9276,
  102550. 0x04c11fc6,0x9fef789a },
  102551. { 0x53d2a071,0x6d367ecf,0xa4519b09,0xb10e1a7f,0x611e2eef,0xca6b3fb0,
  102552. 0xa99c4e20,0xbc80c181 } },
  102553. /* 217 */
  102554. { { 0xe5eb82e6,0x972536f8,0xf56cb920,0x1a484fc7,0x50b5da5e,0xc78e2171,
  102555. 0x9f8cdf10,0x49270e62 },
  102556. { 0xea6b50ad,0x1a39b7bb,0xa2388ffc,0x9a0284c1,0x8107197b,0x5403eb17,
  102557. 0x61372f7f,0xd2ee52f9 } },
  102558. /* 218 */
  102559. { { 0x88e0362a,0xd37cd285,0x8fa5d94d,0x442fa8a7,0xa434a526,0xaff836e5,
  102560. 0xe5abb733,0xdfb478be },
  102561. { 0x673eede6,0xa91f1ce7,0x2b5b2f04,0xa5390ad4,0x5530da2f,0x5e66f7bf,
  102562. 0x08df473a,0xd9a140b4 } },
  102563. /* 219 */
  102564. { { 0x6e8ea498,0x0e0221b5,0x3563ee09,0x62347829,0x335d2ade,0xe06b8391,
  102565. 0x623f4b1a,0x760c058d },
  102566. { 0xc198aa79,0x0b89b58c,0xf07aba7f,0xf74890d2,0xfde2556a,0x4e204110,
  102567. 0x8f190409,0x7141982d } },
  102568. /* 220 */
  102569. { { 0x4d4b0f45,0x6f0a0e33,0x392a94e1,0xd9280b38,0xb3c61d5e,0x3af324c6,
  102570. 0x89d54e47,0x3af9d1ce },
  102571. { 0x20930371,0xfd8f7981,0x21c17097,0xeda2664c,0xdc42309b,0x0e9545dc,
  102572. 0x73957dd6,0xb1f815c3 } },
  102573. /* 221 */
  102574. { { 0x89fec44a,0x84faa78e,0x3caa4caf,0xc8c2ae47,0xc1b6a624,0x691c807d,
  102575. 0x1543f052,0xa41aed14 },
  102576. { 0x7d5ffe04,0x42435399,0x625b6e20,0x8bacb2df,0x87817775,0x85d660be,
  102577. 0x86fb60ef,0xd6e9c1dd } },
  102578. /* 222 */
  102579. { { 0xc6853264,0x3aa2e97e,0xe2304a0b,0x771533b7,0xb8eae9be,0x1b912bb7,
  102580. 0xae9bf8c2,0x9c9c6e10 },
  102581. { 0xe030b74c,0xa2309a59,0x6a631e90,0x4ed7494d,0xa49b79f2,0x89f44b23,
  102582. 0x40fa61b6,0x566bd596 } },
  102583. /* 223 */
  102584. { { 0xc18061f3,0x066c0118,0x7c83fc70,0x190b25d3,0x27273245,0xf05fc8e0,
  102585. 0xf525345e,0xcf2c7390 },
  102586. { 0x10eb30cf,0xa09bceb4,0x0d77703a,0xcfd2ebba,0x150ff255,0xe842c43a,
  102587. 0x8aa20979,0x02f51755 } },
  102588. /* 224 */
  102589. { { 0xaddb7d07,0x396ef794,0x24455500,0x0b4fc742,0xc78aa3ce,0xfaff8eac,
  102590. 0xe8d4d97d,0x14e9ada5 },
  102591. { 0x2f7079e2,0xdaa480a1,0xe4b0800e,0x45baa3cd,0x7838157d,0x01765e2d,
  102592. 0x8e9d9ae8,0xa0ad4fab } },
  102593. /* 225 */
  102594. { { 0x4a653618,0x0bfb7621,0x31eaaa5f,0x1872813c,0x44949d5e,0x1553e737,
  102595. 0x6e56ed1e,0xbcd530b8 },
  102596. { 0x32e9c47b,0x169be853,0xb50059ab,0xdc2776fe,0x192bfbb4,0xcdba9761,
  102597. 0x6979341d,0x909283cf } },
  102598. /* 226 */
  102599. { { 0x76e81a13,0x67b00324,0x62171239,0x9bee1a99,0xd32e19d6,0x08ed361b,
  102600. 0xace1549a,0x35eeb7c9 },
  102601. { 0x7e4e5bdc,0x1280ae5a,0xb6ceec6e,0x2dcd2cd3,0x6e266bc1,0x52e4224c,
  102602. 0x448ae864,0x9a8b2cf4 } },
  102603. /* 227 */
  102604. { { 0x09d03b59,0xf6471bf2,0xb65af2ab,0xc90e62a3,0xebd5eec9,0xff7ff168,
  102605. 0xd4491379,0x6bdb60f4 },
  102606. { 0x8a55bc30,0xdadafebc,0x10097fe0,0xc79ead16,0x4c1e3bdd,0x42e19741,
  102607. 0x94ba08a9,0x01ec3cfd } },
  102608. /* 228 */
  102609. { { 0xdc9485c2,0xba6277eb,0x22fb10c7,0x48cc9a79,0x70a28d8a,0x4f61d60f,
  102610. 0x475464f6,0xd1acb1c0 },
  102611. { 0x26f36612,0xd26902b1,0xe0618d8b,0x59c3a44e,0x308357ee,0x4df8a813,
  102612. 0x405626c2,0x7dcd079d } },
  102613. /* 229 */
  102614. { { 0xf05a4b48,0x5ce7d4d3,0x37230772,0xadcd2952,0x812a915a,0xd18f7971,
  102615. 0x377d19b8,0x0bf53589 },
  102616. { 0x6c68ea73,0x35ecd95a,0x823a584d,0xc7f3bbca,0xf473a723,0x9fb674c6,
  102617. 0xe16686fc,0xd28be4d9 } },
  102618. /* 230 */
  102619. { { 0x38fa8e4b,0x5d2b9906,0x893fd8fc,0x559f186e,0x436fb6fc,0x3a6de2aa,
  102620. 0x510f88ce,0xd76007aa },
  102621. { 0x523a4988,0x2d10aab6,0x74dd0273,0xb455cf44,0xa3407278,0x7f467082,
  102622. 0xb303bb01,0xf2b52f68 } },
  102623. /* 231 */
  102624. { { 0x9835b4ca,0x0d57eafa,0xbb669cbc,0x2d2232fc,0xc6643198,0x8eeeb680,
  102625. 0xcc5aed3a,0xd8dbe98e },
  102626. { 0xc5a02709,0xcba9be3f,0xf5ba1fa8,0x30be68e5,0xf10ea852,0xfebd43cd,
  102627. 0xee559705,0xe01593a3 } },
  102628. /* 232 */
  102629. { { 0xea75a0a6,0xd3e5af50,0x57858033,0x512226ac,0xd0176406,0x6fe6d50f,
  102630. 0xaeb8ef06,0xafec07b1 },
  102631. { 0x80bb0a31,0x7fb99567,0x37309aae,0x6f1af3cc,0x01abf389,0x9153a15a,
  102632. 0x6e2dbfdd,0xa71b9354 } },
  102633. /* 233 */
  102634. { { 0x18f593d2,0xbf8e12e0,0xa078122b,0xd1a90428,0x0ba4f2ad,0x150505db,
  102635. 0x628523d9,0x53a2005c },
  102636. { 0xe7f2b935,0x07c8b639,0xc182961a,0x2bff975a,0x7518ca2c,0x86bceea7,
  102637. 0x3d588e3d,0xbf47d19b } },
  102638. /* 234 */
  102639. { { 0xdd7665d5,0x672967a7,0x2f2f4de5,0x4e303057,0x80d4903f,0x144005ae,
  102640. 0x39c9a1b6,0x001c2c7f },
  102641. { 0x69efc6d6,0x143a8014,0x7bc7a724,0xc810bdaa,0xa78150a4,0x5f65670b,
  102642. 0x86ffb99b,0xfdadf8e7 } },
  102643. /* 235 */
  102644. { { 0xffc00785,0xfd38cb88,0x3b48eb67,0x77fa7591,0xbf368fbc,0x0454d055,
  102645. 0x5aa43c94,0x3a838e4d },
  102646. { 0x3e97bb9a,0x56166329,0x441d94d9,0x9eb93363,0x0adb2a83,0x515591a6,
  102647. 0x873e1da3,0x3cdb8257 } },
  102648. /* 236 */
  102649. { { 0x7de77eab,0x137140a9,0x41648109,0xf7e1c50d,0xceb1d0df,0x762dcad2,
  102650. 0xf1f57fba,0x5a60cc89 },
  102651. { 0x40d45673,0x80b36382,0x5913c655,0x1b82be19,0xdd64b741,0x057284b8,
  102652. 0xdbfd8fc0,0x922ff56f } },
  102653. /* 237 */
  102654. { { 0xc9a129a1,0x1b265dee,0xcc284e04,0xa5b1ce57,0xcebfbe3c,0x04380c46,
  102655. 0xf6c5cd62,0x72919a7d },
  102656. { 0x8fb90f9a,0x298f453a,0x88e4031b,0xd719c00b,0x796f1856,0xe32c0e77,
  102657. 0x3624089a,0x5e791780 } },
  102658. /* 238 */
  102659. { { 0x7f63cdfb,0x5c16ec55,0xf1cae4fd,0x8e6a3571,0x560597ca,0xfce26bea,
  102660. 0xe24c2fab,0x4e0a5371 },
  102661. { 0xa5765357,0x276a40d3,0x0d73a2b4,0x3c89af44,0x41d11a32,0xb8f370ae,
  102662. 0xd56604ee,0xf5ff7818 } },
  102663. /* 239 */
  102664. { { 0x1a09df21,0xfbf3e3fe,0xe66e8e47,0x26d5d28e,0x29c89015,0x2096bd0a,
  102665. 0x533f5e64,0xe41df0e9 },
  102666. { 0xb3ba9e3f,0x305fda40,0x2604d895,0xf2340ceb,0x7f0367c7,0x0866e192,
  102667. 0xac4f155f,0x8edd7d6e } },
  102668. /* 240 */
  102669. { { 0x0bfc8ff3,0xc9a1dc0e,0xe936f42f,0x14efd82b,0xcca381ef,0x67016f7c,
  102670. 0xed8aee96,0x1432c1ca },
  102671. { 0x70b23c26,0xec684829,0x0735b273,0xa64fe873,0xeaef0f5a,0xe389f6e5,
  102672. 0x5ac8d2c6,0xcaef480b } },
  102673. /* 241 */
  102674. { { 0x75315922,0x5245c978,0x3063cca5,0xd8295171,0xb64ef2cb,0xf3ce60d0,
  102675. 0x8efae236,0xd0ba177e },
  102676. { 0xb1b3af60,0x53a9ae8f,0x3d2da20e,0x1a796ae5,0xdf9eef28,0x01d63605,
  102677. 0x1c54ae16,0xf31c957c } },
  102678. /* 242 */
  102679. { { 0x49cc4597,0xc0f58d52,0xbae0a028,0xdc5015b0,0x734a814a,0xefc5fc55,
  102680. 0x96e17c3a,0x013404cb },
  102681. { 0xc9a824bf,0xb29e2585,0x001eaed7,0xd593185e,0x61ef68ac,0x8d6ee682,
  102682. 0x91933e6c,0x6f377c4b } },
  102683. /* 243 */
  102684. { { 0xa8333fd2,0x9f93bad1,0x5a2a95b8,0xa8930202,0xeaf75ace,0x211e5037,
  102685. 0xd2d09506,0x6dba3e4e },
  102686. { 0xd04399cd,0xa48ef98c,0xe6b73ade,0x1811c66e,0xc17ecaf3,0x72f60752,
  102687. 0x3becf4a7,0xf13cf342 } },
  102688. /* 244 */
  102689. { { 0xa919e2eb,0xceeb9ec0,0xf62c0f68,0x83a9a195,0x7aba2299,0xcfba3bb6,
  102690. 0x274bbad3,0xc83fa9a9 },
  102691. { 0x62fa1ce0,0x0d7d1b0b,0x3418efbf,0xe58b60f5,0x52706f04,0xbfa8ef9e,
  102692. 0x5d702683,0xb49d70f4 } },
  102693. /* 245 */
  102694. { { 0xfad5513b,0x914c7510,0xb1751e2d,0x05f32eec,0xd9fb9d59,0x6d850418,
  102695. 0x0c30f1cf,0x59cfadbb },
  102696. { 0x55cb7fd6,0xe167ac23,0x820426a3,0x249367b8,0x90a78864,0xeaeec58c,
  102697. 0x354a4b67,0x5babf362 } },
  102698. /* 246 */
  102699. { { 0xee424865,0x37c981d1,0xf2e5577f,0x8b002878,0xb9e0c058,0x702970f1,
  102700. 0x9026c8f0,0x6188c6a7 },
  102701. { 0xd0f244da,0x06f9a19b,0xfb080873,0x1ecced5c,0x9f213637,0x35470f9b,
  102702. 0xdf50b9d9,0x993fe475 } },
  102703. /* 247 */
  102704. { { 0x9b2c3609,0x68e31cdf,0x2c46d4ea,0x84eb19c0,0x9a775101,0x7ac9ec1a,
  102705. 0x4c80616b,0x81f76466 },
  102706. { 0x75fbe978,0x1d7c2a5a,0xf183b356,0x6743fed3,0x501dd2bf,0x838d1f04,
  102707. 0x5fe9060d,0x564a812a } },
  102708. /* 248 */
  102709. { { 0xfa817d1d,0x7a5a64f4,0xbea82e0f,0x55f96844,0xcd57f9aa,0xb5ff5a0f,
  102710. 0x00e51d6c,0x226bf3cf },
  102711. { 0x2f2833cf,0xd6d1a9f9,0x4f4f89a8,0x20a0a35a,0x8f3f7f77,0x11536c49,
  102712. 0xff257836,0x68779f47 } },
  102713. /* 249 */
  102714. { { 0x73043d08,0x79b0c1c1,0x1fc020fa,0xa5446774,0x9a6d26d0,0xd3767e28,
  102715. 0xeb092e0b,0x97bcb0d1 },
  102716. { 0xf32ed3c3,0x2ab6eaa8,0xb281bc48,0xc8a4f151,0xbfa178f3,0x4d1bf4f3,
  102717. 0x0a784655,0xa872ffe8 } },
  102718. /* 250 */
  102719. { { 0xa32b2086,0xb1ab7935,0x8160f486,0xe1eb710e,0x3b6ae6be,0x9bd0cd91,
  102720. 0xb732a36a,0x02812bfc },
  102721. { 0xcf605318,0xa63fd7ca,0xfdfd6d1d,0x646e5d50,0x2102d619,0xa1d68398,
  102722. 0xfe5396af,0x07391cc9 } },
  102723. /* 251 */
  102724. { { 0x8b80d02b,0xc50157f0,0x62877f7f,0x6b8333d1,0x78d542ae,0x7aca1af8,
  102725. 0x7e6d2a08,0x355d2adc },
  102726. { 0x287386e1,0xb41f335a,0xf8e43275,0xfd272a94,0xe79989ea,0x286ca2cd,
  102727. 0x7c2a3a79,0x3dc2b1e3 } },
  102728. /* 252 */
  102729. { { 0x04581352,0xd689d21c,0x376782be,0x0a00c825,0x9fed701f,0x203bd590,
  102730. 0x3ccd846b,0xc4786910 },
  102731. { 0x24c768ed,0x5dba7708,0x6841f657,0x72feea02,0x6accce0e,0x73313ed5,
  102732. 0xd5bb4d32,0xccc42968 } },
  102733. /* 253 */
  102734. { { 0x3d7620b9,0x94e50de1,0x5992a56a,0xd89a5c8a,0x675487c9,0xdc007640,
  102735. 0xaa4871cf,0xe147eb42 },
  102736. { 0xacf3ae46,0x274ab4ee,0x50350fbe,0xfd4936fb,0x48c840ea,0xdf2afe47,
  102737. 0x080e96e3,0x239ac047 } },
  102738. /* 254 */
  102739. { { 0x2bfee8d4,0x481d1f35,0xfa7b0fec,0xce80b5cf,0x2ce9af3c,0x105c4c9e,
  102740. 0xf5f7e59d,0xc55fa1a3 },
  102741. { 0x8257c227,0x3186f14e,0x342be00b,0xc5b1653f,0xaa904fb2,0x09afc998,
  102742. 0xd4f4b699,0x094cd99c } },
  102743. /* 255 */
  102744. { { 0xd703beba,0x8a981c84,0x32ceb291,0x8631d150,0xe3bd49ec,0xa445f2c9,
  102745. 0x42abad33,0xb90a30b6 },
  102746. { 0xb4a5abf9,0xb465404f,0x75db7603,0x004750c3,0xca35d89f,0x6f9a42cc,
  102747. 0x1b7924f7,0x019f8b9a } },
  102748. };
  102749. /* Multiply the base point of P256 by the scalar and return the result.
  102750. * If map is true then convert result to affine coordinates.
  102751. *
  102752. * Stripe implementation.
  102753. * Pre-generated: 2^0, 2^32, ...
  102754. * Pre-generated: products of all combinations of above.
  102755. * 8 doubles and adds (with qz=1)
  102756. *
  102757. * r Resulting point.
  102758. * k Scalar to multiply by.
  102759. * map Indicates whether to convert result to affine.
  102760. * ct Constant time required.
  102761. * heap Heap to use for allocation.
  102762. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  102763. */
  102764. static int sp_256_ecc_mulmod_base_8(sp_point_256* r, const sp_digit* k,
  102765. int map, int ct, void* heap)
  102766. {
  102767. return sp_256_ecc_mulmod_stripe_8(r, &p256_base, p256_table,
  102768. k, map, ct, heap);
  102769. }
  102770. #endif
  102771. /* Multiply the base point of P256 by the scalar and return the result.
  102772. * If map is true then convert result to affine coordinates.
  102773. *
  102774. * km Scalar to multiply by.
  102775. * r Resulting point.
  102776. * map Indicates whether to convert result to affine.
  102777. * heap Heap to use for allocation.
  102778. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  102779. */
  102780. int sp_ecc_mulmod_base_256(const mp_int* km, ecc_point* r, int map, void* heap)
  102781. {
  102782. #ifdef WOLFSSL_SP_SMALL_STACK
  102783. sp_point_256* point = NULL;
  102784. sp_digit* k = NULL;
  102785. #else
  102786. sp_point_256 point[1];
  102787. sp_digit k[8];
  102788. #endif
  102789. int err = MP_OKAY;
  102790. #ifdef WOLFSSL_SP_SMALL_STACK
  102791. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  102792. DYNAMIC_TYPE_ECC);
  102793. if (point == NULL)
  102794. err = MEMORY_E;
  102795. if (err == MP_OKAY) {
  102796. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  102797. DYNAMIC_TYPE_ECC);
  102798. if (k == NULL)
  102799. err = MEMORY_E;
  102800. }
  102801. #endif
  102802. if (err == MP_OKAY) {
  102803. sp_256_from_mp(k, 8, km);
  102804. err = sp_256_ecc_mulmod_base_8(point, k, map, 1, heap);
  102805. }
  102806. if (err == MP_OKAY) {
  102807. err = sp_256_point_to_ecc_point_8(point, r);
  102808. }
  102809. #ifdef WOLFSSL_SP_SMALL_STACK
  102810. if (k != NULL)
  102811. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  102812. if (point != NULL)
  102813. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  102814. #endif
  102815. return err;
  102816. }
  102817. /* Multiply the base point of P256 by the scalar, add point a and return
  102818. * the result. If map is true then convert result to affine coordinates.
  102819. *
  102820. * km Scalar to multiply by.
  102821. * am Point to add to scalar multiply result.
  102822. * inMont Point to add is in montgomery form.
  102823. * r Resulting point.
  102824. * map Indicates whether to convert result to affine.
  102825. * heap Heap to use for allocation.
  102826. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  102827. */
  102828. int sp_ecc_mulmod_base_add_256(const mp_int* km, const ecc_point* am,
  102829. int inMont, ecc_point* r, int map, void* heap)
  102830. {
  102831. #ifdef WOLFSSL_SP_SMALL_STACK
  102832. sp_point_256* point = NULL;
  102833. sp_digit* k = NULL;
  102834. #else
  102835. sp_point_256 point[2];
  102836. sp_digit k[8 + 8 * 2 * 6];
  102837. #endif
  102838. sp_point_256* addP = NULL;
  102839. sp_digit* tmp = NULL;
  102840. int err = MP_OKAY;
  102841. #ifdef WOLFSSL_SP_SMALL_STACK
  102842. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  102843. DYNAMIC_TYPE_ECC);
  102844. if (point == NULL)
  102845. err = MEMORY_E;
  102846. if (err == MP_OKAY) {
  102847. k = (sp_digit*)XMALLOC(
  102848. sizeof(sp_digit) * (8 + 8 * 2 * 6),
  102849. heap, DYNAMIC_TYPE_ECC);
  102850. if (k == NULL)
  102851. err = MEMORY_E;
  102852. }
  102853. #endif
  102854. if (err == MP_OKAY) {
  102855. addP = point + 1;
  102856. tmp = k + 8;
  102857. sp_256_from_mp(k, 8, km);
  102858. sp_256_point_from_ecc_point_8(addP, am);
  102859. }
  102860. if ((err == MP_OKAY) && (!inMont)) {
  102861. err = sp_256_mod_mul_norm_8(addP->x, addP->x, p256_mod);
  102862. }
  102863. if ((err == MP_OKAY) && (!inMont)) {
  102864. err = sp_256_mod_mul_norm_8(addP->y, addP->y, p256_mod);
  102865. }
  102866. if ((err == MP_OKAY) && (!inMont)) {
  102867. err = sp_256_mod_mul_norm_8(addP->z, addP->z, p256_mod);
  102868. }
  102869. if (err == MP_OKAY) {
  102870. err = sp_256_ecc_mulmod_base_8(point, k, 0, 0, heap);
  102871. }
  102872. if (err == MP_OKAY) {
  102873. sp_256_proj_point_add_8(point, point, addP, tmp);
  102874. if (map) {
  102875. sp_256_map_8(point, point, tmp);
  102876. }
  102877. err = sp_256_point_to_ecc_point_8(point, r);
  102878. }
  102879. #ifdef WOLFSSL_SP_SMALL_STACK
  102880. if (k != NULL)
  102881. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  102882. if (point)
  102883. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  102884. #endif
  102885. return err;
  102886. }
  102887. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  102888. defined(HAVE_ECC_VERIFY)
  102889. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  102890. /* Add 1 to a. (a = a + 1)
  102891. *
  102892. * a A single precision integer.
  102893. */
  102894. SP_NOINLINE static void sp_256_add_one_8(sp_digit* a)
  102895. {
  102896. __asm__ __volatile__ (
  102897. "movs r2, #1\n\t"
  102898. "ldr r1, [%[a]]\n\t"
  102899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102900. "adds r1, r1, r2\n\t"
  102901. #else
  102902. "add r1, r1, r2\n\t"
  102903. #endif
  102904. "movs r2, #0\n\t"
  102905. "str r1, [%[a]]\n\t"
  102906. "ldr r1, [%[a], #4]\n\t"
  102907. #ifdef WOLFSSL_KEIL
  102908. "adcs r1, r1, r2\n\t"
  102909. #elif defined(__clang__)
  102910. "adcs r1, r2\n\t"
  102911. #else
  102912. "adc r1, r2\n\t"
  102913. #endif
  102914. "str r1, [%[a], #4]\n\t"
  102915. "ldr r1, [%[a], #8]\n\t"
  102916. #ifdef WOLFSSL_KEIL
  102917. "adcs r1, r1, r2\n\t"
  102918. #elif defined(__clang__)
  102919. "adcs r1, r2\n\t"
  102920. #else
  102921. "adc r1, r2\n\t"
  102922. #endif
  102923. "str r1, [%[a], #8]\n\t"
  102924. "ldr r1, [%[a], #12]\n\t"
  102925. #ifdef WOLFSSL_KEIL
  102926. "adcs r1, r1, r2\n\t"
  102927. #elif defined(__clang__)
  102928. "adcs r1, r2\n\t"
  102929. #else
  102930. "adc r1, r2\n\t"
  102931. #endif
  102932. "str r1, [%[a], #12]\n\t"
  102933. "ldr r1, [%[a], #16]\n\t"
  102934. #ifdef WOLFSSL_KEIL
  102935. "adcs r1, r1, r2\n\t"
  102936. #elif defined(__clang__)
  102937. "adcs r1, r2\n\t"
  102938. #else
  102939. "adc r1, r2\n\t"
  102940. #endif
  102941. "str r1, [%[a], #16]\n\t"
  102942. "ldr r1, [%[a], #20]\n\t"
  102943. #ifdef WOLFSSL_KEIL
  102944. "adcs r1, r1, r2\n\t"
  102945. #elif defined(__clang__)
  102946. "adcs r1, r2\n\t"
  102947. #else
  102948. "adc r1, r2\n\t"
  102949. #endif
  102950. "str r1, [%[a], #20]\n\t"
  102951. "ldr r1, [%[a], #24]\n\t"
  102952. #ifdef WOLFSSL_KEIL
  102953. "adcs r1, r1, r2\n\t"
  102954. #elif defined(__clang__)
  102955. "adcs r1, r2\n\t"
  102956. #else
  102957. "adc r1, r2\n\t"
  102958. #endif
  102959. "str r1, [%[a], #24]\n\t"
  102960. "ldr r1, [%[a], #28]\n\t"
  102961. #ifdef WOLFSSL_KEIL
  102962. "adcs r1, r1, r2\n\t"
  102963. #elif defined(__clang__)
  102964. "adcs r1, r2\n\t"
  102965. #else
  102966. "adc r1, r2\n\t"
  102967. #endif
  102968. "str r1, [%[a], #28]\n\t"
  102969. : [a] "+l" (a)
  102970. :
  102971. : "memory", "r1", "r2"
  102972. );
  102973. }
  102974. /* Read big endian unsigned byte array into r.
  102975. *
  102976. * r A single precision integer.
  102977. * size Maximum number of bytes to convert
  102978. * a Byte array.
  102979. * n Number of bytes in array to read.
  102980. */
  102981. static void sp_256_from_bin(sp_digit* r, int size, const byte* a, int n)
  102982. {
  102983. int i;
  102984. int j;
  102985. byte* d;
  102986. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  102987. r[j] = ((sp_digit)a[i - 0] << 0) |
  102988. ((sp_digit)a[i - 1] << 8) |
  102989. ((sp_digit)a[i - 2] << 16) |
  102990. ((sp_digit)a[i - 3] << 24);
  102991. j++;
  102992. }
  102993. if (i >= 0) {
  102994. r[j] = 0;
  102995. d = (byte*)r;
  102996. switch (i) {
  102997. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  102998. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  102999. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  103000. }
  103001. j++;
  103002. }
  103003. for (; j < size; j++) {
  103004. r[j] = 0;
  103005. }
  103006. }
  103007. /* Generates a scalar that is in the range 1..order-1.
  103008. *
  103009. * rng Random number generator.
  103010. * k Scalar value.
  103011. * returns RNG failures, MEMORY_E when memory allocation fails and
  103012. * MP_OKAY on success.
  103013. */
  103014. static int sp_256_ecc_gen_k_8(WC_RNG* rng, sp_digit* k)
  103015. {
  103016. int err;
  103017. byte buf[32];
  103018. do {
  103019. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  103020. if (err == 0) {
  103021. sp_256_from_bin(k, 8, buf, (int)sizeof(buf));
  103022. if (sp_256_cmp_8(k, p256_order2) <= 0) {
  103023. sp_256_add_one_8(k);
  103024. break;
  103025. }
  103026. }
  103027. }
  103028. while (err == 0);
  103029. return err;
  103030. }
  103031. /* Makes a random EC key pair.
  103032. *
  103033. * rng Random number generator.
  103034. * priv Generated private value.
  103035. * pub Generated public point.
  103036. * heap Heap to use for allocation.
  103037. * returns ECC_INF_E when the point does not have the correct order, RNG
  103038. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  103039. */
  103040. int sp_ecc_make_key_256(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  103041. {
  103042. #ifdef WOLFSSL_SP_SMALL_STACK
  103043. sp_point_256* point = NULL;
  103044. sp_digit* k = NULL;
  103045. #else
  103046. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103047. sp_point_256 point[2];
  103048. #else
  103049. sp_point_256 point[1];
  103050. #endif
  103051. sp_digit k[8];
  103052. #endif
  103053. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103054. sp_point_256* infinity = NULL;
  103055. #endif
  103056. int err = MP_OKAY;
  103057. (void)heap;
  103058. #ifdef WOLFSSL_SP_SMALL_STACK
  103059. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103060. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC);
  103061. #else
  103062. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC);
  103063. #endif
  103064. if (point == NULL)
  103065. err = MEMORY_E;
  103066. if (err == MP_OKAY) {
  103067. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  103068. DYNAMIC_TYPE_ECC);
  103069. if (k == NULL)
  103070. err = MEMORY_E;
  103071. }
  103072. #endif
  103073. if (err == MP_OKAY) {
  103074. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103075. infinity = point + 1;
  103076. #endif
  103077. err = sp_256_ecc_gen_k_8(rng, k);
  103078. }
  103079. if (err == MP_OKAY) {
  103080. err = sp_256_ecc_mulmod_base_8(point, k, 1, 1, NULL);
  103081. }
  103082. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103083. if (err == MP_OKAY) {
  103084. err = sp_256_ecc_mulmod_8(infinity, point, p256_order, 1, 1, NULL);
  103085. }
  103086. if (err == MP_OKAY) {
  103087. if (sp_256_iszero_8(point->x) || sp_256_iszero_8(point->y)) {
  103088. err = ECC_INF_E;
  103089. }
  103090. }
  103091. #endif
  103092. if (err == MP_OKAY) {
  103093. err = sp_256_to_mp(k, priv);
  103094. }
  103095. if (err == MP_OKAY) {
  103096. err = sp_256_point_to_ecc_point_8(point, pub);
  103097. }
  103098. #ifdef WOLFSSL_SP_SMALL_STACK
  103099. if (k != NULL)
  103100. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  103101. if (point != NULL) {
  103102. /* point is not sensitive, so no need to zeroize */
  103103. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  103104. }
  103105. #endif
  103106. return err;
  103107. }
  103108. #ifdef WOLFSSL_SP_NONBLOCK
  103109. typedef struct sp_ecc_key_gen_256_ctx {
  103110. int state;
  103111. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  103112. sp_digit k[8];
  103113. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103114. sp_point_256 point[2];
  103115. #else
  103116. sp_point_256 point[1];
  103117. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  103118. } sp_ecc_key_gen_256_ctx;
  103119. int sp_ecc_make_key_256_nb(sp_ecc_ctx_t* sp_ctx, WC_RNG* rng, mp_int* priv,
  103120. ecc_point* pub, void* heap)
  103121. {
  103122. int err = FP_WOULDBLOCK;
  103123. sp_ecc_key_gen_256_ctx* ctx = (sp_ecc_key_gen_256_ctx*)sp_ctx->data;
  103124. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103125. sp_point_256* infinity = ctx->point + 1;
  103126. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  103127. typedef char ctx_size_test[sizeof(sp_ecc_key_gen_256_ctx)
  103128. >= sizeof(*sp_ctx) ? -1 : 1];
  103129. (void)sizeof(ctx_size_test);
  103130. switch (ctx->state) {
  103131. case 0:
  103132. err = sp_256_ecc_gen_k_8(rng, ctx->k);
  103133. if (err == MP_OKAY) {
  103134. err = FP_WOULDBLOCK;
  103135. ctx->state = 1;
  103136. }
  103137. break;
  103138. case 1:
  103139. err = sp_256_ecc_mulmod_base_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  103140. ctx->point, ctx->k, 1, 1, heap);
  103141. if (err == MP_OKAY) {
  103142. err = FP_WOULDBLOCK;
  103143. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103144. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  103145. ctx->state = 2;
  103146. #else
  103147. ctx->state = 3;
  103148. #endif
  103149. }
  103150. break;
  103151. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103152. case 2:
  103153. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  103154. infinity, ctx->point, p256_order, 1, 1);
  103155. if (err == MP_OKAY) {
  103156. if (sp_256_iszero_8(ctx->point->x) ||
  103157. sp_256_iszero_8(ctx->point->y)) {
  103158. err = ECC_INF_E;
  103159. }
  103160. else {
  103161. err = FP_WOULDBLOCK;
  103162. ctx->state = 3;
  103163. }
  103164. }
  103165. break;
  103166. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  103167. case 3:
  103168. err = sp_256_to_mp(ctx->k, priv);
  103169. if (err == MP_OKAY) {
  103170. err = sp_256_point_to_ecc_point_8(ctx->point, pub);
  103171. }
  103172. break;
  103173. }
  103174. if (err != FP_WOULDBLOCK) {
  103175. XMEMSET(ctx, 0, sizeof(sp_ecc_key_gen_256_ctx));
  103176. }
  103177. return err;
  103178. }
  103179. #endif /* WOLFSSL_SP_NONBLOCK */
  103180. #ifdef HAVE_ECC_DHE
  103181. /* Write r as big endian to byte array.
  103182. * Fixed length number of bytes written: 32
  103183. *
  103184. * r A single precision integer.
  103185. * a Byte array.
  103186. */
  103187. static void sp_256_to_bin_8(sp_digit* r, byte* a)
  103188. {
  103189. int i;
  103190. int j = 0;
  103191. for (i = 7; i >= 0; i--) {
  103192. a[j++] = r[i] >> 24;
  103193. a[j++] = r[i] >> 16;
  103194. a[j++] = r[i] >> 8;
  103195. a[j++] = r[i] >> 0;
  103196. }
  103197. }
  103198. /* Multiply the point by the scalar and serialize the X ordinate.
  103199. * The number is 0 padded to maximum size on output.
  103200. *
  103201. * priv Scalar to multiply the point by.
  103202. * pub Point to multiply.
  103203. * out Buffer to hold X ordinate.
  103204. * outLen On entry, size of the buffer in bytes.
  103205. * On exit, length of data in buffer in bytes.
  103206. * heap Heap to use for allocation.
  103207. * returns BUFFER_E if the buffer is to small for output size,
  103208. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  103209. */
  103210. int sp_ecc_secret_gen_256(const mp_int* priv, const ecc_point* pub, byte* out,
  103211. word32* outLen, void* heap)
  103212. {
  103213. #ifdef WOLFSSL_SP_SMALL_STACK
  103214. sp_point_256* point = NULL;
  103215. sp_digit* k = NULL;
  103216. #else
  103217. sp_point_256 point[1];
  103218. sp_digit k[8];
  103219. #endif
  103220. int err = MP_OKAY;
  103221. if (*outLen < 32U) {
  103222. err = BUFFER_E;
  103223. }
  103224. #ifdef WOLFSSL_SP_SMALL_STACK
  103225. if (err == MP_OKAY) {
  103226. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  103227. DYNAMIC_TYPE_ECC);
  103228. if (point == NULL)
  103229. err = MEMORY_E;
  103230. }
  103231. if (err == MP_OKAY) {
  103232. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  103233. DYNAMIC_TYPE_ECC);
  103234. if (k == NULL)
  103235. err = MEMORY_E;
  103236. }
  103237. #endif
  103238. if (err == MP_OKAY) {
  103239. sp_256_from_mp(k, 8, priv);
  103240. sp_256_point_from_ecc_point_8(point, pub);
  103241. err = sp_256_ecc_mulmod_8(point, point, k, 1, 1, heap);
  103242. }
  103243. if (err == MP_OKAY) {
  103244. sp_256_to_bin_8(point->x, out);
  103245. *outLen = 32;
  103246. }
  103247. #ifdef WOLFSSL_SP_SMALL_STACK
  103248. if (k != NULL)
  103249. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  103250. if (point != NULL)
  103251. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  103252. #endif
  103253. return err;
  103254. }
  103255. #ifdef WOLFSSL_SP_NONBLOCK
  103256. typedef struct sp_ecc_sec_gen_256_ctx {
  103257. int state;
  103258. union {
  103259. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  103260. };
  103261. sp_digit k[8];
  103262. sp_point_256 point;
  103263. } sp_ecc_sec_gen_256_ctx;
  103264. int sp_ecc_secret_gen_256_nb(sp_ecc_ctx_t* sp_ctx, const mp_int* priv,
  103265. const ecc_point* pub, byte* out, word32* outLen, void* heap)
  103266. {
  103267. int err = FP_WOULDBLOCK;
  103268. sp_ecc_sec_gen_256_ctx* ctx = (sp_ecc_sec_gen_256_ctx*)sp_ctx->data;
  103269. typedef char ctx_size_test[sizeof(sp_ecc_sec_gen_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  103270. (void)sizeof(ctx_size_test);
  103271. if (*outLen < 32U) {
  103272. err = BUFFER_E;
  103273. }
  103274. switch (ctx->state) {
  103275. case 0:
  103276. sp_256_from_mp(ctx->k, 8, priv);
  103277. sp_256_point_from_ecc_point_8(&ctx->point, pub);
  103278. ctx->state = 1;
  103279. break;
  103280. case 1:
  103281. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  103282. &ctx->point, &ctx->point, ctx->k, 1, 1, heap);
  103283. if (err == MP_OKAY) {
  103284. sp_256_to_bin_8(ctx->point.x, out);
  103285. *outLen = 32;
  103286. }
  103287. break;
  103288. }
  103289. if (err == MP_OKAY && ctx->state != 1) {
  103290. err = FP_WOULDBLOCK;
  103291. }
  103292. if (err != FP_WOULDBLOCK) {
  103293. XMEMSET(ctx, 0, sizeof(sp_ecc_sec_gen_256_ctx));
  103294. }
  103295. return err;
  103296. }
  103297. #endif /* WOLFSSL_SP_NONBLOCK */
  103298. #endif /* HAVE_ECC_DHE */
  103299. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  103300. #endif
  103301. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  103302. #endif
  103303. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  103304. #ifdef WOLFSSL_SP_SMALL
  103305. /* Sub b from a into a. (a -= b)
  103306. *
  103307. * a A single precision integer.
  103308. * b A single precision integer.
  103309. */
  103310. SP_NOINLINE static sp_digit sp_256_sub_in_place_8(sp_digit* a,
  103311. const sp_digit* b)
  103312. {
  103313. __asm__ __volatile__ (
  103314. "movs r7, %[a]\n\t"
  103315. "movs r2, #0\n\t"
  103316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103317. "adds r7, r7, #32\n\t"
  103318. #else
  103319. "add r7, r7, #32\n\t"
  103320. #endif
  103321. "\n"
  103322. "L_sp_256_sub_in_place_8_words_%=:\n\t"
  103323. "movs r5, #0\n\t"
  103324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103325. "subs r5, r5, r2\n\t"
  103326. #else
  103327. "sub r5, r5, r2\n\t"
  103328. #endif
  103329. "ldr r3, [%[a]]\n\t"
  103330. "ldr r4, [%[a], #4]\n\t"
  103331. "ldr r5, [%[b]]\n\t"
  103332. "ldr r6, [%[b], #4]\n\t"
  103333. #ifdef WOLFSSL_KEIL
  103334. "sbcs r3, r3, r5\n\t"
  103335. #elif defined(__clang__)
  103336. "sbcs r3, r5\n\t"
  103337. #else
  103338. "sbc r3, r5\n\t"
  103339. #endif
  103340. #ifdef WOLFSSL_KEIL
  103341. "sbcs r4, r4, r6\n\t"
  103342. #elif defined(__clang__)
  103343. "sbcs r4, r6\n\t"
  103344. #else
  103345. "sbc r4, r6\n\t"
  103346. #endif
  103347. "str r3, [%[a]]\n\t"
  103348. "str r4, [%[a], #4]\n\t"
  103349. #ifdef WOLFSSL_KEIL
  103350. "sbcs r2, r2, r2\n\t"
  103351. #elif defined(__clang__)
  103352. "sbcs r2, r2\n\t"
  103353. #else
  103354. "sbc r2, r2\n\t"
  103355. #endif
  103356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103357. "adds %[a], %[a], #8\n\t"
  103358. #else
  103359. "add %[a], %[a], #8\n\t"
  103360. #endif
  103361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103362. "adds %[b], %[b], #8\n\t"
  103363. #else
  103364. "add %[b], %[b], #8\n\t"
  103365. #endif
  103366. "cmp %[a], r7\n\t"
  103367. "bne L_sp_256_sub_in_place_8_words_%=\n\t"
  103368. "movs %[a], r2\n\t"
  103369. : [a] "+l" (a), [b] "+l" (b)
  103370. :
  103371. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  103372. );
  103373. return (uint32_t)(size_t)a;
  103374. }
  103375. #else
  103376. /* Sub b from a into a. (a -= b)
  103377. *
  103378. * a A single precision integer.
  103379. * b A single precision integer.
  103380. */
  103381. SP_NOINLINE static sp_digit sp_256_sub_in_place_8(sp_digit* a,
  103382. const sp_digit* b)
  103383. {
  103384. __asm__ __volatile__ (
  103385. "ldm %[b]!, {r4, r5}\n\t"
  103386. "ldr r2, [%[a]]\n\t"
  103387. "ldr r3, [%[a], #4]\n\t"
  103388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103389. "subs r2, r2, r4\n\t"
  103390. #else
  103391. "sub r2, r2, r4\n\t"
  103392. #endif
  103393. #ifdef WOLFSSL_KEIL
  103394. "sbcs r3, r3, r5\n\t"
  103395. #elif defined(__clang__)
  103396. "sbcs r3, r5\n\t"
  103397. #else
  103398. "sbc r3, r5\n\t"
  103399. #endif
  103400. "stm %[a]!, {r2, r3}\n\t"
  103401. "ldm %[b]!, {r4, r5}\n\t"
  103402. "ldr r2, [%[a]]\n\t"
  103403. "ldr r3, [%[a], #4]\n\t"
  103404. #ifdef WOLFSSL_KEIL
  103405. "sbcs r2, r2, r4\n\t"
  103406. #elif defined(__clang__)
  103407. "sbcs r2, r4\n\t"
  103408. #else
  103409. "sbc r2, r4\n\t"
  103410. #endif
  103411. #ifdef WOLFSSL_KEIL
  103412. "sbcs r3, r3, r5\n\t"
  103413. #elif defined(__clang__)
  103414. "sbcs r3, r5\n\t"
  103415. #else
  103416. "sbc r3, r5\n\t"
  103417. #endif
  103418. "stm %[a]!, {r2, r3}\n\t"
  103419. "ldm %[b]!, {r4, r5}\n\t"
  103420. "ldr r2, [%[a]]\n\t"
  103421. "ldr r3, [%[a], #4]\n\t"
  103422. #ifdef WOLFSSL_KEIL
  103423. "sbcs r2, r2, r4\n\t"
  103424. #elif defined(__clang__)
  103425. "sbcs r2, r4\n\t"
  103426. #else
  103427. "sbc r2, r4\n\t"
  103428. #endif
  103429. #ifdef WOLFSSL_KEIL
  103430. "sbcs r3, r3, r5\n\t"
  103431. #elif defined(__clang__)
  103432. "sbcs r3, r5\n\t"
  103433. #else
  103434. "sbc r3, r5\n\t"
  103435. #endif
  103436. "stm %[a]!, {r2, r3}\n\t"
  103437. "ldm %[b]!, {r4, r5}\n\t"
  103438. "ldr r2, [%[a]]\n\t"
  103439. "ldr r3, [%[a], #4]\n\t"
  103440. #ifdef WOLFSSL_KEIL
  103441. "sbcs r2, r2, r4\n\t"
  103442. #elif defined(__clang__)
  103443. "sbcs r2, r4\n\t"
  103444. #else
  103445. "sbc r2, r4\n\t"
  103446. #endif
  103447. #ifdef WOLFSSL_KEIL
  103448. "sbcs r3, r3, r5\n\t"
  103449. #elif defined(__clang__)
  103450. "sbcs r3, r5\n\t"
  103451. #else
  103452. "sbc r3, r5\n\t"
  103453. #endif
  103454. "stm %[a]!, {r2, r3}\n\t"
  103455. #ifdef WOLFSSL_KEIL
  103456. "sbcs %[a], %[a], %[a]\n\t"
  103457. #elif defined(__clang__)
  103458. "sbcs %[a], %[a]\n\t"
  103459. #else
  103460. "sbc %[a], %[a]\n\t"
  103461. #endif
  103462. : [a] "+l" (a), [b] "+l" (b)
  103463. :
  103464. : "memory", "r2", "r3", "r4", "r5"
  103465. );
  103466. return (uint32_t)(size_t)a;
  103467. }
  103468. #endif /* WOLFSSL_SP_SMALL */
  103469. /* Mul a by digit b into r. (r = a * b)
  103470. *
  103471. * r A single precision integer.
  103472. * a A single precision integer.
  103473. * b A single precision digit.
  103474. */
  103475. SP_NOINLINE static void sp_256_mul_d_8(sp_digit* r, const sp_digit* a,
  103476. sp_digit b)
  103477. {
  103478. __asm__ __volatile__ (
  103479. "movs r6, #32\n\t"
  103480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103481. "adds r6, r6, %[a]\n\t"
  103482. #else
  103483. "add r6, r6, %[a]\n\t"
  103484. #endif
  103485. "mov r8, %[r]\n\t"
  103486. "mov r9, r6\n\t"
  103487. "movs r3, #0\n\t"
  103488. "movs r4, #0\n\t"
  103489. "\n"
  103490. "L_sp_256_mul_d_8_%=:\n\t"
  103491. "movs %[r], #0\n\t"
  103492. "movs r5, #0\n\t"
  103493. "# A[] * B\n\t"
  103494. "ldrh r6, [%[a]]\n\t"
  103495. "uxth r7, %[b]\n\t"
  103496. #ifdef WOLFSSL_KEIL
  103497. "muls r7, r6, r7\n\t"
  103498. #elif defined(__clang__)
  103499. "muls r7, r6\n\t"
  103500. #else
  103501. "mul r7, r6\n\t"
  103502. #endif
  103503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103504. "adds r3, r3, r7\n\t"
  103505. #else
  103506. "add r3, r3, r7\n\t"
  103507. #endif
  103508. #ifdef WOLFSSL_KEIL
  103509. "adcs r4, r4, %[r]\n\t"
  103510. #elif defined(__clang__)
  103511. "adcs r4, %[r]\n\t"
  103512. #else
  103513. "adc r4, %[r]\n\t"
  103514. #endif
  103515. #ifdef WOLFSSL_KEIL
  103516. "adcs r5, r5, %[r]\n\t"
  103517. #elif defined(__clang__)
  103518. "adcs r5, %[r]\n\t"
  103519. #else
  103520. "adc r5, %[r]\n\t"
  103521. #endif
  103522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103523. "lsrs r7, %[b], #16\n\t"
  103524. #else
  103525. "lsr r7, %[b], #16\n\t"
  103526. #endif
  103527. #ifdef WOLFSSL_KEIL
  103528. "muls r6, r7, r6\n\t"
  103529. #elif defined(__clang__)
  103530. "muls r6, r7\n\t"
  103531. #else
  103532. "mul r6, r7\n\t"
  103533. #endif
  103534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103535. "lsrs r7, r6, #16\n\t"
  103536. #else
  103537. "lsr r7, r6, #16\n\t"
  103538. #endif
  103539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103540. "lsls r6, r6, #16\n\t"
  103541. #else
  103542. "lsl r6, r6, #16\n\t"
  103543. #endif
  103544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103545. "adds r3, r3, r6\n\t"
  103546. #else
  103547. "add r3, r3, r6\n\t"
  103548. #endif
  103549. #ifdef WOLFSSL_KEIL
  103550. "adcs r4, r4, r7\n\t"
  103551. #elif defined(__clang__)
  103552. "adcs r4, r7\n\t"
  103553. #else
  103554. "adc r4, r7\n\t"
  103555. #endif
  103556. #ifdef WOLFSSL_KEIL
  103557. "adcs r5, r5, %[r]\n\t"
  103558. #elif defined(__clang__)
  103559. "adcs r5, %[r]\n\t"
  103560. #else
  103561. "adc r5, %[r]\n\t"
  103562. #endif
  103563. "ldr r6, [%[a]]\n\t"
  103564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103565. "lsrs r6, r6, #16\n\t"
  103566. #else
  103567. "lsr r6, r6, #16\n\t"
  103568. #endif
  103569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103570. "lsrs r7, %[b], #16\n\t"
  103571. #else
  103572. "lsr r7, %[b], #16\n\t"
  103573. #endif
  103574. #ifdef WOLFSSL_KEIL
  103575. "muls r7, r6, r7\n\t"
  103576. #elif defined(__clang__)
  103577. "muls r7, r6\n\t"
  103578. #else
  103579. "mul r7, r6\n\t"
  103580. #endif
  103581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103582. "adds r4, r4, r7\n\t"
  103583. #else
  103584. "add r4, r4, r7\n\t"
  103585. #endif
  103586. #ifdef WOLFSSL_KEIL
  103587. "adcs r5, r5, %[r]\n\t"
  103588. #elif defined(__clang__)
  103589. "adcs r5, %[r]\n\t"
  103590. #else
  103591. "adc r5, %[r]\n\t"
  103592. #endif
  103593. "uxth r7, %[b]\n\t"
  103594. #ifdef WOLFSSL_KEIL
  103595. "muls r6, r7, r6\n\t"
  103596. #elif defined(__clang__)
  103597. "muls r6, r7\n\t"
  103598. #else
  103599. "mul r6, r7\n\t"
  103600. #endif
  103601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103602. "lsrs r7, r6, #16\n\t"
  103603. #else
  103604. "lsr r7, r6, #16\n\t"
  103605. #endif
  103606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103607. "lsls r6, r6, #16\n\t"
  103608. #else
  103609. "lsl r6, r6, #16\n\t"
  103610. #endif
  103611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103612. "adds r3, r3, r6\n\t"
  103613. #else
  103614. "add r3, r3, r6\n\t"
  103615. #endif
  103616. #ifdef WOLFSSL_KEIL
  103617. "adcs r4, r4, r7\n\t"
  103618. #elif defined(__clang__)
  103619. "adcs r4, r7\n\t"
  103620. #else
  103621. "adc r4, r7\n\t"
  103622. #endif
  103623. #ifdef WOLFSSL_KEIL
  103624. "adcs r5, r5, %[r]\n\t"
  103625. #elif defined(__clang__)
  103626. "adcs r5, %[r]\n\t"
  103627. #else
  103628. "adc r5, %[r]\n\t"
  103629. #endif
  103630. "# A[] * B - Done\n\t"
  103631. "mov %[r], r8\n\t"
  103632. "str r3, [%[r]]\n\t"
  103633. "movs r3, r4\n\t"
  103634. "movs r4, r5\n\t"
  103635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103636. "adds %[r], %[r], #4\n\t"
  103637. #else
  103638. "add %[r], %[r], #4\n\t"
  103639. #endif
  103640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103641. "adds %[a], %[a], #4\n\t"
  103642. #else
  103643. "add %[a], %[a], #4\n\t"
  103644. #endif
  103645. "mov r8, %[r]\n\t"
  103646. "cmp %[a], r9\n\t"
  103647. "blt L_sp_256_mul_d_8_%=\n\t"
  103648. "str r3, [%[r]]\n\t"
  103649. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  103650. :
  103651. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  103652. );
  103653. }
  103654. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  103655. *
  103656. * d1 The high order half of the number to divide.
  103657. * d0 The low order half of the number to divide.
  103658. * div The divisor.
  103659. * returns the result of the division.
  103660. *
  103661. * Note that this is an approximate div. It may give an answer 1 larger.
  103662. */
  103663. SP_NOINLINE static sp_digit div_256_word_8(sp_digit d1, sp_digit d0,
  103664. sp_digit div)
  103665. {
  103666. __asm__ __volatile__ (
  103667. "movs r3, #0\n\t"
  103668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103669. "lsrs r5, %[div], #1\n\t"
  103670. #else
  103671. "lsr r5, %[div], #1\n\t"
  103672. #endif
  103673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103674. "adds r5, r5, #1\n\t"
  103675. #else
  103676. "add r5, r5, #1\n\t"
  103677. #endif
  103678. "mov r8, %[d0]\n\t"
  103679. "mov r9, %[d1]\n\t"
  103680. "# Do top 32\n\t"
  103681. "movs r6, r5\n\t"
  103682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103683. "subs r6, r6, %[d1]\n\t"
  103684. #else
  103685. "sub r6, r6, %[d1]\n\t"
  103686. #endif
  103687. #ifdef WOLFSSL_KEIL
  103688. "sbcs r6, r6, r6\n\t"
  103689. #elif defined(__clang__)
  103690. "sbcs r6, r6\n\t"
  103691. #else
  103692. "sbc r6, r6\n\t"
  103693. #endif
  103694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103695. "adds r3, r3, r3\n\t"
  103696. #else
  103697. "add r3, r3, r3\n\t"
  103698. #endif
  103699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103700. "subs r3, r3, r6\n\t"
  103701. #else
  103702. "sub r3, r3, r6\n\t"
  103703. #endif
  103704. #ifdef WOLFSSL_KEIL
  103705. "ands r6, r6, r5\n\t"
  103706. #elif defined(__clang__)
  103707. "ands r6, r5\n\t"
  103708. #else
  103709. "and r6, r5\n\t"
  103710. #endif
  103711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103712. "subs %[d1], %[d1], r6\n\t"
  103713. #else
  103714. "sub %[d1], %[d1], r6\n\t"
  103715. #endif
  103716. "movs r4, #29\n\t"
  103717. "\n"
  103718. "L_div_256_word_8_loop_%=:\n\t"
  103719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103720. "lsls %[d0], %[d0], #1\n\t"
  103721. #else
  103722. "lsl %[d0], %[d0], #1\n\t"
  103723. #endif
  103724. #ifdef WOLFSSL_KEIL
  103725. "adcs %[d1], %[d1], %[d1]\n\t"
  103726. #elif defined(__clang__)
  103727. "adcs %[d1], %[d1]\n\t"
  103728. #else
  103729. "adc %[d1], %[d1]\n\t"
  103730. #endif
  103731. "movs r6, r5\n\t"
  103732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103733. "subs r6, r6, %[d1]\n\t"
  103734. #else
  103735. "sub r6, r6, %[d1]\n\t"
  103736. #endif
  103737. #ifdef WOLFSSL_KEIL
  103738. "sbcs r6, r6, r6\n\t"
  103739. #elif defined(__clang__)
  103740. "sbcs r6, r6\n\t"
  103741. #else
  103742. "sbc r6, r6\n\t"
  103743. #endif
  103744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103745. "adds r3, r3, r3\n\t"
  103746. #else
  103747. "add r3, r3, r3\n\t"
  103748. #endif
  103749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103750. "subs r3, r3, r6\n\t"
  103751. #else
  103752. "sub r3, r3, r6\n\t"
  103753. #endif
  103754. #ifdef WOLFSSL_KEIL
  103755. "ands r6, r6, r5\n\t"
  103756. #elif defined(__clang__)
  103757. "ands r6, r5\n\t"
  103758. #else
  103759. "and r6, r5\n\t"
  103760. #endif
  103761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103762. "subs %[d1], %[d1], r6\n\t"
  103763. #else
  103764. "sub %[d1], %[d1], r6\n\t"
  103765. #endif
  103766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103767. "subs r4, r4, #1\n\t"
  103768. #else
  103769. "sub r4, r4, #1\n\t"
  103770. #endif
  103771. "bpl L_div_256_word_8_loop_%=\n\t"
  103772. "movs r7, #0\n\t"
  103773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103774. "adds r3, r3, r3\n\t"
  103775. #else
  103776. "add r3, r3, r3\n\t"
  103777. #endif
  103778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103779. "adds r3, r3, #1\n\t"
  103780. #else
  103781. "add r3, r3, #1\n\t"
  103782. #endif
  103783. "# r * div - Start\n\t"
  103784. "uxth %[d1], r3\n\t"
  103785. "uxth r4, %[div]\n\t"
  103786. #ifdef WOLFSSL_KEIL
  103787. "muls r4, %[d1], r4\n\t"
  103788. #elif defined(__clang__)
  103789. "muls r4, %[d1]\n\t"
  103790. #else
  103791. "mul r4, %[d1]\n\t"
  103792. #endif
  103793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103794. "lsrs r6, %[div], #16\n\t"
  103795. #else
  103796. "lsr r6, %[div], #16\n\t"
  103797. #endif
  103798. #ifdef WOLFSSL_KEIL
  103799. "muls %[d1], r6, %[d1]\n\t"
  103800. #elif defined(__clang__)
  103801. "muls %[d1], r6\n\t"
  103802. #else
  103803. "mul %[d1], r6\n\t"
  103804. #endif
  103805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103806. "lsrs r5, %[d1], #16\n\t"
  103807. #else
  103808. "lsr r5, %[d1], #16\n\t"
  103809. #endif
  103810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103811. "lsls %[d1], %[d1], #16\n\t"
  103812. #else
  103813. "lsl %[d1], %[d1], #16\n\t"
  103814. #endif
  103815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103816. "adds r4, r4, %[d1]\n\t"
  103817. #else
  103818. "add r4, r4, %[d1]\n\t"
  103819. #endif
  103820. #ifdef WOLFSSL_KEIL
  103821. "adcs r5, r5, r7\n\t"
  103822. #elif defined(__clang__)
  103823. "adcs r5, r7\n\t"
  103824. #else
  103825. "adc r5, r7\n\t"
  103826. #endif
  103827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103828. "lsrs %[d1], r3, #16\n\t"
  103829. #else
  103830. "lsr %[d1], r3, #16\n\t"
  103831. #endif
  103832. #ifdef WOLFSSL_KEIL
  103833. "muls r6, %[d1], r6\n\t"
  103834. #elif defined(__clang__)
  103835. "muls r6, %[d1]\n\t"
  103836. #else
  103837. "mul r6, %[d1]\n\t"
  103838. #endif
  103839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103840. "adds r5, r5, r6\n\t"
  103841. #else
  103842. "add r5, r5, r6\n\t"
  103843. #endif
  103844. "uxth r6, %[div]\n\t"
  103845. #ifdef WOLFSSL_KEIL
  103846. "muls %[d1], r6, %[d1]\n\t"
  103847. #elif defined(__clang__)
  103848. "muls %[d1], r6\n\t"
  103849. #else
  103850. "mul %[d1], r6\n\t"
  103851. #endif
  103852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103853. "lsrs r6, %[d1], #16\n\t"
  103854. #else
  103855. "lsr r6, %[d1], #16\n\t"
  103856. #endif
  103857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103858. "lsls %[d1], %[d1], #16\n\t"
  103859. #else
  103860. "lsl %[d1], %[d1], #16\n\t"
  103861. #endif
  103862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103863. "adds r4, r4, %[d1]\n\t"
  103864. #else
  103865. "add r4, r4, %[d1]\n\t"
  103866. #endif
  103867. #ifdef WOLFSSL_KEIL
  103868. "adcs r5, r5, r6\n\t"
  103869. #elif defined(__clang__)
  103870. "adcs r5, r6\n\t"
  103871. #else
  103872. "adc r5, r6\n\t"
  103873. #endif
  103874. "# r * div - Done\n\t"
  103875. "mov %[d1], r8\n\t"
  103876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103877. "subs %[d1], %[d1], r4\n\t"
  103878. #else
  103879. "sub %[d1], %[d1], r4\n\t"
  103880. #endif
  103881. "movs r4, %[d1]\n\t"
  103882. "mov %[d1], r9\n\t"
  103883. #ifdef WOLFSSL_KEIL
  103884. "sbcs %[d1], %[d1], r5\n\t"
  103885. #elif defined(__clang__)
  103886. "sbcs %[d1], r5\n\t"
  103887. #else
  103888. "sbc %[d1], r5\n\t"
  103889. #endif
  103890. "movs r5, %[d1]\n\t"
  103891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103892. "adds r3, r3, r5\n\t"
  103893. #else
  103894. "add r3, r3, r5\n\t"
  103895. #endif
  103896. "# r * div - Start\n\t"
  103897. "uxth %[d1], r3\n\t"
  103898. "uxth r4, %[div]\n\t"
  103899. #ifdef WOLFSSL_KEIL
  103900. "muls r4, %[d1], r4\n\t"
  103901. #elif defined(__clang__)
  103902. "muls r4, %[d1]\n\t"
  103903. #else
  103904. "mul r4, %[d1]\n\t"
  103905. #endif
  103906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103907. "lsrs r6, %[div], #16\n\t"
  103908. #else
  103909. "lsr r6, %[div], #16\n\t"
  103910. #endif
  103911. #ifdef WOLFSSL_KEIL
  103912. "muls %[d1], r6, %[d1]\n\t"
  103913. #elif defined(__clang__)
  103914. "muls %[d1], r6\n\t"
  103915. #else
  103916. "mul %[d1], r6\n\t"
  103917. #endif
  103918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103919. "lsrs r5, %[d1], #16\n\t"
  103920. #else
  103921. "lsr r5, %[d1], #16\n\t"
  103922. #endif
  103923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103924. "lsls %[d1], %[d1], #16\n\t"
  103925. #else
  103926. "lsl %[d1], %[d1], #16\n\t"
  103927. #endif
  103928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103929. "adds r4, r4, %[d1]\n\t"
  103930. #else
  103931. "add r4, r4, %[d1]\n\t"
  103932. #endif
  103933. #ifdef WOLFSSL_KEIL
  103934. "adcs r5, r5, r7\n\t"
  103935. #elif defined(__clang__)
  103936. "adcs r5, r7\n\t"
  103937. #else
  103938. "adc r5, r7\n\t"
  103939. #endif
  103940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103941. "lsrs %[d1], r3, #16\n\t"
  103942. #else
  103943. "lsr %[d1], r3, #16\n\t"
  103944. #endif
  103945. #ifdef WOLFSSL_KEIL
  103946. "muls r6, %[d1], r6\n\t"
  103947. #elif defined(__clang__)
  103948. "muls r6, %[d1]\n\t"
  103949. #else
  103950. "mul r6, %[d1]\n\t"
  103951. #endif
  103952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103953. "adds r5, r5, r6\n\t"
  103954. #else
  103955. "add r5, r5, r6\n\t"
  103956. #endif
  103957. "uxth r6, %[div]\n\t"
  103958. #ifdef WOLFSSL_KEIL
  103959. "muls %[d1], r6, %[d1]\n\t"
  103960. #elif defined(__clang__)
  103961. "muls %[d1], r6\n\t"
  103962. #else
  103963. "mul %[d1], r6\n\t"
  103964. #endif
  103965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103966. "lsrs r6, %[d1], #16\n\t"
  103967. #else
  103968. "lsr r6, %[d1], #16\n\t"
  103969. #endif
  103970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103971. "lsls %[d1], %[d1], #16\n\t"
  103972. #else
  103973. "lsl %[d1], %[d1], #16\n\t"
  103974. #endif
  103975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103976. "adds r4, r4, %[d1]\n\t"
  103977. #else
  103978. "add r4, r4, %[d1]\n\t"
  103979. #endif
  103980. #ifdef WOLFSSL_KEIL
  103981. "adcs r5, r5, r6\n\t"
  103982. #elif defined(__clang__)
  103983. "adcs r5, r6\n\t"
  103984. #else
  103985. "adc r5, r6\n\t"
  103986. #endif
  103987. "# r * div - Done\n\t"
  103988. "mov %[d1], r8\n\t"
  103989. "mov r6, r9\n\t"
  103990. #ifdef WOLFSSL_KEIL
  103991. "subs r4, %[d1], r4\n\t"
  103992. #else
  103993. #ifdef __clang__
  103994. "subs r4, %[d1], r4\n\t"
  103995. #else
  103996. "sub r4, %[d1], r4\n\t"
  103997. #endif
  103998. #endif
  103999. #ifdef WOLFSSL_KEIL
  104000. "sbcs r6, r6, r5\n\t"
  104001. #elif defined(__clang__)
  104002. "sbcs r6, r5\n\t"
  104003. #else
  104004. "sbc r6, r5\n\t"
  104005. #endif
  104006. "movs r5, r6\n\t"
  104007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104008. "adds r3, r3, r5\n\t"
  104009. #else
  104010. "add r3, r3, r5\n\t"
  104011. #endif
  104012. "# r * div - Start\n\t"
  104013. "uxth %[d1], r3\n\t"
  104014. "uxth r4, %[div]\n\t"
  104015. #ifdef WOLFSSL_KEIL
  104016. "muls r4, %[d1], r4\n\t"
  104017. #elif defined(__clang__)
  104018. "muls r4, %[d1]\n\t"
  104019. #else
  104020. "mul r4, %[d1]\n\t"
  104021. #endif
  104022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104023. "lsrs r6, %[div], #16\n\t"
  104024. #else
  104025. "lsr r6, %[div], #16\n\t"
  104026. #endif
  104027. #ifdef WOLFSSL_KEIL
  104028. "muls %[d1], r6, %[d1]\n\t"
  104029. #elif defined(__clang__)
  104030. "muls %[d1], r6\n\t"
  104031. #else
  104032. "mul %[d1], r6\n\t"
  104033. #endif
  104034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104035. "lsrs r5, %[d1], #16\n\t"
  104036. #else
  104037. "lsr r5, %[d1], #16\n\t"
  104038. #endif
  104039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104040. "lsls %[d1], %[d1], #16\n\t"
  104041. #else
  104042. "lsl %[d1], %[d1], #16\n\t"
  104043. #endif
  104044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104045. "adds r4, r4, %[d1]\n\t"
  104046. #else
  104047. "add r4, r4, %[d1]\n\t"
  104048. #endif
  104049. #ifdef WOLFSSL_KEIL
  104050. "adcs r5, r5, r7\n\t"
  104051. #elif defined(__clang__)
  104052. "adcs r5, r7\n\t"
  104053. #else
  104054. "adc r5, r7\n\t"
  104055. #endif
  104056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104057. "lsrs %[d1], r3, #16\n\t"
  104058. #else
  104059. "lsr %[d1], r3, #16\n\t"
  104060. #endif
  104061. #ifdef WOLFSSL_KEIL
  104062. "muls r6, %[d1], r6\n\t"
  104063. #elif defined(__clang__)
  104064. "muls r6, %[d1]\n\t"
  104065. #else
  104066. "mul r6, %[d1]\n\t"
  104067. #endif
  104068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104069. "adds r5, r5, r6\n\t"
  104070. #else
  104071. "add r5, r5, r6\n\t"
  104072. #endif
  104073. "uxth r6, %[div]\n\t"
  104074. #ifdef WOLFSSL_KEIL
  104075. "muls %[d1], r6, %[d1]\n\t"
  104076. #elif defined(__clang__)
  104077. "muls %[d1], r6\n\t"
  104078. #else
  104079. "mul %[d1], r6\n\t"
  104080. #endif
  104081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104082. "lsrs r6, %[d1], #16\n\t"
  104083. #else
  104084. "lsr r6, %[d1], #16\n\t"
  104085. #endif
  104086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104087. "lsls %[d1], %[d1], #16\n\t"
  104088. #else
  104089. "lsl %[d1], %[d1], #16\n\t"
  104090. #endif
  104091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104092. "adds r4, r4, %[d1]\n\t"
  104093. #else
  104094. "add r4, r4, %[d1]\n\t"
  104095. #endif
  104096. #ifdef WOLFSSL_KEIL
  104097. "adcs r5, r5, r6\n\t"
  104098. #elif defined(__clang__)
  104099. "adcs r5, r6\n\t"
  104100. #else
  104101. "adc r5, r6\n\t"
  104102. #endif
  104103. "# r * div - Done\n\t"
  104104. "mov %[d1], r8\n\t"
  104105. "mov r6, r9\n\t"
  104106. #ifdef WOLFSSL_KEIL
  104107. "subs r4, %[d1], r4\n\t"
  104108. #else
  104109. #ifdef __clang__
  104110. "subs r4, %[d1], r4\n\t"
  104111. #else
  104112. "sub r4, %[d1], r4\n\t"
  104113. #endif
  104114. #endif
  104115. #ifdef WOLFSSL_KEIL
  104116. "sbcs r6, r6, r5\n\t"
  104117. #elif defined(__clang__)
  104118. "sbcs r6, r5\n\t"
  104119. #else
  104120. "sbc r6, r5\n\t"
  104121. #endif
  104122. "movs r5, r6\n\t"
  104123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104124. "adds r3, r3, r5\n\t"
  104125. #else
  104126. "add r3, r3, r5\n\t"
  104127. #endif
  104128. "# r * div - Start\n\t"
  104129. "uxth %[d1], r3\n\t"
  104130. "uxth r4, %[div]\n\t"
  104131. #ifdef WOLFSSL_KEIL
  104132. "muls r4, %[d1], r4\n\t"
  104133. #elif defined(__clang__)
  104134. "muls r4, %[d1]\n\t"
  104135. #else
  104136. "mul r4, %[d1]\n\t"
  104137. #endif
  104138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104139. "lsrs r6, %[div], #16\n\t"
  104140. #else
  104141. "lsr r6, %[div], #16\n\t"
  104142. #endif
  104143. #ifdef WOLFSSL_KEIL
  104144. "muls %[d1], r6, %[d1]\n\t"
  104145. #elif defined(__clang__)
  104146. "muls %[d1], r6\n\t"
  104147. #else
  104148. "mul %[d1], r6\n\t"
  104149. #endif
  104150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104151. "lsrs r5, %[d1], #16\n\t"
  104152. #else
  104153. "lsr r5, %[d1], #16\n\t"
  104154. #endif
  104155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104156. "lsls %[d1], %[d1], #16\n\t"
  104157. #else
  104158. "lsl %[d1], %[d1], #16\n\t"
  104159. #endif
  104160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104161. "adds r4, r4, %[d1]\n\t"
  104162. #else
  104163. "add r4, r4, %[d1]\n\t"
  104164. #endif
  104165. #ifdef WOLFSSL_KEIL
  104166. "adcs r5, r5, r7\n\t"
  104167. #elif defined(__clang__)
  104168. "adcs r5, r7\n\t"
  104169. #else
  104170. "adc r5, r7\n\t"
  104171. #endif
  104172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104173. "lsrs %[d1], r3, #16\n\t"
  104174. #else
  104175. "lsr %[d1], r3, #16\n\t"
  104176. #endif
  104177. #ifdef WOLFSSL_KEIL
  104178. "muls r6, %[d1], r6\n\t"
  104179. #elif defined(__clang__)
  104180. "muls r6, %[d1]\n\t"
  104181. #else
  104182. "mul r6, %[d1]\n\t"
  104183. #endif
  104184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104185. "adds r5, r5, r6\n\t"
  104186. #else
  104187. "add r5, r5, r6\n\t"
  104188. #endif
  104189. "uxth r6, %[div]\n\t"
  104190. #ifdef WOLFSSL_KEIL
  104191. "muls %[d1], r6, %[d1]\n\t"
  104192. #elif defined(__clang__)
  104193. "muls %[d1], r6\n\t"
  104194. #else
  104195. "mul %[d1], r6\n\t"
  104196. #endif
  104197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104198. "lsrs r6, %[d1], #16\n\t"
  104199. #else
  104200. "lsr r6, %[d1], #16\n\t"
  104201. #endif
  104202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104203. "lsls %[d1], %[d1], #16\n\t"
  104204. #else
  104205. "lsl %[d1], %[d1], #16\n\t"
  104206. #endif
  104207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104208. "adds r4, r4, %[d1]\n\t"
  104209. #else
  104210. "add r4, r4, %[d1]\n\t"
  104211. #endif
  104212. #ifdef WOLFSSL_KEIL
  104213. "adcs r5, r5, r6\n\t"
  104214. #elif defined(__clang__)
  104215. "adcs r5, r6\n\t"
  104216. #else
  104217. "adc r5, r6\n\t"
  104218. #endif
  104219. "# r * div - Done\n\t"
  104220. "mov %[d1], r8\n\t"
  104221. "mov r6, r9\n\t"
  104222. #ifdef WOLFSSL_KEIL
  104223. "subs r4, %[d1], r4\n\t"
  104224. #else
  104225. #ifdef __clang__
  104226. "subs r4, %[d1], r4\n\t"
  104227. #else
  104228. "sub r4, %[d1], r4\n\t"
  104229. #endif
  104230. #endif
  104231. #ifdef WOLFSSL_KEIL
  104232. "sbcs r6, r6, r5\n\t"
  104233. #elif defined(__clang__)
  104234. "sbcs r6, r5\n\t"
  104235. #else
  104236. "sbc r6, r5\n\t"
  104237. #endif
  104238. "movs r5, r6\n\t"
  104239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104240. "adds r3, r3, r5\n\t"
  104241. #else
  104242. "add r3, r3, r5\n\t"
  104243. #endif
  104244. "movs r6, %[div]\n\t"
  104245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104246. "subs r6, r6, r4\n\t"
  104247. #else
  104248. "sub r6, r6, r4\n\t"
  104249. #endif
  104250. #ifdef WOLFSSL_KEIL
  104251. "sbcs r6, r6, r6\n\t"
  104252. #elif defined(__clang__)
  104253. "sbcs r6, r6\n\t"
  104254. #else
  104255. "sbc r6, r6\n\t"
  104256. #endif
  104257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104258. "subs r3, r3, r6\n\t"
  104259. #else
  104260. "sub r3, r3, r6\n\t"
  104261. #endif
  104262. "movs %[d1], r3\n\t"
  104263. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  104264. :
  104265. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  104266. );
  104267. return (uint32_t)(size_t)d1;
  104268. }
  104269. /* AND m into each word of a and store in r.
  104270. *
  104271. * r A single precision integer.
  104272. * a A single precision integer.
  104273. * m Mask to AND against each digit.
  104274. */
  104275. static void sp_256_mask_8(sp_digit* r, const sp_digit* a, sp_digit m)
  104276. {
  104277. #ifdef WOLFSSL_SP_SMALL
  104278. int i;
  104279. for (i=0; i<8; i++) {
  104280. r[i] = a[i] & m;
  104281. }
  104282. #else
  104283. r[0] = a[0] & m;
  104284. r[1] = a[1] & m;
  104285. r[2] = a[2] & m;
  104286. r[3] = a[3] & m;
  104287. r[4] = a[4] & m;
  104288. r[5] = a[5] & m;
  104289. r[6] = a[6] & m;
  104290. r[7] = a[7] & m;
  104291. #endif
  104292. }
  104293. /* Divide d in a and put remainder into r (m*d + r = a)
  104294. * m is not calculated as it is not needed at this time.
  104295. *
  104296. * a Number to be divided.
  104297. * d Number to divide with.
  104298. * m Multiplier result.
  104299. * r Remainder from the division.
  104300. * returns MP_OKAY indicating success.
  104301. */
  104302. static WC_INLINE int sp_256_div_8(const sp_digit* a, const sp_digit* d,
  104303. sp_digit* m, sp_digit* r)
  104304. {
  104305. sp_digit t1[16], t2[9];
  104306. sp_digit div, r1;
  104307. int i;
  104308. (void)m;
  104309. div = d[7];
  104310. XMEMCPY(t1, a, sizeof(*t1) * 2 * 8);
  104311. r1 = sp_256_cmp_8(&t1[8], d) >= 0;
  104312. sp_256_cond_sub_8(&t1[8], &t1[8], d, (sp_digit)0 - r1);
  104313. for (i = 7; i >= 0; i--) {
  104314. volatile sp_digit mask = (sp_digit)0 - (t1[8 + i] == div);
  104315. sp_digit hi = t1[8 + i] + mask;
  104316. r1 = div_256_word_8(hi, t1[8 + i - 1], div);
  104317. r1 |= mask;
  104318. sp_256_mul_d_8(t2, d, r1);
  104319. t1[8 + i] += sp_256_sub_in_place_8(&t1[i], t2);
  104320. t1[8 + i] -= t2[8];
  104321. sp_256_mask_8(t2, d, t1[8 + i]);
  104322. t1[8 + i] += sp_256_add_8(&t1[i], &t1[i], t2);
  104323. sp_256_mask_8(t2, d, t1[8 + i]);
  104324. t1[8 + i] += sp_256_add_8(&t1[i], &t1[i], t2);
  104325. }
  104326. r1 = sp_256_cmp_8(t1, d) >= 0;
  104327. sp_256_cond_sub_8(r, t1, d, (sp_digit)0 - r1);
  104328. return MP_OKAY;
  104329. }
  104330. /* Reduce a modulo m into r. (r = a mod m)
  104331. *
  104332. * r A single precision number that is the reduced result.
  104333. * a A single precision number that is to be reduced.
  104334. * m A single precision number that is the modulus to reduce with.
  104335. * returns MP_OKAY indicating success.
  104336. */
  104337. static WC_INLINE int sp_256_mod_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  104338. {
  104339. int ret;
  104340. ret = sp_256_div_8(a, m, NULL, r);
  104341. return ret;
  104342. }
  104343. #endif
  104344. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  104345. /* Multiply two number mod the order of P256 curve. (r = a * b mod order)
  104346. *
  104347. * r Result of the multiplication.
  104348. * a First operand of the multiplication.
  104349. * b Second operand of the multiplication.
  104350. */
  104351. static void sp_256_mont_mul_order_8(sp_digit* r, const sp_digit* a, const sp_digit* b)
  104352. {
  104353. sp_256_mul_8(r, a, b);
  104354. sp_256_mont_reduce_order_8(r, p256_order, p256_mp_order);
  104355. }
  104356. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  104357. #ifdef WOLFSSL_SP_SMALL
  104358. /* Order-2 for the P256 curve. */
  104359. static const uint32_t p256_order_minus_2[8] = {
  104360. 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU,0xffffffffU,0xffffffffU,
  104361. 0x00000000U,0xffffffffU
  104362. };
  104363. #else
  104364. /* The low half of the order-2 of the P256 curve. */
  104365. static const sp_int_digit p256_order_low[4] = {
  104366. 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU
  104367. };
  104368. #endif /* WOLFSSL_SP_SMALL */
  104369. /* Square number mod the order of P256 curve. (r = a * a mod order)
  104370. *
  104371. * r Result of the squaring.
  104372. * a Number to square.
  104373. */
  104374. static void sp_256_mont_sqr_order_8(sp_digit* r, const sp_digit* a)
  104375. {
  104376. sp_256_sqr_8(r, a);
  104377. sp_256_mont_reduce_order_8(r, p256_order, p256_mp_order);
  104378. }
  104379. #ifndef WOLFSSL_SP_SMALL
  104380. /* Square number mod the order of P256 curve a number of times.
  104381. * (r = a ^ n mod order)
  104382. *
  104383. * r Result of the squaring.
  104384. * a Number to square.
  104385. */
  104386. static void sp_256_mont_sqr_n_order_8(sp_digit* r, const sp_digit* a, int n)
  104387. {
  104388. int i;
  104389. sp_256_mont_sqr_order_8(r, a);
  104390. for (i=1; i<n; i++) {
  104391. sp_256_mont_sqr_order_8(r, r);
  104392. }
  104393. }
  104394. #endif /* !WOLFSSL_SP_SMALL */
  104395. /* Invert the number, in Montgomery form, modulo the order of the P256 curve.
  104396. * (r = 1 / a mod order)
  104397. *
  104398. * r Inverse result.
  104399. * a Number to invert.
  104400. * td Temporary data.
  104401. */
  104402. #ifdef WOLFSSL_SP_NONBLOCK
  104403. typedef struct sp_256_mont_inv_order_8_ctx {
  104404. int state;
  104405. int i;
  104406. } sp_256_mont_inv_order_8_ctx;
  104407. static int sp_256_mont_inv_order_8_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  104408. sp_digit* t)
  104409. {
  104410. int err = FP_WOULDBLOCK;
  104411. sp_256_mont_inv_order_8_ctx* ctx = (sp_256_mont_inv_order_8_ctx*)sp_ctx;
  104412. typedef char ctx_size_test[sizeof(sp_256_mont_inv_order_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  104413. (void)sizeof(ctx_size_test);
  104414. switch (ctx->state) {
  104415. case 0:
  104416. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  104417. ctx->i = 254;
  104418. ctx->state = 1;
  104419. break;
  104420. case 1:
  104421. sp_256_mont_sqr_order_8(t, t);
  104422. ctx->state = 2;
  104423. break;
  104424. case 2:
  104425. if ((p256_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  104426. sp_256_mont_mul_order_8(t, t, a);
  104427. }
  104428. ctx->i--;
  104429. ctx->state = (ctx->i == 0) ? 3 : 1;
  104430. break;
  104431. case 3:
  104432. XMEMCPY(r, t, sizeof(sp_digit) * 8U);
  104433. err = MP_OKAY;
  104434. break;
  104435. }
  104436. return err;
  104437. }
  104438. #endif /* WOLFSSL_SP_NONBLOCK */
  104439. static void sp_256_mont_inv_order_8(sp_digit* r, const sp_digit* a,
  104440. sp_digit* td)
  104441. {
  104442. #ifdef WOLFSSL_SP_SMALL
  104443. sp_digit* t = td;
  104444. int i;
  104445. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  104446. for (i=254; i>=0; i--) {
  104447. sp_256_mont_sqr_order_8(t, t);
  104448. if ((p256_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  104449. sp_256_mont_mul_order_8(t, t, a);
  104450. }
  104451. }
  104452. XMEMCPY(r, t, sizeof(sp_digit) * 8U);
  104453. #else
  104454. sp_digit* t = td;
  104455. sp_digit* t2 = td + 2 * 8;
  104456. sp_digit* t3 = td + 4 * 8;
  104457. int i;
  104458. /* t = a^2 */
  104459. sp_256_mont_sqr_order_8(t, a);
  104460. /* t = a^3 = t * a */
  104461. sp_256_mont_mul_order_8(t, t, a);
  104462. /* t2= a^c = t ^ 2 ^ 2 */
  104463. sp_256_mont_sqr_n_order_8(t2, t, 2);
  104464. /* t3= a^f = t2 * t */
  104465. sp_256_mont_mul_order_8(t3, t2, t);
  104466. /* t2= a^f0 = t3 ^ 2 ^ 4 */
  104467. sp_256_mont_sqr_n_order_8(t2, t3, 4);
  104468. /* t = a^ff = t2 * t3 */
  104469. sp_256_mont_mul_order_8(t, t2, t3);
  104470. /* t2= a^ff00 = t ^ 2 ^ 8 */
  104471. sp_256_mont_sqr_n_order_8(t2, t, 8);
  104472. /* t = a^ffff = t2 * t */
  104473. sp_256_mont_mul_order_8(t, t2, t);
  104474. /* t2= a^ffff0000 = t ^ 2 ^ 16 */
  104475. sp_256_mont_sqr_n_order_8(t2, t, 16);
  104476. /* t = a^ffffffff = t2 * t */
  104477. sp_256_mont_mul_order_8(t, t2, t);
  104478. /* t2= a^ffffffff0000000000000000 = t ^ 2 ^ 64 */
  104479. sp_256_mont_sqr_n_order_8(t2, t, 64);
  104480. /* t2= a^ffffffff00000000ffffffff = t2 * t */
  104481. sp_256_mont_mul_order_8(t2, t2, t);
  104482. /* t2= a^ffffffff00000000ffffffff00000000 = t2 ^ 2 ^ 32 */
  104483. sp_256_mont_sqr_n_order_8(t2, t2, 32);
  104484. /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */
  104485. sp_256_mont_mul_order_8(t2, t2, t);
  104486. /* t2= a^ffffffff00000000ffffffffffffffffbce6 */
  104487. sp_256_mont_sqr_order_8(t2, t2);
  104488. sp_256_mont_mul_order_8(t2, t2, a);
  104489. sp_256_mont_sqr_n_order_8(t2, t2, 5);
  104490. sp_256_mont_mul_order_8(t2, t2, t3);
  104491. for (i=121; i>=112; i--) {
  104492. sp_256_mont_sqr_order_8(t2, t2);
  104493. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  104494. sp_256_mont_mul_order_8(t2, t2, a);
  104495. }
  104496. }
  104497. /* t2= a^ffffffff00000000ffffffffffffffffbce6f */
  104498. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  104499. sp_256_mont_mul_order_8(t2, t2, t3);
  104500. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84 */
  104501. for (i=107; i>=64; i--) {
  104502. sp_256_mont_sqr_order_8(t2, t2);
  104503. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  104504. sp_256_mont_mul_order_8(t2, t2, a);
  104505. }
  104506. }
  104507. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f */
  104508. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  104509. sp_256_mont_mul_order_8(t2, t2, t3);
  104510. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2 */
  104511. for (i=59; i>=32; i--) {
  104512. sp_256_mont_sqr_order_8(t2, t2);
  104513. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  104514. sp_256_mont_mul_order_8(t2, t2, a);
  104515. }
  104516. }
  104517. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2f */
  104518. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  104519. sp_256_mont_mul_order_8(t2, t2, t3);
  104520. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254 */
  104521. for (i=27; i>=0; i--) {
  104522. sp_256_mont_sqr_order_8(t2, t2);
  104523. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  104524. sp_256_mont_mul_order_8(t2, t2, a);
  104525. }
  104526. }
  104527. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 */
  104528. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  104529. /* r = a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f */
  104530. sp_256_mont_mul_order_8(r, t2, t3);
  104531. #endif /* WOLFSSL_SP_SMALL */
  104532. }
  104533. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  104534. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  104535. #ifdef HAVE_ECC_SIGN
  104536. #ifndef SP_ECC_MAX_SIG_GEN
  104537. #define SP_ECC_MAX_SIG_GEN 64
  104538. #endif
  104539. /* Calculate second signature value S from R, k and private value.
  104540. *
  104541. * s = (r * x + e) / k
  104542. *
  104543. * s Signature value.
  104544. * r First signature value.
  104545. * k Ephemeral private key.
  104546. * x Private key as a number.
  104547. * e Hash of message as a number.
  104548. * tmp Temporary storage for intermediate numbers.
  104549. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  104550. */
  104551. static int sp_256_calc_s_8(sp_digit* s, const sp_digit* r, sp_digit* k,
  104552. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  104553. {
  104554. int err;
  104555. sp_digit carry;
  104556. sp_int32 c;
  104557. sp_digit* kInv = k;
  104558. /* Conv k to Montgomery form (mod order) */
  104559. sp_256_mul_8(k, k, p256_norm_order);
  104560. err = sp_256_mod_8(k, k, p256_order);
  104561. if (err == MP_OKAY) {
  104562. sp_256_norm_8(k);
  104563. /* kInv = 1/k mod order */
  104564. sp_256_mont_inv_order_8(kInv, k, tmp);
  104565. sp_256_norm_8(kInv);
  104566. /* s = r * x + e */
  104567. sp_256_mul_8(x, x, r);
  104568. err = sp_256_mod_8(x, x, p256_order);
  104569. }
  104570. if (err == MP_OKAY) {
  104571. sp_256_norm_8(x);
  104572. carry = sp_256_add_8(s, e, x);
  104573. sp_256_cond_sub_8(s, s, p256_order, 0 - carry);
  104574. sp_256_norm_8(s);
  104575. c = sp_256_cmp_8(s, p256_order);
  104576. sp_256_cond_sub_8(s, s, p256_order,
  104577. (sp_digit)0 - (sp_digit)(c >= 0));
  104578. sp_256_norm_8(s);
  104579. /* s = s * k^-1 mod order */
  104580. sp_256_mont_mul_order_8(s, s, kInv);
  104581. sp_256_norm_8(s);
  104582. }
  104583. return err;
  104584. }
  104585. /* Sign the hash using the private key.
  104586. * e = [hash, 256 bits] from binary
  104587. * r = (k.G)->x mod order
  104588. * s = (r * x + e) / k mod order
  104589. * The hash is truncated to the first 256 bits.
  104590. *
  104591. * hash Hash to sign.
  104592. * hashLen Length of the hash data.
  104593. * rng Random number generator.
  104594. * priv Private part of key - scalar.
  104595. * rm First part of result as an mp_int.
  104596. * sm Sirst part of result as an mp_int.
  104597. * heap Heap to use for allocation.
  104598. * returns RNG failures, MEMORY_E when memory allocation fails and
  104599. * MP_OKAY on success.
  104600. */
  104601. int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng,
  104602. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  104603. {
  104604. #ifdef WOLFSSL_SP_SMALL_STACK
  104605. sp_digit* e = NULL;
  104606. sp_point_256* point = NULL;
  104607. #else
  104608. sp_digit e[7 * 2 * 8];
  104609. sp_point_256 point[1];
  104610. #endif
  104611. sp_digit* x = NULL;
  104612. sp_digit* k = NULL;
  104613. sp_digit* r = NULL;
  104614. sp_digit* tmp = NULL;
  104615. sp_digit* s = NULL;
  104616. sp_int32 c;
  104617. int err = MP_OKAY;
  104618. int i;
  104619. (void)heap;
  104620. #ifdef WOLFSSL_SP_SMALL_STACK
  104621. if (err == MP_OKAY) {
  104622. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  104623. DYNAMIC_TYPE_ECC);
  104624. if (point == NULL)
  104625. err = MEMORY_E;
  104626. }
  104627. if (err == MP_OKAY) {
  104628. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 8, heap,
  104629. DYNAMIC_TYPE_ECC);
  104630. if (e == NULL)
  104631. err = MEMORY_E;
  104632. }
  104633. #endif
  104634. if (err == MP_OKAY) {
  104635. x = e + 2 * 8;
  104636. k = e + 4 * 8;
  104637. r = e + 6 * 8;
  104638. tmp = e + 8 * 8;
  104639. s = e;
  104640. if (hashLen > 32U) {
  104641. hashLen = 32U;
  104642. }
  104643. }
  104644. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  104645. /* New random point. */
  104646. if (km == NULL || mp_iszero(km)) {
  104647. err = sp_256_ecc_gen_k_8(rng, k);
  104648. }
  104649. else {
  104650. sp_256_from_mp(k, 8, km);
  104651. mp_zero(km);
  104652. }
  104653. if (err == MP_OKAY) {
  104654. err = sp_256_ecc_mulmod_base_8(point, k, 1, 1, heap);
  104655. }
  104656. if (err == MP_OKAY) {
  104657. /* r = point->x mod order */
  104658. XMEMCPY(r, point->x, sizeof(sp_digit) * 8U);
  104659. sp_256_norm_8(r);
  104660. c = sp_256_cmp_8(r, p256_order);
  104661. sp_256_cond_sub_8(r, r, p256_order,
  104662. (sp_digit)0 - (sp_digit)(c >= 0));
  104663. sp_256_norm_8(r);
  104664. if (!sp_256_iszero_8(r)) {
  104665. /* x is modified in calculation of s. */
  104666. sp_256_from_mp(x, 8, priv);
  104667. /* s ptr == e ptr, e is modified in calculation of s. */
  104668. sp_256_from_bin(e, 8, hash, (int)hashLen);
  104669. err = sp_256_calc_s_8(s, r, k, x, e, tmp);
  104670. /* Check that signature is usable. */
  104671. if ((err == MP_OKAY) && (!sp_256_iszero_8(s))) {
  104672. break;
  104673. }
  104674. }
  104675. }
  104676. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  104677. i = 1;
  104678. #endif
  104679. }
  104680. if (i == 0) {
  104681. err = RNG_FAILURE_E;
  104682. }
  104683. if (err == MP_OKAY) {
  104684. err = sp_256_to_mp(r, rm);
  104685. }
  104686. if (err == MP_OKAY) {
  104687. err = sp_256_to_mp(s, sm);
  104688. }
  104689. #ifdef WOLFSSL_SP_SMALL_STACK
  104690. if (e != NULL)
  104691. #endif
  104692. {
  104693. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 8);
  104694. #ifdef WOLFSSL_SP_SMALL_STACK
  104695. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  104696. #endif
  104697. }
  104698. #ifdef WOLFSSL_SP_SMALL_STACK
  104699. if (point != NULL)
  104700. #endif
  104701. {
  104702. ForceZero(point, sizeof(sp_point_256));
  104703. #ifdef WOLFSSL_SP_SMALL_STACK
  104704. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  104705. #endif
  104706. }
  104707. return err;
  104708. }
  104709. #ifdef WOLFSSL_SP_NONBLOCK
  104710. typedef struct sp_ecc_sign_256_ctx {
  104711. int state;
  104712. union {
  104713. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  104714. sp_256_mont_inv_order_8_ctx mont_inv_order_ctx;
  104715. };
  104716. sp_digit e[2*8];
  104717. sp_digit x[2*8];
  104718. sp_digit k[2*8];
  104719. sp_digit r[2*8];
  104720. sp_digit tmp[3 * 2*8];
  104721. sp_point_256 point;
  104722. sp_digit* s;
  104723. sp_digit* kInv;
  104724. int i;
  104725. } sp_ecc_sign_256_ctx;
  104726. int sp_ecc_sign_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  104727. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  104728. {
  104729. int err = FP_WOULDBLOCK;
  104730. sp_ecc_sign_256_ctx* ctx = (sp_ecc_sign_256_ctx*)sp_ctx->data;
  104731. typedef char ctx_size_test[sizeof(sp_ecc_sign_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  104732. (void)sizeof(ctx_size_test);
  104733. switch (ctx->state) {
  104734. case 0: /* INIT */
  104735. ctx->s = ctx->e;
  104736. ctx->kInv = ctx->k;
  104737. ctx->i = SP_ECC_MAX_SIG_GEN;
  104738. ctx->state = 1;
  104739. break;
  104740. case 1: /* GEN */
  104741. /* New random point. */
  104742. if (km == NULL || mp_iszero(km)) {
  104743. err = sp_256_ecc_gen_k_8(rng, ctx->k);
  104744. }
  104745. else {
  104746. sp_256_from_mp(ctx->k, 8, km);
  104747. mp_zero(km);
  104748. }
  104749. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  104750. ctx->state = 2;
  104751. break;
  104752. case 2: /* MULMOD */
  104753. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  104754. &ctx->point, &p256_base, ctx->k, 1, 1, heap);
  104755. if (err == MP_OKAY) {
  104756. ctx->state = 3;
  104757. }
  104758. break;
  104759. case 3: /* MODORDER */
  104760. {
  104761. sp_int32 c;
  104762. /* r = point->x mod order */
  104763. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 8U);
  104764. sp_256_norm_8(ctx->r);
  104765. c = sp_256_cmp_8(ctx->r, p256_order);
  104766. sp_256_cond_sub_8(ctx->r, ctx->r, p256_order,
  104767. (sp_digit)0 - (sp_digit)(c >= 0));
  104768. sp_256_norm_8(ctx->r);
  104769. if (hashLen > 32U) {
  104770. hashLen = 32U;
  104771. }
  104772. sp_256_from_mp(ctx->x, 8, priv);
  104773. sp_256_from_bin(ctx->e, 8, hash, (int)hashLen);
  104774. ctx->state = 4;
  104775. break;
  104776. }
  104777. case 4: /* KMODORDER */
  104778. /* Conv k to Montgomery form (mod order) */
  104779. sp_256_mul_8(ctx->k, ctx->k, p256_norm_order);
  104780. err = sp_256_mod_8(ctx->k, ctx->k, p256_order);
  104781. if (err == MP_OKAY) {
  104782. sp_256_norm_8(ctx->k);
  104783. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  104784. ctx->state = 5;
  104785. }
  104786. break;
  104787. case 5: /* KINV */
  104788. /* kInv = 1/k mod order */
  104789. err = sp_256_mont_inv_order_8_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  104790. if (err == MP_OKAY) {
  104791. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  104792. ctx->state = 6;
  104793. }
  104794. break;
  104795. case 6: /* KINVNORM */
  104796. sp_256_norm_8(ctx->kInv);
  104797. ctx->state = 7;
  104798. break;
  104799. case 7: /* R */
  104800. /* s = r * x + e */
  104801. sp_256_mul_8(ctx->x, ctx->x, ctx->r);
  104802. ctx->state = 8;
  104803. break;
  104804. case 8: /* S1 */
  104805. err = sp_256_mod_8(ctx->x, ctx->x, p256_order);
  104806. if (err == MP_OKAY)
  104807. ctx->state = 9;
  104808. break;
  104809. case 9: /* S2 */
  104810. {
  104811. sp_digit carry;
  104812. sp_int32 c;
  104813. sp_256_norm_8(ctx->x);
  104814. carry = sp_256_add_8(ctx->s, ctx->e, ctx->x);
  104815. sp_256_cond_sub_8(ctx->s, ctx->s,
  104816. p256_order, 0 - carry);
  104817. sp_256_norm_8(ctx->s);
  104818. c = sp_256_cmp_8(ctx->s, p256_order);
  104819. sp_256_cond_sub_8(ctx->s, ctx->s, p256_order,
  104820. (sp_digit)0 - (sp_digit)(c >= 0));
  104821. sp_256_norm_8(ctx->s);
  104822. /* s = s * k^-1 mod order */
  104823. sp_256_mont_mul_order_8(ctx->s, ctx->s, ctx->kInv);
  104824. sp_256_norm_8(ctx->s);
  104825. /* Check that signature is usable. */
  104826. if (sp_256_iszero_8(ctx->s) == 0) {
  104827. ctx->state = 10;
  104828. break;
  104829. }
  104830. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  104831. ctx->i = 1;
  104832. #endif
  104833. /* not usable gen, try again */
  104834. ctx->i--;
  104835. if (ctx->i == 0) {
  104836. err = RNG_FAILURE_E;
  104837. }
  104838. ctx->state = 1;
  104839. break;
  104840. }
  104841. case 10: /* RES */
  104842. err = sp_256_to_mp(ctx->r, rm);
  104843. if (err == MP_OKAY) {
  104844. err = sp_256_to_mp(ctx->s, sm);
  104845. }
  104846. break;
  104847. }
  104848. if (err == MP_OKAY && ctx->state != 10) {
  104849. err = FP_WOULDBLOCK;
  104850. }
  104851. if (err != FP_WOULDBLOCK) {
  104852. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 8U);
  104853. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 8U);
  104854. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 8U);
  104855. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 8U);
  104856. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 8U);
  104857. }
  104858. return err;
  104859. }
  104860. #endif /* WOLFSSL_SP_NONBLOCK */
  104861. #endif /* HAVE_ECC_SIGN */
  104862. #ifndef WOLFSSL_SP_SMALL
  104863. #ifdef WOLFSSL_SP_SMALL
  104864. /* Sub b from a into r. (r = a - b)
  104865. *
  104866. * r A single precision integer.
  104867. * a A single precision integer.
  104868. * b A single precision integer.
  104869. */
  104870. SP_NOINLINE static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a,
  104871. const sp_digit* b)
  104872. {
  104873. __asm__ __volatile__ (
  104874. "movs r6, %[a]\n\t"
  104875. "movs r3, #0\n\t"
  104876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104877. "adds r6, r6, #32\n\t"
  104878. #else
  104879. "add r6, r6, #32\n\t"
  104880. #endif
  104881. "\n"
  104882. "L_sp_256_sub_8_word_%=:\n\t"
  104883. "movs r5, #0\n\t"
  104884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104885. "subs r5, r5, r3\n\t"
  104886. #else
  104887. "sub r5, r5, r3\n\t"
  104888. #endif
  104889. "ldr r4, [%[a]]\n\t"
  104890. "ldr r5, [%[b]]\n\t"
  104891. #ifdef WOLFSSL_KEIL
  104892. "sbcs r4, r4, r5\n\t"
  104893. #elif defined(__clang__)
  104894. "sbcs r4, r5\n\t"
  104895. #else
  104896. "sbc r4, r5\n\t"
  104897. #endif
  104898. "str r4, [%[r]]\n\t"
  104899. #ifdef WOLFSSL_KEIL
  104900. "sbcs r3, r3, r3\n\t"
  104901. #elif defined(__clang__)
  104902. "sbcs r3, r3\n\t"
  104903. #else
  104904. "sbc r3, r3\n\t"
  104905. #endif
  104906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104907. "adds %[a], %[a], #4\n\t"
  104908. #else
  104909. "add %[a], %[a], #4\n\t"
  104910. #endif
  104911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104912. "adds %[b], %[b], #4\n\t"
  104913. #else
  104914. "add %[b], %[b], #4\n\t"
  104915. #endif
  104916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104917. "adds %[r], %[r], #4\n\t"
  104918. #else
  104919. "add %[r], %[r], #4\n\t"
  104920. #endif
  104921. "cmp %[a], r6\n\t"
  104922. "bne L_sp_256_sub_8_word_%=\n\t"
  104923. "movs %[r], r3\n\t"
  104924. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  104925. :
  104926. : "memory", "r3", "r4", "r5", "r6"
  104927. );
  104928. return (uint32_t)(size_t)r;
  104929. }
  104930. #else
  104931. /* Sub b from a into r. (r = a - b)
  104932. *
  104933. * r A single precision integer.
  104934. * a A single precision integer.
  104935. * b A single precision integer.
  104936. */
  104937. SP_NOINLINE static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a,
  104938. const sp_digit* b)
  104939. {
  104940. __asm__ __volatile__ (
  104941. "ldm %[b]!, {r5, r6}\n\t"
  104942. "ldm %[a]!, {r3, r4}\n\t"
  104943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104944. "subs r3, r3, r5\n\t"
  104945. #else
  104946. "sub r3, r3, r5\n\t"
  104947. #endif
  104948. #ifdef WOLFSSL_KEIL
  104949. "sbcs r4, r4, r6\n\t"
  104950. #elif defined(__clang__)
  104951. "sbcs r4, r6\n\t"
  104952. #else
  104953. "sbc r4, r6\n\t"
  104954. #endif
  104955. "stm %[r]!, {r3, r4}\n\t"
  104956. "ldm %[b]!, {r5, r6}\n\t"
  104957. "ldm %[a]!, {r3, r4}\n\t"
  104958. #ifdef WOLFSSL_KEIL
  104959. "sbcs r3, r3, r5\n\t"
  104960. #elif defined(__clang__)
  104961. "sbcs r3, r5\n\t"
  104962. #else
  104963. "sbc r3, r5\n\t"
  104964. #endif
  104965. #ifdef WOLFSSL_KEIL
  104966. "sbcs r4, r4, r6\n\t"
  104967. #elif defined(__clang__)
  104968. "sbcs r4, r6\n\t"
  104969. #else
  104970. "sbc r4, r6\n\t"
  104971. #endif
  104972. "stm %[r]!, {r3, r4}\n\t"
  104973. "ldm %[b]!, {r5, r6}\n\t"
  104974. "ldm %[a]!, {r3, r4}\n\t"
  104975. #ifdef WOLFSSL_KEIL
  104976. "sbcs r3, r3, r5\n\t"
  104977. #elif defined(__clang__)
  104978. "sbcs r3, r5\n\t"
  104979. #else
  104980. "sbc r3, r5\n\t"
  104981. #endif
  104982. #ifdef WOLFSSL_KEIL
  104983. "sbcs r4, r4, r6\n\t"
  104984. #elif defined(__clang__)
  104985. "sbcs r4, r6\n\t"
  104986. #else
  104987. "sbc r4, r6\n\t"
  104988. #endif
  104989. "stm %[r]!, {r3, r4}\n\t"
  104990. "ldm %[b]!, {r5, r6}\n\t"
  104991. "ldm %[a]!, {r3, r4}\n\t"
  104992. #ifdef WOLFSSL_KEIL
  104993. "sbcs r3, r3, r5\n\t"
  104994. #elif defined(__clang__)
  104995. "sbcs r3, r5\n\t"
  104996. #else
  104997. "sbc r3, r5\n\t"
  104998. #endif
  104999. #ifdef WOLFSSL_KEIL
  105000. "sbcs r4, r4, r6\n\t"
  105001. #elif defined(__clang__)
  105002. "sbcs r4, r6\n\t"
  105003. #else
  105004. "sbc r4, r6\n\t"
  105005. #endif
  105006. "stm %[r]!, {r3, r4}\n\t"
  105007. #ifdef WOLFSSL_KEIL
  105008. "sbcs %[r], %[r], %[r]\n\t"
  105009. #elif defined(__clang__)
  105010. "sbcs %[r], %[r]\n\t"
  105011. #else
  105012. "sbc %[r], %[r]\n\t"
  105013. #endif
  105014. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  105015. :
  105016. : "memory", "r3", "r4", "r5", "r6"
  105017. );
  105018. return (uint32_t)(size_t)r;
  105019. }
  105020. #endif /* WOLFSSL_SP_SMALL */
  105021. /* Right shift a by 1 bit into r. (r = a >> 1)
  105022. *
  105023. * r A single precision integer.
  105024. * a A single precision integer.
  105025. */
  105026. static void sp_256_rshift1_8(sp_digit* r, const sp_digit* a)
  105027. {
  105028. __asm__ __volatile__ (
  105029. "ldr r2, [%[a]]\n\t"
  105030. "ldr r3, [%[a], #4]\n\t"
  105031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105032. "lsrs r2, r2, #1\n\t"
  105033. #else
  105034. "lsr r2, r2, #1\n\t"
  105035. #endif
  105036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105037. "lsls r5, r3, #31\n\t"
  105038. #else
  105039. "lsl r5, r3, #31\n\t"
  105040. #endif
  105041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105042. "lsrs r3, r3, #1\n\t"
  105043. #else
  105044. "lsr r3, r3, #1\n\t"
  105045. #endif
  105046. #ifdef WOLFSSL_KEIL
  105047. "orrs r2, r2, r5\n\t"
  105048. #elif defined(__clang__)
  105049. "orrs r2, r5\n\t"
  105050. #else
  105051. "orr r2, r5\n\t"
  105052. #endif
  105053. "ldr r4, [%[a], #8]\n\t"
  105054. "str r2, [%[r]]\n\t"
  105055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105056. "lsls r5, r4, #31\n\t"
  105057. #else
  105058. "lsl r5, r4, #31\n\t"
  105059. #endif
  105060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105061. "lsrs r4, r4, #1\n\t"
  105062. #else
  105063. "lsr r4, r4, #1\n\t"
  105064. #endif
  105065. #ifdef WOLFSSL_KEIL
  105066. "orrs r3, r3, r5\n\t"
  105067. #elif defined(__clang__)
  105068. "orrs r3, r5\n\t"
  105069. #else
  105070. "orr r3, r5\n\t"
  105071. #endif
  105072. "ldr r2, [%[a], #12]\n\t"
  105073. "str r3, [%[r], #4]\n\t"
  105074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105075. "lsls r5, r2, #31\n\t"
  105076. #else
  105077. "lsl r5, r2, #31\n\t"
  105078. #endif
  105079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105080. "lsrs r2, r2, #1\n\t"
  105081. #else
  105082. "lsr r2, r2, #1\n\t"
  105083. #endif
  105084. #ifdef WOLFSSL_KEIL
  105085. "orrs r4, r4, r5\n\t"
  105086. #elif defined(__clang__)
  105087. "orrs r4, r5\n\t"
  105088. #else
  105089. "orr r4, r5\n\t"
  105090. #endif
  105091. "ldr r3, [%[a], #16]\n\t"
  105092. "str r4, [%[r], #8]\n\t"
  105093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105094. "lsls r5, r3, #31\n\t"
  105095. #else
  105096. "lsl r5, r3, #31\n\t"
  105097. #endif
  105098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105099. "lsrs r3, r3, #1\n\t"
  105100. #else
  105101. "lsr r3, r3, #1\n\t"
  105102. #endif
  105103. #ifdef WOLFSSL_KEIL
  105104. "orrs r2, r2, r5\n\t"
  105105. #elif defined(__clang__)
  105106. "orrs r2, r5\n\t"
  105107. #else
  105108. "orr r2, r5\n\t"
  105109. #endif
  105110. "ldr r4, [%[a], #20]\n\t"
  105111. "str r2, [%[r], #12]\n\t"
  105112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105113. "lsls r5, r4, #31\n\t"
  105114. #else
  105115. "lsl r5, r4, #31\n\t"
  105116. #endif
  105117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105118. "lsrs r4, r4, #1\n\t"
  105119. #else
  105120. "lsr r4, r4, #1\n\t"
  105121. #endif
  105122. #ifdef WOLFSSL_KEIL
  105123. "orrs r3, r3, r5\n\t"
  105124. #elif defined(__clang__)
  105125. "orrs r3, r5\n\t"
  105126. #else
  105127. "orr r3, r5\n\t"
  105128. #endif
  105129. "ldr r2, [%[a], #24]\n\t"
  105130. "str r3, [%[r], #16]\n\t"
  105131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105132. "lsls r5, r2, #31\n\t"
  105133. #else
  105134. "lsl r5, r2, #31\n\t"
  105135. #endif
  105136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105137. "lsrs r2, r2, #1\n\t"
  105138. #else
  105139. "lsr r2, r2, #1\n\t"
  105140. #endif
  105141. #ifdef WOLFSSL_KEIL
  105142. "orrs r4, r4, r5\n\t"
  105143. #elif defined(__clang__)
  105144. "orrs r4, r5\n\t"
  105145. #else
  105146. "orr r4, r5\n\t"
  105147. #endif
  105148. "ldr r3, [%[a], #28]\n\t"
  105149. "str r4, [%[r], #20]\n\t"
  105150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105151. "lsls r5, r3, #31\n\t"
  105152. #else
  105153. "lsl r5, r3, #31\n\t"
  105154. #endif
  105155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105156. "lsrs r3, r3, #1\n\t"
  105157. #else
  105158. "lsr r3, r3, #1\n\t"
  105159. #endif
  105160. #ifdef WOLFSSL_KEIL
  105161. "orrs r2, r2, r5\n\t"
  105162. #elif defined(__clang__)
  105163. "orrs r2, r5\n\t"
  105164. #else
  105165. "orr r2, r5\n\t"
  105166. #endif
  105167. "str r2, [%[r], #24]\n\t"
  105168. "str r3, [%[r], #28]\n\t"
  105169. : [r] "+l" (r), [a] "+l" (a)
  105170. :
  105171. : "memory", "r2", "r3", "r4", "r5"
  105172. );
  105173. }
  105174. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  105175. *
  105176. * r Result of division by 2.
  105177. * a Number to divide.
  105178. * m Modulus.
  105179. */
  105180. static void sp_256_div2_mod_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  105181. {
  105182. __asm__ __volatile__ (
  105183. "ldr r7, [%[a]]\n\t"
  105184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105185. "lsls r7, r7, #31\n\t"
  105186. #else
  105187. "lsl r7, r7, #31\n\t"
  105188. #endif
  105189. "beq L_sp_256_div2_mod_8_no_add_%=\n\t"
  105190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105191. "lsrs r7, r7, #31\n\t"
  105192. #else
  105193. "lsr r7, r7, #31\n\t"
  105194. #endif
  105195. "ldr r5, [%[m]]\n\t"
  105196. "ldr r6, [%[m], #4]\n\t"
  105197. "ldr r3, [%[a]]\n\t"
  105198. "ldr r4, [%[a], #4]\n\t"
  105199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105200. "adds r3, r3, r5\n\t"
  105201. #else
  105202. "add r3, r3, r5\n\t"
  105203. #endif
  105204. #ifdef WOLFSSL_KEIL
  105205. "adcs r4, r4, r6\n\t"
  105206. #elif defined(__clang__)
  105207. "adcs r4, r6\n\t"
  105208. #else
  105209. "adc r4, r6\n\t"
  105210. #endif
  105211. "str r3, [%[r]]\n\t"
  105212. "str r4, [%[r], #4]\n\t"
  105213. "ldr r5, [%[m], #8]\n\t"
  105214. "ldr r6, [%[m], #12]\n\t"
  105215. "ldr r3, [%[a], #8]\n\t"
  105216. "ldr r4, [%[a], #12]\n\t"
  105217. #ifdef WOLFSSL_KEIL
  105218. "adcs r3, r3, r5\n\t"
  105219. #elif defined(__clang__)
  105220. "adcs r3, r5\n\t"
  105221. #else
  105222. "adc r3, r5\n\t"
  105223. #endif
  105224. #ifdef WOLFSSL_KEIL
  105225. "adcs r4, r4, r6\n\t"
  105226. #elif defined(__clang__)
  105227. "adcs r4, r6\n\t"
  105228. #else
  105229. "adc r4, r6\n\t"
  105230. #endif
  105231. "str r3, [%[r], #8]\n\t"
  105232. "str r4, [%[r], #12]\n\t"
  105233. "ldr r5, [%[m], #16]\n\t"
  105234. "ldr r6, [%[m], #20]\n\t"
  105235. "ldr r3, [%[a], #16]\n\t"
  105236. "ldr r4, [%[a], #20]\n\t"
  105237. #ifdef WOLFSSL_KEIL
  105238. "adcs r3, r3, r5\n\t"
  105239. #elif defined(__clang__)
  105240. "adcs r3, r5\n\t"
  105241. #else
  105242. "adc r3, r5\n\t"
  105243. #endif
  105244. #ifdef WOLFSSL_KEIL
  105245. "adcs r4, r4, r6\n\t"
  105246. #elif defined(__clang__)
  105247. "adcs r4, r6\n\t"
  105248. #else
  105249. "adc r4, r6\n\t"
  105250. #endif
  105251. "str r3, [%[r], #16]\n\t"
  105252. "str r4, [%[r], #20]\n\t"
  105253. "ldr r5, [%[m], #24]\n\t"
  105254. "ldr r6, [%[m], #28]\n\t"
  105255. "ldr r3, [%[a], #24]\n\t"
  105256. "ldr r4, [%[a], #28]\n\t"
  105257. #ifdef WOLFSSL_KEIL
  105258. "adcs r3, r3, r5\n\t"
  105259. #elif defined(__clang__)
  105260. "adcs r3, r5\n\t"
  105261. #else
  105262. "adc r3, r5\n\t"
  105263. #endif
  105264. #ifdef WOLFSSL_KEIL
  105265. "adcs r4, r4, r6\n\t"
  105266. #elif defined(__clang__)
  105267. "adcs r4, r6\n\t"
  105268. #else
  105269. "adc r4, r6\n\t"
  105270. #endif
  105271. "movs r7, #0\n\t"
  105272. #ifdef WOLFSSL_KEIL
  105273. "adcs r7, r7, r7\n\t"
  105274. #elif defined(__clang__)
  105275. "adcs r7, r7\n\t"
  105276. #else
  105277. "adc r7, r7\n\t"
  105278. #endif
  105279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105280. "lsls r7, r7, #31\n\t"
  105281. #else
  105282. "lsl r7, r7, #31\n\t"
  105283. #endif
  105284. "b L_sp_256_div2_mod_8_div2_%=\n\t"
  105285. "\n"
  105286. "L_sp_256_div2_mod_8_no_add_%=:\n\t"
  105287. "ldr r3, [%[a], #24]\n\t"
  105288. "ldr r4, [%[a], #28]\n\t"
  105289. "\n"
  105290. "L_sp_256_div2_mod_8_div2_%=:\n\t"
  105291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105292. "lsrs r5, r3, #1\n\t"
  105293. #else
  105294. "lsr r5, r3, #1\n\t"
  105295. #endif
  105296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105297. "lsls r3, r3, #31\n\t"
  105298. #else
  105299. "lsl r3, r3, #31\n\t"
  105300. #endif
  105301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105302. "lsrs r6, r4, #1\n\t"
  105303. #else
  105304. "lsr r6, r4, #1\n\t"
  105305. #endif
  105306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105307. "lsls r4, r4, #31\n\t"
  105308. #else
  105309. "lsl r4, r4, #31\n\t"
  105310. #endif
  105311. #ifdef WOLFSSL_KEIL
  105312. "orrs r5, r5, r4\n\t"
  105313. #elif defined(__clang__)
  105314. "orrs r5, r4\n\t"
  105315. #else
  105316. "orr r5, r4\n\t"
  105317. #endif
  105318. #ifdef WOLFSSL_KEIL
  105319. "orrs r6, r6, r7\n\t"
  105320. #elif defined(__clang__)
  105321. "orrs r6, r7\n\t"
  105322. #else
  105323. "orr r6, r7\n\t"
  105324. #endif
  105325. "movs r7, r3\n\t"
  105326. "str r5, [%[r], #24]\n\t"
  105327. "str r6, [%[r], #28]\n\t"
  105328. "ldr r3, [%[a], #16]\n\t"
  105329. "ldr r4, [%[a], #20]\n\t"
  105330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105331. "lsrs r5, r3, #1\n\t"
  105332. #else
  105333. "lsr r5, r3, #1\n\t"
  105334. #endif
  105335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105336. "lsls r3, r3, #31\n\t"
  105337. #else
  105338. "lsl r3, r3, #31\n\t"
  105339. #endif
  105340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105341. "lsrs r6, r4, #1\n\t"
  105342. #else
  105343. "lsr r6, r4, #1\n\t"
  105344. #endif
  105345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105346. "lsls r4, r4, #31\n\t"
  105347. #else
  105348. "lsl r4, r4, #31\n\t"
  105349. #endif
  105350. #ifdef WOLFSSL_KEIL
  105351. "orrs r5, r5, r4\n\t"
  105352. #elif defined(__clang__)
  105353. "orrs r5, r4\n\t"
  105354. #else
  105355. "orr r5, r4\n\t"
  105356. #endif
  105357. #ifdef WOLFSSL_KEIL
  105358. "orrs r6, r6, r7\n\t"
  105359. #elif defined(__clang__)
  105360. "orrs r6, r7\n\t"
  105361. #else
  105362. "orr r6, r7\n\t"
  105363. #endif
  105364. "movs r7, r3\n\t"
  105365. "str r5, [%[r], #16]\n\t"
  105366. "str r6, [%[r], #20]\n\t"
  105367. "ldr r3, [%[a], #8]\n\t"
  105368. "ldr r4, [%[a], #12]\n\t"
  105369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105370. "lsrs r5, r3, #1\n\t"
  105371. #else
  105372. "lsr r5, r3, #1\n\t"
  105373. #endif
  105374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105375. "lsls r3, r3, #31\n\t"
  105376. #else
  105377. "lsl r3, r3, #31\n\t"
  105378. #endif
  105379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105380. "lsrs r6, r4, #1\n\t"
  105381. #else
  105382. "lsr r6, r4, #1\n\t"
  105383. #endif
  105384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105385. "lsls r4, r4, #31\n\t"
  105386. #else
  105387. "lsl r4, r4, #31\n\t"
  105388. #endif
  105389. #ifdef WOLFSSL_KEIL
  105390. "orrs r5, r5, r4\n\t"
  105391. #elif defined(__clang__)
  105392. "orrs r5, r4\n\t"
  105393. #else
  105394. "orr r5, r4\n\t"
  105395. #endif
  105396. #ifdef WOLFSSL_KEIL
  105397. "orrs r6, r6, r7\n\t"
  105398. #elif defined(__clang__)
  105399. "orrs r6, r7\n\t"
  105400. #else
  105401. "orr r6, r7\n\t"
  105402. #endif
  105403. "movs r7, r3\n\t"
  105404. "str r5, [%[r], #8]\n\t"
  105405. "str r6, [%[r], #12]\n\t"
  105406. "ldr r3, [%[r]]\n\t"
  105407. "ldr r4, [%[r], #4]\n\t"
  105408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105409. "lsrs r5, r3, #1\n\t"
  105410. #else
  105411. "lsr r5, r3, #1\n\t"
  105412. #endif
  105413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105414. "lsrs r6, r4, #1\n\t"
  105415. #else
  105416. "lsr r6, r4, #1\n\t"
  105417. #endif
  105418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105419. "lsls r4, r4, #31\n\t"
  105420. #else
  105421. "lsl r4, r4, #31\n\t"
  105422. #endif
  105423. #ifdef WOLFSSL_KEIL
  105424. "orrs r5, r5, r4\n\t"
  105425. #elif defined(__clang__)
  105426. "orrs r5, r4\n\t"
  105427. #else
  105428. "orr r5, r4\n\t"
  105429. #endif
  105430. #ifdef WOLFSSL_KEIL
  105431. "orrs r6, r6, r7\n\t"
  105432. #elif defined(__clang__)
  105433. "orrs r6, r7\n\t"
  105434. #else
  105435. "orr r6, r7\n\t"
  105436. #endif
  105437. "str r5, [%[r]]\n\t"
  105438. "str r6, [%[r], #4]\n\t"
  105439. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  105440. :
  105441. : "memory", "r3", "r4", "r5", "r6", "r7", "r8"
  105442. );
  105443. }
  105444. static int sp_256_num_bits_8(sp_digit* a)
  105445. {
  105446. static const byte sp_num_bits_table[256] = {
  105447. 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
  105448. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  105449. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  105450. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  105451. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  105452. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  105453. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  105454. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  105455. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105456. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105457. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105458. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105459. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105460. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105461. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105462. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105463. };
  105464. const byte* table = sp_num_bits_table;
  105465. __asm__ __volatile__ (
  105466. "movs r6, #0xff\n\t"
  105467. "ldr r3, [%[a], #28]\n\t"
  105468. "cmp r3, #0\n\t"
  105469. "beq L_sp_256_num_bits_8_7_%=\n\t"
  105470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105471. "lsrs r5, r3, #24\n\t"
  105472. #else
  105473. "lsr r5, r3, #24\n\t"
  105474. #endif
  105475. "cmp r5, #0\n\t"
  105476. "beq L_sp_256_num_bits_8_93_%=\n\t"
  105477. "movs r2, #0xf8\n\t"
  105478. "ldrb r4, [%[table], r5]\n\t"
  105479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105480. "adds r2, r2, r4\n\t"
  105481. #else
  105482. "add r2, r2, r4\n\t"
  105483. #endif
  105484. "b L_sp_256_num_bits_8_9_%=\n\t"
  105485. "\n"
  105486. "L_sp_256_num_bits_8_93_%=:\n\t"
  105487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105488. "lsrs r5, r3, #16\n\t"
  105489. #else
  105490. "lsr r5, r3, #16\n\t"
  105491. #endif
  105492. #ifdef WOLFSSL_KEIL
  105493. "ands r5, r5, r6\n\t"
  105494. #elif defined(__clang__)
  105495. "ands r5, r6\n\t"
  105496. #else
  105497. "and r5, r6\n\t"
  105498. #endif
  105499. "cmp r5, #0\n\t"
  105500. "beq L_sp_256_num_bits_8_92_%=\n\t"
  105501. "movs r2, #0xf0\n\t"
  105502. "ldrb r4, [%[table], r5]\n\t"
  105503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105504. "adds r2, r2, r4\n\t"
  105505. #else
  105506. "add r2, r2, r4\n\t"
  105507. #endif
  105508. "b L_sp_256_num_bits_8_9_%=\n\t"
  105509. "\n"
  105510. "L_sp_256_num_bits_8_92_%=:\n\t"
  105511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105512. "lsrs r5, r3, #8\n\t"
  105513. #else
  105514. "lsr r5, r3, #8\n\t"
  105515. #endif
  105516. #ifdef WOLFSSL_KEIL
  105517. "ands r5, r5, r6\n\t"
  105518. #elif defined(__clang__)
  105519. "ands r5, r6\n\t"
  105520. #else
  105521. "and r5, r6\n\t"
  105522. #endif
  105523. "cmp r5, #0\n\t"
  105524. "beq L_sp_256_num_bits_8_91_%=\n\t"
  105525. "movs r2, #0xe8\n\t"
  105526. "ldrb r4, [%[table], r5]\n\t"
  105527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105528. "adds r2, r2, r4\n\t"
  105529. #else
  105530. "add r2, r2, r4\n\t"
  105531. #endif
  105532. "b L_sp_256_num_bits_8_9_%=\n\t"
  105533. "\n"
  105534. "L_sp_256_num_bits_8_91_%=:\n\t"
  105535. "movs r5, r3\n\t"
  105536. #ifdef WOLFSSL_KEIL
  105537. "ands r5, r5, r6\n\t"
  105538. #elif defined(__clang__)
  105539. "ands r5, r6\n\t"
  105540. #else
  105541. "and r5, r6\n\t"
  105542. #endif
  105543. "cmp r5, #0\n\t"
  105544. "beq L_sp_256_num_bits_8_90_%=\n\t"
  105545. "movs r2, #0xe0\n\t"
  105546. "ldrb r4, [%[table], r5]\n\t"
  105547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105548. "adds r2, r2, r4\n\t"
  105549. #else
  105550. "add r2, r2, r4\n\t"
  105551. #endif
  105552. "b L_sp_256_num_bits_8_9_%=\n\t"
  105553. "\n"
  105554. "L_sp_256_num_bits_8_90_%=:\n\t"
  105555. "b L_sp_256_num_bits_8_9_%=\n\t"
  105556. "\n"
  105557. "L_sp_256_num_bits_8_7_%=:\n\t"
  105558. "ldr r3, [%[a], #24]\n\t"
  105559. "cmp r3, #0\n\t"
  105560. "beq L_sp_256_num_bits_8_6_%=\n\t"
  105561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105562. "lsrs r5, r3, #24\n\t"
  105563. #else
  105564. "lsr r5, r3, #24\n\t"
  105565. #endif
  105566. "cmp r5, #0\n\t"
  105567. "beq L_sp_256_num_bits_8_83_%=\n\t"
  105568. "movs r2, #0xd8\n\t"
  105569. "ldrb r4, [%[table], r5]\n\t"
  105570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105571. "adds r2, r2, r4\n\t"
  105572. #else
  105573. "add r2, r2, r4\n\t"
  105574. #endif
  105575. "b L_sp_256_num_bits_8_9_%=\n\t"
  105576. "\n"
  105577. "L_sp_256_num_bits_8_83_%=:\n\t"
  105578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105579. "lsrs r5, r3, #16\n\t"
  105580. #else
  105581. "lsr r5, r3, #16\n\t"
  105582. #endif
  105583. #ifdef WOLFSSL_KEIL
  105584. "ands r5, r5, r6\n\t"
  105585. #elif defined(__clang__)
  105586. "ands r5, r6\n\t"
  105587. #else
  105588. "and r5, r6\n\t"
  105589. #endif
  105590. "cmp r5, #0\n\t"
  105591. "beq L_sp_256_num_bits_8_82_%=\n\t"
  105592. "movs r2, #0xd0\n\t"
  105593. "ldrb r4, [%[table], r5]\n\t"
  105594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105595. "adds r2, r2, r4\n\t"
  105596. #else
  105597. "add r2, r2, r4\n\t"
  105598. #endif
  105599. "b L_sp_256_num_bits_8_9_%=\n\t"
  105600. "\n"
  105601. "L_sp_256_num_bits_8_82_%=:\n\t"
  105602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105603. "lsrs r5, r3, #8\n\t"
  105604. #else
  105605. "lsr r5, r3, #8\n\t"
  105606. #endif
  105607. #ifdef WOLFSSL_KEIL
  105608. "ands r5, r5, r6\n\t"
  105609. #elif defined(__clang__)
  105610. "ands r5, r6\n\t"
  105611. #else
  105612. "and r5, r6\n\t"
  105613. #endif
  105614. "cmp r5, #0\n\t"
  105615. "beq L_sp_256_num_bits_8_81_%=\n\t"
  105616. "movs r2, #0xc8\n\t"
  105617. "ldrb r4, [%[table], r5]\n\t"
  105618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105619. "adds r2, r2, r4\n\t"
  105620. #else
  105621. "add r2, r2, r4\n\t"
  105622. #endif
  105623. "b L_sp_256_num_bits_8_9_%=\n\t"
  105624. "\n"
  105625. "L_sp_256_num_bits_8_81_%=:\n\t"
  105626. "movs r5, r3\n\t"
  105627. #ifdef WOLFSSL_KEIL
  105628. "ands r5, r5, r6\n\t"
  105629. #elif defined(__clang__)
  105630. "ands r5, r6\n\t"
  105631. #else
  105632. "and r5, r6\n\t"
  105633. #endif
  105634. "cmp r5, #0\n\t"
  105635. "beq L_sp_256_num_bits_8_80_%=\n\t"
  105636. "movs r2, #0xc0\n\t"
  105637. "ldrb r4, [%[table], r5]\n\t"
  105638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105639. "adds r2, r2, r4\n\t"
  105640. #else
  105641. "add r2, r2, r4\n\t"
  105642. #endif
  105643. "b L_sp_256_num_bits_8_9_%=\n\t"
  105644. "\n"
  105645. "L_sp_256_num_bits_8_80_%=:\n\t"
  105646. "b L_sp_256_num_bits_8_9_%=\n\t"
  105647. "\n"
  105648. "L_sp_256_num_bits_8_6_%=:\n\t"
  105649. "ldr r3, [%[a], #20]\n\t"
  105650. "cmp r3, #0\n\t"
  105651. "beq L_sp_256_num_bits_8_5_%=\n\t"
  105652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105653. "lsrs r5, r3, #24\n\t"
  105654. #else
  105655. "lsr r5, r3, #24\n\t"
  105656. #endif
  105657. "cmp r5, #0\n\t"
  105658. "beq L_sp_256_num_bits_8_73_%=\n\t"
  105659. "movs r2, #0xb8\n\t"
  105660. "ldrb r4, [%[table], r5]\n\t"
  105661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105662. "adds r2, r2, r4\n\t"
  105663. #else
  105664. "add r2, r2, r4\n\t"
  105665. #endif
  105666. "b L_sp_256_num_bits_8_9_%=\n\t"
  105667. "\n"
  105668. "L_sp_256_num_bits_8_73_%=:\n\t"
  105669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105670. "lsrs r5, r3, #16\n\t"
  105671. #else
  105672. "lsr r5, r3, #16\n\t"
  105673. #endif
  105674. #ifdef WOLFSSL_KEIL
  105675. "ands r5, r5, r6\n\t"
  105676. #elif defined(__clang__)
  105677. "ands r5, r6\n\t"
  105678. #else
  105679. "and r5, r6\n\t"
  105680. #endif
  105681. "cmp r5, #0\n\t"
  105682. "beq L_sp_256_num_bits_8_72_%=\n\t"
  105683. "movs r2, #0xb0\n\t"
  105684. "ldrb r4, [%[table], r5]\n\t"
  105685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105686. "adds r2, r2, r4\n\t"
  105687. #else
  105688. "add r2, r2, r4\n\t"
  105689. #endif
  105690. "b L_sp_256_num_bits_8_9_%=\n\t"
  105691. "\n"
  105692. "L_sp_256_num_bits_8_72_%=:\n\t"
  105693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105694. "lsrs r5, r3, #8\n\t"
  105695. #else
  105696. "lsr r5, r3, #8\n\t"
  105697. #endif
  105698. #ifdef WOLFSSL_KEIL
  105699. "ands r5, r5, r6\n\t"
  105700. #elif defined(__clang__)
  105701. "ands r5, r6\n\t"
  105702. #else
  105703. "and r5, r6\n\t"
  105704. #endif
  105705. "cmp r5, #0\n\t"
  105706. "beq L_sp_256_num_bits_8_71_%=\n\t"
  105707. "movs r2, #0xa8\n\t"
  105708. "ldrb r4, [%[table], r5]\n\t"
  105709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105710. "adds r2, r2, r4\n\t"
  105711. #else
  105712. "add r2, r2, r4\n\t"
  105713. #endif
  105714. "b L_sp_256_num_bits_8_9_%=\n\t"
  105715. "\n"
  105716. "L_sp_256_num_bits_8_71_%=:\n\t"
  105717. "movs r5, r3\n\t"
  105718. #ifdef WOLFSSL_KEIL
  105719. "ands r5, r5, r6\n\t"
  105720. #elif defined(__clang__)
  105721. "ands r5, r6\n\t"
  105722. #else
  105723. "and r5, r6\n\t"
  105724. #endif
  105725. "cmp r5, #0\n\t"
  105726. "beq L_sp_256_num_bits_8_70_%=\n\t"
  105727. "movs r2, #0xa0\n\t"
  105728. "ldrb r4, [%[table], r5]\n\t"
  105729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105730. "adds r2, r2, r4\n\t"
  105731. #else
  105732. "add r2, r2, r4\n\t"
  105733. #endif
  105734. "b L_sp_256_num_bits_8_9_%=\n\t"
  105735. "\n"
  105736. "L_sp_256_num_bits_8_70_%=:\n\t"
  105737. "b L_sp_256_num_bits_8_9_%=\n\t"
  105738. "\n"
  105739. "L_sp_256_num_bits_8_5_%=:\n\t"
  105740. "ldr r3, [%[a], #16]\n\t"
  105741. "cmp r3, #0\n\t"
  105742. "beq L_sp_256_num_bits_8_4_%=\n\t"
  105743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105744. "lsrs r5, r3, #24\n\t"
  105745. #else
  105746. "lsr r5, r3, #24\n\t"
  105747. #endif
  105748. "cmp r5, #0\n\t"
  105749. "beq L_sp_256_num_bits_8_63_%=\n\t"
  105750. "movs r2, #0x98\n\t"
  105751. "ldrb r4, [%[table], r5]\n\t"
  105752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105753. "adds r2, r2, r4\n\t"
  105754. #else
  105755. "add r2, r2, r4\n\t"
  105756. #endif
  105757. "b L_sp_256_num_bits_8_9_%=\n\t"
  105758. "\n"
  105759. "L_sp_256_num_bits_8_63_%=:\n\t"
  105760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105761. "lsrs r5, r3, #16\n\t"
  105762. #else
  105763. "lsr r5, r3, #16\n\t"
  105764. #endif
  105765. #ifdef WOLFSSL_KEIL
  105766. "ands r5, r5, r6\n\t"
  105767. #elif defined(__clang__)
  105768. "ands r5, r6\n\t"
  105769. #else
  105770. "and r5, r6\n\t"
  105771. #endif
  105772. "cmp r5, #0\n\t"
  105773. "beq L_sp_256_num_bits_8_62_%=\n\t"
  105774. "movs r2, #0x90\n\t"
  105775. "ldrb r4, [%[table], r5]\n\t"
  105776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105777. "adds r2, r2, r4\n\t"
  105778. #else
  105779. "add r2, r2, r4\n\t"
  105780. #endif
  105781. "b L_sp_256_num_bits_8_9_%=\n\t"
  105782. "\n"
  105783. "L_sp_256_num_bits_8_62_%=:\n\t"
  105784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105785. "lsrs r5, r3, #8\n\t"
  105786. #else
  105787. "lsr r5, r3, #8\n\t"
  105788. #endif
  105789. #ifdef WOLFSSL_KEIL
  105790. "ands r5, r5, r6\n\t"
  105791. #elif defined(__clang__)
  105792. "ands r5, r6\n\t"
  105793. #else
  105794. "and r5, r6\n\t"
  105795. #endif
  105796. "cmp r5, #0\n\t"
  105797. "beq L_sp_256_num_bits_8_61_%=\n\t"
  105798. "movs r2, #0x88\n\t"
  105799. "ldrb r4, [%[table], r5]\n\t"
  105800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105801. "adds r2, r2, r4\n\t"
  105802. #else
  105803. "add r2, r2, r4\n\t"
  105804. #endif
  105805. "b L_sp_256_num_bits_8_9_%=\n\t"
  105806. "\n"
  105807. "L_sp_256_num_bits_8_61_%=:\n\t"
  105808. "movs r5, r3\n\t"
  105809. #ifdef WOLFSSL_KEIL
  105810. "ands r5, r5, r6\n\t"
  105811. #elif defined(__clang__)
  105812. "ands r5, r6\n\t"
  105813. #else
  105814. "and r5, r6\n\t"
  105815. #endif
  105816. "cmp r5, #0\n\t"
  105817. "beq L_sp_256_num_bits_8_60_%=\n\t"
  105818. "movs r2, #0x80\n\t"
  105819. "ldrb r4, [%[table], r5]\n\t"
  105820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105821. "adds r2, r2, r4\n\t"
  105822. #else
  105823. "add r2, r2, r4\n\t"
  105824. #endif
  105825. "b L_sp_256_num_bits_8_9_%=\n\t"
  105826. "\n"
  105827. "L_sp_256_num_bits_8_60_%=:\n\t"
  105828. "b L_sp_256_num_bits_8_9_%=\n\t"
  105829. "\n"
  105830. "L_sp_256_num_bits_8_4_%=:\n\t"
  105831. "ldr r3, [%[a], #12]\n\t"
  105832. "cmp r3, #0\n\t"
  105833. "beq L_sp_256_num_bits_8_3_%=\n\t"
  105834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105835. "lsrs r5, r3, #24\n\t"
  105836. #else
  105837. "lsr r5, r3, #24\n\t"
  105838. #endif
  105839. "cmp r5, #0\n\t"
  105840. "beq L_sp_256_num_bits_8_53_%=\n\t"
  105841. "movs r2, #0x78\n\t"
  105842. "ldrb r4, [%[table], r5]\n\t"
  105843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105844. "adds r2, r2, r4\n\t"
  105845. #else
  105846. "add r2, r2, r4\n\t"
  105847. #endif
  105848. "b L_sp_256_num_bits_8_9_%=\n\t"
  105849. "\n"
  105850. "L_sp_256_num_bits_8_53_%=:\n\t"
  105851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105852. "lsrs r5, r3, #16\n\t"
  105853. #else
  105854. "lsr r5, r3, #16\n\t"
  105855. #endif
  105856. #ifdef WOLFSSL_KEIL
  105857. "ands r5, r5, r6\n\t"
  105858. #elif defined(__clang__)
  105859. "ands r5, r6\n\t"
  105860. #else
  105861. "and r5, r6\n\t"
  105862. #endif
  105863. "cmp r5, #0\n\t"
  105864. "beq L_sp_256_num_bits_8_52_%=\n\t"
  105865. "movs r2, #0x70\n\t"
  105866. "ldrb r4, [%[table], r5]\n\t"
  105867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105868. "adds r2, r2, r4\n\t"
  105869. #else
  105870. "add r2, r2, r4\n\t"
  105871. #endif
  105872. "b L_sp_256_num_bits_8_9_%=\n\t"
  105873. "\n"
  105874. "L_sp_256_num_bits_8_52_%=:\n\t"
  105875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105876. "lsrs r5, r3, #8\n\t"
  105877. #else
  105878. "lsr r5, r3, #8\n\t"
  105879. #endif
  105880. #ifdef WOLFSSL_KEIL
  105881. "ands r5, r5, r6\n\t"
  105882. #elif defined(__clang__)
  105883. "ands r5, r6\n\t"
  105884. #else
  105885. "and r5, r6\n\t"
  105886. #endif
  105887. "cmp r5, #0\n\t"
  105888. "beq L_sp_256_num_bits_8_51_%=\n\t"
  105889. "movs r2, #0x68\n\t"
  105890. "ldrb r4, [%[table], r5]\n\t"
  105891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105892. "adds r2, r2, r4\n\t"
  105893. #else
  105894. "add r2, r2, r4\n\t"
  105895. #endif
  105896. "b L_sp_256_num_bits_8_9_%=\n\t"
  105897. "\n"
  105898. "L_sp_256_num_bits_8_51_%=:\n\t"
  105899. "movs r5, r3\n\t"
  105900. #ifdef WOLFSSL_KEIL
  105901. "ands r5, r5, r6\n\t"
  105902. #elif defined(__clang__)
  105903. "ands r5, r6\n\t"
  105904. #else
  105905. "and r5, r6\n\t"
  105906. #endif
  105907. "cmp r5, #0\n\t"
  105908. "beq L_sp_256_num_bits_8_50_%=\n\t"
  105909. "movs r2, #0x60\n\t"
  105910. "ldrb r4, [%[table], r5]\n\t"
  105911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105912. "adds r2, r2, r4\n\t"
  105913. #else
  105914. "add r2, r2, r4\n\t"
  105915. #endif
  105916. "b L_sp_256_num_bits_8_9_%=\n\t"
  105917. "\n"
  105918. "L_sp_256_num_bits_8_50_%=:\n\t"
  105919. "b L_sp_256_num_bits_8_9_%=\n\t"
  105920. "\n"
  105921. "L_sp_256_num_bits_8_3_%=:\n\t"
  105922. "ldr r3, [%[a], #8]\n\t"
  105923. "cmp r3, #0\n\t"
  105924. "beq L_sp_256_num_bits_8_2_%=\n\t"
  105925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105926. "lsrs r5, r3, #24\n\t"
  105927. #else
  105928. "lsr r5, r3, #24\n\t"
  105929. #endif
  105930. "cmp r5, #0\n\t"
  105931. "beq L_sp_256_num_bits_8_43_%=\n\t"
  105932. "movs r2, #0x58\n\t"
  105933. "ldrb r4, [%[table], r5]\n\t"
  105934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105935. "adds r2, r2, r4\n\t"
  105936. #else
  105937. "add r2, r2, r4\n\t"
  105938. #endif
  105939. "b L_sp_256_num_bits_8_9_%=\n\t"
  105940. "\n"
  105941. "L_sp_256_num_bits_8_43_%=:\n\t"
  105942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105943. "lsrs r5, r3, #16\n\t"
  105944. #else
  105945. "lsr r5, r3, #16\n\t"
  105946. #endif
  105947. #ifdef WOLFSSL_KEIL
  105948. "ands r5, r5, r6\n\t"
  105949. #elif defined(__clang__)
  105950. "ands r5, r6\n\t"
  105951. #else
  105952. "and r5, r6\n\t"
  105953. #endif
  105954. "cmp r5, #0\n\t"
  105955. "beq L_sp_256_num_bits_8_42_%=\n\t"
  105956. "movs r2, #0x50\n\t"
  105957. "ldrb r4, [%[table], r5]\n\t"
  105958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105959. "adds r2, r2, r4\n\t"
  105960. #else
  105961. "add r2, r2, r4\n\t"
  105962. #endif
  105963. "b L_sp_256_num_bits_8_9_%=\n\t"
  105964. "\n"
  105965. "L_sp_256_num_bits_8_42_%=:\n\t"
  105966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105967. "lsrs r5, r3, #8\n\t"
  105968. #else
  105969. "lsr r5, r3, #8\n\t"
  105970. #endif
  105971. #ifdef WOLFSSL_KEIL
  105972. "ands r5, r5, r6\n\t"
  105973. #elif defined(__clang__)
  105974. "ands r5, r6\n\t"
  105975. #else
  105976. "and r5, r6\n\t"
  105977. #endif
  105978. "cmp r5, #0\n\t"
  105979. "beq L_sp_256_num_bits_8_41_%=\n\t"
  105980. "movs r2, #0x48\n\t"
  105981. "ldrb r4, [%[table], r5]\n\t"
  105982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105983. "adds r2, r2, r4\n\t"
  105984. #else
  105985. "add r2, r2, r4\n\t"
  105986. #endif
  105987. "b L_sp_256_num_bits_8_9_%=\n\t"
  105988. "\n"
  105989. "L_sp_256_num_bits_8_41_%=:\n\t"
  105990. "movs r5, r3\n\t"
  105991. #ifdef WOLFSSL_KEIL
  105992. "ands r5, r5, r6\n\t"
  105993. #elif defined(__clang__)
  105994. "ands r5, r6\n\t"
  105995. #else
  105996. "and r5, r6\n\t"
  105997. #endif
  105998. "cmp r5, #0\n\t"
  105999. "beq L_sp_256_num_bits_8_40_%=\n\t"
  106000. "movs r2, #0x40\n\t"
  106001. "ldrb r4, [%[table], r5]\n\t"
  106002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106003. "adds r2, r2, r4\n\t"
  106004. #else
  106005. "add r2, r2, r4\n\t"
  106006. #endif
  106007. "b L_sp_256_num_bits_8_9_%=\n\t"
  106008. "\n"
  106009. "L_sp_256_num_bits_8_40_%=:\n\t"
  106010. "b L_sp_256_num_bits_8_9_%=\n\t"
  106011. "\n"
  106012. "L_sp_256_num_bits_8_2_%=:\n\t"
  106013. "ldr r3, [%[a], #4]\n\t"
  106014. "cmp r3, #0\n\t"
  106015. "beq L_sp_256_num_bits_8_1_%=\n\t"
  106016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106017. "lsrs r5, r3, #24\n\t"
  106018. #else
  106019. "lsr r5, r3, #24\n\t"
  106020. #endif
  106021. "cmp r5, #0\n\t"
  106022. "beq L_sp_256_num_bits_8_33_%=\n\t"
  106023. "movs r2, #56\n\t"
  106024. "ldrb r4, [%[table], r5]\n\t"
  106025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106026. "adds r2, r2, r4\n\t"
  106027. #else
  106028. "add r2, r2, r4\n\t"
  106029. #endif
  106030. "b L_sp_256_num_bits_8_9_%=\n\t"
  106031. "\n"
  106032. "L_sp_256_num_bits_8_33_%=:\n\t"
  106033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106034. "lsrs r5, r3, #16\n\t"
  106035. #else
  106036. "lsr r5, r3, #16\n\t"
  106037. #endif
  106038. #ifdef WOLFSSL_KEIL
  106039. "ands r5, r5, r6\n\t"
  106040. #elif defined(__clang__)
  106041. "ands r5, r6\n\t"
  106042. #else
  106043. "and r5, r6\n\t"
  106044. #endif
  106045. "cmp r5, #0\n\t"
  106046. "beq L_sp_256_num_bits_8_32_%=\n\t"
  106047. "movs r2, #48\n\t"
  106048. "ldrb r4, [%[table], r5]\n\t"
  106049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106050. "adds r2, r2, r4\n\t"
  106051. #else
  106052. "add r2, r2, r4\n\t"
  106053. #endif
  106054. "b L_sp_256_num_bits_8_9_%=\n\t"
  106055. "\n"
  106056. "L_sp_256_num_bits_8_32_%=:\n\t"
  106057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106058. "lsrs r5, r3, #8\n\t"
  106059. #else
  106060. "lsr r5, r3, #8\n\t"
  106061. #endif
  106062. #ifdef WOLFSSL_KEIL
  106063. "ands r5, r5, r6\n\t"
  106064. #elif defined(__clang__)
  106065. "ands r5, r6\n\t"
  106066. #else
  106067. "and r5, r6\n\t"
  106068. #endif
  106069. "cmp r5, #0\n\t"
  106070. "beq L_sp_256_num_bits_8_31_%=\n\t"
  106071. "movs r2, #40\n\t"
  106072. "ldrb r4, [%[table], r5]\n\t"
  106073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106074. "adds r2, r2, r4\n\t"
  106075. #else
  106076. "add r2, r2, r4\n\t"
  106077. #endif
  106078. "b L_sp_256_num_bits_8_9_%=\n\t"
  106079. "\n"
  106080. "L_sp_256_num_bits_8_31_%=:\n\t"
  106081. "movs r5, r3\n\t"
  106082. #ifdef WOLFSSL_KEIL
  106083. "ands r5, r5, r6\n\t"
  106084. #elif defined(__clang__)
  106085. "ands r5, r6\n\t"
  106086. #else
  106087. "and r5, r6\n\t"
  106088. #endif
  106089. "cmp r5, #0\n\t"
  106090. "beq L_sp_256_num_bits_8_30_%=\n\t"
  106091. "movs r2, #32\n\t"
  106092. "ldrb r4, [%[table], r5]\n\t"
  106093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106094. "adds r2, r2, r4\n\t"
  106095. #else
  106096. "add r2, r2, r4\n\t"
  106097. #endif
  106098. "b L_sp_256_num_bits_8_9_%=\n\t"
  106099. "\n"
  106100. "L_sp_256_num_bits_8_30_%=:\n\t"
  106101. "b L_sp_256_num_bits_8_9_%=\n\t"
  106102. "\n"
  106103. "L_sp_256_num_bits_8_1_%=:\n\t"
  106104. "ldr r3, [%[a]]\n\t"
  106105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106106. "lsrs r5, r3, #24\n\t"
  106107. #else
  106108. "lsr r5, r3, #24\n\t"
  106109. #endif
  106110. "cmp r5, #0\n\t"
  106111. "beq L_sp_256_num_bits_8_23_%=\n\t"
  106112. "movs r2, #24\n\t"
  106113. "ldrb r4, [%[table], r5]\n\t"
  106114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106115. "adds r2, r2, r4\n\t"
  106116. #else
  106117. "add r2, r2, r4\n\t"
  106118. #endif
  106119. "b L_sp_256_num_bits_8_9_%=\n\t"
  106120. "\n"
  106121. "L_sp_256_num_bits_8_23_%=:\n\t"
  106122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106123. "lsrs r5, r3, #16\n\t"
  106124. #else
  106125. "lsr r5, r3, #16\n\t"
  106126. #endif
  106127. #ifdef WOLFSSL_KEIL
  106128. "ands r5, r5, r6\n\t"
  106129. #elif defined(__clang__)
  106130. "ands r5, r6\n\t"
  106131. #else
  106132. "and r5, r6\n\t"
  106133. #endif
  106134. "cmp r5, #0\n\t"
  106135. "beq L_sp_256_num_bits_8_22_%=\n\t"
  106136. "movs r2, #16\n\t"
  106137. "ldrb r4, [%[table], r5]\n\t"
  106138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106139. "adds r2, r2, r4\n\t"
  106140. #else
  106141. "add r2, r2, r4\n\t"
  106142. #endif
  106143. "b L_sp_256_num_bits_8_9_%=\n\t"
  106144. "\n"
  106145. "L_sp_256_num_bits_8_22_%=:\n\t"
  106146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106147. "lsrs r5, r3, #8\n\t"
  106148. #else
  106149. "lsr r5, r3, #8\n\t"
  106150. #endif
  106151. #ifdef WOLFSSL_KEIL
  106152. "ands r5, r5, r6\n\t"
  106153. #elif defined(__clang__)
  106154. "ands r5, r6\n\t"
  106155. #else
  106156. "and r5, r6\n\t"
  106157. #endif
  106158. "cmp r5, #0\n\t"
  106159. "beq L_sp_256_num_bits_8_21_%=\n\t"
  106160. "movs r2, #8\n\t"
  106161. "ldrb r4, [%[table], r5]\n\t"
  106162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106163. "adds r2, r2, r4\n\t"
  106164. #else
  106165. "add r2, r2, r4\n\t"
  106166. #endif
  106167. "b L_sp_256_num_bits_8_9_%=\n\t"
  106168. "\n"
  106169. "L_sp_256_num_bits_8_21_%=:\n\t"
  106170. "movs r5, r3\n\t"
  106171. #ifdef WOLFSSL_KEIL
  106172. "ands r5, r5, r6\n\t"
  106173. #elif defined(__clang__)
  106174. "ands r5, r6\n\t"
  106175. #else
  106176. "and r5, r6\n\t"
  106177. #endif
  106178. "cmp r5, #0\n\t"
  106179. "beq L_sp_256_num_bits_8_20_%=\n\t"
  106180. "movs r2, #0\n\t"
  106181. "ldrb r4, [%[table], r5]\n\t"
  106182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  106183. "adds r2, r2, r4\n\t"
  106184. #else
  106185. "add r2, r2, r4\n\t"
  106186. #endif
  106187. "b L_sp_256_num_bits_8_9_%=\n\t"
  106188. "\n"
  106189. "L_sp_256_num_bits_8_20_%=:\n\t"
  106190. "\n"
  106191. "L_sp_256_num_bits_8_9_%=:\n\t"
  106192. "movs %[a], r2\n\t"
  106193. : [a] "+l" (a), [table] "+l" (table)
  106194. :
  106195. : "memory", "r2", "r3", "r4", "r5", "r6"
  106196. );
  106197. return (uint32_t)(size_t)a;
  106198. }
  106199. /* Non-constant time modular inversion.
  106200. *
  106201. * @param [out] r Resulting number.
  106202. * @param [in] a Number to invert.
  106203. * @param [in] m Modulus.
  106204. * @return MP_OKAY on success.
  106205. */
  106206. static int sp_256_mod_inv_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  106207. {
  106208. sp_digit u[8];
  106209. sp_digit v[8];
  106210. sp_digit b[8];
  106211. sp_digit d[8];
  106212. int ut, vt;
  106213. sp_digit o;
  106214. XMEMCPY(u, m, sizeof(u));
  106215. XMEMCPY(v, a, sizeof(v));
  106216. ut = sp_256_num_bits_8(u);
  106217. vt = sp_256_num_bits_8(v);
  106218. XMEMSET(b, 0, sizeof(b));
  106219. if ((v[0] & 1) == 0) {
  106220. sp_256_rshift1_8(v, v);
  106221. XMEMCPY(d, m, sizeof(u));
  106222. d[0] += 1;
  106223. sp_256_rshift1_8(d, d);
  106224. vt--;
  106225. while ((v[0] & 1) == 0) {
  106226. sp_256_rshift1_8(v, v);
  106227. sp_256_div2_mod_8(d, d, m);
  106228. vt--;
  106229. }
  106230. }
  106231. else {
  106232. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  106233. d[0] = 1;
  106234. }
  106235. while (ut > 1 && vt > 1) {
  106236. if ((ut > vt) || ((ut == vt) && (sp_256_cmp_8(u, v) >= 0))) {
  106237. sp_256_sub_8(u, u, v);
  106238. o = sp_256_sub_8(b, b, d);
  106239. if (o != 0)
  106240. sp_256_add_8(b, b, m);
  106241. ut = sp_256_num_bits_8(u);
  106242. do {
  106243. sp_256_rshift1_8(u, u);
  106244. sp_256_div2_mod_8(b, b, m);
  106245. ut--;
  106246. }
  106247. while (ut > 0 && (u[0] & 1) == 0);
  106248. }
  106249. else {
  106250. sp_256_sub_8(v, v, u);
  106251. o = sp_256_sub_8(d, d, b);
  106252. if (o != 0)
  106253. sp_256_add_8(d, d, m);
  106254. vt = sp_256_num_bits_8(v);
  106255. do {
  106256. sp_256_rshift1_8(v, v);
  106257. sp_256_div2_mod_8(d, d, m);
  106258. vt--;
  106259. }
  106260. while (vt > 0 && (v[0] & 1) == 0);
  106261. }
  106262. }
  106263. if (ut == 1)
  106264. XMEMCPY(r, b, sizeof(b));
  106265. else
  106266. XMEMCPY(r, d, sizeof(d));
  106267. return MP_OKAY;
  106268. }
  106269. #endif /* WOLFSSL_SP_SMALL */
  106270. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  106271. *
  106272. * p1 First point to add and holds result.
  106273. * p2 Second point to add.
  106274. * tmp Temporary storage for intermediate numbers.
  106275. */
  106276. static void sp_256_add_points_8(sp_point_256* p1, const sp_point_256* p2,
  106277. sp_digit* tmp)
  106278. {
  106279. sp_256_proj_point_add_8(p1, p1, p2, tmp);
  106280. if (sp_256_iszero_8(p1->z)) {
  106281. if (sp_256_iszero_8(p1->x) && sp_256_iszero_8(p1->y)) {
  106282. sp_256_proj_point_dbl_8(p1, p2, tmp);
  106283. }
  106284. else {
  106285. /* Y ordinate is not used from here - don't set. */
  106286. p1->x[0] = 0;
  106287. p1->x[1] = 0;
  106288. p1->x[2] = 0;
  106289. p1->x[3] = 0;
  106290. p1->x[4] = 0;
  106291. p1->x[5] = 0;
  106292. p1->x[6] = 0;
  106293. p1->x[7] = 0;
  106294. XMEMCPY(p1->z, p256_norm_mod, sizeof(p256_norm_mod));
  106295. }
  106296. }
  106297. }
  106298. /* Calculate the verification point: [e/s]G + [r/s]Q
  106299. *
  106300. * p1 Calculated point.
  106301. * p2 Public point and temporary.
  106302. * s Second part of signature as a number.
  106303. * u1 Temporary number.
  106304. * u2 Temporary number.
  106305. * heap Heap to use for allocation.
  106306. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  106307. */
  106308. static int sp_256_calc_vfy_point_8(sp_point_256* p1, sp_point_256* p2,
  106309. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  106310. {
  106311. int err;
  106312. #ifndef WOLFSSL_SP_SMALL
  106313. err = sp_256_mod_inv_8(s, s, p256_order);
  106314. if (err == MP_OKAY)
  106315. #endif /* !WOLFSSL_SP_SMALL */
  106316. {
  106317. sp_256_mul_8(s, s, p256_norm_order);
  106318. err = sp_256_mod_8(s, s, p256_order);
  106319. }
  106320. if (err == MP_OKAY) {
  106321. sp_256_norm_8(s);
  106322. #ifdef WOLFSSL_SP_SMALL
  106323. {
  106324. sp_256_mont_inv_order_8(s, s, tmp);
  106325. sp_256_mont_mul_order_8(u1, u1, s);
  106326. sp_256_mont_mul_order_8(u2, u2, s);
  106327. }
  106328. #else
  106329. {
  106330. sp_256_mont_mul_order_8(u1, u1, s);
  106331. sp_256_mont_mul_order_8(u2, u2, s);
  106332. }
  106333. #endif /* WOLFSSL_SP_SMALL */
  106334. {
  106335. err = sp_256_ecc_mulmod_base_8(p1, u1, 0, 0, heap);
  106336. }
  106337. }
  106338. if ((err == MP_OKAY) && sp_256_iszero_8(p1->z)) {
  106339. p1->infinity = 1;
  106340. }
  106341. if (err == MP_OKAY) {
  106342. err = sp_256_ecc_mulmod_8(p2, p2, u2, 0, 0, heap);
  106343. }
  106344. if ((err == MP_OKAY) && sp_256_iszero_8(p2->z)) {
  106345. p2->infinity = 1;
  106346. }
  106347. if (err == MP_OKAY) {
  106348. sp_256_add_points_8(p1, p2, tmp);
  106349. }
  106350. return err;
  106351. }
  106352. #ifdef HAVE_ECC_VERIFY
  106353. /* Verify the signature values with the hash and public key.
  106354. * e = Truncate(hash, 256)
  106355. * u1 = e/s mod order
  106356. * u2 = r/s mod order
  106357. * r == (u1.G + u2.Q)->x mod order
  106358. * Optimization: Leave point in projective form.
  106359. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  106360. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  106361. * The hash is truncated to the first 256 bits.
  106362. *
  106363. * hash Hash to sign.
  106364. * hashLen Length of the hash data.
  106365. * rng Random number generator.
  106366. * priv Private part of key - scalar.
  106367. * rm First part of result as an mp_int.
  106368. * sm Sirst part of result as an mp_int.
  106369. * heap Heap to use for allocation.
  106370. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  106371. */
  106372. int sp_ecc_verify_256(const byte* hash, word32 hashLen, const mp_int* pX,
  106373. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  106374. int* res, void* heap)
  106375. {
  106376. #ifdef WOLFSSL_SP_SMALL_STACK
  106377. sp_digit* u1 = NULL;
  106378. sp_point_256* p1 = NULL;
  106379. #else
  106380. sp_digit u1[18 * 8];
  106381. sp_point_256 p1[2];
  106382. #endif
  106383. sp_digit* u2 = NULL;
  106384. sp_digit* s = NULL;
  106385. sp_digit* tmp = NULL;
  106386. sp_point_256* p2 = NULL;
  106387. sp_digit carry;
  106388. sp_int32 c = 0;
  106389. int err = MP_OKAY;
  106390. #ifdef WOLFSSL_SP_SMALL_STACK
  106391. if (err == MP_OKAY) {
  106392. p1 = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  106393. DYNAMIC_TYPE_ECC);
  106394. if (p1 == NULL)
  106395. err = MEMORY_E;
  106396. }
  106397. if (err == MP_OKAY) {
  106398. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 8, heap,
  106399. DYNAMIC_TYPE_ECC);
  106400. if (u1 == NULL)
  106401. err = MEMORY_E;
  106402. }
  106403. #endif
  106404. if (err == MP_OKAY) {
  106405. u2 = u1 + 2 * 8;
  106406. s = u1 + 4 * 8;
  106407. tmp = u1 + 6 * 8;
  106408. p2 = p1 + 1;
  106409. if (hashLen > 32U) {
  106410. hashLen = 32U;
  106411. }
  106412. sp_256_from_bin(u1, 8, hash, (int)hashLen);
  106413. sp_256_from_mp(u2, 8, rm);
  106414. sp_256_from_mp(s, 8, sm);
  106415. sp_256_from_mp(p2->x, 8, pX);
  106416. sp_256_from_mp(p2->y, 8, pY);
  106417. sp_256_from_mp(p2->z, 8, pZ);
  106418. err = sp_256_calc_vfy_point_8(p1, p2, s, u1, u2, tmp, heap);
  106419. }
  106420. if (err == MP_OKAY) {
  106421. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  106422. /* Reload r and convert to Montgomery form. */
  106423. sp_256_from_mp(u2, 8, rm);
  106424. err = sp_256_mod_mul_norm_8(u2, u2, p256_mod);
  106425. }
  106426. if (err == MP_OKAY) {
  106427. /* u1 = r.z'.z' mod prime */
  106428. sp_256_mont_sqr_8(p1->z, p1->z, p256_mod, p256_mp_mod);
  106429. sp_256_mont_mul_8(u1, u2, p1->z, p256_mod, p256_mp_mod);
  106430. *res = (int)(sp_256_cmp_8(p1->x, u1) == 0);
  106431. if (*res == 0) {
  106432. /* Reload r and add order. */
  106433. sp_256_from_mp(u2, 8, rm);
  106434. carry = sp_256_add_8(u2, u2, p256_order);
  106435. /* Carry means result is greater than mod and is not valid. */
  106436. if (carry == 0) {
  106437. sp_256_norm_8(u2);
  106438. /* Compare with mod and if greater or equal then not valid. */
  106439. c = sp_256_cmp_8(u2, p256_mod);
  106440. }
  106441. }
  106442. if ((*res == 0) && (c < 0)) {
  106443. /* Convert to Montogomery form */
  106444. err = sp_256_mod_mul_norm_8(u2, u2, p256_mod);
  106445. if (err == MP_OKAY) {
  106446. /* u1 = (r + 1*order).z'.z' mod prime */
  106447. {
  106448. sp_256_mont_mul_8(u1, u2, p1->z, p256_mod, p256_mp_mod);
  106449. }
  106450. *res = (sp_256_cmp_8(p1->x, u1) == 0);
  106451. }
  106452. }
  106453. }
  106454. #ifdef WOLFSSL_SP_SMALL_STACK
  106455. if (u1 != NULL)
  106456. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  106457. if (p1 != NULL)
  106458. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  106459. #endif
  106460. return err;
  106461. }
  106462. #ifdef WOLFSSL_SP_NONBLOCK
  106463. typedef struct sp_ecc_verify_256_ctx {
  106464. int state;
  106465. union {
  106466. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  106467. sp_256_mont_inv_order_8_ctx mont_inv_order_ctx;
  106468. sp_256_proj_point_dbl_8_ctx dbl_ctx;
  106469. sp_256_proj_point_add_8_ctx add_ctx;
  106470. };
  106471. sp_digit u1[2*8];
  106472. sp_digit u2[2*8];
  106473. sp_digit s[2*8];
  106474. sp_digit tmp[2*8 * 6];
  106475. sp_point_256 p1;
  106476. sp_point_256 p2;
  106477. } sp_ecc_verify_256_ctx;
  106478. int sp_ecc_verify_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  106479. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  106480. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  106481. {
  106482. int err = FP_WOULDBLOCK;
  106483. sp_ecc_verify_256_ctx* ctx = (sp_ecc_verify_256_ctx*)sp_ctx->data;
  106484. typedef char ctx_size_test[sizeof(sp_ecc_verify_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  106485. (void)sizeof(ctx_size_test);
  106486. switch (ctx->state) {
  106487. case 0: /* INIT */
  106488. if (hashLen > 32U) {
  106489. hashLen = 32U;
  106490. }
  106491. sp_256_from_bin(ctx->u1, 8, hash, (int)hashLen);
  106492. sp_256_from_mp(ctx->u2, 8, rm);
  106493. sp_256_from_mp(ctx->s, 8, sm);
  106494. sp_256_from_mp(ctx->p2.x, 8, pX);
  106495. sp_256_from_mp(ctx->p2.y, 8, pY);
  106496. sp_256_from_mp(ctx->p2.z, 8, pZ);
  106497. ctx->state = 1;
  106498. break;
  106499. case 1: /* NORMS0 */
  106500. sp_256_mul_8(ctx->s, ctx->s, p256_norm_order);
  106501. err = sp_256_mod_8(ctx->s, ctx->s, p256_order);
  106502. if (err == MP_OKAY)
  106503. ctx->state = 2;
  106504. break;
  106505. case 2: /* NORMS1 */
  106506. sp_256_norm_8(ctx->s);
  106507. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  106508. ctx->state = 3;
  106509. break;
  106510. case 3: /* NORMS2 */
  106511. err = sp_256_mont_inv_order_8_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  106512. if (err == MP_OKAY) {
  106513. ctx->state = 4;
  106514. }
  106515. break;
  106516. case 4: /* NORMS3 */
  106517. sp_256_mont_mul_order_8(ctx->u1, ctx->u1, ctx->s);
  106518. ctx->state = 5;
  106519. break;
  106520. case 5: /* NORMS4 */
  106521. sp_256_mont_mul_order_8(ctx->u2, ctx->u2, ctx->s);
  106522. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  106523. ctx->state = 6;
  106524. break;
  106525. case 6: /* MULBASE */
  106526. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p256_base, ctx->u1, 0, 0, heap);
  106527. if (err == MP_OKAY) {
  106528. if (sp_256_iszero_8(ctx->p1.z)) {
  106529. ctx->p1.infinity = 1;
  106530. }
  106531. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  106532. ctx->state = 7;
  106533. }
  106534. break;
  106535. case 7: /* MULMOD */
  106536. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  106537. if (err == MP_OKAY) {
  106538. if (sp_256_iszero_8(ctx->p2.z)) {
  106539. ctx->p2.infinity = 1;
  106540. }
  106541. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  106542. ctx->state = 8;
  106543. }
  106544. break;
  106545. case 8: /* ADD */
  106546. err = sp_256_proj_point_add_8_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  106547. if (err == MP_OKAY)
  106548. ctx->state = 9;
  106549. break;
  106550. case 9: /* MONT */
  106551. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  106552. /* Reload r and convert to Montgomery form. */
  106553. sp_256_from_mp(ctx->u2, 8, rm);
  106554. err = sp_256_mod_mul_norm_8(ctx->u2, ctx->u2, p256_mod);
  106555. if (err == MP_OKAY)
  106556. ctx->state = 10;
  106557. break;
  106558. case 10: /* SQR */
  106559. /* u1 = r.z'.z' mod prime */
  106560. sp_256_mont_sqr_8(ctx->p1.z, ctx->p1.z, p256_mod, p256_mp_mod);
  106561. ctx->state = 11;
  106562. break;
  106563. case 11: /* MUL */
  106564. sp_256_mont_mul_8(ctx->u1, ctx->u2, ctx->p1.z, p256_mod, p256_mp_mod);
  106565. ctx->state = 12;
  106566. break;
  106567. case 12: /* RES */
  106568. {
  106569. sp_int32 c = 0;
  106570. err = MP_OKAY; /* math okay, now check result */
  106571. *res = (int)(sp_256_cmp_8(ctx->p1.x, ctx->u1) == 0);
  106572. if (*res == 0) {
  106573. sp_digit carry;
  106574. /* Reload r and add order. */
  106575. sp_256_from_mp(ctx->u2, 8, rm);
  106576. carry = sp_256_add_8(ctx->u2, ctx->u2, p256_order);
  106577. /* Carry means result is greater than mod and is not valid. */
  106578. if (carry == 0) {
  106579. sp_256_norm_8(ctx->u2);
  106580. /* Compare with mod and if greater or equal then not valid. */
  106581. c = sp_256_cmp_8(ctx->u2, p256_mod);
  106582. }
  106583. }
  106584. if ((*res == 0) && (c < 0)) {
  106585. /* Convert to Montogomery form */
  106586. err = sp_256_mod_mul_norm_8(ctx->u2, ctx->u2, p256_mod);
  106587. if (err == MP_OKAY) {
  106588. /* u1 = (r + 1*order).z'.z' mod prime */
  106589. sp_256_mont_mul_8(ctx->u1, ctx->u2, ctx->p1.z, p256_mod,
  106590. p256_mp_mod);
  106591. *res = (int)(sp_256_cmp_8(ctx->p1.x, ctx->u1) == 0);
  106592. }
  106593. }
  106594. break;
  106595. }
  106596. } /* switch */
  106597. if (err == MP_OKAY && ctx->state != 12) {
  106598. err = FP_WOULDBLOCK;
  106599. }
  106600. return err;
  106601. }
  106602. #endif /* WOLFSSL_SP_NONBLOCK */
  106603. #endif /* HAVE_ECC_VERIFY */
  106604. #ifdef HAVE_ECC_CHECK_KEY
  106605. /* Check that the x and y ordinates are a valid point on the curve.
  106606. *
  106607. * point EC point.
  106608. * heap Heap to use if dynamically allocating.
  106609. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  106610. * not on the curve and MP_OKAY otherwise.
  106611. */
  106612. static int sp_256_ecc_is_point_8(const sp_point_256* point,
  106613. void* heap)
  106614. {
  106615. #ifdef WOLFSSL_SP_SMALL_STACK
  106616. sp_digit* t1 = NULL;
  106617. #else
  106618. sp_digit t1[8 * 4];
  106619. #endif
  106620. sp_digit* t2 = NULL;
  106621. int err = MP_OKAY;
  106622. #ifdef WOLFSSL_SP_SMALL_STACK
  106623. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8 * 4, heap, DYNAMIC_TYPE_ECC);
  106624. if (t1 == NULL)
  106625. err = MEMORY_E;
  106626. #endif
  106627. (void)heap;
  106628. if (err == MP_OKAY) {
  106629. t2 = t1 + 2 * 8;
  106630. /* y^2 - x^3 - a.x = b */
  106631. sp_256_sqr_8(t1, point->y);
  106632. (void)sp_256_mod_8(t1, t1, p256_mod);
  106633. sp_256_sqr_8(t2, point->x);
  106634. (void)sp_256_mod_8(t2, t2, p256_mod);
  106635. sp_256_mul_8(t2, t2, point->x);
  106636. (void)sp_256_mod_8(t2, t2, p256_mod);
  106637. sp_256_mont_sub_8(t1, t1, t2, p256_mod);
  106638. /* y^2 - x^3 + 3.x = b, when a = -3 */
  106639. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  106640. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  106641. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  106642. if (sp_256_cmp_8(t1, p256_b) != 0) {
  106643. err = MP_VAL;
  106644. }
  106645. }
  106646. #ifdef WOLFSSL_SP_SMALL_STACK
  106647. if (t1 != NULL)
  106648. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  106649. #endif
  106650. return err;
  106651. }
  106652. /* Check that the x and y ordinates are a valid point on the curve.
  106653. *
  106654. * pX X ordinate of EC point.
  106655. * pY Y ordinate of EC point.
  106656. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  106657. * not on the curve and MP_OKAY otherwise.
  106658. */
  106659. int sp_ecc_is_point_256(const mp_int* pX, const mp_int* pY)
  106660. {
  106661. #ifdef WOLFSSL_SP_SMALL_STACK
  106662. sp_point_256* pub = NULL;
  106663. #else
  106664. sp_point_256 pub[1];
  106665. #endif
  106666. const byte one[1] = { 1 };
  106667. int err = MP_OKAY;
  106668. #ifdef WOLFSSL_SP_SMALL_STACK
  106669. pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  106670. DYNAMIC_TYPE_ECC);
  106671. if (pub == NULL)
  106672. err = MEMORY_E;
  106673. #endif
  106674. if (err == MP_OKAY) {
  106675. sp_256_from_mp(pub->x, 8, pX);
  106676. sp_256_from_mp(pub->y, 8, pY);
  106677. sp_256_from_bin(pub->z, 8, one, (int)sizeof(one));
  106678. err = sp_256_ecc_is_point_8(pub, NULL);
  106679. }
  106680. #ifdef WOLFSSL_SP_SMALL_STACK
  106681. if (pub != NULL)
  106682. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  106683. #endif
  106684. return err;
  106685. }
  106686. /* Check that the private scalar generates the EC point (px, py), the point is
  106687. * on the curve and the point has the correct order.
  106688. *
  106689. * pX X ordinate of EC point.
  106690. * pY Y ordinate of EC point.
  106691. * privm Private scalar that generates EC point.
  106692. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  106693. * not on the curve, ECC_INF_E if the point does not have the correct order,
  106694. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  106695. * MP_OKAY otherwise.
  106696. */
  106697. int sp_ecc_check_key_256(const mp_int* pX, const mp_int* pY,
  106698. const mp_int* privm, void* heap)
  106699. {
  106700. #ifdef WOLFSSL_SP_SMALL_STACK
  106701. sp_digit* priv = NULL;
  106702. sp_point_256* pub = NULL;
  106703. #else
  106704. sp_digit priv[8];
  106705. sp_point_256 pub[2];
  106706. #endif
  106707. sp_point_256* p = NULL;
  106708. const byte one[1] = { 1 };
  106709. int err = MP_OKAY;
  106710. /* Quick check the lengs of public key ordinates and private key are in
  106711. * range. Proper check later.
  106712. */
  106713. if (((mp_count_bits(pX) > 256) ||
  106714. (mp_count_bits(pY) > 256) ||
  106715. ((privm != NULL) && (mp_count_bits(privm) > 256)))) {
  106716. err = ECC_OUT_OF_RANGE_E;
  106717. }
  106718. #ifdef WOLFSSL_SP_SMALL_STACK
  106719. if (err == MP_OKAY) {
  106720. pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  106721. DYNAMIC_TYPE_ECC);
  106722. if (pub == NULL)
  106723. err = MEMORY_E;
  106724. }
  106725. if (err == MP_OKAY && privm) {
  106726. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  106727. DYNAMIC_TYPE_ECC);
  106728. if (priv == NULL)
  106729. err = MEMORY_E;
  106730. }
  106731. #endif
  106732. if (err == MP_OKAY) {
  106733. p = pub + 1;
  106734. sp_256_from_mp(pub->x, 8, pX);
  106735. sp_256_from_mp(pub->y, 8, pY);
  106736. sp_256_from_bin(pub->z, 8, one, (int)sizeof(one));
  106737. if (privm)
  106738. sp_256_from_mp(priv, 8, privm);
  106739. /* Check point at infinitiy. */
  106740. if ((sp_256_iszero_8(pub->x) != 0) &&
  106741. (sp_256_iszero_8(pub->y) != 0)) {
  106742. err = ECC_INF_E;
  106743. }
  106744. }
  106745. /* Check range of X and Y */
  106746. if ((err == MP_OKAY) &&
  106747. ((sp_256_cmp_8(pub->x, p256_mod) >= 0) ||
  106748. (sp_256_cmp_8(pub->y, p256_mod) >= 0))) {
  106749. err = ECC_OUT_OF_RANGE_E;
  106750. }
  106751. if (err == MP_OKAY) {
  106752. /* Check point is on curve */
  106753. err = sp_256_ecc_is_point_8(pub, heap);
  106754. }
  106755. if (err == MP_OKAY) {
  106756. /* Point * order = infinity */
  106757. err = sp_256_ecc_mulmod_8(p, pub, p256_order, 1, 1, heap);
  106758. }
  106759. /* Check result is infinity */
  106760. if ((err == MP_OKAY) && ((sp_256_iszero_8(p->x) == 0) ||
  106761. (sp_256_iszero_8(p->y) == 0))) {
  106762. err = ECC_INF_E;
  106763. }
  106764. if (privm) {
  106765. if (err == MP_OKAY) {
  106766. /* Base * private = point */
  106767. err = sp_256_ecc_mulmod_base_8(p, priv, 1, 1, heap);
  106768. }
  106769. /* Check result is public key */
  106770. if ((err == MP_OKAY) &&
  106771. ((sp_256_cmp_8(p->x, pub->x) != 0) ||
  106772. (sp_256_cmp_8(p->y, pub->y) != 0))) {
  106773. err = ECC_PRIV_KEY_E;
  106774. }
  106775. }
  106776. #ifdef WOLFSSL_SP_SMALL_STACK
  106777. if (pub != NULL)
  106778. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  106779. if (priv != NULL)
  106780. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  106781. #endif
  106782. return err;
  106783. }
  106784. #endif
  106785. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  106786. /* Add two projective EC points together.
  106787. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  106788. *
  106789. * pX First EC point's X ordinate.
  106790. * pY First EC point's Y ordinate.
  106791. * pZ First EC point's Z ordinate.
  106792. * qX Second EC point's X ordinate.
  106793. * qY Second EC point's Y ordinate.
  106794. * qZ Second EC point's Z ordinate.
  106795. * rX Resultant EC point's X ordinate.
  106796. * rY Resultant EC point's Y ordinate.
  106797. * rZ Resultant EC point's Z ordinate.
  106798. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  106799. */
  106800. int sp_ecc_proj_add_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
  106801. mp_int* qX, mp_int* qY, mp_int* qZ,
  106802. mp_int* rX, mp_int* rY, mp_int* rZ)
  106803. {
  106804. #ifdef WOLFSSL_SP_SMALL_STACK
  106805. sp_digit* tmp = NULL;
  106806. sp_point_256* p = NULL;
  106807. #else
  106808. sp_digit tmp[2 * 8 * 6];
  106809. sp_point_256 p[2];
  106810. #endif
  106811. sp_point_256* q = NULL;
  106812. int err = MP_OKAY;
  106813. #ifdef WOLFSSL_SP_SMALL_STACK
  106814. if (err == MP_OKAY) {
  106815. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, NULL,
  106816. DYNAMIC_TYPE_ECC);
  106817. if (p == NULL)
  106818. err = MEMORY_E;
  106819. }
  106820. if (err == MP_OKAY) {
  106821. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, NULL,
  106822. DYNAMIC_TYPE_ECC);
  106823. if (tmp == NULL) {
  106824. err = MEMORY_E;
  106825. }
  106826. }
  106827. #endif
  106828. if (err == MP_OKAY) {
  106829. q = p + 1;
  106830. sp_256_from_mp(p->x, 8, pX);
  106831. sp_256_from_mp(p->y, 8, pY);
  106832. sp_256_from_mp(p->z, 8, pZ);
  106833. sp_256_from_mp(q->x, 8, qX);
  106834. sp_256_from_mp(q->y, 8, qY);
  106835. sp_256_from_mp(q->z, 8, qZ);
  106836. p->infinity = sp_256_iszero_8(p->x) &
  106837. sp_256_iszero_8(p->y);
  106838. q->infinity = sp_256_iszero_8(q->x) &
  106839. sp_256_iszero_8(q->y);
  106840. sp_256_proj_point_add_8(p, p, q, tmp);
  106841. }
  106842. if (err == MP_OKAY) {
  106843. err = sp_256_to_mp(p->x, rX);
  106844. }
  106845. if (err == MP_OKAY) {
  106846. err = sp_256_to_mp(p->y, rY);
  106847. }
  106848. if (err == MP_OKAY) {
  106849. err = sp_256_to_mp(p->z, rZ);
  106850. }
  106851. #ifdef WOLFSSL_SP_SMALL_STACK
  106852. if (tmp != NULL)
  106853. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  106854. if (p != NULL)
  106855. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  106856. #endif
  106857. return err;
  106858. }
  106859. /* Double a projective EC point.
  106860. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  106861. *
  106862. * pX EC point's X ordinate.
  106863. * pY EC point's Y ordinate.
  106864. * pZ EC point's Z ordinate.
  106865. * rX Resultant EC point's X ordinate.
  106866. * rY Resultant EC point's Y ordinate.
  106867. * rZ Resultant EC point's Z ordinate.
  106868. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  106869. */
  106870. int sp_ecc_proj_dbl_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
  106871. mp_int* rX, mp_int* rY, mp_int* rZ)
  106872. {
  106873. #ifdef WOLFSSL_SP_SMALL_STACK
  106874. sp_digit* tmp = NULL;
  106875. sp_point_256* p = NULL;
  106876. #else
  106877. sp_digit tmp[2 * 8 * 2];
  106878. sp_point_256 p[1];
  106879. #endif
  106880. int err = MP_OKAY;
  106881. #ifdef WOLFSSL_SP_SMALL_STACK
  106882. if (err == MP_OKAY) {
  106883. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  106884. DYNAMIC_TYPE_ECC);
  106885. if (p == NULL)
  106886. err = MEMORY_E;
  106887. }
  106888. if (err == MP_OKAY) {
  106889. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 2, NULL,
  106890. DYNAMIC_TYPE_ECC);
  106891. if (tmp == NULL)
  106892. err = MEMORY_E;
  106893. }
  106894. #endif
  106895. if (err == MP_OKAY) {
  106896. sp_256_from_mp(p->x, 8, pX);
  106897. sp_256_from_mp(p->y, 8, pY);
  106898. sp_256_from_mp(p->z, 8, pZ);
  106899. p->infinity = sp_256_iszero_8(p->x) &
  106900. sp_256_iszero_8(p->y);
  106901. sp_256_proj_point_dbl_8(p, p, tmp);
  106902. }
  106903. if (err == MP_OKAY) {
  106904. err = sp_256_to_mp(p->x, rX);
  106905. }
  106906. if (err == MP_OKAY) {
  106907. err = sp_256_to_mp(p->y, rY);
  106908. }
  106909. if (err == MP_OKAY) {
  106910. err = sp_256_to_mp(p->z, rZ);
  106911. }
  106912. #ifdef WOLFSSL_SP_SMALL_STACK
  106913. if (tmp != NULL)
  106914. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  106915. if (p != NULL)
  106916. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  106917. #endif
  106918. return err;
  106919. }
  106920. /* Map a projective EC point to affine in place.
  106921. * pZ will be one.
  106922. *
  106923. * pX EC point's X ordinate.
  106924. * pY EC point's Y ordinate.
  106925. * pZ EC point's Z ordinate.
  106926. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  106927. */
  106928. int sp_ecc_map_256(mp_int* pX, mp_int* pY, mp_int* pZ)
  106929. {
  106930. #ifdef WOLFSSL_SP_SMALL_STACK
  106931. sp_digit* tmp = NULL;
  106932. sp_point_256* p = NULL;
  106933. #else
  106934. sp_digit tmp[2 * 8 * 4];
  106935. sp_point_256 p[1];
  106936. #endif
  106937. int err = MP_OKAY;
  106938. #ifdef WOLFSSL_SP_SMALL_STACK
  106939. if (err == MP_OKAY) {
  106940. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  106941. DYNAMIC_TYPE_ECC);
  106942. if (p == NULL)
  106943. err = MEMORY_E;
  106944. }
  106945. if (err == MP_OKAY) {
  106946. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 4, NULL,
  106947. DYNAMIC_TYPE_ECC);
  106948. if (tmp == NULL)
  106949. err = MEMORY_E;
  106950. }
  106951. #endif
  106952. if (err == MP_OKAY) {
  106953. sp_256_from_mp(p->x, 8, pX);
  106954. sp_256_from_mp(p->y, 8, pY);
  106955. sp_256_from_mp(p->z, 8, pZ);
  106956. p->infinity = sp_256_iszero_8(p->x) &
  106957. sp_256_iszero_8(p->y);
  106958. sp_256_map_8(p, p, tmp);
  106959. }
  106960. if (err == MP_OKAY) {
  106961. err = sp_256_to_mp(p->x, pX);
  106962. }
  106963. if (err == MP_OKAY) {
  106964. err = sp_256_to_mp(p->y, pY);
  106965. }
  106966. if (err == MP_OKAY) {
  106967. err = sp_256_to_mp(p->z, pZ);
  106968. }
  106969. #ifdef WOLFSSL_SP_SMALL_STACK
  106970. if (tmp != NULL)
  106971. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  106972. if (p != NULL)
  106973. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  106974. #endif
  106975. return err;
  106976. }
  106977. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  106978. #ifdef HAVE_COMP_KEY
  106979. /* Find the square root of a number mod the prime of the curve.
  106980. *
  106981. * y The number to operate on and the result.
  106982. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  106983. */
  106984. static int sp_256_mont_sqrt_8(sp_digit* y)
  106985. {
  106986. #ifdef WOLFSSL_SP_SMALL_STACK
  106987. sp_digit* t1 = NULL;
  106988. #else
  106989. sp_digit t1[4 * 8];
  106990. #endif
  106991. sp_digit* t2 = NULL;
  106992. int err = MP_OKAY;
  106993. #ifdef WOLFSSL_SP_SMALL_STACK
  106994. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 8, NULL, DYNAMIC_TYPE_ECC);
  106995. if (t1 == NULL) {
  106996. err = MEMORY_E;
  106997. }
  106998. #endif
  106999. if (err == MP_OKAY) {
  107000. t2 = t1 + 2 * 8;
  107001. {
  107002. /* t2 = y ^ 0x2 */
  107003. sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod);
  107004. /* t1 = y ^ 0x3 */
  107005. sp_256_mont_mul_8(t1, t2, y, p256_mod, p256_mp_mod);
  107006. /* t2 = y ^ 0xc */
  107007. sp_256_mont_sqr_n_8(t2, t1, 2, p256_mod, p256_mp_mod);
  107008. /* t1 = y ^ 0xf */
  107009. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  107010. /* t2 = y ^ 0xf0 */
  107011. sp_256_mont_sqr_n_8(t2, t1, 4, p256_mod, p256_mp_mod);
  107012. /* t1 = y ^ 0xff */
  107013. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  107014. /* t2 = y ^ 0xff00 */
  107015. sp_256_mont_sqr_n_8(t2, t1, 8, p256_mod, p256_mp_mod);
  107016. /* t1 = y ^ 0xffff */
  107017. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  107018. /* t2 = y ^ 0xffff0000 */
  107019. sp_256_mont_sqr_n_8(t2, t1, 16, p256_mod, p256_mp_mod);
  107020. /* t1 = y ^ 0xffffffff */
  107021. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  107022. /* t1 = y ^ 0xffffffff00000000 */
  107023. sp_256_mont_sqr_n_8(t1, t1, 32, p256_mod, p256_mp_mod);
  107024. /* t1 = y ^ 0xffffffff00000001 */
  107025. sp_256_mont_mul_8(t1, t1, y, p256_mod, p256_mp_mod);
  107026. /* t1 = y ^ 0xffffffff00000001000000000000000000000000 */
  107027. sp_256_mont_sqr_n_8(t1, t1, 96, p256_mod, p256_mp_mod);
  107028. /* t1 = y ^ 0xffffffff00000001000000000000000000000001 */
  107029. sp_256_mont_mul_8(t1, t1, y, p256_mod, p256_mp_mod);
  107030. sp_256_mont_sqr_n_8(y, t1, 94, p256_mod, p256_mp_mod);
  107031. }
  107032. }
  107033. #ifdef WOLFSSL_SP_SMALL_STACK
  107034. if (t1 != NULL)
  107035. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  107036. #endif
  107037. return err;
  107038. }
  107039. /* Uncompress the point given the X ordinate.
  107040. *
  107041. * xm X ordinate.
  107042. * odd Whether the Y ordinate is odd.
  107043. * ym Calculated Y ordinate.
  107044. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  107045. */
  107046. int sp_ecc_uncompress_256(mp_int* xm, int odd, mp_int* ym)
  107047. {
  107048. #ifdef WOLFSSL_SP_SMALL_STACK
  107049. sp_digit* x = NULL;
  107050. #else
  107051. sp_digit x[4 * 8];
  107052. #endif
  107053. sp_digit* y = NULL;
  107054. int err = MP_OKAY;
  107055. #ifdef WOLFSSL_SP_SMALL_STACK
  107056. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 8, NULL, DYNAMIC_TYPE_ECC);
  107057. if (x == NULL)
  107058. err = MEMORY_E;
  107059. #endif
  107060. if (err == MP_OKAY) {
  107061. y = x + 2 * 8;
  107062. sp_256_from_mp(x, 8, xm);
  107063. err = sp_256_mod_mul_norm_8(x, x, p256_mod);
  107064. }
  107065. if (err == MP_OKAY) {
  107066. /* y = x^3 */
  107067. {
  107068. sp_256_mont_sqr_8(y, x, p256_mod, p256_mp_mod);
  107069. sp_256_mont_mul_8(y, y, x, p256_mod, p256_mp_mod);
  107070. }
  107071. /* y = x^3 - 3x */
  107072. sp_256_mont_sub_8(y, y, x, p256_mod);
  107073. sp_256_mont_sub_8(y, y, x, p256_mod);
  107074. sp_256_mont_sub_8(y, y, x, p256_mod);
  107075. /* y = x^3 - 3x + b */
  107076. err = sp_256_mod_mul_norm_8(x, p256_b, p256_mod);
  107077. }
  107078. if (err == MP_OKAY) {
  107079. sp_256_mont_add_8(y, y, x, p256_mod);
  107080. /* y = sqrt(x^3 - 3x + b) */
  107081. err = sp_256_mont_sqrt_8(y);
  107082. }
  107083. if (err == MP_OKAY) {
  107084. XMEMSET(y + 8, 0, 8U * sizeof(sp_digit));
  107085. sp_256_mont_reduce_8(y, p256_mod, p256_mp_mod);
  107086. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  107087. sp_256_mont_sub_8(y, p256_mod, y, p256_mod);
  107088. }
  107089. err = sp_256_to_mp(y, ym);
  107090. }
  107091. #ifdef WOLFSSL_SP_SMALL_STACK
  107092. if (x != NULL)
  107093. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  107094. #endif
  107095. return err;
  107096. }
  107097. #endif
  107098. #endif /* !WOLFSSL_SP_NO_256 */
  107099. #ifdef WOLFSSL_SP_384
  107100. /* Point structure to use. */
  107101. typedef struct sp_point_384 {
  107102. /* X ordinate of point. */
  107103. sp_digit x[2 * 12];
  107104. /* Y ordinate of point. */
  107105. sp_digit y[2 * 12];
  107106. /* Z ordinate of point. */
  107107. sp_digit z[2 * 12];
  107108. /* Indicates point is at infinity. */
  107109. int infinity;
  107110. } sp_point_384;
  107111. /* The modulus (prime) of the curve P384. */
  107112. static const sp_digit p384_mod[12] = {
  107113. 0xffffffff,0x00000000,0x00000000,0xffffffff,0xfffffffe,0xffffffff,
  107114. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  107115. };
  107116. /* The Montgomery normalizer for modulus of the curve P384. */
  107117. static const sp_digit p384_norm_mod[12] = {
  107118. 0x00000001,0xffffffff,0xffffffff,0x00000000,0x00000001,0x00000000,
  107119. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  107120. };
  107121. /* The Montgomery multiplier for modulus of the curve P384. */
  107122. static sp_digit p384_mp_mod = 0x00000001;
  107123. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  107124. defined(HAVE_ECC_VERIFY)
  107125. /* The order of the curve P384. */
  107126. static const sp_digit p384_order[12] = {
  107127. 0xccc52973,0xecec196a,0x48b0a77a,0x581a0db2,0xf4372ddf,0xc7634d81,
  107128. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  107129. };
  107130. #endif
  107131. /* The order of the curve P384 minus 2. */
  107132. static const sp_digit p384_order2[12] = {
  107133. 0xccc52971,0xecec196a,0x48b0a77a,0x581a0db2,0xf4372ddf,0xc7634d81,
  107134. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  107135. };
  107136. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  107137. /* The Montgomery normalizer for order of the curve P384. */
  107138. static const sp_digit p384_norm_order[12] = {
  107139. 0x333ad68d,0x1313e695,0xb74f5885,0xa7e5f24d,0x0bc8d220,0x389cb27e,
  107140. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  107141. };
  107142. #endif
  107143. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  107144. /* The Montgomery multiplier for order of the curve P384. */
  107145. static sp_digit p384_mp_order = 0xe88fdc45;
  107146. #endif
  107147. /* The base point of curve P384. */
  107148. static const sp_point_384 p384_base = {
  107149. /* X ordinate */
  107150. {
  107151. 0x72760ab7,0x3a545e38,0xbf55296c,0x5502f25d,0x82542a38,0x59f741e0,
  107152. 0x8ba79b98,0x6e1d3b62,0xf320ad74,0x8eb1c71e,0xbe8b0537,0xaa87ca22,
  107153. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  107154. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  107155. (sp_digit)0, (sp_digit)0
  107156. },
  107157. /* Y ordinate */
  107158. {
  107159. 0x90ea0e5f,0x7a431d7c,0x1d7e819d,0x0a60b1ce,0xb5f0b8c0,0xe9da3113,
  107160. 0x289a147c,0xf8f41dbd,0x9292dc29,0x5d9e98bf,0x96262c6f,0x3617de4a,
  107161. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  107162. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  107163. (sp_digit)0, (sp_digit)0
  107164. },
  107165. /* Z ordinate */
  107166. {
  107167. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  107168. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  107169. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  107170. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  107171. (sp_digit)0, (sp_digit)0
  107172. },
  107173. /* infinity */
  107174. 0
  107175. };
  107176. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  107177. static const sp_digit p384_b[12] = {
  107178. 0xd3ec2aef,0x2a85c8ed,0x8a2ed19d,0xc656398d,0x5013875a,0x0314088f,
  107179. 0xfe814112,0x181d9c6e,0xe3f82d19,0x988e056b,0xe23ee7e4,0xb3312fa7
  107180. };
  107181. #endif
  107182. /* Multiply a and b into r. (r = a * b)
  107183. *
  107184. * r A single precision integer.
  107185. * a A single precision integer.
  107186. * b A single precision integer.
  107187. */
  107188. SP_NOINLINE static void sp_384_mul_12(sp_digit* r, const sp_digit* a,
  107189. const sp_digit* b)
  107190. {
  107191. sp_digit t[12 * 2];
  107192. sp_digit* tmp = t;
  107193. __asm__ __volatile__ (
  107194. "movs r3, #0\n\t"
  107195. "movs r4, #0\n\t"
  107196. "mov r8, r3\n\t"
  107197. "mov r11, %[tmp]\n\t"
  107198. "mov r9, %[a]\n\t"
  107199. "mov r10, %[b]\n\t"
  107200. "movs r6, #48\n\t"
  107201. "add r6, r6, r9\n\t"
  107202. "mov r12, r6\n\t"
  107203. "\n"
  107204. "L_sp_384_mul_12_words_%=:\n\t"
  107205. "movs %[tmp], #0\n\t"
  107206. "movs r5, #0\n\t"
  107207. "movs r6, #44\n\t"
  107208. "mov %[a], r8\n\t"
  107209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107210. "subs %[a], %[a], r6\n\t"
  107211. #else
  107212. "sub %[a], %[a], r6\n\t"
  107213. #endif
  107214. #ifdef WOLFSSL_KEIL
  107215. "sbcs r6, r6, r6\n\t"
  107216. #elif defined(__clang__)
  107217. "sbcs r6, r6\n\t"
  107218. #else
  107219. "sbc r6, r6\n\t"
  107220. #endif
  107221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107222. "mvns r6, r6\n\t"
  107223. #else
  107224. "mvn r6, r6\n\t"
  107225. #endif
  107226. #ifdef WOLFSSL_KEIL
  107227. "ands %[a], %[a], r6\n\t"
  107228. #elif defined(__clang__)
  107229. "ands %[a], r6\n\t"
  107230. #else
  107231. "and %[a], r6\n\t"
  107232. #endif
  107233. "mov %[b], r8\n\t"
  107234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107235. "subs %[b], %[b], %[a]\n\t"
  107236. #else
  107237. "sub %[b], %[b], %[a]\n\t"
  107238. #endif
  107239. "add %[a], %[a], r9\n\t"
  107240. "add %[b], %[b], r10\n\t"
  107241. "\n"
  107242. "L_sp_384_mul_12_mul_%=:\n\t"
  107243. "# Multiply Start\n\t"
  107244. "ldrh r6, [%[a]]\n\t"
  107245. "ldrh r7, [%[b]]\n\t"
  107246. #ifdef WOLFSSL_KEIL
  107247. "muls r7, r6, r7\n\t"
  107248. #elif defined(__clang__)
  107249. "muls r7, r6\n\t"
  107250. #else
  107251. "mul r7, r6\n\t"
  107252. #endif
  107253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107254. "adds r3, r3, r7\n\t"
  107255. #else
  107256. "add r3, r3, r7\n\t"
  107257. #endif
  107258. #ifdef WOLFSSL_KEIL
  107259. "adcs r4, r4, %[tmp]\n\t"
  107260. #elif defined(__clang__)
  107261. "adcs r4, %[tmp]\n\t"
  107262. #else
  107263. "adc r4, %[tmp]\n\t"
  107264. #endif
  107265. #ifdef WOLFSSL_KEIL
  107266. "adcs r5, r5, %[tmp]\n\t"
  107267. #elif defined(__clang__)
  107268. "adcs r5, %[tmp]\n\t"
  107269. #else
  107270. "adc r5, %[tmp]\n\t"
  107271. #endif
  107272. "ldr r7, [%[b]]\n\t"
  107273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107274. "lsrs r7, r7, #16\n\t"
  107275. #else
  107276. "lsr r7, r7, #16\n\t"
  107277. #endif
  107278. #ifdef WOLFSSL_KEIL
  107279. "muls r6, r7, r6\n\t"
  107280. #elif defined(__clang__)
  107281. "muls r6, r7\n\t"
  107282. #else
  107283. "mul r6, r7\n\t"
  107284. #endif
  107285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107286. "lsrs r7, r6, #16\n\t"
  107287. #else
  107288. "lsr r7, r6, #16\n\t"
  107289. #endif
  107290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107291. "lsls r6, r6, #16\n\t"
  107292. #else
  107293. "lsl r6, r6, #16\n\t"
  107294. #endif
  107295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107296. "adds r3, r3, r6\n\t"
  107297. #else
  107298. "add r3, r3, r6\n\t"
  107299. #endif
  107300. #ifdef WOLFSSL_KEIL
  107301. "adcs r4, r4, r7\n\t"
  107302. #elif defined(__clang__)
  107303. "adcs r4, r7\n\t"
  107304. #else
  107305. "adc r4, r7\n\t"
  107306. #endif
  107307. #ifdef WOLFSSL_KEIL
  107308. "adcs r5, r5, %[tmp]\n\t"
  107309. #elif defined(__clang__)
  107310. "adcs r5, %[tmp]\n\t"
  107311. #else
  107312. "adc r5, %[tmp]\n\t"
  107313. #endif
  107314. "ldr r6, [%[a]]\n\t"
  107315. "ldr r7, [%[b]]\n\t"
  107316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107317. "lsrs r6, r6, #16\n\t"
  107318. #else
  107319. "lsr r6, r6, #16\n\t"
  107320. #endif
  107321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107322. "lsrs r7, r7, #16\n\t"
  107323. #else
  107324. "lsr r7, r7, #16\n\t"
  107325. #endif
  107326. #ifdef WOLFSSL_KEIL
  107327. "muls r7, r6, r7\n\t"
  107328. #elif defined(__clang__)
  107329. "muls r7, r6\n\t"
  107330. #else
  107331. "mul r7, r6\n\t"
  107332. #endif
  107333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107334. "adds r4, r4, r7\n\t"
  107335. #else
  107336. "add r4, r4, r7\n\t"
  107337. #endif
  107338. #ifdef WOLFSSL_KEIL
  107339. "adcs r5, r5, %[tmp]\n\t"
  107340. #elif defined(__clang__)
  107341. "adcs r5, %[tmp]\n\t"
  107342. #else
  107343. "adc r5, %[tmp]\n\t"
  107344. #endif
  107345. "ldrh r7, [%[b]]\n\t"
  107346. #ifdef WOLFSSL_KEIL
  107347. "muls r6, r7, r6\n\t"
  107348. #elif defined(__clang__)
  107349. "muls r6, r7\n\t"
  107350. #else
  107351. "mul r6, r7\n\t"
  107352. #endif
  107353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107354. "lsrs r7, r6, #16\n\t"
  107355. #else
  107356. "lsr r7, r6, #16\n\t"
  107357. #endif
  107358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107359. "lsls r6, r6, #16\n\t"
  107360. #else
  107361. "lsl r6, r6, #16\n\t"
  107362. #endif
  107363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107364. "adds r3, r3, r6\n\t"
  107365. #else
  107366. "add r3, r3, r6\n\t"
  107367. #endif
  107368. #ifdef WOLFSSL_KEIL
  107369. "adcs r4, r4, r7\n\t"
  107370. #elif defined(__clang__)
  107371. "adcs r4, r7\n\t"
  107372. #else
  107373. "adc r4, r7\n\t"
  107374. #endif
  107375. #ifdef WOLFSSL_KEIL
  107376. "adcs r5, r5, %[tmp]\n\t"
  107377. #elif defined(__clang__)
  107378. "adcs r5, %[tmp]\n\t"
  107379. #else
  107380. "adc r5, %[tmp]\n\t"
  107381. #endif
  107382. "# Multiply Done\n\t"
  107383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107384. "adds %[a], %[a], #4\n\t"
  107385. #else
  107386. "add %[a], %[a], #4\n\t"
  107387. #endif
  107388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107389. "subs %[b], %[b], #4\n\t"
  107390. #else
  107391. "sub %[b], %[b], #4\n\t"
  107392. #endif
  107393. "cmp %[a], r12\n\t"
  107394. "beq L_sp_384_mul_12_done_mul_%=\n\t"
  107395. "mov r6, r8\n\t"
  107396. "add r6, r6, r9\n\t"
  107397. "cmp %[a], r6\n\t"
  107398. "ble L_sp_384_mul_12_mul_%=\n\t"
  107399. "\n"
  107400. "L_sp_384_mul_12_done_mul_%=:\n\t"
  107401. "mov %[tmp], r11\n\t"
  107402. "mov r7, r8\n\t"
  107403. "str r3, [%[tmp], r7]\n\t"
  107404. "movs r3, r4\n\t"
  107405. "movs r4, r5\n\t"
  107406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107407. "adds r7, r7, #4\n\t"
  107408. #else
  107409. "add r7, r7, #4\n\t"
  107410. #endif
  107411. "mov r8, r7\n\t"
  107412. "movs r6, #0x58\n\t"
  107413. "cmp r7, r6\n\t"
  107414. "ble L_sp_384_mul_12_words_%=\n\t"
  107415. "str r3, [%[tmp], r7]\n\t"
  107416. "mov %[a], r9\n\t"
  107417. "mov %[b], r10\n\t"
  107418. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  107419. :
  107420. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  107421. );
  107422. XMEMCPY(r, t, sizeof(t));
  107423. }
  107424. /* Square a and put result in r. (r = a * a)
  107425. *
  107426. * r A single precision integer.
  107427. * a A single precision integer.
  107428. */
  107429. SP_NOINLINE static void sp_384_sqr_12(sp_digit* r, const sp_digit* a)
  107430. {
  107431. __asm__ __volatile__ (
  107432. "movs r3, #0\n\t"
  107433. "movs r4, #0\n\t"
  107434. "movs r5, #0\n\t"
  107435. "mov r8, r3\n\t"
  107436. "mov r11, %[r]\n\t"
  107437. "movs r6, #0x60\n\t"
  107438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107439. "negs r6, r6\n\t"
  107440. #else
  107441. "neg r6, r6\n\t"
  107442. #endif
  107443. "add sp, sp, r6\n\t"
  107444. "mov r10, sp\n\t"
  107445. "mov r9, %[a]\n\t"
  107446. "\n"
  107447. "L_sp_384_sqr_12_words_%=:\n\t"
  107448. "movs %[r], #0\n\t"
  107449. "movs r6, #44\n\t"
  107450. "mov %[a], r8\n\t"
  107451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107452. "subs %[a], %[a], r6\n\t"
  107453. #else
  107454. "sub %[a], %[a], r6\n\t"
  107455. #endif
  107456. #ifdef WOLFSSL_KEIL
  107457. "sbcs r6, r6, r6\n\t"
  107458. #elif defined(__clang__)
  107459. "sbcs r6, r6\n\t"
  107460. #else
  107461. "sbc r6, r6\n\t"
  107462. #endif
  107463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107464. "mvns r6, r6\n\t"
  107465. #else
  107466. "mvn r6, r6\n\t"
  107467. #endif
  107468. #ifdef WOLFSSL_KEIL
  107469. "ands %[a], %[a], r6\n\t"
  107470. #elif defined(__clang__)
  107471. "ands %[a], r6\n\t"
  107472. #else
  107473. "and %[a], r6\n\t"
  107474. #endif
  107475. "mov r2, r8\n\t"
  107476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107477. "subs r2, r2, %[a]\n\t"
  107478. #else
  107479. "sub r2, r2, %[a]\n\t"
  107480. #endif
  107481. "add %[a], %[a], r9\n\t"
  107482. "add r2, r2, r9\n\t"
  107483. "\n"
  107484. "L_sp_384_sqr_12_mul_%=:\n\t"
  107485. "cmp r2, %[a]\n\t"
  107486. "beq L_sp_384_sqr_12_sqr_%=\n\t"
  107487. "# Multiply * 2: Start\n\t"
  107488. "ldrh r6, [%[a]]\n\t"
  107489. "ldrh r7, [r2]\n\t"
  107490. #ifdef WOLFSSL_KEIL
  107491. "muls r7, r6, r7\n\t"
  107492. #elif defined(__clang__)
  107493. "muls r7, r6\n\t"
  107494. #else
  107495. "mul r7, r6\n\t"
  107496. #endif
  107497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107498. "adds r3, r3, r7\n\t"
  107499. #else
  107500. "add r3, r3, r7\n\t"
  107501. #endif
  107502. #ifdef WOLFSSL_KEIL
  107503. "adcs r4, r4, %[r]\n\t"
  107504. #elif defined(__clang__)
  107505. "adcs r4, %[r]\n\t"
  107506. #else
  107507. "adc r4, %[r]\n\t"
  107508. #endif
  107509. #ifdef WOLFSSL_KEIL
  107510. "adcs r5, r5, %[r]\n\t"
  107511. #elif defined(__clang__)
  107512. "adcs r5, %[r]\n\t"
  107513. #else
  107514. "adc r5, %[r]\n\t"
  107515. #endif
  107516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107517. "adds r3, r3, r7\n\t"
  107518. #else
  107519. "add r3, r3, r7\n\t"
  107520. #endif
  107521. #ifdef WOLFSSL_KEIL
  107522. "adcs r4, r4, %[r]\n\t"
  107523. #elif defined(__clang__)
  107524. "adcs r4, %[r]\n\t"
  107525. #else
  107526. "adc r4, %[r]\n\t"
  107527. #endif
  107528. #ifdef WOLFSSL_KEIL
  107529. "adcs r5, r5, %[r]\n\t"
  107530. #elif defined(__clang__)
  107531. "adcs r5, %[r]\n\t"
  107532. #else
  107533. "adc r5, %[r]\n\t"
  107534. #endif
  107535. "ldr r7, [r2]\n\t"
  107536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107537. "lsrs r7, r7, #16\n\t"
  107538. #else
  107539. "lsr r7, r7, #16\n\t"
  107540. #endif
  107541. #ifdef WOLFSSL_KEIL
  107542. "muls r6, r7, r6\n\t"
  107543. #elif defined(__clang__)
  107544. "muls r6, r7\n\t"
  107545. #else
  107546. "mul r6, r7\n\t"
  107547. #endif
  107548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107549. "lsrs r7, r6, #16\n\t"
  107550. #else
  107551. "lsr r7, r6, #16\n\t"
  107552. #endif
  107553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107554. "lsls r6, r6, #16\n\t"
  107555. #else
  107556. "lsl r6, r6, #16\n\t"
  107557. #endif
  107558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107559. "adds r3, r3, r6\n\t"
  107560. #else
  107561. "add r3, r3, r6\n\t"
  107562. #endif
  107563. #ifdef WOLFSSL_KEIL
  107564. "adcs r4, r4, r7\n\t"
  107565. #elif defined(__clang__)
  107566. "adcs r4, r7\n\t"
  107567. #else
  107568. "adc r4, r7\n\t"
  107569. #endif
  107570. #ifdef WOLFSSL_KEIL
  107571. "adcs r5, r5, %[r]\n\t"
  107572. #elif defined(__clang__)
  107573. "adcs r5, %[r]\n\t"
  107574. #else
  107575. "adc r5, %[r]\n\t"
  107576. #endif
  107577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107578. "adds r3, r3, r6\n\t"
  107579. #else
  107580. "add r3, r3, r6\n\t"
  107581. #endif
  107582. #ifdef WOLFSSL_KEIL
  107583. "adcs r4, r4, r7\n\t"
  107584. #elif defined(__clang__)
  107585. "adcs r4, r7\n\t"
  107586. #else
  107587. "adc r4, r7\n\t"
  107588. #endif
  107589. #ifdef WOLFSSL_KEIL
  107590. "adcs r5, r5, %[r]\n\t"
  107591. #elif defined(__clang__)
  107592. "adcs r5, %[r]\n\t"
  107593. #else
  107594. "adc r5, %[r]\n\t"
  107595. #endif
  107596. "ldr r6, [%[a]]\n\t"
  107597. "ldr r7, [r2]\n\t"
  107598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107599. "lsrs r6, r6, #16\n\t"
  107600. #else
  107601. "lsr r6, r6, #16\n\t"
  107602. #endif
  107603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107604. "lsrs r7, r7, #16\n\t"
  107605. #else
  107606. "lsr r7, r7, #16\n\t"
  107607. #endif
  107608. #ifdef WOLFSSL_KEIL
  107609. "muls r7, r6, r7\n\t"
  107610. #elif defined(__clang__)
  107611. "muls r7, r6\n\t"
  107612. #else
  107613. "mul r7, r6\n\t"
  107614. #endif
  107615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107616. "adds r4, r4, r7\n\t"
  107617. #else
  107618. "add r4, r4, r7\n\t"
  107619. #endif
  107620. #ifdef WOLFSSL_KEIL
  107621. "adcs r5, r5, %[r]\n\t"
  107622. #elif defined(__clang__)
  107623. "adcs r5, %[r]\n\t"
  107624. #else
  107625. "adc r5, %[r]\n\t"
  107626. #endif
  107627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107628. "adds r4, r4, r7\n\t"
  107629. #else
  107630. "add r4, r4, r7\n\t"
  107631. #endif
  107632. #ifdef WOLFSSL_KEIL
  107633. "adcs r5, r5, %[r]\n\t"
  107634. #elif defined(__clang__)
  107635. "adcs r5, %[r]\n\t"
  107636. #else
  107637. "adc r5, %[r]\n\t"
  107638. #endif
  107639. "ldrh r7, [r2]\n\t"
  107640. #ifdef WOLFSSL_KEIL
  107641. "muls r6, r7, r6\n\t"
  107642. #elif defined(__clang__)
  107643. "muls r6, r7\n\t"
  107644. #else
  107645. "mul r6, r7\n\t"
  107646. #endif
  107647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107648. "lsrs r7, r6, #16\n\t"
  107649. #else
  107650. "lsr r7, r6, #16\n\t"
  107651. #endif
  107652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107653. "lsls r6, r6, #16\n\t"
  107654. #else
  107655. "lsl r6, r6, #16\n\t"
  107656. #endif
  107657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107658. "adds r3, r3, r6\n\t"
  107659. #else
  107660. "add r3, r3, r6\n\t"
  107661. #endif
  107662. #ifdef WOLFSSL_KEIL
  107663. "adcs r4, r4, r7\n\t"
  107664. #elif defined(__clang__)
  107665. "adcs r4, r7\n\t"
  107666. #else
  107667. "adc r4, r7\n\t"
  107668. #endif
  107669. #ifdef WOLFSSL_KEIL
  107670. "adcs r5, r5, %[r]\n\t"
  107671. #elif defined(__clang__)
  107672. "adcs r5, %[r]\n\t"
  107673. #else
  107674. "adc r5, %[r]\n\t"
  107675. #endif
  107676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107677. "adds r3, r3, r6\n\t"
  107678. #else
  107679. "add r3, r3, r6\n\t"
  107680. #endif
  107681. #ifdef WOLFSSL_KEIL
  107682. "adcs r4, r4, r7\n\t"
  107683. #elif defined(__clang__)
  107684. "adcs r4, r7\n\t"
  107685. #else
  107686. "adc r4, r7\n\t"
  107687. #endif
  107688. #ifdef WOLFSSL_KEIL
  107689. "adcs r5, r5, %[r]\n\t"
  107690. #elif defined(__clang__)
  107691. "adcs r5, %[r]\n\t"
  107692. #else
  107693. "adc r5, %[r]\n\t"
  107694. #endif
  107695. "# Multiply * 2: Done\n\t"
  107696. "bal L_sp_384_sqr_12_done_sqr_%=\n\t"
  107697. "\n"
  107698. "L_sp_384_sqr_12_sqr_%=:\n\t"
  107699. "mov r12, r2\n\t"
  107700. "ldr r2, [%[a]]\n\t"
  107701. "# Square: Start\n\t"
  107702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107703. "lsrs r7, r2, #16\n\t"
  107704. #else
  107705. "lsr r7, r2, #16\n\t"
  107706. #endif
  107707. "uxth r6, r2\n\t"
  107708. #ifdef WOLFSSL_KEIL
  107709. "muls r6, r6, r6\n\t"
  107710. #elif defined(__clang__)
  107711. "muls r6, r6\n\t"
  107712. #else
  107713. "mul r6, r6\n\t"
  107714. #endif
  107715. #ifdef WOLFSSL_KEIL
  107716. "muls r7, r7, r7\n\t"
  107717. #elif defined(__clang__)
  107718. "muls r7, r7\n\t"
  107719. #else
  107720. "mul r7, r7\n\t"
  107721. #endif
  107722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107723. "adds r3, r3, r6\n\t"
  107724. #else
  107725. "add r3, r3, r6\n\t"
  107726. #endif
  107727. #ifdef WOLFSSL_KEIL
  107728. "adcs r4, r4, r7\n\t"
  107729. #elif defined(__clang__)
  107730. "adcs r4, r7\n\t"
  107731. #else
  107732. "adc r4, r7\n\t"
  107733. #endif
  107734. #ifdef WOLFSSL_KEIL
  107735. "adcs r5, r5, %[r]\n\t"
  107736. #elif defined(__clang__)
  107737. "adcs r5, %[r]\n\t"
  107738. #else
  107739. "adc r5, %[r]\n\t"
  107740. #endif
  107741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107742. "lsrs r7, r2, #16\n\t"
  107743. #else
  107744. "lsr r7, r2, #16\n\t"
  107745. #endif
  107746. "uxth r6, r2\n\t"
  107747. #ifdef WOLFSSL_KEIL
  107748. "muls r6, r7, r6\n\t"
  107749. #elif defined(__clang__)
  107750. "muls r6, r7\n\t"
  107751. #else
  107752. "mul r6, r7\n\t"
  107753. #endif
  107754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107755. "lsrs r7, r6, #15\n\t"
  107756. #else
  107757. "lsr r7, r6, #15\n\t"
  107758. #endif
  107759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107760. "lsls r6, r6, #17\n\t"
  107761. #else
  107762. "lsl r6, r6, #17\n\t"
  107763. #endif
  107764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107765. "adds r3, r3, r6\n\t"
  107766. #else
  107767. "add r3, r3, r6\n\t"
  107768. #endif
  107769. #ifdef WOLFSSL_KEIL
  107770. "adcs r4, r4, r7\n\t"
  107771. #elif defined(__clang__)
  107772. "adcs r4, r7\n\t"
  107773. #else
  107774. "adc r4, r7\n\t"
  107775. #endif
  107776. #ifdef WOLFSSL_KEIL
  107777. "adcs r5, r5, %[r]\n\t"
  107778. #elif defined(__clang__)
  107779. "adcs r5, %[r]\n\t"
  107780. #else
  107781. "adc r5, %[r]\n\t"
  107782. #endif
  107783. "# Square: Done\n\t"
  107784. "mov r2, r12\n\t"
  107785. "\n"
  107786. "L_sp_384_sqr_12_done_sqr_%=:\n\t"
  107787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107788. "adds %[a], %[a], #4\n\t"
  107789. #else
  107790. "add %[a], %[a], #4\n\t"
  107791. #endif
  107792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107793. "subs r2, r2, #4\n\t"
  107794. #else
  107795. "sub r2, r2, #4\n\t"
  107796. #endif
  107797. "movs r6, #48\n\t"
  107798. "add r6, r6, r9\n\t"
  107799. "cmp %[a], r6\n\t"
  107800. "beq L_sp_384_sqr_12_done_mul_%=\n\t"
  107801. "cmp %[a], r2\n\t"
  107802. "bgt L_sp_384_sqr_12_done_mul_%=\n\t"
  107803. "mov r7, r8\n\t"
  107804. "add r7, r7, r9\n\t"
  107805. "cmp %[a], r7\n\t"
  107806. "ble L_sp_384_sqr_12_mul_%=\n\t"
  107807. "\n"
  107808. "L_sp_384_sqr_12_done_mul_%=:\n\t"
  107809. "mov %[r], r10\n\t"
  107810. "mov r7, r8\n\t"
  107811. "str r3, [%[r], r7]\n\t"
  107812. "movs r3, r4\n\t"
  107813. "movs r4, r5\n\t"
  107814. "movs r5, #0\n\t"
  107815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107816. "adds r7, r7, #4\n\t"
  107817. #else
  107818. "add r7, r7, #4\n\t"
  107819. #endif
  107820. "mov r8, r7\n\t"
  107821. "movs r6, #0x58\n\t"
  107822. "cmp r7, r6\n\t"
  107823. "ble L_sp_384_sqr_12_words_%=\n\t"
  107824. "mov %[a], r9\n\t"
  107825. "str r3, [%[r], r7]\n\t"
  107826. "mov %[r], r11\n\t"
  107827. "mov %[a], r10\n\t"
  107828. "movs r3, #0x5c\n\t"
  107829. "\n"
  107830. "L_sp_384_sqr_12_store_%=:\n\t"
  107831. "ldr r6, [%[a], r3]\n\t"
  107832. "str r6, [%[r], r3]\n\t"
  107833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107834. "subs r3, r3, #4\n\t"
  107835. #else
  107836. "sub r3, r3, #4\n\t"
  107837. #endif
  107838. "bge L_sp_384_sqr_12_store_%=\n\t"
  107839. "movs r6, #0x60\n\t"
  107840. "add sp, sp, r6\n\t"
  107841. : [r] "+l" (r), [a] "+l" (a)
  107842. :
  107843. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  107844. );
  107845. }
  107846. #ifdef WOLFSSL_SP_SMALL
  107847. /* Add b to a into r. (r = a + b)
  107848. *
  107849. * r A single precision integer.
  107850. * a A single precision integer.
  107851. * b A single precision integer.
  107852. */
  107853. SP_NOINLINE static sp_digit sp_384_add_12(sp_digit* r, const sp_digit* a,
  107854. const sp_digit* b)
  107855. {
  107856. __asm__ __volatile__ (
  107857. "movs r6, %[a]\n\t"
  107858. "movs r7, #0\n\t"
  107859. "movs r3, #0\n\t"
  107860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107861. "adds r6, r6, #48\n\t"
  107862. #else
  107863. "add r6, r6, #48\n\t"
  107864. #endif
  107865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107866. "subs r7, r7, #1\n\t"
  107867. #else
  107868. "sub r7, r7, #1\n\t"
  107869. #endif
  107870. "\n"
  107871. "L_sp_384_add_12_word_%=:\n\t"
  107872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107873. "adds r3, r3, r7\n\t"
  107874. #else
  107875. "add r3, r3, r7\n\t"
  107876. #endif
  107877. "ldr r4, [%[a]]\n\t"
  107878. "ldr r5, [%[b]]\n\t"
  107879. #ifdef WOLFSSL_KEIL
  107880. "adcs r4, r4, r5\n\t"
  107881. #elif defined(__clang__)
  107882. "adcs r4, r5\n\t"
  107883. #else
  107884. "adc r4, r5\n\t"
  107885. #endif
  107886. "str r4, [%[r]]\n\t"
  107887. "movs r3, #0\n\t"
  107888. #ifdef WOLFSSL_KEIL
  107889. "adcs r3, r3, r3\n\t"
  107890. #elif defined(__clang__)
  107891. "adcs r3, r3\n\t"
  107892. #else
  107893. "adc r3, r3\n\t"
  107894. #endif
  107895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107896. "adds %[a], %[a], #4\n\t"
  107897. #else
  107898. "add %[a], %[a], #4\n\t"
  107899. #endif
  107900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107901. "adds %[b], %[b], #4\n\t"
  107902. #else
  107903. "add %[b], %[b], #4\n\t"
  107904. #endif
  107905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107906. "adds %[r], %[r], #4\n\t"
  107907. #else
  107908. "add %[r], %[r], #4\n\t"
  107909. #endif
  107910. "cmp %[a], r6\n\t"
  107911. "bne L_sp_384_add_12_word_%=\n\t"
  107912. "movs %[r], r3\n\t"
  107913. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  107914. :
  107915. : "memory", "r3", "r4", "r5", "r6", "r7"
  107916. );
  107917. return (uint32_t)(size_t)r;
  107918. }
  107919. #else
  107920. /* Add b to a into r. (r = a + b)
  107921. *
  107922. * r A single precision integer.
  107923. * a A single precision integer.
  107924. * b A single precision integer.
  107925. */
  107926. SP_NOINLINE static sp_digit sp_384_add_12(sp_digit* r, const sp_digit* a,
  107927. const sp_digit* b)
  107928. {
  107929. __asm__ __volatile__ (
  107930. "ldm %[b]!, {r5, r6}\n\t"
  107931. "ldm %[a]!, {r3, r4}\n\t"
  107932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107933. "adds r3, r3, r5\n\t"
  107934. #else
  107935. "add r3, r3, r5\n\t"
  107936. #endif
  107937. #ifdef WOLFSSL_KEIL
  107938. "adcs r4, r4, r6\n\t"
  107939. #elif defined(__clang__)
  107940. "adcs r4, r6\n\t"
  107941. #else
  107942. "adc r4, r6\n\t"
  107943. #endif
  107944. "stm %[r]!, {r3, r4}\n\t"
  107945. "ldm %[b]!, {r5, r6}\n\t"
  107946. "ldm %[a]!, {r3, r4}\n\t"
  107947. #ifdef WOLFSSL_KEIL
  107948. "adcs r3, r3, r5\n\t"
  107949. #elif defined(__clang__)
  107950. "adcs r3, r5\n\t"
  107951. #else
  107952. "adc r3, r5\n\t"
  107953. #endif
  107954. #ifdef WOLFSSL_KEIL
  107955. "adcs r4, r4, r6\n\t"
  107956. #elif defined(__clang__)
  107957. "adcs r4, r6\n\t"
  107958. #else
  107959. "adc r4, r6\n\t"
  107960. #endif
  107961. "stm %[r]!, {r3, r4}\n\t"
  107962. "ldm %[b]!, {r5, r6}\n\t"
  107963. "ldm %[a]!, {r3, r4}\n\t"
  107964. #ifdef WOLFSSL_KEIL
  107965. "adcs r3, r3, r5\n\t"
  107966. #elif defined(__clang__)
  107967. "adcs r3, r5\n\t"
  107968. #else
  107969. "adc r3, r5\n\t"
  107970. #endif
  107971. #ifdef WOLFSSL_KEIL
  107972. "adcs r4, r4, r6\n\t"
  107973. #elif defined(__clang__)
  107974. "adcs r4, r6\n\t"
  107975. #else
  107976. "adc r4, r6\n\t"
  107977. #endif
  107978. "stm %[r]!, {r3, r4}\n\t"
  107979. "ldm %[b]!, {r5, r6}\n\t"
  107980. "ldm %[a]!, {r3, r4}\n\t"
  107981. #ifdef WOLFSSL_KEIL
  107982. "adcs r3, r3, r5\n\t"
  107983. #elif defined(__clang__)
  107984. "adcs r3, r5\n\t"
  107985. #else
  107986. "adc r3, r5\n\t"
  107987. #endif
  107988. #ifdef WOLFSSL_KEIL
  107989. "adcs r4, r4, r6\n\t"
  107990. #elif defined(__clang__)
  107991. "adcs r4, r6\n\t"
  107992. #else
  107993. "adc r4, r6\n\t"
  107994. #endif
  107995. "stm %[r]!, {r3, r4}\n\t"
  107996. "ldm %[b]!, {r5, r6}\n\t"
  107997. "ldm %[a]!, {r3, r4}\n\t"
  107998. #ifdef WOLFSSL_KEIL
  107999. "adcs r3, r3, r5\n\t"
  108000. #elif defined(__clang__)
  108001. "adcs r3, r5\n\t"
  108002. #else
  108003. "adc r3, r5\n\t"
  108004. #endif
  108005. #ifdef WOLFSSL_KEIL
  108006. "adcs r4, r4, r6\n\t"
  108007. #elif defined(__clang__)
  108008. "adcs r4, r6\n\t"
  108009. #else
  108010. "adc r4, r6\n\t"
  108011. #endif
  108012. "stm %[r]!, {r3, r4}\n\t"
  108013. "ldm %[b]!, {r5, r6}\n\t"
  108014. "ldm %[a]!, {r3, r4}\n\t"
  108015. #ifdef WOLFSSL_KEIL
  108016. "adcs r3, r3, r5\n\t"
  108017. #elif defined(__clang__)
  108018. "adcs r3, r5\n\t"
  108019. #else
  108020. "adc r3, r5\n\t"
  108021. #endif
  108022. #ifdef WOLFSSL_KEIL
  108023. "adcs r4, r4, r6\n\t"
  108024. #elif defined(__clang__)
  108025. "adcs r4, r6\n\t"
  108026. #else
  108027. "adc r4, r6\n\t"
  108028. #endif
  108029. "stm %[r]!, {r3, r4}\n\t"
  108030. "movs %[r], #0\n\t"
  108031. #ifdef WOLFSSL_KEIL
  108032. "adcs %[r], %[r], %[r]\n\t"
  108033. #elif defined(__clang__)
  108034. "adcs %[r], %[r]\n\t"
  108035. #else
  108036. "adc %[r], %[r]\n\t"
  108037. #endif
  108038. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  108039. :
  108040. : "memory", "r3", "r4", "r5", "r6"
  108041. );
  108042. return (uint32_t)(size_t)r;
  108043. }
  108044. #endif /* WOLFSSL_SP_SMALL */
  108045. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  108046. *
  108047. * r The resulting Montgomery form number.
  108048. * a The number to convert.
  108049. * m The modulus (prime).
  108050. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  108051. */
  108052. static int sp_384_mod_mul_norm_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  108053. {
  108054. #ifdef WOLFSSL_SP_SMALL_STACK
  108055. int64_t* t = NULL;
  108056. #else
  108057. int64_t t[12];
  108058. #endif
  108059. int64_t o;
  108060. int err = MP_OKAY;
  108061. (void)m;
  108062. #ifdef WOLFSSL_SP_SMALL_STACK
  108063. t = (int64_t*)XMALLOC(sizeof(int64_t) * 12, NULL, DYNAMIC_TYPE_ECC);
  108064. if (t == NULL) {
  108065. err = MEMORY_E;
  108066. }
  108067. #endif
  108068. if (err == MP_OKAY) {
  108069. /* 1 0 0 0 0 0 0 0 1 1 0 -1 */
  108070. t[0] = 0 + (int64_t)a[0] + (int64_t)a[8] + (int64_t)a[9] - (int64_t)a[11];
  108071. /* -1 1 0 0 0 0 0 0 -1 0 1 1 */
  108072. t[1] = 0 - (int64_t)a[0] + (int64_t)a[1] - (int64_t)a[8] + (int64_t)a[10] + (int64_t)a[11];
  108073. /* 0 -1 1 0 0 0 0 0 0 -1 0 1 */
  108074. t[2] = 0 - (int64_t)a[1] + (int64_t)a[2] - (int64_t)a[9] + (int64_t)a[11];
  108075. /* 1 0 -1 1 0 0 0 0 1 1 -1 -1 */
  108076. 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];
  108077. /* 1 1 0 -1 1 0 0 0 1 2 1 -2 */
  108078. 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];
  108079. /* 0 1 1 0 -1 1 0 0 0 1 2 1 */
  108080. 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];
  108081. /* 0 0 1 1 0 -1 1 0 0 0 1 2 */
  108082. 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];
  108083. /* 0 0 0 1 1 0 -1 1 0 0 0 1 */
  108084. t[7] = 0 + (int64_t)a[3] + (int64_t)a[4] - (int64_t)a[6] + (int64_t)a[7] + (int64_t)a[11];
  108085. /* 0 0 0 0 1 1 0 -1 1 0 0 0 */
  108086. t[8] = 0 + (int64_t)a[4] + (int64_t)a[5] - (int64_t)a[7] + (int64_t)a[8];
  108087. /* 0 0 0 0 0 1 1 0 -1 1 0 0 */
  108088. t[9] = 0 + (int64_t)a[5] + (int64_t)a[6] - (int64_t)a[8] + (int64_t)a[9];
  108089. /* 0 0 0 0 0 0 1 1 0 -1 1 0 */
  108090. t[10] = 0 + (int64_t)a[6] + (int64_t)a[7] - (int64_t)a[9] + (int64_t)a[10];
  108091. /* 0 0 0 0 0 0 0 1 1 0 -1 1 */
  108092. t[11] = 0 + (int64_t)a[7] + (int64_t)a[8] - (int64_t)a[10] + (int64_t)a[11];
  108093. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  108094. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  108095. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  108096. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  108097. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  108098. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  108099. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  108100. t[8] += t[7] >> 32; t[7] &= 0xffffffff;
  108101. t[9] += t[8] >> 32; t[8] &= 0xffffffff;
  108102. t[10] += t[9] >> 32; t[9] &= 0xffffffff;
  108103. t[11] += t[10] >> 32; t[10] &= 0xffffffff;
  108104. o = t[11] >> 32; t[11] &= 0xffffffff;
  108105. t[0] += o;
  108106. t[1] -= o;
  108107. t[3] += o;
  108108. t[4] += o;
  108109. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  108110. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  108111. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  108112. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  108113. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  108114. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  108115. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  108116. t[8] += t[7] >> 32; t[7] &= 0xffffffff;
  108117. t[9] += t[8] >> 32; t[8] &= 0xffffffff;
  108118. t[10] += t[9] >> 32; t[9] &= 0xffffffff;
  108119. t[11] += t[10] >> 32; t[10] &= 0xffffffff;
  108120. r[0] = t[0];
  108121. r[1] = t[1];
  108122. r[2] = t[2];
  108123. r[3] = t[3];
  108124. r[4] = t[4];
  108125. r[5] = t[5];
  108126. r[6] = t[6];
  108127. r[7] = t[7];
  108128. r[8] = t[8];
  108129. r[9] = t[9];
  108130. r[10] = t[10];
  108131. r[11] = t[11];
  108132. }
  108133. #ifdef WOLFSSL_SP_SMALL_STACK
  108134. if (t != NULL)
  108135. XFREE(t, NULL, DYNAMIC_TYPE_ECC);
  108136. #endif
  108137. return err;
  108138. }
  108139. /* Convert an mp_int to an array of sp_digit.
  108140. *
  108141. * r A single precision integer.
  108142. * size Maximum number of bytes to convert
  108143. * a A multi-precision integer.
  108144. */
  108145. static void sp_384_from_mp(sp_digit* r, int size, const mp_int* a)
  108146. {
  108147. #if DIGIT_BIT == 32
  108148. int i;
  108149. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  108150. int o = 0;
  108151. for (i = 0; i < size; i++) {
  108152. sp_digit mask = (sp_digit)0 - (j >> 31);
  108153. r[i] = a->dp[o] & mask;
  108154. j++;
  108155. o += (int)(j >> 31);
  108156. }
  108157. #elif DIGIT_BIT > 32
  108158. unsigned int i;
  108159. int j = 0;
  108160. word32 s = 0;
  108161. r[0] = 0;
  108162. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  108163. r[j] |= ((sp_digit)a->dp[i] << s);
  108164. r[j] &= 0xffffffff;
  108165. s = 32U - s;
  108166. if (j + 1 >= size) {
  108167. break;
  108168. }
  108169. /* lint allow cast of mismatch word32 and mp_digit */
  108170. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  108171. while ((s + 32U) <= (word32)DIGIT_BIT) {
  108172. s += 32U;
  108173. r[j] &= 0xffffffff;
  108174. if (j + 1 >= size) {
  108175. break;
  108176. }
  108177. if (s < (word32)DIGIT_BIT) {
  108178. /* lint allow cast of mismatch word32 and mp_digit */
  108179. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  108180. }
  108181. else {
  108182. r[++j] = (sp_digit)0;
  108183. }
  108184. }
  108185. s = (word32)DIGIT_BIT - s;
  108186. }
  108187. for (j++; j < size; j++) {
  108188. r[j] = 0;
  108189. }
  108190. #else
  108191. unsigned int i;
  108192. int j = 0;
  108193. int s = 0;
  108194. r[0] = 0;
  108195. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  108196. r[j] |= ((sp_digit)a->dp[i]) << s;
  108197. if (s + DIGIT_BIT >= 32) {
  108198. r[j] &= 0xffffffff;
  108199. if (j + 1 >= size) {
  108200. break;
  108201. }
  108202. s = 32 - s;
  108203. if (s == DIGIT_BIT) {
  108204. r[++j] = 0;
  108205. s = 0;
  108206. }
  108207. else {
  108208. r[++j] = a->dp[i] >> s;
  108209. s = DIGIT_BIT - s;
  108210. }
  108211. }
  108212. else {
  108213. s += DIGIT_BIT;
  108214. }
  108215. }
  108216. for (j++; j < size; j++) {
  108217. r[j] = 0;
  108218. }
  108219. #endif
  108220. }
  108221. /* Convert a point of type ecc_point to type sp_point_384.
  108222. *
  108223. * p Point of type sp_point_384 (result).
  108224. * pm Point of type ecc_point.
  108225. */
  108226. static void sp_384_point_from_ecc_point_12(sp_point_384* p,
  108227. const ecc_point* pm)
  108228. {
  108229. XMEMSET(p->x, 0, sizeof(p->x));
  108230. XMEMSET(p->y, 0, sizeof(p->y));
  108231. XMEMSET(p->z, 0, sizeof(p->z));
  108232. sp_384_from_mp(p->x, 12, pm->x);
  108233. sp_384_from_mp(p->y, 12, pm->y);
  108234. sp_384_from_mp(p->z, 12, pm->z);
  108235. p->infinity = 0;
  108236. }
  108237. /* Convert an array of sp_digit to an mp_int.
  108238. *
  108239. * a A single precision integer.
  108240. * r A multi-precision integer.
  108241. */
  108242. static int sp_384_to_mp(const sp_digit* a, mp_int* r)
  108243. {
  108244. int err;
  108245. err = mp_grow(r, (384 + DIGIT_BIT - 1) / DIGIT_BIT);
  108246. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  108247. #if DIGIT_BIT == 32
  108248. XMEMCPY(r->dp, a, sizeof(sp_digit) * 12);
  108249. r->used = 12;
  108250. mp_clamp(r);
  108251. #elif DIGIT_BIT < 32
  108252. int i;
  108253. int j = 0;
  108254. int s = 0;
  108255. r->dp[0] = 0;
  108256. for (i = 0; i < 12; i++) {
  108257. r->dp[j] |= (mp_digit)(a[i] << s);
  108258. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  108259. s = DIGIT_BIT - s;
  108260. r->dp[++j] = (mp_digit)(a[i] >> s);
  108261. while (s + DIGIT_BIT <= 32) {
  108262. s += DIGIT_BIT;
  108263. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  108264. if (s == SP_WORD_SIZE) {
  108265. r->dp[j] = 0;
  108266. }
  108267. else {
  108268. r->dp[j] = (mp_digit)(a[i] >> s);
  108269. }
  108270. }
  108271. s = 32 - s;
  108272. }
  108273. r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
  108274. mp_clamp(r);
  108275. #else
  108276. int i;
  108277. int j = 0;
  108278. int s = 0;
  108279. r->dp[0] = 0;
  108280. for (i = 0; i < 12; i++) {
  108281. r->dp[j] |= ((mp_digit)a[i]) << s;
  108282. if (s + 32 >= DIGIT_BIT) {
  108283. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  108284. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  108285. #endif
  108286. s = DIGIT_BIT - s;
  108287. r->dp[++j] = a[i] >> s;
  108288. s = 32 - s;
  108289. }
  108290. else {
  108291. s += 32;
  108292. }
  108293. }
  108294. r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
  108295. mp_clamp(r);
  108296. #endif
  108297. }
  108298. return err;
  108299. }
  108300. /* Convert a point of type sp_point_384 to type ecc_point.
  108301. *
  108302. * p Point of type sp_point_384.
  108303. * pm Point of type ecc_point (result).
  108304. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  108305. * MP_OKAY.
  108306. */
  108307. static int sp_384_point_to_ecc_point_12(const sp_point_384* p, ecc_point* pm)
  108308. {
  108309. int err;
  108310. err = sp_384_to_mp(p->x, pm->x);
  108311. if (err == MP_OKAY) {
  108312. err = sp_384_to_mp(p->y, pm->y);
  108313. }
  108314. if (err == MP_OKAY) {
  108315. err = sp_384_to_mp(p->z, pm->z);
  108316. }
  108317. return err;
  108318. }
  108319. /* Conditionally subtract b from a using the mask m.
  108320. * m is -1 to subtract and 0 when not copying.
  108321. *
  108322. * r A single precision number representing condition subtract result.
  108323. * a A single precision number to subtract from.
  108324. * b A single precision number to subtract.
  108325. * m Mask value to apply.
  108326. */
  108327. SP_NOINLINE static sp_digit sp_384_cond_sub_12(sp_digit* r, const sp_digit* a,
  108328. const sp_digit* b, sp_digit m)
  108329. {
  108330. __asm__ __volatile__ (
  108331. "movs r4, #0\n\t"
  108332. "movs r5, #48\n\t"
  108333. "mov r8, r5\n\t"
  108334. "movs r7, #0\n\t"
  108335. "\n"
  108336. "L_sp_384_cond_sub_12_words_%=:\n\t"
  108337. "ldr r6, [%[b], r7]\n\t"
  108338. #ifdef WOLFSSL_KEIL
  108339. "ands r6, r6, %[m]\n\t"
  108340. #elif defined(__clang__)
  108341. "ands r6, %[m]\n\t"
  108342. #else
  108343. "and r6, %[m]\n\t"
  108344. #endif
  108345. "movs r5, #0\n\t"
  108346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108347. "subs r5, r5, r4\n\t"
  108348. #else
  108349. "sub r5, r5, r4\n\t"
  108350. #endif
  108351. "ldr r5, [%[a], r7]\n\t"
  108352. #ifdef WOLFSSL_KEIL
  108353. "sbcs r5, r5, r6\n\t"
  108354. #elif defined(__clang__)
  108355. "sbcs r5, r6\n\t"
  108356. #else
  108357. "sbc r5, r6\n\t"
  108358. #endif
  108359. #ifdef WOLFSSL_KEIL
  108360. "sbcs r4, r4, r4\n\t"
  108361. #elif defined(__clang__)
  108362. "sbcs r4, r4\n\t"
  108363. #else
  108364. "sbc r4, r4\n\t"
  108365. #endif
  108366. "str r5, [%[r], r7]\n\t"
  108367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108368. "adds r7, r7, #4\n\t"
  108369. #else
  108370. "add r7, r7, #4\n\t"
  108371. #endif
  108372. "cmp r7, r8\n\t"
  108373. "blt L_sp_384_cond_sub_12_words_%=\n\t"
  108374. "movs %[r], r4\n\t"
  108375. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  108376. :
  108377. : "memory", "r4", "r5", "r6", "r7", "r8"
  108378. );
  108379. return (uint32_t)(size_t)r;
  108380. }
  108381. #define sp_384_mont_reduce_order_12 sp_384_mont_reduce_12
  108382. /* Reduce the number back to 384 bits using Montgomery reduction.
  108383. *
  108384. * a A single precision number to reduce in place.
  108385. * m The single precision number representing the modulus.
  108386. * mp The digit representing the negative inverse of m mod 2^n.
  108387. */
  108388. SP_NOINLINE static void sp_384_mont_reduce_12(sp_digit* a, const sp_digit* m,
  108389. sp_digit mp)
  108390. {
  108391. __asm__ __volatile__ (
  108392. "movs r7, #0\n\t"
  108393. "mov r8, %[mp]\n\t"
  108394. "mov r12, r7\n\t"
  108395. "mov lr, %[m]\n\t"
  108396. "mov r9, %[a]\n\t"
  108397. "mov r11, %[a]\n\t"
  108398. "movs r5, #44\n\t"
  108399. "movs r6, #48\n\t"
  108400. "add r9, r9, r5\n\t"
  108401. "add r11, r11, r6\n\t"
  108402. "\n"
  108403. "L_sp_384_mont_reduce_12_mod_%=:\n\t"
  108404. "movs r7, #0\n\t"
  108405. "movs r4, #0\n\t"
  108406. "# a[i] += m[0] * mu\n\t"
  108407. "ldm %[m]!, {%[mp]}\n\t"
  108408. "ldm %[a]!, {r3}\n\t"
  108409. "# mu = a[i] * mp\n\t"
  108410. "mov r5, r8\n\t"
  108411. #ifdef WOLFSSL_KEIL
  108412. "muls r5, r3, r5\n\t"
  108413. #elif defined(__clang__)
  108414. "muls r5, r3\n\t"
  108415. #else
  108416. "mul r5, r3\n\t"
  108417. #endif
  108418. "mov r10, r5\n\t"
  108419. "# Multiply m[0] and mu - Start\n\t"
  108420. "mov r5, r10\n\t"
  108421. "uxth r6, %[mp]\n\t"
  108422. "uxth r5, r5\n\t"
  108423. #ifdef WOLFSSL_KEIL
  108424. "muls r6, r5, r6\n\t"
  108425. #elif defined(__clang__)
  108426. "muls r6, r5\n\t"
  108427. #else
  108428. "mul r6, r5\n\t"
  108429. #endif
  108430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108431. "adds r3, r3, r6\n\t"
  108432. #else
  108433. "add r3, r3, r6\n\t"
  108434. #endif
  108435. #ifdef WOLFSSL_KEIL
  108436. "adcs r4, r4, r7\n\t"
  108437. #elif defined(__clang__)
  108438. "adcs r4, r7\n\t"
  108439. #else
  108440. "adc r4, r7\n\t"
  108441. #endif
  108442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108443. "lsrs r6, %[mp], #16\n\t"
  108444. #else
  108445. "lsr r6, %[mp], #16\n\t"
  108446. #endif
  108447. #ifdef WOLFSSL_KEIL
  108448. "muls r5, r6, r5\n\t"
  108449. #elif defined(__clang__)
  108450. "muls r5, r6\n\t"
  108451. #else
  108452. "mul r5, r6\n\t"
  108453. #endif
  108454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108455. "lsrs r6, r5, #16\n\t"
  108456. #else
  108457. "lsr r6, r5, #16\n\t"
  108458. #endif
  108459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108460. "lsls r5, r5, #16\n\t"
  108461. #else
  108462. "lsl r5, r5, #16\n\t"
  108463. #endif
  108464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108465. "adds r3, r3, r5\n\t"
  108466. #else
  108467. "add r3, r3, r5\n\t"
  108468. #endif
  108469. #ifdef WOLFSSL_KEIL
  108470. "adcs r4, r4, r6\n\t"
  108471. #elif defined(__clang__)
  108472. "adcs r4, r6\n\t"
  108473. #else
  108474. "adc r4, r6\n\t"
  108475. #endif
  108476. "mov r5, r10\n\t"
  108477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108478. "lsrs r6, %[mp], #16\n\t"
  108479. #else
  108480. "lsr r6, %[mp], #16\n\t"
  108481. #endif
  108482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108483. "lsrs r5, r5, #16\n\t"
  108484. #else
  108485. "lsr r5, r5, #16\n\t"
  108486. #endif
  108487. #ifdef WOLFSSL_KEIL
  108488. "muls r6, r5, r6\n\t"
  108489. #elif defined(__clang__)
  108490. "muls r6, r5\n\t"
  108491. #else
  108492. "mul r6, r5\n\t"
  108493. #endif
  108494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108495. "adds r4, r4, r6\n\t"
  108496. #else
  108497. "add r4, r4, r6\n\t"
  108498. #endif
  108499. "uxth r6, %[mp]\n\t"
  108500. #ifdef WOLFSSL_KEIL
  108501. "muls r5, r6, r5\n\t"
  108502. #elif defined(__clang__)
  108503. "muls r5, r6\n\t"
  108504. #else
  108505. "mul r5, r6\n\t"
  108506. #endif
  108507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108508. "lsrs r6, r5, #16\n\t"
  108509. #else
  108510. "lsr r6, r5, #16\n\t"
  108511. #endif
  108512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108513. "lsls r5, r5, #16\n\t"
  108514. #else
  108515. "lsl r5, r5, #16\n\t"
  108516. #endif
  108517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108518. "adds r3, r3, r5\n\t"
  108519. #else
  108520. "add r3, r3, r5\n\t"
  108521. #endif
  108522. #ifdef WOLFSSL_KEIL
  108523. "adcs r4, r4, r6\n\t"
  108524. #elif defined(__clang__)
  108525. "adcs r4, r6\n\t"
  108526. #else
  108527. "adc r4, r6\n\t"
  108528. #endif
  108529. "# Multiply m[0] and mu - Done\n\t"
  108530. "\n"
  108531. "L_sp_384_mont_reduce_12_word_%=:\n\t"
  108532. "# a[i+j] += m[j] * mu\n\t"
  108533. "ldr r3, [%[a]]\n\t"
  108534. "ldm %[m]!, {%[mp]}\n\t"
  108535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108536. "adds r3, r3, r4\n\t"
  108537. #else
  108538. "add r3, r3, r4\n\t"
  108539. #endif
  108540. "movs r4, #0\n\t"
  108541. #ifdef WOLFSSL_KEIL
  108542. "adcs r4, r4, r7\n\t"
  108543. #elif defined(__clang__)
  108544. "adcs r4, r7\n\t"
  108545. #else
  108546. "adc r4, r7\n\t"
  108547. #endif
  108548. "# Multiply m[j] and mu - Start\n\t"
  108549. "mov r5, r10\n\t"
  108550. "uxth r6, %[mp]\n\t"
  108551. "uxth r5, r5\n\t"
  108552. #ifdef WOLFSSL_KEIL
  108553. "muls r6, r5, r6\n\t"
  108554. #elif defined(__clang__)
  108555. "muls r6, r5\n\t"
  108556. #else
  108557. "mul r6, r5\n\t"
  108558. #endif
  108559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108560. "adds r3, r3, r6\n\t"
  108561. #else
  108562. "add r3, r3, r6\n\t"
  108563. #endif
  108564. #ifdef WOLFSSL_KEIL
  108565. "adcs r4, r4, r7\n\t"
  108566. #elif defined(__clang__)
  108567. "adcs r4, r7\n\t"
  108568. #else
  108569. "adc r4, r7\n\t"
  108570. #endif
  108571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108572. "lsrs r6, %[mp], #16\n\t"
  108573. #else
  108574. "lsr r6, %[mp], #16\n\t"
  108575. #endif
  108576. #ifdef WOLFSSL_KEIL
  108577. "muls r5, r6, r5\n\t"
  108578. #elif defined(__clang__)
  108579. "muls r5, r6\n\t"
  108580. #else
  108581. "mul r5, r6\n\t"
  108582. #endif
  108583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108584. "lsrs r6, r5, #16\n\t"
  108585. #else
  108586. "lsr r6, r5, #16\n\t"
  108587. #endif
  108588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108589. "lsls r5, r5, #16\n\t"
  108590. #else
  108591. "lsl r5, r5, #16\n\t"
  108592. #endif
  108593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108594. "adds r3, r3, r5\n\t"
  108595. #else
  108596. "add r3, r3, r5\n\t"
  108597. #endif
  108598. #ifdef WOLFSSL_KEIL
  108599. "adcs r4, r4, r6\n\t"
  108600. #elif defined(__clang__)
  108601. "adcs r4, r6\n\t"
  108602. #else
  108603. "adc r4, r6\n\t"
  108604. #endif
  108605. "mov r5, r10\n\t"
  108606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108607. "lsrs r6, %[mp], #16\n\t"
  108608. #else
  108609. "lsr r6, %[mp], #16\n\t"
  108610. #endif
  108611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108612. "lsrs r5, r5, #16\n\t"
  108613. #else
  108614. "lsr r5, r5, #16\n\t"
  108615. #endif
  108616. #ifdef WOLFSSL_KEIL
  108617. "muls r6, r5, r6\n\t"
  108618. #elif defined(__clang__)
  108619. "muls r6, r5\n\t"
  108620. #else
  108621. "mul r6, r5\n\t"
  108622. #endif
  108623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108624. "adds r4, r4, r6\n\t"
  108625. #else
  108626. "add r4, r4, r6\n\t"
  108627. #endif
  108628. "uxth r6, %[mp]\n\t"
  108629. #ifdef WOLFSSL_KEIL
  108630. "muls r5, r6, r5\n\t"
  108631. #elif defined(__clang__)
  108632. "muls r5, r6\n\t"
  108633. #else
  108634. "mul r5, r6\n\t"
  108635. #endif
  108636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108637. "lsrs r6, r5, #16\n\t"
  108638. #else
  108639. "lsr r6, r5, #16\n\t"
  108640. #endif
  108641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108642. "lsls r5, r5, #16\n\t"
  108643. #else
  108644. "lsl r5, r5, #16\n\t"
  108645. #endif
  108646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108647. "adds r3, r3, r5\n\t"
  108648. #else
  108649. "add r3, r3, r5\n\t"
  108650. #endif
  108651. #ifdef WOLFSSL_KEIL
  108652. "adcs r4, r4, r6\n\t"
  108653. #elif defined(__clang__)
  108654. "adcs r4, r6\n\t"
  108655. #else
  108656. "adc r4, r6\n\t"
  108657. #endif
  108658. "# Multiply m[j] and mu - Done\n\t"
  108659. "stm %[a]!, {r3}\n\t"
  108660. "cmp %[a], r9\n\t"
  108661. "blt L_sp_384_mont_reduce_12_word_%=\n\t"
  108662. "# a[i+11] += m[11] * mu\n\t"
  108663. "ldr %[mp], [%[m]]\n\t"
  108664. "mov r3, r12\n\t"
  108665. "# Multiply m[11] and mu - Start\n\t"
  108666. "mov r5, r10\n\t"
  108667. "uxth r6, %[mp]\n\t"
  108668. "uxth r5, r5\n\t"
  108669. #ifdef WOLFSSL_KEIL
  108670. "muls r6, r5, r6\n\t"
  108671. #elif defined(__clang__)
  108672. "muls r6, r5\n\t"
  108673. #else
  108674. "mul r6, r5\n\t"
  108675. #endif
  108676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108677. "adds r4, r4, r6\n\t"
  108678. #else
  108679. "add r4, r4, r6\n\t"
  108680. #endif
  108681. #ifdef WOLFSSL_KEIL
  108682. "adcs r3, r3, r7\n\t"
  108683. #elif defined(__clang__)
  108684. "adcs r3, r7\n\t"
  108685. #else
  108686. "adc r3, r7\n\t"
  108687. #endif
  108688. #ifdef WOLFSSL_KEIL
  108689. "adcs r7, r7, r7\n\t"
  108690. #elif defined(__clang__)
  108691. "adcs r7, r7\n\t"
  108692. #else
  108693. "adc r7, r7\n\t"
  108694. #endif
  108695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108696. "lsrs r6, %[mp], #16\n\t"
  108697. #else
  108698. "lsr r6, %[mp], #16\n\t"
  108699. #endif
  108700. #ifdef WOLFSSL_KEIL
  108701. "muls r5, r6, r5\n\t"
  108702. #elif defined(__clang__)
  108703. "muls r5, r6\n\t"
  108704. #else
  108705. "mul r5, r6\n\t"
  108706. #endif
  108707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108708. "lsrs r6, r5, #16\n\t"
  108709. #else
  108710. "lsr r6, r5, #16\n\t"
  108711. #endif
  108712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108713. "lsls r5, r5, #16\n\t"
  108714. #else
  108715. "lsl r5, r5, #16\n\t"
  108716. #endif
  108717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108718. "adds r4, r4, r5\n\t"
  108719. #else
  108720. "add r4, r4, r5\n\t"
  108721. #endif
  108722. #ifdef WOLFSSL_KEIL
  108723. "adcs r3, r3, r6\n\t"
  108724. #elif defined(__clang__)
  108725. "adcs r3, r6\n\t"
  108726. #else
  108727. "adc r3, r6\n\t"
  108728. #endif
  108729. #ifdef WOLFSSL_KEIL
  108730. "adcs r7, r7, r7\n\t"
  108731. #elif defined(__clang__)
  108732. "adcs r7, r7\n\t"
  108733. #else
  108734. "adc r7, r7\n\t"
  108735. #endif
  108736. "mov r5, r10\n\t"
  108737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108738. "lsrs r6, %[mp], #16\n\t"
  108739. #else
  108740. "lsr r6, %[mp], #16\n\t"
  108741. #endif
  108742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108743. "lsrs r5, r5, #16\n\t"
  108744. #else
  108745. "lsr r5, r5, #16\n\t"
  108746. #endif
  108747. #ifdef WOLFSSL_KEIL
  108748. "muls r6, r5, r6\n\t"
  108749. #elif defined(__clang__)
  108750. "muls r6, r5\n\t"
  108751. #else
  108752. "mul r6, r5\n\t"
  108753. #endif
  108754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108755. "adds r3, r3, r6\n\t"
  108756. #else
  108757. "add r3, r3, r6\n\t"
  108758. #endif
  108759. #ifdef WOLFSSL_KEIL
  108760. "adcs r7, r7, r7\n\t"
  108761. #elif defined(__clang__)
  108762. "adcs r7, r7\n\t"
  108763. #else
  108764. "adc r7, r7\n\t"
  108765. #endif
  108766. "uxth r6, %[mp]\n\t"
  108767. #ifdef WOLFSSL_KEIL
  108768. "muls r5, r6, r5\n\t"
  108769. #elif defined(__clang__)
  108770. "muls r5, r6\n\t"
  108771. #else
  108772. "mul r5, r6\n\t"
  108773. #endif
  108774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108775. "lsrs r6, r5, #16\n\t"
  108776. #else
  108777. "lsr r6, r5, #16\n\t"
  108778. #endif
  108779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108780. "lsls r5, r5, #16\n\t"
  108781. #else
  108782. "lsl r5, r5, #16\n\t"
  108783. #endif
  108784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108785. "adds r4, r4, r5\n\t"
  108786. #else
  108787. "add r4, r4, r5\n\t"
  108788. #endif
  108789. #ifdef WOLFSSL_KEIL
  108790. "adcs r3, r3, r6\n\t"
  108791. #elif defined(__clang__)
  108792. "adcs r3, r6\n\t"
  108793. #else
  108794. "adc r3, r6\n\t"
  108795. #endif
  108796. #ifdef WOLFSSL_KEIL
  108797. "adcs r7, r7, r7\n\t"
  108798. #elif defined(__clang__)
  108799. "adcs r7, r7\n\t"
  108800. #else
  108801. "adc r7, r7\n\t"
  108802. #endif
  108803. "# Multiply m[11] and mu - Done\n\t"
  108804. "ldr r5, [%[a]]\n\t"
  108805. "ldr r6, [%[a], #4]\n\t"
  108806. "movs %[mp], #0\n\t"
  108807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108808. "adds r5, r5, r4\n\t"
  108809. #else
  108810. "add r5, r5, r4\n\t"
  108811. #endif
  108812. #ifdef WOLFSSL_KEIL
  108813. "adcs r6, r6, r3\n\t"
  108814. #elif defined(__clang__)
  108815. "adcs r6, r3\n\t"
  108816. #else
  108817. "adc r6, r3\n\t"
  108818. #endif
  108819. #ifdef WOLFSSL_KEIL
  108820. "adcs r7, r7, %[mp]\n\t"
  108821. #elif defined(__clang__)
  108822. "adcs r7, %[mp]\n\t"
  108823. #else
  108824. "adc r7, %[mp]\n\t"
  108825. #endif
  108826. "stm %[a]!, {r5, r6}\n\t"
  108827. "# i += 1\n\t"
  108828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108829. "subs %[a], %[a], #4\n\t"
  108830. #else
  108831. "sub %[a], %[a], #4\n\t"
  108832. #endif
  108833. "movs r3, #44\n\t"
  108834. "mov r9, %[a]\n\t"
  108835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108836. "subs %[a], %[a], r3\n\t"
  108837. #else
  108838. "sub %[a], %[a], r3\n\t"
  108839. #endif
  108840. "mov r12, r7\n\t"
  108841. "mov %[m], lr\n\t"
  108842. "cmp r11, %[a]\n\t"
  108843. "bgt L_sp_384_mont_reduce_12_mod_%=\n\t"
  108844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108845. "negs r7, r7\n\t"
  108846. #else
  108847. "neg r7, r7\n\t"
  108848. #endif
  108849. "# Subtract masked modulus\n\t"
  108850. "movs r4, #48\n\t"
  108851. "movs %[mp], #0\n\t"
  108852. "movs r3, #0\n\t"
  108853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108854. "subs %[a], %[a], r4\n\t"
  108855. #else
  108856. "sub %[a], %[a], r4\n\t"
  108857. #endif
  108858. #ifndef WOLFSSL_SP_LARGE_CODE
  108859. "\n"
  108860. "L_sp_384_mont_reduce_12_sub_mask_%=:\n\t"
  108861. "ldm %[m]!, {r6}\n\t"
  108862. "movs r5, #0\n\t"
  108863. #ifdef WOLFSSL_KEIL
  108864. "ands r6, r6, r7\n\t"
  108865. #elif defined(__clang__)
  108866. "ands r6, r7\n\t"
  108867. #else
  108868. "and r6, r7\n\t"
  108869. #endif
  108870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108871. "subs r5, r5, %[mp]\n\t"
  108872. #else
  108873. "sub r5, r5, %[mp]\n\t"
  108874. #endif
  108875. "ldr r5, [%[a], r4]\n\t"
  108876. #ifdef WOLFSSL_KEIL
  108877. "sbcs r5, r5, r6\n\t"
  108878. #elif defined(__clang__)
  108879. "sbcs r5, r6\n\t"
  108880. #else
  108881. "sbc r5, r6\n\t"
  108882. #endif
  108883. #ifdef WOLFSSL_KEIL
  108884. "sbcs %[mp], %[mp], %[mp]\n\t"
  108885. #elif defined(__clang__)
  108886. "sbcs %[mp], %[mp]\n\t"
  108887. #else
  108888. "sbc %[mp], %[mp]\n\t"
  108889. #endif
  108890. "stm %[a]!, {r5}\n\t"
  108891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108892. "adds r3, r3, #4\n\t"
  108893. #else
  108894. "add r3, r3, #4\n\t"
  108895. #endif
  108896. "cmp r3, r4\n\t"
  108897. "blt L_sp_384_mont_reduce_12_sub_mask_%=\n\t"
  108898. #else /* WOLFSSL_SP_LARGE_CODE */
  108899. "ldm %[m]!, {r6}\n\t"
  108900. #ifdef WOLFSSL_KEIL
  108901. "ands r6, r6, r7\n\t"
  108902. #elif defined(__clang__)
  108903. "ands r6, r7\n\t"
  108904. #else
  108905. "and r6, r7\n\t"
  108906. #endif
  108907. "ldr r5, [%[a], r4]\n\t"
  108908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108909. "subs r5, r5, r6\n\t"
  108910. #else
  108911. "sub r5, r5, r6\n\t"
  108912. #endif
  108913. "stm %[a]!, {r5}\n\t"
  108914. "ldm %[m]!, {r6}\n\t"
  108915. #ifdef WOLFSSL_KEIL
  108916. "ands r6, r6, r7\n\t"
  108917. #elif defined(__clang__)
  108918. "ands r6, r7\n\t"
  108919. #else
  108920. "and r6, r7\n\t"
  108921. #endif
  108922. "ldr r5, [%[a], r4]\n\t"
  108923. #ifdef WOLFSSL_KEIL
  108924. "sbcs r5, r5, r6\n\t"
  108925. #elif defined(__clang__)
  108926. "sbcs r5, r6\n\t"
  108927. #else
  108928. "sbc r5, r6\n\t"
  108929. #endif
  108930. "stm %[a]!, {r5}\n\t"
  108931. "ldm %[m]!, {r6}\n\t"
  108932. #ifdef WOLFSSL_KEIL
  108933. "ands r6, r6, r7\n\t"
  108934. #elif defined(__clang__)
  108935. "ands r6, r7\n\t"
  108936. #else
  108937. "and r6, r7\n\t"
  108938. #endif
  108939. "ldr r5, [%[a], r4]\n\t"
  108940. #ifdef WOLFSSL_KEIL
  108941. "sbcs r5, r5, r6\n\t"
  108942. #elif defined(__clang__)
  108943. "sbcs r5, r6\n\t"
  108944. #else
  108945. "sbc r5, r6\n\t"
  108946. #endif
  108947. "stm %[a]!, {r5}\n\t"
  108948. "ldm %[m]!, {r6}\n\t"
  108949. #ifdef WOLFSSL_KEIL
  108950. "ands r6, r6, r7\n\t"
  108951. #elif defined(__clang__)
  108952. "ands r6, r7\n\t"
  108953. #else
  108954. "and r6, r7\n\t"
  108955. #endif
  108956. "ldr r5, [%[a], r4]\n\t"
  108957. #ifdef WOLFSSL_KEIL
  108958. "sbcs r5, r5, r6\n\t"
  108959. #elif defined(__clang__)
  108960. "sbcs r5, r6\n\t"
  108961. #else
  108962. "sbc r5, r6\n\t"
  108963. #endif
  108964. "stm %[a]!, {r5}\n\t"
  108965. "ldm %[m]!, {r6}\n\t"
  108966. #ifdef WOLFSSL_KEIL
  108967. "ands r6, r6, r7\n\t"
  108968. #elif defined(__clang__)
  108969. "ands r6, r7\n\t"
  108970. #else
  108971. "and r6, r7\n\t"
  108972. #endif
  108973. "ldr r5, [%[a], r4]\n\t"
  108974. #ifdef WOLFSSL_KEIL
  108975. "sbcs r5, r5, r6\n\t"
  108976. #elif defined(__clang__)
  108977. "sbcs r5, r6\n\t"
  108978. #else
  108979. "sbc r5, r6\n\t"
  108980. #endif
  108981. "stm %[a]!, {r5}\n\t"
  108982. "ldm %[m]!, {r6}\n\t"
  108983. #ifdef WOLFSSL_KEIL
  108984. "ands r6, r6, r7\n\t"
  108985. #elif defined(__clang__)
  108986. "ands r6, r7\n\t"
  108987. #else
  108988. "and r6, r7\n\t"
  108989. #endif
  108990. "ldr r5, [%[a], r4]\n\t"
  108991. #ifdef WOLFSSL_KEIL
  108992. "sbcs r5, r5, r6\n\t"
  108993. #elif defined(__clang__)
  108994. "sbcs r5, r6\n\t"
  108995. #else
  108996. "sbc r5, r6\n\t"
  108997. #endif
  108998. "stm %[a]!, {r5}\n\t"
  108999. "ldm %[m]!, {r6}\n\t"
  109000. #ifdef WOLFSSL_KEIL
  109001. "ands r6, r6, r7\n\t"
  109002. #elif defined(__clang__)
  109003. "ands r6, r7\n\t"
  109004. #else
  109005. "and r6, r7\n\t"
  109006. #endif
  109007. "ldr r5, [%[a], r4]\n\t"
  109008. #ifdef WOLFSSL_KEIL
  109009. "sbcs r5, r5, r6\n\t"
  109010. #elif defined(__clang__)
  109011. "sbcs r5, r6\n\t"
  109012. #else
  109013. "sbc r5, r6\n\t"
  109014. #endif
  109015. "stm %[a]!, {r5}\n\t"
  109016. "ldm %[m]!, {r6}\n\t"
  109017. #ifdef WOLFSSL_KEIL
  109018. "ands r6, r6, r7\n\t"
  109019. #elif defined(__clang__)
  109020. "ands r6, r7\n\t"
  109021. #else
  109022. "and r6, r7\n\t"
  109023. #endif
  109024. "ldr r5, [%[a], r4]\n\t"
  109025. #ifdef WOLFSSL_KEIL
  109026. "sbcs r5, r5, r6\n\t"
  109027. #elif defined(__clang__)
  109028. "sbcs r5, r6\n\t"
  109029. #else
  109030. "sbc r5, r6\n\t"
  109031. #endif
  109032. "stm %[a]!, {r5}\n\t"
  109033. "ldm %[m]!, {r6}\n\t"
  109034. #ifdef WOLFSSL_KEIL
  109035. "ands r6, r6, r7\n\t"
  109036. #elif defined(__clang__)
  109037. "ands r6, r7\n\t"
  109038. #else
  109039. "and r6, r7\n\t"
  109040. #endif
  109041. "ldr r5, [%[a], r4]\n\t"
  109042. #ifdef WOLFSSL_KEIL
  109043. "sbcs r5, r5, r6\n\t"
  109044. #elif defined(__clang__)
  109045. "sbcs r5, r6\n\t"
  109046. #else
  109047. "sbc r5, r6\n\t"
  109048. #endif
  109049. "stm %[a]!, {r5}\n\t"
  109050. "ldm %[m]!, {r6}\n\t"
  109051. #ifdef WOLFSSL_KEIL
  109052. "ands r6, r6, r7\n\t"
  109053. #elif defined(__clang__)
  109054. "ands r6, r7\n\t"
  109055. #else
  109056. "and r6, r7\n\t"
  109057. #endif
  109058. "ldr r5, [%[a], r4]\n\t"
  109059. #ifdef WOLFSSL_KEIL
  109060. "sbcs r5, r5, r6\n\t"
  109061. #elif defined(__clang__)
  109062. "sbcs r5, r6\n\t"
  109063. #else
  109064. "sbc r5, r6\n\t"
  109065. #endif
  109066. "stm %[a]!, {r5}\n\t"
  109067. "ldm %[m]!, {r6}\n\t"
  109068. #ifdef WOLFSSL_KEIL
  109069. "ands r6, r6, r7\n\t"
  109070. #elif defined(__clang__)
  109071. "ands r6, r7\n\t"
  109072. #else
  109073. "and r6, r7\n\t"
  109074. #endif
  109075. "ldr r5, [%[a], r4]\n\t"
  109076. #ifdef WOLFSSL_KEIL
  109077. "sbcs r5, r5, r6\n\t"
  109078. #elif defined(__clang__)
  109079. "sbcs r5, r6\n\t"
  109080. #else
  109081. "sbc r5, r6\n\t"
  109082. #endif
  109083. "stm %[a]!, {r5}\n\t"
  109084. "ldm %[m]!, {r6}\n\t"
  109085. #ifdef WOLFSSL_KEIL
  109086. "ands r6, r6, r7\n\t"
  109087. #elif defined(__clang__)
  109088. "ands r6, r7\n\t"
  109089. #else
  109090. "and r6, r7\n\t"
  109091. #endif
  109092. "ldr r5, [%[a], r4]\n\t"
  109093. #ifdef WOLFSSL_KEIL
  109094. "sbcs r5, r5, r6\n\t"
  109095. #elif defined(__clang__)
  109096. "sbcs r5, r6\n\t"
  109097. #else
  109098. "sbc r5, r6\n\t"
  109099. #endif
  109100. "stm %[a]!, {r5}\n\t"
  109101. #endif /* WOLFSSL_SP_LARGE_CODE */
  109102. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  109103. :
  109104. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  109105. );
  109106. }
  109107. /* Multiply two Montgomery form numbers mod the modulus (prime).
  109108. * (r = a * b mod m)
  109109. *
  109110. * r Result of multiplication.
  109111. * a First number to multiply in Montgomery form.
  109112. * b Second number to multiply in Montgomery form.
  109113. * m Modulus (prime).
  109114. * mp Montgomery multiplier.
  109115. */
  109116. SP_NOINLINE static void sp_384_mont_mul_12(sp_digit* r, const sp_digit* a,
  109117. const sp_digit* b, const sp_digit* m, sp_digit mp)
  109118. {
  109119. sp_384_mul_12(r, a, b);
  109120. sp_384_mont_reduce_12(r, m, mp);
  109121. }
  109122. /* Square the Montgomery form number. (r = a * a mod m)
  109123. *
  109124. * r Result of squaring.
  109125. * a Number to square in Montgomery form.
  109126. * m Modulus (prime).
  109127. * mp Montgomery multiplier.
  109128. */
  109129. SP_NOINLINE static void sp_384_mont_sqr_12(sp_digit* r, const sp_digit* a,
  109130. const sp_digit* m, sp_digit mp)
  109131. {
  109132. sp_384_sqr_12(r, a);
  109133. sp_384_mont_reduce_12(r, m, mp);
  109134. }
  109135. #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
  109136. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  109137. *
  109138. * r Result of squaring.
  109139. * a Number to square in Montgomery form.
  109140. * n Number of times to square.
  109141. * m Modulus (prime).
  109142. * mp Montgomery multiplier.
  109143. */
  109144. SP_NOINLINE static void sp_384_mont_sqr_n_12(sp_digit* r,
  109145. const sp_digit* a, int n, const sp_digit* m, sp_digit mp)
  109146. {
  109147. sp_384_mont_sqr_12(r, a, m, mp);
  109148. for (; n > 1; n--) {
  109149. sp_384_mont_sqr_12(r, r, m, mp);
  109150. }
  109151. }
  109152. #endif /* !WOLFSSL_SP_SMALL || HAVE_COMP_KEY */
  109153. #ifdef WOLFSSL_SP_SMALL
  109154. /* Mod-2 for the P384 curve. */
  109155. static const uint32_t p384_mod_minus_2[12] = {
  109156. 0xfffffffdU,0x00000000U,0x00000000U,0xffffffffU,0xfffffffeU,0xffffffffU,
  109157. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU
  109158. };
  109159. #endif /* !WOLFSSL_SP_SMALL */
  109160. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  109161. * P384 curve. (r = 1 / a mod m)
  109162. *
  109163. * r Inverse result.
  109164. * a Number to invert.
  109165. * td Temporary data.
  109166. */
  109167. static void sp_384_mont_inv_12(sp_digit* r, const sp_digit* a, sp_digit* td)
  109168. {
  109169. #ifdef WOLFSSL_SP_SMALL
  109170. sp_digit* t = td;
  109171. int i;
  109172. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  109173. for (i=382; i>=0; i--) {
  109174. sp_384_mont_sqr_12(t, t, p384_mod, p384_mp_mod);
  109175. if (p384_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  109176. sp_384_mont_mul_12(t, t, a, p384_mod, p384_mp_mod);
  109177. }
  109178. XMEMCPY(r, t, sizeof(sp_digit) * 12);
  109179. #else
  109180. sp_digit* t1 = td;
  109181. sp_digit* t2 = td + 2 * 12;
  109182. sp_digit* t3 = td + 4 * 12;
  109183. sp_digit* t4 = td + 6 * 12;
  109184. sp_digit* t5 = td + 8 * 12;
  109185. /* 0x2 */
  109186. sp_384_mont_sqr_12(t1, a, p384_mod, p384_mp_mod);
  109187. /* 0x3 */
  109188. sp_384_mont_mul_12(t5, t1, a, p384_mod, p384_mp_mod);
  109189. /* 0xc */
  109190. sp_384_mont_sqr_n_12(t1, t5, 2, p384_mod, p384_mp_mod);
  109191. /* 0xf */
  109192. sp_384_mont_mul_12(t2, t5, t1, p384_mod, p384_mp_mod);
  109193. /* 0x1e */
  109194. sp_384_mont_sqr_12(t1, t2, p384_mod, p384_mp_mod);
  109195. /* 0x1f */
  109196. sp_384_mont_mul_12(t4, t1, a, p384_mod, p384_mp_mod);
  109197. /* 0x3e0 */
  109198. sp_384_mont_sqr_n_12(t1, t4, 5, p384_mod, p384_mp_mod);
  109199. /* 0x3ff */
  109200. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  109201. /* 0x7fe0 */
  109202. sp_384_mont_sqr_n_12(t1, t2, 5, p384_mod, p384_mp_mod);
  109203. /* 0x7fff */
  109204. sp_384_mont_mul_12(t4, t4, t1, p384_mod, p384_mp_mod);
  109205. /* 0x3fff8000 */
  109206. sp_384_mont_sqr_n_12(t1, t4, 15, p384_mod, p384_mp_mod);
  109207. /* 0x3fffffff */
  109208. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  109209. /* 0xfffffffc */
  109210. sp_384_mont_sqr_n_12(t3, t2, 2, p384_mod, p384_mp_mod);
  109211. /* 0xfffffffd */
  109212. sp_384_mont_mul_12(r, t3, a, p384_mod, p384_mp_mod);
  109213. /* 0xffffffff */
  109214. sp_384_mont_mul_12(t3, t5, t3, p384_mod, p384_mp_mod);
  109215. /* 0xfffffffc0000000 */
  109216. sp_384_mont_sqr_n_12(t1, t2, 30, p384_mod, p384_mp_mod);
  109217. /* 0xfffffffffffffff */
  109218. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  109219. /* 0xfffffffffffffff000000000000000 */
  109220. sp_384_mont_sqr_n_12(t1, t2, 60, p384_mod, p384_mp_mod);
  109221. /* 0xffffffffffffffffffffffffffffff */
  109222. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  109223. /* 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
  109224. sp_384_mont_sqr_n_12(t1, t2, 120, p384_mod, p384_mp_mod);
  109225. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  109226. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  109227. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
  109228. sp_384_mont_sqr_n_12(t1, t2, 15, p384_mod, p384_mp_mod);
  109229. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  109230. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  109231. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000 */
  109232. sp_384_mont_sqr_n_12(t1, t2, 33, p384_mod, p384_mp_mod);
  109233. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff */
  109234. sp_384_mont_mul_12(t2, t3, t1, p384_mod, p384_mp_mod);
  109235. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000000000000 */
  109236. sp_384_mont_sqr_n_12(t1, t2, 96, p384_mod, p384_mp_mod);
  109237. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffd */
  109238. sp_384_mont_mul_12(r, r, t1, p384_mod, p384_mp_mod);
  109239. #endif /* WOLFSSL_SP_SMALL */
  109240. }
  109241. /* Compare a with b in constant time.
  109242. *
  109243. * a A single precision integer.
  109244. * b A single precision integer.
  109245. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  109246. * respectively.
  109247. */
  109248. SP_NOINLINE static sp_int32 sp_384_cmp_12(const sp_digit* a, const sp_digit* b)
  109249. {
  109250. __asm__ __volatile__ (
  109251. "movs r2, #0\n\t"
  109252. "movs r3, #0\n\t"
  109253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109254. "mvns r3, r3\n\t"
  109255. #else
  109256. "mvn r3, r3\n\t"
  109257. #endif
  109258. "movs r6, #44\n\t"
  109259. "\n"
  109260. "L_sp_384_cmp_12_words_%=:\n\t"
  109261. "ldr r7, [%[a], r6]\n\t"
  109262. "ldr r5, [%[b], r6]\n\t"
  109263. #ifdef WOLFSSL_KEIL
  109264. "ands r7, r7, r3\n\t"
  109265. #elif defined(__clang__)
  109266. "ands r7, r3\n\t"
  109267. #else
  109268. "and r7, r3\n\t"
  109269. #endif
  109270. #ifdef WOLFSSL_KEIL
  109271. "ands r5, r5, r3\n\t"
  109272. #elif defined(__clang__)
  109273. "ands r5, r3\n\t"
  109274. #else
  109275. "and r5, r3\n\t"
  109276. #endif
  109277. "movs r4, r7\n\t"
  109278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109279. "subs r7, r7, r5\n\t"
  109280. #else
  109281. "sub r7, r7, r5\n\t"
  109282. #endif
  109283. #ifdef WOLFSSL_KEIL
  109284. "sbcs r7, r7, r7\n\t"
  109285. #elif defined(__clang__)
  109286. "sbcs r7, r7\n\t"
  109287. #else
  109288. "sbc r7, r7\n\t"
  109289. #endif
  109290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109291. "adds r2, r2, r7\n\t"
  109292. #else
  109293. "add r2, r2, r7\n\t"
  109294. #endif
  109295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109296. "mvns r7, r7\n\t"
  109297. #else
  109298. "mvn r7, r7\n\t"
  109299. #endif
  109300. #ifdef WOLFSSL_KEIL
  109301. "ands r3, r3, r7\n\t"
  109302. #elif defined(__clang__)
  109303. "ands r3, r7\n\t"
  109304. #else
  109305. "and r3, r7\n\t"
  109306. #endif
  109307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109308. "subs r5, r5, r4\n\t"
  109309. #else
  109310. "sub r5, r5, r4\n\t"
  109311. #endif
  109312. #ifdef WOLFSSL_KEIL
  109313. "sbcs r7, r7, r7\n\t"
  109314. #elif defined(__clang__)
  109315. "sbcs r7, r7\n\t"
  109316. #else
  109317. "sbc r7, r7\n\t"
  109318. #endif
  109319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109320. "subs r2, r2, r7\n\t"
  109321. #else
  109322. "sub r2, r2, r7\n\t"
  109323. #endif
  109324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109325. "mvns r7, r7\n\t"
  109326. #else
  109327. "mvn r7, r7\n\t"
  109328. #endif
  109329. #ifdef WOLFSSL_KEIL
  109330. "ands r3, r3, r7\n\t"
  109331. #elif defined(__clang__)
  109332. "ands r3, r7\n\t"
  109333. #else
  109334. "and r3, r7\n\t"
  109335. #endif
  109336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109337. "subs r6, r6, #4\n\t"
  109338. #else
  109339. "sub r6, r6, #4\n\t"
  109340. #endif
  109341. "bge L_sp_384_cmp_12_words_%=\n\t"
  109342. "movs %[a], r2\n\t"
  109343. : [a] "+l" (a), [b] "+l" (b)
  109344. :
  109345. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  109346. );
  109347. return (uint32_t)(size_t)a;
  109348. }
  109349. /* Normalize the values in each word to 32.
  109350. *
  109351. * a Array of sp_digit to normalize.
  109352. */
  109353. #define sp_384_norm_12(a)
  109354. /* Map the Montgomery form projective coordinate point to an affine point.
  109355. *
  109356. * r Resulting affine coordinate point.
  109357. * p Montgomery form projective coordinate point.
  109358. * t Temporary ordinate data.
  109359. */
  109360. static void sp_384_map_12(sp_point_384* r, const sp_point_384* p,
  109361. sp_digit* t)
  109362. {
  109363. sp_digit* t1 = t;
  109364. sp_digit* t2 = t + 2*12;
  109365. sp_int32 n;
  109366. sp_384_mont_inv_12(t1, p->z, t + 2*12);
  109367. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  109368. sp_384_mont_mul_12(t1, t2, t1, p384_mod, p384_mp_mod);
  109369. /* x /= z^2 */
  109370. sp_384_mont_mul_12(r->x, p->x, t2, p384_mod, p384_mp_mod);
  109371. XMEMSET(r->x + 12, 0, sizeof(sp_digit) * 12U);
  109372. sp_384_mont_reduce_12(r->x, p384_mod, p384_mp_mod);
  109373. /* Reduce x to less than modulus */
  109374. n = sp_384_cmp_12(r->x, p384_mod);
  109375. sp_384_cond_sub_12(r->x, r->x, p384_mod, ~(n >> 31));
  109376. sp_384_norm_12(r->x);
  109377. /* y /= z^3 */
  109378. sp_384_mont_mul_12(r->y, p->y, t1, p384_mod, p384_mp_mod);
  109379. XMEMSET(r->y + 12, 0, sizeof(sp_digit) * 12U);
  109380. sp_384_mont_reduce_12(r->y, p384_mod, p384_mp_mod);
  109381. /* Reduce y to less than modulus */
  109382. n = sp_384_cmp_12(r->y, p384_mod);
  109383. sp_384_cond_sub_12(r->y, r->y, p384_mod, ~(n >> 31));
  109384. sp_384_norm_12(r->y);
  109385. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  109386. r->z[0] = 1;
  109387. }
  109388. /* Add two Montgomery form numbers (r = a + b % m).
  109389. *
  109390. * r Result of addition.
  109391. * a First number to add in Montgomery form.
  109392. * b Second number to add in Montgomery form.
  109393. * m Modulus (prime).
  109394. */
  109395. SP_NOINLINE static void sp_384_mont_add_12(sp_digit* r, const sp_digit* a,
  109396. const sp_digit* b, const sp_digit* m)
  109397. {
  109398. sp_digit o;
  109399. o = sp_384_add_12(r, a, b);
  109400. sp_384_cond_sub_12(r, r, m, 0 - o);
  109401. }
  109402. /* Double a Montgomery form number (r = a + a % m).
  109403. *
  109404. * r Result of doubling.
  109405. * a Number to double in Montgomery form.
  109406. * m Modulus (prime).
  109407. */
  109408. SP_NOINLINE static void sp_384_mont_dbl_12(sp_digit* r, const sp_digit* a,
  109409. const sp_digit* m)
  109410. {
  109411. sp_digit o;
  109412. o = sp_384_add_12(r, a, a);
  109413. sp_384_cond_sub_12(r, r, m, 0 - o);
  109414. }
  109415. /* Triple a Montgomery form number (r = a + a + a % m).
  109416. *
  109417. * r Result of Tripling.
  109418. * a Number to triple in Montgomery form.
  109419. * m Modulus (prime).
  109420. */
  109421. SP_NOINLINE static void sp_384_mont_tpl_12(sp_digit* r, const sp_digit* a,
  109422. const sp_digit* m)
  109423. {
  109424. sp_digit o;
  109425. o = sp_384_add_12(r, a, a);
  109426. sp_384_cond_sub_12(r, r, m, 0 - o);
  109427. o = sp_384_add_12(r, r, a);
  109428. sp_384_cond_sub_12(r, r, m, 0 - o);
  109429. }
  109430. #ifdef WOLFSSL_SP_SMALL
  109431. /* Sub b from a into r. (r = a - b)
  109432. *
  109433. * r A single precision integer.
  109434. * a A single precision integer.
  109435. * b A single precision integer.
  109436. */
  109437. SP_NOINLINE static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a,
  109438. const sp_digit* b)
  109439. {
  109440. __asm__ __volatile__ (
  109441. "movs r6, %[a]\n\t"
  109442. "movs r3, #0\n\t"
  109443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109444. "adds r6, r6, #48\n\t"
  109445. #else
  109446. "add r6, r6, #48\n\t"
  109447. #endif
  109448. "\n"
  109449. "L_sp_384_sub_12_word_%=:\n\t"
  109450. "movs r5, #0\n\t"
  109451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109452. "subs r5, r5, r3\n\t"
  109453. #else
  109454. "sub r5, r5, r3\n\t"
  109455. #endif
  109456. "ldr r4, [%[a]]\n\t"
  109457. "ldr r5, [%[b]]\n\t"
  109458. #ifdef WOLFSSL_KEIL
  109459. "sbcs r4, r4, r5\n\t"
  109460. #elif defined(__clang__)
  109461. "sbcs r4, r5\n\t"
  109462. #else
  109463. "sbc r4, r5\n\t"
  109464. #endif
  109465. "str r4, [%[r]]\n\t"
  109466. #ifdef WOLFSSL_KEIL
  109467. "sbcs r3, r3, r3\n\t"
  109468. #elif defined(__clang__)
  109469. "sbcs r3, r3\n\t"
  109470. #else
  109471. "sbc r3, r3\n\t"
  109472. #endif
  109473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109474. "adds %[a], %[a], #4\n\t"
  109475. #else
  109476. "add %[a], %[a], #4\n\t"
  109477. #endif
  109478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109479. "adds %[b], %[b], #4\n\t"
  109480. #else
  109481. "add %[b], %[b], #4\n\t"
  109482. #endif
  109483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109484. "adds %[r], %[r], #4\n\t"
  109485. #else
  109486. "add %[r], %[r], #4\n\t"
  109487. #endif
  109488. "cmp %[a], r6\n\t"
  109489. "bne L_sp_384_sub_12_word_%=\n\t"
  109490. "movs %[r], r3\n\t"
  109491. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  109492. :
  109493. : "memory", "r3", "r4", "r5", "r6"
  109494. );
  109495. return (uint32_t)(size_t)r;
  109496. }
  109497. #else
  109498. /* Sub b from a into r. (r = a - b)
  109499. *
  109500. * r A single precision integer.
  109501. * a A single precision integer.
  109502. * b A single precision integer.
  109503. */
  109504. SP_NOINLINE static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a,
  109505. const sp_digit* b)
  109506. {
  109507. __asm__ __volatile__ (
  109508. "ldm %[b]!, {r5, r6}\n\t"
  109509. "ldm %[a]!, {r3, r4}\n\t"
  109510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109511. "subs r3, r3, r5\n\t"
  109512. #else
  109513. "sub r3, r3, r5\n\t"
  109514. #endif
  109515. #ifdef WOLFSSL_KEIL
  109516. "sbcs r4, r4, r6\n\t"
  109517. #elif defined(__clang__)
  109518. "sbcs r4, r6\n\t"
  109519. #else
  109520. "sbc r4, r6\n\t"
  109521. #endif
  109522. "stm %[r]!, {r3, r4}\n\t"
  109523. "ldm %[b]!, {r5, r6}\n\t"
  109524. "ldm %[a]!, {r3, r4}\n\t"
  109525. #ifdef WOLFSSL_KEIL
  109526. "sbcs r3, r3, r5\n\t"
  109527. #elif defined(__clang__)
  109528. "sbcs r3, r5\n\t"
  109529. #else
  109530. "sbc r3, r5\n\t"
  109531. #endif
  109532. #ifdef WOLFSSL_KEIL
  109533. "sbcs r4, r4, r6\n\t"
  109534. #elif defined(__clang__)
  109535. "sbcs r4, r6\n\t"
  109536. #else
  109537. "sbc r4, r6\n\t"
  109538. #endif
  109539. "stm %[r]!, {r3, r4}\n\t"
  109540. "ldm %[b]!, {r5, r6}\n\t"
  109541. "ldm %[a]!, {r3, r4}\n\t"
  109542. #ifdef WOLFSSL_KEIL
  109543. "sbcs r3, r3, r5\n\t"
  109544. #elif defined(__clang__)
  109545. "sbcs r3, r5\n\t"
  109546. #else
  109547. "sbc r3, r5\n\t"
  109548. #endif
  109549. #ifdef WOLFSSL_KEIL
  109550. "sbcs r4, r4, r6\n\t"
  109551. #elif defined(__clang__)
  109552. "sbcs r4, r6\n\t"
  109553. #else
  109554. "sbc r4, r6\n\t"
  109555. #endif
  109556. "stm %[r]!, {r3, r4}\n\t"
  109557. "ldm %[b]!, {r5, r6}\n\t"
  109558. "ldm %[a]!, {r3, r4}\n\t"
  109559. #ifdef WOLFSSL_KEIL
  109560. "sbcs r3, r3, r5\n\t"
  109561. #elif defined(__clang__)
  109562. "sbcs r3, r5\n\t"
  109563. #else
  109564. "sbc r3, r5\n\t"
  109565. #endif
  109566. #ifdef WOLFSSL_KEIL
  109567. "sbcs r4, r4, r6\n\t"
  109568. #elif defined(__clang__)
  109569. "sbcs r4, r6\n\t"
  109570. #else
  109571. "sbc r4, r6\n\t"
  109572. #endif
  109573. "stm %[r]!, {r3, r4}\n\t"
  109574. "ldm %[b]!, {r5, r6}\n\t"
  109575. "ldm %[a]!, {r3, r4}\n\t"
  109576. #ifdef WOLFSSL_KEIL
  109577. "sbcs r3, r3, r5\n\t"
  109578. #elif defined(__clang__)
  109579. "sbcs r3, r5\n\t"
  109580. #else
  109581. "sbc r3, r5\n\t"
  109582. #endif
  109583. #ifdef WOLFSSL_KEIL
  109584. "sbcs r4, r4, r6\n\t"
  109585. #elif defined(__clang__)
  109586. "sbcs r4, r6\n\t"
  109587. #else
  109588. "sbc r4, r6\n\t"
  109589. #endif
  109590. "stm %[r]!, {r3, r4}\n\t"
  109591. "ldm %[b]!, {r5, r6}\n\t"
  109592. "ldm %[a]!, {r3, r4}\n\t"
  109593. #ifdef WOLFSSL_KEIL
  109594. "sbcs r3, r3, r5\n\t"
  109595. #elif defined(__clang__)
  109596. "sbcs r3, r5\n\t"
  109597. #else
  109598. "sbc r3, r5\n\t"
  109599. #endif
  109600. #ifdef WOLFSSL_KEIL
  109601. "sbcs r4, r4, r6\n\t"
  109602. #elif defined(__clang__)
  109603. "sbcs r4, r6\n\t"
  109604. #else
  109605. "sbc r4, r6\n\t"
  109606. #endif
  109607. "stm %[r]!, {r3, r4}\n\t"
  109608. #ifdef WOLFSSL_KEIL
  109609. "sbcs %[r], %[r], %[r]\n\t"
  109610. #elif defined(__clang__)
  109611. "sbcs %[r], %[r]\n\t"
  109612. #else
  109613. "sbc %[r], %[r]\n\t"
  109614. #endif
  109615. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  109616. :
  109617. : "memory", "r3", "r4", "r5", "r6"
  109618. );
  109619. return (uint32_t)(size_t)r;
  109620. }
  109621. #endif /* WOLFSSL_SP_SMALL */
  109622. /* Conditionally add a and b using the mask m.
  109623. * m is -1 to add and 0 when not.
  109624. *
  109625. * r A single precision number representing conditional add result.
  109626. * a A single precision number to add with.
  109627. * b A single precision number to add.
  109628. * m Mask value to apply.
  109629. */
  109630. SP_NOINLINE static sp_digit sp_384_cond_add_12(sp_digit* r, const sp_digit* a,
  109631. const sp_digit* b, sp_digit m)
  109632. {
  109633. __asm__ __volatile__ (
  109634. "movs r4, #0\n\t"
  109635. "movs r5, #48\n\t"
  109636. "mov r8, r5\n\t"
  109637. "movs r7, #0\n\t"
  109638. "\n"
  109639. "L_sp_384_cond_add_12_words_%=:\n\t"
  109640. "ldr r6, [%[b], r7]\n\t"
  109641. #ifdef WOLFSSL_KEIL
  109642. "ands r6, r6, %[m]\n\t"
  109643. #elif defined(__clang__)
  109644. "ands r6, %[m]\n\t"
  109645. #else
  109646. "and r6, %[m]\n\t"
  109647. #endif
  109648. "movs r5, #0\n\t"
  109649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109650. "subs r5, r5, #1\n\t"
  109651. #else
  109652. "sub r5, r5, #1\n\t"
  109653. #endif
  109654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109655. "adds r5, r5, r4\n\t"
  109656. #else
  109657. "add r5, r5, r4\n\t"
  109658. #endif
  109659. "ldr r5, [%[a], r7]\n\t"
  109660. #ifdef WOLFSSL_KEIL
  109661. "adcs r5, r5, r6\n\t"
  109662. #elif defined(__clang__)
  109663. "adcs r5, r6\n\t"
  109664. #else
  109665. "adc r5, r6\n\t"
  109666. #endif
  109667. "movs r4, #0\n\t"
  109668. #ifdef WOLFSSL_KEIL
  109669. "adcs r4, r4, r4\n\t"
  109670. #elif defined(__clang__)
  109671. "adcs r4, r4\n\t"
  109672. #else
  109673. "adc r4, r4\n\t"
  109674. #endif
  109675. "str r5, [%[r], r7]\n\t"
  109676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109677. "adds r7, r7, #4\n\t"
  109678. #else
  109679. "add r7, r7, #4\n\t"
  109680. #endif
  109681. "cmp r7, r8\n\t"
  109682. "blt L_sp_384_cond_add_12_words_%=\n\t"
  109683. "movs %[r], r4\n\t"
  109684. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  109685. :
  109686. : "memory", "r4", "r5", "r6", "r7", "r8"
  109687. );
  109688. return (uint32_t)(size_t)r;
  109689. }
  109690. /* Subtract two Montgomery form numbers (r = a - b % m).
  109691. *
  109692. * r Result of subtration.
  109693. * a Number to subtract from in Montgomery form.
  109694. * b Number to subtract with in Montgomery form.
  109695. * m Modulus (prime).
  109696. */
  109697. SP_NOINLINE static void sp_384_mont_sub_12(sp_digit* r, const sp_digit* a,
  109698. const sp_digit* b, const sp_digit* m)
  109699. {
  109700. sp_digit o;
  109701. o = sp_384_sub_12(r, a, b);
  109702. sp_384_cond_add_12(r, r, m, o);
  109703. }
  109704. /* Right shift a by 1 bit into r. (r = a >> 1)
  109705. *
  109706. * r A single precision integer.
  109707. * a A single precision integer.
  109708. */
  109709. static void sp_384_rshift1_12(sp_digit* r, const sp_digit* a)
  109710. {
  109711. __asm__ __volatile__ (
  109712. "ldr r2, [%[a]]\n\t"
  109713. "ldr r3, [%[a], #4]\n\t"
  109714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109715. "lsrs r2, r2, #1\n\t"
  109716. #else
  109717. "lsr r2, r2, #1\n\t"
  109718. #endif
  109719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109720. "lsls r5, r3, #31\n\t"
  109721. #else
  109722. "lsl r5, r3, #31\n\t"
  109723. #endif
  109724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109725. "lsrs r3, r3, #1\n\t"
  109726. #else
  109727. "lsr r3, r3, #1\n\t"
  109728. #endif
  109729. #ifdef WOLFSSL_KEIL
  109730. "orrs r2, r2, r5\n\t"
  109731. #elif defined(__clang__)
  109732. "orrs r2, r5\n\t"
  109733. #else
  109734. "orr r2, r5\n\t"
  109735. #endif
  109736. "ldr r4, [%[a], #8]\n\t"
  109737. "str r2, [%[r]]\n\t"
  109738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109739. "lsls r5, r4, #31\n\t"
  109740. #else
  109741. "lsl r5, r4, #31\n\t"
  109742. #endif
  109743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109744. "lsrs r4, r4, #1\n\t"
  109745. #else
  109746. "lsr r4, r4, #1\n\t"
  109747. #endif
  109748. #ifdef WOLFSSL_KEIL
  109749. "orrs r3, r3, r5\n\t"
  109750. #elif defined(__clang__)
  109751. "orrs r3, r5\n\t"
  109752. #else
  109753. "orr r3, r5\n\t"
  109754. #endif
  109755. "ldr r2, [%[a], #12]\n\t"
  109756. "str r3, [%[r], #4]\n\t"
  109757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109758. "lsls r5, r2, #31\n\t"
  109759. #else
  109760. "lsl r5, r2, #31\n\t"
  109761. #endif
  109762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109763. "lsrs r2, r2, #1\n\t"
  109764. #else
  109765. "lsr r2, r2, #1\n\t"
  109766. #endif
  109767. #ifdef WOLFSSL_KEIL
  109768. "orrs r4, r4, r5\n\t"
  109769. #elif defined(__clang__)
  109770. "orrs r4, r5\n\t"
  109771. #else
  109772. "orr r4, r5\n\t"
  109773. #endif
  109774. "ldr r3, [%[a], #16]\n\t"
  109775. "str r4, [%[r], #8]\n\t"
  109776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109777. "lsls r5, r3, #31\n\t"
  109778. #else
  109779. "lsl r5, r3, #31\n\t"
  109780. #endif
  109781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109782. "lsrs r3, r3, #1\n\t"
  109783. #else
  109784. "lsr r3, r3, #1\n\t"
  109785. #endif
  109786. #ifdef WOLFSSL_KEIL
  109787. "orrs r2, r2, r5\n\t"
  109788. #elif defined(__clang__)
  109789. "orrs r2, r5\n\t"
  109790. #else
  109791. "orr r2, r5\n\t"
  109792. #endif
  109793. "ldr r4, [%[a], #20]\n\t"
  109794. "str r2, [%[r], #12]\n\t"
  109795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109796. "lsls r5, r4, #31\n\t"
  109797. #else
  109798. "lsl r5, r4, #31\n\t"
  109799. #endif
  109800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109801. "lsrs r4, r4, #1\n\t"
  109802. #else
  109803. "lsr r4, r4, #1\n\t"
  109804. #endif
  109805. #ifdef WOLFSSL_KEIL
  109806. "orrs r3, r3, r5\n\t"
  109807. #elif defined(__clang__)
  109808. "orrs r3, r5\n\t"
  109809. #else
  109810. "orr r3, r5\n\t"
  109811. #endif
  109812. "ldr r2, [%[a], #24]\n\t"
  109813. "str r3, [%[r], #16]\n\t"
  109814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109815. "lsls r5, r2, #31\n\t"
  109816. #else
  109817. "lsl r5, r2, #31\n\t"
  109818. #endif
  109819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109820. "lsrs r2, r2, #1\n\t"
  109821. #else
  109822. "lsr r2, r2, #1\n\t"
  109823. #endif
  109824. #ifdef WOLFSSL_KEIL
  109825. "orrs r4, r4, r5\n\t"
  109826. #elif defined(__clang__)
  109827. "orrs r4, r5\n\t"
  109828. #else
  109829. "orr r4, r5\n\t"
  109830. #endif
  109831. "ldr r3, [%[a], #28]\n\t"
  109832. "str r4, [%[r], #20]\n\t"
  109833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109834. "lsls r5, r3, #31\n\t"
  109835. #else
  109836. "lsl r5, r3, #31\n\t"
  109837. #endif
  109838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109839. "lsrs r3, r3, #1\n\t"
  109840. #else
  109841. "lsr r3, r3, #1\n\t"
  109842. #endif
  109843. #ifdef WOLFSSL_KEIL
  109844. "orrs r2, r2, r5\n\t"
  109845. #elif defined(__clang__)
  109846. "orrs r2, r5\n\t"
  109847. #else
  109848. "orr r2, r5\n\t"
  109849. #endif
  109850. "ldr r4, [%[a], #32]\n\t"
  109851. "str r2, [%[r], #24]\n\t"
  109852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109853. "lsls r5, r4, #31\n\t"
  109854. #else
  109855. "lsl r5, r4, #31\n\t"
  109856. #endif
  109857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109858. "lsrs r4, r4, #1\n\t"
  109859. #else
  109860. "lsr r4, r4, #1\n\t"
  109861. #endif
  109862. #ifdef WOLFSSL_KEIL
  109863. "orrs r3, r3, r5\n\t"
  109864. #elif defined(__clang__)
  109865. "orrs r3, r5\n\t"
  109866. #else
  109867. "orr r3, r5\n\t"
  109868. #endif
  109869. "ldr r2, [%[a], #36]\n\t"
  109870. "str r3, [%[r], #28]\n\t"
  109871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109872. "lsls r5, r2, #31\n\t"
  109873. #else
  109874. "lsl r5, r2, #31\n\t"
  109875. #endif
  109876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109877. "lsrs r2, r2, #1\n\t"
  109878. #else
  109879. "lsr r2, r2, #1\n\t"
  109880. #endif
  109881. #ifdef WOLFSSL_KEIL
  109882. "orrs r4, r4, r5\n\t"
  109883. #elif defined(__clang__)
  109884. "orrs r4, r5\n\t"
  109885. #else
  109886. "orr r4, r5\n\t"
  109887. #endif
  109888. "ldr r3, [%[a], #40]\n\t"
  109889. "str r4, [%[r], #32]\n\t"
  109890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109891. "lsls r5, r3, #31\n\t"
  109892. #else
  109893. "lsl r5, r3, #31\n\t"
  109894. #endif
  109895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109896. "lsrs r3, r3, #1\n\t"
  109897. #else
  109898. "lsr r3, r3, #1\n\t"
  109899. #endif
  109900. #ifdef WOLFSSL_KEIL
  109901. "orrs r2, r2, r5\n\t"
  109902. #elif defined(__clang__)
  109903. "orrs r2, r5\n\t"
  109904. #else
  109905. "orr r2, r5\n\t"
  109906. #endif
  109907. "ldr r4, [%[a], #44]\n\t"
  109908. "str r2, [%[r], #36]\n\t"
  109909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109910. "lsls r5, r4, #31\n\t"
  109911. #else
  109912. "lsl r5, r4, #31\n\t"
  109913. #endif
  109914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109915. "lsrs r4, r4, #1\n\t"
  109916. #else
  109917. "lsr r4, r4, #1\n\t"
  109918. #endif
  109919. #ifdef WOLFSSL_KEIL
  109920. "orrs r3, r3, r5\n\t"
  109921. #elif defined(__clang__)
  109922. "orrs r3, r5\n\t"
  109923. #else
  109924. "orr r3, r5\n\t"
  109925. #endif
  109926. "str r3, [%[r], #40]\n\t"
  109927. "str r4, [%[r], #44]\n\t"
  109928. : [r] "+l" (r), [a] "+l" (a)
  109929. :
  109930. : "memory", "r2", "r3", "r4", "r5"
  109931. );
  109932. }
  109933. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  109934. *
  109935. * r Result of division by 2.
  109936. * a Number to divide.
  109937. * m Modulus (prime).
  109938. */
  109939. SP_NOINLINE static void sp_384_mont_div2_12(sp_digit* r, const sp_digit* a,
  109940. const sp_digit* m)
  109941. {
  109942. sp_digit o;
  109943. o = sp_384_cond_add_12(r, a, m, 0 - (a[0] & 1));
  109944. sp_384_rshift1_12(r, r);
  109945. r[11] |= o << 31;
  109946. }
  109947. /* Double the Montgomery form projective point p.
  109948. *
  109949. * r Result of doubling point.
  109950. * p Point to double.
  109951. * t Temporary ordinate data.
  109952. */
  109953. static void sp_384_proj_point_dbl_12(sp_point_384* r, const sp_point_384* p,
  109954. sp_digit* t)
  109955. {
  109956. sp_digit* t1 = t;
  109957. sp_digit* t2 = t + 2*12;
  109958. sp_digit* x;
  109959. sp_digit* y;
  109960. sp_digit* z;
  109961. x = r->x;
  109962. y = r->y;
  109963. z = r->z;
  109964. /* Put infinity into result. */
  109965. if (r != p) {
  109966. r->infinity = p->infinity;
  109967. }
  109968. /* T1 = Z * Z */
  109969. sp_384_mont_sqr_12(t1, p->z, p384_mod, p384_mp_mod);
  109970. /* Z = Y * Z */
  109971. sp_384_mont_mul_12(z, p->y, p->z, p384_mod, p384_mp_mod);
  109972. /* Z = 2Z */
  109973. sp_384_mont_dbl_12(z, z, p384_mod);
  109974. /* T2 = X - T1 */
  109975. sp_384_mont_sub_12(t2, p->x, t1, p384_mod);
  109976. /* T1 = X + T1 */
  109977. sp_384_mont_add_12(t1, p->x, t1, p384_mod);
  109978. /* T2 = T1 * T2 */
  109979. sp_384_mont_mul_12(t2, t1, t2, p384_mod, p384_mp_mod);
  109980. /* T1 = 3T2 */
  109981. sp_384_mont_tpl_12(t1, t2, p384_mod);
  109982. /* Y = 2Y */
  109983. sp_384_mont_dbl_12(y, p->y, p384_mod);
  109984. /* Y = Y * Y */
  109985. sp_384_mont_sqr_12(y, y, p384_mod, p384_mp_mod);
  109986. /* T2 = Y * Y */
  109987. sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod);
  109988. /* T2 = T2/2 */
  109989. sp_384_mont_div2_12(t2, t2, p384_mod);
  109990. /* Y = Y * X */
  109991. sp_384_mont_mul_12(y, y, p->x, p384_mod, p384_mp_mod);
  109992. /* X = T1 * T1 */
  109993. sp_384_mont_sqr_12(x, t1, p384_mod, p384_mp_mod);
  109994. /* X = X - Y */
  109995. sp_384_mont_sub_12(x, x, y, p384_mod);
  109996. /* X = X - Y */
  109997. sp_384_mont_sub_12(x, x, y, p384_mod);
  109998. /* Y = Y - X */
  109999. sp_384_mont_sub_12(y, y, x, p384_mod);
  110000. /* Y = Y * T1 */
  110001. sp_384_mont_mul_12(y, y, t1, p384_mod, p384_mp_mod);
  110002. /* Y = Y - T2 */
  110003. sp_384_mont_sub_12(y, y, t2, p384_mod);
  110004. }
  110005. #ifdef WOLFSSL_SP_NONBLOCK
  110006. typedef struct sp_384_proj_point_dbl_12_ctx {
  110007. int state;
  110008. sp_digit* t1;
  110009. sp_digit* t2;
  110010. sp_digit* x;
  110011. sp_digit* y;
  110012. sp_digit* z;
  110013. } sp_384_proj_point_dbl_12_ctx;
  110014. /* Double the Montgomery form projective point p.
  110015. *
  110016. * r Result of doubling point.
  110017. * p Point to double.
  110018. * t Temporary ordinate data.
  110019. */
  110020. static int sp_384_proj_point_dbl_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r,
  110021. const sp_point_384* p, sp_digit* t)
  110022. {
  110023. int err = FP_WOULDBLOCK;
  110024. sp_384_proj_point_dbl_12_ctx* ctx = (sp_384_proj_point_dbl_12_ctx*)sp_ctx->data;
  110025. typedef char ctx_size_test[sizeof(sp_384_proj_point_dbl_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  110026. (void)sizeof(ctx_size_test);
  110027. switch (ctx->state) {
  110028. case 0:
  110029. ctx->t1 = t;
  110030. ctx->t2 = t + 2*12;
  110031. ctx->x = r->x;
  110032. ctx->y = r->y;
  110033. ctx->z = r->z;
  110034. /* Put infinity into result. */
  110035. if (r != p) {
  110036. r->infinity = p->infinity;
  110037. }
  110038. ctx->state = 1;
  110039. break;
  110040. case 1:
  110041. /* T1 = Z * Z */
  110042. sp_384_mont_sqr_12(ctx->t1, p->z, p384_mod, p384_mp_mod);
  110043. ctx->state = 2;
  110044. break;
  110045. case 2:
  110046. /* Z = Y * Z */
  110047. sp_384_mont_mul_12(ctx->z, p->y, p->z, p384_mod, p384_mp_mod);
  110048. ctx->state = 3;
  110049. break;
  110050. case 3:
  110051. /* Z = 2Z */
  110052. sp_384_mont_dbl_12(ctx->z, ctx->z, p384_mod);
  110053. ctx->state = 4;
  110054. break;
  110055. case 4:
  110056. /* T2 = X - T1 */
  110057. sp_384_mont_sub_12(ctx->t2, p->x, ctx->t1, p384_mod);
  110058. ctx->state = 5;
  110059. break;
  110060. case 5:
  110061. /* T1 = X + T1 */
  110062. sp_384_mont_add_12(ctx->t1, p->x, ctx->t1, p384_mod);
  110063. ctx->state = 6;
  110064. break;
  110065. case 6:
  110066. /* T2 = T1 * T2 */
  110067. sp_384_mont_mul_12(ctx->t2, ctx->t1, ctx->t2, p384_mod, p384_mp_mod);
  110068. ctx->state = 7;
  110069. break;
  110070. case 7:
  110071. /* T1 = 3T2 */
  110072. sp_384_mont_tpl_12(ctx->t1, ctx->t2, p384_mod);
  110073. ctx->state = 8;
  110074. break;
  110075. case 8:
  110076. /* Y = 2Y */
  110077. sp_384_mont_dbl_12(ctx->y, p->y, p384_mod);
  110078. ctx->state = 9;
  110079. break;
  110080. case 9:
  110081. /* Y = Y * Y */
  110082. sp_384_mont_sqr_12(ctx->y, ctx->y, p384_mod, p384_mp_mod);
  110083. ctx->state = 10;
  110084. break;
  110085. case 10:
  110086. /* T2 = Y * Y */
  110087. sp_384_mont_sqr_12(ctx->t2, ctx->y, p384_mod, p384_mp_mod);
  110088. ctx->state = 11;
  110089. break;
  110090. case 11:
  110091. /* T2 = T2/2 */
  110092. sp_384_mont_div2_12(ctx->t2, ctx->t2, p384_mod);
  110093. ctx->state = 12;
  110094. break;
  110095. case 12:
  110096. /* Y = Y * X */
  110097. sp_384_mont_mul_12(ctx->y, ctx->y, p->x, p384_mod, p384_mp_mod);
  110098. ctx->state = 13;
  110099. break;
  110100. case 13:
  110101. /* X = T1 * T1 */
  110102. sp_384_mont_sqr_12(ctx->x, ctx->t1, p384_mod, p384_mp_mod);
  110103. ctx->state = 14;
  110104. break;
  110105. case 14:
  110106. /* X = X - Y */
  110107. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->y, p384_mod);
  110108. ctx->state = 15;
  110109. break;
  110110. case 15:
  110111. /* X = X - Y */
  110112. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->y, p384_mod);
  110113. ctx->state = 16;
  110114. break;
  110115. case 16:
  110116. /* Y = Y - X */
  110117. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->x, p384_mod);
  110118. ctx->state = 17;
  110119. break;
  110120. case 17:
  110121. /* Y = Y * T1 */
  110122. sp_384_mont_mul_12(ctx->y, ctx->y, ctx->t1, p384_mod, p384_mp_mod);
  110123. ctx->state = 18;
  110124. break;
  110125. case 18:
  110126. /* Y = Y - T2 */
  110127. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->t2, p384_mod);
  110128. ctx->state = 19;
  110129. /* fall-through */
  110130. case 19:
  110131. err = MP_OKAY;
  110132. break;
  110133. }
  110134. if (err == MP_OKAY && ctx->state != 19) {
  110135. err = FP_WOULDBLOCK;
  110136. }
  110137. return err;
  110138. }
  110139. #endif /* WOLFSSL_SP_NONBLOCK */
  110140. /* Compare two numbers to determine if they are equal.
  110141. * Constant time implementation.
  110142. *
  110143. * a First number to compare.
  110144. * b Second number to compare.
  110145. * returns 1 when equal and 0 otherwise.
  110146. */
  110147. static int sp_384_cmp_equal_12(const sp_digit* a, const sp_digit* b)
  110148. {
  110149. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  110150. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  110151. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  110152. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11])) == 0;
  110153. }
  110154. /* Returns 1 if the number of zero.
  110155. * Implementation is constant time.
  110156. *
  110157. * a Number to check.
  110158. * returns 1 if the number is zero and 0 otherwise.
  110159. */
  110160. static int sp_384_iszero_12(const sp_digit* a)
  110161. {
  110162. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  110163. a[8] | a[9] | a[10] | a[11]) == 0;
  110164. }
  110165. /* Add two Montgomery form projective points.
  110166. *
  110167. * r Result of addition.
  110168. * p First point to add.
  110169. * q Second point to add.
  110170. * t Temporary ordinate data.
  110171. */
  110172. static void sp_384_proj_point_add_12(sp_point_384* r,
  110173. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  110174. {
  110175. sp_digit* t6 = t;
  110176. sp_digit* t1 = t + 2*12;
  110177. sp_digit* t2 = t + 4*12;
  110178. sp_digit* t3 = t + 6*12;
  110179. sp_digit* t4 = t + 8*12;
  110180. sp_digit* t5 = t + 10*12;
  110181. /* U1 = X1*Z2^2 */
  110182. sp_384_mont_sqr_12(t1, q->z, p384_mod, p384_mp_mod);
  110183. sp_384_mont_mul_12(t3, t1, q->z, p384_mod, p384_mp_mod);
  110184. sp_384_mont_mul_12(t1, t1, p->x, p384_mod, p384_mp_mod);
  110185. /* U2 = X2*Z1^2 */
  110186. sp_384_mont_sqr_12(t2, p->z, p384_mod, p384_mp_mod);
  110187. sp_384_mont_mul_12(t4, t2, p->z, p384_mod, p384_mp_mod);
  110188. sp_384_mont_mul_12(t2, t2, q->x, p384_mod, p384_mp_mod);
  110189. /* S1 = Y1*Z2^3 */
  110190. sp_384_mont_mul_12(t3, t3, p->y, p384_mod, p384_mp_mod);
  110191. /* S2 = Y2*Z1^3 */
  110192. sp_384_mont_mul_12(t4, t4, q->y, p384_mod, p384_mp_mod);
  110193. /* Check double */
  110194. if ((~p->infinity) & (~q->infinity) &
  110195. sp_384_cmp_equal_12(t2, t1) &
  110196. sp_384_cmp_equal_12(t4, t3)) {
  110197. sp_384_proj_point_dbl_12(r, p, t);
  110198. }
  110199. else {
  110200. sp_digit* x = t6;
  110201. sp_digit* y = t1;
  110202. sp_digit* z = t2;
  110203. /* H = U2 - U1 */
  110204. sp_384_mont_sub_12(t2, t2, t1, p384_mod);
  110205. /* R = S2 - S1 */
  110206. sp_384_mont_sub_12(t4, t4, t3, p384_mod);
  110207. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  110208. sp_384_mont_sqr_12(t5, t2, p384_mod, p384_mp_mod);
  110209. sp_384_mont_mul_12(y, t1, t5, p384_mod, p384_mp_mod);
  110210. sp_384_mont_mul_12(t5, t5, t2, p384_mod, p384_mp_mod);
  110211. /* Z3 = H*Z1*Z2 */
  110212. sp_384_mont_mul_12(z, p->z, t2, p384_mod, p384_mp_mod);
  110213. sp_384_mont_mul_12(z, z, q->z, p384_mod, p384_mp_mod);
  110214. sp_384_mont_sqr_12(x, t4, p384_mod, p384_mp_mod);
  110215. sp_384_mont_sub_12(x, x, t5, p384_mod);
  110216. sp_384_mont_mul_12(t5, t5, t3, p384_mod, p384_mp_mod);
  110217. sp_384_mont_dbl_12(t3, y, p384_mod);
  110218. sp_384_mont_sub_12(x, x, t3, p384_mod);
  110219. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  110220. sp_384_mont_sub_12(y, y, x, p384_mod);
  110221. sp_384_mont_mul_12(y, y, t4, p384_mod, p384_mp_mod);
  110222. sp_384_mont_sub_12(y, y, t5, p384_mod);
  110223. {
  110224. int i;
  110225. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  110226. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  110227. sp_digit maskt = ~(maskp | maskq);
  110228. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  110229. for (i = 0; i < 12; i++) {
  110230. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  110231. (x[i] & maskt);
  110232. }
  110233. for (i = 0; i < 12; i++) {
  110234. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  110235. (y[i] & maskt);
  110236. }
  110237. for (i = 0; i < 12; i++) {
  110238. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  110239. (z[i] & maskt);
  110240. }
  110241. r->z[0] |= inf;
  110242. r->infinity = (word32)inf;
  110243. }
  110244. }
  110245. }
  110246. #ifdef WOLFSSL_SP_NONBLOCK
  110247. typedef struct sp_384_proj_point_add_12_ctx {
  110248. int state;
  110249. sp_384_proj_point_dbl_12_ctx dbl_ctx;
  110250. const sp_point_384* ap[2];
  110251. sp_point_384* rp[2];
  110252. sp_digit* t1;
  110253. sp_digit* t2;
  110254. sp_digit* t3;
  110255. sp_digit* t4;
  110256. sp_digit* t5;
  110257. sp_digit* t6;
  110258. sp_digit* x;
  110259. sp_digit* y;
  110260. sp_digit* z;
  110261. } sp_384_proj_point_add_12_ctx;
  110262. /* Add two Montgomery form projective points.
  110263. *
  110264. * r Result of addition.
  110265. * p First point to add.
  110266. * q Second point to add.
  110267. * t Temporary ordinate data.
  110268. */
  110269. static int sp_384_proj_point_add_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r,
  110270. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  110271. {
  110272. int err = FP_WOULDBLOCK;
  110273. sp_384_proj_point_add_12_ctx* ctx = (sp_384_proj_point_add_12_ctx*)sp_ctx->data;
  110274. /* Ensure only the first point is the same as the result. */
  110275. if (q == r) {
  110276. const sp_point_384* a = p;
  110277. p = q;
  110278. q = a;
  110279. }
  110280. typedef char ctx_size_test[sizeof(sp_384_proj_point_add_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  110281. (void)sizeof(ctx_size_test);
  110282. switch (ctx->state) {
  110283. case 0: /* INIT */
  110284. ctx->t6 = t;
  110285. ctx->t1 = t + 2*12;
  110286. ctx->t2 = t + 4*12;
  110287. ctx->t3 = t + 6*12;
  110288. ctx->t4 = t + 8*12;
  110289. ctx->t5 = t + 10*12;
  110290. ctx->x = ctx->t6;
  110291. ctx->y = ctx->t1;
  110292. ctx->z = ctx->t2;
  110293. ctx->state = 1;
  110294. break;
  110295. case 1:
  110296. /* U1 = X1*Z2^2 */
  110297. sp_384_mont_sqr_12(ctx->t1, q->z, p384_mod, p384_mp_mod);
  110298. ctx->state = 2;
  110299. break;
  110300. case 2:
  110301. sp_384_mont_mul_12(ctx->t3, ctx->t1, q->z, p384_mod, p384_mp_mod);
  110302. ctx->state = 3;
  110303. break;
  110304. case 3:
  110305. sp_384_mont_mul_12(ctx->t1, ctx->t1, p->x, p384_mod, p384_mp_mod);
  110306. ctx->state = 4;
  110307. break;
  110308. case 4:
  110309. /* U2 = X2*Z1^2 */
  110310. sp_384_mont_sqr_12(ctx->t2, p->z, p384_mod, p384_mp_mod);
  110311. ctx->state = 5;
  110312. break;
  110313. case 5:
  110314. sp_384_mont_mul_12(ctx->t4, ctx->t2, p->z, p384_mod, p384_mp_mod);
  110315. ctx->state = 6;
  110316. break;
  110317. case 6:
  110318. sp_384_mont_mul_12(ctx->t2, ctx->t2, q->x, p384_mod, p384_mp_mod);
  110319. ctx->state = 7;
  110320. break;
  110321. case 7:
  110322. /* S1 = Y1*Z2^3 */
  110323. sp_384_mont_mul_12(ctx->t3, ctx->t3, p->y, p384_mod, p384_mp_mod);
  110324. ctx->state = 8;
  110325. break;
  110326. case 8:
  110327. /* S2 = Y2*Z1^3 */
  110328. sp_384_mont_mul_12(ctx->t4, ctx->t4, q->y, p384_mod, p384_mp_mod);
  110329. ctx->state = 9;
  110330. break;
  110331. case 9:
  110332. /* Check double */
  110333. if ((~p->infinity) & (~q->infinity) &
  110334. sp_384_cmp_equal_12(ctx->t2, ctx->t1) &
  110335. sp_384_cmp_equal_12(ctx->t4, ctx->t3)) {
  110336. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  110337. sp_384_proj_point_dbl_12(r, p, t);
  110338. ctx->state = 25;
  110339. }
  110340. else {
  110341. ctx->state = 10;
  110342. }
  110343. break;
  110344. case 10:
  110345. /* H = U2 - U1 */
  110346. sp_384_mont_sub_12(ctx->t2, ctx->t2, ctx->t1, p384_mod);
  110347. ctx->state = 11;
  110348. break;
  110349. case 11:
  110350. /* R = S2 - S1 */
  110351. sp_384_mont_sub_12(ctx->t4, ctx->t4, ctx->t3, p384_mod);
  110352. ctx->state = 12;
  110353. break;
  110354. case 12:
  110355. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  110356. sp_384_mont_sqr_12(ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
  110357. ctx->state = 13;
  110358. break;
  110359. case 13:
  110360. sp_384_mont_mul_12(ctx->y, ctx->t1, ctx->t5, p384_mod, p384_mp_mod);
  110361. ctx->state = 14;
  110362. break;
  110363. case 14:
  110364. sp_384_mont_mul_12(ctx->t5, ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
  110365. ctx->state = 15;
  110366. break;
  110367. case 15:
  110368. /* Z3 = H*Z1*Z2 */
  110369. sp_384_mont_mul_12(ctx->z, p->z, ctx->t2, p384_mod, p384_mp_mod);
  110370. ctx->state = 16;
  110371. break;
  110372. case 16:
  110373. sp_384_mont_mul_12(ctx->z, ctx->z, q->z, p384_mod, p384_mp_mod);
  110374. ctx->state = 17;
  110375. break;
  110376. case 17:
  110377. sp_384_mont_sqr_12(ctx->x, ctx->t4, p384_mod, p384_mp_mod);
  110378. ctx->state = 18;
  110379. break;
  110380. case 18:
  110381. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->t5, p384_mod);
  110382. ctx->state = 19;
  110383. break;
  110384. case 19:
  110385. sp_384_mont_mul_12(ctx->t5, ctx->t5, ctx->t3, p384_mod, p384_mp_mod);
  110386. ctx->state = 20;
  110387. break;
  110388. case 20:
  110389. sp_384_mont_dbl_12(ctx->t3, ctx->y, p384_mod);
  110390. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->t3, p384_mod);
  110391. ctx->state = 21;
  110392. break;
  110393. case 21:
  110394. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  110395. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->x, p384_mod);
  110396. ctx->state = 22;
  110397. break;
  110398. case 22:
  110399. sp_384_mont_mul_12(ctx->y, ctx->y, ctx->t4, p384_mod, p384_mp_mod);
  110400. ctx->state = 23;
  110401. break;
  110402. case 23:
  110403. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->t5, p384_mod);
  110404. ctx->state = 24;
  110405. break;
  110406. case 24:
  110407. {
  110408. {
  110409. int i;
  110410. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  110411. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  110412. sp_digit maskt = ~(maskp | maskq);
  110413. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  110414. for (i = 0; i < 12; i++) {
  110415. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  110416. (ctx->x[i] & maskt);
  110417. }
  110418. for (i = 0; i < 12; i++) {
  110419. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  110420. (ctx->y[i] & maskt);
  110421. }
  110422. for (i = 0; i < 12; i++) {
  110423. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  110424. (ctx->z[i] & maskt);
  110425. }
  110426. r->z[0] |= inf;
  110427. r->infinity = (word32)inf;
  110428. }
  110429. ctx->state = 25;
  110430. break;
  110431. }
  110432. case 25:
  110433. err = MP_OKAY;
  110434. break;
  110435. }
  110436. if (err == MP_OKAY && ctx->state != 25) {
  110437. err = FP_WOULDBLOCK;
  110438. }
  110439. return err;
  110440. }
  110441. #endif /* WOLFSSL_SP_NONBLOCK */
  110442. #ifndef WC_NO_CACHE_RESISTANT
  110443. /* Touch each possible point that could be being copied.
  110444. *
  110445. * r Point to copy into.
  110446. * table Table - start of the entries to access
  110447. * idx Index of entry to retrieve.
  110448. */
  110449. static void sp_384_get_point_16_12(sp_point_384* r, const sp_point_384* table,
  110450. int idx)
  110451. {
  110452. int i;
  110453. sp_digit mask;
  110454. r->x[0] = 0;
  110455. r->x[1] = 0;
  110456. r->x[2] = 0;
  110457. r->x[3] = 0;
  110458. r->x[4] = 0;
  110459. r->x[5] = 0;
  110460. r->x[6] = 0;
  110461. r->x[7] = 0;
  110462. r->x[8] = 0;
  110463. r->x[9] = 0;
  110464. r->x[10] = 0;
  110465. r->x[11] = 0;
  110466. r->y[0] = 0;
  110467. r->y[1] = 0;
  110468. r->y[2] = 0;
  110469. r->y[3] = 0;
  110470. r->y[4] = 0;
  110471. r->y[5] = 0;
  110472. r->y[6] = 0;
  110473. r->y[7] = 0;
  110474. r->y[8] = 0;
  110475. r->y[9] = 0;
  110476. r->y[10] = 0;
  110477. r->y[11] = 0;
  110478. r->z[0] = 0;
  110479. r->z[1] = 0;
  110480. r->z[2] = 0;
  110481. r->z[3] = 0;
  110482. r->z[4] = 0;
  110483. r->z[5] = 0;
  110484. r->z[6] = 0;
  110485. r->z[7] = 0;
  110486. r->z[8] = 0;
  110487. r->z[9] = 0;
  110488. r->z[10] = 0;
  110489. r->z[11] = 0;
  110490. for (i = 1; i < 16; i++) {
  110491. mask = 0 - (i == idx);
  110492. r->x[0] |= mask & table[i].x[0];
  110493. r->x[1] |= mask & table[i].x[1];
  110494. r->x[2] |= mask & table[i].x[2];
  110495. r->x[3] |= mask & table[i].x[3];
  110496. r->x[4] |= mask & table[i].x[4];
  110497. r->x[5] |= mask & table[i].x[5];
  110498. r->x[6] |= mask & table[i].x[6];
  110499. r->x[7] |= mask & table[i].x[7];
  110500. r->x[8] |= mask & table[i].x[8];
  110501. r->x[9] |= mask & table[i].x[9];
  110502. r->x[10] |= mask & table[i].x[10];
  110503. r->x[11] |= mask & table[i].x[11];
  110504. r->y[0] |= mask & table[i].y[0];
  110505. r->y[1] |= mask & table[i].y[1];
  110506. r->y[2] |= mask & table[i].y[2];
  110507. r->y[3] |= mask & table[i].y[3];
  110508. r->y[4] |= mask & table[i].y[4];
  110509. r->y[5] |= mask & table[i].y[5];
  110510. r->y[6] |= mask & table[i].y[6];
  110511. r->y[7] |= mask & table[i].y[7];
  110512. r->y[8] |= mask & table[i].y[8];
  110513. r->y[9] |= mask & table[i].y[9];
  110514. r->y[10] |= mask & table[i].y[10];
  110515. r->y[11] |= mask & table[i].y[11];
  110516. r->z[0] |= mask & table[i].z[0];
  110517. r->z[1] |= mask & table[i].z[1];
  110518. r->z[2] |= mask & table[i].z[2];
  110519. r->z[3] |= mask & table[i].z[3];
  110520. r->z[4] |= mask & table[i].z[4];
  110521. r->z[5] |= mask & table[i].z[5];
  110522. r->z[6] |= mask & table[i].z[6];
  110523. r->z[7] |= mask & table[i].z[7];
  110524. r->z[8] |= mask & table[i].z[8];
  110525. r->z[9] |= mask & table[i].z[9];
  110526. r->z[10] |= mask & table[i].z[10];
  110527. r->z[11] |= mask & table[i].z[11];
  110528. }
  110529. }
  110530. #endif /* !WC_NO_CACHE_RESISTANT */
  110531. /* Multiply the point by the scalar and return the result.
  110532. * If map is true then convert result to affine coordinates.
  110533. *
  110534. * Fast implementation that generates a pre-computation table.
  110535. * 4 bits of window (no sliding!).
  110536. * Uses add and double for calculating table.
  110537. * 384 doubles.
  110538. * 108 adds.
  110539. *
  110540. * r Resulting point.
  110541. * g Point to multiply.
  110542. * k Scalar to multiply by.
  110543. * map Indicates whether to convert result to affine.
  110544. * ct Constant time required.
  110545. * heap Heap to use for allocation.
  110546. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  110547. */
  110548. static int sp_384_ecc_mulmod_fast_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
  110549. int map, int ct, void* heap)
  110550. {
  110551. #ifdef WOLFSSL_SP_SMALL_STACK
  110552. sp_point_384* t = NULL;
  110553. sp_digit* tmp = NULL;
  110554. #else
  110555. sp_point_384 t[16 + 1];
  110556. sp_digit tmp[2 * 12 * 6];
  110557. #endif
  110558. sp_point_384* rt = NULL;
  110559. #ifndef WC_NO_CACHE_RESISTANT
  110560. #ifdef WOLFSSL_SP_SMALL_STACK
  110561. sp_point_384* p = NULL;
  110562. #else
  110563. sp_point_384 p[1];
  110564. #endif
  110565. #endif /* !WC_NO_CACHE_RESISTANT */
  110566. sp_digit n;
  110567. int i;
  110568. int c;
  110569. int y;
  110570. int err = MP_OKAY;
  110571. /* Constant time used for cache attack resistance implementation. */
  110572. (void)ct;
  110573. (void)heap;
  110574. #ifdef WOLFSSL_SP_SMALL_STACK
  110575. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * (16 + 1),
  110576. heap, DYNAMIC_TYPE_ECC);
  110577. if (t == NULL)
  110578. err = MEMORY_E;
  110579. #ifndef WC_NO_CACHE_RESISTANT
  110580. if (err == MP_OKAY) {
  110581. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384),
  110582. heap, DYNAMIC_TYPE_ECC);
  110583. if (p == NULL)
  110584. err = MEMORY_E;
  110585. }
  110586. #endif
  110587. if (err == MP_OKAY) {
  110588. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  110589. DYNAMIC_TYPE_ECC);
  110590. if (tmp == NULL)
  110591. err = MEMORY_E;
  110592. }
  110593. #endif
  110594. if (err == MP_OKAY) {
  110595. rt = t + 16;
  110596. /* t[0] = {0, 0, 1} * norm */
  110597. XMEMSET(&t[0], 0, sizeof(t[0]));
  110598. t[0].infinity = 1;
  110599. /* t[1] = {g->x, g->y, g->z} * norm */
  110600. (void)sp_384_mod_mul_norm_12(t[1].x, g->x, p384_mod);
  110601. (void)sp_384_mod_mul_norm_12(t[1].y, g->y, p384_mod);
  110602. (void)sp_384_mod_mul_norm_12(t[1].z, g->z, p384_mod);
  110603. t[1].infinity = 0;
  110604. sp_384_proj_point_dbl_12(&t[ 2], &t[ 1], tmp);
  110605. t[ 2].infinity = 0;
  110606. sp_384_proj_point_add_12(&t[ 3], &t[ 2], &t[ 1], tmp);
  110607. t[ 3].infinity = 0;
  110608. sp_384_proj_point_dbl_12(&t[ 4], &t[ 2], tmp);
  110609. t[ 4].infinity = 0;
  110610. sp_384_proj_point_add_12(&t[ 5], &t[ 3], &t[ 2], tmp);
  110611. t[ 5].infinity = 0;
  110612. sp_384_proj_point_dbl_12(&t[ 6], &t[ 3], tmp);
  110613. t[ 6].infinity = 0;
  110614. sp_384_proj_point_add_12(&t[ 7], &t[ 4], &t[ 3], tmp);
  110615. t[ 7].infinity = 0;
  110616. sp_384_proj_point_dbl_12(&t[ 8], &t[ 4], tmp);
  110617. t[ 8].infinity = 0;
  110618. sp_384_proj_point_add_12(&t[ 9], &t[ 5], &t[ 4], tmp);
  110619. t[ 9].infinity = 0;
  110620. sp_384_proj_point_dbl_12(&t[10], &t[ 5], tmp);
  110621. t[10].infinity = 0;
  110622. sp_384_proj_point_add_12(&t[11], &t[ 6], &t[ 5], tmp);
  110623. t[11].infinity = 0;
  110624. sp_384_proj_point_dbl_12(&t[12], &t[ 6], tmp);
  110625. t[12].infinity = 0;
  110626. sp_384_proj_point_add_12(&t[13], &t[ 7], &t[ 6], tmp);
  110627. t[13].infinity = 0;
  110628. sp_384_proj_point_dbl_12(&t[14], &t[ 7], tmp);
  110629. t[14].infinity = 0;
  110630. sp_384_proj_point_add_12(&t[15], &t[ 8], &t[ 7], tmp);
  110631. t[15].infinity = 0;
  110632. i = 10;
  110633. n = k[i+1] << 0;
  110634. c = 28;
  110635. y = (int)(n >> 28);
  110636. #ifndef WC_NO_CACHE_RESISTANT
  110637. if (ct) {
  110638. sp_384_get_point_16_12(rt, t, y);
  110639. rt->infinity = !y;
  110640. }
  110641. else
  110642. #endif
  110643. {
  110644. XMEMCPY(rt, &t[y], sizeof(sp_point_384));
  110645. }
  110646. n <<= 4;
  110647. for (; i>=0 || c>=4; ) {
  110648. if (c < 4) {
  110649. n |= k[i--];
  110650. c += 32;
  110651. }
  110652. y = (n >> 28) & 0xf;
  110653. n <<= 4;
  110654. c -= 4;
  110655. sp_384_proj_point_dbl_12(rt, rt, tmp);
  110656. sp_384_proj_point_dbl_12(rt, rt, tmp);
  110657. sp_384_proj_point_dbl_12(rt, rt, tmp);
  110658. sp_384_proj_point_dbl_12(rt, rt, tmp);
  110659. #ifndef WC_NO_CACHE_RESISTANT
  110660. if (ct) {
  110661. sp_384_get_point_16_12(p, t, y);
  110662. p->infinity = !y;
  110663. sp_384_proj_point_add_12(rt, rt, p, tmp);
  110664. }
  110665. else
  110666. #endif
  110667. {
  110668. sp_384_proj_point_add_12(rt, rt, &t[y], tmp);
  110669. }
  110670. }
  110671. if (map != 0) {
  110672. sp_384_map_12(r, rt, tmp);
  110673. }
  110674. else {
  110675. XMEMCPY(r, rt, sizeof(sp_point_384));
  110676. }
  110677. }
  110678. #ifdef WOLFSSL_SP_SMALL_STACK
  110679. if (tmp != NULL)
  110680. #endif
  110681. {
  110682. ForceZero(tmp, sizeof(sp_digit) * 2 * 12 * 6);
  110683. #ifdef WOLFSSL_SP_SMALL_STACK
  110684. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  110685. #endif
  110686. }
  110687. #ifndef WC_NO_CACHE_RESISTANT
  110688. #ifdef WOLFSSL_SP_SMALL_STACK
  110689. if (p != NULL)
  110690. #endif
  110691. {
  110692. ForceZero(p, sizeof(sp_point_384));
  110693. #ifdef WOLFSSL_SP_SMALL_STACK
  110694. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  110695. #endif
  110696. }
  110697. #endif /* !WC_NO_CACHE_RESISTANT */
  110698. #ifdef WOLFSSL_SP_SMALL_STACK
  110699. if (t != NULL)
  110700. #endif
  110701. {
  110702. ForceZero(t, sizeof(sp_point_384) * 17);
  110703. #ifdef WOLFSSL_SP_SMALL_STACK
  110704. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  110705. #endif
  110706. }
  110707. return err;
  110708. }
  110709. #ifdef FP_ECC
  110710. /* Double the Montgomery form projective point p a number of times.
  110711. *
  110712. * r Result of repeated doubling of point.
  110713. * p Point to double.
  110714. * n Number of times to double
  110715. * t Temporary ordinate data.
  110716. */
  110717. static void sp_384_proj_point_dbl_n_12(sp_point_384* p, int i,
  110718. sp_digit* t)
  110719. {
  110720. sp_digit* w = t;
  110721. sp_digit* a = t + 2*12;
  110722. sp_digit* b = t + 4*12;
  110723. sp_digit* t1 = t + 6*12;
  110724. sp_digit* t2 = t + 8*12;
  110725. sp_digit* x;
  110726. sp_digit* y;
  110727. sp_digit* z;
  110728. volatile int n = i;
  110729. x = p->x;
  110730. y = p->y;
  110731. z = p->z;
  110732. /* Y = 2*Y */
  110733. sp_384_mont_dbl_12(y, y, p384_mod);
  110734. /* W = Z^4 */
  110735. sp_384_mont_sqr_12(w, z, p384_mod, p384_mp_mod);
  110736. sp_384_mont_sqr_12(w, w, p384_mod, p384_mp_mod);
  110737. #ifndef WOLFSSL_SP_SMALL
  110738. while (--n > 0)
  110739. #else
  110740. while (--n >= 0)
  110741. #endif
  110742. {
  110743. /* A = 3*(X^2 - W) */
  110744. sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod);
  110745. sp_384_mont_sub_12(t1, t1, w, p384_mod);
  110746. sp_384_mont_tpl_12(a, t1, p384_mod);
  110747. /* B = X*Y^2 */
  110748. sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod);
  110749. sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod);
  110750. /* X = A^2 - 2B */
  110751. sp_384_mont_sqr_12(x, a, p384_mod, p384_mp_mod);
  110752. sp_384_mont_dbl_12(t2, b, p384_mod);
  110753. sp_384_mont_sub_12(x, x, t2, p384_mod);
  110754. /* B = 2.(B - X) */
  110755. sp_384_mont_sub_12(t2, b, x, p384_mod);
  110756. sp_384_mont_dbl_12(b, t2, p384_mod);
  110757. /* Z = Z*Y */
  110758. sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod);
  110759. /* t1 = Y^4 */
  110760. sp_384_mont_sqr_12(t1, t1, p384_mod, p384_mp_mod);
  110761. #ifdef WOLFSSL_SP_SMALL
  110762. if (n != 0)
  110763. #endif
  110764. {
  110765. /* W = W*Y^4 */
  110766. sp_384_mont_mul_12(w, w, t1, p384_mod, p384_mp_mod);
  110767. }
  110768. /* y = 2*A*(B - X) - Y^4 */
  110769. sp_384_mont_mul_12(y, b, a, p384_mod, p384_mp_mod);
  110770. sp_384_mont_sub_12(y, y, t1, p384_mod);
  110771. }
  110772. #ifndef WOLFSSL_SP_SMALL
  110773. /* A = 3*(X^2 - W) */
  110774. sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod);
  110775. sp_384_mont_sub_12(t1, t1, w, p384_mod);
  110776. sp_384_mont_tpl_12(a, t1, p384_mod);
  110777. /* B = X*Y^2 */
  110778. sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod);
  110779. sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod);
  110780. /* X = A^2 - 2B */
  110781. sp_384_mont_sqr_12(x, a, p384_mod, p384_mp_mod);
  110782. sp_384_mont_dbl_12(t2, b, p384_mod);
  110783. sp_384_mont_sub_12(x, x, t2, p384_mod);
  110784. /* B = 2.(B - X) */
  110785. sp_384_mont_sub_12(t2, b, x, p384_mod);
  110786. sp_384_mont_dbl_12(b, t2, p384_mod);
  110787. /* Z = Z*Y */
  110788. sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod);
  110789. /* t1 = Y^4 */
  110790. sp_384_mont_sqr_12(t1, t1, p384_mod, p384_mp_mod);
  110791. /* y = 2*A*(B - X) - Y^4 */
  110792. sp_384_mont_mul_12(y, b, a, p384_mod, p384_mp_mod);
  110793. sp_384_mont_sub_12(y, y, t1, p384_mod);
  110794. #endif /* WOLFSSL_SP_SMALL */
  110795. /* Y = Y/2 */
  110796. sp_384_mont_div2_12(y, y, p384_mod);
  110797. }
  110798. /* Convert the projective point to affine.
  110799. * Ordinates are in Montgomery form.
  110800. *
  110801. * a Point to convert.
  110802. * t Temporary data.
  110803. */
  110804. static void sp_384_proj_to_affine_12(sp_point_384* a, sp_digit* t)
  110805. {
  110806. sp_digit* t1 = t;
  110807. sp_digit* t2 = t + 2 * 12;
  110808. sp_digit* tmp = t + 4 * 12;
  110809. sp_384_mont_inv_12(t1, a->z, tmp);
  110810. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  110811. sp_384_mont_mul_12(t1, t2, t1, p384_mod, p384_mp_mod);
  110812. sp_384_mont_mul_12(a->x, a->x, t2, p384_mod, p384_mp_mod);
  110813. sp_384_mont_mul_12(a->y, a->y, t1, p384_mod, p384_mp_mod);
  110814. XMEMCPY(a->z, p384_norm_mod, sizeof(p384_norm_mod));
  110815. }
  110816. #endif /* FP_ECC */
  110817. /* A table entry for pre-computed points. */
  110818. typedef struct sp_table_entry_384 {
  110819. sp_digit x[12];
  110820. sp_digit y[12];
  110821. } sp_table_entry_384;
  110822. #ifdef FP_ECC
  110823. #endif /* FP_ECC */
  110824. /* Add two Montgomery form projective points. The second point has a q value of
  110825. * one.
  110826. * Only the first point can be the same pointer as the result point.
  110827. *
  110828. * r Result of addition.
  110829. * p First point to add.
  110830. * q Second point to add.
  110831. * t Temporary ordinate data.
  110832. */
  110833. static void sp_384_proj_point_add_qz1_12(sp_point_384* r,
  110834. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  110835. {
  110836. sp_digit* t2 = t;
  110837. sp_digit* t3 = t + 2*12;
  110838. sp_digit* t6 = t + 4*12;
  110839. sp_digit* t1 = t + 6*12;
  110840. sp_digit* t4 = t + 8*12;
  110841. sp_digit* t5 = t + 10*12;
  110842. /* Calculate values to subtract from P->x and P->y. */
  110843. /* U2 = X2*Z1^2 */
  110844. sp_384_mont_sqr_12(t2, p->z, p384_mod, p384_mp_mod);
  110845. sp_384_mont_mul_12(t4, t2, p->z, p384_mod, p384_mp_mod);
  110846. sp_384_mont_mul_12(t2, t2, q->x, p384_mod, p384_mp_mod);
  110847. /* S2 = Y2*Z1^3 */
  110848. sp_384_mont_mul_12(t4, t4, q->y, p384_mod, p384_mp_mod);
  110849. if ((~p->infinity) & (~q->infinity) &
  110850. sp_384_cmp_equal_12(p->x, t2) &
  110851. sp_384_cmp_equal_12(p->y, t4)) {
  110852. sp_384_proj_point_dbl_12(r, p, t);
  110853. }
  110854. else {
  110855. sp_digit* x = t2;
  110856. sp_digit* y = t3;
  110857. sp_digit* z = t6;
  110858. /* H = U2 - X1 */
  110859. sp_384_mont_sub_12(t2, t2, p->x, p384_mod);
  110860. /* R = S2 - Y1 */
  110861. sp_384_mont_sub_12(t4, t4, p->y, p384_mod);
  110862. /* Z3 = H*Z1 */
  110863. sp_384_mont_mul_12(z, p->z, t2, p384_mod, p384_mp_mod);
  110864. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  110865. sp_384_mont_sqr_12(t1, t2, p384_mod, p384_mp_mod);
  110866. sp_384_mont_mul_12(t3, p->x, t1, p384_mod, p384_mp_mod);
  110867. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  110868. sp_384_mont_sqr_12(t2, t4, p384_mod, p384_mp_mod);
  110869. sp_384_mont_sub_12(t2, t2, t1, p384_mod);
  110870. sp_384_mont_dbl_12(t5, t3, p384_mod);
  110871. sp_384_mont_sub_12(x, t2, t5, p384_mod);
  110872. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  110873. sp_384_mont_sub_12(t3, t3, x, p384_mod);
  110874. sp_384_mont_mul_12(t3, t3, t4, p384_mod, p384_mp_mod);
  110875. sp_384_mont_mul_12(t1, t1, p->y, p384_mod, p384_mp_mod);
  110876. sp_384_mont_sub_12(y, t3, t1, p384_mod);
  110877. {
  110878. int i;
  110879. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  110880. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  110881. sp_digit maskt = ~(maskp | maskq);
  110882. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  110883. for (i = 0; i < 12; i++) {
  110884. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  110885. (x[i] & maskt);
  110886. }
  110887. for (i = 0; i < 12; i++) {
  110888. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  110889. (y[i] & maskt);
  110890. }
  110891. for (i = 0; i < 12; i++) {
  110892. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  110893. (z[i] & maskt);
  110894. }
  110895. r->z[0] |= inf;
  110896. r->infinity = (word32)inf;
  110897. }
  110898. }
  110899. }
  110900. #ifdef WOLFSSL_SP_SMALL
  110901. #ifdef FP_ECC
  110902. /* Generate the pre-computed table of points for the base point.
  110903. *
  110904. * width = 4
  110905. * 16 entries
  110906. * 96 bits between
  110907. *
  110908. * a The base point.
  110909. * table Place to store generated point data.
  110910. * tmp Temporary data.
  110911. * heap Heap to use for allocation.
  110912. */
  110913. static int sp_384_gen_stripe_table_12(const sp_point_384* a,
  110914. sp_table_entry_384* table, sp_digit* tmp, void* heap)
  110915. {
  110916. #ifdef WOLFSSL_SP_SMALL_STACK
  110917. sp_point_384* t = NULL;
  110918. #else
  110919. sp_point_384 t[3];
  110920. #endif
  110921. sp_point_384* s1 = NULL;
  110922. sp_point_384* s2 = NULL;
  110923. int i;
  110924. int j;
  110925. int err = MP_OKAY;
  110926. (void)heap;
  110927. #ifdef WOLFSSL_SP_SMALL_STACK
  110928. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
  110929. DYNAMIC_TYPE_ECC);
  110930. if (t == NULL)
  110931. err = MEMORY_E;
  110932. #endif
  110933. if (err == MP_OKAY) {
  110934. s1 = t + 1;
  110935. s2 = t + 2;
  110936. err = sp_384_mod_mul_norm_12(t->x, a->x, p384_mod);
  110937. }
  110938. if (err == MP_OKAY) {
  110939. err = sp_384_mod_mul_norm_12(t->y, a->y, p384_mod);
  110940. }
  110941. if (err == MP_OKAY) {
  110942. err = sp_384_mod_mul_norm_12(t->z, a->z, p384_mod);
  110943. }
  110944. if (err == MP_OKAY) {
  110945. t->infinity = 0;
  110946. sp_384_proj_to_affine_12(t, tmp);
  110947. XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
  110948. s1->infinity = 0;
  110949. XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
  110950. s2->infinity = 0;
  110951. /* table[0] = {0, 0, infinity} */
  110952. XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
  110953. /* table[1] = Affine version of 'a' in Montgomery form */
  110954. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  110955. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  110956. for (i=1; i<4; i++) {
  110957. sp_384_proj_point_dbl_n_12(t, 96, tmp);
  110958. sp_384_proj_to_affine_12(t, tmp);
  110959. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  110960. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  110961. }
  110962. for (i=1; i<4; i++) {
  110963. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  110964. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  110965. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  110966. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  110967. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  110968. sp_384_proj_point_add_qz1_12(t, s1, s2, tmp);
  110969. sp_384_proj_to_affine_12(t, tmp);
  110970. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  110971. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  110972. }
  110973. }
  110974. }
  110975. #ifdef WOLFSSL_SP_SMALL_STACK
  110976. if (t != NULL)
  110977. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  110978. #endif
  110979. return err;
  110980. }
  110981. #endif /* FP_ECC */
  110982. #ifndef WC_NO_CACHE_RESISTANT
  110983. /* Touch each possible entry that could be being copied.
  110984. *
  110985. * r Point to copy into.
  110986. * table Table - start of the entries to access
  110987. * idx Index of entry to retrieve.
  110988. */
  110989. static void sp_384_get_entry_16_12(sp_point_384* r,
  110990. const sp_table_entry_384* table, int idx)
  110991. {
  110992. int i;
  110993. sp_digit mask;
  110994. r->x[0] = 0;
  110995. r->x[1] = 0;
  110996. r->x[2] = 0;
  110997. r->x[3] = 0;
  110998. r->x[4] = 0;
  110999. r->x[5] = 0;
  111000. r->x[6] = 0;
  111001. r->x[7] = 0;
  111002. r->x[8] = 0;
  111003. r->x[9] = 0;
  111004. r->x[10] = 0;
  111005. r->x[11] = 0;
  111006. r->y[0] = 0;
  111007. r->y[1] = 0;
  111008. r->y[2] = 0;
  111009. r->y[3] = 0;
  111010. r->y[4] = 0;
  111011. r->y[5] = 0;
  111012. r->y[6] = 0;
  111013. r->y[7] = 0;
  111014. r->y[8] = 0;
  111015. r->y[9] = 0;
  111016. r->y[10] = 0;
  111017. r->y[11] = 0;
  111018. for (i = 1; i < 16; i++) {
  111019. mask = 0 - (i == idx);
  111020. r->x[0] |= mask & table[i].x[0];
  111021. r->x[1] |= mask & table[i].x[1];
  111022. r->x[2] |= mask & table[i].x[2];
  111023. r->x[3] |= mask & table[i].x[3];
  111024. r->x[4] |= mask & table[i].x[4];
  111025. r->x[5] |= mask & table[i].x[5];
  111026. r->x[6] |= mask & table[i].x[6];
  111027. r->x[7] |= mask & table[i].x[7];
  111028. r->x[8] |= mask & table[i].x[8];
  111029. r->x[9] |= mask & table[i].x[9];
  111030. r->x[10] |= mask & table[i].x[10];
  111031. r->x[11] |= mask & table[i].x[11];
  111032. r->y[0] |= mask & table[i].y[0];
  111033. r->y[1] |= mask & table[i].y[1];
  111034. r->y[2] |= mask & table[i].y[2];
  111035. r->y[3] |= mask & table[i].y[3];
  111036. r->y[4] |= mask & table[i].y[4];
  111037. r->y[5] |= mask & table[i].y[5];
  111038. r->y[6] |= mask & table[i].y[6];
  111039. r->y[7] |= mask & table[i].y[7];
  111040. r->y[8] |= mask & table[i].y[8];
  111041. r->y[9] |= mask & table[i].y[9];
  111042. r->y[10] |= mask & table[i].y[10];
  111043. r->y[11] |= mask & table[i].y[11];
  111044. }
  111045. }
  111046. #endif /* !WC_NO_CACHE_RESISTANT */
  111047. /* Multiply the point by the scalar and return the result.
  111048. * If map is true then convert result to affine coordinates.
  111049. *
  111050. * Stripe implementation.
  111051. * Pre-generated: 2^0, 2^96, ...
  111052. * Pre-generated: products of all combinations of above.
  111053. * 4 doubles and adds (with qz=1)
  111054. *
  111055. * r Resulting point.
  111056. * k Scalar to multiply by.
  111057. * table Pre-computed table.
  111058. * map Indicates whether to convert result to affine.
  111059. * ct Constant time required.
  111060. * heap Heap to use for allocation.
  111061. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111062. */
  111063. static int sp_384_ecc_mulmod_stripe_12(sp_point_384* r, const sp_point_384* g,
  111064. const sp_table_entry_384* table, const sp_digit* k, int map,
  111065. int ct, void* heap)
  111066. {
  111067. #ifdef WOLFSSL_SP_SMALL_STACK
  111068. sp_point_384* rt = NULL;
  111069. sp_digit* t = NULL;
  111070. #else
  111071. sp_point_384 rt[2];
  111072. sp_digit t[2 * 12 * 6];
  111073. #endif
  111074. sp_point_384* p = NULL;
  111075. int i;
  111076. int j;
  111077. int y;
  111078. int x;
  111079. int err = MP_OKAY;
  111080. (void)g;
  111081. /* Constant time used for cache attack resistance implementation. */
  111082. (void)ct;
  111083. (void)heap;
  111084. #ifdef WOLFSSL_SP_SMALL_STACK
  111085. rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  111086. DYNAMIC_TYPE_ECC);
  111087. if (rt == NULL)
  111088. err = MEMORY_E;
  111089. if (err == MP_OKAY) {
  111090. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  111091. DYNAMIC_TYPE_ECC);
  111092. if (t == NULL)
  111093. err = MEMORY_E;
  111094. }
  111095. #endif
  111096. if (err == MP_OKAY) {
  111097. p = rt + 1;
  111098. XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
  111099. XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
  111100. y = 0;
  111101. x = 95;
  111102. for (j=0; j<4; j++) {
  111103. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  111104. x += 96;
  111105. }
  111106. #ifndef WC_NO_CACHE_RESISTANT
  111107. if (ct) {
  111108. sp_384_get_entry_16_12(rt, table, y);
  111109. } else
  111110. #endif
  111111. {
  111112. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  111113. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  111114. }
  111115. rt->infinity = !y;
  111116. for (i=94; i>=0; i--) {
  111117. y = 0;
  111118. x = i;
  111119. for (j=0; j<4; j++) {
  111120. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  111121. x += 96;
  111122. }
  111123. sp_384_proj_point_dbl_12(rt, rt, t);
  111124. #ifndef WC_NO_CACHE_RESISTANT
  111125. if (ct) {
  111126. sp_384_get_entry_16_12(p, table, y);
  111127. }
  111128. else
  111129. #endif
  111130. {
  111131. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  111132. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  111133. }
  111134. p->infinity = !y;
  111135. sp_384_proj_point_add_qz1_12(rt, rt, p, t);
  111136. }
  111137. if (map != 0) {
  111138. sp_384_map_12(r, rt, t);
  111139. }
  111140. else {
  111141. XMEMCPY(r, rt, sizeof(sp_point_384));
  111142. }
  111143. }
  111144. #ifdef WOLFSSL_SP_SMALL_STACK
  111145. if (t != NULL)
  111146. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  111147. if (rt != NULL)
  111148. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  111149. #endif
  111150. return err;
  111151. }
  111152. #ifdef FP_ECC
  111153. #ifndef FP_ENTRIES
  111154. #define FP_ENTRIES 16
  111155. #endif
  111156. /* Cache entry - holds precomputation tables for a point. */
  111157. typedef struct sp_cache_384_t {
  111158. /* X ordinate of point that table was generated from. */
  111159. sp_digit x[12];
  111160. /* Y ordinate of point that table was generated from. */
  111161. sp_digit y[12];
  111162. /* Precomputation table for point. */
  111163. sp_table_entry_384 table[16];
  111164. /* Count of entries in table. */
  111165. uint32_t cnt;
  111166. /* Point and table set in entry. */
  111167. int set;
  111168. } sp_cache_384_t;
  111169. /* Cache of tables. */
  111170. static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
  111171. /* Index of last entry in cache. */
  111172. static THREAD_LS_T int sp_cache_384_last = -1;
  111173. /* Cache has been initialized. */
  111174. static THREAD_LS_T int sp_cache_384_inited = 0;
  111175. #ifndef HAVE_THREAD_LS
  111176. static volatile int initCacheMutex_384 = 0;
  111177. static wolfSSL_Mutex sp_cache_384_lock;
  111178. #endif
  111179. /* Get the cache entry for the point.
  111180. *
  111181. * g [in] Point scalar multiplying.
  111182. * cache [out] Cache table to use.
  111183. */
  111184. static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
  111185. {
  111186. int i;
  111187. int j;
  111188. uint32_t least;
  111189. if (sp_cache_384_inited == 0) {
  111190. for (i=0; i<FP_ENTRIES; i++) {
  111191. sp_cache_384[i].set = 0;
  111192. }
  111193. sp_cache_384_inited = 1;
  111194. }
  111195. /* Compare point with those in cache. */
  111196. for (i=0; i<FP_ENTRIES; i++) {
  111197. if (!sp_cache_384[i].set)
  111198. continue;
  111199. if (sp_384_cmp_equal_12(g->x, sp_cache_384[i].x) &
  111200. sp_384_cmp_equal_12(g->y, sp_cache_384[i].y)) {
  111201. sp_cache_384[i].cnt++;
  111202. break;
  111203. }
  111204. }
  111205. /* No match. */
  111206. if (i == FP_ENTRIES) {
  111207. /* Find empty entry. */
  111208. i = (sp_cache_384_last + 1) % FP_ENTRIES;
  111209. for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
  111210. if (!sp_cache_384[i].set) {
  111211. break;
  111212. }
  111213. }
  111214. /* Evict least used. */
  111215. if (i == sp_cache_384_last) {
  111216. least = sp_cache_384[0].cnt;
  111217. for (j=1; j<FP_ENTRIES; j++) {
  111218. if (sp_cache_384[j].cnt < least) {
  111219. i = j;
  111220. least = sp_cache_384[i].cnt;
  111221. }
  111222. }
  111223. }
  111224. XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
  111225. XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
  111226. sp_cache_384[i].set = 1;
  111227. sp_cache_384[i].cnt = 1;
  111228. }
  111229. *cache = &sp_cache_384[i];
  111230. sp_cache_384_last = i;
  111231. }
  111232. #endif /* FP_ECC */
  111233. /* Multiply the base point of P384 by the scalar and return the result.
  111234. * If map is true then convert result to affine coordinates.
  111235. *
  111236. * r Resulting point.
  111237. * g Point to multiply.
  111238. * k Scalar to multiply by.
  111239. * map Indicates whether to convert result to affine.
  111240. * ct Constant time required.
  111241. * heap Heap to use for allocation.
  111242. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111243. */
  111244. static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g,
  111245. const sp_digit* k, int map, int ct, void* heap)
  111246. {
  111247. #ifndef FP_ECC
  111248. return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  111249. #else
  111250. #ifdef WOLFSSL_SP_SMALL_STACK
  111251. sp_digit* tmp;
  111252. #else
  111253. sp_digit tmp[2 * 12 * 7];
  111254. #endif
  111255. sp_cache_384_t* cache;
  111256. int err = MP_OKAY;
  111257. #ifdef WOLFSSL_SP_SMALL_STACK
  111258. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 7, heap, DYNAMIC_TYPE_ECC);
  111259. if (tmp == NULL) {
  111260. err = MEMORY_E;
  111261. }
  111262. #endif
  111263. #ifndef HAVE_THREAD_LS
  111264. if (err == MP_OKAY) {
  111265. if (initCacheMutex_384 == 0) {
  111266. wc_InitMutex(&sp_cache_384_lock);
  111267. initCacheMutex_384 = 1;
  111268. }
  111269. if (wc_LockMutex(&sp_cache_384_lock) != 0) {
  111270. err = BAD_MUTEX_E;
  111271. }
  111272. }
  111273. #endif /* HAVE_THREAD_LS */
  111274. if (err == MP_OKAY) {
  111275. sp_ecc_get_cache_384(g, &cache);
  111276. if (cache->cnt == 2)
  111277. sp_384_gen_stripe_table_12(g, cache->table, tmp, heap);
  111278. #ifndef HAVE_THREAD_LS
  111279. wc_UnLockMutex(&sp_cache_384_lock);
  111280. #endif /* HAVE_THREAD_LS */
  111281. if (cache->cnt < 2) {
  111282. err = sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  111283. }
  111284. else {
  111285. err = sp_384_ecc_mulmod_stripe_12(r, g, cache->table, k,
  111286. map, ct, heap);
  111287. }
  111288. }
  111289. #ifdef WOLFSSL_SP_SMALL_STACK
  111290. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  111291. #endif
  111292. return err;
  111293. #endif
  111294. }
  111295. #else
  111296. #ifdef FP_ECC
  111297. /* Generate the pre-computed table of points for the base point.
  111298. *
  111299. * width = 8
  111300. * 256 entries
  111301. * 48 bits between
  111302. *
  111303. * a The base point.
  111304. * table Place to store generated point data.
  111305. * tmp Temporary data.
  111306. * heap Heap to use for allocation.
  111307. */
  111308. static int sp_384_gen_stripe_table_12(const sp_point_384* a,
  111309. sp_table_entry_384* table, sp_digit* tmp, void* heap)
  111310. {
  111311. #ifdef WOLFSSL_SP_SMALL_STACK
  111312. sp_point_384* t = NULL;
  111313. #else
  111314. sp_point_384 t[3];
  111315. #endif
  111316. sp_point_384* s1 = NULL;
  111317. sp_point_384* s2 = NULL;
  111318. int i;
  111319. int j;
  111320. int err = MP_OKAY;
  111321. (void)heap;
  111322. #ifdef WOLFSSL_SP_SMALL_STACK
  111323. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
  111324. DYNAMIC_TYPE_ECC);
  111325. if (t == NULL)
  111326. err = MEMORY_E;
  111327. #endif
  111328. if (err == MP_OKAY) {
  111329. s1 = t + 1;
  111330. s2 = t + 2;
  111331. err = sp_384_mod_mul_norm_12(t->x, a->x, p384_mod);
  111332. }
  111333. if (err == MP_OKAY) {
  111334. err = sp_384_mod_mul_norm_12(t->y, a->y, p384_mod);
  111335. }
  111336. if (err == MP_OKAY) {
  111337. err = sp_384_mod_mul_norm_12(t->z, a->z, p384_mod);
  111338. }
  111339. if (err == MP_OKAY) {
  111340. t->infinity = 0;
  111341. sp_384_proj_to_affine_12(t, tmp);
  111342. XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
  111343. s1->infinity = 0;
  111344. XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
  111345. s2->infinity = 0;
  111346. /* table[0] = {0, 0, infinity} */
  111347. XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
  111348. /* table[1] = Affine version of 'a' in Montgomery form */
  111349. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  111350. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  111351. for (i=1; i<8; i++) {
  111352. sp_384_proj_point_dbl_n_12(t, 48, tmp);
  111353. sp_384_proj_to_affine_12(t, tmp);
  111354. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  111355. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  111356. }
  111357. for (i=1; i<8; i++) {
  111358. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  111359. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  111360. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  111361. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  111362. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  111363. sp_384_proj_point_add_qz1_12(t, s1, s2, tmp);
  111364. sp_384_proj_to_affine_12(t, tmp);
  111365. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  111366. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  111367. }
  111368. }
  111369. }
  111370. #ifdef WOLFSSL_SP_SMALL_STACK
  111371. if (t != NULL)
  111372. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  111373. #endif
  111374. return err;
  111375. }
  111376. #endif /* FP_ECC */
  111377. #ifndef WC_NO_CACHE_RESISTANT
  111378. /* Touch each possible entry that could be being copied.
  111379. *
  111380. * r Point to copy into.
  111381. * table Table - start of the entries to access
  111382. * idx Index of entry to retrieve.
  111383. */
  111384. static void sp_384_get_entry_256_12(sp_point_384* r,
  111385. const sp_table_entry_384* table, int idx)
  111386. {
  111387. int i;
  111388. sp_digit mask;
  111389. r->x[0] = 0;
  111390. r->x[1] = 0;
  111391. r->x[2] = 0;
  111392. r->x[3] = 0;
  111393. r->x[4] = 0;
  111394. r->x[5] = 0;
  111395. r->x[6] = 0;
  111396. r->x[7] = 0;
  111397. r->x[8] = 0;
  111398. r->x[9] = 0;
  111399. r->x[10] = 0;
  111400. r->x[11] = 0;
  111401. r->y[0] = 0;
  111402. r->y[1] = 0;
  111403. r->y[2] = 0;
  111404. r->y[3] = 0;
  111405. r->y[4] = 0;
  111406. r->y[5] = 0;
  111407. r->y[6] = 0;
  111408. r->y[7] = 0;
  111409. r->y[8] = 0;
  111410. r->y[9] = 0;
  111411. r->y[10] = 0;
  111412. r->y[11] = 0;
  111413. for (i = 1; i < 256; i++) {
  111414. mask = 0 - (i == idx);
  111415. r->x[0] |= mask & table[i].x[0];
  111416. r->x[1] |= mask & table[i].x[1];
  111417. r->x[2] |= mask & table[i].x[2];
  111418. r->x[3] |= mask & table[i].x[3];
  111419. r->x[4] |= mask & table[i].x[4];
  111420. r->x[5] |= mask & table[i].x[5];
  111421. r->x[6] |= mask & table[i].x[6];
  111422. r->x[7] |= mask & table[i].x[7];
  111423. r->x[8] |= mask & table[i].x[8];
  111424. r->x[9] |= mask & table[i].x[9];
  111425. r->x[10] |= mask & table[i].x[10];
  111426. r->x[11] |= mask & table[i].x[11];
  111427. r->y[0] |= mask & table[i].y[0];
  111428. r->y[1] |= mask & table[i].y[1];
  111429. r->y[2] |= mask & table[i].y[2];
  111430. r->y[3] |= mask & table[i].y[3];
  111431. r->y[4] |= mask & table[i].y[4];
  111432. r->y[5] |= mask & table[i].y[5];
  111433. r->y[6] |= mask & table[i].y[6];
  111434. r->y[7] |= mask & table[i].y[7];
  111435. r->y[8] |= mask & table[i].y[8];
  111436. r->y[9] |= mask & table[i].y[9];
  111437. r->y[10] |= mask & table[i].y[10];
  111438. r->y[11] |= mask & table[i].y[11];
  111439. }
  111440. }
  111441. #endif /* !WC_NO_CACHE_RESISTANT */
  111442. /* Multiply the point by the scalar and return the result.
  111443. * If map is true then convert result to affine coordinates.
  111444. *
  111445. * Stripe implementation.
  111446. * Pre-generated: 2^0, 2^48, ...
  111447. * Pre-generated: products of all combinations of above.
  111448. * 8 doubles and adds (with qz=1)
  111449. *
  111450. * r Resulting point.
  111451. * k Scalar to multiply by.
  111452. * table Pre-computed table.
  111453. * map Indicates whether to convert result to affine.
  111454. * ct Constant time required.
  111455. * heap Heap to use for allocation.
  111456. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111457. */
  111458. static int sp_384_ecc_mulmod_stripe_12(sp_point_384* r, const sp_point_384* g,
  111459. const sp_table_entry_384* table, const sp_digit* k, int map,
  111460. int ct, void* heap)
  111461. {
  111462. #ifdef WOLFSSL_SP_SMALL_STACK
  111463. sp_point_384* rt = NULL;
  111464. sp_digit* t = NULL;
  111465. #else
  111466. sp_point_384 rt[2];
  111467. sp_digit t[2 * 12 * 6];
  111468. #endif
  111469. sp_point_384* p = NULL;
  111470. int i;
  111471. int j;
  111472. int y;
  111473. int x;
  111474. int err = MP_OKAY;
  111475. (void)g;
  111476. /* Constant time used for cache attack resistance implementation. */
  111477. (void)ct;
  111478. (void)heap;
  111479. #ifdef WOLFSSL_SP_SMALL_STACK
  111480. rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  111481. DYNAMIC_TYPE_ECC);
  111482. if (rt == NULL)
  111483. err = MEMORY_E;
  111484. if (err == MP_OKAY) {
  111485. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  111486. DYNAMIC_TYPE_ECC);
  111487. if (t == NULL)
  111488. err = MEMORY_E;
  111489. }
  111490. #endif
  111491. if (err == MP_OKAY) {
  111492. p = rt + 1;
  111493. XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
  111494. XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
  111495. y = 0;
  111496. x = 47;
  111497. for (j=0; j<8; j++) {
  111498. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  111499. x += 48;
  111500. }
  111501. #ifndef WC_NO_CACHE_RESISTANT
  111502. if (ct) {
  111503. sp_384_get_entry_256_12(rt, table, y);
  111504. } else
  111505. #endif
  111506. {
  111507. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  111508. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  111509. }
  111510. rt->infinity = !y;
  111511. for (i=46; i>=0; i--) {
  111512. y = 0;
  111513. x = i;
  111514. for (j=0; j<8; j++) {
  111515. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  111516. x += 48;
  111517. }
  111518. sp_384_proj_point_dbl_12(rt, rt, t);
  111519. #ifndef WC_NO_CACHE_RESISTANT
  111520. if (ct) {
  111521. sp_384_get_entry_256_12(p, table, y);
  111522. }
  111523. else
  111524. #endif
  111525. {
  111526. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  111527. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  111528. }
  111529. p->infinity = !y;
  111530. sp_384_proj_point_add_qz1_12(rt, rt, p, t);
  111531. }
  111532. if (map != 0) {
  111533. sp_384_map_12(r, rt, t);
  111534. }
  111535. else {
  111536. XMEMCPY(r, rt, sizeof(sp_point_384));
  111537. }
  111538. }
  111539. #ifdef WOLFSSL_SP_SMALL_STACK
  111540. if (t != NULL)
  111541. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  111542. if (rt != NULL)
  111543. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  111544. #endif
  111545. return err;
  111546. }
  111547. #ifdef FP_ECC
  111548. #ifndef FP_ENTRIES
  111549. #define FP_ENTRIES 16
  111550. #endif
  111551. /* Cache entry - holds precomputation tables for a point. */
  111552. typedef struct sp_cache_384_t {
  111553. /* X ordinate of point that table was generated from. */
  111554. sp_digit x[12];
  111555. /* Y ordinate of point that table was generated from. */
  111556. sp_digit y[12];
  111557. /* Precomputation table for point. */
  111558. sp_table_entry_384 table[256];
  111559. /* Count of entries in table. */
  111560. uint32_t cnt;
  111561. /* Point and table set in entry. */
  111562. int set;
  111563. } sp_cache_384_t;
  111564. /* Cache of tables. */
  111565. static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
  111566. /* Index of last entry in cache. */
  111567. static THREAD_LS_T int sp_cache_384_last = -1;
  111568. /* Cache has been initialized. */
  111569. static THREAD_LS_T int sp_cache_384_inited = 0;
  111570. #ifndef HAVE_THREAD_LS
  111571. static volatile int initCacheMutex_384 = 0;
  111572. static wolfSSL_Mutex sp_cache_384_lock;
  111573. #endif
  111574. /* Get the cache entry for the point.
  111575. *
  111576. * g [in] Point scalar multiplying.
  111577. * cache [out] Cache table to use.
  111578. */
  111579. static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
  111580. {
  111581. int i;
  111582. int j;
  111583. uint32_t least;
  111584. if (sp_cache_384_inited == 0) {
  111585. for (i=0; i<FP_ENTRIES; i++) {
  111586. sp_cache_384[i].set = 0;
  111587. }
  111588. sp_cache_384_inited = 1;
  111589. }
  111590. /* Compare point with those in cache. */
  111591. for (i=0; i<FP_ENTRIES; i++) {
  111592. if (!sp_cache_384[i].set)
  111593. continue;
  111594. if (sp_384_cmp_equal_12(g->x, sp_cache_384[i].x) &
  111595. sp_384_cmp_equal_12(g->y, sp_cache_384[i].y)) {
  111596. sp_cache_384[i].cnt++;
  111597. break;
  111598. }
  111599. }
  111600. /* No match. */
  111601. if (i == FP_ENTRIES) {
  111602. /* Find empty entry. */
  111603. i = (sp_cache_384_last + 1) % FP_ENTRIES;
  111604. for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
  111605. if (!sp_cache_384[i].set) {
  111606. break;
  111607. }
  111608. }
  111609. /* Evict least used. */
  111610. if (i == sp_cache_384_last) {
  111611. least = sp_cache_384[0].cnt;
  111612. for (j=1; j<FP_ENTRIES; j++) {
  111613. if (sp_cache_384[j].cnt < least) {
  111614. i = j;
  111615. least = sp_cache_384[i].cnt;
  111616. }
  111617. }
  111618. }
  111619. XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
  111620. XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
  111621. sp_cache_384[i].set = 1;
  111622. sp_cache_384[i].cnt = 1;
  111623. }
  111624. *cache = &sp_cache_384[i];
  111625. sp_cache_384_last = i;
  111626. }
  111627. #endif /* FP_ECC */
  111628. /* Multiply the base point of P384 by the scalar and return the result.
  111629. * If map is true then convert result to affine coordinates.
  111630. *
  111631. * r Resulting point.
  111632. * g Point to multiply.
  111633. * k Scalar to multiply by.
  111634. * map Indicates whether to convert result to affine.
  111635. * ct Constant time required.
  111636. * heap Heap to use for allocation.
  111637. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111638. */
  111639. static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g,
  111640. const sp_digit* k, int map, int ct, void* heap)
  111641. {
  111642. #ifndef FP_ECC
  111643. return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  111644. #else
  111645. #ifdef WOLFSSL_SP_SMALL_STACK
  111646. sp_digit* tmp;
  111647. #else
  111648. sp_digit tmp[2 * 12 * 7];
  111649. #endif
  111650. sp_cache_384_t* cache;
  111651. int err = MP_OKAY;
  111652. #ifdef WOLFSSL_SP_SMALL_STACK
  111653. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 7, heap, DYNAMIC_TYPE_ECC);
  111654. if (tmp == NULL) {
  111655. err = MEMORY_E;
  111656. }
  111657. #endif
  111658. #ifndef HAVE_THREAD_LS
  111659. if (err == MP_OKAY) {
  111660. if (initCacheMutex_384 == 0) {
  111661. wc_InitMutex(&sp_cache_384_lock);
  111662. initCacheMutex_384 = 1;
  111663. }
  111664. if (wc_LockMutex(&sp_cache_384_lock) != 0) {
  111665. err = BAD_MUTEX_E;
  111666. }
  111667. }
  111668. #endif /* HAVE_THREAD_LS */
  111669. if (err == MP_OKAY) {
  111670. sp_ecc_get_cache_384(g, &cache);
  111671. if (cache->cnt == 2)
  111672. sp_384_gen_stripe_table_12(g, cache->table, tmp, heap);
  111673. #ifndef HAVE_THREAD_LS
  111674. wc_UnLockMutex(&sp_cache_384_lock);
  111675. #endif /* HAVE_THREAD_LS */
  111676. if (cache->cnt < 2) {
  111677. err = sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  111678. }
  111679. else {
  111680. err = sp_384_ecc_mulmod_stripe_12(r, g, cache->table, k,
  111681. map, ct, heap);
  111682. }
  111683. }
  111684. #ifdef WOLFSSL_SP_SMALL_STACK
  111685. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  111686. #endif
  111687. return err;
  111688. #endif
  111689. }
  111690. #endif /* WOLFSSL_SP_SMALL */
  111691. /* Multiply the point by the scalar and return the result.
  111692. * If map is true then convert result to affine coordinates.
  111693. *
  111694. * km Scalar to multiply by.
  111695. * p Point to multiply.
  111696. * r Resulting point.
  111697. * map Indicates whether to convert result to affine.
  111698. * heap Heap to use for allocation.
  111699. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111700. */
  111701. int sp_ecc_mulmod_384(const mp_int* km, const ecc_point* gm, ecc_point* r,
  111702. int map, void* heap)
  111703. {
  111704. #ifdef WOLFSSL_SP_SMALL_STACK
  111705. sp_point_384* point = NULL;
  111706. sp_digit* k = NULL;
  111707. #else
  111708. sp_point_384 point[1];
  111709. sp_digit k[12];
  111710. #endif
  111711. int err = MP_OKAY;
  111712. #ifdef WOLFSSL_SP_SMALL_STACK
  111713. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  111714. DYNAMIC_TYPE_ECC);
  111715. if (point == NULL)
  111716. err = MEMORY_E;
  111717. if (err == MP_OKAY) {
  111718. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  111719. DYNAMIC_TYPE_ECC);
  111720. if (k == NULL)
  111721. err = MEMORY_E;
  111722. }
  111723. #endif
  111724. if (err == MP_OKAY) {
  111725. sp_384_from_mp(k, 12, km);
  111726. sp_384_point_from_ecc_point_12(point, gm);
  111727. err = sp_384_ecc_mulmod_12(point, point, k, map, 1, heap);
  111728. }
  111729. if (err == MP_OKAY) {
  111730. err = sp_384_point_to_ecc_point_12(point, r);
  111731. }
  111732. #ifdef WOLFSSL_SP_SMALL_STACK
  111733. if (k != NULL)
  111734. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  111735. if (point != NULL)
  111736. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  111737. #endif
  111738. return err;
  111739. }
  111740. /* Multiply the point by the scalar, add point a and return the result.
  111741. * If map is true then convert result to affine coordinates.
  111742. *
  111743. * km Scalar to multiply by.
  111744. * p Point to multiply.
  111745. * am Point to add to scalar multiply result.
  111746. * inMont Point to add is in montgomery form.
  111747. * r Resulting point.
  111748. * map Indicates whether to convert result to affine.
  111749. * heap Heap to use for allocation.
  111750. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111751. */
  111752. int sp_ecc_mulmod_add_384(const mp_int* km, const ecc_point* gm,
  111753. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  111754. {
  111755. #ifdef WOLFSSL_SP_SMALL_STACK
  111756. sp_point_384* point = NULL;
  111757. sp_digit* k = NULL;
  111758. #else
  111759. sp_point_384 point[2];
  111760. sp_digit k[12 + 12 * 2 * 6];
  111761. #endif
  111762. sp_point_384* addP = NULL;
  111763. sp_digit* tmp = NULL;
  111764. int err = MP_OKAY;
  111765. #ifdef WOLFSSL_SP_SMALL_STACK
  111766. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  111767. DYNAMIC_TYPE_ECC);
  111768. if (point == NULL)
  111769. err = MEMORY_E;
  111770. if (err == MP_OKAY) {
  111771. k = (sp_digit*)XMALLOC(
  111772. sizeof(sp_digit) * (12 + 12 * 2 * 6), heap,
  111773. DYNAMIC_TYPE_ECC);
  111774. if (k == NULL)
  111775. err = MEMORY_E;
  111776. }
  111777. #endif
  111778. if (err == MP_OKAY) {
  111779. addP = point + 1;
  111780. tmp = k + 12;
  111781. sp_384_from_mp(k, 12, km);
  111782. sp_384_point_from_ecc_point_12(point, gm);
  111783. sp_384_point_from_ecc_point_12(addP, am);
  111784. }
  111785. if ((err == MP_OKAY) && (!inMont)) {
  111786. err = sp_384_mod_mul_norm_12(addP->x, addP->x, p384_mod);
  111787. }
  111788. if ((err == MP_OKAY) && (!inMont)) {
  111789. err = sp_384_mod_mul_norm_12(addP->y, addP->y, p384_mod);
  111790. }
  111791. if ((err == MP_OKAY) && (!inMont)) {
  111792. err = sp_384_mod_mul_norm_12(addP->z, addP->z, p384_mod);
  111793. }
  111794. if (err == MP_OKAY) {
  111795. err = sp_384_ecc_mulmod_12(point, point, k, 0, 0, heap);
  111796. }
  111797. if (err == MP_OKAY) {
  111798. sp_384_proj_point_add_12(point, point, addP, tmp);
  111799. if (map) {
  111800. sp_384_map_12(point, point, tmp);
  111801. }
  111802. err = sp_384_point_to_ecc_point_12(point, r);
  111803. }
  111804. #ifdef WOLFSSL_SP_SMALL_STACK
  111805. if (k != NULL)
  111806. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  111807. if (point != NULL)
  111808. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  111809. #endif
  111810. return err;
  111811. }
  111812. #ifdef WOLFSSL_SP_SMALL
  111813. /* Striping precomputation table.
  111814. * 4 points combined into a table of 16 points.
  111815. * Distance of 96 between points.
  111816. */
  111817. static const sp_table_entry_384 p384_table[16] = {
  111818. /* 0 */
  111819. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  111820. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  111821. /* 1 */
  111822. { { 0x49c0b528,0x3dd07566,0xa0d6ce38,0x20e378e2,0x541b4d6e,0x879c3afc,
  111823. 0x59a30eff,0x64548684,0x614ede2b,0x812ff723,0x299e1513,0x4d3aadc2 },
  111824. { 0x4b03a4fe,0x23043dad,0x7bb4a9ac,0xa1bfa8bf,0x2e83b050,0x8bade756,
  111825. 0x68f4ffd9,0xc6c35219,0x3969a840,0xdd800226,0x5a15c5e9,0x2b78abc2 } },
  111826. /* 2 */
  111827. { { 0xf26feef9,0x24480c57,0x3a0e1240,0xc31a2694,0x273e2bc7,0x735002c3,
  111828. 0x3ef1ed4c,0x8c42e9c5,0x7f4948e8,0x028babf6,0x8a978632,0x6a502f43 },
  111829. { 0xb74536fe,0xf5f13a46,0xd8a9f0eb,0x1d218bab,0x37232768,0x30f36bcc,
  111830. 0x576e8c18,0xc5317b31,0x9bbcb766,0xef1d57a6,0xb3e3d4dc,0x917c4930 } },
  111831. /* 3 */
  111832. { { 0xe349ddd0,0x11426e2e,0x9b2fc250,0x9f117ef9,0xec0174a6,0xff36b480,
  111833. 0x18458466,0x4f4bde76,0x05806049,0x2f2edb6d,0x19dfca92,0x8adc75d1 },
  111834. { 0xb7d5a7ce,0xa619d097,0xa34411e9,0x874275e5,0x0da4b4ef,0x5403e047,
  111835. 0x77901d8f,0x2ebaafd9,0xa747170f,0x5e63ebce,0x7f9d8036,0x12a36944 } },
  111836. /* 4 */
  111837. { { 0x2f9fbe67,0x378205de,0x7f728e44,0xc4afcb83,0x682e00f1,0xdbcec06c,
  111838. 0x114d5423,0xf2a145c3,0x7a52463e,0xa01d9874,0x7d717b0a,0xfc0935b1 },
  111839. { 0xd4d01f95,0x9653bc4f,0x9560ad34,0x9aa83ea8,0xaf8e3f3f,0xf77943dc,
  111840. 0xe86fe16e,0x70774a10,0xbf9ffdcf,0x6b62e6f1,0x588745c9,0x8a72f39e } },
  111841. /* 5 */
  111842. { { 0x2341c342,0x73ade4da,0xea704422,0xdd326e54,0x3741cef3,0x336c7d98,
  111843. 0x59e61549,0x1eafa00d,0xbd9a3efd,0xcd3ed892,0xc5c6c7e4,0x03faf26c },
  111844. { 0x3045f8ac,0x087e2fcf,0x174f1e73,0x14a65532,0xfe0af9a7,0x2cf84f28,
  111845. 0x2cdc935b,0xddfd7a84,0x6929c895,0x4c0f117b,0x4c8bcfcc,0x356572d6 } },
  111846. /* 6 */
  111847. { { 0x3f3b236f,0xfab08607,0x81e221da,0x19e9d41d,0x3927b428,0xf3f6571e,
  111848. 0x7550f1f6,0x4348a933,0xa85e62f0,0x7167b996,0x7f5452bf,0x62d43759 },
  111849. { 0xf2955926,0xd85feb9e,0x6df78353,0x440a561f,0x9ca36b59,0x389668ec,
  111850. 0xa22da016,0x052bf1a1,0xf6093254,0xbdfbff72,0xe22209f3,0x94e50f28 } },
  111851. /* 7 */
  111852. { { 0x3062e8af,0x90b2e5b3,0xe8a3d369,0xa8572375,0x201db7b1,0x3fe1b00b,
  111853. 0xee651aa2,0xe926def0,0xb9b10ad7,0x6542c9be,0xa2fcbe74,0x098e309b },
  111854. { 0xfff1d63f,0x779deeb3,0x20bfd374,0x23d0e80a,0x8768f797,0x8452bb3b,
  111855. 0x1f952856,0xcf75bb4d,0x29ea3faa,0x8fe6b400,0x81373a53,0x12bd3e40 } },
  111856. /* 8 */
  111857. { { 0x16973cf4,0x070d34e1,0x7e4f34f7,0x20aee08b,0x5eb8ad29,0x269af9b9,
  111858. 0xa6a45dda,0xdde0a036,0x63df41e0,0xa18b528e,0xa260df2a,0x03cc71b2 },
  111859. { 0xa06b1dd7,0x24a6770a,0x9d2675d3,0x5bfa9c11,0x96844432,0x73c1e2a1,
  111860. 0x131a6cf0,0x3660558d,0x2ee79454,0xb0289c83,0xc6d8ddcd,0xa6aefb01 } },
  111861. /* 9 */
  111862. { { 0x01ab5245,0xba1464b4,0xc48d93ff,0x9b8d0b6d,0x93ad272c,0x939867dc,
  111863. 0xae9fdc77,0xbebe085e,0x894ea8bd,0x73ae5103,0x39ac22e1,0x740fc89a },
  111864. { 0x28e23b23,0x5e28b0a3,0xe13104d0,0x2352722e,0xb0a2640d,0xf4667a18,
  111865. 0x49bb37c3,0xac74a72e,0xe81e183a,0x79f734f0,0x3fd9c0eb,0xbffe5b6c } },
  111866. /* 10 */
  111867. { { 0x00623f3b,0x03cf2922,0x5f29ebff,0x095c7111,0x80aa6823,0x42d72247,
  111868. 0x7458c0b0,0x044c7ba1,0x0959ec20,0xca62f7ef,0xf8ca929f,0x40ae2ab7 },
  111869. { 0xa927b102,0xb8c5377a,0xdc031771,0x398a86a0,0xc216a406,0x04908f9d,
  111870. 0x918d3300,0xb423a73a,0xe0b94739,0x634b0ff1,0x2d69f697,0xe29de725 } },
  111871. /* 11 */
  111872. { { 0x8435af04,0x744d1400,0xfec192da,0x5f255b1d,0x336dc542,0x1f17dc12,
  111873. 0x636a68a8,0x5c90c2a7,0x7704ca1e,0x960c9eb7,0x6fb3d65a,0x9de8cf1e },
  111874. { 0x511d3d06,0xc60fee0d,0xf9eb52c7,0x466e2313,0x206b0914,0x743c0f5f,
  111875. 0x2191aa4d,0x42f55bac,0xffebdbc2,0xcefc7c8f,0xe6e8ed1c,0xd4fa6081 } },
  111876. /* 12 */
  111877. { { 0x98683186,0x867db639,0xddcc4ea9,0xfb5cf424,0xd4f0e7bd,0xcc9a7ffe,
  111878. 0x7a779f7e,0x7c57f71c,0xd6b25ef2,0x90774079,0xb4081680,0x90eae903 },
  111879. { 0x0ee1fceb,0xdf2aae5e,0xe86c1a1f,0x3ff1da24,0xca193edf,0x80f587d6,
  111880. 0xdc9b9d6a,0xa5695523,0x85920303,0x7b840900,0xba6dbdef,0x1efa4dfc } },
  111881. /* 13 */
  111882. { { 0xe0540015,0xfbd838f9,0xc39077dc,0x2c323946,0xad619124,0x8b1fb9e6,
  111883. 0x0ca62ea8,0x9612440c,0x2dbe00ff,0x9ad9b52c,0xae197643,0xf52abaa1 },
  111884. { 0x2cac32ad,0xd0e89894,0x62a98f91,0xdfb79e42,0x276f55cb,0x65452ecf,
  111885. 0x7ad23e12,0xdb1ac0d2,0xde4986f0,0xf68c5f6a,0x82ce327d,0x389ac37b } },
  111886. /* 14 */
  111887. { { 0xb8a9e8c9,0xcd96866d,0x5bb8091e,0xa11963b8,0x045b3cd2,0xc7f90d53,
  111888. 0x80f36504,0x755a72b5,0x21d3751c,0x46f8b399,0x53c193de,0x4bffdc91 },
  111889. { 0xb89554e7,0xcd15c049,0xf7a26be6,0x353c6754,0xbd41d970,0x79602370,
  111890. 0x12b176c0,0xde16470b,0x40c8809d,0x56ba1175,0xe435fb1e,0xe2db35c3 } },
  111891. /* 15 */
  111892. { { 0x6328e33f,0xd71e4aab,0xaf8136d1,0x5486782b,0x86d57231,0x07a4995f,
  111893. 0x1651a968,0xf1f0a5bd,0x76803b6d,0xa5dc5b24,0x42dda935,0x5c587cbc },
  111894. { 0xbae8b4c0,0x2b6cdb32,0xb1331138,0x66d1598b,0x5d7e9614,0x4a23b2d2,
  111895. 0x74a8c05d,0x93e402a6,0xda7ce82e,0x45ac94e6,0xe463d465,0xeb9f8281 } },
  111896. };
  111897. /* Multiply the base point of P384 by the scalar and return the result.
  111898. * If map is true then convert result to affine coordinates.
  111899. *
  111900. * Stripe implementation.
  111901. * Pre-generated: 2^0, 2^96, ...
  111902. * Pre-generated: products of all combinations of above.
  111903. * 4 doubles and adds (with qz=1)
  111904. *
  111905. * r Resulting point.
  111906. * k Scalar to multiply by.
  111907. * map Indicates whether to convert result to affine.
  111908. * ct Constant time required.
  111909. * heap Heap to use for allocation.
  111910. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111911. */
  111912. static int sp_384_ecc_mulmod_base_12(sp_point_384* r, const sp_digit* k,
  111913. int map, int ct, void* heap)
  111914. {
  111915. return sp_384_ecc_mulmod_stripe_12(r, &p384_base, p384_table,
  111916. k, map, ct, heap);
  111917. }
  111918. #else
  111919. /* Striping precomputation table.
  111920. * 8 points combined into a table of 256 points.
  111921. * Distance of 48 between points.
  111922. */
  111923. static const sp_table_entry_384 p384_table[256] = {
  111924. /* 0 */
  111925. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  111926. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  111927. /* 1 */
  111928. { { 0x49c0b528,0x3dd07566,0xa0d6ce38,0x20e378e2,0x541b4d6e,0x879c3afc,
  111929. 0x59a30eff,0x64548684,0x614ede2b,0x812ff723,0x299e1513,0x4d3aadc2 },
  111930. { 0x4b03a4fe,0x23043dad,0x7bb4a9ac,0xa1bfa8bf,0x2e83b050,0x8bade756,
  111931. 0x68f4ffd9,0xc6c35219,0x3969a840,0xdd800226,0x5a15c5e9,0x2b78abc2 } },
  111932. /* 2 */
  111933. { { 0x2b0c535b,0x29864753,0x70506296,0x90dd6953,0x216ab9ac,0x038cd6b4,
  111934. 0xbe12d76a,0x3df9b7b7,0x5f347bdb,0x13f4d978,0x13e94489,0x222c5c9c },
  111935. { 0x2680dc64,0x5f8e796f,0x58352417,0x120e7cb7,0xd10740b8,0x254b5d8a,
  111936. 0x5337dee6,0xc38b8efb,0x94f02247,0xf688c2e1,0x6c25bc4c,0x7b5c75f3 } },
  111937. /* 3 */
  111938. { { 0x9edffea5,0xe26a3cc3,0x37d7e9fc,0x35bbfd1c,0x9bde3ef6,0xf0e7700d,
  111939. 0x1a538f5a,0x0380eb47,0x05bf9eb3,0x2e9da8bb,0x1a460c3e,0xdbb93c73 },
  111940. { 0xf526b605,0x37dba260,0xfd785537,0x95d4978e,0xed72a04a,0x24ed793a,
  111941. 0x76005b1a,0x26948377,0x9e681f82,0x99f557b9,0xd64954ef,0xae5f9557 } },
  111942. /* 4 */
  111943. { { 0xf26feef9,0x24480c57,0x3a0e1240,0xc31a2694,0x273e2bc7,0x735002c3,
  111944. 0x3ef1ed4c,0x8c42e9c5,0x7f4948e8,0x028babf6,0x8a978632,0x6a502f43 },
  111945. { 0xb74536fe,0xf5f13a46,0xd8a9f0eb,0x1d218bab,0x37232768,0x30f36bcc,
  111946. 0x576e8c18,0xc5317b31,0x9bbcb766,0xef1d57a6,0xb3e3d4dc,0x917c4930 } },
  111947. /* 5 */
  111948. { { 0xe349ddd0,0x11426e2e,0x9b2fc250,0x9f117ef9,0xec0174a6,0xff36b480,
  111949. 0x18458466,0x4f4bde76,0x05806049,0x2f2edb6d,0x19dfca92,0x8adc75d1 },
  111950. { 0xb7d5a7ce,0xa619d097,0xa34411e9,0x874275e5,0x0da4b4ef,0x5403e047,
  111951. 0x77901d8f,0x2ebaafd9,0xa747170f,0x5e63ebce,0x7f9d8036,0x12a36944 } },
  111952. /* 6 */
  111953. { { 0x4fc52870,0x28f9c07a,0x1a53a961,0xce0b3748,0x0e1828d9,0xd550fa18,
  111954. 0x6adb225a,0xa24abaf7,0x6e58a348,0xd11ed0a5,0x948acb62,0xf3d811e6 },
  111955. { 0x4c61ed22,0x8618dd77,0x80b47c9d,0x0bb747f9,0xde6b8559,0x22bf796f,
  111956. 0x680a21e9,0xfdfd1c6d,0x2af2c9dd,0xc0db1577,0xc1e90f3d,0xa09379e6 } },
  111957. /* 7 */
  111958. { { 0xe085c629,0x386c66ef,0x095bc89a,0x5fc2a461,0x203f4b41,0x1353d631,
  111959. 0x7e4bd8f5,0x7ca1972b,0xa7df8ce9,0xb077380a,0xee7e4ea3,0xd8a90389 },
  111960. { 0xe7b14461,0x1bc74dc7,0x0c9c4f78,0xdc2cb014,0x84ef0a10,0x52b4b3a6,
  111961. 0x20327fe2,0xbde6ea5d,0x660f9615,0xb71ec435,0xb8ad8173,0xeede5a04 } },
  111962. /* 8 */
  111963. { { 0x893b9a2d,0x5584cbb3,0x00850c5d,0x820c660b,0x7df2d43d,0x4126d826,
  111964. 0x0109e801,0xdd5bbbf0,0x38172f1c,0x85b92ee3,0xf31430d9,0x609d4f93 },
  111965. { 0xeadaf9d6,0x1e059a07,0x0f125fb0,0x70e6536c,0x560f20e7,0xd6220751,
  111966. 0x7aaf3a9a,0xa59489ae,0x64bae14e,0x7b70e2f6,0x76d08249,0x0dd03701 } },
  111967. /* 9 */
  111968. { { 0x8510521f,0x4cc13be8,0xf724cc17,0x87315ba9,0x353dc263,0xb49d83bb,
  111969. 0x0c279257,0x8b677efe,0xc93c9537,0x510a1c1c,0xa4702c99,0x33e30cd8 },
  111970. { 0x2208353f,0xf0ffc89d,0xced42b2b,0x0170fa8d,0x26e2a5f5,0x090851ed,
  111971. 0xecb52c96,0x81276455,0x7fe1adf4,0x0646c4e1,0xb0868eab,0x513f047e } },
  111972. /* 10 */
  111973. { { 0xdf5bdf53,0xc07611f4,0x58b11a6d,0x45d331a7,0x1c4ee394,0x58965daf,
  111974. 0x5a5878d1,0xba8bebe7,0x82dd3025,0xaecc0a18,0xa923eb8b,0xcf2a3899 },
  111975. { 0xd24fd048,0xf98c9281,0x8bbb025d,0x841bfb59,0xc9ab9d53,0xb8ddf8ce,
  111976. 0x7fef044e,0x538a4cb6,0x23236662,0x092ac21f,0x0b66f065,0xa919d385 } },
  111977. /* 11 */
  111978. { { 0x85d480d8,0x3db03b40,0x1b287a7d,0x8cd9f479,0x4a8f3bae,0x8f24dc75,
  111979. 0x3db41892,0x482eb800,0x9c56e0f5,0x38bf9eb3,0x9a91dc6f,0x8b977320 },
  111980. { 0x7209cfc2,0xa31b05b2,0x05b2db70,0x4c49bf85,0xd619527b,0x56462498,
  111981. 0x1fac51ba,0x3fe51039,0xab4b8342,0xfb04f55e,0x04c6eabf,0xc07c10dc } },
  111982. /* 12 */
  111983. { { 0xdb32f048,0xad22fe4c,0x475ed6df,0x5f23bf91,0xaa66b6cb,0xa50ce0c0,
  111984. 0xf03405c0,0xdf627a89,0xf95e2d6a,0x3674837d,0xba42e64e,0x081c95b6 },
  111985. { 0xe71d6ceb,0xeba3e036,0x6c6b0271,0xb45bcccf,0x0684701d,0x67b47e63,
  111986. 0xe712523f,0x60f8f942,0x5cd47adc,0x82423472,0x87649cbb,0x83027d79 } },
  111987. /* 13 */
  111988. { { 0x3615b0b8,0xb3929ea6,0xa54dac41,0xb41441fd,0xb5b6a368,0x8995d556,
  111989. 0x167ef05e,0xa80d4529,0x6d25a27f,0xf6bcb4a1,0x7bd55b68,0x210d6a4c },
  111990. { 0x25351130,0xf3804abb,0x903e37eb,0x1d2df699,0x084c25c8,0x5f201efc,
  111991. 0xa1c68e91,0x31a28c87,0x563f62a5,0x81dad253,0xd6c415d4,0x5dd6de70 } },
  111992. /* 14 */
  111993. { { 0x846612ce,0x29f470fd,0xda18d997,0x986f3eec,0x2f34af86,0x6b84c161,
  111994. 0x46ddaf8b,0x5ef0a408,0xe49e795f,0x14405a00,0xaa2f7a37,0x5f491b16 },
  111995. { 0xdb41b38d,0xc7f07ae4,0x18fbfcaa,0xef7d119e,0x14443b19,0x3a18e076,
  111996. 0x79a19926,0x4356841a,0xe2226fbe,0x91f4a91c,0x3cc88721,0xdc77248c } },
  111997. /* 15 */
  111998. { { 0xe4b1ec9d,0xd570ff1a,0xe7eef706,0x21d23e0e,0xca19e086,0x3cde40f4,
  111999. 0xcd4bb270,0x7d6523c4,0xbf13aa6c,0x16c1f06c,0xd14c4b60,0x5aa7245a },
  112000. { 0x44b74de8,0x37f81467,0x620a934e,0x839e7a17,0xde8b1aa1,0xf74d14e8,
  112001. 0xf30d75e2,0x8789fa51,0xc81c261e,0x09b24052,0x33c565ee,0x654e2678 } },
  112002. /* 16 */
  112003. { { 0x2f9fbe67,0x378205de,0x7f728e44,0xc4afcb83,0x682e00f1,0xdbcec06c,
  112004. 0x114d5423,0xf2a145c3,0x7a52463e,0xa01d9874,0x7d717b0a,0xfc0935b1 },
  112005. { 0xd4d01f95,0x9653bc4f,0x9560ad34,0x9aa83ea8,0xaf8e3f3f,0xf77943dc,
  112006. 0xe86fe16e,0x70774a10,0xbf9ffdcf,0x6b62e6f1,0x588745c9,0x8a72f39e } },
  112007. /* 17 */
  112008. { { 0x2341c342,0x73ade4da,0xea704422,0xdd326e54,0x3741cef3,0x336c7d98,
  112009. 0x59e61549,0x1eafa00d,0xbd9a3efd,0xcd3ed892,0xc5c6c7e4,0x03faf26c },
  112010. { 0x3045f8ac,0x087e2fcf,0x174f1e73,0x14a65532,0xfe0af9a7,0x2cf84f28,
  112011. 0x2cdc935b,0xddfd7a84,0x6929c895,0x4c0f117b,0x4c8bcfcc,0x356572d6 } },
  112012. /* 18 */
  112013. { { 0x7d8c1bba,0x7ecbac01,0x90b0f3d5,0x6058f9c3,0xf6197d0f,0xaee116e3,
  112014. 0x4033b128,0xc4dd7068,0xc209b983,0xf084dba6,0x831dbc4a,0x97c7c2cf },
  112015. { 0xf96010e8,0x2f4e61dd,0x529faa17,0xd97e4e20,0x69d37f20,0x4ee66660,
  112016. 0x3d366d72,0xccc139ed,0x13488e0f,0x690b6ee2,0xf3a6d533,0x7cad1dc5 } },
  112017. /* 19 */
  112018. { { 0xda57a41f,0x660a9a81,0xec0039b6,0xe74a0412,0x5e1dad15,0x42343c6b,
  112019. 0x46681d4c,0x284f3ff5,0x63749e89,0xb51087f1,0x6f9f2f13,0x070f23cc },
  112020. { 0x5d186e14,0x542211da,0xfddb0dff,0x84748f37,0xdb1f4180,0x41a3aab4,
  112021. 0xa6402d0e,0x25ed667b,0x02f58355,0x2f2924a9,0xfa44a689,0x5844ee7c } },
  112022. /* 20 */
  112023. { { 0x3f3b236f,0xfab08607,0x81e221da,0x19e9d41d,0x3927b428,0xf3f6571e,
  112024. 0x7550f1f6,0x4348a933,0xa85e62f0,0x7167b996,0x7f5452bf,0x62d43759 },
  112025. { 0xf2955926,0xd85feb9e,0x6df78353,0x440a561f,0x9ca36b59,0x389668ec,
  112026. 0xa22da016,0x052bf1a1,0xf6093254,0xbdfbff72,0xe22209f3,0x94e50f28 } },
  112027. /* 21 */
  112028. { { 0x3062e8af,0x90b2e5b3,0xe8a3d369,0xa8572375,0x201db7b1,0x3fe1b00b,
  112029. 0xee651aa2,0xe926def0,0xb9b10ad7,0x6542c9be,0xa2fcbe74,0x098e309b },
  112030. { 0xfff1d63f,0x779deeb3,0x20bfd374,0x23d0e80a,0x8768f797,0x8452bb3b,
  112031. 0x1f952856,0xcf75bb4d,0x29ea3faa,0x8fe6b400,0x81373a53,0x12bd3e40 } },
  112032. /* 22 */
  112033. { { 0x104cbba5,0xc023780d,0xfa35dd4c,0x6207e747,0x1ca9b6a3,0x35c23928,
  112034. 0x97987b10,0x4ff19be8,0x8022eee8,0xb8476bbf,0xd3bbe74d,0xaa0a4a14 },
  112035. { 0x187d4543,0x20f94331,0x79f6e066,0x32153870,0xac7e82e1,0x83b0f74e,
  112036. 0x828f06ab,0xa7748ba2,0xc26ef35f,0xc5f0298a,0x8e9a7dbd,0x0f0c5070 } },
  112037. /* 23 */
  112038. { { 0xdef029dd,0x0c5c244c,0x850661b8,0x3dabc687,0xfe11d981,0x9992b865,
  112039. 0x6274dbad,0xe9801b8f,0x098da242,0xe54e6319,0x91a53d08,0x9929a91a },
  112040. { 0x35285887,0x37bffd72,0xf1418102,0xbc759425,0xfd2e6e20,0x9280cc35,
  112041. 0xfbc42ee5,0x735c600c,0x8837619a,0xb7ad2864,0xa778c57b,0xa3627231 } },
  112042. /* 24 */
  112043. { { 0x91361ed8,0xae799b5c,0x6c63366c,0x47d71b75,0x1b265a6a,0x54cdd521,
  112044. 0x98d77b74,0xe0215a59,0xbab29db0,0x4424d9b7,0x7fd9e536,0x8b0ffacc },
  112045. { 0x37b5d9ef,0x46d85d12,0xbfa91747,0x5b106d62,0x5f99ba2d,0xed0479f8,
  112046. 0x1d104de4,0x0e6f3923,0x25e8983f,0x83a84c84,0xf8105a70,0xa9507e0a } },
  112047. /* 25 */
  112048. { { 0x14cf381c,0xf6c68a6e,0xc22e31cc,0xaf9d27bd,0xaa8a5ccb,0x23568d4d,
  112049. 0xe338e4d2,0xe431eec0,0x8f52ad1f,0xf1a828fe,0xe86acd80,0xdb6a0579 },
  112050. { 0x4507832a,0x2885672e,0x887e5289,0x73fc275f,0x05610d08,0x65f80278,
  112051. 0x075ff5b0,0x8d9b4554,0x09f712b5,0x3a8e8fb1,0x2ebe9cf2,0x39f0ac86 } },
  112052. /* 26 */
  112053. { { 0x4c52edf5,0xd8fabf78,0xa589ae53,0xdcd737e5,0xd791ab17,0x94918bf0,
  112054. 0xbcff06c9,0xb5fbd956,0xdca46d45,0xf6d3032e,0x41a3e486,0x2cdff7e1 },
  112055. { 0x61f47ec8,0x6674b3ba,0xeef84608,0x8a882163,0x4c687f90,0xa257c705,
  112056. 0xf6cdf227,0xe30cb2ed,0x7f6ea846,0x2c4c64ca,0xcc6bcd3c,0x186fa17c } },
  112057. /* 27 */
  112058. { { 0x1dfcb91e,0x48a3f536,0x646d358a,0x83595e13,0x91128798,0xbd15827b,
  112059. 0x2187757a,0x3ce612b8,0x61bd7372,0x873150a1,0xb662f568,0xf4684530 },
  112060. { 0x401896f6,0x8833950b,0x77f3e090,0xe11cb89a,0x48e7f4a5,0xb2f12cac,
  112061. 0xf606677e,0x313dd769,0x16579f93,0xfdcf08b3,0x46b8f22b,0x6429cec9 } },
  112062. /* 28 */
  112063. { { 0xbb75f9a4,0x4984dd54,0x29d3b570,0x4aef06b9,0x3d6e4c1e,0xb5f84ca2,
  112064. 0xb083ef35,0x24c61c11,0x392ca9ff,0xce4a7392,0x6730a800,0x865d6517 },
  112065. { 0x722b4a2b,0xca3dfe76,0x7b083e0e,0x12c04bf9,0x1b86b8a5,0x803ce5b5,
  112066. 0x6a7e3e0c,0x3fc7632d,0xc81adbe4,0xc89970c2,0x120e16b1,0x3cbcd3ad } },
  112067. /* 29 */
  112068. { { 0xec30ce93,0xfbfb4cc7,0xb72720a2,0x10ed6c7d,0x47b55500,0xec675bf7,
  112069. 0x333ff7c3,0x90725903,0x5075bfc0,0xc7c3973e,0x07acf31b,0xb049ecb0 },
  112070. { 0x4f58839c,0xb4076eaf,0xa2b05e4f,0x101896da,0xab40c66e,0x3f6033b0,
  112071. 0xc8d864ba,0x19ee9eeb,0x47bf6d2a,0xeb6cf155,0xf826477d,0x8e5a9663 } },
  112072. /* 30 */
  112073. { { 0xf7fbd5e1,0x69e62fdd,0x76912b1d,0x38ecfe54,0xd1da3bfb,0x845a3d56,
  112074. 0x1c86f0d4,0x0494950e,0x3bc36ce8,0x83cadbf9,0x4fccc8d1,0x41fce572 },
  112075. { 0x8332c144,0x05f939c2,0x0871e46e,0xb17f248b,0x66e8aff6,0x3d8534e2,
  112076. 0x3b85c629,0x1d06f1dc,0xa3131b73,0xdb06a32e,0x8b3f64e5,0xf295184d } },
  112077. /* 31 */
  112078. { { 0x36ddc103,0xd9653ff7,0x95ef606f,0x25f43e37,0xfe06dce8,0x09e301fc,
  112079. 0x30b6eebf,0x85af2341,0x0ff56b20,0x79b12b53,0xfe9a3c6b,0x9b4fb499 },
  112080. { 0x51d27ac2,0x0154f892,0x56ca5389,0xd33167e3,0xafc065a6,0x7828ec1f,
  112081. 0x7f746c9b,0x0959a258,0x0c44f837,0xb18f1be3,0xc4132fdb,0xa7946117 } },
  112082. /* 32 */
  112083. { { 0x5e3c647b,0xc0426b77,0x8cf05348,0xbfcbd939,0x172c0d3d,0x31d312e3,
  112084. 0xee754737,0x5f49fde6,0x6da7ee61,0x895530f0,0xe8b3a5fb,0xcf281b0a },
  112085. { 0x41b8a543,0xfd149735,0x3080dd30,0x41a625a7,0x653908cf,0xe2baae07,
  112086. 0xba02a278,0xc3d01436,0x7b21b8f8,0xa0d0222e,0xd7ec1297,0xfdc270e9 } },
  112087. /* 33 */
  112088. { { 0xbc7f41d6,0x00873c0c,0x1b7ad641,0xd976113e,0x238443fb,0x2a536ff4,
  112089. 0x41e62e45,0x030d00e2,0x5f545fc6,0x532e9867,0x8e91208c,0xcd033108 },
  112090. { 0x9797612c,0xd1a04c99,0xeea674e2,0xd4393e02,0xe19742a1,0xd56fa69e,
  112091. 0x85f0590e,0xdd2ab480,0x48a2243d,0xa5cefc52,0x54383f41,0x48cc67b6 } },
  112092. /* 34 */
  112093. { { 0xfc14ab48,0x4e50430e,0x26706a74,0x195b7f4f,0xcc881ff6,0x2fe8a228,
  112094. 0xd945013d,0xb1b968e2,0x4b92162b,0x936aa579,0x364e754a,0x4fb766b7 },
  112095. { 0x31e1ff7f,0x13f93bca,0xce4f2691,0x696eb5ca,0xa2b09e02,0xff754bf8,
  112096. 0xe58e3ff8,0x58f13c9c,0x1678c0b0,0xb757346f,0xa86692b3,0xd54200db } },
  112097. /* 35 */
  112098. { { 0x6dda1265,0x9a030bbd,0xe89718dd,0xf7b4f3fc,0x936065b8,0xa6a4931f,
  112099. 0x5f72241c,0xbce72d87,0x65775857,0x6cbb51cb,0x4e993675,0xc7161815 },
  112100. { 0x2ee32189,0xe81a0f79,0x277dc0b2,0xef2fab26,0xb71f469f,0x9e64f6fe,
  112101. 0xdfdaf859,0xb448ce33,0xbe6b5df1,0x3f5c1c4c,0x1de45f7b,0xfb8dfb00 } },
  112102. /* 36 */
  112103. { { 0x4d5bb921,0xc7345fa7,0x4d2b667e,0x5c7e04be,0x282d7a3e,0x47ed3a80,
  112104. 0x7e47b2a4,0x5c2777f8,0x08488e2e,0x89b3b100,0xb2eb5b45,0x9aad77c2 },
  112105. { 0xdaac34ae,0xd681bca7,0x26afb326,0x2452e4e5,0x41a1ee14,0x0c887924,
  112106. 0xc2407ade,0x743b04d4,0xfc17a2ac,0xcb5e999b,0x4a701a06,0x4dca2f82 } },
  112107. /* 37 */
  112108. { { 0x1127bc1a,0x68e31ca6,0x17ead3be,0xa3edd59b,0xe25f5a15,0x67b6b645,
  112109. 0xa420e15e,0x76221794,0x4b1e872e,0x794fd83b,0xb2dece1b,0x7cab3f03 },
  112110. { 0xca9b3586,0x7119bf15,0x4d250bd7,0xa5545924,0xcc6bcf24,0x173633ea,
  112111. 0xb1b6f884,0x9bd308c2,0x447d38c3,0x3bae06f5,0xf341fe1c,0x54dcc135 } },
  112112. /* 38 */
  112113. { { 0x943caf0d,0x56d3598d,0x225ff133,0xce044ea9,0x563fadea,0x9edf6a7c,
  112114. 0x73e8dc27,0x632eb944,0x3190dcab,0x814b467e,0x6dbb1e31,0x2d4f4f31 },
  112115. { 0xa143b7ca,0x8d69811c,0xde7cf950,0x4ec1ac32,0x37b5fe82,0x223ab5fd,
  112116. 0x9390f1d9,0xe82616e4,0x75804610,0xabff4b20,0x875b08f0,0x11b9be15 } },
  112117. /* 39 */
  112118. { { 0x3bbe682c,0x4ae31a3d,0x74eef2dd,0xbc7c5d26,0x3c47dd40,0x92afd10a,
  112119. 0xc14ab9e1,0xec7e0a3b,0xb2e495e4,0x6a6c3dd1,0x309bcd85,0x085ee5e9 },
  112120. { 0x8c2e67fd,0xf381a908,0xe261eaf2,0x32083a80,0x96deee15,0x0fcd6a49,
  112121. 0x5e524c79,0xe3b8fb03,0x1d5b08b9,0x8dc360d9,0x7f26719f,0x3a06e2c8 } },
  112122. /* 40 */
  112123. { { 0x7237cac0,0x5cd9f5a8,0x43586794,0x93f0b59d,0xe94f6c4e,0x4384a764,
  112124. 0xb62782d3,0x8304ed2b,0xcde06015,0x0b8db8b3,0x5dbe190f,0x4336dd53 },
  112125. { 0x92ab473a,0x57443553,0xbe5ed046,0x031c7275,0x21909aa4,0x3e78678c,
  112126. 0x99202ddb,0x4ab7e04f,0x6977e635,0x2648d206,0x093198be,0xd427d184 } },
  112127. /* 41 */
  112128. { { 0x0f9b5a31,0x822848f5,0xbaadb62a,0xbb003468,0x3357559c,0x233a0472,
  112129. 0x79aee843,0x49ef6880,0xaeb9e1e3,0xa89867a0,0x1f6f9a55,0xc151931b },
  112130. { 0xad74251e,0xd264eb0b,0x4abf295e,0x37b9b263,0x04960d10,0xb600921b,
  112131. 0x4da77dc0,0x0de53dbc,0xd2b18697,0x01d9bab3,0xf7156ddf,0xad54ec7a } },
  112132. /* 42 */
  112133. { { 0x79efdc58,0x8e74dc35,0x4ff68ddb,0x456bd369,0xd32096a5,0x724e74cc,
  112134. 0x386783d0,0xe41cff42,0x7c70d8a4,0xa04c7f21,0xe61a19a2,0x41199d2f },
  112135. { 0x29c05dd2,0xd389a3e0,0xe7e3fda9,0x535f2a6b,0x7c2b4df8,0x26ecf72d,
  112136. 0xfe745294,0x678275f4,0x9d23f519,0x6319c9cc,0x88048fc4,0x1e05a02d } },
  112137. /* 43 */
  112138. { { 0xd4d5ffe8,0x75cc8e2e,0xdbea17f2,0xf8bb4896,0xcee3cb4a,0x35059790,
  112139. 0xa47c6165,0x4c06ee85,0x92935d2f,0xf98fff25,0x32ffd7c7,0x34c4a572 },
  112140. { 0xea0376a2,0xc4b14806,0x4f115e02,0x2ea5e750,0x1e55d7c0,0x532d76e2,
  112141. 0xf31044da,0x68dc9411,0x71b77993,0x9272e465,0x93a8cfd5,0xadaa38bb } },
  112142. /* 44 */
  112143. { { 0x7d4ed72a,0x4bf0c712,0xba1f79a3,0xda0e9264,0xf4c39ea4,0x48c0258b,
  112144. 0x2a715138,0xa5394ed8,0xbf06c660,0x4af511ce,0xec5c37cd,0xfcebceef },
  112145. { 0x779ae8c1,0xf23b75aa,0xad1e606e,0xdeff59cc,0x22755c82,0xf3f526fd,
  112146. 0xbb32cefd,0x64c5ab44,0x915bdefd,0xa96e11a2,0x1143813e,0xab19746a } },
  112147. /* 45 */
  112148. { { 0xec837d7d,0x43c78585,0xb8ee0ba4,0xca5b6fbc,0xd5dbb5ee,0x34e924d9,
  112149. 0xbb4f1ca5,0x3f4fa104,0x398640f7,0x15458b72,0xd7f407ea,0x4231faa9 },
  112150. { 0xf96e6896,0x53e0661e,0xd03b0f9d,0x554e4c69,0x9c7858d1,0xd4fcb07b,
  112151. 0x52cb04fa,0x7e952793,0x8974e7f7,0x5f5f1574,0x6b6d57c8,0x2e3fa558 } },
  112152. /* 46 */
  112153. { { 0x6a9951a8,0x42cd4803,0x42792ad0,0xa8b15b88,0xabb29a73,0x18e8bcf9,
  112154. 0x409933e8,0xbfd9a092,0xefb88dc4,0x760a3594,0x40724458,0x14418863 },
  112155. { 0x99caedc7,0x162a56ee,0x91d101c9,0x8fb12ecd,0x393202da,0xea671967,
  112156. 0xa4ccd796,0x1aac8c4a,0x1cf185a8,0x7db05036,0x8cfd095a,0x0c9f86cd } },
  112157. /* 47 */
  112158. { { 0x10b2a556,0x9a728147,0x327b70b2,0x767ca964,0x5e3799b7,0x04ed9e12,
  112159. 0x22a3eb2a,0x6781d2dc,0x0d9450ac,0x5bd116eb,0xa7ebe08a,0xeccac1fc },
  112160. { 0xdc2d6e94,0xde68444f,0x35ecf21b,0x3621f429,0x29e03a2c,0x14e2d543,
  112161. 0x7d3e7f0a,0x53e42cd5,0x73ed00b9,0xbba26c09,0xc57d2272,0x00297c39 } },
  112162. /* 48 */
  112163. { { 0xb8243a7d,0x3aaaab10,0x8fa58c5b,0x6eeef93e,0x9ae7f764,0xf866fca3,
  112164. 0x61ab04d3,0x64105a26,0x03945d66,0xa3578d8a,0x791b848c,0xb08cd3e4 },
  112165. { 0x756d2411,0x45edc5f8,0xa755128c,0xd4a790d9,0x49e5f6a0,0xc2cf0963,
  112166. 0xf649beaa,0xc66d267d,0x8467039e,0x3ce6d968,0x42f7816f,0x50046c6b } },
  112167. /* 49 */
  112168. { { 0x66425043,0x92ae1602,0xf08db890,0x1ff66afd,0x8f162ce5,0x386f5a7f,
  112169. 0xfcf5598f,0x18d2dea0,0x1a8ca18e,0x78372b3a,0x8cd0e6f7,0xdf0d20eb },
  112170. { 0x75bb4045,0x7edd5e1d,0xb96d94b7,0x252a47ce,0x2c626776,0xbdb29358,
  112171. 0x40dd1031,0x853c3943,0x7d5f47fd,0x9dc9becf,0xbae4044a,0x27c2302f } },
  112172. /* 50 */
  112173. { { 0x8f2d49ce,0x2d1d208a,0x162df0a2,0x0d91aa02,0x09a07f65,0x9c5cce87,
  112174. 0x84339012,0xdf07238b,0x419442cd,0x5028e2c8,0x72062aba,0x2dcbd358 },
  112175. { 0xe4680967,0xb5fbc3cb,0x9f92d72c,0x2a7bc645,0x116c369d,0x806c76e1,
  112176. 0x3177e8d8,0x5c50677a,0x4569df57,0x753739eb,0x36c3f40b,0x2d481ef6 } },
  112177. /* 51 */
  112178. { { 0xfea1103e,0x1a2d39fd,0x95f81b17,0xeaae5592,0xf59b264a,0xdbd0aa18,
  112179. 0xcb592ee0,0x90c39c1a,0x9750cca3,0xdf62f80d,0xdf97cc6c,0xda4d8283 },
  112180. { 0x1e201067,0x0a6dd346,0x69fb1f6b,0x1531f859,0x1d60121f,0x4895e552,
  112181. 0x4c041c91,0x0b21aab0,0xbcc1ccf8,0x9d896c46,0x3141bde7,0xd24da3b3 } },
  112182. /* 52 */
  112183. { { 0x53b0a354,0x575a0537,0x0c6ddcd8,0x392ff2f4,0x56157b94,0x0b8e8cff,
  112184. 0x3b1b80d1,0x073e57bd,0x3fedee15,0x2a75e0f0,0xaa8e6f19,0x752380e4 },
  112185. { 0x6558ffe9,0x1f4e227c,0x19ec5415,0x3a348618,0xf7997085,0xab382d5e,
  112186. 0xddc46ac2,0x5e6deaff,0xfc8d094c,0xe5144078,0xf60e37c6,0xf674fe51 } },
  112187. /* 53 */
  112188. { { 0xaf63408f,0x6fb87ae5,0xcd75a737,0xa39c36a9,0xcf4c618d,0x7833313f,
  112189. 0xf034c88d,0xfbcd4482,0x39b35288,0x4469a761,0x66b5d9c9,0x77a711c5 },
  112190. { 0x944f8d65,0x4a695dc7,0x161aaba8,0xe6da5f65,0x24601669,0x8654e9c3,
  112191. 0x28ae7491,0xbc8b93f5,0x8f5580d8,0x5f1d1e83,0xcea32cc8,0x8ccf9a1a } },
  112192. /* 54 */
  112193. { { 0x7196fee2,0x28ab110c,0x874c8945,0x75799d63,0x29aedadd,0xa2629348,
  112194. 0x2be88ff4,0x9714cc7b,0xd58d60d6,0xf71293cf,0x32a564e9,0xda6b6cb3 },
  112195. { 0x3dd821c2,0xf43fddb1,0x90dd323d,0xf2f2785f,0x048489f8,0x91246419,
  112196. 0xd24c6749,0x61660f26,0xc803c15c,0x961d9e8c,0xfaadc4c9,0x631c6158 } },
  112197. /* 55 */
  112198. { { 0xfd752366,0xacf2ebe0,0x139be88b,0xb93c340e,0x0f20179e,0x98f66485,
  112199. 0xff1da785,0x14820254,0x4f85c16e,0x5278e276,0x7aab1913,0xa246ee45 },
  112200. { 0x53763b33,0x43861eb4,0x45c0bc0d,0xc49f03fc,0xad6b1ea1,0xafff16bc,
  112201. 0x6fd49c99,0xce33908b,0xf7fde8c3,0x5c51e9bf,0xff142c5e,0x076a7a39 } },
  112202. /* 56 */
  112203. { { 0x9e338d10,0x04639dfe,0xf42b411b,0x8ee6996f,0xa875cef2,0x960461d1,
  112204. 0x95b4d0ba,0x1057b6d6,0xa906e0bc,0x27639252,0xe1c20f8a,0x2c19f09a },
  112205. { 0xeef4c43d,0x5b8fc3f0,0x07a84aa9,0xe2e1b1a8,0x835d2bdb,0x5f455528,
  112206. 0x207132dd,0x0f4aee4d,0x3907f675,0xe9f8338c,0x0e0531f0,0x7a874dc9 } },
  112207. /* 57 */
  112208. { { 0x97c27050,0x84b22d45,0x59e70bf8,0xbd0b8df7,0x79738b9b,0xb4d67405,
  112209. 0xcd917c4f,0x47f4d5f5,0x13ce6e33,0x9099c4ce,0x521d0f8b,0x942bfd39 },
  112210. { 0xa43b566d,0x5028f0f6,0x21bff7de,0xaf6e8669,0xc44232cd,0x83f6f856,
  112211. 0xf915069a,0x65680579,0xecfecb85,0xd12095a2,0xdb01ba16,0xcf7f06ae } },
  112212. /* 58 */
  112213. { { 0x8ef96c80,0x0f56e3c4,0x3ddb609c,0xd521f2b3,0x7dc1450d,0x2be94102,
  112214. 0x02a91fe2,0x2d21a071,0x1efa37de,0x2e6f74fa,0x156c28a1,0x9a9a90b8 },
  112215. { 0x9dc7dfcb,0xc54ea9ea,0x2c2c1d62,0xc74e66fc,0x49d3e067,0x9f23f967,
  112216. 0x54dd38ad,0x1c7c3a46,0x5946cee3,0xc7005884,0x45cc045d,0x89856368 } },
  112217. /* 59 */
  112218. { { 0xfce73946,0x29da7cd4,0x23168563,0x8f697db5,0xcba92ec6,0x8e235e9c,
  112219. 0x9f91d3ea,0x55d4655f,0xaa50a6cd,0xf3689f23,0x21e6a1a0,0xdcf21c26 },
  112220. { 0x61b818bf,0xcffbc82e,0xda47a243,0xc74a2f96,0x8bc1a0cf,0x234e980a,
  112221. 0x7929cb6d,0xf35fd6b5,0xefe17d6c,0x81468e12,0x58b2dafb,0xddea6ae5 } },
  112222. /* 60 */
  112223. { { 0x7e787b2e,0x294de887,0x39a9310d,0x258acc1f,0xac14265d,0x92d9714a,
  112224. 0x708b48a0,0x18b5591c,0xe1abbf71,0x27cc6bb0,0x568307b9,0xc0581fa3 },
  112225. { 0xf24d4d58,0x9e0f58a3,0xe0ce2327,0xfebe9bb8,0x9d1be702,0x91fd6a41,
  112226. 0xfacac993,0x9a7d8a45,0x9e50d66d,0xabc0a08c,0x06498201,0x02c342f7 } },
  112227. /* 61 */
  112228. { { 0x157bdbc2,0xccd71407,0xad0e1605,0x72fa89c6,0xb92a015f,0xb1d3da2b,
  112229. 0xa0a3fe56,0x8ad9e7cd,0x24f06737,0x160edcbd,0x61275be6,0x79d4db33 },
  112230. { 0x5f3497c4,0xd3d31fd9,0x04192fb0,0x8cafeaee,0x13a50af3,0xe13ca745,
  112231. 0x8c85aae5,0x18826167,0x9eb556ff,0xce06cea8,0xbdb549f3,0x2eef1995 } },
  112232. /* 62 */
  112233. { { 0x50596edc,0x8ed7d3eb,0x905243a2,0xaa359362,0xa4b6d02b,0xa212c2c2,
  112234. 0xc4fbec68,0x611fd727,0xb84f733d,0x8a0b8ff7,0x5f0daf0e,0xd85a6b90 },
  112235. { 0xd4091cf7,0x60e899f5,0x2eff2768,0x4fef2b67,0x10c33964,0xc1f195cb,
  112236. 0x93626a8f,0x8275d369,0x0d6c840a,0xc77904f4,0x7a868acd,0x88d8b7fd } },
  112237. /* 63 */
  112238. { { 0x7bd98425,0x85f23723,0xc70b154e,0xd4463992,0x96687a2e,0xcbb00ee2,
  112239. 0xc83214fd,0x905fdbf7,0x13593684,0x2019d293,0xef51218e,0x0428c393 },
  112240. { 0x981e909a,0x40c7623f,0x7be192da,0x92513385,0x4010907e,0x48fe480f,
  112241. 0x3120b459,0xdd7a187c,0xa1fd8f3c,0xc9d7702d,0xe358efc5,0x66e4753b } },
  112242. /* 64 */
  112243. { { 0x16973cf4,0x070d34e1,0x7e4f34f7,0x20aee08b,0x5eb8ad29,0x269af9b9,
  112244. 0xa6a45dda,0xdde0a036,0x63df41e0,0xa18b528e,0xa260df2a,0x03cc71b2 },
  112245. { 0xa06b1dd7,0x24a6770a,0x9d2675d3,0x5bfa9c11,0x96844432,0x73c1e2a1,
  112246. 0x131a6cf0,0x3660558d,0x2ee79454,0xb0289c83,0xc6d8ddcd,0xa6aefb01 } },
  112247. /* 65 */
  112248. { { 0x01ab5245,0xba1464b4,0xc48d93ff,0x9b8d0b6d,0x93ad272c,0x939867dc,
  112249. 0xae9fdc77,0xbebe085e,0x894ea8bd,0x73ae5103,0x39ac22e1,0x740fc89a },
  112250. { 0x28e23b23,0x5e28b0a3,0xe13104d0,0x2352722e,0xb0a2640d,0xf4667a18,
  112251. 0x49bb37c3,0xac74a72e,0xe81e183a,0x79f734f0,0x3fd9c0eb,0xbffe5b6c } },
  112252. /* 66 */
  112253. { { 0xc6a2123f,0xb1a358f5,0xfe28df6d,0x927b2d95,0xf199d2f9,0x89702753,
  112254. 0x1a3f82dc,0x0a73754c,0x777affe1,0x063d029d,0xdae6d34d,0x5439817e },
  112255. { 0x6b8b83c4,0xf7979eef,0x9d945682,0x615cb214,0xc5e57eae,0x8f0e4fac,
  112256. 0x113047dd,0x042b89b8,0x93f36508,0x888356dc,0x5fd1f32f,0xbf008d18 } },
  112257. /* 67 */
  112258. { { 0x4e8068db,0x8012aa24,0xa5729a47,0xc72cc641,0x43f0691d,0x3c33df2c,
  112259. 0x1d92145f,0xfa057347,0xb97f7946,0xaefc0f2f,0x2f8121bf,0x813d75cb },
  112260. { 0x4383bba6,0x05613c72,0xa4224b3f,0xa924ce70,0x5f2179a6,0xe59cecbe,
  112261. 0x79f62b61,0x78e2e8aa,0x53ad8079,0x3ac2cc3b,0xd8f4fa96,0x55518d71 } },
  112262. /* 68 */
  112263. { { 0x00623f3b,0x03cf2922,0x5f29ebff,0x095c7111,0x80aa6823,0x42d72247,
  112264. 0x7458c0b0,0x044c7ba1,0x0959ec20,0xca62f7ef,0xf8ca929f,0x40ae2ab7 },
  112265. { 0xa927b102,0xb8c5377a,0xdc031771,0x398a86a0,0xc216a406,0x04908f9d,
  112266. 0x918d3300,0xb423a73a,0xe0b94739,0x634b0ff1,0x2d69f697,0xe29de725 } },
  112267. /* 69 */
  112268. { { 0x8435af04,0x744d1400,0xfec192da,0x5f255b1d,0x336dc542,0x1f17dc12,
  112269. 0x636a68a8,0x5c90c2a7,0x7704ca1e,0x960c9eb7,0x6fb3d65a,0x9de8cf1e },
  112270. { 0x511d3d06,0xc60fee0d,0xf9eb52c7,0x466e2313,0x206b0914,0x743c0f5f,
  112271. 0x2191aa4d,0x42f55bac,0xffebdbc2,0xcefc7c8f,0xe6e8ed1c,0xd4fa6081 } },
  112272. /* 70 */
  112273. { { 0xb0ab9645,0xb5e405d3,0xd5f1f711,0xaeec7f98,0x585c2a6e,0x8ad42311,
  112274. 0x512c6944,0x045acb9e,0xa90db1c6,0xae106c4e,0x898e6563,0xb89f33d5 },
  112275. { 0x7fed2ce4,0x43b07cd9,0xdd815b20,0xf9934e17,0x0a81a349,0x6778d4d5,
  112276. 0x52918061,0x9e616ade,0xd7e67112,0xfa06db06,0x88488091,0x1da23cf1 } },
  112277. /* 71 */
  112278. { { 0x42f2c4b5,0x821c46b3,0x66059e47,0x931513ef,0x66f50cd1,0x7030ae43,
  112279. 0x43e7b127,0x43b536c9,0x5fca5360,0x006258cf,0x6b557abf,0xe4e3ee79 },
  112280. { 0x24c8b22f,0xbb6b3900,0xfcbf1054,0x2eb5e2c1,0x567492af,0x937b18c9,
  112281. 0xacf53957,0xf09432e4,0x1dbf3a56,0x585f5a9d,0xbe0887cf,0xf86751fd } },
  112282. /* 72 */
  112283. { { 0x9d10e0b2,0x157399cb,0x60dc51b7,0x1c0d5956,0x1f583090,0x1d496b8a,
  112284. 0x88590484,0x6658bc26,0x03213f28,0x88c08ab7,0x7ae58de4,0x8d2e0f73 },
  112285. { 0x486cfee6,0x9b79bc95,0xe9e5bc57,0x036a26c7,0xcd8ae97a,0x1ad03601,
  112286. 0xff3a0494,0x06907f87,0x2c7eb584,0x078f4bbf,0x7e8d0a5a,0xe3731bf5 } },
  112287. /* 73 */
  112288. { { 0xe1cd0abe,0x72f2282b,0x87efefa2,0xd4f9015e,0x6c3834bd,0x9d189806,
  112289. 0xb8a29ced,0x9c8cdcc1,0xfee82ebc,0x0601b9f4,0x7206a756,0x371052bc },
  112290. { 0x46f32562,0x76fa1092,0x17351bb4,0xdaad534c,0xb3636bb5,0xc3d64c37,
  112291. 0x45d54e00,0x038a8c51,0x32c09e7c,0x301e6180,0x95735151,0x9764eae7 } },
  112292. /* 74 */
  112293. { { 0xcbd5256a,0x8791b19f,0x6ca13a3b,0x4007e0f2,0x4cf06904,0x03b79460,
  112294. 0xb6c17589,0xb18a9c22,0x81d45908,0xa1cb7d7d,0x21bb68f1,0x6e13fa9d },
  112295. { 0xa71e6e16,0x47183c62,0xe18749ed,0x5cf0ef8e,0x2e5ed409,0x2c9c7f9b,
  112296. 0xe6e117e1,0x042eeacc,0x13fb5a7f,0xb86d4816,0xc9e5feb1,0xea1cf0ed } },
  112297. /* 75 */
  112298. { { 0xcea4cc9b,0x6e6573c9,0xafcec8f3,0x5417961d,0xa438b6f6,0x804bf02a,
  112299. 0xdcd4ea88,0xb894b03c,0x3799571f,0xd0f807e9,0x862156e8,0x3466a7f5 },
  112300. { 0x56515664,0x51e59acd,0xa3c5eb0b,0x55b0f93c,0x6a4279db,0x84a06b02,
  112301. 0xc5fae08e,0x5c850579,0xa663a1a2,0xcf07b8db,0xf46ffc8d,0x49a36bbc } },
  112302. /* 76 */
  112303. { { 0x46d93106,0xe47f5acc,0xaa897c9c,0x65b7ade0,0x12d7e4be,0x37cf4c94,
  112304. 0xd4b2caa9,0xa2ae9b80,0xe60357a3,0x5e7ce09c,0xc8ecd5f9,0x29f77667 },
  112305. { 0xa8a0b1c5,0xdf6868f5,0x62978ad8,0x240858cf,0xdc0002a1,0x0f7ac101,
  112306. 0xffe9aa05,0x1d28a9d7,0x5b962c97,0x744984d6,0x3d28c8b2,0xa8a7c00b } },
  112307. /* 77 */
  112308. { { 0xae11a338,0x7c58a852,0xd1af96e7,0xa78613f1,0x5355cc73,0x7e9767d2,
  112309. 0x792a2de6,0x6ba37009,0x124386b2,0x7d60f618,0x11157674,0xab09b531 },
  112310. { 0x98eb9dd0,0x95a04841,0x15070328,0xe6c17acc,0x489c6e49,0xafc6da45,
  112311. 0xbb211530,0xab45a60a,0x7d7ea933,0xc58d6592,0x095642c6,0xa3ef3c65 } },
  112312. /* 78 */
  112313. { { 0xdf010879,0x89d420e9,0x39576179,0x9d25255d,0xe39513b6,0x9cdefd50,
  112314. 0xd5d1c313,0xe4efe45b,0x3f7af771,0xc0149de7,0x340ab06b,0x55a6b4f4 },
  112315. { 0xebeaf771,0xf1325251,0x878d4288,0x2ab44128,0x18e05afe,0xfcd5832e,
  112316. 0xcc1fb62b,0xef52a348,0xc1c4792a,0x2bd08274,0x877c6dc7,0x345c5846 } },
  112317. /* 79 */
  112318. { { 0xbea65e90,0xde15ceb0,0x2416d99c,0x0987f72b,0xfd863dec,0x44db578d,
  112319. 0xac6a3578,0xf617b74b,0xdb48e999,0x9e62bd7a,0xeab1a1be,0x877cae61 },
  112320. { 0x3a358610,0x23adddaa,0x325e2b07,0x2fc4d6d1,0x1585754e,0x897198f5,
  112321. 0xb392b584,0xf741852c,0xb55f7de1,0x9927804c,0x1aa8efae,0xe9e6c4ed } },
  112322. /* 80 */
  112323. { { 0x98683186,0x867db639,0xddcc4ea9,0xfb5cf424,0xd4f0e7bd,0xcc9a7ffe,
  112324. 0x7a779f7e,0x7c57f71c,0xd6b25ef2,0x90774079,0xb4081680,0x90eae903 },
  112325. { 0x0ee1fceb,0xdf2aae5e,0xe86c1a1f,0x3ff1da24,0xca193edf,0x80f587d6,
  112326. 0xdc9b9d6a,0xa5695523,0x85920303,0x7b840900,0xba6dbdef,0x1efa4dfc } },
  112327. /* 81 */
  112328. { { 0xe0540015,0xfbd838f9,0xc39077dc,0x2c323946,0xad619124,0x8b1fb9e6,
  112329. 0x0ca62ea8,0x9612440c,0x2dbe00ff,0x9ad9b52c,0xae197643,0xf52abaa1 },
  112330. { 0x2cac32ad,0xd0e89894,0x62a98f91,0xdfb79e42,0x276f55cb,0x65452ecf,
  112331. 0x7ad23e12,0xdb1ac0d2,0xde4986f0,0xf68c5f6a,0x82ce327d,0x389ac37b } },
  112332. /* 82 */
  112333. { { 0xf8e60f5b,0x511188b4,0x48aa2ada,0x7fe67015,0x381abca2,0xdb333cb8,
  112334. 0xdaf3fc97,0xb15e6d9d,0x36aabc03,0x4b24f6eb,0x72a748b4,0xc59789df },
  112335. { 0x29cf5279,0x26fcb8a5,0x01ad9a6c,0x7a3c6bfc,0x4b8bac9b,0x866cf88d,
  112336. 0x9c80d041,0xf4c89989,0x70add148,0xf0a04241,0x45d81a41,0x5a02f479 } },
  112337. /* 83 */
  112338. { { 0xc1c90202,0xfa5c877c,0xf8ac7570,0xd099d440,0xd17881f7,0x428a5b1b,
  112339. 0x5b2501d7,0x61e267db,0xf2e4465b,0xf889bf04,0x76aa4cb8,0x4da3ae08 },
  112340. { 0xe3e66861,0x3ef0fe26,0x3318b86d,0x5e772953,0x747396df,0xc3c35fbc,
  112341. 0x439ffd37,0x5115a29c,0xb2d70374,0xbfc4bd97,0x56246b9d,0x088630ea } },
  112342. /* 84 */
  112343. { { 0xb8a9e8c9,0xcd96866d,0x5bb8091e,0xa11963b8,0x045b3cd2,0xc7f90d53,
  112344. 0x80f36504,0x755a72b5,0x21d3751c,0x46f8b399,0x53c193de,0x4bffdc91 },
  112345. { 0xb89554e7,0xcd15c049,0xf7a26be6,0x353c6754,0xbd41d970,0x79602370,
  112346. 0x12b176c0,0xde16470b,0x40c8809d,0x56ba1175,0xe435fb1e,0xe2db35c3 } },
  112347. /* 85 */
  112348. { { 0x6328e33f,0xd71e4aab,0xaf8136d1,0x5486782b,0x86d57231,0x07a4995f,
  112349. 0x1651a968,0xf1f0a5bd,0x76803b6d,0xa5dc5b24,0x42dda935,0x5c587cbc },
  112350. { 0xbae8b4c0,0x2b6cdb32,0xb1331138,0x66d1598b,0x5d7e9614,0x4a23b2d2,
  112351. 0x74a8c05d,0x93e402a6,0xda7ce82e,0x45ac94e6,0xe463d465,0xeb9f8281 } },
  112352. /* 86 */
  112353. { { 0xfecf5b9b,0x34e0f9d1,0xf206966a,0xa115b12b,0x1eaa0534,0x5591cf3b,
  112354. 0xfb1558f9,0x5f0293cb,0x1bc703a5,0x1c8507a4,0x862c1f81,0x92e6b81c },
  112355. { 0xcdaf24e3,0xcc9ebc66,0x72fcfc70,0x68917ecd,0x8157ba48,0x6dc9a930,
  112356. 0xb06ab2b2,0x5d425c08,0x36e929c4,0x362f8ce7,0x62e89324,0x09f6f57c } },
  112357. /* 87 */
  112358. { { 0xd29375fb,0x1c7d6b78,0xe35d1157,0xfabd851e,0x4243ea47,0xf6f62dcd,
  112359. 0x8fe30b0f,0x1dd92460,0xffc6e709,0x08166dfa,0x0881e6a7,0xc6c4c693 },
  112360. { 0xd6a53fb0,0x20368f87,0x9eb4d1f9,0x38718e9f,0xafd7e790,0x03f08acd,
  112361. 0x72fe2a1c,0x0835eb44,0x88076e5d,0x7e050903,0xa638e731,0x538f765e } },
  112362. /* 88 */
  112363. { { 0xc2663b4b,0x0e0249d9,0x47cd38dd,0xe700ab5b,0x2c46559f,0xb192559d,
  112364. 0x4bcde66d,0x8f9f74a8,0x3e2aced5,0xad161523,0x3dd03a5b,0xc155c047 },
  112365. { 0x3be454eb,0x346a8799,0x83b7dccd,0x66ee94db,0xab9d2abe,0x1f6d8378,
  112366. 0x7733f355,0x4a396dd2,0xf53553c2,0x419bd40a,0x731dd943,0xd0ead98d } },
  112367. /* 89 */
  112368. { { 0xec142408,0x908e0b0e,0x4114b310,0x98943cb9,0x1742b1d7,0x03dbf7d8,
  112369. 0x693412f4,0xd270df6b,0x8f69e20c,0xc5065494,0x697e43a1,0xa76a90c3 },
  112370. { 0x4624825a,0xe0fa3384,0x8acc34c2,0x82e48c0b,0xe9a14f2b,0x7b24bd14,
  112371. 0x4db30803,0x4f5dd5e2,0x932da0a3,0x0c77a9e7,0x74c653dc,0x20db90f2 } },
  112372. /* 90 */
  112373. { { 0x0e6c5fd9,0x261179b7,0x6c982eea,0xf8bec123,0xd4957b7e,0x47683338,
  112374. 0x0a72f66a,0xcc47e664,0x1bad9350,0xbd54bf6a,0xf454e95a,0xdfbf4c6a },
  112375. { 0x6907f4fa,0x3f7a7afa,0x865ca735,0x7311fae0,0x2a496ada,0x24737ab8,
  112376. 0x15feb79b,0x13e425f1,0xa1b93c21,0xe9e97c50,0x4ddd3eb5,0xb26b6eac } },
  112377. /* 91 */
  112378. { { 0x2a2e5f2b,0x81cab9f5,0xbf385ac4,0xf93caf29,0xc909963a,0xf4bf35c3,
  112379. 0x74c9143c,0x081e7300,0xc281b4c5,0x3ea57fa8,0x9b340741,0xe497905c },
  112380. { 0x55ab3cfb,0xf556dd8a,0x518db6ad,0xd444b96b,0x5ef4b955,0x34f5425a,
  112381. 0xecd26aa3,0xdda7a3ac,0xda655e97,0xb57da11b,0xc2024c70,0x02da3eff } },
  112382. /* 92 */
  112383. { { 0x6481d0d9,0xe24b0036,0x818fdfe2,0x3740dbe5,0x190fda00,0xc1fc1f45,
  112384. 0x3cf27fde,0x329c9280,0x6934f43e,0x7435cb53,0x7884e8fe,0x2b505a5d },
  112385. { 0x711adcc9,0x6cfcc6a6,0x531e21e1,0xf034325c,0x9b2a8a99,0xa2f4a967,
  112386. 0x3c21bdff,0x9d5f3842,0x31b57d66,0xb25c7811,0x0b8093b9,0xdb5344d8 } },
  112387. /* 93 */
  112388. { { 0xae50a2f5,0x0d72e667,0xe4a861d1,0x9b7f8d8a,0x330df1cb,0xa129f70f,
  112389. 0xe04fefc3,0xe90aa5d7,0xe72c3ae1,0xff561ecb,0xcdb955fa,0x0d8fb428 },
  112390. { 0xd7663784,0xd2235f73,0x7e2c456a,0xc05baec6,0x2adbfccc,0xe5c292e4,
  112391. 0xefb110d5,0x4fd17988,0xd19d49f3,0x27e57734,0x84f679fe,0x188ac4ce } },
  112392. /* 94 */
  112393. { { 0xa796c53e,0x7ee344cf,0x0868009b,0xbbf6074d,0x474a1295,0x1f1594f7,
  112394. 0xac11632d,0x66776edc,0x04e2fa5a,0x1862278b,0xc854a89a,0x52665cf2 },
  112395. { 0x8104ab58,0x7e376464,0x7204fd6d,0x16775913,0x44ea1199,0x86ca06a5,
  112396. 0x1c9240dd,0xaa3f765b,0x24746149,0x5f8501a9,0xdcd251d7,0x7b982e30 } },
  112397. /* 95 */
  112398. { { 0xc15f3060,0xe44e9efc,0xa87ebbe6,0x5ad62f2e,0xc79500d4,0x36499d41,
  112399. 0x336fa9d1,0xa66d6dc0,0x5afd3b1f,0xf8afc495,0xe5c9822b,0x1d8ccb24 },
  112400. { 0x79d7584b,0x4031422b,0xea3f20dd,0xc54a0580,0x958468c5,0x3f837c8f,
  112401. 0xfbea7735,0x3d82f110,0x7dffe2fc,0x679a8778,0x20704803,0x48eba63b } },
  112402. /* 96 */
  112403. { { 0xdf46e2f6,0x89b10d41,0x19514367,0x13ab57f8,0x1d469c87,0x067372b9,
  112404. 0x4f6c5798,0x0c195afa,0x272c9acf,0xea43a12a,0x678abdac,0x9dadd8cb },
  112405. { 0xe182579a,0xcce56c6b,0x2d26c2d8,0x86febadb,0x2a44745c,0x1c668ee1,
  112406. 0x98dc047a,0x580acd86,0x51b9ec2d,0x5a2b79cc,0x4054f6a0,0x007da608 } },
  112407. /* 97 */
  112408. { { 0x17b00dd0,0x9e3ca352,0x0e81a7a6,0x046779cb,0xd482d871,0xb999fef3,
  112409. 0xd9233fbc,0xe6f38134,0xf48cd0e0,0x112c3001,0x3c6c66ae,0x934e7576 },
  112410. { 0xd73234dc,0xb44d4fc3,0x864eafc1,0xfcae2062,0x26bef21a,0x843afe25,
  112411. 0xf3b75fdf,0x61355107,0x794c2e6b,0x8367a5aa,0x8548a372,0x3d2629b1 } },
  112412. /* 98 */
  112413. { { 0x437cfaf8,0x6230618f,0x2032c299,0x5b8742cb,0x2293643a,0x949f7247,
  112414. 0x09464f79,0xb8040f1a,0x4f254143,0x049462d2,0x366c7e76,0xabd6b522 },
  112415. { 0xd5338f55,0x119b392b,0x01495a0c,0x1a80a9ce,0xf8d7537e,0xf3118ca7,
  112416. 0x6bf4b762,0xb715adc2,0xa8482b6c,0x24506165,0x96a7c84d,0xd958d7c6 } },
  112417. /* 99 */
  112418. { { 0xbdc21f31,0x9ad8aa87,0x8063e58c,0xadb3cab4,0xb07dd7b8,0xefd86283,
  112419. 0x1be7c6b4,0xc7b9b762,0x015582de,0x2ef58741,0x299addf3,0xc970c52e },
  112420. { 0x22f24d66,0x78f02e2a,0x74cc100a,0xefec1d10,0x09316e1a,0xaf2a6a39,
  112421. 0x5849dd49,0xce7c2205,0x96bffc4c,0x9c1fe75c,0x7ba06ec0,0xcad98fd2 } },
  112422. /* 100 */
  112423. { { 0xb648b73e,0xed76e2d0,0x1cfd285e,0xa9f92ce5,0x2ed13de1,0xa8c86c06,
  112424. 0xa5191a93,0x1d3a574e,0x1ad1b8bf,0x385cdf8b,0x47d2cfe3,0xbbecc28a },
  112425. { 0x69cec548,0x98d326c0,0xf240a0b2,0x4f5bc1dd,0x29057236,0x241a7062,
  112426. 0xc68294a4,0x0fc6e9c5,0xa319f17a,0x4d04838b,0x9ffc1c6f,0x8b612cf1 } },
  112427. /* 101 */
  112428. { { 0x4c3830eb,0x9bb0b501,0x8ee0d0c5,0x3d08f83c,0x79ba9389,0xa4a62642,
  112429. 0x9cbc2914,0x5d5d4044,0x074c46f0,0xae9eb83e,0x74ead7d6,0x63bb758f },
  112430. { 0xc6bb29e0,0x1c40d2ea,0x4b02f41e,0x95aa2d87,0x53cb199a,0x92989175,
  112431. 0x51584f6d,0xdd91bafe,0x31a1aaec,0x3715efb9,0x46780f9e,0xc1b6ae5b } },
  112432. /* 102 */
  112433. { { 0x42772f41,0xcded3e4b,0x3bcb79d1,0x3a700d5d,0x80feee60,0x4430d50e,
  112434. 0xf5e5d4bb,0x444ef1fc,0xe6e358ff,0xc660194f,0x6a91b43c,0xe68a2f32 },
  112435. { 0x977fe4d2,0x5842775c,0x7e2a41eb,0x78fdef5c,0xff8df00e,0x5f3bec02,
  112436. 0x5852525d,0xf4b840cd,0x4e6988bd,0x0870483a,0xcc64b837,0x39499e39 } },
  112437. /* 103 */
  112438. { { 0xb08df5fe,0xfc05de80,0x63ba0362,0x0c12957c,0xd5cf1428,0xea379414,
  112439. 0x54ef6216,0xc559132a,0xb9e65cf8,0x33d5f12f,0x1695d663,0x09c60278 },
  112440. { 0x61f7a2fb,0x3ac1ced4,0xd4f5eeb8,0xdd838444,0x8318fcad,0x82a38c6c,
  112441. 0xe9f1a864,0x315be2e5,0x442daf47,0x317b5771,0x95aa5f9e,0x81b5904a } },
  112442. /* 104 */
  112443. { { 0x8b21d232,0x6b6b1c50,0x8c2cba75,0x87f3dbc0,0xae9f0faf,0xa7e74b46,
  112444. 0xbb7b8079,0x036a0985,0x8d974a25,0x4f185b90,0xd9af5ec9,0x5aa7cef0 },
  112445. { 0x57dcfffc,0xe0566a70,0xb8453225,0x6ea311da,0x23368aa9,0x72ea1a8d,
  112446. 0x48cd552d,0xed9b2083,0xc80ea435,0xb987967c,0x6c104173,0xad735c75 } },
  112447. /* 105 */
  112448. { { 0xcee76ef4,0xaea85ab3,0xaf1d2b93,0x44997444,0xeacb923f,0x0851929b,
  112449. 0x51e3bc0c,0xb080b590,0x59be68a2,0xc4ee1d86,0x64b26cda,0xf00de219 },
  112450. { 0xf2e90d4d,0x8d7fb5c0,0x77d9ec64,0x00e219a7,0x5d1c491c,0xc4e6febd,
  112451. 0x1a8f4585,0x080e3754,0x48d2af9c,0x4a9b86c8,0xb6679851,0x2ed70db6 } },
  112452. /* 106 */
  112453. { { 0x586f25cb,0xaee44116,0xa0fcf70f,0xf7b6861f,0x18a350e8,0x55d2cd20,
  112454. 0x92dc286f,0x861bf3e5,0x6226aba7,0x9ab18ffa,0xa9857b03,0xd15827be },
  112455. { 0x92e6acef,0x26c1f547,0xac1fbac3,0x422c63c8,0xfcbfd71d,0xa2d8760d,
  112456. 0xb2511224,0x35f6a539,0x048d1a21,0xbaa88fa1,0xebf999db,0x49f1abe9 } },
  112457. /* 107 */
  112458. { { 0xf7492b73,0x16f9f4f4,0xcb392b1a,0xcf28ec1e,0x69ca6ffc,0x45b130d4,
  112459. 0xb72efa58,0x28ba8d40,0x5ca066f5,0xace987c7,0x4ad022eb,0x3e399246 },
  112460. { 0x752555bb,0x63a2d84e,0x9c2ae394,0xaaa93b4a,0xc89539ca,0xcd80424e,
  112461. 0xaa119a99,0x6d6b5a6d,0x379f2629,0xbd50334c,0xef3cc7d3,0x899e925e } },
  112462. /* 108 */
  112463. { { 0xbf825dc4,0xb7ff3651,0x40b9c462,0x0f741cc4,0x5cc4fb5b,0x771ff5a9,
  112464. 0x47fd56fe,0xcb9e9c9b,0x5626c0d3,0xbdf053db,0xf7e14098,0xa97ce675 },
  112465. { 0x6c934f5e,0x68afe5a3,0xccefc46f,0x6cd5e148,0xd7a88586,0xc7758570,
  112466. 0xdd558d40,0x49978f5e,0x64ae00c1,0xa1d5088a,0xf1d65bb2,0x58f2a720 } },
  112467. /* 109 */
  112468. { { 0x3e4daedb,0x66fdda4a,0x65d1b052,0x38318c12,0x4c4bbf5c,0x28d910a2,
  112469. 0x78a9cd14,0x762fe5c4,0xd2cc0aee,0x08e5ebaa,0xca0c654c,0xd2cdf257 },
  112470. { 0x08b717d2,0x48f7c58b,0x386cd07a,0x3807184a,0xae7d0112,0x3240f626,
  112471. 0xc43917b0,0x03e9361b,0x20aea018,0xf261a876,0x7e1e6372,0x53f556a4 } },
  112472. /* 110 */
  112473. { { 0x2f512a90,0xc84cee56,0x1b0ea9f1,0x24b3c004,0xe26cc1ea,0x0ee15d2d,
  112474. 0xf0c9ef7d,0xd848762c,0xd5341435,0x1026e9c5,0xfdb16b31,0x8f5b73dc },
  112475. { 0xd2c75d95,0x1f69bef2,0xbe064dda,0x8d33d581,0x57ed35e6,0x8c024c12,
  112476. 0xc309c281,0xf8d435f9,0xd6960193,0xfd295061,0xe9e49541,0x66618d78 } },
  112477. /* 111 */
  112478. { { 0x8ce382de,0x571cfd45,0xde900dde,0x175806ee,0x34aba3b5,0x61849965,
  112479. 0xde7aec95,0xe899778a,0xff4aa97f,0xe8f00f6e,0x010b0c6d,0xae971cb5 },
  112480. { 0x3af788f1,0x1827eebc,0xe413fe2d,0xd46229ff,0x4741c9b4,0x8a15455b,
  112481. 0xf8e424eb,0x5f02e690,0xdae87712,0x40a1202e,0x64944f6d,0x49b3bda2 } },
  112482. /* 112 */
  112483. { { 0x035b2d69,0xd63c6067,0x6bed91b0,0xb507150d,0x7afb39b2,0x1f35f82f,
  112484. 0x16012b66,0xb9bd9c01,0xed0a5f50,0x00d97960,0x2716f7c9,0xed705451 },
  112485. { 0x127abdb4,0x1576eff4,0xf01e701c,0x6850d698,0x3fc87e2f,0x9fa7d749,
  112486. 0xb0ce3e48,0x0b6bcc6f,0xf7d8c1c0,0xf4fbe1f5,0x02719cc6,0xcf75230e } },
  112487. /* 113 */
  112488. { { 0x722d94ed,0x6761d6c2,0x3718820e,0xd1ec3f21,0x25d0e7c6,0x65a40b70,
  112489. 0xbaf3cf31,0xd67f830e,0xb93ea430,0x633b3807,0x0bc96c69,0x17faa0ea },
  112490. { 0xdf866b98,0xe6bf3482,0xa9db52d4,0x205c1ee9,0xff9ab869,0x51ef9bbd,
  112491. 0x75eeb985,0x3863dad1,0xd3cf442a,0xef216c3b,0xf9c8e321,0x3fb228e3 } },
  112492. /* 114 */
  112493. { { 0x0760ac07,0x94f9b70c,0x9d79bf4d,0xf3c9ccae,0xc5ffc83d,0x73cea084,
  112494. 0xdc49c38e,0xef50f943,0xbc9e7330,0xf467a2ae,0x44ea7fba,0x5ee534b6 },
  112495. { 0x03609e7f,0x20cb6272,0x62fdc9f0,0x09844355,0x0f1457f7,0xaf5c8e58,
  112496. 0xb4b25941,0xd1f50a6c,0x2ec82395,0x77cb247c,0xda3dca33,0xa5f3e1e5 } },
  112497. /* 115 */
  112498. { { 0x7d85fa94,0x023489d6,0x2db9ce47,0x0ba40537,0xaed7aad1,0x0fdf7a1f,
  112499. 0x9a4ccb40,0xa57b0d73,0x5b18967c,0x48fcec99,0xb7274d24,0xf30b5b6e },
  112500. { 0xc81c5338,0x7ccb4773,0xa3ed6bd0,0xb85639e6,0x1d56eada,0x7d9df95f,
  112501. 0x0a1607ad,0xe256d57f,0x957574d6,0x6da7ffdc,0x01c7a8c4,0x65f84046 } },
  112502. /* 116 */
  112503. { { 0xcba1e7f1,0x8d45d0cb,0x02b55f64,0xef0a08c0,0x17e19892,0x771ca31b,
  112504. 0x4885907e,0xe1843ecb,0x364ce16a,0x67797ebc,0x8df4b338,0x816d2b2d },
  112505. { 0x39aa8671,0xe870b0e5,0xc102b5f5,0x9f0db3e4,0x1720c697,0x34296659,
  112506. 0x613c0d2a,0x0ad4c89e,0x418ddd61,0x1af900b2,0xd336e20e,0xe087ca72 } },
  112507. /* 117 */
  112508. { { 0xaba10079,0x222831ff,0x6d64fff2,0x0dc5f87b,0x3e8cb330,0x44547907,
  112509. 0x702a33fb,0xe815aaa2,0x5fba3215,0x338d6b2e,0x79f549c8,0x0f7535cb },
  112510. { 0x2ee95923,0x471ecd97,0xc6d1c09f,0x1e868b37,0xc666ef4e,0x2bc7b8ec,
  112511. 0x808a4bfc,0xf5416589,0x3fbc4d2e,0xf23e9ee2,0x2d75125b,0x4357236c } },
  112512. /* 118 */
  112513. { { 0xba9cdb1b,0xfe176d95,0x2f82791e,0x45a1ca01,0x4de4cca2,0x97654af2,
  112514. 0x5cc4bcb9,0xbdbf9d0e,0xad97ac0a,0xf6a7df50,0x61359fd6,0xc52112b0 },
  112515. { 0x4f05eae3,0x696d9ce3,0xe943ac2b,0x903adc02,0x0848be17,0xa9075347,
  112516. 0x2a3973e5,0x1e20f170,0x6feb67e9,0xe1aacc1c,0xe16bc6b9,0x2ca0ac32 } },
  112517. /* 119 */
  112518. { { 0xef871eb5,0xffea12e4,0xa8bf0a7a,0x94c2f25d,0x78134eaa,0x4d1e4c2a,
  112519. 0x0360fb10,0x11ed16fb,0x85fc11be,0x4029b6db,0xf4d390fa,0x5e9f7ab7 },
  112520. { 0x30646612,0x5076d72f,0xdda1d0d8,0xa0afed1d,0x85a1d103,0x29022257,
  112521. 0x4e276bcd,0xcb499e17,0x51246c3d,0x16d1da71,0x589a0443,0xc72d56d3 } },
  112522. /* 120 */
  112523. { { 0xdae5bb45,0xdf5ffc74,0x261bd6dc,0x99068c4a,0xaa98ec7b,0xdc0afa7a,
  112524. 0xf121e96d,0xedd2ee00,0x1414045c,0x163cc7be,0x335af50e,0xb0b1bbce },
  112525. { 0x01a06293,0xd440d785,0x6552e644,0xcdebab7c,0x8c757e46,0x48cb8dbc,
  112526. 0x3cabe3cb,0x81f9cf78,0xb123f59a,0xddd02611,0xeeb3784d,0x3dc7b88e } },
  112527. /* 121 */
  112528. { { 0xc4741456,0xe1b8d398,0x6032a121,0xa9dfa902,0x1263245b,0x1cbfc86d,
  112529. 0x5244718c,0xf411c762,0x05b0fc54,0x96521d54,0xdbaa4985,0x1afab46e },
  112530. { 0x8674b4ad,0xa75902ba,0x5ad87d12,0x486b43ad,0x36e0d099,0x72b1c736,
  112531. 0xbb6cd6d6,0x39890e07,0x59bace4e,0x8128999c,0x7b535e33,0xd8da430b } },
  112532. /* 122 */
  112533. { { 0xc6b75791,0x39f65642,0x21806bfb,0x050947a6,0x1362ef84,0x0ca3e370,
  112534. 0x8c3d2391,0x9bc60aed,0x732e1ddc,0x9b488671,0xa98ee077,0x12d10d9e },
  112535. { 0x3651b7dc,0xb6f2822d,0x80abd138,0x6345a5ba,0x472d3c84,0x62033262,
  112536. 0xacc57527,0xd54a1d40,0x424447cb,0x6ea46b3a,0x2fb1a496,0x5bc41057 } },
  112537. /* 123 */
  112538. { { 0xa751cd0e,0xe70c57a3,0xeba3c7d6,0x190d8419,0x9d47d55a,0xb1c3bee7,
  112539. 0xf912c6d8,0xda941266,0x407a6ad6,0x12e9aacc,0x6e838911,0xd6ce5f11 },
  112540. { 0x70e1f2ce,0x063ca97b,0x8213d434,0xa3e47c72,0x84df810a,0xa016e241,
  112541. 0xdfd881a4,0x688ad7b0,0xa89bf0ad,0xa37d99fc,0xa23c2d23,0xd8e3f339 } },
  112542. /* 124 */
  112543. { { 0x750bed6f,0xbdf53163,0x83e68b0a,0x808abc32,0x5bb08a33,0x85a36627,
  112544. 0x6b0e4abe,0xf72a3a0f,0xfaf0c6ad,0xf7716d19,0x5379b25f,0x22dcc020 },
  112545. { 0xf9a56e11,0x7400bf8d,0x56a47f21,0x6cb8bad7,0x7a6eb644,0x7c97176f,
  112546. 0xd1f5b646,0xe8fd84f7,0x44ddb054,0x98320a94,0x1dde86f5,0x07071ba3 } },
  112547. /* 125 */
  112548. { { 0x98f8fcb9,0x6fdfa0e5,0x94d0d70c,0x89cec8e0,0x106d20a8,0xa0899397,
  112549. 0xba8acc9c,0x915bfb9a,0x5507e01c,0x1370c94b,0x8a821ffb,0x83246a60 },
  112550. { 0xbe3c378f,0xa8273a9f,0x35a25be9,0x7e544789,0x4dd929d7,0x6cfa4972,
  112551. 0x365bd878,0x987fed9d,0x5c29a7ae,0x4982ac94,0x5ddd7ec5,0x4589a5d7 } },
  112552. /* 126 */
  112553. { { 0xa95540a9,0x9fabb174,0x0162c5b0,0x7cfb886f,0xea3dee18,0x17be766b,
  112554. 0xe88e624c,0xff7da41f,0x8b919c38,0xad0b71eb,0xf31ff9a9,0x86a522e0 },
  112555. { 0x868bc259,0xbc8e6f72,0x3ccef9e4,0x6130c638,0x9a466555,0x09f1f454,
  112556. 0x19b2bfb4,0x8e6c0f09,0x0ca7bb22,0x945c46c9,0x4dafb67b,0xacd87168 } },
  112557. /* 127 */
  112558. { { 0x10c53841,0x090c72ca,0x55a4fced,0xc20ae01b,0xe10234ad,0x03f7ebd5,
  112559. 0x85892064,0xb3f42a6a,0xb4a14722,0xbdbc30c0,0x8ca124cc,0x971bc437 },
  112560. { 0x517ff2ff,0x6f79f46d,0xecba947b,0x6a9c96e2,0x62925122,0x5e79f2f4,
  112561. 0x6a4e91f1,0x30a96bb1,0x2d4c72da,0x1147c923,0x5811e4df,0x65bc311f } },
  112562. /* 128 */
  112563. { { 0x139b3239,0x87c7dd7d,0x4d833bae,0x8b57824e,0x9fff0015,0xbcbc4878,
  112564. 0x909eaf1a,0x8ffcef8b,0xf1443a78,0x9905f4ee,0xe15cbfed,0x020dd4a2 },
  112565. { 0xa306d695,0xca2969ec,0xb93caf60,0xdf940cad,0x87ea6e39,0x67f7fab7,
  112566. 0xf98c4fe5,0x0d0ee10f,0xc19cb91e,0xc646879a,0x7d1d7ab4,0x4b4ea50c } },
  112567. /* 129 */
  112568. { { 0x7a0db57e,0x19e40945,0x9a8c9702,0xe6017cad,0x1be5cff9,0xdbf739e5,
  112569. 0xa7a938a2,0x3646b3cd,0x68350dfc,0x04511085,0x56e098b5,0xad3bd6f3 },
  112570. { 0xee2e3e3e,0x935ebabf,0x473926cb,0xfbd01702,0x9e9fb5aa,0x7c735b02,
  112571. 0x2e3feff0,0xc52a1b85,0x046b405a,0x9199abd3,0x39039971,0xe306fcec } },
  112572. /* 130 */
  112573. { { 0x23e4712c,0xd6d9aec8,0xc3c198ee,0x7ca8376c,0x31bebd8a,0xe6d83187,
  112574. 0xd88bfef3,0xed57aff3,0xcf44edc7,0x72a645ee,0x5cbb1517,0xd4e63d0b },
  112575. { 0xceee0ecf,0x98ce7a1c,0x5383ee8e,0x8f012633,0xa6b455e8,0x3b879078,
  112576. 0xc7658c06,0xcbcd3d96,0x0783336a,0x721d6fe7,0x5a677136,0xf21a7263 } },
  112577. /* 131 */
  112578. { { 0x9586ba11,0x19d8b3cd,0x8a5c0480,0xd9e0aeb2,0x2230ef5c,0xe4261dbf,
  112579. 0x02e6bf09,0x095a9dee,0x80dc7784,0x8963723c,0x145157b1,0x5c97dbaf },
  112580. { 0x4bc4503e,0x97e74434,0x85a6b370,0x0fb1cb31,0xcd205d4b,0x3e8df2be,
  112581. 0xf8f765da,0x497dd1bc,0x6c988a1a,0x92ef95c7,0x64dc4cfa,0x3f924baa } },
  112582. /* 132 */
  112583. { { 0x7268b448,0x6bf1b8dd,0xefd79b94,0xd4c28ba1,0xe4e3551f,0x2fa1f8c8,
  112584. 0x5c9187a9,0x769e3ad4,0x40326c0d,0x28843b4d,0x50d5d669,0xfefc8094 },
  112585. { 0x90339366,0x30c85bfd,0x5ccf6c3a,0x4eeb56f1,0x28ccd1dc,0x0e72b149,
  112586. 0xf2ce978e,0x73ee85b5,0x3165bb23,0xcdeb2bf3,0x4e410abf,0x8106c923 } },
  112587. /* 133 */
  112588. { { 0x7d02f4ee,0xc8df0161,0x18e21225,0x8a781547,0x6acf9e40,0x4ea895eb,
  112589. 0x6e5a633d,0x8b000cb5,0x7e981ffb,0xf31d86d5,0x4475bc32,0xf5c8029c },
  112590. { 0x1b568973,0x764561ce,0xa62996ec,0x2f809b81,0xda085408,0x9e513d64,
  112591. 0xe61ce309,0xc27d815d,0x272999e0,0x0da6ff99,0xfead73f7,0xbd284779 } },
  112592. /* 134 */
  112593. { { 0x9b1cdf2b,0x6033c2f9,0xbc5fa151,0x2a99cf06,0x12177b3b,0x7d27d259,
  112594. 0xc4485483,0xb1f15273,0x102e2297,0x5fd57d81,0xc7f6acb7,0x3d43e017 },
  112595. { 0x3a70eb28,0x41a8bb0b,0x3e80b06b,0x67de2d8e,0x70c28de5,0x09245a41,
  112596. 0xa7b26023,0xad7dbcb1,0x2cbc6c1e,0x70b08a35,0x9b33041f,0xb504fb66 } },
  112597. /* 135 */
  112598. { { 0xf97a27c2,0xa8e85ab5,0xc10a011b,0x6ac5ec8b,0xffbcf161,0x55745533,
  112599. 0x65790a60,0x01780e85,0x99ee75b0,0xe451bf85,0x39c29881,0x8907a63b },
  112600. { 0x260189ed,0x76d46738,0x47bd35cb,0x284a4436,0x20cab61e,0xd74e8c40,
  112601. 0x416cf20a,0x6264bf8c,0x5fd820ce,0xfa5a6c95,0xf24bb5fc,0xfa7154d0 } },
  112602. /* 136 */
  112603. { { 0x9b3f5034,0x18482cec,0xcd9e68fd,0x962d445a,0x95746f23,0x266fb1d6,
  112604. 0x58c94a4b,0xc66ade5a,0xed68a5b6,0xdbbda826,0x7ab0d6ae,0x05664a4d },
  112605. { 0x025e32fc,0xbcd4fe51,0xa96df252,0x61a5aebf,0x31592a31,0xd88a07e2,
  112606. 0x98905517,0x5d9d94de,0x5fd440e7,0x96bb4010,0xe807db4c,0x1b0c47a2 } },
  112607. /* 137 */
  112608. { { 0x08223878,0x5c2a6ac8,0xe65a5558,0xba08c269,0x9bbc27fd,0xd22b1b9b,
  112609. 0x72b9607d,0x919171bf,0xe588dc58,0x9ab455f9,0x23662d93,0x6d54916e },
  112610. { 0x3b1de0c1,0x8da8e938,0x804f278f,0xa84d186a,0xd3461695,0xbf4988cc,
  112611. 0xe10eb0cb,0xf5eae3be,0xbf2a66ed,0x1ff8b68f,0xc305b570,0xa68daf67 } },
  112612. /* 138 */
  112613. { { 0x44b2e045,0xc1004cff,0x4b1c05d4,0x91b5e136,0x88a48a07,0x53ae4090,
  112614. 0xea11bb1a,0x73fb2995,0x3d93a4ea,0x32048570,0x3bfc8a5f,0xcce45de8 },
  112615. { 0xc2b3106e,0xaff4a97e,0xb6848b4f,0x9069c630,0xed76241c,0xeda837a6,
  112616. 0x6cc3f6cf,0x8a0daf13,0x3da018a8,0x199d049d,0xd9093ba3,0xf867c6b1 } },
  112617. /* 139 */
  112618. { { 0x56527296,0xe4d42a56,0xce71178d,0xae26c73d,0x6c251664,0x70a0adac,
  112619. 0x5dc0ae1d,0x813483ae,0xdaab2daf,0x7574eacd,0xc2d55f4f,0xc56b52dc },
  112620. { 0x95f32923,0x872bc167,0x5bdd2a89,0x4be17581,0xa7699f00,0x9b57f1e7,
  112621. 0x3ac2de02,0x5fcd9c72,0x92377739,0x83af3ba1,0xfc50b97f,0xa64d4e2b } },
  112622. /* 140 */
  112623. { { 0x0e552b40,0x2172dae2,0xd34d52e8,0x62f49725,0x07958f98,0x7930ee40,
  112624. 0x751fdd74,0x56da2a90,0xf53e48c3,0xf1192834,0x8e53c343,0x34d2ac26 },
  112625. { 0x13111286,0x1073c218,0xda9d9827,0x201dac14,0xee95d378,0xec2c29db,
  112626. 0x1f3ee0b1,0x9316f119,0x544ce71c,0x7890c9f0,0x27612127,0xd77138af } },
  112627. /* 141 */
  112628. { { 0x3b4ad1cd,0x78045e6d,0x4aa49bc1,0xcd86b94e,0xfd677a16,0x57e51f1d,
  112629. 0xfa613697,0xd9290935,0x34f4d893,0x7a3f9593,0x5d5fcf9b,0x8c9c248b },
  112630. { 0x6f70d4e9,0x9f23a482,0x63190ae9,0x17273454,0x5b081a48,0x4bdd7c13,
  112631. 0x28d65271,0x1e2de389,0xe5841d1f,0x0bbaaa25,0x746772e5,0xc4c18a79 } },
  112632. /* 142 */
  112633. { { 0x593375ac,0x10ee2681,0x7dd5e113,0x4f3288be,0x240f3538,0x9a97b2fb,
  112634. 0x1de6b1e2,0xfa11089f,0x1351bc58,0x516da562,0x2dfa85b5,0x573b6119 },
  112635. { 0x6cba7df5,0x89e96683,0x8c28ab40,0xf299be15,0xad43fcbf,0xe91c9348,
  112636. 0x9a1cefb3,0xe9bbc7cc,0x738b2775,0xc8add876,0x775eaa01,0x6e3b1f2e } },
  112637. /* 143 */
  112638. { { 0xb677788b,0x0365a888,0x3fd6173c,0x634ae8c4,0x9e498dbe,0x30498761,
  112639. 0xc8f779ab,0x08c43e6d,0x4c09aca9,0x068ae384,0x2018d170,0x2380c70b },
  112640. { 0xa297c5ec,0xcf77fbc3,0xca457948,0xdacbc853,0x336bec7e,0x3690de04,
  112641. 0x14eec461,0x26bbac64,0x1f713abf,0xd1c23c7e,0xe6fd569e,0xf08bbfcd } },
  112642. /* 144 */
  112643. { { 0x84770ee3,0x5f8163f4,0x744a1706,0x0e0c7f94,0xe1b2d46d,0x9c8f05f7,
  112644. 0xd01fd99a,0x417eafe7,0x11440e5b,0x2ba15df5,0x91a6fbcf,0xdc5c552a },
  112645. { 0xa270f721,0x86271d74,0xa004485b,0x32c0a075,0x8defa075,0x9d1a87e3,
  112646. 0xbf0d20fe,0xb590a7ac,0x8feda1f5,0x430c41c2,0x58f6ec24,0x454d2879 } },
  112647. /* 145 */
  112648. { { 0x7c525435,0x52b7a635,0x37c4bdbc,0x3d9ef57f,0xdffcc475,0x2bb93e9e,
  112649. 0x7710f3be,0xf7b8ba98,0x21b727de,0x42ee86da,0x2e490d01,0x55ac3f19 },
  112650. { 0xc0c1c390,0x487e3a6e,0x446cde7b,0x036fb345,0x496ae951,0x089eb276,
  112651. 0x71ed1234,0xedfed4d9,0x900f0b46,0x661b0dd5,0x8582f0d3,0x11bd6f1b } },
  112652. /* 146 */
  112653. { { 0x076bc9d1,0x5cf9350f,0xcf3cd2c3,0x15d903be,0x25af031c,0x21cfc8c2,
  112654. 0x8b1cc657,0xe0ad3248,0x70014e87,0xdd9fb963,0x297f1658,0xf0f3a5a1 },
  112655. { 0xf1f703aa,0xbb908fba,0x2f6760ba,0x2f9cc420,0x66a38b51,0x00ceec66,
  112656. 0x05d645da,0x4deda330,0xf7de3394,0xb9cf5c72,0x1ad4c906,0xaeef6502 } },
  112657. /* 147 */
  112658. { { 0x7a19045d,0x0583c8b1,0xd052824c,0xae7c3102,0xff6cfa58,0x2a234979,
  112659. 0x62c733c0,0xfe9dffc9,0x9c0c4b09,0x3a7fa250,0x4fe21805,0x516437bb },
  112660. { 0xc2a23ddb,0x9454e3d5,0x289c104e,0x0726d887,0x4fd15243,0x8977d918,
  112661. 0x6d7790ba,0xc559e73f,0x465af85f,0x8fd3e87d,0x5feee46b,0xa2615c74 } },
  112662. /* 148 */
  112663. { { 0x4335167d,0xc8d607a8,0xe0f5c887,0x8b42d804,0x398d11f9,0x5f9f13df,
  112664. 0x20740c67,0x5aaa5087,0xa3d9234b,0x83da9a6a,0x2a54bad1,0xbd3a5c4e },
  112665. { 0x2db0f658,0xdd13914c,0x5a3f373a,0x29dcb66e,0x5245a72b,0xbfd62df5,
  112666. 0x91e40847,0x19d18023,0xb136b1ae,0xd9df74db,0x3f93bc5b,0x72a06b6b } },
  112667. /* 149 */
  112668. { { 0xad19d96f,0x6da19ec3,0xfb2a4099,0xb342daa4,0x662271ea,0x0e61633a,
  112669. 0xce8c054b,0x3bcece81,0x8bd62dc6,0x7cc8e061,0xee578d8b,0xae189e19 },
  112670. { 0xdced1eed,0x73e7a25d,0x7875d3ab,0xc1257f0a,0x1cfef026,0x2cb2d5a2,
  112671. 0xb1fdf61c,0xd98ef39b,0x24e83e6c,0xcd8e6f69,0xc7b7088b,0xd71e7076 } },
  112672. /* 150 */
  112673. { { 0x9d4245bf,0x33936830,0x2ac2953b,0x22d96217,0x56c3c3cd,0xb3bf5a82,
  112674. 0x0d0699e8,0x50c9be91,0x8f366459,0xec094463,0x513b7c35,0x6c056dba },
  112675. { 0x045ab0e3,0x687a6a83,0x445c9295,0x8d40b57f,0xa16f5954,0x0f345048,
  112676. 0x3d8f0a87,0x64b5c639,0x9f71c5e2,0x106353a2,0x874f0dd4,0xdd58b475 } },
  112677. /* 151 */
  112678. { { 0x62230c72,0x67ec084f,0x481385e3,0xf14f6cca,0x4cda7774,0xf58bb407,
  112679. 0xaa2dbb6b,0xe15011b1,0x0c035ab1,0xd488369d,0x8245f2fd,0xef83c24a },
  112680. { 0x9fdc2538,0xfb57328f,0x191fe46a,0x79808293,0x32ede548,0xe28f5c44,
  112681. 0xea1a022c,0x1b3cda99,0x3df2ec7f,0x39e639b7,0x760e9a18,0x77b6272b } },
  112682. /* 152 */
  112683. { { 0xa65d56d5,0x2b1d51bd,0x7ea696e0,0x3a9b71f9,0x9904f4c4,0x95250ecc,
  112684. 0xe75774b7,0x8bc4d6eb,0xeaeeb9aa,0x0e343f8a,0x930e04cb,0xc473c1d1 },
  112685. { 0x064cd8ae,0x282321b1,0x5562221c,0xf4b4371e,0xd1bf1221,0xc1cc81ec,
  112686. 0xe2c8082f,0xa52a07a9,0xba64a958,0x350d8e59,0x6fb32c9a,0x29e4f3de } },
  112687. /* 153 */
  112688. { { 0xba89aaa5,0x0aa9d56c,0xc4c6059e,0xf0208ac0,0xbd6ddca4,0x7400d9c6,
  112689. 0xf2c2f74a,0xb384e475,0xb1562dd3,0x4c1061fc,0x2e153b8d,0x3924e248 },
  112690. { 0x849808ab,0xf38b8d98,0xa491aa36,0x29bf3260,0x88220ede,0x85159ada,
  112691. 0xbe5bc422,0x8b47915b,0xd7300967,0xa934d72e,0x2e515d0d,0xc4f30398 } },
  112692. /* 154 */
  112693. { { 0x1b1de38b,0xe3e9ee42,0x42636760,0xa124e25a,0x90165b1a,0x90bf73c0,
  112694. 0x146434c5,0x21802a34,0x2e1fa109,0x54aa83f2,0xed9c51e9,0x1d4bd03c },
  112695. { 0x798751e6,0xc2d96a38,0x8c3507f5,0xed27235f,0xc8c24f88,0xb5fb80e2,
  112696. 0xd37f4f78,0xf873eefa,0xf224ba96,0x7229fd74,0x9edd7149,0x9dcd9199 } },
  112697. /* 155 */
  112698. { { 0x4e94f22a,0xee9f81a6,0xf71ec341,0xe5609892,0xa998284e,0x6c818ddd,
  112699. 0x3b54b098,0x9fd47295,0x0e8a7cc9,0x47a6ac03,0xb207a382,0xde684e5e },
  112700. { 0x2b6b956b,0x4bdd1ecd,0xf01b3583,0x09084414,0x55233b14,0xe2f80b32,
  112701. 0xef5ebc5e,0x5a0fec54,0xbf8b29a2,0x74cf25e6,0x7f29e014,0x1c757fa0 } },
  112702. /* 156 */
  112703. { { 0xeb0fdfe4,0x1bcb5c4a,0xf0899367,0xd7c649b3,0x05bc083b,0xaef68e3f,
  112704. 0xa78aa607,0x57a06e46,0x21223a44,0xa2136ecc,0x52f5a50b,0x89bd6484 },
  112705. { 0x4455f15a,0x724411b9,0x08a9c0fd,0x23dfa970,0x6db63bef,0x7b0da4d1,
  112706. 0xfb162443,0x6f8a7ec1,0xe98284fb,0xc1ac9cee,0x33566022,0x085a582b } },
  112707. /* 157 */
  112708. { { 0xec1f138a,0x15cb61f9,0x668f0c28,0x11c9a230,0xdf93f38f,0xac829729,
  112709. 0x4048848d,0xcef25698,0x2bba8fbf,0x3f686da0,0x111c619a,0xed5fea78 },
  112710. { 0xd6d1c833,0x9b4f73bc,0x86e7bf80,0x50951606,0x042b1d51,0xa2a73508,
  112711. 0x5fb89ec2,0x9ef6ea49,0x5ef8b892,0xf1008ce9,0x9ae8568b,0x78a7e684 } },
  112712. /* 158 */
  112713. { { 0x10470cd8,0x3fe83a7c,0xf86df000,0x92734682,0xda9409b5,0xb5dac06b,
  112714. 0x94939c5f,0x1e7a9660,0x5cc116dc,0xdec6c150,0x66bac8cc,0x1a52b408 },
  112715. { 0x6e864045,0x5303a365,0x9139efc1,0x45eae72a,0x6f31d54f,0x83bec646,
  112716. 0x6e958a6d,0x2fb4a86f,0x4ff44030,0x6760718e,0xe91ae0df,0x008117e3 } },
  112717. /* 159 */
  112718. { { 0x384310a2,0x5d5833ba,0x1fd6c9fc,0xbdfb4edc,0x849c4fb8,0xb9a4f102,
  112719. 0x581c1e1f,0xe5fb239a,0xd0a9746d,0xba44b2e7,0x3bd942b9,0x78f7b768 },
  112720. { 0xc87607ae,0x076c8ca1,0xd5caaa7e,0x82b23c2e,0x2763e461,0x6a581f39,
  112721. 0x3886df11,0xca8a5e4a,0x264e7f22,0xc87e90cf,0x215cfcfc,0x04f74870 } },
  112722. /* 160 */
  112723. { { 0x141d161c,0x5285d116,0x93c4ed17,0x67cd2e0e,0x7c36187e,0x12c62a64,
  112724. 0xed2584ca,0xf5329539,0x42fbbd69,0xc4c777c4,0x1bdfc50a,0x107de776 },
  112725. { 0xe96beebd,0x9976dcc5,0xa865a151,0xbe2aff95,0x9d8872af,0x0e0a9da1,
  112726. 0xa63c17cc,0x5e357a3d,0xe15cc67c,0xd31fdfd8,0x7970c6d8,0xc44bbefd } },
  112727. /* 161 */
  112728. { { 0x4c0c62f1,0x703f83e2,0x4e195572,0x9b1e28ee,0xfe26cced,0x6a82858b,
  112729. 0xc43638fa,0xd381c84b,0xa5ba43d8,0x94f72867,0x10b82743,0x3b4a783d },
  112730. { 0x7576451e,0xee1ad7b5,0x14b6b5c8,0xc3d0b597,0xfcacc1b8,0x3dc30954,
  112731. 0x472c9d7b,0x55df110e,0x02f8a328,0x97c86ed7,0x88dc098f,0xd0433413 } },
  112732. /* 162 */
  112733. { { 0x2ca8f2fe,0x1a60d152,0x491bd41f,0x61640948,0x58dfe035,0x6dae29a5,
  112734. 0x278e4863,0x9a615bea,0x9ad7c8e5,0xbbdb4477,0x2ceac2fc,0x1c706630 },
  112735. { 0x99699b4b,0x5e2b54c6,0x239e17e8,0xb509ca6d,0xea063a82,0x728165fe,
  112736. 0xb6a22e02,0x6b5e609d,0xb26ee1df,0x12813905,0x439491fa,0x07b9f722 } },
  112737. /* 163 */
  112738. { { 0x48ff4e49,0x1592ec14,0x6d644129,0x3e4e9f17,0x1156acc0,0x7acf8288,
  112739. 0xbb092b0b,0x5aa34ba8,0x7d38393d,0xcd0f9022,0xea4f8187,0x416724dd },
  112740. { 0xc0139e73,0x3c4e641c,0x91e4d87d,0xe0fe46cf,0xcab61f8a,0xedb3c792,
  112741. 0xd3868753,0x4cb46de4,0x20f1098a,0xe449c21d,0xf5b8ea6e,0x5e5fd059 } },
  112742. /* 164 */
  112743. { { 0x75856031,0x7fcadd46,0xeaf2fbd0,0x89c7a4cd,0x7a87c480,0x1af523ce,
  112744. 0x61d9ae90,0xe5fc1095,0xbcdb95f5,0x3fb5864f,0xbb5b2c7d,0xbeb5188e },
  112745. { 0x3ae65825,0x3d1563c3,0x0e57d641,0x116854c4,0x1942ebd3,0x11f73d34,
  112746. 0xc06955b3,0x24dc5904,0x995a0a62,0x8a0d4c83,0x5d577b7d,0xfb26b86d } },
  112747. /* 165 */
  112748. { { 0xc686ae17,0xc53108e7,0xd1c1da56,0x9090d739,0x9aec50ae,0x4583b013,
  112749. 0xa49a6ab2,0xdd9a088b,0xf382f850,0x28192eea,0xf5fe910e,0xcc8df756 },
  112750. { 0x9cab7630,0x877823a3,0xfb8e7fc1,0x64984a9a,0x364bfc16,0x5448ef9c,
  112751. 0xc44e2a9a,0xbbb4f871,0x435c95e9,0x901a41ab,0xaaa50a06,0xc6c23e5f } },
  112752. /* 166 */
  112753. { { 0x9034d8dd,0xb78016c1,0x0b13e79b,0x856bb44b,0xb3241a05,0x85c6409a,
  112754. 0x2d78ed21,0x8d2fe19a,0x726eddf2,0xdcc7c26d,0x25104f04,0x3ccaff5f },
  112755. { 0x6b21f843,0x397d7edc,0xe975de4c,0xda88e4dd,0x4f5ab69e,0x5273d396,
  112756. 0x9aae6cc0,0x537680e3,0x3e6f9461,0xf749cce5,0x957bffd3,0x021ddbd9 } },
  112757. /* 167 */
  112758. { { 0x777233cf,0x7b64585f,0x0942a6f0,0xfe6771f6,0xdfe6eef0,0x636aba7a,
  112759. 0x86038029,0x63bbeb56,0xde8fcf36,0xacee5842,0xd4a20524,0x48d9aa99 },
  112760. { 0x0da5e57a,0xcff7a74c,0xe549d6c9,0xc232593c,0xf0f2287b,0x68504bcc,
  112761. 0xbc8360b5,0x6d7d098d,0x5b402f41,0xeac5f149,0xb87d1bf1,0x61936f11 } },
  112762. /* 168 */
  112763. { { 0xb8153a9d,0xaa9da167,0x9e83ecf0,0xa49fe3ac,0x1b661384,0x14c18f8e,
  112764. 0x38434de1,0x61c24dab,0x283dae96,0x3d973c3a,0x82754fc9,0xc99baa01 },
  112765. { 0x4c26b1e3,0x477d198f,0xa7516202,0x12e8e186,0x362addfa,0x386e52f6,
  112766. 0xc3962853,0x31e8f695,0x6aaedb60,0xdec2af13,0x29cf74ac,0xfcfdb4c6 } },
  112767. /* 169 */
  112768. { { 0xcca40298,0x6b3ee958,0xf2f5d195,0xc3878153,0xed2eae5b,0x0c565630,
  112769. 0x3a697cf2,0xd089b37e,0xad5029ea,0xc2ed2ac7,0x0f0dda6a,0x7e5cdfad },
  112770. { 0xd9b86202,0xf98426df,0x4335e054,0xed1960b1,0x3f14639e,0x1fdb0246,
  112771. 0x0db6c670,0x17f709c3,0x773421e1,0xbfc687ae,0x26c1a8ac,0x13fefc4a } },
  112772. /* 170 */
  112773. { { 0x7ffa0a5f,0xe361a198,0xc63fe109,0xf4b26102,0x6c74e111,0x264acbc5,
  112774. 0x77abebaf,0x4af445fa,0x24cddb75,0x448c4fdd,0x44506eea,0x0b13157d },
  112775. { 0x72e9993d,0x22a6b159,0x85e5ecbe,0x2c3c57e4,0xfd83e1a1,0xa673560b,
  112776. 0xc3b8c83b,0x6be23f82,0x40bbe38e,0x40b13a96,0xad17399b,0x66eea033 } },
  112777. /* 171 */
  112778. { { 0xb4c6c693,0x49fc6e95,0x36af7d38,0xefc735de,0x35fe42fc,0xe053343d,
  112779. 0x6a9ab7c3,0xf0aa427c,0x4a0fcb24,0xc79f0436,0x93ebbc50,0x16287243 },
  112780. { 0x16927e1e,0x5c3d6bd0,0x673b984c,0x40158ed2,0x4cd48b9a,0xa7f86fc8,
  112781. 0x60ea282d,0x1643eda6,0xe2a1beed,0x45b393ea,0x19571a94,0x664c839e } },
  112782. /* 172 */
  112783. { { 0x27eeaf94,0x57745750,0xea99e1e7,0x2875c925,0x5086adea,0xc127e7ba,
  112784. 0x86fe424f,0x765252a0,0x2b6c0281,0x1143cc6c,0xd671312d,0xc9bb2989 },
  112785. { 0x51acb0a5,0x880c337c,0xd3c60f78,0xa3710915,0x9262b6ed,0x496113c0,
  112786. 0x9ce48182,0x5d25d9f8,0xb3813586,0x53b6ad72,0x4c0e159c,0x0ea3bebc } },
  112787. /* 173 */
  112788. { { 0xc5e49bea,0xcaba450a,0x7c05da59,0x684e5415,0xde7ac36c,0xa2e9cab9,
  112789. 0x2e6f957b,0x4ca79b5f,0x09b817b1,0xef7b0247,0x7d89df0f,0xeb304990 },
  112790. { 0x46fe5096,0x508f7307,0x2e04eaaf,0x695810e8,0x3512f76c,0x88ef1bd9,
  112791. 0x3ebca06b,0x77661351,0xccf158b7,0xf7d4863a,0x94ee57da,0xb2a81e44 } },
  112792. /* 174 */
  112793. { { 0x6d53e6ba,0xff288e5b,0x14484ea2,0xa90de1a9,0xed33c8ec,0x2fadb60c,
  112794. 0x28b66a40,0x579d6ef3,0xec24372d,0x4f2dd6dd,0x1d66ec7d,0xe9e33fc9 },
  112795. { 0x039eab6e,0x110899d2,0x3e97bb5e,0xa31a667a,0xcfdce68e,0x6200166d,
  112796. 0x5137d54b,0xbe83ebae,0x4800acdf,0x085f7d87,0x0c6f8c86,0xcf4ab133 } },
  112797. /* 175 */
  112798. { { 0x931e08fb,0x03f65845,0x1506e2c0,0x6438551e,0x9c36961f,0x5791f0dc,
  112799. 0xe3dcc916,0x68107b29,0xf495d2ca,0x83242374,0x6ee5895b,0xd8cfb663 },
  112800. { 0xa0349b1b,0x525e0f16,0x4a0fab86,0x33cd2c6c,0x2af8dda9,0x46c12ee8,
  112801. 0x71e97ad3,0x7cc424ba,0x37621eb0,0x69766ddf,0xa5f0d390,0x95565f56 } },
  112802. /* 176 */
  112803. { { 0x1a0f5e94,0xe0e7bbf2,0x1d82d327,0xf771e115,0xceb111fa,0x10033e3d,
  112804. 0xd3426638,0xd269744d,0x00d01ef6,0xbdf2d9da,0xa049ceaf,0x1cb80c71 },
  112805. { 0x9e21c677,0x17f18328,0x19c8f98b,0x6452af05,0x80b67997,0x35b9c5f7,
  112806. 0x40f8f3d4,0x5c2e1cbe,0x66d667ca,0x43f91656,0xcf9d6e79,0x9faaa059 } },
  112807. /* 177 */
  112808. { { 0x0a078fe6,0x8ad24618,0x464fd1dd,0xf6cc73e6,0xc3e37448,0x4d2ce34d,
  112809. 0xe3271b5f,0x624950c5,0xefc5af72,0x62910f5e,0xaa132bc6,0x8b585bf8 },
  112810. { 0xa839327f,0x11723985,0x4aac252f,0x34e2d27d,0x6296cc4e,0x402f59ef,
  112811. 0x47053de9,0x00ae055c,0x28b4f09b,0xfc22a972,0xfa0c180e,0xa9e86264 } },
  112812. /* 178 */
  112813. { { 0xbc310ecc,0x0b7b6224,0x67fa14ed,0x8a1a74f1,0x7214395c,0x87dd0960,
  112814. 0xf5c91128,0xdf1b3d09,0x86b264a8,0x39ff23c6,0x3e58d4c5,0xdc2d49d0 },
  112815. { 0xa9d6f501,0x2152b7d3,0xc04094f7,0xf4c32e24,0xd938990f,0xc6366596,
  112816. 0x94fb207f,0x084d078f,0x328594cb,0xfd99f1d7,0xcb2d96b3,0x36defa64 } },
  112817. /* 179 */
  112818. { { 0x13ed7cbe,0x4619b781,0x9784bd0e,0x95e50015,0x2c7705fe,0x2a32251c,
  112819. 0x5f0dd083,0xa376af99,0x0361a45b,0x55425c6c,0x1f291e7b,0x812d2cef },
  112820. { 0x5fd94972,0xccf581a0,0xe56dc383,0x26e20e39,0x63dbfbf0,0x0093685d,
  112821. 0x36b8c575,0x1fc164cc,0x390ef5e7,0xb9c5ab81,0x26908c66,0x40086beb } },
  112822. /* 180 */
  112823. { { 0x37e3c115,0xe5e54f79,0xc1445a8a,0x69b8ee8c,0xb7659709,0x79aedff2,
  112824. 0x1b46fbe6,0xe288e163,0xd18d7bb7,0xdb4844f0,0x48aa6424,0xe0ea23d0 },
  112825. { 0xf3d80a73,0x714c0e4e,0x3bd64f98,0x87a0aa9e,0x2ec63080,0x8844b8a8,
  112826. 0x255d81a3,0xe0ac9c30,0x455397fc,0x86151237,0x2f820155,0x0b979464 } },
  112827. /* 181 */
  112828. { { 0x4ae03080,0x127a255a,0x580a89fb,0x232306b4,0x6416f539,0x04e8cd6a,
  112829. 0x13b02a0e,0xaeb70dee,0x4c09684a,0xa3038cf8,0x28e433ee,0xa710ec3c },
  112830. { 0x681b1f7d,0x77a72567,0x2fc28170,0x86fbce95,0xf5735ac8,0xd3408683,
  112831. 0x6bd68e93,0x3a324e2a,0xc027d155,0x7ec74353,0xd4427177,0xab60354c } },
  112832. /* 182 */
  112833. { { 0xef4c209d,0x32a5342a,0x08d62704,0x2ba75274,0xc825d5fe,0x4bb4af6f,
  112834. 0xd28e7ff1,0x1c3919ce,0xde0340f6,0x1dfc2fdc,0x29f33ba9,0xc6580baf },
  112835. { 0x41d442cb,0xae121e75,0x3a4724e4,0x4c7727fd,0x524f3474,0xe556d6a4,
  112836. 0x785642a2,0x87e13cc7,0xa17845fd,0x182efbb1,0x4e144857,0xdcec0cf1 } },
  112837. /* 183 */
  112838. { { 0xe9539819,0x1cb89541,0x9d94dbf1,0xc8cb3b4f,0x417da578,0x1d353f63,
  112839. 0x8053a09e,0xb7a697fb,0xc35d8b78,0x8d841731,0xb656a7a9,0x85748d6f },
  112840. { 0xc1859c5d,0x1fd03947,0x535d22a2,0x6ce965c1,0x0ca3aadc,0x1966a13e,
  112841. 0x4fb14eff,0x9802e41d,0x76dd3fcd,0xa9048cbb,0xe9455bba,0x89b182b5 } },
  112842. /* 184 */
  112843. { { 0x43360710,0xd777ad6a,0x55e9936b,0x841287ef,0x04a21b24,0xbaf5c670,
  112844. 0x35ad86f1,0xf2c0725f,0xc707e72e,0x338fa650,0xd8883e52,0x2bf8ed2e },
  112845. { 0xb56e0d6a,0xb0212cf4,0x6843290c,0x50537e12,0x98b3dc6f,0xd8b184a1,
  112846. 0x0210b722,0xd2be9a35,0x559781ee,0x407406db,0x0bc18534,0x5a78d591 } },
  112847. /* 185 */
  112848. { { 0xd748b02c,0x4d57aa2a,0xa12b3b95,0xbe5b3451,0x64711258,0xadca7a45,
  112849. 0x322153db,0x597e091a,0x32eb1eab,0xf3271006,0x2873f301,0xbd9adcba },
  112850. { 0x38543f7f,0xd1dc79d1,0x921b1fef,0x00022092,0x1e5df8ed,0x86db3ef5,
  112851. 0x9e6b944a,0x888cae04,0x791a32b4,0x71bd29ec,0xa6d1c13e,0xd3516206 } },
  112852. /* 186 */
  112853. { { 0x55924f43,0x2ef6b952,0x4f9de8d5,0xd2f401ae,0xadc68042,0xfc73e8d7,
  112854. 0x0d9d1bb4,0x627ea70c,0xbbf35679,0xc3bb3e3e,0xd882dee4,0x7e8a254a },
  112855. { 0xb5924407,0x08906f50,0xa1ad444a,0xf14a0e61,0x65f3738e,0xaa0efa21,
  112856. 0xae71f161,0xd60c7dd6,0xf175894d,0x9e8390fa,0x149f4c00,0xd115cd20 } },
  112857. /* 187 */
  112858. { { 0xa52abf77,0x2f2e2c1d,0x54232568,0xc2a0dca5,0x54966dcc,0xed423ea2,
  112859. 0xcd0dd039,0xe48c93c7,0x176405c7,0x1e54a225,0x70d58f2e,0x1efb5b16 },
  112860. { 0x94fb1471,0xa751f9d9,0x67d2941d,0xfdb31e1f,0x53733698,0xa6c74eb2,
  112861. 0x89a0f64a,0xd3155d11,0xa4b8d2b6,0x4414cfe4,0xf7a8e9e3,0x8d5a4be8 } },
  112862. /* 188 */
  112863. { { 0x52669e98,0x5c96b4d4,0x8fd42a03,0x4547f922,0xd285174e,0xcf5c1319,
  112864. 0x064bffa0,0x805cd1ae,0x246d27e7,0x50e8bc4f,0xd5781e11,0xf89ef98f },
  112865. { 0xdee0b63f,0xb4ff95f6,0x222663a4,0xad850047,0x4d23ce9c,0x02691860,
  112866. 0x50019f59,0x3e5309ce,0x69a508ae,0x27e6f722,0x267ba52c,0xe9376652 } },
  112867. /* 189 */
  112868. { { 0xc0368708,0xa04d289c,0x5e306e1d,0xc458872f,0x33112fea,0x76fa23de,
  112869. 0x6efde42e,0x718e3974,0x1d206091,0xf0c98cdc,0x14a71987,0x5fa3ca62 },
  112870. { 0xdcaa9f2a,0xeee8188b,0x589a860d,0x312cc732,0xc63aeb1f,0xf9808dd6,
  112871. 0x4ea62b53,0x70fd43db,0x890b6e97,0x2c2bfe34,0xfa426aa6,0x105f863c } },
  112872. /* 190 */
  112873. { { 0xb38059ad,0x0b29795d,0x90647ea0,0x5686b77e,0xdb473a3e,0xeff0470e,
  112874. 0xf9b6d1e2,0x278d2340,0xbd594ec7,0xebbff95b,0xd3a7f23d,0xf4b72334 },
  112875. { 0xa5a83f0b,0x2a285980,0x9716a8b3,0x0786c41a,0x22511812,0x138901bd,
  112876. 0xe2fede6e,0xd1b55221,0xdf4eb590,0x0806e264,0x762e462e,0x6c4c897e } },
  112877. /* 191 */
  112878. { { 0xb4b41d9d,0xd10b905f,0x4523a65b,0x826ca466,0xb699fa37,0x535bbd13,
  112879. 0x73bc8f90,0x5b9933d7,0xcd2118ad,0x9332d61f,0xd4a65fd0,0x158c693e },
  112880. { 0xe6806e63,0x4ddfb2a8,0xb5de651b,0xe31ed3ec,0x819bc69a,0xf9460e51,
  112881. 0x2c76b1f8,0x6229c0d6,0x901970a3,0xbb78f231,0x9cee72b8,0x31f3820f } },
  112882. /* 192 */
  112883. { { 0xc09e1c72,0xe931caf2,0x12990cf4,0x0715f298,0x943262d8,0x33aad81d,
  112884. 0x73048d3f,0x5d292b7a,0xdc7415f6,0xb152aaa4,0x0fd19587,0xc3d10fd9 },
  112885. { 0x75ddadd0,0xf76b35c5,0x1e7b694c,0x9f5f4a51,0xc0663025,0x2f1ab7eb,
  112886. 0x920260b0,0x01c9cc87,0x05d39da6,0xc4b1f61a,0xeb4a9c4e,0x6dcd76c4 } },
  112887. /* 193 */
  112888. { { 0xfdc83f01,0x0ba0916f,0x9553e4f9,0x354c8b44,0xffc5e622,0xa6cc511a,
  112889. 0xe95be787,0xb954726a,0x75b41a62,0xcb048115,0xebfde989,0xfa2ae6cd },
  112890. { 0x0f24659a,0x6376bbc7,0x4c289c43,0x13a999fd,0xec9abd8b,0xc7134184,
  112891. 0xa789ab04,0x28c02bf6,0xd3e526ec,0xff841ebc,0x640893a8,0x442b191e } },
  112892. /* 194 */
  112893. { { 0xfa2b6e20,0x4cac6c62,0xf6d69861,0x97f29e9b,0xbc96d12d,0x228ab1db,
  112894. 0x5e8e108d,0x6eb91327,0x40771245,0xd4b3d4d1,0xca8a803a,0x61b20623 },
  112895. { 0xa6a560b1,0x2c2f3b41,0x3859fcf4,0x879e1d40,0x024dbfc3,0x7cdb5145,
  112896. 0x3bfa5315,0x55d08f15,0xaa93823a,0x2f57d773,0xc6a2c9a2,0xa97f259c } },
  112897. /* 195 */
  112898. { { 0xe58edbbb,0xc306317b,0x79dfdf13,0x25ade51c,0x16d83dd6,0x6b5beaf1,
  112899. 0x1dd8f925,0xe8038a44,0xb2a87b6b,0x7f00143c,0xf5b438de,0xa885d00d },
  112900. { 0xcf9e48bd,0xe9f76790,0xa5162768,0xf0bdf9f0,0xad7b57cb,0x0436709f,
  112901. 0xf7c15db7,0x7e151c12,0x5d90ee3b,0x3514f022,0x2c361a8d,0x2e84e803 } },
  112902. /* 196 */
  112903. { { 0x563ec8d8,0x2277607d,0xe3934cb7,0xa661811f,0xf58fd5de,0x3ca72e7a,
  112904. 0x62294c6a,0x7989da04,0xf6bbefe9,0x88b3708b,0x53ed7c82,0x0d524cf7 },
  112905. { 0x2f30c073,0x69f699ca,0x9dc1dcf3,0xf0fa264b,0x05f0aaf6,0x44ca4568,
  112906. 0xd19b9baf,0x0f5b23c7,0xeabd1107,0x39193f41,0x2a7c9b83,0x9e3e10ad } },
  112907. /* 197 */
  112908. { { 0xd4ae972f,0xa90824f0,0xc6e846e7,0x43eef02b,0x29d2160a,0x7e460612,
  112909. 0xfe604e91,0x29a178ac,0x4eb184b2,0x23056f04,0xeb54cdf4,0x4fcad55f },
  112910. { 0xae728d15,0xa0ff96f3,0xc6a00331,0x8a2680c6,0x7ee52556,0x5f84cae0,
  112911. 0xc5a65dad,0x5e462c3a,0xe2d23f4f,0x5d2b81df,0xc5b1eb07,0x6e47301b } },
  112912. /* 198 */
  112913. { { 0xaf8219b9,0x77411d68,0x51b1907a,0xcb883ce6,0x101383b5,0x25c87e57,
  112914. 0x982f970d,0x9c7d9859,0x118305d2,0xaa6abca5,0x9013a5db,0x725fed2f },
  112915. { 0xababd109,0x487cdbaf,0x87586528,0xc0f8cf56,0x8ad58254,0xa02591e6,
  112916. 0xdebbd526,0xc071b1d1,0x961e7e31,0x927dfe8b,0x9263dfe1,0x55f895f9 } },
  112917. /* 199 */
  112918. { { 0xb175645b,0xf899b00d,0xb65b4b92,0x51f3a627,0xb67399ef,0xa2f3ac8d,
  112919. 0xe400bc20,0xe717867f,0x1967b952,0x42cc9020,0x3ecd1de1,0x3d596751 },
  112920. { 0xdb979775,0xd41ebcde,0x6a2e7e88,0x99ba61bc,0x321504f2,0x039149a5,
  112921. 0x27ba2fad,0xe7dc2314,0xb57d8368,0x9f556308,0x57da80a7,0x2b6d16c9 } },
  112922. /* 200 */
  112923. { { 0x279ad982,0x84af5e76,0x9c8b81a6,0x9bb4c92d,0x0e698e67,0xd79ad44e,
  112924. 0x265fc167,0xe8be9048,0x0c3a4ccc,0xf135f7e6,0xb8863a33,0xa0a10d38 },
  112925. { 0xd386efd9,0xe197247c,0xb52346c2,0x0eefd3f9,0x78607bc8,0xc22415f9,
  112926. 0x508674ce,0xa2a8f862,0xc8c9d607,0xa72ad09e,0x50fa764f,0xcd9f0ede } },
  112927. /* 201 */
  112928. { { 0xd1a46d4d,0x063391c7,0x9eb01693,0x2df51c11,0x849e83de,0xc5849800,
  112929. 0x8ad08382,0x48fd09aa,0xaa742736,0xa405d873,0xe1f9600c,0xee49e61e },
  112930. { 0x48c76f73,0xd76676be,0x01274b2a,0xd9c100f6,0x83f8718d,0x110bb67c,
  112931. 0x02fc0d73,0xec85a420,0x744656ad,0xc0449e1e,0x37d9939b,0x28ce7376 } },
  112932. /* 202 */
  112933. { { 0x44544ac7,0x97e9af72,0xba010426,0xf2c658d5,0xfb3adfbd,0x732dec39,
  112934. 0xa2df0b07,0xd12faf91,0x2171e208,0x8ac26725,0x5b24fa54,0xf820cdc8 },
  112935. { 0x94f4cf77,0x307a6eea,0x944a33c6,0x18c783d2,0x0b741ac5,0x4b939d4c,
  112936. 0x3ffbb6e4,0x1d7acd15,0x7a255e44,0x06a24858,0xce336d50,0x14fbc494 } },
  112937. /* 203 */
  112938. { { 0x51584e3c,0x9b920c0c,0xf7e54027,0xc7733c59,0x88422bbe,0xe24ce139,
  112939. 0x523bd6ab,0x11ada812,0xb88e6def,0xde068800,0xfe8c582d,0x7b872671 },
  112940. { 0x7de53510,0x4e746f28,0xf7971968,0x492f8b99,0x7d928ac2,0x1ec80bc7,
  112941. 0x432eb1b5,0xb3913e48,0x32028f6e,0xad084866,0x8fc2f38b,0x122bb835 } },
  112942. /* 204 */
  112943. { { 0x3b0b29c3,0x0a9f3b1e,0x4fa44151,0x837b6432,0x17b28ea7,0xb9905c92,
  112944. 0x98451750,0xf39bc937,0xce8b6da1,0xcd383c24,0x010620b2,0x299f57db },
  112945. { 0x58afdce3,0x7b6ac396,0x3d05ef47,0xa15206b3,0xb9bb02ff,0xa0ae37e2,
  112946. 0x9db3964c,0x107760ab,0x67954bea,0xe29de9a0,0x431c3f82,0x446a1ad8 } },
  112947. /* 205 */
  112948. { { 0x5c6b8195,0xc6fecea0,0xf49e71b9,0xd744a7c5,0x177a7ae7,0xa8e96acc,
  112949. 0x358773a7,0x1a05746c,0x37567369,0xa4162146,0x87d1c971,0xaa0217f7 },
  112950. { 0x77fd3226,0x61e9d158,0xe4f600be,0x0f6f2304,0x7a6dff07,0xa9c4cebc,
  112951. 0x09f12a24,0xd15afa01,0x8c863ee9,0x2bbadb22,0xe5eb8c78,0xa28290e4 } },
  112952. /* 206 */
  112953. { { 0x3e9de330,0x55b87fa0,0x195c145b,0x12b26066,0xa920bef0,0xe08536e0,
  112954. 0x4d195adc,0x7bff6f2c,0x945f4187,0x7f319e9d,0xf892ce47,0xf9848863 },
  112955. { 0x4fe37657,0xd0efc1d3,0x5cf0e45a,0x3c58de82,0x8b0ccbbe,0x626ad21a,
  112956. 0xaf952fc5,0xd2a31208,0xeb437357,0x81791995,0x98e95d4f,0x5f19d30f } },
  112957. /* 207 */
  112958. { { 0x0e6865bb,0x72e83d9a,0xf63456a6,0x22f5af3b,0x463c8d9e,0x409e9c73,
  112959. 0xdfe6970e,0x40e9e578,0x711b91ca,0x876b6efa,0x942625a3,0x895512cf },
  112960. { 0xcb4e462b,0x84c8eda8,0x4412e7c8,0x84c0154a,0xceb7b71f,0x04325db1,
  112961. 0x66f70877,0x1537dde3,0x1992b9ac,0xf3a09399,0xd498ae77,0xa7316606 } },
  112962. /* 208 */
  112963. { { 0xcad260f5,0x13990d2f,0xeec0e8c0,0x76c3be29,0x0f7bd7d5,0x7dc5bee0,
  112964. 0xefebda4b,0x9be167d2,0x9122b87e,0xcce3dde6,0x82b5415c,0x75a28b09 },
  112965. { 0xe84607a6,0xf6810bcd,0x6f4dbf0d,0xc6d58128,0x1b4dafeb,0xfead577d,
  112966. 0x066b28eb,0x9bc440b2,0x8b17e84b,0x53f1da97,0xcda9a575,0x0459504b } },
  112967. /* 209 */
  112968. { { 0x329e5836,0x13e39a02,0xf717269d,0x2c9e7d51,0xf26c963b,0xc5ac58d6,
  112969. 0x79967bf5,0x3b0c6c43,0x55908d9d,0x60bbea3f,0xf07c9ad1,0xd84811e7 },
  112970. { 0x5bd20e4a,0xfe7609a7,0x0a70baa8,0xe4325dd2,0xb3600386,0x3711f370,
  112971. 0xd0924302,0x97f9562f,0x4acc4436,0x040dc0c3,0xde79cdd4,0xfd6d725c } },
  112972. /* 210 */
  112973. { { 0xcf13eafb,0xb3efd0e3,0x5aa0ae5f,0x21009cbb,0x79022279,0xe480c553,
  112974. 0xb2fc9a6d,0x755cf334,0x07096ae7,0x8564a5bf,0xbd238139,0xddd649d0 },
  112975. { 0x8a045041,0xd0de10b1,0xc957d572,0x6e05b413,0x4e0fb25c,0x5c5ff806,
  112976. 0x641162fb,0xd933179b,0xe57439f9,0x42d48485,0x8a8d72aa,0x70c5bd0a } },
  112977. /* 211 */
  112978. { { 0x97bdf646,0xa7671738,0xab329f7c,0xaa1485b4,0xf8f25fdf,0xce3e11d6,
  112979. 0xc6221824,0x76a3fc7e,0xf3924740,0x045f281f,0x96d13a9a,0x24557d4e },
  112980. { 0xdd4c27cd,0x875c804b,0x0f5c7fea,0x11c5f0f4,0xdc55ff7e,0xac8c880b,
  112981. 0x1103f101,0x2acddec5,0xf99faa89,0x38341a21,0xce9d6b57,0xc7b67a2c } },
  112982. /* 212 */
  112983. { { 0x8e357586,0x9a0d724f,0xdf648da0,0x1d7f4ff5,0xfdee62a5,0x9c3e6c9b,
  112984. 0x0389b372,0x0499cef0,0x98eab879,0xe904050d,0x6c051617,0xe8eef1b6 },
  112985. { 0xc37e3ca9,0xebf5bfeb,0xa4e0b91d,0x7c5e946d,0x2c4bea28,0x79097314,
  112986. 0xee67b2b7,0x81f6c109,0xdafc5ede,0xaf237d9b,0x2abb04c7,0xd2e60201 } },
  112987. /* 213 */
  112988. { { 0x8a4f57bf,0x6156060c,0xff11182a,0xf9758696,0x6296ef00,0x8336773c,
  112989. 0xff666899,0x9c054bce,0x719cd11c,0xd6a11611,0xdbe1acfa,0x9824a641 },
  112990. { 0xba89fd01,0x0b7b7a5f,0x889f79d8,0xf8d3b809,0xf578285c,0xc5e1ea08,
  112991. 0xae6d8288,0x7ac74536,0x7521ef5f,0x5d37a200,0xb260a25d,0x5ecc4184 } },
  112992. /* 214 */
  112993. { { 0xa708c8d3,0xddcebb19,0xc63f81ec,0xe63ed04f,0x11873f95,0xd045f5a0,
  112994. 0x79f276d5,0x3b5ad544,0x425ae5b3,0x81272a3d,0x10ce1605,0x8bfeb501 },
  112995. { 0x888228bf,0x4233809c,0xb2aff7df,0x4bd82acf,0x0cbd4a7f,0x9c68f180,
  112996. 0x6b44323d,0xfcd77124,0x891db957,0x60c0fcf6,0x04da8f7f,0xcfbb4d89 } },
  112997. /* 215 */
  112998. { { 0x3b26139a,0x9a6a5df9,0xb2cc7eb8,0x3e076a83,0x5a964bcd,0x47a8e82d,
  112999. 0xb9278d6b,0x8a4e2a39,0xe4443549,0x93506c98,0xf1e0d566,0x06497a8f },
  113000. { 0x2b1efa05,0x3dee8d99,0x45393e33,0x2da63ca8,0xcf0579ad,0xa4af7277,
  113001. 0x3236d8ea,0xaf4b4639,0x32b617f5,0x6ccad95b,0xb88bb124,0xce76d8b8 } },
  113002. /* 216 */
  113003. { { 0x083843dc,0x63d2537a,0x1e4153b4,0x89eb3514,0xea9afc94,0x5175ebc4,
  113004. 0x8ed1aed7,0x7a652580,0xd85e8297,0x67295611,0xb584b73d,0x8dd2d68b },
  113005. { 0x0133c3a4,0x237139e6,0x4bd278ea,0x9de838ab,0xc062fcd9,0xe829b072,
  113006. 0x63ba8706,0x70730d4f,0xd3cd05ec,0x6080483f,0x0c85f84d,0x872ab5b8 } },
  113007. /* 217 */
  113008. { { 0x999d4d49,0xfc0776d3,0xec3f45e7,0xa3eb59de,0x0dae1fc1,0xbc990e44,
  113009. 0xa15371ff,0x33596b1e,0x9bc7ab25,0xd447dcb2,0x35979582,0xcd5b63e9 },
  113010. { 0x77d1ff11,0xae3366fa,0xedee6903,0x59f28f05,0xa4433bf2,0x6f43fed1,
  113011. 0xdf9ce00e,0x15409c9b,0xaca9c5dc,0x21b5cded,0x82d7bdb4,0xf9f33595 } },
  113012. /* 218 */
  113013. { { 0x9422c792,0x95944378,0xc958b8bf,0x239ea923,0xdf076541,0x4b61a247,
  113014. 0xbb9fc544,0x4d29ce85,0x0b424559,0x9a692a67,0x0e486900,0x6e0ca5a0 },
  113015. { 0x85b3bece,0x6b79a782,0xc61f9892,0x41f35e39,0xae747f82,0xff82099a,
  113016. 0xd0ca59d6,0x58c8ae3f,0x99406b5f,0x4ac930e2,0x9df24243,0x2ce04eb9 } },
  113017. /* 219 */
  113018. { { 0x1ac37b82,0x4366b994,0x25b04d83,0xff0c728d,0x19c47b7c,0x1f551361,
  113019. 0xbeff13e7,0xdbf2d5ed,0xe12a683d,0xf78efd51,0x989cf9c4,0x82cd85b9 },
  113020. { 0xe0cb5d37,0xe23c6db6,0x72ee1a15,0x818aeebd,0x28771b14,0x8212aafd,
  113021. 0x1def817d,0x7bc221d9,0x9445c51f,0xdac403a2,0x12c3746b,0x711b0517 } },
  113022. /* 220 */
  113023. { { 0x5ea99ecc,0x0ed9ed48,0xb8cab5e1,0xf799500d,0xb570cbdc,0xa8ec87dc,
  113024. 0xd35dfaec,0x52cfb2c2,0x6e4d80a4,0x8d31fae2,0xdcdeabe5,0xe6a37dc9 },
  113025. { 0x1deca452,0x5d365a34,0x0d68b44e,0x09a5f8a5,0xa60744b1,0x59238ea5,
  113026. 0xbb4249e9,0xf2fedc0d,0xa909b2e3,0xe395c74e,0x39388250,0xe156d1a5 } },
  113027. /* 221 */
  113028. { { 0x47181ae9,0xd796b3d0,0x44197808,0xbaf44ba8,0x34cf3fac,0xe6933094,
  113029. 0xc3bd5c46,0x41aa6ade,0xeed947c6,0x4fda75d8,0x9ea5a525,0xacd9d412 },
  113030. { 0xd430301b,0x65cc55a3,0x7b52ea49,0x3c9a5bcf,0x159507f0,0x22d319cf,
  113031. 0xde74a8dd,0x2ee0b9b5,0x877ac2b6,0x20c26a1e,0x92e7c314,0x387d73da } },
  113032. /* 222 */
  113033. { { 0x8cd3fdac,0x13c4833e,0x332e5b8e,0x76fcd473,0xe2fe1fd3,0xff671b4b,
  113034. 0x5d98d8ec,0x4d734e8b,0x514bbc11,0xb1ead3c6,0x7b390494,0xd14ca858 },
  113035. { 0x5d2d37e9,0x95a443af,0x00464622,0x73c6ea73,0x15755044,0xa44aeb4b,
  113036. 0xfab58fee,0xba3f8575,0xdc680a6f,0x9779dbc9,0x7b37ddfc,0xe1ee5f5a } },
  113037. /* 223 */
  113038. { { 0x12d29f46,0xcd0b4648,0x0ed53137,0x93295b0b,0x80bef6c9,0xbfe26094,
  113039. 0x54248b00,0xa6565788,0x80e7f9c4,0x69c43fca,0xbe141ea1,0x2190837b },
  113040. { 0xa1b26cfb,0x875e159a,0x7affe852,0x90ca9f87,0x92ca598e,0x15e6550d,
  113041. 0x1938ad11,0xe3e0945d,0x366ef937,0xef7636bb,0xb39869e5,0xb6034d0b } },
  113042. /* 224 */
  113043. { { 0x26d8356e,0x4d255e30,0xd314626f,0xf83666ed,0xd0c8ed64,0x421ddf61,
  113044. 0x26677b61,0x96e473c5,0x9e9b18b3,0xdad4af7e,0xa9393f75,0xfceffd4a },
  113045. { 0x11c731d5,0x843138a1,0xb2f141d9,0x05bcb3a1,0x617b7671,0x20e1fa95,
  113046. 0x88ccec7b,0xbefce812,0x90f1b568,0x582073dc,0x1f055cb7,0xf572261a } },
  113047. /* 225 */
  113048. { { 0x36973088,0xf3148277,0x86a9f980,0xc008e708,0xe046c261,0x1b795947,
  113049. 0xca76bca0,0xdf1e6a7d,0x71acddf0,0xabafd886,0x1364d8f4,0xff7054d9 },
  113050. { 0xe2260594,0x2cf63547,0xd73b277e,0x468a5372,0xef9bd35e,0xc7419e24,
  113051. 0x24043cc3,0x2b4a1c20,0x890b39cd,0xa28f047a,0x46f9a2e3,0xdca2cea1 } },
  113052. /* 226 */
  113053. { { 0x53277538,0xab788736,0xcf697738,0xa734e225,0x6b22e2c1,0x66ee1d1e,
  113054. 0xebe1d212,0x2c615389,0x02bb0766,0xf36cad40,0x3e64f207,0x120885c3 },
  113055. { 0x90fbfec2,0x59e77d56,0xd7a574ae,0xf9e781aa,0x5d045e53,0x801410b0,
  113056. 0xa91b5f0e,0xd3b5f0aa,0x7fbb3521,0xb3d1df00,0xc72bee9a,0x11c4b33e } },
  113057. /* 227 */
  113058. { { 0x83c3a7f3,0xd32b9832,0x88d8a354,0x8083abcf,0x50f4ec5a,0xdeb16404,
  113059. 0x641e2907,0x18d747f0,0xf1bbf03e,0x4e8978ae,0x88a0cd89,0x932447dc },
  113060. { 0xcf3d5897,0x561e0feb,0x13600e6d,0xfc3a682f,0xd16a6b73,0xc78b9d73,
  113061. 0xd29bf580,0xe713fede,0x08d69e5c,0x0a225223,0x1ff7fda4,0x3a924a57 } },
  113062. /* 228 */
  113063. { { 0xb4093bee,0xfb64554c,0xa58c6ec0,0xa6d65a25,0x43d0ed37,0x4126994d,
  113064. 0x55152d44,0xa5689a51,0x284caa8d,0xb8e5ea8c,0xd1f25538,0x33f05d4f },
  113065. { 0x1b615d6e,0xe0fdfe09,0x705507da,0x2ded7e8f,0x17bbcc80,0xdd5631e5,
  113066. 0x267fd11f,0x4f87453e,0xff89d62d,0xc6da723f,0xe3cda21d,0x55cbcae2 } },
  113067. /* 229 */
  113068. { { 0x6b4e84f3,0x336bc94e,0x4ef72c35,0x72863031,0xeeb57f99,0x6d85fdee,
  113069. 0xa42ece1b,0x7f4e3272,0x36f0320a,0x7f86cbb5,0x923331e6,0xf09b6a2b },
  113070. { 0x56778435,0x21d3ecf1,0x8323b2d2,0x2977ba99,0x1704bc0f,0x6a1b57fb,
  113071. 0x389f048a,0xd777cf8b,0xac6b42cd,0x9ce2174f,0x09e6c55a,0x404e2bff } },
  113072. /* 230 */
  113073. { { 0x204c5ddb,0x9b9b135e,0x3eff550e,0x9dbfe044,0xec3be0f6,0x35eab4bf,
  113074. 0x0a43e56f,0x8b4c3f0d,0x0e73f9b3,0x4c1c6673,0x2c78c905,0x92ed38bd },
  113075. { 0xa386e27c,0xc7003f6a,0xaced8507,0xb9c4f46f,0x59df5464,0xea024ec8,
  113076. 0x429572ea,0x4af96152,0xe1fc1194,0x279cd5e2,0x281e358c,0xaa376a03 } },
  113077. /* 231 */
  113078. { { 0x3cdbc95c,0x07859223,0xef2e337a,0xaae1aa6a,0x472a8544,0xc040108d,
  113079. 0x8d037b7d,0x80c853e6,0x8c7eee24,0xd221315c,0x8ee47752,0x195d3856 },
  113080. { 0xdacd7fbe,0xd4b1ba03,0xd3e0c52b,0x4b5ac61e,0x6aab7b52,0x68d3c052,
  113081. 0x660e3fea,0xf0d7248c,0x3145efb4,0xafdb3f89,0x8f40936d,0xa73fd9a3 } },
  113082. /* 232 */
  113083. { { 0xbb1b17ce,0x891b9ef3,0xc6127f31,0x14023667,0x305521fd,0x12b2e58d,
  113084. 0xe3508088,0x3a47e449,0xff751507,0xe49fc84b,0x5310d16e,0x4023f722 },
  113085. { 0xb73399fa,0xa608e5ed,0xd532aa3e,0xf12632d8,0x845e8415,0x13a2758e,
  113086. 0x1fc2d861,0xae4b6f85,0x339d02f2,0x3879f5b1,0x80d99ebd,0x446d22a6 } },
  113087. /* 233 */
  113088. { { 0x4be164f1,0x0f502302,0x88b81920,0x8d09d2d6,0x984aceff,0x514056f1,
  113089. 0x75e9e80d,0xa5c4ddf0,0xdf496a93,0x38cb47e6,0x38df6bf7,0x899e1d6b },
  113090. { 0xb59eb2a6,0x69e87e88,0x9b47f38b,0x280d9d63,0x3654e955,0x599411ea,
  113091. 0x969aa581,0xcf8dd4fd,0x530742a7,0xff5c2baf,0x1a373085,0xa4391536 } },
  113092. /* 234 */
  113093. { { 0xa8a4bdd2,0x6ace72a3,0xb68ef702,0xc656cdd1,0x90c4dad8,0xd4a33e7e,
  113094. 0x9d951c50,0x4aece08a,0x085d68e6,0xea8005ae,0x6f7502b8,0xfdd7a7d7 },
  113095. { 0x98d6fa45,0xce6fb0a6,0x1104eb8c,0x228f8672,0xda09d7dc,0xd23d8787,
  113096. 0x2ae93065,0x5521428b,0xea56c366,0x95faba3d,0x0a88aca5,0xedbe5039 } },
  113097. /* 235 */
  113098. { { 0xbfb26c82,0xd64da0ad,0x952c2f9c,0xe5d70b3c,0xf7e77f68,0xf5e8f365,
  113099. 0x08f2d695,0x7234e002,0xd12e7be6,0xfaf900ee,0x4acf734e,0x27dc6934 },
  113100. { 0xc260a46a,0x80e4ff5e,0x2dc31c28,0x7da5ebce,0xca69f552,0x485c5d73,
  113101. 0x69cc84c2,0xcdfb6b29,0xed6d4eca,0x031c5afe,0x22247637,0xc7bbf4c8 } },
  113102. /* 236 */
  113103. { { 0x49fe01b2,0x9d5b72c7,0x793a91b8,0x34785186,0xcf460438,0xa3ba3c54,
  113104. 0x3ab21b6f,0x73e8e43d,0xbe57b8ab,0x50cde8e0,0xdd204264,0x6488b3a7 },
  113105. { 0xdddc4582,0xa9e398b3,0x5bec46fe,0x1698c1a9,0x156d3843,0x7f1446ef,
  113106. 0x770329a2,0x3fd25dd8,0x2c710668,0x05b1221a,0xa72ee6cf,0x65b2dc2a } },
  113107. /* 237 */
  113108. { { 0xcd021d63,0x21a885f7,0xfea61f08,0x3f344b15,0xc5cf73e6,0xad5ba6dd,
  113109. 0x227a8b23,0x154d0d8f,0xdc559311,0x9b74373c,0x98620fa1,0x4feab715 },
  113110. { 0x7d9ec924,0x5098938e,0x6d47e550,0x84d54a5e,0x1b617506,0x1a2d1bdc,
  113111. 0x615868a4,0x99fe1782,0x3005a924,0x171da780,0x7d8f79b6,0xa70bf5ed } },
  113112. /* 238 */
  113113. { { 0xfe2216c5,0x0bc1250d,0x7601b351,0x2c37e250,0xd6f06b7e,0xb6300175,
  113114. 0x8bfeb9b7,0x4dde8ca1,0xb82f843d,0x4f210432,0xb1ac0afd,0x8d70e2f9 },
  113115. { 0xaae91abb,0x25c73b78,0x863028f2,0x0230dca3,0xe5cf30b7,0x8b923ecf,
  113116. 0x5506f265,0xed754ec2,0x729a5e39,0x8e41b88c,0xbabf889b,0xee67cec2 } },
  113117. /* 239 */
  113118. { { 0x1be46c65,0xe183acf5,0xe7565d7a,0x9789538f,0xd9627b4e,0x87873391,
  113119. 0x9f1d9187,0xbf4ac4c1,0x4691f5c8,0x5db99f63,0x74a1fb98,0xa68df803 },
  113120. { 0xbf92b5fa,0x3c448ed1,0x3e0bdc32,0xa098c841,0x79bf016c,0x8e74cd55,
  113121. 0x115e244d,0x5df0d09c,0x3410b66e,0x9418ad01,0x17a02130,0x8b6124cb } },
  113122. /* 240 */
  113123. { { 0xc26e3392,0x425ec3af,0xa1722e00,0xc07f8470,0xe2356b43,0xdcc28190,
  113124. 0xb1ef59a6,0x4ed97dff,0xc63028c1,0xc22b3ad1,0x68c18988,0x070723c2 },
  113125. { 0x4cf49e7d,0x70da302f,0x3f12a522,0xc5e87c93,0x18594148,0x74acdd1d,
  113126. 0xca74124c,0xad5f73ab,0xd69fd478,0xe72e4a3e,0x7b117cc3,0x61593868 } },
  113127. /* 241 */
  113128. { { 0xa9aa0486,0x7b7b9577,0xa063d557,0x6e41fb35,0xda9047d7,0xb017d5c7,
  113129. 0x68a87ba9,0x8c748280,0xdf08ad93,0xab45fa5c,0x4c288a28,0xcd9fb217 },
  113130. { 0x5747843d,0x59544642,0xa56111e3,0x34d64c6c,0x4bfce8d5,0x12e47ea1,
  113131. 0x6169267f,0x17740e05,0xeed03fb5,0x5c49438e,0x4fc3f513,0x9da30add } },
  113132. /* 242 */
  113133. { { 0xccfa5200,0xc4e85282,0x6a19b13d,0x2707608f,0xf5726e2f,0xdcb9a53d,
  113134. 0xe9427de5,0x612407c9,0xd54d582a,0x3e5a17e1,0x655ae118,0xb99877de },
  113135. { 0x015254de,0x6f0e972b,0xf0a6f7c5,0x92a56db1,0xa656f8b2,0xd297e4e1,
  113136. 0xad981983,0x99fe0052,0x07cfed84,0xd3652d2f,0x843c1738,0xc784352e } },
  113137. /* 243 */
  113138. { { 0x7e9b2d8a,0x6ee90af0,0x57cf1964,0xac8d7018,0x71f28efc,0xf6ed9031,
  113139. 0x6812b20e,0x7f70d5a9,0xf1c61eee,0x27b557f4,0xc6263758,0xf1c9bd57 },
  113140. { 0x2a1a6194,0x5cf7d014,0x1890ab84,0xdd614e0b,0x0e93c2a6,0x3ef9de10,
  113141. 0xe0cd91c5,0xf98cf575,0x14befc32,0x504ec0c6,0x6279d68c,0xd0513a66 } },
  113142. /* 244 */
  113143. { { 0xa859fb6a,0xa8eadbad,0xdb283666,0xcf8346e7,0x3e22e355,0x7b35e61a,
  113144. 0x99639c6b,0x293ece2c,0x56f241c8,0xfa0162e2,0xbf7a1dda,0xd2e6c7b9 },
  113145. { 0x40075e63,0xd0de6253,0xf9ec8286,0x2405aa61,0x8fe45494,0x2237830a,
  113146. 0x364e9c8c,0x4fd01ac7,0x904ba750,0x4d9c3d21,0xaf1b520b,0xd589be14 } },
  113147. /* 245 */
  113148. { { 0x4662e53b,0x13576a4f,0xf9077676,0x35ec2f51,0x97c0af97,0x66297d13,
  113149. 0x9e598b58,0xed3201fe,0x5e70f604,0x49bc752a,0xbb12d951,0xb54af535 },
  113150. { 0x212c1c76,0x36ea4c2b,0xeb250dfd,0x18f5bbc7,0x9a0a1a46,0xa0d466cc,
  113151. 0xdac2d917,0x52564da4,0x8e95fab5,0x206559f4,0x9ca67a33,0x7487c190 } },
  113152. /* 246 */
  113153. { { 0xdde98e9c,0x75abfe37,0x2a411199,0x99b90b26,0xdcdb1f7c,0x1b410996,
  113154. 0x8b3b5675,0xab346f11,0xf1f8ae1e,0x04852193,0x6b8b98c1,0x1ec4d227 },
  113155. { 0x45452baa,0xba3bc926,0xacc4a572,0x387d1858,0xe51f171e,0x9478eff6,
  113156. 0x931e1c00,0xf357077d,0xe54c8ca8,0xffee77cd,0x551dc9a4,0xfb4892ff } },
  113157. /* 247 */
  113158. { { 0x2db8dff8,0x5b1bdad0,0x5a2285a2,0xd462f4fd,0xda00b461,0x1d6aad8e,
  113159. 0x41306d1b,0x43fbefcf,0x6a13fe19,0x428e86f3,0x17f89404,0xc8b2f118 },
  113160. { 0xf0d51afb,0x762528aa,0x549b1d06,0xa3e2fea4,0xea3ddf66,0x86fad8f2,
  113161. 0x4fbdd206,0x0d9ccc4b,0xc189ff5a,0xcde97d4c,0x199f19a6,0xc36793d6 } },
  113162. /* 248 */
  113163. { { 0x51b85197,0xea38909b,0xb4c92895,0xffb17dd0,0x1ddb3f3f,0x0eb0878b,
  113164. 0xc57cf0f2,0xb05d28ff,0x1abd57e2,0xd8bde2e7,0xc40c1b20,0x7f2be28d },
  113165. { 0x299a2d48,0x6554dca2,0x8377982d,0x5130ba2e,0x1071971a,0x8863205f,
  113166. 0x7cf2825d,0x15ee6282,0x03748f2b,0xd4b6c57f,0x430385a0,0xa9e3f4da } },
  113167. /* 249 */
  113168. { { 0x83fbc9c6,0x33eb7cec,0x4541777e,0x24a311c7,0x4f0767fc,0xc81377f7,
  113169. 0x4ab702da,0x12adae36,0x2a779696,0xb7fcb6db,0x01cea6ad,0x4a6fb284 },
  113170. { 0xcdfc73de,0x5e8b1d2a,0x1b02fd32,0xd0efae8d,0xd81d8519,0x3f99c190,
  113171. 0xfc808971,0x3c18f7fa,0x51b7ae7b,0x41f713e7,0xf07fc3f8,0x0a4b3435 } },
  113172. /* 250 */
  113173. { { 0x019b7d2e,0x7dda3c4c,0xd4dc4b89,0x631c8d1a,0x1cdb313c,0x5489cd6e,
  113174. 0x4c07bb06,0xd44aed10,0x75f000d1,0x8f97e13a,0xdda5df4d,0x0e9ee64f },
  113175. { 0x3e346910,0xeaa99f3b,0xfa294ad7,0x622f6921,0x0d0b2fe9,0x22aaa20d,
  113176. 0x1e5881ba,0x4fed2f99,0xc1571802,0x9af3b2d6,0xdc7ee17c,0x919e67a8 } },
  113177. /* 251 */
  113178. { { 0x76250533,0xc724fe4c,0x7d817ef8,0x8a2080e5,0x172c9751,0xa2afb0f4,
  113179. 0x17c0702e,0x9b10cdeb,0xc9b7e3e9,0xbf3975e3,0x1cd0cdc5,0x206117df },
  113180. { 0xbe05ebd5,0xfb049e61,0x16c782c0,0xeb0bb55c,0xab7fed09,0x13a331b8,
  113181. 0x632863f0,0xf6c58b1d,0x4d3b6195,0x6264ef6e,0x9a53f116,0x92c51b63 } },
  113182. /* 252 */
  113183. { { 0x288b364d,0xa57c7bc8,0x7b41e5c4,0x4a562e08,0x698a9a11,0x699d21c6,
  113184. 0xf3f849b9,0xa4ed9581,0x9eb726ba,0xa223eef3,0xcc2884f9,0x13159c23 },
  113185. { 0x3a3f4963,0x73931e58,0x0ada6a81,0x96500389,0x5ab2950b,0x3ee8a1c6,
  113186. 0x775fab52,0xeedf4949,0x4f2671b6,0x63d652e1,0x3c4e2f55,0xfed4491c } },
  113187. /* 253 */
  113188. { { 0xf4eb453e,0x335eadc3,0xcadd1a5b,0x5ff74b63,0x5d84a91a,0x6933d0d7,
  113189. 0xb49ba337,0x9ca3eeb9,0xc04c15b8,0x1f6facce,0xdc09a7e4,0x4ef19326 },
  113190. { 0x3dca3233,0x53d2d324,0xa2259d4b,0x0ee40590,0x5546f002,0x18c22edb,
  113191. 0x09ea6b71,0x92429801,0xb0e91e61,0xaada0add,0x99963c50,0x5fe53ef4 } },
  113192. /* 254 */
  113193. { { 0x90c28c65,0x372dd06b,0x119ce47d,0x1765242c,0x6b22fc82,0xc041fb80,
  113194. 0xb0a7ccc1,0x667edf07,0x1261bece,0xc79599e7,0x19cff22a,0xbc69d9ba },
  113195. { 0x13c06819,0x009d77cd,0xe282b79d,0x635a66ae,0x225b1be8,0x4edac4a6,
  113196. 0x524008f9,0x57d4f4e4,0xb056af84,0xee299ac5,0x3a0bc386,0xcc38444c } },
  113197. /* 255 */
  113198. { { 0xcd4c2356,0x490643b1,0x750547be,0x740a4851,0xd4944c04,0x643eaf29,
  113199. 0x299a98a0,0xba572479,0xee05fdf9,0x48b29f16,0x089b2d7b,0x33fb4f61 },
  113200. { 0xa950f955,0x86704902,0xfedc3ddf,0x97e1034d,0x05fbb6a2,0x211320b6,
  113201. 0x432299bb,0x23d7b93f,0x8590e4a3,0x1fe1a057,0xf58c0ce6,0x8e1d0586 } },
  113202. };
  113203. /* Multiply the base point of P384 by the scalar and return the result.
  113204. * If map is true then convert result to affine coordinates.
  113205. *
  113206. * Stripe implementation.
  113207. * Pre-generated: 2^0, 2^48, ...
  113208. * Pre-generated: products of all combinations of above.
  113209. * 8 doubles and adds (with qz=1)
  113210. *
  113211. * r Resulting point.
  113212. * k Scalar to multiply by.
  113213. * map Indicates whether to convert result to affine.
  113214. * ct Constant time required.
  113215. * heap Heap to use for allocation.
  113216. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  113217. */
  113218. static int sp_384_ecc_mulmod_base_12(sp_point_384* r, const sp_digit* k,
  113219. int map, int ct, void* heap)
  113220. {
  113221. return sp_384_ecc_mulmod_stripe_12(r, &p384_base, p384_table,
  113222. k, map, ct, heap);
  113223. }
  113224. #endif
  113225. /* Multiply the base point of P384 by the scalar and return the result.
  113226. * If map is true then convert result to affine coordinates.
  113227. *
  113228. * km Scalar to multiply by.
  113229. * r Resulting point.
  113230. * map Indicates whether to convert result to affine.
  113231. * heap Heap to use for allocation.
  113232. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  113233. */
  113234. int sp_ecc_mulmod_base_384(const mp_int* km, ecc_point* r, int map, void* heap)
  113235. {
  113236. #ifdef WOLFSSL_SP_SMALL_STACK
  113237. sp_point_384* point = NULL;
  113238. sp_digit* k = NULL;
  113239. #else
  113240. sp_point_384 point[1];
  113241. sp_digit k[12];
  113242. #endif
  113243. int err = MP_OKAY;
  113244. #ifdef WOLFSSL_SP_SMALL_STACK
  113245. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  113246. DYNAMIC_TYPE_ECC);
  113247. if (point == NULL)
  113248. err = MEMORY_E;
  113249. if (err == MP_OKAY) {
  113250. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  113251. DYNAMIC_TYPE_ECC);
  113252. if (k == NULL)
  113253. err = MEMORY_E;
  113254. }
  113255. #endif
  113256. if (err == MP_OKAY) {
  113257. sp_384_from_mp(k, 12, km);
  113258. err = sp_384_ecc_mulmod_base_12(point, k, map, 1, heap);
  113259. }
  113260. if (err == MP_OKAY) {
  113261. err = sp_384_point_to_ecc_point_12(point, r);
  113262. }
  113263. #ifdef WOLFSSL_SP_SMALL_STACK
  113264. if (k != NULL)
  113265. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  113266. if (point != NULL)
  113267. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  113268. #endif
  113269. return err;
  113270. }
  113271. /* Multiply the base point of P384 by the scalar, add point a and return
  113272. * the result. If map is true then convert result to affine coordinates.
  113273. *
  113274. * km Scalar to multiply by.
  113275. * am Point to add to scalar multiply result.
  113276. * inMont Point to add is in montgomery form.
  113277. * r Resulting point.
  113278. * map Indicates whether to convert result to affine.
  113279. * heap Heap to use for allocation.
  113280. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  113281. */
  113282. int sp_ecc_mulmod_base_add_384(const mp_int* km, const ecc_point* am,
  113283. int inMont, ecc_point* r, int map, void* heap)
  113284. {
  113285. #ifdef WOLFSSL_SP_SMALL_STACK
  113286. sp_point_384* point = NULL;
  113287. sp_digit* k = NULL;
  113288. #else
  113289. sp_point_384 point[2];
  113290. sp_digit k[12 + 12 * 2 * 6];
  113291. #endif
  113292. sp_point_384* addP = NULL;
  113293. sp_digit* tmp = NULL;
  113294. int err = MP_OKAY;
  113295. #ifdef WOLFSSL_SP_SMALL_STACK
  113296. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  113297. DYNAMIC_TYPE_ECC);
  113298. if (point == NULL)
  113299. err = MEMORY_E;
  113300. if (err == MP_OKAY) {
  113301. k = (sp_digit*)XMALLOC(
  113302. sizeof(sp_digit) * (12 + 12 * 2 * 6),
  113303. heap, DYNAMIC_TYPE_ECC);
  113304. if (k == NULL)
  113305. err = MEMORY_E;
  113306. }
  113307. #endif
  113308. if (err == MP_OKAY) {
  113309. addP = point + 1;
  113310. tmp = k + 12;
  113311. sp_384_from_mp(k, 12, km);
  113312. sp_384_point_from_ecc_point_12(addP, am);
  113313. }
  113314. if ((err == MP_OKAY) && (!inMont)) {
  113315. err = sp_384_mod_mul_norm_12(addP->x, addP->x, p384_mod);
  113316. }
  113317. if ((err == MP_OKAY) && (!inMont)) {
  113318. err = sp_384_mod_mul_norm_12(addP->y, addP->y, p384_mod);
  113319. }
  113320. if ((err == MP_OKAY) && (!inMont)) {
  113321. err = sp_384_mod_mul_norm_12(addP->z, addP->z, p384_mod);
  113322. }
  113323. if (err == MP_OKAY) {
  113324. err = sp_384_ecc_mulmod_base_12(point, k, 0, 0, heap);
  113325. }
  113326. if (err == MP_OKAY) {
  113327. sp_384_proj_point_add_12(point, point, addP, tmp);
  113328. if (map) {
  113329. sp_384_map_12(point, point, tmp);
  113330. }
  113331. err = sp_384_point_to_ecc_point_12(point, r);
  113332. }
  113333. #ifdef WOLFSSL_SP_SMALL_STACK
  113334. if (k != NULL)
  113335. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  113336. if (point)
  113337. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  113338. #endif
  113339. return err;
  113340. }
  113341. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  113342. defined(HAVE_ECC_VERIFY)
  113343. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  113344. /* Add 1 to a. (a = a + 1)
  113345. *
  113346. * a A single precision integer.
  113347. */
  113348. SP_NOINLINE static void sp_384_add_one_12(sp_digit* a)
  113349. {
  113350. __asm__ __volatile__ (
  113351. "movs r2, #1\n\t"
  113352. "ldr r1, [%[a]]\n\t"
  113353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113354. "adds r1, r1, r2\n\t"
  113355. #else
  113356. "add r1, r1, r2\n\t"
  113357. #endif
  113358. "movs r2, #0\n\t"
  113359. "str r1, [%[a]]\n\t"
  113360. "ldr r1, [%[a], #4]\n\t"
  113361. #ifdef WOLFSSL_KEIL
  113362. "adcs r1, r1, r2\n\t"
  113363. #elif defined(__clang__)
  113364. "adcs r1, r2\n\t"
  113365. #else
  113366. "adc r1, r2\n\t"
  113367. #endif
  113368. "str r1, [%[a], #4]\n\t"
  113369. "ldr r1, [%[a], #8]\n\t"
  113370. #ifdef WOLFSSL_KEIL
  113371. "adcs r1, r1, r2\n\t"
  113372. #elif defined(__clang__)
  113373. "adcs r1, r2\n\t"
  113374. #else
  113375. "adc r1, r2\n\t"
  113376. #endif
  113377. "str r1, [%[a], #8]\n\t"
  113378. "ldr r1, [%[a], #12]\n\t"
  113379. #ifdef WOLFSSL_KEIL
  113380. "adcs r1, r1, r2\n\t"
  113381. #elif defined(__clang__)
  113382. "adcs r1, r2\n\t"
  113383. #else
  113384. "adc r1, r2\n\t"
  113385. #endif
  113386. "str r1, [%[a], #12]\n\t"
  113387. "ldr r1, [%[a], #16]\n\t"
  113388. #ifdef WOLFSSL_KEIL
  113389. "adcs r1, r1, r2\n\t"
  113390. #elif defined(__clang__)
  113391. "adcs r1, r2\n\t"
  113392. #else
  113393. "adc r1, r2\n\t"
  113394. #endif
  113395. "str r1, [%[a], #16]\n\t"
  113396. "ldr r1, [%[a], #20]\n\t"
  113397. #ifdef WOLFSSL_KEIL
  113398. "adcs r1, r1, r2\n\t"
  113399. #elif defined(__clang__)
  113400. "adcs r1, r2\n\t"
  113401. #else
  113402. "adc r1, r2\n\t"
  113403. #endif
  113404. "str r1, [%[a], #20]\n\t"
  113405. "ldr r1, [%[a], #24]\n\t"
  113406. #ifdef WOLFSSL_KEIL
  113407. "adcs r1, r1, r2\n\t"
  113408. #elif defined(__clang__)
  113409. "adcs r1, r2\n\t"
  113410. #else
  113411. "adc r1, r2\n\t"
  113412. #endif
  113413. "str r1, [%[a], #24]\n\t"
  113414. "ldr r1, [%[a], #28]\n\t"
  113415. #ifdef WOLFSSL_KEIL
  113416. "adcs r1, r1, r2\n\t"
  113417. #elif defined(__clang__)
  113418. "adcs r1, r2\n\t"
  113419. #else
  113420. "adc r1, r2\n\t"
  113421. #endif
  113422. "str r1, [%[a], #28]\n\t"
  113423. "ldr r1, [%[a], #32]\n\t"
  113424. #ifdef WOLFSSL_KEIL
  113425. "adcs r1, r1, r2\n\t"
  113426. #elif defined(__clang__)
  113427. "adcs r1, r2\n\t"
  113428. #else
  113429. "adc r1, r2\n\t"
  113430. #endif
  113431. "str r1, [%[a], #32]\n\t"
  113432. "ldr r1, [%[a], #36]\n\t"
  113433. #ifdef WOLFSSL_KEIL
  113434. "adcs r1, r1, r2\n\t"
  113435. #elif defined(__clang__)
  113436. "adcs r1, r2\n\t"
  113437. #else
  113438. "adc r1, r2\n\t"
  113439. #endif
  113440. "str r1, [%[a], #36]\n\t"
  113441. "ldr r1, [%[a], #40]\n\t"
  113442. #ifdef WOLFSSL_KEIL
  113443. "adcs r1, r1, r2\n\t"
  113444. #elif defined(__clang__)
  113445. "adcs r1, r2\n\t"
  113446. #else
  113447. "adc r1, r2\n\t"
  113448. #endif
  113449. "str r1, [%[a], #40]\n\t"
  113450. "ldr r1, [%[a], #44]\n\t"
  113451. #ifdef WOLFSSL_KEIL
  113452. "adcs r1, r1, r2\n\t"
  113453. #elif defined(__clang__)
  113454. "adcs r1, r2\n\t"
  113455. #else
  113456. "adc r1, r2\n\t"
  113457. #endif
  113458. "str r1, [%[a], #44]\n\t"
  113459. : [a] "+l" (a)
  113460. :
  113461. : "memory", "r1", "r2"
  113462. );
  113463. }
  113464. /* Read big endian unsigned byte array into r.
  113465. *
  113466. * r A single precision integer.
  113467. * size Maximum number of bytes to convert
  113468. * a Byte array.
  113469. * n Number of bytes in array to read.
  113470. */
  113471. static void sp_384_from_bin(sp_digit* r, int size, const byte* a, int n)
  113472. {
  113473. int i;
  113474. int j;
  113475. byte* d;
  113476. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  113477. r[j] = ((sp_digit)a[i - 0] << 0) |
  113478. ((sp_digit)a[i - 1] << 8) |
  113479. ((sp_digit)a[i - 2] << 16) |
  113480. ((sp_digit)a[i - 3] << 24);
  113481. j++;
  113482. }
  113483. if (i >= 0) {
  113484. r[j] = 0;
  113485. d = (byte*)r;
  113486. switch (i) {
  113487. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  113488. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  113489. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  113490. }
  113491. j++;
  113492. }
  113493. for (; j < size; j++) {
  113494. r[j] = 0;
  113495. }
  113496. }
  113497. /* Generates a scalar that is in the range 1..order-1.
  113498. *
  113499. * rng Random number generator.
  113500. * k Scalar value.
  113501. * returns RNG failures, MEMORY_E when memory allocation fails and
  113502. * MP_OKAY on success.
  113503. */
  113504. static int sp_384_ecc_gen_k_12(WC_RNG* rng, sp_digit* k)
  113505. {
  113506. int err;
  113507. byte buf[48];
  113508. do {
  113509. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  113510. if (err == 0) {
  113511. sp_384_from_bin(k, 12, buf, (int)sizeof(buf));
  113512. if (sp_384_cmp_12(k, p384_order2) <= 0) {
  113513. sp_384_add_one_12(k);
  113514. break;
  113515. }
  113516. }
  113517. }
  113518. while (err == 0);
  113519. return err;
  113520. }
  113521. /* Makes a random EC key pair.
  113522. *
  113523. * rng Random number generator.
  113524. * priv Generated private value.
  113525. * pub Generated public point.
  113526. * heap Heap to use for allocation.
  113527. * returns ECC_INF_E when the point does not have the correct order, RNG
  113528. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  113529. */
  113530. int sp_ecc_make_key_384(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  113531. {
  113532. #ifdef WOLFSSL_SP_SMALL_STACK
  113533. sp_point_384* point = NULL;
  113534. sp_digit* k = NULL;
  113535. #else
  113536. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113537. sp_point_384 point[2];
  113538. #else
  113539. sp_point_384 point[1];
  113540. #endif
  113541. sp_digit k[12];
  113542. #endif
  113543. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113544. sp_point_384* infinity = NULL;
  113545. #endif
  113546. int err = MP_OKAY;
  113547. (void)heap;
  113548. #ifdef WOLFSSL_SP_SMALL_STACK
  113549. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113550. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC);
  113551. #else
  113552. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC);
  113553. #endif
  113554. if (point == NULL)
  113555. err = MEMORY_E;
  113556. if (err == MP_OKAY) {
  113557. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  113558. DYNAMIC_TYPE_ECC);
  113559. if (k == NULL)
  113560. err = MEMORY_E;
  113561. }
  113562. #endif
  113563. if (err == MP_OKAY) {
  113564. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113565. infinity = point + 1;
  113566. #endif
  113567. err = sp_384_ecc_gen_k_12(rng, k);
  113568. }
  113569. if (err == MP_OKAY) {
  113570. err = sp_384_ecc_mulmod_base_12(point, k, 1, 1, NULL);
  113571. }
  113572. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113573. if (err == MP_OKAY) {
  113574. err = sp_384_ecc_mulmod_12(infinity, point, p384_order, 1, 1, NULL);
  113575. }
  113576. if (err == MP_OKAY) {
  113577. if (sp_384_iszero_12(point->x) || sp_384_iszero_12(point->y)) {
  113578. err = ECC_INF_E;
  113579. }
  113580. }
  113581. #endif
  113582. if (err == MP_OKAY) {
  113583. err = sp_384_to_mp(k, priv);
  113584. }
  113585. if (err == MP_OKAY) {
  113586. err = sp_384_point_to_ecc_point_12(point, pub);
  113587. }
  113588. #ifdef WOLFSSL_SP_SMALL_STACK
  113589. if (k != NULL)
  113590. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  113591. if (point != NULL) {
  113592. /* point is not sensitive, so no need to zeroize */
  113593. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  113594. }
  113595. #endif
  113596. return err;
  113597. }
  113598. #ifdef WOLFSSL_SP_NONBLOCK
  113599. typedef struct sp_ecc_key_gen_384_ctx {
  113600. int state;
  113601. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  113602. sp_digit k[12];
  113603. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113604. sp_point_384 point[2];
  113605. #else
  113606. sp_point_384 point[1];
  113607. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  113608. } sp_ecc_key_gen_384_ctx;
  113609. int sp_ecc_make_key_384_nb(sp_ecc_ctx_t* sp_ctx, WC_RNG* rng, mp_int* priv,
  113610. ecc_point* pub, void* heap)
  113611. {
  113612. int err = FP_WOULDBLOCK;
  113613. sp_ecc_key_gen_384_ctx* ctx = (sp_ecc_key_gen_384_ctx*)sp_ctx->data;
  113614. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113615. sp_point_384* infinity = ctx->point + 1;
  113616. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  113617. typedef char ctx_size_test[sizeof(sp_ecc_key_gen_384_ctx)
  113618. >= sizeof(*sp_ctx) ? -1 : 1];
  113619. (void)sizeof(ctx_size_test);
  113620. switch (ctx->state) {
  113621. case 0:
  113622. err = sp_384_ecc_gen_k_12(rng, ctx->k);
  113623. if (err == MP_OKAY) {
  113624. err = FP_WOULDBLOCK;
  113625. ctx->state = 1;
  113626. }
  113627. break;
  113628. case 1:
  113629. err = sp_384_ecc_mulmod_base_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  113630. ctx->point, ctx->k, 1, 1, heap);
  113631. if (err == MP_OKAY) {
  113632. err = FP_WOULDBLOCK;
  113633. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113634. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  113635. ctx->state = 2;
  113636. #else
  113637. ctx->state = 3;
  113638. #endif
  113639. }
  113640. break;
  113641. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113642. case 2:
  113643. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  113644. infinity, ctx->point, p384_order, 1, 1);
  113645. if (err == MP_OKAY) {
  113646. if (sp_384_iszero_12(ctx->point->x) ||
  113647. sp_384_iszero_12(ctx->point->y)) {
  113648. err = ECC_INF_E;
  113649. }
  113650. else {
  113651. err = FP_WOULDBLOCK;
  113652. ctx->state = 3;
  113653. }
  113654. }
  113655. break;
  113656. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  113657. case 3:
  113658. err = sp_384_to_mp(ctx->k, priv);
  113659. if (err == MP_OKAY) {
  113660. err = sp_384_point_to_ecc_point_12(ctx->point, pub);
  113661. }
  113662. break;
  113663. }
  113664. if (err != FP_WOULDBLOCK) {
  113665. XMEMSET(ctx, 0, sizeof(sp_ecc_key_gen_384_ctx));
  113666. }
  113667. return err;
  113668. }
  113669. #endif /* WOLFSSL_SP_NONBLOCK */
  113670. #ifdef HAVE_ECC_DHE
  113671. /* Write r as big endian to byte array.
  113672. * Fixed length number of bytes written: 48
  113673. *
  113674. * r A single precision integer.
  113675. * a Byte array.
  113676. */
  113677. static void sp_384_to_bin_12(sp_digit* r, byte* a)
  113678. {
  113679. int i;
  113680. int j = 0;
  113681. for (i = 11; i >= 0; i--) {
  113682. a[j++] = r[i] >> 24;
  113683. a[j++] = r[i] >> 16;
  113684. a[j++] = r[i] >> 8;
  113685. a[j++] = r[i] >> 0;
  113686. }
  113687. }
  113688. /* Multiply the point by the scalar and serialize the X ordinate.
  113689. * The number is 0 padded to maximum size on output.
  113690. *
  113691. * priv Scalar to multiply the point by.
  113692. * pub Point to multiply.
  113693. * out Buffer to hold X ordinate.
  113694. * outLen On entry, size of the buffer in bytes.
  113695. * On exit, length of data in buffer in bytes.
  113696. * heap Heap to use for allocation.
  113697. * returns BUFFER_E if the buffer is to small for output size,
  113698. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  113699. */
  113700. int sp_ecc_secret_gen_384(const mp_int* priv, const ecc_point* pub, byte* out,
  113701. word32* outLen, void* heap)
  113702. {
  113703. #ifdef WOLFSSL_SP_SMALL_STACK
  113704. sp_point_384* point = NULL;
  113705. sp_digit* k = NULL;
  113706. #else
  113707. sp_point_384 point[1];
  113708. sp_digit k[12];
  113709. #endif
  113710. int err = MP_OKAY;
  113711. if (*outLen < 48U) {
  113712. err = BUFFER_E;
  113713. }
  113714. #ifdef WOLFSSL_SP_SMALL_STACK
  113715. if (err == MP_OKAY) {
  113716. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  113717. DYNAMIC_TYPE_ECC);
  113718. if (point == NULL)
  113719. err = MEMORY_E;
  113720. }
  113721. if (err == MP_OKAY) {
  113722. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  113723. DYNAMIC_TYPE_ECC);
  113724. if (k == NULL)
  113725. err = MEMORY_E;
  113726. }
  113727. #endif
  113728. if (err == MP_OKAY) {
  113729. sp_384_from_mp(k, 12, priv);
  113730. sp_384_point_from_ecc_point_12(point, pub);
  113731. err = sp_384_ecc_mulmod_12(point, point, k, 1, 1, heap);
  113732. }
  113733. if (err == MP_OKAY) {
  113734. sp_384_to_bin_12(point->x, out);
  113735. *outLen = 48;
  113736. }
  113737. #ifdef WOLFSSL_SP_SMALL_STACK
  113738. if (k != NULL)
  113739. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  113740. if (point != NULL)
  113741. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  113742. #endif
  113743. return err;
  113744. }
  113745. #ifdef WOLFSSL_SP_NONBLOCK
  113746. typedef struct sp_ecc_sec_gen_384_ctx {
  113747. int state;
  113748. union {
  113749. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  113750. };
  113751. sp_digit k[12];
  113752. sp_point_384 point;
  113753. } sp_ecc_sec_gen_384_ctx;
  113754. int sp_ecc_secret_gen_384_nb(sp_ecc_ctx_t* sp_ctx, const mp_int* priv,
  113755. const ecc_point* pub, byte* out, word32* outLen, void* heap)
  113756. {
  113757. int err = FP_WOULDBLOCK;
  113758. sp_ecc_sec_gen_384_ctx* ctx = (sp_ecc_sec_gen_384_ctx*)sp_ctx->data;
  113759. typedef char ctx_size_test[sizeof(sp_ecc_sec_gen_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  113760. (void)sizeof(ctx_size_test);
  113761. if (*outLen < 32U) {
  113762. err = BUFFER_E;
  113763. }
  113764. switch (ctx->state) {
  113765. case 0:
  113766. sp_384_from_mp(ctx->k, 12, priv);
  113767. sp_384_point_from_ecc_point_12(&ctx->point, pub);
  113768. ctx->state = 1;
  113769. break;
  113770. case 1:
  113771. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  113772. &ctx->point, &ctx->point, ctx->k, 1, 1, heap);
  113773. if (err == MP_OKAY) {
  113774. sp_384_to_bin_12(ctx->point.x, out);
  113775. *outLen = 48;
  113776. }
  113777. break;
  113778. }
  113779. if (err == MP_OKAY && ctx->state != 1) {
  113780. err = FP_WOULDBLOCK;
  113781. }
  113782. if (err != FP_WOULDBLOCK) {
  113783. XMEMSET(ctx, 0, sizeof(sp_ecc_sec_gen_384_ctx));
  113784. }
  113785. return err;
  113786. }
  113787. #endif /* WOLFSSL_SP_NONBLOCK */
  113788. #endif /* HAVE_ECC_DHE */
  113789. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  113790. #endif
  113791. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  113792. #endif
  113793. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  113794. #ifdef WOLFSSL_SP_SMALL
  113795. /* Sub b from a into a. (a -= b)
  113796. *
  113797. * a A single precision integer.
  113798. * b A single precision integer.
  113799. */
  113800. SP_NOINLINE static sp_digit sp_384_sub_in_place_12(sp_digit* a,
  113801. const sp_digit* b)
  113802. {
  113803. __asm__ __volatile__ (
  113804. "movs r7, %[a]\n\t"
  113805. "movs r2, #0\n\t"
  113806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113807. "adds r7, r7, #48\n\t"
  113808. #else
  113809. "add r7, r7, #48\n\t"
  113810. #endif
  113811. "\n"
  113812. "L_sp_384_sub_in_place_12_words_%=:\n\t"
  113813. "movs r5, #0\n\t"
  113814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113815. "subs r5, r5, r2\n\t"
  113816. #else
  113817. "sub r5, r5, r2\n\t"
  113818. #endif
  113819. "ldr r3, [%[a]]\n\t"
  113820. "ldr r4, [%[a], #4]\n\t"
  113821. "ldr r5, [%[b]]\n\t"
  113822. "ldr r6, [%[b], #4]\n\t"
  113823. #ifdef WOLFSSL_KEIL
  113824. "sbcs r3, r3, r5\n\t"
  113825. #elif defined(__clang__)
  113826. "sbcs r3, r5\n\t"
  113827. #else
  113828. "sbc r3, r5\n\t"
  113829. #endif
  113830. #ifdef WOLFSSL_KEIL
  113831. "sbcs r4, r4, r6\n\t"
  113832. #elif defined(__clang__)
  113833. "sbcs r4, r6\n\t"
  113834. #else
  113835. "sbc r4, r6\n\t"
  113836. #endif
  113837. "str r3, [%[a]]\n\t"
  113838. "str r4, [%[a], #4]\n\t"
  113839. #ifdef WOLFSSL_KEIL
  113840. "sbcs r2, r2, r2\n\t"
  113841. #elif defined(__clang__)
  113842. "sbcs r2, r2\n\t"
  113843. #else
  113844. "sbc r2, r2\n\t"
  113845. #endif
  113846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113847. "adds %[a], %[a], #8\n\t"
  113848. #else
  113849. "add %[a], %[a], #8\n\t"
  113850. #endif
  113851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113852. "adds %[b], %[b], #8\n\t"
  113853. #else
  113854. "add %[b], %[b], #8\n\t"
  113855. #endif
  113856. "cmp %[a], r7\n\t"
  113857. "bne L_sp_384_sub_in_place_12_words_%=\n\t"
  113858. "movs %[a], r2\n\t"
  113859. : [a] "+l" (a), [b] "+l" (b)
  113860. :
  113861. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  113862. );
  113863. return (uint32_t)(size_t)a;
  113864. }
  113865. #else
  113866. /* Sub b from a into a. (a -= b)
  113867. *
  113868. * a A single precision integer.
  113869. * b A single precision integer.
  113870. */
  113871. SP_NOINLINE static sp_digit sp_384_sub_in_place_12(sp_digit* a,
  113872. const sp_digit* b)
  113873. {
  113874. __asm__ __volatile__ (
  113875. "ldm %[b]!, {r4, r5}\n\t"
  113876. "ldr r2, [%[a]]\n\t"
  113877. "ldr r3, [%[a], #4]\n\t"
  113878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113879. "subs r2, r2, r4\n\t"
  113880. #else
  113881. "sub r2, r2, r4\n\t"
  113882. #endif
  113883. #ifdef WOLFSSL_KEIL
  113884. "sbcs r3, r3, r5\n\t"
  113885. #elif defined(__clang__)
  113886. "sbcs r3, r5\n\t"
  113887. #else
  113888. "sbc r3, r5\n\t"
  113889. #endif
  113890. "stm %[a]!, {r2, r3}\n\t"
  113891. "ldm %[b]!, {r4, r5}\n\t"
  113892. "ldr r2, [%[a]]\n\t"
  113893. "ldr r3, [%[a], #4]\n\t"
  113894. #ifdef WOLFSSL_KEIL
  113895. "sbcs r2, r2, r4\n\t"
  113896. #elif defined(__clang__)
  113897. "sbcs r2, r4\n\t"
  113898. #else
  113899. "sbc r2, r4\n\t"
  113900. #endif
  113901. #ifdef WOLFSSL_KEIL
  113902. "sbcs r3, r3, r5\n\t"
  113903. #elif defined(__clang__)
  113904. "sbcs r3, r5\n\t"
  113905. #else
  113906. "sbc r3, r5\n\t"
  113907. #endif
  113908. "stm %[a]!, {r2, r3}\n\t"
  113909. "ldm %[b]!, {r4, r5}\n\t"
  113910. "ldr r2, [%[a]]\n\t"
  113911. "ldr r3, [%[a], #4]\n\t"
  113912. #ifdef WOLFSSL_KEIL
  113913. "sbcs r2, r2, r4\n\t"
  113914. #elif defined(__clang__)
  113915. "sbcs r2, r4\n\t"
  113916. #else
  113917. "sbc r2, r4\n\t"
  113918. #endif
  113919. #ifdef WOLFSSL_KEIL
  113920. "sbcs r3, r3, r5\n\t"
  113921. #elif defined(__clang__)
  113922. "sbcs r3, r5\n\t"
  113923. #else
  113924. "sbc r3, r5\n\t"
  113925. #endif
  113926. "stm %[a]!, {r2, r3}\n\t"
  113927. "ldm %[b]!, {r4, r5}\n\t"
  113928. "ldr r2, [%[a]]\n\t"
  113929. "ldr r3, [%[a], #4]\n\t"
  113930. #ifdef WOLFSSL_KEIL
  113931. "sbcs r2, r2, r4\n\t"
  113932. #elif defined(__clang__)
  113933. "sbcs r2, r4\n\t"
  113934. #else
  113935. "sbc r2, r4\n\t"
  113936. #endif
  113937. #ifdef WOLFSSL_KEIL
  113938. "sbcs r3, r3, r5\n\t"
  113939. #elif defined(__clang__)
  113940. "sbcs r3, r5\n\t"
  113941. #else
  113942. "sbc r3, r5\n\t"
  113943. #endif
  113944. "stm %[a]!, {r2, r3}\n\t"
  113945. "ldm %[b]!, {r4, r5}\n\t"
  113946. "ldr r2, [%[a]]\n\t"
  113947. "ldr r3, [%[a], #4]\n\t"
  113948. #ifdef WOLFSSL_KEIL
  113949. "sbcs r2, r2, r4\n\t"
  113950. #elif defined(__clang__)
  113951. "sbcs r2, r4\n\t"
  113952. #else
  113953. "sbc r2, r4\n\t"
  113954. #endif
  113955. #ifdef WOLFSSL_KEIL
  113956. "sbcs r3, r3, r5\n\t"
  113957. #elif defined(__clang__)
  113958. "sbcs r3, r5\n\t"
  113959. #else
  113960. "sbc r3, r5\n\t"
  113961. #endif
  113962. "stm %[a]!, {r2, r3}\n\t"
  113963. "ldm %[b]!, {r4, r5}\n\t"
  113964. "ldr r2, [%[a]]\n\t"
  113965. "ldr r3, [%[a], #4]\n\t"
  113966. #ifdef WOLFSSL_KEIL
  113967. "sbcs r2, r2, r4\n\t"
  113968. #elif defined(__clang__)
  113969. "sbcs r2, r4\n\t"
  113970. #else
  113971. "sbc r2, r4\n\t"
  113972. #endif
  113973. #ifdef WOLFSSL_KEIL
  113974. "sbcs r3, r3, r5\n\t"
  113975. #elif defined(__clang__)
  113976. "sbcs r3, r5\n\t"
  113977. #else
  113978. "sbc r3, r5\n\t"
  113979. #endif
  113980. "stm %[a]!, {r2, r3}\n\t"
  113981. #ifdef WOLFSSL_KEIL
  113982. "sbcs %[a], %[a], %[a]\n\t"
  113983. #elif defined(__clang__)
  113984. "sbcs %[a], %[a]\n\t"
  113985. #else
  113986. "sbc %[a], %[a]\n\t"
  113987. #endif
  113988. : [a] "+l" (a), [b] "+l" (b)
  113989. :
  113990. : "memory", "r2", "r3", "r4", "r5"
  113991. );
  113992. return (uint32_t)(size_t)a;
  113993. }
  113994. #endif /* WOLFSSL_SP_SMALL */
  113995. /* Mul a by digit b into r. (r = a * b)
  113996. *
  113997. * r A single precision integer.
  113998. * a A single precision integer.
  113999. * b A single precision digit.
  114000. */
  114001. SP_NOINLINE static void sp_384_mul_d_12(sp_digit* r, const sp_digit* a,
  114002. sp_digit b)
  114003. {
  114004. __asm__ __volatile__ (
  114005. "movs r6, #48\n\t"
  114006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114007. "adds r6, r6, %[a]\n\t"
  114008. #else
  114009. "add r6, r6, %[a]\n\t"
  114010. #endif
  114011. "mov r8, %[r]\n\t"
  114012. "mov r9, r6\n\t"
  114013. "movs r3, #0\n\t"
  114014. "movs r4, #0\n\t"
  114015. "\n"
  114016. "L_sp_384_mul_d_12_%=:\n\t"
  114017. "movs %[r], #0\n\t"
  114018. "movs r5, #0\n\t"
  114019. "# A[] * B\n\t"
  114020. "ldrh r6, [%[a]]\n\t"
  114021. "uxth r7, %[b]\n\t"
  114022. #ifdef WOLFSSL_KEIL
  114023. "muls r7, r6, r7\n\t"
  114024. #elif defined(__clang__)
  114025. "muls r7, r6\n\t"
  114026. #else
  114027. "mul r7, r6\n\t"
  114028. #endif
  114029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114030. "adds r3, r3, r7\n\t"
  114031. #else
  114032. "add r3, r3, r7\n\t"
  114033. #endif
  114034. #ifdef WOLFSSL_KEIL
  114035. "adcs r4, r4, %[r]\n\t"
  114036. #elif defined(__clang__)
  114037. "adcs r4, %[r]\n\t"
  114038. #else
  114039. "adc r4, %[r]\n\t"
  114040. #endif
  114041. #ifdef WOLFSSL_KEIL
  114042. "adcs r5, r5, %[r]\n\t"
  114043. #elif defined(__clang__)
  114044. "adcs r5, %[r]\n\t"
  114045. #else
  114046. "adc r5, %[r]\n\t"
  114047. #endif
  114048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114049. "lsrs r7, %[b], #16\n\t"
  114050. #else
  114051. "lsr r7, %[b], #16\n\t"
  114052. #endif
  114053. #ifdef WOLFSSL_KEIL
  114054. "muls r6, r7, r6\n\t"
  114055. #elif defined(__clang__)
  114056. "muls r6, r7\n\t"
  114057. #else
  114058. "mul r6, r7\n\t"
  114059. #endif
  114060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114061. "lsrs r7, r6, #16\n\t"
  114062. #else
  114063. "lsr r7, r6, #16\n\t"
  114064. #endif
  114065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114066. "lsls r6, r6, #16\n\t"
  114067. #else
  114068. "lsl r6, r6, #16\n\t"
  114069. #endif
  114070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114071. "adds r3, r3, r6\n\t"
  114072. #else
  114073. "add r3, r3, r6\n\t"
  114074. #endif
  114075. #ifdef WOLFSSL_KEIL
  114076. "adcs r4, r4, r7\n\t"
  114077. #elif defined(__clang__)
  114078. "adcs r4, r7\n\t"
  114079. #else
  114080. "adc r4, r7\n\t"
  114081. #endif
  114082. #ifdef WOLFSSL_KEIL
  114083. "adcs r5, r5, %[r]\n\t"
  114084. #elif defined(__clang__)
  114085. "adcs r5, %[r]\n\t"
  114086. #else
  114087. "adc r5, %[r]\n\t"
  114088. #endif
  114089. "ldr r6, [%[a]]\n\t"
  114090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114091. "lsrs r6, r6, #16\n\t"
  114092. #else
  114093. "lsr r6, r6, #16\n\t"
  114094. #endif
  114095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114096. "lsrs r7, %[b], #16\n\t"
  114097. #else
  114098. "lsr r7, %[b], #16\n\t"
  114099. #endif
  114100. #ifdef WOLFSSL_KEIL
  114101. "muls r7, r6, r7\n\t"
  114102. #elif defined(__clang__)
  114103. "muls r7, r6\n\t"
  114104. #else
  114105. "mul r7, r6\n\t"
  114106. #endif
  114107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114108. "adds r4, r4, r7\n\t"
  114109. #else
  114110. "add r4, r4, r7\n\t"
  114111. #endif
  114112. #ifdef WOLFSSL_KEIL
  114113. "adcs r5, r5, %[r]\n\t"
  114114. #elif defined(__clang__)
  114115. "adcs r5, %[r]\n\t"
  114116. #else
  114117. "adc r5, %[r]\n\t"
  114118. #endif
  114119. "uxth r7, %[b]\n\t"
  114120. #ifdef WOLFSSL_KEIL
  114121. "muls r6, r7, r6\n\t"
  114122. #elif defined(__clang__)
  114123. "muls r6, r7\n\t"
  114124. #else
  114125. "mul r6, r7\n\t"
  114126. #endif
  114127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114128. "lsrs r7, r6, #16\n\t"
  114129. #else
  114130. "lsr r7, r6, #16\n\t"
  114131. #endif
  114132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114133. "lsls r6, r6, #16\n\t"
  114134. #else
  114135. "lsl r6, r6, #16\n\t"
  114136. #endif
  114137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114138. "adds r3, r3, r6\n\t"
  114139. #else
  114140. "add r3, r3, r6\n\t"
  114141. #endif
  114142. #ifdef WOLFSSL_KEIL
  114143. "adcs r4, r4, r7\n\t"
  114144. #elif defined(__clang__)
  114145. "adcs r4, r7\n\t"
  114146. #else
  114147. "adc r4, r7\n\t"
  114148. #endif
  114149. #ifdef WOLFSSL_KEIL
  114150. "adcs r5, r5, %[r]\n\t"
  114151. #elif defined(__clang__)
  114152. "adcs r5, %[r]\n\t"
  114153. #else
  114154. "adc r5, %[r]\n\t"
  114155. #endif
  114156. "# A[] * B - Done\n\t"
  114157. "mov %[r], r8\n\t"
  114158. "str r3, [%[r]]\n\t"
  114159. "movs r3, r4\n\t"
  114160. "movs r4, r5\n\t"
  114161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114162. "adds %[r], %[r], #4\n\t"
  114163. #else
  114164. "add %[r], %[r], #4\n\t"
  114165. #endif
  114166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114167. "adds %[a], %[a], #4\n\t"
  114168. #else
  114169. "add %[a], %[a], #4\n\t"
  114170. #endif
  114171. "mov r8, %[r]\n\t"
  114172. "cmp %[a], r9\n\t"
  114173. "blt L_sp_384_mul_d_12_%=\n\t"
  114174. "str r3, [%[r]]\n\t"
  114175. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  114176. :
  114177. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  114178. );
  114179. }
  114180. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  114181. *
  114182. * d1 The high order half of the number to divide.
  114183. * d0 The low order half of the number to divide.
  114184. * div The divisor.
  114185. * returns the result of the division.
  114186. *
  114187. * Note that this is an approximate div. It may give an answer 1 larger.
  114188. */
  114189. SP_NOINLINE static sp_digit div_384_word_12(sp_digit d1, sp_digit d0,
  114190. sp_digit div)
  114191. {
  114192. __asm__ __volatile__ (
  114193. "movs r3, #0\n\t"
  114194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114195. "lsrs r5, %[div], #1\n\t"
  114196. #else
  114197. "lsr r5, %[div], #1\n\t"
  114198. #endif
  114199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114200. "adds r5, r5, #1\n\t"
  114201. #else
  114202. "add r5, r5, #1\n\t"
  114203. #endif
  114204. "mov r8, %[d0]\n\t"
  114205. "mov r9, %[d1]\n\t"
  114206. "# Do top 32\n\t"
  114207. "movs r6, r5\n\t"
  114208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114209. "subs r6, r6, %[d1]\n\t"
  114210. #else
  114211. "sub r6, r6, %[d1]\n\t"
  114212. #endif
  114213. #ifdef WOLFSSL_KEIL
  114214. "sbcs r6, r6, r6\n\t"
  114215. #elif defined(__clang__)
  114216. "sbcs r6, r6\n\t"
  114217. #else
  114218. "sbc r6, r6\n\t"
  114219. #endif
  114220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114221. "adds r3, r3, r3\n\t"
  114222. #else
  114223. "add r3, r3, r3\n\t"
  114224. #endif
  114225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114226. "subs r3, r3, r6\n\t"
  114227. #else
  114228. "sub r3, r3, r6\n\t"
  114229. #endif
  114230. #ifdef WOLFSSL_KEIL
  114231. "ands r6, r6, r5\n\t"
  114232. #elif defined(__clang__)
  114233. "ands r6, r5\n\t"
  114234. #else
  114235. "and r6, r5\n\t"
  114236. #endif
  114237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114238. "subs %[d1], %[d1], r6\n\t"
  114239. #else
  114240. "sub %[d1], %[d1], r6\n\t"
  114241. #endif
  114242. "movs r4, #29\n\t"
  114243. "\n"
  114244. "L_div_384_word_12_loop_%=:\n\t"
  114245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114246. "lsls %[d0], %[d0], #1\n\t"
  114247. #else
  114248. "lsl %[d0], %[d0], #1\n\t"
  114249. #endif
  114250. #ifdef WOLFSSL_KEIL
  114251. "adcs %[d1], %[d1], %[d1]\n\t"
  114252. #elif defined(__clang__)
  114253. "adcs %[d1], %[d1]\n\t"
  114254. #else
  114255. "adc %[d1], %[d1]\n\t"
  114256. #endif
  114257. "movs r6, r5\n\t"
  114258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114259. "subs r6, r6, %[d1]\n\t"
  114260. #else
  114261. "sub r6, r6, %[d1]\n\t"
  114262. #endif
  114263. #ifdef WOLFSSL_KEIL
  114264. "sbcs r6, r6, r6\n\t"
  114265. #elif defined(__clang__)
  114266. "sbcs r6, r6\n\t"
  114267. #else
  114268. "sbc r6, r6\n\t"
  114269. #endif
  114270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114271. "adds r3, r3, r3\n\t"
  114272. #else
  114273. "add r3, r3, r3\n\t"
  114274. #endif
  114275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114276. "subs r3, r3, r6\n\t"
  114277. #else
  114278. "sub r3, r3, r6\n\t"
  114279. #endif
  114280. #ifdef WOLFSSL_KEIL
  114281. "ands r6, r6, r5\n\t"
  114282. #elif defined(__clang__)
  114283. "ands r6, r5\n\t"
  114284. #else
  114285. "and r6, r5\n\t"
  114286. #endif
  114287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114288. "subs %[d1], %[d1], r6\n\t"
  114289. #else
  114290. "sub %[d1], %[d1], r6\n\t"
  114291. #endif
  114292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114293. "subs r4, r4, #1\n\t"
  114294. #else
  114295. "sub r4, r4, #1\n\t"
  114296. #endif
  114297. "bpl L_div_384_word_12_loop_%=\n\t"
  114298. "movs r7, #0\n\t"
  114299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114300. "adds r3, r3, r3\n\t"
  114301. #else
  114302. "add r3, r3, r3\n\t"
  114303. #endif
  114304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114305. "adds r3, r3, #1\n\t"
  114306. #else
  114307. "add r3, r3, #1\n\t"
  114308. #endif
  114309. "# r * div - Start\n\t"
  114310. "uxth %[d1], r3\n\t"
  114311. "uxth r4, %[div]\n\t"
  114312. #ifdef WOLFSSL_KEIL
  114313. "muls r4, %[d1], r4\n\t"
  114314. #elif defined(__clang__)
  114315. "muls r4, %[d1]\n\t"
  114316. #else
  114317. "mul r4, %[d1]\n\t"
  114318. #endif
  114319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114320. "lsrs r6, %[div], #16\n\t"
  114321. #else
  114322. "lsr r6, %[div], #16\n\t"
  114323. #endif
  114324. #ifdef WOLFSSL_KEIL
  114325. "muls %[d1], r6, %[d1]\n\t"
  114326. #elif defined(__clang__)
  114327. "muls %[d1], r6\n\t"
  114328. #else
  114329. "mul %[d1], r6\n\t"
  114330. #endif
  114331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114332. "lsrs r5, %[d1], #16\n\t"
  114333. #else
  114334. "lsr r5, %[d1], #16\n\t"
  114335. #endif
  114336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114337. "lsls %[d1], %[d1], #16\n\t"
  114338. #else
  114339. "lsl %[d1], %[d1], #16\n\t"
  114340. #endif
  114341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114342. "adds r4, r4, %[d1]\n\t"
  114343. #else
  114344. "add r4, r4, %[d1]\n\t"
  114345. #endif
  114346. #ifdef WOLFSSL_KEIL
  114347. "adcs r5, r5, r7\n\t"
  114348. #elif defined(__clang__)
  114349. "adcs r5, r7\n\t"
  114350. #else
  114351. "adc r5, r7\n\t"
  114352. #endif
  114353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114354. "lsrs %[d1], r3, #16\n\t"
  114355. #else
  114356. "lsr %[d1], r3, #16\n\t"
  114357. #endif
  114358. #ifdef WOLFSSL_KEIL
  114359. "muls r6, %[d1], r6\n\t"
  114360. #elif defined(__clang__)
  114361. "muls r6, %[d1]\n\t"
  114362. #else
  114363. "mul r6, %[d1]\n\t"
  114364. #endif
  114365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114366. "adds r5, r5, r6\n\t"
  114367. #else
  114368. "add r5, r5, r6\n\t"
  114369. #endif
  114370. "uxth r6, %[div]\n\t"
  114371. #ifdef WOLFSSL_KEIL
  114372. "muls %[d1], r6, %[d1]\n\t"
  114373. #elif defined(__clang__)
  114374. "muls %[d1], r6\n\t"
  114375. #else
  114376. "mul %[d1], r6\n\t"
  114377. #endif
  114378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114379. "lsrs r6, %[d1], #16\n\t"
  114380. #else
  114381. "lsr r6, %[d1], #16\n\t"
  114382. #endif
  114383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114384. "lsls %[d1], %[d1], #16\n\t"
  114385. #else
  114386. "lsl %[d1], %[d1], #16\n\t"
  114387. #endif
  114388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114389. "adds r4, r4, %[d1]\n\t"
  114390. #else
  114391. "add r4, r4, %[d1]\n\t"
  114392. #endif
  114393. #ifdef WOLFSSL_KEIL
  114394. "adcs r5, r5, r6\n\t"
  114395. #elif defined(__clang__)
  114396. "adcs r5, r6\n\t"
  114397. #else
  114398. "adc r5, r6\n\t"
  114399. #endif
  114400. "# r * div - Done\n\t"
  114401. "mov %[d1], r8\n\t"
  114402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114403. "subs %[d1], %[d1], r4\n\t"
  114404. #else
  114405. "sub %[d1], %[d1], r4\n\t"
  114406. #endif
  114407. "movs r4, %[d1]\n\t"
  114408. "mov %[d1], r9\n\t"
  114409. #ifdef WOLFSSL_KEIL
  114410. "sbcs %[d1], %[d1], r5\n\t"
  114411. #elif defined(__clang__)
  114412. "sbcs %[d1], r5\n\t"
  114413. #else
  114414. "sbc %[d1], r5\n\t"
  114415. #endif
  114416. "movs r5, %[d1]\n\t"
  114417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114418. "adds r3, r3, r5\n\t"
  114419. #else
  114420. "add r3, r3, r5\n\t"
  114421. #endif
  114422. "# r * div - Start\n\t"
  114423. "uxth %[d1], r3\n\t"
  114424. "uxth r4, %[div]\n\t"
  114425. #ifdef WOLFSSL_KEIL
  114426. "muls r4, %[d1], r4\n\t"
  114427. #elif defined(__clang__)
  114428. "muls r4, %[d1]\n\t"
  114429. #else
  114430. "mul r4, %[d1]\n\t"
  114431. #endif
  114432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114433. "lsrs r6, %[div], #16\n\t"
  114434. #else
  114435. "lsr r6, %[div], #16\n\t"
  114436. #endif
  114437. #ifdef WOLFSSL_KEIL
  114438. "muls %[d1], r6, %[d1]\n\t"
  114439. #elif defined(__clang__)
  114440. "muls %[d1], r6\n\t"
  114441. #else
  114442. "mul %[d1], r6\n\t"
  114443. #endif
  114444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114445. "lsrs r5, %[d1], #16\n\t"
  114446. #else
  114447. "lsr r5, %[d1], #16\n\t"
  114448. #endif
  114449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114450. "lsls %[d1], %[d1], #16\n\t"
  114451. #else
  114452. "lsl %[d1], %[d1], #16\n\t"
  114453. #endif
  114454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114455. "adds r4, r4, %[d1]\n\t"
  114456. #else
  114457. "add r4, r4, %[d1]\n\t"
  114458. #endif
  114459. #ifdef WOLFSSL_KEIL
  114460. "adcs r5, r5, r7\n\t"
  114461. #elif defined(__clang__)
  114462. "adcs r5, r7\n\t"
  114463. #else
  114464. "adc r5, r7\n\t"
  114465. #endif
  114466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114467. "lsrs %[d1], r3, #16\n\t"
  114468. #else
  114469. "lsr %[d1], r3, #16\n\t"
  114470. #endif
  114471. #ifdef WOLFSSL_KEIL
  114472. "muls r6, %[d1], r6\n\t"
  114473. #elif defined(__clang__)
  114474. "muls r6, %[d1]\n\t"
  114475. #else
  114476. "mul r6, %[d1]\n\t"
  114477. #endif
  114478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114479. "adds r5, r5, r6\n\t"
  114480. #else
  114481. "add r5, r5, r6\n\t"
  114482. #endif
  114483. "uxth r6, %[div]\n\t"
  114484. #ifdef WOLFSSL_KEIL
  114485. "muls %[d1], r6, %[d1]\n\t"
  114486. #elif defined(__clang__)
  114487. "muls %[d1], r6\n\t"
  114488. #else
  114489. "mul %[d1], r6\n\t"
  114490. #endif
  114491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114492. "lsrs r6, %[d1], #16\n\t"
  114493. #else
  114494. "lsr r6, %[d1], #16\n\t"
  114495. #endif
  114496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114497. "lsls %[d1], %[d1], #16\n\t"
  114498. #else
  114499. "lsl %[d1], %[d1], #16\n\t"
  114500. #endif
  114501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114502. "adds r4, r4, %[d1]\n\t"
  114503. #else
  114504. "add r4, r4, %[d1]\n\t"
  114505. #endif
  114506. #ifdef WOLFSSL_KEIL
  114507. "adcs r5, r5, r6\n\t"
  114508. #elif defined(__clang__)
  114509. "adcs r5, r6\n\t"
  114510. #else
  114511. "adc r5, r6\n\t"
  114512. #endif
  114513. "# r * div - Done\n\t"
  114514. "mov %[d1], r8\n\t"
  114515. "mov r6, r9\n\t"
  114516. #ifdef WOLFSSL_KEIL
  114517. "subs r4, %[d1], r4\n\t"
  114518. #else
  114519. #ifdef __clang__
  114520. "subs r4, %[d1], r4\n\t"
  114521. #else
  114522. "sub r4, %[d1], r4\n\t"
  114523. #endif
  114524. #endif
  114525. #ifdef WOLFSSL_KEIL
  114526. "sbcs r6, r6, r5\n\t"
  114527. #elif defined(__clang__)
  114528. "sbcs r6, r5\n\t"
  114529. #else
  114530. "sbc r6, r5\n\t"
  114531. #endif
  114532. "movs r5, r6\n\t"
  114533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114534. "adds r3, r3, r5\n\t"
  114535. #else
  114536. "add r3, r3, r5\n\t"
  114537. #endif
  114538. "# r * div - Start\n\t"
  114539. "uxth %[d1], r3\n\t"
  114540. "uxth r4, %[div]\n\t"
  114541. #ifdef WOLFSSL_KEIL
  114542. "muls r4, %[d1], r4\n\t"
  114543. #elif defined(__clang__)
  114544. "muls r4, %[d1]\n\t"
  114545. #else
  114546. "mul r4, %[d1]\n\t"
  114547. #endif
  114548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114549. "lsrs r6, %[div], #16\n\t"
  114550. #else
  114551. "lsr r6, %[div], #16\n\t"
  114552. #endif
  114553. #ifdef WOLFSSL_KEIL
  114554. "muls %[d1], r6, %[d1]\n\t"
  114555. #elif defined(__clang__)
  114556. "muls %[d1], r6\n\t"
  114557. #else
  114558. "mul %[d1], r6\n\t"
  114559. #endif
  114560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114561. "lsrs r5, %[d1], #16\n\t"
  114562. #else
  114563. "lsr r5, %[d1], #16\n\t"
  114564. #endif
  114565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114566. "lsls %[d1], %[d1], #16\n\t"
  114567. #else
  114568. "lsl %[d1], %[d1], #16\n\t"
  114569. #endif
  114570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114571. "adds r4, r4, %[d1]\n\t"
  114572. #else
  114573. "add r4, r4, %[d1]\n\t"
  114574. #endif
  114575. #ifdef WOLFSSL_KEIL
  114576. "adcs r5, r5, r7\n\t"
  114577. #elif defined(__clang__)
  114578. "adcs r5, r7\n\t"
  114579. #else
  114580. "adc r5, r7\n\t"
  114581. #endif
  114582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114583. "lsrs %[d1], r3, #16\n\t"
  114584. #else
  114585. "lsr %[d1], r3, #16\n\t"
  114586. #endif
  114587. #ifdef WOLFSSL_KEIL
  114588. "muls r6, %[d1], r6\n\t"
  114589. #elif defined(__clang__)
  114590. "muls r6, %[d1]\n\t"
  114591. #else
  114592. "mul r6, %[d1]\n\t"
  114593. #endif
  114594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114595. "adds r5, r5, r6\n\t"
  114596. #else
  114597. "add r5, r5, r6\n\t"
  114598. #endif
  114599. "uxth r6, %[div]\n\t"
  114600. #ifdef WOLFSSL_KEIL
  114601. "muls %[d1], r6, %[d1]\n\t"
  114602. #elif defined(__clang__)
  114603. "muls %[d1], r6\n\t"
  114604. #else
  114605. "mul %[d1], r6\n\t"
  114606. #endif
  114607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114608. "lsrs r6, %[d1], #16\n\t"
  114609. #else
  114610. "lsr r6, %[d1], #16\n\t"
  114611. #endif
  114612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114613. "lsls %[d1], %[d1], #16\n\t"
  114614. #else
  114615. "lsl %[d1], %[d1], #16\n\t"
  114616. #endif
  114617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114618. "adds r4, r4, %[d1]\n\t"
  114619. #else
  114620. "add r4, r4, %[d1]\n\t"
  114621. #endif
  114622. #ifdef WOLFSSL_KEIL
  114623. "adcs r5, r5, r6\n\t"
  114624. #elif defined(__clang__)
  114625. "adcs r5, r6\n\t"
  114626. #else
  114627. "adc r5, r6\n\t"
  114628. #endif
  114629. "# r * div - Done\n\t"
  114630. "mov %[d1], r8\n\t"
  114631. "mov r6, r9\n\t"
  114632. #ifdef WOLFSSL_KEIL
  114633. "subs r4, %[d1], r4\n\t"
  114634. #else
  114635. #ifdef __clang__
  114636. "subs r4, %[d1], r4\n\t"
  114637. #else
  114638. "sub r4, %[d1], r4\n\t"
  114639. #endif
  114640. #endif
  114641. #ifdef WOLFSSL_KEIL
  114642. "sbcs r6, r6, r5\n\t"
  114643. #elif defined(__clang__)
  114644. "sbcs r6, r5\n\t"
  114645. #else
  114646. "sbc r6, r5\n\t"
  114647. #endif
  114648. "movs r5, r6\n\t"
  114649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114650. "adds r3, r3, r5\n\t"
  114651. #else
  114652. "add r3, r3, r5\n\t"
  114653. #endif
  114654. "# r * div - Start\n\t"
  114655. "uxth %[d1], r3\n\t"
  114656. "uxth r4, %[div]\n\t"
  114657. #ifdef WOLFSSL_KEIL
  114658. "muls r4, %[d1], r4\n\t"
  114659. #elif defined(__clang__)
  114660. "muls r4, %[d1]\n\t"
  114661. #else
  114662. "mul r4, %[d1]\n\t"
  114663. #endif
  114664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114665. "lsrs r6, %[div], #16\n\t"
  114666. #else
  114667. "lsr r6, %[div], #16\n\t"
  114668. #endif
  114669. #ifdef WOLFSSL_KEIL
  114670. "muls %[d1], r6, %[d1]\n\t"
  114671. #elif defined(__clang__)
  114672. "muls %[d1], r6\n\t"
  114673. #else
  114674. "mul %[d1], r6\n\t"
  114675. #endif
  114676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114677. "lsrs r5, %[d1], #16\n\t"
  114678. #else
  114679. "lsr r5, %[d1], #16\n\t"
  114680. #endif
  114681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114682. "lsls %[d1], %[d1], #16\n\t"
  114683. #else
  114684. "lsl %[d1], %[d1], #16\n\t"
  114685. #endif
  114686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114687. "adds r4, r4, %[d1]\n\t"
  114688. #else
  114689. "add r4, r4, %[d1]\n\t"
  114690. #endif
  114691. #ifdef WOLFSSL_KEIL
  114692. "adcs r5, r5, r7\n\t"
  114693. #elif defined(__clang__)
  114694. "adcs r5, r7\n\t"
  114695. #else
  114696. "adc r5, r7\n\t"
  114697. #endif
  114698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114699. "lsrs %[d1], r3, #16\n\t"
  114700. #else
  114701. "lsr %[d1], r3, #16\n\t"
  114702. #endif
  114703. #ifdef WOLFSSL_KEIL
  114704. "muls r6, %[d1], r6\n\t"
  114705. #elif defined(__clang__)
  114706. "muls r6, %[d1]\n\t"
  114707. #else
  114708. "mul r6, %[d1]\n\t"
  114709. #endif
  114710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114711. "adds r5, r5, r6\n\t"
  114712. #else
  114713. "add r5, r5, r6\n\t"
  114714. #endif
  114715. "uxth r6, %[div]\n\t"
  114716. #ifdef WOLFSSL_KEIL
  114717. "muls %[d1], r6, %[d1]\n\t"
  114718. #elif defined(__clang__)
  114719. "muls %[d1], r6\n\t"
  114720. #else
  114721. "mul %[d1], r6\n\t"
  114722. #endif
  114723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114724. "lsrs r6, %[d1], #16\n\t"
  114725. #else
  114726. "lsr r6, %[d1], #16\n\t"
  114727. #endif
  114728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114729. "lsls %[d1], %[d1], #16\n\t"
  114730. #else
  114731. "lsl %[d1], %[d1], #16\n\t"
  114732. #endif
  114733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114734. "adds r4, r4, %[d1]\n\t"
  114735. #else
  114736. "add r4, r4, %[d1]\n\t"
  114737. #endif
  114738. #ifdef WOLFSSL_KEIL
  114739. "adcs r5, r5, r6\n\t"
  114740. #elif defined(__clang__)
  114741. "adcs r5, r6\n\t"
  114742. #else
  114743. "adc r5, r6\n\t"
  114744. #endif
  114745. "# r * div - Done\n\t"
  114746. "mov %[d1], r8\n\t"
  114747. "mov r6, r9\n\t"
  114748. #ifdef WOLFSSL_KEIL
  114749. "subs r4, %[d1], r4\n\t"
  114750. #else
  114751. #ifdef __clang__
  114752. "subs r4, %[d1], r4\n\t"
  114753. #else
  114754. "sub r4, %[d1], r4\n\t"
  114755. #endif
  114756. #endif
  114757. #ifdef WOLFSSL_KEIL
  114758. "sbcs r6, r6, r5\n\t"
  114759. #elif defined(__clang__)
  114760. "sbcs r6, r5\n\t"
  114761. #else
  114762. "sbc r6, r5\n\t"
  114763. #endif
  114764. "movs r5, r6\n\t"
  114765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114766. "adds r3, r3, r5\n\t"
  114767. #else
  114768. "add r3, r3, r5\n\t"
  114769. #endif
  114770. "movs r6, %[div]\n\t"
  114771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114772. "subs r6, r6, r4\n\t"
  114773. #else
  114774. "sub r6, r6, r4\n\t"
  114775. #endif
  114776. #ifdef WOLFSSL_KEIL
  114777. "sbcs r6, r6, r6\n\t"
  114778. #elif defined(__clang__)
  114779. "sbcs r6, r6\n\t"
  114780. #else
  114781. "sbc r6, r6\n\t"
  114782. #endif
  114783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114784. "subs r3, r3, r6\n\t"
  114785. #else
  114786. "sub r3, r3, r6\n\t"
  114787. #endif
  114788. "movs %[d1], r3\n\t"
  114789. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  114790. :
  114791. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  114792. );
  114793. return (uint32_t)(size_t)d1;
  114794. }
  114795. /* AND m into each word of a and store in r.
  114796. *
  114797. * r A single precision integer.
  114798. * a A single precision integer.
  114799. * m Mask to AND against each digit.
  114800. */
  114801. static void sp_384_mask_12(sp_digit* r, const sp_digit* a, sp_digit m)
  114802. {
  114803. #ifdef WOLFSSL_SP_SMALL
  114804. int i;
  114805. for (i=0; i<12; i++) {
  114806. r[i] = a[i] & m;
  114807. }
  114808. #else
  114809. r[0] = a[0] & m;
  114810. r[1] = a[1] & m;
  114811. r[2] = a[2] & m;
  114812. r[3] = a[3] & m;
  114813. r[4] = a[4] & m;
  114814. r[5] = a[5] & m;
  114815. r[6] = a[6] & m;
  114816. r[7] = a[7] & m;
  114817. r[8] = a[8] & m;
  114818. r[9] = a[9] & m;
  114819. r[10] = a[10] & m;
  114820. r[11] = a[11] & m;
  114821. #endif
  114822. }
  114823. /* Divide d in a and put remainder into r (m*d + r = a)
  114824. * m is not calculated as it is not needed at this time.
  114825. *
  114826. * a Number to be divided.
  114827. * d Number to divide with.
  114828. * m Multiplier result.
  114829. * r Remainder from the division.
  114830. * returns MP_OKAY indicating success.
  114831. */
  114832. static WC_INLINE int sp_384_div_12(const sp_digit* a, const sp_digit* d,
  114833. sp_digit* m, sp_digit* r)
  114834. {
  114835. sp_digit t1[24], t2[13];
  114836. sp_digit div, r1;
  114837. int i;
  114838. (void)m;
  114839. div = d[11];
  114840. XMEMCPY(t1, a, sizeof(*t1) * 2 * 12);
  114841. r1 = sp_384_cmp_12(&t1[12], d) >= 0;
  114842. sp_384_cond_sub_12(&t1[12], &t1[12], d, (sp_digit)0 - r1);
  114843. for (i = 11; i >= 0; i--) {
  114844. volatile sp_digit mask = (sp_digit)0 - (t1[12 + i] == div);
  114845. sp_digit hi = t1[12 + i] + mask;
  114846. r1 = div_384_word_12(hi, t1[12 + i - 1], div);
  114847. r1 |= mask;
  114848. sp_384_mul_d_12(t2, d, r1);
  114849. t1[12 + i] += sp_384_sub_in_place_12(&t1[i], t2);
  114850. t1[12 + i] -= t2[12];
  114851. sp_384_mask_12(t2, d, t1[12 + i]);
  114852. t1[12 + i] += sp_384_add_12(&t1[i], &t1[i], t2);
  114853. sp_384_mask_12(t2, d, t1[12 + i]);
  114854. t1[12 + i] += sp_384_add_12(&t1[i], &t1[i], t2);
  114855. }
  114856. r1 = sp_384_cmp_12(t1, d) >= 0;
  114857. sp_384_cond_sub_12(r, t1, d, (sp_digit)0 - r1);
  114858. return MP_OKAY;
  114859. }
  114860. /* Reduce a modulo m into r. (r = a mod m)
  114861. *
  114862. * r A single precision number that is the reduced result.
  114863. * a A single precision number that is to be reduced.
  114864. * m A single precision number that is the modulus to reduce with.
  114865. * returns MP_OKAY indicating success.
  114866. */
  114867. static WC_INLINE int sp_384_mod_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  114868. {
  114869. int ret;
  114870. ret = sp_384_div_12(a, m, NULL, r);
  114871. return ret;
  114872. }
  114873. #endif
  114874. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  114875. /* Multiply two number mod the order of P384 curve. (r = a * b mod order)
  114876. *
  114877. * r Result of the multiplication.
  114878. * a First operand of the multiplication.
  114879. * b Second operand of the multiplication.
  114880. */
  114881. static void sp_384_mont_mul_order_12(sp_digit* r, const sp_digit* a, const sp_digit* b)
  114882. {
  114883. sp_384_mul_12(r, a, b);
  114884. sp_384_mont_reduce_order_12(r, p384_order, p384_mp_order);
  114885. }
  114886. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  114887. #ifdef WOLFSSL_SP_SMALL
  114888. /* Order-2 for the P384 curve. */
  114889. static const uint32_t p384_order_minus_2[12] = {
  114890. 0xccc52971U,0xecec196aU,0x48b0a77aU,0x581a0db2U,0xf4372ddfU,0xc7634d81U,
  114891. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU
  114892. };
  114893. #else
  114894. /* The low half of the order-2 of the P384 curve. */
  114895. static const uint32_t p384_order_low[6] = {
  114896. 0xccc52971U,0xecec196aU,0x48b0a77aU,0x581a0db2U,0xf4372ddfU,0xc7634d81U
  114897. };
  114898. #endif /* WOLFSSL_SP_SMALL */
  114899. /* Square number mod the order of P384 curve. (r = a * a mod order)
  114900. *
  114901. * r Result of the squaring.
  114902. * a Number to square.
  114903. */
  114904. static void sp_384_mont_sqr_order_12(sp_digit* r, const sp_digit* a)
  114905. {
  114906. sp_384_sqr_12(r, a);
  114907. sp_384_mont_reduce_order_12(r, p384_order, p384_mp_order);
  114908. }
  114909. #ifndef WOLFSSL_SP_SMALL
  114910. /* Square number mod the order of P384 curve a number of times.
  114911. * (r = a ^ n mod order)
  114912. *
  114913. * r Result of the squaring.
  114914. * a Number to square.
  114915. */
  114916. static void sp_384_mont_sqr_n_order_12(sp_digit* r, const sp_digit* a, int n)
  114917. {
  114918. int i;
  114919. sp_384_mont_sqr_order_12(r, a);
  114920. for (i=1; i<n; i++) {
  114921. sp_384_mont_sqr_order_12(r, r);
  114922. }
  114923. }
  114924. #endif /* !WOLFSSL_SP_SMALL */
  114925. /* Invert the number, in Montgomery form, modulo the order of the P384 curve.
  114926. * (r = 1 / a mod order)
  114927. *
  114928. * r Inverse result.
  114929. * a Number to invert.
  114930. * td Temporary data.
  114931. */
  114932. #ifdef WOLFSSL_SP_NONBLOCK
  114933. typedef struct sp_384_mont_inv_order_12_ctx {
  114934. int state;
  114935. int i;
  114936. } sp_384_mont_inv_order_12_ctx;
  114937. static int sp_384_mont_inv_order_12_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  114938. sp_digit* t)
  114939. {
  114940. int err = FP_WOULDBLOCK;
  114941. sp_384_mont_inv_order_12_ctx* ctx = (sp_384_mont_inv_order_12_ctx*)sp_ctx;
  114942. typedef char ctx_size_test[sizeof(sp_384_mont_inv_order_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  114943. (void)sizeof(ctx_size_test);
  114944. switch (ctx->state) {
  114945. case 0:
  114946. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  114947. ctx->i = 382;
  114948. ctx->state = 1;
  114949. break;
  114950. case 1:
  114951. sp_384_mont_sqr_order_12(t, t);
  114952. ctx->state = 2;
  114953. break;
  114954. case 2:
  114955. if ((p384_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  114956. sp_384_mont_mul_order_12(t, t, a);
  114957. }
  114958. ctx->i--;
  114959. ctx->state = (ctx->i == 0) ? 3 : 1;
  114960. break;
  114961. case 3:
  114962. XMEMCPY(r, t, sizeof(sp_digit) * 12U);
  114963. err = MP_OKAY;
  114964. break;
  114965. }
  114966. return err;
  114967. }
  114968. #endif /* WOLFSSL_SP_NONBLOCK */
  114969. static void sp_384_mont_inv_order_12(sp_digit* r, const sp_digit* a,
  114970. sp_digit* td)
  114971. {
  114972. #ifdef WOLFSSL_SP_SMALL
  114973. sp_digit* t = td;
  114974. int i;
  114975. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  114976. for (i=382; i>=0; i--) {
  114977. sp_384_mont_sqr_order_12(t, t);
  114978. if ((p384_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  114979. sp_384_mont_mul_order_12(t, t, a);
  114980. }
  114981. }
  114982. XMEMCPY(r, t, sizeof(sp_digit) * 12U);
  114983. #else
  114984. sp_digit* t = td;
  114985. sp_digit* t2 = td + 2 * 12;
  114986. sp_digit* t3 = td + 4 * 12;
  114987. int i;
  114988. /* t = a^2 */
  114989. sp_384_mont_sqr_order_12(t, a);
  114990. /* t = a^3 = t * a */
  114991. sp_384_mont_mul_order_12(t, t, a);
  114992. /* t2= a^c = t ^ 2 ^ 2 */
  114993. sp_384_mont_sqr_n_order_12(t2, t, 2);
  114994. /* t = a^f = t2 * t */
  114995. sp_384_mont_mul_order_12(t, t2, t);
  114996. /* t2= a^f0 = t ^ 2 ^ 4 */
  114997. sp_384_mont_sqr_n_order_12(t2, t, 4);
  114998. /* t = a^ff = t2 * t */
  114999. sp_384_mont_mul_order_12(t, t2, t);
  115000. /* t2= a^ff00 = t ^ 2 ^ 8 */
  115001. sp_384_mont_sqr_n_order_12(t2, t, 8);
  115002. /* t3= a^ffff = t2 * t */
  115003. sp_384_mont_mul_order_12(t3, t2, t);
  115004. /* t2= a^ffff0000 = t3 ^ 2 ^ 16 */
  115005. sp_384_mont_sqr_n_order_12(t2, t3, 16);
  115006. /* t = a^ffffffff = t2 * t3 */
  115007. sp_384_mont_mul_order_12(t, t2, t3);
  115008. /* t2= a^ffffffff0000 = t ^ 2 ^ 16 */
  115009. sp_384_mont_sqr_n_order_12(t2, t, 16);
  115010. /* t = a^ffffffffffff = t2 * t3 */
  115011. sp_384_mont_mul_order_12(t, t2, t3);
  115012. /* t2= a^ffffffffffff000000000000 = t ^ 2 ^ 48 */
  115013. sp_384_mont_sqr_n_order_12(t2, t, 48);
  115014. /* t= a^fffffffffffffffffffffffff = t2 * t */
  115015. sp_384_mont_mul_order_12(t, t2, t);
  115016. /* t2= a^ffffffffffffffffffffffff000000000000000000000000 */
  115017. sp_384_mont_sqr_n_order_12(t2, t, 96);
  115018. /* t2= a^ffffffffffffffffffffffffffffffffffffffffffffffff = t2 * t */
  115019. sp_384_mont_mul_order_12(t2, t2, t);
  115020. for (i=191; i>=1; i--) {
  115021. sp_384_mont_sqr_order_12(t2, t2);
  115022. if ((p384_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  115023. sp_384_mont_mul_order_12(t2, t2, a);
  115024. }
  115025. }
  115026. sp_384_mont_sqr_order_12(t2, t2);
  115027. sp_384_mont_mul_order_12(r, t2, a);
  115028. #endif /* WOLFSSL_SP_SMALL */
  115029. }
  115030. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  115031. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  115032. #ifdef HAVE_ECC_SIGN
  115033. #ifndef SP_ECC_MAX_SIG_GEN
  115034. #define SP_ECC_MAX_SIG_GEN 64
  115035. #endif
  115036. /* Calculate second signature value S from R, k and private value.
  115037. *
  115038. * s = (r * x + e) / k
  115039. *
  115040. * s Signature value.
  115041. * r First signature value.
  115042. * k Ephemeral private key.
  115043. * x Private key as a number.
  115044. * e Hash of message as a number.
  115045. * tmp Temporary storage for intermediate numbers.
  115046. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  115047. */
  115048. static int sp_384_calc_s_12(sp_digit* s, const sp_digit* r, sp_digit* k,
  115049. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  115050. {
  115051. int err;
  115052. sp_digit carry;
  115053. sp_int32 c;
  115054. sp_digit* kInv = k;
  115055. /* Conv k to Montgomery form (mod order) */
  115056. sp_384_mul_12(k, k, p384_norm_order);
  115057. err = sp_384_mod_12(k, k, p384_order);
  115058. if (err == MP_OKAY) {
  115059. sp_384_norm_12(k);
  115060. /* kInv = 1/k mod order */
  115061. sp_384_mont_inv_order_12(kInv, k, tmp);
  115062. sp_384_norm_12(kInv);
  115063. /* s = r * x + e */
  115064. sp_384_mul_12(x, x, r);
  115065. err = sp_384_mod_12(x, x, p384_order);
  115066. }
  115067. if (err == MP_OKAY) {
  115068. sp_384_norm_12(x);
  115069. carry = sp_384_add_12(s, e, x);
  115070. sp_384_cond_sub_12(s, s, p384_order, 0 - carry);
  115071. sp_384_norm_12(s);
  115072. c = sp_384_cmp_12(s, p384_order);
  115073. sp_384_cond_sub_12(s, s, p384_order,
  115074. (sp_digit)0 - (sp_digit)(c >= 0));
  115075. sp_384_norm_12(s);
  115076. /* s = s * k^-1 mod order */
  115077. sp_384_mont_mul_order_12(s, s, kInv);
  115078. sp_384_norm_12(s);
  115079. }
  115080. return err;
  115081. }
  115082. /* Sign the hash using the private key.
  115083. * e = [hash, 384 bits] from binary
  115084. * r = (k.G)->x mod order
  115085. * s = (r * x + e) / k mod order
  115086. * The hash is truncated to the first 384 bits.
  115087. *
  115088. * hash Hash to sign.
  115089. * hashLen Length of the hash data.
  115090. * rng Random number generator.
  115091. * priv Private part of key - scalar.
  115092. * rm First part of result as an mp_int.
  115093. * sm Sirst part of result as an mp_int.
  115094. * heap Heap to use for allocation.
  115095. * returns RNG failures, MEMORY_E when memory allocation fails and
  115096. * MP_OKAY on success.
  115097. */
  115098. int sp_ecc_sign_384(const byte* hash, word32 hashLen, WC_RNG* rng,
  115099. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  115100. {
  115101. #ifdef WOLFSSL_SP_SMALL_STACK
  115102. sp_digit* e = NULL;
  115103. sp_point_384* point = NULL;
  115104. #else
  115105. sp_digit e[7 * 2 * 12];
  115106. sp_point_384 point[1];
  115107. #endif
  115108. sp_digit* x = NULL;
  115109. sp_digit* k = NULL;
  115110. sp_digit* r = NULL;
  115111. sp_digit* tmp = NULL;
  115112. sp_digit* s = NULL;
  115113. sp_int32 c;
  115114. int err = MP_OKAY;
  115115. int i;
  115116. (void)heap;
  115117. #ifdef WOLFSSL_SP_SMALL_STACK
  115118. if (err == MP_OKAY) {
  115119. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  115120. DYNAMIC_TYPE_ECC);
  115121. if (point == NULL)
  115122. err = MEMORY_E;
  115123. }
  115124. if (err == MP_OKAY) {
  115125. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 12, heap,
  115126. DYNAMIC_TYPE_ECC);
  115127. if (e == NULL)
  115128. err = MEMORY_E;
  115129. }
  115130. #endif
  115131. if (err == MP_OKAY) {
  115132. x = e + 2 * 12;
  115133. k = e + 4 * 12;
  115134. r = e + 6 * 12;
  115135. tmp = e + 8 * 12;
  115136. s = e;
  115137. if (hashLen > 48U) {
  115138. hashLen = 48U;
  115139. }
  115140. }
  115141. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  115142. /* New random point. */
  115143. if (km == NULL || mp_iszero(km)) {
  115144. err = sp_384_ecc_gen_k_12(rng, k);
  115145. }
  115146. else {
  115147. sp_384_from_mp(k, 12, km);
  115148. mp_zero(km);
  115149. }
  115150. if (err == MP_OKAY) {
  115151. err = sp_384_ecc_mulmod_base_12(point, k, 1, 1, heap);
  115152. }
  115153. if (err == MP_OKAY) {
  115154. /* r = point->x mod order */
  115155. XMEMCPY(r, point->x, sizeof(sp_digit) * 12U);
  115156. sp_384_norm_12(r);
  115157. c = sp_384_cmp_12(r, p384_order);
  115158. sp_384_cond_sub_12(r, r, p384_order,
  115159. (sp_digit)0 - (sp_digit)(c >= 0));
  115160. sp_384_norm_12(r);
  115161. if (!sp_384_iszero_12(r)) {
  115162. /* x is modified in calculation of s. */
  115163. sp_384_from_mp(x, 12, priv);
  115164. /* s ptr == e ptr, e is modified in calculation of s. */
  115165. sp_384_from_bin(e, 12, hash, (int)hashLen);
  115166. err = sp_384_calc_s_12(s, r, k, x, e, tmp);
  115167. /* Check that signature is usable. */
  115168. if ((err == MP_OKAY) && (!sp_384_iszero_12(s))) {
  115169. break;
  115170. }
  115171. }
  115172. }
  115173. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  115174. i = 1;
  115175. #endif
  115176. }
  115177. if (i == 0) {
  115178. err = RNG_FAILURE_E;
  115179. }
  115180. if (err == MP_OKAY) {
  115181. err = sp_384_to_mp(r, rm);
  115182. }
  115183. if (err == MP_OKAY) {
  115184. err = sp_384_to_mp(s, sm);
  115185. }
  115186. #ifdef WOLFSSL_SP_SMALL_STACK
  115187. if (e != NULL)
  115188. #endif
  115189. {
  115190. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 12);
  115191. #ifdef WOLFSSL_SP_SMALL_STACK
  115192. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  115193. #endif
  115194. }
  115195. #ifdef WOLFSSL_SP_SMALL_STACK
  115196. if (point != NULL)
  115197. #endif
  115198. {
  115199. ForceZero(point, sizeof(sp_point_384));
  115200. #ifdef WOLFSSL_SP_SMALL_STACK
  115201. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  115202. #endif
  115203. }
  115204. return err;
  115205. }
  115206. #ifdef WOLFSSL_SP_NONBLOCK
  115207. typedef struct sp_ecc_sign_384_ctx {
  115208. int state;
  115209. union {
  115210. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  115211. sp_384_mont_inv_order_12_ctx mont_inv_order_ctx;
  115212. };
  115213. sp_digit e[2*12];
  115214. sp_digit x[2*12];
  115215. sp_digit k[2*12];
  115216. sp_digit r[2*12];
  115217. sp_digit tmp[3 * 2*12];
  115218. sp_point_384 point;
  115219. sp_digit* s;
  115220. sp_digit* kInv;
  115221. int i;
  115222. } sp_ecc_sign_384_ctx;
  115223. int sp_ecc_sign_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  115224. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  115225. {
  115226. int err = FP_WOULDBLOCK;
  115227. sp_ecc_sign_384_ctx* ctx = (sp_ecc_sign_384_ctx*)sp_ctx->data;
  115228. typedef char ctx_size_test[sizeof(sp_ecc_sign_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  115229. (void)sizeof(ctx_size_test);
  115230. switch (ctx->state) {
  115231. case 0: /* INIT */
  115232. ctx->s = ctx->e;
  115233. ctx->kInv = ctx->k;
  115234. ctx->i = SP_ECC_MAX_SIG_GEN;
  115235. ctx->state = 1;
  115236. break;
  115237. case 1: /* GEN */
  115238. /* New random point. */
  115239. if (km == NULL || mp_iszero(km)) {
  115240. err = sp_384_ecc_gen_k_12(rng, ctx->k);
  115241. }
  115242. else {
  115243. sp_384_from_mp(ctx->k, 12, km);
  115244. mp_zero(km);
  115245. }
  115246. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  115247. ctx->state = 2;
  115248. break;
  115249. case 2: /* MULMOD */
  115250. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  115251. &ctx->point, &p384_base, ctx->k, 1, 1, heap);
  115252. if (err == MP_OKAY) {
  115253. ctx->state = 3;
  115254. }
  115255. break;
  115256. case 3: /* MODORDER */
  115257. {
  115258. sp_int32 c;
  115259. /* r = point->x mod order */
  115260. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 12U);
  115261. sp_384_norm_12(ctx->r);
  115262. c = sp_384_cmp_12(ctx->r, p384_order);
  115263. sp_384_cond_sub_12(ctx->r, ctx->r, p384_order,
  115264. (sp_digit)0 - (sp_digit)(c >= 0));
  115265. sp_384_norm_12(ctx->r);
  115266. if (hashLen > 48U) {
  115267. hashLen = 48U;
  115268. }
  115269. sp_384_from_mp(ctx->x, 12, priv);
  115270. sp_384_from_bin(ctx->e, 12, hash, (int)hashLen);
  115271. ctx->state = 4;
  115272. break;
  115273. }
  115274. case 4: /* KMODORDER */
  115275. /* Conv k to Montgomery form (mod order) */
  115276. sp_384_mul_12(ctx->k, ctx->k, p384_norm_order);
  115277. err = sp_384_mod_12(ctx->k, ctx->k, p384_order);
  115278. if (err == MP_OKAY) {
  115279. sp_384_norm_12(ctx->k);
  115280. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  115281. ctx->state = 5;
  115282. }
  115283. break;
  115284. case 5: /* KINV */
  115285. /* kInv = 1/k mod order */
  115286. err = sp_384_mont_inv_order_12_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  115287. if (err == MP_OKAY) {
  115288. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  115289. ctx->state = 6;
  115290. }
  115291. break;
  115292. case 6: /* KINVNORM */
  115293. sp_384_norm_12(ctx->kInv);
  115294. ctx->state = 7;
  115295. break;
  115296. case 7: /* R */
  115297. /* s = r * x + e */
  115298. sp_384_mul_12(ctx->x, ctx->x, ctx->r);
  115299. ctx->state = 8;
  115300. break;
  115301. case 8: /* S1 */
  115302. err = sp_384_mod_12(ctx->x, ctx->x, p384_order);
  115303. if (err == MP_OKAY)
  115304. ctx->state = 9;
  115305. break;
  115306. case 9: /* S2 */
  115307. {
  115308. sp_digit carry;
  115309. sp_int32 c;
  115310. sp_384_norm_12(ctx->x);
  115311. carry = sp_384_add_12(ctx->s, ctx->e, ctx->x);
  115312. sp_384_cond_sub_12(ctx->s, ctx->s,
  115313. p384_order, 0 - carry);
  115314. sp_384_norm_12(ctx->s);
  115315. c = sp_384_cmp_12(ctx->s, p384_order);
  115316. sp_384_cond_sub_12(ctx->s, ctx->s, p384_order,
  115317. (sp_digit)0 - (sp_digit)(c >= 0));
  115318. sp_384_norm_12(ctx->s);
  115319. /* s = s * k^-1 mod order */
  115320. sp_384_mont_mul_order_12(ctx->s, ctx->s, ctx->kInv);
  115321. sp_384_norm_12(ctx->s);
  115322. /* Check that signature is usable. */
  115323. if (sp_384_iszero_12(ctx->s) == 0) {
  115324. ctx->state = 10;
  115325. break;
  115326. }
  115327. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  115328. ctx->i = 1;
  115329. #endif
  115330. /* not usable gen, try again */
  115331. ctx->i--;
  115332. if (ctx->i == 0) {
  115333. err = RNG_FAILURE_E;
  115334. }
  115335. ctx->state = 1;
  115336. break;
  115337. }
  115338. case 10: /* RES */
  115339. err = sp_384_to_mp(ctx->r, rm);
  115340. if (err == MP_OKAY) {
  115341. err = sp_384_to_mp(ctx->s, sm);
  115342. }
  115343. break;
  115344. }
  115345. if (err == MP_OKAY && ctx->state != 10) {
  115346. err = FP_WOULDBLOCK;
  115347. }
  115348. if (err != FP_WOULDBLOCK) {
  115349. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 12U);
  115350. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 12U);
  115351. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 12U);
  115352. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 12U);
  115353. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 12U);
  115354. }
  115355. return err;
  115356. }
  115357. #endif /* WOLFSSL_SP_NONBLOCK */
  115358. #endif /* HAVE_ECC_SIGN */
  115359. #ifndef WOLFSSL_SP_SMALL
  115360. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  115361. *
  115362. * r Result of division by 2.
  115363. * a Number to divide.
  115364. * m Modulus.
  115365. */
  115366. static void sp_384_div2_mod_12(sp_digit* r, const sp_digit* a,
  115367. const sp_digit* m)
  115368. {
  115369. __asm__ __volatile__ (
  115370. "ldr r3, [%[a]]\n\t"
  115371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115372. "lsls r3, r3, #31\n\t"
  115373. #else
  115374. "lsl r3, r3, #31\n\t"
  115375. #endif
  115376. "beq L_sp_384_div2_mod_12_no_add_%=\n\t"
  115377. "ldr r4, [%[a]]\n\t"
  115378. "ldr r5, [%[a], #4]\n\t"
  115379. "ldr r6, [%[m]]\n\t"
  115380. "ldr r7, [%[m], #4]\n\t"
  115381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115382. "adds r4, r4, r6\n\t"
  115383. #else
  115384. "add r4, r4, r6\n\t"
  115385. #endif
  115386. #ifdef WOLFSSL_KEIL
  115387. "adcs r5, r5, r7\n\t"
  115388. #elif defined(__clang__)
  115389. "adcs r5, r7\n\t"
  115390. #else
  115391. "adc r5, r7\n\t"
  115392. #endif
  115393. "str r4, [%[r]]\n\t"
  115394. "str r5, [%[r], #4]\n\t"
  115395. "ldr r4, [%[a], #8]\n\t"
  115396. "ldr r5, [%[a], #12]\n\t"
  115397. "ldr r6, [%[m], #8]\n\t"
  115398. "ldr r7, [%[m], #12]\n\t"
  115399. #ifdef WOLFSSL_KEIL
  115400. "adcs r4, r4, r6\n\t"
  115401. #elif defined(__clang__)
  115402. "adcs r4, r6\n\t"
  115403. #else
  115404. "adc r4, r6\n\t"
  115405. #endif
  115406. #ifdef WOLFSSL_KEIL
  115407. "adcs r5, r5, r7\n\t"
  115408. #elif defined(__clang__)
  115409. "adcs r5, r7\n\t"
  115410. #else
  115411. "adc r5, r7\n\t"
  115412. #endif
  115413. "str r4, [%[r], #8]\n\t"
  115414. "str r5, [%[r], #12]\n\t"
  115415. "ldr r4, [%[a], #16]\n\t"
  115416. "ldr r5, [%[a], #20]\n\t"
  115417. "ldr r6, [%[m], #16]\n\t"
  115418. "ldr r7, [%[m], #20]\n\t"
  115419. #ifdef WOLFSSL_KEIL
  115420. "adcs r4, r4, r6\n\t"
  115421. #elif defined(__clang__)
  115422. "adcs r4, r6\n\t"
  115423. #else
  115424. "adc r4, r6\n\t"
  115425. #endif
  115426. #ifdef WOLFSSL_KEIL
  115427. "adcs r5, r5, r7\n\t"
  115428. #elif defined(__clang__)
  115429. "adcs r5, r7\n\t"
  115430. #else
  115431. "adc r5, r7\n\t"
  115432. #endif
  115433. "str r4, [%[r], #16]\n\t"
  115434. "str r5, [%[r], #20]\n\t"
  115435. "ldr r4, [%[a], #24]\n\t"
  115436. "ldr r5, [%[a], #28]\n\t"
  115437. "ldr r6, [%[m], #24]\n\t"
  115438. "ldr r7, [%[m], #28]\n\t"
  115439. #ifdef WOLFSSL_KEIL
  115440. "adcs r4, r4, r6\n\t"
  115441. #elif defined(__clang__)
  115442. "adcs r4, r6\n\t"
  115443. #else
  115444. "adc r4, r6\n\t"
  115445. #endif
  115446. #ifdef WOLFSSL_KEIL
  115447. "adcs r5, r5, r7\n\t"
  115448. #elif defined(__clang__)
  115449. "adcs r5, r7\n\t"
  115450. #else
  115451. "adc r5, r7\n\t"
  115452. #endif
  115453. "str r4, [%[r], #24]\n\t"
  115454. "str r5, [%[r], #28]\n\t"
  115455. "ldr r4, [%[a], #32]\n\t"
  115456. "ldr r5, [%[a], #36]\n\t"
  115457. "ldr r6, [%[m], #32]\n\t"
  115458. "ldr r7, [%[m], #36]\n\t"
  115459. #ifdef WOLFSSL_KEIL
  115460. "adcs r4, r4, r6\n\t"
  115461. #elif defined(__clang__)
  115462. "adcs r4, r6\n\t"
  115463. #else
  115464. "adc r4, r6\n\t"
  115465. #endif
  115466. #ifdef WOLFSSL_KEIL
  115467. "adcs r5, r5, r7\n\t"
  115468. #elif defined(__clang__)
  115469. "adcs r5, r7\n\t"
  115470. #else
  115471. "adc r5, r7\n\t"
  115472. #endif
  115473. "str r4, [%[r], #32]\n\t"
  115474. "str r5, [%[r], #36]\n\t"
  115475. "ldr r4, [%[a], #40]\n\t"
  115476. "ldr r5, [%[a], #44]\n\t"
  115477. "ldr r6, [%[m], #40]\n\t"
  115478. "ldr r7, [%[m], #44]\n\t"
  115479. #ifdef WOLFSSL_KEIL
  115480. "adcs r4, r4, r6\n\t"
  115481. #elif defined(__clang__)
  115482. "adcs r4, r6\n\t"
  115483. #else
  115484. "adc r4, r6\n\t"
  115485. #endif
  115486. #ifdef WOLFSSL_KEIL
  115487. "adcs r5, r5, r7\n\t"
  115488. #elif defined(__clang__)
  115489. "adcs r5, r7\n\t"
  115490. #else
  115491. "adc r5, r7\n\t"
  115492. #endif
  115493. "str r4, [%[r], #40]\n\t"
  115494. "str r5, [%[r], #44]\n\t"
  115495. "movs r3, #0\n\t"
  115496. #ifdef WOLFSSL_KEIL
  115497. "adcs r3, r3, r3\n\t"
  115498. #elif defined(__clang__)
  115499. "adcs r3, r3\n\t"
  115500. #else
  115501. "adc r3, r3\n\t"
  115502. #endif
  115503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115504. "lsls r3, r3, #31\n\t"
  115505. #else
  115506. "lsl r3, r3, #31\n\t"
  115507. #endif
  115508. "b L_sp_384_div2_mod_12_div2_%=\n\t"
  115509. "\n"
  115510. "L_sp_384_div2_mod_12_no_add_%=:\n\t"
  115511. "ldr r4, [%[a]]\n\t"
  115512. "ldr r5, [%[a], #4]\n\t"
  115513. "str r4, [%[r]]\n\t"
  115514. "str r5, [%[r], #4]\n\t"
  115515. "ldr r4, [%[a], #8]\n\t"
  115516. "ldr r5, [%[a], #12]\n\t"
  115517. "str r4, [%[r], #8]\n\t"
  115518. "str r5, [%[r], #12]\n\t"
  115519. "ldr r4, [%[a], #16]\n\t"
  115520. "ldr r5, [%[a], #20]\n\t"
  115521. "str r4, [%[r], #16]\n\t"
  115522. "str r5, [%[r], #20]\n\t"
  115523. "ldr r4, [%[a], #24]\n\t"
  115524. "ldr r5, [%[a], #28]\n\t"
  115525. "str r4, [%[r], #24]\n\t"
  115526. "str r5, [%[r], #28]\n\t"
  115527. "ldr r4, [%[a], #32]\n\t"
  115528. "ldr r5, [%[a], #36]\n\t"
  115529. "str r4, [%[r], #32]\n\t"
  115530. "str r5, [%[r], #36]\n\t"
  115531. "ldr r4, [%[a], #40]\n\t"
  115532. "ldr r5, [%[a], #44]\n\t"
  115533. "str r4, [%[r], #40]\n\t"
  115534. "str r5, [%[r], #44]\n\t"
  115535. "\n"
  115536. "L_sp_384_div2_mod_12_div2_%=:\n\t"
  115537. "ldr r4, [%[r]]\n\t"
  115538. "ldr r5, [%[r], #4]\n\t"
  115539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115540. "lsrs r4, r4, #1\n\t"
  115541. #else
  115542. "lsr r4, r4, #1\n\t"
  115543. #endif
  115544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115545. "lsls r6, r5, #31\n\t"
  115546. #else
  115547. "lsl r6, r5, #31\n\t"
  115548. #endif
  115549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115550. "lsrs r5, r5, #1\n\t"
  115551. #else
  115552. "lsr r5, r5, #1\n\t"
  115553. #endif
  115554. #ifdef WOLFSSL_KEIL
  115555. "orrs r4, r4, r6\n\t"
  115556. #elif defined(__clang__)
  115557. "orrs r4, r6\n\t"
  115558. #else
  115559. "orr r4, r6\n\t"
  115560. #endif
  115561. "ldr r7, [%[r], #8]\n\t"
  115562. "str r4, [%[r]]\n\t"
  115563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115564. "lsls r6, r7, #31\n\t"
  115565. #else
  115566. "lsl r6, r7, #31\n\t"
  115567. #endif
  115568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115569. "lsrs r7, r7, #1\n\t"
  115570. #else
  115571. "lsr r7, r7, #1\n\t"
  115572. #endif
  115573. #ifdef WOLFSSL_KEIL
  115574. "orrs r5, r5, r6\n\t"
  115575. #elif defined(__clang__)
  115576. "orrs r5, r6\n\t"
  115577. #else
  115578. "orr r5, r6\n\t"
  115579. #endif
  115580. "ldr r4, [%[r], #12]\n\t"
  115581. "str r5, [%[r], #4]\n\t"
  115582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115583. "lsls r6, r4, #31\n\t"
  115584. #else
  115585. "lsl r6, r4, #31\n\t"
  115586. #endif
  115587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115588. "lsrs r4, r4, #1\n\t"
  115589. #else
  115590. "lsr r4, r4, #1\n\t"
  115591. #endif
  115592. #ifdef WOLFSSL_KEIL
  115593. "orrs r7, r7, r6\n\t"
  115594. #elif defined(__clang__)
  115595. "orrs r7, r6\n\t"
  115596. #else
  115597. "orr r7, r6\n\t"
  115598. #endif
  115599. "ldr r5, [%[r], #16]\n\t"
  115600. "str r7, [%[r], #8]\n\t"
  115601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115602. "lsls r6, r5, #31\n\t"
  115603. #else
  115604. "lsl r6, r5, #31\n\t"
  115605. #endif
  115606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115607. "lsrs r5, r5, #1\n\t"
  115608. #else
  115609. "lsr r5, r5, #1\n\t"
  115610. #endif
  115611. #ifdef WOLFSSL_KEIL
  115612. "orrs r4, r4, r6\n\t"
  115613. #elif defined(__clang__)
  115614. "orrs r4, r6\n\t"
  115615. #else
  115616. "orr r4, r6\n\t"
  115617. #endif
  115618. "ldr r7, [%[r], #20]\n\t"
  115619. "str r4, [%[r], #12]\n\t"
  115620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115621. "lsls r6, r7, #31\n\t"
  115622. #else
  115623. "lsl r6, r7, #31\n\t"
  115624. #endif
  115625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115626. "lsrs r7, r7, #1\n\t"
  115627. #else
  115628. "lsr r7, r7, #1\n\t"
  115629. #endif
  115630. #ifdef WOLFSSL_KEIL
  115631. "orrs r5, r5, r6\n\t"
  115632. #elif defined(__clang__)
  115633. "orrs r5, r6\n\t"
  115634. #else
  115635. "orr r5, r6\n\t"
  115636. #endif
  115637. "ldr r4, [%[r], #24]\n\t"
  115638. "str r5, [%[r], #16]\n\t"
  115639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115640. "lsls r6, r4, #31\n\t"
  115641. #else
  115642. "lsl r6, r4, #31\n\t"
  115643. #endif
  115644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115645. "lsrs r4, r4, #1\n\t"
  115646. #else
  115647. "lsr r4, r4, #1\n\t"
  115648. #endif
  115649. #ifdef WOLFSSL_KEIL
  115650. "orrs r7, r7, r6\n\t"
  115651. #elif defined(__clang__)
  115652. "orrs r7, r6\n\t"
  115653. #else
  115654. "orr r7, r6\n\t"
  115655. #endif
  115656. "ldr r5, [%[r], #28]\n\t"
  115657. "str r7, [%[r], #20]\n\t"
  115658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115659. "lsls r6, r5, #31\n\t"
  115660. #else
  115661. "lsl r6, r5, #31\n\t"
  115662. #endif
  115663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115664. "lsrs r5, r5, #1\n\t"
  115665. #else
  115666. "lsr r5, r5, #1\n\t"
  115667. #endif
  115668. #ifdef WOLFSSL_KEIL
  115669. "orrs r4, r4, r6\n\t"
  115670. #elif defined(__clang__)
  115671. "orrs r4, r6\n\t"
  115672. #else
  115673. "orr r4, r6\n\t"
  115674. #endif
  115675. "ldr r7, [%[r], #32]\n\t"
  115676. "str r4, [%[r], #24]\n\t"
  115677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115678. "lsls r6, r7, #31\n\t"
  115679. #else
  115680. "lsl r6, r7, #31\n\t"
  115681. #endif
  115682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115683. "lsrs r7, r7, #1\n\t"
  115684. #else
  115685. "lsr r7, r7, #1\n\t"
  115686. #endif
  115687. #ifdef WOLFSSL_KEIL
  115688. "orrs r5, r5, r6\n\t"
  115689. #elif defined(__clang__)
  115690. "orrs r5, r6\n\t"
  115691. #else
  115692. "orr r5, r6\n\t"
  115693. #endif
  115694. "ldr r4, [%[r], #36]\n\t"
  115695. "str r5, [%[r], #28]\n\t"
  115696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115697. "lsls r6, r4, #31\n\t"
  115698. #else
  115699. "lsl r6, r4, #31\n\t"
  115700. #endif
  115701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115702. "lsrs r4, r4, #1\n\t"
  115703. #else
  115704. "lsr r4, r4, #1\n\t"
  115705. #endif
  115706. #ifdef WOLFSSL_KEIL
  115707. "orrs r7, r7, r6\n\t"
  115708. #elif defined(__clang__)
  115709. "orrs r7, r6\n\t"
  115710. #else
  115711. "orr r7, r6\n\t"
  115712. #endif
  115713. "ldr r5, [%[r], #40]\n\t"
  115714. "str r7, [%[r], #32]\n\t"
  115715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115716. "lsls r6, r5, #31\n\t"
  115717. #else
  115718. "lsl r6, r5, #31\n\t"
  115719. #endif
  115720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115721. "lsrs r5, r5, #1\n\t"
  115722. #else
  115723. "lsr r5, r5, #1\n\t"
  115724. #endif
  115725. #ifdef WOLFSSL_KEIL
  115726. "orrs r4, r4, r6\n\t"
  115727. #elif defined(__clang__)
  115728. "orrs r4, r6\n\t"
  115729. #else
  115730. "orr r4, r6\n\t"
  115731. #endif
  115732. "ldr r7, [%[r], #44]\n\t"
  115733. "str r4, [%[r], #36]\n\t"
  115734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115735. "lsls r6, r7, #31\n\t"
  115736. #else
  115737. "lsl r6, r7, #31\n\t"
  115738. #endif
  115739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115740. "lsrs r7, r7, #1\n\t"
  115741. #else
  115742. "lsr r7, r7, #1\n\t"
  115743. #endif
  115744. #ifdef WOLFSSL_KEIL
  115745. "orrs r5, r5, r6\n\t"
  115746. #elif defined(__clang__)
  115747. "orrs r5, r6\n\t"
  115748. #else
  115749. "orr r5, r6\n\t"
  115750. #endif
  115751. #ifdef WOLFSSL_KEIL
  115752. "orrs r7, r7, r3\n\t"
  115753. #elif defined(__clang__)
  115754. "orrs r7, r3\n\t"
  115755. #else
  115756. "orr r7, r3\n\t"
  115757. #endif
  115758. "str r5, [%[r], #40]\n\t"
  115759. "str r7, [%[r], #44]\n\t"
  115760. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  115761. :
  115762. : "memory", "r3", "r4", "r5", "r6", "r7"
  115763. );
  115764. }
  115765. static int sp_384_num_bits_12(sp_digit* a)
  115766. {
  115767. static const byte sp_num_bits_table[256] = {
  115768. 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
  115769. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  115770. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  115771. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  115772. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  115773. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  115774. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  115775. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  115776. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115777. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115778. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115779. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115780. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115781. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115782. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115783. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115784. };
  115785. const byte* table = sp_num_bits_table;
  115786. __asm__ __volatile__ (
  115787. "movs r6, #0xff\n\t"
  115788. "ldr r3, [%[a], #44]\n\t"
  115789. "cmp r3, #0\n\t"
  115790. "beq L_sp_384_num_bits_12_11_%=\n\t"
  115791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115792. "lsrs r5, r3, #24\n\t"
  115793. #else
  115794. "lsr r5, r3, #24\n\t"
  115795. #endif
  115796. "cmp r5, #0\n\t"
  115797. "beq L_sp_384_num_bits_12_133_%=\n\t"
  115798. "movs r2, #0xff\n\t"
  115799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115800. "adds r2, r2, #0x79\n\t"
  115801. #else
  115802. "add r2, r2, #0x79\n\t"
  115803. #endif
  115804. "ldrb r4, [%[table], r5]\n\t"
  115805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115806. "adds r2, r2, r4\n\t"
  115807. #else
  115808. "add r2, r2, r4\n\t"
  115809. #endif
  115810. "b L_sp_384_num_bits_12_13_%=\n\t"
  115811. "\n"
  115812. "L_sp_384_num_bits_12_133_%=:\n\t"
  115813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115814. "lsrs r5, r3, #16\n\t"
  115815. #else
  115816. "lsr r5, r3, #16\n\t"
  115817. #endif
  115818. #ifdef WOLFSSL_KEIL
  115819. "ands r5, r5, r6\n\t"
  115820. #elif defined(__clang__)
  115821. "ands r5, r6\n\t"
  115822. #else
  115823. "and r5, r6\n\t"
  115824. #endif
  115825. "cmp r5, #0\n\t"
  115826. "beq L_sp_384_num_bits_12_132_%=\n\t"
  115827. "movs r2, #0xff\n\t"
  115828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115829. "adds r2, r2, #0x71\n\t"
  115830. #else
  115831. "add r2, r2, #0x71\n\t"
  115832. #endif
  115833. "ldrb r4, [%[table], r5]\n\t"
  115834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115835. "adds r2, r2, r4\n\t"
  115836. #else
  115837. "add r2, r2, r4\n\t"
  115838. #endif
  115839. "b L_sp_384_num_bits_12_13_%=\n\t"
  115840. "\n"
  115841. "L_sp_384_num_bits_12_132_%=:\n\t"
  115842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115843. "lsrs r5, r3, #8\n\t"
  115844. #else
  115845. "lsr r5, r3, #8\n\t"
  115846. #endif
  115847. #ifdef WOLFSSL_KEIL
  115848. "ands r5, r5, r6\n\t"
  115849. #elif defined(__clang__)
  115850. "ands r5, r6\n\t"
  115851. #else
  115852. "and r5, r6\n\t"
  115853. #endif
  115854. "cmp r5, #0\n\t"
  115855. "beq L_sp_384_num_bits_12_131_%=\n\t"
  115856. "movs r2, #0xff\n\t"
  115857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115858. "adds r2, r2, #0x69\n\t"
  115859. #else
  115860. "add r2, r2, #0x69\n\t"
  115861. #endif
  115862. "ldrb r4, [%[table], r5]\n\t"
  115863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115864. "adds r2, r2, r4\n\t"
  115865. #else
  115866. "add r2, r2, r4\n\t"
  115867. #endif
  115868. "b L_sp_384_num_bits_12_13_%=\n\t"
  115869. "\n"
  115870. "L_sp_384_num_bits_12_131_%=:\n\t"
  115871. "movs r5, r3\n\t"
  115872. #ifdef WOLFSSL_KEIL
  115873. "ands r5, r5, r6\n\t"
  115874. #elif defined(__clang__)
  115875. "ands r5, r6\n\t"
  115876. #else
  115877. "and r5, r6\n\t"
  115878. #endif
  115879. "cmp r5, #0\n\t"
  115880. "beq L_sp_384_num_bits_12_130_%=\n\t"
  115881. "movs r2, #0xff\n\t"
  115882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115883. "adds r2, r2, #0x61\n\t"
  115884. #else
  115885. "add r2, r2, #0x61\n\t"
  115886. #endif
  115887. "ldrb r4, [%[table], r5]\n\t"
  115888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115889. "adds r2, r2, r4\n\t"
  115890. #else
  115891. "add r2, r2, r4\n\t"
  115892. #endif
  115893. "b L_sp_384_num_bits_12_13_%=\n\t"
  115894. "\n"
  115895. "L_sp_384_num_bits_12_130_%=:\n\t"
  115896. "b L_sp_384_num_bits_12_13_%=\n\t"
  115897. "\n"
  115898. "L_sp_384_num_bits_12_11_%=:\n\t"
  115899. "ldr r3, [%[a], #40]\n\t"
  115900. "cmp r3, #0\n\t"
  115901. "beq L_sp_384_num_bits_12_10_%=\n\t"
  115902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115903. "lsrs r5, r3, #24\n\t"
  115904. #else
  115905. "lsr r5, r3, #24\n\t"
  115906. #endif
  115907. "cmp r5, #0\n\t"
  115908. "beq L_sp_384_num_bits_12_123_%=\n\t"
  115909. "movs r2, #0xff\n\t"
  115910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115911. "adds r2, r2, #0x59\n\t"
  115912. #else
  115913. "add r2, r2, #0x59\n\t"
  115914. #endif
  115915. "ldrb r4, [%[table], r5]\n\t"
  115916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115917. "adds r2, r2, r4\n\t"
  115918. #else
  115919. "add r2, r2, r4\n\t"
  115920. #endif
  115921. "b L_sp_384_num_bits_12_13_%=\n\t"
  115922. "\n"
  115923. "L_sp_384_num_bits_12_123_%=:\n\t"
  115924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115925. "lsrs r5, r3, #16\n\t"
  115926. #else
  115927. "lsr r5, r3, #16\n\t"
  115928. #endif
  115929. #ifdef WOLFSSL_KEIL
  115930. "ands r5, r5, r6\n\t"
  115931. #elif defined(__clang__)
  115932. "ands r5, r6\n\t"
  115933. #else
  115934. "and r5, r6\n\t"
  115935. #endif
  115936. "cmp r5, #0\n\t"
  115937. "beq L_sp_384_num_bits_12_122_%=\n\t"
  115938. "movs r2, #0xff\n\t"
  115939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115940. "adds r2, r2, #0x51\n\t"
  115941. #else
  115942. "add r2, r2, #0x51\n\t"
  115943. #endif
  115944. "ldrb r4, [%[table], r5]\n\t"
  115945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115946. "adds r2, r2, r4\n\t"
  115947. #else
  115948. "add r2, r2, r4\n\t"
  115949. #endif
  115950. "b L_sp_384_num_bits_12_13_%=\n\t"
  115951. "\n"
  115952. "L_sp_384_num_bits_12_122_%=:\n\t"
  115953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115954. "lsrs r5, r3, #8\n\t"
  115955. #else
  115956. "lsr r5, r3, #8\n\t"
  115957. #endif
  115958. #ifdef WOLFSSL_KEIL
  115959. "ands r5, r5, r6\n\t"
  115960. #elif defined(__clang__)
  115961. "ands r5, r6\n\t"
  115962. #else
  115963. "and r5, r6\n\t"
  115964. #endif
  115965. "cmp r5, #0\n\t"
  115966. "beq L_sp_384_num_bits_12_121_%=\n\t"
  115967. "movs r2, #0xff\n\t"
  115968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115969. "adds r2, r2, #0x49\n\t"
  115970. #else
  115971. "add r2, r2, #0x49\n\t"
  115972. #endif
  115973. "ldrb r4, [%[table], r5]\n\t"
  115974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115975. "adds r2, r2, r4\n\t"
  115976. #else
  115977. "add r2, r2, r4\n\t"
  115978. #endif
  115979. "b L_sp_384_num_bits_12_13_%=\n\t"
  115980. "\n"
  115981. "L_sp_384_num_bits_12_121_%=:\n\t"
  115982. "movs r5, r3\n\t"
  115983. #ifdef WOLFSSL_KEIL
  115984. "ands r5, r5, r6\n\t"
  115985. #elif defined(__clang__)
  115986. "ands r5, r6\n\t"
  115987. #else
  115988. "and r5, r6\n\t"
  115989. #endif
  115990. "cmp r5, #0\n\t"
  115991. "beq L_sp_384_num_bits_12_120_%=\n\t"
  115992. "movs r2, #0xff\n\t"
  115993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115994. "adds r2, r2, #0x41\n\t"
  115995. #else
  115996. "add r2, r2, #0x41\n\t"
  115997. #endif
  115998. "ldrb r4, [%[table], r5]\n\t"
  115999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116000. "adds r2, r2, r4\n\t"
  116001. #else
  116002. "add r2, r2, r4\n\t"
  116003. #endif
  116004. "b L_sp_384_num_bits_12_13_%=\n\t"
  116005. "\n"
  116006. "L_sp_384_num_bits_12_120_%=:\n\t"
  116007. "b L_sp_384_num_bits_12_13_%=\n\t"
  116008. "\n"
  116009. "L_sp_384_num_bits_12_10_%=:\n\t"
  116010. "ldr r3, [%[a], #36]\n\t"
  116011. "cmp r3, #0\n\t"
  116012. "beq L_sp_384_num_bits_12_9_%=\n\t"
  116013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116014. "lsrs r5, r3, #24\n\t"
  116015. #else
  116016. "lsr r5, r3, #24\n\t"
  116017. #endif
  116018. "cmp r5, #0\n\t"
  116019. "beq L_sp_384_num_bits_12_113_%=\n\t"
  116020. "movs r2, #0xff\n\t"
  116021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116022. "adds r2, r2, #57\n\t"
  116023. #else
  116024. "add r2, r2, #57\n\t"
  116025. #endif
  116026. "ldrb r4, [%[table], r5]\n\t"
  116027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116028. "adds r2, r2, r4\n\t"
  116029. #else
  116030. "add r2, r2, r4\n\t"
  116031. #endif
  116032. "b L_sp_384_num_bits_12_13_%=\n\t"
  116033. "\n"
  116034. "L_sp_384_num_bits_12_113_%=:\n\t"
  116035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116036. "lsrs r5, r3, #16\n\t"
  116037. #else
  116038. "lsr r5, r3, #16\n\t"
  116039. #endif
  116040. #ifdef WOLFSSL_KEIL
  116041. "ands r5, r5, r6\n\t"
  116042. #elif defined(__clang__)
  116043. "ands r5, r6\n\t"
  116044. #else
  116045. "and r5, r6\n\t"
  116046. #endif
  116047. "cmp r5, #0\n\t"
  116048. "beq L_sp_384_num_bits_12_112_%=\n\t"
  116049. "movs r2, #0xff\n\t"
  116050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116051. "adds r2, r2, #49\n\t"
  116052. #else
  116053. "add r2, r2, #49\n\t"
  116054. #endif
  116055. "ldrb r4, [%[table], r5]\n\t"
  116056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116057. "adds r2, r2, r4\n\t"
  116058. #else
  116059. "add r2, r2, r4\n\t"
  116060. #endif
  116061. "b L_sp_384_num_bits_12_13_%=\n\t"
  116062. "\n"
  116063. "L_sp_384_num_bits_12_112_%=:\n\t"
  116064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116065. "lsrs r5, r3, #8\n\t"
  116066. #else
  116067. "lsr r5, r3, #8\n\t"
  116068. #endif
  116069. #ifdef WOLFSSL_KEIL
  116070. "ands r5, r5, r6\n\t"
  116071. #elif defined(__clang__)
  116072. "ands r5, r6\n\t"
  116073. #else
  116074. "and r5, r6\n\t"
  116075. #endif
  116076. "cmp r5, #0\n\t"
  116077. "beq L_sp_384_num_bits_12_111_%=\n\t"
  116078. "movs r2, #0xff\n\t"
  116079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116080. "adds r2, r2, #41\n\t"
  116081. #else
  116082. "add r2, r2, #41\n\t"
  116083. #endif
  116084. "ldrb r4, [%[table], r5]\n\t"
  116085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116086. "adds r2, r2, r4\n\t"
  116087. #else
  116088. "add r2, r2, r4\n\t"
  116089. #endif
  116090. "b L_sp_384_num_bits_12_13_%=\n\t"
  116091. "\n"
  116092. "L_sp_384_num_bits_12_111_%=:\n\t"
  116093. "movs r5, r3\n\t"
  116094. #ifdef WOLFSSL_KEIL
  116095. "ands r5, r5, r6\n\t"
  116096. #elif defined(__clang__)
  116097. "ands r5, r6\n\t"
  116098. #else
  116099. "and r5, r6\n\t"
  116100. #endif
  116101. "cmp r5, #0\n\t"
  116102. "beq L_sp_384_num_bits_12_110_%=\n\t"
  116103. "movs r2, #0xff\n\t"
  116104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116105. "adds r2, r2, #33\n\t"
  116106. #else
  116107. "add r2, r2, #33\n\t"
  116108. #endif
  116109. "ldrb r4, [%[table], r5]\n\t"
  116110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116111. "adds r2, r2, r4\n\t"
  116112. #else
  116113. "add r2, r2, r4\n\t"
  116114. #endif
  116115. "b L_sp_384_num_bits_12_13_%=\n\t"
  116116. "\n"
  116117. "L_sp_384_num_bits_12_110_%=:\n\t"
  116118. "b L_sp_384_num_bits_12_13_%=\n\t"
  116119. "\n"
  116120. "L_sp_384_num_bits_12_9_%=:\n\t"
  116121. "ldr r3, [%[a], #32]\n\t"
  116122. "cmp r3, #0\n\t"
  116123. "beq L_sp_384_num_bits_12_8_%=\n\t"
  116124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116125. "lsrs r5, r3, #24\n\t"
  116126. #else
  116127. "lsr r5, r3, #24\n\t"
  116128. #endif
  116129. "cmp r5, #0\n\t"
  116130. "beq L_sp_384_num_bits_12_103_%=\n\t"
  116131. "movs r2, #0xff\n\t"
  116132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116133. "adds r2, r2, #25\n\t"
  116134. #else
  116135. "add r2, r2, #25\n\t"
  116136. #endif
  116137. "ldrb r4, [%[table], r5]\n\t"
  116138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116139. "adds r2, r2, r4\n\t"
  116140. #else
  116141. "add r2, r2, r4\n\t"
  116142. #endif
  116143. "b L_sp_384_num_bits_12_13_%=\n\t"
  116144. "\n"
  116145. "L_sp_384_num_bits_12_103_%=:\n\t"
  116146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116147. "lsrs r5, r3, #16\n\t"
  116148. #else
  116149. "lsr r5, r3, #16\n\t"
  116150. #endif
  116151. #ifdef WOLFSSL_KEIL
  116152. "ands r5, r5, r6\n\t"
  116153. #elif defined(__clang__)
  116154. "ands r5, r6\n\t"
  116155. #else
  116156. "and r5, r6\n\t"
  116157. #endif
  116158. "cmp r5, #0\n\t"
  116159. "beq L_sp_384_num_bits_12_102_%=\n\t"
  116160. "movs r2, #0xff\n\t"
  116161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116162. "adds r2, r2, #17\n\t"
  116163. #else
  116164. "add r2, r2, #17\n\t"
  116165. #endif
  116166. "ldrb r4, [%[table], r5]\n\t"
  116167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116168. "adds r2, r2, r4\n\t"
  116169. #else
  116170. "add r2, r2, r4\n\t"
  116171. #endif
  116172. "b L_sp_384_num_bits_12_13_%=\n\t"
  116173. "\n"
  116174. "L_sp_384_num_bits_12_102_%=:\n\t"
  116175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116176. "lsrs r5, r3, #8\n\t"
  116177. #else
  116178. "lsr r5, r3, #8\n\t"
  116179. #endif
  116180. #ifdef WOLFSSL_KEIL
  116181. "ands r5, r5, r6\n\t"
  116182. #elif defined(__clang__)
  116183. "ands r5, r6\n\t"
  116184. #else
  116185. "and r5, r6\n\t"
  116186. #endif
  116187. "cmp r5, #0\n\t"
  116188. "beq L_sp_384_num_bits_12_101_%=\n\t"
  116189. "movs r2, #0xff\n\t"
  116190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116191. "adds r2, r2, #9\n\t"
  116192. #else
  116193. "add r2, r2, #9\n\t"
  116194. #endif
  116195. "ldrb r4, [%[table], r5]\n\t"
  116196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116197. "adds r2, r2, r4\n\t"
  116198. #else
  116199. "add r2, r2, r4\n\t"
  116200. #endif
  116201. "b L_sp_384_num_bits_12_13_%=\n\t"
  116202. "\n"
  116203. "L_sp_384_num_bits_12_101_%=:\n\t"
  116204. "movs r5, r3\n\t"
  116205. #ifdef WOLFSSL_KEIL
  116206. "ands r5, r5, r6\n\t"
  116207. #elif defined(__clang__)
  116208. "ands r5, r6\n\t"
  116209. #else
  116210. "and r5, r6\n\t"
  116211. #endif
  116212. "cmp r5, #0\n\t"
  116213. "beq L_sp_384_num_bits_12_100_%=\n\t"
  116214. "movs r2, #0xff\n\t"
  116215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116216. "adds r2, r2, #1\n\t"
  116217. #else
  116218. "add r2, r2, #1\n\t"
  116219. #endif
  116220. "ldrb r4, [%[table], r5]\n\t"
  116221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116222. "adds r2, r2, r4\n\t"
  116223. #else
  116224. "add r2, r2, r4\n\t"
  116225. #endif
  116226. "b L_sp_384_num_bits_12_13_%=\n\t"
  116227. "\n"
  116228. "L_sp_384_num_bits_12_100_%=:\n\t"
  116229. "b L_sp_384_num_bits_12_13_%=\n\t"
  116230. "\n"
  116231. "L_sp_384_num_bits_12_8_%=:\n\t"
  116232. "ldr r3, [%[a], #28]\n\t"
  116233. "cmp r3, #0\n\t"
  116234. "beq L_sp_384_num_bits_12_7_%=\n\t"
  116235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116236. "lsrs r5, r3, #24\n\t"
  116237. #else
  116238. "lsr r5, r3, #24\n\t"
  116239. #endif
  116240. "cmp r5, #0\n\t"
  116241. "beq L_sp_384_num_bits_12_93_%=\n\t"
  116242. "movs r2, #0xf8\n\t"
  116243. "ldrb r4, [%[table], r5]\n\t"
  116244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116245. "adds r2, r2, r4\n\t"
  116246. #else
  116247. "add r2, r2, r4\n\t"
  116248. #endif
  116249. "b L_sp_384_num_bits_12_13_%=\n\t"
  116250. "\n"
  116251. "L_sp_384_num_bits_12_93_%=:\n\t"
  116252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116253. "lsrs r5, r3, #16\n\t"
  116254. #else
  116255. "lsr r5, r3, #16\n\t"
  116256. #endif
  116257. #ifdef WOLFSSL_KEIL
  116258. "ands r5, r5, r6\n\t"
  116259. #elif defined(__clang__)
  116260. "ands r5, r6\n\t"
  116261. #else
  116262. "and r5, r6\n\t"
  116263. #endif
  116264. "cmp r5, #0\n\t"
  116265. "beq L_sp_384_num_bits_12_92_%=\n\t"
  116266. "movs r2, #0xf0\n\t"
  116267. "ldrb r4, [%[table], r5]\n\t"
  116268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116269. "adds r2, r2, r4\n\t"
  116270. #else
  116271. "add r2, r2, r4\n\t"
  116272. #endif
  116273. "b L_sp_384_num_bits_12_13_%=\n\t"
  116274. "\n"
  116275. "L_sp_384_num_bits_12_92_%=:\n\t"
  116276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116277. "lsrs r5, r3, #8\n\t"
  116278. #else
  116279. "lsr r5, r3, #8\n\t"
  116280. #endif
  116281. #ifdef WOLFSSL_KEIL
  116282. "ands r5, r5, r6\n\t"
  116283. #elif defined(__clang__)
  116284. "ands r5, r6\n\t"
  116285. #else
  116286. "and r5, r6\n\t"
  116287. #endif
  116288. "cmp r5, #0\n\t"
  116289. "beq L_sp_384_num_bits_12_91_%=\n\t"
  116290. "movs r2, #0xe8\n\t"
  116291. "ldrb r4, [%[table], r5]\n\t"
  116292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116293. "adds r2, r2, r4\n\t"
  116294. #else
  116295. "add r2, r2, r4\n\t"
  116296. #endif
  116297. "b L_sp_384_num_bits_12_13_%=\n\t"
  116298. "\n"
  116299. "L_sp_384_num_bits_12_91_%=:\n\t"
  116300. "movs r5, r3\n\t"
  116301. #ifdef WOLFSSL_KEIL
  116302. "ands r5, r5, r6\n\t"
  116303. #elif defined(__clang__)
  116304. "ands r5, r6\n\t"
  116305. #else
  116306. "and r5, r6\n\t"
  116307. #endif
  116308. "cmp r5, #0\n\t"
  116309. "beq L_sp_384_num_bits_12_90_%=\n\t"
  116310. "movs r2, #0xe0\n\t"
  116311. "ldrb r4, [%[table], r5]\n\t"
  116312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116313. "adds r2, r2, r4\n\t"
  116314. #else
  116315. "add r2, r2, r4\n\t"
  116316. #endif
  116317. "b L_sp_384_num_bits_12_13_%=\n\t"
  116318. "\n"
  116319. "L_sp_384_num_bits_12_90_%=:\n\t"
  116320. "b L_sp_384_num_bits_12_13_%=\n\t"
  116321. "\n"
  116322. "L_sp_384_num_bits_12_7_%=:\n\t"
  116323. "ldr r3, [%[a], #24]\n\t"
  116324. "cmp r3, #0\n\t"
  116325. "beq L_sp_384_num_bits_12_6_%=\n\t"
  116326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116327. "lsrs r5, r3, #24\n\t"
  116328. #else
  116329. "lsr r5, r3, #24\n\t"
  116330. #endif
  116331. "cmp r5, #0\n\t"
  116332. "beq L_sp_384_num_bits_12_83_%=\n\t"
  116333. "movs r2, #0xd8\n\t"
  116334. "ldrb r4, [%[table], r5]\n\t"
  116335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116336. "adds r2, r2, r4\n\t"
  116337. #else
  116338. "add r2, r2, r4\n\t"
  116339. #endif
  116340. "b L_sp_384_num_bits_12_13_%=\n\t"
  116341. "\n"
  116342. "L_sp_384_num_bits_12_83_%=:\n\t"
  116343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116344. "lsrs r5, r3, #16\n\t"
  116345. #else
  116346. "lsr r5, r3, #16\n\t"
  116347. #endif
  116348. #ifdef WOLFSSL_KEIL
  116349. "ands r5, r5, r6\n\t"
  116350. #elif defined(__clang__)
  116351. "ands r5, r6\n\t"
  116352. #else
  116353. "and r5, r6\n\t"
  116354. #endif
  116355. "cmp r5, #0\n\t"
  116356. "beq L_sp_384_num_bits_12_82_%=\n\t"
  116357. "movs r2, #0xd0\n\t"
  116358. "ldrb r4, [%[table], r5]\n\t"
  116359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116360. "adds r2, r2, r4\n\t"
  116361. #else
  116362. "add r2, r2, r4\n\t"
  116363. #endif
  116364. "b L_sp_384_num_bits_12_13_%=\n\t"
  116365. "\n"
  116366. "L_sp_384_num_bits_12_82_%=:\n\t"
  116367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116368. "lsrs r5, r3, #8\n\t"
  116369. #else
  116370. "lsr r5, r3, #8\n\t"
  116371. #endif
  116372. #ifdef WOLFSSL_KEIL
  116373. "ands r5, r5, r6\n\t"
  116374. #elif defined(__clang__)
  116375. "ands r5, r6\n\t"
  116376. #else
  116377. "and r5, r6\n\t"
  116378. #endif
  116379. "cmp r5, #0\n\t"
  116380. "beq L_sp_384_num_bits_12_81_%=\n\t"
  116381. "movs r2, #0xc8\n\t"
  116382. "ldrb r4, [%[table], r5]\n\t"
  116383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116384. "adds r2, r2, r4\n\t"
  116385. #else
  116386. "add r2, r2, r4\n\t"
  116387. #endif
  116388. "b L_sp_384_num_bits_12_13_%=\n\t"
  116389. "\n"
  116390. "L_sp_384_num_bits_12_81_%=:\n\t"
  116391. "movs r5, r3\n\t"
  116392. #ifdef WOLFSSL_KEIL
  116393. "ands r5, r5, r6\n\t"
  116394. #elif defined(__clang__)
  116395. "ands r5, r6\n\t"
  116396. #else
  116397. "and r5, r6\n\t"
  116398. #endif
  116399. "cmp r5, #0\n\t"
  116400. "beq L_sp_384_num_bits_12_80_%=\n\t"
  116401. "movs r2, #0xc0\n\t"
  116402. "ldrb r4, [%[table], r5]\n\t"
  116403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116404. "adds r2, r2, r4\n\t"
  116405. #else
  116406. "add r2, r2, r4\n\t"
  116407. #endif
  116408. "b L_sp_384_num_bits_12_13_%=\n\t"
  116409. "\n"
  116410. "L_sp_384_num_bits_12_80_%=:\n\t"
  116411. "b L_sp_384_num_bits_12_13_%=\n\t"
  116412. "\n"
  116413. "L_sp_384_num_bits_12_6_%=:\n\t"
  116414. "ldr r3, [%[a], #20]\n\t"
  116415. "cmp r3, #0\n\t"
  116416. "beq L_sp_384_num_bits_12_5_%=\n\t"
  116417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116418. "lsrs r5, r3, #24\n\t"
  116419. #else
  116420. "lsr r5, r3, #24\n\t"
  116421. #endif
  116422. "cmp r5, #0\n\t"
  116423. "beq L_sp_384_num_bits_12_73_%=\n\t"
  116424. "movs r2, #0xb8\n\t"
  116425. "ldrb r4, [%[table], r5]\n\t"
  116426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116427. "adds r2, r2, r4\n\t"
  116428. #else
  116429. "add r2, r2, r4\n\t"
  116430. #endif
  116431. "b L_sp_384_num_bits_12_13_%=\n\t"
  116432. "\n"
  116433. "L_sp_384_num_bits_12_73_%=:\n\t"
  116434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116435. "lsrs r5, r3, #16\n\t"
  116436. #else
  116437. "lsr r5, r3, #16\n\t"
  116438. #endif
  116439. #ifdef WOLFSSL_KEIL
  116440. "ands r5, r5, r6\n\t"
  116441. #elif defined(__clang__)
  116442. "ands r5, r6\n\t"
  116443. #else
  116444. "and r5, r6\n\t"
  116445. #endif
  116446. "cmp r5, #0\n\t"
  116447. "beq L_sp_384_num_bits_12_72_%=\n\t"
  116448. "movs r2, #0xb0\n\t"
  116449. "ldrb r4, [%[table], r5]\n\t"
  116450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116451. "adds r2, r2, r4\n\t"
  116452. #else
  116453. "add r2, r2, r4\n\t"
  116454. #endif
  116455. "b L_sp_384_num_bits_12_13_%=\n\t"
  116456. "\n"
  116457. "L_sp_384_num_bits_12_72_%=:\n\t"
  116458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116459. "lsrs r5, r3, #8\n\t"
  116460. #else
  116461. "lsr r5, r3, #8\n\t"
  116462. #endif
  116463. #ifdef WOLFSSL_KEIL
  116464. "ands r5, r5, r6\n\t"
  116465. #elif defined(__clang__)
  116466. "ands r5, r6\n\t"
  116467. #else
  116468. "and r5, r6\n\t"
  116469. #endif
  116470. "cmp r5, #0\n\t"
  116471. "beq L_sp_384_num_bits_12_71_%=\n\t"
  116472. "movs r2, #0xa8\n\t"
  116473. "ldrb r4, [%[table], r5]\n\t"
  116474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116475. "adds r2, r2, r4\n\t"
  116476. #else
  116477. "add r2, r2, r4\n\t"
  116478. #endif
  116479. "b L_sp_384_num_bits_12_13_%=\n\t"
  116480. "\n"
  116481. "L_sp_384_num_bits_12_71_%=:\n\t"
  116482. "movs r5, r3\n\t"
  116483. #ifdef WOLFSSL_KEIL
  116484. "ands r5, r5, r6\n\t"
  116485. #elif defined(__clang__)
  116486. "ands r5, r6\n\t"
  116487. #else
  116488. "and r5, r6\n\t"
  116489. #endif
  116490. "cmp r5, #0\n\t"
  116491. "beq L_sp_384_num_bits_12_70_%=\n\t"
  116492. "movs r2, #0xa0\n\t"
  116493. "ldrb r4, [%[table], r5]\n\t"
  116494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116495. "adds r2, r2, r4\n\t"
  116496. #else
  116497. "add r2, r2, r4\n\t"
  116498. #endif
  116499. "b L_sp_384_num_bits_12_13_%=\n\t"
  116500. "\n"
  116501. "L_sp_384_num_bits_12_70_%=:\n\t"
  116502. "b L_sp_384_num_bits_12_13_%=\n\t"
  116503. "\n"
  116504. "L_sp_384_num_bits_12_5_%=:\n\t"
  116505. "ldr r3, [%[a], #16]\n\t"
  116506. "cmp r3, #0\n\t"
  116507. "beq L_sp_384_num_bits_12_4_%=\n\t"
  116508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116509. "lsrs r5, r3, #24\n\t"
  116510. #else
  116511. "lsr r5, r3, #24\n\t"
  116512. #endif
  116513. "cmp r5, #0\n\t"
  116514. "beq L_sp_384_num_bits_12_63_%=\n\t"
  116515. "movs r2, #0x98\n\t"
  116516. "ldrb r4, [%[table], r5]\n\t"
  116517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116518. "adds r2, r2, r4\n\t"
  116519. #else
  116520. "add r2, r2, r4\n\t"
  116521. #endif
  116522. "b L_sp_384_num_bits_12_13_%=\n\t"
  116523. "\n"
  116524. "L_sp_384_num_bits_12_63_%=:\n\t"
  116525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116526. "lsrs r5, r3, #16\n\t"
  116527. #else
  116528. "lsr r5, r3, #16\n\t"
  116529. #endif
  116530. #ifdef WOLFSSL_KEIL
  116531. "ands r5, r5, r6\n\t"
  116532. #elif defined(__clang__)
  116533. "ands r5, r6\n\t"
  116534. #else
  116535. "and r5, r6\n\t"
  116536. #endif
  116537. "cmp r5, #0\n\t"
  116538. "beq L_sp_384_num_bits_12_62_%=\n\t"
  116539. "movs r2, #0x90\n\t"
  116540. "ldrb r4, [%[table], r5]\n\t"
  116541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116542. "adds r2, r2, r4\n\t"
  116543. #else
  116544. "add r2, r2, r4\n\t"
  116545. #endif
  116546. "b L_sp_384_num_bits_12_13_%=\n\t"
  116547. "\n"
  116548. "L_sp_384_num_bits_12_62_%=:\n\t"
  116549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116550. "lsrs r5, r3, #8\n\t"
  116551. #else
  116552. "lsr r5, r3, #8\n\t"
  116553. #endif
  116554. #ifdef WOLFSSL_KEIL
  116555. "ands r5, r5, r6\n\t"
  116556. #elif defined(__clang__)
  116557. "ands r5, r6\n\t"
  116558. #else
  116559. "and r5, r6\n\t"
  116560. #endif
  116561. "cmp r5, #0\n\t"
  116562. "beq L_sp_384_num_bits_12_61_%=\n\t"
  116563. "movs r2, #0x88\n\t"
  116564. "ldrb r4, [%[table], r5]\n\t"
  116565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116566. "adds r2, r2, r4\n\t"
  116567. #else
  116568. "add r2, r2, r4\n\t"
  116569. #endif
  116570. "b L_sp_384_num_bits_12_13_%=\n\t"
  116571. "\n"
  116572. "L_sp_384_num_bits_12_61_%=:\n\t"
  116573. "movs r5, r3\n\t"
  116574. #ifdef WOLFSSL_KEIL
  116575. "ands r5, r5, r6\n\t"
  116576. #elif defined(__clang__)
  116577. "ands r5, r6\n\t"
  116578. #else
  116579. "and r5, r6\n\t"
  116580. #endif
  116581. "cmp r5, #0\n\t"
  116582. "beq L_sp_384_num_bits_12_60_%=\n\t"
  116583. "movs r2, #0x80\n\t"
  116584. "ldrb r4, [%[table], r5]\n\t"
  116585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116586. "adds r2, r2, r4\n\t"
  116587. #else
  116588. "add r2, r2, r4\n\t"
  116589. #endif
  116590. "b L_sp_384_num_bits_12_13_%=\n\t"
  116591. "\n"
  116592. "L_sp_384_num_bits_12_60_%=:\n\t"
  116593. "b L_sp_384_num_bits_12_13_%=\n\t"
  116594. "\n"
  116595. "L_sp_384_num_bits_12_4_%=:\n\t"
  116596. "ldr r3, [%[a], #12]\n\t"
  116597. "cmp r3, #0\n\t"
  116598. "beq L_sp_384_num_bits_12_3_%=\n\t"
  116599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116600. "lsrs r5, r3, #24\n\t"
  116601. #else
  116602. "lsr r5, r3, #24\n\t"
  116603. #endif
  116604. "cmp r5, #0\n\t"
  116605. "beq L_sp_384_num_bits_12_53_%=\n\t"
  116606. "movs r2, #0x78\n\t"
  116607. "ldrb r4, [%[table], r5]\n\t"
  116608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116609. "adds r2, r2, r4\n\t"
  116610. #else
  116611. "add r2, r2, r4\n\t"
  116612. #endif
  116613. "b L_sp_384_num_bits_12_13_%=\n\t"
  116614. "\n"
  116615. "L_sp_384_num_bits_12_53_%=:\n\t"
  116616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116617. "lsrs r5, r3, #16\n\t"
  116618. #else
  116619. "lsr r5, r3, #16\n\t"
  116620. #endif
  116621. #ifdef WOLFSSL_KEIL
  116622. "ands r5, r5, r6\n\t"
  116623. #elif defined(__clang__)
  116624. "ands r5, r6\n\t"
  116625. #else
  116626. "and r5, r6\n\t"
  116627. #endif
  116628. "cmp r5, #0\n\t"
  116629. "beq L_sp_384_num_bits_12_52_%=\n\t"
  116630. "movs r2, #0x70\n\t"
  116631. "ldrb r4, [%[table], r5]\n\t"
  116632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116633. "adds r2, r2, r4\n\t"
  116634. #else
  116635. "add r2, r2, r4\n\t"
  116636. #endif
  116637. "b L_sp_384_num_bits_12_13_%=\n\t"
  116638. "\n"
  116639. "L_sp_384_num_bits_12_52_%=:\n\t"
  116640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116641. "lsrs r5, r3, #8\n\t"
  116642. #else
  116643. "lsr r5, r3, #8\n\t"
  116644. #endif
  116645. #ifdef WOLFSSL_KEIL
  116646. "ands r5, r5, r6\n\t"
  116647. #elif defined(__clang__)
  116648. "ands r5, r6\n\t"
  116649. #else
  116650. "and r5, r6\n\t"
  116651. #endif
  116652. "cmp r5, #0\n\t"
  116653. "beq L_sp_384_num_bits_12_51_%=\n\t"
  116654. "movs r2, #0x68\n\t"
  116655. "ldrb r4, [%[table], r5]\n\t"
  116656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116657. "adds r2, r2, r4\n\t"
  116658. #else
  116659. "add r2, r2, r4\n\t"
  116660. #endif
  116661. "b L_sp_384_num_bits_12_13_%=\n\t"
  116662. "\n"
  116663. "L_sp_384_num_bits_12_51_%=:\n\t"
  116664. "movs r5, r3\n\t"
  116665. #ifdef WOLFSSL_KEIL
  116666. "ands r5, r5, r6\n\t"
  116667. #elif defined(__clang__)
  116668. "ands r5, r6\n\t"
  116669. #else
  116670. "and r5, r6\n\t"
  116671. #endif
  116672. "cmp r5, #0\n\t"
  116673. "beq L_sp_384_num_bits_12_50_%=\n\t"
  116674. "movs r2, #0x60\n\t"
  116675. "ldrb r4, [%[table], r5]\n\t"
  116676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116677. "adds r2, r2, r4\n\t"
  116678. #else
  116679. "add r2, r2, r4\n\t"
  116680. #endif
  116681. "b L_sp_384_num_bits_12_13_%=\n\t"
  116682. "\n"
  116683. "L_sp_384_num_bits_12_50_%=:\n\t"
  116684. "b L_sp_384_num_bits_12_13_%=\n\t"
  116685. "\n"
  116686. "L_sp_384_num_bits_12_3_%=:\n\t"
  116687. "ldr r3, [%[a], #8]\n\t"
  116688. "cmp r3, #0\n\t"
  116689. "beq L_sp_384_num_bits_12_2_%=\n\t"
  116690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116691. "lsrs r5, r3, #24\n\t"
  116692. #else
  116693. "lsr r5, r3, #24\n\t"
  116694. #endif
  116695. "cmp r5, #0\n\t"
  116696. "beq L_sp_384_num_bits_12_43_%=\n\t"
  116697. "movs r2, #0x58\n\t"
  116698. "ldrb r4, [%[table], r5]\n\t"
  116699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116700. "adds r2, r2, r4\n\t"
  116701. #else
  116702. "add r2, r2, r4\n\t"
  116703. #endif
  116704. "b L_sp_384_num_bits_12_13_%=\n\t"
  116705. "\n"
  116706. "L_sp_384_num_bits_12_43_%=:\n\t"
  116707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116708. "lsrs r5, r3, #16\n\t"
  116709. #else
  116710. "lsr r5, r3, #16\n\t"
  116711. #endif
  116712. #ifdef WOLFSSL_KEIL
  116713. "ands r5, r5, r6\n\t"
  116714. #elif defined(__clang__)
  116715. "ands r5, r6\n\t"
  116716. #else
  116717. "and r5, r6\n\t"
  116718. #endif
  116719. "cmp r5, #0\n\t"
  116720. "beq L_sp_384_num_bits_12_42_%=\n\t"
  116721. "movs r2, #0x50\n\t"
  116722. "ldrb r4, [%[table], r5]\n\t"
  116723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116724. "adds r2, r2, r4\n\t"
  116725. #else
  116726. "add r2, r2, r4\n\t"
  116727. #endif
  116728. "b L_sp_384_num_bits_12_13_%=\n\t"
  116729. "\n"
  116730. "L_sp_384_num_bits_12_42_%=:\n\t"
  116731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116732. "lsrs r5, r3, #8\n\t"
  116733. #else
  116734. "lsr r5, r3, #8\n\t"
  116735. #endif
  116736. #ifdef WOLFSSL_KEIL
  116737. "ands r5, r5, r6\n\t"
  116738. #elif defined(__clang__)
  116739. "ands r5, r6\n\t"
  116740. #else
  116741. "and r5, r6\n\t"
  116742. #endif
  116743. "cmp r5, #0\n\t"
  116744. "beq L_sp_384_num_bits_12_41_%=\n\t"
  116745. "movs r2, #0x48\n\t"
  116746. "ldrb r4, [%[table], r5]\n\t"
  116747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116748. "adds r2, r2, r4\n\t"
  116749. #else
  116750. "add r2, r2, r4\n\t"
  116751. #endif
  116752. "b L_sp_384_num_bits_12_13_%=\n\t"
  116753. "\n"
  116754. "L_sp_384_num_bits_12_41_%=:\n\t"
  116755. "movs r5, r3\n\t"
  116756. #ifdef WOLFSSL_KEIL
  116757. "ands r5, r5, r6\n\t"
  116758. #elif defined(__clang__)
  116759. "ands r5, r6\n\t"
  116760. #else
  116761. "and r5, r6\n\t"
  116762. #endif
  116763. "cmp r5, #0\n\t"
  116764. "beq L_sp_384_num_bits_12_40_%=\n\t"
  116765. "movs r2, #0x40\n\t"
  116766. "ldrb r4, [%[table], r5]\n\t"
  116767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116768. "adds r2, r2, r4\n\t"
  116769. #else
  116770. "add r2, r2, r4\n\t"
  116771. #endif
  116772. "b L_sp_384_num_bits_12_13_%=\n\t"
  116773. "\n"
  116774. "L_sp_384_num_bits_12_40_%=:\n\t"
  116775. "b L_sp_384_num_bits_12_13_%=\n\t"
  116776. "\n"
  116777. "L_sp_384_num_bits_12_2_%=:\n\t"
  116778. "ldr r3, [%[a], #4]\n\t"
  116779. "cmp r3, #0\n\t"
  116780. "beq L_sp_384_num_bits_12_1_%=\n\t"
  116781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116782. "lsrs r5, r3, #24\n\t"
  116783. #else
  116784. "lsr r5, r3, #24\n\t"
  116785. #endif
  116786. "cmp r5, #0\n\t"
  116787. "beq L_sp_384_num_bits_12_33_%=\n\t"
  116788. "movs r2, #56\n\t"
  116789. "ldrb r4, [%[table], r5]\n\t"
  116790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116791. "adds r2, r2, r4\n\t"
  116792. #else
  116793. "add r2, r2, r4\n\t"
  116794. #endif
  116795. "b L_sp_384_num_bits_12_13_%=\n\t"
  116796. "\n"
  116797. "L_sp_384_num_bits_12_33_%=:\n\t"
  116798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116799. "lsrs r5, r3, #16\n\t"
  116800. #else
  116801. "lsr r5, r3, #16\n\t"
  116802. #endif
  116803. #ifdef WOLFSSL_KEIL
  116804. "ands r5, r5, r6\n\t"
  116805. #elif defined(__clang__)
  116806. "ands r5, r6\n\t"
  116807. #else
  116808. "and r5, r6\n\t"
  116809. #endif
  116810. "cmp r5, #0\n\t"
  116811. "beq L_sp_384_num_bits_12_32_%=\n\t"
  116812. "movs r2, #48\n\t"
  116813. "ldrb r4, [%[table], r5]\n\t"
  116814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116815. "adds r2, r2, r4\n\t"
  116816. #else
  116817. "add r2, r2, r4\n\t"
  116818. #endif
  116819. "b L_sp_384_num_bits_12_13_%=\n\t"
  116820. "\n"
  116821. "L_sp_384_num_bits_12_32_%=:\n\t"
  116822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116823. "lsrs r5, r3, #8\n\t"
  116824. #else
  116825. "lsr r5, r3, #8\n\t"
  116826. #endif
  116827. #ifdef WOLFSSL_KEIL
  116828. "ands r5, r5, r6\n\t"
  116829. #elif defined(__clang__)
  116830. "ands r5, r6\n\t"
  116831. #else
  116832. "and r5, r6\n\t"
  116833. #endif
  116834. "cmp r5, #0\n\t"
  116835. "beq L_sp_384_num_bits_12_31_%=\n\t"
  116836. "movs r2, #40\n\t"
  116837. "ldrb r4, [%[table], r5]\n\t"
  116838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116839. "adds r2, r2, r4\n\t"
  116840. #else
  116841. "add r2, r2, r4\n\t"
  116842. #endif
  116843. "b L_sp_384_num_bits_12_13_%=\n\t"
  116844. "\n"
  116845. "L_sp_384_num_bits_12_31_%=:\n\t"
  116846. "movs r5, r3\n\t"
  116847. #ifdef WOLFSSL_KEIL
  116848. "ands r5, r5, r6\n\t"
  116849. #elif defined(__clang__)
  116850. "ands r5, r6\n\t"
  116851. #else
  116852. "and r5, r6\n\t"
  116853. #endif
  116854. "cmp r5, #0\n\t"
  116855. "beq L_sp_384_num_bits_12_30_%=\n\t"
  116856. "movs r2, #32\n\t"
  116857. "ldrb r4, [%[table], r5]\n\t"
  116858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116859. "adds r2, r2, r4\n\t"
  116860. #else
  116861. "add r2, r2, r4\n\t"
  116862. #endif
  116863. "b L_sp_384_num_bits_12_13_%=\n\t"
  116864. "\n"
  116865. "L_sp_384_num_bits_12_30_%=:\n\t"
  116866. "b L_sp_384_num_bits_12_13_%=\n\t"
  116867. "\n"
  116868. "L_sp_384_num_bits_12_1_%=:\n\t"
  116869. "ldr r3, [%[a]]\n\t"
  116870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116871. "lsrs r5, r3, #24\n\t"
  116872. #else
  116873. "lsr r5, r3, #24\n\t"
  116874. #endif
  116875. "cmp r5, #0\n\t"
  116876. "beq L_sp_384_num_bits_12_23_%=\n\t"
  116877. "movs r2, #24\n\t"
  116878. "ldrb r4, [%[table], r5]\n\t"
  116879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116880. "adds r2, r2, r4\n\t"
  116881. #else
  116882. "add r2, r2, r4\n\t"
  116883. #endif
  116884. "b L_sp_384_num_bits_12_13_%=\n\t"
  116885. "\n"
  116886. "L_sp_384_num_bits_12_23_%=:\n\t"
  116887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116888. "lsrs r5, r3, #16\n\t"
  116889. #else
  116890. "lsr r5, r3, #16\n\t"
  116891. #endif
  116892. #ifdef WOLFSSL_KEIL
  116893. "ands r5, r5, r6\n\t"
  116894. #elif defined(__clang__)
  116895. "ands r5, r6\n\t"
  116896. #else
  116897. "and r5, r6\n\t"
  116898. #endif
  116899. "cmp r5, #0\n\t"
  116900. "beq L_sp_384_num_bits_12_22_%=\n\t"
  116901. "movs r2, #16\n\t"
  116902. "ldrb r4, [%[table], r5]\n\t"
  116903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116904. "adds r2, r2, r4\n\t"
  116905. #else
  116906. "add r2, r2, r4\n\t"
  116907. #endif
  116908. "b L_sp_384_num_bits_12_13_%=\n\t"
  116909. "\n"
  116910. "L_sp_384_num_bits_12_22_%=:\n\t"
  116911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116912. "lsrs r5, r3, #8\n\t"
  116913. #else
  116914. "lsr r5, r3, #8\n\t"
  116915. #endif
  116916. #ifdef WOLFSSL_KEIL
  116917. "ands r5, r5, r6\n\t"
  116918. #elif defined(__clang__)
  116919. "ands r5, r6\n\t"
  116920. #else
  116921. "and r5, r6\n\t"
  116922. #endif
  116923. "cmp r5, #0\n\t"
  116924. "beq L_sp_384_num_bits_12_21_%=\n\t"
  116925. "movs r2, #8\n\t"
  116926. "ldrb r4, [%[table], r5]\n\t"
  116927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116928. "adds r2, r2, r4\n\t"
  116929. #else
  116930. "add r2, r2, r4\n\t"
  116931. #endif
  116932. "b L_sp_384_num_bits_12_13_%=\n\t"
  116933. "\n"
  116934. "L_sp_384_num_bits_12_21_%=:\n\t"
  116935. "movs r5, r3\n\t"
  116936. #ifdef WOLFSSL_KEIL
  116937. "ands r5, r5, r6\n\t"
  116938. #elif defined(__clang__)
  116939. "ands r5, r6\n\t"
  116940. #else
  116941. "and r5, r6\n\t"
  116942. #endif
  116943. "cmp r5, #0\n\t"
  116944. "beq L_sp_384_num_bits_12_20_%=\n\t"
  116945. "movs r2, #0\n\t"
  116946. "ldrb r4, [%[table], r5]\n\t"
  116947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116948. "adds r2, r2, r4\n\t"
  116949. #else
  116950. "add r2, r2, r4\n\t"
  116951. #endif
  116952. "b L_sp_384_num_bits_12_13_%=\n\t"
  116953. "\n"
  116954. "L_sp_384_num_bits_12_20_%=:\n\t"
  116955. "\n"
  116956. "L_sp_384_num_bits_12_13_%=:\n\t"
  116957. "movs %[a], r2\n\t"
  116958. : [a] "+l" (a), [table] "+l" (table)
  116959. :
  116960. : "memory", "r2", "r3", "r4", "r5", "r6"
  116961. );
  116962. return (uint32_t)(size_t)a;
  116963. }
  116964. /* Non-constant time modular inversion.
  116965. *
  116966. * @param [out] r Resulting number.
  116967. * @param [in] a Number to invert.
  116968. * @param [in] m Modulus.
  116969. * @return MP_OKAY on success.
  116970. */
  116971. static int sp_384_mod_inv_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  116972. {
  116973. sp_digit u[12];
  116974. sp_digit v[12];
  116975. sp_digit b[12];
  116976. sp_digit d[12];
  116977. int ut, vt;
  116978. sp_digit o;
  116979. XMEMCPY(u, m, sizeof(u));
  116980. XMEMCPY(v, a, sizeof(v));
  116981. ut = sp_384_num_bits_12(u);
  116982. vt = sp_384_num_bits_12(v);
  116983. XMEMSET(b, 0, sizeof(b));
  116984. if ((v[0] & 1) == 0) {
  116985. sp_384_rshift1_12(v, v);
  116986. XMEMCPY(d, m, sizeof(u));
  116987. d[0] += 1;
  116988. sp_384_rshift1_12(d, d);
  116989. vt--;
  116990. while ((v[0] & 1) == 0) {
  116991. sp_384_rshift1_12(v, v);
  116992. sp_384_div2_mod_12(d, d, m);
  116993. vt--;
  116994. }
  116995. }
  116996. else {
  116997. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  116998. d[0] = 1;
  116999. }
  117000. while (ut > 1 && vt > 1) {
  117001. if ((ut > vt) || ((ut == vt) && (sp_384_cmp_12(u, v) >= 0))) {
  117002. sp_384_sub_12(u, u, v);
  117003. o = sp_384_sub_12(b, b, d);
  117004. if (o != 0)
  117005. sp_384_add_12(b, b, m);
  117006. ut = sp_384_num_bits_12(u);
  117007. do {
  117008. sp_384_rshift1_12(u, u);
  117009. sp_384_div2_mod_12(b, b, m);
  117010. ut--;
  117011. }
  117012. while (ut > 0 && (u[0] & 1) == 0);
  117013. }
  117014. else {
  117015. sp_384_sub_12(v, v, u);
  117016. o = sp_384_sub_12(d, d, b);
  117017. if (o != 0)
  117018. sp_384_add_12(d, d, m);
  117019. vt = sp_384_num_bits_12(v);
  117020. do {
  117021. sp_384_rshift1_12(v, v);
  117022. sp_384_div2_mod_12(d, d, m);
  117023. vt--;
  117024. }
  117025. while (vt > 0 && (v[0] & 1) == 0);
  117026. }
  117027. }
  117028. if (ut == 1)
  117029. XMEMCPY(r, b, sizeof(b));
  117030. else
  117031. XMEMCPY(r, d, sizeof(d));
  117032. return MP_OKAY;
  117033. }
  117034. #endif /* WOLFSSL_SP_SMALL */
  117035. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  117036. *
  117037. * p1 First point to add and holds result.
  117038. * p2 Second point to add.
  117039. * tmp Temporary storage for intermediate numbers.
  117040. */
  117041. static void sp_384_add_points_12(sp_point_384* p1, const sp_point_384* p2,
  117042. sp_digit* tmp)
  117043. {
  117044. sp_384_proj_point_add_12(p1, p1, p2, tmp);
  117045. if (sp_384_iszero_12(p1->z)) {
  117046. if (sp_384_iszero_12(p1->x) && sp_384_iszero_12(p1->y)) {
  117047. sp_384_proj_point_dbl_12(p1, p2, tmp);
  117048. }
  117049. else {
  117050. /* Y ordinate is not used from here - don't set. */
  117051. p1->x[0] = 0;
  117052. p1->x[1] = 0;
  117053. p1->x[2] = 0;
  117054. p1->x[3] = 0;
  117055. p1->x[4] = 0;
  117056. p1->x[5] = 0;
  117057. p1->x[6] = 0;
  117058. p1->x[7] = 0;
  117059. p1->x[8] = 0;
  117060. p1->x[9] = 0;
  117061. p1->x[10] = 0;
  117062. p1->x[11] = 0;
  117063. XMEMCPY(p1->z, p384_norm_mod, sizeof(p384_norm_mod));
  117064. }
  117065. }
  117066. }
  117067. /* Calculate the verification point: [e/s]G + [r/s]Q
  117068. *
  117069. * p1 Calculated point.
  117070. * p2 Public point and temporary.
  117071. * s Second part of signature as a number.
  117072. * u1 Temporary number.
  117073. * u2 Temporary number.
  117074. * heap Heap to use for allocation.
  117075. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117076. */
  117077. static int sp_384_calc_vfy_point_12(sp_point_384* p1, sp_point_384* p2,
  117078. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  117079. {
  117080. int err;
  117081. #ifndef WOLFSSL_SP_SMALL
  117082. err = sp_384_mod_inv_12(s, s, p384_order);
  117083. if (err == MP_OKAY)
  117084. #endif /* !WOLFSSL_SP_SMALL */
  117085. {
  117086. sp_384_mul_12(s, s, p384_norm_order);
  117087. err = sp_384_mod_12(s, s, p384_order);
  117088. }
  117089. if (err == MP_OKAY) {
  117090. sp_384_norm_12(s);
  117091. #ifdef WOLFSSL_SP_SMALL
  117092. {
  117093. sp_384_mont_inv_order_12(s, s, tmp);
  117094. sp_384_mont_mul_order_12(u1, u1, s);
  117095. sp_384_mont_mul_order_12(u2, u2, s);
  117096. }
  117097. #else
  117098. {
  117099. sp_384_mont_mul_order_12(u1, u1, s);
  117100. sp_384_mont_mul_order_12(u2, u2, s);
  117101. }
  117102. #endif /* WOLFSSL_SP_SMALL */
  117103. {
  117104. err = sp_384_ecc_mulmod_base_12(p1, u1, 0, 0, heap);
  117105. }
  117106. }
  117107. if ((err == MP_OKAY) && sp_384_iszero_12(p1->z)) {
  117108. p1->infinity = 1;
  117109. }
  117110. if (err == MP_OKAY) {
  117111. err = sp_384_ecc_mulmod_12(p2, p2, u2, 0, 0, heap);
  117112. }
  117113. if ((err == MP_OKAY) && sp_384_iszero_12(p2->z)) {
  117114. p2->infinity = 1;
  117115. }
  117116. if (err == MP_OKAY) {
  117117. sp_384_add_points_12(p1, p2, tmp);
  117118. }
  117119. return err;
  117120. }
  117121. #ifdef HAVE_ECC_VERIFY
  117122. /* Verify the signature values with the hash and public key.
  117123. * e = Truncate(hash, 384)
  117124. * u1 = e/s mod order
  117125. * u2 = r/s mod order
  117126. * r == (u1.G + u2.Q)->x mod order
  117127. * Optimization: Leave point in projective form.
  117128. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  117129. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  117130. * The hash is truncated to the first 384 bits.
  117131. *
  117132. * hash Hash to sign.
  117133. * hashLen Length of the hash data.
  117134. * rng Random number generator.
  117135. * priv Private part of key - scalar.
  117136. * rm First part of result as an mp_int.
  117137. * sm Sirst part of result as an mp_int.
  117138. * heap Heap to use for allocation.
  117139. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  117140. */
  117141. int sp_ecc_verify_384(const byte* hash, word32 hashLen, const mp_int* pX,
  117142. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  117143. int* res, void* heap)
  117144. {
  117145. #ifdef WOLFSSL_SP_SMALL_STACK
  117146. sp_digit* u1 = NULL;
  117147. sp_point_384* p1 = NULL;
  117148. #else
  117149. sp_digit u1[18 * 12];
  117150. sp_point_384 p1[2];
  117151. #endif
  117152. sp_digit* u2 = NULL;
  117153. sp_digit* s = NULL;
  117154. sp_digit* tmp = NULL;
  117155. sp_point_384* p2 = NULL;
  117156. sp_digit carry;
  117157. sp_int32 c = 0;
  117158. int err = MP_OKAY;
  117159. #ifdef WOLFSSL_SP_SMALL_STACK
  117160. if (err == MP_OKAY) {
  117161. p1 = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  117162. DYNAMIC_TYPE_ECC);
  117163. if (p1 == NULL)
  117164. err = MEMORY_E;
  117165. }
  117166. if (err == MP_OKAY) {
  117167. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 12, heap,
  117168. DYNAMIC_TYPE_ECC);
  117169. if (u1 == NULL)
  117170. err = MEMORY_E;
  117171. }
  117172. #endif
  117173. if (err == MP_OKAY) {
  117174. u2 = u1 + 2 * 12;
  117175. s = u1 + 4 * 12;
  117176. tmp = u1 + 6 * 12;
  117177. p2 = p1 + 1;
  117178. if (hashLen > 48U) {
  117179. hashLen = 48U;
  117180. }
  117181. sp_384_from_bin(u1, 12, hash, (int)hashLen);
  117182. sp_384_from_mp(u2, 12, rm);
  117183. sp_384_from_mp(s, 12, sm);
  117184. sp_384_from_mp(p2->x, 12, pX);
  117185. sp_384_from_mp(p2->y, 12, pY);
  117186. sp_384_from_mp(p2->z, 12, pZ);
  117187. err = sp_384_calc_vfy_point_12(p1, p2, s, u1, u2, tmp, heap);
  117188. }
  117189. if (err == MP_OKAY) {
  117190. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  117191. /* Reload r and convert to Montgomery form. */
  117192. sp_384_from_mp(u2, 12, rm);
  117193. err = sp_384_mod_mul_norm_12(u2, u2, p384_mod);
  117194. }
  117195. if (err == MP_OKAY) {
  117196. /* u1 = r.z'.z' mod prime */
  117197. sp_384_mont_sqr_12(p1->z, p1->z, p384_mod, p384_mp_mod);
  117198. sp_384_mont_mul_12(u1, u2, p1->z, p384_mod, p384_mp_mod);
  117199. *res = (int)(sp_384_cmp_12(p1->x, u1) == 0);
  117200. if (*res == 0) {
  117201. /* Reload r and add order. */
  117202. sp_384_from_mp(u2, 12, rm);
  117203. carry = sp_384_add_12(u2, u2, p384_order);
  117204. /* Carry means result is greater than mod and is not valid. */
  117205. if (carry == 0) {
  117206. sp_384_norm_12(u2);
  117207. /* Compare with mod and if greater or equal then not valid. */
  117208. c = sp_384_cmp_12(u2, p384_mod);
  117209. }
  117210. }
  117211. if ((*res == 0) && (c < 0)) {
  117212. /* Convert to Montogomery form */
  117213. err = sp_384_mod_mul_norm_12(u2, u2, p384_mod);
  117214. if (err == MP_OKAY) {
  117215. /* u1 = (r + 1*order).z'.z' mod prime */
  117216. {
  117217. sp_384_mont_mul_12(u1, u2, p1->z, p384_mod, p384_mp_mod);
  117218. }
  117219. *res = (sp_384_cmp_12(p1->x, u1) == 0);
  117220. }
  117221. }
  117222. }
  117223. #ifdef WOLFSSL_SP_SMALL_STACK
  117224. if (u1 != NULL)
  117225. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  117226. if (p1 != NULL)
  117227. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  117228. #endif
  117229. return err;
  117230. }
  117231. #ifdef WOLFSSL_SP_NONBLOCK
  117232. typedef struct sp_ecc_verify_384_ctx {
  117233. int state;
  117234. union {
  117235. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  117236. sp_384_mont_inv_order_12_ctx mont_inv_order_ctx;
  117237. sp_384_proj_point_dbl_12_ctx dbl_ctx;
  117238. sp_384_proj_point_add_12_ctx add_ctx;
  117239. };
  117240. sp_digit u1[2*12];
  117241. sp_digit u2[2*12];
  117242. sp_digit s[2*12];
  117243. sp_digit tmp[2*12 * 6];
  117244. sp_point_384 p1;
  117245. sp_point_384 p2;
  117246. } sp_ecc_verify_384_ctx;
  117247. int sp_ecc_verify_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  117248. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  117249. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  117250. {
  117251. int err = FP_WOULDBLOCK;
  117252. sp_ecc_verify_384_ctx* ctx = (sp_ecc_verify_384_ctx*)sp_ctx->data;
  117253. typedef char ctx_size_test[sizeof(sp_ecc_verify_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  117254. (void)sizeof(ctx_size_test);
  117255. switch (ctx->state) {
  117256. case 0: /* INIT */
  117257. if (hashLen > 48U) {
  117258. hashLen = 48U;
  117259. }
  117260. sp_384_from_bin(ctx->u1, 12, hash, (int)hashLen);
  117261. sp_384_from_mp(ctx->u2, 12, rm);
  117262. sp_384_from_mp(ctx->s, 12, sm);
  117263. sp_384_from_mp(ctx->p2.x, 12, pX);
  117264. sp_384_from_mp(ctx->p2.y, 12, pY);
  117265. sp_384_from_mp(ctx->p2.z, 12, pZ);
  117266. ctx->state = 1;
  117267. break;
  117268. case 1: /* NORMS0 */
  117269. sp_384_mul_12(ctx->s, ctx->s, p384_norm_order);
  117270. err = sp_384_mod_12(ctx->s, ctx->s, p384_order);
  117271. if (err == MP_OKAY)
  117272. ctx->state = 2;
  117273. break;
  117274. case 2: /* NORMS1 */
  117275. sp_384_norm_12(ctx->s);
  117276. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  117277. ctx->state = 3;
  117278. break;
  117279. case 3: /* NORMS2 */
  117280. err = sp_384_mont_inv_order_12_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  117281. if (err == MP_OKAY) {
  117282. ctx->state = 4;
  117283. }
  117284. break;
  117285. case 4: /* NORMS3 */
  117286. sp_384_mont_mul_order_12(ctx->u1, ctx->u1, ctx->s);
  117287. ctx->state = 5;
  117288. break;
  117289. case 5: /* NORMS4 */
  117290. sp_384_mont_mul_order_12(ctx->u2, ctx->u2, ctx->s);
  117291. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  117292. ctx->state = 6;
  117293. break;
  117294. case 6: /* MULBASE */
  117295. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p384_base, ctx->u1, 0, 0, heap);
  117296. if (err == MP_OKAY) {
  117297. if (sp_384_iszero_12(ctx->p1.z)) {
  117298. ctx->p1.infinity = 1;
  117299. }
  117300. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  117301. ctx->state = 7;
  117302. }
  117303. break;
  117304. case 7: /* MULMOD */
  117305. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  117306. if (err == MP_OKAY) {
  117307. if (sp_384_iszero_12(ctx->p2.z)) {
  117308. ctx->p2.infinity = 1;
  117309. }
  117310. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  117311. ctx->state = 8;
  117312. }
  117313. break;
  117314. case 8: /* ADD */
  117315. err = sp_384_proj_point_add_12_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  117316. if (err == MP_OKAY)
  117317. ctx->state = 9;
  117318. break;
  117319. case 9: /* MONT */
  117320. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  117321. /* Reload r and convert to Montgomery form. */
  117322. sp_384_from_mp(ctx->u2, 12, rm);
  117323. err = sp_384_mod_mul_norm_12(ctx->u2, ctx->u2, p384_mod);
  117324. if (err == MP_OKAY)
  117325. ctx->state = 10;
  117326. break;
  117327. case 10: /* SQR */
  117328. /* u1 = r.z'.z' mod prime */
  117329. sp_384_mont_sqr_12(ctx->p1.z, ctx->p1.z, p384_mod, p384_mp_mod);
  117330. ctx->state = 11;
  117331. break;
  117332. case 11: /* MUL */
  117333. sp_384_mont_mul_12(ctx->u1, ctx->u2, ctx->p1.z, p384_mod, p384_mp_mod);
  117334. ctx->state = 12;
  117335. break;
  117336. case 12: /* RES */
  117337. {
  117338. sp_int32 c = 0;
  117339. err = MP_OKAY; /* math okay, now check result */
  117340. *res = (int)(sp_384_cmp_12(ctx->p1.x, ctx->u1) == 0);
  117341. if (*res == 0) {
  117342. sp_digit carry;
  117343. /* Reload r and add order. */
  117344. sp_384_from_mp(ctx->u2, 12, rm);
  117345. carry = sp_384_add_12(ctx->u2, ctx->u2, p384_order);
  117346. /* Carry means result is greater than mod and is not valid. */
  117347. if (carry == 0) {
  117348. sp_384_norm_12(ctx->u2);
  117349. /* Compare with mod and if greater or equal then not valid. */
  117350. c = sp_384_cmp_12(ctx->u2, p384_mod);
  117351. }
  117352. }
  117353. if ((*res == 0) && (c < 0)) {
  117354. /* Convert to Montogomery form */
  117355. err = sp_384_mod_mul_norm_12(ctx->u2, ctx->u2, p384_mod);
  117356. if (err == MP_OKAY) {
  117357. /* u1 = (r + 1*order).z'.z' mod prime */
  117358. sp_384_mont_mul_12(ctx->u1, ctx->u2, ctx->p1.z, p384_mod,
  117359. p384_mp_mod);
  117360. *res = (int)(sp_384_cmp_12(ctx->p1.x, ctx->u1) == 0);
  117361. }
  117362. }
  117363. break;
  117364. }
  117365. } /* switch */
  117366. if (err == MP_OKAY && ctx->state != 12) {
  117367. err = FP_WOULDBLOCK;
  117368. }
  117369. return err;
  117370. }
  117371. #endif /* WOLFSSL_SP_NONBLOCK */
  117372. #endif /* HAVE_ECC_VERIFY */
  117373. #ifdef HAVE_ECC_CHECK_KEY
  117374. /* Check that the x and y ordinates are a valid point on the curve.
  117375. *
  117376. * point EC point.
  117377. * heap Heap to use if dynamically allocating.
  117378. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  117379. * not on the curve and MP_OKAY otherwise.
  117380. */
  117381. static int sp_384_ecc_is_point_12(const sp_point_384* point,
  117382. void* heap)
  117383. {
  117384. #ifdef WOLFSSL_SP_SMALL_STACK
  117385. sp_digit* t1 = NULL;
  117386. #else
  117387. sp_digit t1[12 * 4];
  117388. #endif
  117389. sp_digit* t2 = NULL;
  117390. int err = MP_OKAY;
  117391. #ifdef WOLFSSL_SP_SMALL_STACK
  117392. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12 * 4, heap, DYNAMIC_TYPE_ECC);
  117393. if (t1 == NULL)
  117394. err = MEMORY_E;
  117395. #endif
  117396. (void)heap;
  117397. if (err == MP_OKAY) {
  117398. t2 = t1 + 2 * 12;
  117399. /* y^2 - x^3 - a.x = b */
  117400. sp_384_sqr_12(t1, point->y);
  117401. (void)sp_384_mod_12(t1, t1, p384_mod);
  117402. sp_384_sqr_12(t2, point->x);
  117403. (void)sp_384_mod_12(t2, t2, p384_mod);
  117404. sp_384_mul_12(t2, t2, point->x);
  117405. (void)sp_384_mod_12(t2, t2, p384_mod);
  117406. sp_384_mont_sub_12(t1, t1, t2, p384_mod);
  117407. /* y^2 - x^3 + 3.x = b, when a = -3 */
  117408. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  117409. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  117410. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  117411. if (sp_384_cmp_12(t1, p384_b) != 0) {
  117412. err = MP_VAL;
  117413. }
  117414. }
  117415. #ifdef WOLFSSL_SP_SMALL_STACK
  117416. if (t1 != NULL)
  117417. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  117418. #endif
  117419. return err;
  117420. }
  117421. /* Check that the x and y ordinates are a valid point on the curve.
  117422. *
  117423. * pX X ordinate of EC point.
  117424. * pY Y ordinate of EC point.
  117425. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  117426. * not on the curve and MP_OKAY otherwise.
  117427. */
  117428. int sp_ecc_is_point_384(const mp_int* pX, const mp_int* pY)
  117429. {
  117430. #ifdef WOLFSSL_SP_SMALL_STACK
  117431. sp_point_384* pub = NULL;
  117432. #else
  117433. sp_point_384 pub[1];
  117434. #endif
  117435. const byte one[1] = { 1 };
  117436. int err = MP_OKAY;
  117437. #ifdef WOLFSSL_SP_SMALL_STACK
  117438. pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  117439. DYNAMIC_TYPE_ECC);
  117440. if (pub == NULL)
  117441. err = MEMORY_E;
  117442. #endif
  117443. if (err == MP_OKAY) {
  117444. sp_384_from_mp(pub->x, 12, pX);
  117445. sp_384_from_mp(pub->y, 12, pY);
  117446. sp_384_from_bin(pub->z, 12, one, (int)sizeof(one));
  117447. err = sp_384_ecc_is_point_12(pub, NULL);
  117448. }
  117449. #ifdef WOLFSSL_SP_SMALL_STACK
  117450. if (pub != NULL)
  117451. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  117452. #endif
  117453. return err;
  117454. }
  117455. /* Check that the private scalar generates the EC point (px, py), the point is
  117456. * on the curve and the point has the correct order.
  117457. *
  117458. * pX X ordinate of EC point.
  117459. * pY Y ordinate of EC point.
  117460. * privm Private scalar that generates EC point.
  117461. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  117462. * not on the curve, ECC_INF_E if the point does not have the correct order,
  117463. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  117464. * MP_OKAY otherwise.
  117465. */
  117466. int sp_ecc_check_key_384(const mp_int* pX, const mp_int* pY,
  117467. const mp_int* privm, void* heap)
  117468. {
  117469. #ifdef WOLFSSL_SP_SMALL_STACK
  117470. sp_digit* priv = NULL;
  117471. sp_point_384* pub = NULL;
  117472. #else
  117473. sp_digit priv[12];
  117474. sp_point_384 pub[2];
  117475. #endif
  117476. sp_point_384* p = NULL;
  117477. const byte one[1] = { 1 };
  117478. int err = MP_OKAY;
  117479. /* Quick check the lengs of public key ordinates and private key are in
  117480. * range. Proper check later.
  117481. */
  117482. if (((mp_count_bits(pX) > 384) ||
  117483. (mp_count_bits(pY) > 384) ||
  117484. ((privm != NULL) && (mp_count_bits(privm) > 384)))) {
  117485. err = ECC_OUT_OF_RANGE_E;
  117486. }
  117487. #ifdef WOLFSSL_SP_SMALL_STACK
  117488. if (err == MP_OKAY) {
  117489. pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  117490. DYNAMIC_TYPE_ECC);
  117491. if (pub == NULL)
  117492. err = MEMORY_E;
  117493. }
  117494. if (err == MP_OKAY && privm) {
  117495. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  117496. DYNAMIC_TYPE_ECC);
  117497. if (priv == NULL)
  117498. err = MEMORY_E;
  117499. }
  117500. #endif
  117501. if (err == MP_OKAY) {
  117502. p = pub + 1;
  117503. sp_384_from_mp(pub->x, 12, pX);
  117504. sp_384_from_mp(pub->y, 12, pY);
  117505. sp_384_from_bin(pub->z, 12, one, (int)sizeof(one));
  117506. if (privm)
  117507. sp_384_from_mp(priv, 12, privm);
  117508. /* Check point at infinitiy. */
  117509. if ((sp_384_iszero_12(pub->x) != 0) &&
  117510. (sp_384_iszero_12(pub->y) != 0)) {
  117511. err = ECC_INF_E;
  117512. }
  117513. }
  117514. /* Check range of X and Y */
  117515. if ((err == MP_OKAY) &&
  117516. ((sp_384_cmp_12(pub->x, p384_mod) >= 0) ||
  117517. (sp_384_cmp_12(pub->y, p384_mod) >= 0))) {
  117518. err = ECC_OUT_OF_RANGE_E;
  117519. }
  117520. if (err == MP_OKAY) {
  117521. /* Check point is on curve */
  117522. err = sp_384_ecc_is_point_12(pub, heap);
  117523. }
  117524. if (err == MP_OKAY) {
  117525. /* Point * order = infinity */
  117526. err = sp_384_ecc_mulmod_12(p, pub, p384_order, 1, 1, heap);
  117527. }
  117528. /* Check result is infinity */
  117529. if ((err == MP_OKAY) && ((sp_384_iszero_12(p->x) == 0) ||
  117530. (sp_384_iszero_12(p->y) == 0))) {
  117531. err = ECC_INF_E;
  117532. }
  117533. if (privm) {
  117534. if (err == MP_OKAY) {
  117535. /* Base * private = point */
  117536. err = sp_384_ecc_mulmod_base_12(p, priv, 1, 1, heap);
  117537. }
  117538. /* Check result is public key */
  117539. if ((err == MP_OKAY) &&
  117540. ((sp_384_cmp_12(p->x, pub->x) != 0) ||
  117541. (sp_384_cmp_12(p->y, pub->y) != 0))) {
  117542. err = ECC_PRIV_KEY_E;
  117543. }
  117544. }
  117545. #ifdef WOLFSSL_SP_SMALL_STACK
  117546. if (pub != NULL)
  117547. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  117548. if (priv != NULL)
  117549. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  117550. #endif
  117551. return err;
  117552. }
  117553. #endif
  117554. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  117555. /* Add two projective EC points together.
  117556. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  117557. *
  117558. * pX First EC point's X ordinate.
  117559. * pY First EC point's Y ordinate.
  117560. * pZ First EC point's Z ordinate.
  117561. * qX Second EC point's X ordinate.
  117562. * qY Second EC point's Y ordinate.
  117563. * qZ Second EC point's Z ordinate.
  117564. * rX Resultant EC point's X ordinate.
  117565. * rY Resultant EC point's Y ordinate.
  117566. * rZ Resultant EC point's Z ordinate.
  117567. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  117568. */
  117569. int sp_ecc_proj_add_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
  117570. mp_int* qX, mp_int* qY, mp_int* qZ,
  117571. mp_int* rX, mp_int* rY, mp_int* rZ)
  117572. {
  117573. #ifdef WOLFSSL_SP_SMALL_STACK
  117574. sp_digit* tmp = NULL;
  117575. sp_point_384* p = NULL;
  117576. #else
  117577. sp_digit tmp[2 * 12 * 6];
  117578. sp_point_384 p[2];
  117579. #endif
  117580. sp_point_384* q = NULL;
  117581. int err = MP_OKAY;
  117582. #ifdef WOLFSSL_SP_SMALL_STACK
  117583. if (err == MP_OKAY) {
  117584. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, NULL,
  117585. DYNAMIC_TYPE_ECC);
  117586. if (p == NULL)
  117587. err = MEMORY_E;
  117588. }
  117589. if (err == MP_OKAY) {
  117590. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, NULL,
  117591. DYNAMIC_TYPE_ECC);
  117592. if (tmp == NULL) {
  117593. err = MEMORY_E;
  117594. }
  117595. }
  117596. #endif
  117597. if (err == MP_OKAY) {
  117598. q = p + 1;
  117599. sp_384_from_mp(p->x, 12, pX);
  117600. sp_384_from_mp(p->y, 12, pY);
  117601. sp_384_from_mp(p->z, 12, pZ);
  117602. sp_384_from_mp(q->x, 12, qX);
  117603. sp_384_from_mp(q->y, 12, qY);
  117604. sp_384_from_mp(q->z, 12, qZ);
  117605. p->infinity = sp_384_iszero_12(p->x) &
  117606. sp_384_iszero_12(p->y);
  117607. q->infinity = sp_384_iszero_12(q->x) &
  117608. sp_384_iszero_12(q->y);
  117609. sp_384_proj_point_add_12(p, p, q, tmp);
  117610. }
  117611. if (err == MP_OKAY) {
  117612. err = sp_384_to_mp(p->x, rX);
  117613. }
  117614. if (err == MP_OKAY) {
  117615. err = sp_384_to_mp(p->y, rY);
  117616. }
  117617. if (err == MP_OKAY) {
  117618. err = sp_384_to_mp(p->z, rZ);
  117619. }
  117620. #ifdef WOLFSSL_SP_SMALL_STACK
  117621. if (tmp != NULL)
  117622. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  117623. if (p != NULL)
  117624. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  117625. #endif
  117626. return err;
  117627. }
  117628. /* Double a projective EC point.
  117629. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  117630. *
  117631. * pX EC point's X ordinate.
  117632. * pY EC point's Y ordinate.
  117633. * pZ EC point's Z ordinate.
  117634. * rX Resultant EC point's X ordinate.
  117635. * rY Resultant EC point's Y ordinate.
  117636. * rZ Resultant EC point's Z ordinate.
  117637. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  117638. */
  117639. int sp_ecc_proj_dbl_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
  117640. mp_int* rX, mp_int* rY, mp_int* rZ)
  117641. {
  117642. #ifdef WOLFSSL_SP_SMALL_STACK
  117643. sp_digit* tmp = NULL;
  117644. sp_point_384* p = NULL;
  117645. #else
  117646. sp_digit tmp[2 * 12 * 2];
  117647. sp_point_384 p[1];
  117648. #endif
  117649. int err = MP_OKAY;
  117650. #ifdef WOLFSSL_SP_SMALL_STACK
  117651. if (err == MP_OKAY) {
  117652. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  117653. DYNAMIC_TYPE_ECC);
  117654. if (p == NULL)
  117655. err = MEMORY_E;
  117656. }
  117657. if (err == MP_OKAY) {
  117658. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 2, NULL,
  117659. DYNAMIC_TYPE_ECC);
  117660. if (tmp == NULL)
  117661. err = MEMORY_E;
  117662. }
  117663. #endif
  117664. if (err == MP_OKAY) {
  117665. sp_384_from_mp(p->x, 12, pX);
  117666. sp_384_from_mp(p->y, 12, pY);
  117667. sp_384_from_mp(p->z, 12, pZ);
  117668. p->infinity = sp_384_iszero_12(p->x) &
  117669. sp_384_iszero_12(p->y);
  117670. sp_384_proj_point_dbl_12(p, p, tmp);
  117671. }
  117672. if (err == MP_OKAY) {
  117673. err = sp_384_to_mp(p->x, rX);
  117674. }
  117675. if (err == MP_OKAY) {
  117676. err = sp_384_to_mp(p->y, rY);
  117677. }
  117678. if (err == MP_OKAY) {
  117679. err = sp_384_to_mp(p->z, rZ);
  117680. }
  117681. #ifdef WOLFSSL_SP_SMALL_STACK
  117682. if (tmp != NULL)
  117683. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  117684. if (p != NULL)
  117685. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  117686. #endif
  117687. return err;
  117688. }
  117689. /* Map a projective EC point to affine in place.
  117690. * pZ will be one.
  117691. *
  117692. * pX EC point's X ordinate.
  117693. * pY EC point's Y ordinate.
  117694. * pZ EC point's Z ordinate.
  117695. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  117696. */
  117697. int sp_ecc_map_384(mp_int* pX, mp_int* pY, mp_int* pZ)
  117698. {
  117699. #ifdef WOLFSSL_SP_SMALL_STACK
  117700. sp_digit* tmp = NULL;
  117701. sp_point_384* p = NULL;
  117702. #else
  117703. sp_digit tmp[2 * 12 * 6];
  117704. sp_point_384 p[1];
  117705. #endif
  117706. int err = MP_OKAY;
  117707. #ifdef WOLFSSL_SP_SMALL_STACK
  117708. if (err == MP_OKAY) {
  117709. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  117710. DYNAMIC_TYPE_ECC);
  117711. if (p == NULL)
  117712. err = MEMORY_E;
  117713. }
  117714. if (err == MP_OKAY) {
  117715. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, NULL,
  117716. DYNAMIC_TYPE_ECC);
  117717. if (tmp == NULL)
  117718. err = MEMORY_E;
  117719. }
  117720. #endif
  117721. if (err == MP_OKAY) {
  117722. sp_384_from_mp(p->x, 12, pX);
  117723. sp_384_from_mp(p->y, 12, pY);
  117724. sp_384_from_mp(p->z, 12, pZ);
  117725. p->infinity = sp_384_iszero_12(p->x) &
  117726. sp_384_iszero_12(p->y);
  117727. sp_384_map_12(p, p, tmp);
  117728. }
  117729. if (err == MP_OKAY) {
  117730. err = sp_384_to_mp(p->x, pX);
  117731. }
  117732. if (err == MP_OKAY) {
  117733. err = sp_384_to_mp(p->y, pY);
  117734. }
  117735. if (err == MP_OKAY) {
  117736. err = sp_384_to_mp(p->z, pZ);
  117737. }
  117738. #ifdef WOLFSSL_SP_SMALL_STACK
  117739. if (tmp != NULL)
  117740. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  117741. if (p != NULL)
  117742. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  117743. #endif
  117744. return err;
  117745. }
  117746. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  117747. #ifdef HAVE_COMP_KEY
  117748. /* Find the square root of a number mod the prime of the curve.
  117749. *
  117750. * y The number to operate on and the result.
  117751. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  117752. */
  117753. static int sp_384_mont_sqrt_12(sp_digit* y)
  117754. {
  117755. #ifdef WOLFSSL_SP_SMALL_STACK
  117756. sp_digit* t1 = NULL;
  117757. #else
  117758. sp_digit t1[5 * 2 * 12];
  117759. #endif
  117760. sp_digit* t2 = NULL;
  117761. sp_digit* t3 = NULL;
  117762. sp_digit* t4 = NULL;
  117763. sp_digit* t5 = NULL;
  117764. int err = MP_OKAY;
  117765. #ifdef WOLFSSL_SP_SMALL_STACK
  117766. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 5 * 2 * 12, NULL, DYNAMIC_TYPE_ECC);
  117767. if (t1 == NULL)
  117768. err = MEMORY_E;
  117769. #endif
  117770. if (err == MP_OKAY) {
  117771. t2 = t1 + 2 * 12;
  117772. t3 = t1 + 4 * 12;
  117773. t4 = t1 + 6 * 12;
  117774. t5 = t1 + 8 * 12;
  117775. {
  117776. /* t2 = y ^ 0x2 */
  117777. sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod);
  117778. /* t1 = y ^ 0x3 */
  117779. sp_384_mont_mul_12(t1, t2, y, p384_mod, p384_mp_mod);
  117780. /* t5 = y ^ 0xc */
  117781. sp_384_mont_sqr_n_12(t5, t1, 2, p384_mod, p384_mp_mod);
  117782. /* t1 = y ^ 0xf */
  117783. sp_384_mont_mul_12(t1, t1, t5, p384_mod, p384_mp_mod);
  117784. /* t2 = y ^ 0x1e */
  117785. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  117786. /* t3 = y ^ 0x1f */
  117787. sp_384_mont_mul_12(t3, t2, y, p384_mod, p384_mp_mod);
  117788. /* t2 = y ^ 0x3e0 */
  117789. sp_384_mont_sqr_n_12(t2, t3, 5, p384_mod, p384_mp_mod);
  117790. /* t1 = y ^ 0x3ff */
  117791. sp_384_mont_mul_12(t1, t3, t2, p384_mod, p384_mp_mod);
  117792. /* t2 = y ^ 0x7fe0 */
  117793. sp_384_mont_sqr_n_12(t2, t1, 5, p384_mod, p384_mp_mod);
  117794. /* t3 = y ^ 0x7fff */
  117795. sp_384_mont_mul_12(t3, t3, t2, p384_mod, p384_mp_mod);
  117796. /* t2 = y ^ 0x3fff800 */
  117797. sp_384_mont_sqr_n_12(t2, t3, 15, p384_mod, p384_mp_mod);
  117798. /* t4 = y ^ 0x3ffffff */
  117799. sp_384_mont_mul_12(t4, t3, t2, p384_mod, p384_mp_mod);
  117800. /* t2 = y ^ 0xffffffc000000 */
  117801. sp_384_mont_sqr_n_12(t2, t4, 30, p384_mod, p384_mp_mod);
  117802. /* t1 = y ^ 0xfffffffffffff */
  117803. sp_384_mont_mul_12(t1, t4, t2, p384_mod, p384_mp_mod);
  117804. /* t2 = y ^ 0xfffffffffffffff000000000000000 */
  117805. sp_384_mont_sqr_n_12(t2, t1, 60, p384_mod, p384_mp_mod);
  117806. /* t1 = y ^ 0xffffffffffffffffffffffffffffff */
  117807. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  117808. /* t2 = y ^ 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
  117809. sp_384_mont_sqr_n_12(t2, t1, 120, p384_mod, p384_mp_mod);
  117810. /* t1 = y ^ 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  117811. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  117812. /* t2 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
  117813. sp_384_mont_sqr_n_12(t2, t1, 15, p384_mod, p384_mp_mod);
  117814. /* t1 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  117815. sp_384_mont_mul_12(t1, t3, t2, p384_mod, p384_mp_mod);
  117816. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000 */
  117817. sp_384_mont_sqr_n_12(t2, t1, 31, p384_mod, p384_mp_mod);
  117818. /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff */
  117819. sp_384_mont_mul_12(t1, t4, t2, p384_mod, p384_mp_mod);
  117820. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff0 */
  117821. sp_384_mont_sqr_n_12(t2, t1, 4, p384_mod, p384_mp_mod);
  117822. /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc */
  117823. sp_384_mont_mul_12(t1, t5, t2, p384_mod, p384_mp_mod);
  117824. /* t2 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000 */
  117825. sp_384_mont_sqr_n_12(t2, t1, 62, p384_mod, p384_mp_mod);
  117826. /* t1 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000001 */
  117827. sp_384_mont_mul_12(t1, y, t2, p384_mod, p384_mp_mod);
  117828. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc00000000000000040000000 */
  117829. sp_384_mont_sqr_n_12(y, t1, 30, p384_mod, p384_mp_mod);
  117830. }
  117831. }
  117832. #ifdef WOLFSSL_SP_SMALL_STACK
  117833. if (t1 != NULL)
  117834. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  117835. #endif
  117836. return err;
  117837. }
  117838. /* Uncompress the point given the X ordinate.
  117839. *
  117840. * xm X ordinate.
  117841. * odd Whether the Y ordinate is odd.
  117842. * ym Calculated Y ordinate.
  117843. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  117844. */
  117845. int sp_ecc_uncompress_384(mp_int* xm, int odd, mp_int* ym)
  117846. {
  117847. #ifdef WOLFSSL_SP_SMALL_STACK
  117848. sp_digit* x = NULL;
  117849. #else
  117850. sp_digit x[4 * 12];
  117851. #endif
  117852. sp_digit* y = NULL;
  117853. int err = MP_OKAY;
  117854. #ifdef WOLFSSL_SP_SMALL_STACK
  117855. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 12, NULL, DYNAMIC_TYPE_ECC);
  117856. if (x == NULL)
  117857. err = MEMORY_E;
  117858. #endif
  117859. if (err == MP_OKAY) {
  117860. y = x + 2 * 12;
  117861. sp_384_from_mp(x, 12, xm);
  117862. err = sp_384_mod_mul_norm_12(x, x, p384_mod);
  117863. }
  117864. if (err == MP_OKAY) {
  117865. /* y = x^3 */
  117866. {
  117867. sp_384_mont_sqr_12(y, x, p384_mod, p384_mp_mod);
  117868. sp_384_mont_mul_12(y, y, x, p384_mod, p384_mp_mod);
  117869. }
  117870. /* y = x^3 - 3x */
  117871. sp_384_mont_sub_12(y, y, x, p384_mod);
  117872. sp_384_mont_sub_12(y, y, x, p384_mod);
  117873. sp_384_mont_sub_12(y, y, x, p384_mod);
  117874. /* y = x^3 - 3x + b */
  117875. err = sp_384_mod_mul_norm_12(x, p384_b, p384_mod);
  117876. }
  117877. if (err == MP_OKAY) {
  117878. sp_384_mont_add_12(y, y, x, p384_mod);
  117879. /* y = sqrt(x^3 - 3x + b) */
  117880. err = sp_384_mont_sqrt_12(y);
  117881. }
  117882. if (err == MP_OKAY) {
  117883. XMEMSET(y + 12, 0, 12U * sizeof(sp_digit));
  117884. sp_384_mont_reduce_12(y, p384_mod, p384_mp_mod);
  117885. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  117886. sp_384_mont_sub_12(y, p384_mod, y, p384_mod);
  117887. }
  117888. err = sp_384_to_mp(y, ym);
  117889. }
  117890. #ifdef WOLFSSL_SP_SMALL_STACK
  117891. if (x != NULL)
  117892. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  117893. #endif
  117894. return err;
  117895. }
  117896. #endif
  117897. #endif /* WOLFSSL_SP_384 */
  117898. #ifdef WOLFSSL_SP_521
  117899. /* Point structure to use. */
  117900. typedef struct sp_point_521 {
  117901. /* X ordinate of point. */
  117902. sp_digit x[2 * 17];
  117903. /* Y ordinate of point. */
  117904. sp_digit y[2 * 17];
  117905. /* Z ordinate of point. */
  117906. sp_digit z[2 * 17];
  117907. /* Indicates point is at infinity. */
  117908. int infinity;
  117909. } sp_point_521;
  117910. /* The modulus (prime) of the curve P521. */
  117911. static const sp_digit p521_mod[17] = {
  117912. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
  117913. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
  117914. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  117915. };
  117916. /* The Montgomery normalizer for modulus of the curve P521. */
  117917. static const sp_digit p521_norm_mod[17] = {
  117918. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  117919. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  117920. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  117921. };
  117922. /* The Montgomery multiplier for modulus of the curve P521. */
  117923. static sp_digit p521_mp_mod = 0x00000001;
  117924. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  117925. defined(HAVE_ECC_VERIFY)
  117926. /* The order of the curve P521. */
  117927. static const sp_digit p521_order[17] = {
  117928. 0x91386409,0xbb6fb71e,0x899c47ae,0x3bb5c9b8,0xf709a5d0,0x7fcc0148,
  117929. 0xbf2f966b,0x51868783,0xfffffffa,0xffffffff,0xffffffff,0xffffffff,
  117930. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  117931. };
  117932. #endif
  117933. /* The order of the curve P521 minus 2. */
  117934. static const sp_digit p521_order2[17] = {
  117935. 0x91386407,0xbb6fb71e,0x899c47ae,0x3bb5c9b8,0xf709a5d0,0x7fcc0148,
  117936. 0xbf2f966b,0x51868783,0xfffffffa,0xffffffff,0xffffffff,0xffffffff,
  117937. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  117938. };
  117939. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  117940. /* The Montgomery normalizer for order of the curve P521. */
  117941. static const sp_digit p521_norm_order[17] = {
  117942. 0x6ec79bf7,0x449048e1,0x7663b851,0xc44a3647,0x08f65a2f,0x8033feb7,
  117943. 0x40d06994,0xae79787c,0x00000005,0x00000000,0x00000000,0x00000000,
  117944. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  117945. };
  117946. #endif
  117947. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  117948. /* The Montgomery multiplier for order of the curve P521. */
  117949. static sp_digit p521_mp_order = 0x79a995c7;
  117950. #endif
  117951. /* The base point of curve P521. */
  117952. static const sp_point_521 p521_base = {
  117953. /* X ordinate */
  117954. {
  117955. 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  117956. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  117957. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6,
  117958. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117959. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117960. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117961. (sp_digit)0, (sp_digit)0
  117962. },
  117963. /* Y ordinate */
  117964. {
  117965. 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  117966. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  117967. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118,
  117968. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117969. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117970. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117971. (sp_digit)0, (sp_digit)0
  117972. },
  117973. /* Z ordinate */
  117974. {
  117975. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  117976. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  117977. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  117978. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117979. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117980. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117981. (sp_digit)0, (sp_digit)0
  117982. },
  117983. /* infinity */
  117984. 0
  117985. };
  117986. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  117987. static const sp_digit p521_b[17] = {
  117988. 0x6b503f00,0xef451fd4,0x3d2c34f1,0x3573df88,0x3bb1bf07,0x1652c0bd,
  117989. 0xec7e937b,0x56193951,0x8ef109e1,0xb8b48991,0x99b315f3,0xa2da725b,
  117990. 0xb68540ee,0x929a21a0,0x8e1c9a1f,0x953eb961,0x00000051
  117991. };
  117992. #endif
  117993. /* Multiply a and b into r. (r = a * b)
  117994. *
  117995. * r A single precision integer.
  117996. * a A single precision integer.
  117997. * b A single precision integer.
  117998. */
  117999. SP_NOINLINE static void sp_521_mul_17(sp_digit* r, const sp_digit* a,
  118000. const sp_digit* b)
  118001. {
  118002. sp_digit t[17 * 2];
  118003. sp_digit* tmp = t;
  118004. __asm__ __volatile__ (
  118005. "movs r3, #0\n\t"
  118006. "movs r4, #0\n\t"
  118007. "mov r8, r3\n\t"
  118008. "mov r11, %[tmp]\n\t"
  118009. "mov r9, %[a]\n\t"
  118010. "mov r10, %[b]\n\t"
  118011. "movs r6, #0x44\n\t"
  118012. "add r6, r6, r9\n\t"
  118013. "mov r12, r6\n\t"
  118014. "\n"
  118015. "L_sp_521_mul_17_words_%=:\n\t"
  118016. "movs %[tmp], #0\n\t"
  118017. "movs r5, #0\n\t"
  118018. "movs r6, #0x40\n\t"
  118019. "mov %[a], r8\n\t"
  118020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118021. "subs %[a], %[a], r6\n\t"
  118022. #else
  118023. "sub %[a], %[a], r6\n\t"
  118024. #endif
  118025. #ifdef WOLFSSL_KEIL
  118026. "sbcs r6, r6, r6\n\t"
  118027. #elif defined(__clang__)
  118028. "sbcs r6, r6\n\t"
  118029. #else
  118030. "sbc r6, r6\n\t"
  118031. #endif
  118032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118033. "mvns r6, r6\n\t"
  118034. #else
  118035. "mvn r6, r6\n\t"
  118036. #endif
  118037. #ifdef WOLFSSL_KEIL
  118038. "ands %[a], %[a], r6\n\t"
  118039. #elif defined(__clang__)
  118040. "ands %[a], r6\n\t"
  118041. #else
  118042. "and %[a], r6\n\t"
  118043. #endif
  118044. "mov %[b], r8\n\t"
  118045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118046. "subs %[b], %[b], %[a]\n\t"
  118047. #else
  118048. "sub %[b], %[b], %[a]\n\t"
  118049. #endif
  118050. "add %[a], %[a], r9\n\t"
  118051. "add %[b], %[b], r10\n\t"
  118052. "\n"
  118053. "L_sp_521_mul_17_mul_%=:\n\t"
  118054. "# Multiply Start\n\t"
  118055. "ldrh r6, [%[a]]\n\t"
  118056. "ldrh r7, [%[b]]\n\t"
  118057. #ifdef WOLFSSL_KEIL
  118058. "muls r7, r6, r7\n\t"
  118059. #elif defined(__clang__)
  118060. "muls r7, r6\n\t"
  118061. #else
  118062. "mul r7, r6\n\t"
  118063. #endif
  118064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118065. "adds r3, r3, r7\n\t"
  118066. #else
  118067. "add r3, r3, r7\n\t"
  118068. #endif
  118069. #ifdef WOLFSSL_KEIL
  118070. "adcs r4, r4, %[tmp]\n\t"
  118071. #elif defined(__clang__)
  118072. "adcs r4, %[tmp]\n\t"
  118073. #else
  118074. "adc r4, %[tmp]\n\t"
  118075. #endif
  118076. #ifdef WOLFSSL_KEIL
  118077. "adcs r5, r5, %[tmp]\n\t"
  118078. #elif defined(__clang__)
  118079. "adcs r5, %[tmp]\n\t"
  118080. #else
  118081. "adc r5, %[tmp]\n\t"
  118082. #endif
  118083. "ldr r7, [%[b]]\n\t"
  118084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118085. "lsrs r7, r7, #16\n\t"
  118086. #else
  118087. "lsr r7, r7, #16\n\t"
  118088. #endif
  118089. #ifdef WOLFSSL_KEIL
  118090. "muls r6, r7, r6\n\t"
  118091. #elif defined(__clang__)
  118092. "muls r6, r7\n\t"
  118093. #else
  118094. "mul r6, r7\n\t"
  118095. #endif
  118096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118097. "lsrs r7, r6, #16\n\t"
  118098. #else
  118099. "lsr r7, r6, #16\n\t"
  118100. #endif
  118101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118102. "lsls r6, r6, #16\n\t"
  118103. #else
  118104. "lsl r6, r6, #16\n\t"
  118105. #endif
  118106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118107. "adds r3, r3, r6\n\t"
  118108. #else
  118109. "add r3, r3, r6\n\t"
  118110. #endif
  118111. #ifdef WOLFSSL_KEIL
  118112. "adcs r4, r4, r7\n\t"
  118113. #elif defined(__clang__)
  118114. "adcs r4, r7\n\t"
  118115. #else
  118116. "adc r4, r7\n\t"
  118117. #endif
  118118. #ifdef WOLFSSL_KEIL
  118119. "adcs r5, r5, %[tmp]\n\t"
  118120. #elif defined(__clang__)
  118121. "adcs r5, %[tmp]\n\t"
  118122. #else
  118123. "adc r5, %[tmp]\n\t"
  118124. #endif
  118125. "ldr r6, [%[a]]\n\t"
  118126. "ldr r7, [%[b]]\n\t"
  118127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118128. "lsrs r6, r6, #16\n\t"
  118129. #else
  118130. "lsr r6, r6, #16\n\t"
  118131. #endif
  118132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118133. "lsrs r7, r7, #16\n\t"
  118134. #else
  118135. "lsr r7, r7, #16\n\t"
  118136. #endif
  118137. #ifdef WOLFSSL_KEIL
  118138. "muls r7, r6, r7\n\t"
  118139. #elif defined(__clang__)
  118140. "muls r7, r6\n\t"
  118141. #else
  118142. "mul r7, r6\n\t"
  118143. #endif
  118144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118145. "adds r4, r4, r7\n\t"
  118146. #else
  118147. "add r4, r4, r7\n\t"
  118148. #endif
  118149. #ifdef WOLFSSL_KEIL
  118150. "adcs r5, r5, %[tmp]\n\t"
  118151. #elif defined(__clang__)
  118152. "adcs r5, %[tmp]\n\t"
  118153. #else
  118154. "adc r5, %[tmp]\n\t"
  118155. #endif
  118156. "ldrh r7, [%[b]]\n\t"
  118157. #ifdef WOLFSSL_KEIL
  118158. "muls r6, r7, r6\n\t"
  118159. #elif defined(__clang__)
  118160. "muls r6, r7\n\t"
  118161. #else
  118162. "mul r6, r7\n\t"
  118163. #endif
  118164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118165. "lsrs r7, r6, #16\n\t"
  118166. #else
  118167. "lsr r7, r6, #16\n\t"
  118168. #endif
  118169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118170. "lsls r6, r6, #16\n\t"
  118171. #else
  118172. "lsl r6, r6, #16\n\t"
  118173. #endif
  118174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118175. "adds r3, r3, r6\n\t"
  118176. #else
  118177. "add r3, r3, r6\n\t"
  118178. #endif
  118179. #ifdef WOLFSSL_KEIL
  118180. "adcs r4, r4, r7\n\t"
  118181. #elif defined(__clang__)
  118182. "adcs r4, r7\n\t"
  118183. #else
  118184. "adc r4, r7\n\t"
  118185. #endif
  118186. #ifdef WOLFSSL_KEIL
  118187. "adcs r5, r5, %[tmp]\n\t"
  118188. #elif defined(__clang__)
  118189. "adcs r5, %[tmp]\n\t"
  118190. #else
  118191. "adc r5, %[tmp]\n\t"
  118192. #endif
  118193. "# Multiply Done\n\t"
  118194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118195. "adds %[a], %[a], #4\n\t"
  118196. #else
  118197. "add %[a], %[a], #4\n\t"
  118198. #endif
  118199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118200. "subs %[b], %[b], #4\n\t"
  118201. #else
  118202. "sub %[b], %[b], #4\n\t"
  118203. #endif
  118204. "cmp %[a], r12\n\t"
  118205. "beq L_sp_521_mul_17_done_mul_%=\n\t"
  118206. "mov r6, r8\n\t"
  118207. "add r6, r6, r9\n\t"
  118208. "cmp %[a], r6\n\t"
  118209. "ble L_sp_521_mul_17_mul_%=\n\t"
  118210. "\n"
  118211. "L_sp_521_mul_17_done_mul_%=:\n\t"
  118212. "mov %[tmp], r11\n\t"
  118213. "mov r7, r8\n\t"
  118214. "str r3, [%[tmp], r7]\n\t"
  118215. "movs r3, r4\n\t"
  118216. "movs r4, r5\n\t"
  118217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118218. "adds r7, r7, #4\n\t"
  118219. #else
  118220. "add r7, r7, #4\n\t"
  118221. #endif
  118222. "mov r8, r7\n\t"
  118223. "movs r6, #0x80\n\t"
  118224. "cmp r7, r6\n\t"
  118225. "ble L_sp_521_mul_17_words_%=\n\t"
  118226. "str r3, [%[tmp], r7]\n\t"
  118227. "mov %[a], r9\n\t"
  118228. "mov %[b], r10\n\t"
  118229. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  118230. :
  118231. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  118232. );
  118233. XMEMCPY(r, t, sizeof(t));
  118234. }
  118235. /* Square a and put result in r. (r = a * a)
  118236. *
  118237. * r A single precision integer.
  118238. * a A single precision integer.
  118239. */
  118240. SP_NOINLINE static void sp_521_sqr_17(sp_digit* r, const sp_digit* a)
  118241. {
  118242. __asm__ __volatile__ (
  118243. "movs r3, #0\n\t"
  118244. "movs r4, #0\n\t"
  118245. "movs r5, #0\n\t"
  118246. "mov r8, r3\n\t"
  118247. "mov r11, %[r]\n\t"
  118248. "movs r6, #0x88\n\t"
  118249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118250. "negs r6, r6\n\t"
  118251. #else
  118252. "neg r6, r6\n\t"
  118253. #endif
  118254. "add sp, sp, r6\n\t"
  118255. "mov r10, sp\n\t"
  118256. "mov r9, %[a]\n\t"
  118257. "\n"
  118258. "L_sp_521_sqr_17_words_%=:\n\t"
  118259. "movs %[r], #0\n\t"
  118260. "movs r6, #0x40\n\t"
  118261. "mov %[a], r8\n\t"
  118262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118263. "subs %[a], %[a], r6\n\t"
  118264. #else
  118265. "sub %[a], %[a], r6\n\t"
  118266. #endif
  118267. #ifdef WOLFSSL_KEIL
  118268. "sbcs r6, r6, r6\n\t"
  118269. #elif defined(__clang__)
  118270. "sbcs r6, r6\n\t"
  118271. #else
  118272. "sbc r6, r6\n\t"
  118273. #endif
  118274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118275. "mvns r6, r6\n\t"
  118276. #else
  118277. "mvn r6, r6\n\t"
  118278. #endif
  118279. #ifdef WOLFSSL_KEIL
  118280. "ands %[a], %[a], r6\n\t"
  118281. #elif defined(__clang__)
  118282. "ands %[a], r6\n\t"
  118283. #else
  118284. "and %[a], r6\n\t"
  118285. #endif
  118286. "mov r2, r8\n\t"
  118287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118288. "subs r2, r2, %[a]\n\t"
  118289. #else
  118290. "sub r2, r2, %[a]\n\t"
  118291. #endif
  118292. "add %[a], %[a], r9\n\t"
  118293. "add r2, r2, r9\n\t"
  118294. "\n"
  118295. "L_sp_521_sqr_17_mul_%=:\n\t"
  118296. "cmp r2, %[a]\n\t"
  118297. "beq L_sp_521_sqr_17_sqr_%=\n\t"
  118298. "# Multiply * 2: Start\n\t"
  118299. "ldrh r6, [%[a]]\n\t"
  118300. "ldrh r7, [r2]\n\t"
  118301. #ifdef WOLFSSL_KEIL
  118302. "muls r7, r6, r7\n\t"
  118303. #elif defined(__clang__)
  118304. "muls r7, r6\n\t"
  118305. #else
  118306. "mul r7, r6\n\t"
  118307. #endif
  118308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118309. "adds r3, r3, r7\n\t"
  118310. #else
  118311. "add r3, r3, r7\n\t"
  118312. #endif
  118313. #ifdef WOLFSSL_KEIL
  118314. "adcs r4, r4, %[r]\n\t"
  118315. #elif defined(__clang__)
  118316. "adcs r4, %[r]\n\t"
  118317. #else
  118318. "adc r4, %[r]\n\t"
  118319. #endif
  118320. #ifdef WOLFSSL_KEIL
  118321. "adcs r5, r5, %[r]\n\t"
  118322. #elif defined(__clang__)
  118323. "adcs r5, %[r]\n\t"
  118324. #else
  118325. "adc r5, %[r]\n\t"
  118326. #endif
  118327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118328. "adds r3, r3, r7\n\t"
  118329. #else
  118330. "add r3, r3, r7\n\t"
  118331. #endif
  118332. #ifdef WOLFSSL_KEIL
  118333. "adcs r4, r4, %[r]\n\t"
  118334. #elif defined(__clang__)
  118335. "adcs r4, %[r]\n\t"
  118336. #else
  118337. "adc r4, %[r]\n\t"
  118338. #endif
  118339. #ifdef WOLFSSL_KEIL
  118340. "adcs r5, r5, %[r]\n\t"
  118341. #elif defined(__clang__)
  118342. "adcs r5, %[r]\n\t"
  118343. #else
  118344. "adc r5, %[r]\n\t"
  118345. #endif
  118346. "ldr r7, [r2]\n\t"
  118347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118348. "lsrs r7, r7, #16\n\t"
  118349. #else
  118350. "lsr r7, r7, #16\n\t"
  118351. #endif
  118352. #ifdef WOLFSSL_KEIL
  118353. "muls r6, r7, r6\n\t"
  118354. #elif defined(__clang__)
  118355. "muls r6, r7\n\t"
  118356. #else
  118357. "mul r6, r7\n\t"
  118358. #endif
  118359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118360. "lsrs r7, r6, #16\n\t"
  118361. #else
  118362. "lsr r7, r6, #16\n\t"
  118363. #endif
  118364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118365. "lsls r6, r6, #16\n\t"
  118366. #else
  118367. "lsl r6, r6, #16\n\t"
  118368. #endif
  118369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118370. "adds r3, r3, r6\n\t"
  118371. #else
  118372. "add r3, r3, r6\n\t"
  118373. #endif
  118374. #ifdef WOLFSSL_KEIL
  118375. "adcs r4, r4, r7\n\t"
  118376. #elif defined(__clang__)
  118377. "adcs r4, r7\n\t"
  118378. #else
  118379. "adc r4, r7\n\t"
  118380. #endif
  118381. #ifdef WOLFSSL_KEIL
  118382. "adcs r5, r5, %[r]\n\t"
  118383. #elif defined(__clang__)
  118384. "adcs r5, %[r]\n\t"
  118385. #else
  118386. "adc r5, %[r]\n\t"
  118387. #endif
  118388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118389. "adds r3, r3, r6\n\t"
  118390. #else
  118391. "add r3, r3, r6\n\t"
  118392. #endif
  118393. #ifdef WOLFSSL_KEIL
  118394. "adcs r4, r4, r7\n\t"
  118395. #elif defined(__clang__)
  118396. "adcs r4, r7\n\t"
  118397. #else
  118398. "adc r4, r7\n\t"
  118399. #endif
  118400. #ifdef WOLFSSL_KEIL
  118401. "adcs r5, r5, %[r]\n\t"
  118402. #elif defined(__clang__)
  118403. "adcs r5, %[r]\n\t"
  118404. #else
  118405. "adc r5, %[r]\n\t"
  118406. #endif
  118407. "ldr r6, [%[a]]\n\t"
  118408. "ldr r7, [r2]\n\t"
  118409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118410. "lsrs r6, r6, #16\n\t"
  118411. #else
  118412. "lsr r6, r6, #16\n\t"
  118413. #endif
  118414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118415. "lsrs r7, r7, #16\n\t"
  118416. #else
  118417. "lsr r7, r7, #16\n\t"
  118418. #endif
  118419. #ifdef WOLFSSL_KEIL
  118420. "muls r7, r6, r7\n\t"
  118421. #elif defined(__clang__)
  118422. "muls r7, r6\n\t"
  118423. #else
  118424. "mul r7, r6\n\t"
  118425. #endif
  118426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118427. "adds r4, r4, r7\n\t"
  118428. #else
  118429. "add r4, r4, r7\n\t"
  118430. #endif
  118431. #ifdef WOLFSSL_KEIL
  118432. "adcs r5, r5, %[r]\n\t"
  118433. #elif defined(__clang__)
  118434. "adcs r5, %[r]\n\t"
  118435. #else
  118436. "adc r5, %[r]\n\t"
  118437. #endif
  118438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118439. "adds r4, r4, r7\n\t"
  118440. #else
  118441. "add r4, r4, r7\n\t"
  118442. #endif
  118443. #ifdef WOLFSSL_KEIL
  118444. "adcs r5, r5, %[r]\n\t"
  118445. #elif defined(__clang__)
  118446. "adcs r5, %[r]\n\t"
  118447. #else
  118448. "adc r5, %[r]\n\t"
  118449. #endif
  118450. "ldrh r7, [r2]\n\t"
  118451. #ifdef WOLFSSL_KEIL
  118452. "muls r6, r7, r6\n\t"
  118453. #elif defined(__clang__)
  118454. "muls r6, r7\n\t"
  118455. #else
  118456. "mul r6, r7\n\t"
  118457. #endif
  118458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118459. "lsrs r7, r6, #16\n\t"
  118460. #else
  118461. "lsr r7, r6, #16\n\t"
  118462. #endif
  118463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118464. "lsls r6, r6, #16\n\t"
  118465. #else
  118466. "lsl r6, r6, #16\n\t"
  118467. #endif
  118468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118469. "adds r3, r3, r6\n\t"
  118470. #else
  118471. "add r3, r3, r6\n\t"
  118472. #endif
  118473. #ifdef WOLFSSL_KEIL
  118474. "adcs r4, r4, r7\n\t"
  118475. #elif defined(__clang__)
  118476. "adcs r4, r7\n\t"
  118477. #else
  118478. "adc r4, r7\n\t"
  118479. #endif
  118480. #ifdef WOLFSSL_KEIL
  118481. "adcs r5, r5, %[r]\n\t"
  118482. #elif defined(__clang__)
  118483. "adcs r5, %[r]\n\t"
  118484. #else
  118485. "adc r5, %[r]\n\t"
  118486. #endif
  118487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118488. "adds r3, r3, r6\n\t"
  118489. #else
  118490. "add r3, r3, r6\n\t"
  118491. #endif
  118492. #ifdef WOLFSSL_KEIL
  118493. "adcs r4, r4, r7\n\t"
  118494. #elif defined(__clang__)
  118495. "adcs r4, r7\n\t"
  118496. #else
  118497. "adc r4, r7\n\t"
  118498. #endif
  118499. #ifdef WOLFSSL_KEIL
  118500. "adcs r5, r5, %[r]\n\t"
  118501. #elif defined(__clang__)
  118502. "adcs r5, %[r]\n\t"
  118503. #else
  118504. "adc r5, %[r]\n\t"
  118505. #endif
  118506. "# Multiply * 2: Done\n\t"
  118507. "bal L_sp_521_sqr_17_done_sqr_%=\n\t"
  118508. "\n"
  118509. "L_sp_521_sqr_17_sqr_%=:\n\t"
  118510. "mov r12, r2\n\t"
  118511. "ldr r2, [%[a]]\n\t"
  118512. "# Square: Start\n\t"
  118513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118514. "lsrs r7, r2, #16\n\t"
  118515. #else
  118516. "lsr r7, r2, #16\n\t"
  118517. #endif
  118518. "uxth r6, r2\n\t"
  118519. #ifdef WOLFSSL_KEIL
  118520. "muls r6, r6, r6\n\t"
  118521. #elif defined(__clang__)
  118522. "muls r6, r6\n\t"
  118523. #else
  118524. "mul r6, r6\n\t"
  118525. #endif
  118526. #ifdef WOLFSSL_KEIL
  118527. "muls r7, r7, r7\n\t"
  118528. #elif defined(__clang__)
  118529. "muls r7, r7\n\t"
  118530. #else
  118531. "mul r7, r7\n\t"
  118532. #endif
  118533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118534. "adds r3, r3, r6\n\t"
  118535. #else
  118536. "add r3, r3, r6\n\t"
  118537. #endif
  118538. #ifdef WOLFSSL_KEIL
  118539. "adcs r4, r4, r7\n\t"
  118540. #elif defined(__clang__)
  118541. "adcs r4, r7\n\t"
  118542. #else
  118543. "adc r4, r7\n\t"
  118544. #endif
  118545. #ifdef WOLFSSL_KEIL
  118546. "adcs r5, r5, %[r]\n\t"
  118547. #elif defined(__clang__)
  118548. "adcs r5, %[r]\n\t"
  118549. #else
  118550. "adc r5, %[r]\n\t"
  118551. #endif
  118552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118553. "lsrs r7, r2, #16\n\t"
  118554. #else
  118555. "lsr r7, r2, #16\n\t"
  118556. #endif
  118557. "uxth r6, r2\n\t"
  118558. #ifdef WOLFSSL_KEIL
  118559. "muls r6, r7, r6\n\t"
  118560. #elif defined(__clang__)
  118561. "muls r6, r7\n\t"
  118562. #else
  118563. "mul r6, r7\n\t"
  118564. #endif
  118565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118566. "lsrs r7, r6, #15\n\t"
  118567. #else
  118568. "lsr r7, r6, #15\n\t"
  118569. #endif
  118570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118571. "lsls r6, r6, #17\n\t"
  118572. #else
  118573. "lsl r6, r6, #17\n\t"
  118574. #endif
  118575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118576. "adds r3, r3, r6\n\t"
  118577. #else
  118578. "add r3, r3, r6\n\t"
  118579. #endif
  118580. #ifdef WOLFSSL_KEIL
  118581. "adcs r4, r4, r7\n\t"
  118582. #elif defined(__clang__)
  118583. "adcs r4, r7\n\t"
  118584. #else
  118585. "adc r4, r7\n\t"
  118586. #endif
  118587. #ifdef WOLFSSL_KEIL
  118588. "adcs r5, r5, %[r]\n\t"
  118589. #elif defined(__clang__)
  118590. "adcs r5, %[r]\n\t"
  118591. #else
  118592. "adc r5, %[r]\n\t"
  118593. #endif
  118594. "# Square: Done\n\t"
  118595. "mov r2, r12\n\t"
  118596. "\n"
  118597. "L_sp_521_sqr_17_done_sqr_%=:\n\t"
  118598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118599. "adds %[a], %[a], #4\n\t"
  118600. #else
  118601. "add %[a], %[a], #4\n\t"
  118602. #endif
  118603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118604. "subs r2, r2, #4\n\t"
  118605. #else
  118606. "sub r2, r2, #4\n\t"
  118607. #endif
  118608. "movs r6, #0x44\n\t"
  118609. "add r6, r6, r9\n\t"
  118610. "cmp %[a], r6\n\t"
  118611. "beq L_sp_521_sqr_17_done_mul_%=\n\t"
  118612. "cmp %[a], r2\n\t"
  118613. "bgt L_sp_521_sqr_17_done_mul_%=\n\t"
  118614. "mov r7, r8\n\t"
  118615. "add r7, r7, r9\n\t"
  118616. "cmp %[a], r7\n\t"
  118617. "ble L_sp_521_sqr_17_mul_%=\n\t"
  118618. "\n"
  118619. "L_sp_521_sqr_17_done_mul_%=:\n\t"
  118620. "mov %[r], r10\n\t"
  118621. "mov r7, r8\n\t"
  118622. "str r3, [%[r], r7]\n\t"
  118623. "movs r3, r4\n\t"
  118624. "movs r4, r5\n\t"
  118625. "movs r5, #0\n\t"
  118626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118627. "adds r7, r7, #4\n\t"
  118628. #else
  118629. "add r7, r7, #4\n\t"
  118630. #endif
  118631. "mov r8, r7\n\t"
  118632. "movs r6, #0x80\n\t"
  118633. "cmp r7, r6\n\t"
  118634. "ble L_sp_521_sqr_17_words_%=\n\t"
  118635. "mov %[a], r9\n\t"
  118636. "str r3, [%[r], r7]\n\t"
  118637. "mov %[r], r11\n\t"
  118638. "mov %[a], r10\n\t"
  118639. "movs r3, #0x84\n\t"
  118640. "\n"
  118641. "L_sp_521_sqr_17_store_%=:\n\t"
  118642. "ldr r6, [%[a], r3]\n\t"
  118643. "str r6, [%[r], r3]\n\t"
  118644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118645. "subs r3, r3, #4\n\t"
  118646. #else
  118647. "sub r3, r3, #4\n\t"
  118648. #endif
  118649. "bge L_sp_521_sqr_17_store_%=\n\t"
  118650. "movs r6, #0x88\n\t"
  118651. "add sp, sp, r6\n\t"
  118652. : [r] "+l" (r), [a] "+l" (a)
  118653. :
  118654. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  118655. );
  118656. }
  118657. #ifdef WOLFSSL_SP_SMALL
  118658. /* Add b to a into r. (r = a + b)
  118659. *
  118660. * r A single precision integer.
  118661. * a A single precision integer.
  118662. * b A single precision integer.
  118663. */
  118664. SP_NOINLINE static sp_digit sp_521_add_17(sp_digit* r, const sp_digit* a,
  118665. const sp_digit* b)
  118666. {
  118667. __asm__ __volatile__ (
  118668. "movs r6, %[a]\n\t"
  118669. "movs r7, #0\n\t"
  118670. "movs r3, #0\n\t"
  118671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118672. "adds r6, r6, #0x44\n\t"
  118673. #else
  118674. "add r6, r6, #0x44\n\t"
  118675. #endif
  118676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118677. "subs r7, r7, #1\n\t"
  118678. #else
  118679. "sub r7, r7, #1\n\t"
  118680. #endif
  118681. "\n"
  118682. "L_sp_521_add_17_word_%=:\n\t"
  118683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118684. "adds r3, r3, r7\n\t"
  118685. #else
  118686. "add r3, r3, r7\n\t"
  118687. #endif
  118688. "ldr r4, [%[a]]\n\t"
  118689. "ldr r5, [%[b]]\n\t"
  118690. #ifdef WOLFSSL_KEIL
  118691. "adcs r4, r4, r5\n\t"
  118692. #elif defined(__clang__)
  118693. "adcs r4, r5\n\t"
  118694. #else
  118695. "adc r4, r5\n\t"
  118696. #endif
  118697. "str r4, [%[r]]\n\t"
  118698. "movs r3, #0\n\t"
  118699. #ifdef WOLFSSL_KEIL
  118700. "adcs r3, r3, r3\n\t"
  118701. #elif defined(__clang__)
  118702. "adcs r3, r3\n\t"
  118703. #else
  118704. "adc r3, r3\n\t"
  118705. #endif
  118706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118707. "adds %[a], %[a], #4\n\t"
  118708. #else
  118709. "add %[a], %[a], #4\n\t"
  118710. #endif
  118711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118712. "adds %[b], %[b], #4\n\t"
  118713. #else
  118714. "add %[b], %[b], #4\n\t"
  118715. #endif
  118716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118717. "adds %[r], %[r], #4\n\t"
  118718. #else
  118719. "add %[r], %[r], #4\n\t"
  118720. #endif
  118721. "cmp %[a], r6\n\t"
  118722. "bne L_sp_521_add_17_word_%=\n\t"
  118723. "movs %[r], r3\n\t"
  118724. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  118725. :
  118726. : "memory", "r3", "r4", "r5", "r6", "r7"
  118727. );
  118728. return (uint32_t)(size_t)r;
  118729. }
  118730. #else
  118731. /* Add b to a into r. (r = a + b)
  118732. *
  118733. * r A single precision integer.
  118734. * a A single precision integer.
  118735. * b A single precision integer.
  118736. */
  118737. SP_NOINLINE static sp_digit sp_521_add_17(sp_digit* r, const sp_digit* a,
  118738. const sp_digit* b)
  118739. {
  118740. __asm__ __volatile__ (
  118741. "ldm %[b]!, {r5, r6}\n\t"
  118742. "ldm %[a]!, {r3, r4}\n\t"
  118743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118744. "adds r3, r3, r5\n\t"
  118745. #else
  118746. "add r3, r3, r5\n\t"
  118747. #endif
  118748. #ifdef WOLFSSL_KEIL
  118749. "adcs r4, r4, r6\n\t"
  118750. #elif defined(__clang__)
  118751. "adcs r4, r6\n\t"
  118752. #else
  118753. "adc r4, r6\n\t"
  118754. #endif
  118755. "stm %[r]!, {r3, r4}\n\t"
  118756. "ldm %[b]!, {r5, r6}\n\t"
  118757. "ldm %[a]!, {r3, r4}\n\t"
  118758. #ifdef WOLFSSL_KEIL
  118759. "adcs r3, r3, r5\n\t"
  118760. #elif defined(__clang__)
  118761. "adcs r3, r5\n\t"
  118762. #else
  118763. "adc r3, r5\n\t"
  118764. #endif
  118765. #ifdef WOLFSSL_KEIL
  118766. "adcs r4, r4, r6\n\t"
  118767. #elif defined(__clang__)
  118768. "adcs r4, r6\n\t"
  118769. #else
  118770. "adc r4, r6\n\t"
  118771. #endif
  118772. "stm %[r]!, {r3, r4}\n\t"
  118773. "ldm %[b]!, {r5, r6}\n\t"
  118774. "ldm %[a]!, {r3, r4}\n\t"
  118775. #ifdef WOLFSSL_KEIL
  118776. "adcs r3, r3, r5\n\t"
  118777. #elif defined(__clang__)
  118778. "adcs r3, r5\n\t"
  118779. #else
  118780. "adc r3, r5\n\t"
  118781. #endif
  118782. #ifdef WOLFSSL_KEIL
  118783. "adcs r4, r4, r6\n\t"
  118784. #elif defined(__clang__)
  118785. "adcs r4, r6\n\t"
  118786. #else
  118787. "adc r4, r6\n\t"
  118788. #endif
  118789. "stm %[r]!, {r3, r4}\n\t"
  118790. "ldm %[b]!, {r5, r6}\n\t"
  118791. "ldm %[a]!, {r3, r4}\n\t"
  118792. #ifdef WOLFSSL_KEIL
  118793. "adcs r3, r3, r5\n\t"
  118794. #elif defined(__clang__)
  118795. "adcs r3, r5\n\t"
  118796. #else
  118797. "adc r3, r5\n\t"
  118798. #endif
  118799. #ifdef WOLFSSL_KEIL
  118800. "adcs r4, r4, r6\n\t"
  118801. #elif defined(__clang__)
  118802. "adcs r4, r6\n\t"
  118803. #else
  118804. "adc r4, r6\n\t"
  118805. #endif
  118806. "stm %[r]!, {r3, r4}\n\t"
  118807. "ldm %[b]!, {r5, r6}\n\t"
  118808. "ldm %[a]!, {r3, r4}\n\t"
  118809. #ifdef WOLFSSL_KEIL
  118810. "adcs r3, r3, r5\n\t"
  118811. #elif defined(__clang__)
  118812. "adcs r3, r5\n\t"
  118813. #else
  118814. "adc r3, r5\n\t"
  118815. #endif
  118816. #ifdef WOLFSSL_KEIL
  118817. "adcs r4, r4, r6\n\t"
  118818. #elif defined(__clang__)
  118819. "adcs r4, r6\n\t"
  118820. #else
  118821. "adc r4, r6\n\t"
  118822. #endif
  118823. "stm %[r]!, {r3, r4}\n\t"
  118824. "ldm %[b]!, {r5, r6}\n\t"
  118825. "ldm %[a]!, {r3, r4}\n\t"
  118826. #ifdef WOLFSSL_KEIL
  118827. "adcs r3, r3, r5\n\t"
  118828. #elif defined(__clang__)
  118829. "adcs r3, r5\n\t"
  118830. #else
  118831. "adc r3, r5\n\t"
  118832. #endif
  118833. #ifdef WOLFSSL_KEIL
  118834. "adcs r4, r4, r6\n\t"
  118835. #elif defined(__clang__)
  118836. "adcs r4, r6\n\t"
  118837. #else
  118838. "adc r4, r6\n\t"
  118839. #endif
  118840. "stm %[r]!, {r3, r4}\n\t"
  118841. "ldm %[b]!, {r5, r6}\n\t"
  118842. "ldm %[a]!, {r3, r4}\n\t"
  118843. #ifdef WOLFSSL_KEIL
  118844. "adcs r3, r3, r5\n\t"
  118845. #elif defined(__clang__)
  118846. "adcs r3, r5\n\t"
  118847. #else
  118848. "adc r3, r5\n\t"
  118849. #endif
  118850. #ifdef WOLFSSL_KEIL
  118851. "adcs r4, r4, r6\n\t"
  118852. #elif defined(__clang__)
  118853. "adcs r4, r6\n\t"
  118854. #else
  118855. "adc r4, r6\n\t"
  118856. #endif
  118857. "stm %[r]!, {r3, r4}\n\t"
  118858. "ldm %[b]!, {r5, r6}\n\t"
  118859. "ldm %[a]!, {r3, r4}\n\t"
  118860. #ifdef WOLFSSL_KEIL
  118861. "adcs r3, r3, r5\n\t"
  118862. #elif defined(__clang__)
  118863. "adcs r3, r5\n\t"
  118864. #else
  118865. "adc r3, r5\n\t"
  118866. #endif
  118867. #ifdef WOLFSSL_KEIL
  118868. "adcs r4, r4, r6\n\t"
  118869. #elif defined(__clang__)
  118870. "adcs r4, r6\n\t"
  118871. #else
  118872. "adc r4, r6\n\t"
  118873. #endif
  118874. "stm %[r]!, {r3, r4}\n\t"
  118875. "ldr r5, [%[b]]\n\t"
  118876. "ldr r3, [%[a]]\n\t"
  118877. #ifdef WOLFSSL_KEIL
  118878. "adcs r3, r3, r5\n\t"
  118879. #elif defined(__clang__)
  118880. "adcs r3, r5\n\t"
  118881. #else
  118882. "adc r3, r5\n\t"
  118883. #endif
  118884. "str r3, [%[r]]\n\t"
  118885. "movs %[r], #0\n\t"
  118886. #ifdef WOLFSSL_KEIL
  118887. "adcs %[r], %[r], %[r]\n\t"
  118888. #elif defined(__clang__)
  118889. "adcs %[r], %[r]\n\t"
  118890. #else
  118891. "adc %[r], %[r]\n\t"
  118892. #endif
  118893. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  118894. :
  118895. : "memory", "r3", "r4", "r5", "r6"
  118896. );
  118897. return (uint32_t)(size_t)r;
  118898. }
  118899. #endif /* WOLFSSL_SP_SMALL */
  118900. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  118901. *
  118902. * r The resulting Montgomery form number.
  118903. * a The number to convert.
  118904. * m The modulus (prime).
  118905. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  118906. */
  118907. static int sp_521_mod_mul_norm_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  118908. {
  118909. (void)m;
  118910. if (r != a) {
  118911. XMEMCPY(r, a, 17 * sizeof(sp_digit));
  118912. }
  118913. return MP_OKAY;
  118914. }
  118915. /* Convert an mp_int to an array of sp_digit.
  118916. *
  118917. * r A single precision integer.
  118918. * size Maximum number of bytes to convert
  118919. * a A multi-precision integer.
  118920. */
  118921. static void sp_521_from_mp(sp_digit* r, int size, const mp_int* a)
  118922. {
  118923. #if DIGIT_BIT == 32
  118924. int i;
  118925. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  118926. int o = 0;
  118927. for (i = 0; i < size; i++) {
  118928. sp_digit mask = (sp_digit)0 - (j >> 31);
  118929. r[i] = a->dp[o] & mask;
  118930. j++;
  118931. o += (int)(j >> 31);
  118932. }
  118933. #elif DIGIT_BIT > 32
  118934. unsigned int i;
  118935. int j = 0;
  118936. word32 s = 0;
  118937. r[0] = 0;
  118938. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  118939. r[j] |= ((sp_digit)a->dp[i] << s);
  118940. r[j] &= 0xffffffff;
  118941. s = 32U - s;
  118942. if (j + 1 >= size) {
  118943. break;
  118944. }
  118945. /* lint allow cast of mismatch word32 and mp_digit */
  118946. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  118947. while ((s + 32U) <= (word32)DIGIT_BIT) {
  118948. s += 32U;
  118949. r[j] &= 0xffffffff;
  118950. if (j + 1 >= size) {
  118951. break;
  118952. }
  118953. if (s < (word32)DIGIT_BIT) {
  118954. /* lint allow cast of mismatch word32 and mp_digit */
  118955. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  118956. }
  118957. else {
  118958. r[++j] = (sp_digit)0;
  118959. }
  118960. }
  118961. s = (word32)DIGIT_BIT - s;
  118962. }
  118963. for (j++; j < size; j++) {
  118964. r[j] = 0;
  118965. }
  118966. #else
  118967. unsigned int i;
  118968. int j = 0;
  118969. int s = 0;
  118970. r[0] = 0;
  118971. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  118972. r[j] |= ((sp_digit)a->dp[i]) << s;
  118973. if (s + DIGIT_BIT >= 32) {
  118974. r[j] &= 0xffffffff;
  118975. if (j + 1 >= size) {
  118976. break;
  118977. }
  118978. s = 32 - s;
  118979. if (s == DIGIT_BIT) {
  118980. r[++j] = 0;
  118981. s = 0;
  118982. }
  118983. else {
  118984. r[++j] = a->dp[i] >> s;
  118985. s = DIGIT_BIT - s;
  118986. }
  118987. }
  118988. else {
  118989. s += DIGIT_BIT;
  118990. }
  118991. }
  118992. for (j++; j < size; j++) {
  118993. r[j] = 0;
  118994. }
  118995. #endif
  118996. }
  118997. /* Convert a point of type ecc_point to type sp_point_521.
  118998. *
  118999. * p Point of type sp_point_521 (result).
  119000. * pm Point of type ecc_point.
  119001. */
  119002. static void sp_521_point_from_ecc_point_17(sp_point_521* p,
  119003. const ecc_point* pm)
  119004. {
  119005. XMEMSET(p->x, 0, sizeof(p->x));
  119006. XMEMSET(p->y, 0, sizeof(p->y));
  119007. XMEMSET(p->z, 0, sizeof(p->z));
  119008. sp_521_from_mp(p->x, 17, pm->x);
  119009. sp_521_from_mp(p->y, 17, pm->y);
  119010. sp_521_from_mp(p->z, 17, pm->z);
  119011. p->infinity = 0;
  119012. }
  119013. /* Convert an array of sp_digit to an mp_int.
  119014. *
  119015. * a A single precision integer.
  119016. * r A multi-precision integer.
  119017. */
  119018. static int sp_521_to_mp(const sp_digit* a, mp_int* r)
  119019. {
  119020. int err;
  119021. err = mp_grow(r, (521 + DIGIT_BIT - 1) / DIGIT_BIT);
  119022. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  119023. #if DIGIT_BIT == 32
  119024. XMEMCPY(r->dp, a, sizeof(sp_digit) * 17);
  119025. r->used = 17;
  119026. mp_clamp(r);
  119027. #elif DIGIT_BIT < 32
  119028. int i;
  119029. int j = 0;
  119030. int s = 0;
  119031. r->dp[0] = 0;
  119032. for (i = 0; i < 17; i++) {
  119033. r->dp[j] |= (mp_digit)(a[i] << s);
  119034. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  119035. s = DIGIT_BIT - s;
  119036. r->dp[++j] = (mp_digit)(a[i] >> s);
  119037. while (s + DIGIT_BIT <= 32) {
  119038. s += DIGIT_BIT;
  119039. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  119040. if (s == SP_WORD_SIZE) {
  119041. r->dp[j] = 0;
  119042. }
  119043. else {
  119044. r->dp[j] = (mp_digit)(a[i] >> s);
  119045. }
  119046. }
  119047. s = 32 - s;
  119048. }
  119049. r->used = (521 + DIGIT_BIT - 1) / DIGIT_BIT;
  119050. mp_clamp(r);
  119051. #else
  119052. int i;
  119053. int j = 0;
  119054. int s = 0;
  119055. r->dp[0] = 0;
  119056. for (i = 0; i < 17; i++) {
  119057. r->dp[j] |= ((mp_digit)a[i]) << s;
  119058. if (s + 32 >= DIGIT_BIT) {
  119059. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  119060. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  119061. #endif
  119062. s = DIGIT_BIT - s;
  119063. r->dp[++j] = a[i] >> s;
  119064. s = 32 - s;
  119065. }
  119066. else {
  119067. s += 32;
  119068. }
  119069. }
  119070. r->used = (521 + DIGIT_BIT - 1) / DIGIT_BIT;
  119071. mp_clamp(r);
  119072. #endif
  119073. }
  119074. return err;
  119075. }
  119076. /* Convert a point of type sp_point_521 to type ecc_point.
  119077. *
  119078. * p Point of type sp_point_521.
  119079. * pm Point of type ecc_point (result).
  119080. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  119081. * MP_OKAY.
  119082. */
  119083. static int sp_521_point_to_ecc_point_17(const sp_point_521* p, ecc_point* pm)
  119084. {
  119085. int err;
  119086. err = sp_521_to_mp(p->x, pm->x);
  119087. if (err == MP_OKAY) {
  119088. err = sp_521_to_mp(p->y, pm->y);
  119089. }
  119090. if (err == MP_OKAY) {
  119091. err = sp_521_to_mp(p->z, pm->z);
  119092. }
  119093. return err;
  119094. }
  119095. /* Conditionally subtract b from a using the mask m.
  119096. * m is -1 to subtract and 0 when not copying.
  119097. *
  119098. * r A single precision number representing condition subtract result.
  119099. * a A single precision number to subtract from.
  119100. * b A single precision number to subtract.
  119101. * m Mask value to apply.
  119102. */
  119103. SP_NOINLINE static sp_digit sp_521_cond_sub_17(sp_digit* r, const sp_digit* a,
  119104. const sp_digit* b, sp_digit m)
  119105. {
  119106. __asm__ __volatile__ (
  119107. "movs r4, #0\n\t"
  119108. "movs r5, #0x44\n\t"
  119109. "mov r8, r5\n\t"
  119110. "movs r7, #0\n\t"
  119111. "\n"
  119112. "L_sp_521_cond_sub_17_words_%=:\n\t"
  119113. "ldr r6, [%[b], r7]\n\t"
  119114. #ifdef WOLFSSL_KEIL
  119115. "ands r6, r6, %[m]\n\t"
  119116. #elif defined(__clang__)
  119117. "ands r6, %[m]\n\t"
  119118. #else
  119119. "and r6, %[m]\n\t"
  119120. #endif
  119121. "movs r5, #0\n\t"
  119122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119123. "subs r5, r5, r4\n\t"
  119124. #else
  119125. "sub r5, r5, r4\n\t"
  119126. #endif
  119127. "ldr r5, [%[a], r7]\n\t"
  119128. #ifdef WOLFSSL_KEIL
  119129. "sbcs r5, r5, r6\n\t"
  119130. #elif defined(__clang__)
  119131. "sbcs r5, r6\n\t"
  119132. #else
  119133. "sbc r5, r6\n\t"
  119134. #endif
  119135. #ifdef WOLFSSL_KEIL
  119136. "sbcs r4, r4, r4\n\t"
  119137. #elif defined(__clang__)
  119138. "sbcs r4, r4\n\t"
  119139. #else
  119140. "sbc r4, r4\n\t"
  119141. #endif
  119142. "str r5, [%[r], r7]\n\t"
  119143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119144. "adds r7, r7, #4\n\t"
  119145. #else
  119146. "add r7, r7, #4\n\t"
  119147. #endif
  119148. "cmp r7, r8\n\t"
  119149. "blt L_sp_521_cond_sub_17_words_%=\n\t"
  119150. "movs %[r], r4\n\t"
  119151. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  119152. :
  119153. : "memory", "r4", "r5", "r6", "r7", "r8"
  119154. );
  119155. return (uint32_t)(size_t)r;
  119156. }
  119157. /* Reduce the number back to 521 bits using Montgomery reduction.
  119158. *
  119159. * a A single precision number to reduce in place.
  119160. * m The single precision number representing the modulus.
  119161. * mp The digit representing the negative inverse of m mod 2^n.
  119162. */
  119163. SP_NOINLINE static void sp_521_mont_reduce_17(sp_digit* a, const sp_digit* m,
  119164. sp_digit mp)
  119165. {
  119166. (void)mp;
  119167. (void)m;
  119168. __asm__ __volatile__ (
  119169. "sub sp, sp, #0x44\n\t"
  119170. "mov r6, sp\n\t"
  119171. "movs r5, #0x40\n\t"
  119172. "movs r7, %[a]\n\t"
  119173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119174. "adds r7, r7, r5\n\t"
  119175. #else
  119176. "add r7, r7, r5\n\t"
  119177. #endif
  119178. "ldm r7!, {r1, r2, r3, r4}\n\t"
  119179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119180. "lsls r5, r2, #23\n\t"
  119181. #else
  119182. "lsl r5, r2, #23\n\t"
  119183. #endif
  119184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119185. "lsrs r1, r1, #9\n\t"
  119186. #else
  119187. "lsr r1, r1, #9\n\t"
  119188. #endif
  119189. #ifdef WOLFSSL_KEIL
  119190. "orrs r1, r1, r5\n\t"
  119191. #elif defined(__clang__)
  119192. "orrs r1, r5\n\t"
  119193. #else
  119194. "orr r1, r5\n\t"
  119195. #endif
  119196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119197. "lsls r5, r3, #23\n\t"
  119198. #else
  119199. "lsl r5, r3, #23\n\t"
  119200. #endif
  119201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119202. "lsrs r2, r2, #9\n\t"
  119203. #else
  119204. "lsr r2, r2, #9\n\t"
  119205. #endif
  119206. #ifdef WOLFSSL_KEIL
  119207. "orrs r2, r2, r5\n\t"
  119208. #elif defined(__clang__)
  119209. "orrs r2, r5\n\t"
  119210. #else
  119211. "orr r2, r5\n\t"
  119212. #endif
  119213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119214. "lsls r5, r4, #23\n\t"
  119215. #else
  119216. "lsl r5, r4, #23\n\t"
  119217. #endif
  119218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119219. "lsrs r3, r3, #9\n\t"
  119220. #else
  119221. "lsr r3, r3, #9\n\t"
  119222. #endif
  119223. #ifdef WOLFSSL_KEIL
  119224. "orrs r3, r3, r5\n\t"
  119225. #elif defined(__clang__)
  119226. "orrs r3, r5\n\t"
  119227. #else
  119228. "orr r3, r5\n\t"
  119229. #endif
  119230. "stm r6!, {r1, r2, r3}\n\t"
  119231. "movs r1, r4\n\t"
  119232. "ldm r7!, {r2, r3, r4}\n\t"
  119233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119234. "lsls r5, r2, #23\n\t"
  119235. #else
  119236. "lsl r5, r2, #23\n\t"
  119237. #endif
  119238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119239. "lsrs r1, r1, #9\n\t"
  119240. #else
  119241. "lsr r1, r1, #9\n\t"
  119242. #endif
  119243. #ifdef WOLFSSL_KEIL
  119244. "orrs r1, r1, r5\n\t"
  119245. #elif defined(__clang__)
  119246. "orrs r1, r5\n\t"
  119247. #else
  119248. "orr r1, r5\n\t"
  119249. #endif
  119250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119251. "lsls r5, r3, #23\n\t"
  119252. #else
  119253. "lsl r5, r3, #23\n\t"
  119254. #endif
  119255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119256. "lsrs r2, r2, #9\n\t"
  119257. #else
  119258. "lsr r2, r2, #9\n\t"
  119259. #endif
  119260. #ifdef WOLFSSL_KEIL
  119261. "orrs r2, r2, r5\n\t"
  119262. #elif defined(__clang__)
  119263. "orrs r2, r5\n\t"
  119264. #else
  119265. "orr r2, r5\n\t"
  119266. #endif
  119267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119268. "lsls r5, r4, #23\n\t"
  119269. #else
  119270. "lsl r5, r4, #23\n\t"
  119271. #endif
  119272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119273. "lsrs r3, r3, #9\n\t"
  119274. #else
  119275. "lsr r3, r3, #9\n\t"
  119276. #endif
  119277. #ifdef WOLFSSL_KEIL
  119278. "orrs r3, r3, r5\n\t"
  119279. #elif defined(__clang__)
  119280. "orrs r3, r5\n\t"
  119281. #else
  119282. "orr r3, r5\n\t"
  119283. #endif
  119284. "stm r6!, {r1, r2, r3}\n\t"
  119285. "movs r1, r4\n\t"
  119286. "ldm r7!, {r2, r3, r4}\n\t"
  119287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119288. "lsls r5, r2, #23\n\t"
  119289. #else
  119290. "lsl r5, r2, #23\n\t"
  119291. #endif
  119292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119293. "lsrs r1, r1, #9\n\t"
  119294. #else
  119295. "lsr r1, r1, #9\n\t"
  119296. #endif
  119297. #ifdef WOLFSSL_KEIL
  119298. "orrs r1, r1, r5\n\t"
  119299. #elif defined(__clang__)
  119300. "orrs r1, r5\n\t"
  119301. #else
  119302. "orr r1, r5\n\t"
  119303. #endif
  119304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119305. "lsls r5, r3, #23\n\t"
  119306. #else
  119307. "lsl r5, r3, #23\n\t"
  119308. #endif
  119309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119310. "lsrs r2, r2, #9\n\t"
  119311. #else
  119312. "lsr r2, r2, #9\n\t"
  119313. #endif
  119314. #ifdef WOLFSSL_KEIL
  119315. "orrs r2, r2, r5\n\t"
  119316. #elif defined(__clang__)
  119317. "orrs r2, r5\n\t"
  119318. #else
  119319. "orr r2, r5\n\t"
  119320. #endif
  119321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119322. "lsls r5, r4, #23\n\t"
  119323. #else
  119324. "lsl r5, r4, #23\n\t"
  119325. #endif
  119326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119327. "lsrs r3, r3, #9\n\t"
  119328. #else
  119329. "lsr r3, r3, #9\n\t"
  119330. #endif
  119331. #ifdef WOLFSSL_KEIL
  119332. "orrs r3, r3, r5\n\t"
  119333. #elif defined(__clang__)
  119334. "orrs r3, r5\n\t"
  119335. #else
  119336. "orr r3, r5\n\t"
  119337. #endif
  119338. "stm r6!, {r1, r2, r3}\n\t"
  119339. "movs r1, r4\n\t"
  119340. "ldm r7!, {r2, r3, r4}\n\t"
  119341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119342. "lsls r5, r2, #23\n\t"
  119343. #else
  119344. "lsl r5, r2, #23\n\t"
  119345. #endif
  119346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119347. "lsrs r1, r1, #9\n\t"
  119348. #else
  119349. "lsr r1, r1, #9\n\t"
  119350. #endif
  119351. #ifdef WOLFSSL_KEIL
  119352. "orrs r1, r1, r5\n\t"
  119353. #elif defined(__clang__)
  119354. "orrs r1, r5\n\t"
  119355. #else
  119356. "orr r1, r5\n\t"
  119357. #endif
  119358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119359. "lsls r5, r3, #23\n\t"
  119360. #else
  119361. "lsl r5, r3, #23\n\t"
  119362. #endif
  119363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119364. "lsrs r2, r2, #9\n\t"
  119365. #else
  119366. "lsr r2, r2, #9\n\t"
  119367. #endif
  119368. #ifdef WOLFSSL_KEIL
  119369. "orrs r2, r2, r5\n\t"
  119370. #elif defined(__clang__)
  119371. "orrs r2, r5\n\t"
  119372. #else
  119373. "orr r2, r5\n\t"
  119374. #endif
  119375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119376. "lsls r5, r4, #23\n\t"
  119377. #else
  119378. "lsl r5, r4, #23\n\t"
  119379. #endif
  119380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119381. "lsrs r3, r3, #9\n\t"
  119382. #else
  119383. "lsr r3, r3, #9\n\t"
  119384. #endif
  119385. #ifdef WOLFSSL_KEIL
  119386. "orrs r3, r3, r5\n\t"
  119387. #elif defined(__clang__)
  119388. "orrs r3, r5\n\t"
  119389. #else
  119390. "orr r3, r5\n\t"
  119391. #endif
  119392. "stm r6!, {r1, r2, r3}\n\t"
  119393. "movs r1, r4\n\t"
  119394. "ldm r7!, {r2, r3, r4}\n\t"
  119395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119396. "lsls r5, r2, #23\n\t"
  119397. #else
  119398. "lsl r5, r2, #23\n\t"
  119399. #endif
  119400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119401. "lsrs r1, r1, #9\n\t"
  119402. #else
  119403. "lsr r1, r1, #9\n\t"
  119404. #endif
  119405. #ifdef WOLFSSL_KEIL
  119406. "orrs r1, r1, r5\n\t"
  119407. #elif defined(__clang__)
  119408. "orrs r1, r5\n\t"
  119409. #else
  119410. "orr r1, r5\n\t"
  119411. #endif
  119412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119413. "lsls r5, r3, #23\n\t"
  119414. #else
  119415. "lsl r5, r3, #23\n\t"
  119416. #endif
  119417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119418. "lsrs r2, r2, #9\n\t"
  119419. #else
  119420. "lsr r2, r2, #9\n\t"
  119421. #endif
  119422. #ifdef WOLFSSL_KEIL
  119423. "orrs r2, r2, r5\n\t"
  119424. #elif defined(__clang__)
  119425. "orrs r2, r5\n\t"
  119426. #else
  119427. "orr r2, r5\n\t"
  119428. #endif
  119429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119430. "lsls r5, r4, #23\n\t"
  119431. #else
  119432. "lsl r5, r4, #23\n\t"
  119433. #endif
  119434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119435. "lsrs r3, r3, #9\n\t"
  119436. #else
  119437. "lsr r3, r3, #9\n\t"
  119438. #endif
  119439. #ifdef WOLFSSL_KEIL
  119440. "orrs r3, r3, r5\n\t"
  119441. #elif defined(__clang__)
  119442. "orrs r3, r5\n\t"
  119443. #else
  119444. "orr r3, r5\n\t"
  119445. #endif
  119446. "stm r6!, {r1, r2, r3}\n\t"
  119447. "movs r1, r4\n\t"
  119448. "ldm r7!, {r2}\n\t"
  119449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119450. "lsls r5, r2, #23\n\t"
  119451. #else
  119452. "lsl r5, r2, #23\n\t"
  119453. #endif
  119454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119455. "lsrs r1, r1, #9\n\t"
  119456. #else
  119457. "lsr r1, r1, #9\n\t"
  119458. #endif
  119459. #ifdef WOLFSSL_KEIL
  119460. "orrs r1, r1, r5\n\t"
  119461. #elif defined(__clang__)
  119462. "orrs r1, r5\n\t"
  119463. #else
  119464. "orr r1, r5\n\t"
  119465. #endif
  119466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119467. "lsrs r2, r2, #9\n\t"
  119468. #else
  119469. "lsr r2, r2, #9\n\t"
  119470. #endif
  119471. "stm r6!, {r1, r2}\n\t"
  119472. "ldr r1, [%[a], #64]\n\t"
  119473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119474. "lsls r1, r1, #23\n\t"
  119475. #else
  119476. "lsl r1, r1, #23\n\t"
  119477. #endif
  119478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119479. "lsrs r1, r1, #23\n\t"
  119480. #else
  119481. "lsr r1, r1, #23\n\t"
  119482. #endif
  119483. "mov r8, r1\n\t"
  119484. "mov r7, sp\n\t"
  119485. "ldr r1, [%[a]]\n\t"
  119486. "ldr r2, [%[a], #4]\n\t"
  119487. "ldr r3, [%[a], #8]\n\t"
  119488. "ldm r7!, {r4, r5, r6}\n\t"
  119489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119490. "adds r1, r1, r4\n\t"
  119491. #else
  119492. "add r1, r1, r4\n\t"
  119493. #endif
  119494. #ifdef WOLFSSL_KEIL
  119495. "adcs r2, r2, r5\n\t"
  119496. #elif defined(__clang__)
  119497. "adcs r2, r5\n\t"
  119498. #else
  119499. "adc r2, r5\n\t"
  119500. #endif
  119501. #ifdef WOLFSSL_KEIL
  119502. "adcs r3, r3, r6\n\t"
  119503. #elif defined(__clang__)
  119504. "adcs r3, r6\n\t"
  119505. #else
  119506. "adc r3, r6\n\t"
  119507. #endif
  119508. "stm %[a]!, {r1, r2, r3}\n\t"
  119509. "ldr r1, [%[a]]\n\t"
  119510. "ldr r2, [%[a], #4]\n\t"
  119511. "ldr r3, [%[a], #8]\n\t"
  119512. "ldm r7!, {r4, r5, r6}\n\t"
  119513. #ifdef WOLFSSL_KEIL
  119514. "adcs r1, r1, r4\n\t"
  119515. #elif defined(__clang__)
  119516. "adcs r1, r4\n\t"
  119517. #else
  119518. "adc r1, r4\n\t"
  119519. #endif
  119520. #ifdef WOLFSSL_KEIL
  119521. "adcs r2, r2, r5\n\t"
  119522. #elif defined(__clang__)
  119523. "adcs r2, r5\n\t"
  119524. #else
  119525. "adc r2, r5\n\t"
  119526. #endif
  119527. #ifdef WOLFSSL_KEIL
  119528. "adcs r3, r3, r6\n\t"
  119529. #elif defined(__clang__)
  119530. "adcs r3, r6\n\t"
  119531. #else
  119532. "adc r3, r6\n\t"
  119533. #endif
  119534. "stm %[a]!, {r1, r2, r3}\n\t"
  119535. "ldr r1, [%[a]]\n\t"
  119536. "ldr r2, [%[a], #4]\n\t"
  119537. "ldr r3, [%[a], #8]\n\t"
  119538. "ldm r7!, {r4, r5, r6}\n\t"
  119539. #ifdef WOLFSSL_KEIL
  119540. "adcs r1, r1, r4\n\t"
  119541. #elif defined(__clang__)
  119542. "adcs r1, r4\n\t"
  119543. #else
  119544. "adc r1, r4\n\t"
  119545. #endif
  119546. #ifdef WOLFSSL_KEIL
  119547. "adcs r2, r2, r5\n\t"
  119548. #elif defined(__clang__)
  119549. "adcs r2, r5\n\t"
  119550. #else
  119551. "adc r2, r5\n\t"
  119552. #endif
  119553. #ifdef WOLFSSL_KEIL
  119554. "adcs r3, r3, r6\n\t"
  119555. #elif defined(__clang__)
  119556. "adcs r3, r6\n\t"
  119557. #else
  119558. "adc r3, r6\n\t"
  119559. #endif
  119560. "stm %[a]!, {r1, r2, r3}\n\t"
  119561. "ldr r1, [%[a]]\n\t"
  119562. "ldr r2, [%[a], #4]\n\t"
  119563. "ldr r3, [%[a], #8]\n\t"
  119564. "ldm r7!, {r4, r5, r6}\n\t"
  119565. #ifdef WOLFSSL_KEIL
  119566. "adcs r1, r1, r4\n\t"
  119567. #elif defined(__clang__)
  119568. "adcs r1, r4\n\t"
  119569. #else
  119570. "adc r1, r4\n\t"
  119571. #endif
  119572. #ifdef WOLFSSL_KEIL
  119573. "adcs r2, r2, r5\n\t"
  119574. #elif defined(__clang__)
  119575. "adcs r2, r5\n\t"
  119576. #else
  119577. "adc r2, r5\n\t"
  119578. #endif
  119579. #ifdef WOLFSSL_KEIL
  119580. "adcs r3, r3, r6\n\t"
  119581. #elif defined(__clang__)
  119582. "adcs r3, r6\n\t"
  119583. #else
  119584. "adc r3, r6\n\t"
  119585. #endif
  119586. "stm %[a]!, {r1, r2, r3}\n\t"
  119587. "ldr r1, [%[a]]\n\t"
  119588. "ldr r2, [%[a], #4]\n\t"
  119589. "ldr r3, [%[a], #8]\n\t"
  119590. "ldm r7!, {r4, r5, r6}\n\t"
  119591. #ifdef WOLFSSL_KEIL
  119592. "adcs r1, r1, r4\n\t"
  119593. #elif defined(__clang__)
  119594. "adcs r1, r4\n\t"
  119595. #else
  119596. "adc r1, r4\n\t"
  119597. #endif
  119598. #ifdef WOLFSSL_KEIL
  119599. "adcs r2, r2, r5\n\t"
  119600. #elif defined(__clang__)
  119601. "adcs r2, r5\n\t"
  119602. #else
  119603. "adc r2, r5\n\t"
  119604. #endif
  119605. #ifdef WOLFSSL_KEIL
  119606. "adcs r3, r3, r6\n\t"
  119607. #elif defined(__clang__)
  119608. "adcs r3, r6\n\t"
  119609. #else
  119610. "adc r3, r6\n\t"
  119611. #endif
  119612. "stm %[a]!, {r1, r2, r3}\n\t"
  119613. "ldr r1, [%[a]]\n\t"
  119614. "ldm r7!, {r4, r5}\n\t"
  119615. "mov r2, r8\n\t"
  119616. #ifdef WOLFSSL_KEIL
  119617. "adcs r1, r1, r4\n\t"
  119618. #elif defined(__clang__)
  119619. "adcs r1, r4\n\t"
  119620. #else
  119621. "adc r1, r4\n\t"
  119622. #endif
  119623. #ifdef WOLFSSL_KEIL
  119624. "adcs r2, r2, r5\n\t"
  119625. #elif defined(__clang__)
  119626. "adcs r2, r5\n\t"
  119627. #else
  119628. "adc r2, r5\n\t"
  119629. #endif
  119630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119631. "lsrs r6, r2, #9\n\t"
  119632. #else
  119633. "lsr r6, r2, #9\n\t"
  119634. #endif
  119635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119636. "lsls r2, r2, #23\n\t"
  119637. #else
  119638. "lsl r2, r2, #23\n\t"
  119639. #endif
  119640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119641. "lsrs r2, r2, #23\n\t"
  119642. #else
  119643. "lsr r2, r2, #23\n\t"
  119644. #endif
  119645. "stm %[a]!, {r1, r2}\n\t"
  119646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119647. "subs %[a], %[a], #0x44\n\t"
  119648. #else
  119649. "sub %[a], %[a], #0x44\n\t"
  119650. #endif
  119651. "movs r5, #0\n\t"
  119652. "ldr r1, [%[a]]\n\t"
  119653. "ldr r2, [%[a], #4]\n\t"
  119654. "ldr r3, [%[a], #8]\n\t"
  119655. "ldr r4, [%[a], #12]\n\t"
  119656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119657. "adds r1, r1, r6\n\t"
  119658. #else
  119659. "add r1, r1, r6\n\t"
  119660. #endif
  119661. #ifdef WOLFSSL_KEIL
  119662. "adcs r2, r2, r5\n\t"
  119663. #elif defined(__clang__)
  119664. "adcs r2, r5\n\t"
  119665. #else
  119666. "adc r2, r5\n\t"
  119667. #endif
  119668. #ifdef WOLFSSL_KEIL
  119669. "adcs r3, r3, r5\n\t"
  119670. #elif defined(__clang__)
  119671. "adcs r3, r5\n\t"
  119672. #else
  119673. "adc r3, r5\n\t"
  119674. #endif
  119675. #ifdef WOLFSSL_KEIL
  119676. "adcs r4, r4, r5\n\t"
  119677. #elif defined(__clang__)
  119678. "adcs r4, r5\n\t"
  119679. #else
  119680. "adc r4, r5\n\t"
  119681. #endif
  119682. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119683. "ldr r1, [%[a]]\n\t"
  119684. "ldr r2, [%[a], #4]\n\t"
  119685. "ldr r3, [%[a], #8]\n\t"
  119686. "ldr r4, [%[a], #12]\n\t"
  119687. #ifdef WOLFSSL_KEIL
  119688. "adcs r1, r1, r5\n\t"
  119689. #elif defined(__clang__)
  119690. "adcs r1, r5\n\t"
  119691. #else
  119692. "adc r1, r5\n\t"
  119693. #endif
  119694. #ifdef WOLFSSL_KEIL
  119695. "adcs r2, r2, r5\n\t"
  119696. #elif defined(__clang__)
  119697. "adcs r2, r5\n\t"
  119698. #else
  119699. "adc r2, r5\n\t"
  119700. #endif
  119701. #ifdef WOLFSSL_KEIL
  119702. "adcs r3, r3, r5\n\t"
  119703. #elif defined(__clang__)
  119704. "adcs r3, r5\n\t"
  119705. #else
  119706. "adc r3, r5\n\t"
  119707. #endif
  119708. #ifdef WOLFSSL_KEIL
  119709. "adcs r4, r4, r5\n\t"
  119710. #elif defined(__clang__)
  119711. "adcs r4, r5\n\t"
  119712. #else
  119713. "adc r4, r5\n\t"
  119714. #endif
  119715. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119716. "ldr r1, [%[a]]\n\t"
  119717. "ldr r2, [%[a], #4]\n\t"
  119718. "ldr r3, [%[a], #8]\n\t"
  119719. "ldr r4, [%[a], #12]\n\t"
  119720. #ifdef WOLFSSL_KEIL
  119721. "adcs r1, r1, r5\n\t"
  119722. #elif defined(__clang__)
  119723. "adcs r1, r5\n\t"
  119724. #else
  119725. "adc r1, r5\n\t"
  119726. #endif
  119727. #ifdef WOLFSSL_KEIL
  119728. "adcs r2, r2, r5\n\t"
  119729. #elif defined(__clang__)
  119730. "adcs r2, r5\n\t"
  119731. #else
  119732. "adc r2, r5\n\t"
  119733. #endif
  119734. #ifdef WOLFSSL_KEIL
  119735. "adcs r3, r3, r5\n\t"
  119736. #elif defined(__clang__)
  119737. "adcs r3, r5\n\t"
  119738. #else
  119739. "adc r3, r5\n\t"
  119740. #endif
  119741. #ifdef WOLFSSL_KEIL
  119742. "adcs r4, r4, r5\n\t"
  119743. #elif defined(__clang__)
  119744. "adcs r4, r5\n\t"
  119745. #else
  119746. "adc r4, r5\n\t"
  119747. #endif
  119748. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119749. "ldr r1, [%[a]]\n\t"
  119750. "ldr r2, [%[a], #4]\n\t"
  119751. "ldr r3, [%[a], #8]\n\t"
  119752. "ldr r4, [%[a], #12]\n\t"
  119753. #ifdef WOLFSSL_KEIL
  119754. "adcs r1, r1, r5\n\t"
  119755. #elif defined(__clang__)
  119756. "adcs r1, r5\n\t"
  119757. #else
  119758. "adc r1, r5\n\t"
  119759. #endif
  119760. #ifdef WOLFSSL_KEIL
  119761. "adcs r2, r2, r5\n\t"
  119762. #elif defined(__clang__)
  119763. "adcs r2, r5\n\t"
  119764. #else
  119765. "adc r2, r5\n\t"
  119766. #endif
  119767. #ifdef WOLFSSL_KEIL
  119768. "adcs r3, r3, r5\n\t"
  119769. #elif defined(__clang__)
  119770. "adcs r3, r5\n\t"
  119771. #else
  119772. "adc r3, r5\n\t"
  119773. #endif
  119774. #ifdef WOLFSSL_KEIL
  119775. "adcs r4, r4, r5\n\t"
  119776. #elif defined(__clang__)
  119777. "adcs r4, r5\n\t"
  119778. #else
  119779. "adc r4, r5\n\t"
  119780. #endif
  119781. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119782. "ldr r1, [%[a]]\n\t"
  119783. #ifdef WOLFSSL_KEIL
  119784. "adcs r1, r1, r5\n\t"
  119785. #elif defined(__clang__)
  119786. "adcs r1, r5\n\t"
  119787. #else
  119788. "adc r1, r5\n\t"
  119789. #endif
  119790. "stm %[a]!, {r1}\n\t"
  119791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119792. "subs %[a], %[a], #0x44\n\t"
  119793. #else
  119794. "sub %[a], %[a], #0x44\n\t"
  119795. #endif
  119796. "add sp, sp, #0x44\n\t"
  119797. : [a] "+l" (a)
  119798. :
  119799. : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8"
  119800. );
  119801. }
  119802. /* Reduce the number back to 521 bits using Montgomery reduction.
  119803. *
  119804. * a A single precision number to reduce in place.
  119805. * m The single precision number representing the modulus.
  119806. * mp The digit representing the negative inverse of m mod 2^n.
  119807. */
  119808. SP_NOINLINE static void sp_521_mont_reduce_order_17(sp_digit* a,
  119809. const sp_digit* m, sp_digit mp)
  119810. {
  119811. __asm__ __volatile__ (
  119812. "movs r7, #0\n\t"
  119813. "mov r8, %[mp]\n\t"
  119814. "mov r12, r7\n\t"
  119815. "mov lr, %[m]\n\t"
  119816. "mov r9, %[a]\n\t"
  119817. "mov r11, %[a]\n\t"
  119818. "movs r5, #0x40\n\t"
  119819. "movs r6, #0x44\n\t"
  119820. "add r9, r9, r5\n\t"
  119821. "add r11, r11, r6\n\t"
  119822. "\n"
  119823. "L_sp_521_mont_reduce_order_17_mod_%=:\n\t"
  119824. "movs r7, #0\n\t"
  119825. "movs r4, #0\n\t"
  119826. "# a[i] += m[0] * mu\n\t"
  119827. "ldm %[m]!, {%[mp]}\n\t"
  119828. "ldr r3, [%[a]]\n\t"
  119829. "# mu = a[i] * mp\n\t"
  119830. "mov r5, r8\n\t"
  119831. #ifdef WOLFSSL_KEIL
  119832. "muls r5, r3, r5\n\t"
  119833. #elif defined(__clang__)
  119834. "muls r5, r3\n\t"
  119835. #else
  119836. "mul r5, r3\n\t"
  119837. #endif
  119838. "mov r6, r11\n\t"
  119839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119840. "subs r6, r6, #4\n\t"
  119841. #else
  119842. "sub r6, r6, #4\n\t"
  119843. #endif
  119844. "cmp %[a], r6\n\t"
  119845. "bne L_sp_521_mont_reduce_order_17_nomask_%=\n\t"
  119846. "movs r6, #1\n\t"
  119847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119848. "lsls r6, r6, #8\n\t"
  119849. #else
  119850. "lsl r6, r6, #8\n\t"
  119851. #endif
  119852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119853. "adds r6, r6, #0xff\n\t"
  119854. #else
  119855. "add r6, r6, #0xff\n\t"
  119856. #endif
  119857. #ifdef WOLFSSL_KEIL
  119858. "ands r5, r5, r6\n\t"
  119859. #elif defined(__clang__)
  119860. "ands r5, r6\n\t"
  119861. #else
  119862. "and r5, r6\n\t"
  119863. #endif
  119864. "\n"
  119865. "L_sp_521_mont_reduce_order_17_nomask_%=:\n\t"
  119866. "mov r10, r5\n\t"
  119867. "# Multiply m[0] and mu - Start\n\t"
  119868. "mov r5, r10\n\t"
  119869. "uxth r6, %[mp]\n\t"
  119870. "uxth r5, r5\n\t"
  119871. #ifdef WOLFSSL_KEIL
  119872. "muls r6, r5, r6\n\t"
  119873. #elif defined(__clang__)
  119874. "muls r6, r5\n\t"
  119875. #else
  119876. "mul r6, r5\n\t"
  119877. #endif
  119878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119879. "adds r3, r3, r6\n\t"
  119880. #else
  119881. "add r3, r3, r6\n\t"
  119882. #endif
  119883. #ifdef WOLFSSL_KEIL
  119884. "adcs r4, r4, r7\n\t"
  119885. #elif defined(__clang__)
  119886. "adcs r4, r7\n\t"
  119887. #else
  119888. "adc r4, r7\n\t"
  119889. #endif
  119890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119891. "lsrs r6, %[mp], #16\n\t"
  119892. #else
  119893. "lsr r6, %[mp], #16\n\t"
  119894. #endif
  119895. #ifdef WOLFSSL_KEIL
  119896. "muls r5, r6, r5\n\t"
  119897. #elif defined(__clang__)
  119898. "muls r5, r6\n\t"
  119899. #else
  119900. "mul r5, r6\n\t"
  119901. #endif
  119902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119903. "lsrs r6, r5, #16\n\t"
  119904. #else
  119905. "lsr r6, r5, #16\n\t"
  119906. #endif
  119907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119908. "lsls r5, r5, #16\n\t"
  119909. #else
  119910. "lsl r5, r5, #16\n\t"
  119911. #endif
  119912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119913. "adds r3, r3, r5\n\t"
  119914. #else
  119915. "add r3, r3, r5\n\t"
  119916. #endif
  119917. #ifdef WOLFSSL_KEIL
  119918. "adcs r4, r4, r6\n\t"
  119919. #elif defined(__clang__)
  119920. "adcs r4, r6\n\t"
  119921. #else
  119922. "adc r4, r6\n\t"
  119923. #endif
  119924. "mov r5, r10\n\t"
  119925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119926. "lsrs r6, %[mp], #16\n\t"
  119927. #else
  119928. "lsr r6, %[mp], #16\n\t"
  119929. #endif
  119930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119931. "lsrs r5, r5, #16\n\t"
  119932. #else
  119933. "lsr r5, r5, #16\n\t"
  119934. #endif
  119935. #ifdef WOLFSSL_KEIL
  119936. "muls r6, r5, r6\n\t"
  119937. #elif defined(__clang__)
  119938. "muls r6, r5\n\t"
  119939. #else
  119940. "mul r6, r5\n\t"
  119941. #endif
  119942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119943. "adds r4, r4, r6\n\t"
  119944. #else
  119945. "add r4, r4, r6\n\t"
  119946. #endif
  119947. "uxth r6, %[mp]\n\t"
  119948. #ifdef WOLFSSL_KEIL
  119949. "muls r5, r6, r5\n\t"
  119950. #elif defined(__clang__)
  119951. "muls r5, r6\n\t"
  119952. #else
  119953. "mul r5, r6\n\t"
  119954. #endif
  119955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119956. "lsrs r6, r5, #16\n\t"
  119957. #else
  119958. "lsr r6, r5, #16\n\t"
  119959. #endif
  119960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119961. "lsls r5, r5, #16\n\t"
  119962. #else
  119963. "lsl r5, r5, #16\n\t"
  119964. #endif
  119965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119966. "adds r3, r3, r5\n\t"
  119967. #else
  119968. "add r3, r3, r5\n\t"
  119969. #endif
  119970. #ifdef WOLFSSL_KEIL
  119971. "adcs r4, r4, r6\n\t"
  119972. #elif defined(__clang__)
  119973. "adcs r4, r6\n\t"
  119974. #else
  119975. "adc r4, r6\n\t"
  119976. #endif
  119977. "# Multiply m[0] and mu - Done\n\t"
  119978. "stm %[a]!, {r3}\n\t"
  119979. "\n"
  119980. "L_sp_521_mont_reduce_order_17_word_%=:\n\t"
  119981. "# a[i+j] += m[j] * mu\n\t"
  119982. "ldr r3, [%[a]]\n\t"
  119983. "ldm %[m]!, {%[mp]}\n\t"
  119984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119985. "adds r3, r3, r4\n\t"
  119986. #else
  119987. "add r3, r3, r4\n\t"
  119988. #endif
  119989. "movs r4, #0\n\t"
  119990. #ifdef WOLFSSL_KEIL
  119991. "adcs r4, r4, r7\n\t"
  119992. #elif defined(__clang__)
  119993. "adcs r4, r7\n\t"
  119994. #else
  119995. "adc r4, r7\n\t"
  119996. #endif
  119997. "# Multiply m[j] and mu - Start\n\t"
  119998. "mov r5, r10\n\t"
  119999. "uxth r6, %[mp]\n\t"
  120000. "uxth r5, r5\n\t"
  120001. #ifdef WOLFSSL_KEIL
  120002. "muls r6, r5, r6\n\t"
  120003. #elif defined(__clang__)
  120004. "muls r6, r5\n\t"
  120005. #else
  120006. "mul r6, r5\n\t"
  120007. #endif
  120008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120009. "adds r3, r3, r6\n\t"
  120010. #else
  120011. "add r3, r3, r6\n\t"
  120012. #endif
  120013. #ifdef WOLFSSL_KEIL
  120014. "adcs r4, r4, r7\n\t"
  120015. #elif defined(__clang__)
  120016. "adcs r4, r7\n\t"
  120017. #else
  120018. "adc r4, r7\n\t"
  120019. #endif
  120020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120021. "lsrs r6, %[mp], #16\n\t"
  120022. #else
  120023. "lsr r6, %[mp], #16\n\t"
  120024. #endif
  120025. #ifdef WOLFSSL_KEIL
  120026. "muls r5, r6, r5\n\t"
  120027. #elif defined(__clang__)
  120028. "muls r5, r6\n\t"
  120029. #else
  120030. "mul r5, r6\n\t"
  120031. #endif
  120032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120033. "lsrs r6, r5, #16\n\t"
  120034. #else
  120035. "lsr r6, r5, #16\n\t"
  120036. #endif
  120037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120038. "lsls r5, r5, #16\n\t"
  120039. #else
  120040. "lsl r5, r5, #16\n\t"
  120041. #endif
  120042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120043. "adds r3, r3, r5\n\t"
  120044. #else
  120045. "add r3, r3, r5\n\t"
  120046. #endif
  120047. #ifdef WOLFSSL_KEIL
  120048. "adcs r4, r4, r6\n\t"
  120049. #elif defined(__clang__)
  120050. "adcs r4, r6\n\t"
  120051. #else
  120052. "adc r4, r6\n\t"
  120053. #endif
  120054. "mov r5, r10\n\t"
  120055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120056. "lsrs r6, %[mp], #16\n\t"
  120057. #else
  120058. "lsr r6, %[mp], #16\n\t"
  120059. #endif
  120060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120061. "lsrs r5, r5, #16\n\t"
  120062. #else
  120063. "lsr r5, r5, #16\n\t"
  120064. #endif
  120065. #ifdef WOLFSSL_KEIL
  120066. "muls r6, r5, r6\n\t"
  120067. #elif defined(__clang__)
  120068. "muls r6, r5\n\t"
  120069. #else
  120070. "mul r6, r5\n\t"
  120071. #endif
  120072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120073. "adds r4, r4, r6\n\t"
  120074. #else
  120075. "add r4, r4, r6\n\t"
  120076. #endif
  120077. "uxth r6, %[mp]\n\t"
  120078. #ifdef WOLFSSL_KEIL
  120079. "muls r5, r6, r5\n\t"
  120080. #elif defined(__clang__)
  120081. "muls r5, r6\n\t"
  120082. #else
  120083. "mul r5, r6\n\t"
  120084. #endif
  120085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120086. "lsrs r6, r5, #16\n\t"
  120087. #else
  120088. "lsr r6, r5, #16\n\t"
  120089. #endif
  120090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120091. "lsls r5, r5, #16\n\t"
  120092. #else
  120093. "lsl r5, r5, #16\n\t"
  120094. #endif
  120095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120096. "adds r3, r3, r5\n\t"
  120097. #else
  120098. "add r3, r3, r5\n\t"
  120099. #endif
  120100. #ifdef WOLFSSL_KEIL
  120101. "adcs r4, r4, r6\n\t"
  120102. #elif defined(__clang__)
  120103. "adcs r4, r6\n\t"
  120104. #else
  120105. "adc r4, r6\n\t"
  120106. #endif
  120107. "# Multiply m[j] and mu - Done\n\t"
  120108. "stm %[a]!, {r3}\n\t"
  120109. "cmp %[a], r9\n\t"
  120110. "blt L_sp_521_mont_reduce_order_17_word_%=\n\t"
  120111. "# a[i+16] += m[16] * mu\n\t"
  120112. "ldr %[mp], [%[m]]\n\t"
  120113. "mov r3, r12\n\t"
  120114. "# Multiply m[16] and mu - Start\n\t"
  120115. "mov r5, r10\n\t"
  120116. "uxth r6, %[mp]\n\t"
  120117. "uxth r5, r5\n\t"
  120118. #ifdef WOLFSSL_KEIL
  120119. "muls r6, r5, r6\n\t"
  120120. #elif defined(__clang__)
  120121. "muls r6, r5\n\t"
  120122. #else
  120123. "mul r6, r5\n\t"
  120124. #endif
  120125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120126. "adds r4, r4, r6\n\t"
  120127. #else
  120128. "add r4, r4, r6\n\t"
  120129. #endif
  120130. #ifdef WOLFSSL_KEIL
  120131. "adcs r3, r3, r7\n\t"
  120132. #elif defined(__clang__)
  120133. "adcs r3, r7\n\t"
  120134. #else
  120135. "adc r3, r7\n\t"
  120136. #endif
  120137. #ifdef WOLFSSL_KEIL
  120138. "adcs r7, r7, r7\n\t"
  120139. #elif defined(__clang__)
  120140. "adcs r7, r7\n\t"
  120141. #else
  120142. "adc r7, r7\n\t"
  120143. #endif
  120144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120145. "lsrs r6, %[mp], #16\n\t"
  120146. #else
  120147. "lsr r6, %[mp], #16\n\t"
  120148. #endif
  120149. #ifdef WOLFSSL_KEIL
  120150. "muls r5, r6, r5\n\t"
  120151. #elif defined(__clang__)
  120152. "muls r5, r6\n\t"
  120153. #else
  120154. "mul r5, r6\n\t"
  120155. #endif
  120156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120157. "lsrs r6, r5, #16\n\t"
  120158. #else
  120159. "lsr r6, r5, #16\n\t"
  120160. #endif
  120161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120162. "lsls r5, r5, #16\n\t"
  120163. #else
  120164. "lsl r5, r5, #16\n\t"
  120165. #endif
  120166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120167. "adds r4, r4, r5\n\t"
  120168. #else
  120169. "add r4, r4, r5\n\t"
  120170. #endif
  120171. #ifdef WOLFSSL_KEIL
  120172. "adcs r3, r3, r6\n\t"
  120173. #elif defined(__clang__)
  120174. "adcs r3, r6\n\t"
  120175. #else
  120176. "adc r3, r6\n\t"
  120177. #endif
  120178. #ifdef WOLFSSL_KEIL
  120179. "adcs r7, r7, r7\n\t"
  120180. #elif defined(__clang__)
  120181. "adcs r7, r7\n\t"
  120182. #else
  120183. "adc r7, r7\n\t"
  120184. #endif
  120185. "mov r5, r10\n\t"
  120186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120187. "lsrs r6, %[mp], #16\n\t"
  120188. #else
  120189. "lsr r6, %[mp], #16\n\t"
  120190. #endif
  120191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120192. "lsrs r5, r5, #16\n\t"
  120193. #else
  120194. "lsr r5, r5, #16\n\t"
  120195. #endif
  120196. #ifdef WOLFSSL_KEIL
  120197. "muls r6, r5, r6\n\t"
  120198. #elif defined(__clang__)
  120199. "muls r6, r5\n\t"
  120200. #else
  120201. "mul r6, r5\n\t"
  120202. #endif
  120203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120204. "adds r3, r3, r6\n\t"
  120205. #else
  120206. "add r3, r3, r6\n\t"
  120207. #endif
  120208. #ifdef WOLFSSL_KEIL
  120209. "adcs r7, r7, r7\n\t"
  120210. #elif defined(__clang__)
  120211. "adcs r7, r7\n\t"
  120212. #else
  120213. "adc r7, r7\n\t"
  120214. #endif
  120215. "uxth r6, %[mp]\n\t"
  120216. #ifdef WOLFSSL_KEIL
  120217. "muls r5, r6, r5\n\t"
  120218. #elif defined(__clang__)
  120219. "muls r5, r6\n\t"
  120220. #else
  120221. "mul r5, r6\n\t"
  120222. #endif
  120223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120224. "lsrs r6, r5, #16\n\t"
  120225. #else
  120226. "lsr r6, r5, #16\n\t"
  120227. #endif
  120228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120229. "lsls r5, r5, #16\n\t"
  120230. #else
  120231. "lsl r5, r5, #16\n\t"
  120232. #endif
  120233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120234. "adds r4, r4, r5\n\t"
  120235. #else
  120236. "add r4, r4, r5\n\t"
  120237. #endif
  120238. #ifdef WOLFSSL_KEIL
  120239. "adcs r3, r3, r6\n\t"
  120240. #elif defined(__clang__)
  120241. "adcs r3, r6\n\t"
  120242. #else
  120243. "adc r3, r6\n\t"
  120244. #endif
  120245. #ifdef WOLFSSL_KEIL
  120246. "adcs r7, r7, r7\n\t"
  120247. #elif defined(__clang__)
  120248. "adcs r7, r7\n\t"
  120249. #else
  120250. "adc r7, r7\n\t"
  120251. #endif
  120252. "# Multiply m[16] and mu - Done\n\t"
  120253. "ldr r5, [%[a]]\n\t"
  120254. "ldr r6, [%[a], #4]\n\t"
  120255. "movs %[mp], #0\n\t"
  120256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120257. "adds r5, r5, r4\n\t"
  120258. #else
  120259. "add r5, r5, r4\n\t"
  120260. #endif
  120261. #ifdef WOLFSSL_KEIL
  120262. "adcs r6, r6, r3\n\t"
  120263. #elif defined(__clang__)
  120264. "adcs r6, r3\n\t"
  120265. #else
  120266. "adc r6, r3\n\t"
  120267. #endif
  120268. #ifdef WOLFSSL_KEIL
  120269. "adcs r7, r7, %[mp]\n\t"
  120270. #elif defined(__clang__)
  120271. "adcs r7, %[mp]\n\t"
  120272. #else
  120273. "adc r7, %[mp]\n\t"
  120274. #endif
  120275. "stm %[a]!, {r5, r6}\n\t"
  120276. "# i += 1\n\t"
  120277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120278. "subs %[a], %[a], #4\n\t"
  120279. #else
  120280. "sub %[a], %[a], #4\n\t"
  120281. #endif
  120282. "movs r3, #0x40\n\t"
  120283. "mov r9, %[a]\n\t"
  120284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120285. "subs %[a], %[a], r3\n\t"
  120286. #else
  120287. "sub %[a], %[a], r3\n\t"
  120288. #endif
  120289. "mov r12, r7\n\t"
  120290. "mov %[m], lr\n\t"
  120291. "cmp r11, %[a]\n\t"
  120292. "bgt L_sp_521_mont_reduce_order_17_mod_%=\n\t"
  120293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120294. "subs %[a], %[a], #4\n\t"
  120295. #else
  120296. "sub %[a], %[a], #4\n\t"
  120297. #endif
  120298. "ldr r3, [%[a]]\n\t"
  120299. "ldr r4, [%[a], #4]\n\t"
  120300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120301. "lsrs r3, r3, #9\n\t"
  120302. #else
  120303. "lsr r3, r3, #9\n\t"
  120304. #endif
  120305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120306. "lsls r6, r4, #23\n\t"
  120307. #else
  120308. "lsl r6, r4, #23\n\t"
  120309. #endif
  120310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120311. "lsrs r4, r4, #9\n\t"
  120312. #else
  120313. "lsr r4, r4, #9\n\t"
  120314. #endif
  120315. #ifdef WOLFSSL_KEIL
  120316. "orrs r3, r3, r6\n\t"
  120317. #elif defined(__clang__)
  120318. "orrs r3, r6\n\t"
  120319. #else
  120320. "orr r3, r6\n\t"
  120321. #endif
  120322. "ldr r5, [%[a], #8]\n\t"
  120323. "str r3, [%[a], #4]\n\t"
  120324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120325. "lsls r6, r5, #23\n\t"
  120326. #else
  120327. "lsl r6, r5, #23\n\t"
  120328. #endif
  120329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120330. "lsrs r5, r5, #9\n\t"
  120331. #else
  120332. "lsr r5, r5, #9\n\t"
  120333. #endif
  120334. #ifdef WOLFSSL_KEIL
  120335. "orrs r4, r4, r6\n\t"
  120336. #elif defined(__clang__)
  120337. "orrs r4, r6\n\t"
  120338. #else
  120339. "orr r4, r6\n\t"
  120340. #endif
  120341. "ldr r3, [%[a], #12]\n\t"
  120342. "str r4, [%[a], #8]\n\t"
  120343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120344. "lsls r6, r3, #23\n\t"
  120345. #else
  120346. "lsl r6, r3, #23\n\t"
  120347. #endif
  120348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120349. "lsrs r3, r3, #9\n\t"
  120350. #else
  120351. "lsr r3, r3, #9\n\t"
  120352. #endif
  120353. #ifdef WOLFSSL_KEIL
  120354. "orrs r5, r5, r6\n\t"
  120355. #elif defined(__clang__)
  120356. "orrs r5, r6\n\t"
  120357. #else
  120358. "orr r5, r6\n\t"
  120359. #endif
  120360. "ldr r4, [%[a], #16]\n\t"
  120361. "str r5, [%[a], #12]\n\t"
  120362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120363. "lsls r6, r4, #23\n\t"
  120364. #else
  120365. "lsl r6, r4, #23\n\t"
  120366. #endif
  120367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120368. "lsrs r4, r4, #9\n\t"
  120369. #else
  120370. "lsr r4, r4, #9\n\t"
  120371. #endif
  120372. #ifdef WOLFSSL_KEIL
  120373. "orrs r3, r3, r6\n\t"
  120374. #elif defined(__clang__)
  120375. "orrs r3, r6\n\t"
  120376. #else
  120377. "orr r3, r6\n\t"
  120378. #endif
  120379. "ldr r5, [%[a], #20]\n\t"
  120380. "str r3, [%[a], #16]\n\t"
  120381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120382. "lsls r6, r5, #23\n\t"
  120383. #else
  120384. "lsl r6, r5, #23\n\t"
  120385. #endif
  120386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120387. "lsrs r5, r5, #9\n\t"
  120388. #else
  120389. "lsr r5, r5, #9\n\t"
  120390. #endif
  120391. #ifdef WOLFSSL_KEIL
  120392. "orrs r4, r4, r6\n\t"
  120393. #elif defined(__clang__)
  120394. "orrs r4, r6\n\t"
  120395. #else
  120396. "orr r4, r6\n\t"
  120397. #endif
  120398. "ldr r3, [%[a], #24]\n\t"
  120399. "str r4, [%[a], #20]\n\t"
  120400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120401. "lsls r6, r3, #23\n\t"
  120402. #else
  120403. "lsl r6, r3, #23\n\t"
  120404. #endif
  120405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120406. "lsrs r3, r3, #9\n\t"
  120407. #else
  120408. "lsr r3, r3, #9\n\t"
  120409. #endif
  120410. #ifdef WOLFSSL_KEIL
  120411. "orrs r5, r5, r6\n\t"
  120412. #elif defined(__clang__)
  120413. "orrs r5, r6\n\t"
  120414. #else
  120415. "orr r5, r6\n\t"
  120416. #endif
  120417. "ldr r4, [%[a], #28]\n\t"
  120418. "str r5, [%[a], #24]\n\t"
  120419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120420. "lsls r6, r4, #23\n\t"
  120421. #else
  120422. "lsl r6, r4, #23\n\t"
  120423. #endif
  120424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120425. "lsrs r4, r4, #9\n\t"
  120426. #else
  120427. "lsr r4, r4, #9\n\t"
  120428. #endif
  120429. #ifdef WOLFSSL_KEIL
  120430. "orrs r3, r3, r6\n\t"
  120431. #elif defined(__clang__)
  120432. "orrs r3, r6\n\t"
  120433. #else
  120434. "orr r3, r6\n\t"
  120435. #endif
  120436. "ldr r5, [%[a], #32]\n\t"
  120437. "str r3, [%[a], #28]\n\t"
  120438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120439. "lsls r6, r5, #23\n\t"
  120440. #else
  120441. "lsl r6, r5, #23\n\t"
  120442. #endif
  120443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120444. "lsrs r5, r5, #9\n\t"
  120445. #else
  120446. "lsr r5, r5, #9\n\t"
  120447. #endif
  120448. #ifdef WOLFSSL_KEIL
  120449. "orrs r4, r4, r6\n\t"
  120450. #elif defined(__clang__)
  120451. "orrs r4, r6\n\t"
  120452. #else
  120453. "orr r4, r6\n\t"
  120454. #endif
  120455. "ldr r3, [%[a], #36]\n\t"
  120456. "str r4, [%[a], #32]\n\t"
  120457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120458. "lsls r6, r3, #23\n\t"
  120459. #else
  120460. "lsl r6, r3, #23\n\t"
  120461. #endif
  120462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120463. "lsrs r3, r3, #9\n\t"
  120464. #else
  120465. "lsr r3, r3, #9\n\t"
  120466. #endif
  120467. #ifdef WOLFSSL_KEIL
  120468. "orrs r5, r5, r6\n\t"
  120469. #elif defined(__clang__)
  120470. "orrs r5, r6\n\t"
  120471. #else
  120472. "orr r5, r6\n\t"
  120473. #endif
  120474. "ldr r4, [%[a], #40]\n\t"
  120475. "str r5, [%[a], #36]\n\t"
  120476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120477. "lsls r6, r4, #23\n\t"
  120478. #else
  120479. "lsl r6, r4, #23\n\t"
  120480. #endif
  120481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120482. "lsrs r4, r4, #9\n\t"
  120483. #else
  120484. "lsr r4, r4, #9\n\t"
  120485. #endif
  120486. #ifdef WOLFSSL_KEIL
  120487. "orrs r3, r3, r6\n\t"
  120488. #elif defined(__clang__)
  120489. "orrs r3, r6\n\t"
  120490. #else
  120491. "orr r3, r6\n\t"
  120492. #endif
  120493. "ldr r5, [%[a], #44]\n\t"
  120494. "str r3, [%[a], #40]\n\t"
  120495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120496. "lsls r6, r5, #23\n\t"
  120497. #else
  120498. "lsl r6, r5, #23\n\t"
  120499. #endif
  120500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120501. "lsrs r5, r5, #9\n\t"
  120502. #else
  120503. "lsr r5, r5, #9\n\t"
  120504. #endif
  120505. #ifdef WOLFSSL_KEIL
  120506. "orrs r4, r4, r6\n\t"
  120507. #elif defined(__clang__)
  120508. "orrs r4, r6\n\t"
  120509. #else
  120510. "orr r4, r6\n\t"
  120511. #endif
  120512. "ldr r3, [%[a], #48]\n\t"
  120513. "str r4, [%[a], #44]\n\t"
  120514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120515. "lsls r6, r3, #23\n\t"
  120516. #else
  120517. "lsl r6, r3, #23\n\t"
  120518. #endif
  120519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120520. "lsrs r3, r3, #9\n\t"
  120521. #else
  120522. "lsr r3, r3, #9\n\t"
  120523. #endif
  120524. #ifdef WOLFSSL_KEIL
  120525. "orrs r5, r5, r6\n\t"
  120526. #elif defined(__clang__)
  120527. "orrs r5, r6\n\t"
  120528. #else
  120529. "orr r5, r6\n\t"
  120530. #endif
  120531. "ldr r4, [%[a], #52]\n\t"
  120532. "str r5, [%[a], #48]\n\t"
  120533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120534. "lsls r6, r4, #23\n\t"
  120535. #else
  120536. "lsl r6, r4, #23\n\t"
  120537. #endif
  120538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120539. "lsrs r4, r4, #9\n\t"
  120540. #else
  120541. "lsr r4, r4, #9\n\t"
  120542. #endif
  120543. #ifdef WOLFSSL_KEIL
  120544. "orrs r3, r3, r6\n\t"
  120545. #elif defined(__clang__)
  120546. "orrs r3, r6\n\t"
  120547. #else
  120548. "orr r3, r6\n\t"
  120549. #endif
  120550. "ldr r5, [%[a], #56]\n\t"
  120551. "str r3, [%[a], #52]\n\t"
  120552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120553. "lsls r6, r5, #23\n\t"
  120554. #else
  120555. "lsl r6, r5, #23\n\t"
  120556. #endif
  120557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120558. "lsrs r5, r5, #9\n\t"
  120559. #else
  120560. "lsr r5, r5, #9\n\t"
  120561. #endif
  120562. #ifdef WOLFSSL_KEIL
  120563. "orrs r4, r4, r6\n\t"
  120564. #elif defined(__clang__)
  120565. "orrs r4, r6\n\t"
  120566. #else
  120567. "orr r4, r6\n\t"
  120568. #endif
  120569. "ldr r3, [%[a], #60]\n\t"
  120570. "str r4, [%[a], #56]\n\t"
  120571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120572. "lsls r6, r3, #23\n\t"
  120573. #else
  120574. "lsl r6, r3, #23\n\t"
  120575. #endif
  120576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120577. "lsrs r3, r3, #9\n\t"
  120578. #else
  120579. "lsr r3, r3, #9\n\t"
  120580. #endif
  120581. #ifdef WOLFSSL_KEIL
  120582. "orrs r5, r5, r6\n\t"
  120583. #elif defined(__clang__)
  120584. "orrs r5, r6\n\t"
  120585. #else
  120586. "orr r5, r6\n\t"
  120587. #endif
  120588. "ldr r4, [%[a], #64]\n\t"
  120589. "str r5, [%[a], #60]\n\t"
  120590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120591. "lsls r6, r4, #23\n\t"
  120592. #else
  120593. "lsl r6, r4, #23\n\t"
  120594. #endif
  120595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120596. "lsrs r4, r4, #9\n\t"
  120597. #else
  120598. "lsr r4, r4, #9\n\t"
  120599. #endif
  120600. #ifdef WOLFSSL_KEIL
  120601. "orrs r3, r3, r6\n\t"
  120602. #elif defined(__clang__)
  120603. "orrs r3, r6\n\t"
  120604. #else
  120605. "orr r3, r6\n\t"
  120606. #endif
  120607. "str r3, [%[a], #64]\n\t"
  120608. "movs r7, r4\n\t"
  120609. "str r4, [%[a], #68]\n\t"
  120610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120611. "lsrs r7, r7, #9\n\t"
  120612. #else
  120613. "lsr r7, r7, #9\n\t"
  120614. #endif
  120615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120616. "adds %[a], %[a], #4\n\t"
  120617. #else
  120618. "add %[a], %[a], #4\n\t"
  120619. #endif
  120620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120621. "negs r7, r7\n\t"
  120622. #else
  120623. "neg r7, r7\n\t"
  120624. #endif
  120625. "# Subtract masked modulus\n\t"
  120626. "movs r4, #0x44\n\t"
  120627. "movs %[mp], #0\n\t"
  120628. "movs r3, #0\n\t"
  120629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120630. "subs %[a], %[a], r4\n\t"
  120631. #else
  120632. "sub %[a], %[a], r4\n\t"
  120633. #endif
  120634. #ifndef WOLFSSL_SP_LARGE_CODE
  120635. "\n"
  120636. "L_sp_521_mont_reduce_order_17_sub_mask_%=:\n\t"
  120637. "ldm %[m]!, {r6}\n\t"
  120638. "movs r5, #0\n\t"
  120639. #ifdef WOLFSSL_KEIL
  120640. "ands r6, r6, r7\n\t"
  120641. #elif defined(__clang__)
  120642. "ands r6, r7\n\t"
  120643. #else
  120644. "and r6, r7\n\t"
  120645. #endif
  120646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120647. "subs r5, r5, %[mp]\n\t"
  120648. #else
  120649. "sub r5, r5, %[mp]\n\t"
  120650. #endif
  120651. "ldr r5, [%[a], r4]\n\t"
  120652. #ifdef WOLFSSL_KEIL
  120653. "sbcs r5, r5, r6\n\t"
  120654. #elif defined(__clang__)
  120655. "sbcs r5, r6\n\t"
  120656. #else
  120657. "sbc r5, r6\n\t"
  120658. #endif
  120659. #ifdef WOLFSSL_KEIL
  120660. "sbcs %[mp], %[mp], %[mp]\n\t"
  120661. #elif defined(__clang__)
  120662. "sbcs %[mp], %[mp]\n\t"
  120663. #else
  120664. "sbc %[mp], %[mp]\n\t"
  120665. #endif
  120666. "stm %[a]!, {r5}\n\t"
  120667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120668. "adds r3, r3, #4\n\t"
  120669. #else
  120670. "add r3, r3, #4\n\t"
  120671. #endif
  120672. "cmp r3, r4\n\t"
  120673. "blt L_sp_521_mont_reduce_order_17_sub_mask_%=\n\t"
  120674. #else /* WOLFSSL_SP_LARGE_CODE */
  120675. "ldm %[m]!, {r6}\n\t"
  120676. #ifdef WOLFSSL_KEIL
  120677. "ands r6, r6, r7\n\t"
  120678. #elif defined(__clang__)
  120679. "ands r6, r7\n\t"
  120680. #else
  120681. "and r6, r7\n\t"
  120682. #endif
  120683. "ldr r5, [%[a], r4]\n\t"
  120684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120685. "subs r5, r5, r6\n\t"
  120686. #else
  120687. "sub r5, r5, r6\n\t"
  120688. #endif
  120689. "stm %[a]!, {r5}\n\t"
  120690. "ldm %[m]!, {r6}\n\t"
  120691. #ifdef WOLFSSL_KEIL
  120692. "ands r6, r6, r7\n\t"
  120693. #elif defined(__clang__)
  120694. "ands r6, r7\n\t"
  120695. #else
  120696. "and r6, r7\n\t"
  120697. #endif
  120698. "ldr r5, [%[a], r4]\n\t"
  120699. #ifdef WOLFSSL_KEIL
  120700. "sbcs r5, r5, r6\n\t"
  120701. #elif defined(__clang__)
  120702. "sbcs r5, r6\n\t"
  120703. #else
  120704. "sbc r5, r6\n\t"
  120705. #endif
  120706. "stm %[a]!, {r5}\n\t"
  120707. "ldm %[m]!, {r6}\n\t"
  120708. #ifdef WOLFSSL_KEIL
  120709. "ands r6, r6, r7\n\t"
  120710. #elif defined(__clang__)
  120711. "ands r6, r7\n\t"
  120712. #else
  120713. "and r6, r7\n\t"
  120714. #endif
  120715. "ldr r5, [%[a], r4]\n\t"
  120716. #ifdef WOLFSSL_KEIL
  120717. "sbcs r5, r5, r6\n\t"
  120718. #elif defined(__clang__)
  120719. "sbcs r5, r6\n\t"
  120720. #else
  120721. "sbc r5, r6\n\t"
  120722. #endif
  120723. "stm %[a]!, {r5}\n\t"
  120724. "ldm %[m]!, {r6}\n\t"
  120725. #ifdef WOLFSSL_KEIL
  120726. "ands r6, r6, r7\n\t"
  120727. #elif defined(__clang__)
  120728. "ands r6, r7\n\t"
  120729. #else
  120730. "and r6, r7\n\t"
  120731. #endif
  120732. "ldr r5, [%[a], r4]\n\t"
  120733. #ifdef WOLFSSL_KEIL
  120734. "sbcs r5, r5, r6\n\t"
  120735. #elif defined(__clang__)
  120736. "sbcs r5, r6\n\t"
  120737. #else
  120738. "sbc r5, r6\n\t"
  120739. #endif
  120740. "stm %[a]!, {r5}\n\t"
  120741. "ldm %[m]!, {r6}\n\t"
  120742. #ifdef WOLFSSL_KEIL
  120743. "ands r6, r6, r7\n\t"
  120744. #elif defined(__clang__)
  120745. "ands r6, r7\n\t"
  120746. #else
  120747. "and r6, r7\n\t"
  120748. #endif
  120749. "ldr r5, [%[a], r4]\n\t"
  120750. #ifdef WOLFSSL_KEIL
  120751. "sbcs r5, r5, r6\n\t"
  120752. #elif defined(__clang__)
  120753. "sbcs r5, r6\n\t"
  120754. #else
  120755. "sbc r5, r6\n\t"
  120756. #endif
  120757. "stm %[a]!, {r5}\n\t"
  120758. "ldm %[m]!, {r6}\n\t"
  120759. #ifdef WOLFSSL_KEIL
  120760. "ands r6, r6, r7\n\t"
  120761. #elif defined(__clang__)
  120762. "ands r6, r7\n\t"
  120763. #else
  120764. "and r6, r7\n\t"
  120765. #endif
  120766. "ldr r5, [%[a], r4]\n\t"
  120767. #ifdef WOLFSSL_KEIL
  120768. "sbcs r5, r5, r6\n\t"
  120769. #elif defined(__clang__)
  120770. "sbcs r5, r6\n\t"
  120771. #else
  120772. "sbc r5, r6\n\t"
  120773. #endif
  120774. "stm %[a]!, {r5}\n\t"
  120775. "ldm %[m]!, {r6}\n\t"
  120776. #ifdef WOLFSSL_KEIL
  120777. "ands r6, r6, r7\n\t"
  120778. #elif defined(__clang__)
  120779. "ands r6, r7\n\t"
  120780. #else
  120781. "and r6, r7\n\t"
  120782. #endif
  120783. "ldr r5, [%[a], r4]\n\t"
  120784. #ifdef WOLFSSL_KEIL
  120785. "sbcs r5, r5, r6\n\t"
  120786. #elif defined(__clang__)
  120787. "sbcs r5, r6\n\t"
  120788. #else
  120789. "sbc r5, r6\n\t"
  120790. #endif
  120791. "stm %[a]!, {r5}\n\t"
  120792. "ldm %[m]!, {r6}\n\t"
  120793. #ifdef WOLFSSL_KEIL
  120794. "ands r6, r6, r7\n\t"
  120795. #elif defined(__clang__)
  120796. "ands r6, r7\n\t"
  120797. #else
  120798. "and r6, r7\n\t"
  120799. #endif
  120800. "ldr r5, [%[a], r4]\n\t"
  120801. #ifdef WOLFSSL_KEIL
  120802. "sbcs r5, r5, r6\n\t"
  120803. #elif defined(__clang__)
  120804. "sbcs r5, r6\n\t"
  120805. #else
  120806. "sbc r5, r6\n\t"
  120807. #endif
  120808. "stm %[a]!, {r5}\n\t"
  120809. "ldm %[m]!, {r6}\n\t"
  120810. #ifdef WOLFSSL_KEIL
  120811. "ands r6, r6, r7\n\t"
  120812. #elif defined(__clang__)
  120813. "ands r6, r7\n\t"
  120814. #else
  120815. "and r6, r7\n\t"
  120816. #endif
  120817. "ldr r5, [%[a], r4]\n\t"
  120818. #ifdef WOLFSSL_KEIL
  120819. "sbcs r5, r5, r6\n\t"
  120820. #elif defined(__clang__)
  120821. "sbcs r5, r6\n\t"
  120822. #else
  120823. "sbc r5, r6\n\t"
  120824. #endif
  120825. "stm %[a]!, {r5}\n\t"
  120826. "ldm %[m]!, {r6}\n\t"
  120827. #ifdef WOLFSSL_KEIL
  120828. "ands r6, r6, r7\n\t"
  120829. #elif defined(__clang__)
  120830. "ands r6, r7\n\t"
  120831. #else
  120832. "and r6, r7\n\t"
  120833. #endif
  120834. "ldr r5, [%[a], r4]\n\t"
  120835. #ifdef WOLFSSL_KEIL
  120836. "sbcs r5, r5, r6\n\t"
  120837. #elif defined(__clang__)
  120838. "sbcs r5, r6\n\t"
  120839. #else
  120840. "sbc r5, r6\n\t"
  120841. #endif
  120842. "stm %[a]!, {r5}\n\t"
  120843. "ldm %[m]!, {r6}\n\t"
  120844. #ifdef WOLFSSL_KEIL
  120845. "ands r6, r6, r7\n\t"
  120846. #elif defined(__clang__)
  120847. "ands r6, r7\n\t"
  120848. #else
  120849. "and r6, r7\n\t"
  120850. #endif
  120851. "ldr r5, [%[a], r4]\n\t"
  120852. #ifdef WOLFSSL_KEIL
  120853. "sbcs r5, r5, r6\n\t"
  120854. #elif defined(__clang__)
  120855. "sbcs r5, r6\n\t"
  120856. #else
  120857. "sbc r5, r6\n\t"
  120858. #endif
  120859. "stm %[a]!, {r5}\n\t"
  120860. "ldm %[m]!, {r6}\n\t"
  120861. #ifdef WOLFSSL_KEIL
  120862. "ands r6, r6, r7\n\t"
  120863. #elif defined(__clang__)
  120864. "ands r6, r7\n\t"
  120865. #else
  120866. "and r6, r7\n\t"
  120867. #endif
  120868. "ldr r5, [%[a], r4]\n\t"
  120869. #ifdef WOLFSSL_KEIL
  120870. "sbcs r5, r5, r6\n\t"
  120871. #elif defined(__clang__)
  120872. "sbcs r5, r6\n\t"
  120873. #else
  120874. "sbc r5, r6\n\t"
  120875. #endif
  120876. "stm %[a]!, {r5}\n\t"
  120877. "ldm %[m]!, {r6}\n\t"
  120878. #ifdef WOLFSSL_KEIL
  120879. "ands r6, r6, r7\n\t"
  120880. #elif defined(__clang__)
  120881. "ands r6, r7\n\t"
  120882. #else
  120883. "and r6, r7\n\t"
  120884. #endif
  120885. "ldr r5, [%[a], r4]\n\t"
  120886. #ifdef WOLFSSL_KEIL
  120887. "sbcs r5, r5, r6\n\t"
  120888. #elif defined(__clang__)
  120889. "sbcs r5, r6\n\t"
  120890. #else
  120891. "sbc r5, r6\n\t"
  120892. #endif
  120893. "stm %[a]!, {r5}\n\t"
  120894. "ldm %[m]!, {r6}\n\t"
  120895. #ifdef WOLFSSL_KEIL
  120896. "ands r6, r6, r7\n\t"
  120897. #elif defined(__clang__)
  120898. "ands r6, r7\n\t"
  120899. #else
  120900. "and r6, r7\n\t"
  120901. #endif
  120902. "ldr r5, [%[a], r4]\n\t"
  120903. #ifdef WOLFSSL_KEIL
  120904. "sbcs r5, r5, r6\n\t"
  120905. #elif defined(__clang__)
  120906. "sbcs r5, r6\n\t"
  120907. #else
  120908. "sbc r5, r6\n\t"
  120909. #endif
  120910. "stm %[a]!, {r5}\n\t"
  120911. "ldm %[m]!, {r6}\n\t"
  120912. #ifdef WOLFSSL_KEIL
  120913. "ands r6, r6, r7\n\t"
  120914. #elif defined(__clang__)
  120915. "ands r6, r7\n\t"
  120916. #else
  120917. "and r6, r7\n\t"
  120918. #endif
  120919. "ldr r5, [%[a], r4]\n\t"
  120920. #ifdef WOLFSSL_KEIL
  120921. "sbcs r5, r5, r6\n\t"
  120922. #elif defined(__clang__)
  120923. "sbcs r5, r6\n\t"
  120924. #else
  120925. "sbc r5, r6\n\t"
  120926. #endif
  120927. "stm %[a]!, {r5}\n\t"
  120928. "ldm %[m]!, {r6}\n\t"
  120929. #ifdef WOLFSSL_KEIL
  120930. "ands r6, r6, r7\n\t"
  120931. #elif defined(__clang__)
  120932. "ands r6, r7\n\t"
  120933. #else
  120934. "and r6, r7\n\t"
  120935. #endif
  120936. "ldr r5, [%[a], r4]\n\t"
  120937. #ifdef WOLFSSL_KEIL
  120938. "sbcs r5, r5, r6\n\t"
  120939. #elif defined(__clang__)
  120940. "sbcs r5, r6\n\t"
  120941. #else
  120942. "sbc r5, r6\n\t"
  120943. #endif
  120944. "stm %[a]!, {r5}\n\t"
  120945. "ldm %[m]!, {r6}\n\t"
  120946. #ifdef WOLFSSL_KEIL
  120947. "ands r6, r6, r7\n\t"
  120948. #elif defined(__clang__)
  120949. "ands r6, r7\n\t"
  120950. #else
  120951. "and r6, r7\n\t"
  120952. #endif
  120953. "ldr r5, [%[a], r4]\n\t"
  120954. #ifdef WOLFSSL_KEIL
  120955. "sbcs r5, r5, r6\n\t"
  120956. #elif defined(__clang__)
  120957. "sbcs r5, r6\n\t"
  120958. #else
  120959. "sbc r5, r6\n\t"
  120960. #endif
  120961. "stm %[a]!, {r5}\n\t"
  120962. #endif /* WOLFSSL_SP_LARGE_CODE */
  120963. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  120964. :
  120965. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  120966. );
  120967. }
  120968. /* Multiply two Montgomery form numbers mod the modulus (prime).
  120969. * (r = a * b mod m)
  120970. *
  120971. * r Result of multiplication.
  120972. * a First number to multiply in Montgomery form.
  120973. * b Second number to multiply in Montgomery form.
  120974. * m Modulus (prime).
  120975. * mp Montgomery multiplier.
  120976. */
  120977. SP_NOINLINE static void sp_521_mont_mul_17(sp_digit* r, const sp_digit* a,
  120978. const sp_digit* b, const sp_digit* m, sp_digit mp)
  120979. {
  120980. sp_521_mul_17(r, a, b);
  120981. sp_521_mont_reduce_17(r, m, mp);
  120982. }
  120983. /* Square the Montgomery form number. (r = a * a mod m)
  120984. *
  120985. * r Result of squaring.
  120986. * a Number to square in Montgomery form.
  120987. * m Modulus (prime).
  120988. * mp Montgomery multiplier.
  120989. */
  120990. SP_NOINLINE static void sp_521_mont_sqr_17(sp_digit* r, const sp_digit* a,
  120991. const sp_digit* m, sp_digit mp)
  120992. {
  120993. sp_521_sqr_17(r, a);
  120994. sp_521_mont_reduce_17(r, m, mp);
  120995. }
  120996. #ifndef WOLFSSL_SP_SMALL
  120997. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  120998. *
  120999. * r Result of squaring.
  121000. * a Number to square in Montgomery form.
  121001. * n Number of times to square.
  121002. * m Modulus (prime).
  121003. * mp Montgomery multiplier.
  121004. */
  121005. SP_NOINLINE static void sp_521_mont_sqr_n_17(sp_digit* r,
  121006. const sp_digit* a, int n, const sp_digit* m, sp_digit mp)
  121007. {
  121008. sp_521_mont_sqr_17(r, a, m, mp);
  121009. for (; n > 1; n--) {
  121010. sp_521_mont_sqr_17(r, r, m, mp);
  121011. }
  121012. }
  121013. #endif /* !WOLFSSL_SP_SMALL */
  121014. #ifdef WOLFSSL_SP_SMALL
  121015. /* Mod-2 for the P521 curve. */
  121016. static const uint32_t p521_mod_minus_2[17] = {
  121017. 0xfffffffdU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,
  121018. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,
  121019. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0x000001ffU
  121020. };
  121021. #endif /* !WOLFSSL_SP_SMALL */
  121022. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  121023. * P521 curve. (r = 1 / a mod m)
  121024. *
  121025. * r Inverse result.
  121026. * a Number to invert.
  121027. * td Temporary data.
  121028. */
  121029. static void sp_521_mont_inv_17(sp_digit* r, const sp_digit* a, sp_digit* td)
  121030. {
  121031. #ifdef WOLFSSL_SP_SMALL
  121032. sp_digit* t = td;
  121033. int i;
  121034. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  121035. for (i=519; i>=0; i--) {
  121036. sp_521_mont_sqr_17(t, t, p521_mod, p521_mp_mod);
  121037. if (p521_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  121038. sp_521_mont_mul_17(t, t, a, p521_mod, p521_mp_mod);
  121039. }
  121040. XMEMCPY(r, t, sizeof(sp_digit) * 17);
  121041. #else
  121042. sp_digit* t1 = td;
  121043. sp_digit* t2 = td + 2 * 17;
  121044. sp_digit* t3 = td + 4 * 17;
  121045. /* 0x2 */
  121046. sp_521_mont_sqr_17(t1, a, p521_mod, p521_mp_mod);
  121047. /* 0x3 */
  121048. sp_521_mont_mul_17(t2, t1, a, p521_mod, p521_mp_mod);
  121049. /* 0x6 */
  121050. sp_521_mont_sqr_17(t1, t2, p521_mod, p521_mp_mod);
  121051. /* 0x7 */
  121052. sp_521_mont_mul_17(t3, t1, a, p521_mod, p521_mp_mod);
  121053. /* 0xc */
  121054. sp_521_mont_sqr_n_17(t1, t2, 2, p521_mod, p521_mp_mod);
  121055. /* 0xf */
  121056. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121057. /* 0x78 */
  121058. sp_521_mont_sqr_n_17(t1, t2, 3, p521_mod, p521_mp_mod);
  121059. /* 0x7f */
  121060. sp_521_mont_mul_17(t3, t3, t1, p521_mod, p521_mp_mod);
  121061. /* 0xf0 */
  121062. sp_521_mont_sqr_n_17(t1, t2, 4, p521_mod, p521_mp_mod);
  121063. /* 0xff */
  121064. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121065. /* 0xff00 */
  121066. sp_521_mont_sqr_n_17(t1, t2, 8, p521_mod, p521_mp_mod);
  121067. /* 0xffff */
  121068. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121069. /* 0xffff0000 */
  121070. sp_521_mont_sqr_n_17(t1, t2, 16, p521_mod, p521_mp_mod);
  121071. /* 0xffffffff */
  121072. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121073. /* 0xffffffff00000000 */
  121074. sp_521_mont_sqr_n_17(t1, t2, 32, p521_mod, p521_mp_mod);
  121075. /* 0xffffffffffffffff */
  121076. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121077. /* 0xffffffffffffffff0000000000000000 */
  121078. sp_521_mont_sqr_n_17(t1, t2, 64, p521_mod, p521_mp_mod);
  121079. /* 0xffffffffffffffffffffffffffffffff */
  121080. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121081. /* 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000 */
  121082. sp_521_mont_sqr_n_17(t1, t2, 128, p521_mod, p521_mp_mod);
  121083. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  121084. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121085. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000 */
  121086. sp_521_mont_sqr_n_17(t1, t2, 256, p521_mod, p521_mp_mod);
  121087. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  121088. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  121089. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80 */
  121090. sp_521_mont_sqr_n_17(t1, t2, 7, p521_mod, p521_mp_mod);
  121091. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  121092. sp_521_mont_mul_17(t2, t3, t1, p521_mod, p521_mp_mod);
  121093. /* 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc */
  121094. sp_521_mont_sqr_n_17(t1, t2, 2, p521_mod, p521_mp_mod);
  121095. /* 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd */
  121096. sp_521_mont_mul_17(r, t1, a, p521_mod, p521_mp_mod);
  121097. #endif /* WOLFSSL_SP_SMALL */
  121098. }
  121099. /* Compare a with b in constant time.
  121100. *
  121101. * a A single precision integer.
  121102. * b A single precision integer.
  121103. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  121104. * respectively.
  121105. */
  121106. SP_NOINLINE static sp_int32 sp_521_cmp_17(const sp_digit* a, const sp_digit* b)
  121107. {
  121108. __asm__ __volatile__ (
  121109. "movs r2, #0\n\t"
  121110. "movs r3, #0\n\t"
  121111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121112. "mvns r3, r3\n\t"
  121113. #else
  121114. "mvn r3, r3\n\t"
  121115. #endif
  121116. "movs r6, #0x40\n\t"
  121117. "\n"
  121118. "L_sp_521_cmp_17_words_%=:\n\t"
  121119. "ldr r7, [%[a], r6]\n\t"
  121120. "ldr r5, [%[b], r6]\n\t"
  121121. #ifdef WOLFSSL_KEIL
  121122. "ands r7, r7, r3\n\t"
  121123. #elif defined(__clang__)
  121124. "ands r7, r3\n\t"
  121125. #else
  121126. "and r7, r3\n\t"
  121127. #endif
  121128. #ifdef WOLFSSL_KEIL
  121129. "ands r5, r5, r3\n\t"
  121130. #elif defined(__clang__)
  121131. "ands r5, r3\n\t"
  121132. #else
  121133. "and r5, r3\n\t"
  121134. #endif
  121135. "movs r4, r7\n\t"
  121136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121137. "subs r7, r7, r5\n\t"
  121138. #else
  121139. "sub r7, r7, r5\n\t"
  121140. #endif
  121141. #ifdef WOLFSSL_KEIL
  121142. "sbcs r7, r7, r7\n\t"
  121143. #elif defined(__clang__)
  121144. "sbcs r7, r7\n\t"
  121145. #else
  121146. "sbc r7, r7\n\t"
  121147. #endif
  121148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121149. "adds r2, r2, r7\n\t"
  121150. #else
  121151. "add r2, r2, r7\n\t"
  121152. #endif
  121153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121154. "mvns r7, r7\n\t"
  121155. #else
  121156. "mvn r7, r7\n\t"
  121157. #endif
  121158. #ifdef WOLFSSL_KEIL
  121159. "ands r3, r3, r7\n\t"
  121160. #elif defined(__clang__)
  121161. "ands r3, r7\n\t"
  121162. #else
  121163. "and r3, r7\n\t"
  121164. #endif
  121165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121166. "subs r5, r5, r4\n\t"
  121167. #else
  121168. "sub r5, r5, r4\n\t"
  121169. #endif
  121170. #ifdef WOLFSSL_KEIL
  121171. "sbcs r7, r7, r7\n\t"
  121172. #elif defined(__clang__)
  121173. "sbcs r7, r7\n\t"
  121174. #else
  121175. "sbc r7, r7\n\t"
  121176. #endif
  121177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121178. "subs r2, r2, r7\n\t"
  121179. #else
  121180. "sub r2, r2, r7\n\t"
  121181. #endif
  121182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121183. "mvns r7, r7\n\t"
  121184. #else
  121185. "mvn r7, r7\n\t"
  121186. #endif
  121187. #ifdef WOLFSSL_KEIL
  121188. "ands r3, r3, r7\n\t"
  121189. #elif defined(__clang__)
  121190. "ands r3, r7\n\t"
  121191. #else
  121192. "and r3, r7\n\t"
  121193. #endif
  121194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121195. "subs r6, r6, #4\n\t"
  121196. #else
  121197. "sub r6, r6, #4\n\t"
  121198. #endif
  121199. "bge L_sp_521_cmp_17_words_%=\n\t"
  121200. "movs %[a], r2\n\t"
  121201. : [a] "+l" (a), [b] "+l" (b)
  121202. :
  121203. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  121204. );
  121205. return (uint32_t)(size_t)a;
  121206. }
  121207. /* Normalize the values in each word to 32.
  121208. *
  121209. * a Array of sp_digit to normalize.
  121210. */
  121211. #define sp_521_norm_17(a)
  121212. /* Map the Montgomery form projective coordinate point to an affine point.
  121213. *
  121214. * r Resulting affine coordinate point.
  121215. * p Montgomery form projective coordinate point.
  121216. * t Temporary ordinate data.
  121217. */
  121218. static void sp_521_map_17(sp_point_521* r, const sp_point_521* p,
  121219. sp_digit* t)
  121220. {
  121221. sp_digit* t1 = t;
  121222. sp_digit* t2 = t + 2*17;
  121223. sp_int32 n;
  121224. sp_521_mont_inv_17(t1, p->z, t + 2*17);
  121225. sp_521_mont_sqr_17(t2, t1, p521_mod, p521_mp_mod);
  121226. sp_521_mont_mul_17(t1, t2, t1, p521_mod, p521_mp_mod);
  121227. /* x /= z^2 */
  121228. sp_521_mont_mul_17(r->x, p->x, t2, p521_mod, p521_mp_mod);
  121229. XMEMSET(r->x + 17, 0, sizeof(sp_digit) * 17U);
  121230. sp_521_mont_reduce_17(r->x, p521_mod, p521_mp_mod);
  121231. /* Reduce x to less than modulus */
  121232. n = sp_521_cmp_17(r->x, p521_mod);
  121233. sp_521_cond_sub_17(r->x, r->x, p521_mod, ~(n >> 31));
  121234. sp_521_norm_17(r->x);
  121235. /* y /= z^3 */
  121236. sp_521_mont_mul_17(r->y, p->y, t1, p521_mod, p521_mp_mod);
  121237. XMEMSET(r->y + 17, 0, sizeof(sp_digit) * 17U);
  121238. sp_521_mont_reduce_17(r->y, p521_mod, p521_mp_mod);
  121239. /* Reduce y to less than modulus */
  121240. n = sp_521_cmp_17(r->y, p521_mod);
  121241. sp_521_cond_sub_17(r->y, r->y, p521_mod, ~(n >> 31));
  121242. sp_521_norm_17(r->y);
  121243. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  121244. r->z[0] = 1;
  121245. }
  121246. /* Add two Montgomery form numbers (r = a + b % m).
  121247. *
  121248. * r Result of addition.
  121249. * a First number to add in Montgomery form.
  121250. * b Second number to add in Montgomery form.
  121251. * m Modulus (prime).
  121252. */
  121253. SP_NOINLINE static void sp_521_mont_add_17(sp_digit* r, const sp_digit* a,
  121254. const sp_digit* b, const sp_digit* m)
  121255. {
  121256. __asm__ __volatile__ (
  121257. "ldm %[a]!, {r4, r5}\n\t"
  121258. "ldm %[b]!, {r6, r7}\n\t"
  121259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121260. "adds r4, r4, r6\n\t"
  121261. #else
  121262. "add r4, r4, r6\n\t"
  121263. #endif
  121264. #ifdef WOLFSSL_KEIL
  121265. "adcs r5, r5, r7\n\t"
  121266. #elif defined(__clang__)
  121267. "adcs r5, r7\n\t"
  121268. #else
  121269. "adc r5, r7\n\t"
  121270. #endif
  121271. "stm %[r]!, {r4, r5}\n\t"
  121272. "ldm %[a]!, {r4, r5}\n\t"
  121273. "ldm %[b]!, {r6, r7}\n\t"
  121274. #ifdef WOLFSSL_KEIL
  121275. "adcs r4, r4, r6\n\t"
  121276. #elif defined(__clang__)
  121277. "adcs r4, r6\n\t"
  121278. #else
  121279. "adc r4, r6\n\t"
  121280. #endif
  121281. #ifdef WOLFSSL_KEIL
  121282. "adcs r5, r5, r7\n\t"
  121283. #elif defined(__clang__)
  121284. "adcs r5, r7\n\t"
  121285. #else
  121286. "adc r5, r7\n\t"
  121287. #endif
  121288. "stm %[r]!, {r4, r5}\n\t"
  121289. "ldm %[a]!, {r4, r5}\n\t"
  121290. "ldm %[b]!, {r6, r7}\n\t"
  121291. #ifdef WOLFSSL_KEIL
  121292. "adcs r4, r4, r6\n\t"
  121293. #elif defined(__clang__)
  121294. "adcs r4, r6\n\t"
  121295. #else
  121296. "adc r4, r6\n\t"
  121297. #endif
  121298. #ifdef WOLFSSL_KEIL
  121299. "adcs r5, r5, r7\n\t"
  121300. #elif defined(__clang__)
  121301. "adcs r5, r7\n\t"
  121302. #else
  121303. "adc r5, r7\n\t"
  121304. #endif
  121305. "stm %[r]!, {r4, r5}\n\t"
  121306. "ldm %[a]!, {r4, r5}\n\t"
  121307. "ldm %[b]!, {r6, r7}\n\t"
  121308. #ifdef WOLFSSL_KEIL
  121309. "adcs r4, r4, r6\n\t"
  121310. #elif defined(__clang__)
  121311. "adcs r4, r6\n\t"
  121312. #else
  121313. "adc r4, r6\n\t"
  121314. #endif
  121315. #ifdef WOLFSSL_KEIL
  121316. "adcs r5, r5, r7\n\t"
  121317. #elif defined(__clang__)
  121318. "adcs r5, r7\n\t"
  121319. #else
  121320. "adc r5, r7\n\t"
  121321. #endif
  121322. "stm %[r]!, {r4, r5}\n\t"
  121323. "ldm %[a]!, {r4, r5}\n\t"
  121324. "ldm %[b]!, {r6, r7}\n\t"
  121325. #ifdef WOLFSSL_KEIL
  121326. "adcs r4, r4, r6\n\t"
  121327. #elif defined(__clang__)
  121328. "adcs r4, r6\n\t"
  121329. #else
  121330. "adc r4, r6\n\t"
  121331. #endif
  121332. #ifdef WOLFSSL_KEIL
  121333. "adcs r5, r5, r7\n\t"
  121334. #elif defined(__clang__)
  121335. "adcs r5, r7\n\t"
  121336. #else
  121337. "adc r5, r7\n\t"
  121338. #endif
  121339. "stm %[r]!, {r4, r5}\n\t"
  121340. "ldm %[a]!, {r4, r5}\n\t"
  121341. "ldm %[b]!, {r6, r7}\n\t"
  121342. #ifdef WOLFSSL_KEIL
  121343. "adcs r4, r4, r6\n\t"
  121344. #elif defined(__clang__)
  121345. "adcs r4, r6\n\t"
  121346. #else
  121347. "adc r4, r6\n\t"
  121348. #endif
  121349. #ifdef WOLFSSL_KEIL
  121350. "adcs r5, r5, r7\n\t"
  121351. #elif defined(__clang__)
  121352. "adcs r5, r7\n\t"
  121353. #else
  121354. "adc r5, r7\n\t"
  121355. #endif
  121356. "stm %[r]!, {r4, r5}\n\t"
  121357. "ldm %[a]!, {r4, r5}\n\t"
  121358. "ldm %[b]!, {r6, r7}\n\t"
  121359. #ifdef WOLFSSL_KEIL
  121360. "adcs r4, r4, r6\n\t"
  121361. #elif defined(__clang__)
  121362. "adcs r4, r6\n\t"
  121363. #else
  121364. "adc r4, r6\n\t"
  121365. #endif
  121366. #ifdef WOLFSSL_KEIL
  121367. "adcs r5, r5, r7\n\t"
  121368. #elif defined(__clang__)
  121369. "adcs r5, r7\n\t"
  121370. #else
  121371. "adc r5, r7\n\t"
  121372. #endif
  121373. "stm %[r]!, {r4, r5}\n\t"
  121374. "ldm %[a]!, {r4, r5}\n\t"
  121375. "ldm %[b]!, {r6, r7}\n\t"
  121376. #ifdef WOLFSSL_KEIL
  121377. "adcs r4, r4, r6\n\t"
  121378. #elif defined(__clang__)
  121379. "adcs r4, r6\n\t"
  121380. #else
  121381. "adc r4, r6\n\t"
  121382. #endif
  121383. #ifdef WOLFSSL_KEIL
  121384. "adcs r5, r5, r7\n\t"
  121385. #elif defined(__clang__)
  121386. "adcs r5, r7\n\t"
  121387. #else
  121388. "adc r5, r7\n\t"
  121389. #endif
  121390. "stm %[r]!, {r4, r5}\n\t"
  121391. "ldm %[a]!, {r4}\n\t"
  121392. "ldm %[b]!, {r6}\n\t"
  121393. #ifdef WOLFSSL_KEIL
  121394. "adcs r4, r4, r6\n\t"
  121395. #elif defined(__clang__)
  121396. "adcs r4, r6\n\t"
  121397. #else
  121398. "adc r4, r6\n\t"
  121399. #endif
  121400. "movs r7, #1\n\t"
  121401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121402. "lsls r7, r7, #8\n\t"
  121403. #else
  121404. "lsl r7, r7, #8\n\t"
  121405. #endif
  121406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121407. "adds r7, r7, #0xff\n\t"
  121408. #else
  121409. "add r7, r7, #0xff\n\t"
  121410. #endif
  121411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121412. "lsrs %[m], r4, #9\n\t"
  121413. #else
  121414. "lsr %[m], r4, #9\n\t"
  121415. #endif
  121416. #ifdef WOLFSSL_KEIL
  121417. "ands r4, r4, r7\n\t"
  121418. #elif defined(__clang__)
  121419. "ands r4, r7\n\t"
  121420. #else
  121421. "and r4, r7\n\t"
  121422. #endif
  121423. "stm %[r]!, {r4}\n\t"
  121424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121425. "subs %[r], %[r], #0x44\n\t"
  121426. #else
  121427. "sub %[r], %[r], #0x44\n\t"
  121428. #endif
  121429. "ldr r4, [%[r]]\n\t"
  121430. "ldr r5, [%[r], #4]\n\t"
  121431. "ldr r6, [%[r], #8]\n\t"
  121432. "ldr r7, [%[r], #12]\n\t"
  121433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121434. "adds r4, r4, %[m]\n\t"
  121435. #else
  121436. "add r4, r4, %[m]\n\t"
  121437. #endif
  121438. "movs %[m], #0\n\t"
  121439. #ifdef WOLFSSL_KEIL
  121440. "adcs r5, r5, %[m]\n\t"
  121441. #elif defined(__clang__)
  121442. "adcs r5, %[m]\n\t"
  121443. #else
  121444. "adc r5, %[m]\n\t"
  121445. #endif
  121446. #ifdef WOLFSSL_KEIL
  121447. "adcs r6, r6, %[m]\n\t"
  121448. #elif defined(__clang__)
  121449. "adcs r6, %[m]\n\t"
  121450. #else
  121451. "adc r6, %[m]\n\t"
  121452. #endif
  121453. #ifdef WOLFSSL_KEIL
  121454. "adcs r7, r7, %[m]\n\t"
  121455. #elif defined(__clang__)
  121456. "adcs r7, %[m]\n\t"
  121457. #else
  121458. "adc r7, %[m]\n\t"
  121459. #endif
  121460. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  121461. "ldr r4, [%[r]]\n\t"
  121462. "ldr r5, [%[r], #4]\n\t"
  121463. "ldr r6, [%[r], #8]\n\t"
  121464. "ldr r7, [%[r], #12]\n\t"
  121465. #ifdef WOLFSSL_KEIL
  121466. "adcs r4, r4, %[m]\n\t"
  121467. #elif defined(__clang__)
  121468. "adcs r4, %[m]\n\t"
  121469. #else
  121470. "adc r4, %[m]\n\t"
  121471. #endif
  121472. #ifdef WOLFSSL_KEIL
  121473. "adcs r5, r5, %[m]\n\t"
  121474. #elif defined(__clang__)
  121475. "adcs r5, %[m]\n\t"
  121476. #else
  121477. "adc r5, %[m]\n\t"
  121478. #endif
  121479. #ifdef WOLFSSL_KEIL
  121480. "adcs r6, r6, %[m]\n\t"
  121481. #elif defined(__clang__)
  121482. "adcs r6, %[m]\n\t"
  121483. #else
  121484. "adc r6, %[m]\n\t"
  121485. #endif
  121486. #ifdef WOLFSSL_KEIL
  121487. "adcs r7, r7, %[m]\n\t"
  121488. #elif defined(__clang__)
  121489. "adcs r7, %[m]\n\t"
  121490. #else
  121491. "adc r7, %[m]\n\t"
  121492. #endif
  121493. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  121494. "ldr r4, [%[r]]\n\t"
  121495. "ldr r5, [%[r], #4]\n\t"
  121496. "ldr r6, [%[r], #8]\n\t"
  121497. "ldr r7, [%[r], #12]\n\t"
  121498. #ifdef WOLFSSL_KEIL
  121499. "adcs r4, r4, %[m]\n\t"
  121500. #elif defined(__clang__)
  121501. "adcs r4, %[m]\n\t"
  121502. #else
  121503. "adc r4, %[m]\n\t"
  121504. #endif
  121505. #ifdef WOLFSSL_KEIL
  121506. "adcs r5, r5, %[m]\n\t"
  121507. #elif defined(__clang__)
  121508. "adcs r5, %[m]\n\t"
  121509. #else
  121510. "adc r5, %[m]\n\t"
  121511. #endif
  121512. #ifdef WOLFSSL_KEIL
  121513. "adcs r6, r6, %[m]\n\t"
  121514. #elif defined(__clang__)
  121515. "adcs r6, %[m]\n\t"
  121516. #else
  121517. "adc r6, %[m]\n\t"
  121518. #endif
  121519. #ifdef WOLFSSL_KEIL
  121520. "adcs r7, r7, %[m]\n\t"
  121521. #elif defined(__clang__)
  121522. "adcs r7, %[m]\n\t"
  121523. #else
  121524. "adc r7, %[m]\n\t"
  121525. #endif
  121526. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  121527. "ldr r4, [%[r]]\n\t"
  121528. "ldr r5, [%[r], #4]\n\t"
  121529. "ldr r6, [%[r], #8]\n\t"
  121530. "ldr r7, [%[r], #12]\n\t"
  121531. #ifdef WOLFSSL_KEIL
  121532. "adcs r4, r4, %[m]\n\t"
  121533. #elif defined(__clang__)
  121534. "adcs r4, %[m]\n\t"
  121535. #else
  121536. "adc r4, %[m]\n\t"
  121537. #endif
  121538. #ifdef WOLFSSL_KEIL
  121539. "adcs r5, r5, %[m]\n\t"
  121540. #elif defined(__clang__)
  121541. "adcs r5, %[m]\n\t"
  121542. #else
  121543. "adc r5, %[m]\n\t"
  121544. #endif
  121545. #ifdef WOLFSSL_KEIL
  121546. "adcs r6, r6, %[m]\n\t"
  121547. #elif defined(__clang__)
  121548. "adcs r6, %[m]\n\t"
  121549. #else
  121550. "adc r6, %[m]\n\t"
  121551. #endif
  121552. #ifdef WOLFSSL_KEIL
  121553. "adcs r7, r7, %[m]\n\t"
  121554. #elif defined(__clang__)
  121555. "adcs r7, %[m]\n\t"
  121556. #else
  121557. "adc r7, %[m]\n\t"
  121558. #endif
  121559. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  121560. "ldr r4, [%[r]]\n\t"
  121561. #ifdef WOLFSSL_KEIL
  121562. "adcs r4, r4, %[m]\n\t"
  121563. #elif defined(__clang__)
  121564. "adcs r4, %[m]\n\t"
  121565. #else
  121566. "adc r4, %[m]\n\t"
  121567. #endif
  121568. "stm %[r]!, {r4}\n\t"
  121569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121570. "subs %[r], %[r], #0x44\n\t"
  121571. #else
  121572. "sub %[r], %[r], #0x44\n\t"
  121573. #endif
  121574. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  121575. :
  121576. : "memory", "r4", "r5", "r6", "r7"
  121577. );
  121578. }
  121579. /* Double a Montgomery form number (r = a + a % m).
  121580. *
  121581. * r Result of doubling.
  121582. * a Number to double in Montgomery form.
  121583. * m Modulus (prime).
  121584. */
  121585. SP_NOINLINE static void sp_521_mont_dbl_17(sp_digit* r, const sp_digit* a,
  121586. const sp_digit* m)
  121587. {
  121588. __asm__ __volatile__ (
  121589. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121591. "adds r3, r3, r3\n\t"
  121592. #else
  121593. "add r3, r3, r3\n\t"
  121594. #endif
  121595. #ifdef WOLFSSL_KEIL
  121596. "adcs r4, r4, r4\n\t"
  121597. #elif defined(__clang__)
  121598. "adcs r4, r4\n\t"
  121599. #else
  121600. "adc r4, r4\n\t"
  121601. #endif
  121602. #ifdef WOLFSSL_KEIL
  121603. "adcs r5, r5, r5\n\t"
  121604. #elif defined(__clang__)
  121605. "adcs r5, r5\n\t"
  121606. #else
  121607. "adc r5, r5\n\t"
  121608. #endif
  121609. #ifdef WOLFSSL_KEIL
  121610. "adcs r6, r6, r6\n\t"
  121611. #elif defined(__clang__)
  121612. "adcs r6, r6\n\t"
  121613. #else
  121614. "adc r6, r6\n\t"
  121615. #endif
  121616. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121617. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121618. #ifdef WOLFSSL_KEIL
  121619. "adcs r3, r3, r3\n\t"
  121620. #elif defined(__clang__)
  121621. "adcs r3, r3\n\t"
  121622. #else
  121623. "adc r3, r3\n\t"
  121624. #endif
  121625. #ifdef WOLFSSL_KEIL
  121626. "adcs r4, r4, r4\n\t"
  121627. #elif defined(__clang__)
  121628. "adcs r4, r4\n\t"
  121629. #else
  121630. "adc r4, r4\n\t"
  121631. #endif
  121632. #ifdef WOLFSSL_KEIL
  121633. "adcs r5, r5, r5\n\t"
  121634. #elif defined(__clang__)
  121635. "adcs r5, r5\n\t"
  121636. #else
  121637. "adc r5, r5\n\t"
  121638. #endif
  121639. #ifdef WOLFSSL_KEIL
  121640. "adcs r6, r6, r6\n\t"
  121641. #elif defined(__clang__)
  121642. "adcs r6, r6\n\t"
  121643. #else
  121644. "adc r6, r6\n\t"
  121645. #endif
  121646. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121647. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121648. #ifdef WOLFSSL_KEIL
  121649. "adcs r3, r3, r3\n\t"
  121650. #elif defined(__clang__)
  121651. "adcs r3, r3\n\t"
  121652. #else
  121653. "adc r3, r3\n\t"
  121654. #endif
  121655. #ifdef WOLFSSL_KEIL
  121656. "adcs r4, r4, r4\n\t"
  121657. #elif defined(__clang__)
  121658. "adcs r4, r4\n\t"
  121659. #else
  121660. "adc r4, r4\n\t"
  121661. #endif
  121662. #ifdef WOLFSSL_KEIL
  121663. "adcs r5, r5, r5\n\t"
  121664. #elif defined(__clang__)
  121665. "adcs r5, r5\n\t"
  121666. #else
  121667. "adc r5, r5\n\t"
  121668. #endif
  121669. #ifdef WOLFSSL_KEIL
  121670. "adcs r6, r6, r6\n\t"
  121671. #elif defined(__clang__)
  121672. "adcs r6, r6\n\t"
  121673. #else
  121674. "adc r6, r6\n\t"
  121675. #endif
  121676. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121677. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121678. #ifdef WOLFSSL_KEIL
  121679. "adcs r3, r3, r3\n\t"
  121680. #elif defined(__clang__)
  121681. "adcs r3, r3\n\t"
  121682. #else
  121683. "adc r3, r3\n\t"
  121684. #endif
  121685. #ifdef WOLFSSL_KEIL
  121686. "adcs r4, r4, r4\n\t"
  121687. #elif defined(__clang__)
  121688. "adcs r4, r4\n\t"
  121689. #else
  121690. "adc r4, r4\n\t"
  121691. #endif
  121692. #ifdef WOLFSSL_KEIL
  121693. "adcs r5, r5, r5\n\t"
  121694. #elif defined(__clang__)
  121695. "adcs r5, r5\n\t"
  121696. #else
  121697. "adc r5, r5\n\t"
  121698. #endif
  121699. #ifdef WOLFSSL_KEIL
  121700. "adcs r6, r6, r6\n\t"
  121701. #elif defined(__clang__)
  121702. "adcs r6, r6\n\t"
  121703. #else
  121704. "adc r6, r6\n\t"
  121705. #endif
  121706. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121707. "ldm %[a]!, {r3}\n\t"
  121708. #ifdef WOLFSSL_KEIL
  121709. "adcs r3, r3, r3\n\t"
  121710. #elif defined(__clang__)
  121711. "adcs r3, r3\n\t"
  121712. #else
  121713. "adc r3, r3\n\t"
  121714. #endif
  121715. "movs r7, #1\n\t"
  121716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121717. "lsls r7, r7, #8\n\t"
  121718. #else
  121719. "lsl r7, r7, #8\n\t"
  121720. #endif
  121721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121722. "adds r7, r7, #0xff\n\t"
  121723. #else
  121724. "add r7, r7, #0xff\n\t"
  121725. #endif
  121726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121727. "lsrs %[m], r3, #9\n\t"
  121728. #else
  121729. "lsr %[m], r3, #9\n\t"
  121730. #endif
  121731. #ifdef WOLFSSL_KEIL
  121732. "ands r3, r3, r7\n\t"
  121733. #elif defined(__clang__)
  121734. "ands r3, r7\n\t"
  121735. #else
  121736. "and r3, r7\n\t"
  121737. #endif
  121738. "stm %[r]!, {r3}\n\t"
  121739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121740. "subs %[r], %[r], #0x44\n\t"
  121741. #else
  121742. "sub %[r], %[r], #0x44\n\t"
  121743. #endif
  121744. "movs r7, #0\n\t"
  121745. "ldr r3, [%[r]]\n\t"
  121746. "ldr r4, [%[r], #4]\n\t"
  121747. "ldr r5, [%[r], #8]\n\t"
  121748. "ldr r6, [%[r], #12]\n\t"
  121749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121750. "adds r3, r3, %[m]\n\t"
  121751. #else
  121752. "add r3, r3, %[m]\n\t"
  121753. #endif
  121754. #ifdef WOLFSSL_KEIL
  121755. "adcs r4, r4, r7\n\t"
  121756. #elif defined(__clang__)
  121757. "adcs r4, r7\n\t"
  121758. #else
  121759. "adc r4, r7\n\t"
  121760. #endif
  121761. #ifdef WOLFSSL_KEIL
  121762. "adcs r5, r5, r7\n\t"
  121763. #elif defined(__clang__)
  121764. "adcs r5, r7\n\t"
  121765. #else
  121766. "adc r5, r7\n\t"
  121767. #endif
  121768. #ifdef WOLFSSL_KEIL
  121769. "adcs r6, r6, r7\n\t"
  121770. #elif defined(__clang__)
  121771. "adcs r6, r7\n\t"
  121772. #else
  121773. "adc r6, r7\n\t"
  121774. #endif
  121775. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121776. "ldr r3, [%[r]]\n\t"
  121777. "ldr r4, [%[r], #4]\n\t"
  121778. "ldr r5, [%[r], #8]\n\t"
  121779. "ldr r6, [%[r], #12]\n\t"
  121780. #ifdef WOLFSSL_KEIL
  121781. "adcs r3, r3, r7\n\t"
  121782. #elif defined(__clang__)
  121783. "adcs r3, r7\n\t"
  121784. #else
  121785. "adc r3, r7\n\t"
  121786. #endif
  121787. #ifdef WOLFSSL_KEIL
  121788. "adcs r4, r4, r7\n\t"
  121789. #elif defined(__clang__)
  121790. "adcs r4, r7\n\t"
  121791. #else
  121792. "adc r4, r7\n\t"
  121793. #endif
  121794. #ifdef WOLFSSL_KEIL
  121795. "adcs r5, r5, r7\n\t"
  121796. #elif defined(__clang__)
  121797. "adcs r5, r7\n\t"
  121798. #else
  121799. "adc r5, r7\n\t"
  121800. #endif
  121801. #ifdef WOLFSSL_KEIL
  121802. "adcs r6, r6, r7\n\t"
  121803. #elif defined(__clang__)
  121804. "adcs r6, r7\n\t"
  121805. #else
  121806. "adc r6, r7\n\t"
  121807. #endif
  121808. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121809. "ldr r3, [%[r]]\n\t"
  121810. "ldr r4, [%[r], #4]\n\t"
  121811. "ldr r5, [%[r], #8]\n\t"
  121812. "ldr r6, [%[r], #12]\n\t"
  121813. #ifdef WOLFSSL_KEIL
  121814. "adcs r3, r3, r7\n\t"
  121815. #elif defined(__clang__)
  121816. "adcs r3, r7\n\t"
  121817. #else
  121818. "adc r3, r7\n\t"
  121819. #endif
  121820. #ifdef WOLFSSL_KEIL
  121821. "adcs r4, r4, r7\n\t"
  121822. #elif defined(__clang__)
  121823. "adcs r4, r7\n\t"
  121824. #else
  121825. "adc r4, r7\n\t"
  121826. #endif
  121827. #ifdef WOLFSSL_KEIL
  121828. "adcs r5, r5, r7\n\t"
  121829. #elif defined(__clang__)
  121830. "adcs r5, r7\n\t"
  121831. #else
  121832. "adc r5, r7\n\t"
  121833. #endif
  121834. #ifdef WOLFSSL_KEIL
  121835. "adcs r6, r6, r7\n\t"
  121836. #elif defined(__clang__)
  121837. "adcs r6, r7\n\t"
  121838. #else
  121839. "adc r6, r7\n\t"
  121840. #endif
  121841. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121842. "ldr r3, [%[r]]\n\t"
  121843. "ldr r4, [%[r], #4]\n\t"
  121844. "ldr r5, [%[r], #8]\n\t"
  121845. "ldr r6, [%[r], #12]\n\t"
  121846. #ifdef WOLFSSL_KEIL
  121847. "adcs r3, r3, r7\n\t"
  121848. #elif defined(__clang__)
  121849. "adcs r3, r7\n\t"
  121850. #else
  121851. "adc r3, r7\n\t"
  121852. #endif
  121853. #ifdef WOLFSSL_KEIL
  121854. "adcs r4, r4, r7\n\t"
  121855. #elif defined(__clang__)
  121856. "adcs r4, r7\n\t"
  121857. #else
  121858. "adc r4, r7\n\t"
  121859. #endif
  121860. #ifdef WOLFSSL_KEIL
  121861. "adcs r5, r5, r7\n\t"
  121862. #elif defined(__clang__)
  121863. "adcs r5, r7\n\t"
  121864. #else
  121865. "adc r5, r7\n\t"
  121866. #endif
  121867. #ifdef WOLFSSL_KEIL
  121868. "adcs r6, r6, r7\n\t"
  121869. #elif defined(__clang__)
  121870. "adcs r6, r7\n\t"
  121871. #else
  121872. "adc r6, r7\n\t"
  121873. #endif
  121874. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121875. "ldr r3, [%[r]]\n\t"
  121876. #ifdef WOLFSSL_KEIL
  121877. "adcs r3, r3, r7\n\t"
  121878. #elif defined(__clang__)
  121879. "adcs r3, r7\n\t"
  121880. #else
  121881. "adc r3, r7\n\t"
  121882. #endif
  121883. "stm %[r]!, {r3}\n\t"
  121884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121885. "subs %[r], %[r], #0x44\n\t"
  121886. #else
  121887. "sub %[r], %[r], #0x44\n\t"
  121888. #endif
  121889. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  121890. :
  121891. : "memory", "r3", "r4", "r5", "r6", "r7"
  121892. );
  121893. }
  121894. /* Triple a Montgomery form number (r = a + a + a % m).
  121895. *
  121896. * r Result of Tripling.
  121897. * a Number to triple in Montgomery form.
  121898. * m Modulus (prime).
  121899. */
  121900. SP_NOINLINE static void sp_521_mont_tpl_17(sp_digit* r, const sp_digit* a,
  121901. const sp_digit* m)
  121902. {
  121903. __asm__ __volatile__ (
  121904. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121906. "adds r3, r3, r3\n\t"
  121907. #else
  121908. "add r3, r3, r3\n\t"
  121909. #endif
  121910. #ifdef WOLFSSL_KEIL
  121911. "adcs r4, r4, r4\n\t"
  121912. #elif defined(__clang__)
  121913. "adcs r4, r4\n\t"
  121914. #else
  121915. "adc r4, r4\n\t"
  121916. #endif
  121917. #ifdef WOLFSSL_KEIL
  121918. "adcs r5, r5, r5\n\t"
  121919. #elif defined(__clang__)
  121920. "adcs r5, r5\n\t"
  121921. #else
  121922. "adc r5, r5\n\t"
  121923. #endif
  121924. #ifdef WOLFSSL_KEIL
  121925. "adcs r6, r6, r6\n\t"
  121926. #elif defined(__clang__)
  121927. "adcs r6, r6\n\t"
  121928. #else
  121929. "adc r6, r6\n\t"
  121930. #endif
  121931. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121932. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121933. #ifdef WOLFSSL_KEIL
  121934. "adcs r3, r3, r3\n\t"
  121935. #elif defined(__clang__)
  121936. "adcs r3, r3\n\t"
  121937. #else
  121938. "adc r3, r3\n\t"
  121939. #endif
  121940. #ifdef WOLFSSL_KEIL
  121941. "adcs r4, r4, r4\n\t"
  121942. #elif defined(__clang__)
  121943. "adcs r4, r4\n\t"
  121944. #else
  121945. "adc r4, r4\n\t"
  121946. #endif
  121947. #ifdef WOLFSSL_KEIL
  121948. "adcs r5, r5, r5\n\t"
  121949. #elif defined(__clang__)
  121950. "adcs r5, r5\n\t"
  121951. #else
  121952. "adc r5, r5\n\t"
  121953. #endif
  121954. #ifdef WOLFSSL_KEIL
  121955. "adcs r6, r6, r6\n\t"
  121956. #elif defined(__clang__)
  121957. "adcs r6, r6\n\t"
  121958. #else
  121959. "adc r6, r6\n\t"
  121960. #endif
  121961. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121962. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121963. #ifdef WOLFSSL_KEIL
  121964. "adcs r3, r3, r3\n\t"
  121965. #elif defined(__clang__)
  121966. "adcs r3, r3\n\t"
  121967. #else
  121968. "adc r3, r3\n\t"
  121969. #endif
  121970. #ifdef WOLFSSL_KEIL
  121971. "adcs r4, r4, r4\n\t"
  121972. #elif defined(__clang__)
  121973. "adcs r4, r4\n\t"
  121974. #else
  121975. "adc r4, r4\n\t"
  121976. #endif
  121977. #ifdef WOLFSSL_KEIL
  121978. "adcs r5, r5, r5\n\t"
  121979. #elif defined(__clang__)
  121980. "adcs r5, r5\n\t"
  121981. #else
  121982. "adc r5, r5\n\t"
  121983. #endif
  121984. #ifdef WOLFSSL_KEIL
  121985. "adcs r6, r6, r6\n\t"
  121986. #elif defined(__clang__)
  121987. "adcs r6, r6\n\t"
  121988. #else
  121989. "adc r6, r6\n\t"
  121990. #endif
  121991. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121992. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121993. #ifdef WOLFSSL_KEIL
  121994. "adcs r3, r3, r3\n\t"
  121995. #elif defined(__clang__)
  121996. "adcs r3, r3\n\t"
  121997. #else
  121998. "adc r3, r3\n\t"
  121999. #endif
  122000. #ifdef WOLFSSL_KEIL
  122001. "adcs r4, r4, r4\n\t"
  122002. #elif defined(__clang__)
  122003. "adcs r4, r4\n\t"
  122004. #else
  122005. "adc r4, r4\n\t"
  122006. #endif
  122007. #ifdef WOLFSSL_KEIL
  122008. "adcs r5, r5, r5\n\t"
  122009. #elif defined(__clang__)
  122010. "adcs r5, r5\n\t"
  122011. #else
  122012. "adc r5, r5\n\t"
  122013. #endif
  122014. #ifdef WOLFSSL_KEIL
  122015. "adcs r6, r6, r6\n\t"
  122016. #elif defined(__clang__)
  122017. "adcs r6, r6\n\t"
  122018. #else
  122019. "adc r6, r6\n\t"
  122020. #endif
  122021. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122022. "ldm %[a]!, {r3}\n\t"
  122023. #ifdef WOLFSSL_KEIL
  122024. "adcs r3, r3, r3\n\t"
  122025. #elif defined(__clang__)
  122026. "adcs r3, r3\n\t"
  122027. #else
  122028. "adc r3, r3\n\t"
  122029. #endif
  122030. "stm %[r]!, {r3}\n\t"
  122031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122032. "subs %[r], %[r], #0x44\n\t"
  122033. #else
  122034. "sub %[r], %[r], #0x44\n\t"
  122035. #endif
  122036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122037. "subs %[a], %[a], #0x44\n\t"
  122038. #else
  122039. "sub %[a], %[a], #0x44\n\t"
  122040. #endif
  122041. "ldm %[a]!, {r3, r4}\n\t"
  122042. "ldr r5, [%[r]]\n\t"
  122043. "ldr r6, [%[r], #4]\n\t"
  122044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122045. "adds r5, r5, r3\n\t"
  122046. #else
  122047. "add r5, r5, r3\n\t"
  122048. #endif
  122049. #ifdef WOLFSSL_KEIL
  122050. "adcs r6, r6, r4\n\t"
  122051. #elif defined(__clang__)
  122052. "adcs r6, r4\n\t"
  122053. #else
  122054. "adc r6, r4\n\t"
  122055. #endif
  122056. "stm %[r]!, {r5, r6}\n\t"
  122057. "ldm %[a]!, {r3, r4}\n\t"
  122058. "ldr r5, [%[r]]\n\t"
  122059. "ldr r6, [%[r], #4]\n\t"
  122060. #ifdef WOLFSSL_KEIL
  122061. "adcs r5, r5, r3\n\t"
  122062. #elif defined(__clang__)
  122063. "adcs r5, r3\n\t"
  122064. #else
  122065. "adc r5, r3\n\t"
  122066. #endif
  122067. #ifdef WOLFSSL_KEIL
  122068. "adcs r6, r6, r4\n\t"
  122069. #elif defined(__clang__)
  122070. "adcs r6, r4\n\t"
  122071. #else
  122072. "adc r6, r4\n\t"
  122073. #endif
  122074. "stm %[r]!, {r5, r6}\n\t"
  122075. "ldm %[a]!, {r3, r4}\n\t"
  122076. "ldr r5, [%[r]]\n\t"
  122077. "ldr r6, [%[r], #4]\n\t"
  122078. #ifdef WOLFSSL_KEIL
  122079. "adcs r5, r5, r3\n\t"
  122080. #elif defined(__clang__)
  122081. "adcs r5, r3\n\t"
  122082. #else
  122083. "adc r5, r3\n\t"
  122084. #endif
  122085. #ifdef WOLFSSL_KEIL
  122086. "adcs r6, r6, r4\n\t"
  122087. #elif defined(__clang__)
  122088. "adcs r6, r4\n\t"
  122089. #else
  122090. "adc r6, r4\n\t"
  122091. #endif
  122092. "stm %[r]!, {r5, r6}\n\t"
  122093. "ldm %[a]!, {r3, r4}\n\t"
  122094. "ldr r5, [%[r]]\n\t"
  122095. "ldr r6, [%[r], #4]\n\t"
  122096. #ifdef WOLFSSL_KEIL
  122097. "adcs r5, r5, r3\n\t"
  122098. #elif defined(__clang__)
  122099. "adcs r5, r3\n\t"
  122100. #else
  122101. "adc r5, r3\n\t"
  122102. #endif
  122103. #ifdef WOLFSSL_KEIL
  122104. "adcs r6, r6, r4\n\t"
  122105. #elif defined(__clang__)
  122106. "adcs r6, r4\n\t"
  122107. #else
  122108. "adc r6, r4\n\t"
  122109. #endif
  122110. "stm %[r]!, {r5, r6}\n\t"
  122111. "ldm %[a]!, {r3, r4}\n\t"
  122112. "ldr r5, [%[r]]\n\t"
  122113. "ldr r6, [%[r], #4]\n\t"
  122114. #ifdef WOLFSSL_KEIL
  122115. "adcs r5, r5, r3\n\t"
  122116. #elif defined(__clang__)
  122117. "adcs r5, r3\n\t"
  122118. #else
  122119. "adc r5, r3\n\t"
  122120. #endif
  122121. #ifdef WOLFSSL_KEIL
  122122. "adcs r6, r6, r4\n\t"
  122123. #elif defined(__clang__)
  122124. "adcs r6, r4\n\t"
  122125. #else
  122126. "adc r6, r4\n\t"
  122127. #endif
  122128. "stm %[r]!, {r5, r6}\n\t"
  122129. "ldm %[a]!, {r3, r4}\n\t"
  122130. "ldr r5, [%[r]]\n\t"
  122131. "ldr r6, [%[r], #4]\n\t"
  122132. #ifdef WOLFSSL_KEIL
  122133. "adcs r5, r5, r3\n\t"
  122134. #elif defined(__clang__)
  122135. "adcs r5, r3\n\t"
  122136. #else
  122137. "adc r5, r3\n\t"
  122138. #endif
  122139. #ifdef WOLFSSL_KEIL
  122140. "adcs r6, r6, r4\n\t"
  122141. #elif defined(__clang__)
  122142. "adcs r6, r4\n\t"
  122143. #else
  122144. "adc r6, r4\n\t"
  122145. #endif
  122146. "stm %[r]!, {r5, r6}\n\t"
  122147. "ldm %[a]!, {r3, r4}\n\t"
  122148. "ldr r5, [%[r]]\n\t"
  122149. "ldr r6, [%[r], #4]\n\t"
  122150. #ifdef WOLFSSL_KEIL
  122151. "adcs r5, r5, r3\n\t"
  122152. #elif defined(__clang__)
  122153. "adcs r5, r3\n\t"
  122154. #else
  122155. "adc r5, r3\n\t"
  122156. #endif
  122157. #ifdef WOLFSSL_KEIL
  122158. "adcs r6, r6, r4\n\t"
  122159. #elif defined(__clang__)
  122160. "adcs r6, r4\n\t"
  122161. #else
  122162. "adc r6, r4\n\t"
  122163. #endif
  122164. "stm %[r]!, {r5, r6}\n\t"
  122165. "ldm %[a]!, {r3, r4}\n\t"
  122166. "ldr r5, [%[r]]\n\t"
  122167. "ldr r6, [%[r], #4]\n\t"
  122168. #ifdef WOLFSSL_KEIL
  122169. "adcs r5, r5, r3\n\t"
  122170. #elif defined(__clang__)
  122171. "adcs r5, r3\n\t"
  122172. #else
  122173. "adc r5, r3\n\t"
  122174. #endif
  122175. #ifdef WOLFSSL_KEIL
  122176. "adcs r6, r6, r4\n\t"
  122177. #elif defined(__clang__)
  122178. "adcs r6, r4\n\t"
  122179. #else
  122180. "adc r6, r4\n\t"
  122181. #endif
  122182. "stm %[r]!, {r5, r6}\n\t"
  122183. "ldm %[a]!, {r3}\n\t"
  122184. "ldr r5, [%[r]]\n\t"
  122185. #ifdef WOLFSSL_KEIL
  122186. "adcs r5, r5, r3\n\t"
  122187. #elif defined(__clang__)
  122188. "adcs r5, r3\n\t"
  122189. #else
  122190. "adc r5, r3\n\t"
  122191. #endif
  122192. "movs r7, #1\n\t"
  122193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122194. "lsls r7, r7, #8\n\t"
  122195. #else
  122196. "lsl r7, r7, #8\n\t"
  122197. #endif
  122198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122199. "adds r7, r7, #0xff\n\t"
  122200. #else
  122201. "add r7, r7, #0xff\n\t"
  122202. #endif
  122203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122204. "lsrs %[m], r5, #9\n\t"
  122205. #else
  122206. "lsr %[m], r5, #9\n\t"
  122207. #endif
  122208. #ifdef WOLFSSL_KEIL
  122209. "ands r5, r5, r7\n\t"
  122210. #elif defined(__clang__)
  122211. "ands r5, r7\n\t"
  122212. #else
  122213. "and r5, r7\n\t"
  122214. #endif
  122215. "stm %[r]!, {r5}\n\t"
  122216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122217. "subs %[r], %[r], #0x44\n\t"
  122218. #else
  122219. "sub %[r], %[r], #0x44\n\t"
  122220. #endif
  122221. "movs r7, #0\n\t"
  122222. "ldr r3, [%[r]]\n\t"
  122223. "ldr r4, [%[r], #4]\n\t"
  122224. "ldr r5, [%[r], #8]\n\t"
  122225. "ldr r6, [%[r], #12]\n\t"
  122226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122227. "adds r3, r3, %[m]\n\t"
  122228. #else
  122229. "add r3, r3, %[m]\n\t"
  122230. #endif
  122231. #ifdef WOLFSSL_KEIL
  122232. "adcs r4, r4, r7\n\t"
  122233. #elif defined(__clang__)
  122234. "adcs r4, r7\n\t"
  122235. #else
  122236. "adc r4, r7\n\t"
  122237. #endif
  122238. #ifdef WOLFSSL_KEIL
  122239. "adcs r5, r5, r7\n\t"
  122240. #elif defined(__clang__)
  122241. "adcs r5, r7\n\t"
  122242. #else
  122243. "adc r5, r7\n\t"
  122244. #endif
  122245. #ifdef WOLFSSL_KEIL
  122246. "adcs r6, r6, r7\n\t"
  122247. #elif defined(__clang__)
  122248. "adcs r6, r7\n\t"
  122249. #else
  122250. "adc r6, r7\n\t"
  122251. #endif
  122252. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122253. "ldr r3, [%[r]]\n\t"
  122254. "ldr r4, [%[r], #4]\n\t"
  122255. "ldr r5, [%[r], #8]\n\t"
  122256. "ldr r6, [%[r], #12]\n\t"
  122257. #ifdef WOLFSSL_KEIL
  122258. "adcs r3, r3, r7\n\t"
  122259. #elif defined(__clang__)
  122260. "adcs r3, r7\n\t"
  122261. #else
  122262. "adc r3, r7\n\t"
  122263. #endif
  122264. #ifdef WOLFSSL_KEIL
  122265. "adcs r4, r4, r7\n\t"
  122266. #elif defined(__clang__)
  122267. "adcs r4, r7\n\t"
  122268. #else
  122269. "adc r4, r7\n\t"
  122270. #endif
  122271. #ifdef WOLFSSL_KEIL
  122272. "adcs r5, r5, r7\n\t"
  122273. #elif defined(__clang__)
  122274. "adcs r5, r7\n\t"
  122275. #else
  122276. "adc r5, r7\n\t"
  122277. #endif
  122278. #ifdef WOLFSSL_KEIL
  122279. "adcs r6, r6, r7\n\t"
  122280. #elif defined(__clang__)
  122281. "adcs r6, r7\n\t"
  122282. #else
  122283. "adc r6, r7\n\t"
  122284. #endif
  122285. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122286. "ldr r3, [%[r]]\n\t"
  122287. "ldr r4, [%[r], #4]\n\t"
  122288. "ldr r5, [%[r], #8]\n\t"
  122289. "ldr r6, [%[r], #12]\n\t"
  122290. #ifdef WOLFSSL_KEIL
  122291. "adcs r3, r3, r7\n\t"
  122292. #elif defined(__clang__)
  122293. "adcs r3, r7\n\t"
  122294. #else
  122295. "adc r3, r7\n\t"
  122296. #endif
  122297. #ifdef WOLFSSL_KEIL
  122298. "adcs r4, r4, r7\n\t"
  122299. #elif defined(__clang__)
  122300. "adcs r4, r7\n\t"
  122301. #else
  122302. "adc r4, r7\n\t"
  122303. #endif
  122304. #ifdef WOLFSSL_KEIL
  122305. "adcs r5, r5, r7\n\t"
  122306. #elif defined(__clang__)
  122307. "adcs r5, r7\n\t"
  122308. #else
  122309. "adc r5, r7\n\t"
  122310. #endif
  122311. #ifdef WOLFSSL_KEIL
  122312. "adcs r6, r6, r7\n\t"
  122313. #elif defined(__clang__)
  122314. "adcs r6, r7\n\t"
  122315. #else
  122316. "adc r6, r7\n\t"
  122317. #endif
  122318. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122319. "ldr r3, [%[r]]\n\t"
  122320. "ldr r4, [%[r], #4]\n\t"
  122321. "ldr r5, [%[r], #8]\n\t"
  122322. "ldr r6, [%[r], #12]\n\t"
  122323. #ifdef WOLFSSL_KEIL
  122324. "adcs r3, r3, r7\n\t"
  122325. #elif defined(__clang__)
  122326. "adcs r3, r7\n\t"
  122327. #else
  122328. "adc r3, r7\n\t"
  122329. #endif
  122330. #ifdef WOLFSSL_KEIL
  122331. "adcs r4, r4, r7\n\t"
  122332. #elif defined(__clang__)
  122333. "adcs r4, r7\n\t"
  122334. #else
  122335. "adc r4, r7\n\t"
  122336. #endif
  122337. #ifdef WOLFSSL_KEIL
  122338. "adcs r5, r5, r7\n\t"
  122339. #elif defined(__clang__)
  122340. "adcs r5, r7\n\t"
  122341. #else
  122342. "adc r5, r7\n\t"
  122343. #endif
  122344. #ifdef WOLFSSL_KEIL
  122345. "adcs r6, r6, r7\n\t"
  122346. #elif defined(__clang__)
  122347. "adcs r6, r7\n\t"
  122348. #else
  122349. "adc r6, r7\n\t"
  122350. #endif
  122351. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122352. "ldr r3, [%[r]]\n\t"
  122353. #ifdef WOLFSSL_KEIL
  122354. "adcs r3, r3, r7\n\t"
  122355. #elif defined(__clang__)
  122356. "adcs r3, r7\n\t"
  122357. #else
  122358. "adc r3, r7\n\t"
  122359. #endif
  122360. "stm %[r]!, {r3}\n\t"
  122361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122362. "subs %[r], %[r], #0x44\n\t"
  122363. #else
  122364. "sub %[r], %[r], #0x44\n\t"
  122365. #endif
  122366. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  122367. :
  122368. : "memory", "r3", "r4", "r5", "r6", "r7"
  122369. );
  122370. }
  122371. /* Subtract two Montgomery form numbers (r = a - b % m).
  122372. *
  122373. * r Result of subtration.
  122374. * a Number to subtract from in Montgomery form.
  122375. * b Number to subtract with in Montgomery form.
  122376. * m Modulus (prime).
  122377. */
  122378. SP_NOINLINE static void sp_521_mont_sub_17(sp_digit* r, const sp_digit* a,
  122379. const sp_digit* b, const sp_digit* m)
  122380. {
  122381. __asm__ __volatile__ (
  122382. "ldm %[a]!, {r4, r5}\n\t"
  122383. "ldm %[b]!, {r6, r7}\n\t"
  122384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122385. "subs r4, r4, r6\n\t"
  122386. #else
  122387. "sub r4, r4, r6\n\t"
  122388. #endif
  122389. #ifdef WOLFSSL_KEIL
  122390. "sbcs r5, r5, r7\n\t"
  122391. #elif defined(__clang__)
  122392. "sbcs r5, r7\n\t"
  122393. #else
  122394. "sbc r5, r7\n\t"
  122395. #endif
  122396. "stm %[r]!, {r4, r5}\n\t"
  122397. "ldm %[a]!, {r4, r5}\n\t"
  122398. "ldm %[b]!, {r6, r7}\n\t"
  122399. #ifdef WOLFSSL_KEIL
  122400. "sbcs r4, r4, r6\n\t"
  122401. #elif defined(__clang__)
  122402. "sbcs r4, r6\n\t"
  122403. #else
  122404. "sbc r4, r6\n\t"
  122405. #endif
  122406. #ifdef WOLFSSL_KEIL
  122407. "sbcs r5, r5, r7\n\t"
  122408. #elif defined(__clang__)
  122409. "sbcs r5, r7\n\t"
  122410. #else
  122411. "sbc r5, r7\n\t"
  122412. #endif
  122413. "stm %[r]!, {r4, r5}\n\t"
  122414. "ldm %[a]!, {r4, r5}\n\t"
  122415. "ldm %[b]!, {r6, r7}\n\t"
  122416. #ifdef WOLFSSL_KEIL
  122417. "sbcs r4, r4, r6\n\t"
  122418. #elif defined(__clang__)
  122419. "sbcs r4, r6\n\t"
  122420. #else
  122421. "sbc r4, r6\n\t"
  122422. #endif
  122423. #ifdef WOLFSSL_KEIL
  122424. "sbcs r5, r5, r7\n\t"
  122425. #elif defined(__clang__)
  122426. "sbcs r5, r7\n\t"
  122427. #else
  122428. "sbc r5, r7\n\t"
  122429. #endif
  122430. "stm %[r]!, {r4, r5}\n\t"
  122431. "ldm %[a]!, {r4, r5}\n\t"
  122432. "ldm %[b]!, {r6, r7}\n\t"
  122433. #ifdef WOLFSSL_KEIL
  122434. "sbcs r4, r4, r6\n\t"
  122435. #elif defined(__clang__)
  122436. "sbcs r4, r6\n\t"
  122437. #else
  122438. "sbc r4, r6\n\t"
  122439. #endif
  122440. #ifdef WOLFSSL_KEIL
  122441. "sbcs r5, r5, r7\n\t"
  122442. #elif defined(__clang__)
  122443. "sbcs r5, r7\n\t"
  122444. #else
  122445. "sbc r5, r7\n\t"
  122446. #endif
  122447. "stm %[r]!, {r4, r5}\n\t"
  122448. "ldm %[a]!, {r4, r5}\n\t"
  122449. "ldm %[b]!, {r6, r7}\n\t"
  122450. #ifdef WOLFSSL_KEIL
  122451. "sbcs r4, r4, r6\n\t"
  122452. #elif defined(__clang__)
  122453. "sbcs r4, r6\n\t"
  122454. #else
  122455. "sbc r4, r6\n\t"
  122456. #endif
  122457. #ifdef WOLFSSL_KEIL
  122458. "sbcs r5, r5, r7\n\t"
  122459. #elif defined(__clang__)
  122460. "sbcs r5, r7\n\t"
  122461. #else
  122462. "sbc r5, r7\n\t"
  122463. #endif
  122464. "stm %[r]!, {r4, r5}\n\t"
  122465. "ldm %[a]!, {r4, r5}\n\t"
  122466. "ldm %[b]!, {r6, r7}\n\t"
  122467. #ifdef WOLFSSL_KEIL
  122468. "sbcs r4, r4, r6\n\t"
  122469. #elif defined(__clang__)
  122470. "sbcs r4, r6\n\t"
  122471. #else
  122472. "sbc r4, r6\n\t"
  122473. #endif
  122474. #ifdef WOLFSSL_KEIL
  122475. "sbcs r5, r5, r7\n\t"
  122476. #elif defined(__clang__)
  122477. "sbcs r5, r7\n\t"
  122478. #else
  122479. "sbc r5, r7\n\t"
  122480. #endif
  122481. "stm %[r]!, {r4, r5}\n\t"
  122482. "ldm %[a]!, {r4, r5}\n\t"
  122483. "ldm %[b]!, {r6, r7}\n\t"
  122484. #ifdef WOLFSSL_KEIL
  122485. "sbcs r4, r4, r6\n\t"
  122486. #elif defined(__clang__)
  122487. "sbcs r4, r6\n\t"
  122488. #else
  122489. "sbc r4, r6\n\t"
  122490. #endif
  122491. #ifdef WOLFSSL_KEIL
  122492. "sbcs r5, r5, r7\n\t"
  122493. #elif defined(__clang__)
  122494. "sbcs r5, r7\n\t"
  122495. #else
  122496. "sbc r5, r7\n\t"
  122497. #endif
  122498. "stm %[r]!, {r4, r5}\n\t"
  122499. "ldm %[a]!, {r4, r5}\n\t"
  122500. "ldm %[b]!, {r6, r7}\n\t"
  122501. #ifdef WOLFSSL_KEIL
  122502. "sbcs r4, r4, r6\n\t"
  122503. #elif defined(__clang__)
  122504. "sbcs r4, r6\n\t"
  122505. #else
  122506. "sbc r4, r6\n\t"
  122507. #endif
  122508. #ifdef WOLFSSL_KEIL
  122509. "sbcs r5, r5, r7\n\t"
  122510. #elif defined(__clang__)
  122511. "sbcs r5, r7\n\t"
  122512. #else
  122513. "sbc r5, r7\n\t"
  122514. #endif
  122515. "stm %[r]!, {r4, r5}\n\t"
  122516. "ldm %[a]!, {r4}\n\t"
  122517. "ldm %[b]!, {r6}\n\t"
  122518. #ifdef WOLFSSL_KEIL
  122519. "sbcs r4, r4, r6\n\t"
  122520. #elif defined(__clang__)
  122521. "sbcs r4, r6\n\t"
  122522. #else
  122523. "sbc r4, r6\n\t"
  122524. #endif
  122525. "movs r7, #1\n\t"
  122526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122527. "lsls r7, r7, #8\n\t"
  122528. #else
  122529. "lsl r7, r7, #8\n\t"
  122530. #endif
  122531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122532. "adds r7, r7, #0xff\n\t"
  122533. #else
  122534. "add r7, r7, #0xff\n\t"
  122535. #endif
  122536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122537. "asrs %[m], r4, #9\n\t"
  122538. #else
  122539. "asr %[m], r4, #9\n\t"
  122540. #endif
  122541. #ifdef WOLFSSL_KEIL
  122542. "ands r4, r4, r7\n\t"
  122543. #elif defined(__clang__)
  122544. "ands r4, r7\n\t"
  122545. #else
  122546. "and r4, r7\n\t"
  122547. #endif
  122548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122549. "negs %[m], %[m]\n\t"
  122550. #else
  122551. "neg %[m], %[m]\n\t"
  122552. #endif
  122553. "stm %[r]!, {r4}\n\t"
  122554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122555. "subs %[r], %[r], #0x44\n\t"
  122556. #else
  122557. "sub %[r], %[r], #0x44\n\t"
  122558. #endif
  122559. "movs r7, #0\n\t"
  122560. "ldr r4, [%[r]]\n\t"
  122561. "ldr r5, [%[r], #4]\n\t"
  122562. "ldr r6, [%[r], #8]\n\t"
  122563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122564. "subs r4, r4, %[m]\n\t"
  122565. #else
  122566. "sub r4, r4, %[m]\n\t"
  122567. #endif
  122568. #ifdef WOLFSSL_KEIL
  122569. "sbcs r5, r5, r7\n\t"
  122570. #elif defined(__clang__)
  122571. "sbcs r5, r7\n\t"
  122572. #else
  122573. "sbc r5, r7\n\t"
  122574. #endif
  122575. #ifdef WOLFSSL_KEIL
  122576. "sbcs r6, r6, r7\n\t"
  122577. #elif defined(__clang__)
  122578. "sbcs r6, r7\n\t"
  122579. #else
  122580. "sbc r6, r7\n\t"
  122581. #endif
  122582. "stm %[r]!, {r4, r5, r6}\n\t"
  122583. "ldr r4, [%[r]]\n\t"
  122584. "ldr r5, [%[r], #4]\n\t"
  122585. "ldr r6, [%[r], #8]\n\t"
  122586. #ifdef WOLFSSL_KEIL
  122587. "sbcs r4, r4, r7\n\t"
  122588. #elif defined(__clang__)
  122589. "sbcs r4, r7\n\t"
  122590. #else
  122591. "sbc r4, r7\n\t"
  122592. #endif
  122593. #ifdef WOLFSSL_KEIL
  122594. "sbcs r5, r5, r7\n\t"
  122595. #elif defined(__clang__)
  122596. "sbcs r5, r7\n\t"
  122597. #else
  122598. "sbc r5, r7\n\t"
  122599. #endif
  122600. #ifdef WOLFSSL_KEIL
  122601. "sbcs r6, r6, r7\n\t"
  122602. #elif defined(__clang__)
  122603. "sbcs r6, r7\n\t"
  122604. #else
  122605. "sbc r6, r7\n\t"
  122606. #endif
  122607. "stm %[r]!, {r4, r5, r6}\n\t"
  122608. "ldr r4, [%[r]]\n\t"
  122609. "ldr r5, [%[r], #4]\n\t"
  122610. "ldr r6, [%[r], #8]\n\t"
  122611. #ifdef WOLFSSL_KEIL
  122612. "sbcs r4, r4, r7\n\t"
  122613. #elif defined(__clang__)
  122614. "sbcs r4, r7\n\t"
  122615. #else
  122616. "sbc r4, r7\n\t"
  122617. #endif
  122618. #ifdef WOLFSSL_KEIL
  122619. "sbcs r5, r5, r7\n\t"
  122620. #elif defined(__clang__)
  122621. "sbcs r5, r7\n\t"
  122622. #else
  122623. "sbc r5, r7\n\t"
  122624. #endif
  122625. #ifdef WOLFSSL_KEIL
  122626. "sbcs r6, r6, r7\n\t"
  122627. #elif defined(__clang__)
  122628. "sbcs r6, r7\n\t"
  122629. #else
  122630. "sbc r6, r7\n\t"
  122631. #endif
  122632. "stm %[r]!, {r4, r5, r6}\n\t"
  122633. "ldr r4, [%[r]]\n\t"
  122634. "ldr r5, [%[r], #4]\n\t"
  122635. "ldr r6, [%[r], #8]\n\t"
  122636. #ifdef WOLFSSL_KEIL
  122637. "sbcs r4, r4, r7\n\t"
  122638. #elif defined(__clang__)
  122639. "sbcs r4, r7\n\t"
  122640. #else
  122641. "sbc r4, r7\n\t"
  122642. #endif
  122643. #ifdef WOLFSSL_KEIL
  122644. "sbcs r5, r5, r7\n\t"
  122645. #elif defined(__clang__)
  122646. "sbcs r5, r7\n\t"
  122647. #else
  122648. "sbc r5, r7\n\t"
  122649. #endif
  122650. #ifdef WOLFSSL_KEIL
  122651. "sbcs r6, r6, r7\n\t"
  122652. #elif defined(__clang__)
  122653. "sbcs r6, r7\n\t"
  122654. #else
  122655. "sbc r6, r7\n\t"
  122656. #endif
  122657. "stm %[r]!, {r4, r5, r6}\n\t"
  122658. "ldr r4, [%[r]]\n\t"
  122659. "ldr r5, [%[r], #4]\n\t"
  122660. "ldr r6, [%[r], #8]\n\t"
  122661. #ifdef WOLFSSL_KEIL
  122662. "sbcs r4, r4, r7\n\t"
  122663. #elif defined(__clang__)
  122664. "sbcs r4, r7\n\t"
  122665. #else
  122666. "sbc r4, r7\n\t"
  122667. #endif
  122668. #ifdef WOLFSSL_KEIL
  122669. "sbcs r5, r5, r7\n\t"
  122670. #elif defined(__clang__)
  122671. "sbcs r5, r7\n\t"
  122672. #else
  122673. "sbc r5, r7\n\t"
  122674. #endif
  122675. #ifdef WOLFSSL_KEIL
  122676. "sbcs r6, r6, r7\n\t"
  122677. #elif defined(__clang__)
  122678. "sbcs r6, r7\n\t"
  122679. #else
  122680. "sbc r6, r7\n\t"
  122681. #endif
  122682. "stm %[r]!, {r4, r5, r6}\n\t"
  122683. "ldr r4, [%[r]]\n\t"
  122684. "ldr r5, [%[r], #4]\n\t"
  122685. #ifdef WOLFSSL_KEIL
  122686. "sbcs r4, r4, r7\n\t"
  122687. #elif defined(__clang__)
  122688. "sbcs r4, r7\n\t"
  122689. #else
  122690. "sbc r4, r7\n\t"
  122691. #endif
  122692. #ifdef WOLFSSL_KEIL
  122693. "sbcs r5, r5, r7\n\t"
  122694. #elif defined(__clang__)
  122695. "sbcs r5, r7\n\t"
  122696. #else
  122697. "sbc r5, r7\n\t"
  122698. #endif
  122699. "stm %[r]!, {r4, r5}\n\t"
  122700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122701. "subs %[r], %[r], #0x44\n\t"
  122702. #else
  122703. "sub %[r], %[r], #0x44\n\t"
  122704. #endif
  122705. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  122706. :
  122707. : "memory", "r4", "r5", "r6", "r7"
  122708. );
  122709. }
  122710. /* Conditionally add a and b using the mask m.
  122711. * m is -1 to add and 0 when not.
  122712. *
  122713. * r A single precision number representing conditional add result.
  122714. * a A single precision number to add with.
  122715. * b A single precision number to add.
  122716. * m Mask value to apply.
  122717. */
  122718. SP_NOINLINE static sp_digit sp_521_cond_add_17(sp_digit* r, const sp_digit* a,
  122719. const sp_digit* b, sp_digit m)
  122720. {
  122721. __asm__ __volatile__ (
  122722. "movs r4, #0\n\t"
  122723. "movs r5, #0x44\n\t"
  122724. "mov r8, r5\n\t"
  122725. "movs r7, #0\n\t"
  122726. "\n"
  122727. "L_sp_521_cond_add_17_words_%=:\n\t"
  122728. "ldr r6, [%[b], r7]\n\t"
  122729. #ifdef WOLFSSL_KEIL
  122730. "ands r6, r6, %[m]\n\t"
  122731. #elif defined(__clang__)
  122732. "ands r6, %[m]\n\t"
  122733. #else
  122734. "and r6, %[m]\n\t"
  122735. #endif
  122736. "movs r5, #0\n\t"
  122737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122738. "subs r5, r5, #1\n\t"
  122739. #else
  122740. "sub r5, r5, #1\n\t"
  122741. #endif
  122742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122743. "adds r5, r5, r4\n\t"
  122744. #else
  122745. "add r5, r5, r4\n\t"
  122746. #endif
  122747. "ldr r5, [%[a], r7]\n\t"
  122748. #ifdef WOLFSSL_KEIL
  122749. "adcs r5, r5, r6\n\t"
  122750. #elif defined(__clang__)
  122751. "adcs r5, r6\n\t"
  122752. #else
  122753. "adc r5, r6\n\t"
  122754. #endif
  122755. "movs r4, #0\n\t"
  122756. #ifdef WOLFSSL_KEIL
  122757. "adcs r4, r4, r4\n\t"
  122758. #elif defined(__clang__)
  122759. "adcs r4, r4\n\t"
  122760. #else
  122761. "adc r4, r4\n\t"
  122762. #endif
  122763. "str r5, [%[r], r7]\n\t"
  122764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122765. "adds r7, r7, #4\n\t"
  122766. #else
  122767. "add r7, r7, #4\n\t"
  122768. #endif
  122769. "cmp r7, r8\n\t"
  122770. "blt L_sp_521_cond_add_17_words_%=\n\t"
  122771. "movs %[r], r4\n\t"
  122772. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  122773. :
  122774. : "memory", "r4", "r5", "r6", "r7", "r8"
  122775. );
  122776. return (uint32_t)(size_t)r;
  122777. }
  122778. /* Right shift a by 1 bit into r. (r = a >> 1)
  122779. *
  122780. * r A single precision integer.
  122781. * a A single precision integer.
  122782. */
  122783. static void sp_521_rshift1_17(sp_digit* r, const sp_digit* a)
  122784. {
  122785. __asm__ __volatile__ (
  122786. "ldr r2, [%[a]]\n\t"
  122787. "ldr r3, [%[a], #4]\n\t"
  122788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122789. "lsrs r2, r2, #1\n\t"
  122790. #else
  122791. "lsr r2, r2, #1\n\t"
  122792. #endif
  122793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122794. "lsls r5, r3, #31\n\t"
  122795. #else
  122796. "lsl r5, r3, #31\n\t"
  122797. #endif
  122798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122799. "lsrs r3, r3, #1\n\t"
  122800. #else
  122801. "lsr r3, r3, #1\n\t"
  122802. #endif
  122803. #ifdef WOLFSSL_KEIL
  122804. "orrs r2, r2, r5\n\t"
  122805. #elif defined(__clang__)
  122806. "orrs r2, r5\n\t"
  122807. #else
  122808. "orr r2, r5\n\t"
  122809. #endif
  122810. "ldr r4, [%[a], #8]\n\t"
  122811. "str r2, [%[r]]\n\t"
  122812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122813. "lsls r5, r4, #31\n\t"
  122814. #else
  122815. "lsl r5, r4, #31\n\t"
  122816. #endif
  122817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122818. "lsrs r4, r4, #1\n\t"
  122819. #else
  122820. "lsr r4, r4, #1\n\t"
  122821. #endif
  122822. #ifdef WOLFSSL_KEIL
  122823. "orrs r3, r3, r5\n\t"
  122824. #elif defined(__clang__)
  122825. "orrs r3, r5\n\t"
  122826. #else
  122827. "orr r3, r5\n\t"
  122828. #endif
  122829. "ldr r2, [%[a], #12]\n\t"
  122830. "str r3, [%[r], #4]\n\t"
  122831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122832. "lsls r5, r2, #31\n\t"
  122833. #else
  122834. "lsl r5, r2, #31\n\t"
  122835. #endif
  122836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122837. "lsrs r2, r2, #1\n\t"
  122838. #else
  122839. "lsr r2, r2, #1\n\t"
  122840. #endif
  122841. #ifdef WOLFSSL_KEIL
  122842. "orrs r4, r4, r5\n\t"
  122843. #elif defined(__clang__)
  122844. "orrs r4, r5\n\t"
  122845. #else
  122846. "orr r4, r5\n\t"
  122847. #endif
  122848. "ldr r3, [%[a], #16]\n\t"
  122849. "str r4, [%[r], #8]\n\t"
  122850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122851. "lsls r5, r3, #31\n\t"
  122852. #else
  122853. "lsl r5, r3, #31\n\t"
  122854. #endif
  122855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122856. "lsrs r3, r3, #1\n\t"
  122857. #else
  122858. "lsr r3, r3, #1\n\t"
  122859. #endif
  122860. #ifdef WOLFSSL_KEIL
  122861. "orrs r2, r2, r5\n\t"
  122862. #elif defined(__clang__)
  122863. "orrs r2, r5\n\t"
  122864. #else
  122865. "orr r2, r5\n\t"
  122866. #endif
  122867. "ldr r4, [%[a], #20]\n\t"
  122868. "str r2, [%[r], #12]\n\t"
  122869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122870. "lsls r5, r4, #31\n\t"
  122871. #else
  122872. "lsl r5, r4, #31\n\t"
  122873. #endif
  122874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122875. "lsrs r4, r4, #1\n\t"
  122876. #else
  122877. "lsr r4, r4, #1\n\t"
  122878. #endif
  122879. #ifdef WOLFSSL_KEIL
  122880. "orrs r3, r3, r5\n\t"
  122881. #elif defined(__clang__)
  122882. "orrs r3, r5\n\t"
  122883. #else
  122884. "orr r3, r5\n\t"
  122885. #endif
  122886. "ldr r2, [%[a], #24]\n\t"
  122887. "str r3, [%[r], #16]\n\t"
  122888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122889. "lsls r5, r2, #31\n\t"
  122890. #else
  122891. "lsl r5, r2, #31\n\t"
  122892. #endif
  122893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122894. "lsrs r2, r2, #1\n\t"
  122895. #else
  122896. "lsr r2, r2, #1\n\t"
  122897. #endif
  122898. #ifdef WOLFSSL_KEIL
  122899. "orrs r4, r4, r5\n\t"
  122900. #elif defined(__clang__)
  122901. "orrs r4, r5\n\t"
  122902. #else
  122903. "orr r4, r5\n\t"
  122904. #endif
  122905. "ldr r3, [%[a], #28]\n\t"
  122906. "str r4, [%[r], #20]\n\t"
  122907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122908. "lsls r5, r3, #31\n\t"
  122909. #else
  122910. "lsl r5, r3, #31\n\t"
  122911. #endif
  122912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122913. "lsrs r3, r3, #1\n\t"
  122914. #else
  122915. "lsr r3, r3, #1\n\t"
  122916. #endif
  122917. #ifdef WOLFSSL_KEIL
  122918. "orrs r2, r2, r5\n\t"
  122919. #elif defined(__clang__)
  122920. "orrs r2, r5\n\t"
  122921. #else
  122922. "orr r2, r5\n\t"
  122923. #endif
  122924. "ldr r4, [%[a], #32]\n\t"
  122925. "str r2, [%[r], #24]\n\t"
  122926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122927. "lsls r5, r4, #31\n\t"
  122928. #else
  122929. "lsl r5, r4, #31\n\t"
  122930. #endif
  122931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122932. "lsrs r4, r4, #1\n\t"
  122933. #else
  122934. "lsr r4, r4, #1\n\t"
  122935. #endif
  122936. #ifdef WOLFSSL_KEIL
  122937. "orrs r3, r3, r5\n\t"
  122938. #elif defined(__clang__)
  122939. "orrs r3, r5\n\t"
  122940. #else
  122941. "orr r3, r5\n\t"
  122942. #endif
  122943. "ldr r2, [%[a], #36]\n\t"
  122944. "str r3, [%[r], #28]\n\t"
  122945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122946. "lsls r5, r2, #31\n\t"
  122947. #else
  122948. "lsl r5, r2, #31\n\t"
  122949. #endif
  122950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122951. "lsrs r2, r2, #1\n\t"
  122952. #else
  122953. "lsr r2, r2, #1\n\t"
  122954. #endif
  122955. #ifdef WOLFSSL_KEIL
  122956. "orrs r4, r4, r5\n\t"
  122957. #elif defined(__clang__)
  122958. "orrs r4, r5\n\t"
  122959. #else
  122960. "orr r4, r5\n\t"
  122961. #endif
  122962. "ldr r3, [%[a], #40]\n\t"
  122963. "str r4, [%[r], #32]\n\t"
  122964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122965. "lsls r5, r3, #31\n\t"
  122966. #else
  122967. "lsl r5, r3, #31\n\t"
  122968. #endif
  122969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122970. "lsrs r3, r3, #1\n\t"
  122971. #else
  122972. "lsr r3, r3, #1\n\t"
  122973. #endif
  122974. #ifdef WOLFSSL_KEIL
  122975. "orrs r2, r2, r5\n\t"
  122976. #elif defined(__clang__)
  122977. "orrs r2, r5\n\t"
  122978. #else
  122979. "orr r2, r5\n\t"
  122980. #endif
  122981. "ldr r4, [%[a], #44]\n\t"
  122982. "str r2, [%[r], #36]\n\t"
  122983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122984. "lsls r5, r4, #31\n\t"
  122985. #else
  122986. "lsl r5, r4, #31\n\t"
  122987. #endif
  122988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122989. "lsrs r4, r4, #1\n\t"
  122990. #else
  122991. "lsr r4, r4, #1\n\t"
  122992. #endif
  122993. #ifdef WOLFSSL_KEIL
  122994. "orrs r3, r3, r5\n\t"
  122995. #elif defined(__clang__)
  122996. "orrs r3, r5\n\t"
  122997. #else
  122998. "orr r3, r5\n\t"
  122999. #endif
  123000. "ldr r2, [%[a], #48]\n\t"
  123001. "str r3, [%[r], #40]\n\t"
  123002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123003. "lsls r5, r2, #31\n\t"
  123004. #else
  123005. "lsl r5, r2, #31\n\t"
  123006. #endif
  123007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123008. "lsrs r2, r2, #1\n\t"
  123009. #else
  123010. "lsr r2, r2, #1\n\t"
  123011. #endif
  123012. #ifdef WOLFSSL_KEIL
  123013. "orrs r4, r4, r5\n\t"
  123014. #elif defined(__clang__)
  123015. "orrs r4, r5\n\t"
  123016. #else
  123017. "orr r4, r5\n\t"
  123018. #endif
  123019. "ldr r3, [%[a], #52]\n\t"
  123020. "str r4, [%[r], #44]\n\t"
  123021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123022. "lsls r5, r3, #31\n\t"
  123023. #else
  123024. "lsl r5, r3, #31\n\t"
  123025. #endif
  123026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123027. "lsrs r3, r3, #1\n\t"
  123028. #else
  123029. "lsr r3, r3, #1\n\t"
  123030. #endif
  123031. #ifdef WOLFSSL_KEIL
  123032. "orrs r2, r2, r5\n\t"
  123033. #elif defined(__clang__)
  123034. "orrs r2, r5\n\t"
  123035. #else
  123036. "orr r2, r5\n\t"
  123037. #endif
  123038. "ldr r4, [%[a], #56]\n\t"
  123039. "str r2, [%[r], #48]\n\t"
  123040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123041. "lsls r5, r4, #31\n\t"
  123042. #else
  123043. "lsl r5, r4, #31\n\t"
  123044. #endif
  123045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123046. "lsrs r4, r4, #1\n\t"
  123047. #else
  123048. "lsr r4, r4, #1\n\t"
  123049. #endif
  123050. #ifdef WOLFSSL_KEIL
  123051. "orrs r3, r3, r5\n\t"
  123052. #elif defined(__clang__)
  123053. "orrs r3, r5\n\t"
  123054. #else
  123055. "orr r3, r5\n\t"
  123056. #endif
  123057. "ldr r2, [%[a], #60]\n\t"
  123058. "str r3, [%[r], #52]\n\t"
  123059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123060. "lsls r5, r2, #31\n\t"
  123061. #else
  123062. "lsl r5, r2, #31\n\t"
  123063. #endif
  123064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123065. "lsrs r2, r2, #1\n\t"
  123066. #else
  123067. "lsr r2, r2, #1\n\t"
  123068. #endif
  123069. #ifdef WOLFSSL_KEIL
  123070. "orrs r4, r4, r5\n\t"
  123071. #elif defined(__clang__)
  123072. "orrs r4, r5\n\t"
  123073. #else
  123074. "orr r4, r5\n\t"
  123075. #endif
  123076. "ldr r3, [%[a], #64]\n\t"
  123077. "str r4, [%[r], #56]\n\t"
  123078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123079. "lsls r5, r3, #31\n\t"
  123080. #else
  123081. "lsl r5, r3, #31\n\t"
  123082. #endif
  123083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  123084. "lsrs r3, r3, #1\n\t"
  123085. #else
  123086. "lsr r3, r3, #1\n\t"
  123087. #endif
  123088. #ifdef WOLFSSL_KEIL
  123089. "orrs r2, r2, r5\n\t"
  123090. #elif defined(__clang__)
  123091. "orrs r2, r5\n\t"
  123092. #else
  123093. "orr r2, r5\n\t"
  123094. #endif
  123095. "str r2, [%[r], #60]\n\t"
  123096. "str r3, [%[r], #64]\n\t"
  123097. : [r] "+l" (r), [a] "+l" (a)
  123098. :
  123099. : "memory", "r2", "r3", "r4", "r5"
  123100. );
  123101. }
  123102. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  123103. *
  123104. * r Result of division by 2.
  123105. * a Number to divide.
  123106. * m Modulus (prime).
  123107. */
  123108. SP_NOINLINE static void sp_521_mont_div2_17(sp_digit* r, const sp_digit* a,
  123109. const sp_digit* m)
  123110. {
  123111. sp_digit o;
  123112. o = sp_521_cond_add_17(r, a, m, 0 - (a[0] & 1));
  123113. sp_521_rshift1_17(r, r);
  123114. r[16] |= o << 31;
  123115. }
  123116. /* Double the Montgomery form projective point p.
  123117. *
  123118. * r Result of doubling point.
  123119. * p Point to double.
  123120. * t Temporary ordinate data.
  123121. */
  123122. static void sp_521_proj_point_dbl_17(sp_point_521* r, const sp_point_521* p,
  123123. sp_digit* t)
  123124. {
  123125. sp_digit* t1 = t;
  123126. sp_digit* t2 = t + 2*17;
  123127. sp_digit* x;
  123128. sp_digit* y;
  123129. sp_digit* z;
  123130. x = r->x;
  123131. y = r->y;
  123132. z = r->z;
  123133. /* Put infinity into result. */
  123134. if (r != p) {
  123135. r->infinity = p->infinity;
  123136. }
  123137. /* T1 = Z * Z */
  123138. sp_521_mont_sqr_17(t1, p->z, p521_mod, p521_mp_mod);
  123139. /* Z = Y * Z */
  123140. sp_521_mont_mul_17(z, p->y, p->z, p521_mod, p521_mp_mod);
  123141. /* Z = 2Z */
  123142. sp_521_mont_dbl_17(z, z, p521_mod);
  123143. /* T2 = X - T1 */
  123144. sp_521_mont_sub_17(t2, p->x, t1, p521_mod);
  123145. /* T1 = X + T1 */
  123146. sp_521_mont_add_17(t1, p->x, t1, p521_mod);
  123147. /* T2 = T1 * T2 */
  123148. sp_521_mont_mul_17(t2, t1, t2, p521_mod, p521_mp_mod);
  123149. /* T1 = 3T2 */
  123150. sp_521_mont_tpl_17(t1, t2, p521_mod);
  123151. /* Y = 2Y */
  123152. sp_521_mont_dbl_17(y, p->y, p521_mod);
  123153. /* Y = Y * Y */
  123154. sp_521_mont_sqr_17(y, y, p521_mod, p521_mp_mod);
  123155. /* T2 = Y * Y */
  123156. sp_521_mont_sqr_17(t2, y, p521_mod, p521_mp_mod);
  123157. /* T2 = T2/2 */
  123158. sp_521_mont_div2_17(t2, t2, p521_mod);
  123159. /* Y = Y * X */
  123160. sp_521_mont_mul_17(y, y, p->x, p521_mod, p521_mp_mod);
  123161. /* X = T1 * T1 */
  123162. sp_521_mont_sqr_17(x, t1, p521_mod, p521_mp_mod);
  123163. /* X = X - Y */
  123164. sp_521_mont_sub_17(x, x, y, p521_mod);
  123165. /* X = X - Y */
  123166. sp_521_mont_sub_17(x, x, y, p521_mod);
  123167. /* Y = Y - X */
  123168. sp_521_mont_sub_17(y, y, x, p521_mod);
  123169. /* Y = Y * T1 */
  123170. sp_521_mont_mul_17(y, y, t1, p521_mod, p521_mp_mod);
  123171. /* Y = Y - T2 */
  123172. sp_521_mont_sub_17(y, y, t2, p521_mod);
  123173. }
  123174. #ifdef WOLFSSL_SP_NONBLOCK
  123175. typedef struct sp_521_proj_point_dbl_17_ctx {
  123176. int state;
  123177. sp_digit* t1;
  123178. sp_digit* t2;
  123179. sp_digit* x;
  123180. sp_digit* y;
  123181. sp_digit* z;
  123182. } sp_521_proj_point_dbl_17_ctx;
  123183. /* Double the Montgomery form projective point p.
  123184. *
  123185. * r Result of doubling point.
  123186. * p Point to double.
  123187. * t Temporary ordinate data.
  123188. */
  123189. static int sp_521_proj_point_dbl_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r,
  123190. const sp_point_521* p, sp_digit* t)
  123191. {
  123192. int err = FP_WOULDBLOCK;
  123193. sp_521_proj_point_dbl_17_ctx* ctx = (sp_521_proj_point_dbl_17_ctx*)sp_ctx->data;
  123194. typedef char ctx_size_test[sizeof(sp_521_proj_point_dbl_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  123195. (void)sizeof(ctx_size_test);
  123196. switch (ctx->state) {
  123197. case 0:
  123198. ctx->t1 = t;
  123199. ctx->t2 = t + 2*17;
  123200. ctx->x = r->x;
  123201. ctx->y = r->y;
  123202. ctx->z = r->z;
  123203. /* Put infinity into result. */
  123204. if (r != p) {
  123205. r->infinity = p->infinity;
  123206. }
  123207. ctx->state = 1;
  123208. break;
  123209. case 1:
  123210. /* T1 = Z * Z */
  123211. sp_521_mont_sqr_17(ctx->t1, p->z, p521_mod, p521_mp_mod);
  123212. ctx->state = 2;
  123213. break;
  123214. case 2:
  123215. /* Z = Y * Z */
  123216. sp_521_mont_mul_17(ctx->z, p->y, p->z, p521_mod, p521_mp_mod);
  123217. ctx->state = 3;
  123218. break;
  123219. case 3:
  123220. /* Z = 2Z */
  123221. sp_521_mont_dbl_17(ctx->z, ctx->z, p521_mod);
  123222. ctx->state = 4;
  123223. break;
  123224. case 4:
  123225. /* T2 = X - T1 */
  123226. sp_521_mont_sub_17(ctx->t2, p->x, ctx->t1, p521_mod);
  123227. ctx->state = 5;
  123228. break;
  123229. case 5:
  123230. /* T1 = X + T1 */
  123231. sp_521_mont_add_17(ctx->t1, p->x, ctx->t1, p521_mod);
  123232. ctx->state = 6;
  123233. break;
  123234. case 6:
  123235. /* T2 = T1 * T2 */
  123236. sp_521_mont_mul_17(ctx->t2, ctx->t1, ctx->t2, p521_mod, p521_mp_mod);
  123237. ctx->state = 7;
  123238. break;
  123239. case 7:
  123240. /* T1 = 3T2 */
  123241. sp_521_mont_tpl_17(ctx->t1, ctx->t2, p521_mod);
  123242. ctx->state = 8;
  123243. break;
  123244. case 8:
  123245. /* Y = 2Y */
  123246. sp_521_mont_dbl_17(ctx->y, p->y, p521_mod);
  123247. ctx->state = 9;
  123248. break;
  123249. case 9:
  123250. /* Y = Y * Y */
  123251. sp_521_mont_sqr_17(ctx->y, ctx->y, p521_mod, p521_mp_mod);
  123252. ctx->state = 10;
  123253. break;
  123254. case 10:
  123255. /* T2 = Y * Y */
  123256. sp_521_mont_sqr_17(ctx->t2, ctx->y, p521_mod, p521_mp_mod);
  123257. ctx->state = 11;
  123258. break;
  123259. case 11:
  123260. /* T2 = T2/2 */
  123261. sp_521_mont_div2_17(ctx->t2, ctx->t2, p521_mod);
  123262. ctx->state = 12;
  123263. break;
  123264. case 12:
  123265. /* Y = Y * X */
  123266. sp_521_mont_mul_17(ctx->y, ctx->y, p->x, p521_mod, p521_mp_mod);
  123267. ctx->state = 13;
  123268. break;
  123269. case 13:
  123270. /* X = T1 * T1 */
  123271. sp_521_mont_sqr_17(ctx->x, ctx->t1, p521_mod, p521_mp_mod);
  123272. ctx->state = 14;
  123273. break;
  123274. case 14:
  123275. /* X = X - Y */
  123276. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->y, p521_mod);
  123277. ctx->state = 15;
  123278. break;
  123279. case 15:
  123280. /* X = X - Y */
  123281. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->y, p521_mod);
  123282. ctx->state = 16;
  123283. break;
  123284. case 16:
  123285. /* Y = Y - X */
  123286. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->x, p521_mod);
  123287. ctx->state = 17;
  123288. break;
  123289. case 17:
  123290. /* Y = Y * T1 */
  123291. sp_521_mont_mul_17(ctx->y, ctx->y, ctx->t1, p521_mod, p521_mp_mod);
  123292. ctx->state = 18;
  123293. break;
  123294. case 18:
  123295. /* Y = Y - T2 */
  123296. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->t2, p521_mod);
  123297. ctx->state = 19;
  123298. /* fall-through */
  123299. case 19:
  123300. err = MP_OKAY;
  123301. break;
  123302. }
  123303. if (err == MP_OKAY && ctx->state != 19) {
  123304. err = FP_WOULDBLOCK;
  123305. }
  123306. return err;
  123307. }
  123308. #endif /* WOLFSSL_SP_NONBLOCK */
  123309. /* Compare two numbers to determine if they are equal.
  123310. * Constant time implementation.
  123311. *
  123312. * a First number to compare.
  123313. * b Second number to compare.
  123314. * returns 1 when equal and 0 otherwise.
  123315. */
  123316. static int sp_521_cmp_equal_17(const sp_digit* a, const sp_digit* b)
  123317. {
  123318. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  123319. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  123320. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  123321. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11]) |
  123322. (a[12] ^ b[12]) | (a[13] ^ b[13]) | (a[14] ^ b[14]) |
  123323. (a[15] ^ b[15]) | (a[16] ^ b[16])) == 0;
  123324. }
  123325. /* Returns 1 if the number of zero.
  123326. * Implementation is constant time.
  123327. *
  123328. * a Number to check.
  123329. * returns 1 if the number is zero and 0 otherwise.
  123330. */
  123331. static int sp_521_iszero_17(const sp_digit* a)
  123332. {
  123333. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  123334. a[8] | a[9] | a[10] | a[11] | a[12] | a[13] | a[14] | a[15] |
  123335. a[16]) == 0;
  123336. }
  123337. /* Add two Montgomery form projective points.
  123338. *
  123339. * r Result of addition.
  123340. * p First point to add.
  123341. * q Second point to add.
  123342. * t Temporary ordinate data.
  123343. */
  123344. static void sp_521_proj_point_add_17(sp_point_521* r,
  123345. const sp_point_521* p, const sp_point_521* q, sp_digit* t)
  123346. {
  123347. sp_digit* t6 = t;
  123348. sp_digit* t1 = t + 2*17;
  123349. sp_digit* t2 = t + 4*17;
  123350. sp_digit* t3 = t + 6*17;
  123351. sp_digit* t4 = t + 8*17;
  123352. sp_digit* t5 = t + 10*17;
  123353. /* U1 = X1*Z2^2 */
  123354. sp_521_mont_sqr_17(t1, q->z, p521_mod, p521_mp_mod);
  123355. sp_521_mont_mul_17(t3, t1, q->z, p521_mod, p521_mp_mod);
  123356. sp_521_mont_mul_17(t1, t1, p->x, p521_mod, p521_mp_mod);
  123357. /* U2 = X2*Z1^2 */
  123358. sp_521_mont_sqr_17(t2, p->z, p521_mod, p521_mp_mod);
  123359. sp_521_mont_mul_17(t4, t2, p->z, p521_mod, p521_mp_mod);
  123360. sp_521_mont_mul_17(t2, t2, q->x, p521_mod, p521_mp_mod);
  123361. /* S1 = Y1*Z2^3 */
  123362. sp_521_mont_mul_17(t3, t3, p->y, p521_mod, p521_mp_mod);
  123363. /* S2 = Y2*Z1^3 */
  123364. sp_521_mont_mul_17(t4, t4, q->y, p521_mod, p521_mp_mod);
  123365. /* Check double */
  123366. if ((~p->infinity) & (~q->infinity) &
  123367. sp_521_cmp_equal_17(t2, t1) &
  123368. sp_521_cmp_equal_17(t4, t3)) {
  123369. sp_521_proj_point_dbl_17(r, p, t);
  123370. }
  123371. else {
  123372. sp_digit* x = t6;
  123373. sp_digit* y = t1;
  123374. sp_digit* z = t2;
  123375. /* H = U2 - U1 */
  123376. sp_521_mont_sub_17(t2, t2, t1, p521_mod);
  123377. /* R = S2 - S1 */
  123378. sp_521_mont_sub_17(t4, t4, t3, p521_mod);
  123379. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  123380. sp_521_mont_sqr_17(t5, t2, p521_mod, p521_mp_mod);
  123381. sp_521_mont_mul_17(y, t1, t5, p521_mod, p521_mp_mod);
  123382. sp_521_mont_mul_17(t5, t5, t2, p521_mod, p521_mp_mod);
  123383. /* Z3 = H*Z1*Z2 */
  123384. sp_521_mont_mul_17(z, p->z, t2, p521_mod, p521_mp_mod);
  123385. sp_521_mont_mul_17(z, z, q->z, p521_mod, p521_mp_mod);
  123386. sp_521_mont_sqr_17(x, t4, p521_mod, p521_mp_mod);
  123387. sp_521_mont_sub_17(x, x, t5, p521_mod);
  123388. sp_521_mont_mul_17(t5, t5, t3, p521_mod, p521_mp_mod);
  123389. sp_521_mont_dbl_17(t3, y, p521_mod);
  123390. sp_521_mont_sub_17(x, x, t3, p521_mod);
  123391. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  123392. sp_521_mont_sub_17(y, y, x, p521_mod);
  123393. sp_521_mont_mul_17(y, y, t4, p521_mod, p521_mp_mod);
  123394. sp_521_mont_sub_17(y, y, t5, p521_mod);
  123395. {
  123396. int i;
  123397. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  123398. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  123399. sp_digit maskt = ~(maskp | maskq);
  123400. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  123401. for (i = 0; i < 17; i++) {
  123402. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  123403. (x[i] & maskt);
  123404. }
  123405. for (i = 0; i < 17; i++) {
  123406. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  123407. (y[i] & maskt);
  123408. }
  123409. for (i = 0; i < 17; i++) {
  123410. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  123411. (z[i] & maskt);
  123412. }
  123413. r->z[0] |= inf;
  123414. r->infinity = (word32)inf;
  123415. }
  123416. }
  123417. }
  123418. #ifdef WOLFSSL_SP_NONBLOCK
  123419. typedef struct sp_521_proj_point_add_17_ctx {
  123420. int state;
  123421. sp_521_proj_point_dbl_17_ctx dbl_ctx;
  123422. const sp_point_521* ap[2];
  123423. sp_point_521* rp[2];
  123424. sp_digit* t1;
  123425. sp_digit* t2;
  123426. sp_digit* t3;
  123427. sp_digit* t4;
  123428. sp_digit* t5;
  123429. sp_digit* t6;
  123430. sp_digit* x;
  123431. sp_digit* y;
  123432. sp_digit* z;
  123433. } sp_521_proj_point_add_17_ctx;
  123434. /* Add two Montgomery form projective points.
  123435. *
  123436. * r Result of addition.
  123437. * p First point to add.
  123438. * q Second point to add.
  123439. * t Temporary ordinate data.
  123440. */
  123441. static int sp_521_proj_point_add_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r,
  123442. const sp_point_521* p, const sp_point_521* q, sp_digit* t)
  123443. {
  123444. int err = FP_WOULDBLOCK;
  123445. sp_521_proj_point_add_17_ctx* ctx = (sp_521_proj_point_add_17_ctx*)sp_ctx->data;
  123446. /* Ensure only the first point is the same as the result. */
  123447. if (q == r) {
  123448. const sp_point_521* a = p;
  123449. p = q;
  123450. q = a;
  123451. }
  123452. typedef char ctx_size_test[sizeof(sp_521_proj_point_add_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  123453. (void)sizeof(ctx_size_test);
  123454. switch (ctx->state) {
  123455. case 0: /* INIT */
  123456. ctx->t6 = t;
  123457. ctx->t1 = t + 2*17;
  123458. ctx->t2 = t + 4*17;
  123459. ctx->t3 = t + 6*17;
  123460. ctx->t4 = t + 8*17;
  123461. ctx->t5 = t + 10*17;
  123462. ctx->x = ctx->t6;
  123463. ctx->y = ctx->t1;
  123464. ctx->z = ctx->t2;
  123465. ctx->state = 1;
  123466. break;
  123467. case 1:
  123468. /* U1 = X1*Z2^2 */
  123469. sp_521_mont_sqr_17(ctx->t1, q->z, p521_mod, p521_mp_mod);
  123470. ctx->state = 2;
  123471. break;
  123472. case 2:
  123473. sp_521_mont_mul_17(ctx->t3, ctx->t1, q->z, p521_mod, p521_mp_mod);
  123474. ctx->state = 3;
  123475. break;
  123476. case 3:
  123477. sp_521_mont_mul_17(ctx->t1, ctx->t1, p->x, p521_mod, p521_mp_mod);
  123478. ctx->state = 4;
  123479. break;
  123480. case 4:
  123481. /* U2 = X2*Z1^2 */
  123482. sp_521_mont_sqr_17(ctx->t2, p->z, p521_mod, p521_mp_mod);
  123483. ctx->state = 5;
  123484. break;
  123485. case 5:
  123486. sp_521_mont_mul_17(ctx->t4, ctx->t2, p->z, p521_mod, p521_mp_mod);
  123487. ctx->state = 6;
  123488. break;
  123489. case 6:
  123490. sp_521_mont_mul_17(ctx->t2, ctx->t2, q->x, p521_mod, p521_mp_mod);
  123491. ctx->state = 7;
  123492. break;
  123493. case 7:
  123494. /* S1 = Y1*Z2^3 */
  123495. sp_521_mont_mul_17(ctx->t3, ctx->t3, p->y, p521_mod, p521_mp_mod);
  123496. ctx->state = 8;
  123497. break;
  123498. case 8:
  123499. /* S2 = Y2*Z1^3 */
  123500. sp_521_mont_mul_17(ctx->t4, ctx->t4, q->y, p521_mod, p521_mp_mod);
  123501. ctx->state = 9;
  123502. break;
  123503. case 9:
  123504. /* Check double */
  123505. if ((~p->infinity) & (~q->infinity) &
  123506. sp_521_cmp_equal_17(ctx->t2, ctx->t1) &
  123507. sp_521_cmp_equal_17(ctx->t4, ctx->t3)) {
  123508. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  123509. sp_521_proj_point_dbl_17(r, p, t);
  123510. ctx->state = 25;
  123511. }
  123512. else {
  123513. ctx->state = 10;
  123514. }
  123515. break;
  123516. case 10:
  123517. /* H = U2 - U1 */
  123518. sp_521_mont_sub_17(ctx->t2, ctx->t2, ctx->t1, p521_mod);
  123519. ctx->state = 11;
  123520. break;
  123521. case 11:
  123522. /* R = S2 - S1 */
  123523. sp_521_mont_sub_17(ctx->t4, ctx->t4, ctx->t3, p521_mod);
  123524. ctx->state = 12;
  123525. break;
  123526. case 12:
  123527. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  123528. sp_521_mont_sqr_17(ctx->t5, ctx->t2, p521_mod, p521_mp_mod);
  123529. ctx->state = 13;
  123530. break;
  123531. case 13:
  123532. sp_521_mont_mul_17(ctx->y, ctx->t1, ctx->t5, p521_mod, p521_mp_mod);
  123533. ctx->state = 14;
  123534. break;
  123535. case 14:
  123536. sp_521_mont_mul_17(ctx->t5, ctx->t5, ctx->t2, p521_mod, p521_mp_mod);
  123537. ctx->state = 15;
  123538. break;
  123539. case 15:
  123540. /* Z3 = H*Z1*Z2 */
  123541. sp_521_mont_mul_17(ctx->z, p->z, ctx->t2, p521_mod, p521_mp_mod);
  123542. ctx->state = 16;
  123543. break;
  123544. case 16:
  123545. sp_521_mont_mul_17(ctx->z, ctx->z, q->z, p521_mod, p521_mp_mod);
  123546. ctx->state = 17;
  123547. break;
  123548. case 17:
  123549. sp_521_mont_sqr_17(ctx->x, ctx->t4, p521_mod, p521_mp_mod);
  123550. ctx->state = 18;
  123551. break;
  123552. case 18:
  123553. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->t5, p521_mod);
  123554. ctx->state = 19;
  123555. break;
  123556. case 19:
  123557. sp_521_mont_mul_17(ctx->t5, ctx->t5, ctx->t3, p521_mod, p521_mp_mod);
  123558. ctx->state = 20;
  123559. break;
  123560. case 20:
  123561. sp_521_mont_dbl_17(ctx->t3, ctx->y, p521_mod);
  123562. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->t3, p521_mod);
  123563. ctx->state = 21;
  123564. break;
  123565. case 21:
  123566. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  123567. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->x, p521_mod);
  123568. ctx->state = 22;
  123569. break;
  123570. case 22:
  123571. sp_521_mont_mul_17(ctx->y, ctx->y, ctx->t4, p521_mod, p521_mp_mod);
  123572. ctx->state = 23;
  123573. break;
  123574. case 23:
  123575. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->t5, p521_mod);
  123576. ctx->state = 24;
  123577. break;
  123578. case 24:
  123579. {
  123580. {
  123581. int i;
  123582. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  123583. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  123584. sp_digit maskt = ~(maskp | maskq);
  123585. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  123586. for (i = 0; i < 17; i++) {
  123587. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  123588. (ctx->x[i] & maskt);
  123589. }
  123590. for (i = 0; i < 17; i++) {
  123591. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  123592. (ctx->y[i] & maskt);
  123593. }
  123594. for (i = 0; i < 17; i++) {
  123595. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  123596. (ctx->z[i] & maskt);
  123597. }
  123598. r->z[0] |= inf;
  123599. r->infinity = (word32)inf;
  123600. }
  123601. ctx->state = 25;
  123602. break;
  123603. }
  123604. case 25:
  123605. err = MP_OKAY;
  123606. break;
  123607. }
  123608. if (err == MP_OKAY && ctx->state != 25) {
  123609. err = FP_WOULDBLOCK;
  123610. }
  123611. return err;
  123612. }
  123613. #endif /* WOLFSSL_SP_NONBLOCK */
  123614. #ifndef WC_NO_CACHE_RESISTANT
  123615. /* Touch each possible point that could be being copied.
  123616. *
  123617. * r Point to copy into.
  123618. * table Table - start of the entries to access
  123619. * idx Index of entry to retrieve.
  123620. */
  123621. static void sp_521_get_point_16_17(sp_point_521* r, const sp_point_521* table,
  123622. int idx)
  123623. {
  123624. int i;
  123625. sp_digit mask;
  123626. r->x[0] = 0;
  123627. r->x[1] = 0;
  123628. r->x[2] = 0;
  123629. r->x[3] = 0;
  123630. r->x[4] = 0;
  123631. r->x[5] = 0;
  123632. r->x[6] = 0;
  123633. r->x[7] = 0;
  123634. r->x[8] = 0;
  123635. r->x[9] = 0;
  123636. r->x[10] = 0;
  123637. r->x[11] = 0;
  123638. r->x[12] = 0;
  123639. r->x[13] = 0;
  123640. r->x[14] = 0;
  123641. r->x[15] = 0;
  123642. r->x[16] = 0;
  123643. r->y[0] = 0;
  123644. r->y[1] = 0;
  123645. r->y[2] = 0;
  123646. r->y[3] = 0;
  123647. r->y[4] = 0;
  123648. r->y[5] = 0;
  123649. r->y[6] = 0;
  123650. r->y[7] = 0;
  123651. r->y[8] = 0;
  123652. r->y[9] = 0;
  123653. r->y[10] = 0;
  123654. r->y[11] = 0;
  123655. r->y[12] = 0;
  123656. r->y[13] = 0;
  123657. r->y[14] = 0;
  123658. r->y[15] = 0;
  123659. r->y[16] = 0;
  123660. r->z[0] = 0;
  123661. r->z[1] = 0;
  123662. r->z[2] = 0;
  123663. r->z[3] = 0;
  123664. r->z[4] = 0;
  123665. r->z[5] = 0;
  123666. r->z[6] = 0;
  123667. r->z[7] = 0;
  123668. r->z[8] = 0;
  123669. r->z[9] = 0;
  123670. r->z[10] = 0;
  123671. r->z[11] = 0;
  123672. r->z[12] = 0;
  123673. r->z[13] = 0;
  123674. r->z[14] = 0;
  123675. r->z[15] = 0;
  123676. r->z[16] = 0;
  123677. for (i = 1; i < 16; i++) {
  123678. mask = 0 - (i == idx);
  123679. r->x[0] |= mask & table[i].x[0];
  123680. r->x[1] |= mask & table[i].x[1];
  123681. r->x[2] |= mask & table[i].x[2];
  123682. r->x[3] |= mask & table[i].x[3];
  123683. r->x[4] |= mask & table[i].x[4];
  123684. r->x[5] |= mask & table[i].x[5];
  123685. r->x[6] |= mask & table[i].x[6];
  123686. r->x[7] |= mask & table[i].x[7];
  123687. r->x[8] |= mask & table[i].x[8];
  123688. r->x[9] |= mask & table[i].x[9];
  123689. r->x[10] |= mask & table[i].x[10];
  123690. r->x[11] |= mask & table[i].x[11];
  123691. r->x[12] |= mask & table[i].x[12];
  123692. r->x[13] |= mask & table[i].x[13];
  123693. r->x[14] |= mask & table[i].x[14];
  123694. r->x[15] |= mask & table[i].x[15];
  123695. r->x[16] |= mask & table[i].x[16];
  123696. r->y[0] |= mask & table[i].y[0];
  123697. r->y[1] |= mask & table[i].y[1];
  123698. r->y[2] |= mask & table[i].y[2];
  123699. r->y[3] |= mask & table[i].y[3];
  123700. r->y[4] |= mask & table[i].y[4];
  123701. r->y[5] |= mask & table[i].y[5];
  123702. r->y[6] |= mask & table[i].y[6];
  123703. r->y[7] |= mask & table[i].y[7];
  123704. r->y[8] |= mask & table[i].y[8];
  123705. r->y[9] |= mask & table[i].y[9];
  123706. r->y[10] |= mask & table[i].y[10];
  123707. r->y[11] |= mask & table[i].y[11];
  123708. r->y[12] |= mask & table[i].y[12];
  123709. r->y[13] |= mask & table[i].y[13];
  123710. r->y[14] |= mask & table[i].y[14];
  123711. r->y[15] |= mask & table[i].y[15];
  123712. r->y[16] |= mask & table[i].y[16];
  123713. r->z[0] |= mask & table[i].z[0];
  123714. r->z[1] |= mask & table[i].z[1];
  123715. r->z[2] |= mask & table[i].z[2];
  123716. r->z[3] |= mask & table[i].z[3];
  123717. r->z[4] |= mask & table[i].z[4];
  123718. r->z[5] |= mask & table[i].z[5];
  123719. r->z[6] |= mask & table[i].z[6];
  123720. r->z[7] |= mask & table[i].z[7];
  123721. r->z[8] |= mask & table[i].z[8];
  123722. r->z[9] |= mask & table[i].z[9];
  123723. r->z[10] |= mask & table[i].z[10];
  123724. r->z[11] |= mask & table[i].z[11];
  123725. r->z[12] |= mask & table[i].z[12];
  123726. r->z[13] |= mask & table[i].z[13];
  123727. r->z[14] |= mask & table[i].z[14];
  123728. r->z[15] |= mask & table[i].z[15];
  123729. r->z[16] |= mask & table[i].z[16];
  123730. }
  123731. }
  123732. #endif /* !WC_NO_CACHE_RESISTANT */
  123733. /* Multiply the point by the scalar and return the result.
  123734. * If map is true then convert result to affine coordinates.
  123735. *
  123736. * Fast implementation that generates a pre-computation table.
  123737. * 4 bits of window (no sliding!).
  123738. * Uses add and double for calculating table.
  123739. * 521 doubles.
  123740. * 143 adds.
  123741. *
  123742. * r Resulting point.
  123743. * g Point to multiply.
  123744. * k Scalar to multiply by.
  123745. * map Indicates whether to convert result to affine.
  123746. * ct Constant time required.
  123747. * heap Heap to use for allocation.
  123748. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  123749. */
  123750. static int sp_521_ecc_mulmod_fast_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k,
  123751. int map, int ct, void* heap)
  123752. {
  123753. #ifdef WOLFSSL_SP_SMALL_STACK
  123754. sp_point_521* t = NULL;
  123755. sp_digit* tmp = NULL;
  123756. #else
  123757. sp_point_521 t[16 + 1];
  123758. sp_digit tmp[2 * 17 * 6];
  123759. #endif
  123760. sp_point_521* rt = NULL;
  123761. #ifndef WC_NO_CACHE_RESISTANT
  123762. #ifdef WOLFSSL_SP_SMALL_STACK
  123763. sp_point_521* p = NULL;
  123764. #else
  123765. sp_point_521 p[1];
  123766. #endif
  123767. #endif /* !WC_NO_CACHE_RESISTANT */
  123768. sp_digit n;
  123769. int i;
  123770. int c;
  123771. int y;
  123772. int err = MP_OKAY;
  123773. /* Constant time used for cache attack resistance implementation. */
  123774. (void)ct;
  123775. (void)heap;
  123776. #ifdef WOLFSSL_SP_SMALL_STACK
  123777. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * (16 + 1),
  123778. heap, DYNAMIC_TYPE_ECC);
  123779. if (t == NULL)
  123780. err = MEMORY_E;
  123781. #ifndef WC_NO_CACHE_RESISTANT
  123782. if (err == MP_OKAY) {
  123783. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521),
  123784. heap, DYNAMIC_TYPE_ECC);
  123785. if (p == NULL)
  123786. err = MEMORY_E;
  123787. }
  123788. #endif
  123789. if (err == MP_OKAY) {
  123790. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  123791. DYNAMIC_TYPE_ECC);
  123792. if (tmp == NULL)
  123793. err = MEMORY_E;
  123794. }
  123795. #endif
  123796. if (err == MP_OKAY) {
  123797. rt = t + 16;
  123798. /* t[0] = {0, 0, 1} * norm */
  123799. XMEMSET(&t[0], 0, sizeof(t[0]));
  123800. t[0].infinity = 1;
  123801. /* t[1] = {g->x, g->y, g->z} * norm */
  123802. (void)sp_521_mod_mul_norm_17(t[1].x, g->x, p521_mod);
  123803. (void)sp_521_mod_mul_norm_17(t[1].y, g->y, p521_mod);
  123804. (void)sp_521_mod_mul_norm_17(t[1].z, g->z, p521_mod);
  123805. t[1].infinity = 0;
  123806. sp_521_proj_point_dbl_17(&t[ 2], &t[ 1], tmp);
  123807. t[ 2].infinity = 0;
  123808. sp_521_proj_point_add_17(&t[ 3], &t[ 2], &t[ 1], tmp);
  123809. t[ 3].infinity = 0;
  123810. sp_521_proj_point_dbl_17(&t[ 4], &t[ 2], tmp);
  123811. t[ 4].infinity = 0;
  123812. sp_521_proj_point_add_17(&t[ 5], &t[ 3], &t[ 2], tmp);
  123813. t[ 5].infinity = 0;
  123814. sp_521_proj_point_dbl_17(&t[ 6], &t[ 3], tmp);
  123815. t[ 6].infinity = 0;
  123816. sp_521_proj_point_add_17(&t[ 7], &t[ 4], &t[ 3], tmp);
  123817. t[ 7].infinity = 0;
  123818. sp_521_proj_point_dbl_17(&t[ 8], &t[ 4], tmp);
  123819. t[ 8].infinity = 0;
  123820. sp_521_proj_point_add_17(&t[ 9], &t[ 5], &t[ 4], tmp);
  123821. t[ 9].infinity = 0;
  123822. sp_521_proj_point_dbl_17(&t[10], &t[ 5], tmp);
  123823. t[10].infinity = 0;
  123824. sp_521_proj_point_add_17(&t[11], &t[ 6], &t[ 5], tmp);
  123825. t[11].infinity = 0;
  123826. sp_521_proj_point_dbl_17(&t[12], &t[ 6], tmp);
  123827. t[12].infinity = 0;
  123828. sp_521_proj_point_add_17(&t[13], &t[ 7], &t[ 6], tmp);
  123829. t[13].infinity = 0;
  123830. sp_521_proj_point_dbl_17(&t[14], &t[ 7], tmp);
  123831. t[14].infinity = 0;
  123832. sp_521_proj_point_add_17(&t[15], &t[ 8], &t[ 7], tmp);
  123833. t[15].infinity = 0;
  123834. i = 15;
  123835. n = k[i+1] << 0;
  123836. c = 5;
  123837. y = (int)(n >> 5);
  123838. #ifndef WC_NO_CACHE_RESISTANT
  123839. if (ct) {
  123840. sp_521_get_point_16_17(rt, t, y);
  123841. rt->infinity = !y;
  123842. }
  123843. else
  123844. #endif
  123845. {
  123846. XMEMCPY(rt, &t[y], sizeof(sp_point_521));
  123847. }
  123848. n <<= 27;
  123849. for (; i>=0 || c>=4; ) {
  123850. if (c < 4) {
  123851. n = (k[i+1] << 31) | (k[i] >> 1);
  123852. i--;
  123853. c += 32;
  123854. }
  123855. y = (n >> 28) & 0xf;
  123856. n <<= 4;
  123857. c -= 4;
  123858. sp_521_proj_point_dbl_17(rt, rt, tmp);
  123859. sp_521_proj_point_dbl_17(rt, rt, tmp);
  123860. sp_521_proj_point_dbl_17(rt, rt, tmp);
  123861. sp_521_proj_point_dbl_17(rt, rt, tmp);
  123862. #ifndef WC_NO_CACHE_RESISTANT
  123863. if (ct) {
  123864. sp_521_get_point_16_17(p, t, y);
  123865. p->infinity = !y;
  123866. sp_521_proj_point_add_17(rt, rt, p, tmp);
  123867. }
  123868. else
  123869. #endif
  123870. {
  123871. sp_521_proj_point_add_17(rt, rt, &t[y], tmp);
  123872. }
  123873. }
  123874. y = k[0] & 0x1;
  123875. sp_521_proj_point_dbl_17(rt, rt, tmp);
  123876. sp_521_proj_point_add_17(rt, rt, &t[y], tmp);
  123877. if (map != 0) {
  123878. sp_521_map_17(r, rt, tmp);
  123879. }
  123880. else {
  123881. XMEMCPY(r, rt, sizeof(sp_point_521));
  123882. }
  123883. }
  123884. #ifdef WOLFSSL_SP_SMALL_STACK
  123885. if (tmp != NULL)
  123886. #endif
  123887. {
  123888. ForceZero(tmp, sizeof(sp_digit) * 2 * 17 * 6);
  123889. #ifdef WOLFSSL_SP_SMALL_STACK
  123890. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  123891. #endif
  123892. }
  123893. #ifndef WC_NO_CACHE_RESISTANT
  123894. #ifdef WOLFSSL_SP_SMALL_STACK
  123895. if (p != NULL)
  123896. #endif
  123897. {
  123898. ForceZero(p, sizeof(sp_point_521));
  123899. #ifdef WOLFSSL_SP_SMALL_STACK
  123900. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  123901. #endif
  123902. }
  123903. #endif /* !WC_NO_CACHE_RESISTANT */
  123904. #ifdef WOLFSSL_SP_SMALL_STACK
  123905. if (t != NULL)
  123906. #endif
  123907. {
  123908. ForceZero(t, sizeof(sp_point_521) * 17);
  123909. #ifdef WOLFSSL_SP_SMALL_STACK
  123910. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  123911. #endif
  123912. }
  123913. return err;
  123914. }
  123915. #ifdef FP_ECC
  123916. /* Double the Montgomery form projective point p a number of times.
  123917. *
  123918. * r Result of repeated doubling of point.
  123919. * p Point to double.
  123920. * n Number of times to double
  123921. * t Temporary ordinate data.
  123922. */
  123923. static void sp_521_proj_point_dbl_n_17(sp_point_521* p, int i,
  123924. sp_digit* t)
  123925. {
  123926. sp_digit* w = t;
  123927. sp_digit* a = t + 2*17;
  123928. sp_digit* b = t + 4*17;
  123929. sp_digit* t1 = t + 6*17;
  123930. sp_digit* t2 = t + 8*17;
  123931. sp_digit* x;
  123932. sp_digit* y;
  123933. sp_digit* z;
  123934. volatile int n = i;
  123935. x = p->x;
  123936. y = p->y;
  123937. z = p->z;
  123938. /* Y = 2*Y */
  123939. sp_521_mont_dbl_17(y, y, p521_mod);
  123940. /* W = Z^4 */
  123941. sp_521_mont_sqr_17(w, z, p521_mod, p521_mp_mod);
  123942. sp_521_mont_sqr_17(w, w, p521_mod, p521_mp_mod);
  123943. #ifndef WOLFSSL_SP_SMALL
  123944. while (--n > 0)
  123945. #else
  123946. while (--n >= 0)
  123947. #endif
  123948. {
  123949. /* A = 3*(X^2 - W) */
  123950. sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod);
  123951. sp_521_mont_sub_17(t1, t1, w, p521_mod);
  123952. sp_521_mont_tpl_17(a, t1, p521_mod);
  123953. /* B = X*Y^2 */
  123954. sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod);
  123955. sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod);
  123956. /* X = A^2 - 2B */
  123957. sp_521_mont_sqr_17(x, a, p521_mod, p521_mp_mod);
  123958. sp_521_mont_dbl_17(t2, b, p521_mod);
  123959. sp_521_mont_sub_17(x, x, t2, p521_mod);
  123960. /* B = 2.(B - X) */
  123961. sp_521_mont_sub_17(t2, b, x, p521_mod);
  123962. sp_521_mont_dbl_17(b, t2, p521_mod);
  123963. /* Z = Z*Y */
  123964. sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod);
  123965. /* t1 = Y^4 */
  123966. sp_521_mont_sqr_17(t1, t1, p521_mod, p521_mp_mod);
  123967. #ifdef WOLFSSL_SP_SMALL
  123968. if (n != 0)
  123969. #endif
  123970. {
  123971. /* W = W*Y^4 */
  123972. sp_521_mont_mul_17(w, w, t1, p521_mod, p521_mp_mod);
  123973. }
  123974. /* y = 2*A*(B - X) - Y^4 */
  123975. sp_521_mont_mul_17(y, b, a, p521_mod, p521_mp_mod);
  123976. sp_521_mont_sub_17(y, y, t1, p521_mod);
  123977. }
  123978. #ifndef WOLFSSL_SP_SMALL
  123979. /* A = 3*(X^2 - W) */
  123980. sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod);
  123981. sp_521_mont_sub_17(t1, t1, w, p521_mod);
  123982. sp_521_mont_tpl_17(a, t1, p521_mod);
  123983. /* B = X*Y^2 */
  123984. sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod);
  123985. sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod);
  123986. /* X = A^2 - 2B */
  123987. sp_521_mont_sqr_17(x, a, p521_mod, p521_mp_mod);
  123988. sp_521_mont_dbl_17(t2, b, p521_mod);
  123989. sp_521_mont_sub_17(x, x, t2, p521_mod);
  123990. /* B = 2.(B - X) */
  123991. sp_521_mont_sub_17(t2, b, x, p521_mod);
  123992. sp_521_mont_dbl_17(b, t2, p521_mod);
  123993. /* Z = Z*Y */
  123994. sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod);
  123995. /* t1 = Y^4 */
  123996. sp_521_mont_sqr_17(t1, t1, p521_mod, p521_mp_mod);
  123997. /* y = 2*A*(B - X) - Y^4 */
  123998. sp_521_mont_mul_17(y, b, a, p521_mod, p521_mp_mod);
  123999. sp_521_mont_sub_17(y, y, t1, p521_mod);
  124000. #endif /* WOLFSSL_SP_SMALL */
  124001. /* Y = Y/2 */
  124002. sp_521_mont_div2_17(y, y, p521_mod);
  124003. }
  124004. /* Convert the projective point to affine.
  124005. * Ordinates are in Montgomery form.
  124006. *
  124007. * a Point to convert.
  124008. * t Temporary data.
  124009. */
  124010. static void sp_521_proj_to_affine_17(sp_point_521* a, sp_digit* t)
  124011. {
  124012. sp_digit* t1 = t;
  124013. sp_digit* t2 = t + 2 * 17;
  124014. sp_digit* tmp = t + 4 * 17;
  124015. sp_521_mont_inv_17(t1, a->z, tmp);
  124016. sp_521_mont_sqr_17(t2, t1, p521_mod, p521_mp_mod);
  124017. sp_521_mont_mul_17(t1, t2, t1, p521_mod, p521_mp_mod);
  124018. sp_521_mont_mul_17(a->x, a->x, t2, p521_mod, p521_mp_mod);
  124019. sp_521_mont_mul_17(a->y, a->y, t1, p521_mod, p521_mp_mod);
  124020. XMEMCPY(a->z, p521_norm_mod, sizeof(p521_norm_mod));
  124021. }
  124022. #endif /* FP_ECC */
  124023. /* A table entry for pre-computed points. */
  124024. typedef struct sp_table_entry_521 {
  124025. sp_digit x[17];
  124026. sp_digit y[17];
  124027. } sp_table_entry_521;
  124028. #ifdef FP_ECC
  124029. #endif /* FP_ECC */
  124030. /* Add two Montgomery form projective points. The second point has a q value of
  124031. * one.
  124032. * Only the first point can be the same pointer as the result point.
  124033. *
  124034. * r Result of addition.
  124035. * p First point to add.
  124036. * q Second point to add.
  124037. * t Temporary ordinate data.
  124038. */
  124039. static void sp_521_proj_point_add_qz1_17(sp_point_521* r,
  124040. const sp_point_521* p, const sp_point_521* q, sp_digit* t)
  124041. {
  124042. sp_digit* t2 = t;
  124043. sp_digit* t3 = t + 2*17;
  124044. sp_digit* t6 = t + 4*17;
  124045. sp_digit* t1 = t + 6*17;
  124046. sp_digit* t4 = t + 8*17;
  124047. sp_digit* t5 = t + 10*17;
  124048. /* Calculate values to subtract from P->x and P->y. */
  124049. /* U2 = X2*Z1^2 */
  124050. sp_521_mont_sqr_17(t2, p->z, p521_mod, p521_mp_mod);
  124051. sp_521_mont_mul_17(t4, t2, p->z, p521_mod, p521_mp_mod);
  124052. sp_521_mont_mul_17(t2, t2, q->x, p521_mod, p521_mp_mod);
  124053. /* S2 = Y2*Z1^3 */
  124054. sp_521_mont_mul_17(t4, t4, q->y, p521_mod, p521_mp_mod);
  124055. if ((~p->infinity) & (~q->infinity) &
  124056. sp_521_cmp_equal_17(p->x, t2) &
  124057. sp_521_cmp_equal_17(p->y, t4)) {
  124058. sp_521_proj_point_dbl_17(r, p, t);
  124059. }
  124060. else {
  124061. sp_digit* x = t2;
  124062. sp_digit* y = t3;
  124063. sp_digit* z = t6;
  124064. /* H = U2 - X1 */
  124065. sp_521_mont_sub_17(t2, t2, p->x, p521_mod);
  124066. /* R = S2 - Y1 */
  124067. sp_521_mont_sub_17(t4, t4, p->y, p521_mod);
  124068. /* Z3 = H*Z1 */
  124069. sp_521_mont_mul_17(z, p->z, t2, p521_mod, p521_mp_mod);
  124070. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  124071. sp_521_mont_sqr_17(t1, t2, p521_mod, p521_mp_mod);
  124072. sp_521_mont_mul_17(t3, p->x, t1, p521_mod, p521_mp_mod);
  124073. sp_521_mont_mul_17(t1, t1, t2, p521_mod, p521_mp_mod);
  124074. sp_521_mont_sqr_17(t2, t4, p521_mod, p521_mp_mod);
  124075. sp_521_mont_sub_17(t2, t2, t1, p521_mod);
  124076. sp_521_mont_dbl_17(t5, t3, p521_mod);
  124077. sp_521_mont_sub_17(x, t2, t5, p521_mod);
  124078. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  124079. sp_521_mont_sub_17(t3, t3, x, p521_mod);
  124080. sp_521_mont_mul_17(t3, t3, t4, p521_mod, p521_mp_mod);
  124081. sp_521_mont_mul_17(t1, t1, p->y, p521_mod, p521_mp_mod);
  124082. sp_521_mont_sub_17(y, t3, t1, p521_mod);
  124083. {
  124084. int i;
  124085. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  124086. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  124087. sp_digit maskt = ~(maskp | maskq);
  124088. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  124089. for (i = 0; i < 17; i++) {
  124090. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  124091. (x[i] & maskt);
  124092. }
  124093. for (i = 0; i < 17; i++) {
  124094. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  124095. (y[i] & maskt);
  124096. }
  124097. for (i = 0; i < 17; i++) {
  124098. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  124099. (z[i] & maskt);
  124100. }
  124101. r->z[0] |= inf;
  124102. r->infinity = (word32)inf;
  124103. }
  124104. }
  124105. }
  124106. #ifdef WOLFSSL_SP_SMALL
  124107. #ifdef FP_ECC
  124108. /* Generate the pre-computed table of points for the base point.
  124109. *
  124110. * width = 4
  124111. * 16 entries
  124112. * 130 bits between
  124113. *
  124114. * a The base point.
  124115. * table Place to store generated point data.
  124116. * tmp Temporary data.
  124117. * heap Heap to use for allocation.
  124118. */
  124119. static int sp_521_gen_stripe_table_17(const sp_point_521* a,
  124120. sp_table_entry_521* table, sp_digit* tmp, void* heap)
  124121. {
  124122. #ifdef WOLFSSL_SP_SMALL_STACK
  124123. sp_point_521* t = NULL;
  124124. #else
  124125. sp_point_521 t[3];
  124126. #endif
  124127. sp_point_521* s1 = NULL;
  124128. sp_point_521* s2 = NULL;
  124129. int i;
  124130. int j;
  124131. int err = MP_OKAY;
  124132. (void)heap;
  124133. #ifdef WOLFSSL_SP_SMALL_STACK
  124134. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 3, heap,
  124135. DYNAMIC_TYPE_ECC);
  124136. if (t == NULL)
  124137. err = MEMORY_E;
  124138. #endif
  124139. if (err == MP_OKAY) {
  124140. s1 = t + 1;
  124141. s2 = t + 2;
  124142. err = sp_521_mod_mul_norm_17(t->x, a->x, p521_mod);
  124143. }
  124144. if (err == MP_OKAY) {
  124145. err = sp_521_mod_mul_norm_17(t->y, a->y, p521_mod);
  124146. }
  124147. if (err == MP_OKAY) {
  124148. err = sp_521_mod_mul_norm_17(t->z, a->z, p521_mod);
  124149. }
  124150. if (err == MP_OKAY) {
  124151. t->infinity = 0;
  124152. sp_521_proj_to_affine_17(t, tmp);
  124153. XMEMCPY(s1->z, p521_norm_mod, sizeof(p521_norm_mod));
  124154. s1->infinity = 0;
  124155. XMEMCPY(s2->z, p521_norm_mod, sizeof(p521_norm_mod));
  124156. s2->infinity = 0;
  124157. /* table[0] = {0, 0, infinity} */
  124158. XMEMSET(&table[0], 0, sizeof(sp_table_entry_521));
  124159. /* table[1] = Affine version of 'a' in Montgomery form */
  124160. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  124161. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  124162. for (i=1; i<4; i++) {
  124163. sp_521_proj_point_dbl_n_17(t, 131, tmp);
  124164. sp_521_proj_to_affine_17(t, tmp);
  124165. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  124166. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  124167. }
  124168. for (i=1; i<4; i++) {
  124169. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  124170. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  124171. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  124172. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  124173. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  124174. sp_521_proj_point_add_qz1_17(t, s1, s2, tmp);
  124175. sp_521_proj_to_affine_17(t, tmp);
  124176. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  124177. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  124178. }
  124179. }
  124180. }
  124181. #ifdef WOLFSSL_SP_SMALL_STACK
  124182. if (t != NULL)
  124183. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  124184. #endif
  124185. return err;
  124186. }
  124187. #endif /* FP_ECC */
  124188. #ifndef WC_NO_CACHE_RESISTANT
  124189. /* Touch each possible entry that could be being copied.
  124190. *
  124191. * r Point to copy into.
  124192. * table Table - start of the entries to access
  124193. * idx Index of entry to retrieve.
  124194. */
  124195. static void sp_521_get_entry_16_17(sp_point_521* r,
  124196. const sp_table_entry_521* table, int idx)
  124197. {
  124198. int i;
  124199. sp_digit mask;
  124200. r->x[0] = 0;
  124201. r->x[1] = 0;
  124202. r->x[2] = 0;
  124203. r->x[3] = 0;
  124204. r->x[4] = 0;
  124205. r->x[5] = 0;
  124206. r->x[6] = 0;
  124207. r->x[7] = 0;
  124208. r->x[8] = 0;
  124209. r->x[9] = 0;
  124210. r->x[10] = 0;
  124211. r->x[11] = 0;
  124212. r->x[12] = 0;
  124213. r->x[13] = 0;
  124214. r->x[14] = 0;
  124215. r->x[15] = 0;
  124216. r->x[16] = 0;
  124217. r->y[0] = 0;
  124218. r->y[1] = 0;
  124219. r->y[2] = 0;
  124220. r->y[3] = 0;
  124221. r->y[4] = 0;
  124222. r->y[5] = 0;
  124223. r->y[6] = 0;
  124224. r->y[7] = 0;
  124225. r->y[8] = 0;
  124226. r->y[9] = 0;
  124227. r->y[10] = 0;
  124228. r->y[11] = 0;
  124229. r->y[12] = 0;
  124230. r->y[13] = 0;
  124231. r->y[14] = 0;
  124232. r->y[15] = 0;
  124233. r->y[16] = 0;
  124234. for (i = 1; i < 16; i++) {
  124235. mask = 0 - (i == idx);
  124236. r->x[0] |= mask & table[i].x[0];
  124237. r->x[1] |= mask & table[i].x[1];
  124238. r->x[2] |= mask & table[i].x[2];
  124239. r->x[3] |= mask & table[i].x[3];
  124240. r->x[4] |= mask & table[i].x[4];
  124241. r->x[5] |= mask & table[i].x[5];
  124242. r->x[6] |= mask & table[i].x[6];
  124243. r->x[7] |= mask & table[i].x[7];
  124244. r->x[8] |= mask & table[i].x[8];
  124245. r->x[9] |= mask & table[i].x[9];
  124246. r->x[10] |= mask & table[i].x[10];
  124247. r->x[11] |= mask & table[i].x[11];
  124248. r->x[12] |= mask & table[i].x[12];
  124249. r->x[13] |= mask & table[i].x[13];
  124250. r->x[14] |= mask & table[i].x[14];
  124251. r->x[15] |= mask & table[i].x[15];
  124252. r->x[16] |= mask & table[i].x[16];
  124253. r->y[0] |= mask & table[i].y[0];
  124254. r->y[1] |= mask & table[i].y[1];
  124255. r->y[2] |= mask & table[i].y[2];
  124256. r->y[3] |= mask & table[i].y[3];
  124257. r->y[4] |= mask & table[i].y[4];
  124258. r->y[5] |= mask & table[i].y[5];
  124259. r->y[6] |= mask & table[i].y[6];
  124260. r->y[7] |= mask & table[i].y[7];
  124261. r->y[8] |= mask & table[i].y[8];
  124262. r->y[9] |= mask & table[i].y[9];
  124263. r->y[10] |= mask & table[i].y[10];
  124264. r->y[11] |= mask & table[i].y[11];
  124265. r->y[12] |= mask & table[i].y[12];
  124266. r->y[13] |= mask & table[i].y[13];
  124267. r->y[14] |= mask & table[i].y[14];
  124268. r->y[15] |= mask & table[i].y[15];
  124269. r->y[16] |= mask & table[i].y[16];
  124270. }
  124271. }
  124272. #endif /* !WC_NO_CACHE_RESISTANT */
  124273. /* Multiply the point by the scalar and return the result.
  124274. * If map is true then convert result to affine coordinates.
  124275. *
  124276. * Stripe implementation.
  124277. * Pre-generated: 2^0, 2^130, ...
  124278. * Pre-generated: products of all combinations of above.
  124279. * 4 doubles and adds (with qz=1)
  124280. *
  124281. * r Resulting point.
  124282. * k Scalar to multiply by.
  124283. * table Pre-computed table.
  124284. * map Indicates whether to convert result to affine.
  124285. * ct Constant time required.
  124286. * heap Heap to use for allocation.
  124287. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  124288. */
  124289. static int sp_521_ecc_mulmod_stripe_17(sp_point_521* r, const sp_point_521* g,
  124290. const sp_table_entry_521* table, const sp_digit* k, int map,
  124291. int ct, void* heap)
  124292. {
  124293. #ifdef WOLFSSL_SP_SMALL_STACK
  124294. sp_point_521* rt = NULL;
  124295. sp_digit* t = NULL;
  124296. #else
  124297. sp_point_521 rt[2];
  124298. sp_digit t[2 * 17 * 6];
  124299. #endif
  124300. sp_point_521* p = NULL;
  124301. int i;
  124302. int j;
  124303. int y;
  124304. int x;
  124305. int err = MP_OKAY;
  124306. (void)g;
  124307. /* Constant time used for cache attack resistance implementation. */
  124308. (void)ct;
  124309. (void)heap;
  124310. #ifdef WOLFSSL_SP_SMALL_STACK
  124311. rt = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  124312. DYNAMIC_TYPE_ECC);
  124313. if (rt == NULL)
  124314. err = MEMORY_E;
  124315. if (err == MP_OKAY) {
  124316. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  124317. DYNAMIC_TYPE_ECC);
  124318. if (t == NULL)
  124319. err = MEMORY_E;
  124320. }
  124321. #endif
  124322. if (err == MP_OKAY) {
  124323. p = rt + 1;
  124324. XMEMCPY(p->z, p521_norm_mod, sizeof(p521_norm_mod));
  124325. XMEMCPY(rt->z, p521_norm_mod, sizeof(p521_norm_mod));
  124326. y = 0;
  124327. x = 130;
  124328. for (j=0; j<4 && x<521; j++) {
  124329. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  124330. x += 131;
  124331. }
  124332. #ifndef WC_NO_CACHE_RESISTANT
  124333. if (ct) {
  124334. sp_521_get_entry_16_17(rt, table, y);
  124335. } else
  124336. #endif
  124337. {
  124338. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  124339. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  124340. }
  124341. rt->infinity = !y;
  124342. for (i=129; i>=0; i--) {
  124343. y = 0;
  124344. x = i;
  124345. for (j=0; j<4 && x<521; j++) {
  124346. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  124347. x += 131;
  124348. }
  124349. sp_521_proj_point_dbl_17(rt, rt, t);
  124350. #ifndef WC_NO_CACHE_RESISTANT
  124351. if (ct) {
  124352. sp_521_get_entry_16_17(p, table, y);
  124353. }
  124354. else
  124355. #endif
  124356. {
  124357. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  124358. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  124359. }
  124360. p->infinity = !y;
  124361. sp_521_proj_point_add_qz1_17(rt, rt, p, t);
  124362. }
  124363. if (map != 0) {
  124364. sp_521_map_17(r, rt, t);
  124365. }
  124366. else {
  124367. XMEMCPY(r, rt, sizeof(sp_point_521));
  124368. }
  124369. }
  124370. #ifdef WOLFSSL_SP_SMALL_STACK
  124371. if (t != NULL)
  124372. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  124373. if (rt != NULL)
  124374. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  124375. #endif
  124376. return err;
  124377. }
  124378. #ifdef FP_ECC
  124379. #ifndef FP_ENTRIES
  124380. #define FP_ENTRIES 16
  124381. #endif
  124382. /* Cache entry - holds precomputation tables for a point. */
  124383. typedef struct sp_cache_521_t {
  124384. /* X ordinate of point that table was generated from. */
  124385. sp_digit x[17];
  124386. /* Y ordinate of point that table was generated from. */
  124387. sp_digit y[17];
  124388. /* Precomputation table for point. */
  124389. sp_table_entry_521 table[16];
  124390. /* Count of entries in table. */
  124391. uint32_t cnt;
  124392. /* Point and table set in entry. */
  124393. int set;
  124394. } sp_cache_521_t;
  124395. /* Cache of tables. */
  124396. static THREAD_LS_T sp_cache_521_t sp_cache_521[FP_ENTRIES];
  124397. /* Index of last entry in cache. */
  124398. static THREAD_LS_T int sp_cache_521_last = -1;
  124399. /* Cache has been initialized. */
  124400. static THREAD_LS_T int sp_cache_521_inited = 0;
  124401. #ifndef HAVE_THREAD_LS
  124402. static volatile int initCacheMutex_521 = 0;
  124403. static wolfSSL_Mutex sp_cache_521_lock;
  124404. #endif
  124405. /* Get the cache entry for the point.
  124406. *
  124407. * g [in] Point scalar multiplying.
  124408. * cache [out] Cache table to use.
  124409. */
  124410. static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache)
  124411. {
  124412. int i;
  124413. int j;
  124414. uint32_t least;
  124415. if (sp_cache_521_inited == 0) {
  124416. for (i=0; i<FP_ENTRIES; i++) {
  124417. sp_cache_521[i].set = 0;
  124418. }
  124419. sp_cache_521_inited = 1;
  124420. }
  124421. /* Compare point with those in cache. */
  124422. for (i=0; i<FP_ENTRIES; i++) {
  124423. if (!sp_cache_521[i].set)
  124424. continue;
  124425. if (sp_521_cmp_equal_17(g->x, sp_cache_521[i].x) &
  124426. sp_521_cmp_equal_17(g->y, sp_cache_521[i].y)) {
  124427. sp_cache_521[i].cnt++;
  124428. break;
  124429. }
  124430. }
  124431. /* No match. */
  124432. if (i == FP_ENTRIES) {
  124433. /* Find empty entry. */
  124434. i = (sp_cache_521_last + 1) % FP_ENTRIES;
  124435. for (; i != sp_cache_521_last; i=(i+1)%FP_ENTRIES) {
  124436. if (!sp_cache_521[i].set) {
  124437. break;
  124438. }
  124439. }
  124440. /* Evict least used. */
  124441. if (i == sp_cache_521_last) {
  124442. least = sp_cache_521[0].cnt;
  124443. for (j=1; j<FP_ENTRIES; j++) {
  124444. if (sp_cache_521[j].cnt < least) {
  124445. i = j;
  124446. least = sp_cache_521[i].cnt;
  124447. }
  124448. }
  124449. }
  124450. XMEMCPY(sp_cache_521[i].x, g->x, sizeof(sp_cache_521[i].x));
  124451. XMEMCPY(sp_cache_521[i].y, g->y, sizeof(sp_cache_521[i].y));
  124452. sp_cache_521[i].set = 1;
  124453. sp_cache_521[i].cnt = 1;
  124454. }
  124455. *cache = &sp_cache_521[i];
  124456. sp_cache_521_last = i;
  124457. }
  124458. #endif /* FP_ECC */
  124459. /* Multiply the base point of P521 by the scalar and return the result.
  124460. * If map is true then convert result to affine coordinates.
  124461. *
  124462. * r Resulting point.
  124463. * g Point to multiply.
  124464. * k Scalar to multiply by.
  124465. * map Indicates whether to convert result to affine.
  124466. * ct Constant time required.
  124467. * heap Heap to use for allocation.
  124468. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  124469. */
  124470. static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g,
  124471. const sp_digit* k, int map, int ct, void* heap)
  124472. {
  124473. #ifndef FP_ECC
  124474. return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  124475. #else
  124476. #ifdef WOLFSSL_SP_SMALL_STACK
  124477. sp_digit* tmp;
  124478. #else
  124479. sp_digit tmp[2 * 17 * 6];
  124480. #endif
  124481. sp_cache_521_t* cache;
  124482. int err = MP_OKAY;
  124483. #ifdef WOLFSSL_SP_SMALL_STACK
  124484. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap, DYNAMIC_TYPE_ECC);
  124485. if (tmp == NULL) {
  124486. err = MEMORY_E;
  124487. }
  124488. #endif
  124489. #ifndef HAVE_THREAD_LS
  124490. if (err == MP_OKAY) {
  124491. if (initCacheMutex_521 == 0) {
  124492. wc_InitMutex(&sp_cache_521_lock);
  124493. initCacheMutex_521 = 1;
  124494. }
  124495. if (wc_LockMutex(&sp_cache_521_lock) != 0) {
  124496. err = BAD_MUTEX_E;
  124497. }
  124498. }
  124499. #endif /* HAVE_THREAD_LS */
  124500. if (err == MP_OKAY) {
  124501. sp_ecc_get_cache_521(g, &cache);
  124502. if (cache->cnt == 2)
  124503. sp_521_gen_stripe_table_17(g, cache->table, tmp, heap);
  124504. #ifndef HAVE_THREAD_LS
  124505. wc_UnLockMutex(&sp_cache_521_lock);
  124506. #endif /* HAVE_THREAD_LS */
  124507. if (cache->cnt < 2) {
  124508. err = sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  124509. }
  124510. else {
  124511. err = sp_521_ecc_mulmod_stripe_17(r, g, cache->table, k,
  124512. map, ct, heap);
  124513. }
  124514. }
  124515. #ifdef WOLFSSL_SP_SMALL_STACK
  124516. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  124517. #endif
  124518. return err;
  124519. #endif
  124520. }
  124521. #else
  124522. #ifdef FP_ECC
  124523. /* Generate the pre-computed table of points for the base point.
  124524. *
  124525. * width = 8
  124526. * 256 entries
  124527. * 65 bits between
  124528. *
  124529. * a The base point.
  124530. * table Place to store generated point data.
  124531. * tmp Temporary data.
  124532. * heap Heap to use for allocation.
  124533. */
  124534. static int sp_521_gen_stripe_table_17(const sp_point_521* a,
  124535. sp_table_entry_521* table, sp_digit* tmp, void* heap)
  124536. {
  124537. #ifdef WOLFSSL_SP_SMALL_STACK
  124538. sp_point_521* t = NULL;
  124539. #else
  124540. sp_point_521 t[3];
  124541. #endif
  124542. sp_point_521* s1 = NULL;
  124543. sp_point_521* s2 = NULL;
  124544. int i;
  124545. int j;
  124546. int err = MP_OKAY;
  124547. (void)heap;
  124548. #ifdef WOLFSSL_SP_SMALL_STACK
  124549. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 3, heap,
  124550. DYNAMIC_TYPE_ECC);
  124551. if (t == NULL)
  124552. err = MEMORY_E;
  124553. #endif
  124554. if (err == MP_OKAY) {
  124555. s1 = t + 1;
  124556. s2 = t + 2;
  124557. err = sp_521_mod_mul_norm_17(t->x, a->x, p521_mod);
  124558. }
  124559. if (err == MP_OKAY) {
  124560. err = sp_521_mod_mul_norm_17(t->y, a->y, p521_mod);
  124561. }
  124562. if (err == MP_OKAY) {
  124563. err = sp_521_mod_mul_norm_17(t->z, a->z, p521_mod);
  124564. }
  124565. if (err == MP_OKAY) {
  124566. t->infinity = 0;
  124567. sp_521_proj_to_affine_17(t, tmp);
  124568. XMEMCPY(s1->z, p521_norm_mod, sizeof(p521_norm_mod));
  124569. s1->infinity = 0;
  124570. XMEMCPY(s2->z, p521_norm_mod, sizeof(p521_norm_mod));
  124571. s2->infinity = 0;
  124572. /* table[0] = {0, 0, infinity} */
  124573. XMEMSET(&table[0], 0, sizeof(sp_table_entry_521));
  124574. /* table[1] = Affine version of 'a' in Montgomery form */
  124575. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  124576. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  124577. for (i=1; i<8; i++) {
  124578. sp_521_proj_point_dbl_n_17(t, 66, tmp);
  124579. sp_521_proj_to_affine_17(t, tmp);
  124580. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  124581. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  124582. }
  124583. for (i=1; i<8; i++) {
  124584. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  124585. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  124586. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  124587. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  124588. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  124589. sp_521_proj_point_add_qz1_17(t, s1, s2, tmp);
  124590. sp_521_proj_to_affine_17(t, tmp);
  124591. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  124592. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  124593. }
  124594. }
  124595. }
  124596. #ifdef WOLFSSL_SP_SMALL_STACK
  124597. if (t != NULL)
  124598. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  124599. #endif
  124600. return err;
  124601. }
  124602. #endif /* FP_ECC */
  124603. #ifndef WC_NO_CACHE_RESISTANT
  124604. /* Touch each possible entry that could be being copied.
  124605. *
  124606. * r Point to copy into.
  124607. * table Table - start of the entries to access
  124608. * idx Index of entry to retrieve.
  124609. */
  124610. static void sp_521_get_entry_256_17(sp_point_521* r,
  124611. const sp_table_entry_521* table, int idx)
  124612. {
  124613. int i;
  124614. sp_digit mask;
  124615. r->x[0] = 0;
  124616. r->x[1] = 0;
  124617. r->x[2] = 0;
  124618. r->x[3] = 0;
  124619. r->x[4] = 0;
  124620. r->x[5] = 0;
  124621. r->x[6] = 0;
  124622. r->x[7] = 0;
  124623. r->x[8] = 0;
  124624. r->x[9] = 0;
  124625. r->x[10] = 0;
  124626. r->x[11] = 0;
  124627. r->x[12] = 0;
  124628. r->x[13] = 0;
  124629. r->x[14] = 0;
  124630. r->x[15] = 0;
  124631. r->x[16] = 0;
  124632. r->y[0] = 0;
  124633. r->y[1] = 0;
  124634. r->y[2] = 0;
  124635. r->y[3] = 0;
  124636. r->y[4] = 0;
  124637. r->y[5] = 0;
  124638. r->y[6] = 0;
  124639. r->y[7] = 0;
  124640. r->y[8] = 0;
  124641. r->y[9] = 0;
  124642. r->y[10] = 0;
  124643. r->y[11] = 0;
  124644. r->y[12] = 0;
  124645. r->y[13] = 0;
  124646. r->y[14] = 0;
  124647. r->y[15] = 0;
  124648. r->y[16] = 0;
  124649. for (i = 1; i < 256; i++) {
  124650. mask = 0 - (i == idx);
  124651. r->x[0] |= mask & table[i].x[0];
  124652. r->x[1] |= mask & table[i].x[1];
  124653. r->x[2] |= mask & table[i].x[2];
  124654. r->x[3] |= mask & table[i].x[3];
  124655. r->x[4] |= mask & table[i].x[4];
  124656. r->x[5] |= mask & table[i].x[5];
  124657. r->x[6] |= mask & table[i].x[6];
  124658. r->x[7] |= mask & table[i].x[7];
  124659. r->x[8] |= mask & table[i].x[8];
  124660. r->x[9] |= mask & table[i].x[9];
  124661. r->x[10] |= mask & table[i].x[10];
  124662. r->x[11] |= mask & table[i].x[11];
  124663. r->x[12] |= mask & table[i].x[12];
  124664. r->x[13] |= mask & table[i].x[13];
  124665. r->x[14] |= mask & table[i].x[14];
  124666. r->x[15] |= mask & table[i].x[15];
  124667. r->x[16] |= mask & table[i].x[16];
  124668. r->y[0] |= mask & table[i].y[0];
  124669. r->y[1] |= mask & table[i].y[1];
  124670. r->y[2] |= mask & table[i].y[2];
  124671. r->y[3] |= mask & table[i].y[3];
  124672. r->y[4] |= mask & table[i].y[4];
  124673. r->y[5] |= mask & table[i].y[5];
  124674. r->y[6] |= mask & table[i].y[6];
  124675. r->y[7] |= mask & table[i].y[7];
  124676. r->y[8] |= mask & table[i].y[8];
  124677. r->y[9] |= mask & table[i].y[9];
  124678. r->y[10] |= mask & table[i].y[10];
  124679. r->y[11] |= mask & table[i].y[11];
  124680. r->y[12] |= mask & table[i].y[12];
  124681. r->y[13] |= mask & table[i].y[13];
  124682. r->y[14] |= mask & table[i].y[14];
  124683. r->y[15] |= mask & table[i].y[15];
  124684. r->y[16] |= mask & table[i].y[16];
  124685. }
  124686. }
  124687. #endif /* !WC_NO_CACHE_RESISTANT */
  124688. /* Multiply the point by the scalar and return the result.
  124689. * If map is true then convert result to affine coordinates.
  124690. *
  124691. * Stripe implementation.
  124692. * Pre-generated: 2^0, 2^65, ...
  124693. * Pre-generated: products of all combinations of above.
  124694. * 8 doubles and adds (with qz=1)
  124695. *
  124696. * r Resulting point.
  124697. * k Scalar to multiply by.
  124698. * table Pre-computed table.
  124699. * map Indicates whether to convert result to affine.
  124700. * ct Constant time required.
  124701. * heap Heap to use for allocation.
  124702. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  124703. */
  124704. static int sp_521_ecc_mulmod_stripe_17(sp_point_521* r, const sp_point_521* g,
  124705. const sp_table_entry_521* table, const sp_digit* k, int map,
  124706. int ct, void* heap)
  124707. {
  124708. #ifdef WOLFSSL_SP_SMALL_STACK
  124709. sp_point_521* rt = NULL;
  124710. sp_digit* t = NULL;
  124711. #else
  124712. sp_point_521 rt[2];
  124713. sp_digit t[2 * 17 * 6];
  124714. #endif
  124715. sp_point_521* p = NULL;
  124716. int i;
  124717. int j;
  124718. int y;
  124719. int x;
  124720. int err = MP_OKAY;
  124721. (void)g;
  124722. /* Constant time used for cache attack resistance implementation. */
  124723. (void)ct;
  124724. (void)heap;
  124725. #ifdef WOLFSSL_SP_SMALL_STACK
  124726. rt = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  124727. DYNAMIC_TYPE_ECC);
  124728. if (rt == NULL)
  124729. err = MEMORY_E;
  124730. if (err == MP_OKAY) {
  124731. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  124732. DYNAMIC_TYPE_ECC);
  124733. if (t == NULL)
  124734. err = MEMORY_E;
  124735. }
  124736. #endif
  124737. if (err == MP_OKAY) {
  124738. p = rt + 1;
  124739. XMEMCPY(p->z, p521_norm_mod, sizeof(p521_norm_mod));
  124740. XMEMCPY(rt->z, p521_norm_mod, sizeof(p521_norm_mod));
  124741. y = 0;
  124742. x = 65;
  124743. for (j=0; j<8 && x<521; j++) {
  124744. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  124745. x += 66;
  124746. }
  124747. #ifndef WC_NO_CACHE_RESISTANT
  124748. if (ct) {
  124749. sp_521_get_entry_256_17(rt, table, y);
  124750. } else
  124751. #endif
  124752. {
  124753. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  124754. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  124755. }
  124756. rt->infinity = !y;
  124757. for (i=64; i>=0; i--) {
  124758. y = 0;
  124759. x = i;
  124760. for (j=0; j<8 && x<521; j++) {
  124761. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  124762. x += 66;
  124763. }
  124764. sp_521_proj_point_dbl_17(rt, rt, t);
  124765. #ifndef WC_NO_CACHE_RESISTANT
  124766. if (ct) {
  124767. sp_521_get_entry_256_17(p, table, y);
  124768. }
  124769. else
  124770. #endif
  124771. {
  124772. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  124773. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  124774. }
  124775. p->infinity = !y;
  124776. sp_521_proj_point_add_qz1_17(rt, rt, p, t);
  124777. }
  124778. if (map != 0) {
  124779. sp_521_map_17(r, rt, t);
  124780. }
  124781. else {
  124782. XMEMCPY(r, rt, sizeof(sp_point_521));
  124783. }
  124784. }
  124785. #ifdef WOLFSSL_SP_SMALL_STACK
  124786. if (t != NULL)
  124787. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  124788. if (rt != NULL)
  124789. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  124790. #endif
  124791. return err;
  124792. }
  124793. #ifdef FP_ECC
  124794. #ifndef FP_ENTRIES
  124795. #define FP_ENTRIES 16
  124796. #endif
  124797. /* Cache entry - holds precomputation tables for a point. */
  124798. typedef struct sp_cache_521_t {
  124799. /* X ordinate of point that table was generated from. */
  124800. sp_digit x[17];
  124801. /* Y ordinate of point that table was generated from. */
  124802. sp_digit y[17];
  124803. /* Precomputation table for point. */
  124804. sp_table_entry_521 table[256];
  124805. /* Count of entries in table. */
  124806. uint32_t cnt;
  124807. /* Point and table set in entry. */
  124808. int set;
  124809. } sp_cache_521_t;
  124810. /* Cache of tables. */
  124811. static THREAD_LS_T sp_cache_521_t sp_cache_521[FP_ENTRIES];
  124812. /* Index of last entry in cache. */
  124813. static THREAD_LS_T int sp_cache_521_last = -1;
  124814. /* Cache has been initialized. */
  124815. static THREAD_LS_T int sp_cache_521_inited = 0;
  124816. #ifndef HAVE_THREAD_LS
  124817. static volatile int initCacheMutex_521 = 0;
  124818. static wolfSSL_Mutex sp_cache_521_lock;
  124819. #endif
  124820. /* Get the cache entry for the point.
  124821. *
  124822. * g [in] Point scalar multiplying.
  124823. * cache [out] Cache table to use.
  124824. */
  124825. static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache)
  124826. {
  124827. int i;
  124828. int j;
  124829. uint32_t least;
  124830. if (sp_cache_521_inited == 0) {
  124831. for (i=0; i<FP_ENTRIES; i++) {
  124832. sp_cache_521[i].set = 0;
  124833. }
  124834. sp_cache_521_inited = 1;
  124835. }
  124836. /* Compare point with those in cache. */
  124837. for (i=0; i<FP_ENTRIES; i++) {
  124838. if (!sp_cache_521[i].set)
  124839. continue;
  124840. if (sp_521_cmp_equal_17(g->x, sp_cache_521[i].x) &
  124841. sp_521_cmp_equal_17(g->y, sp_cache_521[i].y)) {
  124842. sp_cache_521[i].cnt++;
  124843. break;
  124844. }
  124845. }
  124846. /* No match. */
  124847. if (i == FP_ENTRIES) {
  124848. /* Find empty entry. */
  124849. i = (sp_cache_521_last + 1) % FP_ENTRIES;
  124850. for (; i != sp_cache_521_last; i=(i+1)%FP_ENTRIES) {
  124851. if (!sp_cache_521[i].set) {
  124852. break;
  124853. }
  124854. }
  124855. /* Evict least used. */
  124856. if (i == sp_cache_521_last) {
  124857. least = sp_cache_521[0].cnt;
  124858. for (j=1; j<FP_ENTRIES; j++) {
  124859. if (sp_cache_521[j].cnt < least) {
  124860. i = j;
  124861. least = sp_cache_521[i].cnt;
  124862. }
  124863. }
  124864. }
  124865. XMEMCPY(sp_cache_521[i].x, g->x, sizeof(sp_cache_521[i].x));
  124866. XMEMCPY(sp_cache_521[i].y, g->y, sizeof(sp_cache_521[i].y));
  124867. sp_cache_521[i].set = 1;
  124868. sp_cache_521[i].cnt = 1;
  124869. }
  124870. *cache = &sp_cache_521[i];
  124871. sp_cache_521_last = i;
  124872. }
  124873. #endif /* FP_ECC */
  124874. /* Multiply the base point of P521 by the scalar and return the result.
  124875. * If map is true then convert result to affine coordinates.
  124876. *
  124877. * r Resulting point.
  124878. * g Point to multiply.
  124879. * k Scalar to multiply by.
  124880. * map Indicates whether to convert result to affine.
  124881. * ct Constant time required.
  124882. * heap Heap to use for allocation.
  124883. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  124884. */
  124885. static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g,
  124886. const sp_digit* k, int map, int ct, void* heap)
  124887. {
  124888. #ifndef FP_ECC
  124889. return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  124890. #else
  124891. #ifdef WOLFSSL_SP_SMALL_STACK
  124892. sp_digit* tmp;
  124893. #else
  124894. sp_digit tmp[2 * 17 * 6];
  124895. #endif
  124896. sp_cache_521_t* cache;
  124897. int err = MP_OKAY;
  124898. #ifdef WOLFSSL_SP_SMALL_STACK
  124899. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap, DYNAMIC_TYPE_ECC);
  124900. if (tmp == NULL) {
  124901. err = MEMORY_E;
  124902. }
  124903. #endif
  124904. #ifndef HAVE_THREAD_LS
  124905. if (err == MP_OKAY) {
  124906. if (initCacheMutex_521 == 0) {
  124907. wc_InitMutex(&sp_cache_521_lock);
  124908. initCacheMutex_521 = 1;
  124909. }
  124910. if (wc_LockMutex(&sp_cache_521_lock) != 0) {
  124911. err = BAD_MUTEX_E;
  124912. }
  124913. }
  124914. #endif /* HAVE_THREAD_LS */
  124915. if (err == MP_OKAY) {
  124916. sp_ecc_get_cache_521(g, &cache);
  124917. if (cache->cnt == 2)
  124918. sp_521_gen_stripe_table_17(g, cache->table, tmp, heap);
  124919. #ifndef HAVE_THREAD_LS
  124920. wc_UnLockMutex(&sp_cache_521_lock);
  124921. #endif /* HAVE_THREAD_LS */
  124922. if (cache->cnt < 2) {
  124923. err = sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  124924. }
  124925. else {
  124926. err = sp_521_ecc_mulmod_stripe_17(r, g, cache->table, k,
  124927. map, ct, heap);
  124928. }
  124929. }
  124930. #ifdef WOLFSSL_SP_SMALL_STACK
  124931. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  124932. #endif
  124933. return err;
  124934. #endif
  124935. }
  124936. #endif /* WOLFSSL_SP_SMALL */
  124937. /* Multiply the point by the scalar and return the result.
  124938. * If map is true then convert result to affine coordinates.
  124939. *
  124940. * km Scalar to multiply by.
  124941. * p Point to multiply.
  124942. * r Resulting point.
  124943. * map Indicates whether to convert result to affine.
  124944. * heap Heap to use for allocation.
  124945. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  124946. */
  124947. int sp_ecc_mulmod_521(const mp_int* km, const ecc_point* gm, ecc_point* r,
  124948. int map, void* heap)
  124949. {
  124950. #ifdef WOLFSSL_SP_SMALL_STACK
  124951. sp_point_521* point = NULL;
  124952. sp_digit* k = NULL;
  124953. #else
  124954. sp_point_521 point[1];
  124955. sp_digit k[17];
  124956. #endif
  124957. int err = MP_OKAY;
  124958. #ifdef WOLFSSL_SP_SMALL_STACK
  124959. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  124960. DYNAMIC_TYPE_ECC);
  124961. if (point == NULL)
  124962. err = MEMORY_E;
  124963. if (err == MP_OKAY) {
  124964. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  124965. DYNAMIC_TYPE_ECC);
  124966. if (k == NULL)
  124967. err = MEMORY_E;
  124968. }
  124969. #endif
  124970. if (err == MP_OKAY) {
  124971. sp_521_from_mp(k, 17, km);
  124972. sp_521_point_from_ecc_point_17(point, gm);
  124973. err = sp_521_ecc_mulmod_17(point, point, k, map, 1, heap);
  124974. }
  124975. if (err == MP_OKAY) {
  124976. err = sp_521_point_to_ecc_point_17(point, r);
  124977. }
  124978. #ifdef WOLFSSL_SP_SMALL_STACK
  124979. if (k != NULL)
  124980. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  124981. if (point != NULL)
  124982. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  124983. #endif
  124984. return err;
  124985. }
  124986. /* Multiply the point by the scalar, add point a and return the result.
  124987. * If map is true then convert result to affine coordinates.
  124988. *
  124989. * km Scalar to multiply by.
  124990. * p Point to multiply.
  124991. * am Point to add to scalar multiply result.
  124992. * inMont Point to add is in montgomery form.
  124993. * r Resulting point.
  124994. * map Indicates whether to convert result to affine.
  124995. * heap Heap to use for allocation.
  124996. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  124997. */
  124998. int sp_ecc_mulmod_add_521(const mp_int* km, const ecc_point* gm,
  124999. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  125000. {
  125001. #ifdef WOLFSSL_SP_SMALL_STACK
  125002. sp_point_521* point = NULL;
  125003. sp_digit* k = NULL;
  125004. #else
  125005. sp_point_521 point[2];
  125006. sp_digit k[17 + 17 * 2 * 6];
  125007. #endif
  125008. sp_point_521* addP = NULL;
  125009. sp_digit* tmp = NULL;
  125010. int err = MP_OKAY;
  125011. #ifdef WOLFSSL_SP_SMALL_STACK
  125012. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  125013. DYNAMIC_TYPE_ECC);
  125014. if (point == NULL)
  125015. err = MEMORY_E;
  125016. if (err == MP_OKAY) {
  125017. k = (sp_digit*)XMALLOC(
  125018. sizeof(sp_digit) * (17 + 17 * 2 * 6), heap,
  125019. DYNAMIC_TYPE_ECC);
  125020. if (k == NULL)
  125021. err = MEMORY_E;
  125022. }
  125023. #endif
  125024. if (err == MP_OKAY) {
  125025. addP = point + 1;
  125026. tmp = k + 17;
  125027. sp_521_from_mp(k, 17, km);
  125028. sp_521_point_from_ecc_point_17(point, gm);
  125029. sp_521_point_from_ecc_point_17(addP, am);
  125030. }
  125031. if ((err == MP_OKAY) && (!inMont)) {
  125032. err = sp_521_mod_mul_norm_17(addP->x, addP->x, p521_mod);
  125033. }
  125034. if ((err == MP_OKAY) && (!inMont)) {
  125035. err = sp_521_mod_mul_norm_17(addP->y, addP->y, p521_mod);
  125036. }
  125037. if ((err == MP_OKAY) && (!inMont)) {
  125038. err = sp_521_mod_mul_norm_17(addP->z, addP->z, p521_mod);
  125039. }
  125040. if (err == MP_OKAY) {
  125041. err = sp_521_ecc_mulmod_17(point, point, k, 0, 0, heap);
  125042. }
  125043. if (err == MP_OKAY) {
  125044. sp_521_proj_point_add_17(point, point, addP, tmp);
  125045. if (map) {
  125046. sp_521_map_17(point, point, tmp);
  125047. }
  125048. err = sp_521_point_to_ecc_point_17(point, r);
  125049. }
  125050. #ifdef WOLFSSL_SP_SMALL_STACK
  125051. if (k != NULL)
  125052. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  125053. if (point != NULL)
  125054. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  125055. #endif
  125056. return err;
  125057. }
  125058. #ifdef WOLFSSL_SP_SMALL
  125059. /* Striping precomputation table.
  125060. * 4 points combined into a table of 16 points.
  125061. * Distance of 131 between points.
  125062. */
  125063. static const sp_table_entry_521 p521_table[16] = {
  125064. /* 0 */
  125065. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  125066. 0x00, 0x00, 0x00, 0x00, 0x00 },
  125067. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  125068. 0x00, 0x00, 0x00, 0x00, 0x00 } },
  125069. /* 1 */
  125070. { { 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  125071. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  125072. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6 },
  125073. { 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  125074. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  125075. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118 } },
  125076. /* 2 */
  125077. { { 0x66fd07ca,0x1036eb9b,0x6b7fb490,0x6ca52cc1,0xd3e0c270,0x512e973e,
  125078. 0x73d92d11,0x889980bf,0xa4005eea,0x38b4cfe4,0x8ceb4313,0xb6f992cc,
  125079. 0x6daf7c23,0xd0ac2f8d,0xe32a93cb,0x1ccfbf17,0x000000c2 },
  125080. { 0x2f508cca,0x7bd9d6f1,0x595a72af,0xe82d7171,0x97512873,0x25d02976,
  125081. 0x8cf39fbc,0xefc1de8b,0x9a1237f4,0x25e6b77f,0xd4d98b5d,0x9f3b73e7,
  125082. 0xeccb07fe,0xe1fda62b,0x625350cf,0xdb813b03,0x00000014 } },
  125083. /* 3 */
  125084. { { 0x9b27bd61,0x415a1c9b,0x606854d6,0x74522753,0x92e73538,0x9e331ef4,
  125085. 0x817e7a6d,0x0b3dba85,0x49ac273b,0x55c4bd53,0xfcb5417f,0xad42c78d,
  125086. 0x92e08d38,0x528998b9,0xcc1914cc,0x14c2fff6,0x000000c1 },
  125087. { 0x767e9645,0x35b26fb0,0xc5e5a659,0x162b512f,0xcc47fbb8,0xa6e03696,
  125088. 0x0a29a69b,0x732db065,0xd56bdf5d,0x058a74ed,0x25c858d9,0x4b7b60a0,
  125089. 0xbd43373d,0x17f8a6d4,0xedf610b4,0x7b968f51,0x0000011f } },
  125090. /* 4 */
  125091. { { 0x1bc0fa77,0x5f56b5a4,0x64fd36f5,0x6cdd6bb5,0x8a5b7c7f,0xd0ac68b5,
  125092. 0x09919ef9,0x4a92d9bf,0x71c3c520,0xc305e12b,0xdb699aee,0x554a9d1c,
  125093. 0x61f54643,0x7fde0077,0x479115ce,0x99c13124,0x00000039 },
  125094. { 0xc271ac2d,0x25f890e1,0x94b370ac,0x1353ccd3,0x744d4011,0xc7b5adf6,
  125095. 0xbe378127,0x9ccd7687,0x06c4e3cd,0xa8489b5c,0x305505f9,0x1945580a,
  125096. 0x4ab3b12b,0x07190a20,0x1534ea4d,0x0ff53eb1,0x00000159 } },
  125097. /* 5 */
  125098. { { 0x91798548,0x877d4edd,0x031d657a,0xc43c7b25,0xfab18a04,0x47603671,
  125099. 0xf670b476,0x7e39e7f2,0xb02fcc03,0xf7b76431,0x877f46f5,0x7c5662f3,
  125100. 0x1c8b0c61,0x5bf8327e,0x4a8be322,0xe9cdb353,0x000001ae },
  125101. { 0x9d264420,0xa2d7092e,0x533ff3db,0x1f970352,0x99b5b52e,0x31dd232b,
  125102. 0x850f45e9,0x8a9ce16b,0xc3011849,0x01c99023,0xc8e9301e,0x4bc30989,
  125103. 0xcd95f64c,0x77a4de70,0x1026f289,0xbc8797bb,0x000000d7 } },
  125104. /* 6 */
  125105. { { 0x2be9edf8,0x98ea0934,0xfcb98199,0x6c2f3132,0xfaf83aeb,0xf579893d,
  125106. 0xc73fda0f,0x858e87bb,0x7a0b9d1c,0xd3c0b3fb,0x71ee68b1,0x21fe6305,
  125107. 0x66aa6f16,0x5bf8f01f,0xbca825ed,0x30934c99,0x000000d1 },
  125108. { 0x913022f2,0xe4309850,0xde5b80ce,0xfdc336c9,0x8b6130ef,0xb716d689,
  125109. 0xa758d2f4,0x8a58b405,0xaa5cbc1c,0x98879df8,0xc12ce0bb,0x847cfd06,
  125110. 0x8c02ff3c,0xa1006360,0x3438695b,0x836e906a,0x00000136 } },
  125111. /* 7 */
  125112. { { 0x259ce02d,0xac8fe351,0xdae5e0f7,0xa506da0c,0xf043421d,0x77b56e98,
  125113. 0xa1647490,0xe0d041c7,0x9cb90101,0xe41f0789,0xda3e72e6,0x29bbf572,
  125114. 0x04a14df0,0x6b635c47,0xe81ef5d3,0x56873f58,0x000001dd },
  125115. { 0x5cf9e33f,0x77abe79e,0x0a1117fd,0x91aab581,0xcbac2fe1,0x11edf3b1,
  125116. 0xd72113b7,0xef43e017,0x06b74002,0xf9ad685c,0x8fbd3b1a,0x7e6370ce,
  125117. 0x42f73a82,0x550dd50b,0xc5e64a9b,0x8f2146be,0x000001f2 } },
  125118. /* 8 */
  125119. { { 0x2934ed82,0x05a704cc,0x989edd8c,0x647089fb,0x0ce7c62d,0xe0b239d4,
  125120. 0x105a5eff,0x4c892ea6,0xd5ed6b04,0xa519395f,0x509ed794,0x806c7003,
  125121. 0xe70ce5c4,0x882e9886,0xff01f6a9,0x50730ca1,0x00000088 },
  125122. { 0xdbcc5484,0x90a78a16,0xfd454b50,0xc1ab078c,0xcb09e525,0x6f488252,
  125123. 0xe19b2ed7,0xdd663f53,0xa67bf59c,0x16b10da1,0x36bb770a,0xb47f6b95,
  125124. 0x777b2bce,0x6bdc8428,0x561553f8,0xcd02ae3d,0x00000017 } },
  125125. /* 9 */
  125126. { { 0x1579d15a,0x1e3633a0,0x3e98cd1f,0x574f0c23,0xc60f4f99,0x45969dca,
  125127. 0x49fb9f24,0x10062c93,0xd378f640,0xd29a29d7,0xd7d48c2f,0xec941760,
  125128. 0x31fbea5c,0xf0591c59,0xb40f9ebf,0xd6173e6b,0x00000063 },
  125129. { 0x5a984a72,0x220f4f39,0x32510f26,0x9a3f82ce,0x8c069a1d,0xf3d04c76,
  125130. 0x69a21e57,0xf1d6d891,0xdc4db601,0x6b96b30b,0x64dcf3e0,0x71eeb728,
  125131. 0xc7caaff3,0x6f80c483,0x571b66e4,0x45533092,0x000000b0 } },
  125132. /* 10 */
  125133. { { 0x87140dad,0x49ae4521,0x57e2803e,0xda73032b,0x026ea20a,0x13f5e5eb,
  125134. 0x6e00afb9,0x2d54c4b0,0x7a150474,0x4393b92b,0x13f1a7da,0xb5b41bf8,
  125135. 0x02b5867a,0x6d786907,0xaf2ea4d1,0x5193a9ac,0x000001b3 },
  125136. { 0xa6b186cb,0x2a1563f7,0xe28e57b6,0x73a70a44,0x78fc8a1d,0xd7c4fc6d,
  125137. 0xdf3d6d99,0x4c9b4581,0x1e373aab,0x544f5249,0xe913498e,0xe99434a2,
  125138. 0xc4700f4c,0x30159749,0xe5142766,0xb8ef02cc,0x000001d0 } },
  125139. /* 11 */
  125140. { { 0xb9e6ffc9,0xe99805a6,0xf74d977b,0x1a357f05,0x5c9941bc,0xc8ddef31,
  125141. 0xcbe842e7,0x4b6d66ca,0xa20dc12d,0x84e1f75f,0x5f0c02fc,0x8b1b2c50,
  125142. 0x037b493d,0x3fa1889e,0x95705046,0x720bd9e0,0x000001c2 },
  125143. { 0x93ab9309,0x1a1f3378,0x226a8f94,0xe05a30a2,0x4045f1bd,0x2c01a52d,
  125144. 0xab5f5115,0xf42e8fd5,0x0c05fecf,0x954d1d09,0x8d0650d3,0x47e964d1,
  125145. 0x3c860801,0x6866fa5d,0x5abbb4af,0xac2fecbf,0x0000012c } },
  125146. /* 12 */
  125147. { { 0xe5537747,0x846dc3d2,0x1f5f9f46,0xe28e00df,0x3f31e42d,0x041af624,
  125148. 0x256af225,0x4948947f,0xff4f9550,0x3896c61a,0x34bb5a3e,0xcb40c773,
  125149. 0xeceafacc,0xb9becb07,0x4d45e83e,0xfe29f049,0x000001aa },
  125150. { 0x6b5578db,0x83fb71b3,0x0a710526,0x3017f115,0x5f220d77,0x189ec946,
  125151. 0x48465e68,0xba87ae07,0x70e0cbea,0x1da474d5,0x2b2ba7c5,0xb92cb0a6,
  125152. 0x8b1fb7e2,0x35cb356d,0x2cc8cb18,0x1155296a,0x0000000f } },
  125153. /* 13 */
  125154. { { 0x6ed0f604,0x7f9c9d9b,0xcb49c6d7,0x765e43e9,0xae9be5ca,0x03c4dd67,
  125155. 0x405aed36,0x5480888b,0x920ccddb,0x3a69ebb2,0x03f0c7cc,0x44ec0573,
  125156. 0xce89b026,0x158e2437,0x4f179a17,0x86795029,0x0000003a },
  125157. { 0x9f193dd9,0xf7854032,0xdcc158a9,0x531e4068,0x3642b1a5,0x774171bf,
  125158. 0xc1e53aa3,0x12b4920f,0xfd87478d,0xd1c5fb53,0xa7cba7ca,0x48958c58,
  125159. 0x3f66f2c7,0x375b2cb2,0x598899bd,0x1b510d0f,0x000001b8 } },
  125160. /* 14 */
  125161. { { 0x52007e41,0xfe96299d,0xcd708dcd,0x997140b5,0xf655f6fa,0xe9294eed,
  125162. 0xd58b839d,0x7701d45d,0xb6f77cdb,0x5dbdf5ad,0x95a572f0,0x265189f4,
  125163. 0xb3515e7b,0xc162794e,0x72655e0b,0xbfb571e0,0x00000168 },
  125164. { 0xbda82a6b,0xf0d2b863,0x390a9cc7,0x3df5b283,0x700fcd7b,0xbab9995a,
  125165. 0xfa4e6c06,0xc01ef0af,0x76a392d4,0x10a98513,0x955392f0,0xa7e3fc72,
  125166. 0x1d7a8550,0x8e3c0128,0x361898a8,0xcbca551a,0x0000010f } },
  125167. /* 15 */
  125168. { { 0x3ab71115,0xc8a4cd40,0xbcb9b55b,0xb783170d,0xabd9b426,0x1be20f6a,
  125169. 0x5377b714,0x32d2ea64,0x6b358bbf,0xda342480,0x6e202211,0x782bc800,
  125170. 0xaa27c499,0xf80974c4,0x50341cde,0xc2e66fa9,0x0000004e },
  125171. { 0x24ae60c3,0x082cb95b,0x83ad7484,0xd4b80af4,0x6205256b,0x84b739ce,
  125172. 0xae1fe063,0x616f505e,0x342f218f,0xef14ea68,0x64a01186,0x2b17d66c,
  125173. 0x50858bce,0x60e889ce,0xd5881005,0xdb046c59,0x000001e1 } },
  125174. };
  125175. /* Multiply the base point of P521 by the scalar and return the result.
  125176. * If map is true then convert result to affine coordinates.
  125177. *
  125178. * Stripe implementation.
  125179. * Pre-generated: 2^0, 2^130, ...
  125180. * Pre-generated: products of all combinations of above.
  125181. * 4 doubles and adds (with qz=1)
  125182. *
  125183. * r Resulting point.
  125184. * k Scalar to multiply by.
  125185. * map Indicates whether to convert result to affine.
  125186. * ct Constant time required.
  125187. * heap Heap to use for allocation.
  125188. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  125189. */
  125190. static int sp_521_ecc_mulmod_base_17(sp_point_521* r, const sp_digit* k,
  125191. int map, int ct, void* heap)
  125192. {
  125193. return sp_521_ecc_mulmod_stripe_17(r, &p521_base, p521_table,
  125194. k, map, ct, heap);
  125195. }
  125196. #else
  125197. /* Striping precomputation table.
  125198. * 8 points combined into a table of 256 points.
  125199. * Distance of 66 between points.
  125200. */
  125201. static const sp_table_entry_521 p521_table[256] = {
  125202. /* 0 */
  125203. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  125204. 0x00, 0x00, 0x00, 0x00, 0x00 },
  125205. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  125206. 0x00, 0x00, 0x00, 0x00, 0x00 } },
  125207. /* 1 */
  125208. { { 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  125209. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  125210. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6 },
  125211. { 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  125212. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  125213. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118 } },
  125214. /* 2 */
  125215. { { 0x0f0ccb51,0x80398667,0x3654974a,0xb87e1d01,0xb2b29ed9,0x7f58cf21,
  125216. 0xa3add337,0x06c0e9aa,0xe9d08ffb,0xf13b35d0,0x96761627,0xdd8bf44c,
  125217. 0x758a3ef4,0xa4a18c14,0xa0043adb,0x96a576dd,0x0000013e },
  125218. { 0x632d95a3,0x2bde24f8,0x4c524829,0x79f15ef1,0x9bdaba19,0xaadd863e,
  125219. 0xa962b707,0xdde053f4,0x14258d98,0xc598a2de,0x061c235c,0x9fa5a19d,
  125220. 0xe8ffd32c,0x0ed46510,0xef78ceac,0x2aea9dd1,0x00000185 } },
  125221. /* 3 */
  125222. { { 0xeaaf1fe3,0xd0a91dd8,0x4400b52b,0x0db38662,0x21abf0d2,0xff6a06a9,
  125223. 0xa768c940,0x9412879a,0x9a1eec37,0xf3791abc,0x2738343c,0xc913fbe6,
  125224. 0xe222abc1,0x728b42ab,0x2b9ef313,0x874c0a86,0x00000157 },
  125225. { 0xe6f03d49,0x0ac8f184,0x1e48be03,0xa9c357e4,0x815cbdef,0x02ce5ef3,
  125226. 0x5fd8dc3c,0x7a41c7ab,0xfaeb109d,0x4bef67c9,0xa84f4d38,0x2f98cca1,
  125227. 0x672f0aae,0x7e03d47d,0x1d58968b,0x24b1ab58,0x00000007 } },
  125228. /* 4 */
  125229. { { 0xdf9314e0,0x904f2d4b,0xe7a00aac,0xdaae850d,0x582efb03,0x79231083,
  125230. 0xec7fe6d2,0x80f1c283,0x199d74a8,0x2d5b3996,0x395007e7,0x5f120b9b,
  125231. 0x4773f03e,0x30d23773,0x3b78b686,0xf4c19273,0x00000121 },
  125232. { 0xfa8b51f0,0xf103ff6d,0x40e2bdf0,0xae7afb51,0x83254171,0x1130380e,
  125233. 0xcda10d95,0xe83501b8,0x4f3a8c01,0x1057771e,0xac807069,0x8f52196a,
  125234. 0xa5623821,0x3609b0aa,0x94a0a7f1,0x8c257906,0x000001db } },
  125235. /* 5 */
  125236. { { 0xb2c0958d,0x300370cc,0x69a7b387,0x89aef166,0x480c9b38,0x2792f3cf,
  125237. 0xfab3e149,0x0b2984f2,0x50748967,0x9751e436,0xad33db2a,0x9cab99d5,
  125238. 0xb44a4daa,0x4d945d32,0x16c77325,0xa26cca52,0x0000000a },
  125239. { 0xf9e66d18,0xcdbe1d41,0xaa117e7a,0x80aeef96,0xddb0d24b,0x053214a2,
  125240. 0x5c98b7bf,0x6dcfb227,0xdfd3c848,0x613e7436,0x3ca4d52c,0x6e703fa1,
  125241. 0x18551e64,0x0c8e2977,0xbfa8527d,0xf5e90eac,0x000001c6 } },
  125242. /* 6 */
  125243. { { 0x4ab2d58f,0xa2c2f1e7,0x2a097802,0xc1bbf82c,0x770bb76a,0x6583eb24,
  125244. 0x5667f7bd,0x8e4ed9ed,0xfd96897e,0xd8c01d86,0x3fbe0f15,0x66395a13,
  125245. 0xd99cdcb1,0x51e4f39d,0x720deb25,0xde08424a,0x00000082 },
  125246. { 0x60ea91af,0x97aa53b2,0x7a31dfdd,0xa4384af7,0x5cd09bbe,0xcd82f239,
  125247. 0xf30058e1,0x997c19da,0xe5c78e97,0x443b60c6,0x575b1845,0xfaae9b5f,
  125248. 0x08c2ce16,0x5ce86f33,0x4f63fa86,0x983ce58f,0x00000073 } },
  125249. /* 7 */
  125250. { { 0x8217609d,0xaee93131,0x2412fc00,0x7f8a9dd4,0x286c6329,0xe117e64c,
  125251. 0x7bf1c65e,0xcc3782d6,0x8d03eee5,0xe8c144db,0x9ab93799,0x01acacb2,
  125252. 0xb07784c7,0x215eb1b5,0x1affcd87,0x2c409fa8,0x000000f8 },
  125253. { 0x378139a4,0x007d3766,0xb55bea93,0xc6d969eb,0x68c8bc9d,0xc7c60d6f,
  125254. 0x5f93f242,0x844e8461,0x741717d9,0x8461ca2a,0xf0bf120e,0x8e930e79,
  125255. 0x6b5699d7,0xe1554a02,0x6a4fb6de,0xe69c7702,0x0000007d } },
  125256. /* 8 */
  125257. { { 0x4bee80d7,0x61b51bb0,0x7692de69,0x0e1f6a1f,0xa0ebc3bd,0x8379e46c,
  125258. 0x930644f0,0x1c0bffa7,0x390db077,0x97c67b87,0xfada1ce9,0x095c33e1,
  125259. 0xac54b512,0x3c500add,0xd3118656,0xc231d360,0x000000b0 },
  125260. { 0x39bcab2f,0x06289298,0x64dd220a,0xc0c06780,0x763dc2a0,0x062f6084,
  125261. 0x1938c3e3,0x88e9da73,0x52e46eb9,0x69be8f2d,0x6a5de0fd,0xe55c8d2d,
  125262. 0xdb2c0e26,0xf3a3fd63,0x1e4bff57,0x899c6d9f,0x0000014a } },
  125263. /* 9 */
  125264. { { 0xec05ce88,0x9ff6e3a1,0xb6afd202,0xf8fc2496,0x6fbeb007,0x0b9d2077,
  125265. 0xeebded40,0xb50ec0bd,0x693700f7,0xaef97742,0x3f7b030e,0x806e37a1,
  125266. 0x1b901f77,0x5cf17d17,0xca95ae0f,0x9036e5df,0x00000159 },
  125267. { 0x000e8e0c,0x00af64b5,0x06fb4df9,0xd3f2ae04,0x449f23ba,0x5f61da67,
  125268. 0x255b25a9,0x0ca91842,0x8e33c650,0xfa6af3e6,0xc2c027c1,0x14373c00,
  125269. 0x972840a5,0x99f3cda1,0xd0e84240,0x98c62b79,0x000000e7 } },
  125270. /* 10 */
  125271. { { 0xae4d0f28,0xe8c7c4a8,0x566d006e,0x3a8a55ef,0x066e4023,0x37985f65,
  125272. 0x5d321b76,0x8deccab5,0xb8351b07,0x38b966d6,0x57d548ab,0x2e889e53,
  125273. 0xe631ab0b,0x7a9e8e2f,0xe75c537b,0x45c60f95,0x00000059 },
  125274. { 0x7867d79c,0xbca27d34,0x81c81980,0x7f460b15,0x976b8c51,0x7ec2d9ab,
  125275. 0x61b91ed9,0xfcd04486,0xd9c1d15f,0x730a7a25,0xf94c9db9,0x8a2cf259,
  125276. 0x5dec5a3b,0x8e784b87,0x3e5131ee,0x06252607,0x00000004 } },
  125277. /* 11 */
  125278. { { 0xf1631bba,0xdee04e5c,0x156f4524,0x40e6c1df,0xe4c30990,0x06603f30,
  125279. 0x6b6abec7,0xdb649a43,0xf6b94f6e,0x354f509c,0x36b7e0b5,0x7fecf469,
  125280. 0xba1e6dd2,0xa7a7107e,0x689450ca,0x889edac5,0x00000022 },
  125281. { 0xd05596f2,0x9012916e,0xb023cb8b,0xe3901dac,0xe7d4abe1,0x2501d3ec,
  125282. 0xa9c90313,0xb2815040,0xc6d146d0,0x9dbcd3f1,0x74ee1896,0x6fa1d5b1,
  125283. 0xa91226fb,0x49aea161,0xb8a80984,0x754ceedf,0x00000154 } },
  125284. /* 12 */
  125285. { { 0x4270b2f0,0xb64e27b0,0xbf4d74d7,0x84b34e48,0x0c2722ba,0xb186be8b,
  125286. 0x9ff9b71c,0xf54a589d,0x34fd6bc4,0x9887e4df,0x7412f49d,0xb7c669fd,
  125287. 0x77f89d16,0x4008d9bb,0xc902e074,0xafb9426b,0x000001cf },
  125288. { 0x662935ca,0xcca4f2d1,0x997dcc46,0x2847c703,0x353c79f8,0xc089e9e5,
  125289. 0x5215f0f4,0x9ed8d989,0x80911b9d,0x59cf08bc,0x6de27aa3,0x4b03540e,
  125290. 0xf69e320d,0x52f4d63e,0x94ef193b,0xa0217fd6,0x000000e6 } },
  125291. /* 13 */
  125292. { { 0x74214780,0xb77de627,0x207459ea,0xca066817,0xe9c7fb01,0xf78579b7,
  125293. 0xd6d4b7c7,0xe55548c1,0xa66caa39,0x45756190,0x98505a4f,0xf8141b03,
  125294. 0x4c8864eb,0xa5ca0d7c,0x9e129d3f,0xbf8af950,0x00000053 },
  125295. { 0x85285092,0xbc9b29d8,0x8eed5e5f,0x82f31daa,0xf618aab9,0x9c33690e,
  125296. 0xd2626ed1,0x0eee14f4,0x07ed8e09,0x4229570b,0x8736d040,0x1977920e,
  125297. 0xede7d01d,0x47ee25ff,0xbc7ab73b,0x3c921c3a,0x000001b9 } },
  125298. /* 14 */
  125299. { { 0xa08b2b14,0x0b6a07cc,0xbf174c7f,0xaa978deb,0xc40cb2a4,0x291cb828,
  125300. 0x90adc838,0x95c78272,0x8c1edde6,0x08da8b2a,0x90fbd220,0x741ceb2f,
  125301. 0x322db94e,0x5f89c9e5,0xb73c548e,0x18266085,0x0000007d },
  125302. { 0x2defd012,0x69ebf82a,0x5a1537ef,0x01ecb094,0x3ef0811d,0x3c557535,
  125303. 0xb2bd4dea,0x59c882a7,0x7bf969c8,0x00a1f972,0x0b25ad1b,0x063adf5e,
  125304. 0xf2536005,0x4c1ff306,0x4112fe18,0x8e515bec,0x00000117 } },
  125305. /* 15 */
  125306. { { 0xefe3d3d5,0x9314787f,0x9d897227,0x29e76f65,0xe0b6acf5,0x15c77ed1,
  125307. 0x1c5e8dd9,0x9c2b7b20,0x5f5667af,0x788038f1,0xf3576ef4,0xf38c766f,
  125308. 0x0040154a,0x9f0623c8,0xde883b53,0x47d3c44b,0x00000096 },
  125309. { 0xde1b21a4,0x32075638,0x571081c1,0xbb6399c1,0x75c03599,0x322e6067,
  125310. 0xade60cf5,0x5c7fde7f,0xefc19059,0x1b195440,0xdd7b3960,0x7e70ac8c,
  125311. 0x6a6fa73e,0x4aa5a83d,0x63080764,0x34f8cfac,0x00000042 } },
  125312. /* 16 */
  125313. { { 0x286492ad,0xee31e71a,0x65f86ac4,0x08f3de44,0xda713cb4,0xe89700d4,
  125314. 0xa86b7104,0x7ad0f5e9,0x2572c161,0xd9a62e4f,0x25cc1c99,0x77d223ef,
  125315. 0x3b962e0c,0xedff6961,0x81d8b205,0x818d28f3,0x0000008e },
  125316. { 0x8cdf1f60,0x721231cf,0x6717760f,0x8b640f2b,0xe045a403,0xbe726f8c,
  125317. 0x0370689f,0x422285dc,0x72ea0dcb,0x7196bf8f,0xc8086623,0xa16f7855,
  125318. 0xc326fe48,0xd4e19fc7,0x8f68bf44,0xfdbc856e,0x0000013e } },
  125319. /* 17 */
  125320. { { 0xe6a3ace5,0xde34d04f,0x896191c1,0x0dbb603e,0xf75ed0f4,0xb4dc0007,
  125321. 0x95b259b5,0x15e0e6bc,0x2615f020,0xdfbcba66,0xd31ea3f8,0xb2ec5433,
  125322. 0x103ff824,0x42b0b0e4,0xc480332e,0x19315060,0x00000111 },
  125323. { 0x045452f1,0x9997ea28,0x71f3f73b,0x80b678cf,0x41e9328e,0x4a52bddc,
  125324. 0xe6af1c23,0xb7f2656e,0xb44215e7,0xc43805b9,0xf0a4028b,0x3aa734f2,
  125325. 0x422476e2,0xe3c72479,0x68c60cf7,0x6dc2e8b0,0x000001f1 } },
  125326. /* 18 */
  125327. { { 0xfffc0de5,0xbcdfae6f,0xab4a5f24,0xa801814f,0xea2aa8dd,0x19013658,
  125328. 0xda4f0441,0xf3b1caf5,0x34100611,0xf24b9cdb,0x96e0cf88,0x48c324ed,
  125329. 0x23055c82,0x4b7ea334,0x89092e29,0x6e835b64,0x000001d3 },
  125330. { 0x07372f27,0x7eb77ae7,0x83bae19a,0x4779b4fa,0x65429ebb,0xa175dae1,
  125331. 0xfc03ef3f,0x942ec266,0x6991c7c4,0x0e5fc6a9,0x56253d3c,0xa0f61e4f,
  125332. 0xde74e738,0x7a11ff58,0x624de919,0x60524cd4,0x00000002 } },
  125333. /* 19 */
  125334. { { 0x01342e08,0x45b5d0ca,0xb749f0af,0x509ed4f0,0x6529d804,0xeb5502d9,
  125335. 0x6d80359c,0x5eb087db,0x4c384800,0xeaa66a87,0xc75a8784,0xe972c7a0,
  125336. 0x6874317e,0x8c169e21,0xe5c9fbf4,0x81c556e0,0x0000014f },
  125337. { 0xe120674d,0x26b0b12b,0x219f00ac,0xc6bf09b9,0xd658caa6,0x1e1e732d,
  125338. 0x8292d99e,0xc771c5af,0x25fdbf80,0x5d813529,0x3666c37d,0xe61bd798,
  125339. 0x1d0df680,0x8dac946a,0xc39f0983,0x58dcf684,0x0000009f } },
  125340. /* 20 */
  125341. { { 0x7b7dc837,0x14169102,0xb50eb1c4,0x2d719754,0xd7e6741b,0x04f4092a,
  125342. 0xbc824a38,0x1d0a7f1d,0xc8e20bcf,0x570b2056,0xda181db0,0x6732e3b9,
  125343. 0x0a7b508a,0x7880636e,0xc9f70492,0x11af502c,0x00000045 },
  125344. { 0xc56f4ffa,0x0b820d94,0xc4f0c0fa,0x1c6205a2,0xa1a0606a,0x99f33d4e,
  125345. 0x79b316fb,0x1bab6466,0xe4f240fc,0x05aa0852,0x92d7dc43,0x22539b78,
  125346. 0x06e3c073,0x03657f12,0xcedb6633,0x28405280,0x00000059 } },
  125347. /* 21 */
  125348. { { 0x4397760c,0x90d08711,0x1c9fcd06,0xb9020b76,0x987e24f7,0xc7fec7fa,
  125349. 0x522335a0,0x0e33b8a0,0xae21ca10,0x73dbeafd,0x3b032220,0x458c060a,
  125350. 0xee145da6,0x9b9c73b8,0x27ff62ef,0x31c661e5,0x000000aa },
  125351. { 0x81430b5e,0xaf518eb0,0x50ee0d69,0xb32f9cea,0xaa6ebe8b,0x0ecdb0b5,
  125352. 0x9fe1d689,0x1f15f7f2,0x1a59cc9a,0xce5d68f3,0x08ab2a63,0xf4d67994,
  125353. 0x4347ce54,0xe85b1cef,0x286d0776,0x8ff423c0,0x00000176 } },
  125354. /* 22 */
  125355. { { 0x33dcec23,0x8564104c,0xcdd07519,0xbaf0d61b,0x4c4f309a,0x486daf51,
  125356. 0xde488715,0xf01bc8f5,0xd3539ba3,0xddd6baf1,0x3a3be8ec,0xbb7e665d,
  125357. 0xcb5d865f,0xf919dac3,0xf12149a0,0xfe203da3,0x00000173 },
  125358. { 0x78d4a3d1,0x043ae9a1,0x865316d8,0xa4d5cf58,0x41176463,0xeaf026c0,
  125359. 0xf84afa44,0x316c638f,0xffea422d,0x512f2397,0x6622b613,0x691eaa04,
  125360. 0x97e7068d,0x48856ea3,0xf4a1b33c,0x42d1b2e3,0x000001b5 } },
  125361. /* 23 */
  125362. { { 0x1f487402,0xf51b2d5e,0x7aaf1dd5,0xe36016e6,0x6da9c20a,0x1eb3f1f5,
  125363. 0xece45bfd,0x25b7d361,0x027a9e18,0x42db0633,0xe8411649,0xbf228777,
  125364. 0x458773d0,0xf5fce0c4,0x2dd7a5f0,0xb2b3151d,0x0000001f },
  125365. { 0xfbaa096a,0x102773e8,0xe093a878,0x152726eb,0x2c7f1781,0x5c53cd07,
  125366. 0xab5dca76,0x38d3dfd0,0x87ef2d4a,0xbb4a7d85,0xb7eb11c2,0x5c9c2013,
  125367. 0x0b6da22f,0x5e353c34,0xa325ecad,0x846d50a5,0x00000039 } },
  125368. /* 24 */
  125369. { { 0x1677df58,0x76da7736,0x1cb50d6c,0x364bd567,0x0a080ff2,0x0443c7d7,
  125370. 0x86532430,0xa0a85429,0xc35101e7,0x82002dd2,0x48c5cd76,0xbebc6143,
  125371. 0xca6cf13f,0xff1591ae,0x98bf8dc0,0x91c7c2e6,0x000000fb },
  125372. { 0x12de14d5,0x6a7c5cad,0x6561c822,0xbc448c5f,0x7cdbb3da,0x9f8de430,
  125373. 0xc76811d7,0x9c58f011,0x75462049,0x1e89806e,0xc9a74e49,0xe52ad0a2,
  125374. 0xb2be37c3,0x2034685c,0x0a0bc72d,0x7a863245,0x000000ec } },
  125375. /* 25 */
  125376. { { 0x8a86786e,0x33818c21,0x2137e2c8,0xed537f74,0xa7e6eb20,0x5d9690d1,
  125377. 0x5cdc4803,0x9790ec70,0x24f7bd75,0x469162c8,0x4e1f0f14,0x09e7ef9d,
  125378. 0xce9915ca,0xd30c128b,0x6c71226f,0x810145f6,0x0000002d },
  125379. { 0xb71d87e5,0x312749f5,0x7b02ceda,0x25f3b141,0xe0baff16,0x02456d2e,
  125380. 0xfcae6627,0x97f7b3a9,0x37bd985f,0x0d6ebf8f,0x7fa6d0c1,0x20aa81b9,
  125381. 0x21f2f137,0xb29f1a01,0x5cc0ddb1,0xe326a2f8,0x0000003d } },
  125382. /* 26 */
  125383. { { 0x38c2ee78,0x26f3398b,0xa75a0bee,0x40c3d101,0x565a7f8e,0x35a31706,
  125384. 0x04019e5d,0xd12985e3,0xb8174b6e,0x21e2a642,0xaf80a52a,0x25a15ee8,
  125385. 0x8518d80e,0x5d1e0fe6,0x04f6ea9a,0x8cbbc138,0x00000084 },
  125386. { 0xdfd45169,0x76828690,0x59d3e8d0,0x38d7e098,0xcdb8bfc2,0x23758811,
  125387. 0x162cf648,0x8499547a,0xb4d15b8c,0x494bab3b,0xc60499a6,0x822cbc57,
  125388. 0xa8a1cfed,0xac43224e,0x57c6598b,0x43563469,0x000000d9 } },
  125389. /* 27 */
  125390. { { 0x68271323,0x2b069253,0x49cd04d7,0x24d9e0a8,0x2b31cc7d,0xaae35fbf,
  125391. 0x57a3e361,0x44f64b4f,0x0294e856,0x14904686,0x43ced4ae,0xddc82ee7,
  125392. 0x7e2cda47,0xcb92a6a5,0xbfc1f968,0x989c42ef,0x0000013f },
  125393. { 0xb8651600,0xbed98bdf,0x7a3cfaee,0x8c363434,0x35b1a226,0x93a12543,
  125394. 0xd5825507,0x558da7dd,0x852eb1e9,0xa5173b23,0x2295f545,0xdf5ae585,
  125395. 0x6646d101,0xe546e2ef,0x5d89f862,0xf7e16a2c,0x000001fa } },
  125396. /* 28 */
  125397. { { 0xc7ec136d,0x0d746c8e,0xcd11351b,0xf8e1d827,0xf187a116,0x764a3ad3,
  125398. 0x136e8465,0x2f1b968f,0x850983c2,0xd41aa294,0xbe717259,0x2123ecc4,
  125399. 0x763c149c,0xdcdcab52,0x1022b82d,0xa7f50b18,0x0000016d },
  125400. { 0x0ca5e258,0xf99e532d,0x97b62a7b,0xa148ad17,0xc77fddef,0x8d0a242e,
  125401. 0x74f9b6c4,0x58518bcd,0x7fd122d4,0xc53b30b8,0xfb50b2d7,0xbb8cd193,
  125402. 0xbc01aae9,0x1a169aee,0x1de26e09,0x7e49b10a,0x000001c5 } },
  125403. /* 29 */
  125404. { { 0x21210716,0x2cabe675,0x07e02400,0x81a296a3,0x8c83795b,0x94afc11d,
  125405. 0xdd9efa6a,0x68f20334,0x677d686f,0x5be2f9eb,0xbf5ce275,0x6a13f277,
  125406. 0xb9757c5c,0xf7d92241,0xc74f4b8c,0x70c3d2f4,0x00000132 },
  125407. { 0x8d209aa4,0xf9c8609c,0xdb2b5436,0x46f413a2,0x2992345d,0x96b72d1a,
  125408. 0x9487c34f,0x186f2aeb,0xb440a375,0x4fa72176,0x7da5358e,0x3a420936,
  125409. 0xff25b310,0xf11eade3,0x505d60b8,0x9a570153,0x000001a9 } },
  125410. /* 30 */
  125411. { { 0x6e7495bb,0xae151393,0x490879d1,0xebd2fd28,0x29fd76fc,0x9c232b0b,
  125412. 0xc60e721c,0xa1a0d49b,0x517a09e2,0x9f582b83,0x9d8badf8,0xac37809e,
  125413. 0x0ad48bb4,0x4aa4de9e,0xcb6cc487,0xfd041312,0x00000027 },
  125414. { 0xead4fb6d,0xc05502ee,0x0a602cbe,0x760c25ed,0xbd7f4a07,0x58ba6841,
  125415. 0x54edce14,0xc28b6032,0x0397614c,0xb9d41e39,0x181eed93,0x4221b71d,
  125416. 0x332d4b0b,0xd010e3c2,0xdab0e419,0xdfe58a27,0x00000096 } },
  125417. /* 31 */
  125418. { { 0x7debd24e,0x4cd6fcd6,0x9ae2b075,0xbe3fca60,0xf217c26c,0xa7d8c22e,
  125419. 0xb9620e3f,0xd42d03e0,0xc7f9f87d,0x634bf216,0x8972ffee,0x22b1ec53,
  125420. 0xd60d3e77,0x83a957c1,0x0f6a537e,0xedfe5f86,0x00000162 },
  125421. { 0xf0ea20b8,0x40a05400,0x1d796900,0x2872ac7e,0x0edb0cac,0x7765a5c9,
  125422. 0xb62939a7,0x9df5b930,0xaf2cb708,0xf78a676e,0x52febc12,0x030732bf,
  125423. 0xba190ad3,0x3a6640de,0x93e7e341,0x36eae15f,0x000000d5 } },
  125424. /* 32 */
  125425. { { 0xa1c88f3c,0x6c6119f6,0x2ec6944a,0x924e5fec,0x5742ff2a,0x4c8aac60,
  125426. 0xddb22c7c,0x60adde1e,0xfa5d25bb,0x9728938c,0xec117de0,0xfa5ac4f7,
  125427. 0x482929c1,0x41f35ab7,0x0afd95f5,0xd1c4e8f9,0x00000180 },
  125428. { 0xa7cd8358,0x2fc4e73d,0xf2a1c920,0x39361a57,0xad94d288,0xf6f2f130,
  125429. 0x2b6a78e2,0xe37e2466,0x79c262cd,0x0babff8b,0x61b597b9,0x6cae01ef,
  125430. 0xa60d4e64,0x9c1e33f0,0xdd01f845,0x52a42280,0x0000000e } },
  125431. /* 33 */
  125432. { { 0x0f013755,0x72d640a4,0xfb8380e9,0x0b6dce77,0x7eb64b31,0x2789ce79,
  125433. 0x93ca5a36,0x8e704b0b,0x58bdffc9,0x18c360ff,0xb230c372,0x53b1f323,
  125434. 0x5a7385d1,0xd6b39088,0x56b93bf7,0x071130f5,0x0000004a },
  125435. { 0xfeef3f88,0x29a2096b,0xb82b3945,0x22eba869,0x872664a7,0x7fe2184a,
  125436. 0x858ff942,0xa0dc0ba1,0x7490c9da,0x33799eb5,0x81588ce8,0x1d356f62,
  125437. 0xa7b2cee2,0x7dd9bc7f,0xa3cfaee9,0x1e61a4e8,0x000000d2 } },
  125438. /* 34 */
  125439. { { 0xe9068656,0xec5db629,0x9fede4df,0x623bd70c,0xfcd45546,0xc78ad5bd,
  125440. 0x6291a741,0xf7981dd2,0x761e688e,0x3ac53d92,0x55b9272f,0x6a96892a,
  125441. 0x06546fec,0x4217e7b8,0xab9e2f56,0x793c03cb,0x0000015e },
  125442. { 0x6eff39be,0x08fd9543,0xdbff4f68,0x5a1af07e,0xb0241616,0x83d47abd,
  125443. 0xd4798029,0x37c5d2fd,0x60b2e6fb,0x9d86d978,0xce8db998,0xe3e3284e,
  125444. 0xd868b9bb,0x9f049eb5,0x9dad18b3,0x3b3e8a78,0x0000018e } },
  125445. /* 35 */
  125446. { { 0xe51e61f0,0x57026c56,0x307f2757,0xdddbcaa3,0xb1aeaf41,0x92a026eb,
  125447. 0xe2d7f5ba,0xa33e937c,0xbc5ead91,0x1f7cc01e,0x2e46807d,0x90ab665d,
  125448. 0x53419519,0xc2a44f55,0x79664049,0x099c1ca6,0x000000aa },
  125449. { 0x8f97e387,0xb561a909,0x45e1dd69,0xf6051778,0x7ff1d6ab,0x1ffa512b,
  125450. 0xd09a9c89,0x42da55a4,0xd2282e2b,0x5e5a7c71,0xe74185ad,0xdfa5a203,
  125451. 0xea0baeff,0x19b1369d,0x1ecc0a16,0xa5eef914,0x000001a3 } },
  125452. /* 36 */
  125453. { { 0x7a573b81,0x2af20d0a,0x66194cef,0x7eac1ca8,0x0b711c34,0xef0d2d8d,
  125454. 0xba099d42,0x6aea016c,0x5067a8ca,0xa6609d28,0x7a1351ef,0x6a52c600,
  125455. 0xb11c2634,0xdab85818,0xbb1c033c,0xf17fa45d,0x00000121 },
  125456. { 0xfc3279d6,0x9fb8b87a,0xc201f1e1,0xe30e76ab,0x806c21dd,0x02af6a83,
  125457. 0xc63f824f,0xeafd7e2b,0x46bd1a53,0x7b074e26,0xa2139164,0xcd6f4931,
  125458. 0xc172d9bf,0xab2cfd39,0x4db59cf1,0x62f3eb4b,0x0000010a } },
  125459. /* 37 */
  125460. { { 0xe0689a1b,0xe402de36,0x7dcafe72,0x9dccc9fd,0x255d0bfb,0xe4dead7e,
  125461. 0x4ada04d9,0xd7ee87ee,0xbfd2e774,0x5a85039e,0x770b2b9b,0x282c6657,
  125462. 0xba103bba,0xa7aca826,0xc7cd5071,0xac7028ba,0x0000011a },
  125463. { 0x680c8f04,0x2e61d39c,0xb48b3b5e,0x2f09c4cc,0x95744f3c,0x131609bd,
  125464. 0xaaccb593,0x6d72e4b4,0x5adfb209,0xdb7060ca,0x1fd3eccf,0xc67d9e43,
  125465. 0xe1752a73,0x1487a26f,0x64d0857c,0x3d953663,0x000001e3 } },
  125466. /* 38 */
  125467. { { 0x4cec9e7f,0xe664506b,0x30aab98f,0xa44564b4,0x173fa284,0x5e1b501f,
  125468. 0x15c97472,0xe7b7bd7e,0x82dec033,0xd6cc67a8,0x0a63b762,0x1fe2e934,
  125469. 0x3f8e2fcd,0x3a084e1b,0x9ae6e752,0xccce4da8,0x000000fd },
  125470. { 0xc12fd820,0x0797f8ee,0x96da4733,0x325f892a,0x55997bf4,0x597d241d,
  125471. 0x02b753cf,0x3aef35ac,0xf677ceba,0x8a73f95d,0xd1bbac6c,0x5b2892b7,
  125472. 0xcc5278b0,0x90751583,0xa47f45f6,0x2f5ed53f,0x0000001c } },
  125473. /* 39 */
  125474. { { 0xab40b79c,0x3914165e,0x25b489a8,0xbfb6eed8,0x8a6c107f,0xda136b7d,
  125475. 0x8e01f28b,0xd431db8b,0xa4d79907,0x84e5d0dd,0xa471e685,0x69a91472,
  125476. 0x98376ff8,0x58d06969,0xc46311fd,0xce369b74,0x00000006 },
  125477. { 0x1add1452,0x6c0773d1,0xed8e9a2a,0x2e4e9c95,0xca15a40c,0xe8ff8e32,
  125478. 0xaf62f18f,0x3fcb7d36,0xeec9484b,0x2ca336ee,0x3b20405b,0xa4d6e7a9,
  125479. 0x956d8352,0x6d90d031,0xd9ca03e7,0xdd375603,0x000000e5 } },
  125480. /* 40 */
  125481. { { 0x8b481bf7,0xcc5f297d,0x2a13383c,0x06a2a3e4,0xdc40b96c,0x9e14528c,
  125482. 0x1189da3c,0x9a2bf35f,0x6cd57fa7,0xb8adb989,0x9357d32b,0xc1a4935c,
  125483. 0xc2d76fad,0x51fb2580,0x24f23de1,0x98721eb4,0x000001ba },
  125484. { 0x52a4b397,0x8c02daaf,0x0d0b4e54,0xc3c5f4cc,0x7b7e79cd,0x29be4db3,
  125485. 0xb33970b6,0xf34336ec,0x92808c7f,0xed3dcb7c,0x02288db1,0xec290eff,
  125486. 0xe96ed59a,0x2a479d51,0x76d8fa5f,0x9d7ed870,0x00000092 } },
  125487. /* 41 */
  125488. { { 0xe660043c,0xd8edaf0b,0x016e074d,0x84aa2ccb,0xe2cc3b3d,0x9d2368e7,
  125489. 0x5c269fc4,0x47b50130,0x3de33e36,0xd0194ee1,0x789ca504,0xdb3361b9,
  125490. 0x984db11d,0x8cd51833,0xc8ec92f0,0xd5b801ec,0x000000c6 },
  125491. { 0x47ab9887,0x33f91c15,0x6b5ab011,0x2f285e2a,0x133fc818,0x9b734e5a,
  125492. 0x38d8692c,0x5c435a74,0x43282e81,0x3c92b47c,0x9c7bcdaa,0x191231f5,
  125493. 0x4d158c86,0x3ae425c3,0xc5a23cca,0x7f568feb,0x00000011 } },
  125494. /* 42 */
  125495. { { 0xbf5caa87,0x8ccbd9d5,0x68dd8c9d,0x17bfc60f,0xc7d4dede,0x63eb4dbb,
  125496. 0x8270b5bf,0xbf6e5945,0xcc098fe7,0x887137a5,0x05d7b8f5,0xca5eb687,
  125497. 0x4b25a533,0x4b7deeee,0x4a700a6c,0x8e045c32,0x000000ef },
  125498. { 0x70cf52bc,0x160c1c92,0x90cc6298,0x4bf3f63a,0xbf3028fb,0x5fff421c,
  125499. 0x523beff1,0x0a8102d7,0x8b9ce105,0xff3309a3,0x06621b1e,0x8e9da4d0,
  125500. 0xcc0a7807,0x9775f89f,0x00178612,0x59044865,0x000000eb } },
  125501. /* 43 */
  125502. { { 0xebbd33ec,0x8a6664fd,0xce5ad579,0x0cf9a660,0x50fb56ed,0xecd06c05,
  125503. 0x1d5aaa6e,0xb4ca5fad,0x948a7f07,0x36daee5b,0xefe1c11a,0xd2e37887,
  125504. 0x91d2544b,0x41f61ac4,0x2bffd8ea,0x49df7071,0x000000be },
  125505. { 0x65acdb56,0x60e2f1f5,0x5e5e5bde,0xf2f13c84,0xe17a0412,0xb97fd354,
  125506. 0xd9c93bef,0x8a2867cf,0x25a957e4,0x9ca9d16b,0x4a18635f,0x1f55c19b,
  125507. 0x8d26ae71,0x9b3868f5,0x4c94541d,0xac448041,0x00000000 } },
  125508. /* 44 */
  125509. { { 0xd4ad38db,0x6c1bcf89,0x3d714511,0x1180f381,0xcb70243a,0x5b4c2759,
  125510. 0x163a716c,0x5dd64d63,0x13648bdb,0xbbd2efea,0xe4de9969,0xa47187f9,
  125511. 0xe2de8c45,0x65de6912,0x4bdad0a7,0xe075f29c,0x00000048 },
  125512. { 0x5e4dd88d,0x00335474,0x80577afc,0x18283638,0x227288f7,0xe4b35c01,
  125513. 0xe68989de,0xd008fd91,0xcd3f71ba,0x42142315,0x3e4da1e2,0x5cb023ff,
  125514. 0xb5662bb1,0x7e6b9c35,0x7fb04fe5,0x143f4165,0x00000072 } },
  125515. /* 45 */
  125516. { { 0x26f40f2c,0xb06b046c,0x6cd7c31d,0xbd5d246c,0x1953a9b7,0xaaa56270,
  125517. 0x8f00436f,0x5ac929b8,0x21d0660d,0x1937392c,0x9bd6dbe6,0xd279ed15,
  125518. 0xd17c43f9,0x377c4d5a,0xb8fcd025,0x800eda50,0x00000179 },
  125519. { 0x36132f31,0xb88ddc0b,0x2ade73a3,0x6f8f4f01,0x203de2b9,0x38859ec3,
  125520. 0x231b6533,0xedb03814,0xa14093ca,0xad08cd20,0x5c2be2f9,0xb9f86d44,
  125521. 0xf6ebc09f,0xfd3d9532,0x1aef478d,0x757b5899,0x0000013d } },
  125522. /* 46 */
  125523. { { 0x580f894b,0x7d9ad100,0xd925e46f,0xb612488a,0x2e5a6865,0x45497e14,
  125524. 0x17f9a813,0xc86e1053,0xf8a33541,0xd8aa820a,0x7a66d578,0xa6790660,
  125525. 0x5f758e23,0x47df60ae,0xa7f8ab5c,0xcadd4c90,0x00000107 },
  125526. { 0x6764ad0e,0x356b044f,0x250189b3,0xf69fe0e1,0x5f14db6a,0x2deaca62,
  125527. 0x1bd77d54,0xe9f2779f,0x5cfa895c,0x979911f2,0xb6f19ac3,0xd4e94ced,
  125528. 0x01af44b1,0xc3533417,0x50c727f5,0xcac43fff,0x0000003b } },
  125529. /* 47 */
  125530. { { 0x83c1d4cf,0x1742951c,0xb245c34f,0xe03791d0,0x9c2dcc71,0xea8f8ef6,
  125531. 0x2a310767,0x2ea57a29,0xb12948bd,0x255b46bb,0x0feaeb83,0x2adc1e09,
  125532. 0x449abf59,0xa0d2d18c,0xc4a8a689,0x9e8c9ff5,0x00000019 },
  125533. { 0xeb28171a,0xc9f7b9cd,0xd576987b,0xefd78403,0x22ff824c,0x58b4f3bf,
  125534. 0xbf333cc5,0xee09b393,0xb01ceb72,0xebff83a2,0x220299cd,0x5bb34c45,
  125535. 0x66ebf751,0xa3c3e8a0,0x49d05cf3,0x5dee07bb,0x000001a6 } },
  125536. /* 48 */
  125537. { { 0xb114257b,0x09a958d6,0xd4975e30,0x729afd41,0x3aae7b11,0x072879b5,
  125538. 0xedd1ac83,0x0791b093,0x1eb67975,0xcfefc7d1,0xe2675b4a,0x0e54bd37,
  125539. 0x8d69517f,0x89a62d7e,0x202109a3,0x96f805d8,0x0000006b },
  125540. { 0x57b5f9f4,0x4815d517,0x405b44d1,0xe5c9e436,0xe4870160,0x3442dde0,
  125541. 0x1ef6b3f8,0x953fef95,0xf7497faf,0x919e4cf5,0x016ef0b7,0x24e3cc4d,
  125542. 0x2512eeed,0xfc5caa87,0xa3bd1703,0xf1ba4029,0x000001b6 } },
  125543. /* 49 */
  125544. { { 0x529252ac,0x2a668435,0x74e7b0d8,0x3da626c0,0xe0be86ab,0x55080cc1,
  125545. 0x4ed5dc53,0x534a53f7,0x0cd41fd0,0xa9eff140,0x5674891c,0x0e7c945c,
  125546. 0xec53b5ad,0xdea4b895,0x15150988,0xefc67bef,0x000001ff },
  125547. { 0x306033fd,0x988dc109,0xf36875d9,0x1b287979,0xe3c335c5,0x4d39af26,
  125548. 0x124e29d6,0xa47259fd,0xc41dbdfc,0x5d60c570,0x0cc0d895,0x06224b61,
  125549. 0xeea8ff86,0xa041d4e5,0xae4d8707,0x2920e15c,0x000001fd } },
  125550. /* 50 */
  125551. { { 0xcd67da85,0x66d15f0c,0x5ac54a15,0xae98b6f4,0xf1ac71c3,0x2f05e021,
  125552. 0x47559224,0x1feb2226,0x66e856dc,0x2a2f1561,0x6fb4ba47,0x65eb1456,
  125553. 0xa29d920b,0x34688bd2,0xf9d4cb9b,0x943ce86e,0x00000061 },
  125554. { 0xaac91174,0xb4696218,0x41dd9234,0x85b519ec,0x9f0763a4,0xb7efadf2,
  125555. 0x712c8b33,0x98517f27,0xb0538630,0xa02e7ec3,0x1ff3e3e4,0x46bc45bb,
  125556. 0x29496486,0x46ae896f,0xebd2b93f,0x2aeb1649,0x00000146 } },
  125557. /* 51 */
  125558. { { 0xe8e4d3c3,0x1f34f41f,0x5bb7e9db,0xc80d87ff,0xd910b579,0xf0216c0a,
  125559. 0xb87349ae,0x2a24b761,0x2b0a6cc0,0x054bc528,0xaf2d1957,0x3b4c7029,
  125560. 0xadbe6cdd,0x0e4b90e2,0x26060a34,0x8e774f81,0x000000cf },
  125561. { 0x2e229950,0x3c7f9dbc,0xd9f82b70,0xab11f846,0xf10c05f3,0x2b7ad9a3,
  125562. 0x0f1820ca,0x203ead4f,0xccbfb332,0x51dbcbc8,0x066706f1,0x3bd9caf0,
  125563. 0x06059d5e,0x5a39be25,0xdcafe64e,0x984387c8,0x0000014c } },
  125564. /* 52 */
  125565. { { 0x8e011531,0x708a757f,0xc3dcd57c,0x7f45b172,0xc2d99e29,0xa8eac9fd,
  125566. 0xb93b6415,0x9d4ee81f,0xa5488e86,0xa5833b54,0x0bb7ab70,0xddd561c3,
  125567. 0xb3bdf3a9,0xb5bda384,0x1ddf332b,0xf909f8e0,0x00000124 },
  125568. { 0xab41e782,0xc5b8aa84,0x851ddb87,0x1de20126,0x99482bd2,0xf49baa7d,
  125569. 0xf4b6413b,0x05963deb,0x7cd1e224,0xed369fbb,0x1bad60ee,0xdcf495dd,
  125570. 0x892e30ed,0xeb475693,0xaf0a212d,0xaaf11bd8,0x0000010b } },
  125571. /* 53 */
  125572. { { 0x16ec64e2,0x71460174,0x7d7c6ebe,0xbfd14acf,0x668b7176,0x1e3504a3,
  125573. 0x741b041c,0x72e3f3f3,0x2d3b67b0,0x651fa54a,0xe57d928d,0x623edca3,
  125574. 0x72c8f419,0x29b74e8b,0x327abaef,0x3d99cb47,0x00000038 },
  125575. { 0xda342a3f,0x808dd0b3,0xdef4a954,0x12002462,0xeab5a860,0x1b1c642e,
  125576. 0x06e54b6d,0x5e1e2a05,0x10c6cf1a,0x9ba1710f,0x0f903cd0,0x334fc366,
  125577. 0x134166f5,0x969e0001,0x155c4353,0xfaa26074,0x000000fa } },
  125578. /* 54 */
  125579. { { 0x712de285,0xc85cd0e6,0x869f5dc5,0xcd2ff8b0,0xdf4ed389,0x372a2b92,
  125580. 0x55b99c84,0x63524d30,0xe07a0033,0x46fef5a2,0xd6e09493,0x0a2c82da,
  125581. 0x72a8952b,0xb3626621,0xaf217eb6,0x9afcb188,0x0000002c },
  125582. { 0x9a64c5b5,0xd3b9d476,0x44c4cfe1,0xa0d8d5de,0x11c6dbff,0x560858ef,
  125583. 0x41c14aed,0xce1d978f,0x35efe854,0x251f9e72,0x0474575d,0xf9d0c14c,
  125584. 0xbda89c03,0x0d2c838e,0x36cc9dc0,0xa25f040b,0x0000016f } },
  125585. /* 55 */
  125586. { { 0x9cad682d,0xb23d9dea,0x46369391,0x87acb1b3,0x5c0f24d7,0x9f5c1988,
  125587. 0xd41883ce,0xdff62fc7,0x53555e46,0xd1ab29df,0x891cda05,0x569b1cb2,
  125588. 0x52c633ed,0xdb14dbc4,0x2a345428,0x1acbb86c,0x00000194 },
  125589. { 0x24db8127,0xd86a70c8,0x41b7cf5b,0x84a6563f,0xb908d9b4,0x8d84dabe,
  125590. 0x899c260a,0xaaeaae63,0x44436957,0x13ed6b2b,0xd0a92c8d,0x3bc94f99,
  125591. 0xd04bcb97,0x978f2e2b,0x716a565f,0x56a388ef,0x00000074 } },
  125592. /* 56 */
  125593. { { 0x96fc1f77,0x6082dfe4,0x1347ad6a,0xb04c435f,0x25ebe457,0xf42694dc,
  125594. 0xb6f764aa,0x64a17069,0x04d83da1,0xe03873d5,0xe0c82330,0xb0b9db52,
  125595. 0xd4239b3e,0x9886b34e,0x598814da,0x76587f2a,0x0000016a },
  125596. { 0xebc71a5d,0x6918f8e8,0x85405233,0x49141a42,0xc182cbcc,0xd63f09cc,
  125597. 0xe09057a7,0x4afe59d3,0xe239d8eb,0xe633db0d,0xfd9494b2,0xbac8582d,
  125598. 0x4704fd61,0x8b915a41,0xfceaefd9,0xe0866a9d,0x0000010e } },
  125599. /* 57 */
  125600. { { 0x52e07a4d,0x2b50c470,0xe5d745d0,0x7f6d38b8,0xe1af1226,0xb414c47c,
  125601. 0x39c505f7,0x03e4b44b,0x86f739be,0x59f3d795,0xe7c2f1bc,0xca19bca7,
  125602. 0xc063fad4,0x1c51c01e,0x7f428afb,0xda3937a5,0x00000080 },
  125603. { 0x102369fa,0xe9d8ca9d,0x706c0e35,0xe009bffb,0x96b55d80,0x2e0a19a7,
  125604. 0xac0d094c,0xda0e42de,0x787c187a,0x6c1be2c5,0x9cfa04b6,0x6d4ae2cc,
  125605. 0x76577340,0x5b0cea60,0xc7c96285,0x2d525245,0x000000d8 } },
  125606. /* 58 */
  125607. { { 0xae93de69,0x6dcb238c,0x3bfdae9b,0x4963c833,0xe8b79836,0x33c81f4d,
  125608. 0xae8bf8ae,0xe13a2244,0x4c3ebacc,0x0bc6e786,0x555a5ad6,0xa837a53c,
  125609. 0xbc7e9459,0x875d8d35,0xf9f46fcd,0xb3705534,0x0000001f },
  125610. { 0x7fb974a1,0x78e9270c,0xe9ed2481,0x23448fa0,0x64bffbd4,0x14166c3d,
  125611. 0xd79f4b3c,0xa05aa443,0x3b9f32a0,0xd855a4f1,0xac90235e,0x4bebcf8d,
  125612. 0x8db52b48,0x65849987,0xe48d09d1,0xaa4d59f1,0x00000183 } },
  125613. /* 59 */
  125614. { { 0xdbffad9f,0xee585d75,0xf419d8fc,0x64df6174,0xe6c69345,0x6f73bf59,
  125615. 0x83d59b0c,0xb80793d1,0x929c8950,0x6baf4fc3,0x29962bab,0xbd445a95,
  125616. 0xeaa91273,0x52b61945,0x3d1c785b,0x4fccdfff,0x000001be },
  125617. { 0x7cb2857f,0x05c384d9,0x06b7abf4,0x4cf83058,0x43ace6b2,0xf528dd17,
  125618. 0xbc43d6b6,0x2c7b8fa2,0x14e564b9,0x8f0e28bf,0xd2b9f01a,0x1b69bc73,
  125619. 0x3dd383e6,0xab8beb40,0x9791946b,0xaccea0c5,0x000000ae } },
  125620. /* 60 */
  125621. { { 0x0163c2de,0x9a68baee,0xeb2768a4,0xc42d0b2b,0xffdae767,0x5686f124,
  125622. 0x0aaca943,0x926da5d5,0xe01091cf,0x699c34ce,0x5324becd,0x3d254540,
  125623. 0x4193a0a9,0x1b6b58f1,0xd611cc9d,0xf144925e,0x0000014f },
  125624. { 0xc1ed9259,0x7f61a60c,0x2f1d5a7f,0x1be37aa3,0x07aef431,0x0384713d,
  125625. 0x4e6fa7ba,0x99f33d49,0x8bd3730c,0x43928c16,0x5b9557dc,0x73cf8ccf,
  125626. 0xd1a2bee5,0x0bc6d460,0x83b15610,0x27cd1943,0x00000145 } },
  125627. /* 61 */
  125628. { { 0x3427af4e,0x4be65135,0x310d937d,0x2e6c0bb1,0xcaa671c3,0xbd8ea76a,
  125629. 0xd3a9c376,0x9d7b3fd4,0x471709aa,0x124ce863,0x018051c0,0x225ce41d,
  125630. 0xf9e8ee1c,0x5489284f,0x535c4ec8,0x22d829c9,0x0000013d },
  125631. { 0xa1b15e02,0x6b01ed9d,0x301e5868,0x1d092bac,0x5764135b,0xbfa7a183,
  125632. 0x6f7159a4,0xc0ee59b7,0x18090d0d,0x9171a051,0xb8052196,0x5c1531bb,
  125633. 0x20927904,0x740930fc,0x76337685,0x963b48cc,0x00000008 } },
  125634. /* 62 */
  125635. { { 0xf4aaaed5,0x0fe8b620,0xfe871ee8,0x1068de7d,0xfebfcb4b,0x2b22030f,
  125636. 0xc3a2155b,0xd4dfbee7,0x2769b805,0xa7a26a8c,0x6d39eaf0,0x377de770,
  125637. 0xf615f032,0xf1a92447,0x42d9b731,0xa1b81a84,0x0000012a },
  125638. { 0xb1152e8f,0x299e67d0,0x92b5e14c,0x2e773d97,0xf1cb57a2,0xe0d81073,
  125639. 0xbf1da4a2,0x03af0a9c,0xc22b449a,0x169b160e,0xdd2d7d1d,0xb82c1ac8,
  125640. 0xbfc98ee4,0x7508aca6,0xe3cbea15,0x54992440,0x00000150 } },
  125641. /* 63 */
  125642. { { 0xa13a4602,0x70004a0a,0xd0d2c60e,0x505c71a3,0xa6d79bc5,0xa4fe2463,
  125643. 0xd54d9df4,0xe878eb3a,0x73d3c7b8,0x7ecca907,0x244ecfa5,0x5b3bb278,
  125644. 0xb124d179,0x8a30f61f,0x4f632af0,0x5b7e5001,0x00000115 },
  125645. { 0x9ef0021a,0x62c42ecc,0xf856c9d4,0x58017fd7,0x2e6478bc,0x10e243b8,
  125646. 0x1505a4db,0xaf074669,0x4cd7eea5,0xd9bb0a1c,0xd52aed0a,0xe8ba39a2,
  125647. 0xb549f09d,0x0747449a,0x9e57fa64,0xd5c8f7bd,0x0000013f } },
  125648. /* 64 */
  125649. { { 0x5a53c22b,0x1bd8ce7b,0x7cab446a,0x78733fcd,0x48acb394,0xc44ca4e2,
  125650. 0xa38c790f,0xa9888b1e,0x15c34237,0x36afb6eb,0xfb702063,0xb913b8a8,
  125651. 0x917508fa,0x34b77cc5,0xf9e4732b,0xa931d7a7,0x00000050 },
  125652. { 0x56d21d18,0xa90a4290,0x55b410a1,0x82666307,0x894a6b05,0xb4684a8b,
  125653. 0x828cf75c,0x8a1ade63,0x127702a3,0x4fb2f85a,0xadf7b709,0x83ff7d05,
  125654. 0xa68d1db6,0x1d3f5a92,0xc093cd5c,0x243ce1db,0x000000f5 } },
  125655. /* 65 */
  125656. { { 0xd37d7891,0x8fc183c3,0xfd865eca,0x17b50149,0x8f218441,0x0f6e43d6,
  125657. 0x5a07f658,0xaf51ec25,0xad303202,0x8fe5a6cb,0x10676ef5,0x95de68f3,
  125658. 0xca4e000c,0x7508e31f,0x77735254,0x783e5a95,0x00000159 },
  125659. { 0x2e537ad9,0xbc1db571,0x35be9cf7,0x5e87112d,0xd57f9bcb,0xbb522b48,
  125660. 0xa8b3cbc7,0x1eff7890,0xe5ecdb5c,0x4f306e11,0x3387e7ed,0x30da8392,
  125661. 0x72321e3d,0x4d91fcf4,0xe412a67c,0x8487bb62,0x0000009f } },
  125662. /* 66 */
  125663. { { 0x8cb8e08e,0x86f5f80f,0x2496fed6,0x7cfd2c41,0x60b7dcdf,0x0061b743,
  125664. 0x57f4d05f,0x4dbaffdf,0x458061f2,0xb1993c2a,0x9de994c4,0x6c6ca8d0,
  125665. 0x2747e062,0xef70d24d,0xb9995cbc,0xd4e5d4e3,0x000000ff },
  125666. { 0xc6f40077,0x3171e245,0x0723e506,0x1592e045,0x6a6bfd88,0x35c86f7e,
  125667. 0x6d9d9ce0,0xba0959d1,0x3eb5770c,0x2e7f8fe8,0xc40d63dd,0x58eb0881,
  125668. 0xeb9e4419,0x56333bda,0x3afd1f4d,0xfb0397df,0x00000034 } },
  125669. /* 67 */
  125670. { { 0xb358815c,0x7b84e05e,0xe41087d9,0x3abcb2d4,0x07f05d7a,0x87a75889,
  125671. 0x7a9d481c,0x350778d5,0x42d64cbd,0x9d34cff8,0xccf289fe,0x0859cd5a,
  125672. 0xdd2b2c6e,0x8372d591,0x18b40b62,0xc06d482e,0x0000006b },
  125673. { 0xda4ed375,0xd10695a0,0x298daaea,0x51baf588,0xf4b7092c,0xb028a1b4,
  125674. 0x7a335b35,0x8ab87dae,0x0567efd8,0xa7359362,0x3320c374,0x7a49fc10,
  125675. 0xa3558b30,0x737acac4,0x4c0fce9b,0xd30696a3,0x0000001e } },
  125676. /* 68 */
  125677. { { 0xbd3902fe,0xd9550ab0,0x86a9d3b3,0x9bba4b4b,0x975cac37,0x3a59e0a9,
  125678. 0x333605dc,0x045e8731,0x1afc2c58,0xf2c598c2,0xeef9cbf1,0x81ff8d6f,
  125679. 0x9bf83c42,0x82bed5d0,0x528131d5,0x9d1d9d5b,0x00000157 },
  125680. { 0x5519258e,0x687da305,0x027de2a8,0x73f539f9,0xd6a230d6,0x69fa9747,
  125681. 0x5f5d1684,0xab1aeb23,0x5f7e41f5,0x5bbfe947,0x16a7feb3,0xbd546abb,
  125682. 0xe16d5187,0x2afbd4e8,0xbcc953dd,0x7437be13,0x00000160 } },
  125683. /* 69 */
  125684. { { 0xee9755a3,0x55f165a9,0xb82c9ab1,0x0c8d5a1a,0xab6b97e6,0x65a1e45a,
  125685. 0xab05e271,0x3004cdb0,0x6db0830f,0x9e0c3b52,0x75acbdeb,0xaae1ec1a,
  125686. 0x761e8498,0x413d4484,0xb1b9c62e,0x589e09bb,0x000001e9 },
  125687. { 0x9c72258d,0x67512081,0x5c1593d4,0x61dcd734,0x91c11fdb,0x6c627a7b,
  125688. 0x8857908e,0xd1d3e9bf,0x530bc68e,0x9aac06fe,0x6b5b44ff,0x125c16bb,
  125689. 0xdb90edd5,0x38860bb6,0xfbbedb5c,0x96fe8b08,0x000001aa } },
  125690. /* 70 */
  125691. { { 0xf257c0f8,0x323a5dd8,0xdd3a10d9,0x4884dc92,0xbbb8ce03,0x03f379ce,
  125692. 0xa47262a9,0x6217ad53,0x52e06c6d,0xa1df2017,0xc32428cd,0xf5b723e0,
  125693. 0x2c30c62c,0x1e5d3889,0x477f82cc,0xd9a90f1f,0x000001fd },
  125694. { 0x1763ab59,0x830d27ba,0x723783e9,0xcf27d93e,0x945968aa,0x81558264,
  125695. 0x1700d5d5,0x63251a32,0x03146d9f,0xcf6bbe73,0xe65bf0f2,0x6cdcf455,
  125696. 0x632323fb,0x80aa00ce,0xd96a4744,0x6e49e62c,0x00000149 } },
  125697. /* 71 */
  125698. { { 0x40574c09,0xbeff0b7e,0x3fe80e96,0xb76f2643,0xeb237d91,0x0b3bd352,
  125699. 0x7edc3102,0x3c0c62b7,0x424a36dc,0xf989394b,0x7c6c435e,0xe9ea64c2,
  125700. 0xe388d076,0x2dfc21c4,0xa4e69e4b,0xcc3852f6,0x00000139 },
  125701. { 0xbb096b91,0x5238a3ff,0x73d8d43e,0xee72c9e5,0x8c577558,0xc116db11,
  125702. 0xdc47d4b4,0x54ec89d2,0x42e1955f,0x2006dd35,0x7437475c,0x004aed6a,
  125703. 0x2bee9041,0xc1ddc32a,0xed9332c9,0x597417a2,0x000001fb } },
  125704. /* 72 */
  125705. { { 0x859bae66,0x3c0f1981,0x845d7c1b,0xab48e9b1,0x452a3c1e,0xc6ce9c03,
  125706. 0xff810339,0x2384a00c,0x5f98d6fe,0xcd7ede11,0x38a0dd5b,0xf7a00e3d,
  125707. 0x3c7e1c06,0x56dd948a,0x8e53a61f,0x9d21a7d1,0x000000d0 },
  125708. { 0x880eb3fb,0xf9cfdbaf,0x5e83f7c9,0x64cfd297,0xa28a74b4,0x61ba7d6f,
  125709. 0xdfb13e03,0xb8200d5f,0x232a6128,0x03bc8f4b,0x81a8d86e,0xd1fb92c2,
  125710. 0x706d6ea7,0x68675fae,0xefab18c2,0x9b08608a,0x0000011d } },
  125711. /* 73 */
  125712. { { 0xbbd2f539,0x17cf6146,0x76e26ba2,0x96052fc0,0xd4be4a67,0x36821d18,
  125713. 0x9f3f39a8,0x8f823422,0x433f873a,0x68b846b9,0x716f4568,0x7a1d3f36,
  125714. 0x2fd47750,0xdf603e28,0x6975e226,0x77cb02c5,0x00000003 },
  125715. { 0x8c01dd59,0xf275add3,0xb9c1a37a,0x9c213a9e,0x4dfc5403,0x690ad104,
  125716. 0x07ee0d86,0x202ee206,0x661fc40e,0x896ede95,0xd0b02f56,0x6b4d7398,
  125717. 0xe5af1a24,0xccb96991,0xc13f7125,0xd5c281af,0x0000009f } },
  125718. /* 74 */
  125719. { { 0xd7073a5a,0xc858c54b,0x861eac7d,0x87c81a5c,0xe720201a,0x51f84a39,
  125720. 0x40e003ce,0x952a9f8e,0x58f199de,0x76bdc4ab,0xd56cc02b,0x1cf12322,
  125721. 0x83f162f3,0xb6634e63,0x8f969e11,0x84c017ee,0x00000169 },
  125722. { 0x5c89f1fa,0xf1f43362,0xb697b078,0x4a02a630,0x4b05b7f4,0x33311e5c,
  125723. 0x4fede4cc,0xa7ccae51,0x4b025aa4,0x0d26e874,0xf84db7ad,0x7d5b77bb,
  125724. 0xf571c1fe,0x39ef1aa8,0x418ccd20,0x65eba928,0x0000018d } },
  125725. /* 75 */
  125726. { { 0x8abb2537,0xa37866ab,0x65b3096f,0x14ac4cbb,0x2a428ad3,0x827fa7ed,
  125727. 0x10e9e196,0x95d19f62,0x89801b4e,0x31eb97a0,0xaae8b823,0xaae77a62,
  125728. 0x5f5c9642,0x9693d62a,0x3e368b84,0xff5bfe97,0x000000ad },
  125729. { 0x492b0dee,0xa3efae21,0x9602c2ce,0x2143e9ee,0x6f3b99e5,0x21367c99,
  125730. 0xe93b8f59,0xdd78b2b0,0x1064c13e,0x8d541c38,0xf5738e7a,0xe6b970da,
  125731. 0x8373b1a4,0xaf6ecc16,0x74ae208f,0xdbfa3f4f,0x00000180 } },
  125732. /* 76 */
  125733. { { 0x907a6aa0,0xb024621a,0x407879f6,0xef56cb68,0x8168a934,0x44c38b68,
  125734. 0x9b9a9048,0x70d638d3,0x82541f20,0x6968caa0,0x1fc88b50,0x0c597053,
  125735. 0xaf635784,0x5564ded5,0xc4d494cf,0xe7e898c7,0x00000097 },
  125736. { 0x6b6ebb2f,0xe1dc98d9,0x7aa9e126,0x292a17fc,0xfa2a2c68,0xb60f0fdb,
  125737. 0xb2e1851b,0x9c63270c,0x81ca4cfe,0x898db265,0xb11959d5,0x94082638,
  125738. 0xa54b8d19,0xe44f308e,0x44e63094,0x96399eb8,0x000000d6 } },
  125739. /* 77 */
  125740. { { 0xb83769ee,0xfa00f362,0x3efc4cb3,0x72d040ac,0x57abd687,0xc3933889,
  125741. 0x940a7128,0x62264425,0xec242a31,0x909c4c8f,0x65a1a551,0xd1e48f1e,
  125742. 0x049c2172,0x68bd70f1,0x709b7fd4,0xc8692d2b,0x00000041 },
  125743. { 0xdf816784,0x4e388aa1,0x01be75ce,0x4a58c8a5,0x02a67812,0x9b49dffb,
  125744. 0xeda721e0,0xa73299e0,0xe67a65ec,0x8a0bd1f5,0x856c71b6,0xd81e91e8,
  125745. 0xc005aa30,0x37aee2f4,0x0595bbf2,0xd9400750,0x00000073 } },
  125746. /* 78 */
  125747. { { 0x010c0ef3,0xa912ac4a,0x4e81b1a0,0x0e654bd8,0x4f353509,0x8f0563dc,
  125748. 0xb47d189a,0x10dc41f3,0xf238c09c,0x122edd06,0xc41acf67,0x224c16af,
  125749. 0x83758520,0x1ccb9334,0x2275ae6f,0x1a4b5f29,0x00000127 },
  125750. { 0x3ce688b5,0x792fd473,0xdca9c68b,0x14566d37,0x541711d0,0xfce9326e,
  125751. 0x3cc341a8,0xe3ba14ee,0x2122c11f,0x6b8ab4cc,0xf5d379b5,0xc0fa763b,
  125752. 0xf1522f91,0x95e2d2ae,0x31cf95a5,0xd4e21b3d,0x000000ac } },
  125753. /* 79 */
  125754. { { 0x1d8e061a,0x4013a779,0xacc84a30,0x62707e70,0xeb2f636a,0x6ac08266,
  125755. 0x77b25c9d,0xe917ea21,0x70ff35cf,0xddb78bbd,0x041898be,0x5008db2b,
  125756. 0xce0ae445,0x0f58a4fc,0x2257d0e7,0xed092397,0x00000043 },
  125757. { 0xe2e129e6,0x2cad77b3,0x0f1be4d7,0xfb8c4a87,0x20056333,0xaee50dff,
  125758. 0x2a691543,0xbc2658c1,0xb8fe2640,0x95dc0cca,0x1965a0af,0x694eb584,
  125759. 0xedd1d99e,0x7d3baa53,0x8a1edc87,0x2df13b20,0x00000083 } },
  125760. /* 80 */
  125761. { { 0xd181c3f2,0xfead2247,0xf337b23f,0x915d35be,0x74890672,0xdb4cfcba,
  125762. 0xfda7a3a1,0xe4f70d8f,0x79275686,0x226b6419,0x6ff1f79e,0xe8040863,
  125763. 0xcf5fa4e8,0x98e84b39,0xd8a09f60,0x57aa0be9,0x000000da },
  125764. { 0x4efcea66,0xd40cecf5,0xafc76fae,0x98df2aec,0xc91585a8,0x63f19a48,
  125765. 0x13f00aa5,0xb111bda7,0x44b5cb9f,0x6687afab,0x652620d1,0xc6d5fb12,
  125766. 0xbacb35ab,0xaf953f1b,0xff94c4d2,0x99709370,0x000000ed } },
  125767. /* 81 */
  125768. { { 0x68b54c89,0xac9f56e0,0xce737c22,0x08ecc17d,0xab089b53,0x208ee83f,
  125769. 0x543fbd1b,0xb0f3a129,0x844dd706,0x1b204cf8,0xdec2e40d,0x80975c89,
  125770. 0x9399914a,0x08b011ae,0x74674df7,0x6b4ba170,0x00000017 },
  125771. { 0x8fdfc175,0x71216ea9,0x7e0f5b0c,0x77b7fc63,0xceb33a34,0x88d0285f,
  125772. 0x0223eab7,0xb679814f,0x51c6d922,0x9078720b,0x9c13f51d,0x5859d5a4,
  125773. 0xfaed60b5,0xe69f850b,0x6d0ccab2,0x2499a844,0x0000005c } },
  125774. /* 82 */
  125775. { { 0x73e7bcf1,0x41d581fb,0xdd3c17be,0x16dde61c,0xfa199fd9,0xc62997ec,
  125776. 0xc159db97,0x1a758873,0x64132830,0x4ed77896,0x2942a918,0x9672ce89,
  125777. 0x816ba4bb,0xf3ee4587,0xce54dd7f,0x4fb7a148,0x00000123 },
  125778. { 0xf009be8c,0xf05d80af,0x78df1ba1,0x62e938d7,0x312de620,0xa7e22e84,
  125779. 0x6070c4b9,0x48d29e7f,0xa1b5da37,0x5cd9c3eb,0xa4717453,0x1e51bd2f,
  125780. 0x56ab9e67,0x94098ab0,0x49f7c6a1,0xbb584abc,0x00000049 } },
  125781. /* 83 */
  125782. { { 0x1ea470f7,0xa9f25530,0xe9254e30,0xa01bf808,0x71a0038d,0x098569ea,
  125783. 0x5913ca87,0x0d2b2ee1,0xb8281fdb,0xae17004b,0x118e5c2a,0xdb5c6eb0,
  125784. 0x1fa943ab,0xa56ac64c,0x1a92d501,0x1aaf6477,0x00000053 },
  125785. { 0x06345730,0x9679ef49,0x846f37c2,0x946aaa4e,0x1a7c3aab,0xf81726b0,
  125786. 0x8166df4e,0xcb808da2,0x4e04dc3e,0xe9fb3fc2,0x76ec19b4,0x9e0b61db,
  125787. 0xeed6d13e,0x6e7f665e,0x86a75384,0x70ed8c07,0x000000e5 } },
  125788. /* 84 */
  125789. { { 0x108ce13f,0x66456e58,0x0e397813,0xb5bfc58d,0xea3949e9,0x04b6a84b,
  125790. 0x75af667d,0xea9b66bc,0xa891566b,0x7cb4d6dc,0xbf61595a,0x1b3cecf0,
  125791. 0x002e2520,0x4312c73d,0x6135a5fa,0x81d76898,0x0000014b },
  125792. { 0x841078ec,0x4047bc25,0x179c454d,0x75aa9c96,0x4851f8fc,0x6a160609,
  125793. 0xce34091f,0x998d4e3e,0x88e54102,0x9a9f6704,0x5da8ac5e,0xbf280f88,
  125794. 0x8fec230c,0xc64caca0,0x5094b775,0x0ac864b0,0x0000002b } },
  125795. /* 85 */
  125796. { { 0x8f5daf7f,0x6b606e39,0x10927506,0x48385489,0x08c58a72,0xa2255c5c,
  125797. 0xc90f3ee3,0x2f362fd0,0x08795f02,0xc9633af4,0x0425f5aa,0x71710bd1,
  125798. 0xec06dbfb,0xc2017e05,0xc1b8bbcd,0xd9c7dc82,0x000001c8 },
  125799. { 0x18b8bed9,0x7db41fdf,0xe3a23125,0xe9483308,0x7291c4bb,0xbcf91de7,
  125800. 0x41448aaf,0x9b0b972b,0xc44da462,0x95dfc633,0x01bf50a2,0x90b9c463,
  125801. 0x869e3131,0x18b66f77,0x121baad9,0xa8a4e2fa,0x000000f5 } },
  125802. /* 86 */
  125803. { { 0xca0251ea,0x8ca55109,0x27a6c9b0,0xf2aeed8b,0x5620f528,0x901a8beb,
  125804. 0xae13fc56,0x9a8421e8,0x85993c07,0x1349f1c4,0x0d1ab0d7,0x29e08359,
  125805. 0xaeb5d909,0x96e2929b,0xf599a66f,0x96c2f1f8,0x000000ce },
  125806. { 0x12be8bd7,0xe4bc4b51,0x3c67e99b,0xf4846a0f,0x4d3a3864,0xd89cc7d3,
  125807. 0x73f43981,0x1f647112,0x26dce567,0xc32bc324,0xf02b096b,0xf7134ebf,
  125808. 0x0d0682b7,0x5604f00b,0xe3ce8b59,0xfd23d7ea,0x0000011c } },
  125809. /* 87 */
  125810. { { 0xa27689a6,0xf89646cc,0x5564172b,0xd6a7dc43,0xb57cbfcc,0x30bda48e,
  125811. 0x5b1adfe5,0x9b11fffb,0x711d8bf4,0x9f2d80db,0xb70e5a5b,0xe879fdf0,
  125812. 0x6bd18a1d,0x97534183,0x8cbfd504,0xc8c526bd,0x00000114 },
  125813. { 0xef7388bd,0xd5fe725b,0xe7ffaea7,0xf1c3dbdf,0x7e6de2ac,0x78395b89,
  125814. 0x9ebf1bfb,0x81a72c9a,0x69785146,0x65265707,0xf52670af,0x3925ecd9,
  125815. 0x83d57d48,0x437bcdd2,0xc80ecb02,0xb5d732a7,0x000001ce } },
  125816. /* 88 */
  125817. { { 0xcfd376d7,0xa7f9fcce,0xa66b084d,0x6b4eab3e,0xd5b91bd8,0x6ac90d08,
  125818. 0x8aa304d8,0xaa3d5b7e,0x7f866a4f,0x27f3d42b,0xbb813ae1,0x95d19fa8,
  125819. 0xe34a9206,0xd38798d7,0xa32c1cdd,0xdf7c0a69,0x00000073 },
  125820. { 0x38315b16,0xbe2c01bb,0x9e18c8f9,0x1daa7c89,0x08b6b853,0xa3d43fb4,
  125821. 0x68092a81,0xb159e48c,0x836faad4,0x77e93d9e,0xa4699730,0xd4ed6361,
  125822. 0x6297e476,0x569cb3f6,0xe7811fa6,0xb69d8183,0x00000185 } },
  125823. /* 89 */
  125824. { { 0xab9cb764,0x18f27eb3,0x8ebc1d6d,0xbbbefc21,0x0479aa79,0x47760ddb,
  125825. 0x09e542f5,0xb4d16d24,0xbc699b96,0xe35c38d1,0x8c8d8c8a,0x13b2ae25,
  125826. 0x67a3a45d,0x8579c152,0x6c554c04,0x773b7357,0x000000d9 },
  125827. { 0x0218c299,0x9620a473,0x99f78a33,0x69be29b3,0x484f414f,0x4684a009,
  125828. 0x9a2ca4d4,0xb2c74937,0x68db7ab3,0x09c0773e,0x935c357f,0x6181f059,
  125829. 0x8b7de3f2,0x0931303d,0xe0fb6e08,0xf3effcd0,0x00000060 } },
  125830. /* 90 */
  125831. { { 0xb25d6530,0x723c14be,0x9a97d40f,0x5e015b39,0xfbf7f622,0x209c3c4b,
  125832. 0x14b4f0f1,0x83d8c59c,0x3f7e8ecf,0xcf002fde,0x1eb1ef0f,0x35d353c9,
  125833. 0x201f0c60,0x394c42a5,0x7be8ee34,0x787128ab,0x000001b5 },
  125834. { 0xb70110cd,0xa0937d3a,0x477911b5,0xe0fa4efc,0xc53a4c19,0xc6acaf5b,
  125835. 0x38d509f2,0xbd3010f3,0xe54ac1c6,0x3ee2a82b,0xe4f2a3bf,0x31ea67c3,
  125836. 0xf089c7b9,0x7a4ca66e,0x34a2362f,0x5bda2c4f,0x000000b0 } },
  125837. /* 91 */
  125838. { { 0xd1f575cd,0xb424a071,0xa5237182,0x15693b01,0x9a2c9d40,0x14133602,
  125839. 0x9c914a60,0x50c4348b,0x095b31c1,0x9024573d,0x22fd4962,0x6f975fd2,
  125840. 0xe210b277,0xa1704886,0x6dba937b,0xac29b813,0x000001f6 },
  125841. { 0x775da491,0x09edef55,0x2b6aad82,0x25953f9e,0x1bb40d5b,0x6696a106,
  125842. 0x4d5127d8,0xcfc45311,0x81ead062,0x2f21dca9,0xaf3b7123,0x3f3e4f07,
  125843. 0x9646f20d,0x12cd06b8,0x6910f5bb,0x24136369,0x0000015e } },
  125844. /* 92 */
  125845. { { 0x3ecfc44e,0x0c844fd0,0x5043b3d5,0x4095f2c8,0xc9bd059a,0x9a5fe7db,
  125846. 0xf65becdf,0x239328fa,0xa67961cd,0xe3102471,0xbbb5dfdd,0xea9e39bf,
  125847. 0x133dc5ba,0x8022b6d0,0x5f12c379,0xbed7aa9b,0x00000141 },
  125848. { 0xfd94d941,0x096f0059,0x7d4ff018,0xfc6e9f00,0x779f05e3,0xe63af598,
  125849. 0x00483c99,0x4c40f0b3,0x72a19870,0x04d2feef,0x464a4a71,0xdb773b5b,
  125850. 0x49367f1e,0x00b6770f,0x2a9fbd2a,0x4f7e0301,0x00000169 } },
  125851. /* 93 */
  125852. { { 0x8a9095fd,0x0df5dd73,0xd3ce857a,0xc4b7a021,0xe5edc767,0x90aa796b,
  125853. 0x180a0808,0x56497eff,0x66f10aab,0xb9856e1f,0x39879766,0x31298824,
  125854. 0x3ba80601,0x61748cf7,0x555da929,0x07d9076c,0x00000012 },
  125855. { 0x1c44394d,0x0b049a01,0x0ce49e45,0xf5f25ef7,0xb1694265,0x1e3a09f0,
  125856. 0x109b33f8,0x2c5bd9fe,0xa30932e4,0x07f2a43f,0xc6cf8af2,0x736abfca,
  125857. 0xf3366722,0xadf7fa04,0xfa9d26b0,0x2f1e92fb,0x000000e0 } },
  125858. /* 94 */
  125859. { { 0x63be4d4a,0x9524e4a6,0x66f3cc91,0x1fa57bed,0x7e7a7ccd,0xdd7c93fa,
  125860. 0x88c5d1d3,0x70e8cf6a,0x3f251f1e,0xb257997a,0xe3554cf5,0x0a5ec58e,
  125861. 0x065a7109,0x68d268d7,0x085089ea,0x7c23d4d2,0x0000004c },
  125862. { 0xbd52d132,0x63ae575b,0x38c81cc5,0x0fb8daa7,0xe4e63b99,0x096a6e51,
  125863. 0xb239d387,0x51d6b366,0xa5d49fed,0xed5f8874,0x43a8c07a,0x025091d9,
  125864. 0xe4686ae2,0x100f845a,0x7eb4ef5a,0x1af59d74,0x000001c2 } },
  125865. /* 95 */
  125866. { { 0xdd441308,0x5f7bc01e,0x86308890,0x0dc34944,0x759611cd,0x2af38a74,
  125867. 0x4c23ce66,0x11a71261,0xf8bafed2,0x37f317b5,0x4c93e079,0x4efbb9ff,
  125868. 0x8ecc52cf,0x880f0edd,0xddc9d82a,0x480cdd2c,0x00000028 },
  125869. { 0xc3f807ac,0xe8f1ca0d,0xbd070549,0x6a3e4fc2,0x91f8bb6c,0xad3d0a14,
  125870. 0x3d6dfacd,0xe3ee1cfd,0x5fb46ffb,0xee46b1b9,0x7dd5cfbc,0x5207b3ac,
  125871. 0xb1b8e8b7,0xd580c0d9,0xc7bdd11a,0x52c669f4,0x00000084 } },
  125872. /* 96 */
  125873. { { 0xc0ace6d5,0xa42b4747,0xbe7287ad,0xd5acb64b,0x89bc2614,0xf3304899,
  125874. 0xff05c71e,0x817fe836,0xd35ac450,0x772eb246,0x375a9c3c,0x7f5fc216,
  125875. 0xcbc0d6fd,0xfb6f9e1a,0x720e9733,0x7643c315,0x0000009a },
  125876. { 0xf3845ccf,0x4b2216b4,0x90bc05bd,0x9c174e80,0xd6049037,0x7a550c74,
  125877. 0x6358c806,0xbd7220a1,0xaa677b6d,0x838f9c41,0x66e2e08e,0x37332c19,
  125878. 0x496f6da5,0xb032875e,0x9c30630d,0x52b274cf,0x0000000c } },
  125879. /* 97 */
  125880. { { 0x8ea58beb,0x6ec2e782,0x3665fa48,0x2b404c1d,0x20b40ff0,0x546d5fad,
  125881. 0x29d3e6a5,0xfb5df7b6,0x66c81991,0xf186846d,0x6e2cfe3e,0xbe690bde,
  125882. 0x1410d16b,0x97aeb9a0,0xbacc8e92,0x59d81548,0x000000cb },
  125883. { 0xbaf66a23,0xd905d3ad,0x40dfb081,0xc3337387,0x4b00f432,0x6d5535de,
  125884. 0x07d3a03e,0xe17fe8e8,0x066bca80,0x29544ff7,0xbadffa55,0x60c2b96c,
  125885. 0x45a26ea4,0x9f018d94,0x24a34ffc,0xd5438167,0x0000011e } },
  125886. /* 98 */
  125887. { { 0xbd7f8a61,0x62a873fb,0xbbe580bb,0x5e18cd71,0x667f6980,0xfd5c9eb3,
  125888. 0x571d3dc0,0xab8d4f61,0x783f9bc8,0xe2e45215,0x24398b14,0x36c3774b,
  125889. 0x74d811b5,0x2db4a363,0x2debe3c3,0x9f7f1297,0x00000138 },
  125890. { 0x798fefb2,0xbb97f21c,0x107baa72,0x9c76fcb5,0xfadbb568,0x12fbf760,
  125891. 0xd33ea6c5,0x1a648be7,0x236134a5,0x412a2993,0x8985893b,0x4a3d8169,
  125892. 0x3e66ada4,0x6144958f,0x7687b457,0xb4dfc79b,0x00000140 } },
  125893. /* 99 */
  125894. { { 0x7abe5bb9,0x83b14570,0xe51d81be,0xae0cbfd8,0xc9827aff,0x20dadf49,
  125895. 0xa687b554,0xc3a72548,0xeeb41733,0x080263fb,0xd3827c63,0x7014fdc3,
  125896. 0xb5e3b70e,0x7d018f84,0xfbcf7168,0x1d483e00,0x00000015 },
  125897. { 0x6b578aa3,0x154e3c7c,0xd3043dae,0x511ce9b5,0xb6008101,0x55f89e9b,
  125898. 0xf405ac6f,0x4ec31112,0x2008ac7b,0x7e66a4d8,0x25c52fa6,0x73c00d39,
  125899. 0x8acac2eb,0xee1b9998,0x60b57453,0xdfa31d95,0x0000008f } },
  125900. /* 100 */
  125901. { { 0x251cf8d8,0xcc74a0e0,0x041f2bd2,0xd4d8949d,0x33ebce52,0x0b734a49,
  125902. 0x5c5bcdae,0xe1ac5f51,0x16200b93,0xd3ecdfcc,0xa793736e,0x2506a266,
  125903. 0xea6e6940,0x585a1c8b,0x9190f935,0x081cdd53,0x0000000e },
  125904. { 0x53e28412,0x055f9956,0xdb27164b,0x0d1526f2,0x1df3adc7,0xcd5625eb,
  125905. 0xdd35dedd,0xd2c453ca,0xa838ffe2,0xed442849,0x5c0ce589,0xad20c137,
  125906. 0xbd99b609,0x2d5fba81,0x622efb07,0x5be41dcc,0x000001ad } },
  125907. /* 101 */
  125908. { { 0x8f850756,0x563af667,0x52f3b597,0x86d37aae,0x796842f5,0x10d38a53,
  125909. 0xf743f997,0xcdaaf99f,0x93f1a8ba,0x2fa755e5,0x409f7cd9,0x1af04e15,
  125910. 0xd6d0650b,0x63bf9a0a,0x55abfd9a,0x67b1cead,0x0000000e },
  125911. { 0xb5f43178,0x3660a8e0,0x9cc35b33,0x56bd412d,0x880f6808,0x3d7bfa63,
  125912. 0x2e622c71,0x7f372d66,0x6ff82445,0xad7b7be7,0x8db04e51,0x0f2bde80,
  125913. 0x4bd15c8d,0xe1e781fe,0xb8e502f2,0x1f475bfb,0x00000194 } },
  125914. /* 102 */
  125915. { { 0xd63543ec,0x79482bf9,0xa117ef3e,0x985cb67c,0x160ccc63,0x8ac50638,
  125916. 0x729bdc1e,0x556cbed5,0xa22686df,0xd62ed97d,0xc81eb77c,0xb124cb5f,
  125917. 0x72fa2ed9,0x4d7b4f66,0x78335b96,0x60b29aa7,0x00000172 },
  125918. { 0xa43df7c6,0x21bfc7b6,0xbc20706c,0x85acac23,0x345d9580,0xeb6f37bc,
  125919. 0xa32a08bc,0x9d8f20d2,0xd1953c5e,0xf08924f6,0xc4f680d0,0x7d25d7c6,
  125920. 0x2de9912c,0x64e6a237,0x52ce644c,0xda1c06c4,0x000000eb } },
  125921. /* 103 */
  125922. { { 0x411dd110,0x26677c5c,0x2c991c4a,0x0d6787aa,0xa45666d6,0x53be6a41,
  125923. 0xc15f9f15,0x73e716aa,0x0e0cc7b2,0xa93b863f,0x2a624ab0,0xa4057117,
  125924. 0x1a39c260,0xe5e7656e,0x2ef6f130,0xaf8d78b5,0x00000046 },
  125925. { 0x70f38dff,0x796214b1,0x123a1105,0x3e35d828,0x957ed812,0x046a44d4,
  125926. 0x0da60161,0x618fa9ba,0x54f84413,0xe7cdd2a5,0x19ea95ab,0xf1c2563e,
  125927. 0xcb2a30b4,0xc4459e14,0x61ff9aa9,0xc748add6,0x00000183 } },
  125928. /* 104 */
  125929. { { 0x9de58caf,0x32981f39,0x8753ea64,0x05bb80fd,0x2d119486,0xc83f9f24,
  125930. 0x03eeb00a,0xf490cf06,0x7c73d79c,0x4037f251,0x724d461b,0x844209fd,
  125931. 0x272420cf,0x6b03f6d2,0xb3438fa2,0x6f4bd29e,0x00000152 },
  125932. { 0xc389e51c,0x964d034a,0x6db7d98e,0xacda55e9,0xe913c583,0xb2ae97de,
  125933. 0xfeb03440,0x0793077b,0x9d461e29,0xaa16e378,0x043bf8be,0xb0a67533,
  125934. 0xba7d8c3f,0x9d749a42,0x6bb925dc,0x7c41e6d6,0x000000ec } },
  125935. /* 105 */
  125936. { { 0xc5da8398,0x2e9b345d,0xbb38c430,0xbc66841f,0x7c3bb47a,0xce3ac562,
  125937. 0x738d2cdd,0x8fbeb12b,0x68731185,0xd4bc2ad7,0xbbd4f4f4,0x9521db1c,
  125938. 0xfe4e1b0e,0x2a690cae,0x7bfebe3e,0x375215eb,0x00000194 },
  125939. { 0x2edfd661,0x4cb234f1,0xed52c1f4,0x0149984e,0xd8f8f98c,0x32d27260,
  125940. 0x7be38590,0xfe76e4e4,0x95e8b672,0x5435873d,0xf2b00e82,0x916c397f,
  125941. 0xbad61eb8,0x3b9bf705,0xae131bbe,0x7ee90182,0x00000000 } },
  125942. /* 106 */
  125943. { { 0x93fbcb5c,0xd36fea9e,0x9fa8529b,0x382be583,0xfd611ba0,0x0b243125,
  125944. 0xcd8a2637,0xa59ae37f,0x3d8d4704,0xab78c60e,0x44c41b79,0x1bac243d,
  125945. 0xeda49cc5,0xc4001fea,0x83dc7e9f,0x988ea44a,0x000000f6 },
  125946. { 0xf077f79e,0x4d90caa4,0xd9e2590d,0xf4d17601,0xd21b4b77,0x11debbb3,
  125947. 0x9037e1b6,0x031b3f60,0x135becf0,0xf113ed82,0xf2903dda,0xf6c01379,
  125948. 0xa6f19296,0x36bde7ca,0x9dbbad85,0x57d3b684,0x0000006c } },
  125949. /* 107 */
  125950. { { 0x9abfccb0,0x963fee38,0xb9676e63,0x6c6e2a24,0x84ba6d27,0xf8768f02,
  125951. 0x465853d1,0xc38ba3ba,0x1b8ab9b6,0x6e3ab36d,0x47a07331,0x01fc9742,
  125952. 0x25233f32,0xfdd41718,0xac61de7a,0x4dacfa81,0x00000021 },
  125953. { 0xeaa3198c,0x365a9f37,0xfc8b99d5,0xcbe8a345,0xd4f5ecbc,0xa427f12a,
  125954. 0x0c237514,0xe841ff60,0x28a27b05,0x5d9e8c5a,0x62859ff3,0x2d377444,
  125955. 0xea8bde37,0x1c0460ff,0x29cf5bf8,0x0a0e49a1,0x00000181 } },
  125956. /* 108 */
  125957. { { 0x45843c3e,0x688203af,0xaabebae7,0x4601e303,0x624df62b,0x397b08f3,
  125958. 0xd21e5aa8,0x5687348a,0x9a242b0e,0x2cf12c73,0x32a76c6d,0xc848ed01,
  125959. 0xf52751a2,0xb72aa1c2,0x92c02d05,0xb63296c3,0x000000f3 },
  125960. { 0xc6f3d1f0,0xce4b42ad,0x2f532b94,0x2f0dcc53,0x83443d9c,0x57813335,
  125961. 0xdc8dd9cb,0xb50118ee,0xee87192f,0x3039e1a5,0x557419c2,0x9977267d,
  125962. 0x30f96b0c,0x462efa4c,0x3cd3c35a,0x454fb796,0x000001f7 } },
  125963. /* 109 */
  125964. { { 0x9d153926,0x10f28194,0x82b57548,0x42e28c91,0x509e94c9,0x4b423b30,
  125965. 0xde9d6b57,0xc5acc52a,0x8b3ca314,0xaa746c39,0xc63d5bc5,0x0f4ea307,
  125966. 0xe1ccc989,0x425553a2,0xf76d9194,0x271198bf,0x0000008e },
  125967. { 0x3c8e672b,0xc7900e46,0x3f2dfc27,0x703675cd,0xaf2163c9,0x704951f7,
  125968. 0x7aceaab0,0x74d69908,0x7e8d2369,0x482f21a9,0x813dc115,0xdcfbc1dc,
  125969. 0x04f6cd13,0x0ce2bc80,0x82bfaff2,0x2a54662c,0x0000003f } },
  125970. /* 110 */
  125971. { { 0x1588a8bc,0x0dcf41e6,0x210c52cb,0x6f48cd0e,0x758e7a45,0x338562bd,
  125972. 0x48b9b957,0x1600d54b,0xa6b89b9e,0x461df80b,0x098cc82f,0xf7fd4f17,
  125973. 0x14977147,0x167f01cd,0x6116c5f9,0xb1338511,0x00000048 },
  125974. { 0x5d2617f0,0xdeb76333,0x6ecb8606,0x3f9a5772,0x1b91fce9,0xa93c032d,
  125975. 0x6c84b997,0xf7a4388b,0x823ca5be,0xbfe80225,0x35a32f6b,0x6f19c028,
  125976. 0xe3cb5c58,0xf26cd5ad,0x6d0c1dd9,0x7f5ddc77,0x000001e7 } },
  125977. /* 111 */
  125978. { { 0x6ee764c9,0x3c9feec8,0xb07c82cc,0xd1bec836,0xa005b142,0x6bf1b2e6,
  125979. 0x29e8a5ea,0x70ef51a3,0x3ffe241c,0x517d298e,0x72966c28,0xbb389e28,
  125980. 0x2c7acc76,0x3a2da8a9,0x732a21b5,0x902c9126,0x0000004a },
  125981. { 0x8f7ce110,0x96c51b9c,0xaeb036f1,0xdcc33a87,0x0a6a59e2,0x82695098,
  125982. 0xe78db500,0xceaf26a7,0xc95bb030,0x82f3c384,0x24c42f42,0x6dd6e9f7,
  125983. 0x70ac4a0a,0x768dde29,0x03d22efc,0x4aedce4b,0x0000016f } },
  125984. /* 112 */
  125985. { { 0xeded03c0,0x077f032a,0x588ddd4d,0x2684a052,0x9a85be0f,0x6d09bc4f,
  125986. 0xe0b9b6bb,0xbdda0c7f,0xf2fb5887,0x19689c7e,0xec3cce7e,0xf8a96960,
  125987. 0x768d2ae5,0xb043d9d5,0xdb21219a,0x29c8081b,0x00000068 },
  125988. { 0xde59f006,0x6bf872fa,0xcb97ef5a,0xc2b9ffc6,0x58ae7ef8,0x371915db,
  125989. 0xf4ccaa1f,0xc2e23ca1,0x89c27cc4,0x1af8c60e,0xc86bdcc6,0xeee5d7e7,
  125990. 0x9bd8de43,0x9225b47f,0x4b24f08b,0x53e7f463,0x000000b4 } },
  125991. /* 113 */
  125992. { { 0xe3048bda,0x54c496d0,0x43c3de4e,0xe2b67499,0x4c2d509e,0xac2049f7,
  125993. 0x543c5089,0xb01f691e,0x105a365b,0xcd9960a3,0x78b17049,0x34d93ffe,
  125994. 0xf82c9467,0x029f99b3,0x0161a755,0x785c5ea2,0x00000091 },
  125995. { 0x953dbdb6,0xb455f978,0x97eca19f,0xea9e84d9,0x36d4d75a,0x473bd029,
  125996. 0xc15276fa,0xa9c17ca8,0x47c76356,0x9cf66133,0x039738d2,0x4a68360b,
  125997. 0x69733609,0xd3e430a8,0xe2b27f21,0x0ae532de,0x000001b4 } },
  125998. /* 114 */
  125999. { { 0x5164cb8b,0x68110e82,0x2552a67d,0x6979af4f,0x8d185527,0xe10d6d0e,
  126000. 0xfb64eac4,0xcf6c5787,0xac424592,0x8408163b,0xfce0d810,0x5d8fff37,
  126001. 0xda84c15c,0x8b284e49,0x32663ec9,0xed805567,0x00000010 },
  126002. { 0x51f3ee9e,0x106f4030,0xb38adf1e,0x2e8e3ee9,0xa13d6449,0xd3c87a6e,
  126003. 0x80e1abb1,0x27b49f45,0x0bfd7298,0xc283d179,0xafc7a35f,0x8fe50fa5,
  126004. 0xade3ad4f,0x773da545,0xd9a21df2,0x78bfaae4,0x000001f8 } },
  126005. /* 115 */
  126006. { { 0xabad5678,0xae60d8e8,0xe600c25b,0x0afa72ce,0x4c288e21,0xb9d4e0b4,
  126007. 0xd254cf9f,0x64447f76,0x959e2ba5,0x1fb36bc4,0x2961132c,0x393c44d7,
  126008. 0xfc140f19,0xd7a8881f,0x8d096648,0x27a86128,0x00000091 },
  126009. { 0x8a9e690c,0xb536c021,0xeab4fa15,0x85dcc521,0xb00ee54c,0x09af4423,
  126010. 0xaf3a8e48,0xb3793525,0xb7731d85,0xe1f36308,0x141cfb55,0xb5361d78,
  126011. 0xeffc4529,0xea41f29e,0x9f7d2634,0xcf5755b1,0x000000e8 } },
  126012. /* 116 */
  126013. { { 0xd212b398,0x01edb80d,0xd53dd373,0xd0396181,0x8a52fa95,0x0e086047,
  126014. 0xa7825e6d,0xad1e6432,0x330ece4f,0xe0185bc5,0xb078936f,0x508f7313,
  126015. 0x9e7f6ea3,0x1dc982fd,0xd5556b60,0xdbf3a602,0x000000e8 },
  126016. { 0x279e05bc,0xc3763234,0xf44453d3,0x7f5f40ec,0x7fa30793,0x310c5f4d,
  126017. 0x108d7e22,0x5cffad36,0xc2a98bbc,0xf2f01ef3,0xd7d47f80,0x30ab1719,
  126018. 0xa9b22e1c,0x7bc9f918,0xe834df94,0xf53dc52a,0x000001f9 } },
  126019. /* 117 */
  126020. { { 0xc183f89b,0xf266b49e,0x5f5806d4,0xd3fb5f02,0x94ec3080,0xd30a42b5,
  126021. 0x371cd917,0x4b6b1940,0xb7f7e26d,0xf7541aab,0x2d5b7b64,0xe55269eb,
  126022. 0x7f8036c5,0x0e1a85c1,0xda5f2675,0xa0ff0f22,0x000001ce },
  126023. { 0x3a8e11f8,0x602bd56a,0xf5f9ab54,0x29864021,0x0ccc92d7,0xc6742c5a,
  126024. 0x523f650b,0xd64569e6,0xf7fabfb4,0xc8e4681b,0xc3c9e6cb,0xb4275947,
  126025. 0x38f5ff20,0x2b3952d5,0x1f04aea2,0x818f8e38,0x000001b0 } },
  126026. /* 118 */
  126027. { { 0xe50d90f0,0x3be5bffa,0xf5011cdc,0x4cb3b11b,0xa691dfac,0xe10ca711,
  126028. 0x4ea1a773,0x62ec211d,0xe586eeb6,0x5a979ebb,0xa0c2f1fd,0x4df16ab1,
  126029. 0xc57bbfea,0xfe9e3f7e,0x5ae526f6,0x1b05960e,0x0000015e },
  126030. { 0x8630e62e,0x1c8e04a5,0x6447e1b7,0x3d00310e,0x43b4447a,0xcf1e6b61,
  126031. 0x7462e7a3,0x92abb851,0x0002724d,0x8309ea08,0xe45296df,0x1d805d70,
  126032. 0x3d4ed812,0x0f3849b3,0x6834d44e,0x2d6bffbc,0x00000096 } },
  126033. /* 119 */
  126034. { { 0x48e07711,0xd13fe58d,0xd270a3b2,0x70f83648,0x8cdff04c,0x1517892d,
  126035. 0x51411f14,0x15bb6578,0x3e4f8a55,0x6c31cd90,0x0413362f,0x73f87152,
  126036. 0xeca06d4d,0x2fe025ee,0x954e317f,0x32a6e417,0x000000ad },
  126037. { 0x69d147df,0x7e38c63f,0x710bf37b,0xb69bb06e,0x28d514de,0xb94debef,
  126038. 0x8d11c3d9,0x4b2307fb,0x0385c604,0x3b369df9,0xe7800e83,0x68ea2f49,
  126039. 0x7d501c1c,0xf028b258,0x5cef7818,0x97078221,0x00000055 } },
  126040. /* 120 */
  126041. { { 0x54c1d751,0x10c351db,0xba0f9512,0x81445301,0xbfdc8bed,0xa77eb34f,
  126042. 0xcf23680a,0x498d8138,0xe04f2860,0x928c14a4,0x16a5b6da,0x96192dba,
  126043. 0x5f9a9103,0x49dea95b,0x01724102,0x80dd4578,0x00000085 },
  126044. { 0x0e09221c,0xe9072500,0xf21de056,0x62e05b21,0xe0e60950,0x448cafa1,
  126045. 0x6f775129,0x657fb97b,0xf1f34aca,0x5d2991bd,0x49ff15d6,0xa66cd5ac,
  126046. 0xd049ec79,0xdc1d6897,0xe72baea8,0x388fca84,0x00000067 } },
  126047. /* 121 */
  126048. { { 0xa6ef1dd3,0x6520b49d,0x3ba6cd76,0x391a045e,0xf33d5f48,0x9c84980a,
  126049. 0xef07474a,0xe53cf5b2,0x78bfb1ea,0xa35b2e9a,0xeda906fa,0xeca97fd6,
  126050. 0x1b9f2cf4,0xf1a93789,0x3ab28589,0x66753369,0x0000010d },
  126051. { 0x73691faf,0x5b510496,0xd57ec618,0xdc73d3a9,0x930a8525,0x7e2921bb,
  126052. 0x40b05b69,0x094f571e,0x413bedca,0x5e96a017,0x8d1a6b98,0x9e7d4f72,
  126053. 0x3eade8b7,0x55143fda,0xd16e454d,0x859b8444,0x000000fb } },
  126054. /* 122 */
  126055. { { 0x7c667aaf,0x7c22083e,0x4a91ccba,0x33545cb9,0x8ca0e94a,0xca1e9931,
  126056. 0xe4eaa0c7,0xc3afff23,0x42f56844,0xa21ac436,0x60d52d0b,0xfcc68a8b,
  126057. 0x6a9301d4,0x401a585b,0x907abce1,0x547f762c,0x000000a3 },
  126058. { 0xfbe260ce,0x63dd3ed3,0x80dc01fa,0x2717752d,0x6f1da3e4,0xd5fab75d,
  126059. 0x5261f10e,0x5f16864a,0xd20cd6bb,0xbe7b1f63,0x221ac656,0x9d638c10,
  126060. 0x673b918e,0x3137b8f6,0x4ada2fb8,0x23eb4438,0x00000174 } },
  126061. /* 123 */
  126062. { { 0x2a1fbcf4,0x194e27c4,0x5facd5ee,0x4c0d285b,0x915e6607,0x75c2ebdd,
  126063. 0xef0a6a9a,0x1e696510,0x067cf458,0x13c5afa1,0x7bee1fba,0x2be013c1,
  126064. 0xdad279e7,0x85a406d6,0x5142cf59,0x0042951d,0x00000031 },
  126065. { 0xa22bbc45,0x6a735ec1,0x7f56f4d8,0x4ee5391a,0x236001de,0x305af9d0,
  126066. 0xaa2f8d25,0xa8b21851,0x187db78a,0x0e2c36d8,0xa1a888c3,0xcfcc083f,
  126067. 0xbd3e7d5b,0xb91dab7f,0xf4fdd023,0x62d85460,0x000000f4 } },
  126068. /* 124 */
  126069. { { 0x4972d703,0xf568ba02,0x39098a03,0xfc44ca1d,0xae28c855,0xe9b8e542,
  126070. 0x5b1b4536,0x4fd4f360,0x4c7f7e48,0x2e08b07b,0x2230823d,0x042f3b98,
  126071. 0x1889fd13,0xc9ffd313,0xc6c68359,0x56af0652,0x000001bb },
  126072. { 0x06e0f16a,0xedbf05e2,0xd74644a5,0xfc1ac2fa,0x0f92c71a,0xe59a0a98,
  126073. 0x36c800a1,0x13ae37d7,0x236178dc,0x5f20efc6,0x2b46ef10,0x443a58b8,
  126074. 0x442509e4,0xc9517dcf,0x640ed9b0,0x7d0bb415,0x00000166 } },
  126075. /* 125 */
  126076. { { 0x3d22842d,0x3aa30a61,0xb3c4ece0,0x8c6e00f5,0x6df82b79,0x8764cf87,
  126077. 0x78d208c5,0xda92d86d,0xe788854a,0x0a52d391,0xa59b0994,0x499b26fb,
  126078. 0x04c5fc9a,0x5dc133ad,0x34e3f134,0xa5c09269,0x000001dd },
  126079. { 0xfad6d673,0x6f0dcac2,0x00f3b3fe,0x6d8fdf05,0x631756e9,0xece71941,
  126080. 0x0a4d80e3,0x3990f493,0x31d13001,0xf2aca936,0x75581638,0xee91966c,
  126081. 0xe6dd5679,0x6df0f574,0xccd71cda,0xbe124868,0x00000111 } },
  126082. /* 126 */
  126083. { { 0x475cc1b4,0xf644c726,0x2b73978c,0x915fc2f9,0x0e3d7eb7,0x65a7e6d1,
  126084. 0xf40c38e0,0xbb44e21a,0xe1ad24fc,0x988662b9,0xc35606e5,0x270ba4dd,
  126085. 0x1a4f93f7,0xc3834a2c,0x3362a4d7,0x93d0c9a2,0x00000021 },
  126086. { 0xf769fd7f,0xe2cb7b8c,0x89a213b9,0x1815da97,0x6b910fef,0x7b4f8c56,
  126087. 0x26931438,0x2088b309,0x925b37c0,0x477b71bd,0x26a640e5,0xa049a921,
  126088. 0xfd21c6ef,0xd3ddf1bd,0x232a56b2,0x9b5f9d7d,0x00000064 } },
  126089. /* 127 */
  126090. { { 0x679a9c35,0xd640adf8,0xcb74d796,0xcdad98e3,0x5f8e9daf,0x464b8ebb,
  126091. 0xad4a073c,0x4738614e,0x2edde557,0xbd86c0ee,0x576ce0b9,0x77331738,
  126092. 0x4095fb96,0x9b5d3327,0xee09aead,0x72f0aeb3,0x00000136 },
  126093. { 0x64e54ba5,0xa388c76d,0xdc474d21,0x63fe7af1,0xb2a77081,0x7fa3e9d1,
  126094. 0xde1240ad,0x0447b49e,0xc720303a,0xd9f64b66,0xe6bd0213,0xb1c78029,
  126095. 0x0aa03ea5,0x1caf1c70,0x3bb85d2b,0x179180eb,0x00000103 } },
  126096. /* 128 */
  126097. { { 0xaf2ed12f,0xadbf4f9f,0xf380fd8a,0xce1d19e4,0xa39e81ae,0x0957bdb5,
  126098. 0x626ef6bc,0xf9833321,0x0cf5b28d,0x110ae5ea,0x20392cd4,0xab159450,
  126099. 0x6bc67855,0x67c49887,0xa3fd61c6,0xce7e5938,0x0000004a },
  126100. { 0x28c7dea9,0x59c5b9ef,0x0a6a7184,0xd02f95ba,0x8202769c,0x034dc257,
  126101. 0x94dd6896,0x213b0b08,0xb5dea95a,0x03730b7f,0x617ca889,0xfe243ed0,
  126102. 0xfb1ba052,0x16cf4d17,0x226f96da,0xd8691d6b,0x000001c0 } },
  126103. /* 129 */
  126104. { { 0xbf8015c2,0xaa2edf3f,0xc49502d8,0xe7f8236d,0xa6a43157,0xe890f6e0,
  126105. 0xa2d04b0c,0x318ef325,0xa809dbab,0x9cc0668d,0xda67ca21,0xdd26937a,
  126106. 0x83febc49,0x8f27c12c,0x3c9b9844,0x87b3db2f,0x00000029 },
  126107. { 0xfd2e3dc7,0x37e7aed0,0x7415fd55,0x498e8bdb,0x58a45f25,0xfc0d6c9a,
  126108. 0x209c85d0,0x83d5baba,0xd579e1ee,0x31ec8dc6,0xa502bfed,0x1f4cad0b,
  126109. 0x1f41bef1,0xc432e6ce,0xbbffca65,0x3b10afaa,0x00000191 } },
  126110. /* 130 */
  126111. { { 0x53053af7,0xbd9f7df0,0xb28a1cf4,0x60304765,0x7ce90438,0x441778fc,
  126112. 0xac8c5ddd,0x8fbed36e,0xfb59ec61,0x27b1313b,0xa1b1becf,0x9d2656ff,
  126113. 0x945973a9,0x334e1345,0xc362b595,0x3261888c,0x0000018c },
  126114. { 0xaa7f6ff8,0xf413a414,0x3fab7c7a,0x092aeb88,0x7cc307ba,0xfa1d886b,
  126115. 0x2346100e,0xdc81c125,0x02140c93,0x93d4d273,0xe6104835,0xa1ed7e3c,
  126116. 0xdf1795f3,0xe2b91ecf,0x369ed416,0x160dc11a,0x00000191 } },
  126117. /* 131 */
  126118. { { 0x8b57d7cc,0x9a72f46e,0x4bf02386,0x3140b0e5,0x05b3a91d,0x886c396e,
  126119. 0xa4ec26e0,0x1b9ab3a9,0xc50f58e9,0x742feaeb,0x55e26af0,0x1592c608,
  126120. 0xbb1cd9f7,0x943cd476,0xc7f02c89,0x3ed97fd4,0x0000017c },
  126121. { 0xe6d54964,0x53b02503,0xc6a318c0,0xd9bd1162,0x9cc28c22,0x18ff6cf4,
  126122. 0x03534640,0xa45c7840,0xb4cc0668,0x8ea3335e,0xf42dbe03,0x7ad727f8,
  126123. 0xfdf6c3cd,0xb157e911,0xec992d76,0xa7f894c9,0x000001b3 } },
  126124. /* 132 */
  126125. { { 0xaf09ea77,0x91e6e397,0x75dc25c5,0x26a760b9,0xb94a197b,0x8c040c08,
  126126. 0xb68ce619,0x041baca8,0x5bd23564,0xa19a0d15,0xd977b33f,0x86ca5b94,
  126127. 0xe5fbd029,0xf31f87f8,0xb1901f99,0xf76c55a6,0x000000b8 },
  126128. { 0x3846ec9f,0x175bf8c3,0x9deaca46,0xf462205c,0xa3108df0,0x92cb5ec0,
  126129. 0xcfaed928,0x879db283,0x65049fb2,0x477dc004,0x96ee5031,0x48d24bac,
  126130. 0x56adce45,0xa7db6b16,0xab1c684f,0x0110cdab,0x000000fc } },
  126131. /* 133 */
  126132. { { 0x4d308bf2,0x151b66d8,0xd6638004,0x99013c9f,0xfd383bf9,0x6892df92,
  126133. 0x3ffc8efc,0xa10efd84,0x313ea287,0x527e316c,0x3a0df740,0x8ef6e3cd,
  126134. 0xf6ebd2a1,0xcb96e430,0xa70ee4ce,0xc1ebecf2,0x0000018c },
  126135. { 0x1a70404c,0x80d14ad7,0xf9ce2a30,0x6ad21dd0,0x3aa3e072,0xb94cbcde,
  126136. 0x6363a690,0x0ab59611,0xc6b1e2b4,0xe70bff45,0x66ceec5b,0x1296dd0b,
  126137. 0x747757c0,0xd4cb2a74,0x3d7d91e8,0x08988ca6,0x000000aa } },
  126138. /* 134 */
  126139. { { 0xf8db0396,0xaa2dcfca,0xb422da76,0xe8ae8f37,0x96485724,0x652f8349,
  126140. 0x7bf1493f,0xf647c3c4,0xb0247a4e,0x8b600b46,0x7aebda8e,0xabf3e439,
  126141. 0xa7958df0,0x2e1d231f,0xf881bab2,0x38e692b1,0x000000ef },
  126142. { 0x26cf3047,0x1f3c1689,0x59539858,0xdad14f94,0x293f20b6,0xfde85d1c,
  126143. 0xf57abb17,0x2ea5436e,0x1794de38,0x0d1a8ffc,0x2bfecd2f,0x9ba508e2,
  126144. 0xdb786042,0x110f0a7f,0x7cde31f8,0x2ade6f64,0x00000196 } },
  126145. /* 135 */
  126146. { { 0xfec78898,0xc996a537,0xde0fa77f,0x0b39de72,0xd34cb08f,0xf6d076ac,
  126147. 0xda78d353,0xacd8bb82,0xa0392cc1,0x5fe804d3,0xe581549d,0xab7adede,
  126148. 0xc067c6d9,0x883901a0,0x4ed93f37,0x5855ffa2,0x00000191 },
  126149. { 0xbf9ebef3,0x29570e36,0xdf4b3177,0xe21046a5,0xa6816b5c,0xf9b89a95,
  126150. 0x288d0e11,0xadf39281,0x3979159a,0xd6baabe5,0x5c8fabb2,0x411afee0,
  126151. 0xe5c7af10,0xf192c3af,0xd7dce37b,0xaa72e81c,0x000000f7 } },
  126152. /* 136 */
  126153. { { 0x16c386ee,0x20fa3c0f,0xd4c09839,0xb33b0469,0x876a3136,0x79e0d722,
  126154. 0x3c406c06,0x343c0a92,0x4debe27d,0xef220e3e,0x196f00ea,0x09d7b1e1,
  126155. 0x24a9dcff,0x4a0f5dd8,0x99c1d085,0x53582ec5,0x000001e2 },
  126156. { 0x5138c7ed,0xcc8ef262,0x6547f88d,0xdec43194,0xdd0a9488,0x2b6e53ad,
  126157. 0x8257ebdc,0xeb9f1efa,0x1f08c989,0xc583c6eb,0x40163768,0xf1736911,
  126158. 0xdbc20e3d,0x6282ff8b,0x9cbd514e,0x26b81005,0x000000d5 } },
  126159. /* 137 */
  126160. { { 0xa0025949,0x2449522f,0x0bbd8945,0xb26d888f,0xe637216f,0x33442f5f,
  126161. 0x472827f6,0xd8ec3b64,0x99fc2681,0x91d8a1a3,0x68c7710d,0x6d232ead,
  126162. 0xe51b2762,0x8e5bfe2f,0xfd109fa7,0x0f9f4fed,0x00000004 },
  126163. { 0x6b4a05e0,0x1952ea51,0xf21c78eb,0xcb0d48ee,0x1997dfdb,0x64d36619,
  126164. 0x8b4c21fd,0x0d11b204,0xbe92303a,0xa6f569b6,0x78c5e809,0x2b8f6096,
  126165. 0x36805d8e,0x7226b5ab,0xdb349ca2,0xd6cff180,0x000001bd } },
  126166. /* 138 */
  126167. { { 0x943cc612,0xa49f8576,0x832b31c7,0xc914319e,0xcccadebd,0x9225e297,
  126168. 0xb0619821,0x4918fb42,0x25b1cc7c,0xaccb3084,0xa646e5f0,0x751d3347,
  126169. 0x590e3e22,0xeafb4aae,0x2c4a0008,0x82146038,0x00000151 },
  126170. { 0xbf96a461,0x3c2481db,0xb52a3ba4,0x51c122e9,0x464db08b,0x21c2858e,
  126171. 0x6d6a081d,0xb1014b78,0xf533cef7,0x167d3ed4,0x81545f7c,0x6cfb3294,
  126172. 0x449b7b9f,0xea46d31c,0x9621c299,0xcfad7613,0x00000081 } },
  126173. /* 139 */
  126174. { { 0x478a7f0e,0xef796327,0xde17705d,0x914183e2,0x572117e8,0xd24a26df,
  126175. 0xb7cd52cf,0x3cdb1b09,0xad83c160,0x9e42b9fb,0x709ef8c9,0x6971d2ea,
  126176. 0x8ee54ccd,0x1894fc5b,0x34a520fc,0xf757b4e5,0x000000fc },
  126177. { 0x86b62347,0x5a5518cc,0x7bc2a928,0xec51c9d2,0x2966727f,0x2eea2b05,
  126178. 0x0ae43e6f,0xbc8a8e3a,0x05ca066b,0x80535b5e,0x8833986d,0x91ffcdb1,
  126179. 0x32374cdd,0x2f4a5bba,0x0d202243,0x08763a49,0x00000124 } },
  126180. /* 140 */
  126181. { { 0x4efac14d,0xe498b972,0xa79a9d3c,0xb6f4bf8d,0xd6e07c29,0x0f1e8dbd,
  126182. 0x71771538,0xfac30cfd,0x71b03263,0x4c91ed22,0x19b455f5,0xbf938335,
  126183. 0x127092bf,0x76a5e789,0xb4813bd9,0xa97674e1,0x00000128 },
  126184. { 0x583e5924,0x29b63c41,0x8f171d06,0x61f9aff1,0xab227a28,0x2b45b3cd,
  126185. 0x8a11ab70,0x939d5dda,0xe8db6971,0x2bfb47b0,0x0ec10805,0x562379df,
  126186. 0x24ce1801,0xaf5a6481,0x34f94aba,0x8d98c434,0x00000150 } },
  126187. /* 141 */
  126188. { { 0xcfffc80f,0xdea9fe73,0xd43473f6,0xe23e2e9b,0xc9d37ba7,0x27fb3ed3,
  126189. 0x7a3fc357,0x733766d2,0x8e04a03d,0xd0db4cf3,0x2bbe0f43,0x8ce01752,
  126190. 0xda986f4f,0xd87eb719,0x2fe6b037,0x6d1b50ae,0x00000153 },
  126191. { 0xda40bab1,0x371f5def,0x9b2bda63,0x07d6a8af,0x0d4aca87,0x5e8a5c89,
  126192. 0x643ff8ab,0x4d72f0ff,0x4bf8ec2f,0x9c4c10d9,0x0eb93e22,0x36b0eaba,
  126193. 0x1d2dfd01,0xbc4b0e8f,0x9d34a082,0x9f252e5a,0x00000142 } },
  126194. /* 142 */
  126195. { { 0x7d0e7020,0x4affd4c1,0xb5482168,0x9b169aaa,0x588f348f,0xdbe01708,
  126196. 0x885986bb,0xdaebf6ff,0x15f9c381,0xb33987f5,0x04a94a7b,0x7e455f2c,
  126197. 0xa0ed6849,0x39a41442,0x1ef7798c,0x1c1ad4a6,0x00000154 },
  126198. { 0x072709c4,0x7647b628,0x8810e5fe,0xb330d68b,0xe92e0f63,0xd1bd8874,
  126199. 0xf8bea9ba,0x144e4fb9,0x8318981a,0xc15afc18,0xb68c6a07,0xe19c5c82,
  126200. 0x36e00b66,0x858c57a2,0x07cb7aec,0x9b255110,0x00000011 } },
  126201. /* 143 */
  126202. { { 0xc887027d,0x121ced27,0x2bfab286,0x6050f335,0x19d511e2,0x6e373c1c,
  126203. 0x7f4c69f5,0x02d4c3a9,0x25226bb4,0xe6f356af,0x83e7ac30,0x3b9011c3,
  126204. 0x33d8fdfb,0x43b0c23d,0xaf2ea363,0xa8c390f7,0x0000000b },
  126205. { 0x7e851bac,0xc430c3d6,0xa5f544fc,0x8991c389,0x67fba061,0x006bbc64,
  126206. 0x97cbdbf4,0xd49d024e,0x7734adad,0x4539b7dd,0x28cb6d2a,0x90ba8f9f,
  126207. 0x4de4b3ad,0x7a921830,0xa7b96928,0xb28732ef,0x0000006a } },
  126208. /* 144 */
  126209. { { 0x22ed5986,0x71dab52d,0x58533e06,0xdeee627a,0xcf155fe3,0xe8fee37a,
  126210. 0x7ae8b132,0xcd61490d,0x34a08b94,0x2706e185,0xf9c15c30,0xa85ffd52,
  126211. 0x51a5ad46,0xd5a224f3,0x54d700bb,0x44d1b6d5,0x000001e6 },
  126212. { 0x862e4e9c,0x96830686,0x48763fe4,0xfe5cd76c,0xc0839caa,0x60309679,
  126213. 0x8d83d62d,0xc0e4cbeb,0x11bc4ae2,0x911e254e,0x64fca062,0x96a0d7c8,
  126214. 0xe9a27045,0xf5785dd5,0xf3e0412c,0x2f4677d0,0x000001be } },
  126215. /* 145 */
  126216. { { 0xab01a6dc,0x4c0012dd,0xae1adb69,0x391bd6c1,0xb9b05079,0x3ae7daec,
  126217. 0x62a1061f,0xc2714f9e,0xa96536b7,0x71978ee7,0x5e17654b,0xeec11bd0,
  126218. 0xefab3dd4,0xc71166e0,0x87edbf61,0x0f7aa572,0x000001d7 },
  126219. { 0x51eb5932,0x26ea6f7d,0x5f882ca4,0x354ea0aa,0x7739f7dc,0x175b6097,
  126220. 0x9be57934,0xd335192a,0x78545ecc,0x9801f423,0x7b643c9d,0x32b8e256,
  126221. 0x23e3abec,0xb9411dd7,0xcf1c6509,0x656dea68,0x000000ee } },
  126222. /* 146 */
  126223. { { 0xa0890deb,0x4d38e140,0xbceb84bd,0xbf7bd87d,0xba041dec,0x51f0ff72,
  126224. 0xa6820be9,0xafeec70a,0x8c486298,0x755190a3,0xe7010ec4,0xecdba558,
  126225. 0x8c7879b1,0xced91db8,0xef5e215c,0x08de3e4c,0x0000014c },
  126226. { 0x16266da2,0x9c1534ed,0x7b4c9009,0x9ce322eb,0x69927688,0x37decaef,
  126227. 0x05c2844d,0x6525097f,0x1ac519ab,0xd23b7e13,0x65a3cc86,0x682ebb72,
  126228. 0x628c4575,0x0c531db9,0x73805373,0x2e00e8b8,0x000000be } },
  126229. /* 147 */
  126230. { { 0x57ed32e9,0x3807c800,0x7c024997,0x427e40cf,0xabb54830,0x58506abb,
  126231. 0xce820bf4,0x5649776f,0xb2c43e81,0xb5353293,0xcfef6648,0x671e8353,
  126232. 0x903bdca5,0x27217d3f,0xa813fd79,0x40a9c109,0x000001dc },
  126233. { 0x3db21a38,0x6beaa6c3,0xd73ef7e4,0xcae222e1,0xbd1d507f,0x1ff684e7,
  126234. 0x587a77ab,0xf5bac664,0x0c64a4d6,0x58c74f62,0x6a7c378a,0x4ca837d9,
  126235. 0x3e42e409,0xf43df531,0xfb49e14f,0x8a9a4347,0x0000013f } },
  126236. /* 148 */
  126237. { { 0x992f8923,0x85ab4edf,0x6fd209f3,0xe24aa5e0,0x1b1340ee,0x27be9b87,
  126238. 0x91e0bb40,0x2957d11f,0xf3d4c62c,0x425afad2,0xc7ff7aaf,0x2d231286,
  126239. 0x0114cbe9,0x96412b2b,0xc3e23529,0x6706a231,0x0000019f },
  126240. { 0x225c02af,0x06b3bbd2,0x3fa3e98d,0x53ebc166,0xb84f482e,0xa6df2b75,
  126241. 0x2bfc55df,0x912b4521,0x512a73da,0x30bdbd40,0x3d53eaa4,0xac0f43d9,
  126242. 0x0c27fd53,0xfc358fe4,0x919424b4,0x2cb183be,0x000000a3 } },
  126243. /* 149 */
  126244. { { 0x3fa6a746,0xe39b0c2d,0x1d5a24a8,0xe84a7922,0x78cdf2b5,0x70a58914,
  126245. 0x30666cb3,0x8a88067d,0xf6d71d06,0xb09a709e,0x0065d184,0x50007a3e,
  126246. 0xb8dc9448,0x7046af4b,0xc65493ac,0x2b6a3129,0x000001fd },
  126247. { 0xe45f2771,0xd3d5d5bd,0xf432ed95,0x8542b08a,0xf232a6bb,0x2ecd40fb,
  126248. 0xe8beccb2,0x0fcb6143,0xbf8e247f,0xcecc513a,0x8da3039b,0x955d56f7,
  126249. 0x56c2a0df,0x9157c619,0x3031fe2a,0xa6d35cbf,0x0000018c } },
  126250. /* 150 */
  126251. { { 0xbe0c4923,0xdd800b1b,0x6902907b,0x046ae740,0x957bd0c7,0x2398b37f,
  126252. 0x9655f8b8,0xaa8e1a9d,0x500f4150,0xcd2927fa,0x202e7aee,0x826a9c6d,
  126253. 0x9f29692e,0xb4cf58b3,0xbf41577c,0x3093868c,0x0000011f },
  126254. { 0x333ed442,0xadcb5e7a,0x906fef7b,0xae5c8e2f,0x3d98f228,0x2d9b0123,
  126255. 0x7ffe125c,0x4632f2da,0xba231835,0x59487731,0x12d2c512,0xa0caae5b,
  126256. 0x9857d9c4,0xbf00e658,0x54f200f6,0xc5d10086,0x00000172 } },
  126257. /* 151 */
  126258. { { 0x2fc283e0,0x58954046,0x7ee0880e,0xf7633984,0xb7fd1622,0xfaf1b40e,
  126259. 0xf598c5ed,0xecf5151e,0x7e00d9bb,0x6b4d92f7,0xa8c43fd4,0x7543e3b3,
  126260. 0x6511d1d2,0x3994e12c,0xaf05b6d3,0xdd841a1d,0x000000c6 },
  126261. { 0x23b991ad,0x23da17e0,0x71fba514,0xaab2b213,0x0ddc1879,0xb417ec5a,
  126262. 0x5f63acdc,0x173bc8ad,0x1e2a7d50,0x2fcf5210,0x6106d008,0x63373fd0,
  126263. 0x7db012cf,0x1e8211de,0x576545ef,0xa07766d9,0x0000018c } },
  126264. /* 152 */
  126265. { { 0xaf80dfaf,0x8e4347b9,0x9c4667f3,0xa80b631f,0x6ddbc238,0x6ff1db26,
  126266. 0xaa8718a0,0x6161e365,0xaf31c35f,0xe7f7ac90,0xfc6846e8,0xc03831d1,
  126267. 0x684175b4,0x1e669d10,0x934b731a,0x6da9d620,0x000000c7 },
  126268. { 0xa3e4e78b,0x981f597b,0x55099f9a,0x2c14dedc,0x93088c61,0xbf373995,
  126269. 0x9b207458,0x7c568307,0xa2276900,0xc4440c47,0xf7e6daf3,0xb6df23c8,
  126270. 0x42929103,0x4f662c25,0x8b3b7963,0xf4ea6db1,0x000000f9 } },
  126271. /* 153 */
  126272. { { 0xced36049,0xc669eb88,0xf41b99f8,0x87a4ffe1,0x6a72e108,0x690b7563,
  126273. 0x65a0bb8a,0x67dd6a8c,0x96e42955,0x42cf8c58,0x1aabffad,0x5286b5f3,
  126274. 0x8f6f26a4,0x1f7dfaf2,0x0e1ae503,0xc5d9e0ac,0x00000120 },
  126275. { 0xacc10da7,0xafbee3ff,0x944946e5,0x67e2d5f9,0x3c4220ff,0x8ec17e86,
  126276. 0xbd6f632e,0xfe6f7414,0xc3fc9ef4,0x4a9e3c0f,0x03bfb870,0x25ff3cba,
  126277. 0xbb03342d,0x18fd3600,0x0050cd2e,0x1e63e753,0x000001ac } },
  126278. /* 154 */
  126279. { { 0x8f3d6a02,0xdd83d07c,0x7ef4d0d1,0x71fc143c,0xd4c7af61,0xca994bf0,
  126280. 0x827c5cf0,0xc8a93e98,0x2b697882,0x4a102c7b,0x8a55e8ba,0x633c87d5,
  126281. 0xcc2d64f0,0x1ae8822f,0x986d01fc,0x2ce9b53f,0x000001c1 },
  126282. { 0x95dc1b79,0x859639fd,0x3f4e616a,0x2728f754,0xede2fb9f,0x6e703c4c,
  126283. 0xd50fae9e,0x042f7680,0xc2d530ed,0x0546bc3b,0xcdd598ac,0x00a4006b,
  126284. 0xe1294910,0x3f3286c9,0xb6bf9629,0x77782255,0x00000146 } },
  126285. /* 155 */
  126286. { { 0xe30c98fe,0xaf81421e,0xfc2cd705,0xdeb0feb0,0x14df6ad2,0x9b2c4ca6,
  126287. 0x9ba314e8,0xd38134de,0x4f04b16d,0xa443deb8,0xf07f8ca8,0xfc556ee0,
  126288. 0x3a4f3917,0x3c1c83bb,0xb1adcd41,0x8397dd24,0x00000199 },
  126289. { 0xdf4781e6,0xca01e17e,0x46f1f901,0x32d7c319,0xb53090da,0xa227a613,
  126290. 0xa7c8c607,0x2495b1dc,0xddc69709,0x1cf2fbee,0x45608098,0x1d3d82bb,
  126291. 0x085134d7,0xcfcddda3,0x96798c41,0x3dd171b5,0x000000d2 } },
  126292. /* 156 */
  126293. { { 0xd4dd7e96,0x97a40f84,0x8409fc0c,0x7114c8ea,0xa9d11393,0xc56f29e6,
  126294. 0x8fd8c6d6,0x3b606621,0x00269e7c,0xad3baa86,0x05929d5f,0x1413c6b0,
  126295. 0x222e365b,0xc1ad7e40,0x4798aaec,0x6a82621a,0x000001d3 },
  126296. { 0xc1003c81,0xaeac45c4,0xf43d8602,0x9ef9ef5a,0x60f77469,0x36a65f5e,
  126297. 0xbf5d2858,0xf312e7ab,0xc84acef1,0x2f53ec81,0x9d248b52,0x63e32ca2,
  126298. 0x81e65c60,0xfe9aa7c5,0x52841973,0xe3686c9a,0x00000017 } },
  126299. /* 157 */
  126300. { { 0x9e90de99,0x0b2efe65,0xad05ab63,0xbe4485bc,0xe14e4892,0xc48a6a52,
  126301. 0x22628687,0x2ad85430,0x5eb3db54,0x261f0e95,0xd45e5841,0x48e81863,
  126302. 0x8ed75739,0xcfe1ce0f,0x7d84ade4,0xbd6f1ff5,0x0000003f },
  126303. { 0xd1bf968c,0xd43711dd,0x48dfa472,0xd558d7cd,0xe425a566,0x49f09223,
  126304. 0x5c26d041,0x0cf83338,0x7c2c1743,0xbe7b81f1,0x5143d9d9,0xe3bdc33e,
  126305. 0x94fd3fae,0xf385ac35,0x9fd1811a,0x7551cf42,0x00000113 } },
  126306. /* 158 */
  126307. { { 0x20193bb2,0x4928f55b,0x7310b872,0x96e579d0,0xd345d276,0x5ee06309,
  126308. 0xa871868a,0x9a43e432,0x11038683,0x28c113e1,0xa332f108,0x8286ecf3,
  126309. 0x0385cbb4,0x3348aa37,0xef158daf,0x698ffcaa,0x000000c6 },
  126310. { 0xf6908745,0xa044c54a,0x6a3353fb,0xa6b336e4,0xd561e821,0x694c2852,
  126311. 0x3634917f,0x1b297970,0x81f61315,0x6e1023b9,0xef46a5ef,0x6817dc2b,
  126312. 0x8e114f7f,0x93dea0af,0xed72c5bf,0xc3cf3cd5,0x00000136 } },
  126313. /* 159 */
  126314. { { 0x7b080de4,0xbb8799ab,0xd69d8396,0x3b8f781d,0x986f8f63,0x76b42aaa,
  126315. 0xa54bc5ca,0x5d74c038,0xa9c2fbb9,0x76fcb605,0x80178930,0x8451b440,
  126316. 0x9d286f0d,0x40f00c38,0x0c543263,0x3038e952,0x0000014c },
  126317. { 0x6977aad9,0xc94bc381,0xd7087be3,0xadbfd082,0x875fed08,0x06d0820c,
  126318. 0x345656fc,0xe1ce84d4,0x0fd6dd4e,0x71c4d8e0,0x6a5fab40,0x23338b22,
  126319. 0x0baeeb6f,0xd477eac1,0x5f80c26c,0xe4db08bb,0x00000078 } },
  126320. /* 160 */
  126321. { { 0x1078342a,0x0111d12a,0x559a1064,0x0534725e,0x0fd3ffdd,0xea459d59,
  126322. 0x06f0ac1f,0xcf694a9f,0x3e19bc69,0xf6d24adb,0xb9ddcd00,0x3ce38f5e,
  126323. 0xb632dd4e,0x38400f66,0xe15e1c55,0xcab8fdfb,0x00000085 },
  126324. { 0x8d09422f,0x0a943f6b,0x0f988c3b,0x17d29756,0x2ef2e4d9,0x55a441fa,
  126325. 0x35f7c13f,0x6743523b,0xedaad3ff,0x274d3407,0x9347242d,0x59411435,
  126326. 0x3bb8615d,0x1cb27301,0xbd7794cd,0xa0437004,0x0000007d } },
  126327. /* 161 */
  126328. { { 0x2d712c44,0x824b99a6,0xa6962577,0x148368f8,0xd65e2287,0x8ed68432,
  126329. 0x6f5bc5f8,0x14028306,0x4ec3479d,0xe6cf3121,0x9326db70,0x96db6f44,
  126330. 0xca32936b,0xca5ac098,0x2fea21af,0x69e248c7,0x0000004d },
  126331. { 0xa71269fb,0x0aa89092,0x18650b60,0x2f6bdba8,0x9fb55db2,0x1d9cc2a3,
  126332. 0x6311e9d0,0x0fceb0df,0x90ac2c1d,0x6faeb79c,0xcb1f372a,0x2393b222,
  126333. 0xbc8c4193,0x62a6f3df,0x2fe8e674,0x9dea30b2,0x00000001 } },
  126334. /* 162 */
  126335. { { 0x12b3118b,0x7df689ac,0x6cb6ea56,0xd06ee39d,0x187cd978,0xcfcc22c2,
  126336. 0x8d537d87,0xb985b681,0xe9f56db2,0x75845152,0x5e098c15,0x0f839871,
  126337. 0x3b212cd2,0xbe96a5c8,0xd9ac1c47,0x3dda0338,0x000001fb },
  126338. { 0xcfa0a9b8,0xf06b7fe0,0xe22dcf75,0x9478bac7,0x136887c8,0xf3815e04,
  126339. 0x914c54bc,0xed811dde,0x0f51ea64,0xc8c24160,0x4c870577,0x63914d83,
  126340. 0xa8abbcb4,0xed24e552,0x2644f52e,0x9e5eb9e8,0x00000001 } },
  126341. /* 163 */
  126342. { { 0x66d52313,0x1f65a04e,0x4d3f72bd,0xfd694545,0xa6b7ae11,0x2bc0ddaf,
  126343. 0x571ab247,0x921f79d8,0xae5a8d68,0xd4c5f966,0xaec5ce13,0xfde17716,
  126344. 0xb764bd39,0x70e6eda4,0x990d6783,0xffe94085,0x000001ef },
  126345. { 0xd88f92e8,0xf3fa0e27,0x9c77123c,0xa21ef0fd,0x89274dba,0x6259974c,
  126346. 0xb9ba2762,0xd4cfa4a5,0x46ebcaf6,0x10c909d2,0x8f8e2870,0x0317a10d,
  126347. 0x453aeea2,0xb0771de1,0x68c6b0a3,0xdf0c4791,0x000000ea } },
  126348. /* 164 */
  126349. { { 0x4c854477,0x11bc1e48,0x8638e47c,0x2bec25b4,0x869c54d9,0x43d4e02b,
  126350. 0xbe1e7ed2,0xe318de32,0x6b460c4a,0xf5471eb0,0xaa426afe,0x38ae7bf3,
  126351. 0xd8452dc1,0x23ae26dd,0x5782de9d,0x9d3fc1d5,0x00000164 },
  126352. { 0x0ade1979,0xd87cae31,0x3b4bc728,0xa847041d,0x56c3c9be,0x38923c40,
  126353. 0xd74ae467,0x36fe182a,0xecbe49ae,0x92bff6f4,0xdc41f9f5,0x6680db80,
  126354. 0xe4630715,0x35bac06f,0xd6d07307,0x6d68b4c7,0x000000c0 } },
  126355. /* 165 */
  126356. { { 0x854dfcf2,0xdbe22be7,0xa6ae3bd0,0xee21a7df,0xa521ec46,0xf4633ad1,
  126357. 0x41a9484c,0xee94527a,0x2aa123f3,0x1145eb9b,0xcae3ca92,0x5634a82a,
  126358. 0xfc85d925,0xe176aca0,0x19082d8c,0x504cf7fc,0x00000078 },
  126359. { 0x3799793c,0xd74ce7c4,0xb5519fb5,0x74ddd618,0x95ff9808,0x2cf6df93,
  126360. 0xb8bf61e6,0x00ea45d1,0xdcfcf54f,0x26863613,0x030035b0,0x67423b76,
  126361. 0x4028a9cb,0x9fbc7534,0x051a077e,0x7b52ce37,0x000000f4 } },
  126362. /* 166 */
  126363. { { 0x96bec962,0xebf7d8ad,0x17e0107a,0xd1cc81f6,0x214e1058,0x64c44509,
  126364. 0x42394c9f,0x6c298c43,0x1a660513,0xd910052d,0x90df8243,0xc3643754,
  126365. 0xfe5cdea4,0x2313be1e,0xd27fb7b1,0x249a60f7,0x00000076 },
  126366. { 0x1cf593a0,0x74975838,0x8364c59e,0x0c9ceefb,0xe05c9991,0x2f5a1333,
  126367. 0x421808e3,0x30ea5e1f,0x4f5e8f4f,0x56fb3a4f,0xb6c0cb47,0x2cae6e2e,
  126368. 0x08bdcc6a,0x60b307fd,0x0ff8c117,0xee17901c,0x0000001a } },
  126369. /* 167 */
  126370. { { 0x89aa9e14,0xc048336b,0xf676700f,0x66634271,0x906b6980,0x4daa0433,
  126371. 0xebb7ab23,0x30247ee1,0xeb59a053,0x969b4aa7,0x8000f4d5,0xd78ef825,
  126372. 0x46026b5b,0xe5db38eb,0x7d6856c4,0x06a43e5d,0x0000003b },
  126373. { 0xed2a0ee7,0xaa0ae838,0xf16e8813,0x04bbe528,0x4ea64137,0x8ab6df5c,
  126374. 0x06e29867,0x5be80cb6,0xf459ed2b,0xf19b1b72,0x1761521a,0x7a9cce4d,
  126375. 0xaa516f3b,0x39aff994,0xb3416925,0x97d92e86,0x00000007 } },
  126376. /* 168 */
  126377. { { 0x5af3a8ca,0x25aeede1,0xa5c351ec,0x33924782,0xf93ec080,0x41e7a3fb,
  126378. 0xe6f425b4,0xb04f93c4,0x81e76009,0xe4ec12ec,0x5180ffc6,0x797366d4,
  126379. 0x0e0aef3a,0xd293cbb5,0x68d71d91,0xa1496944,0x00000061 },
  126380. { 0x675a67a1,0xf52c541c,0x8f5fe906,0x67d38d30,0xf6be988e,0x2a70bccc,
  126381. 0x18589886,0xae03ecbe,0x7067045b,0xecd02616,0x10ca8d96,0x1facdd99,
  126382. 0x30c0735d,0x7aa10a82,0x3328f21c,0x2a27e554,0x00000015 } },
  126383. /* 169 */
  126384. { { 0xe6057e27,0x3dd609e0,0xc7a454da,0x87e8b6a7,0x1f32dd5b,0xff599145,
  126385. 0xd0ef51e2,0xea397a88,0x25567546,0xc49866a1,0x3228b480,0xea45c8b1,
  126386. 0xdd01997a,0x3dbe0e77,0xc51867d2,0x0e2ea28f,0x000001f8 },
  126387. { 0x69d0820b,0x6295412d,0x1ea65a18,0x03173127,0xeb06380d,0xc27c8221,
  126388. 0x75fe9706,0x7ffd4efc,0x5a71d250,0x7b396a57,0xc7cb7543,0x61c80051,
  126389. 0xad4dbee3,0xe07db4d7,0x9b192d45,0x1c7481f4,0x00000143 } },
  126390. /* 170 */
  126391. { { 0x08e1cc4d,0x5eab2d04,0xad2dc1ee,0xe93758d3,0x5c9c7393,0x0ceb7dfe,
  126392. 0xd3379683,0x530d86a9,0xe24f86d7,0xef5283ca,0xf0b1bb0b,0xab5d1a64,
  126393. 0x54db4e3c,0x96aabc1f,0x3bc00c59,0x3e3d87cc,0x00000144 },
  126394. { 0x1d60e7b0,0xe50a8213,0x5d33d018,0xfc9b629b,0xfd05338d,0xc54aee42,
  126395. 0xe821c6ea,0x0678f2c0,0x06ac09cb,0xe5c9d75f,0x53018df6,0x83357513,
  126396. 0x0bf8c667,0x81ca6fac,0x9d0ae2dd,0x7fc8020e,0x000000e1 } },
  126397. /* 171 */
  126398. { { 0x1baaa5eb,0x8add4741,0x79bd8036,0x02cbb759,0xcdffed22,0xd8680c40,
  126399. 0x4e091141,0x1c23a8f0,0x20748b87,0x65d141ed,0x659e9289,0x586a1575,
  126400. 0x5006dbfe,0x7c68d7cd,0x22569a74,0xda0ad0df,0x00000148 },
  126401. { 0x7f9069d7,0xc8fcc5db,0x5c0531a4,0x2487d245,0xe9a2db3a,0xc5ab4899,
  126402. 0xb4fe9720,0x52bfd538,0xd27f35e4,0x73a04ca4,0xee2dac93,0x7cbbc549,
  126403. 0xff3ee7e2,0x0287229d,0x28da9360,0x3179878d,0x000000d0 } },
  126404. /* 172 */
  126405. { { 0x3b66c047,0x89b7e9bb,0x602a3e1d,0x22e65869,0xc8db9c00,0x44f82297,
  126406. 0xd08a74a3,0x0e76aca3,0xfcd398de,0xfbf1a71d,0x8320e66a,0x2fbb6eaa,
  126407. 0x179c9fc5,0xa82d0ebc,0x4e7ab2b4,0x4e00cf6f,0x0000000f },
  126408. { 0x4890c439,0x424c0e9a,0xbc35a6b2,0x37564a2b,0xd9b7497d,0x95a4479d,
  126409. 0x612de942,0xa1ff3f0d,0xe60d0033,0x358627fc,0x522417da,0x815da8c0,
  126410. 0xef6b8385,0x506104d4,0xf16e96aa,0x800728d2,0x00000120 } },
  126411. /* 173 */
  126412. { { 0xab039042,0x976f2372,0x9fa084ed,0x10e6978c,0x58bec143,0xd03fdd2f,
  126413. 0xfe2045c3,0x3200c101,0xb0a5a928,0xe6868f7a,0xe61faff8,0x26c95d1d,
  126414. 0xb7b12265,0xa1e20127,0xc2a5ed17,0x8e63dd78,0x00000089 },
  126415. { 0x22bba4ee,0xbb6533da,0xf496a574,0x3eff6397,0x14f2a6b9,0x409329f7,
  126416. 0x1dfdd73f,0xa08248bd,0x69bca1b1,0x62f33f2e,0xba2e0327,0x9a177e64,
  126417. 0x75ddf741,0xbc50e993,0x4a56bd1c,0xb87a979f,0x00000095 } },
  126418. /* 174 */
  126419. { { 0x67c1f177,0xe83736a9,0x600133c9,0x1b6d3508,0x6eac9a5b,0x9424bb92,
  126420. 0xc27ef31c,0x7a9c01a6,0x122b4870,0xad93bba5,0x9d1ac985,0x9eb94e2a,
  126421. 0xd53f175b,0x511c0206,0x5102d914,0xd13eb252,0x000000b1 },
  126422. { 0x675a1171,0xcfe7dbeb,0x16c0d2b1,0xb228295c,0x057c88ca,0x8db25b5a,
  126423. 0xd300e9cf,0x73ea9e96,0x269552eb,0xb0e0037f,0x9e0f98df,0xea9d035c,
  126424. 0xd290480f,0x860e49b8,0xc036b319,0xa35e9512,0x00000037 } },
  126425. /* 175 */
  126426. { { 0x8f00df48,0xc56729ee,0x11ac8304,0xb89ca7b6,0x8b3a8123,0x497a57f9,
  126427. 0xc21ca3ea,0xe0431b19,0xe2bb3ce7,0x45a73deb,0xadc77819,0x2f86cc2b,
  126428. 0xe5eb3df1,0x5ff005e4,0xdd27dcf0,0xf955dd7a,0x0000005e },
  126429. { 0x00ee402f,0xe0c22ffa,0x3b30bb4c,0x5b335e2a,0x643cb101,0x542551d0,
  126430. 0x3cd19688,0xc6183f45,0xf0be54b4,0xc6664f22,0x4c20cde4,0xa5f4cfee,
  126431. 0x80a4c475,0xdcaa972f,0x59111ed9,0xde4af200,0x0000019c } },
  126432. /* 176 */
  126433. { { 0xd771f428,0x9e9d0bc8,0xe43ca382,0x3ac1ecd9,0xeb93acf0,0x8d5ee480,
  126434. 0x065a2a3f,0x16232f81,0x2f0b8a73,0x1fc04faa,0x025474a2,0x4a8df7e7,
  126435. 0x3bb15f6f,0x51ac4ff2,0xe0950e52,0x66e21b73,0x0000006b },
  126436. { 0x67a41dee,0x59c98480,0x7b3e2b3f,0x2cfa95ae,0x891454e1,0x54d98386,
  126437. 0xeefca6a4,0xf0dddbdf,0x11e9cb75,0x5f691b24,0xfef208c3,0xa9b9e766,
  126438. 0x18b33cf6,0xe8df1000,0xd1c174a9,0xb8a55ac9,0x000001c4 } },
  126439. /* 177 */
  126440. { { 0x5c4cccb8,0xa99f5862,0x2ef4d3ef,0x70bf5209,0x89efc878,0x28f4e576,
  126441. 0xda14206e,0xa2366f96,0x7c52107d,0x90331a00,0xd4a0f0f0,0x478d4cea,
  126442. 0x472a47b0,0xb2899ee2,0x64207549,0xae96534e,0x00000110 },
  126443. { 0xcced05b0,0x2cc1d655,0x01759543,0xabac3f09,0x8e577cd7,0xbaeb70a4,
  126444. 0x40e98d6d,0x84b00893,0x603d24f1,0x26983653,0x2572173d,0x6e145883,
  126445. 0x611141de,0x1d348b26,0xefa27f34,0xe52257dc,0x0000006b } },
  126446. /* 178 */
  126447. { { 0xc947e655,0x92678f33,0x08923795,0xff0fb76a,0x790239d1,0xb2dfe745,
  126448. 0x3cdbb7ce,0xea087492,0x05f6d41c,0x21326db9,0x79dc5588,0x5b1ae9ae,
  126449. 0xe9c31702,0xe145340c,0xa2c38a9c,0x07502c29,0x000000c3 },
  126450. { 0xc156ace2,0x0c124f11,0x79ff2529,0x2c170fe7,0x6e1171b2,0x60df9a81,
  126451. 0x55de2797,0xa19bca83,0x7c6cc79d,0x1ad927ea,0x1d61f770,0x28590112,
  126452. 0x261c06bb,0xfe80c826,0xaa2642bb,0x4050d338,0x0000015e } },
  126453. /* 179 */
  126454. { { 0xeaad87bc,0xc9397829,0x81e84cbd,0xe0ac9367,0x6ade4fde,0xb579c24d,
  126455. 0x690d7f56,0x50b9aba5,0xd14fb0b9,0xf09b29d3,0x25a0e7b6,0xd0684f23,
  126456. 0x606f4ff3,0x0514e9d3,0xe8ad733b,0xe63bdd26,0x00000077 },
  126457. { 0xe0d25c6d,0x0afd06ec,0x00ba2dcf,0xdd90021a,0x8c5bb398,0x1b025770,
  126458. 0x198ff8fc,0x077f06d8,0xb7e2cd68,0x87d50ff1,0x263a3572,0xef75e057,
  126459. 0xfa925a9a,0xbf257892,0x739d0e95,0x847d3df0,0x00000111 } },
  126460. /* 180 */
  126461. { { 0xfec82924,0x52ab9cc7,0xa7220d69,0x1c76dd69,0xa06ef0e2,0xa63527de,
  126462. 0x27183904,0xab3e51c2,0x716807c8,0xf4db35ea,0x748f1246,0x8f3ede0a,
  126463. 0x41156095,0xf1493644,0x874b38de,0x5f6583d1,0x000000f7 },
  126464. { 0x0b927eb7,0xa39189e1,0xc2e2f127,0xa87c6359,0x7fe966f4,0x0b72c233,
  126465. 0x105e5585,0x102b8382,0xe58c39f9,0x63fee006,0x991b5329,0x3f052ee3,
  126466. 0xcbaff97b,0x7f5b854c,0x5f805060,0x935e5f6c,0x0000016a } },
  126467. /* 181 */
  126468. { { 0xdfd88d38,0xf19a0355,0xc549df40,0x555cd8e3,0x04d006e1,0x322729e3,
  126469. 0xfd0b0ce6,0xf16b706c,0x35f2ad31,0xf156dc09,0xf7a3df9f,0xb30c5213,
  126470. 0xa55e5fb5,0x9f29cc92,0x2b858da2,0xa0ecfdd4,0x00000144 },
  126471. { 0x52658a92,0xb5c115df,0xc4281616,0xbce3ed17,0x7fd92a91,0xa5595f70,
  126472. 0x9cd5d896,0x663c8bfd,0x5a9472b1,0x0776343f,0xb033e1bd,0x14e44ca8,
  126473. 0x1e5c02fb,0x27a1c986,0xcc4ffb32,0xece0f2c4,0x000001b5 } },
  126474. /* 182 */
  126475. { { 0x31211943,0x17127bab,0x5684325c,0x44a8cac6,0xd855fc3e,0xd2fe0b88,
  126476. 0xce91eea5,0x47abab0c,0x78ec7d12,0x5d23ddc4,0x0cd9fefa,0xa3986de7,
  126477. 0x82655766,0x32c7b867,0xeeaec7fa,0x3e54018b,0x00000087 },
  126478. { 0xb38d17c1,0xc96e86f2,0x71fa040d,0x9cbfbd0c,0xf88499cb,0xe111ab79,
  126479. 0xf71ec80b,0x1d47c5ce,0x46c89692,0xacaa3bc1,0x3d316331,0x5f921c0e,
  126480. 0xe768765b,0x31fa081e,0x41eff270,0xd5dafd5f,0x000000fe } },
  126481. /* 183 */
  126482. { { 0x4cda1348,0x8af10b9d,0x25c3013a,0xb0769fd2,0x8957c22b,0x450aa5b1,
  126483. 0xf5acf1c4,0x5cafd6c7,0x9fef8029,0xcf71a140,0xee089f5d,0xe12029f5,
  126484. 0x0fbd2ba8,0x9752a8fb,0x6f70cb58,0x61e2275f,0x00000090 },
  126485. { 0x1fbda16a,0xb70a4ac5,0xf1dfa2a2,0x79910e79,0xd9945f6f,0xba2ce132,
  126486. 0xeb4ba4ef,0x450d59ae,0x4bf2d53d,0x6a8e09b3,0xe620c7a8,0x76010204,
  126487. 0x0a53c6f4,0x63f8943d,0x87eaf56a,0x14c91d19,0x00000132 } },
  126488. /* 184 */
  126489. { { 0x490d66c3,0xe54fb120,0xa0dc8204,0xeaed7328,0x04b4294d,0xba014c38,
  126490. 0x31ddc467,0x3f2fa2ab,0x8342ed11,0x70ff55ea,0x23034e0e,0xb18da72f,
  126491. 0xbd8ae3c1,0xadc30dbe,0x3e945a02,0x179bdf6f,0x0000009c },
  126492. { 0x7484c26f,0x46c928ef,0xef2adbb1,0x206b7db1,0x3f58dda7,0x0887f548,
  126493. 0x4bc7edb6,0xfde4e20c,0x975cafdc,0x484d121d,0x86beec20,0xc5b59670,
  126494. 0xa6d6db67,0xb579aa88,0x41187488,0x22c6d87e,0x00000015 } },
  126495. /* 185 */
  126496. { { 0xc471d4ae,0x0a890757,0x43a1da76,0xfef4b1a5,0x6aa701a1,0xb892b182,
  126497. 0x59c65f93,0xbf4d4e52,0xd789df35,0x923af929,0x0b79c3f2,0x3ccb46c6,
  126498. 0xcf4cf130,0x95582ce7,0x257f0ec4,0x7da081b4,0x0000011c },
  126499. { 0x9aeef274,0xf92c6ae5,0x1437c083,0xe6c5bf4f,0xe13c86af,0xaa74b023,
  126500. 0x2a225360,0xd21dace6,0x22589fa5,0xb3d572b8,0xdfa74b0f,0x3d4a3916,
  126501. 0xb12891a9,0xe76cd8dc,0x59f4cfbd,0xa0391a3f,0x0000019a } },
  126502. /* 186 */
  126503. { { 0x203fc3f1,0x054ba69e,0x62106a29,0x09168ccb,0xaad5fa9f,0xb0818540,
  126504. 0xbff7ed6f,0xecb8f20e,0xbef94afd,0x2c80a618,0xb0abd1db,0xe25d8ca0,
  126505. 0x028e0a7c,0x75e67a41,0xd6e95b9a,0xdd7662dd,0x000001b2 },
  126506. { 0xf289d7ee,0x87dff279,0xeea2205c,0x4d755d59,0xc18adac6,0xaeb0fd54,
  126507. 0x7ec01019,0x3a8c46cf,0xb48d70a4,0x6fc90e7e,0x10b39ef8,0x965c53c1,
  126508. 0x38545a20,0x455777cc,0x57dd023e,0xa33430f7,0x0000016e } },
  126509. /* 187 */
  126510. { { 0x0ff53d2c,0xfa9f3949,0xb00349b9,0x8dc91596,0xd5997967,0xf10a5014,
  126511. 0xa8a6b78a,0x4dd72dab,0x8b517b10,0xef5de540,0xa6d39be0,0x142b90bc,
  126512. 0xeda17f70,0xcaeaa3e9,0x06b31118,0xa01689d6,0x0000016d },
  126513. { 0xf46afff7,0xea6ca563,0x34a5e5f3,0x3945c7ba,0xaa998fd8,0xc1ffe4c8,
  126514. 0xb63f535e,0x42a60146,0xd1f509e5,0x50816888,0x9f8cd0db,0xd1918daa,
  126515. 0x78a36772,0x6505e6bb,0x9cc6dc66,0x4ab03a81,0x000001ef } },
  126516. /* 188 */
  126517. { { 0xd376d986,0x06089d14,0xa2dc35b0,0xd0f4e077,0x53ff2c86,0x1c11709a,
  126518. 0x123c3fc8,0xfef4ba45,0x1b656fc2,0x852cd5a7,0x1fefa8bb,0xb57c7489,
  126519. 0x48110b77,0x8f05383e,0x52c5a129,0x4b55d3ad,0x0000004c },
  126520. { 0xf3827633,0x5110cff3,0xe00afe96,0x086784d5,0x3ead32fa,0xcb387882,
  126521. 0x2b91cd86,0x3dcf4d16,0xe6f3638a,0x078b6a58,0xe8b7fd42,0x33792112,
  126522. 0xee5683e7,0x6964044d,0x28e28433,0x3b84210f,0x00000122 } },
  126523. /* 189 */
  126524. { { 0xc3ebeb27,0x6c28a9a9,0x3ef590f8,0xd7bcdcb5,0x4dae7f37,0xe88a2e11,
  126525. 0x726ea7c9,0x033522e4,0x8c141388,0x99d50386,0x61621575,0x59b1aeca,
  126526. 0xfcc564d8,0x719fcfeb,0x1aeb8e36,0x3a577af1,0x00000043 },
  126527. { 0x6feba922,0xc3f26ce0,0x475a5693,0x5f6c83ee,0x28bf378e,0x7f796740,
  126528. 0xbdc3f6f1,0xd2a5e368,0xa6ed90ae,0x3d034a0a,0x4a47cbd5,0x3b1c3a4c,
  126529. 0x4dce2bc8,0xa4f0aa6e,0x74ca00eb,0x97c7af43,0x000001c0 } },
  126530. /* 190 */
  126531. { { 0x79c28de7,0x00377178,0xab9c330c,0x617aa2aa,0x66bc61eb,0x43081826,
  126532. 0x4d78b504,0xe0b5b5cf,0x9870fc72,0xd76a752d,0xd40b7bc5,0x3b4689f5,
  126533. 0x87f2d03a,0xa97fd867,0xfd6060a9,0x6ab7b5ee,0x000001c0 },
  126534. { 0xffb71704,0xe99eadb1,0x390fe3b1,0x436e58bb,0xab4f19aa,0xeecab82c,
  126535. 0xe0f3d9dc,0xda492dfa,0x6e20ad12,0x2a0f54bd,0x7dbbd262,0xaf89fa0f,
  126536. 0xe8d2eb54,0xdcc50a1a,0xef7d0758,0x9799f816,0x000000b7 } },
  126537. /* 191 */
  126538. { { 0x104f98cc,0x9ec46462,0x72aedeae,0x45115922,0x7e62186f,0x7ae93dd0,
  126539. 0x8d6d69b6,0xd17ce026,0xfd43a8f3,0xb5347608,0x7c0ab797,0xe87f1c13,
  126540. 0x139f991d,0x3bf597a8,0xe547e0d6,0xe293a85b,0x0000008d },
  126541. { 0x8ef668b1,0x0982add3,0x611c9764,0xc54e6b2d,0x1c1d4263,0x3ce76b12,
  126542. 0xeff64e73,0x3134b28e,0x2871612a,0xaf71a9ac,0xba093594,0x31c88af2,
  126543. 0xba9108e8,0x0b649112,0x5cf437da,0x8febc5c5,0x00000113 } },
  126544. /* 192 */
  126545. { { 0xc4a2daa2,0x7e9ca589,0x400f608c,0x18ea703c,0xd5175103,0x6f8cd058,
  126546. 0x4abb6f29,0x26493472,0x94296ab4,0x0be553e1,0xac51657d,0x9af9398f,
  126547. 0x4f880ea8,0xe232deec,0x67b1e1b1,0x2f81761e,0x00000137 },
  126548. { 0x3a20f662,0x51014bc7,0x49ed9502,0x1fb7e77c,0xb62b9652,0x89f5096f,
  126549. 0xa2e8d37e,0x3a659c67,0x5804170e,0x0f2b2a26,0x9ed50a34,0x1674fce6,
  126550. 0xfdc3c00f,0xaaa4537e,0x4ce99d93,0xf3c3bfda,0x00000198 } },
  126551. /* 193 */
  126552. { { 0x81614189,0xbab1f5cd,0x24b259f7,0xc7d56c45,0x45fb415e,0xc7baa4b2,
  126553. 0x7af6bef9,0x302bc8dc,0x74b48e82,0x91b770e0,0x9b6d1b1f,0x4a1336e0,
  126554. 0xe6680c97,0x285c1357,0xc7ccb625,0x59bcb813,0x0000012d },
  126555. { 0x7c019927,0xddad83b4,0x630dfd5b,0xe10f2667,0x31e05d23,0x15dbec5a,
  126556. 0x456ac460,0x2aa6e5fa,0x243cac82,0x46956529,0x4dc8c9e9,0xc69c9c7f,
  126557. 0xe24a4065,0xadb27e09,0xae41301b,0xdfa7a34e,0x000001cc } },
  126558. /* 194 */
  126559. { { 0x59cb1a7d,0x176a864d,0x6aefb8ee,0x4d864ca3,0x1c22b0d8,0x0ee83acb,
  126560. 0xd980df1d,0x7e80a6eb,0x7f94ced9,0xf582acc4,0x3a72c115,0xa29cd123,
  126561. 0xc7107bb7,0xce12a2a8,0x4ed80a30,0x0229ca56,0x00000150 },
  126562. { 0x2f1c180b,0x9774bad5,0xd749aa10,0xd08be998,0x56dbd1ba,0x978c48ab,
  126563. 0x0afbea9a,0x6ed3e3e4,0x153dc5fc,0x8a8be97b,0x9be93ed0,0xadc7f095,
  126564. 0x2cee23bd,0x8d242908,0xdc2729de,0x417523c6,0x00000016 } },
  126565. /* 195 */
  126566. { { 0x6c14a31e,0x74eeccf1,0xb2de3c2d,0x488e2534,0x7cec43c3,0xf9bb3599,
  126567. 0x916ac936,0x4210459d,0x9f7e4400,0x71d15c02,0x44553583,0x8c9c7c12,
  126568. 0xec94a467,0xcc97548d,0x3167bad9,0x4ca67818,0x0000014e },
  126569. { 0x8d0312bf,0x033af055,0x54161e66,0xbd1bf4f5,0xfa41781d,0x259945a7,
  126570. 0x00eef1d5,0x33494da8,0x79c3b8d0,0x6c505ec0,0x1c9f6e69,0x70ae1ade,
  126571. 0x76830aaa,0x0288f0c1,0xa62a060c,0x7f4cfe3b,0x0000000c } },
  126572. /* 196 */
  126573. { { 0x057d6006,0x0d8b447d,0xfd71c8b0,0x38b976e6,0xabcf40f5,0x5e77e029,
  126574. 0xf103a783,0x13bee386,0x5e472c4b,0x20a6ac20,0x31fcb194,0x43b045f6,
  126575. 0xc00abf49,0xe5dc1d9f,0xa5556b79,0x28c0bc70,0x000001b5 },
  126576. { 0x8a8640b8,0xba9d07ee,0xd0e34012,0x25611023,0xbe24ae89,0xc7ce655b,
  126577. 0xfa579dcd,0xe358e524,0x377bbfe5,0x57ce2715,0x3c0947e4,0x64651c6c,
  126578. 0xf4a97826,0x5fbd8d50,0xe2e1c15a,0x6fcdd28f,0x0000008d } },
  126579. /* 197 */
  126580. { { 0x5c7202c8,0xb564a2f6,0x5a54b0d8,0x7d634052,0x1434fbf5,0x8414d672,
  126581. 0x1d9830a3,0x8114215e,0x5ef0fbe1,0xc7a758d5,0xe6f57f9f,0x5705dcf8,
  126582. 0xd92269d3,0x5dd49a56,0xbdb49f97,0x8f015d7a,0x000000f1 },
  126583. { 0xb4799ce6,0x07131110,0x2cbcb7db,0x35bbfb99,0xf7ba21e2,0xc1f00c9f,
  126584. 0xb18f49fe,0x009d6913,0xabcf959b,0x8da61951,0x0d42146e,0x0e687213,
  126585. 0xae5f23f1,0x55832817,0x9ae7386b,0xc9b5bb68,0x00000143 } },
  126586. /* 198 */
  126587. { { 0x48c74424,0x423328db,0xd19cb2eb,0x32616e11,0x40d6e217,0xe534192a,
  126588. 0x0cbdc752,0xdd83a94c,0xd733bb01,0x5c623050,0x5b7a4520,0xcd0d631a,
  126589. 0x9a4011c8,0xccdc0a25,0x646e7cd5,0x22f112cc,0x000001e6 },
  126590. { 0x3e1e4c4b,0x47d6e29a,0x9fb1548a,0xd5f82538,0x4fd3e319,0x7e3705b5,
  126591. 0x0a08b966,0x8c4ce59a,0xd8cbe8db,0xbca749e7,0xaeec3d75,0xcc4496ea,
  126592. 0x8a1a313d,0x17dc723a,0x8ceb9360,0x250ff77a,0x000001a5 } },
  126593. /* 199 */
  126594. { { 0xfe29bd79,0xa55a0726,0x4f990b34,0x6574a810,0xaad56983,0x6906946d,
  126595. 0x50d41fef,0x0e580ab9,0x6e6f7f45,0xbc75b514,0xf0f3718a,0x508cc97b,
  126596. 0xa5634087,0x51ba2ca4,0xe64d8910,0x75c39077,0x00000172 },
  126597. { 0xf77ca6bd,0xf37cccaf,0xbdb18df5,0xe0a0df41,0x019e01f7,0x9f46cff8,
  126598. 0xaa65d72b,0xbe4f3d44,0x6e3663e9,0x7822d8ac,0x3ef9db6d,0x5f37f922,
  126599. 0xabe4a9aa,0x7f0ad39d,0xf69cc8ba,0xa0a57c70,0x00000098 } },
  126600. /* 200 */
  126601. { { 0x00fd5286,0xd9c50cf4,0x72a4b03c,0x1ea5b9d5,0x051ae73e,0xf5e60f9e,
  126602. 0x951b3824,0xfe9b5142,0x9fb4d667,0xb034b2d0,0xedc50856,0x4b537a80,
  126603. 0x8cb0022e,0x69ee1012,0x6a548aee,0x7c8b9e5c,0x000000ed },
  126604. { 0xd933619b,0x746007bc,0x2b9dfe19,0x0ce7668e,0xcc6e2a2e,0xa9eed5d3,
  126605. 0x7eebf32f,0x35a14f5f,0x67cc4f64,0x75cb898d,0x7850c16c,0xcb2185fc,
  126606. 0x45f79c96,0x09874a76,0x27db4744,0x7468f8ae,0x00000139 } },
  126607. /* 201 */
  126608. { { 0xc88684f6,0xc5de68ad,0x619a7dbf,0x7c1edaab,0xb27a18f5,0x258d1735,
  126609. 0x8ecd89eb,0xb27e7b65,0xd879f7ea,0x3d8889c6,0x67d5befb,0xa8fdc96d,
  126610. 0x37bad73c,0xc84d86ae,0xce8e56d7,0xc7e91976,0x000001a4 },
  126611. { 0x6319ffa6,0x5001a540,0x134ec04c,0x0cae64ec,0xd541242c,0x1f69a96c,
  126612. 0xbf2caeee,0x9da259ee,0x28bee805,0x88e7978c,0xb8e890e4,0xe9484beb,
  126613. 0xfb227fd9,0x0e5246d0,0x625d6318,0x8be2a54a,0x000001b7 } },
  126614. /* 202 */
  126615. { { 0xf472f13a,0xa223554a,0x5733e91c,0xfac993b7,0x96c168a2,0x26afe9f0,
  126616. 0x4b127535,0x7cfe761d,0xe77070ca,0x84301873,0xc7e7cdf6,0x66b6aaad,
  126617. 0xa1562ed4,0xda2dd5ea,0x39faf8d8,0xa81a2e00,0x00000016 },
  126618. { 0x4e3de3bf,0xa880759c,0x52f3088a,0x0c1e2e11,0xaa7eba5b,0xcb2ded9a,
  126619. 0x9f9c11ca,0x4c65d553,0xb0dc5c19,0x0ab9bd87,0xca3f4b61,0xd32f8c96,
  126620. 0x28cb5f9f,0x49842fcc,0xb90e21df,0x31ae27cc,0x000000f4 } },
  126621. /* 203 */
  126622. { { 0x6a0ccd0a,0x3b2a0a0d,0x5993b555,0xa3eeec82,0x9de672a6,0xb13486fd,
  126623. 0x0da05dcf,0x8d9c5148,0x6739874d,0xc4aa444d,0xe29a35c9,0xd9cf35b2,
  126624. 0x89177ead,0xd6bd9b5f,0x2a0470a1,0x9af0f59d,0x000001d6 },
  126625. { 0xba7535fd,0xb2f844c7,0xa842ff39,0x45bd4c3d,0xe951974b,0x5fe149ed,
  126626. 0xfd4453ec,0x6982e997,0xe6c37c0e,0xa63f705d,0xd2c3ef6a,0x09b0f6a9,
  126627. 0x1776a8d6,0xbedd3586,0xede11b78,0x4048a46a,0x00000176 } },
  126628. /* 204 */
  126629. { { 0x51a251d1,0xa47c6ee5,0x0d279dfd,0xbef4bf12,0xec518a28,0x4c2d538c,
  126630. 0x3880be6e,0x1b2b7887,0x1be9b20b,0xc69ccf8e,0x3796a19e,0xe41dfeae,
  126631. 0xfb50bdea,0x25676fc9,0x03e180c0,0x8b815a05,0x0000016a },
  126632. { 0x53f5ef65,0x2ca085f6,0x77b25105,0x61dfbbf9,0xa3346fe6,0x88ea87e3,
  126633. 0x1b95f7ef,0x25ddfdee,0x5b65eaec,0x22074e69,0x4c2e023b,0x11869a15,
  126634. 0x42e83bb5,0x8601b577,0xfa877e7d,0x1464652c,0x00000015 } },
  126635. /* 205 */
  126636. { { 0x57fa58f1,0x250853c8,0x4ca4c670,0xb58a4e68,0x1b81f40d,0x07b96d0a,
  126637. 0x558e8cbd,0xa4651e10,0x42e388cf,0x1a64046e,0x44436088,0x51b0d539,
  126638. 0xe26b8fd0,0xc2bf35b3,0x5702cfce,0x4ae78709,0x000000fd },
  126639. { 0xdf53d498,0x3c79bc29,0x1137f624,0x4cf31c4e,0x17a3cedf,0x93b6856c,
  126640. 0x6cd9115d,0x2461131c,0x9228cddb,0xab30a453,0x8d202bf1,0xe97757b6,
  126641. 0xe6108612,0xa666de7c,0x4f6026b4,0xc200fe65,0x00000051 } },
  126642. /* 206 */
  126643. { { 0xb1a2b4b5,0xea96103c,0x843c0968,0x98dccbfe,0x986ffb5b,0x6a37072d,
  126644. 0x169d3ac2,0x2fa07af2,0x771371f1,0x8bb85b9a,0xe7c299ef,0xeae10d34,
  126645. 0xe2372efc,0x3d4bdc69,0x8dd856f1,0x378df75d,0x00000039 },
  126646. { 0xde7ff5d9,0x31e902ff,0x325a09ca,0x0e9a85d2,0xf4192fcd,0xd71b93a6,
  126647. 0x15b076b3,0xf52a5737,0x6e711d1c,0xd726aa86,0x2c292819,0x0b61b1df,
  126648. 0xc8015de6,0x224e575c,0x18b79e47,0x68e893e1,0x000001dc } },
  126649. /* 207 */
  126650. { { 0x6ffeda73,0xb7924ff9,0xa0da2018,0xe709f406,0xf89584df,0x368e20ea,
  126651. 0x8355a040,0x0095112e,0xfd777d7c,0x259d4528,0x2bf8f2c8,0xb0c49565,
  126652. 0x44c5311b,0x7f631928,0x8466d9d5,0x698d0e4f,0x000000d5 },
  126653. { 0x015d204d,0xe10d64fa,0x6dd10c53,0x7b626bfa,0xa7698c94,0x087f8e63,
  126654. 0x05337a56,0x525a6547,0xdf5c782f,0x558e2244,0x855fbaff,0x48aa1e41,
  126655. 0x47ee3830,0x48f2218e,0x138463d3,0xf2523959,0x0000004d } },
  126656. /* 208 */
  126657. { { 0xd8695310,0x76f4fd69,0x7e8768ea,0xe28eb09f,0xe0d532a8,0x039c1812,
  126658. 0xc572ac79,0xdda67744,0x785d6293,0x1f9800e0,0x3da76bb2,0x2bfe2a5a,
  126659. 0xa2bc7217,0x6ed15b90,0xd1788a8e,0xd80e61bf,0x0000004c },
  126660. { 0x16730056,0xb9f40370,0xdced3d43,0x46f45fef,0x1aa50742,0x0afd763c,
  126661. 0xff92ae73,0x21e5c652,0x1bb2063f,0x6ef0830d,0x12d22540,0x18306ecc,
  126662. 0x1f15001c,0x4edd9b3a,0xc0cc5424,0xe4eb25b8,0x000001f4 } },
  126663. /* 209 */
  126664. { { 0xa1db5c18,0xed61a714,0x7677074c,0x9454e61e,0x7bf685de,0xe970fbe5,
  126665. 0xd2145be5,0x221b0c53,0xee49a5f2,0xb931881b,0x14b11d03,0x00b91afa,
  126666. 0x3ec22137,0xc6aefe49,0x526200af,0x50554e94,0x0000013c },
  126667. { 0x7364c92e,0xd42c45e7,0x735218e8,0xe0500265,0x84d3f3c5,0xd281da02,
  126668. 0xdbf7646b,0x312f8424,0x485f304f,0xe1a88f2a,0x1127a513,0x583f5631,
  126669. 0x1a60e0bc,0xed7950c7,0x4b7b70a4,0x92855e10,0x000000c6 } },
  126670. /* 210 */
  126671. { { 0x644614e7,0x8d06185c,0x4749a424,0x2e906cae,0x2587e528,0x585412ea,
  126672. 0xd12857cd,0x3763990a,0xba5593b5,0x770c7f70,0xdd5d2a46,0xc2cf6dc4,
  126673. 0x3b69a1ba,0x564da456,0x187895da,0x639f7e14,0x000001c8 },
  126674. { 0xf8589620,0x05c96b02,0x41e44054,0x2fe468a3,0x096ad09c,0xbf22da11,
  126675. 0x9c652aee,0xbc73c298,0x547e1b8f,0xcdef9f8b,0x977dbf73,0x7073785a,
  126676. 0x7e13552d,0x0a92a1aa,0x3a393d3f,0x22761140,0x0000015b } },
  126677. /* 211 */
  126678. { { 0x1fbfaf32,0x89a5a7b0,0xbe661d21,0x5c5a62d0,0xf5e3b44d,0x47970f5e,
  126679. 0xf43bbf62,0x3ea001ed,0x260ae5a0,0xa8e74285,0x2697c62c,0xeb899ebd,
  126680. 0x751a7643,0x36a003e6,0xba0725a6,0xef178c51,0x000000ea },
  126681. { 0x9bd51f28,0xaacf8e9f,0xa8712044,0x39febbdb,0x5bfc8365,0x8780ad3a,
  126682. 0x10e6f08f,0x408a34cd,0x8241ab0e,0x8104ca10,0x98a662a1,0x843e71ce,
  126683. 0x232048d6,0x9dce8514,0x1cf3d187,0x5cba23be,0x000001fa } },
  126684. /* 212 */
  126685. { { 0x2973a15c,0x2fe8c9d2,0xd42979f3,0x66fec8dd,0x0b6afb3e,0x39af4a39,
  126686. 0xab65ef22,0x0bb1e436,0x66c5fcdb,0x8f26201e,0x5af4870b,0x3cffe8a3,
  126687. 0x2bb44e24,0x65ae286f,0x51dd1722,0xda2e283a,0x00000114 },
  126688. { 0xc1e3d708,0x4a9c9a56,0x1cb0efa6,0x4fe62d3f,0x97e87540,0xf0702984,
  126689. 0x3cea46fa,0x138b7d6b,0x83886263,0x0780634e,0x71c30909,0x27e84280,
  126690. 0xe5838647,0xf0af79d7,0xb236a267,0xc1b86582,0x00000104 } },
  126691. /* 213 */
  126692. { { 0xa526c894,0x32ff09ed,0x14ac7d23,0x95abf120,0x3cd92934,0xb6f94dcd,
  126693. 0x92e6b556,0xffaaeb12,0x1036c31b,0x193796ea,0x707ff32e,0xa9d237e7,
  126694. 0x829d67b8,0xd65a5b0d,0xdb29248b,0x48edb556,0x000001b3 },
  126695. { 0xded46575,0x6ee9f9b2,0xffa69acf,0x496ca08a,0xf16d37d1,0xd5aeb3a1,
  126696. 0x789e5d01,0x4a507db1,0xc827cc45,0x05e2ce29,0x2964e677,0x29b6e4a5,
  126697. 0x4c0e46f2,0x0563b0ba,0x4bc46485,0xe75c2448,0x000000a3 } },
  126698. /* 214 */
  126699. { { 0xd2f6615d,0x0fcb476f,0xd98da9a9,0x4b7f9b78,0xd2bdf107,0xe2fddf1c,
  126700. 0x9b956f31,0x2bda3086,0xb596eadf,0xf3cca2f7,0x355b2538,0x91c09f8b,
  126701. 0xc6c846db,0x46f3f6f3,0x2a14642e,0x9bb9398e,0x000001ff },
  126702. { 0xa17bd645,0x5118d4f5,0xdbd6d552,0x57033eab,0x734d0957,0x007e86fc,
  126703. 0x5f53c435,0x98ca065f,0xfd27dd19,0x9949d9bf,0x6952d1ca,0xddc4e304,
  126704. 0x81ac101c,0x84cab4fb,0x4a56b007,0x46d079f9,0x00000003 } },
  126705. /* 215 */
  126706. { { 0xa6bfdedd,0x95eb8e4f,0x7a74c6f9,0x993a285e,0x3d09a252,0x8bd5d4d1,
  126707. 0x19a5f767,0xeaa10be6,0x0cebb340,0xd3db083e,0x1dbf7a83,0xc633a78b,
  126708. 0xc30f23e1,0x2664bc3e,0x07a08379,0x6630f8f1,0x000001c9 },
  126709. { 0xdef86a80,0xbbf4cb4b,0x3f8259ab,0x1fa4ec78,0x609532c8,0xa4bf7604,
  126710. 0x8b909e92,0x71bb7acc,0x17884160,0xca1d7317,0xca1ab928,0x7f7f14be,
  126711. 0x5f8455a5,0xbfea016e,0xbf21e899,0x7b8c76b9,0x0000002d } },
  126712. /* 216 */
  126713. { { 0x4b9f8e7d,0x46860563,0x63fc58a8,0x201176b7,0x2feed68a,0xe7a5da7e,
  126714. 0x65183190,0xcc67763e,0xe9377ad6,0x7d7d0102,0x77032321,0xccfc4720,
  126715. 0x534bb505,0x573ee031,0x0f1a2769,0x1bf1ef8c,0x000000f3 },
  126716. { 0x0c935667,0x635f5c4b,0x060d2b8b,0x74152c39,0x37c3a574,0xeffaac2e,
  126717. 0x0b72e0cd,0xfd5fcc4c,0xf4f60247,0xb743f9b9,0x79e16f33,0x05c2e354,
  126718. 0x3074ef9c,0xa2234c47,0x495aace3,0x4092f279,0x00000124 } },
  126719. /* 217 */
  126720. { { 0xb30f9170,0x5bfd7851,0x37fce5b1,0x715aa1e9,0x928437b9,0xcffd55e0,
  126721. 0xc32f1273,0x88acd259,0x48be1e34,0x5a145cf2,0x7a5bc62b,0x3a340860,
  126722. 0x18156f46,0x6296eb15,0x2774e1c3,0x397fad19,0x000001e7 },
  126723. { 0x9c8225b5,0x362f99f4,0x46b77c4d,0x33efce49,0x8541e91b,0x451df530,
  126724. 0x38f3d693,0x0bd2d934,0xe727b54e,0x0b5de2d6,0x7622d940,0x42d929c2,
  126725. 0x56f6a94b,0x36ace723,0xfccaf205,0x64a18cd5,0x00000044 } },
  126726. /* 218 */
  126727. { { 0xaba95d63,0x8dbe0aab,0x7b4b346d,0x92780c61,0x0e0d8142,0x6430f863,
  126728. 0xb56ef04c,0x875be02a,0x785e3633,0xc28feb95,0xc12c93e4,0xd5401795,
  126729. 0xe36f82a3,0x89ff51c1,0x10eeafd6,0x3c48c895,0x0000016b },
  126730. { 0xd4f064be,0x79287eba,0x54ebda99,0x1a77d555,0x623727ea,0x46745ef2,
  126731. 0x89f366c6,0xa911f591,0xc59d6ebd,0x7e5435cd,0x7524d213,0x3a84daea,
  126732. 0x4395b38d,0xc7b1dd1c,0x1a823c49,0xca13e704,0x0000001c } },
  126733. /* 219 */
  126734. { { 0x874d64b0,0x6399860c,0x1653ce0c,0x3375b092,0xeaa11986,0x16700000,
  126735. 0x621cd15d,0x62c67909,0x77d70dcd,0xbe1d7dd6,0x305bd4cd,0xeff0f270,
  126736. 0x362f8f30,0x076ec621,0x7e445b78,0x81204816,0x000001d8 },
  126737. { 0x161f9758,0x81749a0e,0xa3c4fce2,0xe60915fe,0x911dd8af,0xf537ce41,
  126738. 0x79a51a09,0xfe36a8ac,0x2ca5cf8e,0x67fb54b4,0xe49057f5,0x1bdcae07,
  126739. 0xa4244b64,0xb71ff0c5,0x4b606583,0x4815a536,0x00000106 } },
  126740. /* 220 */
  126741. { { 0xef39cc39,0x78c69c3e,0xfa6356d1,0x98304564,0x412fb990,0xbd3c3542,
  126742. 0x79dbb2a5,0xa1d531d3,0xe7e75e3d,0x4865f188,0x0b0147b1,0x2dac4e22,
  126743. 0x33d29ab0,0xf59e51ca,0x37b074ef,0xc964f7fe,0x000000f1 },
  126744. { 0x0e301262,0x7080c0a6,0x5390a22d,0x9a458060,0xcc8a9029,0xda677f9a,
  126745. 0x14c0f1c2,0xdfae9057,0x6e66d9f7,0x3665ff16,0x47846924,0xc866dd8c,
  126746. 0xc4cc307c,0xc5afe98f,0xe0bf50e4,0x60e3ba63,0x00000039 } },
  126747. /* 221 */
  126748. { { 0x959ecdb3,0x1a785136,0xf9e959be,0x289af617,0xcde0dc88,0x5145b2b8,
  126749. 0x7c079e15,0xfe9070b0,0x50e22415,0xf77f04d3,0x358d6d42,0xb3ab7372,
  126750. 0xba7b629a,0x14fd41b9,0x7400fd25,0x7b32d80e,0x00000193 },
  126751. { 0x7147886f,0xe5d80d4d,0x576c81ca,0xe08ced61,0x642717bb,0xe14e8692,
  126752. 0xabb4bd21,0x9dcdf198,0x6530308b,0x658be646,0xd99d19c7,0xfbf192da,
  126753. 0x304ab126,0x55a3d1b3,0xfa24de31,0x943f4be5,0x0000000e } },
  126754. /* 222 */
  126755. { { 0x7fe9ea48,0xc5424058,0x61b57486,0xaf24f825,0x78719740,0x9d2c413c,
  126756. 0x70eb874d,0x27a9be79,0xb62ba3aa,0x43fef8e0,0x2c1bf0ac,0x0a23f286,
  126757. 0x4af130e1,0x51c276f3,0xae55cebf,0xf6cd1e9a,0x00000185 },
  126758. { 0x40369093,0x24defa7f,0x58581e0a,0x11f1d9d6,0xe512ed9e,0x9900bf33,
  126759. 0xed120896,0xbf8a8459,0x8b73c399,0x8324555e,0x8f6f54fe,0x54a30569,
  126760. 0x3c252355,0x2a9d6da5,0x2a093b31,0xe6a6f904,0x0000016a } },
  126761. /* 223 */
  126762. { { 0x152cdd35,0xb2e123c9,0x86402ef1,0xae6e43a8,0xb9ce5bd5,0x892bf0df,
  126763. 0x75804914,0xb4acb84a,0xf502eec2,0x8c7f55ff,0xaa33ef4e,0x9c8a7b93,
  126764. 0xfd9d2001,0x06b10357,0x0ba3bceb,0x3e319ff0,0x00000027 },
  126765. { 0xabe360a3,0x182c2f77,0xadfefca6,0x57ef5c84,0x650b6fcc,0x9a4f0ca6,
  126766. 0xaaf0b202,0x3f4f8e56,0xa24ef156,0x5c8508a0,0x1ea45f13,0xd8f62fd9,
  126767. 0x28036dbe,0xf2c923a0,0x1a4d103b,0x4a9ca4c0,0x0000018a } },
  126768. /* 224 */
  126769. { { 0x5448e339,0x2a3fb798,0x18a39976,0xde8770cf,0x7a69170c,0x1160574d,
  126770. 0x2b6067ac,0x4bb05c59,0x848138ab,0xde0d2db0,0x4909e794,0x149dab92,
  126771. 0x790315f7,0x83a336b6,0xa335a258,0xcd9074d9,0x0000013c },
  126772. { 0xac1b784d,0xe839c5e0,0xee527ae1,0xab65c8c6,0xa1c88ec0,0xd3c86146,
  126773. 0x46c1bf58,0x2201f790,0x3fda502a,0x71cec627,0x225b9065,0xff3f88eb,
  126774. 0xc556dfcd,0x6c1f0c98,0x484fa5cc,0xaa3222aa,0x000000ac } },
  126775. /* 225 */
  126776. { { 0xc9b4dfd6,0x17e74bc3,0xf8e76293,0x25ba8053,0x9d8c3520,0x0307dc05,
  126777. 0xb85a20b4,0x1c9036cc,0x23871359,0xf2c63f0a,0xca95fb4e,0x1a99d9d8,
  126778. 0x9850c6c6,0x3d7c4f39,0x68299668,0x162969c9,0x00000169 },
  126779. { 0xcb63ee53,0x7d13c267,0x75eac353,0x67b12e61,0x191abfca,0xb3369a11,
  126780. 0xee1af69f,0x5ad0649d,0x11dc11e7,0x4d7a6f00,0xdb9f9765,0x80f030b8,
  126781. 0xf0ab1332,0xa20001a3,0x39d8cc62,0xe17c98d2,0x00000194 } },
  126782. /* 226 */
  126783. { { 0x1d8fe898,0x720d80b4,0x32184534,0x8d7a28b7,0x04f21740,0xf1f3c385,
  126784. 0x166aa6af,0x5d381cd5,0xcc560e35,0x9cde6084,0x5e61e2cd,0xcb041f0a,
  126785. 0xd9b4951a,0x621116f5,0x7ee2ac2c,0x509e16d3,0x000000c4 },
  126786. { 0x2c6fd79e,0xb82a20c4,0x3af78b0e,0x95b7ee4e,0xbad819ca,0x3d9b63c1,
  126787. 0x98552569,0x10d674de,0xf9c19d0f,0x17de64b2,0x47c5e6a9,0xa03fabaf,
  126788. 0x2ce2db6f,0x858bc4ad,0x1fc9d18e,0x76c2380a,0x000000c9 } },
  126789. /* 227 */
  126790. { { 0xb064f114,0x91171ef8,0x4f2f0f4c,0x83cb1565,0x57b262b7,0x30525854,
  126791. 0x0f34936c,0x468c6701,0x99a41fed,0xef26d2fe,0xa7f7f6a9,0xf6da2267,
  126792. 0xa01bfc1b,0x2563b8db,0xc340ed40,0x14b36c85,0x0000000e },
  126793. { 0x25db67e6,0x5e57e264,0x7f2e905f,0x85df4e89,0x026c4268,0x7832e514,
  126794. 0x3e875093,0x312be262,0x3c538691,0x856b5bd8,0x95734f9d,0x5b1cae55,
  126795. 0xd5aa4861,0x5a07bfe2,0xce8abb58,0x7a4c96f0,0x000001d0 } },
  126796. /* 228 */
  126797. { { 0x523aa2e9,0x7bf54d05,0xed3d0860,0xc8841e0c,0x7f9bfb69,0x5683f6e2,
  126798. 0x162bdf85,0xdcb07f44,0x07b0dcc9,0x62d17839,0x657a536e,0xa2cbb8ab,
  126799. 0x7cf47d3c,0x98b9a0d2,0x5eea6370,0xff154d68,0x000001f2 },
  126800. { 0x56b232ac,0x568b768a,0x3f2a52ab,0x4e8d6e36,0x8837fc60,0xbae87a16,
  126801. 0xd10a7691,0xebc58a83,0xf9455fbe,0xad5e4af0,0x7d654e2e,0x1a20d6c3,
  126802. 0xda7c8255,0x8c40fcb9,0x60d9b931,0x6d7b3cd7,0x000000b2 } },
  126803. /* 229 */
  126804. { { 0xbb2eaf45,0x7b090c3e,0x62ffb92f,0xed24d91c,0xa736f23d,0xbf2a3ea4,
  126805. 0x6ff0fde3,0xb5b99ebd,0xca1102f5,0xbca2b55d,0x07e032a8,0xf6203cd8,
  126806. 0xa8bf17a8,0x5410b448,0xe1dc55b1,0xb86660a7,0x00000109 },
  126807. { 0x02a2fbd8,0xb148b1da,0x3b22e8a5,0xfed85e8b,0x8712b509,0x1378a0e4,
  126808. 0xc6a3e516,0x68560148,0x1633b503,0x7100921c,0x25512711,0x93925143,
  126809. 0x07d31047,0x7b4931d2,0x8542e0bb,0x623e722b,0x000000ea } },
  126810. /* 230 */
  126811. { { 0x24972688,0x084823d3,0x003f5762,0x58b83c12,0x6d0d4528,0x194d6690,
  126812. 0x2c6f747e,0x84219584,0x0146d89a,0xc8f8a2e9,0x7451bbc2,0x29ec1de7,
  126813. 0xf7f284fa,0xf622b6b8,0x7b71e44f,0x83f1dbe9,0x00000060 },
  126814. { 0x999dd56b,0x99649333,0x97a47de9,0x2cfac0ba,0xbbe8fb20,0x6660d8ae,
  126815. 0xf61d7bca,0x47c29dd8,0x85adc14d,0x6f5fb51d,0x4f9fd41c,0xe65ac788,
  126816. 0xff513e6c,0x1ce69dd4,0xffe59d3e,0x1ace591e,0x00000023 } },
  126817. /* 231 */
  126818. { { 0xa9fda771,0x2e67a438,0x8663100e,0x626f652c,0xe133f23b,0xdfb19e48,
  126819. 0x035d2d1f,0x599f88f2,0x8d13e878,0x1723a112,0xfb51ce07,0x890aa292,
  126820. 0xbbd9ba82,0xe5f3a70e,0x374514b4,0xdde82673,0x00000155 },
  126821. { 0xd6f59a95,0x08b2b77e,0x02020420,0x93f853e3,0xebac7797,0x52252ac1,
  126822. 0xb56b6676,0x6ecdcb99,0x9722a500,0x4abdb9f9,0x04e2bad0,0x26210f3f,
  126823. 0x3034dd4d,0x0ca5a0ff,0xdac0b80d,0x333d8080,0x00000041 } },
  126824. /* 232 */
  126825. { { 0x35a85a06,0xe8510709,0x42ef1b44,0x4e166e76,0xa07b3a6d,0x84a90b71,
  126826. 0x30329e6a,0xd6dd6c00,0x3d555259,0x20c4ba65,0x6f8ad05e,0xee3b26af,
  126827. 0x2ab4cccd,0x20e3d541,0xa9406424,0x79798934,0x000001bd },
  126828. { 0x8e0c7ff0,0xf2a1d184,0x9543b340,0xbae85efc,0xf51d318b,0xe96431ae,
  126829. 0x75878fa6,0xe5d3ed4e,0xc2895f52,0x4d2a29db,0x1f11067c,0x3af27877,
  126830. 0x9e7f4ee5,0x6ccde964,0xa56d74da,0x35188da1,0x00000192 } },
  126831. /* 233 */
  126832. { { 0x03d310ed,0xb0832120,0x987b0311,0xd20ee8cc,0x84c558a8,0x9e549d26,
  126833. 0xb7167ec8,0x5e25f3ce,0x4bf55bb5,0xacf114f4,0x061c9017,0x819edc77,
  126834. 0xdeb343c0,0x759a44e6,0x04c9b5ed,0x58df9f7e,0x00000078 },
  126835. { 0x3bf13222,0x4fa47ebb,0xea07da11,0x1e451dcd,0xc0d8242f,0x1be9fac3,
  126836. 0x36eb871e,0x93257d4d,0xbea3190d,0xf49e775a,0x4ebe2b33,0x406d191f,
  126837. 0x0c110096,0x67aac53c,0xd381ac78,0x5215cf8b,0x000001f4 } },
  126838. /* 234 */
  126839. { { 0xfa493b79,0x387e8a8e,0x4eb1c2ac,0xb20e270b,0x9ff22320,0x9f393fa0,
  126840. 0xa91c393d,0x5ee1baae,0x138a8d96,0xdeda961a,0x97bd50e4,0x69ab238c,
  126841. 0x2363c8e0,0xff68d48a,0xce4c4c16,0xaf8e00e5,0x00000158 },
  126842. { 0xcfc509a1,0x6ccdcf06,0xc26cc075,0x60f411ef,0x4d9c57f0,0x6d0cdfd6,
  126843. 0x32e99cac,0xa9514853,0x8b8e9510,0x58f9ab3d,0xb10dc3fd,0xa7e98709,
  126844. 0x75ef3509,0x8390843d,0x5a9312c7,0x28ccc9d0,0x000001b6 } },
  126845. /* 235 */
  126846. { { 0xe341463f,0x1d934f00,0x150da7a0,0x14c8a6ce,0x4109553f,0xdb4860fc,
  126847. 0xa93f4a91,0xc23bde5a,0x2cd58067,0x9f47c787,0x8433dc80,0x1d330054,
  126848. 0x75a32a7d,0x0c0be7f9,0x88c75da9,0x08b777d5,0x0000012e },
  126849. { 0x61a10d37,0xdfc12817,0x5c50f5a5,0xed7b6181,0x79477c60,0x28af95db,
  126850. 0x33c5310b,0xa0aa2b77,0x53118267,0x905faab8,0x6b41959f,0xf40e9816,
  126851. 0x16b37784,0x9ccb4252,0x69866acc,0x6835d77c,0x000000c5 } },
  126852. /* 236 */
  126853. { { 0x2b450a66,0xe9d714cb,0x7dbfdc14,0x1318885c,0xb466a0c0,0x655a8d85,
  126854. 0x5bdfc1a6,0x02a21e99,0xe67792d1,0x7a0d7c98,0xb550a797,0x2a01bb57,
  126855. 0x5d74d337,0x42c46233,0x88dad495,0x7be4e1c0,0x0000008b },
  126856. { 0x95812273,0x1873b03f,0xee3f757f,0x2e26ed32,0x6da6217a,0x2c710eae,
  126857. 0x261d9f4f,0x9b50b574,0xb7c1da2d,0x43971fa9,0xc4a85de7,0x22c4fb87,
  126858. 0xec22137b,0xf72c3451,0x77ba1926,0x1345668c,0x00000173 } },
  126859. /* 237 */
  126860. { { 0x8a3ba183,0x3e3e8c7a,0xfe389fa7,0x4e8cebbb,0x0f9ba60f,0x8ea44687,
  126861. 0xcb601a83,0x55176e35,0x12e52db4,0xf90bdc26,0x8f712bf1,0x95f9e459,
  126862. 0xbea054cd,0x9bd3200f,0xdd5fd40b,0x2cf19bf6,0x0000017a },
  126863. { 0x66736feb,0x71cf6ca2,0xde7cfe2f,0xbde86f49,0xfc290563,0xc60abce8,
  126864. 0x726b6e4f,0xaae8a3ce,0x3f29235b,0xd2382445,0x650ffa5e,0xa4b557f5,
  126865. 0x113ef744,0xa1453e54,0x3e426dd2,0x7c676a53,0x000001b0 } },
  126866. /* 238 */
  126867. { { 0x35d96872,0xf5e603f2,0x3fa5b8ca,0xab1a23cc,0xe988dc5f,0x5459871b,
  126868. 0xd430c0bd,0xe32e8489,0x764d9cc3,0x7ec269e0,0xf2c0c40d,0xf7238212,
  126869. 0x887b83b4,0x2d946183,0x2f18a411,0x281fa671,0x00000010 },
  126870. { 0x64858b37,0x8028048f,0x357de5d9,0xe0e149af,0x619ebb18,0xb2218791,
  126871. 0x9f2b0ba0,0x210200b3,0x1039cbae,0x5a87eae6,0x39579d1d,0x4efdcddb,
  126872. 0x2788515e,0x1b388eaa,0xc81878aa,0x1a552c3c,0x0000002c } },
  126873. /* 239 */
  126874. { { 0x0ea723dc,0x7ac7f500,0x42b15231,0x0a5f04f4,0xbe885c86,0x63d49445,
  126875. 0xff119702,0x61f9993f,0xc4c58cea,0xc3fba45c,0xb9cd6036,0xe6d151e6,
  126876. 0x57b923bb,0x75a3ab15,0xceb2fd46,0x4ec07c52,0x00000147 },
  126877. { 0xed88239d,0xc46a3d32,0x835ae694,0x0d1b8ae6,0x9feeb2e7,0xf4fde325,
  126878. 0x43bc0bb5,0x223bf71c,0x8f62a705,0x3cd220b7,0x9fe799a5,0x2224860e,
  126879. 0x24ab7f93,0xd8558703,0xb594958b,0x8e0f7330,0x0000010f } },
  126880. /* 240 */
  126881. { { 0x3c67d520,0xaf35c7bb,0x23fca9ec,0xd8f4958b,0x8bbaa808,0x0778f194,
  126882. 0x2135e8ae,0x418c30ce,0xc888eff7,0xcdd8d9a9,0xf73144ab,0x72075df0,
  126883. 0x4506a534,0xb549c895,0x5fbb7fc5,0x4ef38979,0x0000011c },
  126884. { 0x43f5e698,0x3fe2c9ac,0xe38a5e3a,0xce77fcbc,0x3089c2e1,0x6d05c90e,
  126885. 0xac1d5801,0x5a74f3ff,0x381b9d2a,0xaeeda220,0xf5f3960b,0xd958b143,
  126886. 0x0db7abbe,0x65ffd051,0x7a05b718,0x8e97e680,0x000000ce } },
  126887. /* 241 */
  126888. { { 0x8ce86a83,0x2251e61b,0xbf7e7160,0x8604159f,0x48f03377,0xfc127dd7,
  126889. 0x45052242,0x87cb2c37,0x934ea09b,0xbd4950f4,0xc4679441,0x5146c403,
  126890. 0x23ba416a,0xe8ad4710,0xaf638eb1,0x89b81a60,0x000001b3 },
  126891. { 0xe8150c69,0xe699934e,0xe27c14bc,0x74f75908,0x6a0194ff,0x5dc0a891,
  126892. 0x1bd51b76,0x38f49d32,0x18779630,0x6bc3305e,0xfd3b4a68,0xfe2f3fbf,
  126893. 0xd7caf189,0x1409b377,0x9b8f109b,0x029ea13b,0x000001b3 } },
  126894. /* 242 */
  126895. { { 0x25a2fd88,0xef7938d2,0xceba0603,0x890f2f7c,0xd7a6dff4,0x4c3e1c80,
  126896. 0x2883f986,0x00c78f36,0x998e5305,0xed92b592,0x325ddc73,0x018a8f1b,
  126897. 0xd5d3708a,0x6dffd987,0x0d1f28bb,0xdcd3554f,0x00000059 },
  126898. { 0x23a74e7d,0x17c6e41d,0x5db32df6,0x94b61ebe,0x9e7ffa0b,0x3c2fffa7,
  126899. 0x2ebb7a0d,0x473662b7,0x01adf9c3,0xa86415ee,0x54679264,0x1502c326,
  126900. 0x2fa09c57,0x16911349,0x24749086,0x897f34aa,0x00000195 } },
  126901. /* 243 */
  126902. { { 0xabadc253,0x4845d359,0xc797c95e,0xe054b92c,0x9a218212,0x22a9b5bd,
  126903. 0xa52b8827,0x9bb80a5e,0x2e61c676,0xea38e78e,0x08b0f8b3,0xfb274b1a,
  126904. 0xdb9d854c,0xb6aa42e3,0x56012d73,0x8ba22523,0x00000163 },
  126905. { 0x75c8c576,0x7cec0e6f,0xe4bc7dd2,0xabb20e7c,0x69d80726,0x0958a0c8,
  126906. 0x8a023eb7,0xa908c66a,0x76110b15,0xca9f50ea,0x186f61a6,0x668c9994,
  126907. 0x2a0a69d8,0x9ddf22ed,0xbbf8a10f,0xbfee1897,0x000001e0 } },
  126908. /* 244 */
  126909. { { 0x48319e4f,0x26d86818,0x5a586fa0,0x6be6f6b5,0x26713265,0xbef5d886,
  126910. 0x98529cfa,0xac252ac5,0x62b29cfb,0xe7cc45f1,0xa2a6358d,0xee050609,
  126911. 0x2940ac70,0xf7cb9ca4,0xa885b1f0,0xfb44aaec,0x000001ad },
  126912. { 0xe798678e,0x66b7a936,0x99540438,0xca01e103,0x816860b7,0xf2491e37,
  126913. 0xb745d857,0xeeffd483,0xa4705ed6,0x5dbb3628,0xb2a5d0f7,0x57d68d49,
  126914. 0x2389fee3,0xd1a8529a,0x1a7fd686,0xdbbc2549,0x000001ad } },
  126915. /* 245 */
  126916. { { 0x969686a3,0xe10cba20,0xe3c053f5,0x308b1c55,0x26f47102,0x1712b134,
  126917. 0x49033038,0x1f9165b1,0x2d01527b,0x45b72017,0xaa9a34e2,0x6fcf6647,
  126918. 0xb0be35c8,0x51f54b94,0x5a15e382,0xfccb22a5,0x000000e3 },
  126919. { 0x5b4dc0be,0xaa71e4ec,0xdb1cd5c4,0xbb136248,0x046e1007,0xf36bff43,
  126920. 0xda9c99a3,0x5a6806d7,0x8349bc50,0x9cbfc6ee,0xe13e0850,0x26871e73,
  126921. 0x67f448c1,0x5e6aa227,0x2da7baf9,0xba77787c,0x000001b9 } },
  126922. /* 246 */
  126923. { { 0xc5a73375,0x1abe58ee,0x7a8ac438,0x175df69d,0xceca835a,0x2cf3150a,
  126924. 0xf507d30f,0xb87b0609,0xc60b0424,0x9ae53a2b,0x410f90ec,0x4931e182,
  126925. 0xadd689bb,0x452c7d0f,0x47631a8e,0xab453491,0x00000013 },
  126926. { 0x8c84f3af,0xaf2dd856,0x1baae33e,0x829dc092,0x8b96b070,0x46542a85,
  126927. 0xe8a82516,0x42260d40,0x5c35322b,0xb9e5edac,0x39eda0d2,0xbca79560,
  126928. 0xb962b90a,0x86bd07c6,0xb1ec5302,0x2e22dac7,0x0000010a } },
  126929. /* 247 */
  126930. { { 0x239d8f0a,0x665fc09d,0xab8a1021,0x92b2e03c,0x0173477b,0xe4369768,
  126931. 0x8e361604,0xab38ed9f,0x9eb061be,0x79b0091d,0x3e845670,0xcd422654,
  126932. 0x2fe1a2e0,0xa0f77ec7,0x760a030f,0x1d242162,0x00000093 },
  126933. { 0xf8646bc3,0xfa9f834c,0x40ae96f9,0x7df94a52,0x379177d1,0x901c3890,
  126934. 0xffeb66cd,0x9dfd0644,0x77b92465,0x81aec2ec,0xcd981d4f,0x2df3b7f2,
  126935. 0xf377b093,0xc9bc3f69,0xdd859d8b,0xdaef34f3,0x00000125 } },
  126936. /* 248 */
  126937. { { 0xa2c123bc,0xac08451b,0x0818fa54,0xd1e83a68,0x98957b8a,0x56dd5702,
  126938. 0xf0f12f16,0xcc7f2e34,0x0a9fa14d,0x1f6a9c33,0xb2fe782c,0xefc9a2bb,
  126939. 0x709f54dd,0xd319c697,0xd6460a53,0x0b8238cb,0x000001dc },
  126940. { 0x44dfb6f6,0xf6492901,0x6e401d26,0x270d7cb4,0x48537ad8,0x1a70a40e,
  126941. 0x70d8dbd9,0x84d661b5,0xf170d58b,0xca27223a,0x6344e1d2,0xeeb4cf14,
  126942. 0xab9de1fa,0x2255fc95,0xdbdc5ea7,0xcd6e110a,0x000001f8 } },
  126943. /* 249 */
  126944. { { 0x78b8a0a7,0x2a57c6b9,0xe833edea,0x24b4aeb6,0x4bd13fe7,0x9e4617c1,
  126945. 0xfc2e8ee4,0xc4186888,0xfb147eef,0x8d398a49,0x2e662cfb,0xe9f191f1,
  126946. 0x958ba2ec,0x61872289,0x00b8d50d,0xbd6d0f1b,0x0000002d },
  126947. { 0x24c93cc9,0x895cfdfe,0xb9e718e7,0x29ed7780,0x38baf7eb,0x01c8ba58,
  126948. 0x4ddcbf69,0x0225387e,0xa180d6bb,0x64b250bf,0xc947c7c2,0x6d68e548,
  126949. 0x9923f3cd,0x82a7b632,0x2d103cd2,0xb8f03613,0x0000000f } },
  126950. /* 250 */
  126951. { { 0x8cd9d494,0x8198b3f0,0x94f4f9f3,0x9b2065b9,0x3c738fa9,0x7664a220,
  126952. 0xd8d229cb,0x199f4c14,0xc51c54b3,0xddad75c4,0xd213a332,0x9a32ce0b,
  126953. 0x888c7b2f,0xf3a21085,0x5b1ff20a,0x6defa362,0x000000d1 },
  126954. { 0x19a296eb,0x44e00548,0xd1a91313,0x1d94ff15,0xfeaa454f,0xd7dead2b,
  126955. 0x4d40bd7f,0xae65a803,0x1801a4af,0x604f147e,0xa5e0de77,0x983048f9,
  126956. 0xff572ca0,0xa3b19ca5,0x1821d117,0xa237dba7,0x000000e0 } },
  126957. /* 251 */
  126958. { { 0x91630ee8,0xedbabf84,0x05eb5301,0xde6589c2,0xa051f47b,0x9f7d2b2d,
  126959. 0x212bbe81,0xaeaa9f96,0x94292124,0xdced3d5e,0xf4435e5b,0x691f5b89,
  126960. 0x9411f66f,0x19604c33,0x4356f0da,0xb7fc09ca,0x000000e6 },
  126961. { 0xf74f811c,0x1294e413,0xdf8d8ddb,0x1a42d831,0x963418c9,0x27f57217,
  126962. 0x88ebcdec,0x5fde5218,0xea305bc9,0xfdd5e06e,0xac668b61,0xed1e6088,
  126963. 0xeb811861,0x333af016,0x15ddcebc,0x5ecb192d,0x000001c9 } },
  126964. /* 252 */
  126965. { { 0xe0bde442,0x927b37a3,0x66f7a73e,0xe0543fe8,0x8ed10c2e,0xd30d9d20,
  126966. 0xa6617a32,0xaf79c341,0xd1d5cf8b,0xe7367870,0xe3abcf8b,0x02d0dce9,
  126967. 0x772b5e7b,0xfe23d2dd,0x1ffc70c5,0x29fceea0,0x0000010b },
  126968. { 0x62d803ff,0x31bcae4d,0xdbc306a9,0x93ee913f,0xd8c10662,0xaf1de7ab,
  126969. 0xe7a6d658,0xd485782a,0x102f4e06,0x9126592e,0x136fafe6,0x91a3127f,
  126970. 0x88371213,0x46b93440,0xa31e1634,0x53bb4380,0x000000ba } },
  126971. /* 253 */
  126972. { { 0xca5636b0,0x62e517fc,0x6aba15c7,0x4296e021,0x212e7b2d,0x5aa8fd7c,
  126973. 0x5717ad84,0x9517ce6d,0x98b2f357,0xe762b85b,0xdf59b07c,0x42f996b5,
  126974. 0xf37ef6f0,0xf3732abb,0x4542b489,0xa5d145ea,0x0000015d },
  126975. { 0xaa7f6e3f,0x1e77c55e,0xaa4a05bc,0x3f4d99a7,0x45828227,0xa56d7d77,
  126976. 0x77b748fb,0xdb0895fb,0x0629f5d1,0x1c484cce,0x359803fb,0xf5b1c90a,
  126977. 0x1720b8d0,0x43ac4f29,0x72ac13f2,0x8c10bfe8,0x000000e9 } },
  126978. /* 254 */
  126979. { { 0xc06c4fd6,0x9d1c4785,0xd25c2b9d,0xbf4b9025,0xd4982f24,0x04135eb1,
  126980. 0xba4fef2b,0x3ab3edc2,0x98de07ab,0x55a5239f,0x096f4b7d,0xd5fc49ab,
  126981. 0x3844c815,0xc50a2960,0x15676b2b,0xdb1148d0,0x00000047 },
  126982. { 0x10f3bad9,0xc49f9cc5,0x022901d4,0x490888fc,0xc47b44df,0x917a55eb,
  126983. 0xf39f2b68,0x20b2ebc6,0x04e9962a,0x0c58e3af,0x573dd5b7,0x52ab7c1b,
  126984. 0xa329f76c,0x2b54add6,0x82f4ca3b,0x59dad1eb,0x00000108 } },
  126985. /* 255 */
  126986. { { 0xa182d1ad,0x662c4128,0x20916c45,0x7751796e,0xba681647,0xa7704272,
  126987. 0xb92c85c1,0xfac8b0fa,0xaefb2e07,0x207ab2df,0x7861b32d,0xc73530a0,
  126988. 0x88aed145,0x63dbed65,0x0a53a49d,0x547bcdca,0x000000bd },
  126989. { 0x87056b51,0xa7c1382f,0x130f9912,0xc3d91edb,0xd3805b42,0xf7c7de46,
  126990. 0xfd31a995,0x456101eb,0xcd3fb8aa,0x1efd22b4,0x9eb17bce,0xfe391df7,
  126991. 0x616c0c32,0xb4d4c0c6,0x711beef4,0x19f023be,0x00000112 } },
  126992. };
  126993. /* Multiply the base point of P521 by the scalar and return the result.
  126994. * If map is true then convert result to affine coordinates.
  126995. *
  126996. * Stripe implementation.
  126997. * Pre-generated: 2^0, 2^65, ...
  126998. * Pre-generated: products of all combinations of above.
  126999. * 8 doubles and adds (with qz=1)
  127000. *
  127001. * r Resulting point.
  127002. * k Scalar to multiply by.
  127003. * map Indicates whether to convert result to affine.
  127004. * ct Constant time required.
  127005. * heap Heap to use for allocation.
  127006. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  127007. */
  127008. static int sp_521_ecc_mulmod_base_17(sp_point_521* r, const sp_digit* k,
  127009. int map, int ct, void* heap)
  127010. {
  127011. return sp_521_ecc_mulmod_stripe_17(r, &p521_base, p521_table,
  127012. k, map, ct, heap);
  127013. }
  127014. #endif
  127015. /* Multiply the base point of P521 by the scalar and return the result.
  127016. * If map is true then convert result to affine coordinates.
  127017. *
  127018. * km Scalar to multiply by.
  127019. * r Resulting point.
  127020. * map Indicates whether to convert result to affine.
  127021. * heap Heap to use for allocation.
  127022. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  127023. */
  127024. int sp_ecc_mulmod_base_521(const mp_int* km, ecc_point* r, int map, void* heap)
  127025. {
  127026. #ifdef WOLFSSL_SP_SMALL_STACK
  127027. sp_point_521* point = NULL;
  127028. sp_digit* k = NULL;
  127029. #else
  127030. sp_point_521 point[1];
  127031. sp_digit k[17];
  127032. #endif
  127033. int err = MP_OKAY;
  127034. #ifdef WOLFSSL_SP_SMALL_STACK
  127035. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  127036. DYNAMIC_TYPE_ECC);
  127037. if (point == NULL)
  127038. err = MEMORY_E;
  127039. if (err == MP_OKAY) {
  127040. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  127041. DYNAMIC_TYPE_ECC);
  127042. if (k == NULL)
  127043. err = MEMORY_E;
  127044. }
  127045. #endif
  127046. if (err == MP_OKAY) {
  127047. sp_521_from_mp(k, 17, km);
  127048. err = sp_521_ecc_mulmod_base_17(point, k, map, 1, heap);
  127049. }
  127050. if (err == MP_OKAY) {
  127051. err = sp_521_point_to_ecc_point_17(point, r);
  127052. }
  127053. #ifdef WOLFSSL_SP_SMALL_STACK
  127054. if (k != NULL)
  127055. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  127056. if (point != NULL)
  127057. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  127058. #endif
  127059. return err;
  127060. }
  127061. /* Multiply the base point of P521 by the scalar, add point a and return
  127062. * the result. If map is true then convert result to affine coordinates.
  127063. *
  127064. * km Scalar to multiply by.
  127065. * am Point to add to scalar multiply result.
  127066. * inMont Point to add is in montgomery form.
  127067. * r Resulting point.
  127068. * map Indicates whether to convert result to affine.
  127069. * heap Heap to use for allocation.
  127070. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  127071. */
  127072. int sp_ecc_mulmod_base_add_521(const mp_int* km, const ecc_point* am,
  127073. int inMont, ecc_point* r, int map, void* heap)
  127074. {
  127075. #ifdef WOLFSSL_SP_SMALL_STACK
  127076. sp_point_521* point = NULL;
  127077. sp_digit* k = NULL;
  127078. #else
  127079. sp_point_521 point[2];
  127080. sp_digit k[17 + 17 * 2 * 6];
  127081. #endif
  127082. sp_point_521* addP = NULL;
  127083. sp_digit* tmp = NULL;
  127084. int err = MP_OKAY;
  127085. #ifdef WOLFSSL_SP_SMALL_STACK
  127086. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  127087. DYNAMIC_TYPE_ECC);
  127088. if (point == NULL)
  127089. err = MEMORY_E;
  127090. if (err == MP_OKAY) {
  127091. k = (sp_digit*)XMALLOC(
  127092. sizeof(sp_digit) * (17 + 17 * 2 * 6),
  127093. heap, DYNAMIC_TYPE_ECC);
  127094. if (k == NULL)
  127095. err = MEMORY_E;
  127096. }
  127097. #endif
  127098. if (err == MP_OKAY) {
  127099. addP = point + 1;
  127100. tmp = k + 17;
  127101. sp_521_from_mp(k, 17, km);
  127102. sp_521_point_from_ecc_point_17(addP, am);
  127103. }
  127104. if ((err == MP_OKAY) && (!inMont)) {
  127105. err = sp_521_mod_mul_norm_17(addP->x, addP->x, p521_mod);
  127106. }
  127107. if ((err == MP_OKAY) && (!inMont)) {
  127108. err = sp_521_mod_mul_norm_17(addP->y, addP->y, p521_mod);
  127109. }
  127110. if ((err == MP_OKAY) && (!inMont)) {
  127111. err = sp_521_mod_mul_norm_17(addP->z, addP->z, p521_mod);
  127112. }
  127113. if (err == MP_OKAY) {
  127114. err = sp_521_ecc_mulmod_base_17(point, k, 0, 0, heap);
  127115. }
  127116. if (err == MP_OKAY) {
  127117. sp_521_proj_point_add_17(point, point, addP, tmp);
  127118. if (map) {
  127119. sp_521_map_17(point, point, tmp);
  127120. }
  127121. err = sp_521_point_to_ecc_point_17(point, r);
  127122. }
  127123. #ifdef WOLFSSL_SP_SMALL_STACK
  127124. if (k != NULL)
  127125. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  127126. if (point)
  127127. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  127128. #endif
  127129. return err;
  127130. }
  127131. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  127132. defined(HAVE_ECC_VERIFY)
  127133. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  127134. /* Add 1 to a. (a = a + 1)
  127135. *
  127136. * a A single precision integer.
  127137. */
  127138. SP_NOINLINE static void sp_521_add_one_17(sp_digit* a)
  127139. {
  127140. __asm__ __volatile__ (
  127141. "movs r2, #1\n\t"
  127142. "ldr r1, [%[a]]\n\t"
  127143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127144. "adds r1, r1, r2\n\t"
  127145. #else
  127146. "add r1, r1, r2\n\t"
  127147. #endif
  127148. "movs r2, #0\n\t"
  127149. "str r1, [%[a]]\n\t"
  127150. "ldr r1, [%[a], #4]\n\t"
  127151. #ifdef WOLFSSL_KEIL
  127152. "adcs r1, r1, r2\n\t"
  127153. #elif defined(__clang__)
  127154. "adcs r1, r2\n\t"
  127155. #else
  127156. "adc r1, r2\n\t"
  127157. #endif
  127158. "str r1, [%[a], #4]\n\t"
  127159. "ldr r1, [%[a], #8]\n\t"
  127160. #ifdef WOLFSSL_KEIL
  127161. "adcs r1, r1, r2\n\t"
  127162. #elif defined(__clang__)
  127163. "adcs r1, r2\n\t"
  127164. #else
  127165. "adc r1, r2\n\t"
  127166. #endif
  127167. "str r1, [%[a], #8]\n\t"
  127168. "ldr r1, [%[a], #12]\n\t"
  127169. #ifdef WOLFSSL_KEIL
  127170. "adcs r1, r1, r2\n\t"
  127171. #elif defined(__clang__)
  127172. "adcs r1, r2\n\t"
  127173. #else
  127174. "adc r1, r2\n\t"
  127175. #endif
  127176. "str r1, [%[a], #12]\n\t"
  127177. "ldr r1, [%[a], #16]\n\t"
  127178. #ifdef WOLFSSL_KEIL
  127179. "adcs r1, r1, r2\n\t"
  127180. #elif defined(__clang__)
  127181. "adcs r1, r2\n\t"
  127182. #else
  127183. "adc r1, r2\n\t"
  127184. #endif
  127185. "str r1, [%[a], #16]\n\t"
  127186. "ldr r1, [%[a], #20]\n\t"
  127187. #ifdef WOLFSSL_KEIL
  127188. "adcs r1, r1, r2\n\t"
  127189. #elif defined(__clang__)
  127190. "adcs r1, r2\n\t"
  127191. #else
  127192. "adc r1, r2\n\t"
  127193. #endif
  127194. "str r1, [%[a], #20]\n\t"
  127195. "ldr r1, [%[a], #24]\n\t"
  127196. #ifdef WOLFSSL_KEIL
  127197. "adcs r1, r1, r2\n\t"
  127198. #elif defined(__clang__)
  127199. "adcs r1, r2\n\t"
  127200. #else
  127201. "adc r1, r2\n\t"
  127202. #endif
  127203. "str r1, [%[a], #24]\n\t"
  127204. "ldr r1, [%[a], #28]\n\t"
  127205. #ifdef WOLFSSL_KEIL
  127206. "adcs r1, r1, r2\n\t"
  127207. #elif defined(__clang__)
  127208. "adcs r1, r2\n\t"
  127209. #else
  127210. "adc r1, r2\n\t"
  127211. #endif
  127212. "str r1, [%[a], #28]\n\t"
  127213. "ldr r1, [%[a], #32]\n\t"
  127214. #ifdef WOLFSSL_KEIL
  127215. "adcs r1, r1, r2\n\t"
  127216. #elif defined(__clang__)
  127217. "adcs r1, r2\n\t"
  127218. #else
  127219. "adc r1, r2\n\t"
  127220. #endif
  127221. "str r1, [%[a], #32]\n\t"
  127222. "ldr r1, [%[a], #36]\n\t"
  127223. #ifdef WOLFSSL_KEIL
  127224. "adcs r1, r1, r2\n\t"
  127225. #elif defined(__clang__)
  127226. "adcs r1, r2\n\t"
  127227. #else
  127228. "adc r1, r2\n\t"
  127229. #endif
  127230. "str r1, [%[a], #36]\n\t"
  127231. "ldr r1, [%[a], #40]\n\t"
  127232. #ifdef WOLFSSL_KEIL
  127233. "adcs r1, r1, r2\n\t"
  127234. #elif defined(__clang__)
  127235. "adcs r1, r2\n\t"
  127236. #else
  127237. "adc r1, r2\n\t"
  127238. #endif
  127239. "str r1, [%[a], #40]\n\t"
  127240. "ldr r1, [%[a], #44]\n\t"
  127241. #ifdef WOLFSSL_KEIL
  127242. "adcs r1, r1, r2\n\t"
  127243. #elif defined(__clang__)
  127244. "adcs r1, r2\n\t"
  127245. #else
  127246. "adc r1, r2\n\t"
  127247. #endif
  127248. "str r1, [%[a], #44]\n\t"
  127249. "ldr r1, [%[a], #48]\n\t"
  127250. #ifdef WOLFSSL_KEIL
  127251. "adcs r1, r1, r2\n\t"
  127252. #elif defined(__clang__)
  127253. "adcs r1, r2\n\t"
  127254. #else
  127255. "adc r1, r2\n\t"
  127256. #endif
  127257. "str r1, [%[a], #48]\n\t"
  127258. "ldr r1, [%[a], #52]\n\t"
  127259. #ifdef WOLFSSL_KEIL
  127260. "adcs r1, r1, r2\n\t"
  127261. #elif defined(__clang__)
  127262. "adcs r1, r2\n\t"
  127263. #else
  127264. "adc r1, r2\n\t"
  127265. #endif
  127266. "str r1, [%[a], #52]\n\t"
  127267. "ldr r1, [%[a], #56]\n\t"
  127268. #ifdef WOLFSSL_KEIL
  127269. "adcs r1, r1, r2\n\t"
  127270. #elif defined(__clang__)
  127271. "adcs r1, r2\n\t"
  127272. #else
  127273. "adc r1, r2\n\t"
  127274. #endif
  127275. "str r1, [%[a], #56]\n\t"
  127276. "ldr r1, [%[a], #60]\n\t"
  127277. #ifdef WOLFSSL_KEIL
  127278. "adcs r1, r1, r2\n\t"
  127279. #elif defined(__clang__)
  127280. "adcs r1, r2\n\t"
  127281. #else
  127282. "adc r1, r2\n\t"
  127283. #endif
  127284. "str r1, [%[a], #60]\n\t"
  127285. "ldr r1, [%[a], #64]\n\t"
  127286. #ifdef WOLFSSL_KEIL
  127287. "adcs r1, r1, r2\n\t"
  127288. #elif defined(__clang__)
  127289. "adcs r1, r2\n\t"
  127290. #else
  127291. "adc r1, r2\n\t"
  127292. #endif
  127293. "str r1, [%[a], #64]\n\t"
  127294. : [a] "+l" (a)
  127295. :
  127296. : "memory", "r1", "r2"
  127297. );
  127298. }
  127299. /* Read big endian unsigned byte array into r.
  127300. *
  127301. * r A single precision integer.
  127302. * size Maximum number of bytes to convert
  127303. * a Byte array.
  127304. * n Number of bytes in array to read.
  127305. */
  127306. static void sp_521_from_bin(sp_digit* r, int size, const byte* a, int n)
  127307. {
  127308. int i;
  127309. int j;
  127310. byte* d;
  127311. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  127312. r[j] = ((sp_digit)a[i - 0] << 0) |
  127313. ((sp_digit)a[i - 1] << 8) |
  127314. ((sp_digit)a[i - 2] << 16) |
  127315. ((sp_digit)a[i - 3] << 24);
  127316. j++;
  127317. }
  127318. if (i >= 0) {
  127319. r[j] = 0;
  127320. d = (byte*)r;
  127321. switch (i) {
  127322. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  127323. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  127324. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  127325. }
  127326. j++;
  127327. }
  127328. for (; j < size; j++) {
  127329. r[j] = 0;
  127330. }
  127331. }
  127332. /* Generates a scalar that is in the range 1..order-1.
  127333. *
  127334. * rng Random number generator.
  127335. * k Scalar value.
  127336. * returns RNG failures, MEMORY_E when memory allocation fails and
  127337. * MP_OKAY on success.
  127338. */
  127339. static int sp_521_ecc_gen_k_17(WC_RNG* rng, sp_digit* k)
  127340. {
  127341. int err;
  127342. byte buf[66];
  127343. do {
  127344. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  127345. if (err == 0) {
  127346. buf[0] &= 0x1;
  127347. sp_521_from_bin(k, 17, buf, (int)sizeof(buf));
  127348. if (sp_521_cmp_17(k, p521_order2) <= 0) {
  127349. sp_521_add_one_17(k);
  127350. break;
  127351. }
  127352. }
  127353. }
  127354. while (err == 0);
  127355. return err;
  127356. }
  127357. /* Makes a random EC key pair.
  127358. *
  127359. * rng Random number generator.
  127360. * priv Generated private value.
  127361. * pub Generated public point.
  127362. * heap Heap to use for allocation.
  127363. * returns ECC_INF_E when the point does not have the correct order, RNG
  127364. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  127365. */
  127366. int sp_ecc_make_key_521(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  127367. {
  127368. #ifdef WOLFSSL_SP_SMALL_STACK
  127369. sp_point_521* point = NULL;
  127370. sp_digit* k = NULL;
  127371. #else
  127372. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127373. sp_point_521 point[2];
  127374. #else
  127375. sp_point_521 point[1];
  127376. #endif
  127377. sp_digit k[17];
  127378. #endif
  127379. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127380. sp_point_521* infinity = NULL;
  127381. #endif
  127382. int err = MP_OKAY;
  127383. (void)heap;
  127384. #ifdef WOLFSSL_SP_SMALL_STACK
  127385. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127386. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC);
  127387. #else
  127388. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC);
  127389. #endif
  127390. if (point == NULL)
  127391. err = MEMORY_E;
  127392. if (err == MP_OKAY) {
  127393. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  127394. DYNAMIC_TYPE_ECC);
  127395. if (k == NULL)
  127396. err = MEMORY_E;
  127397. }
  127398. #endif
  127399. if (err == MP_OKAY) {
  127400. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127401. infinity = point + 1;
  127402. #endif
  127403. err = sp_521_ecc_gen_k_17(rng, k);
  127404. }
  127405. if (err == MP_OKAY) {
  127406. err = sp_521_ecc_mulmod_base_17(point, k, 1, 1, NULL);
  127407. }
  127408. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127409. if (err == MP_OKAY) {
  127410. err = sp_521_ecc_mulmod_17(infinity, point, p521_order, 1, 1, NULL);
  127411. }
  127412. if (err == MP_OKAY) {
  127413. if (sp_521_iszero_17(point->x) || sp_521_iszero_17(point->y)) {
  127414. err = ECC_INF_E;
  127415. }
  127416. }
  127417. #endif
  127418. if (err == MP_OKAY) {
  127419. err = sp_521_to_mp(k, priv);
  127420. }
  127421. if (err == MP_OKAY) {
  127422. err = sp_521_point_to_ecc_point_17(point, pub);
  127423. }
  127424. #ifdef WOLFSSL_SP_SMALL_STACK
  127425. if (k != NULL)
  127426. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  127427. if (point != NULL) {
  127428. /* point is not sensitive, so no need to zeroize */
  127429. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  127430. }
  127431. #endif
  127432. return err;
  127433. }
  127434. #ifdef WOLFSSL_SP_NONBLOCK
  127435. typedef struct sp_ecc_key_gen_521_ctx {
  127436. int state;
  127437. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  127438. sp_digit k[17];
  127439. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127440. sp_point_521 point[2];
  127441. #else
  127442. sp_point_521 point[1];
  127443. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  127444. } sp_ecc_key_gen_521_ctx;
  127445. int sp_ecc_make_key_521_nb(sp_ecc_ctx_t* sp_ctx, WC_RNG* rng, mp_int* priv,
  127446. ecc_point* pub, void* heap)
  127447. {
  127448. int err = FP_WOULDBLOCK;
  127449. sp_ecc_key_gen_521_ctx* ctx = (sp_ecc_key_gen_521_ctx*)sp_ctx->data;
  127450. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127451. sp_point_521* infinity = ctx->point + 1;
  127452. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  127453. typedef char ctx_size_test[sizeof(sp_ecc_key_gen_521_ctx)
  127454. >= sizeof(*sp_ctx) ? -1 : 1];
  127455. (void)sizeof(ctx_size_test);
  127456. switch (ctx->state) {
  127457. case 0:
  127458. err = sp_521_ecc_gen_k_17(rng, ctx->k);
  127459. if (err == MP_OKAY) {
  127460. err = FP_WOULDBLOCK;
  127461. ctx->state = 1;
  127462. }
  127463. break;
  127464. case 1:
  127465. err = sp_521_ecc_mulmod_base_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  127466. ctx->point, ctx->k, 1, 1, heap);
  127467. if (err == MP_OKAY) {
  127468. err = FP_WOULDBLOCK;
  127469. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127470. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  127471. ctx->state = 2;
  127472. #else
  127473. ctx->state = 3;
  127474. #endif
  127475. }
  127476. break;
  127477. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127478. case 2:
  127479. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  127480. infinity, ctx->point, p521_order, 1, 1);
  127481. if (err == MP_OKAY) {
  127482. if (sp_521_iszero_17(ctx->point->x) ||
  127483. sp_521_iszero_17(ctx->point->y)) {
  127484. err = ECC_INF_E;
  127485. }
  127486. else {
  127487. err = FP_WOULDBLOCK;
  127488. ctx->state = 3;
  127489. }
  127490. }
  127491. break;
  127492. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN */
  127493. case 3:
  127494. err = sp_521_to_mp(ctx->k, priv);
  127495. if (err == MP_OKAY) {
  127496. err = sp_521_point_to_ecc_point_17(ctx->point, pub);
  127497. }
  127498. break;
  127499. }
  127500. if (err != FP_WOULDBLOCK) {
  127501. XMEMSET(ctx, 0, sizeof(sp_ecc_key_gen_521_ctx));
  127502. }
  127503. return err;
  127504. }
  127505. #endif /* WOLFSSL_SP_NONBLOCK */
  127506. #ifdef HAVE_ECC_DHE
  127507. /* Write r as big endian to byte array.
  127508. * Fixed length number of bytes written: 66
  127509. *
  127510. * r A single precision integer.
  127511. * a Byte array.
  127512. */
  127513. static void sp_521_to_bin_17(sp_digit* r, byte* a)
  127514. {
  127515. int i;
  127516. int j = 0;
  127517. a[j++] = r[16] >> 8;
  127518. a[j++] = r[16] >> 0;
  127519. for (i = 15; i >= 0; i--) {
  127520. a[j++] = r[i] >> 24;
  127521. a[j++] = r[i] >> 16;
  127522. a[j++] = r[i] >> 8;
  127523. a[j++] = r[i] >> 0;
  127524. }
  127525. }
  127526. /* Multiply the point by the scalar and serialize the X ordinate.
  127527. * The number is 0 padded to maximum size on output.
  127528. *
  127529. * priv Scalar to multiply the point by.
  127530. * pub Point to multiply.
  127531. * out Buffer to hold X ordinate.
  127532. * outLen On entry, size of the buffer in bytes.
  127533. * On exit, length of data in buffer in bytes.
  127534. * heap Heap to use for allocation.
  127535. * returns BUFFER_E if the buffer is to small for output size,
  127536. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  127537. */
  127538. int sp_ecc_secret_gen_521(const mp_int* priv, const ecc_point* pub, byte* out,
  127539. word32* outLen, void* heap)
  127540. {
  127541. #ifdef WOLFSSL_SP_SMALL_STACK
  127542. sp_point_521* point = NULL;
  127543. sp_digit* k = NULL;
  127544. #else
  127545. sp_point_521 point[1];
  127546. sp_digit k[17];
  127547. #endif
  127548. int err = MP_OKAY;
  127549. if (*outLen < 65U) {
  127550. err = BUFFER_E;
  127551. }
  127552. #ifdef WOLFSSL_SP_SMALL_STACK
  127553. if (err == MP_OKAY) {
  127554. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  127555. DYNAMIC_TYPE_ECC);
  127556. if (point == NULL)
  127557. err = MEMORY_E;
  127558. }
  127559. if (err == MP_OKAY) {
  127560. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  127561. DYNAMIC_TYPE_ECC);
  127562. if (k == NULL)
  127563. err = MEMORY_E;
  127564. }
  127565. #endif
  127566. if (err == MP_OKAY) {
  127567. sp_521_from_mp(k, 17, priv);
  127568. sp_521_point_from_ecc_point_17(point, pub);
  127569. err = sp_521_ecc_mulmod_17(point, point, k, 1, 1, heap);
  127570. }
  127571. if (err == MP_OKAY) {
  127572. sp_521_to_bin_17(point->x, out);
  127573. *outLen = 66;
  127574. }
  127575. #ifdef WOLFSSL_SP_SMALL_STACK
  127576. if (k != NULL)
  127577. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  127578. if (point != NULL)
  127579. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  127580. #endif
  127581. return err;
  127582. }
  127583. #ifdef WOLFSSL_SP_NONBLOCK
  127584. typedef struct sp_ecc_sec_gen_521_ctx {
  127585. int state;
  127586. union {
  127587. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  127588. };
  127589. sp_digit k[17];
  127590. sp_point_521 point;
  127591. } sp_ecc_sec_gen_521_ctx;
  127592. int sp_ecc_secret_gen_521_nb(sp_ecc_ctx_t* sp_ctx, const mp_int* priv,
  127593. const ecc_point* pub, byte* out, word32* outLen, void* heap)
  127594. {
  127595. int err = FP_WOULDBLOCK;
  127596. sp_ecc_sec_gen_521_ctx* ctx = (sp_ecc_sec_gen_521_ctx*)sp_ctx->data;
  127597. typedef char ctx_size_test[sizeof(sp_ecc_sec_gen_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  127598. (void)sizeof(ctx_size_test);
  127599. if (*outLen < 32U) {
  127600. err = BUFFER_E;
  127601. }
  127602. switch (ctx->state) {
  127603. case 0:
  127604. sp_521_from_mp(ctx->k, 17, priv);
  127605. sp_521_point_from_ecc_point_17(&ctx->point, pub);
  127606. ctx->state = 1;
  127607. break;
  127608. case 1:
  127609. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  127610. &ctx->point, &ctx->point, ctx->k, 1, 1, heap);
  127611. if (err == MP_OKAY) {
  127612. sp_521_to_bin_17(ctx->point.x, out);
  127613. *outLen = 66;
  127614. }
  127615. break;
  127616. }
  127617. if (err == MP_OKAY && ctx->state != 1) {
  127618. err = FP_WOULDBLOCK;
  127619. }
  127620. if (err != FP_WOULDBLOCK) {
  127621. XMEMSET(ctx, 0, sizeof(sp_ecc_sec_gen_521_ctx));
  127622. }
  127623. return err;
  127624. }
  127625. #endif /* WOLFSSL_SP_NONBLOCK */
  127626. #endif /* HAVE_ECC_DHE */
  127627. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  127628. /* Right shift a by n bits into r. (r = a >> n)
  127629. *
  127630. * r A single precision integer.
  127631. * a A single precision integer.
  127632. * n Integer representing number of bits to shift.
  127633. */
  127634. static void sp_521_rshift_17(sp_digit* r, const sp_digit* a, byte n)
  127635. {
  127636. __asm__ __volatile__ (
  127637. "movs r7, #32\n\t"
  127638. #ifdef WOLFSSL_KEIL
  127639. "subs r7, r7, %[n]\n\t"
  127640. #else
  127641. #ifdef __clang__
  127642. "subs r7, r7, %[n]\n\t"
  127643. #else
  127644. "sub r7, r7, %[n]\n\t"
  127645. #endif
  127646. #endif
  127647. "ldr r3, [%[a]]\n\t"
  127648. "ldr r4, [%[a], #4]\n\t"
  127649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127650. "lsrs r3, r3, %[n]\n\t"
  127651. #else
  127652. "lsr r3, r3, %[n]\n\t"
  127653. #endif
  127654. "movs r6, r4\n\t"
  127655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127656. "lsrs r4, r4, %[n]\n\t"
  127657. #else
  127658. "lsr r4, r4, %[n]\n\t"
  127659. #endif
  127660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127661. "lsls r6, r6, r7\n\t"
  127662. #else
  127663. "lsl r6, r6, r7\n\t"
  127664. #endif
  127665. #ifdef WOLFSSL_KEIL
  127666. "orrs r3, r3, r6\n\t"
  127667. #elif defined(__clang__)
  127668. "orrs r3, r6\n\t"
  127669. #else
  127670. "orr r3, r6\n\t"
  127671. #endif
  127672. "ldr r5, [%[a], #8]\n\t"
  127673. "str r3, [%[r]]\n\t"
  127674. "movs r6, r5\n\t"
  127675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127676. "lsrs r5, r5, %[n]\n\t"
  127677. #else
  127678. "lsr r5, r5, %[n]\n\t"
  127679. #endif
  127680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127681. "lsls r6, r6, r7\n\t"
  127682. #else
  127683. "lsl r6, r6, r7\n\t"
  127684. #endif
  127685. #ifdef WOLFSSL_KEIL
  127686. "orrs r4, r4, r6\n\t"
  127687. #elif defined(__clang__)
  127688. "orrs r4, r6\n\t"
  127689. #else
  127690. "orr r4, r6\n\t"
  127691. #endif
  127692. "ldr r3, [%[a], #12]\n\t"
  127693. "str r4, [%[r], #4]\n\t"
  127694. "movs r6, r3\n\t"
  127695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127696. "lsrs r3, r3, %[n]\n\t"
  127697. #else
  127698. "lsr r3, r3, %[n]\n\t"
  127699. #endif
  127700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127701. "lsls r6, r6, r7\n\t"
  127702. #else
  127703. "lsl r6, r6, r7\n\t"
  127704. #endif
  127705. #ifdef WOLFSSL_KEIL
  127706. "orrs r5, r5, r6\n\t"
  127707. #elif defined(__clang__)
  127708. "orrs r5, r6\n\t"
  127709. #else
  127710. "orr r5, r6\n\t"
  127711. #endif
  127712. "ldr r4, [%[a], #16]\n\t"
  127713. "str r5, [%[r], #8]\n\t"
  127714. "movs r6, r4\n\t"
  127715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127716. "lsrs r4, r4, %[n]\n\t"
  127717. #else
  127718. "lsr r4, r4, %[n]\n\t"
  127719. #endif
  127720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127721. "lsls r6, r6, r7\n\t"
  127722. #else
  127723. "lsl r6, r6, r7\n\t"
  127724. #endif
  127725. #ifdef WOLFSSL_KEIL
  127726. "orrs r3, r3, r6\n\t"
  127727. #elif defined(__clang__)
  127728. "orrs r3, r6\n\t"
  127729. #else
  127730. "orr r3, r6\n\t"
  127731. #endif
  127732. "ldr r5, [%[a], #20]\n\t"
  127733. "str r3, [%[r], #12]\n\t"
  127734. "movs r6, r5\n\t"
  127735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127736. "lsrs r5, r5, %[n]\n\t"
  127737. #else
  127738. "lsr r5, r5, %[n]\n\t"
  127739. #endif
  127740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127741. "lsls r6, r6, r7\n\t"
  127742. #else
  127743. "lsl r6, r6, r7\n\t"
  127744. #endif
  127745. #ifdef WOLFSSL_KEIL
  127746. "orrs r4, r4, r6\n\t"
  127747. #elif defined(__clang__)
  127748. "orrs r4, r6\n\t"
  127749. #else
  127750. "orr r4, r6\n\t"
  127751. #endif
  127752. "ldr r3, [%[a], #24]\n\t"
  127753. "str r4, [%[r], #16]\n\t"
  127754. "movs r6, r3\n\t"
  127755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127756. "lsrs r3, r3, %[n]\n\t"
  127757. #else
  127758. "lsr r3, r3, %[n]\n\t"
  127759. #endif
  127760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127761. "lsls r6, r6, r7\n\t"
  127762. #else
  127763. "lsl r6, r6, r7\n\t"
  127764. #endif
  127765. #ifdef WOLFSSL_KEIL
  127766. "orrs r5, r5, r6\n\t"
  127767. #elif defined(__clang__)
  127768. "orrs r5, r6\n\t"
  127769. #else
  127770. "orr r5, r6\n\t"
  127771. #endif
  127772. "ldr r4, [%[a], #28]\n\t"
  127773. "str r5, [%[r], #20]\n\t"
  127774. "movs r6, r4\n\t"
  127775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127776. "lsrs r4, r4, %[n]\n\t"
  127777. #else
  127778. "lsr r4, r4, %[n]\n\t"
  127779. #endif
  127780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127781. "lsls r6, r6, r7\n\t"
  127782. #else
  127783. "lsl r6, r6, r7\n\t"
  127784. #endif
  127785. #ifdef WOLFSSL_KEIL
  127786. "orrs r3, r3, r6\n\t"
  127787. #elif defined(__clang__)
  127788. "orrs r3, r6\n\t"
  127789. #else
  127790. "orr r3, r6\n\t"
  127791. #endif
  127792. "ldr r5, [%[a], #32]\n\t"
  127793. "str r3, [%[r], #24]\n\t"
  127794. "movs r6, r5\n\t"
  127795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127796. "lsrs r5, r5, %[n]\n\t"
  127797. #else
  127798. "lsr r5, r5, %[n]\n\t"
  127799. #endif
  127800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127801. "lsls r6, r6, r7\n\t"
  127802. #else
  127803. "lsl r6, r6, r7\n\t"
  127804. #endif
  127805. #ifdef WOLFSSL_KEIL
  127806. "orrs r4, r4, r6\n\t"
  127807. #elif defined(__clang__)
  127808. "orrs r4, r6\n\t"
  127809. #else
  127810. "orr r4, r6\n\t"
  127811. #endif
  127812. "ldr r3, [%[a], #36]\n\t"
  127813. "str r4, [%[r], #28]\n\t"
  127814. "movs r6, r3\n\t"
  127815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127816. "lsrs r3, r3, %[n]\n\t"
  127817. #else
  127818. "lsr r3, r3, %[n]\n\t"
  127819. #endif
  127820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127821. "lsls r6, r6, r7\n\t"
  127822. #else
  127823. "lsl r6, r6, r7\n\t"
  127824. #endif
  127825. #ifdef WOLFSSL_KEIL
  127826. "orrs r5, r5, r6\n\t"
  127827. #elif defined(__clang__)
  127828. "orrs r5, r6\n\t"
  127829. #else
  127830. "orr r5, r6\n\t"
  127831. #endif
  127832. "ldr r4, [%[a], #40]\n\t"
  127833. "str r5, [%[r], #32]\n\t"
  127834. "movs r6, r4\n\t"
  127835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127836. "lsrs r4, r4, %[n]\n\t"
  127837. #else
  127838. "lsr r4, r4, %[n]\n\t"
  127839. #endif
  127840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127841. "lsls r6, r6, r7\n\t"
  127842. #else
  127843. "lsl r6, r6, r7\n\t"
  127844. #endif
  127845. #ifdef WOLFSSL_KEIL
  127846. "orrs r3, r3, r6\n\t"
  127847. #elif defined(__clang__)
  127848. "orrs r3, r6\n\t"
  127849. #else
  127850. "orr r3, r6\n\t"
  127851. #endif
  127852. "ldr r5, [%[a], #44]\n\t"
  127853. "str r3, [%[r], #36]\n\t"
  127854. "movs r6, r5\n\t"
  127855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127856. "lsrs r5, r5, %[n]\n\t"
  127857. #else
  127858. "lsr r5, r5, %[n]\n\t"
  127859. #endif
  127860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127861. "lsls r6, r6, r7\n\t"
  127862. #else
  127863. "lsl r6, r6, r7\n\t"
  127864. #endif
  127865. #ifdef WOLFSSL_KEIL
  127866. "orrs r4, r4, r6\n\t"
  127867. #elif defined(__clang__)
  127868. "orrs r4, r6\n\t"
  127869. #else
  127870. "orr r4, r6\n\t"
  127871. #endif
  127872. "ldr r3, [%[a], #48]\n\t"
  127873. "str r4, [%[r], #40]\n\t"
  127874. "movs r6, r3\n\t"
  127875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127876. "lsrs r3, r3, %[n]\n\t"
  127877. #else
  127878. "lsr r3, r3, %[n]\n\t"
  127879. #endif
  127880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127881. "lsls r6, r6, r7\n\t"
  127882. #else
  127883. "lsl r6, r6, r7\n\t"
  127884. #endif
  127885. #ifdef WOLFSSL_KEIL
  127886. "orrs r5, r5, r6\n\t"
  127887. #elif defined(__clang__)
  127888. "orrs r5, r6\n\t"
  127889. #else
  127890. "orr r5, r6\n\t"
  127891. #endif
  127892. "ldr r4, [%[a], #52]\n\t"
  127893. "str r5, [%[r], #44]\n\t"
  127894. "movs r6, r4\n\t"
  127895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127896. "lsrs r4, r4, %[n]\n\t"
  127897. #else
  127898. "lsr r4, r4, %[n]\n\t"
  127899. #endif
  127900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127901. "lsls r6, r6, r7\n\t"
  127902. #else
  127903. "lsl r6, r6, r7\n\t"
  127904. #endif
  127905. #ifdef WOLFSSL_KEIL
  127906. "orrs r3, r3, r6\n\t"
  127907. #elif defined(__clang__)
  127908. "orrs r3, r6\n\t"
  127909. #else
  127910. "orr r3, r6\n\t"
  127911. #endif
  127912. "ldr r5, [%[a], #56]\n\t"
  127913. "str r3, [%[r], #48]\n\t"
  127914. "movs r6, r5\n\t"
  127915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127916. "lsrs r5, r5, %[n]\n\t"
  127917. #else
  127918. "lsr r5, r5, %[n]\n\t"
  127919. #endif
  127920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127921. "lsls r6, r6, r7\n\t"
  127922. #else
  127923. "lsl r6, r6, r7\n\t"
  127924. #endif
  127925. #ifdef WOLFSSL_KEIL
  127926. "orrs r4, r4, r6\n\t"
  127927. #elif defined(__clang__)
  127928. "orrs r4, r6\n\t"
  127929. #else
  127930. "orr r4, r6\n\t"
  127931. #endif
  127932. "ldr r3, [%[a], #60]\n\t"
  127933. "str r4, [%[r], #52]\n\t"
  127934. "movs r6, r3\n\t"
  127935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127936. "lsrs r3, r3, %[n]\n\t"
  127937. #else
  127938. "lsr r3, r3, %[n]\n\t"
  127939. #endif
  127940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127941. "lsls r6, r6, r7\n\t"
  127942. #else
  127943. "lsl r6, r6, r7\n\t"
  127944. #endif
  127945. #ifdef WOLFSSL_KEIL
  127946. "orrs r5, r5, r6\n\t"
  127947. #elif defined(__clang__)
  127948. "orrs r5, r6\n\t"
  127949. #else
  127950. "orr r5, r6\n\t"
  127951. #endif
  127952. "ldr r4, [%[a], #64]\n\t"
  127953. "str r5, [%[r], #56]\n\t"
  127954. "movs r6, r4\n\t"
  127955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127956. "lsrs r4, r4, %[n]\n\t"
  127957. #else
  127958. "lsr r4, r4, %[n]\n\t"
  127959. #endif
  127960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127961. "lsls r6, r6, r7\n\t"
  127962. #else
  127963. "lsl r6, r6, r7\n\t"
  127964. #endif
  127965. #ifdef WOLFSSL_KEIL
  127966. "orrs r3, r3, r6\n\t"
  127967. #elif defined(__clang__)
  127968. "orrs r3, r6\n\t"
  127969. #else
  127970. "orr r3, r6\n\t"
  127971. #endif
  127972. "str r3, [%[r], #60]\n\t"
  127973. "str r4, [%[r], #64]\n\t"
  127974. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  127975. :
  127976. : "memory", "r3", "r4", "r5", "r6", "r7"
  127977. );
  127978. }
  127979. #endif
  127980. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  127981. #endif
  127982. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  127983. /* Lefy shift a by n bits into r. (r = a << n)
  127984. *
  127985. * r A single precision integer.
  127986. * a A single precision integer.
  127987. * n Integer representing number of bits to shift.
  127988. */
  127989. static void sp_521_lshift_17(sp_digit* r, const sp_digit* a, byte n)
  127990. {
  127991. __asm__ __volatile__ (
  127992. "movs r7, #31\n\t"
  127993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127994. "subs r7, r7, %[n]\n\t"
  127995. #else
  127996. "sub r7, r7, %[n]\n\t"
  127997. #endif
  127998. "ldr r4, [%[a], #64]\n\t"
  127999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128000. "lsrs r5, r4, #1\n\t"
  128001. #else
  128002. "lsr r5, r4, #1\n\t"
  128003. #endif
  128004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128005. "lsls r4, r4, %[n]\n\t"
  128006. #else
  128007. "lsl r4, r4, %[n]\n\t"
  128008. #endif
  128009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128010. "lsrs r5, r5, r7\n\t"
  128011. #else
  128012. "lsr r5, r5, r7\n\t"
  128013. #endif
  128014. "ldr r3, [%[a], #60]\n\t"
  128015. "str r5, [%[r], #68]\n\t"
  128016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128017. "lsrs r6, r3, #1\n\t"
  128018. #else
  128019. "lsr r6, r3, #1\n\t"
  128020. #endif
  128021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128022. "lsls r3, r3, %[n]\n\t"
  128023. #else
  128024. "lsl r3, r3, %[n]\n\t"
  128025. #endif
  128026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128027. "lsrs r6, r6, r7\n\t"
  128028. #else
  128029. "lsr r6, r6, r7\n\t"
  128030. #endif
  128031. #ifdef WOLFSSL_KEIL
  128032. "orrs r4, r4, r6\n\t"
  128033. #elif defined(__clang__)
  128034. "orrs r4, r6\n\t"
  128035. #else
  128036. "orr r4, r6\n\t"
  128037. #endif
  128038. "ldr r5, [%[a], #56]\n\t"
  128039. "str r4, [%[r], #64]\n\t"
  128040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128041. "lsrs r6, r5, #1\n\t"
  128042. #else
  128043. "lsr r6, r5, #1\n\t"
  128044. #endif
  128045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128046. "lsls r5, r5, %[n]\n\t"
  128047. #else
  128048. "lsl r5, r5, %[n]\n\t"
  128049. #endif
  128050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128051. "lsrs r6, r6, r7\n\t"
  128052. #else
  128053. "lsr r6, r6, r7\n\t"
  128054. #endif
  128055. #ifdef WOLFSSL_KEIL
  128056. "orrs r3, r3, r6\n\t"
  128057. #elif defined(__clang__)
  128058. "orrs r3, r6\n\t"
  128059. #else
  128060. "orr r3, r6\n\t"
  128061. #endif
  128062. "ldr r4, [%[a], #52]\n\t"
  128063. "str r3, [%[r], #60]\n\t"
  128064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128065. "lsrs r6, r4, #1\n\t"
  128066. #else
  128067. "lsr r6, r4, #1\n\t"
  128068. #endif
  128069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128070. "lsls r4, r4, %[n]\n\t"
  128071. #else
  128072. "lsl r4, r4, %[n]\n\t"
  128073. #endif
  128074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128075. "lsrs r6, r6, r7\n\t"
  128076. #else
  128077. "lsr r6, r6, r7\n\t"
  128078. #endif
  128079. #ifdef WOLFSSL_KEIL
  128080. "orrs r5, r5, r6\n\t"
  128081. #elif defined(__clang__)
  128082. "orrs r5, r6\n\t"
  128083. #else
  128084. "orr r5, r6\n\t"
  128085. #endif
  128086. "ldr r3, [%[a], #48]\n\t"
  128087. "str r5, [%[r], #56]\n\t"
  128088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128089. "lsrs r6, r3, #1\n\t"
  128090. #else
  128091. "lsr r6, r3, #1\n\t"
  128092. #endif
  128093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128094. "lsls r3, r3, %[n]\n\t"
  128095. #else
  128096. "lsl r3, r3, %[n]\n\t"
  128097. #endif
  128098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128099. "lsrs r6, r6, r7\n\t"
  128100. #else
  128101. "lsr r6, r6, r7\n\t"
  128102. #endif
  128103. #ifdef WOLFSSL_KEIL
  128104. "orrs r4, r4, r6\n\t"
  128105. #elif defined(__clang__)
  128106. "orrs r4, r6\n\t"
  128107. #else
  128108. "orr r4, r6\n\t"
  128109. #endif
  128110. "ldr r5, [%[a], #44]\n\t"
  128111. "str r4, [%[r], #52]\n\t"
  128112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128113. "lsrs r6, r5, #1\n\t"
  128114. #else
  128115. "lsr r6, r5, #1\n\t"
  128116. #endif
  128117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128118. "lsls r5, r5, %[n]\n\t"
  128119. #else
  128120. "lsl r5, r5, %[n]\n\t"
  128121. #endif
  128122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128123. "lsrs r6, r6, r7\n\t"
  128124. #else
  128125. "lsr r6, r6, r7\n\t"
  128126. #endif
  128127. #ifdef WOLFSSL_KEIL
  128128. "orrs r3, r3, r6\n\t"
  128129. #elif defined(__clang__)
  128130. "orrs r3, r6\n\t"
  128131. #else
  128132. "orr r3, r6\n\t"
  128133. #endif
  128134. "ldr r4, [%[a], #40]\n\t"
  128135. "str r3, [%[r], #48]\n\t"
  128136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128137. "lsrs r6, r4, #1\n\t"
  128138. #else
  128139. "lsr r6, r4, #1\n\t"
  128140. #endif
  128141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128142. "lsls r4, r4, %[n]\n\t"
  128143. #else
  128144. "lsl r4, r4, %[n]\n\t"
  128145. #endif
  128146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128147. "lsrs r6, r6, r7\n\t"
  128148. #else
  128149. "lsr r6, r6, r7\n\t"
  128150. #endif
  128151. #ifdef WOLFSSL_KEIL
  128152. "orrs r5, r5, r6\n\t"
  128153. #elif defined(__clang__)
  128154. "orrs r5, r6\n\t"
  128155. #else
  128156. "orr r5, r6\n\t"
  128157. #endif
  128158. "ldr r3, [%[a], #36]\n\t"
  128159. "str r5, [%[r], #44]\n\t"
  128160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128161. "lsrs r6, r3, #1\n\t"
  128162. #else
  128163. "lsr r6, r3, #1\n\t"
  128164. #endif
  128165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128166. "lsls r3, r3, %[n]\n\t"
  128167. #else
  128168. "lsl r3, r3, %[n]\n\t"
  128169. #endif
  128170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128171. "lsrs r6, r6, r7\n\t"
  128172. #else
  128173. "lsr r6, r6, r7\n\t"
  128174. #endif
  128175. #ifdef WOLFSSL_KEIL
  128176. "orrs r4, r4, r6\n\t"
  128177. #elif defined(__clang__)
  128178. "orrs r4, r6\n\t"
  128179. #else
  128180. "orr r4, r6\n\t"
  128181. #endif
  128182. "ldr r5, [%[a], #32]\n\t"
  128183. "str r4, [%[r], #40]\n\t"
  128184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128185. "lsrs r6, r5, #1\n\t"
  128186. #else
  128187. "lsr r6, r5, #1\n\t"
  128188. #endif
  128189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128190. "lsls r5, r5, %[n]\n\t"
  128191. #else
  128192. "lsl r5, r5, %[n]\n\t"
  128193. #endif
  128194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128195. "lsrs r6, r6, r7\n\t"
  128196. #else
  128197. "lsr r6, r6, r7\n\t"
  128198. #endif
  128199. #ifdef WOLFSSL_KEIL
  128200. "orrs r3, r3, r6\n\t"
  128201. #elif defined(__clang__)
  128202. "orrs r3, r6\n\t"
  128203. #else
  128204. "orr r3, r6\n\t"
  128205. #endif
  128206. "ldr r4, [%[a], #28]\n\t"
  128207. "str r3, [%[r], #36]\n\t"
  128208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128209. "lsrs r6, r4, #1\n\t"
  128210. #else
  128211. "lsr r6, r4, #1\n\t"
  128212. #endif
  128213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128214. "lsls r4, r4, %[n]\n\t"
  128215. #else
  128216. "lsl r4, r4, %[n]\n\t"
  128217. #endif
  128218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128219. "lsrs r6, r6, r7\n\t"
  128220. #else
  128221. "lsr r6, r6, r7\n\t"
  128222. #endif
  128223. #ifdef WOLFSSL_KEIL
  128224. "orrs r5, r5, r6\n\t"
  128225. #elif defined(__clang__)
  128226. "orrs r5, r6\n\t"
  128227. #else
  128228. "orr r5, r6\n\t"
  128229. #endif
  128230. "ldr r3, [%[a], #24]\n\t"
  128231. "str r5, [%[r], #32]\n\t"
  128232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128233. "lsrs r6, r3, #1\n\t"
  128234. #else
  128235. "lsr r6, r3, #1\n\t"
  128236. #endif
  128237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128238. "lsls r3, r3, %[n]\n\t"
  128239. #else
  128240. "lsl r3, r3, %[n]\n\t"
  128241. #endif
  128242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128243. "lsrs r6, r6, r7\n\t"
  128244. #else
  128245. "lsr r6, r6, r7\n\t"
  128246. #endif
  128247. #ifdef WOLFSSL_KEIL
  128248. "orrs r4, r4, r6\n\t"
  128249. #elif defined(__clang__)
  128250. "orrs r4, r6\n\t"
  128251. #else
  128252. "orr r4, r6\n\t"
  128253. #endif
  128254. "ldr r5, [%[a], #20]\n\t"
  128255. "str r4, [%[r], #28]\n\t"
  128256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128257. "lsrs r6, r5, #1\n\t"
  128258. #else
  128259. "lsr r6, r5, #1\n\t"
  128260. #endif
  128261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128262. "lsls r5, r5, %[n]\n\t"
  128263. #else
  128264. "lsl r5, r5, %[n]\n\t"
  128265. #endif
  128266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128267. "lsrs r6, r6, r7\n\t"
  128268. #else
  128269. "lsr r6, r6, r7\n\t"
  128270. #endif
  128271. #ifdef WOLFSSL_KEIL
  128272. "orrs r3, r3, r6\n\t"
  128273. #elif defined(__clang__)
  128274. "orrs r3, r6\n\t"
  128275. #else
  128276. "orr r3, r6\n\t"
  128277. #endif
  128278. "ldr r4, [%[a], #16]\n\t"
  128279. "str r3, [%[r], #24]\n\t"
  128280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128281. "lsrs r6, r4, #1\n\t"
  128282. #else
  128283. "lsr r6, r4, #1\n\t"
  128284. #endif
  128285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128286. "lsls r4, r4, %[n]\n\t"
  128287. #else
  128288. "lsl r4, r4, %[n]\n\t"
  128289. #endif
  128290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128291. "lsrs r6, r6, r7\n\t"
  128292. #else
  128293. "lsr r6, r6, r7\n\t"
  128294. #endif
  128295. #ifdef WOLFSSL_KEIL
  128296. "orrs r5, r5, r6\n\t"
  128297. #elif defined(__clang__)
  128298. "orrs r5, r6\n\t"
  128299. #else
  128300. "orr r5, r6\n\t"
  128301. #endif
  128302. "ldr r3, [%[a], #12]\n\t"
  128303. "str r5, [%[r], #20]\n\t"
  128304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128305. "lsrs r6, r3, #1\n\t"
  128306. #else
  128307. "lsr r6, r3, #1\n\t"
  128308. #endif
  128309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128310. "lsls r3, r3, %[n]\n\t"
  128311. #else
  128312. "lsl r3, r3, %[n]\n\t"
  128313. #endif
  128314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128315. "lsrs r6, r6, r7\n\t"
  128316. #else
  128317. "lsr r6, r6, r7\n\t"
  128318. #endif
  128319. #ifdef WOLFSSL_KEIL
  128320. "orrs r4, r4, r6\n\t"
  128321. #elif defined(__clang__)
  128322. "orrs r4, r6\n\t"
  128323. #else
  128324. "orr r4, r6\n\t"
  128325. #endif
  128326. "ldr r5, [%[a], #8]\n\t"
  128327. "str r4, [%[r], #16]\n\t"
  128328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128329. "lsrs r6, r5, #1\n\t"
  128330. #else
  128331. "lsr r6, r5, #1\n\t"
  128332. #endif
  128333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128334. "lsls r5, r5, %[n]\n\t"
  128335. #else
  128336. "lsl r5, r5, %[n]\n\t"
  128337. #endif
  128338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128339. "lsrs r6, r6, r7\n\t"
  128340. #else
  128341. "lsr r6, r6, r7\n\t"
  128342. #endif
  128343. #ifdef WOLFSSL_KEIL
  128344. "orrs r3, r3, r6\n\t"
  128345. #elif defined(__clang__)
  128346. "orrs r3, r6\n\t"
  128347. #else
  128348. "orr r3, r6\n\t"
  128349. #endif
  128350. "ldr r4, [%[a], #4]\n\t"
  128351. "str r3, [%[r], #12]\n\t"
  128352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128353. "lsrs r6, r4, #1\n\t"
  128354. #else
  128355. "lsr r6, r4, #1\n\t"
  128356. #endif
  128357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128358. "lsls r4, r4, %[n]\n\t"
  128359. #else
  128360. "lsl r4, r4, %[n]\n\t"
  128361. #endif
  128362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128363. "lsrs r6, r6, r7\n\t"
  128364. #else
  128365. "lsr r6, r6, r7\n\t"
  128366. #endif
  128367. #ifdef WOLFSSL_KEIL
  128368. "orrs r5, r5, r6\n\t"
  128369. #elif defined(__clang__)
  128370. "orrs r5, r6\n\t"
  128371. #else
  128372. "orr r5, r6\n\t"
  128373. #endif
  128374. "ldr r3, [%[a]]\n\t"
  128375. "str r5, [%[r], #8]\n\t"
  128376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128377. "lsrs r6, r3, #1\n\t"
  128378. #else
  128379. "lsr r6, r3, #1\n\t"
  128380. #endif
  128381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128382. "lsls r3, r3, %[n]\n\t"
  128383. #else
  128384. "lsl r3, r3, %[n]\n\t"
  128385. #endif
  128386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128387. "lsrs r6, r6, r7\n\t"
  128388. #else
  128389. "lsr r6, r6, r7\n\t"
  128390. #endif
  128391. #ifdef WOLFSSL_KEIL
  128392. "orrs r4, r4, r6\n\t"
  128393. #elif defined(__clang__)
  128394. "orrs r4, r6\n\t"
  128395. #else
  128396. "orr r4, r6\n\t"
  128397. #endif
  128398. "str r3, [%[r]]\n\t"
  128399. "str r4, [%[r], #4]\n\t"
  128400. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  128401. :
  128402. : "memory", "r3", "r4", "r5", "r6", "r7"
  128403. );
  128404. }
  128405. /* Lefy shift a by n bits into r. (r = a << n)
  128406. *
  128407. * r A single precision integer.
  128408. * a A single precision integer.
  128409. * n Integer representing number of bits to shift.
  128410. */
  128411. static void sp_521_lshift_34(sp_digit* r, const sp_digit* a, byte n)
  128412. {
  128413. __asm__ __volatile__ (
  128414. "movs r7, #31\n\t"
  128415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128416. "subs r7, r7, %[n]\n\t"
  128417. #else
  128418. "sub r7, r7, %[n]\n\t"
  128419. #endif
  128420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128421. "adds %[a], %[a], #0x80\n\t"
  128422. #else
  128423. "add %[a], %[a], #0x80\n\t"
  128424. #endif
  128425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128426. "adds %[r], %[r], #0x80\n\t"
  128427. #else
  128428. "add %[r], %[r], #0x80\n\t"
  128429. #endif
  128430. "ldr r4, [%[a], #4]\n\t"
  128431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128432. "lsrs r5, r4, #1\n\t"
  128433. #else
  128434. "lsr r5, r4, #1\n\t"
  128435. #endif
  128436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128437. "lsls r4, r4, %[n]\n\t"
  128438. #else
  128439. "lsl r4, r4, %[n]\n\t"
  128440. #endif
  128441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128442. "lsrs r5, r5, r7\n\t"
  128443. #else
  128444. "lsr r5, r5, r7\n\t"
  128445. #endif
  128446. "ldr r3, [%[a]]\n\t"
  128447. "str r5, [%[r], #8]\n\t"
  128448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128449. "lsrs r6, r3, #1\n\t"
  128450. #else
  128451. "lsr r6, r3, #1\n\t"
  128452. #endif
  128453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128454. "lsls r3, r3, %[n]\n\t"
  128455. #else
  128456. "lsl r3, r3, %[n]\n\t"
  128457. #endif
  128458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128459. "lsrs r6, r6, r7\n\t"
  128460. #else
  128461. "lsr r6, r6, r7\n\t"
  128462. #endif
  128463. #ifdef WOLFSSL_KEIL
  128464. "orrs r4, r4, r6\n\t"
  128465. #elif defined(__clang__)
  128466. "orrs r4, r6\n\t"
  128467. #else
  128468. "orr r4, r6\n\t"
  128469. #endif
  128470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128471. "subs %[a], %[a], #0x40\n\t"
  128472. #else
  128473. "sub %[a], %[a], #0x40\n\t"
  128474. #endif
  128475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128476. "subs %[r], %[r], #0x40\n\t"
  128477. #else
  128478. "sub %[r], %[r], #0x40\n\t"
  128479. #endif
  128480. "ldr r5, [%[a], #60]\n\t"
  128481. "str r4, [%[r], #68]\n\t"
  128482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128483. "lsrs r6, r5, #1\n\t"
  128484. #else
  128485. "lsr r6, r5, #1\n\t"
  128486. #endif
  128487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128488. "lsls r5, r5, %[n]\n\t"
  128489. #else
  128490. "lsl r5, r5, %[n]\n\t"
  128491. #endif
  128492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128493. "lsrs r6, r6, r7\n\t"
  128494. #else
  128495. "lsr r6, r6, r7\n\t"
  128496. #endif
  128497. #ifdef WOLFSSL_KEIL
  128498. "orrs r3, r3, r6\n\t"
  128499. #elif defined(__clang__)
  128500. "orrs r3, r6\n\t"
  128501. #else
  128502. "orr r3, r6\n\t"
  128503. #endif
  128504. "ldr r4, [%[a], #56]\n\t"
  128505. "str r3, [%[r], #64]\n\t"
  128506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128507. "lsrs r6, r4, #1\n\t"
  128508. #else
  128509. "lsr r6, r4, #1\n\t"
  128510. #endif
  128511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128512. "lsls r4, r4, %[n]\n\t"
  128513. #else
  128514. "lsl r4, r4, %[n]\n\t"
  128515. #endif
  128516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128517. "lsrs r6, r6, r7\n\t"
  128518. #else
  128519. "lsr r6, r6, r7\n\t"
  128520. #endif
  128521. #ifdef WOLFSSL_KEIL
  128522. "orrs r5, r5, r6\n\t"
  128523. #elif defined(__clang__)
  128524. "orrs r5, r6\n\t"
  128525. #else
  128526. "orr r5, r6\n\t"
  128527. #endif
  128528. "ldr r3, [%[a], #52]\n\t"
  128529. "str r5, [%[r], #60]\n\t"
  128530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128531. "lsrs r6, r3, #1\n\t"
  128532. #else
  128533. "lsr r6, r3, #1\n\t"
  128534. #endif
  128535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128536. "lsls r3, r3, %[n]\n\t"
  128537. #else
  128538. "lsl r3, r3, %[n]\n\t"
  128539. #endif
  128540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128541. "lsrs r6, r6, r7\n\t"
  128542. #else
  128543. "lsr r6, r6, r7\n\t"
  128544. #endif
  128545. #ifdef WOLFSSL_KEIL
  128546. "orrs r4, r4, r6\n\t"
  128547. #elif defined(__clang__)
  128548. "orrs r4, r6\n\t"
  128549. #else
  128550. "orr r4, r6\n\t"
  128551. #endif
  128552. "ldr r5, [%[a], #48]\n\t"
  128553. "str r4, [%[r], #56]\n\t"
  128554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128555. "lsrs r6, r5, #1\n\t"
  128556. #else
  128557. "lsr r6, r5, #1\n\t"
  128558. #endif
  128559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128560. "lsls r5, r5, %[n]\n\t"
  128561. #else
  128562. "lsl r5, r5, %[n]\n\t"
  128563. #endif
  128564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128565. "lsrs r6, r6, r7\n\t"
  128566. #else
  128567. "lsr r6, r6, r7\n\t"
  128568. #endif
  128569. #ifdef WOLFSSL_KEIL
  128570. "orrs r3, r3, r6\n\t"
  128571. #elif defined(__clang__)
  128572. "orrs r3, r6\n\t"
  128573. #else
  128574. "orr r3, r6\n\t"
  128575. #endif
  128576. "ldr r4, [%[a], #44]\n\t"
  128577. "str r3, [%[r], #52]\n\t"
  128578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128579. "lsrs r6, r4, #1\n\t"
  128580. #else
  128581. "lsr r6, r4, #1\n\t"
  128582. #endif
  128583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128584. "lsls r4, r4, %[n]\n\t"
  128585. #else
  128586. "lsl r4, r4, %[n]\n\t"
  128587. #endif
  128588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128589. "lsrs r6, r6, r7\n\t"
  128590. #else
  128591. "lsr r6, r6, r7\n\t"
  128592. #endif
  128593. #ifdef WOLFSSL_KEIL
  128594. "orrs r5, r5, r6\n\t"
  128595. #elif defined(__clang__)
  128596. "orrs r5, r6\n\t"
  128597. #else
  128598. "orr r5, r6\n\t"
  128599. #endif
  128600. "ldr r3, [%[a], #40]\n\t"
  128601. "str r5, [%[r], #48]\n\t"
  128602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128603. "lsrs r6, r3, #1\n\t"
  128604. #else
  128605. "lsr r6, r3, #1\n\t"
  128606. #endif
  128607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128608. "lsls r3, r3, %[n]\n\t"
  128609. #else
  128610. "lsl r3, r3, %[n]\n\t"
  128611. #endif
  128612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128613. "lsrs r6, r6, r7\n\t"
  128614. #else
  128615. "lsr r6, r6, r7\n\t"
  128616. #endif
  128617. #ifdef WOLFSSL_KEIL
  128618. "orrs r4, r4, r6\n\t"
  128619. #elif defined(__clang__)
  128620. "orrs r4, r6\n\t"
  128621. #else
  128622. "orr r4, r6\n\t"
  128623. #endif
  128624. "ldr r5, [%[a], #36]\n\t"
  128625. "str r4, [%[r], #44]\n\t"
  128626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128627. "lsrs r6, r5, #1\n\t"
  128628. #else
  128629. "lsr r6, r5, #1\n\t"
  128630. #endif
  128631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128632. "lsls r5, r5, %[n]\n\t"
  128633. #else
  128634. "lsl r5, r5, %[n]\n\t"
  128635. #endif
  128636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128637. "lsrs r6, r6, r7\n\t"
  128638. #else
  128639. "lsr r6, r6, r7\n\t"
  128640. #endif
  128641. #ifdef WOLFSSL_KEIL
  128642. "orrs r3, r3, r6\n\t"
  128643. #elif defined(__clang__)
  128644. "orrs r3, r6\n\t"
  128645. #else
  128646. "orr r3, r6\n\t"
  128647. #endif
  128648. "ldr r4, [%[a], #32]\n\t"
  128649. "str r3, [%[r], #40]\n\t"
  128650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128651. "lsrs r6, r4, #1\n\t"
  128652. #else
  128653. "lsr r6, r4, #1\n\t"
  128654. #endif
  128655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128656. "lsls r4, r4, %[n]\n\t"
  128657. #else
  128658. "lsl r4, r4, %[n]\n\t"
  128659. #endif
  128660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128661. "lsrs r6, r6, r7\n\t"
  128662. #else
  128663. "lsr r6, r6, r7\n\t"
  128664. #endif
  128665. #ifdef WOLFSSL_KEIL
  128666. "orrs r5, r5, r6\n\t"
  128667. #elif defined(__clang__)
  128668. "orrs r5, r6\n\t"
  128669. #else
  128670. "orr r5, r6\n\t"
  128671. #endif
  128672. "ldr r3, [%[a], #28]\n\t"
  128673. "str r5, [%[r], #36]\n\t"
  128674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128675. "lsrs r6, r3, #1\n\t"
  128676. #else
  128677. "lsr r6, r3, #1\n\t"
  128678. #endif
  128679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128680. "lsls r3, r3, %[n]\n\t"
  128681. #else
  128682. "lsl r3, r3, %[n]\n\t"
  128683. #endif
  128684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128685. "lsrs r6, r6, r7\n\t"
  128686. #else
  128687. "lsr r6, r6, r7\n\t"
  128688. #endif
  128689. #ifdef WOLFSSL_KEIL
  128690. "orrs r4, r4, r6\n\t"
  128691. #elif defined(__clang__)
  128692. "orrs r4, r6\n\t"
  128693. #else
  128694. "orr r4, r6\n\t"
  128695. #endif
  128696. "ldr r5, [%[a], #24]\n\t"
  128697. "str r4, [%[r], #32]\n\t"
  128698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128699. "lsrs r6, r5, #1\n\t"
  128700. #else
  128701. "lsr r6, r5, #1\n\t"
  128702. #endif
  128703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128704. "lsls r5, r5, %[n]\n\t"
  128705. #else
  128706. "lsl r5, r5, %[n]\n\t"
  128707. #endif
  128708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128709. "lsrs r6, r6, r7\n\t"
  128710. #else
  128711. "lsr r6, r6, r7\n\t"
  128712. #endif
  128713. #ifdef WOLFSSL_KEIL
  128714. "orrs r3, r3, r6\n\t"
  128715. #elif defined(__clang__)
  128716. "orrs r3, r6\n\t"
  128717. #else
  128718. "orr r3, r6\n\t"
  128719. #endif
  128720. "ldr r4, [%[a], #20]\n\t"
  128721. "str r3, [%[r], #28]\n\t"
  128722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128723. "lsrs r6, r4, #1\n\t"
  128724. #else
  128725. "lsr r6, r4, #1\n\t"
  128726. #endif
  128727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128728. "lsls r4, r4, %[n]\n\t"
  128729. #else
  128730. "lsl r4, r4, %[n]\n\t"
  128731. #endif
  128732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128733. "lsrs r6, r6, r7\n\t"
  128734. #else
  128735. "lsr r6, r6, r7\n\t"
  128736. #endif
  128737. #ifdef WOLFSSL_KEIL
  128738. "orrs r5, r5, r6\n\t"
  128739. #elif defined(__clang__)
  128740. "orrs r5, r6\n\t"
  128741. #else
  128742. "orr r5, r6\n\t"
  128743. #endif
  128744. "ldr r3, [%[a], #16]\n\t"
  128745. "str r5, [%[r], #24]\n\t"
  128746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128747. "lsrs r6, r3, #1\n\t"
  128748. #else
  128749. "lsr r6, r3, #1\n\t"
  128750. #endif
  128751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128752. "lsls r3, r3, %[n]\n\t"
  128753. #else
  128754. "lsl r3, r3, %[n]\n\t"
  128755. #endif
  128756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128757. "lsrs r6, r6, r7\n\t"
  128758. #else
  128759. "lsr r6, r6, r7\n\t"
  128760. #endif
  128761. #ifdef WOLFSSL_KEIL
  128762. "orrs r4, r4, r6\n\t"
  128763. #elif defined(__clang__)
  128764. "orrs r4, r6\n\t"
  128765. #else
  128766. "orr r4, r6\n\t"
  128767. #endif
  128768. "ldr r5, [%[a], #12]\n\t"
  128769. "str r4, [%[r], #20]\n\t"
  128770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128771. "lsrs r6, r5, #1\n\t"
  128772. #else
  128773. "lsr r6, r5, #1\n\t"
  128774. #endif
  128775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128776. "lsls r5, r5, %[n]\n\t"
  128777. #else
  128778. "lsl r5, r5, %[n]\n\t"
  128779. #endif
  128780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128781. "lsrs r6, r6, r7\n\t"
  128782. #else
  128783. "lsr r6, r6, r7\n\t"
  128784. #endif
  128785. #ifdef WOLFSSL_KEIL
  128786. "orrs r3, r3, r6\n\t"
  128787. #elif defined(__clang__)
  128788. "orrs r3, r6\n\t"
  128789. #else
  128790. "orr r3, r6\n\t"
  128791. #endif
  128792. "ldr r4, [%[a], #8]\n\t"
  128793. "str r3, [%[r], #16]\n\t"
  128794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128795. "lsrs r6, r4, #1\n\t"
  128796. #else
  128797. "lsr r6, r4, #1\n\t"
  128798. #endif
  128799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128800. "lsls r4, r4, %[n]\n\t"
  128801. #else
  128802. "lsl r4, r4, %[n]\n\t"
  128803. #endif
  128804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128805. "lsrs r6, r6, r7\n\t"
  128806. #else
  128807. "lsr r6, r6, r7\n\t"
  128808. #endif
  128809. #ifdef WOLFSSL_KEIL
  128810. "orrs r5, r5, r6\n\t"
  128811. #elif defined(__clang__)
  128812. "orrs r5, r6\n\t"
  128813. #else
  128814. "orr r5, r6\n\t"
  128815. #endif
  128816. "ldr r3, [%[a], #4]\n\t"
  128817. "str r5, [%[r], #12]\n\t"
  128818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128819. "lsrs r6, r3, #1\n\t"
  128820. #else
  128821. "lsr r6, r3, #1\n\t"
  128822. #endif
  128823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128824. "lsls r3, r3, %[n]\n\t"
  128825. #else
  128826. "lsl r3, r3, %[n]\n\t"
  128827. #endif
  128828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128829. "lsrs r6, r6, r7\n\t"
  128830. #else
  128831. "lsr r6, r6, r7\n\t"
  128832. #endif
  128833. #ifdef WOLFSSL_KEIL
  128834. "orrs r4, r4, r6\n\t"
  128835. #elif defined(__clang__)
  128836. "orrs r4, r6\n\t"
  128837. #else
  128838. "orr r4, r6\n\t"
  128839. #endif
  128840. "ldr r5, [%[a]]\n\t"
  128841. "str r4, [%[r], #8]\n\t"
  128842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128843. "lsrs r6, r5, #1\n\t"
  128844. #else
  128845. "lsr r6, r5, #1\n\t"
  128846. #endif
  128847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128848. "lsls r5, r5, %[n]\n\t"
  128849. #else
  128850. "lsl r5, r5, %[n]\n\t"
  128851. #endif
  128852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128853. "lsrs r6, r6, r7\n\t"
  128854. #else
  128855. "lsr r6, r6, r7\n\t"
  128856. #endif
  128857. #ifdef WOLFSSL_KEIL
  128858. "orrs r3, r3, r6\n\t"
  128859. #elif defined(__clang__)
  128860. "orrs r3, r6\n\t"
  128861. #else
  128862. "orr r3, r6\n\t"
  128863. #endif
  128864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128865. "subs %[a], %[a], #0x40\n\t"
  128866. #else
  128867. "sub %[a], %[a], #0x40\n\t"
  128868. #endif
  128869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128870. "subs %[r], %[r], #0x40\n\t"
  128871. #else
  128872. "sub %[r], %[r], #0x40\n\t"
  128873. #endif
  128874. "ldr r4, [%[a], #60]\n\t"
  128875. "str r3, [%[r], #68]\n\t"
  128876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128877. "lsrs r6, r4, #1\n\t"
  128878. #else
  128879. "lsr r6, r4, #1\n\t"
  128880. #endif
  128881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128882. "lsls r4, r4, %[n]\n\t"
  128883. #else
  128884. "lsl r4, r4, %[n]\n\t"
  128885. #endif
  128886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128887. "lsrs r6, r6, r7\n\t"
  128888. #else
  128889. "lsr r6, r6, r7\n\t"
  128890. #endif
  128891. #ifdef WOLFSSL_KEIL
  128892. "orrs r5, r5, r6\n\t"
  128893. #elif defined(__clang__)
  128894. "orrs r5, r6\n\t"
  128895. #else
  128896. "orr r5, r6\n\t"
  128897. #endif
  128898. "ldr r3, [%[a], #56]\n\t"
  128899. "str r5, [%[r], #64]\n\t"
  128900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128901. "lsrs r6, r3, #1\n\t"
  128902. #else
  128903. "lsr r6, r3, #1\n\t"
  128904. #endif
  128905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128906. "lsls r3, r3, %[n]\n\t"
  128907. #else
  128908. "lsl r3, r3, %[n]\n\t"
  128909. #endif
  128910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128911. "lsrs r6, r6, r7\n\t"
  128912. #else
  128913. "lsr r6, r6, r7\n\t"
  128914. #endif
  128915. #ifdef WOLFSSL_KEIL
  128916. "orrs r4, r4, r6\n\t"
  128917. #elif defined(__clang__)
  128918. "orrs r4, r6\n\t"
  128919. #else
  128920. "orr r4, r6\n\t"
  128921. #endif
  128922. "ldr r5, [%[a], #52]\n\t"
  128923. "str r4, [%[r], #60]\n\t"
  128924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128925. "lsrs r6, r5, #1\n\t"
  128926. #else
  128927. "lsr r6, r5, #1\n\t"
  128928. #endif
  128929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128930. "lsls r5, r5, %[n]\n\t"
  128931. #else
  128932. "lsl r5, r5, %[n]\n\t"
  128933. #endif
  128934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128935. "lsrs r6, r6, r7\n\t"
  128936. #else
  128937. "lsr r6, r6, r7\n\t"
  128938. #endif
  128939. #ifdef WOLFSSL_KEIL
  128940. "orrs r3, r3, r6\n\t"
  128941. #elif defined(__clang__)
  128942. "orrs r3, r6\n\t"
  128943. #else
  128944. "orr r3, r6\n\t"
  128945. #endif
  128946. "ldr r4, [%[a], #48]\n\t"
  128947. "str r3, [%[r], #56]\n\t"
  128948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128949. "lsrs r6, r4, #1\n\t"
  128950. #else
  128951. "lsr r6, r4, #1\n\t"
  128952. #endif
  128953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128954. "lsls r4, r4, %[n]\n\t"
  128955. #else
  128956. "lsl r4, r4, %[n]\n\t"
  128957. #endif
  128958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128959. "lsrs r6, r6, r7\n\t"
  128960. #else
  128961. "lsr r6, r6, r7\n\t"
  128962. #endif
  128963. #ifdef WOLFSSL_KEIL
  128964. "orrs r5, r5, r6\n\t"
  128965. #elif defined(__clang__)
  128966. "orrs r5, r6\n\t"
  128967. #else
  128968. "orr r5, r6\n\t"
  128969. #endif
  128970. "ldr r3, [%[a], #44]\n\t"
  128971. "str r5, [%[r], #52]\n\t"
  128972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128973. "lsrs r6, r3, #1\n\t"
  128974. #else
  128975. "lsr r6, r3, #1\n\t"
  128976. #endif
  128977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128978. "lsls r3, r3, %[n]\n\t"
  128979. #else
  128980. "lsl r3, r3, %[n]\n\t"
  128981. #endif
  128982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128983. "lsrs r6, r6, r7\n\t"
  128984. #else
  128985. "lsr r6, r6, r7\n\t"
  128986. #endif
  128987. #ifdef WOLFSSL_KEIL
  128988. "orrs r4, r4, r6\n\t"
  128989. #elif defined(__clang__)
  128990. "orrs r4, r6\n\t"
  128991. #else
  128992. "orr r4, r6\n\t"
  128993. #endif
  128994. "ldr r5, [%[a], #40]\n\t"
  128995. "str r4, [%[r], #48]\n\t"
  128996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128997. "lsrs r6, r5, #1\n\t"
  128998. #else
  128999. "lsr r6, r5, #1\n\t"
  129000. #endif
  129001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129002. "lsls r5, r5, %[n]\n\t"
  129003. #else
  129004. "lsl r5, r5, %[n]\n\t"
  129005. #endif
  129006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129007. "lsrs r6, r6, r7\n\t"
  129008. #else
  129009. "lsr r6, r6, r7\n\t"
  129010. #endif
  129011. #ifdef WOLFSSL_KEIL
  129012. "orrs r3, r3, r6\n\t"
  129013. #elif defined(__clang__)
  129014. "orrs r3, r6\n\t"
  129015. #else
  129016. "orr r3, r6\n\t"
  129017. #endif
  129018. "ldr r4, [%[a], #36]\n\t"
  129019. "str r3, [%[r], #44]\n\t"
  129020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129021. "lsrs r6, r4, #1\n\t"
  129022. #else
  129023. "lsr r6, r4, #1\n\t"
  129024. #endif
  129025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129026. "lsls r4, r4, %[n]\n\t"
  129027. #else
  129028. "lsl r4, r4, %[n]\n\t"
  129029. #endif
  129030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129031. "lsrs r6, r6, r7\n\t"
  129032. #else
  129033. "lsr r6, r6, r7\n\t"
  129034. #endif
  129035. #ifdef WOLFSSL_KEIL
  129036. "orrs r5, r5, r6\n\t"
  129037. #elif defined(__clang__)
  129038. "orrs r5, r6\n\t"
  129039. #else
  129040. "orr r5, r6\n\t"
  129041. #endif
  129042. "ldr r3, [%[a], #32]\n\t"
  129043. "str r5, [%[r], #40]\n\t"
  129044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129045. "lsrs r6, r3, #1\n\t"
  129046. #else
  129047. "lsr r6, r3, #1\n\t"
  129048. #endif
  129049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129050. "lsls r3, r3, %[n]\n\t"
  129051. #else
  129052. "lsl r3, r3, %[n]\n\t"
  129053. #endif
  129054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129055. "lsrs r6, r6, r7\n\t"
  129056. #else
  129057. "lsr r6, r6, r7\n\t"
  129058. #endif
  129059. #ifdef WOLFSSL_KEIL
  129060. "orrs r4, r4, r6\n\t"
  129061. #elif defined(__clang__)
  129062. "orrs r4, r6\n\t"
  129063. #else
  129064. "orr r4, r6\n\t"
  129065. #endif
  129066. "ldr r5, [%[a], #28]\n\t"
  129067. "str r4, [%[r], #36]\n\t"
  129068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129069. "lsrs r6, r5, #1\n\t"
  129070. #else
  129071. "lsr r6, r5, #1\n\t"
  129072. #endif
  129073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129074. "lsls r5, r5, %[n]\n\t"
  129075. #else
  129076. "lsl r5, r5, %[n]\n\t"
  129077. #endif
  129078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129079. "lsrs r6, r6, r7\n\t"
  129080. #else
  129081. "lsr r6, r6, r7\n\t"
  129082. #endif
  129083. #ifdef WOLFSSL_KEIL
  129084. "orrs r3, r3, r6\n\t"
  129085. #elif defined(__clang__)
  129086. "orrs r3, r6\n\t"
  129087. #else
  129088. "orr r3, r6\n\t"
  129089. #endif
  129090. "ldr r4, [%[a], #24]\n\t"
  129091. "str r3, [%[r], #32]\n\t"
  129092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129093. "lsrs r6, r4, #1\n\t"
  129094. #else
  129095. "lsr r6, r4, #1\n\t"
  129096. #endif
  129097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129098. "lsls r4, r4, %[n]\n\t"
  129099. #else
  129100. "lsl r4, r4, %[n]\n\t"
  129101. #endif
  129102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129103. "lsrs r6, r6, r7\n\t"
  129104. #else
  129105. "lsr r6, r6, r7\n\t"
  129106. #endif
  129107. #ifdef WOLFSSL_KEIL
  129108. "orrs r5, r5, r6\n\t"
  129109. #elif defined(__clang__)
  129110. "orrs r5, r6\n\t"
  129111. #else
  129112. "orr r5, r6\n\t"
  129113. #endif
  129114. "ldr r3, [%[a], #20]\n\t"
  129115. "str r5, [%[r], #28]\n\t"
  129116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129117. "lsrs r6, r3, #1\n\t"
  129118. #else
  129119. "lsr r6, r3, #1\n\t"
  129120. #endif
  129121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129122. "lsls r3, r3, %[n]\n\t"
  129123. #else
  129124. "lsl r3, r3, %[n]\n\t"
  129125. #endif
  129126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129127. "lsrs r6, r6, r7\n\t"
  129128. #else
  129129. "lsr r6, r6, r7\n\t"
  129130. #endif
  129131. #ifdef WOLFSSL_KEIL
  129132. "orrs r4, r4, r6\n\t"
  129133. #elif defined(__clang__)
  129134. "orrs r4, r6\n\t"
  129135. #else
  129136. "orr r4, r6\n\t"
  129137. #endif
  129138. "ldr r5, [%[a], #16]\n\t"
  129139. "str r4, [%[r], #24]\n\t"
  129140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129141. "lsrs r6, r5, #1\n\t"
  129142. #else
  129143. "lsr r6, r5, #1\n\t"
  129144. #endif
  129145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129146. "lsls r5, r5, %[n]\n\t"
  129147. #else
  129148. "lsl r5, r5, %[n]\n\t"
  129149. #endif
  129150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129151. "lsrs r6, r6, r7\n\t"
  129152. #else
  129153. "lsr r6, r6, r7\n\t"
  129154. #endif
  129155. #ifdef WOLFSSL_KEIL
  129156. "orrs r3, r3, r6\n\t"
  129157. #elif defined(__clang__)
  129158. "orrs r3, r6\n\t"
  129159. #else
  129160. "orr r3, r6\n\t"
  129161. #endif
  129162. "ldr r4, [%[a], #12]\n\t"
  129163. "str r3, [%[r], #20]\n\t"
  129164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129165. "lsrs r6, r4, #1\n\t"
  129166. #else
  129167. "lsr r6, r4, #1\n\t"
  129168. #endif
  129169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129170. "lsls r4, r4, %[n]\n\t"
  129171. #else
  129172. "lsl r4, r4, %[n]\n\t"
  129173. #endif
  129174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129175. "lsrs r6, r6, r7\n\t"
  129176. #else
  129177. "lsr r6, r6, r7\n\t"
  129178. #endif
  129179. #ifdef WOLFSSL_KEIL
  129180. "orrs r5, r5, r6\n\t"
  129181. #elif defined(__clang__)
  129182. "orrs r5, r6\n\t"
  129183. #else
  129184. "orr r5, r6\n\t"
  129185. #endif
  129186. "ldr r3, [%[a], #8]\n\t"
  129187. "str r5, [%[r], #16]\n\t"
  129188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129189. "lsrs r6, r3, #1\n\t"
  129190. #else
  129191. "lsr r6, r3, #1\n\t"
  129192. #endif
  129193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129194. "lsls r3, r3, %[n]\n\t"
  129195. #else
  129196. "lsl r3, r3, %[n]\n\t"
  129197. #endif
  129198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129199. "lsrs r6, r6, r7\n\t"
  129200. #else
  129201. "lsr r6, r6, r7\n\t"
  129202. #endif
  129203. #ifdef WOLFSSL_KEIL
  129204. "orrs r4, r4, r6\n\t"
  129205. #elif defined(__clang__)
  129206. "orrs r4, r6\n\t"
  129207. #else
  129208. "orr r4, r6\n\t"
  129209. #endif
  129210. "ldr r5, [%[a], #4]\n\t"
  129211. "str r4, [%[r], #12]\n\t"
  129212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129213. "lsrs r6, r5, #1\n\t"
  129214. #else
  129215. "lsr r6, r5, #1\n\t"
  129216. #endif
  129217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129218. "lsls r5, r5, %[n]\n\t"
  129219. #else
  129220. "lsl r5, r5, %[n]\n\t"
  129221. #endif
  129222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129223. "lsrs r6, r6, r7\n\t"
  129224. #else
  129225. "lsr r6, r6, r7\n\t"
  129226. #endif
  129227. #ifdef WOLFSSL_KEIL
  129228. "orrs r3, r3, r6\n\t"
  129229. #elif defined(__clang__)
  129230. "orrs r3, r6\n\t"
  129231. #else
  129232. "orr r3, r6\n\t"
  129233. #endif
  129234. "ldr r4, [%[a]]\n\t"
  129235. "str r3, [%[r], #8]\n\t"
  129236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129237. "lsrs r6, r4, #1\n\t"
  129238. #else
  129239. "lsr r6, r4, #1\n\t"
  129240. #endif
  129241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129242. "lsls r4, r4, %[n]\n\t"
  129243. #else
  129244. "lsl r4, r4, %[n]\n\t"
  129245. #endif
  129246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129247. "lsrs r6, r6, r7\n\t"
  129248. #else
  129249. "lsr r6, r6, r7\n\t"
  129250. #endif
  129251. #ifdef WOLFSSL_KEIL
  129252. "orrs r5, r5, r6\n\t"
  129253. #elif defined(__clang__)
  129254. "orrs r5, r6\n\t"
  129255. #else
  129256. "orr r5, r6\n\t"
  129257. #endif
  129258. "str r4, [%[r]]\n\t"
  129259. "str r5, [%[r], #4]\n\t"
  129260. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  129261. :
  129262. : "memory", "r3", "r4", "r5", "r6", "r7"
  129263. );
  129264. }
  129265. #ifdef WOLFSSL_SP_SMALL
  129266. /* Sub b from a into a. (a -= b)
  129267. *
  129268. * a A single precision integer.
  129269. * b A single precision integer.
  129270. */
  129271. SP_NOINLINE static sp_digit sp_521_sub_in_place_17(sp_digit* a,
  129272. const sp_digit* b)
  129273. {
  129274. __asm__ __volatile__ (
  129275. "movs r7, %[a]\n\t"
  129276. "movs r2, #0\n\t"
  129277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129278. "adds r7, r7, #0x40\n\t"
  129279. #else
  129280. "add r7, r7, #0x40\n\t"
  129281. #endif
  129282. "\n"
  129283. "L_sp_521_sub_in_place_17_words_%=:\n\t"
  129284. "movs r5, #0\n\t"
  129285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129286. "subs r5, r5, r2\n\t"
  129287. #else
  129288. "sub r5, r5, r2\n\t"
  129289. #endif
  129290. "ldr r3, [%[a]]\n\t"
  129291. "ldr r4, [%[a], #4]\n\t"
  129292. "ldr r5, [%[b]]\n\t"
  129293. "ldr r6, [%[b], #4]\n\t"
  129294. #ifdef WOLFSSL_KEIL
  129295. "sbcs r3, r3, r5\n\t"
  129296. #elif defined(__clang__)
  129297. "sbcs r3, r5\n\t"
  129298. #else
  129299. "sbc r3, r5\n\t"
  129300. #endif
  129301. #ifdef WOLFSSL_KEIL
  129302. "sbcs r4, r4, r6\n\t"
  129303. #elif defined(__clang__)
  129304. "sbcs r4, r6\n\t"
  129305. #else
  129306. "sbc r4, r6\n\t"
  129307. #endif
  129308. "str r3, [%[a]]\n\t"
  129309. "str r4, [%[a], #4]\n\t"
  129310. #ifdef WOLFSSL_KEIL
  129311. "sbcs r2, r2, r2\n\t"
  129312. #elif defined(__clang__)
  129313. "sbcs r2, r2\n\t"
  129314. #else
  129315. "sbc r2, r2\n\t"
  129316. #endif
  129317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129318. "adds %[a], %[a], #8\n\t"
  129319. #else
  129320. "add %[a], %[a], #8\n\t"
  129321. #endif
  129322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129323. "adds %[b], %[b], #8\n\t"
  129324. #else
  129325. "add %[b], %[b], #8\n\t"
  129326. #endif
  129327. "cmp %[a], r7\n\t"
  129328. "bne L_sp_521_sub_in_place_17_words_%=\n\t"
  129329. "movs %[a], r2\n\t"
  129330. : [a] "+l" (a), [b] "+l" (b)
  129331. :
  129332. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  129333. );
  129334. return (uint32_t)(size_t)a;
  129335. }
  129336. #else
  129337. /* Sub b from a into a. (a -= b)
  129338. *
  129339. * a A single precision integer.
  129340. * b A single precision integer.
  129341. */
  129342. SP_NOINLINE static sp_digit sp_521_sub_in_place_17(sp_digit* a,
  129343. const sp_digit* b)
  129344. {
  129345. __asm__ __volatile__ (
  129346. "ldm %[b]!, {r4, r5}\n\t"
  129347. "ldr r2, [%[a]]\n\t"
  129348. "ldr r3, [%[a], #4]\n\t"
  129349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129350. "subs r2, r2, r4\n\t"
  129351. #else
  129352. "sub r2, r2, r4\n\t"
  129353. #endif
  129354. #ifdef WOLFSSL_KEIL
  129355. "sbcs r3, r3, r5\n\t"
  129356. #elif defined(__clang__)
  129357. "sbcs r3, r5\n\t"
  129358. #else
  129359. "sbc r3, r5\n\t"
  129360. #endif
  129361. "stm %[a]!, {r2, r3}\n\t"
  129362. "ldm %[b]!, {r4, r5}\n\t"
  129363. "ldr r2, [%[a]]\n\t"
  129364. "ldr r3, [%[a], #4]\n\t"
  129365. #ifdef WOLFSSL_KEIL
  129366. "sbcs r2, r2, r4\n\t"
  129367. #elif defined(__clang__)
  129368. "sbcs r2, r4\n\t"
  129369. #else
  129370. "sbc r2, r4\n\t"
  129371. #endif
  129372. #ifdef WOLFSSL_KEIL
  129373. "sbcs r3, r3, r5\n\t"
  129374. #elif defined(__clang__)
  129375. "sbcs r3, r5\n\t"
  129376. #else
  129377. "sbc r3, r5\n\t"
  129378. #endif
  129379. "stm %[a]!, {r2, r3}\n\t"
  129380. "ldm %[b]!, {r4, r5}\n\t"
  129381. "ldr r2, [%[a]]\n\t"
  129382. "ldr r3, [%[a], #4]\n\t"
  129383. #ifdef WOLFSSL_KEIL
  129384. "sbcs r2, r2, r4\n\t"
  129385. #elif defined(__clang__)
  129386. "sbcs r2, r4\n\t"
  129387. #else
  129388. "sbc r2, r4\n\t"
  129389. #endif
  129390. #ifdef WOLFSSL_KEIL
  129391. "sbcs r3, r3, r5\n\t"
  129392. #elif defined(__clang__)
  129393. "sbcs r3, r5\n\t"
  129394. #else
  129395. "sbc r3, r5\n\t"
  129396. #endif
  129397. "stm %[a]!, {r2, r3}\n\t"
  129398. "ldm %[b]!, {r4, r5}\n\t"
  129399. "ldr r2, [%[a]]\n\t"
  129400. "ldr r3, [%[a], #4]\n\t"
  129401. #ifdef WOLFSSL_KEIL
  129402. "sbcs r2, r2, r4\n\t"
  129403. #elif defined(__clang__)
  129404. "sbcs r2, r4\n\t"
  129405. #else
  129406. "sbc r2, r4\n\t"
  129407. #endif
  129408. #ifdef WOLFSSL_KEIL
  129409. "sbcs r3, r3, r5\n\t"
  129410. #elif defined(__clang__)
  129411. "sbcs r3, r5\n\t"
  129412. #else
  129413. "sbc r3, r5\n\t"
  129414. #endif
  129415. "stm %[a]!, {r2, r3}\n\t"
  129416. "ldm %[b]!, {r4, r5}\n\t"
  129417. "ldr r2, [%[a]]\n\t"
  129418. "ldr r3, [%[a], #4]\n\t"
  129419. #ifdef WOLFSSL_KEIL
  129420. "sbcs r2, r2, r4\n\t"
  129421. #elif defined(__clang__)
  129422. "sbcs r2, r4\n\t"
  129423. #else
  129424. "sbc r2, r4\n\t"
  129425. #endif
  129426. #ifdef WOLFSSL_KEIL
  129427. "sbcs r3, r3, r5\n\t"
  129428. #elif defined(__clang__)
  129429. "sbcs r3, r5\n\t"
  129430. #else
  129431. "sbc r3, r5\n\t"
  129432. #endif
  129433. "stm %[a]!, {r2, r3}\n\t"
  129434. "ldm %[b]!, {r4, r5}\n\t"
  129435. "ldr r2, [%[a]]\n\t"
  129436. "ldr r3, [%[a], #4]\n\t"
  129437. #ifdef WOLFSSL_KEIL
  129438. "sbcs r2, r2, r4\n\t"
  129439. #elif defined(__clang__)
  129440. "sbcs r2, r4\n\t"
  129441. #else
  129442. "sbc r2, r4\n\t"
  129443. #endif
  129444. #ifdef WOLFSSL_KEIL
  129445. "sbcs r3, r3, r5\n\t"
  129446. #elif defined(__clang__)
  129447. "sbcs r3, r5\n\t"
  129448. #else
  129449. "sbc r3, r5\n\t"
  129450. #endif
  129451. "stm %[a]!, {r2, r3}\n\t"
  129452. "ldm %[b]!, {r4, r5}\n\t"
  129453. "ldr r2, [%[a]]\n\t"
  129454. "ldr r3, [%[a], #4]\n\t"
  129455. #ifdef WOLFSSL_KEIL
  129456. "sbcs r2, r2, r4\n\t"
  129457. #elif defined(__clang__)
  129458. "sbcs r2, r4\n\t"
  129459. #else
  129460. "sbc r2, r4\n\t"
  129461. #endif
  129462. #ifdef WOLFSSL_KEIL
  129463. "sbcs r3, r3, r5\n\t"
  129464. #elif defined(__clang__)
  129465. "sbcs r3, r5\n\t"
  129466. #else
  129467. "sbc r3, r5\n\t"
  129468. #endif
  129469. "stm %[a]!, {r2, r3}\n\t"
  129470. "ldm %[b]!, {r4, r5}\n\t"
  129471. "ldr r2, [%[a]]\n\t"
  129472. "ldr r3, [%[a], #4]\n\t"
  129473. #ifdef WOLFSSL_KEIL
  129474. "sbcs r2, r2, r4\n\t"
  129475. #elif defined(__clang__)
  129476. "sbcs r2, r4\n\t"
  129477. #else
  129478. "sbc r2, r4\n\t"
  129479. #endif
  129480. #ifdef WOLFSSL_KEIL
  129481. "sbcs r3, r3, r5\n\t"
  129482. #elif defined(__clang__)
  129483. "sbcs r3, r5\n\t"
  129484. #else
  129485. "sbc r3, r5\n\t"
  129486. #endif
  129487. "stm %[a]!, {r2, r3}\n\t"
  129488. "ldr r4, [%[b]]\n\t"
  129489. "ldr r2, [%[a]]\n\t"
  129490. #ifdef WOLFSSL_KEIL
  129491. "sbcs r2, r2, r4\n\t"
  129492. #elif defined(__clang__)
  129493. "sbcs r2, r4\n\t"
  129494. #else
  129495. "sbc r2, r4\n\t"
  129496. #endif
  129497. "str r2, [%[a]]\n\t"
  129498. #ifdef WOLFSSL_KEIL
  129499. "sbcs %[a], %[a], %[a]\n\t"
  129500. #elif defined(__clang__)
  129501. "sbcs %[a], %[a]\n\t"
  129502. #else
  129503. "sbc %[a], %[a]\n\t"
  129504. #endif
  129505. : [a] "+l" (a), [b] "+l" (b)
  129506. :
  129507. : "memory", "r2", "r3", "r4", "r5"
  129508. );
  129509. return (uint32_t)(size_t)a;
  129510. }
  129511. #endif /* WOLFSSL_SP_SMALL */
  129512. /* Mul a by digit b into r. (r = a * b)
  129513. *
  129514. * r A single precision integer.
  129515. * a A single precision integer.
  129516. * b A single precision digit.
  129517. */
  129518. SP_NOINLINE static void sp_521_mul_d_17(sp_digit* r, const sp_digit* a,
  129519. sp_digit b)
  129520. {
  129521. __asm__ __volatile__ (
  129522. "movs r6, #0x44\n\t"
  129523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129524. "adds r6, r6, %[a]\n\t"
  129525. #else
  129526. "add r6, r6, %[a]\n\t"
  129527. #endif
  129528. "mov r8, %[r]\n\t"
  129529. "mov r9, r6\n\t"
  129530. "movs r3, #0\n\t"
  129531. "movs r4, #0\n\t"
  129532. "\n"
  129533. "L_sp_521_mul_d_17_%=:\n\t"
  129534. "movs %[r], #0\n\t"
  129535. "movs r5, #0\n\t"
  129536. "# A[] * B\n\t"
  129537. "ldrh r6, [%[a]]\n\t"
  129538. "uxth r7, %[b]\n\t"
  129539. #ifdef WOLFSSL_KEIL
  129540. "muls r7, r6, r7\n\t"
  129541. #elif defined(__clang__)
  129542. "muls r7, r6\n\t"
  129543. #else
  129544. "mul r7, r6\n\t"
  129545. #endif
  129546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129547. "adds r3, r3, r7\n\t"
  129548. #else
  129549. "add r3, r3, r7\n\t"
  129550. #endif
  129551. #ifdef WOLFSSL_KEIL
  129552. "adcs r4, r4, %[r]\n\t"
  129553. #elif defined(__clang__)
  129554. "adcs r4, %[r]\n\t"
  129555. #else
  129556. "adc r4, %[r]\n\t"
  129557. #endif
  129558. #ifdef WOLFSSL_KEIL
  129559. "adcs r5, r5, %[r]\n\t"
  129560. #elif defined(__clang__)
  129561. "adcs r5, %[r]\n\t"
  129562. #else
  129563. "adc r5, %[r]\n\t"
  129564. #endif
  129565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129566. "lsrs r7, %[b], #16\n\t"
  129567. #else
  129568. "lsr r7, %[b], #16\n\t"
  129569. #endif
  129570. #ifdef WOLFSSL_KEIL
  129571. "muls r6, r7, r6\n\t"
  129572. #elif defined(__clang__)
  129573. "muls r6, r7\n\t"
  129574. #else
  129575. "mul r6, r7\n\t"
  129576. #endif
  129577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129578. "lsrs r7, r6, #16\n\t"
  129579. #else
  129580. "lsr r7, r6, #16\n\t"
  129581. #endif
  129582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129583. "lsls r6, r6, #16\n\t"
  129584. #else
  129585. "lsl r6, r6, #16\n\t"
  129586. #endif
  129587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129588. "adds r3, r3, r6\n\t"
  129589. #else
  129590. "add r3, r3, r6\n\t"
  129591. #endif
  129592. #ifdef WOLFSSL_KEIL
  129593. "adcs r4, r4, r7\n\t"
  129594. #elif defined(__clang__)
  129595. "adcs r4, r7\n\t"
  129596. #else
  129597. "adc r4, r7\n\t"
  129598. #endif
  129599. #ifdef WOLFSSL_KEIL
  129600. "adcs r5, r5, %[r]\n\t"
  129601. #elif defined(__clang__)
  129602. "adcs r5, %[r]\n\t"
  129603. #else
  129604. "adc r5, %[r]\n\t"
  129605. #endif
  129606. "ldr r6, [%[a]]\n\t"
  129607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129608. "lsrs r6, r6, #16\n\t"
  129609. #else
  129610. "lsr r6, r6, #16\n\t"
  129611. #endif
  129612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129613. "lsrs r7, %[b], #16\n\t"
  129614. #else
  129615. "lsr r7, %[b], #16\n\t"
  129616. #endif
  129617. #ifdef WOLFSSL_KEIL
  129618. "muls r7, r6, r7\n\t"
  129619. #elif defined(__clang__)
  129620. "muls r7, r6\n\t"
  129621. #else
  129622. "mul r7, r6\n\t"
  129623. #endif
  129624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129625. "adds r4, r4, r7\n\t"
  129626. #else
  129627. "add r4, r4, r7\n\t"
  129628. #endif
  129629. #ifdef WOLFSSL_KEIL
  129630. "adcs r5, r5, %[r]\n\t"
  129631. #elif defined(__clang__)
  129632. "adcs r5, %[r]\n\t"
  129633. #else
  129634. "adc r5, %[r]\n\t"
  129635. #endif
  129636. "uxth r7, %[b]\n\t"
  129637. #ifdef WOLFSSL_KEIL
  129638. "muls r6, r7, r6\n\t"
  129639. #elif defined(__clang__)
  129640. "muls r6, r7\n\t"
  129641. #else
  129642. "mul r6, r7\n\t"
  129643. #endif
  129644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129645. "lsrs r7, r6, #16\n\t"
  129646. #else
  129647. "lsr r7, r6, #16\n\t"
  129648. #endif
  129649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129650. "lsls r6, r6, #16\n\t"
  129651. #else
  129652. "lsl r6, r6, #16\n\t"
  129653. #endif
  129654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129655. "adds r3, r3, r6\n\t"
  129656. #else
  129657. "add r3, r3, r6\n\t"
  129658. #endif
  129659. #ifdef WOLFSSL_KEIL
  129660. "adcs r4, r4, r7\n\t"
  129661. #elif defined(__clang__)
  129662. "adcs r4, r7\n\t"
  129663. #else
  129664. "adc r4, r7\n\t"
  129665. #endif
  129666. #ifdef WOLFSSL_KEIL
  129667. "adcs r5, r5, %[r]\n\t"
  129668. #elif defined(__clang__)
  129669. "adcs r5, %[r]\n\t"
  129670. #else
  129671. "adc r5, %[r]\n\t"
  129672. #endif
  129673. "# A[] * B - Done\n\t"
  129674. "mov %[r], r8\n\t"
  129675. "str r3, [%[r]]\n\t"
  129676. "movs r3, r4\n\t"
  129677. "movs r4, r5\n\t"
  129678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129679. "adds %[r], %[r], #4\n\t"
  129680. #else
  129681. "add %[r], %[r], #4\n\t"
  129682. #endif
  129683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129684. "adds %[a], %[a], #4\n\t"
  129685. #else
  129686. "add %[a], %[a], #4\n\t"
  129687. #endif
  129688. "mov r8, %[r]\n\t"
  129689. "cmp %[a], r9\n\t"
  129690. "blt L_sp_521_mul_d_17_%=\n\t"
  129691. "str r3, [%[r]]\n\t"
  129692. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  129693. :
  129694. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  129695. );
  129696. }
  129697. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  129698. *
  129699. * d1 The high order half of the number to divide.
  129700. * d0 The low order half of the number to divide.
  129701. * div The divisor.
  129702. * returns the result of the division.
  129703. *
  129704. * Note that this is an approximate div. It may give an answer 1 larger.
  129705. */
  129706. SP_NOINLINE static sp_digit div_521_word_17(sp_digit d1, sp_digit d0,
  129707. sp_digit div)
  129708. {
  129709. __asm__ __volatile__ (
  129710. "movs r3, #0\n\t"
  129711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129712. "lsrs r5, %[div], #1\n\t"
  129713. #else
  129714. "lsr r5, %[div], #1\n\t"
  129715. #endif
  129716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129717. "adds r5, r5, #1\n\t"
  129718. #else
  129719. "add r5, r5, #1\n\t"
  129720. #endif
  129721. "mov r8, %[d0]\n\t"
  129722. "mov r9, %[d1]\n\t"
  129723. "# Do top 32\n\t"
  129724. "movs r6, r5\n\t"
  129725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129726. "subs r6, r6, %[d1]\n\t"
  129727. #else
  129728. "sub r6, r6, %[d1]\n\t"
  129729. #endif
  129730. #ifdef WOLFSSL_KEIL
  129731. "sbcs r6, r6, r6\n\t"
  129732. #elif defined(__clang__)
  129733. "sbcs r6, r6\n\t"
  129734. #else
  129735. "sbc r6, r6\n\t"
  129736. #endif
  129737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129738. "adds r3, r3, r3\n\t"
  129739. #else
  129740. "add r3, r3, r3\n\t"
  129741. #endif
  129742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129743. "subs r3, r3, r6\n\t"
  129744. #else
  129745. "sub r3, r3, r6\n\t"
  129746. #endif
  129747. #ifdef WOLFSSL_KEIL
  129748. "ands r6, r6, r5\n\t"
  129749. #elif defined(__clang__)
  129750. "ands r6, r5\n\t"
  129751. #else
  129752. "and r6, r5\n\t"
  129753. #endif
  129754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129755. "subs %[d1], %[d1], r6\n\t"
  129756. #else
  129757. "sub %[d1], %[d1], r6\n\t"
  129758. #endif
  129759. "movs r4, #29\n\t"
  129760. "\n"
  129761. "L_div_521_word_17_loop_%=:\n\t"
  129762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129763. "lsls %[d0], %[d0], #1\n\t"
  129764. #else
  129765. "lsl %[d0], %[d0], #1\n\t"
  129766. #endif
  129767. #ifdef WOLFSSL_KEIL
  129768. "adcs %[d1], %[d1], %[d1]\n\t"
  129769. #elif defined(__clang__)
  129770. "adcs %[d1], %[d1]\n\t"
  129771. #else
  129772. "adc %[d1], %[d1]\n\t"
  129773. #endif
  129774. "movs r6, r5\n\t"
  129775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129776. "subs r6, r6, %[d1]\n\t"
  129777. #else
  129778. "sub r6, r6, %[d1]\n\t"
  129779. #endif
  129780. #ifdef WOLFSSL_KEIL
  129781. "sbcs r6, r6, r6\n\t"
  129782. #elif defined(__clang__)
  129783. "sbcs r6, r6\n\t"
  129784. #else
  129785. "sbc r6, r6\n\t"
  129786. #endif
  129787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129788. "adds r3, r3, r3\n\t"
  129789. #else
  129790. "add r3, r3, r3\n\t"
  129791. #endif
  129792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129793. "subs r3, r3, r6\n\t"
  129794. #else
  129795. "sub r3, r3, r6\n\t"
  129796. #endif
  129797. #ifdef WOLFSSL_KEIL
  129798. "ands r6, r6, r5\n\t"
  129799. #elif defined(__clang__)
  129800. "ands r6, r5\n\t"
  129801. #else
  129802. "and r6, r5\n\t"
  129803. #endif
  129804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129805. "subs %[d1], %[d1], r6\n\t"
  129806. #else
  129807. "sub %[d1], %[d1], r6\n\t"
  129808. #endif
  129809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129810. "subs r4, r4, #1\n\t"
  129811. #else
  129812. "sub r4, r4, #1\n\t"
  129813. #endif
  129814. "bpl L_div_521_word_17_loop_%=\n\t"
  129815. "movs r7, #0\n\t"
  129816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129817. "adds r3, r3, r3\n\t"
  129818. #else
  129819. "add r3, r3, r3\n\t"
  129820. #endif
  129821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129822. "adds r3, r3, #1\n\t"
  129823. #else
  129824. "add r3, r3, #1\n\t"
  129825. #endif
  129826. "# r * div - Start\n\t"
  129827. "uxth %[d1], r3\n\t"
  129828. "uxth r4, %[div]\n\t"
  129829. #ifdef WOLFSSL_KEIL
  129830. "muls r4, %[d1], r4\n\t"
  129831. #elif defined(__clang__)
  129832. "muls r4, %[d1]\n\t"
  129833. #else
  129834. "mul r4, %[d1]\n\t"
  129835. #endif
  129836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129837. "lsrs r6, %[div], #16\n\t"
  129838. #else
  129839. "lsr r6, %[div], #16\n\t"
  129840. #endif
  129841. #ifdef WOLFSSL_KEIL
  129842. "muls %[d1], r6, %[d1]\n\t"
  129843. #elif defined(__clang__)
  129844. "muls %[d1], r6\n\t"
  129845. #else
  129846. "mul %[d1], r6\n\t"
  129847. #endif
  129848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129849. "lsrs r5, %[d1], #16\n\t"
  129850. #else
  129851. "lsr r5, %[d1], #16\n\t"
  129852. #endif
  129853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129854. "lsls %[d1], %[d1], #16\n\t"
  129855. #else
  129856. "lsl %[d1], %[d1], #16\n\t"
  129857. #endif
  129858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129859. "adds r4, r4, %[d1]\n\t"
  129860. #else
  129861. "add r4, r4, %[d1]\n\t"
  129862. #endif
  129863. #ifdef WOLFSSL_KEIL
  129864. "adcs r5, r5, r7\n\t"
  129865. #elif defined(__clang__)
  129866. "adcs r5, r7\n\t"
  129867. #else
  129868. "adc r5, r7\n\t"
  129869. #endif
  129870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129871. "lsrs %[d1], r3, #16\n\t"
  129872. #else
  129873. "lsr %[d1], r3, #16\n\t"
  129874. #endif
  129875. #ifdef WOLFSSL_KEIL
  129876. "muls r6, %[d1], r6\n\t"
  129877. #elif defined(__clang__)
  129878. "muls r6, %[d1]\n\t"
  129879. #else
  129880. "mul r6, %[d1]\n\t"
  129881. #endif
  129882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129883. "adds r5, r5, r6\n\t"
  129884. #else
  129885. "add r5, r5, r6\n\t"
  129886. #endif
  129887. "uxth r6, %[div]\n\t"
  129888. #ifdef WOLFSSL_KEIL
  129889. "muls %[d1], r6, %[d1]\n\t"
  129890. #elif defined(__clang__)
  129891. "muls %[d1], r6\n\t"
  129892. #else
  129893. "mul %[d1], r6\n\t"
  129894. #endif
  129895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129896. "lsrs r6, %[d1], #16\n\t"
  129897. #else
  129898. "lsr r6, %[d1], #16\n\t"
  129899. #endif
  129900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129901. "lsls %[d1], %[d1], #16\n\t"
  129902. #else
  129903. "lsl %[d1], %[d1], #16\n\t"
  129904. #endif
  129905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129906. "adds r4, r4, %[d1]\n\t"
  129907. #else
  129908. "add r4, r4, %[d1]\n\t"
  129909. #endif
  129910. #ifdef WOLFSSL_KEIL
  129911. "adcs r5, r5, r6\n\t"
  129912. #elif defined(__clang__)
  129913. "adcs r5, r6\n\t"
  129914. #else
  129915. "adc r5, r6\n\t"
  129916. #endif
  129917. "# r * div - Done\n\t"
  129918. "mov %[d1], r8\n\t"
  129919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129920. "subs %[d1], %[d1], r4\n\t"
  129921. #else
  129922. "sub %[d1], %[d1], r4\n\t"
  129923. #endif
  129924. "movs r4, %[d1]\n\t"
  129925. "mov %[d1], r9\n\t"
  129926. #ifdef WOLFSSL_KEIL
  129927. "sbcs %[d1], %[d1], r5\n\t"
  129928. #elif defined(__clang__)
  129929. "sbcs %[d1], r5\n\t"
  129930. #else
  129931. "sbc %[d1], r5\n\t"
  129932. #endif
  129933. "movs r5, %[d1]\n\t"
  129934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129935. "adds r3, r3, r5\n\t"
  129936. #else
  129937. "add r3, r3, r5\n\t"
  129938. #endif
  129939. "# r * div - Start\n\t"
  129940. "uxth %[d1], r3\n\t"
  129941. "uxth r4, %[div]\n\t"
  129942. #ifdef WOLFSSL_KEIL
  129943. "muls r4, %[d1], r4\n\t"
  129944. #elif defined(__clang__)
  129945. "muls r4, %[d1]\n\t"
  129946. #else
  129947. "mul r4, %[d1]\n\t"
  129948. #endif
  129949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129950. "lsrs r6, %[div], #16\n\t"
  129951. #else
  129952. "lsr r6, %[div], #16\n\t"
  129953. #endif
  129954. #ifdef WOLFSSL_KEIL
  129955. "muls %[d1], r6, %[d1]\n\t"
  129956. #elif defined(__clang__)
  129957. "muls %[d1], r6\n\t"
  129958. #else
  129959. "mul %[d1], r6\n\t"
  129960. #endif
  129961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129962. "lsrs r5, %[d1], #16\n\t"
  129963. #else
  129964. "lsr r5, %[d1], #16\n\t"
  129965. #endif
  129966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129967. "lsls %[d1], %[d1], #16\n\t"
  129968. #else
  129969. "lsl %[d1], %[d1], #16\n\t"
  129970. #endif
  129971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129972. "adds r4, r4, %[d1]\n\t"
  129973. #else
  129974. "add r4, r4, %[d1]\n\t"
  129975. #endif
  129976. #ifdef WOLFSSL_KEIL
  129977. "adcs r5, r5, r7\n\t"
  129978. #elif defined(__clang__)
  129979. "adcs r5, r7\n\t"
  129980. #else
  129981. "adc r5, r7\n\t"
  129982. #endif
  129983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129984. "lsrs %[d1], r3, #16\n\t"
  129985. #else
  129986. "lsr %[d1], r3, #16\n\t"
  129987. #endif
  129988. #ifdef WOLFSSL_KEIL
  129989. "muls r6, %[d1], r6\n\t"
  129990. #elif defined(__clang__)
  129991. "muls r6, %[d1]\n\t"
  129992. #else
  129993. "mul r6, %[d1]\n\t"
  129994. #endif
  129995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129996. "adds r5, r5, r6\n\t"
  129997. #else
  129998. "add r5, r5, r6\n\t"
  129999. #endif
  130000. "uxth r6, %[div]\n\t"
  130001. #ifdef WOLFSSL_KEIL
  130002. "muls %[d1], r6, %[d1]\n\t"
  130003. #elif defined(__clang__)
  130004. "muls %[d1], r6\n\t"
  130005. #else
  130006. "mul %[d1], r6\n\t"
  130007. #endif
  130008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130009. "lsrs r6, %[d1], #16\n\t"
  130010. #else
  130011. "lsr r6, %[d1], #16\n\t"
  130012. #endif
  130013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130014. "lsls %[d1], %[d1], #16\n\t"
  130015. #else
  130016. "lsl %[d1], %[d1], #16\n\t"
  130017. #endif
  130018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130019. "adds r4, r4, %[d1]\n\t"
  130020. #else
  130021. "add r4, r4, %[d1]\n\t"
  130022. #endif
  130023. #ifdef WOLFSSL_KEIL
  130024. "adcs r5, r5, r6\n\t"
  130025. #elif defined(__clang__)
  130026. "adcs r5, r6\n\t"
  130027. #else
  130028. "adc r5, r6\n\t"
  130029. #endif
  130030. "# r * div - Done\n\t"
  130031. "mov %[d1], r8\n\t"
  130032. "mov r6, r9\n\t"
  130033. #ifdef WOLFSSL_KEIL
  130034. "subs r4, %[d1], r4\n\t"
  130035. #else
  130036. #ifdef __clang__
  130037. "subs r4, %[d1], r4\n\t"
  130038. #else
  130039. "sub r4, %[d1], r4\n\t"
  130040. #endif
  130041. #endif
  130042. #ifdef WOLFSSL_KEIL
  130043. "sbcs r6, r6, r5\n\t"
  130044. #elif defined(__clang__)
  130045. "sbcs r6, r5\n\t"
  130046. #else
  130047. "sbc r6, r5\n\t"
  130048. #endif
  130049. "movs r5, r6\n\t"
  130050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130051. "adds r3, r3, r5\n\t"
  130052. #else
  130053. "add r3, r3, r5\n\t"
  130054. #endif
  130055. "# r * div - Start\n\t"
  130056. "uxth %[d1], r3\n\t"
  130057. "uxth r4, %[div]\n\t"
  130058. #ifdef WOLFSSL_KEIL
  130059. "muls r4, %[d1], r4\n\t"
  130060. #elif defined(__clang__)
  130061. "muls r4, %[d1]\n\t"
  130062. #else
  130063. "mul r4, %[d1]\n\t"
  130064. #endif
  130065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130066. "lsrs r6, %[div], #16\n\t"
  130067. #else
  130068. "lsr r6, %[div], #16\n\t"
  130069. #endif
  130070. #ifdef WOLFSSL_KEIL
  130071. "muls %[d1], r6, %[d1]\n\t"
  130072. #elif defined(__clang__)
  130073. "muls %[d1], r6\n\t"
  130074. #else
  130075. "mul %[d1], r6\n\t"
  130076. #endif
  130077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130078. "lsrs r5, %[d1], #16\n\t"
  130079. #else
  130080. "lsr r5, %[d1], #16\n\t"
  130081. #endif
  130082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130083. "lsls %[d1], %[d1], #16\n\t"
  130084. #else
  130085. "lsl %[d1], %[d1], #16\n\t"
  130086. #endif
  130087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130088. "adds r4, r4, %[d1]\n\t"
  130089. #else
  130090. "add r4, r4, %[d1]\n\t"
  130091. #endif
  130092. #ifdef WOLFSSL_KEIL
  130093. "adcs r5, r5, r7\n\t"
  130094. #elif defined(__clang__)
  130095. "adcs r5, r7\n\t"
  130096. #else
  130097. "adc r5, r7\n\t"
  130098. #endif
  130099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130100. "lsrs %[d1], r3, #16\n\t"
  130101. #else
  130102. "lsr %[d1], r3, #16\n\t"
  130103. #endif
  130104. #ifdef WOLFSSL_KEIL
  130105. "muls r6, %[d1], r6\n\t"
  130106. #elif defined(__clang__)
  130107. "muls r6, %[d1]\n\t"
  130108. #else
  130109. "mul r6, %[d1]\n\t"
  130110. #endif
  130111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130112. "adds r5, r5, r6\n\t"
  130113. #else
  130114. "add r5, r5, r6\n\t"
  130115. #endif
  130116. "uxth r6, %[div]\n\t"
  130117. #ifdef WOLFSSL_KEIL
  130118. "muls %[d1], r6, %[d1]\n\t"
  130119. #elif defined(__clang__)
  130120. "muls %[d1], r6\n\t"
  130121. #else
  130122. "mul %[d1], r6\n\t"
  130123. #endif
  130124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130125. "lsrs r6, %[d1], #16\n\t"
  130126. #else
  130127. "lsr r6, %[d1], #16\n\t"
  130128. #endif
  130129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130130. "lsls %[d1], %[d1], #16\n\t"
  130131. #else
  130132. "lsl %[d1], %[d1], #16\n\t"
  130133. #endif
  130134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130135. "adds r4, r4, %[d1]\n\t"
  130136. #else
  130137. "add r4, r4, %[d1]\n\t"
  130138. #endif
  130139. #ifdef WOLFSSL_KEIL
  130140. "adcs r5, r5, r6\n\t"
  130141. #elif defined(__clang__)
  130142. "adcs r5, r6\n\t"
  130143. #else
  130144. "adc r5, r6\n\t"
  130145. #endif
  130146. "# r * div - Done\n\t"
  130147. "mov %[d1], r8\n\t"
  130148. "mov r6, r9\n\t"
  130149. #ifdef WOLFSSL_KEIL
  130150. "subs r4, %[d1], r4\n\t"
  130151. #else
  130152. #ifdef __clang__
  130153. "subs r4, %[d1], r4\n\t"
  130154. #else
  130155. "sub r4, %[d1], r4\n\t"
  130156. #endif
  130157. #endif
  130158. #ifdef WOLFSSL_KEIL
  130159. "sbcs r6, r6, r5\n\t"
  130160. #elif defined(__clang__)
  130161. "sbcs r6, r5\n\t"
  130162. #else
  130163. "sbc r6, r5\n\t"
  130164. #endif
  130165. "movs r5, r6\n\t"
  130166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130167. "adds r3, r3, r5\n\t"
  130168. #else
  130169. "add r3, r3, r5\n\t"
  130170. #endif
  130171. "# r * div - Start\n\t"
  130172. "uxth %[d1], r3\n\t"
  130173. "uxth r4, %[div]\n\t"
  130174. #ifdef WOLFSSL_KEIL
  130175. "muls r4, %[d1], r4\n\t"
  130176. #elif defined(__clang__)
  130177. "muls r4, %[d1]\n\t"
  130178. #else
  130179. "mul r4, %[d1]\n\t"
  130180. #endif
  130181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130182. "lsrs r6, %[div], #16\n\t"
  130183. #else
  130184. "lsr r6, %[div], #16\n\t"
  130185. #endif
  130186. #ifdef WOLFSSL_KEIL
  130187. "muls %[d1], r6, %[d1]\n\t"
  130188. #elif defined(__clang__)
  130189. "muls %[d1], r6\n\t"
  130190. #else
  130191. "mul %[d1], r6\n\t"
  130192. #endif
  130193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130194. "lsrs r5, %[d1], #16\n\t"
  130195. #else
  130196. "lsr r5, %[d1], #16\n\t"
  130197. #endif
  130198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130199. "lsls %[d1], %[d1], #16\n\t"
  130200. #else
  130201. "lsl %[d1], %[d1], #16\n\t"
  130202. #endif
  130203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130204. "adds r4, r4, %[d1]\n\t"
  130205. #else
  130206. "add r4, r4, %[d1]\n\t"
  130207. #endif
  130208. #ifdef WOLFSSL_KEIL
  130209. "adcs r5, r5, r7\n\t"
  130210. #elif defined(__clang__)
  130211. "adcs r5, r7\n\t"
  130212. #else
  130213. "adc r5, r7\n\t"
  130214. #endif
  130215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130216. "lsrs %[d1], r3, #16\n\t"
  130217. #else
  130218. "lsr %[d1], r3, #16\n\t"
  130219. #endif
  130220. #ifdef WOLFSSL_KEIL
  130221. "muls r6, %[d1], r6\n\t"
  130222. #elif defined(__clang__)
  130223. "muls r6, %[d1]\n\t"
  130224. #else
  130225. "mul r6, %[d1]\n\t"
  130226. #endif
  130227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130228. "adds r5, r5, r6\n\t"
  130229. #else
  130230. "add r5, r5, r6\n\t"
  130231. #endif
  130232. "uxth r6, %[div]\n\t"
  130233. #ifdef WOLFSSL_KEIL
  130234. "muls %[d1], r6, %[d1]\n\t"
  130235. #elif defined(__clang__)
  130236. "muls %[d1], r6\n\t"
  130237. #else
  130238. "mul %[d1], r6\n\t"
  130239. #endif
  130240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130241. "lsrs r6, %[d1], #16\n\t"
  130242. #else
  130243. "lsr r6, %[d1], #16\n\t"
  130244. #endif
  130245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130246. "lsls %[d1], %[d1], #16\n\t"
  130247. #else
  130248. "lsl %[d1], %[d1], #16\n\t"
  130249. #endif
  130250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130251. "adds r4, r4, %[d1]\n\t"
  130252. #else
  130253. "add r4, r4, %[d1]\n\t"
  130254. #endif
  130255. #ifdef WOLFSSL_KEIL
  130256. "adcs r5, r5, r6\n\t"
  130257. #elif defined(__clang__)
  130258. "adcs r5, r6\n\t"
  130259. #else
  130260. "adc r5, r6\n\t"
  130261. #endif
  130262. "# r * div - Done\n\t"
  130263. "mov %[d1], r8\n\t"
  130264. "mov r6, r9\n\t"
  130265. #ifdef WOLFSSL_KEIL
  130266. "subs r4, %[d1], r4\n\t"
  130267. #else
  130268. #ifdef __clang__
  130269. "subs r4, %[d1], r4\n\t"
  130270. #else
  130271. "sub r4, %[d1], r4\n\t"
  130272. #endif
  130273. #endif
  130274. #ifdef WOLFSSL_KEIL
  130275. "sbcs r6, r6, r5\n\t"
  130276. #elif defined(__clang__)
  130277. "sbcs r6, r5\n\t"
  130278. #else
  130279. "sbc r6, r5\n\t"
  130280. #endif
  130281. "movs r5, r6\n\t"
  130282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130283. "adds r3, r3, r5\n\t"
  130284. #else
  130285. "add r3, r3, r5\n\t"
  130286. #endif
  130287. "movs r6, %[div]\n\t"
  130288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130289. "subs r6, r6, r4\n\t"
  130290. #else
  130291. "sub r6, r6, r4\n\t"
  130292. #endif
  130293. #ifdef WOLFSSL_KEIL
  130294. "sbcs r6, r6, r6\n\t"
  130295. #elif defined(__clang__)
  130296. "sbcs r6, r6\n\t"
  130297. #else
  130298. "sbc r6, r6\n\t"
  130299. #endif
  130300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130301. "subs r3, r3, r6\n\t"
  130302. #else
  130303. "sub r3, r3, r6\n\t"
  130304. #endif
  130305. "movs %[d1], r3\n\t"
  130306. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  130307. :
  130308. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  130309. );
  130310. return (uint32_t)(size_t)d1;
  130311. }
  130312. /* AND m into each word of a and store in r.
  130313. *
  130314. * r A single precision integer.
  130315. * a A single precision integer.
  130316. * m Mask to AND against each digit.
  130317. */
  130318. static void sp_521_mask_17(sp_digit* r, const sp_digit* a, sp_digit m)
  130319. {
  130320. #ifdef WOLFSSL_SP_SMALL
  130321. int i;
  130322. for (i=0; i<17; i++) {
  130323. r[i] = a[i] & m;
  130324. }
  130325. #else
  130326. int i;
  130327. for (i = 0; i < 16; i += 8) {
  130328. r[i+0] = a[i+0] & m;
  130329. r[i+1] = a[i+1] & m;
  130330. r[i+2] = a[i+2] & m;
  130331. r[i+3] = a[i+3] & m;
  130332. r[i+4] = a[i+4] & m;
  130333. r[i+5] = a[i+5] & m;
  130334. r[i+6] = a[i+6] & m;
  130335. r[i+7] = a[i+7] & m;
  130336. }
  130337. r[16] = a[16] & m;
  130338. #endif
  130339. }
  130340. /* Divide d in a and put remainder into r (m*d + r = a)
  130341. * m is not calculated as it is not needed at this time.
  130342. *
  130343. * a Number to be divided.
  130344. * d Number to divide with.
  130345. * m Multiplier result.
  130346. * r Remainder from the division.
  130347. * returns MP_OKAY indicating success.
  130348. */
  130349. static WC_INLINE int sp_521_div_17(const sp_digit* a, const sp_digit* d,
  130350. sp_digit* m, sp_digit* r)
  130351. {
  130352. sp_digit t1[35];
  130353. sp_digit t2[18];
  130354. sp_digit sd[18];
  130355. sp_digit div;
  130356. sp_digit r1;
  130357. int i;
  130358. ASSERT_SAVED_VECTOR_REGISTERS();
  130359. (void)m;
  130360. div = (d[16] << 23) | (d[15] >> 9);
  130361. XMEMCPY(t1, a, sizeof(*t1) * 2 * 17);
  130362. r1 = sp_521_cmp_17(&t1[17], d) >= 0;
  130363. sp_521_cond_sub_17(&t1[17], &t1[17], d, (sp_digit)0 - r1);
  130364. sp_521_lshift_17(sd, d, 23);
  130365. sp_521_lshift_34(t1, t1, 23);
  130366. for (i = 16; i >= 0; i--) {
  130367. sp_digit hi = t1[17 + i] - (t1[17 + i] == div);
  130368. r1 = div_521_word_17(hi, t1[17 + i - 1], div);
  130369. sp_521_mul_d_17(t2, sd, r1);
  130370. t1[17 + i] += sp_521_sub_in_place_17(&t1[i], t2);
  130371. t1[17 + i] -= t2[17];
  130372. sp_521_mask_17(t2, sd, t1[17 + i]);
  130373. t1[17 + i] += sp_521_add_17(&t1[i], &t1[i], t2);
  130374. sp_521_mask_17(t2, sd, t1[17 + i]);
  130375. t1[17 + i] += sp_521_add_17(&t1[i], &t1[i], t2);
  130376. }
  130377. r1 = sp_521_cmp_17(t1, sd) >= 0;
  130378. sp_521_cond_sub_17(r, t1, sd, (sp_digit)0 - r1);
  130379. sp_521_rshift_17(r, r, 23);
  130380. return MP_OKAY;
  130381. }
  130382. /* Reduce a modulo m into r. (r = a mod m)
  130383. *
  130384. * r A single precision number that is the reduced result.
  130385. * a A single precision number that is to be reduced.
  130386. * m A single precision number that is the modulus to reduce with.
  130387. * returns MP_OKAY indicating success.
  130388. */
  130389. static WC_INLINE int sp_521_mod_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  130390. {
  130391. int ret;
  130392. ret = sp_521_div_17(a, m, NULL, r);
  130393. return ret;
  130394. }
  130395. #endif
  130396. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  130397. /* Multiply two number mod the order of P521 curve. (r = a * b mod order)
  130398. *
  130399. * r Result of the multiplication.
  130400. * a First operand of the multiplication.
  130401. * b Second operand of the multiplication.
  130402. */
  130403. static void sp_521_mont_mul_order_17(sp_digit* r, const sp_digit* a, const sp_digit* b)
  130404. {
  130405. sp_521_mul_17(r, a, b);
  130406. sp_521_mont_reduce_order_17(r, p521_order, p521_mp_order);
  130407. }
  130408. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  130409. #ifdef WOLFSSL_SP_SMALL
  130410. /* Order-2 for the P521 curve. */
  130411. static const uint32_t p521_order_minus_2[17] = {
  130412. 0x91386407U,0xbb6fb71eU,0x899c47aeU,0x3bb5c9b8U,0xf709a5d0U,0x7fcc0148U,
  130413. 0xbf2f966bU,0x51868783U,0xfffffffaU,0xffffffffU,0xffffffffU,0xffffffffU,
  130414. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0x000001ffU
  130415. };
  130416. #else
  130417. /* The low half of the order-2 of the P521 curve. */
  130418. static const uint32_t p521_order_low[9] = {
  130419. 0x91386407U,0xbb6fb71eU,0x899c47aeU,0x3bb5c9b8U,0xf709a5d0U,0x7fcc0148U,
  130420. 0xbf2f966bU,0x51868783U,0xfffffffaU
  130421. };
  130422. #endif /* WOLFSSL_SP_SMALL */
  130423. /* Square number mod the order of P521 curve. (r = a * a mod order)
  130424. *
  130425. * r Result of the squaring.
  130426. * a Number to square.
  130427. */
  130428. static void sp_521_mont_sqr_order_17(sp_digit* r, const sp_digit* a)
  130429. {
  130430. sp_521_sqr_17(r, a);
  130431. sp_521_mont_reduce_order_17(r, p521_order, p521_mp_order);
  130432. }
  130433. #ifndef WOLFSSL_SP_SMALL
  130434. /* Square number mod the order of P521 curve a number of times.
  130435. * (r = a ^ n mod order)
  130436. *
  130437. * r Result of the squaring.
  130438. * a Number to square.
  130439. */
  130440. static void sp_521_mont_sqr_n_order_17(sp_digit* r, const sp_digit* a, int n)
  130441. {
  130442. int i;
  130443. sp_521_mont_sqr_order_17(r, a);
  130444. for (i=1; i<n; i++) {
  130445. sp_521_mont_sqr_order_17(r, r);
  130446. }
  130447. }
  130448. #endif /* !WOLFSSL_SP_SMALL */
  130449. /* Invert the number, in Montgomery form, modulo the order of the P521 curve.
  130450. * (r = 1 / a mod order)
  130451. *
  130452. * r Inverse result.
  130453. * a Number to invert.
  130454. * td Temporary data.
  130455. */
  130456. #ifdef WOLFSSL_SP_NONBLOCK
  130457. typedef struct sp_521_mont_inv_order_17_ctx {
  130458. int state;
  130459. int i;
  130460. } sp_521_mont_inv_order_17_ctx;
  130461. static int sp_521_mont_inv_order_17_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  130462. sp_digit* t)
  130463. {
  130464. int err = FP_WOULDBLOCK;
  130465. sp_521_mont_inv_order_17_ctx* ctx = (sp_521_mont_inv_order_17_ctx*)sp_ctx;
  130466. typedef char ctx_size_test[sizeof(sp_521_mont_inv_order_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  130467. (void)sizeof(ctx_size_test);
  130468. switch (ctx->state) {
  130469. case 0:
  130470. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  130471. ctx->i = 519;
  130472. ctx->state = 1;
  130473. break;
  130474. case 1:
  130475. sp_521_mont_sqr_order_17(t, t);
  130476. ctx->state = 2;
  130477. break;
  130478. case 2:
  130479. if ((p521_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  130480. sp_521_mont_mul_order_17(t, t, a);
  130481. }
  130482. ctx->i--;
  130483. ctx->state = (ctx->i == 0) ? 3 : 1;
  130484. break;
  130485. case 3:
  130486. XMEMCPY(r, t, sizeof(sp_digit) * 17U);
  130487. err = MP_OKAY;
  130488. break;
  130489. }
  130490. return err;
  130491. }
  130492. #endif /* WOLFSSL_SP_NONBLOCK */
  130493. static void sp_521_mont_inv_order_17(sp_digit* r, const sp_digit* a,
  130494. sp_digit* td)
  130495. {
  130496. #ifdef WOLFSSL_SP_SMALL
  130497. sp_digit* t = td;
  130498. int i;
  130499. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  130500. for (i=519; i>=0; i--) {
  130501. sp_521_mont_sqr_order_17(t, t);
  130502. if ((p521_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  130503. sp_521_mont_mul_order_17(t, t, a);
  130504. }
  130505. }
  130506. XMEMCPY(r, t, sizeof(sp_digit) * 17U);
  130507. #else
  130508. sp_digit* t = td;
  130509. sp_digit* t2 = td + 2 * 17;
  130510. sp_digit* t3 = td + 4 * 17;
  130511. int i;
  130512. /* t = a^2 */
  130513. sp_521_mont_sqr_order_17(t, a);
  130514. /* t = a^3 = t * a */
  130515. sp_521_mont_mul_order_17(t, t, a);
  130516. /* t= a^c = t ^ 2 ^ 2 */
  130517. sp_521_mont_sqr_n_order_17(t2, t, 2);
  130518. /* t = a^f = t2 * t */
  130519. sp_521_mont_mul_order_17(t, t2, t);
  130520. /* t3 = a^1e */
  130521. sp_521_mont_sqr_order_17(t3, t);
  130522. /* t3 = a^1f = t3 * a */
  130523. sp_521_mont_mul_order_17(t3, t3, a);
  130524. /* t2= a^f0 = t ^ 2 ^ 4 */
  130525. sp_521_mont_sqr_n_order_17(t2, t, 4);
  130526. /* t = a^ff = t2 * t */
  130527. sp_521_mont_mul_order_17(t, t2, t);
  130528. /* t2= a^ff00 = t ^ 2 ^ 8 */
  130529. sp_521_mont_sqr_n_order_17(t2, t, 8);
  130530. /* t3= a^ffff = t2 * t */
  130531. sp_521_mont_mul_order_17(t, t2, t);
  130532. /* t2= a^ffff0000 = t ^ 2 ^ 16 */
  130533. sp_521_mont_sqr_n_order_17(t2, t, 16);
  130534. /* t = a^ffffffff = t2 * t */
  130535. sp_521_mont_mul_order_17(t, t2, t);
  130536. /* t2= a^ffffffff00000000 = t ^ 2 ^ 32 */
  130537. sp_521_mont_sqr_n_order_17(t2, t, 32);
  130538. /* t = a^ffffffffffffffff = t2 * t */
  130539. sp_521_mont_mul_order_17(t, t2, t);
  130540. /* t2= a^ffffffffffffffff0000000000000000 = t ^ 2 ^ 64 */
  130541. sp_521_mont_sqr_n_order_17(t2, t, 64);
  130542. /* t = a^ffffffffffffffffffffffffffffffff = t2 * t */
  130543. sp_521_mont_mul_order_17(t, t2, t);
  130544. /* t2= a^ffffffffffffffffffffffffffffffff00000000000000000000000000000000 = t ^ 2 ^ 128 */
  130545. sp_521_mont_sqr_n_order_17(t2, t, 128);
  130546. /* t = a^ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff = t2 * t */
  130547. sp_521_mont_mul_order_17(t, t2, t);
  130548. /* t2 = a^1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0 */
  130549. sp_521_mont_sqr_n_order_17(t2, t, 5);
  130550. /* t2 = a^1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff = t * t3 */
  130551. sp_521_mont_mul_order_17(t2, t2, t3);
  130552. for (i=259; i>=1; i--) {
  130553. sp_521_mont_sqr_order_17(t2, t2);
  130554. if ((p521_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  130555. sp_521_mont_mul_order_17(t2, t2, a);
  130556. }
  130557. }
  130558. sp_521_mont_sqr_order_17(t2, t2);
  130559. sp_521_mont_mul_order_17(r, t2, a);
  130560. #endif /* WOLFSSL_SP_SMALL */
  130561. }
  130562. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  130563. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  130564. #ifdef HAVE_ECC_SIGN
  130565. #ifndef SP_ECC_MAX_SIG_GEN
  130566. #define SP_ECC_MAX_SIG_GEN 64
  130567. #endif
  130568. /* Calculate second signature value S from R, k and private value.
  130569. *
  130570. * s = (r * x + e) / k
  130571. *
  130572. * s Signature value.
  130573. * r First signature value.
  130574. * k Ephemeral private key.
  130575. * x Private key as a number.
  130576. * e Hash of message as a number.
  130577. * tmp Temporary storage for intermediate numbers.
  130578. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  130579. */
  130580. static int sp_521_calc_s_17(sp_digit* s, const sp_digit* r, sp_digit* k,
  130581. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  130582. {
  130583. int err;
  130584. sp_digit carry;
  130585. sp_int32 c;
  130586. sp_digit* kInv = k;
  130587. /* Conv k to Montgomery form (mod order) */
  130588. sp_521_mul_17(k, k, p521_norm_order);
  130589. err = sp_521_mod_17(k, k, p521_order);
  130590. if (err == MP_OKAY) {
  130591. sp_521_norm_17(k);
  130592. /* kInv = 1/k mod order */
  130593. sp_521_mont_inv_order_17(kInv, k, tmp);
  130594. sp_521_norm_17(kInv);
  130595. /* s = r * x + e */
  130596. sp_521_mul_17(x, x, r);
  130597. err = sp_521_mod_17(x, x, p521_order);
  130598. }
  130599. if (err == MP_OKAY) {
  130600. sp_521_norm_17(x);
  130601. carry = sp_521_add_17(s, e, x);
  130602. sp_521_cond_sub_17(s, s, p521_order, 0 - carry);
  130603. sp_521_norm_17(s);
  130604. c = sp_521_cmp_17(s, p521_order);
  130605. sp_521_cond_sub_17(s, s, p521_order,
  130606. (sp_digit)0 - (sp_digit)(c >= 0));
  130607. sp_521_norm_17(s);
  130608. /* s = s * k^-1 mod order */
  130609. sp_521_mont_mul_order_17(s, s, kInv);
  130610. sp_521_norm_17(s);
  130611. }
  130612. return err;
  130613. }
  130614. /* Sign the hash using the private key.
  130615. * e = [hash, 521 bits] from binary
  130616. * r = (k.G)->x mod order
  130617. * s = (r * x + e) / k mod order
  130618. * The hash is truncated to the first 521 bits.
  130619. *
  130620. * hash Hash to sign.
  130621. * hashLen Length of the hash data.
  130622. * rng Random number generator.
  130623. * priv Private part of key - scalar.
  130624. * rm First part of result as an mp_int.
  130625. * sm Sirst part of result as an mp_int.
  130626. * heap Heap to use for allocation.
  130627. * returns RNG failures, MEMORY_E when memory allocation fails and
  130628. * MP_OKAY on success.
  130629. */
  130630. int sp_ecc_sign_521(const byte* hash, word32 hashLen, WC_RNG* rng,
  130631. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  130632. {
  130633. #ifdef WOLFSSL_SP_SMALL_STACK
  130634. sp_digit* e = NULL;
  130635. sp_point_521* point = NULL;
  130636. #else
  130637. sp_digit e[7 * 2 * 17];
  130638. sp_point_521 point[1];
  130639. #endif
  130640. sp_digit* x = NULL;
  130641. sp_digit* k = NULL;
  130642. sp_digit* r = NULL;
  130643. sp_digit* tmp = NULL;
  130644. sp_digit* s = NULL;
  130645. sp_int32 c;
  130646. int err = MP_OKAY;
  130647. int i;
  130648. (void)heap;
  130649. #ifdef WOLFSSL_SP_SMALL_STACK
  130650. if (err == MP_OKAY) {
  130651. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  130652. DYNAMIC_TYPE_ECC);
  130653. if (point == NULL)
  130654. err = MEMORY_E;
  130655. }
  130656. if (err == MP_OKAY) {
  130657. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 17, heap,
  130658. DYNAMIC_TYPE_ECC);
  130659. if (e == NULL)
  130660. err = MEMORY_E;
  130661. }
  130662. #endif
  130663. if (err == MP_OKAY) {
  130664. x = e + 2 * 17;
  130665. k = e + 4 * 17;
  130666. r = e + 6 * 17;
  130667. tmp = e + 8 * 17;
  130668. s = e;
  130669. if (hashLen > 66U) {
  130670. hashLen = 66U;
  130671. }
  130672. }
  130673. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  130674. /* New random point. */
  130675. if (km == NULL || mp_iszero(km)) {
  130676. err = sp_521_ecc_gen_k_17(rng, k);
  130677. }
  130678. else {
  130679. sp_521_from_mp(k, 17, km);
  130680. mp_zero(km);
  130681. }
  130682. if (err == MP_OKAY) {
  130683. err = sp_521_ecc_mulmod_base_17(point, k, 1, 1, heap);
  130684. }
  130685. if (err == MP_OKAY) {
  130686. /* r = point->x mod order */
  130687. XMEMCPY(r, point->x, sizeof(sp_digit) * 17U);
  130688. sp_521_norm_17(r);
  130689. c = sp_521_cmp_17(r, p521_order);
  130690. sp_521_cond_sub_17(r, r, p521_order,
  130691. (sp_digit)0 - (sp_digit)(c >= 0));
  130692. sp_521_norm_17(r);
  130693. if (!sp_521_iszero_17(r)) {
  130694. /* x is modified in calculation of s. */
  130695. sp_521_from_mp(x, 17, priv);
  130696. /* s ptr == e ptr, e is modified in calculation of s. */
  130697. sp_521_from_bin(e, 17, hash, (int)hashLen);
  130698. /* Take 521 leftmost bits of hash. */
  130699. if (hashLen == 66U) {
  130700. sp_521_rshift_17(e, e, 7);
  130701. }
  130702. err = sp_521_calc_s_17(s, r, k, x, e, tmp);
  130703. /* Check that signature is usable. */
  130704. if ((err == MP_OKAY) && (!sp_521_iszero_17(s))) {
  130705. break;
  130706. }
  130707. }
  130708. }
  130709. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  130710. i = 1;
  130711. #endif
  130712. }
  130713. if (i == 0) {
  130714. err = RNG_FAILURE_E;
  130715. }
  130716. if (err == MP_OKAY) {
  130717. err = sp_521_to_mp(r, rm);
  130718. }
  130719. if (err == MP_OKAY) {
  130720. err = sp_521_to_mp(s, sm);
  130721. }
  130722. #ifdef WOLFSSL_SP_SMALL_STACK
  130723. if (e != NULL)
  130724. #endif
  130725. {
  130726. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 17);
  130727. #ifdef WOLFSSL_SP_SMALL_STACK
  130728. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  130729. #endif
  130730. }
  130731. #ifdef WOLFSSL_SP_SMALL_STACK
  130732. if (point != NULL)
  130733. #endif
  130734. {
  130735. ForceZero(point, sizeof(sp_point_521));
  130736. #ifdef WOLFSSL_SP_SMALL_STACK
  130737. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  130738. #endif
  130739. }
  130740. return err;
  130741. }
  130742. #ifdef WOLFSSL_SP_NONBLOCK
  130743. typedef struct sp_ecc_sign_521_ctx {
  130744. int state;
  130745. union {
  130746. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  130747. sp_521_mont_inv_order_17_ctx mont_inv_order_ctx;
  130748. };
  130749. sp_digit e[2*17];
  130750. sp_digit x[2*17];
  130751. sp_digit k[2*17];
  130752. sp_digit r[2*17];
  130753. sp_digit tmp[3 * 2*17];
  130754. sp_point_521 point;
  130755. sp_digit* s;
  130756. sp_digit* kInv;
  130757. int i;
  130758. } sp_ecc_sign_521_ctx;
  130759. int sp_ecc_sign_521_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  130760. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  130761. {
  130762. int err = FP_WOULDBLOCK;
  130763. sp_ecc_sign_521_ctx* ctx = (sp_ecc_sign_521_ctx*)sp_ctx->data;
  130764. typedef char ctx_size_test[sizeof(sp_ecc_sign_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  130765. (void)sizeof(ctx_size_test);
  130766. switch (ctx->state) {
  130767. case 0: /* INIT */
  130768. ctx->s = ctx->e;
  130769. ctx->kInv = ctx->k;
  130770. ctx->i = SP_ECC_MAX_SIG_GEN;
  130771. ctx->state = 1;
  130772. break;
  130773. case 1: /* GEN */
  130774. /* New random point. */
  130775. if (km == NULL || mp_iszero(km)) {
  130776. err = sp_521_ecc_gen_k_17(rng, ctx->k);
  130777. }
  130778. else {
  130779. sp_521_from_mp(ctx->k, 17, km);
  130780. mp_zero(km);
  130781. }
  130782. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  130783. ctx->state = 2;
  130784. break;
  130785. case 2: /* MULMOD */
  130786. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  130787. &ctx->point, &p521_base, ctx->k, 1, 1, heap);
  130788. if (err == MP_OKAY) {
  130789. ctx->state = 3;
  130790. }
  130791. break;
  130792. case 3: /* MODORDER */
  130793. {
  130794. sp_int32 c;
  130795. /* r = point->x mod order */
  130796. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 17U);
  130797. sp_521_norm_17(ctx->r);
  130798. c = sp_521_cmp_17(ctx->r, p521_order);
  130799. sp_521_cond_sub_17(ctx->r, ctx->r, p521_order,
  130800. (sp_digit)0 - (sp_digit)(c >= 0));
  130801. sp_521_norm_17(ctx->r);
  130802. if (hashLen > 66U) {
  130803. hashLen = 66U;
  130804. }
  130805. sp_521_from_mp(ctx->x, 17, priv);
  130806. sp_521_from_bin(ctx->e, 17, hash, (int)hashLen);
  130807. if (hashLen == 66U) {
  130808. sp_521_rshift_17(ctx->e, ctx->e, 7);
  130809. }
  130810. ctx->state = 4;
  130811. break;
  130812. }
  130813. case 4: /* KMODORDER */
  130814. /* Conv k to Montgomery form (mod order) */
  130815. sp_521_mul_17(ctx->k, ctx->k, p521_norm_order);
  130816. err = sp_521_mod_17(ctx->k, ctx->k, p521_order);
  130817. if (err == MP_OKAY) {
  130818. sp_521_norm_17(ctx->k);
  130819. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  130820. ctx->state = 5;
  130821. }
  130822. break;
  130823. case 5: /* KINV */
  130824. /* kInv = 1/k mod order */
  130825. err = sp_521_mont_inv_order_17_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  130826. if (err == MP_OKAY) {
  130827. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  130828. ctx->state = 6;
  130829. }
  130830. break;
  130831. case 6: /* KINVNORM */
  130832. sp_521_norm_17(ctx->kInv);
  130833. ctx->state = 7;
  130834. break;
  130835. case 7: /* R */
  130836. /* s = r * x + e */
  130837. sp_521_mul_17(ctx->x, ctx->x, ctx->r);
  130838. ctx->state = 8;
  130839. break;
  130840. case 8: /* S1 */
  130841. err = sp_521_mod_17(ctx->x, ctx->x, p521_order);
  130842. if (err == MP_OKAY)
  130843. ctx->state = 9;
  130844. break;
  130845. case 9: /* S2 */
  130846. {
  130847. sp_digit carry;
  130848. sp_int32 c;
  130849. sp_521_norm_17(ctx->x);
  130850. carry = sp_521_add_17(ctx->s, ctx->e, ctx->x);
  130851. sp_521_cond_sub_17(ctx->s, ctx->s,
  130852. p521_order, 0 - carry);
  130853. sp_521_norm_17(ctx->s);
  130854. c = sp_521_cmp_17(ctx->s, p521_order);
  130855. sp_521_cond_sub_17(ctx->s, ctx->s, p521_order,
  130856. (sp_digit)0 - (sp_digit)(c >= 0));
  130857. sp_521_norm_17(ctx->s);
  130858. /* s = s * k^-1 mod order */
  130859. sp_521_mont_mul_order_17(ctx->s, ctx->s, ctx->kInv);
  130860. sp_521_norm_17(ctx->s);
  130861. /* Check that signature is usable. */
  130862. if (sp_521_iszero_17(ctx->s) == 0) {
  130863. ctx->state = 10;
  130864. break;
  130865. }
  130866. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  130867. ctx->i = 1;
  130868. #endif
  130869. /* not usable gen, try again */
  130870. ctx->i--;
  130871. if (ctx->i == 0) {
  130872. err = RNG_FAILURE_E;
  130873. }
  130874. ctx->state = 1;
  130875. break;
  130876. }
  130877. case 10: /* RES */
  130878. err = sp_521_to_mp(ctx->r, rm);
  130879. if (err == MP_OKAY) {
  130880. err = sp_521_to_mp(ctx->s, sm);
  130881. }
  130882. break;
  130883. }
  130884. if (err == MP_OKAY && ctx->state != 10) {
  130885. err = FP_WOULDBLOCK;
  130886. }
  130887. if (err != FP_WOULDBLOCK) {
  130888. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 17U);
  130889. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 17U);
  130890. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 17U);
  130891. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 17U);
  130892. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 17U);
  130893. }
  130894. return err;
  130895. }
  130896. #endif /* WOLFSSL_SP_NONBLOCK */
  130897. #endif /* HAVE_ECC_SIGN */
  130898. #ifndef WOLFSSL_SP_SMALL
  130899. #ifdef WOLFSSL_SP_SMALL
  130900. /* Sub b from a into r. (r = a - b)
  130901. *
  130902. * r A single precision integer.
  130903. * a A single precision integer.
  130904. * b A single precision integer.
  130905. */
  130906. SP_NOINLINE static sp_digit sp_521_sub_17(sp_digit* r, const sp_digit* a,
  130907. const sp_digit* b)
  130908. {
  130909. __asm__ __volatile__ (
  130910. "movs r6, %[a]\n\t"
  130911. "movs r3, #0\n\t"
  130912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130913. "adds r6, r6, #0x44\n\t"
  130914. #else
  130915. "add r6, r6, #0x44\n\t"
  130916. #endif
  130917. "\n"
  130918. "L_sp_521_sub_17_word_%=:\n\t"
  130919. "movs r5, #0\n\t"
  130920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130921. "subs r5, r5, r3\n\t"
  130922. #else
  130923. "sub r5, r5, r3\n\t"
  130924. #endif
  130925. "ldr r4, [%[a]]\n\t"
  130926. "ldr r5, [%[b]]\n\t"
  130927. #ifdef WOLFSSL_KEIL
  130928. "sbcs r4, r4, r5\n\t"
  130929. #elif defined(__clang__)
  130930. "sbcs r4, r5\n\t"
  130931. #else
  130932. "sbc r4, r5\n\t"
  130933. #endif
  130934. "str r4, [%[r]]\n\t"
  130935. #ifdef WOLFSSL_KEIL
  130936. "sbcs r3, r3, r3\n\t"
  130937. #elif defined(__clang__)
  130938. "sbcs r3, r3\n\t"
  130939. #else
  130940. "sbc r3, r3\n\t"
  130941. #endif
  130942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130943. "adds %[a], %[a], #4\n\t"
  130944. #else
  130945. "add %[a], %[a], #4\n\t"
  130946. #endif
  130947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130948. "adds %[b], %[b], #4\n\t"
  130949. #else
  130950. "add %[b], %[b], #4\n\t"
  130951. #endif
  130952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130953. "adds %[r], %[r], #4\n\t"
  130954. #else
  130955. "add %[r], %[r], #4\n\t"
  130956. #endif
  130957. "cmp %[a], r6\n\t"
  130958. "bne L_sp_521_sub_17_word_%=\n\t"
  130959. "movs %[r], r3\n\t"
  130960. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  130961. :
  130962. : "memory", "r3", "r4", "r5", "r6"
  130963. );
  130964. return (uint32_t)(size_t)r;
  130965. }
  130966. #else
  130967. /* Sub b from a into r. (r = a - b)
  130968. *
  130969. * r A single precision integer.
  130970. * a A single precision integer.
  130971. * b A single precision integer.
  130972. */
  130973. SP_NOINLINE static sp_digit sp_521_sub_17(sp_digit* r, const sp_digit* a,
  130974. const sp_digit* b)
  130975. {
  130976. __asm__ __volatile__ (
  130977. "ldm %[b]!, {r5, r6}\n\t"
  130978. "ldm %[a]!, {r3, r4}\n\t"
  130979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130980. "subs r3, r3, r5\n\t"
  130981. #else
  130982. "sub r3, r3, r5\n\t"
  130983. #endif
  130984. #ifdef WOLFSSL_KEIL
  130985. "sbcs r4, r4, r6\n\t"
  130986. #elif defined(__clang__)
  130987. "sbcs r4, r6\n\t"
  130988. #else
  130989. "sbc r4, r6\n\t"
  130990. #endif
  130991. "stm %[r]!, {r3, r4}\n\t"
  130992. "ldm %[b]!, {r5, r6}\n\t"
  130993. "ldm %[a]!, {r3, r4}\n\t"
  130994. #ifdef WOLFSSL_KEIL
  130995. "sbcs r3, r3, r5\n\t"
  130996. #elif defined(__clang__)
  130997. "sbcs r3, r5\n\t"
  130998. #else
  130999. "sbc r3, r5\n\t"
  131000. #endif
  131001. #ifdef WOLFSSL_KEIL
  131002. "sbcs r4, r4, r6\n\t"
  131003. #elif defined(__clang__)
  131004. "sbcs r4, r6\n\t"
  131005. #else
  131006. "sbc r4, r6\n\t"
  131007. #endif
  131008. "stm %[r]!, {r3, r4}\n\t"
  131009. "ldm %[b]!, {r5, r6}\n\t"
  131010. "ldm %[a]!, {r3, r4}\n\t"
  131011. #ifdef WOLFSSL_KEIL
  131012. "sbcs r3, r3, r5\n\t"
  131013. #elif defined(__clang__)
  131014. "sbcs r3, r5\n\t"
  131015. #else
  131016. "sbc r3, r5\n\t"
  131017. #endif
  131018. #ifdef WOLFSSL_KEIL
  131019. "sbcs r4, r4, r6\n\t"
  131020. #elif defined(__clang__)
  131021. "sbcs r4, r6\n\t"
  131022. #else
  131023. "sbc r4, r6\n\t"
  131024. #endif
  131025. "stm %[r]!, {r3, r4}\n\t"
  131026. "ldm %[b]!, {r5, r6}\n\t"
  131027. "ldm %[a]!, {r3, r4}\n\t"
  131028. #ifdef WOLFSSL_KEIL
  131029. "sbcs r3, r3, r5\n\t"
  131030. #elif defined(__clang__)
  131031. "sbcs r3, r5\n\t"
  131032. #else
  131033. "sbc r3, r5\n\t"
  131034. #endif
  131035. #ifdef WOLFSSL_KEIL
  131036. "sbcs r4, r4, r6\n\t"
  131037. #elif defined(__clang__)
  131038. "sbcs r4, r6\n\t"
  131039. #else
  131040. "sbc r4, r6\n\t"
  131041. #endif
  131042. "stm %[r]!, {r3, r4}\n\t"
  131043. "ldm %[b]!, {r5, r6}\n\t"
  131044. "ldm %[a]!, {r3, r4}\n\t"
  131045. #ifdef WOLFSSL_KEIL
  131046. "sbcs r3, r3, r5\n\t"
  131047. #elif defined(__clang__)
  131048. "sbcs r3, r5\n\t"
  131049. #else
  131050. "sbc r3, r5\n\t"
  131051. #endif
  131052. #ifdef WOLFSSL_KEIL
  131053. "sbcs r4, r4, r6\n\t"
  131054. #elif defined(__clang__)
  131055. "sbcs r4, r6\n\t"
  131056. #else
  131057. "sbc r4, r6\n\t"
  131058. #endif
  131059. "stm %[r]!, {r3, r4}\n\t"
  131060. "ldm %[b]!, {r5, r6}\n\t"
  131061. "ldm %[a]!, {r3, r4}\n\t"
  131062. #ifdef WOLFSSL_KEIL
  131063. "sbcs r3, r3, r5\n\t"
  131064. #elif defined(__clang__)
  131065. "sbcs r3, r5\n\t"
  131066. #else
  131067. "sbc r3, r5\n\t"
  131068. #endif
  131069. #ifdef WOLFSSL_KEIL
  131070. "sbcs r4, r4, r6\n\t"
  131071. #elif defined(__clang__)
  131072. "sbcs r4, r6\n\t"
  131073. #else
  131074. "sbc r4, r6\n\t"
  131075. #endif
  131076. "stm %[r]!, {r3, r4}\n\t"
  131077. "ldm %[b]!, {r5, r6}\n\t"
  131078. "ldm %[a]!, {r3, r4}\n\t"
  131079. #ifdef WOLFSSL_KEIL
  131080. "sbcs r3, r3, r5\n\t"
  131081. #elif defined(__clang__)
  131082. "sbcs r3, r5\n\t"
  131083. #else
  131084. "sbc r3, r5\n\t"
  131085. #endif
  131086. #ifdef WOLFSSL_KEIL
  131087. "sbcs r4, r4, r6\n\t"
  131088. #elif defined(__clang__)
  131089. "sbcs r4, r6\n\t"
  131090. #else
  131091. "sbc r4, r6\n\t"
  131092. #endif
  131093. "stm %[r]!, {r3, r4}\n\t"
  131094. "ldm %[b]!, {r5, r6}\n\t"
  131095. "ldm %[a]!, {r3, r4}\n\t"
  131096. #ifdef WOLFSSL_KEIL
  131097. "sbcs r3, r3, r5\n\t"
  131098. #elif defined(__clang__)
  131099. "sbcs r3, r5\n\t"
  131100. #else
  131101. "sbc r3, r5\n\t"
  131102. #endif
  131103. #ifdef WOLFSSL_KEIL
  131104. "sbcs r4, r4, r6\n\t"
  131105. #elif defined(__clang__)
  131106. "sbcs r4, r6\n\t"
  131107. #else
  131108. "sbc r4, r6\n\t"
  131109. #endif
  131110. "stm %[r]!, {r3, r4}\n\t"
  131111. "ldr r5, [%[b]]\n\t"
  131112. "ldr r3, [%[a]]\n\t"
  131113. #ifdef WOLFSSL_KEIL
  131114. "sbcs r3, r3, r5\n\t"
  131115. #elif defined(__clang__)
  131116. "sbcs r3, r5\n\t"
  131117. #else
  131118. "sbc r3, r5\n\t"
  131119. #endif
  131120. "str r3, [%[r]]\n\t"
  131121. #ifdef WOLFSSL_KEIL
  131122. "sbcs %[r], %[r], %[r]\n\t"
  131123. #elif defined(__clang__)
  131124. "sbcs %[r], %[r]\n\t"
  131125. #else
  131126. "sbc %[r], %[r]\n\t"
  131127. #endif
  131128. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  131129. :
  131130. : "memory", "r3", "r4", "r5", "r6"
  131131. );
  131132. return (uint32_t)(size_t)r;
  131133. }
  131134. #endif /* WOLFSSL_SP_SMALL */
  131135. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  131136. *
  131137. * r Result of division by 2.
  131138. * a Number to divide.
  131139. * m Modulus.
  131140. */
  131141. static void sp_521_div2_mod_17(sp_digit* r, const sp_digit* a,
  131142. const sp_digit* m)
  131143. {
  131144. __asm__ __volatile__ (
  131145. "ldr r3, [%[a]]\n\t"
  131146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131147. "lsls r3, r3, #31\n\t"
  131148. #else
  131149. "lsl r3, r3, #31\n\t"
  131150. #endif
  131151. "beq L_sp_521_div2_mod_17_no_add_%=\n\t"
  131152. "ldr r4, [%[a]]\n\t"
  131153. "ldr r5, [%[a], #4]\n\t"
  131154. "ldr r6, [%[m]]\n\t"
  131155. "ldr r7, [%[m], #4]\n\t"
  131156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131157. "adds r4, r4, r6\n\t"
  131158. #else
  131159. "add r4, r4, r6\n\t"
  131160. #endif
  131161. #ifdef WOLFSSL_KEIL
  131162. "adcs r5, r5, r7\n\t"
  131163. #elif defined(__clang__)
  131164. "adcs r5, r7\n\t"
  131165. #else
  131166. "adc r5, r7\n\t"
  131167. #endif
  131168. "str r4, [%[r]]\n\t"
  131169. "str r5, [%[r], #4]\n\t"
  131170. "ldr r4, [%[a], #8]\n\t"
  131171. "ldr r5, [%[a], #12]\n\t"
  131172. "ldr r6, [%[m], #8]\n\t"
  131173. "ldr r7, [%[m], #12]\n\t"
  131174. #ifdef WOLFSSL_KEIL
  131175. "adcs r4, r4, r6\n\t"
  131176. #elif defined(__clang__)
  131177. "adcs r4, r6\n\t"
  131178. #else
  131179. "adc r4, r6\n\t"
  131180. #endif
  131181. #ifdef WOLFSSL_KEIL
  131182. "adcs r5, r5, r7\n\t"
  131183. #elif defined(__clang__)
  131184. "adcs r5, r7\n\t"
  131185. #else
  131186. "adc r5, r7\n\t"
  131187. #endif
  131188. "str r4, [%[r], #8]\n\t"
  131189. "str r5, [%[r], #12]\n\t"
  131190. "ldr r4, [%[a], #16]\n\t"
  131191. "ldr r5, [%[a], #20]\n\t"
  131192. "ldr r6, [%[m], #16]\n\t"
  131193. "ldr r7, [%[m], #20]\n\t"
  131194. #ifdef WOLFSSL_KEIL
  131195. "adcs r4, r4, r6\n\t"
  131196. #elif defined(__clang__)
  131197. "adcs r4, r6\n\t"
  131198. #else
  131199. "adc r4, r6\n\t"
  131200. #endif
  131201. #ifdef WOLFSSL_KEIL
  131202. "adcs r5, r5, r7\n\t"
  131203. #elif defined(__clang__)
  131204. "adcs r5, r7\n\t"
  131205. #else
  131206. "adc r5, r7\n\t"
  131207. #endif
  131208. "str r4, [%[r], #16]\n\t"
  131209. "str r5, [%[r], #20]\n\t"
  131210. "ldr r4, [%[a], #24]\n\t"
  131211. "ldr r5, [%[a], #28]\n\t"
  131212. "ldr r6, [%[m], #24]\n\t"
  131213. "ldr r7, [%[m], #28]\n\t"
  131214. #ifdef WOLFSSL_KEIL
  131215. "adcs r4, r4, r6\n\t"
  131216. #elif defined(__clang__)
  131217. "adcs r4, r6\n\t"
  131218. #else
  131219. "adc r4, r6\n\t"
  131220. #endif
  131221. #ifdef WOLFSSL_KEIL
  131222. "adcs r5, r5, r7\n\t"
  131223. #elif defined(__clang__)
  131224. "adcs r5, r7\n\t"
  131225. #else
  131226. "adc r5, r7\n\t"
  131227. #endif
  131228. "str r4, [%[r], #24]\n\t"
  131229. "str r5, [%[r], #28]\n\t"
  131230. "ldr r4, [%[a], #32]\n\t"
  131231. "ldr r5, [%[a], #36]\n\t"
  131232. "ldr r6, [%[m], #32]\n\t"
  131233. "ldr r7, [%[m], #36]\n\t"
  131234. #ifdef WOLFSSL_KEIL
  131235. "adcs r4, r4, r6\n\t"
  131236. #elif defined(__clang__)
  131237. "adcs r4, r6\n\t"
  131238. #else
  131239. "adc r4, r6\n\t"
  131240. #endif
  131241. #ifdef WOLFSSL_KEIL
  131242. "adcs r5, r5, r7\n\t"
  131243. #elif defined(__clang__)
  131244. "adcs r5, r7\n\t"
  131245. #else
  131246. "adc r5, r7\n\t"
  131247. #endif
  131248. "str r4, [%[r], #32]\n\t"
  131249. "str r5, [%[r], #36]\n\t"
  131250. "ldr r4, [%[a], #40]\n\t"
  131251. "ldr r5, [%[a], #44]\n\t"
  131252. "ldr r6, [%[m], #40]\n\t"
  131253. "ldr r7, [%[m], #44]\n\t"
  131254. #ifdef WOLFSSL_KEIL
  131255. "adcs r4, r4, r6\n\t"
  131256. #elif defined(__clang__)
  131257. "adcs r4, r6\n\t"
  131258. #else
  131259. "adc r4, r6\n\t"
  131260. #endif
  131261. #ifdef WOLFSSL_KEIL
  131262. "adcs r5, r5, r7\n\t"
  131263. #elif defined(__clang__)
  131264. "adcs r5, r7\n\t"
  131265. #else
  131266. "adc r5, r7\n\t"
  131267. #endif
  131268. "str r4, [%[r], #40]\n\t"
  131269. "str r5, [%[r], #44]\n\t"
  131270. "ldr r4, [%[a], #48]\n\t"
  131271. "ldr r5, [%[a], #52]\n\t"
  131272. "ldr r6, [%[m], #48]\n\t"
  131273. "ldr r7, [%[m], #52]\n\t"
  131274. #ifdef WOLFSSL_KEIL
  131275. "adcs r4, r4, r6\n\t"
  131276. #elif defined(__clang__)
  131277. "adcs r4, r6\n\t"
  131278. #else
  131279. "adc r4, r6\n\t"
  131280. #endif
  131281. #ifdef WOLFSSL_KEIL
  131282. "adcs r5, r5, r7\n\t"
  131283. #elif defined(__clang__)
  131284. "adcs r5, r7\n\t"
  131285. #else
  131286. "adc r5, r7\n\t"
  131287. #endif
  131288. "str r4, [%[r], #48]\n\t"
  131289. "str r5, [%[r], #52]\n\t"
  131290. "ldr r4, [%[a], #56]\n\t"
  131291. "ldr r5, [%[a], #60]\n\t"
  131292. "ldr r6, [%[m], #56]\n\t"
  131293. "ldr r7, [%[m], #60]\n\t"
  131294. #ifdef WOLFSSL_KEIL
  131295. "adcs r4, r4, r6\n\t"
  131296. #elif defined(__clang__)
  131297. "adcs r4, r6\n\t"
  131298. #else
  131299. "adc r4, r6\n\t"
  131300. #endif
  131301. #ifdef WOLFSSL_KEIL
  131302. "adcs r5, r5, r7\n\t"
  131303. #elif defined(__clang__)
  131304. "adcs r5, r7\n\t"
  131305. #else
  131306. "adc r5, r7\n\t"
  131307. #endif
  131308. "str r4, [%[r], #56]\n\t"
  131309. "str r5, [%[r], #60]\n\t"
  131310. "ldr r4, [%[a], #64]\n\t"
  131311. "ldr r6, [%[m], #64]\n\t"
  131312. #ifdef WOLFSSL_KEIL
  131313. "adcs r4, r4, r6\n\t"
  131314. #elif defined(__clang__)
  131315. "adcs r4, r6\n\t"
  131316. #else
  131317. "adc r4, r6\n\t"
  131318. #endif
  131319. "str r4, [%[r], #64]\n\t"
  131320. "movs r3, #0\n\t"
  131321. #ifdef WOLFSSL_KEIL
  131322. "adcs r3, r3, r3\n\t"
  131323. #elif defined(__clang__)
  131324. "adcs r3, r3\n\t"
  131325. #else
  131326. "adc r3, r3\n\t"
  131327. #endif
  131328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131329. "lsls r3, r3, #31\n\t"
  131330. #else
  131331. "lsl r3, r3, #31\n\t"
  131332. #endif
  131333. "b L_sp_521_div2_mod_17_div2_%=\n\t"
  131334. "\n"
  131335. "L_sp_521_div2_mod_17_no_add_%=:\n\t"
  131336. "ldr r4, [%[a]]\n\t"
  131337. "ldr r5, [%[a], #4]\n\t"
  131338. "str r4, [%[r]]\n\t"
  131339. "str r5, [%[r], #4]\n\t"
  131340. "ldr r4, [%[a], #8]\n\t"
  131341. "ldr r5, [%[a], #12]\n\t"
  131342. "str r4, [%[r], #8]\n\t"
  131343. "str r5, [%[r], #12]\n\t"
  131344. "ldr r4, [%[a], #16]\n\t"
  131345. "ldr r5, [%[a], #20]\n\t"
  131346. "str r4, [%[r], #16]\n\t"
  131347. "str r5, [%[r], #20]\n\t"
  131348. "ldr r4, [%[a], #24]\n\t"
  131349. "ldr r5, [%[a], #28]\n\t"
  131350. "str r4, [%[r], #24]\n\t"
  131351. "str r5, [%[r], #28]\n\t"
  131352. "ldr r4, [%[a], #32]\n\t"
  131353. "ldr r5, [%[a], #36]\n\t"
  131354. "str r4, [%[r], #32]\n\t"
  131355. "str r5, [%[r], #36]\n\t"
  131356. "ldr r4, [%[a], #40]\n\t"
  131357. "ldr r5, [%[a], #44]\n\t"
  131358. "str r4, [%[r], #40]\n\t"
  131359. "str r5, [%[r], #44]\n\t"
  131360. "ldr r4, [%[a], #48]\n\t"
  131361. "ldr r5, [%[a], #52]\n\t"
  131362. "str r4, [%[r], #48]\n\t"
  131363. "str r5, [%[r], #52]\n\t"
  131364. "ldr r4, [%[a], #56]\n\t"
  131365. "ldr r5, [%[a], #60]\n\t"
  131366. "str r4, [%[r], #56]\n\t"
  131367. "str r5, [%[r], #60]\n\t"
  131368. "ldr r4, [%[a], #64]\n\t"
  131369. "str r4, [%[r], #64]\n\t"
  131370. "\n"
  131371. "L_sp_521_div2_mod_17_div2_%=:\n\t"
  131372. "ldr r4, [%[r]]\n\t"
  131373. "ldr r5, [%[r], #4]\n\t"
  131374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131375. "lsrs r4, r4, #1\n\t"
  131376. #else
  131377. "lsr r4, r4, #1\n\t"
  131378. #endif
  131379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131380. "lsls r6, r5, #31\n\t"
  131381. #else
  131382. "lsl r6, r5, #31\n\t"
  131383. #endif
  131384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131385. "lsrs r5, r5, #1\n\t"
  131386. #else
  131387. "lsr r5, r5, #1\n\t"
  131388. #endif
  131389. #ifdef WOLFSSL_KEIL
  131390. "orrs r4, r4, r6\n\t"
  131391. #elif defined(__clang__)
  131392. "orrs r4, r6\n\t"
  131393. #else
  131394. "orr r4, r6\n\t"
  131395. #endif
  131396. "ldr r7, [%[r], #8]\n\t"
  131397. "str r4, [%[r]]\n\t"
  131398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131399. "lsls r6, r7, #31\n\t"
  131400. #else
  131401. "lsl r6, r7, #31\n\t"
  131402. #endif
  131403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131404. "lsrs r7, r7, #1\n\t"
  131405. #else
  131406. "lsr r7, r7, #1\n\t"
  131407. #endif
  131408. #ifdef WOLFSSL_KEIL
  131409. "orrs r5, r5, r6\n\t"
  131410. #elif defined(__clang__)
  131411. "orrs r5, r6\n\t"
  131412. #else
  131413. "orr r5, r6\n\t"
  131414. #endif
  131415. "ldr r4, [%[r], #12]\n\t"
  131416. "str r5, [%[r], #4]\n\t"
  131417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131418. "lsls r6, r4, #31\n\t"
  131419. #else
  131420. "lsl r6, r4, #31\n\t"
  131421. #endif
  131422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131423. "lsrs r4, r4, #1\n\t"
  131424. #else
  131425. "lsr r4, r4, #1\n\t"
  131426. #endif
  131427. #ifdef WOLFSSL_KEIL
  131428. "orrs r7, r7, r6\n\t"
  131429. #elif defined(__clang__)
  131430. "orrs r7, r6\n\t"
  131431. #else
  131432. "orr r7, r6\n\t"
  131433. #endif
  131434. "ldr r5, [%[r], #16]\n\t"
  131435. "str r7, [%[r], #8]\n\t"
  131436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131437. "lsls r6, r5, #31\n\t"
  131438. #else
  131439. "lsl r6, r5, #31\n\t"
  131440. #endif
  131441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131442. "lsrs r5, r5, #1\n\t"
  131443. #else
  131444. "lsr r5, r5, #1\n\t"
  131445. #endif
  131446. #ifdef WOLFSSL_KEIL
  131447. "orrs r4, r4, r6\n\t"
  131448. #elif defined(__clang__)
  131449. "orrs r4, r6\n\t"
  131450. #else
  131451. "orr r4, r6\n\t"
  131452. #endif
  131453. "ldr r7, [%[r], #20]\n\t"
  131454. "str r4, [%[r], #12]\n\t"
  131455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131456. "lsls r6, r7, #31\n\t"
  131457. #else
  131458. "lsl r6, r7, #31\n\t"
  131459. #endif
  131460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131461. "lsrs r7, r7, #1\n\t"
  131462. #else
  131463. "lsr r7, r7, #1\n\t"
  131464. #endif
  131465. #ifdef WOLFSSL_KEIL
  131466. "orrs r5, r5, r6\n\t"
  131467. #elif defined(__clang__)
  131468. "orrs r5, r6\n\t"
  131469. #else
  131470. "orr r5, r6\n\t"
  131471. #endif
  131472. "ldr r4, [%[r], #24]\n\t"
  131473. "str r5, [%[r], #16]\n\t"
  131474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131475. "lsls r6, r4, #31\n\t"
  131476. #else
  131477. "lsl r6, r4, #31\n\t"
  131478. #endif
  131479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131480. "lsrs r4, r4, #1\n\t"
  131481. #else
  131482. "lsr r4, r4, #1\n\t"
  131483. #endif
  131484. #ifdef WOLFSSL_KEIL
  131485. "orrs r7, r7, r6\n\t"
  131486. #elif defined(__clang__)
  131487. "orrs r7, r6\n\t"
  131488. #else
  131489. "orr r7, r6\n\t"
  131490. #endif
  131491. "ldr r5, [%[r], #28]\n\t"
  131492. "str r7, [%[r], #20]\n\t"
  131493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131494. "lsls r6, r5, #31\n\t"
  131495. #else
  131496. "lsl r6, r5, #31\n\t"
  131497. #endif
  131498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131499. "lsrs r5, r5, #1\n\t"
  131500. #else
  131501. "lsr r5, r5, #1\n\t"
  131502. #endif
  131503. #ifdef WOLFSSL_KEIL
  131504. "orrs r4, r4, r6\n\t"
  131505. #elif defined(__clang__)
  131506. "orrs r4, r6\n\t"
  131507. #else
  131508. "orr r4, r6\n\t"
  131509. #endif
  131510. "ldr r7, [%[r], #32]\n\t"
  131511. "str r4, [%[r], #24]\n\t"
  131512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131513. "lsls r6, r7, #31\n\t"
  131514. #else
  131515. "lsl r6, r7, #31\n\t"
  131516. #endif
  131517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131518. "lsrs r7, r7, #1\n\t"
  131519. #else
  131520. "lsr r7, r7, #1\n\t"
  131521. #endif
  131522. #ifdef WOLFSSL_KEIL
  131523. "orrs r5, r5, r6\n\t"
  131524. #elif defined(__clang__)
  131525. "orrs r5, r6\n\t"
  131526. #else
  131527. "orr r5, r6\n\t"
  131528. #endif
  131529. "ldr r4, [%[r], #36]\n\t"
  131530. "str r5, [%[r], #28]\n\t"
  131531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131532. "lsls r6, r4, #31\n\t"
  131533. #else
  131534. "lsl r6, r4, #31\n\t"
  131535. #endif
  131536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131537. "lsrs r4, r4, #1\n\t"
  131538. #else
  131539. "lsr r4, r4, #1\n\t"
  131540. #endif
  131541. #ifdef WOLFSSL_KEIL
  131542. "orrs r7, r7, r6\n\t"
  131543. #elif defined(__clang__)
  131544. "orrs r7, r6\n\t"
  131545. #else
  131546. "orr r7, r6\n\t"
  131547. #endif
  131548. "ldr r5, [%[r], #40]\n\t"
  131549. "str r7, [%[r], #32]\n\t"
  131550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131551. "lsls r6, r5, #31\n\t"
  131552. #else
  131553. "lsl r6, r5, #31\n\t"
  131554. #endif
  131555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131556. "lsrs r5, r5, #1\n\t"
  131557. #else
  131558. "lsr r5, r5, #1\n\t"
  131559. #endif
  131560. #ifdef WOLFSSL_KEIL
  131561. "orrs r4, r4, r6\n\t"
  131562. #elif defined(__clang__)
  131563. "orrs r4, r6\n\t"
  131564. #else
  131565. "orr r4, r6\n\t"
  131566. #endif
  131567. "ldr r7, [%[r], #44]\n\t"
  131568. "str r4, [%[r], #36]\n\t"
  131569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131570. "lsls r6, r7, #31\n\t"
  131571. #else
  131572. "lsl r6, r7, #31\n\t"
  131573. #endif
  131574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131575. "lsrs r7, r7, #1\n\t"
  131576. #else
  131577. "lsr r7, r7, #1\n\t"
  131578. #endif
  131579. #ifdef WOLFSSL_KEIL
  131580. "orrs r5, r5, r6\n\t"
  131581. #elif defined(__clang__)
  131582. "orrs r5, r6\n\t"
  131583. #else
  131584. "orr r5, r6\n\t"
  131585. #endif
  131586. "ldr r4, [%[r], #48]\n\t"
  131587. "str r5, [%[r], #40]\n\t"
  131588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131589. "lsls r6, r4, #31\n\t"
  131590. #else
  131591. "lsl r6, r4, #31\n\t"
  131592. #endif
  131593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131594. "lsrs r4, r4, #1\n\t"
  131595. #else
  131596. "lsr r4, r4, #1\n\t"
  131597. #endif
  131598. #ifdef WOLFSSL_KEIL
  131599. "orrs r7, r7, r6\n\t"
  131600. #elif defined(__clang__)
  131601. "orrs r7, r6\n\t"
  131602. #else
  131603. "orr r7, r6\n\t"
  131604. #endif
  131605. "ldr r5, [%[r], #52]\n\t"
  131606. "str r7, [%[r], #44]\n\t"
  131607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131608. "lsls r6, r5, #31\n\t"
  131609. #else
  131610. "lsl r6, r5, #31\n\t"
  131611. #endif
  131612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131613. "lsrs r5, r5, #1\n\t"
  131614. #else
  131615. "lsr r5, r5, #1\n\t"
  131616. #endif
  131617. #ifdef WOLFSSL_KEIL
  131618. "orrs r4, r4, r6\n\t"
  131619. #elif defined(__clang__)
  131620. "orrs r4, r6\n\t"
  131621. #else
  131622. "orr r4, r6\n\t"
  131623. #endif
  131624. "ldr r7, [%[r], #56]\n\t"
  131625. "str r4, [%[r], #48]\n\t"
  131626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131627. "lsls r6, r7, #31\n\t"
  131628. #else
  131629. "lsl r6, r7, #31\n\t"
  131630. #endif
  131631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131632. "lsrs r7, r7, #1\n\t"
  131633. #else
  131634. "lsr r7, r7, #1\n\t"
  131635. #endif
  131636. #ifdef WOLFSSL_KEIL
  131637. "orrs r5, r5, r6\n\t"
  131638. #elif defined(__clang__)
  131639. "orrs r5, r6\n\t"
  131640. #else
  131641. "orr r5, r6\n\t"
  131642. #endif
  131643. "ldr r4, [%[r], #60]\n\t"
  131644. "str r5, [%[r], #52]\n\t"
  131645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131646. "lsls r6, r4, #31\n\t"
  131647. #else
  131648. "lsl r6, r4, #31\n\t"
  131649. #endif
  131650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131651. "lsrs r4, r4, #1\n\t"
  131652. #else
  131653. "lsr r4, r4, #1\n\t"
  131654. #endif
  131655. #ifdef WOLFSSL_KEIL
  131656. "orrs r7, r7, r6\n\t"
  131657. #elif defined(__clang__)
  131658. "orrs r7, r6\n\t"
  131659. #else
  131660. "orr r7, r6\n\t"
  131661. #endif
  131662. "ldr r5, [%[r], #64]\n\t"
  131663. "str r7, [%[r], #56]\n\t"
  131664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131665. "lsls r6, r5, #31\n\t"
  131666. #else
  131667. "lsl r6, r5, #31\n\t"
  131668. #endif
  131669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131670. "lsrs r5, r5, #1\n\t"
  131671. #else
  131672. "lsr r5, r5, #1\n\t"
  131673. #endif
  131674. #ifdef WOLFSSL_KEIL
  131675. "orrs r4, r4, r6\n\t"
  131676. #elif defined(__clang__)
  131677. "orrs r4, r6\n\t"
  131678. #else
  131679. "orr r4, r6\n\t"
  131680. #endif
  131681. #ifdef WOLFSSL_KEIL
  131682. "orrs r5, r5, r3\n\t"
  131683. #elif defined(__clang__)
  131684. "orrs r5, r3\n\t"
  131685. #else
  131686. "orr r5, r3\n\t"
  131687. #endif
  131688. "str r4, [%[r], #60]\n\t"
  131689. "str r5, [%[r], #64]\n\t"
  131690. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  131691. :
  131692. : "memory", "r3", "r4", "r5", "r6", "r7"
  131693. );
  131694. }
  131695. static int sp_521_num_bits_17(sp_digit* a)
  131696. {
  131697. static const byte sp_num_bits_table[256] = {
  131698. 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
  131699. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  131700. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  131701. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  131702. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  131703. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  131704. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  131705. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  131706. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131707. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131708. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131709. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131710. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131711. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131712. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131713. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131714. };
  131715. const byte* table = sp_num_bits_table;
  131716. __asm__ __volatile__ (
  131717. "movs r6, #0xff\n\t"
  131718. "ldr r3, [%[a], #64]\n\t"
  131719. "cmp r3, #0\n\t"
  131720. "beq L_sp_521_num_bits_17_16_%=\n\t"
  131721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131722. "lsrs r5, r3, #24\n\t"
  131723. #else
  131724. "lsr r5, r3, #24\n\t"
  131725. #endif
  131726. "cmp r5, #0\n\t"
  131727. "beq L_sp_521_num_bits_17_183_%=\n\t"
  131728. "movs r2, #2\n\t"
  131729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131730. "lsls r2, r2, #8\n\t"
  131731. #else
  131732. "lsl r2, r2, #8\n\t"
  131733. #endif
  131734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131735. "adds r2, r2, #24\n\t"
  131736. #else
  131737. "add r2, r2, #24\n\t"
  131738. #endif
  131739. "ldrb r4, [%[table], r5]\n\t"
  131740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131741. "adds r2, r2, r4\n\t"
  131742. #else
  131743. "add r2, r2, r4\n\t"
  131744. #endif
  131745. "b L_sp_521_num_bits_17_18_%=\n\t"
  131746. "\n"
  131747. "L_sp_521_num_bits_17_183_%=:\n\t"
  131748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131749. "lsrs r5, r3, #16\n\t"
  131750. #else
  131751. "lsr r5, r3, #16\n\t"
  131752. #endif
  131753. #ifdef WOLFSSL_KEIL
  131754. "ands r5, r5, r6\n\t"
  131755. #elif defined(__clang__)
  131756. "ands r5, r6\n\t"
  131757. #else
  131758. "and r5, r6\n\t"
  131759. #endif
  131760. "cmp r5, #0\n\t"
  131761. "beq L_sp_521_num_bits_17_182_%=\n\t"
  131762. "movs r2, #2\n\t"
  131763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131764. "lsls r2, r2, #8\n\t"
  131765. #else
  131766. "lsl r2, r2, #8\n\t"
  131767. #endif
  131768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131769. "adds r2, r2, #16\n\t"
  131770. #else
  131771. "add r2, r2, #16\n\t"
  131772. #endif
  131773. "ldrb r4, [%[table], r5]\n\t"
  131774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131775. "adds r2, r2, r4\n\t"
  131776. #else
  131777. "add r2, r2, r4\n\t"
  131778. #endif
  131779. "b L_sp_521_num_bits_17_18_%=\n\t"
  131780. "\n"
  131781. "L_sp_521_num_bits_17_182_%=:\n\t"
  131782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131783. "lsrs r5, r3, #8\n\t"
  131784. #else
  131785. "lsr r5, r3, #8\n\t"
  131786. #endif
  131787. #ifdef WOLFSSL_KEIL
  131788. "ands r5, r5, r6\n\t"
  131789. #elif defined(__clang__)
  131790. "ands r5, r6\n\t"
  131791. #else
  131792. "and r5, r6\n\t"
  131793. #endif
  131794. "cmp r5, #0\n\t"
  131795. "beq L_sp_521_num_bits_17_181_%=\n\t"
  131796. "movs r2, #2\n\t"
  131797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131798. "lsls r2, r2, #8\n\t"
  131799. #else
  131800. "lsl r2, r2, #8\n\t"
  131801. #endif
  131802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131803. "adds r2, r2, #8\n\t"
  131804. #else
  131805. "add r2, r2, #8\n\t"
  131806. #endif
  131807. "ldrb r4, [%[table], r5]\n\t"
  131808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131809. "adds r2, r2, r4\n\t"
  131810. #else
  131811. "add r2, r2, r4\n\t"
  131812. #endif
  131813. "b L_sp_521_num_bits_17_18_%=\n\t"
  131814. "\n"
  131815. "L_sp_521_num_bits_17_181_%=:\n\t"
  131816. "movs r5, r3\n\t"
  131817. #ifdef WOLFSSL_KEIL
  131818. "ands r5, r5, r6\n\t"
  131819. #elif defined(__clang__)
  131820. "ands r5, r6\n\t"
  131821. #else
  131822. "and r5, r6\n\t"
  131823. #endif
  131824. "cmp r5, #0\n\t"
  131825. "beq L_sp_521_num_bits_17_180_%=\n\t"
  131826. "movs r2, #2\n\t"
  131827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131828. "lsls r2, r2, #8\n\t"
  131829. #else
  131830. "lsl r2, r2, #8\n\t"
  131831. #endif
  131832. "ldrb r4, [%[table], r5]\n\t"
  131833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131834. "adds r2, r2, r4\n\t"
  131835. #else
  131836. "add r2, r2, r4\n\t"
  131837. #endif
  131838. "b L_sp_521_num_bits_17_18_%=\n\t"
  131839. "\n"
  131840. "L_sp_521_num_bits_17_180_%=:\n\t"
  131841. "b L_sp_521_num_bits_17_18_%=\n\t"
  131842. "\n"
  131843. "L_sp_521_num_bits_17_16_%=:\n\t"
  131844. "ldr r3, [%[a], #60]\n\t"
  131845. "cmp r3, #0\n\t"
  131846. "beq L_sp_521_num_bits_17_15_%=\n\t"
  131847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131848. "lsrs r5, r3, #24\n\t"
  131849. #else
  131850. "lsr r5, r3, #24\n\t"
  131851. #endif
  131852. "cmp r5, #0\n\t"
  131853. "beq L_sp_521_num_bits_17_173_%=\n\t"
  131854. "movs r2, #0xff\n\t"
  131855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131856. "adds r2, r2, #0xf9\n\t"
  131857. #else
  131858. "add r2, r2, #0xf9\n\t"
  131859. #endif
  131860. "ldrb r4, [%[table], r5]\n\t"
  131861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131862. "adds r2, r2, r4\n\t"
  131863. #else
  131864. "add r2, r2, r4\n\t"
  131865. #endif
  131866. "b L_sp_521_num_bits_17_18_%=\n\t"
  131867. "\n"
  131868. "L_sp_521_num_bits_17_173_%=:\n\t"
  131869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131870. "lsrs r5, r3, #16\n\t"
  131871. #else
  131872. "lsr r5, r3, #16\n\t"
  131873. #endif
  131874. #ifdef WOLFSSL_KEIL
  131875. "ands r5, r5, r6\n\t"
  131876. #elif defined(__clang__)
  131877. "ands r5, r6\n\t"
  131878. #else
  131879. "and r5, r6\n\t"
  131880. #endif
  131881. "cmp r5, #0\n\t"
  131882. "beq L_sp_521_num_bits_17_172_%=\n\t"
  131883. "movs r2, #0xff\n\t"
  131884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131885. "adds r2, r2, #0xf1\n\t"
  131886. #else
  131887. "add r2, r2, #0xf1\n\t"
  131888. #endif
  131889. "ldrb r4, [%[table], r5]\n\t"
  131890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131891. "adds r2, r2, r4\n\t"
  131892. #else
  131893. "add r2, r2, r4\n\t"
  131894. #endif
  131895. "b L_sp_521_num_bits_17_18_%=\n\t"
  131896. "\n"
  131897. "L_sp_521_num_bits_17_172_%=:\n\t"
  131898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131899. "lsrs r5, r3, #8\n\t"
  131900. #else
  131901. "lsr r5, r3, #8\n\t"
  131902. #endif
  131903. #ifdef WOLFSSL_KEIL
  131904. "ands r5, r5, r6\n\t"
  131905. #elif defined(__clang__)
  131906. "ands r5, r6\n\t"
  131907. #else
  131908. "and r5, r6\n\t"
  131909. #endif
  131910. "cmp r5, #0\n\t"
  131911. "beq L_sp_521_num_bits_17_171_%=\n\t"
  131912. "movs r2, #0xff\n\t"
  131913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131914. "adds r2, r2, #0xe9\n\t"
  131915. #else
  131916. "add r2, r2, #0xe9\n\t"
  131917. #endif
  131918. "ldrb r4, [%[table], r5]\n\t"
  131919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131920. "adds r2, r2, r4\n\t"
  131921. #else
  131922. "add r2, r2, r4\n\t"
  131923. #endif
  131924. "b L_sp_521_num_bits_17_18_%=\n\t"
  131925. "\n"
  131926. "L_sp_521_num_bits_17_171_%=:\n\t"
  131927. "movs r5, r3\n\t"
  131928. #ifdef WOLFSSL_KEIL
  131929. "ands r5, r5, r6\n\t"
  131930. #elif defined(__clang__)
  131931. "ands r5, r6\n\t"
  131932. #else
  131933. "and r5, r6\n\t"
  131934. #endif
  131935. "cmp r5, #0\n\t"
  131936. "beq L_sp_521_num_bits_17_170_%=\n\t"
  131937. "movs r2, #0xff\n\t"
  131938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131939. "adds r2, r2, #0xe1\n\t"
  131940. #else
  131941. "add r2, r2, #0xe1\n\t"
  131942. #endif
  131943. "ldrb r4, [%[table], r5]\n\t"
  131944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131945. "adds r2, r2, r4\n\t"
  131946. #else
  131947. "add r2, r2, r4\n\t"
  131948. #endif
  131949. "b L_sp_521_num_bits_17_18_%=\n\t"
  131950. "\n"
  131951. "L_sp_521_num_bits_17_170_%=:\n\t"
  131952. "b L_sp_521_num_bits_17_18_%=\n\t"
  131953. "\n"
  131954. "L_sp_521_num_bits_17_15_%=:\n\t"
  131955. "ldr r3, [%[a], #56]\n\t"
  131956. "cmp r3, #0\n\t"
  131957. "beq L_sp_521_num_bits_17_14_%=\n\t"
  131958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131959. "lsrs r5, r3, #24\n\t"
  131960. #else
  131961. "lsr r5, r3, #24\n\t"
  131962. #endif
  131963. "cmp r5, #0\n\t"
  131964. "beq L_sp_521_num_bits_17_163_%=\n\t"
  131965. "movs r2, #0xff\n\t"
  131966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131967. "adds r2, r2, #0xd9\n\t"
  131968. #else
  131969. "add r2, r2, #0xd9\n\t"
  131970. #endif
  131971. "ldrb r4, [%[table], r5]\n\t"
  131972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131973. "adds r2, r2, r4\n\t"
  131974. #else
  131975. "add r2, r2, r4\n\t"
  131976. #endif
  131977. "b L_sp_521_num_bits_17_18_%=\n\t"
  131978. "\n"
  131979. "L_sp_521_num_bits_17_163_%=:\n\t"
  131980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131981. "lsrs r5, r3, #16\n\t"
  131982. #else
  131983. "lsr r5, r3, #16\n\t"
  131984. #endif
  131985. #ifdef WOLFSSL_KEIL
  131986. "ands r5, r5, r6\n\t"
  131987. #elif defined(__clang__)
  131988. "ands r5, r6\n\t"
  131989. #else
  131990. "and r5, r6\n\t"
  131991. #endif
  131992. "cmp r5, #0\n\t"
  131993. "beq L_sp_521_num_bits_17_162_%=\n\t"
  131994. "movs r2, #0xff\n\t"
  131995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131996. "adds r2, r2, #0xd1\n\t"
  131997. #else
  131998. "add r2, r2, #0xd1\n\t"
  131999. #endif
  132000. "ldrb r4, [%[table], r5]\n\t"
  132001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132002. "adds r2, r2, r4\n\t"
  132003. #else
  132004. "add r2, r2, r4\n\t"
  132005. #endif
  132006. "b L_sp_521_num_bits_17_18_%=\n\t"
  132007. "\n"
  132008. "L_sp_521_num_bits_17_162_%=:\n\t"
  132009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132010. "lsrs r5, r3, #8\n\t"
  132011. #else
  132012. "lsr r5, r3, #8\n\t"
  132013. #endif
  132014. #ifdef WOLFSSL_KEIL
  132015. "ands r5, r5, r6\n\t"
  132016. #elif defined(__clang__)
  132017. "ands r5, r6\n\t"
  132018. #else
  132019. "and r5, r6\n\t"
  132020. #endif
  132021. "cmp r5, #0\n\t"
  132022. "beq L_sp_521_num_bits_17_161_%=\n\t"
  132023. "movs r2, #0xff\n\t"
  132024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132025. "adds r2, r2, #0xc9\n\t"
  132026. #else
  132027. "add r2, r2, #0xc9\n\t"
  132028. #endif
  132029. "ldrb r4, [%[table], r5]\n\t"
  132030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132031. "adds r2, r2, r4\n\t"
  132032. #else
  132033. "add r2, r2, r4\n\t"
  132034. #endif
  132035. "b L_sp_521_num_bits_17_18_%=\n\t"
  132036. "\n"
  132037. "L_sp_521_num_bits_17_161_%=:\n\t"
  132038. "movs r5, r3\n\t"
  132039. #ifdef WOLFSSL_KEIL
  132040. "ands r5, r5, r6\n\t"
  132041. #elif defined(__clang__)
  132042. "ands r5, r6\n\t"
  132043. #else
  132044. "and r5, r6\n\t"
  132045. #endif
  132046. "cmp r5, #0\n\t"
  132047. "beq L_sp_521_num_bits_17_160_%=\n\t"
  132048. "movs r2, #0xff\n\t"
  132049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132050. "adds r2, r2, #0xc1\n\t"
  132051. #else
  132052. "add r2, r2, #0xc1\n\t"
  132053. #endif
  132054. "ldrb r4, [%[table], r5]\n\t"
  132055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132056. "adds r2, r2, r4\n\t"
  132057. #else
  132058. "add r2, r2, r4\n\t"
  132059. #endif
  132060. "b L_sp_521_num_bits_17_18_%=\n\t"
  132061. "\n"
  132062. "L_sp_521_num_bits_17_160_%=:\n\t"
  132063. "b L_sp_521_num_bits_17_18_%=\n\t"
  132064. "\n"
  132065. "L_sp_521_num_bits_17_14_%=:\n\t"
  132066. "ldr r3, [%[a], #52]\n\t"
  132067. "cmp r3, #0\n\t"
  132068. "beq L_sp_521_num_bits_17_13_%=\n\t"
  132069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132070. "lsrs r5, r3, #24\n\t"
  132071. #else
  132072. "lsr r5, r3, #24\n\t"
  132073. #endif
  132074. "cmp r5, #0\n\t"
  132075. "beq L_sp_521_num_bits_17_153_%=\n\t"
  132076. "movs r2, #0xff\n\t"
  132077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132078. "adds r2, r2, #0xb9\n\t"
  132079. #else
  132080. "add r2, r2, #0xb9\n\t"
  132081. #endif
  132082. "ldrb r4, [%[table], r5]\n\t"
  132083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132084. "adds r2, r2, r4\n\t"
  132085. #else
  132086. "add r2, r2, r4\n\t"
  132087. #endif
  132088. "b L_sp_521_num_bits_17_18_%=\n\t"
  132089. "\n"
  132090. "L_sp_521_num_bits_17_153_%=:\n\t"
  132091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132092. "lsrs r5, r3, #16\n\t"
  132093. #else
  132094. "lsr r5, r3, #16\n\t"
  132095. #endif
  132096. #ifdef WOLFSSL_KEIL
  132097. "ands r5, r5, r6\n\t"
  132098. #elif defined(__clang__)
  132099. "ands r5, r6\n\t"
  132100. #else
  132101. "and r5, r6\n\t"
  132102. #endif
  132103. "cmp r5, #0\n\t"
  132104. "beq L_sp_521_num_bits_17_152_%=\n\t"
  132105. "movs r2, #0xff\n\t"
  132106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132107. "adds r2, r2, #0xb1\n\t"
  132108. #else
  132109. "add r2, r2, #0xb1\n\t"
  132110. #endif
  132111. "ldrb r4, [%[table], r5]\n\t"
  132112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132113. "adds r2, r2, r4\n\t"
  132114. #else
  132115. "add r2, r2, r4\n\t"
  132116. #endif
  132117. "b L_sp_521_num_bits_17_18_%=\n\t"
  132118. "\n"
  132119. "L_sp_521_num_bits_17_152_%=:\n\t"
  132120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132121. "lsrs r5, r3, #8\n\t"
  132122. #else
  132123. "lsr r5, r3, #8\n\t"
  132124. #endif
  132125. #ifdef WOLFSSL_KEIL
  132126. "ands r5, r5, r6\n\t"
  132127. #elif defined(__clang__)
  132128. "ands r5, r6\n\t"
  132129. #else
  132130. "and r5, r6\n\t"
  132131. #endif
  132132. "cmp r5, #0\n\t"
  132133. "beq L_sp_521_num_bits_17_151_%=\n\t"
  132134. "movs r2, #0xff\n\t"
  132135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132136. "adds r2, r2, #0xa9\n\t"
  132137. #else
  132138. "add r2, r2, #0xa9\n\t"
  132139. #endif
  132140. "ldrb r4, [%[table], r5]\n\t"
  132141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132142. "adds r2, r2, r4\n\t"
  132143. #else
  132144. "add r2, r2, r4\n\t"
  132145. #endif
  132146. "b L_sp_521_num_bits_17_18_%=\n\t"
  132147. "\n"
  132148. "L_sp_521_num_bits_17_151_%=:\n\t"
  132149. "movs r5, r3\n\t"
  132150. #ifdef WOLFSSL_KEIL
  132151. "ands r5, r5, r6\n\t"
  132152. #elif defined(__clang__)
  132153. "ands r5, r6\n\t"
  132154. #else
  132155. "and r5, r6\n\t"
  132156. #endif
  132157. "cmp r5, #0\n\t"
  132158. "beq L_sp_521_num_bits_17_150_%=\n\t"
  132159. "movs r2, #0xff\n\t"
  132160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132161. "adds r2, r2, #0xa1\n\t"
  132162. #else
  132163. "add r2, r2, #0xa1\n\t"
  132164. #endif
  132165. "ldrb r4, [%[table], r5]\n\t"
  132166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132167. "adds r2, r2, r4\n\t"
  132168. #else
  132169. "add r2, r2, r4\n\t"
  132170. #endif
  132171. "b L_sp_521_num_bits_17_18_%=\n\t"
  132172. "\n"
  132173. "L_sp_521_num_bits_17_150_%=:\n\t"
  132174. "b L_sp_521_num_bits_17_18_%=\n\t"
  132175. "\n"
  132176. "L_sp_521_num_bits_17_13_%=:\n\t"
  132177. "ldr r3, [%[a], #48]\n\t"
  132178. "cmp r3, #0\n\t"
  132179. "beq L_sp_521_num_bits_17_12_%=\n\t"
  132180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132181. "lsrs r5, r3, #24\n\t"
  132182. #else
  132183. "lsr r5, r3, #24\n\t"
  132184. #endif
  132185. "cmp r5, #0\n\t"
  132186. "beq L_sp_521_num_bits_17_143_%=\n\t"
  132187. "movs r2, #0xff\n\t"
  132188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132189. "adds r2, r2, #0x99\n\t"
  132190. #else
  132191. "add r2, r2, #0x99\n\t"
  132192. #endif
  132193. "ldrb r4, [%[table], r5]\n\t"
  132194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132195. "adds r2, r2, r4\n\t"
  132196. #else
  132197. "add r2, r2, r4\n\t"
  132198. #endif
  132199. "b L_sp_521_num_bits_17_18_%=\n\t"
  132200. "\n"
  132201. "L_sp_521_num_bits_17_143_%=:\n\t"
  132202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132203. "lsrs r5, r3, #16\n\t"
  132204. #else
  132205. "lsr r5, r3, #16\n\t"
  132206. #endif
  132207. #ifdef WOLFSSL_KEIL
  132208. "ands r5, r5, r6\n\t"
  132209. #elif defined(__clang__)
  132210. "ands r5, r6\n\t"
  132211. #else
  132212. "and r5, r6\n\t"
  132213. #endif
  132214. "cmp r5, #0\n\t"
  132215. "beq L_sp_521_num_bits_17_142_%=\n\t"
  132216. "movs r2, #0xff\n\t"
  132217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132218. "adds r2, r2, #0x91\n\t"
  132219. #else
  132220. "add r2, r2, #0x91\n\t"
  132221. #endif
  132222. "ldrb r4, [%[table], r5]\n\t"
  132223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132224. "adds r2, r2, r4\n\t"
  132225. #else
  132226. "add r2, r2, r4\n\t"
  132227. #endif
  132228. "b L_sp_521_num_bits_17_18_%=\n\t"
  132229. "\n"
  132230. "L_sp_521_num_bits_17_142_%=:\n\t"
  132231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132232. "lsrs r5, r3, #8\n\t"
  132233. #else
  132234. "lsr r5, r3, #8\n\t"
  132235. #endif
  132236. #ifdef WOLFSSL_KEIL
  132237. "ands r5, r5, r6\n\t"
  132238. #elif defined(__clang__)
  132239. "ands r5, r6\n\t"
  132240. #else
  132241. "and r5, r6\n\t"
  132242. #endif
  132243. "cmp r5, #0\n\t"
  132244. "beq L_sp_521_num_bits_17_141_%=\n\t"
  132245. "movs r2, #0xff\n\t"
  132246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132247. "adds r2, r2, #0x89\n\t"
  132248. #else
  132249. "add r2, r2, #0x89\n\t"
  132250. #endif
  132251. "ldrb r4, [%[table], r5]\n\t"
  132252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132253. "adds r2, r2, r4\n\t"
  132254. #else
  132255. "add r2, r2, r4\n\t"
  132256. #endif
  132257. "b L_sp_521_num_bits_17_18_%=\n\t"
  132258. "\n"
  132259. "L_sp_521_num_bits_17_141_%=:\n\t"
  132260. "movs r5, r3\n\t"
  132261. #ifdef WOLFSSL_KEIL
  132262. "ands r5, r5, r6\n\t"
  132263. #elif defined(__clang__)
  132264. "ands r5, r6\n\t"
  132265. #else
  132266. "and r5, r6\n\t"
  132267. #endif
  132268. "cmp r5, #0\n\t"
  132269. "beq L_sp_521_num_bits_17_140_%=\n\t"
  132270. "movs r2, #0xff\n\t"
  132271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132272. "adds r2, r2, #0x81\n\t"
  132273. #else
  132274. "add r2, r2, #0x81\n\t"
  132275. #endif
  132276. "ldrb r4, [%[table], r5]\n\t"
  132277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132278. "adds r2, r2, r4\n\t"
  132279. #else
  132280. "add r2, r2, r4\n\t"
  132281. #endif
  132282. "b L_sp_521_num_bits_17_18_%=\n\t"
  132283. "\n"
  132284. "L_sp_521_num_bits_17_140_%=:\n\t"
  132285. "b L_sp_521_num_bits_17_18_%=\n\t"
  132286. "\n"
  132287. "L_sp_521_num_bits_17_12_%=:\n\t"
  132288. "ldr r3, [%[a], #44]\n\t"
  132289. "cmp r3, #0\n\t"
  132290. "beq L_sp_521_num_bits_17_11_%=\n\t"
  132291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132292. "lsrs r5, r3, #24\n\t"
  132293. #else
  132294. "lsr r5, r3, #24\n\t"
  132295. #endif
  132296. "cmp r5, #0\n\t"
  132297. "beq L_sp_521_num_bits_17_133_%=\n\t"
  132298. "movs r2, #0xff\n\t"
  132299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132300. "adds r2, r2, #0x79\n\t"
  132301. #else
  132302. "add r2, r2, #0x79\n\t"
  132303. #endif
  132304. "ldrb r4, [%[table], r5]\n\t"
  132305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132306. "adds r2, r2, r4\n\t"
  132307. #else
  132308. "add r2, r2, r4\n\t"
  132309. #endif
  132310. "b L_sp_521_num_bits_17_18_%=\n\t"
  132311. "\n"
  132312. "L_sp_521_num_bits_17_133_%=:\n\t"
  132313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132314. "lsrs r5, r3, #16\n\t"
  132315. #else
  132316. "lsr r5, r3, #16\n\t"
  132317. #endif
  132318. #ifdef WOLFSSL_KEIL
  132319. "ands r5, r5, r6\n\t"
  132320. #elif defined(__clang__)
  132321. "ands r5, r6\n\t"
  132322. #else
  132323. "and r5, r6\n\t"
  132324. #endif
  132325. "cmp r5, #0\n\t"
  132326. "beq L_sp_521_num_bits_17_132_%=\n\t"
  132327. "movs r2, #0xff\n\t"
  132328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132329. "adds r2, r2, #0x71\n\t"
  132330. #else
  132331. "add r2, r2, #0x71\n\t"
  132332. #endif
  132333. "ldrb r4, [%[table], r5]\n\t"
  132334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132335. "adds r2, r2, r4\n\t"
  132336. #else
  132337. "add r2, r2, r4\n\t"
  132338. #endif
  132339. "b L_sp_521_num_bits_17_18_%=\n\t"
  132340. "\n"
  132341. "L_sp_521_num_bits_17_132_%=:\n\t"
  132342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132343. "lsrs r5, r3, #8\n\t"
  132344. #else
  132345. "lsr r5, r3, #8\n\t"
  132346. #endif
  132347. #ifdef WOLFSSL_KEIL
  132348. "ands r5, r5, r6\n\t"
  132349. #elif defined(__clang__)
  132350. "ands r5, r6\n\t"
  132351. #else
  132352. "and r5, r6\n\t"
  132353. #endif
  132354. "cmp r5, #0\n\t"
  132355. "beq L_sp_521_num_bits_17_131_%=\n\t"
  132356. "movs r2, #0xff\n\t"
  132357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132358. "adds r2, r2, #0x69\n\t"
  132359. #else
  132360. "add r2, r2, #0x69\n\t"
  132361. #endif
  132362. "ldrb r4, [%[table], r5]\n\t"
  132363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132364. "adds r2, r2, r4\n\t"
  132365. #else
  132366. "add r2, r2, r4\n\t"
  132367. #endif
  132368. "b L_sp_521_num_bits_17_18_%=\n\t"
  132369. "\n"
  132370. "L_sp_521_num_bits_17_131_%=:\n\t"
  132371. "movs r5, r3\n\t"
  132372. #ifdef WOLFSSL_KEIL
  132373. "ands r5, r5, r6\n\t"
  132374. #elif defined(__clang__)
  132375. "ands r5, r6\n\t"
  132376. #else
  132377. "and r5, r6\n\t"
  132378. #endif
  132379. "cmp r5, #0\n\t"
  132380. "beq L_sp_521_num_bits_17_130_%=\n\t"
  132381. "movs r2, #0xff\n\t"
  132382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132383. "adds r2, r2, #0x61\n\t"
  132384. #else
  132385. "add r2, r2, #0x61\n\t"
  132386. #endif
  132387. "ldrb r4, [%[table], r5]\n\t"
  132388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132389. "adds r2, r2, r4\n\t"
  132390. #else
  132391. "add r2, r2, r4\n\t"
  132392. #endif
  132393. "b L_sp_521_num_bits_17_18_%=\n\t"
  132394. "\n"
  132395. "L_sp_521_num_bits_17_130_%=:\n\t"
  132396. "b L_sp_521_num_bits_17_18_%=\n\t"
  132397. "\n"
  132398. "L_sp_521_num_bits_17_11_%=:\n\t"
  132399. "ldr r3, [%[a], #40]\n\t"
  132400. "cmp r3, #0\n\t"
  132401. "beq L_sp_521_num_bits_17_10_%=\n\t"
  132402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132403. "lsrs r5, r3, #24\n\t"
  132404. #else
  132405. "lsr r5, r3, #24\n\t"
  132406. #endif
  132407. "cmp r5, #0\n\t"
  132408. "beq L_sp_521_num_bits_17_123_%=\n\t"
  132409. "movs r2, #0xff\n\t"
  132410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132411. "adds r2, r2, #0x59\n\t"
  132412. #else
  132413. "add r2, r2, #0x59\n\t"
  132414. #endif
  132415. "ldrb r4, [%[table], r5]\n\t"
  132416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132417. "adds r2, r2, r4\n\t"
  132418. #else
  132419. "add r2, r2, r4\n\t"
  132420. #endif
  132421. "b L_sp_521_num_bits_17_18_%=\n\t"
  132422. "\n"
  132423. "L_sp_521_num_bits_17_123_%=:\n\t"
  132424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132425. "lsrs r5, r3, #16\n\t"
  132426. #else
  132427. "lsr r5, r3, #16\n\t"
  132428. #endif
  132429. #ifdef WOLFSSL_KEIL
  132430. "ands r5, r5, r6\n\t"
  132431. #elif defined(__clang__)
  132432. "ands r5, r6\n\t"
  132433. #else
  132434. "and r5, r6\n\t"
  132435. #endif
  132436. "cmp r5, #0\n\t"
  132437. "beq L_sp_521_num_bits_17_122_%=\n\t"
  132438. "movs r2, #0xff\n\t"
  132439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132440. "adds r2, r2, #0x51\n\t"
  132441. #else
  132442. "add r2, r2, #0x51\n\t"
  132443. #endif
  132444. "ldrb r4, [%[table], r5]\n\t"
  132445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132446. "adds r2, r2, r4\n\t"
  132447. #else
  132448. "add r2, r2, r4\n\t"
  132449. #endif
  132450. "b L_sp_521_num_bits_17_18_%=\n\t"
  132451. "\n"
  132452. "L_sp_521_num_bits_17_122_%=:\n\t"
  132453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132454. "lsrs r5, r3, #8\n\t"
  132455. #else
  132456. "lsr r5, r3, #8\n\t"
  132457. #endif
  132458. #ifdef WOLFSSL_KEIL
  132459. "ands r5, r5, r6\n\t"
  132460. #elif defined(__clang__)
  132461. "ands r5, r6\n\t"
  132462. #else
  132463. "and r5, r6\n\t"
  132464. #endif
  132465. "cmp r5, #0\n\t"
  132466. "beq L_sp_521_num_bits_17_121_%=\n\t"
  132467. "movs r2, #0xff\n\t"
  132468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132469. "adds r2, r2, #0x49\n\t"
  132470. #else
  132471. "add r2, r2, #0x49\n\t"
  132472. #endif
  132473. "ldrb r4, [%[table], r5]\n\t"
  132474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132475. "adds r2, r2, r4\n\t"
  132476. #else
  132477. "add r2, r2, r4\n\t"
  132478. #endif
  132479. "b L_sp_521_num_bits_17_18_%=\n\t"
  132480. "\n"
  132481. "L_sp_521_num_bits_17_121_%=:\n\t"
  132482. "movs r5, r3\n\t"
  132483. #ifdef WOLFSSL_KEIL
  132484. "ands r5, r5, r6\n\t"
  132485. #elif defined(__clang__)
  132486. "ands r5, r6\n\t"
  132487. #else
  132488. "and r5, r6\n\t"
  132489. #endif
  132490. "cmp r5, #0\n\t"
  132491. "beq L_sp_521_num_bits_17_120_%=\n\t"
  132492. "movs r2, #0xff\n\t"
  132493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132494. "adds r2, r2, #0x41\n\t"
  132495. #else
  132496. "add r2, r2, #0x41\n\t"
  132497. #endif
  132498. "ldrb r4, [%[table], r5]\n\t"
  132499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132500. "adds r2, r2, r4\n\t"
  132501. #else
  132502. "add r2, r2, r4\n\t"
  132503. #endif
  132504. "b L_sp_521_num_bits_17_18_%=\n\t"
  132505. "\n"
  132506. "L_sp_521_num_bits_17_120_%=:\n\t"
  132507. "b L_sp_521_num_bits_17_18_%=\n\t"
  132508. "\n"
  132509. "L_sp_521_num_bits_17_10_%=:\n\t"
  132510. "ldr r3, [%[a], #36]\n\t"
  132511. "cmp r3, #0\n\t"
  132512. "beq L_sp_521_num_bits_17_9_%=\n\t"
  132513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132514. "lsrs r5, r3, #24\n\t"
  132515. #else
  132516. "lsr r5, r3, #24\n\t"
  132517. #endif
  132518. "cmp r5, #0\n\t"
  132519. "beq L_sp_521_num_bits_17_113_%=\n\t"
  132520. "movs r2, #0xff\n\t"
  132521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132522. "adds r2, r2, #57\n\t"
  132523. #else
  132524. "add r2, r2, #57\n\t"
  132525. #endif
  132526. "ldrb r4, [%[table], r5]\n\t"
  132527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132528. "adds r2, r2, r4\n\t"
  132529. #else
  132530. "add r2, r2, r4\n\t"
  132531. #endif
  132532. "b L_sp_521_num_bits_17_18_%=\n\t"
  132533. "\n"
  132534. "L_sp_521_num_bits_17_113_%=:\n\t"
  132535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132536. "lsrs r5, r3, #16\n\t"
  132537. #else
  132538. "lsr r5, r3, #16\n\t"
  132539. #endif
  132540. #ifdef WOLFSSL_KEIL
  132541. "ands r5, r5, r6\n\t"
  132542. #elif defined(__clang__)
  132543. "ands r5, r6\n\t"
  132544. #else
  132545. "and r5, r6\n\t"
  132546. #endif
  132547. "cmp r5, #0\n\t"
  132548. "beq L_sp_521_num_bits_17_112_%=\n\t"
  132549. "movs r2, #0xff\n\t"
  132550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132551. "adds r2, r2, #49\n\t"
  132552. #else
  132553. "add r2, r2, #49\n\t"
  132554. #endif
  132555. "ldrb r4, [%[table], r5]\n\t"
  132556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132557. "adds r2, r2, r4\n\t"
  132558. #else
  132559. "add r2, r2, r4\n\t"
  132560. #endif
  132561. "b L_sp_521_num_bits_17_18_%=\n\t"
  132562. "\n"
  132563. "L_sp_521_num_bits_17_112_%=:\n\t"
  132564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132565. "lsrs r5, r3, #8\n\t"
  132566. #else
  132567. "lsr r5, r3, #8\n\t"
  132568. #endif
  132569. #ifdef WOLFSSL_KEIL
  132570. "ands r5, r5, r6\n\t"
  132571. #elif defined(__clang__)
  132572. "ands r5, r6\n\t"
  132573. #else
  132574. "and r5, r6\n\t"
  132575. #endif
  132576. "cmp r5, #0\n\t"
  132577. "beq L_sp_521_num_bits_17_111_%=\n\t"
  132578. "movs r2, #0xff\n\t"
  132579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132580. "adds r2, r2, #41\n\t"
  132581. #else
  132582. "add r2, r2, #41\n\t"
  132583. #endif
  132584. "ldrb r4, [%[table], r5]\n\t"
  132585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132586. "adds r2, r2, r4\n\t"
  132587. #else
  132588. "add r2, r2, r4\n\t"
  132589. #endif
  132590. "b L_sp_521_num_bits_17_18_%=\n\t"
  132591. "\n"
  132592. "L_sp_521_num_bits_17_111_%=:\n\t"
  132593. "movs r5, r3\n\t"
  132594. #ifdef WOLFSSL_KEIL
  132595. "ands r5, r5, r6\n\t"
  132596. #elif defined(__clang__)
  132597. "ands r5, r6\n\t"
  132598. #else
  132599. "and r5, r6\n\t"
  132600. #endif
  132601. "cmp r5, #0\n\t"
  132602. "beq L_sp_521_num_bits_17_110_%=\n\t"
  132603. "movs r2, #0xff\n\t"
  132604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132605. "adds r2, r2, #33\n\t"
  132606. #else
  132607. "add r2, r2, #33\n\t"
  132608. #endif
  132609. "ldrb r4, [%[table], r5]\n\t"
  132610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132611. "adds r2, r2, r4\n\t"
  132612. #else
  132613. "add r2, r2, r4\n\t"
  132614. #endif
  132615. "b L_sp_521_num_bits_17_18_%=\n\t"
  132616. "\n"
  132617. "L_sp_521_num_bits_17_110_%=:\n\t"
  132618. "b L_sp_521_num_bits_17_18_%=\n\t"
  132619. "\n"
  132620. "L_sp_521_num_bits_17_9_%=:\n\t"
  132621. "ldr r3, [%[a], #32]\n\t"
  132622. "cmp r3, #0\n\t"
  132623. "beq L_sp_521_num_bits_17_8_%=\n\t"
  132624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132625. "lsrs r5, r3, #24\n\t"
  132626. #else
  132627. "lsr r5, r3, #24\n\t"
  132628. #endif
  132629. "cmp r5, #0\n\t"
  132630. "beq L_sp_521_num_bits_17_103_%=\n\t"
  132631. "movs r2, #0xff\n\t"
  132632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132633. "adds r2, r2, #25\n\t"
  132634. #else
  132635. "add r2, r2, #25\n\t"
  132636. #endif
  132637. "ldrb r4, [%[table], r5]\n\t"
  132638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132639. "adds r2, r2, r4\n\t"
  132640. #else
  132641. "add r2, r2, r4\n\t"
  132642. #endif
  132643. "b L_sp_521_num_bits_17_18_%=\n\t"
  132644. "\n"
  132645. "L_sp_521_num_bits_17_103_%=:\n\t"
  132646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132647. "lsrs r5, r3, #16\n\t"
  132648. #else
  132649. "lsr r5, r3, #16\n\t"
  132650. #endif
  132651. #ifdef WOLFSSL_KEIL
  132652. "ands r5, r5, r6\n\t"
  132653. #elif defined(__clang__)
  132654. "ands r5, r6\n\t"
  132655. #else
  132656. "and r5, r6\n\t"
  132657. #endif
  132658. "cmp r5, #0\n\t"
  132659. "beq L_sp_521_num_bits_17_102_%=\n\t"
  132660. "movs r2, #0xff\n\t"
  132661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132662. "adds r2, r2, #17\n\t"
  132663. #else
  132664. "add r2, r2, #17\n\t"
  132665. #endif
  132666. "ldrb r4, [%[table], r5]\n\t"
  132667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132668. "adds r2, r2, r4\n\t"
  132669. #else
  132670. "add r2, r2, r4\n\t"
  132671. #endif
  132672. "b L_sp_521_num_bits_17_18_%=\n\t"
  132673. "\n"
  132674. "L_sp_521_num_bits_17_102_%=:\n\t"
  132675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132676. "lsrs r5, r3, #8\n\t"
  132677. #else
  132678. "lsr r5, r3, #8\n\t"
  132679. #endif
  132680. #ifdef WOLFSSL_KEIL
  132681. "ands r5, r5, r6\n\t"
  132682. #elif defined(__clang__)
  132683. "ands r5, r6\n\t"
  132684. #else
  132685. "and r5, r6\n\t"
  132686. #endif
  132687. "cmp r5, #0\n\t"
  132688. "beq L_sp_521_num_bits_17_101_%=\n\t"
  132689. "movs r2, #0xff\n\t"
  132690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132691. "adds r2, r2, #9\n\t"
  132692. #else
  132693. "add r2, r2, #9\n\t"
  132694. #endif
  132695. "ldrb r4, [%[table], r5]\n\t"
  132696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132697. "adds r2, r2, r4\n\t"
  132698. #else
  132699. "add r2, r2, r4\n\t"
  132700. #endif
  132701. "b L_sp_521_num_bits_17_18_%=\n\t"
  132702. "\n"
  132703. "L_sp_521_num_bits_17_101_%=:\n\t"
  132704. "movs r5, r3\n\t"
  132705. #ifdef WOLFSSL_KEIL
  132706. "ands r5, r5, r6\n\t"
  132707. #elif defined(__clang__)
  132708. "ands r5, r6\n\t"
  132709. #else
  132710. "and r5, r6\n\t"
  132711. #endif
  132712. "cmp r5, #0\n\t"
  132713. "beq L_sp_521_num_bits_17_100_%=\n\t"
  132714. "movs r2, #0xff\n\t"
  132715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132716. "adds r2, r2, #1\n\t"
  132717. #else
  132718. "add r2, r2, #1\n\t"
  132719. #endif
  132720. "ldrb r4, [%[table], r5]\n\t"
  132721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132722. "adds r2, r2, r4\n\t"
  132723. #else
  132724. "add r2, r2, r4\n\t"
  132725. #endif
  132726. "b L_sp_521_num_bits_17_18_%=\n\t"
  132727. "\n"
  132728. "L_sp_521_num_bits_17_100_%=:\n\t"
  132729. "b L_sp_521_num_bits_17_18_%=\n\t"
  132730. "\n"
  132731. "L_sp_521_num_bits_17_8_%=:\n\t"
  132732. "ldr r3, [%[a], #28]\n\t"
  132733. "cmp r3, #0\n\t"
  132734. "beq L_sp_521_num_bits_17_7_%=\n\t"
  132735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132736. "lsrs r5, r3, #24\n\t"
  132737. #else
  132738. "lsr r5, r3, #24\n\t"
  132739. #endif
  132740. "cmp r5, #0\n\t"
  132741. "beq L_sp_521_num_bits_17_93_%=\n\t"
  132742. "movs r2, #0xf8\n\t"
  132743. "ldrb r4, [%[table], r5]\n\t"
  132744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132745. "adds r2, r2, r4\n\t"
  132746. #else
  132747. "add r2, r2, r4\n\t"
  132748. #endif
  132749. "b L_sp_521_num_bits_17_18_%=\n\t"
  132750. "\n"
  132751. "L_sp_521_num_bits_17_93_%=:\n\t"
  132752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132753. "lsrs r5, r3, #16\n\t"
  132754. #else
  132755. "lsr r5, r3, #16\n\t"
  132756. #endif
  132757. #ifdef WOLFSSL_KEIL
  132758. "ands r5, r5, r6\n\t"
  132759. #elif defined(__clang__)
  132760. "ands r5, r6\n\t"
  132761. #else
  132762. "and r5, r6\n\t"
  132763. #endif
  132764. "cmp r5, #0\n\t"
  132765. "beq L_sp_521_num_bits_17_92_%=\n\t"
  132766. "movs r2, #0xf0\n\t"
  132767. "ldrb r4, [%[table], r5]\n\t"
  132768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132769. "adds r2, r2, r4\n\t"
  132770. #else
  132771. "add r2, r2, r4\n\t"
  132772. #endif
  132773. "b L_sp_521_num_bits_17_18_%=\n\t"
  132774. "\n"
  132775. "L_sp_521_num_bits_17_92_%=:\n\t"
  132776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132777. "lsrs r5, r3, #8\n\t"
  132778. #else
  132779. "lsr r5, r3, #8\n\t"
  132780. #endif
  132781. #ifdef WOLFSSL_KEIL
  132782. "ands r5, r5, r6\n\t"
  132783. #elif defined(__clang__)
  132784. "ands r5, r6\n\t"
  132785. #else
  132786. "and r5, r6\n\t"
  132787. #endif
  132788. "cmp r5, #0\n\t"
  132789. "beq L_sp_521_num_bits_17_91_%=\n\t"
  132790. "movs r2, #0xe8\n\t"
  132791. "ldrb r4, [%[table], r5]\n\t"
  132792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132793. "adds r2, r2, r4\n\t"
  132794. #else
  132795. "add r2, r2, r4\n\t"
  132796. #endif
  132797. "b L_sp_521_num_bits_17_18_%=\n\t"
  132798. "\n"
  132799. "L_sp_521_num_bits_17_91_%=:\n\t"
  132800. "movs r5, r3\n\t"
  132801. #ifdef WOLFSSL_KEIL
  132802. "ands r5, r5, r6\n\t"
  132803. #elif defined(__clang__)
  132804. "ands r5, r6\n\t"
  132805. #else
  132806. "and r5, r6\n\t"
  132807. #endif
  132808. "cmp r5, #0\n\t"
  132809. "beq L_sp_521_num_bits_17_90_%=\n\t"
  132810. "movs r2, #0xe0\n\t"
  132811. "ldrb r4, [%[table], r5]\n\t"
  132812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132813. "adds r2, r2, r4\n\t"
  132814. #else
  132815. "add r2, r2, r4\n\t"
  132816. #endif
  132817. "b L_sp_521_num_bits_17_18_%=\n\t"
  132818. "\n"
  132819. "L_sp_521_num_bits_17_90_%=:\n\t"
  132820. "b L_sp_521_num_bits_17_18_%=\n\t"
  132821. "\n"
  132822. "L_sp_521_num_bits_17_7_%=:\n\t"
  132823. "ldr r3, [%[a], #24]\n\t"
  132824. "cmp r3, #0\n\t"
  132825. "beq L_sp_521_num_bits_17_6_%=\n\t"
  132826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132827. "lsrs r5, r3, #24\n\t"
  132828. #else
  132829. "lsr r5, r3, #24\n\t"
  132830. #endif
  132831. "cmp r5, #0\n\t"
  132832. "beq L_sp_521_num_bits_17_83_%=\n\t"
  132833. "movs r2, #0xd8\n\t"
  132834. "ldrb r4, [%[table], r5]\n\t"
  132835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132836. "adds r2, r2, r4\n\t"
  132837. #else
  132838. "add r2, r2, r4\n\t"
  132839. #endif
  132840. "b L_sp_521_num_bits_17_18_%=\n\t"
  132841. "\n"
  132842. "L_sp_521_num_bits_17_83_%=:\n\t"
  132843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132844. "lsrs r5, r3, #16\n\t"
  132845. #else
  132846. "lsr r5, r3, #16\n\t"
  132847. #endif
  132848. #ifdef WOLFSSL_KEIL
  132849. "ands r5, r5, r6\n\t"
  132850. #elif defined(__clang__)
  132851. "ands r5, r6\n\t"
  132852. #else
  132853. "and r5, r6\n\t"
  132854. #endif
  132855. "cmp r5, #0\n\t"
  132856. "beq L_sp_521_num_bits_17_82_%=\n\t"
  132857. "movs r2, #0xd0\n\t"
  132858. "ldrb r4, [%[table], r5]\n\t"
  132859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132860. "adds r2, r2, r4\n\t"
  132861. #else
  132862. "add r2, r2, r4\n\t"
  132863. #endif
  132864. "b L_sp_521_num_bits_17_18_%=\n\t"
  132865. "\n"
  132866. "L_sp_521_num_bits_17_82_%=:\n\t"
  132867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132868. "lsrs r5, r3, #8\n\t"
  132869. #else
  132870. "lsr r5, r3, #8\n\t"
  132871. #endif
  132872. #ifdef WOLFSSL_KEIL
  132873. "ands r5, r5, r6\n\t"
  132874. #elif defined(__clang__)
  132875. "ands r5, r6\n\t"
  132876. #else
  132877. "and r5, r6\n\t"
  132878. #endif
  132879. "cmp r5, #0\n\t"
  132880. "beq L_sp_521_num_bits_17_81_%=\n\t"
  132881. "movs r2, #0xc8\n\t"
  132882. "ldrb r4, [%[table], r5]\n\t"
  132883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132884. "adds r2, r2, r4\n\t"
  132885. #else
  132886. "add r2, r2, r4\n\t"
  132887. #endif
  132888. "b L_sp_521_num_bits_17_18_%=\n\t"
  132889. "\n"
  132890. "L_sp_521_num_bits_17_81_%=:\n\t"
  132891. "movs r5, r3\n\t"
  132892. #ifdef WOLFSSL_KEIL
  132893. "ands r5, r5, r6\n\t"
  132894. #elif defined(__clang__)
  132895. "ands r5, r6\n\t"
  132896. #else
  132897. "and r5, r6\n\t"
  132898. #endif
  132899. "cmp r5, #0\n\t"
  132900. "beq L_sp_521_num_bits_17_80_%=\n\t"
  132901. "movs r2, #0xc0\n\t"
  132902. "ldrb r4, [%[table], r5]\n\t"
  132903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132904. "adds r2, r2, r4\n\t"
  132905. #else
  132906. "add r2, r2, r4\n\t"
  132907. #endif
  132908. "b L_sp_521_num_bits_17_18_%=\n\t"
  132909. "\n"
  132910. "L_sp_521_num_bits_17_80_%=:\n\t"
  132911. "b L_sp_521_num_bits_17_18_%=\n\t"
  132912. "\n"
  132913. "L_sp_521_num_bits_17_6_%=:\n\t"
  132914. "ldr r3, [%[a], #20]\n\t"
  132915. "cmp r3, #0\n\t"
  132916. "beq L_sp_521_num_bits_17_5_%=\n\t"
  132917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132918. "lsrs r5, r3, #24\n\t"
  132919. #else
  132920. "lsr r5, r3, #24\n\t"
  132921. #endif
  132922. "cmp r5, #0\n\t"
  132923. "beq L_sp_521_num_bits_17_73_%=\n\t"
  132924. "movs r2, #0xb8\n\t"
  132925. "ldrb r4, [%[table], r5]\n\t"
  132926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132927. "adds r2, r2, r4\n\t"
  132928. #else
  132929. "add r2, r2, r4\n\t"
  132930. #endif
  132931. "b L_sp_521_num_bits_17_18_%=\n\t"
  132932. "\n"
  132933. "L_sp_521_num_bits_17_73_%=:\n\t"
  132934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132935. "lsrs r5, r3, #16\n\t"
  132936. #else
  132937. "lsr r5, r3, #16\n\t"
  132938. #endif
  132939. #ifdef WOLFSSL_KEIL
  132940. "ands r5, r5, r6\n\t"
  132941. #elif defined(__clang__)
  132942. "ands r5, r6\n\t"
  132943. #else
  132944. "and r5, r6\n\t"
  132945. #endif
  132946. "cmp r5, #0\n\t"
  132947. "beq L_sp_521_num_bits_17_72_%=\n\t"
  132948. "movs r2, #0xb0\n\t"
  132949. "ldrb r4, [%[table], r5]\n\t"
  132950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132951. "adds r2, r2, r4\n\t"
  132952. #else
  132953. "add r2, r2, r4\n\t"
  132954. #endif
  132955. "b L_sp_521_num_bits_17_18_%=\n\t"
  132956. "\n"
  132957. "L_sp_521_num_bits_17_72_%=:\n\t"
  132958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132959. "lsrs r5, r3, #8\n\t"
  132960. #else
  132961. "lsr r5, r3, #8\n\t"
  132962. #endif
  132963. #ifdef WOLFSSL_KEIL
  132964. "ands r5, r5, r6\n\t"
  132965. #elif defined(__clang__)
  132966. "ands r5, r6\n\t"
  132967. #else
  132968. "and r5, r6\n\t"
  132969. #endif
  132970. "cmp r5, #0\n\t"
  132971. "beq L_sp_521_num_bits_17_71_%=\n\t"
  132972. "movs r2, #0xa8\n\t"
  132973. "ldrb r4, [%[table], r5]\n\t"
  132974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132975. "adds r2, r2, r4\n\t"
  132976. #else
  132977. "add r2, r2, r4\n\t"
  132978. #endif
  132979. "b L_sp_521_num_bits_17_18_%=\n\t"
  132980. "\n"
  132981. "L_sp_521_num_bits_17_71_%=:\n\t"
  132982. "movs r5, r3\n\t"
  132983. #ifdef WOLFSSL_KEIL
  132984. "ands r5, r5, r6\n\t"
  132985. #elif defined(__clang__)
  132986. "ands r5, r6\n\t"
  132987. #else
  132988. "and r5, r6\n\t"
  132989. #endif
  132990. "cmp r5, #0\n\t"
  132991. "beq L_sp_521_num_bits_17_70_%=\n\t"
  132992. "movs r2, #0xa0\n\t"
  132993. "ldrb r4, [%[table], r5]\n\t"
  132994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132995. "adds r2, r2, r4\n\t"
  132996. #else
  132997. "add r2, r2, r4\n\t"
  132998. #endif
  132999. "b L_sp_521_num_bits_17_18_%=\n\t"
  133000. "\n"
  133001. "L_sp_521_num_bits_17_70_%=:\n\t"
  133002. "b L_sp_521_num_bits_17_18_%=\n\t"
  133003. "\n"
  133004. "L_sp_521_num_bits_17_5_%=:\n\t"
  133005. "ldr r3, [%[a], #16]\n\t"
  133006. "cmp r3, #0\n\t"
  133007. "beq L_sp_521_num_bits_17_4_%=\n\t"
  133008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133009. "lsrs r5, r3, #24\n\t"
  133010. #else
  133011. "lsr r5, r3, #24\n\t"
  133012. #endif
  133013. "cmp r5, #0\n\t"
  133014. "beq L_sp_521_num_bits_17_63_%=\n\t"
  133015. "movs r2, #0x98\n\t"
  133016. "ldrb r4, [%[table], r5]\n\t"
  133017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133018. "adds r2, r2, r4\n\t"
  133019. #else
  133020. "add r2, r2, r4\n\t"
  133021. #endif
  133022. "b L_sp_521_num_bits_17_18_%=\n\t"
  133023. "\n"
  133024. "L_sp_521_num_bits_17_63_%=:\n\t"
  133025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133026. "lsrs r5, r3, #16\n\t"
  133027. #else
  133028. "lsr r5, r3, #16\n\t"
  133029. #endif
  133030. #ifdef WOLFSSL_KEIL
  133031. "ands r5, r5, r6\n\t"
  133032. #elif defined(__clang__)
  133033. "ands r5, r6\n\t"
  133034. #else
  133035. "and r5, r6\n\t"
  133036. #endif
  133037. "cmp r5, #0\n\t"
  133038. "beq L_sp_521_num_bits_17_62_%=\n\t"
  133039. "movs r2, #0x90\n\t"
  133040. "ldrb r4, [%[table], r5]\n\t"
  133041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133042. "adds r2, r2, r4\n\t"
  133043. #else
  133044. "add r2, r2, r4\n\t"
  133045. #endif
  133046. "b L_sp_521_num_bits_17_18_%=\n\t"
  133047. "\n"
  133048. "L_sp_521_num_bits_17_62_%=:\n\t"
  133049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133050. "lsrs r5, r3, #8\n\t"
  133051. #else
  133052. "lsr r5, r3, #8\n\t"
  133053. #endif
  133054. #ifdef WOLFSSL_KEIL
  133055. "ands r5, r5, r6\n\t"
  133056. #elif defined(__clang__)
  133057. "ands r5, r6\n\t"
  133058. #else
  133059. "and r5, r6\n\t"
  133060. #endif
  133061. "cmp r5, #0\n\t"
  133062. "beq L_sp_521_num_bits_17_61_%=\n\t"
  133063. "movs r2, #0x88\n\t"
  133064. "ldrb r4, [%[table], r5]\n\t"
  133065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133066. "adds r2, r2, r4\n\t"
  133067. #else
  133068. "add r2, r2, r4\n\t"
  133069. #endif
  133070. "b L_sp_521_num_bits_17_18_%=\n\t"
  133071. "\n"
  133072. "L_sp_521_num_bits_17_61_%=:\n\t"
  133073. "movs r5, r3\n\t"
  133074. #ifdef WOLFSSL_KEIL
  133075. "ands r5, r5, r6\n\t"
  133076. #elif defined(__clang__)
  133077. "ands r5, r6\n\t"
  133078. #else
  133079. "and r5, r6\n\t"
  133080. #endif
  133081. "cmp r5, #0\n\t"
  133082. "beq L_sp_521_num_bits_17_60_%=\n\t"
  133083. "movs r2, #0x80\n\t"
  133084. "ldrb r4, [%[table], r5]\n\t"
  133085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133086. "adds r2, r2, r4\n\t"
  133087. #else
  133088. "add r2, r2, r4\n\t"
  133089. #endif
  133090. "b L_sp_521_num_bits_17_18_%=\n\t"
  133091. "\n"
  133092. "L_sp_521_num_bits_17_60_%=:\n\t"
  133093. "b L_sp_521_num_bits_17_18_%=\n\t"
  133094. "\n"
  133095. "L_sp_521_num_bits_17_4_%=:\n\t"
  133096. "ldr r3, [%[a], #12]\n\t"
  133097. "cmp r3, #0\n\t"
  133098. "beq L_sp_521_num_bits_17_3_%=\n\t"
  133099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133100. "lsrs r5, r3, #24\n\t"
  133101. #else
  133102. "lsr r5, r3, #24\n\t"
  133103. #endif
  133104. "cmp r5, #0\n\t"
  133105. "beq L_sp_521_num_bits_17_53_%=\n\t"
  133106. "movs r2, #0x78\n\t"
  133107. "ldrb r4, [%[table], r5]\n\t"
  133108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133109. "adds r2, r2, r4\n\t"
  133110. #else
  133111. "add r2, r2, r4\n\t"
  133112. #endif
  133113. "b L_sp_521_num_bits_17_18_%=\n\t"
  133114. "\n"
  133115. "L_sp_521_num_bits_17_53_%=:\n\t"
  133116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133117. "lsrs r5, r3, #16\n\t"
  133118. #else
  133119. "lsr r5, r3, #16\n\t"
  133120. #endif
  133121. #ifdef WOLFSSL_KEIL
  133122. "ands r5, r5, r6\n\t"
  133123. #elif defined(__clang__)
  133124. "ands r5, r6\n\t"
  133125. #else
  133126. "and r5, r6\n\t"
  133127. #endif
  133128. "cmp r5, #0\n\t"
  133129. "beq L_sp_521_num_bits_17_52_%=\n\t"
  133130. "movs r2, #0x70\n\t"
  133131. "ldrb r4, [%[table], r5]\n\t"
  133132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133133. "adds r2, r2, r4\n\t"
  133134. #else
  133135. "add r2, r2, r4\n\t"
  133136. #endif
  133137. "b L_sp_521_num_bits_17_18_%=\n\t"
  133138. "\n"
  133139. "L_sp_521_num_bits_17_52_%=:\n\t"
  133140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133141. "lsrs r5, r3, #8\n\t"
  133142. #else
  133143. "lsr r5, r3, #8\n\t"
  133144. #endif
  133145. #ifdef WOLFSSL_KEIL
  133146. "ands r5, r5, r6\n\t"
  133147. #elif defined(__clang__)
  133148. "ands r5, r6\n\t"
  133149. #else
  133150. "and r5, r6\n\t"
  133151. #endif
  133152. "cmp r5, #0\n\t"
  133153. "beq L_sp_521_num_bits_17_51_%=\n\t"
  133154. "movs r2, #0x68\n\t"
  133155. "ldrb r4, [%[table], r5]\n\t"
  133156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133157. "adds r2, r2, r4\n\t"
  133158. #else
  133159. "add r2, r2, r4\n\t"
  133160. #endif
  133161. "b L_sp_521_num_bits_17_18_%=\n\t"
  133162. "\n"
  133163. "L_sp_521_num_bits_17_51_%=:\n\t"
  133164. "movs r5, r3\n\t"
  133165. #ifdef WOLFSSL_KEIL
  133166. "ands r5, r5, r6\n\t"
  133167. #elif defined(__clang__)
  133168. "ands r5, r6\n\t"
  133169. #else
  133170. "and r5, r6\n\t"
  133171. #endif
  133172. "cmp r5, #0\n\t"
  133173. "beq L_sp_521_num_bits_17_50_%=\n\t"
  133174. "movs r2, #0x60\n\t"
  133175. "ldrb r4, [%[table], r5]\n\t"
  133176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133177. "adds r2, r2, r4\n\t"
  133178. #else
  133179. "add r2, r2, r4\n\t"
  133180. #endif
  133181. "b L_sp_521_num_bits_17_18_%=\n\t"
  133182. "\n"
  133183. "L_sp_521_num_bits_17_50_%=:\n\t"
  133184. "b L_sp_521_num_bits_17_18_%=\n\t"
  133185. "\n"
  133186. "L_sp_521_num_bits_17_3_%=:\n\t"
  133187. "ldr r3, [%[a], #8]\n\t"
  133188. "cmp r3, #0\n\t"
  133189. "beq L_sp_521_num_bits_17_2_%=\n\t"
  133190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133191. "lsrs r5, r3, #24\n\t"
  133192. #else
  133193. "lsr r5, r3, #24\n\t"
  133194. #endif
  133195. "cmp r5, #0\n\t"
  133196. "beq L_sp_521_num_bits_17_43_%=\n\t"
  133197. "movs r2, #0x58\n\t"
  133198. "ldrb r4, [%[table], r5]\n\t"
  133199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133200. "adds r2, r2, r4\n\t"
  133201. #else
  133202. "add r2, r2, r4\n\t"
  133203. #endif
  133204. "b L_sp_521_num_bits_17_18_%=\n\t"
  133205. "\n"
  133206. "L_sp_521_num_bits_17_43_%=:\n\t"
  133207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133208. "lsrs r5, r3, #16\n\t"
  133209. #else
  133210. "lsr r5, r3, #16\n\t"
  133211. #endif
  133212. #ifdef WOLFSSL_KEIL
  133213. "ands r5, r5, r6\n\t"
  133214. #elif defined(__clang__)
  133215. "ands r5, r6\n\t"
  133216. #else
  133217. "and r5, r6\n\t"
  133218. #endif
  133219. "cmp r5, #0\n\t"
  133220. "beq L_sp_521_num_bits_17_42_%=\n\t"
  133221. "movs r2, #0x50\n\t"
  133222. "ldrb r4, [%[table], r5]\n\t"
  133223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133224. "adds r2, r2, r4\n\t"
  133225. #else
  133226. "add r2, r2, r4\n\t"
  133227. #endif
  133228. "b L_sp_521_num_bits_17_18_%=\n\t"
  133229. "\n"
  133230. "L_sp_521_num_bits_17_42_%=:\n\t"
  133231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133232. "lsrs r5, r3, #8\n\t"
  133233. #else
  133234. "lsr r5, r3, #8\n\t"
  133235. #endif
  133236. #ifdef WOLFSSL_KEIL
  133237. "ands r5, r5, r6\n\t"
  133238. #elif defined(__clang__)
  133239. "ands r5, r6\n\t"
  133240. #else
  133241. "and r5, r6\n\t"
  133242. #endif
  133243. "cmp r5, #0\n\t"
  133244. "beq L_sp_521_num_bits_17_41_%=\n\t"
  133245. "movs r2, #0x48\n\t"
  133246. "ldrb r4, [%[table], r5]\n\t"
  133247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133248. "adds r2, r2, r4\n\t"
  133249. #else
  133250. "add r2, r2, r4\n\t"
  133251. #endif
  133252. "b L_sp_521_num_bits_17_18_%=\n\t"
  133253. "\n"
  133254. "L_sp_521_num_bits_17_41_%=:\n\t"
  133255. "movs r5, r3\n\t"
  133256. #ifdef WOLFSSL_KEIL
  133257. "ands r5, r5, r6\n\t"
  133258. #elif defined(__clang__)
  133259. "ands r5, r6\n\t"
  133260. #else
  133261. "and r5, r6\n\t"
  133262. #endif
  133263. "cmp r5, #0\n\t"
  133264. "beq L_sp_521_num_bits_17_40_%=\n\t"
  133265. "movs r2, #0x40\n\t"
  133266. "ldrb r4, [%[table], r5]\n\t"
  133267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133268. "adds r2, r2, r4\n\t"
  133269. #else
  133270. "add r2, r2, r4\n\t"
  133271. #endif
  133272. "b L_sp_521_num_bits_17_18_%=\n\t"
  133273. "\n"
  133274. "L_sp_521_num_bits_17_40_%=:\n\t"
  133275. "b L_sp_521_num_bits_17_18_%=\n\t"
  133276. "\n"
  133277. "L_sp_521_num_bits_17_2_%=:\n\t"
  133278. "ldr r3, [%[a], #4]\n\t"
  133279. "cmp r3, #0\n\t"
  133280. "beq L_sp_521_num_bits_17_1_%=\n\t"
  133281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133282. "lsrs r5, r3, #24\n\t"
  133283. #else
  133284. "lsr r5, r3, #24\n\t"
  133285. #endif
  133286. "cmp r5, #0\n\t"
  133287. "beq L_sp_521_num_bits_17_33_%=\n\t"
  133288. "movs r2, #56\n\t"
  133289. "ldrb r4, [%[table], r5]\n\t"
  133290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133291. "adds r2, r2, r4\n\t"
  133292. #else
  133293. "add r2, r2, r4\n\t"
  133294. #endif
  133295. "b L_sp_521_num_bits_17_18_%=\n\t"
  133296. "\n"
  133297. "L_sp_521_num_bits_17_33_%=:\n\t"
  133298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133299. "lsrs r5, r3, #16\n\t"
  133300. #else
  133301. "lsr r5, r3, #16\n\t"
  133302. #endif
  133303. #ifdef WOLFSSL_KEIL
  133304. "ands r5, r5, r6\n\t"
  133305. #elif defined(__clang__)
  133306. "ands r5, r6\n\t"
  133307. #else
  133308. "and r5, r6\n\t"
  133309. #endif
  133310. "cmp r5, #0\n\t"
  133311. "beq L_sp_521_num_bits_17_32_%=\n\t"
  133312. "movs r2, #48\n\t"
  133313. "ldrb r4, [%[table], r5]\n\t"
  133314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133315. "adds r2, r2, r4\n\t"
  133316. #else
  133317. "add r2, r2, r4\n\t"
  133318. #endif
  133319. "b L_sp_521_num_bits_17_18_%=\n\t"
  133320. "\n"
  133321. "L_sp_521_num_bits_17_32_%=:\n\t"
  133322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133323. "lsrs r5, r3, #8\n\t"
  133324. #else
  133325. "lsr r5, r3, #8\n\t"
  133326. #endif
  133327. #ifdef WOLFSSL_KEIL
  133328. "ands r5, r5, r6\n\t"
  133329. #elif defined(__clang__)
  133330. "ands r5, r6\n\t"
  133331. #else
  133332. "and r5, r6\n\t"
  133333. #endif
  133334. "cmp r5, #0\n\t"
  133335. "beq L_sp_521_num_bits_17_31_%=\n\t"
  133336. "movs r2, #40\n\t"
  133337. "ldrb r4, [%[table], r5]\n\t"
  133338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133339. "adds r2, r2, r4\n\t"
  133340. #else
  133341. "add r2, r2, r4\n\t"
  133342. #endif
  133343. "b L_sp_521_num_bits_17_18_%=\n\t"
  133344. "\n"
  133345. "L_sp_521_num_bits_17_31_%=:\n\t"
  133346. "movs r5, r3\n\t"
  133347. #ifdef WOLFSSL_KEIL
  133348. "ands r5, r5, r6\n\t"
  133349. #elif defined(__clang__)
  133350. "ands r5, r6\n\t"
  133351. #else
  133352. "and r5, r6\n\t"
  133353. #endif
  133354. "cmp r5, #0\n\t"
  133355. "beq L_sp_521_num_bits_17_30_%=\n\t"
  133356. "movs r2, #32\n\t"
  133357. "ldrb r4, [%[table], r5]\n\t"
  133358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133359. "adds r2, r2, r4\n\t"
  133360. #else
  133361. "add r2, r2, r4\n\t"
  133362. #endif
  133363. "b L_sp_521_num_bits_17_18_%=\n\t"
  133364. "\n"
  133365. "L_sp_521_num_bits_17_30_%=:\n\t"
  133366. "b L_sp_521_num_bits_17_18_%=\n\t"
  133367. "\n"
  133368. "L_sp_521_num_bits_17_1_%=:\n\t"
  133369. "ldr r3, [%[a]]\n\t"
  133370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133371. "lsrs r5, r3, #24\n\t"
  133372. #else
  133373. "lsr r5, r3, #24\n\t"
  133374. #endif
  133375. "cmp r5, #0\n\t"
  133376. "beq L_sp_521_num_bits_17_23_%=\n\t"
  133377. "movs r2, #24\n\t"
  133378. "ldrb r4, [%[table], r5]\n\t"
  133379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133380. "adds r2, r2, r4\n\t"
  133381. #else
  133382. "add r2, r2, r4\n\t"
  133383. #endif
  133384. "b L_sp_521_num_bits_17_18_%=\n\t"
  133385. "\n"
  133386. "L_sp_521_num_bits_17_23_%=:\n\t"
  133387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133388. "lsrs r5, r3, #16\n\t"
  133389. #else
  133390. "lsr r5, r3, #16\n\t"
  133391. #endif
  133392. #ifdef WOLFSSL_KEIL
  133393. "ands r5, r5, r6\n\t"
  133394. #elif defined(__clang__)
  133395. "ands r5, r6\n\t"
  133396. #else
  133397. "and r5, r6\n\t"
  133398. #endif
  133399. "cmp r5, #0\n\t"
  133400. "beq L_sp_521_num_bits_17_22_%=\n\t"
  133401. "movs r2, #16\n\t"
  133402. "ldrb r4, [%[table], r5]\n\t"
  133403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133404. "adds r2, r2, r4\n\t"
  133405. #else
  133406. "add r2, r2, r4\n\t"
  133407. #endif
  133408. "b L_sp_521_num_bits_17_18_%=\n\t"
  133409. "\n"
  133410. "L_sp_521_num_bits_17_22_%=:\n\t"
  133411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133412. "lsrs r5, r3, #8\n\t"
  133413. #else
  133414. "lsr r5, r3, #8\n\t"
  133415. #endif
  133416. #ifdef WOLFSSL_KEIL
  133417. "ands r5, r5, r6\n\t"
  133418. #elif defined(__clang__)
  133419. "ands r5, r6\n\t"
  133420. #else
  133421. "and r5, r6\n\t"
  133422. #endif
  133423. "cmp r5, #0\n\t"
  133424. "beq L_sp_521_num_bits_17_21_%=\n\t"
  133425. "movs r2, #8\n\t"
  133426. "ldrb r4, [%[table], r5]\n\t"
  133427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133428. "adds r2, r2, r4\n\t"
  133429. #else
  133430. "add r2, r2, r4\n\t"
  133431. #endif
  133432. "b L_sp_521_num_bits_17_18_%=\n\t"
  133433. "\n"
  133434. "L_sp_521_num_bits_17_21_%=:\n\t"
  133435. "movs r5, r3\n\t"
  133436. #ifdef WOLFSSL_KEIL
  133437. "ands r5, r5, r6\n\t"
  133438. #elif defined(__clang__)
  133439. "ands r5, r6\n\t"
  133440. #else
  133441. "and r5, r6\n\t"
  133442. #endif
  133443. "cmp r5, #0\n\t"
  133444. "beq L_sp_521_num_bits_17_20_%=\n\t"
  133445. "movs r2, #0\n\t"
  133446. "ldrb r4, [%[table], r5]\n\t"
  133447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133448. "adds r2, r2, r4\n\t"
  133449. #else
  133450. "add r2, r2, r4\n\t"
  133451. #endif
  133452. "b L_sp_521_num_bits_17_18_%=\n\t"
  133453. "\n"
  133454. "L_sp_521_num_bits_17_20_%=:\n\t"
  133455. "\n"
  133456. "L_sp_521_num_bits_17_18_%=:\n\t"
  133457. "movs %[a], r2\n\t"
  133458. : [a] "+l" (a), [table] "+l" (table)
  133459. :
  133460. : "memory", "r2", "r3", "r4", "r5", "r6"
  133461. );
  133462. return (uint32_t)(size_t)a;
  133463. }
  133464. /* Non-constant time modular inversion.
  133465. *
  133466. * @param [out] r Resulting number.
  133467. * @param [in] a Number to invert.
  133468. * @param [in] m Modulus.
  133469. * @return MP_OKAY on success.
  133470. */
  133471. static int sp_521_mod_inv_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  133472. {
  133473. sp_digit u[17];
  133474. sp_digit v[17];
  133475. sp_digit b[17];
  133476. sp_digit d[17];
  133477. int ut, vt;
  133478. sp_digit o;
  133479. XMEMCPY(u, m, sizeof(u));
  133480. XMEMCPY(v, a, sizeof(v));
  133481. ut = sp_521_num_bits_17(u);
  133482. vt = sp_521_num_bits_17(v);
  133483. XMEMSET(b, 0, sizeof(b));
  133484. if ((v[0] & 1) == 0) {
  133485. sp_521_rshift1_17(v, v);
  133486. XMEMCPY(d, m, sizeof(u));
  133487. d[0] += 1;
  133488. sp_521_rshift1_17(d, d);
  133489. vt--;
  133490. while ((v[0] & 1) == 0) {
  133491. sp_521_rshift1_17(v, v);
  133492. sp_521_div2_mod_17(d, d, m);
  133493. vt--;
  133494. }
  133495. }
  133496. else {
  133497. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  133498. d[0] = 1;
  133499. }
  133500. while (ut > 1 && vt > 1) {
  133501. if ((ut > vt) || ((ut == vt) && (sp_521_cmp_17(u, v) >= 0))) {
  133502. sp_521_sub_17(u, u, v);
  133503. o = sp_521_sub_17(b, b, d);
  133504. if (o != 0)
  133505. sp_521_add_17(b, b, m);
  133506. ut = sp_521_num_bits_17(u);
  133507. do {
  133508. sp_521_rshift1_17(u, u);
  133509. sp_521_div2_mod_17(b, b, m);
  133510. ut--;
  133511. }
  133512. while (ut > 0 && (u[0] & 1) == 0);
  133513. }
  133514. else {
  133515. sp_521_sub_17(v, v, u);
  133516. o = sp_521_sub_17(d, d, b);
  133517. if (o != 0)
  133518. sp_521_add_17(d, d, m);
  133519. vt = sp_521_num_bits_17(v);
  133520. do {
  133521. sp_521_rshift1_17(v, v);
  133522. sp_521_div2_mod_17(d, d, m);
  133523. vt--;
  133524. }
  133525. while (vt > 0 && (v[0] & 1) == 0);
  133526. }
  133527. }
  133528. if (ut == 1)
  133529. XMEMCPY(r, b, sizeof(b));
  133530. else
  133531. XMEMCPY(r, d, sizeof(d));
  133532. return MP_OKAY;
  133533. }
  133534. #endif /* WOLFSSL_SP_SMALL */
  133535. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  133536. *
  133537. * p1 First point to add and holds result.
  133538. * p2 Second point to add.
  133539. * tmp Temporary storage for intermediate numbers.
  133540. */
  133541. static void sp_521_add_points_17(sp_point_521* p1, const sp_point_521* p2,
  133542. sp_digit* tmp)
  133543. {
  133544. sp_521_proj_point_add_17(p1, p1, p2, tmp);
  133545. if (sp_521_iszero_17(p1->z)) {
  133546. if (sp_521_iszero_17(p1->x) && sp_521_iszero_17(p1->y)) {
  133547. sp_521_proj_point_dbl_17(p1, p2, tmp);
  133548. }
  133549. else {
  133550. /* Y ordinate is not used from here - don't set. */
  133551. p1->x[0] = 0;
  133552. p1->x[1] = 0;
  133553. p1->x[2] = 0;
  133554. p1->x[3] = 0;
  133555. p1->x[4] = 0;
  133556. p1->x[5] = 0;
  133557. p1->x[6] = 0;
  133558. p1->x[7] = 0;
  133559. p1->x[8] = 0;
  133560. p1->x[9] = 0;
  133561. p1->x[10] = 0;
  133562. p1->x[11] = 0;
  133563. p1->x[12] = 0;
  133564. p1->x[13] = 0;
  133565. p1->x[14] = 0;
  133566. p1->x[15] = 0;
  133567. p1->x[16] = 0;
  133568. XMEMCPY(p1->z, p521_norm_mod, sizeof(p521_norm_mod));
  133569. }
  133570. }
  133571. }
  133572. /* Calculate the verification point: [e/s]G + [r/s]Q
  133573. *
  133574. * p1 Calculated point.
  133575. * p2 Public point and temporary.
  133576. * s Second part of signature as a number.
  133577. * u1 Temporary number.
  133578. * u2 Temporary number.
  133579. * heap Heap to use for allocation.
  133580. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  133581. */
  133582. static int sp_521_calc_vfy_point_17(sp_point_521* p1, sp_point_521* p2,
  133583. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  133584. {
  133585. int err;
  133586. #ifndef WOLFSSL_SP_SMALL
  133587. err = sp_521_mod_inv_17(s, s, p521_order);
  133588. if (err == MP_OKAY)
  133589. #endif /* !WOLFSSL_SP_SMALL */
  133590. {
  133591. sp_521_mul_17(s, s, p521_norm_order);
  133592. err = sp_521_mod_17(s, s, p521_order);
  133593. }
  133594. if (err == MP_OKAY) {
  133595. sp_521_norm_17(s);
  133596. #ifdef WOLFSSL_SP_SMALL
  133597. {
  133598. sp_521_mont_inv_order_17(s, s, tmp);
  133599. sp_521_mont_mul_order_17(u1, u1, s);
  133600. sp_521_mont_mul_order_17(u2, u2, s);
  133601. }
  133602. #else
  133603. {
  133604. sp_521_mont_mul_order_17(u1, u1, s);
  133605. sp_521_mont_mul_order_17(u2, u2, s);
  133606. }
  133607. #endif /* WOLFSSL_SP_SMALL */
  133608. {
  133609. err = sp_521_ecc_mulmod_base_17(p1, u1, 0, 0, heap);
  133610. }
  133611. }
  133612. if ((err == MP_OKAY) && sp_521_iszero_17(p1->z)) {
  133613. p1->infinity = 1;
  133614. }
  133615. if (err == MP_OKAY) {
  133616. err = sp_521_ecc_mulmod_17(p2, p2, u2, 0, 0, heap);
  133617. }
  133618. if ((err == MP_OKAY) && sp_521_iszero_17(p2->z)) {
  133619. p2->infinity = 1;
  133620. }
  133621. if (err == MP_OKAY) {
  133622. sp_521_add_points_17(p1, p2, tmp);
  133623. }
  133624. return err;
  133625. }
  133626. #ifdef HAVE_ECC_VERIFY
  133627. /* Verify the signature values with the hash and public key.
  133628. * e = Truncate(hash, 521)
  133629. * u1 = e/s mod order
  133630. * u2 = r/s mod order
  133631. * r == (u1.G + u2.Q)->x mod order
  133632. * Optimization: Leave point in projective form.
  133633. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  133634. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  133635. * The hash is truncated to the first 521 bits.
  133636. *
  133637. * hash Hash to sign.
  133638. * hashLen Length of the hash data.
  133639. * rng Random number generator.
  133640. * priv Private part of key - scalar.
  133641. * rm First part of result as an mp_int.
  133642. * sm Sirst part of result as an mp_int.
  133643. * heap Heap to use for allocation.
  133644. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  133645. */
  133646. int sp_ecc_verify_521(const byte* hash, word32 hashLen, const mp_int* pX,
  133647. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  133648. int* res, void* heap)
  133649. {
  133650. #ifdef WOLFSSL_SP_SMALL_STACK
  133651. sp_digit* u1 = NULL;
  133652. sp_point_521* p1 = NULL;
  133653. #else
  133654. sp_digit u1[18 * 17];
  133655. sp_point_521 p1[2];
  133656. #endif
  133657. sp_digit* u2 = NULL;
  133658. sp_digit* s = NULL;
  133659. sp_digit* tmp = NULL;
  133660. sp_point_521* p2 = NULL;
  133661. sp_digit carry;
  133662. sp_int32 c = 0;
  133663. int err = MP_OKAY;
  133664. #ifdef WOLFSSL_SP_SMALL_STACK
  133665. if (err == MP_OKAY) {
  133666. p1 = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  133667. DYNAMIC_TYPE_ECC);
  133668. if (p1 == NULL)
  133669. err = MEMORY_E;
  133670. }
  133671. if (err == MP_OKAY) {
  133672. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 17, heap,
  133673. DYNAMIC_TYPE_ECC);
  133674. if (u1 == NULL)
  133675. err = MEMORY_E;
  133676. }
  133677. #endif
  133678. if (err == MP_OKAY) {
  133679. u2 = u1 + 2 * 17;
  133680. s = u1 + 4 * 17;
  133681. tmp = u1 + 6 * 17;
  133682. p2 = p1 + 1;
  133683. if (hashLen > 66U) {
  133684. hashLen = 66U;
  133685. }
  133686. sp_521_from_bin(u1, 17, hash, (int)hashLen);
  133687. sp_521_from_mp(u2, 17, rm);
  133688. sp_521_from_mp(s, 17, sm);
  133689. sp_521_from_mp(p2->x, 17, pX);
  133690. sp_521_from_mp(p2->y, 17, pY);
  133691. sp_521_from_mp(p2->z, 17, pZ);
  133692. if (hashLen == 66U) {
  133693. sp_521_rshift_17(u1, u1, 7);
  133694. }
  133695. err = sp_521_calc_vfy_point_17(p1, p2, s, u1, u2, tmp, heap);
  133696. }
  133697. if (err == MP_OKAY) {
  133698. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  133699. /* Reload r and convert to Montgomery form. */
  133700. sp_521_from_mp(u2, 17, rm);
  133701. err = sp_521_mod_mul_norm_17(u2, u2, p521_mod);
  133702. }
  133703. if (err == MP_OKAY) {
  133704. /* u1 = r.z'.z' mod prime */
  133705. sp_521_mont_sqr_17(p1->z, p1->z, p521_mod, p521_mp_mod);
  133706. sp_521_mont_mul_17(u1, u2, p1->z, p521_mod, p521_mp_mod);
  133707. *res = (int)(sp_521_cmp_17(p1->x, u1) == 0);
  133708. if (*res == 0) {
  133709. /* Reload r and add order. */
  133710. sp_521_from_mp(u2, 17, rm);
  133711. carry = sp_521_add_17(u2, u2, p521_order);
  133712. /* Carry means result is greater than mod and is not valid. */
  133713. if (carry == 0) {
  133714. sp_521_norm_17(u2);
  133715. /* Compare with mod and if greater or equal then not valid. */
  133716. c = sp_521_cmp_17(u2, p521_mod);
  133717. }
  133718. }
  133719. if ((*res == 0) && (c < 0)) {
  133720. /* Convert to Montogomery form */
  133721. err = sp_521_mod_mul_norm_17(u2, u2, p521_mod);
  133722. if (err == MP_OKAY) {
  133723. /* u1 = (r + 1*order).z'.z' mod prime */
  133724. {
  133725. sp_521_mont_mul_17(u1, u2, p1->z, p521_mod, p521_mp_mod);
  133726. }
  133727. *res = (sp_521_cmp_17(p1->x, u1) == 0);
  133728. }
  133729. }
  133730. }
  133731. #ifdef WOLFSSL_SP_SMALL_STACK
  133732. if (u1 != NULL)
  133733. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  133734. if (p1 != NULL)
  133735. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  133736. #endif
  133737. return err;
  133738. }
  133739. #ifdef WOLFSSL_SP_NONBLOCK
  133740. typedef struct sp_ecc_verify_521_ctx {
  133741. int state;
  133742. union {
  133743. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  133744. sp_521_mont_inv_order_17_ctx mont_inv_order_ctx;
  133745. sp_521_proj_point_dbl_17_ctx dbl_ctx;
  133746. sp_521_proj_point_add_17_ctx add_ctx;
  133747. };
  133748. sp_digit u1[2*17];
  133749. sp_digit u2[2*17];
  133750. sp_digit s[2*17];
  133751. sp_digit tmp[2*17 * 6];
  133752. sp_point_521 p1;
  133753. sp_point_521 p2;
  133754. } sp_ecc_verify_521_ctx;
  133755. int sp_ecc_verify_521_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  133756. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  133757. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  133758. {
  133759. int err = FP_WOULDBLOCK;
  133760. sp_ecc_verify_521_ctx* ctx = (sp_ecc_verify_521_ctx*)sp_ctx->data;
  133761. typedef char ctx_size_test[sizeof(sp_ecc_verify_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  133762. (void)sizeof(ctx_size_test);
  133763. switch (ctx->state) {
  133764. case 0: /* INIT */
  133765. if (hashLen > 66U) {
  133766. hashLen = 66U;
  133767. }
  133768. sp_521_from_bin(ctx->u1, 17, hash, (int)hashLen);
  133769. sp_521_from_mp(ctx->u2, 17, rm);
  133770. sp_521_from_mp(ctx->s, 17, sm);
  133771. sp_521_from_mp(ctx->p2.x, 17, pX);
  133772. sp_521_from_mp(ctx->p2.y, 17, pY);
  133773. sp_521_from_mp(ctx->p2.z, 17, pZ);
  133774. if (hashLen == 66U) {
  133775. sp_521_rshift_17(ctx->u1, ctx->u1, 7);
  133776. }
  133777. ctx->state = 1;
  133778. break;
  133779. case 1: /* NORMS0 */
  133780. sp_521_mul_17(ctx->s, ctx->s, p521_norm_order);
  133781. err = sp_521_mod_17(ctx->s, ctx->s, p521_order);
  133782. if (err == MP_OKAY)
  133783. ctx->state = 2;
  133784. break;
  133785. case 2: /* NORMS1 */
  133786. sp_521_norm_17(ctx->s);
  133787. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  133788. ctx->state = 3;
  133789. break;
  133790. case 3: /* NORMS2 */
  133791. err = sp_521_mont_inv_order_17_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  133792. if (err == MP_OKAY) {
  133793. ctx->state = 4;
  133794. }
  133795. break;
  133796. case 4: /* NORMS3 */
  133797. sp_521_mont_mul_order_17(ctx->u1, ctx->u1, ctx->s);
  133798. ctx->state = 5;
  133799. break;
  133800. case 5: /* NORMS4 */
  133801. sp_521_mont_mul_order_17(ctx->u2, ctx->u2, ctx->s);
  133802. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  133803. ctx->state = 6;
  133804. break;
  133805. case 6: /* MULBASE */
  133806. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p521_base, ctx->u1, 0, 0, heap);
  133807. if (err == MP_OKAY) {
  133808. if (sp_521_iszero_17(ctx->p1.z)) {
  133809. ctx->p1.infinity = 1;
  133810. }
  133811. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  133812. ctx->state = 7;
  133813. }
  133814. break;
  133815. case 7: /* MULMOD */
  133816. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  133817. if (err == MP_OKAY) {
  133818. if (sp_521_iszero_17(ctx->p2.z)) {
  133819. ctx->p2.infinity = 1;
  133820. }
  133821. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  133822. ctx->state = 8;
  133823. }
  133824. break;
  133825. case 8: /* ADD */
  133826. err = sp_521_proj_point_add_17_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  133827. if (err == MP_OKAY)
  133828. ctx->state = 9;
  133829. break;
  133830. case 9: /* MONT */
  133831. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  133832. /* Reload r and convert to Montgomery form. */
  133833. sp_521_from_mp(ctx->u2, 17, rm);
  133834. err = sp_521_mod_mul_norm_17(ctx->u2, ctx->u2, p521_mod);
  133835. if (err == MP_OKAY)
  133836. ctx->state = 10;
  133837. break;
  133838. case 10: /* SQR */
  133839. /* u1 = r.z'.z' mod prime */
  133840. sp_521_mont_sqr_17(ctx->p1.z, ctx->p1.z, p521_mod, p521_mp_mod);
  133841. ctx->state = 11;
  133842. break;
  133843. case 11: /* MUL */
  133844. sp_521_mont_mul_17(ctx->u1, ctx->u2, ctx->p1.z, p521_mod, p521_mp_mod);
  133845. ctx->state = 12;
  133846. break;
  133847. case 12: /* RES */
  133848. {
  133849. sp_int32 c = 0;
  133850. err = MP_OKAY; /* math okay, now check result */
  133851. *res = (int)(sp_521_cmp_17(ctx->p1.x, ctx->u1) == 0);
  133852. if (*res == 0) {
  133853. sp_digit carry;
  133854. /* Reload r and add order. */
  133855. sp_521_from_mp(ctx->u2, 17, rm);
  133856. carry = sp_521_add_17(ctx->u2, ctx->u2, p521_order);
  133857. /* Carry means result is greater than mod and is not valid. */
  133858. if (carry == 0) {
  133859. sp_521_norm_17(ctx->u2);
  133860. /* Compare with mod and if greater or equal then not valid. */
  133861. c = sp_521_cmp_17(ctx->u2, p521_mod);
  133862. }
  133863. }
  133864. if ((*res == 0) && (c < 0)) {
  133865. /* Convert to Montogomery form */
  133866. err = sp_521_mod_mul_norm_17(ctx->u2, ctx->u2, p521_mod);
  133867. if (err == MP_OKAY) {
  133868. /* u1 = (r + 1*order).z'.z' mod prime */
  133869. sp_521_mont_mul_17(ctx->u1, ctx->u2, ctx->p1.z, p521_mod,
  133870. p521_mp_mod);
  133871. *res = (int)(sp_521_cmp_17(ctx->p1.x, ctx->u1) == 0);
  133872. }
  133873. }
  133874. break;
  133875. }
  133876. } /* switch */
  133877. if (err == MP_OKAY && ctx->state != 12) {
  133878. err = FP_WOULDBLOCK;
  133879. }
  133880. return err;
  133881. }
  133882. #endif /* WOLFSSL_SP_NONBLOCK */
  133883. #endif /* HAVE_ECC_VERIFY */
  133884. #ifdef HAVE_ECC_CHECK_KEY
  133885. /* Check that the x and y ordinates are a valid point on the curve.
  133886. *
  133887. * point EC point.
  133888. * heap Heap to use if dynamically allocating.
  133889. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  133890. * not on the curve and MP_OKAY otherwise.
  133891. */
  133892. static int sp_521_ecc_is_point_17(const sp_point_521* point,
  133893. void* heap)
  133894. {
  133895. #ifdef WOLFSSL_SP_SMALL_STACK
  133896. sp_digit* t1 = NULL;
  133897. #else
  133898. sp_digit t1[17 * 4];
  133899. #endif
  133900. sp_digit* t2 = NULL;
  133901. int err = MP_OKAY;
  133902. #ifdef WOLFSSL_SP_SMALL_STACK
  133903. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17 * 4, heap, DYNAMIC_TYPE_ECC);
  133904. if (t1 == NULL)
  133905. err = MEMORY_E;
  133906. #endif
  133907. (void)heap;
  133908. if (err == MP_OKAY) {
  133909. t2 = t1 + 2 * 17;
  133910. /* y^2 - x^3 - a.x = b */
  133911. sp_521_sqr_17(t1, point->y);
  133912. (void)sp_521_mod_17(t1, t1, p521_mod);
  133913. sp_521_sqr_17(t2, point->x);
  133914. (void)sp_521_mod_17(t2, t2, p521_mod);
  133915. sp_521_mul_17(t2, t2, point->x);
  133916. (void)sp_521_mod_17(t2, t2, p521_mod);
  133917. sp_521_mont_sub_17(t1, t1, t2, p521_mod);
  133918. /* y^2 - x^3 + 3.x = b, when a = -3 */
  133919. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  133920. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  133921. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  133922. if (sp_521_cmp_17(t1, p521_b) != 0) {
  133923. err = MP_VAL;
  133924. }
  133925. }
  133926. #ifdef WOLFSSL_SP_SMALL_STACK
  133927. if (t1 != NULL)
  133928. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  133929. #endif
  133930. return err;
  133931. }
  133932. /* Check that the x and y ordinates are a valid point on the curve.
  133933. *
  133934. * pX X ordinate of EC point.
  133935. * pY Y ordinate of EC point.
  133936. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  133937. * not on the curve and MP_OKAY otherwise.
  133938. */
  133939. int sp_ecc_is_point_521(const mp_int* pX, const mp_int* pY)
  133940. {
  133941. #ifdef WOLFSSL_SP_SMALL_STACK
  133942. sp_point_521* pub = NULL;
  133943. #else
  133944. sp_point_521 pub[1];
  133945. #endif
  133946. const byte one[1] = { 1 };
  133947. int err = MP_OKAY;
  133948. #ifdef WOLFSSL_SP_SMALL_STACK
  133949. pub = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  133950. DYNAMIC_TYPE_ECC);
  133951. if (pub == NULL)
  133952. err = MEMORY_E;
  133953. #endif
  133954. if (err == MP_OKAY) {
  133955. sp_521_from_mp(pub->x, 17, pX);
  133956. sp_521_from_mp(pub->y, 17, pY);
  133957. sp_521_from_bin(pub->z, 17, one, (int)sizeof(one));
  133958. err = sp_521_ecc_is_point_17(pub, NULL);
  133959. }
  133960. #ifdef WOLFSSL_SP_SMALL_STACK
  133961. if (pub != NULL)
  133962. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  133963. #endif
  133964. return err;
  133965. }
  133966. /* Check that the private scalar generates the EC point (px, py), the point is
  133967. * on the curve and the point has the correct order.
  133968. *
  133969. * pX X ordinate of EC point.
  133970. * pY Y ordinate of EC point.
  133971. * privm Private scalar that generates EC point.
  133972. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  133973. * not on the curve, ECC_INF_E if the point does not have the correct order,
  133974. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  133975. * MP_OKAY otherwise.
  133976. */
  133977. int sp_ecc_check_key_521(const mp_int* pX, const mp_int* pY,
  133978. const mp_int* privm, void* heap)
  133979. {
  133980. #ifdef WOLFSSL_SP_SMALL_STACK
  133981. sp_digit* priv = NULL;
  133982. sp_point_521* pub = NULL;
  133983. #else
  133984. sp_digit priv[17];
  133985. sp_point_521 pub[2];
  133986. #endif
  133987. sp_point_521* p = NULL;
  133988. const byte one[1] = { 1 };
  133989. int err = MP_OKAY;
  133990. /* Quick check the lengs of public key ordinates and private key are in
  133991. * range. Proper check later.
  133992. */
  133993. if (((mp_count_bits(pX) > 521) ||
  133994. (mp_count_bits(pY) > 521) ||
  133995. ((privm != NULL) && (mp_count_bits(privm) > 521)))) {
  133996. err = ECC_OUT_OF_RANGE_E;
  133997. }
  133998. #ifdef WOLFSSL_SP_SMALL_STACK
  133999. if (err == MP_OKAY) {
  134000. pub = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  134001. DYNAMIC_TYPE_ECC);
  134002. if (pub == NULL)
  134003. err = MEMORY_E;
  134004. }
  134005. if (err == MP_OKAY && privm) {
  134006. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  134007. DYNAMIC_TYPE_ECC);
  134008. if (priv == NULL)
  134009. err = MEMORY_E;
  134010. }
  134011. #endif
  134012. if (err == MP_OKAY) {
  134013. p = pub + 1;
  134014. sp_521_from_mp(pub->x, 17, pX);
  134015. sp_521_from_mp(pub->y, 17, pY);
  134016. sp_521_from_bin(pub->z, 17, one, (int)sizeof(one));
  134017. if (privm)
  134018. sp_521_from_mp(priv, 17, privm);
  134019. /* Check point at infinitiy. */
  134020. if ((sp_521_iszero_17(pub->x) != 0) &&
  134021. (sp_521_iszero_17(pub->y) != 0)) {
  134022. err = ECC_INF_E;
  134023. }
  134024. }
  134025. /* Check range of X and Y */
  134026. if ((err == MP_OKAY) &&
  134027. ((sp_521_cmp_17(pub->x, p521_mod) >= 0) ||
  134028. (sp_521_cmp_17(pub->y, p521_mod) >= 0))) {
  134029. err = ECC_OUT_OF_RANGE_E;
  134030. }
  134031. if (err == MP_OKAY) {
  134032. /* Check point is on curve */
  134033. err = sp_521_ecc_is_point_17(pub, heap);
  134034. }
  134035. if (err == MP_OKAY) {
  134036. /* Point * order = infinity */
  134037. err = sp_521_ecc_mulmod_17(p, pub, p521_order, 1, 1, heap);
  134038. }
  134039. /* Check result is infinity */
  134040. if ((err == MP_OKAY) && ((sp_521_iszero_17(p->x) == 0) ||
  134041. (sp_521_iszero_17(p->y) == 0))) {
  134042. err = ECC_INF_E;
  134043. }
  134044. if (privm) {
  134045. if (err == MP_OKAY) {
  134046. /* Base * private = point */
  134047. err = sp_521_ecc_mulmod_base_17(p, priv, 1, 1, heap);
  134048. }
  134049. /* Check result is public key */
  134050. if ((err == MP_OKAY) &&
  134051. ((sp_521_cmp_17(p->x, pub->x) != 0) ||
  134052. (sp_521_cmp_17(p->y, pub->y) != 0))) {
  134053. err = ECC_PRIV_KEY_E;
  134054. }
  134055. }
  134056. #ifdef WOLFSSL_SP_SMALL_STACK
  134057. if (pub != NULL)
  134058. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  134059. if (priv != NULL)
  134060. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  134061. #endif
  134062. return err;
  134063. }
  134064. #endif
  134065. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  134066. /* Add two projective EC points together.
  134067. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  134068. *
  134069. * pX First EC point's X ordinate.
  134070. * pY First EC point's Y ordinate.
  134071. * pZ First EC point's Z ordinate.
  134072. * qX Second EC point's X ordinate.
  134073. * qY Second EC point's Y ordinate.
  134074. * qZ Second EC point's Z ordinate.
  134075. * rX Resultant EC point's X ordinate.
  134076. * rY Resultant EC point's Y ordinate.
  134077. * rZ Resultant EC point's Z ordinate.
  134078. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  134079. */
  134080. int sp_ecc_proj_add_point_521(mp_int* pX, mp_int* pY, mp_int* pZ,
  134081. mp_int* qX, mp_int* qY, mp_int* qZ,
  134082. mp_int* rX, mp_int* rY, mp_int* rZ)
  134083. {
  134084. #ifdef WOLFSSL_SP_SMALL_STACK
  134085. sp_digit* tmp = NULL;
  134086. sp_point_521* p = NULL;
  134087. #else
  134088. sp_digit tmp[2 * 17 * 6];
  134089. sp_point_521 p[2];
  134090. #endif
  134091. sp_point_521* q = NULL;
  134092. int err = MP_OKAY;
  134093. #ifdef WOLFSSL_SP_SMALL_STACK
  134094. if (err == MP_OKAY) {
  134095. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, NULL,
  134096. DYNAMIC_TYPE_ECC);
  134097. if (p == NULL)
  134098. err = MEMORY_E;
  134099. }
  134100. if (err == MP_OKAY) {
  134101. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, NULL,
  134102. DYNAMIC_TYPE_ECC);
  134103. if (tmp == NULL) {
  134104. err = MEMORY_E;
  134105. }
  134106. }
  134107. #endif
  134108. if (err == MP_OKAY) {
  134109. q = p + 1;
  134110. sp_521_from_mp(p->x, 17, pX);
  134111. sp_521_from_mp(p->y, 17, pY);
  134112. sp_521_from_mp(p->z, 17, pZ);
  134113. sp_521_from_mp(q->x, 17, qX);
  134114. sp_521_from_mp(q->y, 17, qY);
  134115. sp_521_from_mp(q->z, 17, qZ);
  134116. p->infinity = sp_521_iszero_17(p->x) &
  134117. sp_521_iszero_17(p->y);
  134118. q->infinity = sp_521_iszero_17(q->x) &
  134119. sp_521_iszero_17(q->y);
  134120. sp_521_proj_point_add_17(p, p, q, tmp);
  134121. }
  134122. if (err == MP_OKAY) {
  134123. err = sp_521_to_mp(p->x, rX);
  134124. }
  134125. if (err == MP_OKAY) {
  134126. err = sp_521_to_mp(p->y, rY);
  134127. }
  134128. if (err == MP_OKAY) {
  134129. err = sp_521_to_mp(p->z, rZ);
  134130. }
  134131. #ifdef WOLFSSL_SP_SMALL_STACK
  134132. if (tmp != NULL)
  134133. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  134134. if (p != NULL)
  134135. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  134136. #endif
  134137. return err;
  134138. }
  134139. /* Double a projective EC point.
  134140. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  134141. *
  134142. * pX EC point's X ordinate.
  134143. * pY EC point's Y ordinate.
  134144. * pZ EC point's Z ordinate.
  134145. * rX Resultant EC point's X ordinate.
  134146. * rY Resultant EC point's Y ordinate.
  134147. * rZ Resultant EC point's Z ordinate.
  134148. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  134149. */
  134150. int sp_ecc_proj_dbl_point_521(mp_int* pX, mp_int* pY, mp_int* pZ,
  134151. mp_int* rX, mp_int* rY, mp_int* rZ)
  134152. {
  134153. #ifdef WOLFSSL_SP_SMALL_STACK
  134154. sp_digit* tmp = NULL;
  134155. sp_point_521* p = NULL;
  134156. #else
  134157. sp_digit tmp[2 * 17 * 2];
  134158. sp_point_521 p[1];
  134159. #endif
  134160. int err = MP_OKAY;
  134161. #ifdef WOLFSSL_SP_SMALL_STACK
  134162. if (err == MP_OKAY) {
  134163. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  134164. DYNAMIC_TYPE_ECC);
  134165. if (p == NULL)
  134166. err = MEMORY_E;
  134167. }
  134168. if (err == MP_OKAY) {
  134169. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 2, NULL,
  134170. DYNAMIC_TYPE_ECC);
  134171. if (tmp == NULL)
  134172. err = MEMORY_E;
  134173. }
  134174. #endif
  134175. if (err == MP_OKAY) {
  134176. sp_521_from_mp(p->x, 17, pX);
  134177. sp_521_from_mp(p->y, 17, pY);
  134178. sp_521_from_mp(p->z, 17, pZ);
  134179. p->infinity = sp_521_iszero_17(p->x) &
  134180. sp_521_iszero_17(p->y);
  134181. sp_521_proj_point_dbl_17(p, p, tmp);
  134182. }
  134183. if (err == MP_OKAY) {
  134184. err = sp_521_to_mp(p->x, rX);
  134185. }
  134186. if (err == MP_OKAY) {
  134187. err = sp_521_to_mp(p->y, rY);
  134188. }
  134189. if (err == MP_OKAY) {
  134190. err = sp_521_to_mp(p->z, rZ);
  134191. }
  134192. #ifdef WOLFSSL_SP_SMALL_STACK
  134193. if (tmp != NULL)
  134194. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  134195. if (p != NULL)
  134196. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  134197. #endif
  134198. return err;
  134199. }
  134200. /* Map a projective EC point to affine in place.
  134201. * pZ will be one.
  134202. *
  134203. * pX EC point's X ordinate.
  134204. * pY EC point's Y ordinate.
  134205. * pZ EC point's Z ordinate.
  134206. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  134207. */
  134208. int sp_ecc_map_521(mp_int* pX, mp_int* pY, mp_int* pZ)
  134209. {
  134210. #ifdef WOLFSSL_SP_SMALL_STACK
  134211. sp_digit* tmp = NULL;
  134212. sp_point_521* p = NULL;
  134213. #else
  134214. sp_digit tmp[2 * 17 * 5];
  134215. sp_point_521 p[1];
  134216. #endif
  134217. int err = MP_OKAY;
  134218. #ifdef WOLFSSL_SP_SMALL_STACK
  134219. if (err == MP_OKAY) {
  134220. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  134221. DYNAMIC_TYPE_ECC);
  134222. if (p == NULL)
  134223. err = MEMORY_E;
  134224. }
  134225. if (err == MP_OKAY) {
  134226. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 5, NULL,
  134227. DYNAMIC_TYPE_ECC);
  134228. if (tmp == NULL)
  134229. err = MEMORY_E;
  134230. }
  134231. #endif
  134232. if (err == MP_OKAY) {
  134233. sp_521_from_mp(p->x, 17, pX);
  134234. sp_521_from_mp(p->y, 17, pY);
  134235. sp_521_from_mp(p->z, 17, pZ);
  134236. p->infinity = sp_521_iszero_17(p->x) &
  134237. sp_521_iszero_17(p->y);
  134238. sp_521_map_17(p, p, tmp);
  134239. }
  134240. if (err == MP_OKAY) {
  134241. err = sp_521_to_mp(p->x, pX);
  134242. }
  134243. if (err == MP_OKAY) {
  134244. err = sp_521_to_mp(p->y, pY);
  134245. }
  134246. if (err == MP_OKAY) {
  134247. err = sp_521_to_mp(p->z, pZ);
  134248. }
  134249. #ifdef WOLFSSL_SP_SMALL_STACK
  134250. if (tmp != NULL)
  134251. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  134252. if (p != NULL)
  134253. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  134254. #endif
  134255. return err;
  134256. }
  134257. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  134258. #ifdef HAVE_COMP_KEY
  134259. /* Square root power for the P521 curve. */
  134260. static const uint32_t p521_sqrt_power[17] = {
  134261. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  134262. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  134263. 0x00000000,0x00000000,0x00000080
  134264. };
  134265. /* Find the square root of a number mod the prime of the curve.
  134266. *
  134267. * y The number to operate on and the result.
  134268. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  134269. */
  134270. static int sp_521_mont_sqrt_17(sp_digit* y)
  134271. {
  134272. #ifdef WOLFSSL_SP_SMALL_STACK
  134273. sp_digit* t = NULL;
  134274. #else
  134275. sp_digit t[2 * 17];
  134276. #endif
  134277. int err = MP_OKAY;
  134278. #ifdef WOLFSSL_SP_SMALL_STACK
  134279. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17, NULL, DYNAMIC_TYPE_ECC);
  134280. if (t == NULL)
  134281. err = MEMORY_E;
  134282. #endif
  134283. if (err == MP_OKAY) {
  134284. {
  134285. int i;
  134286. XMEMCPY(t, y, sizeof(sp_digit) * 17);
  134287. for (i=518; i>=0; i--) {
  134288. sp_521_mont_sqr_17(t, t, p521_mod, p521_mp_mod);
  134289. if (p521_sqrt_power[i / 32] & ((sp_digit)1 << (i % 32)))
  134290. sp_521_mont_mul_17(t, t, y, p521_mod, p521_mp_mod);
  134291. }
  134292. XMEMCPY(y, t, sizeof(sp_digit) * 17);
  134293. }
  134294. }
  134295. #ifdef WOLFSSL_SP_SMALL_STACK
  134296. if (t != NULL)
  134297. XFREE(t, NULL, DYNAMIC_TYPE_ECC);
  134298. #endif
  134299. return err;
  134300. }
  134301. /* Uncompress the point given the X ordinate.
  134302. *
  134303. * xm X ordinate.
  134304. * odd Whether the Y ordinate is odd.
  134305. * ym Calculated Y ordinate.
  134306. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  134307. */
  134308. int sp_ecc_uncompress_521(mp_int* xm, int odd, mp_int* ym)
  134309. {
  134310. #ifdef WOLFSSL_SP_SMALL_STACK
  134311. sp_digit* x = NULL;
  134312. #else
  134313. sp_digit x[4 * 17];
  134314. #endif
  134315. sp_digit* y = NULL;
  134316. int err = MP_OKAY;
  134317. #ifdef WOLFSSL_SP_SMALL_STACK
  134318. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 17, NULL, DYNAMIC_TYPE_ECC);
  134319. if (x == NULL)
  134320. err = MEMORY_E;
  134321. #endif
  134322. if (err == MP_OKAY) {
  134323. y = x + 2 * 17;
  134324. sp_521_from_mp(x, 17, xm);
  134325. err = sp_521_mod_mul_norm_17(x, x, p521_mod);
  134326. }
  134327. if (err == MP_OKAY) {
  134328. /* y = x^3 */
  134329. {
  134330. sp_521_mont_sqr_17(y, x, p521_mod, p521_mp_mod);
  134331. sp_521_mont_mul_17(y, y, x, p521_mod, p521_mp_mod);
  134332. }
  134333. /* y = x^3 - 3x */
  134334. sp_521_mont_sub_17(y, y, x, p521_mod);
  134335. sp_521_mont_sub_17(y, y, x, p521_mod);
  134336. sp_521_mont_sub_17(y, y, x, p521_mod);
  134337. /* y = x^3 - 3x + b */
  134338. err = sp_521_mod_mul_norm_17(x, p521_b, p521_mod);
  134339. }
  134340. if (err == MP_OKAY) {
  134341. sp_521_mont_add_17(y, y, x, p521_mod);
  134342. /* y = sqrt(x^3 - 3x + b) */
  134343. err = sp_521_mont_sqrt_17(y);
  134344. }
  134345. if (err == MP_OKAY) {
  134346. XMEMSET(y + 17, 0, 17U * sizeof(sp_digit));
  134347. sp_521_mont_reduce_17(y, p521_mod, p521_mp_mod);
  134348. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  134349. sp_521_mont_sub_17(y, p521_mod, y, p521_mod);
  134350. }
  134351. err = sp_521_to_mp(y, ym);
  134352. }
  134353. #ifdef WOLFSSL_SP_SMALL_STACK
  134354. if (x != NULL)
  134355. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  134356. #endif
  134357. return err;
  134358. }
  134359. #endif
  134360. #endif /* WOLFSSL_SP_521 */
  134361. #ifdef WOLFCRYPT_HAVE_SAKKE
  134362. #ifdef WOLFSSL_SP_1024
  134363. /* Point structure to use. */
  134364. typedef struct sp_point_1024 {
  134365. /* X ordinate of point. */
  134366. sp_digit x[2 * 32];
  134367. /* Y ordinate of point. */
  134368. sp_digit y[2 * 32];
  134369. /* Z ordinate of point. */
  134370. sp_digit z[2 * 32];
  134371. /* Indicates point is at infinity. */
  134372. int infinity;
  134373. } sp_point_1024;
  134374. #ifndef WOLFSSL_SP_SMALL
  134375. #ifndef WOLFSSL_SP_LARGE_CODE
  134376. /* Multiply a and b into r. (r = a * b)
  134377. *
  134378. * r A single precision integer.
  134379. * a A single precision integer.
  134380. * b A single precision integer.
  134381. */
  134382. SP_NOINLINE static void sp_1024_mul_16(sp_digit* r, const sp_digit* a,
  134383. const sp_digit* b)
  134384. {
  134385. sp_digit t[16 * 2];
  134386. sp_digit* tmp = t;
  134387. __asm__ __volatile__ (
  134388. "movs r3, #0\n\t"
  134389. "movs r4, #0\n\t"
  134390. "mov r8, r3\n\t"
  134391. "mov r11, %[tmp]\n\t"
  134392. "mov r9, %[a]\n\t"
  134393. "mov r10, %[b]\n\t"
  134394. "movs r6, #0x40\n\t"
  134395. "add r6, r6, r9\n\t"
  134396. "mov r12, r6\n\t"
  134397. "\n"
  134398. "L_sp_1024_mul_16_words_%=:\n\t"
  134399. "movs %[tmp], #0\n\t"
  134400. "movs r5, #0\n\t"
  134401. "movs r6, #60\n\t"
  134402. "mov %[a], r8\n\t"
  134403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134404. "subs %[a], %[a], r6\n\t"
  134405. #else
  134406. "sub %[a], %[a], r6\n\t"
  134407. #endif
  134408. #ifdef WOLFSSL_KEIL
  134409. "sbcs r6, r6, r6\n\t"
  134410. #elif defined(__clang__)
  134411. "sbcs r6, r6\n\t"
  134412. #else
  134413. "sbc r6, r6\n\t"
  134414. #endif
  134415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134416. "mvns r6, r6\n\t"
  134417. #else
  134418. "mvn r6, r6\n\t"
  134419. #endif
  134420. #ifdef WOLFSSL_KEIL
  134421. "ands %[a], %[a], r6\n\t"
  134422. #elif defined(__clang__)
  134423. "ands %[a], r6\n\t"
  134424. #else
  134425. "and %[a], r6\n\t"
  134426. #endif
  134427. "mov %[b], r8\n\t"
  134428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134429. "subs %[b], %[b], %[a]\n\t"
  134430. #else
  134431. "sub %[b], %[b], %[a]\n\t"
  134432. #endif
  134433. "add %[a], %[a], r9\n\t"
  134434. "add %[b], %[b], r10\n\t"
  134435. "\n"
  134436. "L_sp_1024_mul_16_mul_%=:\n\t"
  134437. "# Multiply Start\n\t"
  134438. "ldrh r6, [%[a]]\n\t"
  134439. "ldrh r7, [%[b]]\n\t"
  134440. #ifdef WOLFSSL_KEIL
  134441. "muls r7, r6, r7\n\t"
  134442. #elif defined(__clang__)
  134443. "muls r7, r6\n\t"
  134444. #else
  134445. "mul r7, r6\n\t"
  134446. #endif
  134447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134448. "adds r3, r3, r7\n\t"
  134449. #else
  134450. "add r3, r3, r7\n\t"
  134451. #endif
  134452. #ifdef WOLFSSL_KEIL
  134453. "adcs r4, r4, %[tmp]\n\t"
  134454. #elif defined(__clang__)
  134455. "adcs r4, %[tmp]\n\t"
  134456. #else
  134457. "adc r4, %[tmp]\n\t"
  134458. #endif
  134459. #ifdef WOLFSSL_KEIL
  134460. "adcs r5, r5, %[tmp]\n\t"
  134461. #elif defined(__clang__)
  134462. "adcs r5, %[tmp]\n\t"
  134463. #else
  134464. "adc r5, %[tmp]\n\t"
  134465. #endif
  134466. "ldr r7, [%[b]]\n\t"
  134467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134468. "lsrs r7, r7, #16\n\t"
  134469. #else
  134470. "lsr r7, r7, #16\n\t"
  134471. #endif
  134472. #ifdef WOLFSSL_KEIL
  134473. "muls r6, r7, r6\n\t"
  134474. #elif defined(__clang__)
  134475. "muls r6, r7\n\t"
  134476. #else
  134477. "mul r6, r7\n\t"
  134478. #endif
  134479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134480. "lsrs r7, r6, #16\n\t"
  134481. #else
  134482. "lsr r7, r6, #16\n\t"
  134483. #endif
  134484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134485. "lsls r6, r6, #16\n\t"
  134486. #else
  134487. "lsl r6, r6, #16\n\t"
  134488. #endif
  134489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134490. "adds r3, r3, r6\n\t"
  134491. #else
  134492. "add r3, r3, r6\n\t"
  134493. #endif
  134494. #ifdef WOLFSSL_KEIL
  134495. "adcs r4, r4, r7\n\t"
  134496. #elif defined(__clang__)
  134497. "adcs r4, r7\n\t"
  134498. #else
  134499. "adc r4, r7\n\t"
  134500. #endif
  134501. #ifdef WOLFSSL_KEIL
  134502. "adcs r5, r5, %[tmp]\n\t"
  134503. #elif defined(__clang__)
  134504. "adcs r5, %[tmp]\n\t"
  134505. #else
  134506. "adc r5, %[tmp]\n\t"
  134507. #endif
  134508. "ldr r6, [%[a]]\n\t"
  134509. "ldr r7, [%[b]]\n\t"
  134510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134511. "lsrs r6, r6, #16\n\t"
  134512. #else
  134513. "lsr r6, r6, #16\n\t"
  134514. #endif
  134515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134516. "lsrs r7, r7, #16\n\t"
  134517. #else
  134518. "lsr r7, r7, #16\n\t"
  134519. #endif
  134520. #ifdef WOLFSSL_KEIL
  134521. "muls r7, r6, r7\n\t"
  134522. #elif defined(__clang__)
  134523. "muls r7, r6\n\t"
  134524. #else
  134525. "mul r7, r6\n\t"
  134526. #endif
  134527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134528. "adds r4, r4, r7\n\t"
  134529. #else
  134530. "add r4, r4, r7\n\t"
  134531. #endif
  134532. #ifdef WOLFSSL_KEIL
  134533. "adcs r5, r5, %[tmp]\n\t"
  134534. #elif defined(__clang__)
  134535. "adcs r5, %[tmp]\n\t"
  134536. #else
  134537. "adc r5, %[tmp]\n\t"
  134538. #endif
  134539. "ldrh r7, [%[b]]\n\t"
  134540. #ifdef WOLFSSL_KEIL
  134541. "muls r6, r7, r6\n\t"
  134542. #elif defined(__clang__)
  134543. "muls r6, r7\n\t"
  134544. #else
  134545. "mul r6, r7\n\t"
  134546. #endif
  134547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134548. "lsrs r7, r6, #16\n\t"
  134549. #else
  134550. "lsr r7, r6, #16\n\t"
  134551. #endif
  134552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134553. "lsls r6, r6, #16\n\t"
  134554. #else
  134555. "lsl r6, r6, #16\n\t"
  134556. #endif
  134557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134558. "adds r3, r3, r6\n\t"
  134559. #else
  134560. "add r3, r3, r6\n\t"
  134561. #endif
  134562. #ifdef WOLFSSL_KEIL
  134563. "adcs r4, r4, r7\n\t"
  134564. #elif defined(__clang__)
  134565. "adcs r4, r7\n\t"
  134566. #else
  134567. "adc r4, r7\n\t"
  134568. #endif
  134569. #ifdef WOLFSSL_KEIL
  134570. "adcs r5, r5, %[tmp]\n\t"
  134571. #elif defined(__clang__)
  134572. "adcs r5, %[tmp]\n\t"
  134573. #else
  134574. "adc r5, %[tmp]\n\t"
  134575. #endif
  134576. "# Multiply Done\n\t"
  134577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134578. "adds %[a], %[a], #4\n\t"
  134579. #else
  134580. "add %[a], %[a], #4\n\t"
  134581. #endif
  134582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134583. "subs %[b], %[b], #4\n\t"
  134584. #else
  134585. "sub %[b], %[b], #4\n\t"
  134586. #endif
  134587. "cmp %[a], r12\n\t"
  134588. "beq L_sp_1024_mul_16_done_mul_%=\n\t"
  134589. "mov r6, r8\n\t"
  134590. "add r6, r6, r9\n\t"
  134591. "cmp %[a], r6\n\t"
  134592. "ble L_sp_1024_mul_16_mul_%=\n\t"
  134593. "\n"
  134594. "L_sp_1024_mul_16_done_mul_%=:\n\t"
  134595. "mov %[tmp], r11\n\t"
  134596. "mov r7, r8\n\t"
  134597. "str r3, [%[tmp], r7]\n\t"
  134598. "movs r3, r4\n\t"
  134599. "movs r4, r5\n\t"
  134600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134601. "adds r7, r7, #4\n\t"
  134602. #else
  134603. "add r7, r7, #4\n\t"
  134604. #endif
  134605. "mov r8, r7\n\t"
  134606. "movs r6, #0x78\n\t"
  134607. "cmp r7, r6\n\t"
  134608. "ble L_sp_1024_mul_16_words_%=\n\t"
  134609. "str r3, [%[tmp], r7]\n\t"
  134610. "mov %[a], r9\n\t"
  134611. "mov %[b], r10\n\t"
  134612. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  134613. :
  134614. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  134615. );
  134616. XMEMCPY(r, t, sizeof(t));
  134617. }
  134618. #else
  134619. /* Multiply a and b into r. (r = a * b)
  134620. *
  134621. * r A single precision integer.
  134622. * a A single precision integer.
  134623. * b A single precision integer.
  134624. */
  134625. SP_NOINLINE static void sp_1024_mul_16(sp_digit* r, const sp_digit* a,
  134626. const sp_digit* b)
  134627. {
  134628. __asm__ __volatile__ (
  134629. "sub sp, sp, #0x40\n\t"
  134630. "mov r8, %[r]\n\t"
  134631. "mov r9, %[a]\n\t"
  134632. "mov r10, %[b]\n\t"
  134633. "movs %[r], #0\n\t"
  134634. "# A[0] * B[0]\n\t"
  134635. "ldr %[a], [%[a]]\n\t"
  134636. "ldr %[b], [%[b]]\n\t"
  134637. "uxth r6, %[a]\n\t"
  134638. "uxth r3, %[b]\n\t"
  134639. #ifdef WOLFSSL_KEIL
  134640. "muls r3, r6, r3\n\t"
  134641. #elif defined(__clang__)
  134642. "muls r3, r6\n\t"
  134643. #else
  134644. "mul r3, r6\n\t"
  134645. #endif
  134646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134647. "lsrs r7, %[b], #16\n\t"
  134648. #else
  134649. "lsr r7, %[b], #16\n\t"
  134650. #endif
  134651. #ifdef WOLFSSL_KEIL
  134652. "muls r6, r7, r6\n\t"
  134653. #elif defined(__clang__)
  134654. "muls r6, r7\n\t"
  134655. #else
  134656. "mul r6, r7\n\t"
  134657. #endif
  134658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134659. "lsrs r4, r6, #16\n\t"
  134660. #else
  134661. "lsr r4, r6, #16\n\t"
  134662. #endif
  134663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134664. "lsls r6, r6, #16\n\t"
  134665. #else
  134666. "lsl r6, r6, #16\n\t"
  134667. #endif
  134668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134669. "adds r3, r3, r6\n\t"
  134670. #else
  134671. "add r3, r3, r6\n\t"
  134672. #endif
  134673. #ifdef WOLFSSL_KEIL
  134674. "adcs r4, r4, %[r]\n\t"
  134675. #elif defined(__clang__)
  134676. "adcs r4, %[r]\n\t"
  134677. #else
  134678. "adc r4, %[r]\n\t"
  134679. #endif
  134680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134681. "lsrs r6, %[a], #16\n\t"
  134682. #else
  134683. "lsr r6, %[a], #16\n\t"
  134684. #endif
  134685. #ifdef WOLFSSL_KEIL
  134686. "muls r7, r6, r7\n\t"
  134687. #elif defined(__clang__)
  134688. "muls r7, r6\n\t"
  134689. #else
  134690. "mul r7, r6\n\t"
  134691. #endif
  134692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134693. "adds r4, r4, r7\n\t"
  134694. #else
  134695. "add r4, r4, r7\n\t"
  134696. #endif
  134697. "uxth r7, %[b]\n\t"
  134698. #ifdef WOLFSSL_KEIL
  134699. "muls r6, r7, r6\n\t"
  134700. #elif defined(__clang__)
  134701. "muls r6, r7\n\t"
  134702. #else
  134703. "mul r6, r7\n\t"
  134704. #endif
  134705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134706. "lsrs r7, r6, #16\n\t"
  134707. #else
  134708. "lsr r7, r6, #16\n\t"
  134709. #endif
  134710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134711. "lsls r6, r6, #16\n\t"
  134712. #else
  134713. "lsl r6, r6, #16\n\t"
  134714. #endif
  134715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134716. "adds r3, r3, r6\n\t"
  134717. #else
  134718. "add r3, r3, r6\n\t"
  134719. #endif
  134720. #ifdef WOLFSSL_KEIL
  134721. "adcs r4, r4, r7\n\t"
  134722. #elif defined(__clang__)
  134723. "adcs r4, r7\n\t"
  134724. #else
  134725. "adc r4, r7\n\t"
  134726. #endif
  134727. "movs r5, #0\n\t"
  134728. "str r3, [sp]\n\t"
  134729. "# A[0] * B[1]\n\t"
  134730. "movs r3, #0\n\t"
  134731. "mov %[a], r9\n\t"
  134732. "mov %[b], r10\n\t"
  134733. "ldr %[a], [%[a]]\n\t"
  134734. "ldr %[b], [%[b], #4]\n\t"
  134735. "uxth r6, %[a]\n\t"
  134736. "uxth r7, %[b]\n\t"
  134737. #ifdef WOLFSSL_KEIL
  134738. "muls r7, r6, r7\n\t"
  134739. #elif defined(__clang__)
  134740. "muls r7, r6\n\t"
  134741. #else
  134742. "mul r7, r6\n\t"
  134743. #endif
  134744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134745. "adds r4, r4, r7\n\t"
  134746. #else
  134747. "add r4, r4, r7\n\t"
  134748. #endif
  134749. #ifdef WOLFSSL_KEIL
  134750. "adcs r5, r5, %[r]\n\t"
  134751. #elif defined(__clang__)
  134752. "adcs r5, %[r]\n\t"
  134753. #else
  134754. "adc r5, %[r]\n\t"
  134755. #endif
  134756. #ifdef WOLFSSL_KEIL
  134757. "adcs r3, r3, %[r]\n\t"
  134758. #elif defined(__clang__)
  134759. "adcs r3, %[r]\n\t"
  134760. #else
  134761. "adc r3, %[r]\n\t"
  134762. #endif
  134763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134764. "lsrs r7, %[b], #16\n\t"
  134765. #else
  134766. "lsr r7, %[b], #16\n\t"
  134767. #endif
  134768. #ifdef WOLFSSL_KEIL
  134769. "muls r6, r7, r6\n\t"
  134770. #elif defined(__clang__)
  134771. "muls r6, r7\n\t"
  134772. #else
  134773. "mul r6, r7\n\t"
  134774. #endif
  134775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134776. "lsrs r7, r6, #16\n\t"
  134777. #else
  134778. "lsr r7, r6, #16\n\t"
  134779. #endif
  134780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134781. "lsls r6, r6, #16\n\t"
  134782. #else
  134783. "lsl r6, r6, #16\n\t"
  134784. #endif
  134785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134786. "adds r4, r4, r6\n\t"
  134787. #else
  134788. "add r4, r4, r6\n\t"
  134789. #endif
  134790. #ifdef WOLFSSL_KEIL
  134791. "adcs r5, r5, r7\n\t"
  134792. #elif defined(__clang__)
  134793. "adcs r5, r7\n\t"
  134794. #else
  134795. "adc r5, r7\n\t"
  134796. #endif
  134797. #ifdef WOLFSSL_KEIL
  134798. "adcs r3, r3, %[r]\n\t"
  134799. #elif defined(__clang__)
  134800. "adcs r3, %[r]\n\t"
  134801. #else
  134802. "adc r3, %[r]\n\t"
  134803. #endif
  134804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134805. "lsrs r6, %[a], #16\n\t"
  134806. #else
  134807. "lsr r6, %[a], #16\n\t"
  134808. #endif
  134809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134810. "lsrs r7, %[b], #16\n\t"
  134811. #else
  134812. "lsr r7, %[b], #16\n\t"
  134813. #endif
  134814. #ifdef WOLFSSL_KEIL
  134815. "muls r7, r6, r7\n\t"
  134816. #elif defined(__clang__)
  134817. "muls r7, r6\n\t"
  134818. #else
  134819. "mul r7, r6\n\t"
  134820. #endif
  134821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134822. "adds r5, r5, r7\n\t"
  134823. #else
  134824. "add r5, r5, r7\n\t"
  134825. #endif
  134826. #ifdef WOLFSSL_KEIL
  134827. "adcs r3, r3, %[r]\n\t"
  134828. #elif defined(__clang__)
  134829. "adcs r3, %[r]\n\t"
  134830. #else
  134831. "adc r3, %[r]\n\t"
  134832. #endif
  134833. "uxth r7, %[b]\n\t"
  134834. #ifdef WOLFSSL_KEIL
  134835. "muls r6, r7, r6\n\t"
  134836. #elif defined(__clang__)
  134837. "muls r6, r7\n\t"
  134838. #else
  134839. "mul r6, r7\n\t"
  134840. #endif
  134841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134842. "lsrs r7, r6, #16\n\t"
  134843. #else
  134844. "lsr r7, r6, #16\n\t"
  134845. #endif
  134846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134847. "lsls r6, r6, #16\n\t"
  134848. #else
  134849. "lsl r6, r6, #16\n\t"
  134850. #endif
  134851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134852. "adds r4, r4, r6\n\t"
  134853. #else
  134854. "add r4, r4, r6\n\t"
  134855. #endif
  134856. #ifdef WOLFSSL_KEIL
  134857. "adcs r5, r5, r7\n\t"
  134858. #elif defined(__clang__)
  134859. "adcs r5, r7\n\t"
  134860. #else
  134861. "adc r5, r7\n\t"
  134862. #endif
  134863. #ifdef WOLFSSL_KEIL
  134864. "adcs r3, r3, %[r]\n\t"
  134865. #elif defined(__clang__)
  134866. "adcs r3, %[r]\n\t"
  134867. #else
  134868. "adc r3, %[r]\n\t"
  134869. #endif
  134870. "# A[1] * B[0]\n\t"
  134871. "mov %[a], r9\n\t"
  134872. "mov %[b], r10\n\t"
  134873. "ldr %[a], [%[a], #4]\n\t"
  134874. "ldr %[b], [%[b]]\n\t"
  134875. "uxth r6, %[a]\n\t"
  134876. "uxth r7, %[b]\n\t"
  134877. #ifdef WOLFSSL_KEIL
  134878. "muls r7, r6, r7\n\t"
  134879. #elif defined(__clang__)
  134880. "muls r7, r6\n\t"
  134881. #else
  134882. "mul r7, r6\n\t"
  134883. #endif
  134884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134885. "adds r4, r4, r7\n\t"
  134886. #else
  134887. "add r4, r4, r7\n\t"
  134888. #endif
  134889. #ifdef WOLFSSL_KEIL
  134890. "adcs r5, r5, %[r]\n\t"
  134891. #elif defined(__clang__)
  134892. "adcs r5, %[r]\n\t"
  134893. #else
  134894. "adc r5, %[r]\n\t"
  134895. #endif
  134896. #ifdef WOLFSSL_KEIL
  134897. "adcs r3, r3, %[r]\n\t"
  134898. #elif defined(__clang__)
  134899. "adcs r3, %[r]\n\t"
  134900. #else
  134901. "adc r3, %[r]\n\t"
  134902. #endif
  134903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134904. "lsrs r7, %[b], #16\n\t"
  134905. #else
  134906. "lsr r7, %[b], #16\n\t"
  134907. #endif
  134908. #ifdef WOLFSSL_KEIL
  134909. "muls r6, r7, r6\n\t"
  134910. #elif defined(__clang__)
  134911. "muls r6, r7\n\t"
  134912. #else
  134913. "mul r6, r7\n\t"
  134914. #endif
  134915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134916. "lsrs r7, r6, #16\n\t"
  134917. #else
  134918. "lsr r7, r6, #16\n\t"
  134919. #endif
  134920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134921. "lsls r6, r6, #16\n\t"
  134922. #else
  134923. "lsl r6, r6, #16\n\t"
  134924. #endif
  134925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134926. "adds r4, r4, r6\n\t"
  134927. #else
  134928. "add r4, r4, r6\n\t"
  134929. #endif
  134930. #ifdef WOLFSSL_KEIL
  134931. "adcs r5, r5, r7\n\t"
  134932. #elif defined(__clang__)
  134933. "adcs r5, r7\n\t"
  134934. #else
  134935. "adc r5, r7\n\t"
  134936. #endif
  134937. #ifdef WOLFSSL_KEIL
  134938. "adcs r3, r3, %[r]\n\t"
  134939. #elif defined(__clang__)
  134940. "adcs r3, %[r]\n\t"
  134941. #else
  134942. "adc r3, %[r]\n\t"
  134943. #endif
  134944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134945. "lsrs r6, %[a], #16\n\t"
  134946. #else
  134947. "lsr r6, %[a], #16\n\t"
  134948. #endif
  134949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134950. "lsrs r7, %[b], #16\n\t"
  134951. #else
  134952. "lsr r7, %[b], #16\n\t"
  134953. #endif
  134954. #ifdef WOLFSSL_KEIL
  134955. "muls r7, r6, r7\n\t"
  134956. #elif defined(__clang__)
  134957. "muls r7, r6\n\t"
  134958. #else
  134959. "mul r7, r6\n\t"
  134960. #endif
  134961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134962. "adds r5, r5, r7\n\t"
  134963. #else
  134964. "add r5, r5, r7\n\t"
  134965. #endif
  134966. #ifdef WOLFSSL_KEIL
  134967. "adcs r3, r3, %[r]\n\t"
  134968. #elif defined(__clang__)
  134969. "adcs r3, %[r]\n\t"
  134970. #else
  134971. "adc r3, %[r]\n\t"
  134972. #endif
  134973. "uxth r7, %[b]\n\t"
  134974. #ifdef WOLFSSL_KEIL
  134975. "muls r6, r7, r6\n\t"
  134976. #elif defined(__clang__)
  134977. "muls r6, r7\n\t"
  134978. #else
  134979. "mul r6, r7\n\t"
  134980. #endif
  134981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134982. "lsrs r7, r6, #16\n\t"
  134983. #else
  134984. "lsr r7, r6, #16\n\t"
  134985. #endif
  134986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134987. "lsls r6, r6, #16\n\t"
  134988. #else
  134989. "lsl r6, r6, #16\n\t"
  134990. #endif
  134991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134992. "adds r4, r4, r6\n\t"
  134993. #else
  134994. "add r4, r4, r6\n\t"
  134995. #endif
  134996. #ifdef WOLFSSL_KEIL
  134997. "adcs r5, r5, r7\n\t"
  134998. #elif defined(__clang__)
  134999. "adcs r5, r7\n\t"
  135000. #else
  135001. "adc r5, r7\n\t"
  135002. #endif
  135003. #ifdef WOLFSSL_KEIL
  135004. "adcs r3, r3, %[r]\n\t"
  135005. #elif defined(__clang__)
  135006. "adcs r3, %[r]\n\t"
  135007. #else
  135008. "adc r3, %[r]\n\t"
  135009. #endif
  135010. "str r4, [sp, #4]\n\t"
  135011. "# A[2] * B[0]\n\t"
  135012. "movs r4, #0\n\t"
  135013. "mov %[a], r9\n\t"
  135014. "mov %[b], r10\n\t"
  135015. "ldr %[a], [%[a], #8]\n\t"
  135016. "ldr %[b], [%[b]]\n\t"
  135017. "uxth r6, %[a]\n\t"
  135018. "uxth r7, %[b]\n\t"
  135019. #ifdef WOLFSSL_KEIL
  135020. "muls r7, r6, r7\n\t"
  135021. #elif defined(__clang__)
  135022. "muls r7, r6\n\t"
  135023. #else
  135024. "mul r7, r6\n\t"
  135025. #endif
  135026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135027. "adds r5, r5, r7\n\t"
  135028. #else
  135029. "add r5, r5, r7\n\t"
  135030. #endif
  135031. #ifdef WOLFSSL_KEIL
  135032. "adcs r3, r3, %[r]\n\t"
  135033. #elif defined(__clang__)
  135034. "adcs r3, %[r]\n\t"
  135035. #else
  135036. "adc r3, %[r]\n\t"
  135037. #endif
  135038. #ifdef WOLFSSL_KEIL
  135039. "adcs r4, r4, %[r]\n\t"
  135040. #elif defined(__clang__)
  135041. "adcs r4, %[r]\n\t"
  135042. #else
  135043. "adc r4, %[r]\n\t"
  135044. #endif
  135045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135046. "lsrs r7, %[b], #16\n\t"
  135047. #else
  135048. "lsr r7, %[b], #16\n\t"
  135049. #endif
  135050. #ifdef WOLFSSL_KEIL
  135051. "muls r6, r7, r6\n\t"
  135052. #elif defined(__clang__)
  135053. "muls r6, r7\n\t"
  135054. #else
  135055. "mul r6, r7\n\t"
  135056. #endif
  135057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135058. "lsrs r7, r6, #16\n\t"
  135059. #else
  135060. "lsr r7, r6, #16\n\t"
  135061. #endif
  135062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135063. "lsls r6, r6, #16\n\t"
  135064. #else
  135065. "lsl r6, r6, #16\n\t"
  135066. #endif
  135067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135068. "adds r5, r5, r6\n\t"
  135069. #else
  135070. "add r5, r5, r6\n\t"
  135071. #endif
  135072. #ifdef WOLFSSL_KEIL
  135073. "adcs r3, r3, r7\n\t"
  135074. #elif defined(__clang__)
  135075. "adcs r3, r7\n\t"
  135076. #else
  135077. "adc r3, r7\n\t"
  135078. #endif
  135079. #ifdef WOLFSSL_KEIL
  135080. "adcs r4, r4, %[r]\n\t"
  135081. #elif defined(__clang__)
  135082. "adcs r4, %[r]\n\t"
  135083. #else
  135084. "adc r4, %[r]\n\t"
  135085. #endif
  135086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135087. "lsrs r6, %[a], #16\n\t"
  135088. #else
  135089. "lsr r6, %[a], #16\n\t"
  135090. #endif
  135091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135092. "lsrs r7, %[b], #16\n\t"
  135093. #else
  135094. "lsr r7, %[b], #16\n\t"
  135095. #endif
  135096. #ifdef WOLFSSL_KEIL
  135097. "muls r7, r6, r7\n\t"
  135098. #elif defined(__clang__)
  135099. "muls r7, r6\n\t"
  135100. #else
  135101. "mul r7, r6\n\t"
  135102. #endif
  135103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135104. "adds r3, r3, r7\n\t"
  135105. #else
  135106. "add r3, r3, r7\n\t"
  135107. #endif
  135108. #ifdef WOLFSSL_KEIL
  135109. "adcs r4, r4, %[r]\n\t"
  135110. #elif defined(__clang__)
  135111. "adcs r4, %[r]\n\t"
  135112. #else
  135113. "adc r4, %[r]\n\t"
  135114. #endif
  135115. "uxth r7, %[b]\n\t"
  135116. #ifdef WOLFSSL_KEIL
  135117. "muls r6, r7, r6\n\t"
  135118. #elif defined(__clang__)
  135119. "muls r6, r7\n\t"
  135120. #else
  135121. "mul r6, r7\n\t"
  135122. #endif
  135123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135124. "lsrs r7, r6, #16\n\t"
  135125. #else
  135126. "lsr r7, r6, #16\n\t"
  135127. #endif
  135128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135129. "lsls r6, r6, #16\n\t"
  135130. #else
  135131. "lsl r6, r6, #16\n\t"
  135132. #endif
  135133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135134. "adds r5, r5, r6\n\t"
  135135. #else
  135136. "add r5, r5, r6\n\t"
  135137. #endif
  135138. #ifdef WOLFSSL_KEIL
  135139. "adcs r3, r3, r7\n\t"
  135140. #elif defined(__clang__)
  135141. "adcs r3, r7\n\t"
  135142. #else
  135143. "adc r3, r7\n\t"
  135144. #endif
  135145. #ifdef WOLFSSL_KEIL
  135146. "adcs r4, r4, %[r]\n\t"
  135147. #elif defined(__clang__)
  135148. "adcs r4, %[r]\n\t"
  135149. #else
  135150. "adc r4, %[r]\n\t"
  135151. #endif
  135152. "# A[1] * B[1]\n\t"
  135153. "mov %[a], r9\n\t"
  135154. "mov %[b], r10\n\t"
  135155. "ldr %[a], [%[a], #4]\n\t"
  135156. "ldr %[b], [%[b], #4]\n\t"
  135157. "uxth r6, %[a]\n\t"
  135158. "uxth r7, %[b]\n\t"
  135159. #ifdef WOLFSSL_KEIL
  135160. "muls r7, r6, r7\n\t"
  135161. #elif defined(__clang__)
  135162. "muls r7, r6\n\t"
  135163. #else
  135164. "mul r7, r6\n\t"
  135165. #endif
  135166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135167. "adds r5, r5, r7\n\t"
  135168. #else
  135169. "add r5, r5, r7\n\t"
  135170. #endif
  135171. #ifdef WOLFSSL_KEIL
  135172. "adcs r3, r3, %[r]\n\t"
  135173. #elif defined(__clang__)
  135174. "adcs r3, %[r]\n\t"
  135175. #else
  135176. "adc r3, %[r]\n\t"
  135177. #endif
  135178. #ifdef WOLFSSL_KEIL
  135179. "adcs r4, r4, %[r]\n\t"
  135180. #elif defined(__clang__)
  135181. "adcs r4, %[r]\n\t"
  135182. #else
  135183. "adc r4, %[r]\n\t"
  135184. #endif
  135185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135186. "lsrs r7, %[b], #16\n\t"
  135187. #else
  135188. "lsr r7, %[b], #16\n\t"
  135189. #endif
  135190. #ifdef WOLFSSL_KEIL
  135191. "muls r6, r7, r6\n\t"
  135192. #elif defined(__clang__)
  135193. "muls r6, r7\n\t"
  135194. #else
  135195. "mul r6, r7\n\t"
  135196. #endif
  135197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135198. "lsrs r7, r6, #16\n\t"
  135199. #else
  135200. "lsr r7, r6, #16\n\t"
  135201. #endif
  135202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135203. "lsls r6, r6, #16\n\t"
  135204. #else
  135205. "lsl r6, r6, #16\n\t"
  135206. #endif
  135207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135208. "adds r5, r5, r6\n\t"
  135209. #else
  135210. "add r5, r5, r6\n\t"
  135211. #endif
  135212. #ifdef WOLFSSL_KEIL
  135213. "adcs r3, r3, r7\n\t"
  135214. #elif defined(__clang__)
  135215. "adcs r3, r7\n\t"
  135216. #else
  135217. "adc r3, r7\n\t"
  135218. #endif
  135219. #ifdef WOLFSSL_KEIL
  135220. "adcs r4, r4, %[r]\n\t"
  135221. #elif defined(__clang__)
  135222. "adcs r4, %[r]\n\t"
  135223. #else
  135224. "adc r4, %[r]\n\t"
  135225. #endif
  135226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135227. "lsrs r6, %[a], #16\n\t"
  135228. #else
  135229. "lsr r6, %[a], #16\n\t"
  135230. #endif
  135231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135232. "lsrs r7, %[b], #16\n\t"
  135233. #else
  135234. "lsr r7, %[b], #16\n\t"
  135235. #endif
  135236. #ifdef WOLFSSL_KEIL
  135237. "muls r7, r6, r7\n\t"
  135238. #elif defined(__clang__)
  135239. "muls r7, r6\n\t"
  135240. #else
  135241. "mul r7, r6\n\t"
  135242. #endif
  135243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135244. "adds r3, r3, r7\n\t"
  135245. #else
  135246. "add r3, r3, r7\n\t"
  135247. #endif
  135248. #ifdef WOLFSSL_KEIL
  135249. "adcs r4, r4, %[r]\n\t"
  135250. #elif defined(__clang__)
  135251. "adcs r4, %[r]\n\t"
  135252. #else
  135253. "adc r4, %[r]\n\t"
  135254. #endif
  135255. "uxth r7, %[b]\n\t"
  135256. #ifdef WOLFSSL_KEIL
  135257. "muls r6, r7, r6\n\t"
  135258. #elif defined(__clang__)
  135259. "muls r6, r7\n\t"
  135260. #else
  135261. "mul r6, r7\n\t"
  135262. #endif
  135263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135264. "lsrs r7, r6, #16\n\t"
  135265. #else
  135266. "lsr r7, r6, #16\n\t"
  135267. #endif
  135268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135269. "lsls r6, r6, #16\n\t"
  135270. #else
  135271. "lsl r6, r6, #16\n\t"
  135272. #endif
  135273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135274. "adds r5, r5, r6\n\t"
  135275. #else
  135276. "add r5, r5, r6\n\t"
  135277. #endif
  135278. #ifdef WOLFSSL_KEIL
  135279. "adcs r3, r3, r7\n\t"
  135280. #elif defined(__clang__)
  135281. "adcs r3, r7\n\t"
  135282. #else
  135283. "adc r3, r7\n\t"
  135284. #endif
  135285. #ifdef WOLFSSL_KEIL
  135286. "adcs r4, r4, %[r]\n\t"
  135287. #elif defined(__clang__)
  135288. "adcs r4, %[r]\n\t"
  135289. #else
  135290. "adc r4, %[r]\n\t"
  135291. #endif
  135292. "# A[0] * B[2]\n\t"
  135293. "mov %[a], r9\n\t"
  135294. "mov %[b], r10\n\t"
  135295. "ldr %[a], [%[a]]\n\t"
  135296. "ldr %[b], [%[b], #8]\n\t"
  135297. "uxth r6, %[a]\n\t"
  135298. "uxth r7, %[b]\n\t"
  135299. #ifdef WOLFSSL_KEIL
  135300. "muls r7, r6, r7\n\t"
  135301. #elif defined(__clang__)
  135302. "muls r7, r6\n\t"
  135303. #else
  135304. "mul r7, r6\n\t"
  135305. #endif
  135306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135307. "adds r5, r5, r7\n\t"
  135308. #else
  135309. "add r5, r5, r7\n\t"
  135310. #endif
  135311. #ifdef WOLFSSL_KEIL
  135312. "adcs r3, r3, %[r]\n\t"
  135313. #elif defined(__clang__)
  135314. "adcs r3, %[r]\n\t"
  135315. #else
  135316. "adc r3, %[r]\n\t"
  135317. #endif
  135318. #ifdef WOLFSSL_KEIL
  135319. "adcs r4, r4, %[r]\n\t"
  135320. #elif defined(__clang__)
  135321. "adcs r4, %[r]\n\t"
  135322. #else
  135323. "adc r4, %[r]\n\t"
  135324. #endif
  135325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135326. "lsrs r7, %[b], #16\n\t"
  135327. #else
  135328. "lsr r7, %[b], #16\n\t"
  135329. #endif
  135330. #ifdef WOLFSSL_KEIL
  135331. "muls r6, r7, r6\n\t"
  135332. #elif defined(__clang__)
  135333. "muls r6, r7\n\t"
  135334. #else
  135335. "mul r6, r7\n\t"
  135336. #endif
  135337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135338. "lsrs r7, r6, #16\n\t"
  135339. #else
  135340. "lsr r7, r6, #16\n\t"
  135341. #endif
  135342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135343. "lsls r6, r6, #16\n\t"
  135344. #else
  135345. "lsl r6, r6, #16\n\t"
  135346. #endif
  135347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135348. "adds r5, r5, r6\n\t"
  135349. #else
  135350. "add r5, r5, r6\n\t"
  135351. #endif
  135352. #ifdef WOLFSSL_KEIL
  135353. "adcs r3, r3, r7\n\t"
  135354. #elif defined(__clang__)
  135355. "adcs r3, r7\n\t"
  135356. #else
  135357. "adc r3, r7\n\t"
  135358. #endif
  135359. #ifdef WOLFSSL_KEIL
  135360. "adcs r4, r4, %[r]\n\t"
  135361. #elif defined(__clang__)
  135362. "adcs r4, %[r]\n\t"
  135363. #else
  135364. "adc r4, %[r]\n\t"
  135365. #endif
  135366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135367. "lsrs r6, %[a], #16\n\t"
  135368. #else
  135369. "lsr r6, %[a], #16\n\t"
  135370. #endif
  135371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135372. "lsrs r7, %[b], #16\n\t"
  135373. #else
  135374. "lsr r7, %[b], #16\n\t"
  135375. #endif
  135376. #ifdef WOLFSSL_KEIL
  135377. "muls r7, r6, r7\n\t"
  135378. #elif defined(__clang__)
  135379. "muls r7, r6\n\t"
  135380. #else
  135381. "mul r7, r6\n\t"
  135382. #endif
  135383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135384. "adds r3, r3, r7\n\t"
  135385. #else
  135386. "add r3, r3, r7\n\t"
  135387. #endif
  135388. #ifdef WOLFSSL_KEIL
  135389. "adcs r4, r4, %[r]\n\t"
  135390. #elif defined(__clang__)
  135391. "adcs r4, %[r]\n\t"
  135392. #else
  135393. "adc r4, %[r]\n\t"
  135394. #endif
  135395. "uxth r7, %[b]\n\t"
  135396. #ifdef WOLFSSL_KEIL
  135397. "muls r6, r7, r6\n\t"
  135398. #elif defined(__clang__)
  135399. "muls r6, r7\n\t"
  135400. #else
  135401. "mul r6, r7\n\t"
  135402. #endif
  135403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135404. "lsrs r7, r6, #16\n\t"
  135405. #else
  135406. "lsr r7, r6, #16\n\t"
  135407. #endif
  135408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135409. "lsls r6, r6, #16\n\t"
  135410. #else
  135411. "lsl r6, r6, #16\n\t"
  135412. #endif
  135413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135414. "adds r5, r5, r6\n\t"
  135415. #else
  135416. "add r5, r5, r6\n\t"
  135417. #endif
  135418. #ifdef WOLFSSL_KEIL
  135419. "adcs r3, r3, r7\n\t"
  135420. #elif defined(__clang__)
  135421. "adcs r3, r7\n\t"
  135422. #else
  135423. "adc r3, r7\n\t"
  135424. #endif
  135425. #ifdef WOLFSSL_KEIL
  135426. "adcs r4, r4, %[r]\n\t"
  135427. #elif defined(__clang__)
  135428. "adcs r4, %[r]\n\t"
  135429. #else
  135430. "adc r4, %[r]\n\t"
  135431. #endif
  135432. "str r5, [sp, #8]\n\t"
  135433. "# A[0] * B[3]\n\t"
  135434. "movs r5, #0\n\t"
  135435. "mov %[a], r9\n\t"
  135436. "mov %[b], r10\n\t"
  135437. "ldr %[a], [%[a]]\n\t"
  135438. "ldr %[b], [%[b], #12]\n\t"
  135439. "uxth r6, %[a]\n\t"
  135440. "uxth r7, %[b]\n\t"
  135441. #ifdef WOLFSSL_KEIL
  135442. "muls r7, r6, r7\n\t"
  135443. #elif defined(__clang__)
  135444. "muls r7, r6\n\t"
  135445. #else
  135446. "mul r7, r6\n\t"
  135447. #endif
  135448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135449. "adds r3, r3, r7\n\t"
  135450. #else
  135451. "add r3, r3, r7\n\t"
  135452. #endif
  135453. #ifdef WOLFSSL_KEIL
  135454. "adcs r4, r4, %[r]\n\t"
  135455. #elif defined(__clang__)
  135456. "adcs r4, %[r]\n\t"
  135457. #else
  135458. "adc r4, %[r]\n\t"
  135459. #endif
  135460. #ifdef WOLFSSL_KEIL
  135461. "adcs r5, r5, %[r]\n\t"
  135462. #elif defined(__clang__)
  135463. "adcs r5, %[r]\n\t"
  135464. #else
  135465. "adc r5, %[r]\n\t"
  135466. #endif
  135467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135468. "lsrs r7, %[b], #16\n\t"
  135469. #else
  135470. "lsr r7, %[b], #16\n\t"
  135471. #endif
  135472. #ifdef WOLFSSL_KEIL
  135473. "muls r6, r7, r6\n\t"
  135474. #elif defined(__clang__)
  135475. "muls r6, r7\n\t"
  135476. #else
  135477. "mul r6, r7\n\t"
  135478. #endif
  135479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135480. "lsrs r7, r6, #16\n\t"
  135481. #else
  135482. "lsr r7, r6, #16\n\t"
  135483. #endif
  135484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135485. "lsls r6, r6, #16\n\t"
  135486. #else
  135487. "lsl r6, r6, #16\n\t"
  135488. #endif
  135489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135490. "adds r3, r3, r6\n\t"
  135491. #else
  135492. "add r3, r3, r6\n\t"
  135493. #endif
  135494. #ifdef WOLFSSL_KEIL
  135495. "adcs r4, r4, r7\n\t"
  135496. #elif defined(__clang__)
  135497. "adcs r4, r7\n\t"
  135498. #else
  135499. "adc r4, r7\n\t"
  135500. #endif
  135501. #ifdef WOLFSSL_KEIL
  135502. "adcs r5, r5, %[r]\n\t"
  135503. #elif defined(__clang__)
  135504. "adcs r5, %[r]\n\t"
  135505. #else
  135506. "adc r5, %[r]\n\t"
  135507. #endif
  135508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135509. "lsrs r6, %[a], #16\n\t"
  135510. #else
  135511. "lsr r6, %[a], #16\n\t"
  135512. #endif
  135513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135514. "lsrs r7, %[b], #16\n\t"
  135515. #else
  135516. "lsr r7, %[b], #16\n\t"
  135517. #endif
  135518. #ifdef WOLFSSL_KEIL
  135519. "muls r7, r6, r7\n\t"
  135520. #elif defined(__clang__)
  135521. "muls r7, r6\n\t"
  135522. #else
  135523. "mul r7, r6\n\t"
  135524. #endif
  135525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135526. "adds r4, r4, r7\n\t"
  135527. #else
  135528. "add r4, r4, r7\n\t"
  135529. #endif
  135530. #ifdef WOLFSSL_KEIL
  135531. "adcs r5, r5, %[r]\n\t"
  135532. #elif defined(__clang__)
  135533. "adcs r5, %[r]\n\t"
  135534. #else
  135535. "adc r5, %[r]\n\t"
  135536. #endif
  135537. "uxth r7, %[b]\n\t"
  135538. #ifdef WOLFSSL_KEIL
  135539. "muls r6, r7, r6\n\t"
  135540. #elif defined(__clang__)
  135541. "muls r6, r7\n\t"
  135542. #else
  135543. "mul r6, r7\n\t"
  135544. #endif
  135545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135546. "lsrs r7, r6, #16\n\t"
  135547. #else
  135548. "lsr r7, r6, #16\n\t"
  135549. #endif
  135550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135551. "lsls r6, r6, #16\n\t"
  135552. #else
  135553. "lsl r6, r6, #16\n\t"
  135554. #endif
  135555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135556. "adds r3, r3, r6\n\t"
  135557. #else
  135558. "add r3, r3, r6\n\t"
  135559. #endif
  135560. #ifdef WOLFSSL_KEIL
  135561. "adcs r4, r4, r7\n\t"
  135562. #elif defined(__clang__)
  135563. "adcs r4, r7\n\t"
  135564. #else
  135565. "adc r4, r7\n\t"
  135566. #endif
  135567. #ifdef WOLFSSL_KEIL
  135568. "adcs r5, r5, %[r]\n\t"
  135569. #elif defined(__clang__)
  135570. "adcs r5, %[r]\n\t"
  135571. #else
  135572. "adc r5, %[r]\n\t"
  135573. #endif
  135574. "# A[1] * B[2]\n\t"
  135575. "mov %[a], r9\n\t"
  135576. "mov %[b], r10\n\t"
  135577. "ldr %[a], [%[a], #4]\n\t"
  135578. "ldr %[b], [%[b], #8]\n\t"
  135579. "uxth r6, %[a]\n\t"
  135580. "uxth r7, %[b]\n\t"
  135581. #ifdef WOLFSSL_KEIL
  135582. "muls r7, r6, r7\n\t"
  135583. #elif defined(__clang__)
  135584. "muls r7, r6\n\t"
  135585. #else
  135586. "mul r7, r6\n\t"
  135587. #endif
  135588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135589. "adds r3, r3, r7\n\t"
  135590. #else
  135591. "add r3, r3, r7\n\t"
  135592. #endif
  135593. #ifdef WOLFSSL_KEIL
  135594. "adcs r4, r4, %[r]\n\t"
  135595. #elif defined(__clang__)
  135596. "adcs r4, %[r]\n\t"
  135597. #else
  135598. "adc r4, %[r]\n\t"
  135599. #endif
  135600. #ifdef WOLFSSL_KEIL
  135601. "adcs r5, r5, %[r]\n\t"
  135602. #elif defined(__clang__)
  135603. "adcs r5, %[r]\n\t"
  135604. #else
  135605. "adc r5, %[r]\n\t"
  135606. #endif
  135607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135608. "lsrs r7, %[b], #16\n\t"
  135609. #else
  135610. "lsr r7, %[b], #16\n\t"
  135611. #endif
  135612. #ifdef WOLFSSL_KEIL
  135613. "muls r6, r7, r6\n\t"
  135614. #elif defined(__clang__)
  135615. "muls r6, r7\n\t"
  135616. #else
  135617. "mul r6, r7\n\t"
  135618. #endif
  135619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135620. "lsrs r7, r6, #16\n\t"
  135621. #else
  135622. "lsr r7, r6, #16\n\t"
  135623. #endif
  135624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135625. "lsls r6, r6, #16\n\t"
  135626. #else
  135627. "lsl r6, r6, #16\n\t"
  135628. #endif
  135629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135630. "adds r3, r3, r6\n\t"
  135631. #else
  135632. "add r3, r3, r6\n\t"
  135633. #endif
  135634. #ifdef WOLFSSL_KEIL
  135635. "adcs r4, r4, r7\n\t"
  135636. #elif defined(__clang__)
  135637. "adcs r4, r7\n\t"
  135638. #else
  135639. "adc r4, r7\n\t"
  135640. #endif
  135641. #ifdef WOLFSSL_KEIL
  135642. "adcs r5, r5, %[r]\n\t"
  135643. #elif defined(__clang__)
  135644. "adcs r5, %[r]\n\t"
  135645. #else
  135646. "adc r5, %[r]\n\t"
  135647. #endif
  135648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135649. "lsrs r6, %[a], #16\n\t"
  135650. #else
  135651. "lsr r6, %[a], #16\n\t"
  135652. #endif
  135653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135654. "lsrs r7, %[b], #16\n\t"
  135655. #else
  135656. "lsr r7, %[b], #16\n\t"
  135657. #endif
  135658. #ifdef WOLFSSL_KEIL
  135659. "muls r7, r6, r7\n\t"
  135660. #elif defined(__clang__)
  135661. "muls r7, r6\n\t"
  135662. #else
  135663. "mul r7, r6\n\t"
  135664. #endif
  135665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135666. "adds r4, r4, r7\n\t"
  135667. #else
  135668. "add r4, r4, r7\n\t"
  135669. #endif
  135670. #ifdef WOLFSSL_KEIL
  135671. "adcs r5, r5, %[r]\n\t"
  135672. #elif defined(__clang__)
  135673. "adcs r5, %[r]\n\t"
  135674. #else
  135675. "adc r5, %[r]\n\t"
  135676. #endif
  135677. "uxth r7, %[b]\n\t"
  135678. #ifdef WOLFSSL_KEIL
  135679. "muls r6, r7, r6\n\t"
  135680. #elif defined(__clang__)
  135681. "muls r6, r7\n\t"
  135682. #else
  135683. "mul r6, r7\n\t"
  135684. #endif
  135685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135686. "lsrs r7, r6, #16\n\t"
  135687. #else
  135688. "lsr r7, r6, #16\n\t"
  135689. #endif
  135690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135691. "lsls r6, r6, #16\n\t"
  135692. #else
  135693. "lsl r6, r6, #16\n\t"
  135694. #endif
  135695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135696. "adds r3, r3, r6\n\t"
  135697. #else
  135698. "add r3, r3, r6\n\t"
  135699. #endif
  135700. #ifdef WOLFSSL_KEIL
  135701. "adcs r4, r4, r7\n\t"
  135702. #elif defined(__clang__)
  135703. "adcs r4, r7\n\t"
  135704. #else
  135705. "adc r4, r7\n\t"
  135706. #endif
  135707. #ifdef WOLFSSL_KEIL
  135708. "adcs r5, r5, %[r]\n\t"
  135709. #elif defined(__clang__)
  135710. "adcs r5, %[r]\n\t"
  135711. #else
  135712. "adc r5, %[r]\n\t"
  135713. #endif
  135714. "# A[2] * B[1]\n\t"
  135715. "mov %[a], r9\n\t"
  135716. "mov %[b], r10\n\t"
  135717. "ldr %[a], [%[a], #8]\n\t"
  135718. "ldr %[b], [%[b], #4]\n\t"
  135719. "uxth r6, %[a]\n\t"
  135720. "uxth r7, %[b]\n\t"
  135721. #ifdef WOLFSSL_KEIL
  135722. "muls r7, r6, r7\n\t"
  135723. #elif defined(__clang__)
  135724. "muls r7, r6\n\t"
  135725. #else
  135726. "mul r7, r6\n\t"
  135727. #endif
  135728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135729. "adds r3, r3, r7\n\t"
  135730. #else
  135731. "add r3, r3, r7\n\t"
  135732. #endif
  135733. #ifdef WOLFSSL_KEIL
  135734. "adcs r4, r4, %[r]\n\t"
  135735. #elif defined(__clang__)
  135736. "adcs r4, %[r]\n\t"
  135737. #else
  135738. "adc r4, %[r]\n\t"
  135739. #endif
  135740. #ifdef WOLFSSL_KEIL
  135741. "adcs r5, r5, %[r]\n\t"
  135742. #elif defined(__clang__)
  135743. "adcs r5, %[r]\n\t"
  135744. #else
  135745. "adc r5, %[r]\n\t"
  135746. #endif
  135747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135748. "lsrs r7, %[b], #16\n\t"
  135749. #else
  135750. "lsr r7, %[b], #16\n\t"
  135751. #endif
  135752. #ifdef WOLFSSL_KEIL
  135753. "muls r6, r7, r6\n\t"
  135754. #elif defined(__clang__)
  135755. "muls r6, r7\n\t"
  135756. #else
  135757. "mul r6, r7\n\t"
  135758. #endif
  135759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135760. "lsrs r7, r6, #16\n\t"
  135761. #else
  135762. "lsr r7, r6, #16\n\t"
  135763. #endif
  135764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135765. "lsls r6, r6, #16\n\t"
  135766. #else
  135767. "lsl r6, r6, #16\n\t"
  135768. #endif
  135769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135770. "adds r3, r3, r6\n\t"
  135771. #else
  135772. "add r3, r3, r6\n\t"
  135773. #endif
  135774. #ifdef WOLFSSL_KEIL
  135775. "adcs r4, r4, r7\n\t"
  135776. #elif defined(__clang__)
  135777. "adcs r4, r7\n\t"
  135778. #else
  135779. "adc r4, r7\n\t"
  135780. #endif
  135781. #ifdef WOLFSSL_KEIL
  135782. "adcs r5, r5, %[r]\n\t"
  135783. #elif defined(__clang__)
  135784. "adcs r5, %[r]\n\t"
  135785. #else
  135786. "adc r5, %[r]\n\t"
  135787. #endif
  135788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135789. "lsrs r6, %[a], #16\n\t"
  135790. #else
  135791. "lsr r6, %[a], #16\n\t"
  135792. #endif
  135793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135794. "lsrs r7, %[b], #16\n\t"
  135795. #else
  135796. "lsr r7, %[b], #16\n\t"
  135797. #endif
  135798. #ifdef WOLFSSL_KEIL
  135799. "muls r7, r6, r7\n\t"
  135800. #elif defined(__clang__)
  135801. "muls r7, r6\n\t"
  135802. #else
  135803. "mul r7, r6\n\t"
  135804. #endif
  135805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135806. "adds r4, r4, r7\n\t"
  135807. #else
  135808. "add r4, r4, r7\n\t"
  135809. #endif
  135810. #ifdef WOLFSSL_KEIL
  135811. "adcs r5, r5, %[r]\n\t"
  135812. #elif defined(__clang__)
  135813. "adcs r5, %[r]\n\t"
  135814. #else
  135815. "adc r5, %[r]\n\t"
  135816. #endif
  135817. "uxth r7, %[b]\n\t"
  135818. #ifdef WOLFSSL_KEIL
  135819. "muls r6, r7, r6\n\t"
  135820. #elif defined(__clang__)
  135821. "muls r6, r7\n\t"
  135822. #else
  135823. "mul r6, r7\n\t"
  135824. #endif
  135825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135826. "lsrs r7, r6, #16\n\t"
  135827. #else
  135828. "lsr r7, r6, #16\n\t"
  135829. #endif
  135830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135831. "lsls r6, r6, #16\n\t"
  135832. #else
  135833. "lsl r6, r6, #16\n\t"
  135834. #endif
  135835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135836. "adds r3, r3, r6\n\t"
  135837. #else
  135838. "add r3, r3, r6\n\t"
  135839. #endif
  135840. #ifdef WOLFSSL_KEIL
  135841. "adcs r4, r4, r7\n\t"
  135842. #elif defined(__clang__)
  135843. "adcs r4, r7\n\t"
  135844. #else
  135845. "adc r4, r7\n\t"
  135846. #endif
  135847. #ifdef WOLFSSL_KEIL
  135848. "adcs r5, r5, %[r]\n\t"
  135849. #elif defined(__clang__)
  135850. "adcs r5, %[r]\n\t"
  135851. #else
  135852. "adc r5, %[r]\n\t"
  135853. #endif
  135854. "# A[3] * B[0]\n\t"
  135855. "mov %[a], r9\n\t"
  135856. "mov %[b], r10\n\t"
  135857. "ldr %[a], [%[a], #12]\n\t"
  135858. "ldr %[b], [%[b]]\n\t"
  135859. "uxth r6, %[a]\n\t"
  135860. "uxth r7, %[b]\n\t"
  135861. #ifdef WOLFSSL_KEIL
  135862. "muls r7, r6, r7\n\t"
  135863. #elif defined(__clang__)
  135864. "muls r7, r6\n\t"
  135865. #else
  135866. "mul r7, r6\n\t"
  135867. #endif
  135868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135869. "adds r3, r3, r7\n\t"
  135870. #else
  135871. "add r3, r3, r7\n\t"
  135872. #endif
  135873. #ifdef WOLFSSL_KEIL
  135874. "adcs r4, r4, %[r]\n\t"
  135875. #elif defined(__clang__)
  135876. "adcs r4, %[r]\n\t"
  135877. #else
  135878. "adc r4, %[r]\n\t"
  135879. #endif
  135880. #ifdef WOLFSSL_KEIL
  135881. "adcs r5, r5, %[r]\n\t"
  135882. #elif defined(__clang__)
  135883. "adcs r5, %[r]\n\t"
  135884. #else
  135885. "adc r5, %[r]\n\t"
  135886. #endif
  135887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135888. "lsrs r7, %[b], #16\n\t"
  135889. #else
  135890. "lsr r7, %[b], #16\n\t"
  135891. #endif
  135892. #ifdef WOLFSSL_KEIL
  135893. "muls r6, r7, r6\n\t"
  135894. #elif defined(__clang__)
  135895. "muls r6, r7\n\t"
  135896. #else
  135897. "mul r6, r7\n\t"
  135898. #endif
  135899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135900. "lsrs r7, r6, #16\n\t"
  135901. #else
  135902. "lsr r7, r6, #16\n\t"
  135903. #endif
  135904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135905. "lsls r6, r6, #16\n\t"
  135906. #else
  135907. "lsl r6, r6, #16\n\t"
  135908. #endif
  135909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135910. "adds r3, r3, r6\n\t"
  135911. #else
  135912. "add r3, r3, r6\n\t"
  135913. #endif
  135914. #ifdef WOLFSSL_KEIL
  135915. "adcs r4, r4, r7\n\t"
  135916. #elif defined(__clang__)
  135917. "adcs r4, r7\n\t"
  135918. #else
  135919. "adc r4, r7\n\t"
  135920. #endif
  135921. #ifdef WOLFSSL_KEIL
  135922. "adcs r5, r5, %[r]\n\t"
  135923. #elif defined(__clang__)
  135924. "adcs r5, %[r]\n\t"
  135925. #else
  135926. "adc r5, %[r]\n\t"
  135927. #endif
  135928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135929. "lsrs r6, %[a], #16\n\t"
  135930. #else
  135931. "lsr r6, %[a], #16\n\t"
  135932. #endif
  135933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135934. "lsrs r7, %[b], #16\n\t"
  135935. #else
  135936. "lsr r7, %[b], #16\n\t"
  135937. #endif
  135938. #ifdef WOLFSSL_KEIL
  135939. "muls r7, r6, r7\n\t"
  135940. #elif defined(__clang__)
  135941. "muls r7, r6\n\t"
  135942. #else
  135943. "mul r7, r6\n\t"
  135944. #endif
  135945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135946. "adds r4, r4, r7\n\t"
  135947. #else
  135948. "add r4, r4, r7\n\t"
  135949. #endif
  135950. #ifdef WOLFSSL_KEIL
  135951. "adcs r5, r5, %[r]\n\t"
  135952. #elif defined(__clang__)
  135953. "adcs r5, %[r]\n\t"
  135954. #else
  135955. "adc r5, %[r]\n\t"
  135956. #endif
  135957. "uxth r7, %[b]\n\t"
  135958. #ifdef WOLFSSL_KEIL
  135959. "muls r6, r7, r6\n\t"
  135960. #elif defined(__clang__)
  135961. "muls r6, r7\n\t"
  135962. #else
  135963. "mul r6, r7\n\t"
  135964. #endif
  135965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135966. "lsrs r7, r6, #16\n\t"
  135967. #else
  135968. "lsr r7, r6, #16\n\t"
  135969. #endif
  135970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135971. "lsls r6, r6, #16\n\t"
  135972. #else
  135973. "lsl r6, r6, #16\n\t"
  135974. #endif
  135975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135976. "adds r3, r3, r6\n\t"
  135977. #else
  135978. "add r3, r3, r6\n\t"
  135979. #endif
  135980. #ifdef WOLFSSL_KEIL
  135981. "adcs r4, r4, r7\n\t"
  135982. #elif defined(__clang__)
  135983. "adcs r4, r7\n\t"
  135984. #else
  135985. "adc r4, r7\n\t"
  135986. #endif
  135987. #ifdef WOLFSSL_KEIL
  135988. "adcs r5, r5, %[r]\n\t"
  135989. #elif defined(__clang__)
  135990. "adcs r5, %[r]\n\t"
  135991. #else
  135992. "adc r5, %[r]\n\t"
  135993. #endif
  135994. "str r3, [sp, #12]\n\t"
  135995. "# A[4] * B[0]\n\t"
  135996. "movs r3, #0\n\t"
  135997. "mov %[a], r9\n\t"
  135998. "mov %[b], r10\n\t"
  135999. "ldr %[a], [%[a], #16]\n\t"
  136000. "ldr %[b], [%[b]]\n\t"
  136001. "uxth r6, %[a]\n\t"
  136002. "uxth r7, %[b]\n\t"
  136003. #ifdef WOLFSSL_KEIL
  136004. "muls r7, r6, r7\n\t"
  136005. #elif defined(__clang__)
  136006. "muls r7, r6\n\t"
  136007. #else
  136008. "mul r7, r6\n\t"
  136009. #endif
  136010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136011. "adds r4, r4, r7\n\t"
  136012. #else
  136013. "add r4, r4, r7\n\t"
  136014. #endif
  136015. #ifdef WOLFSSL_KEIL
  136016. "adcs r5, r5, %[r]\n\t"
  136017. #elif defined(__clang__)
  136018. "adcs r5, %[r]\n\t"
  136019. #else
  136020. "adc r5, %[r]\n\t"
  136021. #endif
  136022. #ifdef WOLFSSL_KEIL
  136023. "adcs r3, r3, %[r]\n\t"
  136024. #elif defined(__clang__)
  136025. "adcs r3, %[r]\n\t"
  136026. #else
  136027. "adc r3, %[r]\n\t"
  136028. #endif
  136029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136030. "lsrs r7, %[b], #16\n\t"
  136031. #else
  136032. "lsr r7, %[b], #16\n\t"
  136033. #endif
  136034. #ifdef WOLFSSL_KEIL
  136035. "muls r6, r7, r6\n\t"
  136036. #elif defined(__clang__)
  136037. "muls r6, r7\n\t"
  136038. #else
  136039. "mul r6, r7\n\t"
  136040. #endif
  136041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136042. "lsrs r7, r6, #16\n\t"
  136043. #else
  136044. "lsr r7, r6, #16\n\t"
  136045. #endif
  136046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136047. "lsls r6, r6, #16\n\t"
  136048. #else
  136049. "lsl r6, r6, #16\n\t"
  136050. #endif
  136051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136052. "adds r4, r4, r6\n\t"
  136053. #else
  136054. "add r4, r4, r6\n\t"
  136055. #endif
  136056. #ifdef WOLFSSL_KEIL
  136057. "adcs r5, r5, r7\n\t"
  136058. #elif defined(__clang__)
  136059. "adcs r5, r7\n\t"
  136060. #else
  136061. "adc r5, r7\n\t"
  136062. #endif
  136063. #ifdef WOLFSSL_KEIL
  136064. "adcs r3, r3, %[r]\n\t"
  136065. #elif defined(__clang__)
  136066. "adcs r3, %[r]\n\t"
  136067. #else
  136068. "adc r3, %[r]\n\t"
  136069. #endif
  136070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136071. "lsrs r6, %[a], #16\n\t"
  136072. #else
  136073. "lsr r6, %[a], #16\n\t"
  136074. #endif
  136075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136076. "lsrs r7, %[b], #16\n\t"
  136077. #else
  136078. "lsr r7, %[b], #16\n\t"
  136079. #endif
  136080. #ifdef WOLFSSL_KEIL
  136081. "muls r7, r6, r7\n\t"
  136082. #elif defined(__clang__)
  136083. "muls r7, r6\n\t"
  136084. #else
  136085. "mul r7, r6\n\t"
  136086. #endif
  136087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136088. "adds r5, r5, r7\n\t"
  136089. #else
  136090. "add r5, r5, r7\n\t"
  136091. #endif
  136092. #ifdef WOLFSSL_KEIL
  136093. "adcs r3, r3, %[r]\n\t"
  136094. #elif defined(__clang__)
  136095. "adcs r3, %[r]\n\t"
  136096. #else
  136097. "adc r3, %[r]\n\t"
  136098. #endif
  136099. "uxth r7, %[b]\n\t"
  136100. #ifdef WOLFSSL_KEIL
  136101. "muls r6, r7, r6\n\t"
  136102. #elif defined(__clang__)
  136103. "muls r6, r7\n\t"
  136104. #else
  136105. "mul r6, r7\n\t"
  136106. #endif
  136107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136108. "lsrs r7, r6, #16\n\t"
  136109. #else
  136110. "lsr r7, r6, #16\n\t"
  136111. #endif
  136112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136113. "lsls r6, r6, #16\n\t"
  136114. #else
  136115. "lsl r6, r6, #16\n\t"
  136116. #endif
  136117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136118. "adds r4, r4, r6\n\t"
  136119. #else
  136120. "add r4, r4, r6\n\t"
  136121. #endif
  136122. #ifdef WOLFSSL_KEIL
  136123. "adcs r5, r5, r7\n\t"
  136124. #elif defined(__clang__)
  136125. "adcs r5, r7\n\t"
  136126. #else
  136127. "adc r5, r7\n\t"
  136128. #endif
  136129. #ifdef WOLFSSL_KEIL
  136130. "adcs r3, r3, %[r]\n\t"
  136131. #elif defined(__clang__)
  136132. "adcs r3, %[r]\n\t"
  136133. #else
  136134. "adc r3, %[r]\n\t"
  136135. #endif
  136136. "# A[3] * B[1]\n\t"
  136137. "mov %[a], r9\n\t"
  136138. "mov %[b], r10\n\t"
  136139. "ldr %[a], [%[a], #12]\n\t"
  136140. "ldr %[b], [%[b], #4]\n\t"
  136141. "uxth r6, %[a]\n\t"
  136142. "uxth r7, %[b]\n\t"
  136143. #ifdef WOLFSSL_KEIL
  136144. "muls r7, r6, r7\n\t"
  136145. #elif defined(__clang__)
  136146. "muls r7, r6\n\t"
  136147. #else
  136148. "mul r7, r6\n\t"
  136149. #endif
  136150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136151. "adds r4, r4, r7\n\t"
  136152. #else
  136153. "add r4, r4, r7\n\t"
  136154. #endif
  136155. #ifdef WOLFSSL_KEIL
  136156. "adcs r5, r5, %[r]\n\t"
  136157. #elif defined(__clang__)
  136158. "adcs r5, %[r]\n\t"
  136159. #else
  136160. "adc r5, %[r]\n\t"
  136161. #endif
  136162. #ifdef WOLFSSL_KEIL
  136163. "adcs r3, r3, %[r]\n\t"
  136164. #elif defined(__clang__)
  136165. "adcs r3, %[r]\n\t"
  136166. #else
  136167. "adc r3, %[r]\n\t"
  136168. #endif
  136169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136170. "lsrs r7, %[b], #16\n\t"
  136171. #else
  136172. "lsr r7, %[b], #16\n\t"
  136173. #endif
  136174. #ifdef WOLFSSL_KEIL
  136175. "muls r6, r7, r6\n\t"
  136176. #elif defined(__clang__)
  136177. "muls r6, r7\n\t"
  136178. #else
  136179. "mul r6, r7\n\t"
  136180. #endif
  136181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136182. "lsrs r7, r6, #16\n\t"
  136183. #else
  136184. "lsr r7, r6, #16\n\t"
  136185. #endif
  136186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136187. "lsls r6, r6, #16\n\t"
  136188. #else
  136189. "lsl r6, r6, #16\n\t"
  136190. #endif
  136191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136192. "adds r4, r4, r6\n\t"
  136193. #else
  136194. "add r4, r4, r6\n\t"
  136195. #endif
  136196. #ifdef WOLFSSL_KEIL
  136197. "adcs r5, r5, r7\n\t"
  136198. #elif defined(__clang__)
  136199. "adcs r5, r7\n\t"
  136200. #else
  136201. "adc r5, r7\n\t"
  136202. #endif
  136203. #ifdef WOLFSSL_KEIL
  136204. "adcs r3, r3, %[r]\n\t"
  136205. #elif defined(__clang__)
  136206. "adcs r3, %[r]\n\t"
  136207. #else
  136208. "adc r3, %[r]\n\t"
  136209. #endif
  136210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136211. "lsrs r6, %[a], #16\n\t"
  136212. #else
  136213. "lsr r6, %[a], #16\n\t"
  136214. #endif
  136215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136216. "lsrs r7, %[b], #16\n\t"
  136217. #else
  136218. "lsr r7, %[b], #16\n\t"
  136219. #endif
  136220. #ifdef WOLFSSL_KEIL
  136221. "muls r7, r6, r7\n\t"
  136222. #elif defined(__clang__)
  136223. "muls r7, r6\n\t"
  136224. #else
  136225. "mul r7, r6\n\t"
  136226. #endif
  136227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136228. "adds r5, r5, r7\n\t"
  136229. #else
  136230. "add r5, r5, r7\n\t"
  136231. #endif
  136232. #ifdef WOLFSSL_KEIL
  136233. "adcs r3, r3, %[r]\n\t"
  136234. #elif defined(__clang__)
  136235. "adcs r3, %[r]\n\t"
  136236. #else
  136237. "adc r3, %[r]\n\t"
  136238. #endif
  136239. "uxth r7, %[b]\n\t"
  136240. #ifdef WOLFSSL_KEIL
  136241. "muls r6, r7, r6\n\t"
  136242. #elif defined(__clang__)
  136243. "muls r6, r7\n\t"
  136244. #else
  136245. "mul r6, r7\n\t"
  136246. #endif
  136247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136248. "lsrs r7, r6, #16\n\t"
  136249. #else
  136250. "lsr r7, r6, #16\n\t"
  136251. #endif
  136252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136253. "lsls r6, r6, #16\n\t"
  136254. #else
  136255. "lsl r6, r6, #16\n\t"
  136256. #endif
  136257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136258. "adds r4, r4, r6\n\t"
  136259. #else
  136260. "add r4, r4, r6\n\t"
  136261. #endif
  136262. #ifdef WOLFSSL_KEIL
  136263. "adcs r5, r5, r7\n\t"
  136264. #elif defined(__clang__)
  136265. "adcs r5, r7\n\t"
  136266. #else
  136267. "adc r5, r7\n\t"
  136268. #endif
  136269. #ifdef WOLFSSL_KEIL
  136270. "adcs r3, r3, %[r]\n\t"
  136271. #elif defined(__clang__)
  136272. "adcs r3, %[r]\n\t"
  136273. #else
  136274. "adc r3, %[r]\n\t"
  136275. #endif
  136276. "# A[2] * B[2]\n\t"
  136277. "mov %[a], r9\n\t"
  136278. "mov %[b], r10\n\t"
  136279. "ldr %[a], [%[a], #8]\n\t"
  136280. "ldr %[b], [%[b], #8]\n\t"
  136281. "uxth r6, %[a]\n\t"
  136282. "uxth r7, %[b]\n\t"
  136283. #ifdef WOLFSSL_KEIL
  136284. "muls r7, r6, r7\n\t"
  136285. #elif defined(__clang__)
  136286. "muls r7, r6\n\t"
  136287. #else
  136288. "mul r7, r6\n\t"
  136289. #endif
  136290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136291. "adds r4, r4, r7\n\t"
  136292. #else
  136293. "add r4, r4, r7\n\t"
  136294. #endif
  136295. #ifdef WOLFSSL_KEIL
  136296. "adcs r5, r5, %[r]\n\t"
  136297. #elif defined(__clang__)
  136298. "adcs r5, %[r]\n\t"
  136299. #else
  136300. "adc r5, %[r]\n\t"
  136301. #endif
  136302. #ifdef WOLFSSL_KEIL
  136303. "adcs r3, r3, %[r]\n\t"
  136304. #elif defined(__clang__)
  136305. "adcs r3, %[r]\n\t"
  136306. #else
  136307. "adc r3, %[r]\n\t"
  136308. #endif
  136309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136310. "lsrs r7, %[b], #16\n\t"
  136311. #else
  136312. "lsr r7, %[b], #16\n\t"
  136313. #endif
  136314. #ifdef WOLFSSL_KEIL
  136315. "muls r6, r7, r6\n\t"
  136316. #elif defined(__clang__)
  136317. "muls r6, r7\n\t"
  136318. #else
  136319. "mul r6, r7\n\t"
  136320. #endif
  136321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136322. "lsrs r7, r6, #16\n\t"
  136323. #else
  136324. "lsr r7, r6, #16\n\t"
  136325. #endif
  136326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136327. "lsls r6, r6, #16\n\t"
  136328. #else
  136329. "lsl r6, r6, #16\n\t"
  136330. #endif
  136331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136332. "adds r4, r4, r6\n\t"
  136333. #else
  136334. "add r4, r4, r6\n\t"
  136335. #endif
  136336. #ifdef WOLFSSL_KEIL
  136337. "adcs r5, r5, r7\n\t"
  136338. #elif defined(__clang__)
  136339. "adcs r5, r7\n\t"
  136340. #else
  136341. "adc r5, r7\n\t"
  136342. #endif
  136343. #ifdef WOLFSSL_KEIL
  136344. "adcs r3, r3, %[r]\n\t"
  136345. #elif defined(__clang__)
  136346. "adcs r3, %[r]\n\t"
  136347. #else
  136348. "adc r3, %[r]\n\t"
  136349. #endif
  136350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136351. "lsrs r6, %[a], #16\n\t"
  136352. #else
  136353. "lsr r6, %[a], #16\n\t"
  136354. #endif
  136355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136356. "lsrs r7, %[b], #16\n\t"
  136357. #else
  136358. "lsr r7, %[b], #16\n\t"
  136359. #endif
  136360. #ifdef WOLFSSL_KEIL
  136361. "muls r7, r6, r7\n\t"
  136362. #elif defined(__clang__)
  136363. "muls r7, r6\n\t"
  136364. #else
  136365. "mul r7, r6\n\t"
  136366. #endif
  136367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136368. "adds r5, r5, r7\n\t"
  136369. #else
  136370. "add r5, r5, r7\n\t"
  136371. #endif
  136372. #ifdef WOLFSSL_KEIL
  136373. "adcs r3, r3, %[r]\n\t"
  136374. #elif defined(__clang__)
  136375. "adcs r3, %[r]\n\t"
  136376. #else
  136377. "adc r3, %[r]\n\t"
  136378. #endif
  136379. "uxth r7, %[b]\n\t"
  136380. #ifdef WOLFSSL_KEIL
  136381. "muls r6, r7, r6\n\t"
  136382. #elif defined(__clang__)
  136383. "muls r6, r7\n\t"
  136384. #else
  136385. "mul r6, r7\n\t"
  136386. #endif
  136387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136388. "lsrs r7, r6, #16\n\t"
  136389. #else
  136390. "lsr r7, r6, #16\n\t"
  136391. #endif
  136392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136393. "lsls r6, r6, #16\n\t"
  136394. #else
  136395. "lsl r6, r6, #16\n\t"
  136396. #endif
  136397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136398. "adds r4, r4, r6\n\t"
  136399. #else
  136400. "add r4, r4, r6\n\t"
  136401. #endif
  136402. #ifdef WOLFSSL_KEIL
  136403. "adcs r5, r5, r7\n\t"
  136404. #elif defined(__clang__)
  136405. "adcs r5, r7\n\t"
  136406. #else
  136407. "adc r5, r7\n\t"
  136408. #endif
  136409. #ifdef WOLFSSL_KEIL
  136410. "adcs r3, r3, %[r]\n\t"
  136411. #elif defined(__clang__)
  136412. "adcs r3, %[r]\n\t"
  136413. #else
  136414. "adc r3, %[r]\n\t"
  136415. #endif
  136416. "# A[1] * B[3]\n\t"
  136417. "mov %[a], r9\n\t"
  136418. "mov %[b], r10\n\t"
  136419. "ldr %[a], [%[a], #4]\n\t"
  136420. "ldr %[b], [%[b], #12]\n\t"
  136421. "uxth r6, %[a]\n\t"
  136422. "uxth r7, %[b]\n\t"
  136423. #ifdef WOLFSSL_KEIL
  136424. "muls r7, r6, r7\n\t"
  136425. #elif defined(__clang__)
  136426. "muls r7, r6\n\t"
  136427. #else
  136428. "mul r7, r6\n\t"
  136429. #endif
  136430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136431. "adds r4, r4, r7\n\t"
  136432. #else
  136433. "add r4, r4, r7\n\t"
  136434. #endif
  136435. #ifdef WOLFSSL_KEIL
  136436. "adcs r5, r5, %[r]\n\t"
  136437. #elif defined(__clang__)
  136438. "adcs r5, %[r]\n\t"
  136439. #else
  136440. "adc r5, %[r]\n\t"
  136441. #endif
  136442. #ifdef WOLFSSL_KEIL
  136443. "adcs r3, r3, %[r]\n\t"
  136444. #elif defined(__clang__)
  136445. "adcs r3, %[r]\n\t"
  136446. #else
  136447. "adc r3, %[r]\n\t"
  136448. #endif
  136449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136450. "lsrs r7, %[b], #16\n\t"
  136451. #else
  136452. "lsr r7, %[b], #16\n\t"
  136453. #endif
  136454. #ifdef WOLFSSL_KEIL
  136455. "muls r6, r7, r6\n\t"
  136456. #elif defined(__clang__)
  136457. "muls r6, r7\n\t"
  136458. #else
  136459. "mul r6, r7\n\t"
  136460. #endif
  136461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136462. "lsrs r7, r6, #16\n\t"
  136463. #else
  136464. "lsr r7, r6, #16\n\t"
  136465. #endif
  136466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136467. "lsls r6, r6, #16\n\t"
  136468. #else
  136469. "lsl r6, r6, #16\n\t"
  136470. #endif
  136471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136472. "adds r4, r4, r6\n\t"
  136473. #else
  136474. "add r4, r4, r6\n\t"
  136475. #endif
  136476. #ifdef WOLFSSL_KEIL
  136477. "adcs r5, r5, r7\n\t"
  136478. #elif defined(__clang__)
  136479. "adcs r5, r7\n\t"
  136480. #else
  136481. "adc r5, r7\n\t"
  136482. #endif
  136483. #ifdef WOLFSSL_KEIL
  136484. "adcs r3, r3, %[r]\n\t"
  136485. #elif defined(__clang__)
  136486. "adcs r3, %[r]\n\t"
  136487. #else
  136488. "adc r3, %[r]\n\t"
  136489. #endif
  136490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136491. "lsrs r6, %[a], #16\n\t"
  136492. #else
  136493. "lsr r6, %[a], #16\n\t"
  136494. #endif
  136495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136496. "lsrs r7, %[b], #16\n\t"
  136497. #else
  136498. "lsr r7, %[b], #16\n\t"
  136499. #endif
  136500. #ifdef WOLFSSL_KEIL
  136501. "muls r7, r6, r7\n\t"
  136502. #elif defined(__clang__)
  136503. "muls r7, r6\n\t"
  136504. #else
  136505. "mul r7, r6\n\t"
  136506. #endif
  136507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136508. "adds r5, r5, r7\n\t"
  136509. #else
  136510. "add r5, r5, r7\n\t"
  136511. #endif
  136512. #ifdef WOLFSSL_KEIL
  136513. "adcs r3, r3, %[r]\n\t"
  136514. #elif defined(__clang__)
  136515. "adcs r3, %[r]\n\t"
  136516. #else
  136517. "adc r3, %[r]\n\t"
  136518. #endif
  136519. "uxth r7, %[b]\n\t"
  136520. #ifdef WOLFSSL_KEIL
  136521. "muls r6, r7, r6\n\t"
  136522. #elif defined(__clang__)
  136523. "muls r6, r7\n\t"
  136524. #else
  136525. "mul r6, r7\n\t"
  136526. #endif
  136527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136528. "lsrs r7, r6, #16\n\t"
  136529. #else
  136530. "lsr r7, r6, #16\n\t"
  136531. #endif
  136532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136533. "lsls r6, r6, #16\n\t"
  136534. #else
  136535. "lsl r6, r6, #16\n\t"
  136536. #endif
  136537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136538. "adds r4, r4, r6\n\t"
  136539. #else
  136540. "add r4, r4, r6\n\t"
  136541. #endif
  136542. #ifdef WOLFSSL_KEIL
  136543. "adcs r5, r5, r7\n\t"
  136544. #elif defined(__clang__)
  136545. "adcs r5, r7\n\t"
  136546. #else
  136547. "adc r5, r7\n\t"
  136548. #endif
  136549. #ifdef WOLFSSL_KEIL
  136550. "adcs r3, r3, %[r]\n\t"
  136551. #elif defined(__clang__)
  136552. "adcs r3, %[r]\n\t"
  136553. #else
  136554. "adc r3, %[r]\n\t"
  136555. #endif
  136556. "# A[0] * B[4]\n\t"
  136557. "mov %[a], r9\n\t"
  136558. "mov %[b], r10\n\t"
  136559. "ldr %[a], [%[a]]\n\t"
  136560. "ldr %[b], [%[b], #16]\n\t"
  136561. "uxth r6, %[a]\n\t"
  136562. "uxth r7, %[b]\n\t"
  136563. #ifdef WOLFSSL_KEIL
  136564. "muls r7, r6, r7\n\t"
  136565. #elif defined(__clang__)
  136566. "muls r7, r6\n\t"
  136567. #else
  136568. "mul r7, r6\n\t"
  136569. #endif
  136570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136571. "adds r4, r4, r7\n\t"
  136572. #else
  136573. "add r4, r4, r7\n\t"
  136574. #endif
  136575. #ifdef WOLFSSL_KEIL
  136576. "adcs r5, r5, %[r]\n\t"
  136577. #elif defined(__clang__)
  136578. "adcs r5, %[r]\n\t"
  136579. #else
  136580. "adc r5, %[r]\n\t"
  136581. #endif
  136582. #ifdef WOLFSSL_KEIL
  136583. "adcs r3, r3, %[r]\n\t"
  136584. #elif defined(__clang__)
  136585. "adcs r3, %[r]\n\t"
  136586. #else
  136587. "adc r3, %[r]\n\t"
  136588. #endif
  136589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136590. "lsrs r7, %[b], #16\n\t"
  136591. #else
  136592. "lsr r7, %[b], #16\n\t"
  136593. #endif
  136594. #ifdef WOLFSSL_KEIL
  136595. "muls r6, r7, r6\n\t"
  136596. #elif defined(__clang__)
  136597. "muls r6, r7\n\t"
  136598. #else
  136599. "mul r6, r7\n\t"
  136600. #endif
  136601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136602. "lsrs r7, r6, #16\n\t"
  136603. #else
  136604. "lsr r7, r6, #16\n\t"
  136605. #endif
  136606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136607. "lsls r6, r6, #16\n\t"
  136608. #else
  136609. "lsl r6, r6, #16\n\t"
  136610. #endif
  136611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136612. "adds r4, r4, r6\n\t"
  136613. #else
  136614. "add r4, r4, r6\n\t"
  136615. #endif
  136616. #ifdef WOLFSSL_KEIL
  136617. "adcs r5, r5, r7\n\t"
  136618. #elif defined(__clang__)
  136619. "adcs r5, r7\n\t"
  136620. #else
  136621. "adc r5, r7\n\t"
  136622. #endif
  136623. #ifdef WOLFSSL_KEIL
  136624. "adcs r3, r3, %[r]\n\t"
  136625. #elif defined(__clang__)
  136626. "adcs r3, %[r]\n\t"
  136627. #else
  136628. "adc r3, %[r]\n\t"
  136629. #endif
  136630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136631. "lsrs r6, %[a], #16\n\t"
  136632. #else
  136633. "lsr r6, %[a], #16\n\t"
  136634. #endif
  136635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136636. "lsrs r7, %[b], #16\n\t"
  136637. #else
  136638. "lsr r7, %[b], #16\n\t"
  136639. #endif
  136640. #ifdef WOLFSSL_KEIL
  136641. "muls r7, r6, r7\n\t"
  136642. #elif defined(__clang__)
  136643. "muls r7, r6\n\t"
  136644. #else
  136645. "mul r7, r6\n\t"
  136646. #endif
  136647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136648. "adds r5, r5, r7\n\t"
  136649. #else
  136650. "add r5, r5, r7\n\t"
  136651. #endif
  136652. #ifdef WOLFSSL_KEIL
  136653. "adcs r3, r3, %[r]\n\t"
  136654. #elif defined(__clang__)
  136655. "adcs r3, %[r]\n\t"
  136656. #else
  136657. "adc r3, %[r]\n\t"
  136658. #endif
  136659. "uxth r7, %[b]\n\t"
  136660. #ifdef WOLFSSL_KEIL
  136661. "muls r6, r7, r6\n\t"
  136662. #elif defined(__clang__)
  136663. "muls r6, r7\n\t"
  136664. #else
  136665. "mul r6, r7\n\t"
  136666. #endif
  136667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136668. "lsrs r7, r6, #16\n\t"
  136669. #else
  136670. "lsr r7, r6, #16\n\t"
  136671. #endif
  136672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136673. "lsls r6, r6, #16\n\t"
  136674. #else
  136675. "lsl r6, r6, #16\n\t"
  136676. #endif
  136677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136678. "adds r4, r4, r6\n\t"
  136679. #else
  136680. "add r4, r4, r6\n\t"
  136681. #endif
  136682. #ifdef WOLFSSL_KEIL
  136683. "adcs r5, r5, r7\n\t"
  136684. #elif defined(__clang__)
  136685. "adcs r5, r7\n\t"
  136686. #else
  136687. "adc r5, r7\n\t"
  136688. #endif
  136689. #ifdef WOLFSSL_KEIL
  136690. "adcs r3, r3, %[r]\n\t"
  136691. #elif defined(__clang__)
  136692. "adcs r3, %[r]\n\t"
  136693. #else
  136694. "adc r3, %[r]\n\t"
  136695. #endif
  136696. "str r4, [sp, #16]\n\t"
  136697. "# A[0] * B[5]\n\t"
  136698. "movs r4, #0\n\t"
  136699. "mov %[a], r9\n\t"
  136700. "mov %[b], r10\n\t"
  136701. "ldr %[a], [%[a]]\n\t"
  136702. "ldr %[b], [%[b], #20]\n\t"
  136703. "uxth r6, %[a]\n\t"
  136704. "uxth r7, %[b]\n\t"
  136705. #ifdef WOLFSSL_KEIL
  136706. "muls r7, r6, r7\n\t"
  136707. #elif defined(__clang__)
  136708. "muls r7, r6\n\t"
  136709. #else
  136710. "mul r7, r6\n\t"
  136711. #endif
  136712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136713. "adds r5, r5, r7\n\t"
  136714. #else
  136715. "add r5, r5, r7\n\t"
  136716. #endif
  136717. #ifdef WOLFSSL_KEIL
  136718. "adcs r3, r3, %[r]\n\t"
  136719. #elif defined(__clang__)
  136720. "adcs r3, %[r]\n\t"
  136721. #else
  136722. "adc r3, %[r]\n\t"
  136723. #endif
  136724. #ifdef WOLFSSL_KEIL
  136725. "adcs r4, r4, %[r]\n\t"
  136726. #elif defined(__clang__)
  136727. "adcs r4, %[r]\n\t"
  136728. #else
  136729. "adc r4, %[r]\n\t"
  136730. #endif
  136731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136732. "lsrs r7, %[b], #16\n\t"
  136733. #else
  136734. "lsr r7, %[b], #16\n\t"
  136735. #endif
  136736. #ifdef WOLFSSL_KEIL
  136737. "muls r6, r7, r6\n\t"
  136738. #elif defined(__clang__)
  136739. "muls r6, r7\n\t"
  136740. #else
  136741. "mul r6, r7\n\t"
  136742. #endif
  136743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136744. "lsrs r7, r6, #16\n\t"
  136745. #else
  136746. "lsr r7, r6, #16\n\t"
  136747. #endif
  136748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136749. "lsls r6, r6, #16\n\t"
  136750. #else
  136751. "lsl r6, r6, #16\n\t"
  136752. #endif
  136753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136754. "adds r5, r5, r6\n\t"
  136755. #else
  136756. "add r5, r5, r6\n\t"
  136757. #endif
  136758. #ifdef WOLFSSL_KEIL
  136759. "adcs r3, r3, r7\n\t"
  136760. #elif defined(__clang__)
  136761. "adcs r3, r7\n\t"
  136762. #else
  136763. "adc r3, r7\n\t"
  136764. #endif
  136765. #ifdef WOLFSSL_KEIL
  136766. "adcs r4, r4, %[r]\n\t"
  136767. #elif defined(__clang__)
  136768. "adcs r4, %[r]\n\t"
  136769. #else
  136770. "adc r4, %[r]\n\t"
  136771. #endif
  136772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136773. "lsrs r6, %[a], #16\n\t"
  136774. #else
  136775. "lsr r6, %[a], #16\n\t"
  136776. #endif
  136777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136778. "lsrs r7, %[b], #16\n\t"
  136779. #else
  136780. "lsr r7, %[b], #16\n\t"
  136781. #endif
  136782. #ifdef WOLFSSL_KEIL
  136783. "muls r7, r6, r7\n\t"
  136784. #elif defined(__clang__)
  136785. "muls r7, r6\n\t"
  136786. #else
  136787. "mul r7, r6\n\t"
  136788. #endif
  136789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136790. "adds r3, r3, r7\n\t"
  136791. #else
  136792. "add r3, r3, r7\n\t"
  136793. #endif
  136794. #ifdef WOLFSSL_KEIL
  136795. "adcs r4, r4, %[r]\n\t"
  136796. #elif defined(__clang__)
  136797. "adcs r4, %[r]\n\t"
  136798. #else
  136799. "adc r4, %[r]\n\t"
  136800. #endif
  136801. "uxth r7, %[b]\n\t"
  136802. #ifdef WOLFSSL_KEIL
  136803. "muls r6, r7, r6\n\t"
  136804. #elif defined(__clang__)
  136805. "muls r6, r7\n\t"
  136806. #else
  136807. "mul r6, r7\n\t"
  136808. #endif
  136809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136810. "lsrs r7, r6, #16\n\t"
  136811. #else
  136812. "lsr r7, r6, #16\n\t"
  136813. #endif
  136814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136815. "lsls r6, r6, #16\n\t"
  136816. #else
  136817. "lsl r6, r6, #16\n\t"
  136818. #endif
  136819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136820. "adds r5, r5, r6\n\t"
  136821. #else
  136822. "add r5, r5, r6\n\t"
  136823. #endif
  136824. #ifdef WOLFSSL_KEIL
  136825. "adcs r3, r3, r7\n\t"
  136826. #elif defined(__clang__)
  136827. "adcs r3, r7\n\t"
  136828. #else
  136829. "adc r3, r7\n\t"
  136830. #endif
  136831. #ifdef WOLFSSL_KEIL
  136832. "adcs r4, r4, %[r]\n\t"
  136833. #elif defined(__clang__)
  136834. "adcs r4, %[r]\n\t"
  136835. #else
  136836. "adc r4, %[r]\n\t"
  136837. #endif
  136838. "# A[1] * B[4]\n\t"
  136839. "mov %[a], r9\n\t"
  136840. "mov %[b], r10\n\t"
  136841. "ldr %[a], [%[a], #4]\n\t"
  136842. "ldr %[b], [%[b], #16]\n\t"
  136843. "uxth r6, %[a]\n\t"
  136844. "uxth r7, %[b]\n\t"
  136845. #ifdef WOLFSSL_KEIL
  136846. "muls r7, r6, r7\n\t"
  136847. #elif defined(__clang__)
  136848. "muls r7, r6\n\t"
  136849. #else
  136850. "mul r7, r6\n\t"
  136851. #endif
  136852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136853. "adds r5, r5, r7\n\t"
  136854. #else
  136855. "add r5, r5, r7\n\t"
  136856. #endif
  136857. #ifdef WOLFSSL_KEIL
  136858. "adcs r3, r3, %[r]\n\t"
  136859. #elif defined(__clang__)
  136860. "adcs r3, %[r]\n\t"
  136861. #else
  136862. "adc r3, %[r]\n\t"
  136863. #endif
  136864. #ifdef WOLFSSL_KEIL
  136865. "adcs r4, r4, %[r]\n\t"
  136866. #elif defined(__clang__)
  136867. "adcs r4, %[r]\n\t"
  136868. #else
  136869. "adc r4, %[r]\n\t"
  136870. #endif
  136871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136872. "lsrs r7, %[b], #16\n\t"
  136873. #else
  136874. "lsr r7, %[b], #16\n\t"
  136875. #endif
  136876. #ifdef WOLFSSL_KEIL
  136877. "muls r6, r7, r6\n\t"
  136878. #elif defined(__clang__)
  136879. "muls r6, r7\n\t"
  136880. #else
  136881. "mul r6, r7\n\t"
  136882. #endif
  136883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136884. "lsrs r7, r6, #16\n\t"
  136885. #else
  136886. "lsr r7, r6, #16\n\t"
  136887. #endif
  136888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136889. "lsls r6, r6, #16\n\t"
  136890. #else
  136891. "lsl r6, r6, #16\n\t"
  136892. #endif
  136893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136894. "adds r5, r5, r6\n\t"
  136895. #else
  136896. "add r5, r5, r6\n\t"
  136897. #endif
  136898. #ifdef WOLFSSL_KEIL
  136899. "adcs r3, r3, r7\n\t"
  136900. #elif defined(__clang__)
  136901. "adcs r3, r7\n\t"
  136902. #else
  136903. "adc r3, r7\n\t"
  136904. #endif
  136905. #ifdef WOLFSSL_KEIL
  136906. "adcs r4, r4, %[r]\n\t"
  136907. #elif defined(__clang__)
  136908. "adcs r4, %[r]\n\t"
  136909. #else
  136910. "adc r4, %[r]\n\t"
  136911. #endif
  136912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136913. "lsrs r6, %[a], #16\n\t"
  136914. #else
  136915. "lsr r6, %[a], #16\n\t"
  136916. #endif
  136917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136918. "lsrs r7, %[b], #16\n\t"
  136919. #else
  136920. "lsr r7, %[b], #16\n\t"
  136921. #endif
  136922. #ifdef WOLFSSL_KEIL
  136923. "muls r7, r6, r7\n\t"
  136924. #elif defined(__clang__)
  136925. "muls r7, r6\n\t"
  136926. #else
  136927. "mul r7, r6\n\t"
  136928. #endif
  136929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136930. "adds r3, r3, r7\n\t"
  136931. #else
  136932. "add r3, r3, r7\n\t"
  136933. #endif
  136934. #ifdef WOLFSSL_KEIL
  136935. "adcs r4, r4, %[r]\n\t"
  136936. #elif defined(__clang__)
  136937. "adcs r4, %[r]\n\t"
  136938. #else
  136939. "adc r4, %[r]\n\t"
  136940. #endif
  136941. "uxth r7, %[b]\n\t"
  136942. #ifdef WOLFSSL_KEIL
  136943. "muls r6, r7, r6\n\t"
  136944. #elif defined(__clang__)
  136945. "muls r6, r7\n\t"
  136946. #else
  136947. "mul r6, r7\n\t"
  136948. #endif
  136949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136950. "lsrs r7, r6, #16\n\t"
  136951. #else
  136952. "lsr r7, r6, #16\n\t"
  136953. #endif
  136954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136955. "lsls r6, r6, #16\n\t"
  136956. #else
  136957. "lsl r6, r6, #16\n\t"
  136958. #endif
  136959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136960. "adds r5, r5, r6\n\t"
  136961. #else
  136962. "add r5, r5, r6\n\t"
  136963. #endif
  136964. #ifdef WOLFSSL_KEIL
  136965. "adcs r3, r3, r7\n\t"
  136966. #elif defined(__clang__)
  136967. "adcs r3, r7\n\t"
  136968. #else
  136969. "adc r3, r7\n\t"
  136970. #endif
  136971. #ifdef WOLFSSL_KEIL
  136972. "adcs r4, r4, %[r]\n\t"
  136973. #elif defined(__clang__)
  136974. "adcs r4, %[r]\n\t"
  136975. #else
  136976. "adc r4, %[r]\n\t"
  136977. #endif
  136978. "# A[2] * B[3]\n\t"
  136979. "mov %[a], r9\n\t"
  136980. "mov %[b], r10\n\t"
  136981. "ldr %[a], [%[a], #8]\n\t"
  136982. "ldr %[b], [%[b], #12]\n\t"
  136983. "uxth r6, %[a]\n\t"
  136984. "uxth r7, %[b]\n\t"
  136985. #ifdef WOLFSSL_KEIL
  136986. "muls r7, r6, r7\n\t"
  136987. #elif defined(__clang__)
  136988. "muls r7, r6\n\t"
  136989. #else
  136990. "mul r7, r6\n\t"
  136991. #endif
  136992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136993. "adds r5, r5, r7\n\t"
  136994. #else
  136995. "add r5, r5, r7\n\t"
  136996. #endif
  136997. #ifdef WOLFSSL_KEIL
  136998. "adcs r3, r3, %[r]\n\t"
  136999. #elif defined(__clang__)
  137000. "adcs r3, %[r]\n\t"
  137001. #else
  137002. "adc r3, %[r]\n\t"
  137003. #endif
  137004. #ifdef WOLFSSL_KEIL
  137005. "adcs r4, r4, %[r]\n\t"
  137006. #elif defined(__clang__)
  137007. "adcs r4, %[r]\n\t"
  137008. #else
  137009. "adc r4, %[r]\n\t"
  137010. #endif
  137011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137012. "lsrs r7, %[b], #16\n\t"
  137013. #else
  137014. "lsr r7, %[b], #16\n\t"
  137015. #endif
  137016. #ifdef WOLFSSL_KEIL
  137017. "muls r6, r7, r6\n\t"
  137018. #elif defined(__clang__)
  137019. "muls r6, r7\n\t"
  137020. #else
  137021. "mul r6, r7\n\t"
  137022. #endif
  137023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137024. "lsrs r7, r6, #16\n\t"
  137025. #else
  137026. "lsr r7, r6, #16\n\t"
  137027. #endif
  137028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137029. "lsls r6, r6, #16\n\t"
  137030. #else
  137031. "lsl r6, r6, #16\n\t"
  137032. #endif
  137033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137034. "adds r5, r5, r6\n\t"
  137035. #else
  137036. "add r5, r5, r6\n\t"
  137037. #endif
  137038. #ifdef WOLFSSL_KEIL
  137039. "adcs r3, r3, r7\n\t"
  137040. #elif defined(__clang__)
  137041. "adcs r3, r7\n\t"
  137042. #else
  137043. "adc r3, r7\n\t"
  137044. #endif
  137045. #ifdef WOLFSSL_KEIL
  137046. "adcs r4, r4, %[r]\n\t"
  137047. #elif defined(__clang__)
  137048. "adcs r4, %[r]\n\t"
  137049. #else
  137050. "adc r4, %[r]\n\t"
  137051. #endif
  137052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137053. "lsrs r6, %[a], #16\n\t"
  137054. #else
  137055. "lsr r6, %[a], #16\n\t"
  137056. #endif
  137057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137058. "lsrs r7, %[b], #16\n\t"
  137059. #else
  137060. "lsr r7, %[b], #16\n\t"
  137061. #endif
  137062. #ifdef WOLFSSL_KEIL
  137063. "muls r7, r6, r7\n\t"
  137064. #elif defined(__clang__)
  137065. "muls r7, r6\n\t"
  137066. #else
  137067. "mul r7, r6\n\t"
  137068. #endif
  137069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137070. "adds r3, r3, r7\n\t"
  137071. #else
  137072. "add r3, r3, r7\n\t"
  137073. #endif
  137074. #ifdef WOLFSSL_KEIL
  137075. "adcs r4, r4, %[r]\n\t"
  137076. #elif defined(__clang__)
  137077. "adcs r4, %[r]\n\t"
  137078. #else
  137079. "adc r4, %[r]\n\t"
  137080. #endif
  137081. "uxth r7, %[b]\n\t"
  137082. #ifdef WOLFSSL_KEIL
  137083. "muls r6, r7, r6\n\t"
  137084. #elif defined(__clang__)
  137085. "muls r6, r7\n\t"
  137086. #else
  137087. "mul r6, r7\n\t"
  137088. #endif
  137089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137090. "lsrs r7, r6, #16\n\t"
  137091. #else
  137092. "lsr r7, r6, #16\n\t"
  137093. #endif
  137094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137095. "lsls r6, r6, #16\n\t"
  137096. #else
  137097. "lsl r6, r6, #16\n\t"
  137098. #endif
  137099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137100. "adds r5, r5, r6\n\t"
  137101. #else
  137102. "add r5, r5, r6\n\t"
  137103. #endif
  137104. #ifdef WOLFSSL_KEIL
  137105. "adcs r3, r3, r7\n\t"
  137106. #elif defined(__clang__)
  137107. "adcs r3, r7\n\t"
  137108. #else
  137109. "adc r3, r7\n\t"
  137110. #endif
  137111. #ifdef WOLFSSL_KEIL
  137112. "adcs r4, r4, %[r]\n\t"
  137113. #elif defined(__clang__)
  137114. "adcs r4, %[r]\n\t"
  137115. #else
  137116. "adc r4, %[r]\n\t"
  137117. #endif
  137118. "# A[3] * B[2]\n\t"
  137119. "mov %[a], r9\n\t"
  137120. "mov %[b], r10\n\t"
  137121. "ldr %[a], [%[a], #12]\n\t"
  137122. "ldr %[b], [%[b], #8]\n\t"
  137123. "uxth r6, %[a]\n\t"
  137124. "uxth r7, %[b]\n\t"
  137125. #ifdef WOLFSSL_KEIL
  137126. "muls r7, r6, r7\n\t"
  137127. #elif defined(__clang__)
  137128. "muls r7, r6\n\t"
  137129. #else
  137130. "mul r7, r6\n\t"
  137131. #endif
  137132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137133. "adds r5, r5, r7\n\t"
  137134. #else
  137135. "add r5, r5, r7\n\t"
  137136. #endif
  137137. #ifdef WOLFSSL_KEIL
  137138. "adcs r3, r3, %[r]\n\t"
  137139. #elif defined(__clang__)
  137140. "adcs r3, %[r]\n\t"
  137141. #else
  137142. "adc r3, %[r]\n\t"
  137143. #endif
  137144. #ifdef WOLFSSL_KEIL
  137145. "adcs r4, r4, %[r]\n\t"
  137146. #elif defined(__clang__)
  137147. "adcs r4, %[r]\n\t"
  137148. #else
  137149. "adc r4, %[r]\n\t"
  137150. #endif
  137151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137152. "lsrs r7, %[b], #16\n\t"
  137153. #else
  137154. "lsr r7, %[b], #16\n\t"
  137155. #endif
  137156. #ifdef WOLFSSL_KEIL
  137157. "muls r6, r7, r6\n\t"
  137158. #elif defined(__clang__)
  137159. "muls r6, r7\n\t"
  137160. #else
  137161. "mul r6, r7\n\t"
  137162. #endif
  137163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137164. "lsrs r7, r6, #16\n\t"
  137165. #else
  137166. "lsr r7, r6, #16\n\t"
  137167. #endif
  137168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137169. "lsls r6, r6, #16\n\t"
  137170. #else
  137171. "lsl r6, r6, #16\n\t"
  137172. #endif
  137173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137174. "adds r5, r5, r6\n\t"
  137175. #else
  137176. "add r5, r5, r6\n\t"
  137177. #endif
  137178. #ifdef WOLFSSL_KEIL
  137179. "adcs r3, r3, r7\n\t"
  137180. #elif defined(__clang__)
  137181. "adcs r3, r7\n\t"
  137182. #else
  137183. "adc r3, r7\n\t"
  137184. #endif
  137185. #ifdef WOLFSSL_KEIL
  137186. "adcs r4, r4, %[r]\n\t"
  137187. #elif defined(__clang__)
  137188. "adcs r4, %[r]\n\t"
  137189. #else
  137190. "adc r4, %[r]\n\t"
  137191. #endif
  137192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137193. "lsrs r6, %[a], #16\n\t"
  137194. #else
  137195. "lsr r6, %[a], #16\n\t"
  137196. #endif
  137197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137198. "lsrs r7, %[b], #16\n\t"
  137199. #else
  137200. "lsr r7, %[b], #16\n\t"
  137201. #endif
  137202. #ifdef WOLFSSL_KEIL
  137203. "muls r7, r6, r7\n\t"
  137204. #elif defined(__clang__)
  137205. "muls r7, r6\n\t"
  137206. #else
  137207. "mul r7, r6\n\t"
  137208. #endif
  137209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137210. "adds r3, r3, r7\n\t"
  137211. #else
  137212. "add r3, r3, r7\n\t"
  137213. #endif
  137214. #ifdef WOLFSSL_KEIL
  137215. "adcs r4, r4, %[r]\n\t"
  137216. #elif defined(__clang__)
  137217. "adcs r4, %[r]\n\t"
  137218. #else
  137219. "adc r4, %[r]\n\t"
  137220. #endif
  137221. "uxth r7, %[b]\n\t"
  137222. #ifdef WOLFSSL_KEIL
  137223. "muls r6, r7, r6\n\t"
  137224. #elif defined(__clang__)
  137225. "muls r6, r7\n\t"
  137226. #else
  137227. "mul r6, r7\n\t"
  137228. #endif
  137229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137230. "lsrs r7, r6, #16\n\t"
  137231. #else
  137232. "lsr r7, r6, #16\n\t"
  137233. #endif
  137234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137235. "lsls r6, r6, #16\n\t"
  137236. #else
  137237. "lsl r6, r6, #16\n\t"
  137238. #endif
  137239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137240. "adds r5, r5, r6\n\t"
  137241. #else
  137242. "add r5, r5, r6\n\t"
  137243. #endif
  137244. #ifdef WOLFSSL_KEIL
  137245. "adcs r3, r3, r7\n\t"
  137246. #elif defined(__clang__)
  137247. "adcs r3, r7\n\t"
  137248. #else
  137249. "adc r3, r7\n\t"
  137250. #endif
  137251. #ifdef WOLFSSL_KEIL
  137252. "adcs r4, r4, %[r]\n\t"
  137253. #elif defined(__clang__)
  137254. "adcs r4, %[r]\n\t"
  137255. #else
  137256. "adc r4, %[r]\n\t"
  137257. #endif
  137258. "# A[4] * B[1]\n\t"
  137259. "mov %[a], r9\n\t"
  137260. "mov %[b], r10\n\t"
  137261. "ldr %[a], [%[a], #16]\n\t"
  137262. "ldr %[b], [%[b], #4]\n\t"
  137263. "uxth r6, %[a]\n\t"
  137264. "uxth r7, %[b]\n\t"
  137265. #ifdef WOLFSSL_KEIL
  137266. "muls r7, r6, r7\n\t"
  137267. #elif defined(__clang__)
  137268. "muls r7, r6\n\t"
  137269. #else
  137270. "mul r7, r6\n\t"
  137271. #endif
  137272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137273. "adds r5, r5, r7\n\t"
  137274. #else
  137275. "add r5, r5, r7\n\t"
  137276. #endif
  137277. #ifdef WOLFSSL_KEIL
  137278. "adcs r3, r3, %[r]\n\t"
  137279. #elif defined(__clang__)
  137280. "adcs r3, %[r]\n\t"
  137281. #else
  137282. "adc r3, %[r]\n\t"
  137283. #endif
  137284. #ifdef WOLFSSL_KEIL
  137285. "adcs r4, r4, %[r]\n\t"
  137286. #elif defined(__clang__)
  137287. "adcs r4, %[r]\n\t"
  137288. #else
  137289. "adc r4, %[r]\n\t"
  137290. #endif
  137291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137292. "lsrs r7, %[b], #16\n\t"
  137293. #else
  137294. "lsr r7, %[b], #16\n\t"
  137295. #endif
  137296. #ifdef WOLFSSL_KEIL
  137297. "muls r6, r7, r6\n\t"
  137298. #elif defined(__clang__)
  137299. "muls r6, r7\n\t"
  137300. #else
  137301. "mul r6, r7\n\t"
  137302. #endif
  137303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137304. "lsrs r7, r6, #16\n\t"
  137305. #else
  137306. "lsr r7, r6, #16\n\t"
  137307. #endif
  137308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137309. "lsls r6, r6, #16\n\t"
  137310. #else
  137311. "lsl r6, r6, #16\n\t"
  137312. #endif
  137313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137314. "adds r5, r5, r6\n\t"
  137315. #else
  137316. "add r5, r5, r6\n\t"
  137317. #endif
  137318. #ifdef WOLFSSL_KEIL
  137319. "adcs r3, r3, r7\n\t"
  137320. #elif defined(__clang__)
  137321. "adcs r3, r7\n\t"
  137322. #else
  137323. "adc r3, r7\n\t"
  137324. #endif
  137325. #ifdef WOLFSSL_KEIL
  137326. "adcs r4, r4, %[r]\n\t"
  137327. #elif defined(__clang__)
  137328. "adcs r4, %[r]\n\t"
  137329. #else
  137330. "adc r4, %[r]\n\t"
  137331. #endif
  137332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137333. "lsrs r6, %[a], #16\n\t"
  137334. #else
  137335. "lsr r6, %[a], #16\n\t"
  137336. #endif
  137337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137338. "lsrs r7, %[b], #16\n\t"
  137339. #else
  137340. "lsr r7, %[b], #16\n\t"
  137341. #endif
  137342. #ifdef WOLFSSL_KEIL
  137343. "muls r7, r6, r7\n\t"
  137344. #elif defined(__clang__)
  137345. "muls r7, r6\n\t"
  137346. #else
  137347. "mul r7, r6\n\t"
  137348. #endif
  137349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137350. "adds r3, r3, r7\n\t"
  137351. #else
  137352. "add r3, r3, r7\n\t"
  137353. #endif
  137354. #ifdef WOLFSSL_KEIL
  137355. "adcs r4, r4, %[r]\n\t"
  137356. #elif defined(__clang__)
  137357. "adcs r4, %[r]\n\t"
  137358. #else
  137359. "adc r4, %[r]\n\t"
  137360. #endif
  137361. "uxth r7, %[b]\n\t"
  137362. #ifdef WOLFSSL_KEIL
  137363. "muls r6, r7, r6\n\t"
  137364. #elif defined(__clang__)
  137365. "muls r6, r7\n\t"
  137366. #else
  137367. "mul r6, r7\n\t"
  137368. #endif
  137369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137370. "lsrs r7, r6, #16\n\t"
  137371. #else
  137372. "lsr r7, r6, #16\n\t"
  137373. #endif
  137374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137375. "lsls r6, r6, #16\n\t"
  137376. #else
  137377. "lsl r6, r6, #16\n\t"
  137378. #endif
  137379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137380. "adds r5, r5, r6\n\t"
  137381. #else
  137382. "add r5, r5, r6\n\t"
  137383. #endif
  137384. #ifdef WOLFSSL_KEIL
  137385. "adcs r3, r3, r7\n\t"
  137386. #elif defined(__clang__)
  137387. "adcs r3, r7\n\t"
  137388. #else
  137389. "adc r3, r7\n\t"
  137390. #endif
  137391. #ifdef WOLFSSL_KEIL
  137392. "adcs r4, r4, %[r]\n\t"
  137393. #elif defined(__clang__)
  137394. "adcs r4, %[r]\n\t"
  137395. #else
  137396. "adc r4, %[r]\n\t"
  137397. #endif
  137398. "# A[5] * B[0]\n\t"
  137399. "mov %[a], r9\n\t"
  137400. "mov %[b], r10\n\t"
  137401. "ldr %[a], [%[a], #20]\n\t"
  137402. "ldr %[b], [%[b]]\n\t"
  137403. "uxth r6, %[a]\n\t"
  137404. "uxth r7, %[b]\n\t"
  137405. #ifdef WOLFSSL_KEIL
  137406. "muls r7, r6, r7\n\t"
  137407. #elif defined(__clang__)
  137408. "muls r7, r6\n\t"
  137409. #else
  137410. "mul r7, r6\n\t"
  137411. #endif
  137412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137413. "adds r5, r5, r7\n\t"
  137414. #else
  137415. "add r5, r5, r7\n\t"
  137416. #endif
  137417. #ifdef WOLFSSL_KEIL
  137418. "adcs r3, r3, %[r]\n\t"
  137419. #elif defined(__clang__)
  137420. "adcs r3, %[r]\n\t"
  137421. #else
  137422. "adc r3, %[r]\n\t"
  137423. #endif
  137424. #ifdef WOLFSSL_KEIL
  137425. "adcs r4, r4, %[r]\n\t"
  137426. #elif defined(__clang__)
  137427. "adcs r4, %[r]\n\t"
  137428. #else
  137429. "adc r4, %[r]\n\t"
  137430. #endif
  137431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137432. "lsrs r7, %[b], #16\n\t"
  137433. #else
  137434. "lsr r7, %[b], #16\n\t"
  137435. #endif
  137436. #ifdef WOLFSSL_KEIL
  137437. "muls r6, r7, r6\n\t"
  137438. #elif defined(__clang__)
  137439. "muls r6, r7\n\t"
  137440. #else
  137441. "mul r6, r7\n\t"
  137442. #endif
  137443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137444. "lsrs r7, r6, #16\n\t"
  137445. #else
  137446. "lsr r7, r6, #16\n\t"
  137447. #endif
  137448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137449. "lsls r6, r6, #16\n\t"
  137450. #else
  137451. "lsl r6, r6, #16\n\t"
  137452. #endif
  137453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137454. "adds r5, r5, r6\n\t"
  137455. #else
  137456. "add r5, r5, r6\n\t"
  137457. #endif
  137458. #ifdef WOLFSSL_KEIL
  137459. "adcs r3, r3, r7\n\t"
  137460. #elif defined(__clang__)
  137461. "adcs r3, r7\n\t"
  137462. #else
  137463. "adc r3, r7\n\t"
  137464. #endif
  137465. #ifdef WOLFSSL_KEIL
  137466. "adcs r4, r4, %[r]\n\t"
  137467. #elif defined(__clang__)
  137468. "adcs r4, %[r]\n\t"
  137469. #else
  137470. "adc r4, %[r]\n\t"
  137471. #endif
  137472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137473. "lsrs r6, %[a], #16\n\t"
  137474. #else
  137475. "lsr r6, %[a], #16\n\t"
  137476. #endif
  137477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137478. "lsrs r7, %[b], #16\n\t"
  137479. #else
  137480. "lsr r7, %[b], #16\n\t"
  137481. #endif
  137482. #ifdef WOLFSSL_KEIL
  137483. "muls r7, r6, r7\n\t"
  137484. #elif defined(__clang__)
  137485. "muls r7, r6\n\t"
  137486. #else
  137487. "mul r7, r6\n\t"
  137488. #endif
  137489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137490. "adds r3, r3, r7\n\t"
  137491. #else
  137492. "add r3, r3, r7\n\t"
  137493. #endif
  137494. #ifdef WOLFSSL_KEIL
  137495. "adcs r4, r4, %[r]\n\t"
  137496. #elif defined(__clang__)
  137497. "adcs r4, %[r]\n\t"
  137498. #else
  137499. "adc r4, %[r]\n\t"
  137500. #endif
  137501. "uxth r7, %[b]\n\t"
  137502. #ifdef WOLFSSL_KEIL
  137503. "muls r6, r7, r6\n\t"
  137504. #elif defined(__clang__)
  137505. "muls r6, r7\n\t"
  137506. #else
  137507. "mul r6, r7\n\t"
  137508. #endif
  137509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137510. "lsrs r7, r6, #16\n\t"
  137511. #else
  137512. "lsr r7, r6, #16\n\t"
  137513. #endif
  137514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137515. "lsls r6, r6, #16\n\t"
  137516. #else
  137517. "lsl r6, r6, #16\n\t"
  137518. #endif
  137519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137520. "adds r5, r5, r6\n\t"
  137521. #else
  137522. "add r5, r5, r6\n\t"
  137523. #endif
  137524. #ifdef WOLFSSL_KEIL
  137525. "adcs r3, r3, r7\n\t"
  137526. #elif defined(__clang__)
  137527. "adcs r3, r7\n\t"
  137528. #else
  137529. "adc r3, r7\n\t"
  137530. #endif
  137531. #ifdef WOLFSSL_KEIL
  137532. "adcs r4, r4, %[r]\n\t"
  137533. #elif defined(__clang__)
  137534. "adcs r4, %[r]\n\t"
  137535. #else
  137536. "adc r4, %[r]\n\t"
  137537. #endif
  137538. "str r5, [sp, #20]\n\t"
  137539. "# A[6] * B[0]\n\t"
  137540. "movs r5, #0\n\t"
  137541. "mov %[a], r9\n\t"
  137542. "mov %[b], r10\n\t"
  137543. "ldr %[a], [%[a], #24]\n\t"
  137544. "ldr %[b], [%[b]]\n\t"
  137545. "uxth r6, %[a]\n\t"
  137546. "uxth r7, %[b]\n\t"
  137547. #ifdef WOLFSSL_KEIL
  137548. "muls r7, r6, r7\n\t"
  137549. #elif defined(__clang__)
  137550. "muls r7, r6\n\t"
  137551. #else
  137552. "mul r7, r6\n\t"
  137553. #endif
  137554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137555. "adds r3, r3, r7\n\t"
  137556. #else
  137557. "add r3, r3, r7\n\t"
  137558. #endif
  137559. #ifdef WOLFSSL_KEIL
  137560. "adcs r4, r4, %[r]\n\t"
  137561. #elif defined(__clang__)
  137562. "adcs r4, %[r]\n\t"
  137563. #else
  137564. "adc r4, %[r]\n\t"
  137565. #endif
  137566. #ifdef WOLFSSL_KEIL
  137567. "adcs r5, r5, %[r]\n\t"
  137568. #elif defined(__clang__)
  137569. "adcs r5, %[r]\n\t"
  137570. #else
  137571. "adc r5, %[r]\n\t"
  137572. #endif
  137573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137574. "lsrs r7, %[b], #16\n\t"
  137575. #else
  137576. "lsr r7, %[b], #16\n\t"
  137577. #endif
  137578. #ifdef WOLFSSL_KEIL
  137579. "muls r6, r7, r6\n\t"
  137580. #elif defined(__clang__)
  137581. "muls r6, r7\n\t"
  137582. #else
  137583. "mul r6, r7\n\t"
  137584. #endif
  137585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137586. "lsrs r7, r6, #16\n\t"
  137587. #else
  137588. "lsr r7, r6, #16\n\t"
  137589. #endif
  137590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137591. "lsls r6, r6, #16\n\t"
  137592. #else
  137593. "lsl r6, r6, #16\n\t"
  137594. #endif
  137595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137596. "adds r3, r3, r6\n\t"
  137597. #else
  137598. "add r3, r3, r6\n\t"
  137599. #endif
  137600. #ifdef WOLFSSL_KEIL
  137601. "adcs r4, r4, r7\n\t"
  137602. #elif defined(__clang__)
  137603. "adcs r4, r7\n\t"
  137604. #else
  137605. "adc r4, r7\n\t"
  137606. #endif
  137607. #ifdef WOLFSSL_KEIL
  137608. "adcs r5, r5, %[r]\n\t"
  137609. #elif defined(__clang__)
  137610. "adcs r5, %[r]\n\t"
  137611. #else
  137612. "adc r5, %[r]\n\t"
  137613. #endif
  137614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137615. "lsrs r6, %[a], #16\n\t"
  137616. #else
  137617. "lsr r6, %[a], #16\n\t"
  137618. #endif
  137619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137620. "lsrs r7, %[b], #16\n\t"
  137621. #else
  137622. "lsr r7, %[b], #16\n\t"
  137623. #endif
  137624. #ifdef WOLFSSL_KEIL
  137625. "muls r7, r6, r7\n\t"
  137626. #elif defined(__clang__)
  137627. "muls r7, r6\n\t"
  137628. #else
  137629. "mul r7, r6\n\t"
  137630. #endif
  137631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137632. "adds r4, r4, r7\n\t"
  137633. #else
  137634. "add r4, r4, r7\n\t"
  137635. #endif
  137636. #ifdef WOLFSSL_KEIL
  137637. "adcs r5, r5, %[r]\n\t"
  137638. #elif defined(__clang__)
  137639. "adcs r5, %[r]\n\t"
  137640. #else
  137641. "adc r5, %[r]\n\t"
  137642. #endif
  137643. "uxth r7, %[b]\n\t"
  137644. #ifdef WOLFSSL_KEIL
  137645. "muls r6, r7, r6\n\t"
  137646. #elif defined(__clang__)
  137647. "muls r6, r7\n\t"
  137648. #else
  137649. "mul r6, r7\n\t"
  137650. #endif
  137651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137652. "lsrs r7, r6, #16\n\t"
  137653. #else
  137654. "lsr r7, r6, #16\n\t"
  137655. #endif
  137656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137657. "lsls r6, r6, #16\n\t"
  137658. #else
  137659. "lsl r6, r6, #16\n\t"
  137660. #endif
  137661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137662. "adds r3, r3, r6\n\t"
  137663. #else
  137664. "add r3, r3, r6\n\t"
  137665. #endif
  137666. #ifdef WOLFSSL_KEIL
  137667. "adcs r4, r4, r7\n\t"
  137668. #elif defined(__clang__)
  137669. "adcs r4, r7\n\t"
  137670. #else
  137671. "adc r4, r7\n\t"
  137672. #endif
  137673. #ifdef WOLFSSL_KEIL
  137674. "adcs r5, r5, %[r]\n\t"
  137675. #elif defined(__clang__)
  137676. "adcs r5, %[r]\n\t"
  137677. #else
  137678. "adc r5, %[r]\n\t"
  137679. #endif
  137680. "# A[5] * B[1]\n\t"
  137681. "mov %[a], r9\n\t"
  137682. "mov %[b], r10\n\t"
  137683. "ldr %[a], [%[a], #20]\n\t"
  137684. "ldr %[b], [%[b], #4]\n\t"
  137685. "uxth r6, %[a]\n\t"
  137686. "uxth r7, %[b]\n\t"
  137687. #ifdef WOLFSSL_KEIL
  137688. "muls r7, r6, r7\n\t"
  137689. #elif defined(__clang__)
  137690. "muls r7, r6\n\t"
  137691. #else
  137692. "mul r7, r6\n\t"
  137693. #endif
  137694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137695. "adds r3, r3, r7\n\t"
  137696. #else
  137697. "add r3, r3, r7\n\t"
  137698. #endif
  137699. #ifdef WOLFSSL_KEIL
  137700. "adcs r4, r4, %[r]\n\t"
  137701. #elif defined(__clang__)
  137702. "adcs r4, %[r]\n\t"
  137703. #else
  137704. "adc r4, %[r]\n\t"
  137705. #endif
  137706. #ifdef WOLFSSL_KEIL
  137707. "adcs r5, r5, %[r]\n\t"
  137708. #elif defined(__clang__)
  137709. "adcs r5, %[r]\n\t"
  137710. #else
  137711. "adc r5, %[r]\n\t"
  137712. #endif
  137713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137714. "lsrs r7, %[b], #16\n\t"
  137715. #else
  137716. "lsr r7, %[b], #16\n\t"
  137717. #endif
  137718. #ifdef WOLFSSL_KEIL
  137719. "muls r6, r7, r6\n\t"
  137720. #elif defined(__clang__)
  137721. "muls r6, r7\n\t"
  137722. #else
  137723. "mul r6, r7\n\t"
  137724. #endif
  137725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137726. "lsrs r7, r6, #16\n\t"
  137727. #else
  137728. "lsr r7, r6, #16\n\t"
  137729. #endif
  137730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137731. "lsls r6, r6, #16\n\t"
  137732. #else
  137733. "lsl r6, r6, #16\n\t"
  137734. #endif
  137735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137736. "adds r3, r3, r6\n\t"
  137737. #else
  137738. "add r3, r3, r6\n\t"
  137739. #endif
  137740. #ifdef WOLFSSL_KEIL
  137741. "adcs r4, r4, r7\n\t"
  137742. #elif defined(__clang__)
  137743. "adcs r4, r7\n\t"
  137744. #else
  137745. "adc r4, r7\n\t"
  137746. #endif
  137747. #ifdef WOLFSSL_KEIL
  137748. "adcs r5, r5, %[r]\n\t"
  137749. #elif defined(__clang__)
  137750. "adcs r5, %[r]\n\t"
  137751. #else
  137752. "adc r5, %[r]\n\t"
  137753. #endif
  137754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137755. "lsrs r6, %[a], #16\n\t"
  137756. #else
  137757. "lsr r6, %[a], #16\n\t"
  137758. #endif
  137759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137760. "lsrs r7, %[b], #16\n\t"
  137761. #else
  137762. "lsr r7, %[b], #16\n\t"
  137763. #endif
  137764. #ifdef WOLFSSL_KEIL
  137765. "muls r7, r6, r7\n\t"
  137766. #elif defined(__clang__)
  137767. "muls r7, r6\n\t"
  137768. #else
  137769. "mul r7, r6\n\t"
  137770. #endif
  137771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137772. "adds r4, r4, r7\n\t"
  137773. #else
  137774. "add r4, r4, r7\n\t"
  137775. #endif
  137776. #ifdef WOLFSSL_KEIL
  137777. "adcs r5, r5, %[r]\n\t"
  137778. #elif defined(__clang__)
  137779. "adcs r5, %[r]\n\t"
  137780. #else
  137781. "adc r5, %[r]\n\t"
  137782. #endif
  137783. "uxth r7, %[b]\n\t"
  137784. #ifdef WOLFSSL_KEIL
  137785. "muls r6, r7, r6\n\t"
  137786. #elif defined(__clang__)
  137787. "muls r6, r7\n\t"
  137788. #else
  137789. "mul r6, r7\n\t"
  137790. #endif
  137791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137792. "lsrs r7, r6, #16\n\t"
  137793. #else
  137794. "lsr r7, r6, #16\n\t"
  137795. #endif
  137796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137797. "lsls r6, r6, #16\n\t"
  137798. #else
  137799. "lsl r6, r6, #16\n\t"
  137800. #endif
  137801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137802. "adds r3, r3, r6\n\t"
  137803. #else
  137804. "add r3, r3, r6\n\t"
  137805. #endif
  137806. #ifdef WOLFSSL_KEIL
  137807. "adcs r4, r4, r7\n\t"
  137808. #elif defined(__clang__)
  137809. "adcs r4, r7\n\t"
  137810. #else
  137811. "adc r4, r7\n\t"
  137812. #endif
  137813. #ifdef WOLFSSL_KEIL
  137814. "adcs r5, r5, %[r]\n\t"
  137815. #elif defined(__clang__)
  137816. "adcs r5, %[r]\n\t"
  137817. #else
  137818. "adc r5, %[r]\n\t"
  137819. #endif
  137820. "# A[4] * B[2]\n\t"
  137821. "mov %[a], r9\n\t"
  137822. "mov %[b], r10\n\t"
  137823. "ldr %[a], [%[a], #16]\n\t"
  137824. "ldr %[b], [%[b], #8]\n\t"
  137825. "uxth r6, %[a]\n\t"
  137826. "uxth r7, %[b]\n\t"
  137827. #ifdef WOLFSSL_KEIL
  137828. "muls r7, r6, r7\n\t"
  137829. #elif defined(__clang__)
  137830. "muls r7, r6\n\t"
  137831. #else
  137832. "mul r7, r6\n\t"
  137833. #endif
  137834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137835. "adds r3, r3, r7\n\t"
  137836. #else
  137837. "add r3, r3, r7\n\t"
  137838. #endif
  137839. #ifdef WOLFSSL_KEIL
  137840. "adcs r4, r4, %[r]\n\t"
  137841. #elif defined(__clang__)
  137842. "adcs r4, %[r]\n\t"
  137843. #else
  137844. "adc r4, %[r]\n\t"
  137845. #endif
  137846. #ifdef WOLFSSL_KEIL
  137847. "adcs r5, r5, %[r]\n\t"
  137848. #elif defined(__clang__)
  137849. "adcs r5, %[r]\n\t"
  137850. #else
  137851. "adc r5, %[r]\n\t"
  137852. #endif
  137853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137854. "lsrs r7, %[b], #16\n\t"
  137855. #else
  137856. "lsr r7, %[b], #16\n\t"
  137857. #endif
  137858. #ifdef WOLFSSL_KEIL
  137859. "muls r6, r7, r6\n\t"
  137860. #elif defined(__clang__)
  137861. "muls r6, r7\n\t"
  137862. #else
  137863. "mul r6, r7\n\t"
  137864. #endif
  137865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137866. "lsrs r7, r6, #16\n\t"
  137867. #else
  137868. "lsr r7, r6, #16\n\t"
  137869. #endif
  137870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137871. "lsls r6, r6, #16\n\t"
  137872. #else
  137873. "lsl r6, r6, #16\n\t"
  137874. #endif
  137875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137876. "adds r3, r3, r6\n\t"
  137877. #else
  137878. "add r3, r3, r6\n\t"
  137879. #endif
  137880. #ifdef WOLFSSL_KEIL
  137881. "adcs r4, r4, r7\n\t"
  137882. #elif defined(__clang__)
  137883. "adcs r4, r7\n\t"
  137884. #else
  137885. "adc r4, r7\n\t"
  137886. #endif
  137887. #ifdef WOLFSSL_KEIL
  137888. "adcs r5, r5, %[r]\n\t"
  137889. #elif defined(__clang__)
  137890. "adcs r5, %[r]\n\t"
  137891. #else
  137892. "adc r5, %[r]\n\t"
  137893. #endif
  137894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137895. "lsrs r6, %[a], #16\n\t"
  137896. #else
  137897. "lsr r6, %[a], #16\n\t"
  137898. #endif
  137899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137900. "lsrs r7, %[b], #16\n\t"
  137901. #else
  137902. "lsr r7, %[b], #16\n\t"
  137903. #endif
  137904. #ifdef WOLFSSL_KEIL
  137905. "muls r7, r6, r7\n\t"
  137906. #elif defined(__clang__)
  137907. "muls r7, r6\n\t"
  137908. #else
  137909. "mul r7, r6\n\t"
  137910. #endif
  137911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137912. "adds r4, r4, r7\n\t"
  137913. #else
  137914. "add r4, r4, r7\n\t"
  137915. #endif
  137916. #ifdef WOLFSSL_KEIL
  137917. "adcs r5, r5, %[r]\n\t"
  137918. #elif defined(__clang__)
  137919. "adcs r5, %[r]\n\t"
  137920. #else
  137921. "adc r5, %[r]\n\t"
  137922. #endif
  137923. "uxth r7, %[b]\n\t"
  137924. #ifdef WOLFSSL_KEIL
  137925. "muls r6, r7, r6\n\t"
  137926. #elif defined(__clang__)
  137927. "muls r6, r7\n\t"
  137928. #else
  137929. "mul r6, r7\n\t"
  137930. #endif
  137931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137932. "lsrs r7, r6, #16\n\t"
  137933. #else
  137934. "lsr r7, r6, #16\n\t"
  137935. #endif
  137936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137937. "lsls r6, r6, #16\n\t"
  137938. #else
  137939. "lsl r6, r6, #16\n\t"
  137940. #endif
  137941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137942. "adds r3, r3, r6\n\t"
  137943. #else
  137944. "add r3, r3, r6\n\t"
  137945. #endif
  137946. #ifdef WOLFSSL_KEIL
  137947. "adcs r4, r4, r7\n\t"
  137948. #elif defined(__clang__)
  137949. "adcs r4, r7\n\t"
  137950. #else
  137951. "adc r4, r7\n\t"
  137952. #endif
  137953. #ifdef WOLFSSL_KEIL
  137954. "adcs r5, r5, %[r]\n\t"
  137955. #elif defined(__clang__)
  137956. "adcs r5, %[r]\n\t"
  137957. #else
  137958. "adc r5, %[r]\n\t"
  137959. #endif
  137960. "# A[3] * B[3]\n\t"
  137961. "mov %[a], r9\n\t"
  137962. "mov %[b], r10\n\t"
  137963. "ldr %[a], [%[a], #12]\n\t"
  137964. "ldr %[b], [%[b], #12]\n\t"
  137965. "uxth r6, %[a]\n\t"
  137966. "uxth r7, %[b]\n\t"
  137967. #ifdef WOLFSSL_KEIL
  137968. "muls r7, r6, r7\n\t"
  137969. #elif defined(__clang__)
  137970. "muls r7, r6\n\t"
  137971. #else
  137972. "mul r7, r6\n\t"
  137973. #endif
  137974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137975. "adds r3, r3, r7\n\t"
  137976. #else
  137977. "add r3, r3, r7\n\t"
  137978. #endif
  137979. #ifdef WOLFSSL_KEIL
  137980. "adcs r4, r4, %[r]\n\t"
  137981. #elif defined(__clang__)
  137982. "adcs r4, %[r]\n\t"
  137983. #else
  137984. "adc r4, %[r]\n\t"
  137985. #endif
  137986. #ifdef WOLFSSL_KEIL
  137987. "adcs r5, r5, %[r]\n\t"
  137988. #elif defined(__clang__)
  137989. "adcs r5, %[r]\n\t"
  137990. #else
  137991. "adc r5, %[r]\n\t"
  137992. #endif
  137993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137994. "lsrs r7, %[b], #16\n\t"
  137995. #else
  137996. "lsr r7, %[b], #16\n\t"
  137997. #endif
  137998. #ifdef WOLFSSL_KEIL
  137999. "muls r6, r7, r6\n\t"
  138000. #elif defined(__clang__)
  138001. "muls r6, r7\n\t"
  138002. #else
  138003. "mul r6, r7\n\t"
  138004. #endif
  138005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138006. "lsrs r7, r6, #16\n\t"
  138007. #else
  138008. "lsr r7, r6, #16\n\t"
  138009. #endif
  138010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138011. "lsls r6, r6, #16\n\t"
  138012. #else
  138013. "lsl r6, r6, #16\n\t"
  138014. #endif
  138015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138016. "adds r3, r3, r6\n\t"
  138017. #else
  138018. "add r3, r3, r6\n\t"
  138019. #endif
  138020. #ifdef WOLFSSL_KEIL
  138021. "adcs r4, r4, r7\n\t"
  138022. #elif defined(__clang__)
  138023. "adcs r4, r7\n\t"
  138024. #else
  138025. "adc r4, r7\n\t"
  138026. #endif
  138027. #ifdef WOLFSSL_KEIL
  138028. "adcs r5, r5, %[r]\n\t"
  138029. #elif defined(__clang__)
  138030. "adcs r5, %[r]\n\t"
  138031. #else
  138032. "adc r5, %[r]\n\t"
  138033. #endif
  138034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138035. "lsrs r6, %[a], #16\n\t"
  138036. #else
  138037. "lsr r6, %[a], #16\n\t"
  138038. #endif
  138039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138040. "lsrs r7, %[b], #16\n\t"
  138041. #else
  138042. "lsr r7, %[b], #16\n\t"
  138043. #endif
  138044. #ifdef WOLFSSL_KEIL
  138045. "muls r7, r6, r7\n\t"
  138046. #elif defined(__clang__)
  138047. "muls r7, r6\n\t"
  138048. #else
  138049. "mul r7, r6\n\t"
  138050. #endif
  138051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138052. "adds r4, r4, r7\n\t"
  138053. #else
  138054. "add r4, r4, r7\n\t"
  138055. #endif
  138056. #ifdef WOLFSSL_KEIL
  138057. "adcs r5, r5, %[r]\n\t"
  138058. #elif defined(__clang__)
  138059. "adcs r5, %[r]\n\t"
  138060. #else
  138061. "adc r5, %[r]\n\t"
  138062. #endif
  138063. "uxth r7, %[b]\n\t"
  138064. #ifdef WOLFSSL_KEIL
  138065. "muls r6, r7, r6\n\t"
  138066. #elif defined(__clang__)
  138067. "muls r6, r7\n\t"
  138068. #else
  138069. "mul r6, r7\n\t"
  138070. #endif
  138071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138072. "lsrs r7, r6, #16\n\t"
  138073. #else
  138074. "lsr r7, r6, #16\n\t"
  138075. #endif
  138076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138077. "lsls r6, r6, #16\n\t"
  138078. #else
  138079. "lsl r6, r6, #16\n\t"
  138080. #endif
  138081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138082. "adds r3, r3, r6\n\t"
  138083. #else
  138084. "add r3, r3, r6\n\t"
  138085. #endif
  138086. #ifdef WOLFSSL_KEIL
  138087. "adcs r4, r4, r7\n\t"
  138088. #elif defined(__clang__)
  138089. "adcs r4, r7\n\t"
  138090. #else
  138091. "adc r4, r7\n\t"
  138092. #endif
  138093. #ifdef WOLFSSL_KEIL
  138094. "adcs r5, r5, %[r]\n\t"
  138095. #elif defined(__clang__)
  138096. "adcs r5, %[r]\n\t"
  138097. #else
  138098. "adc r5, %[r]\n\t"
  138099. #endif
  138100. "# A[2] * B[4]\n\t"
  138101. "mov %[a], r9\n\t"
  138102. "mov %[b], r10\n\t"
  138103. "ldr %[a], [%[a], #8]\n\t"
  138104. "ldr %[b], [%[b], #16]\n\t"
  138105. "uxth r6, %[a]\n\t"
  138106. "uxth r7, %[b]\n\t"
  138107. #ifdef WOLFSSL_KEIL
  138108. "muls r7, r6, r7\n\t"
  138109. #elif defined(__clang__)
  138110. "muls r7, r6\n\t"
  138111. #else
  138112. "mul r7, r6\n\t"
  138113. #endif
  138114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138115. "adds r3, r3, r7\n\t"
  138116. #else
  138117. "add r3, r3, r7\n\t"
  138118. #endif
  138119. #ifdef WOLFSSL_KEIL
  138120. "adcs r4, r4, %[r]\n\t"
  138121. #elif defined(__clang__)
  138122. "adcs r4, %[r]\n\t"
  138123. #else
  138124. "adc r4, %[r]\n\t"
  138125. #endif
  138126. #ifdef WOLFSSL_KEIL
  138127. "adcs r5, r5, %[r]\n\t"
  138128. #elif defined(__clang__)
  138129. "adcs r5, %[r]\n\t"
  138130. #else
  138131. "adc r5, %[r]\n\t"
  138132. #endif
  138133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138134. "lsrs r7, %[b], #16\n\t"
  138135. #else
  138136. "lsr r7, %[b], #16\n\t"
  138137. #endif
  138138. #ifdef WOLFSSL_KEIL
  138139. "muls r6, r7, r6\n\t"
  138140. #elif defined(__clang__)
  138141. "muls r6, r7\n\t"
  138142. #else
  138143. "mul r6, r7\n\t"
  138144. #endif
  138145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138146. "lsrs r7, r6, #16\n\t"
  138147. #else
  138148. "lsr r7, r6, #16\n\t"
  138149. #endif
  138150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138151. "lsls r6, r6, #16\n\t"
  138152. #else
  138153. "lsl r6, r6, #16\n\t"
  138154. #endif
  138155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138156. "adds r3, r3, r6\n\t"
  138157. #else
  138158. "add r3, r3, r6\n\t"
  138159. #endif
  138160. #ifdef WOLFSSL_KEIL
  138161. "adcs r4, r4, r7\n\t"
  138162. #elif defined(__clang__)
  138163. "adcs r4, r7\n\t"
  138164. #else
  138165. "adc r4, r7\n\t"
  138166. #endif
  138167. #ifdef WOLFSSL_KEIL
  138168. "adcs r5, r5, %[r]\n\t"
  138169. #elif defined(__clang__)
  138170. "adcs r5, %[r]\n\t"
  138171. #else
  138172. "adc r5, %[r]\n\t"
  138173. #endif
  138174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138175. "lsrs r6, %[a], #16\n\t"
  138176. #else
  138177. "lsr r6, %[a], #16\n\t"
  138178. #endif
  138179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138180. "lsrs r7, %[b], #16\n\t"
  138181. #else
  138182. "lsr r7, %[b], #16\n\t"
  138183. #endif
  138184. #ifdef WOLFSSL_KEIL
  138185. "muls r7, r6, r7\n\t"
  138186. #elif defined(__clang__)
  138187. "muls r7, r6\n\t"
  138188. #else
  138189. "mul r7, r6\n\t"
  138190. #endif
  138191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138192. "adds r4, r4, r7\n\t"
  138193. #else
  138194. "add r4, r4, r7\n\t"
  138195. #endif
  138196. #ifdef WOLFSSL_KEIL
  138197. "adcs r5, r5, %[r]\n\t"
  138198. #elif defined(__clang__)
  138199. "adcs r5, %[r]\n\t"
  138200. #else
  138201. "adc r5, %[r]\n\t"
  138202. #endif
  138203. "uxth r7, %[b]\n\t"
  138204. #ifdef WOLFSSL_KEIL
  138205. "muls r6, r7, r6\n\t"
  138206. #elif defined(__clang__)
  138207. "muls r6, r7\n\t"
  138208. #else
  138209. "mul r6, r7\n\t"
  138210. #endif
  138211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138212. "lsrs r7, r6, #16\n\t"
  138213. #else
  138214. "lsr r7, r6, #16\n\t"
  138215. #endif
  138216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138217. "lsls r6, r6, #16\n\t"
  138218. #else
  138219. "lsl r6, r6, #16\n\t"
  138220. #endif
  138221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138222. "adds r3, r3, r6\n\t"
  138223. #else
  138224. "add r3, r3, r6\n\t"
  138225. #endif
  138226. #ifdef WOLFSSL_KEIL
  138227. "adcs r4, r4, r7\n\t"
  138228. #elif defined(__clang__)
  138229. "adcs r4, r7\n\t"
  138230. #else
  138231. "adc r4, r7\n\t"
  138232. #endif
  138233. #ifdef WOLFSSL_KEIL
  138234. "adcs r5, r5, %[r]\n\t"
  138235. #elif defined(__clang__)
  138236. "adcs r5, %[r]\n\t"
  138237. #else
  138238. "adc r5, %[r]\n\t"
  138239. #endif
  138240. "# A[1] * B[5]\n\t"
  138241. "mov %[a], r9\n\t"
  138242. "mov %[b], r10\n\t"
  138243. "ldr %[a], [%[a], #4]\n\t"
  138244. "ldr %[b], [%[b], #20]\n\t"
  138245. "uxth r6, %[a]\n\t"
  138246. "uxth r7, %[b]\n\t"
  138247. #ifdef WOLFSSL_KEIL
  138248. "muls r7, r6, r7\n\t"
  138249. #elif defined(__clang__)
  138250. "muls r7, r6\n\t"
  138251. #else
  138252. "mul r7, r6\n\t"
  138253. #endif
  138254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138255. "adds r3, r3, r7\n\t"
  138256. #else
  138257. "add r3, r3, r7\n\t"
  138258. #endif
  138259. #ifdef WOLFSSL_KEIL
  138260. "adcs r4, r4, %[r]\n\t"
  138261. #elif defined(__clang__)
  138262. "adcs r4, %[r]\n\t"
  138263. #else
  138264. "adc r4, %[r]\n\t"
  138265. #endif
  138266. #ifdef WOLFSSL_KEIL
  138267. "adcs r5, r5, %[r]\n\t"
  138268. #elif defined(__clang__)
  138269. "adcs r5, %[r]\n\t"
  138270. #else
  138271. "adc r5, %[r]\n\t"
  138272. #endif
  138273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138274. "lsrs r7, %[b], #16\n\t"
  138275. #else
  138276. "lsr r7, %[b], #16\n\t"
  138277. #endif
  138278. #ifdef WOLFSSL_KEIL
  138279. "muls r6, r7, r6\n\t"
  138280. #elif defined(__clang__)
  138281. "muls r6, r7\n\t"
  138282. #else
  138283. "mul r6, r7\n\t"
  138284. #endif
  138285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138286. "lsrs r7, r6, #16\n\t"
  138287. #else
  138288. "lsr r7, r6, #16\n\t"
  138289. #endif
  138290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138291. "lsls r6, r6, #16\n\t"
  138292. #else
  138293. "lsl r6, r6, #16\n\t"
  138294. #endif
  138295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138296. "adds r3, r3, r6\n\t"
  138297. #else
  138298. "add r3, r3, r6\n\t"
  138299. #endif
  138300. #ifdef WOLFSSL_KEIL
  138301. "adcs r4, r4, r7\n\t"
  138302. #elif defined(__clang__)
  138303. "adcs r4, r7\n\t"
  138304. #else
  138305. "adc r4, r7\n\t"
  138306. #endif
  138307. #ifdef WOLFSSL_KEIL
  138308. "adcs r5, r5, %[r]\n\t"
  138309. #elif defined(__clang__)
  138310. "adcs r5, %[r]\n\t"
  138311. #else
  138312. "adc r5, %[r]\n\t"
  138313. #endif
  138314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138315. "lsrs r6, %[a], #16\n\t"
  138316. #else
  138317. "lsr r6, %[a], #16\n\t"
  138318. #endif
  138319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138320. "lsrs r7, %[b], #16\n\t"
  138321. #else
  138322. "lsr r7, %[b], #16\n\t"
  138323. #endif
  138324. #ifdef WOLFSSL_KEIL
  138325. "muls r7, r6, r7\n\t"
  138326. #elif defined(__clang__)
  138327. "muls r7, r6\n\t"
  138328. #else
  138329. "mul r7, r6\n\t"
  138330. #endif
  138331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138332. "adds r4, r4, r7\n\t"
  138333. #else
  138334. "add r4, r4, r7\n\t"
  138335. #endif
  138336. #ifdef WOLFSSL_KEIL
  138337. "adcs r5, r5, %[r]\n\t"
  138338. #elif defined(__clang__)
  138339. "adcs r5, %[r]\n\t"
  138340. #else
  138341. "adc r5, %[r]\n\t"
  138342. #endif
  138343. "uxth r7, %[b]\n\t"
  138344. #ifdef WOLFSSL_KEIL
  138345. "muls r6, r7, r6\n\t"
  138346. #elif defined(__clang__)
  138347. "muls r6, r7\n\t"
  138348. #else
  138349. "mul r6, r7\n\t"
  138350. #endif
  138351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138352. "lsrs r7, r6, #16\n\t"
  138353. #else
  138354. "lsr r7, r6, #16\n\t"
  138355. #endif
  138356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138357. "lsls r6, r6, #16\n\t"
  138358. #else
  138359. "lsl r6, r6, #16\n\t"
  138360. #endif
  138361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138362. "adds r3, r3, r6\n\t"
  138363. #else
  138364. "add r3, r3, r6\n\t"
  138365. #endif
  138366. #ifdef WOLFSSL_KEIL
  138367. "adcs r4, r4, r7\n\t"
  138368. #elif defined(__clang__)
  138369. "adcs r4, r7\n\t"
  138370. #else
  138371. "adc r4, r7\n\t"
  138372. #endif
  138373. #ifdef WOLFSSL_KEIL
  138374. "adcs r5, r5, %[r]\n\t"
  138375. #elif defined(__clang__)
  138376. "adcs r5, %[r]\n\t"
  138377. #else
  138378. "adc r5, %[r]\n\t"
  138379. #endif
  138380. "# A[0] * B[6]\n\t"
  138381. "mov %[a], r9\n\t"
  138382. "mov %[b], r10\n\t"
  138383. "ldr %[a], [%[a]]\n\t"
  138384. "ldr %[b], [%[b], #24]\n\t"
  138385. "uxth r6, %[a]\n\t"
  138386. "uxth r7, %[b]\n\t"
  138387. #ifdef WOLFSSL_KEIL
  138388. "muls r7, r6, r7\n\t"
  138389. #elif defined(__clang__)
  138390. "muls r7, r6\n\t"
  138391. #else
  138392. "mul r7, r6\n\t"
  138393. #endif
  138394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138395. "adds r3, r3, r7\n\t"
  138396. #else
  138397. "add r3, r3, r7\n\t"
  138398. #endif
  138399. #ifdef WOLFSSL_KEIL
  138400. "adcs r4, r4, %[r]\n\t"
  138401. #elif defined(__clang__)
  138402. "adcs r4, %[r]\n\t"
  138403. #else
  138404. "adc r4, %[r]\n\t"
  138405. #endif
  138406. #ifdef WOLFSSL_KEIL
  138407. "adcs r5, r5, %[r]\n\t"
  138408. #elif defined(__clang__)
  138409. "adcs r5, %[r]\n\t"
  138410. #else
  138411. "adc r5, %[r]\n\t"
  138412. #endif
  138413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138414. "lsrs r7, %[b], #16\n\t"
  138415. #else
  138416. "lsr r7, %[b], #16\n\t"
  138417. #endif
  138418. #ifdef WOLFSSL_KEIL
  138419. "muls r6, r7, r6\n\t"
  138420. #elif defined(__clang__)
  138421. "muls r6, r7\n\t"
  138422. #else
  138423. "mul r6, r7\n\t"
  138424. #endif
  138425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138426. "lsrs r7, r6, #16\n\t"
  138427. #else
  138428. "lsr r7, r6, #16\n\t"
  138429. #endif
  138430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138431. "lsls r6, r6, #16\n\t"
  138432. #else
  138433. "lsl r6, r6, #16\n\t"
  138434. #endif
  138435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138436. "adds r3, r3, r6\n\t"
  138437. #else
  138438. "add r3, r3, r6\n\t"
  138439. #endif
  138440. #ifdef WOLFSSL_KEIL
  138441. "adcs r4, r4, r7\n\t"
  138442. #elif defined(__clang__)
  138443. "adcs r4, r7\n\t"
  138444. #else
  138445. "adc r4, r7\n\t"
  138446. #endif
  138447. #ifdef WOLFSSL_KEIL
  138448. "adcs r5, r5, %[r]\n\t"
  138449. #elif defined(__clang__)
  138450. "adcs r5, %[r]\n\t"
  138451. #else
  138452. "adc r5, %[r]\n\t"
  138453. #endif
  138454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138455. "lsrs r6, %[a], #16\n\t"
  138456. #else
  138457. "lsr r6, %[a], #16\n\t"
  138458. #endif
  138459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138460. "lsrs r7, %[b], #16\n\t"
  138461. #else
  138462. "lsr r7, %[b], #16\n\t"
  138463. #endif
  138464. #ifdef WOLFSSL_KEIL
  138465. "muls r7, r6, r7\n\t"
  138466. #elif defined(__clang__)
  138467. "muls r7, r6\n\t"
  138468. #else
  138469. "mul r7, r6\n\t"
  138470. #endif
  138471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138472. "adds r4, r4, r7\n\t"
  138473. #else
  138474. "add r4, r4, r7\n\t"
  138475. #endif
  138476. #ifdef WOLFSSL_KEIL
  138477. "adcs r5, r5, %[r]\n\t"
  138478. #elif defined(__clang__)
  138479. "adcs r5, %[r]\n\t"
  138480. #else
  138481. "adc r5, %[r]\n\t"
  138482. #endif
  138483. "uxth r7, %[b]\n\t"
  138484. #ifdef WOLFSSL_KEIL
  138485. "muls r6, r7, r6\n\t"
  138486. #elif defined(__clang__)
  138487. "muls r6, r7\n\t"
  138488. #else
  138489. "mul r6, r7\n\t"
  138490. #endif
  138491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138492. "lsrs r7, r6, #16\n\t"
  138493. #else
  138494. "lsr r7, r6, #16\n\t"
  138495. #endif
  138496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138497. "lsls r6, r6, #16\n\t"
  138498. #else
  138499. "lsl r6, r6, #16\n\t"
  138500. #endif
  138501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138502. "adds r3, r3, r6\n\t"
  138503. #else
  138504. "add r3, r3, r6\n\t"
  138505. #endif
  138506. #ifdef WOLFSSL_KEIL
  138507. "adcs r4, r4, r7\n\t"
  138508. #elif defined(__clang__)
  138509. "adcs r4, r7\n\t"
  138510. #else
  138511. "adc r4, r7\n\t"
  138512. #endif
  138513. #ifdef WOLFSSL_KEIL
  138514. "adcs r5, r5, %[r]\n\t"
  138515. #elif defined(__clang__)
  138516. "adcs r5, %[r]\n\t"
  138517. #else
  138518. "adc r5, %[r]\n\t"
  138519. #endif
  138520. "str r3, [sp, #24]\n\t"
  138521. "# A[0] * B[7]\n\t"
  138522. "movs r3, #0\n\t"
  138523. "mov %[a], r9\n\t"
  138524. "mov %[b], r10\n\t"
  138525. "ldr %[a], [%[a]]\n\t"
  138526. "ldr %[b], [%[b], #28]\n\t"
  138527. "uxth r6, %[a]\n\t"
  138528. "uxth r7, %[b]\n\t"
  138529. #ifdef WOLFSSL_KEIL
  138530. "muls r7, r6, r7\n\t"
  138531. #elif defined(__clang__)
  138532. "muls r7, r6\n\t"
  138533. #else
  138534. "mul r7, r6\n\t"
  138535. #endif
  138536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138537. "adds r4, r4, r7\n\t"
  138538. #else
  138539. "add r4, r4, r7\n\t"
  138540. #endif
  138541. #ifdef WOLFSSL_KEIL
  138542. "adcs r5, r5, %[r]\n\t"
  138543. #elif defined(__clang__)
  138544. "adcs r5, %[r]\n\t"
  138545. #else
  138546. "adc r5, %[r]\n\t"
  138547. #endif
  138548. #ifdef WOLFSSL_KEIL
  138549. "adcs r3, r3, %[r]\n\t"
  138550. #elif defined(__clang__)
  138551. "adcs r3, %[r]\n\t"
  138552. #else
  138553. "adc r3, %[r]\n\t"
  138554. #endif
  138555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138556. "lsrs r7, %[b], #16\n\t"
  138557. #else
  138558. "lsr r7, %[b], #16\n\t"
  138559. #endif
  138560. #ifdef WOLFSSL_KEIL
  138561. "muls r6, r7, r6\n\t"
  138562. #elif defined(__clang__)
  138563. "muls r6, r7\n\t"
  138564. #else
  138565. "mul r6, r7\n\t"
  138566. #endif
  138567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138568. "lsrs r7, r6, #16\n\t"
  138569. #else
  138570. "lsr r7, r6, #16\n\t"
  138571. #endif
  138572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138573. "lsls r6, r6, #16\n\t"
  138574. #else
  138575. "lsl r6, r6, #16\n\t"
  138576. #endif
  138577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138578. "adds r4, r4, r6\n\t"
  138579. #else
  138580. "add r4, r4, r6\n\t"
  138581. #endif
  138582. #ifdef WOLFSSL_KEIL
  138583. "adcs r5, r5, r7\n\t"
  138584. #elif defined(__clang__)
  138585. "adcs r5, r7\n\t"
  138586. #else
  138587. "adc r5, r7\n\t"
  138588. #endif
  138589. #ifdef WOLFSSL_KEIL
  138590. "adcs r3, r3, %[r]\n\t"
  138591. #elif defined(__clang__)
  138592. "adcs r3, %[r]\n\t"
  138593. #else
  138594. "adc r3, %[r]\n\t"
  138595. #endif
  138596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138597. "lsrs r6, %[a], #16\n\t"
  138598. #else
  138599. "lsr r6, %[a], #16\n\t"
  138600. #endif
  138601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138602. "lsrs r7, %[b], #16\n\t"
  138603. #else
  138604. "lsr r7, %[b], #16\n\t"
  138605. #endif
  138606. #ifdef WOLFSSL_KEIL
  138607. "muls r7, r6, r7\n\t"
  138608. #elif defined(__clang__)
  138609. "muls r7, r6\n\t"
  138610. #else
  138611. "mul r7, r6\n\t"
  138612. #endif
  138613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138614. "adds r5, r5, r7\n\t"
  138615. #else
  138616. "add r5, r5, r7\n\t"
  138617. #endif
  138618. #ifdef WOLFSSL_KEIL
  138619. "adcs r3, r3, %[r]\n\t"
  138620. #elif defined(__clang__)
  138621. "adcs r3, %[r]\n\t"
  138622. #else
  138623. "adc r3, %[r]\n\t"
  138624. #endif
  138625. "uxth r7, %[b]\n\t"
  138626. #ifdef WOLFSSL_KEIL
  138627. "muls r6, r7, r6\n\t"
  138628. #elif defined(__clang__)
  138629. "muls r6, r7\n\t"
  138630. #else
  138631. "mul r6, r7\n\t"
  138632. #endif
  138633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138634. "lsrs r7, r6, #16\n\t"
  138635. #else
  138636. "lsr r7, r6, #16\n\t"
  138637. #endif
  138638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138639. "lsls r6, r6, #16\n\t"
  138640. #else
  138641. "lsl r6, r6, #16\n\t"
  138642. #endif
  138643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138644. "adds r4, r4, r6\n\t"
  138645. #else
  138646. "add r4, r4, r6\n\t"
  138647. #endif
  138648. #ifdef WOLFSSL_KEIL
  138649. "adcs r5, r5, r7\n\t"
  138650. #elif defined(__clang__)
  138651. "adcs r5, r7\n\t"
  138652. #else
  138653. "adc r5, r7\n\t"
  138654. #endif
  138655. #ifdef WOLFSSL_KEIL
  138656. "adcs r3, r3, %[r]\n\t"
  138657. #elif defined(__clang__)
  138658. "adcs r3, %[r]\n\t"
  138659. #else
  138660. "adc r3, %[r]\n\t"
  138661. #endif
  138662. "# A[1] * B[6]\n\t"
  138663. "mov %[a], r9\n\t"
  138664. "mov %[b], r10\n\t"
  138665. "ldr %[a], [%[a], #4]\n\t"
  138666. "ldr %[b], [%[b], #24]\n\t"
  138667. "uxth r6, %[a]\n\t"
  138668. "uxth r7, %[b]\n\t"
  138669. #ifdef WOLFSSL_KEIL
  138670. "muls r7, r6, r7\n\t"
  138671. #elif defined(__clang__)
  138672. "muls r7, r6\n\t"
  138673. #else
  138674. "mul r7, r6\n\t"
  138675. #endif
  138676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138677. "adds r4, r4, r7\n\t"
  138678. #else
  138679. "add r4, r4, r7\n\t"
  138680. #endif
  138681. #ifdef WOLFSSL_KEIL
  138682. "adcs r5, r5, %[r]\n\t"
  138683. #elif defined(__clang__)
  138684. "adcs r5, %[r]\n\t"
  138685. #else
  138686. "adc r5, %[r]\n\t"
  138687. #endif
  138688. #ifdef WOLFSSL_KEIL
  138689. "adcs r3, r3, %[r]\n\t"
  138690. #elif defined(__clang__)
  138691. "adcs r3, %[r]\n\t"
  138692. #else
  138693. "adc r3, %[r]\n\t"
  138694. #endif
  138695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138696. "lsrs r7, %[b], #16\n\t"
  138697. #else
  138698. "lsr r7, %[b], #16\n\t"
  138699. #endif
  138700. #ifdef WOLFSSL_KEIL
  138701. "muls r6, r7, r6\n\t"
  138702. #elif defined(__clang__)
  138703. "muls r6, r7\n\t"
  138704. #else
  138705. "mul r6, r7\n\t"
  138706. #endif
  138707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138708. "lsrs r7, r6, #16\n\t"
  138709. #else
  138710. "lsr r7, r6, #16\n\t"
  138711. #endif
  138712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138713. "lsls r6, r6, #16\n\t"
  138714. #else
  138715. "lsl r6, r6, #16\n\t"
  138716. #endif
  138717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138718. "adds r4, r4, r6\n\t"
  138719. #else
  138720. "add r4, r4, r6\n\t"
  138721. #endif
  138722. #ifdef WOLFSSL_KEIL
  138723. "adcs r5, r5, r7\n\t"
  138724. #elif defined(__clang__)
  138725. "adcs r5, r7\n\t"
  138726. #else
  138727. "adc r5, r7\n\t"
  138728. #endif
  138729. #ifdef WOLFSSL_KEIL
  138730. "adcs r3, r3, %[r]\n\t"
  138731. #elif defined(__clang__)
  138732. "adcs r3, %[r]\n\t"
  138733. #else
  138734. "adc r3, %[r]\n\t"
  138735. #endif
  138736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138737. "lsrs r6, %[a], #16\n\t"
  138738. #else
  138739. "lsr r6, %[a], #16\n\t"
  138740. #endif
  138741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138742. "lsrs r7, %[b], #16\n\t"
  138743. #else
  138744. "lsr r7, %[b], #16\n\t"
  138745. #endif
  138746. #ifdef WOLFSSL_KEIL
  138747. "muls r7, r6, r7\n\t"
  138748. #elif defined(__clang__)
  138749. "muls r7, r6\n\t"
  138750. #else
  138751. "mul r7, r6\n\t"
  138752. #endif
  138753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138754. "adds r5, r5, r7\n\t"
  138755. #else
  138756. "add r5, r5, r7\n\t"
  138757. #endif
  138758. #ifdef WOLFSSL_KEIL
  138759. "adcs r3, r3, %[r]\n\t"
  138760. #elif defined(__clang__)
  138761. "adcs r3, %[r]\n\t"
  138762. #else
  138763. "adc r3, %[r]\n\t"
  138764. #endif
  138765. "uxth r7, %[b]\n\t"
  138766. #ifdef WOLFSSL_KEIL
  138767. "muls r6, r7, r6\n\t"
  138768. #elif defined(__clang__)
  138769. "muls r6, r7\n\t"
  138770. #else
  138771. "mul r6, r7\n\t"
  138772. #endif
  138773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138774. "lsrs r7, r6, #16\n\t"
  138775. #else
  138776. "lsr r7, r6, #16\n\t"
  138777. #endif
  138778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138779. "lsls r6, r6, #16\n\t"
  138780. #else
  138781. "lsl r6, r6, #16\n\t"
  138782. #endif
  138783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138784. "adds r4, r4, r6\n\t"
  138785. #else
  138786. "add r4, r4, r6\n\t"
  138787. #endif
  138788. #ifdef WOLFSSL_KEIL
  138789. "adcs r5, r5, r7\n\t"
  138790. #elif defined(__clang__)
  138791. "adcs r5, r7\n\t"
  138792. #else
  138793. "adc r5, r7\n\t"
  138794. #endif
  138795. #ifdef WOLFSSL_KEIL
  138796. "adcs r3, r3, %[r]\n\t"
  138797. #elif defined(__clang__)
  138798. "adcs r3, %[r]\n\t"
  138799. #else
  138800. "adc r3, %[r]\n\t"
  138801. #endif
  138802. "# A[2] * B[5]\n\t"
  138803. "mov %[a], r9\n\t"
  138804. "mov %[b], r10\n\t"
  138805. "ldr %[a], [%[a], #8]\n\t"
  138806. "ldr %[b], [%[b], #20]\n\t"
  138807. "uxth r6, %[a]\n\t"
  138808. "uxth r7, %[b]\n\t"
  138809. #ifdef WOLFSSL_KEIL
  138810. "muls r7, r6, r7\n\t"
  138811. #elif defined(__clang__)
  138812. "muls r7, r6\n\t"
  138813. #else
  138814. "mul r7, r6\n\t"
  138815. #endif
  138816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138817. "adds r4, r4, r7\n\t"
  138818. #else
  138819. "add r4, r4, r7\n\t"
  138820. #endif
  138821. #ifdef WOLFSSL_KEIL
  138822. "adcs r5, r5, %[r]\n\t"
  138823. #elif defined(__clang__)
  138824. "adcs r5, %[r]\n\t"
  138825. #else
  138826. "adc r5, %[r]\n\t"
  138827. #endif
  138828. #ifdef WOLFSSL_KEIL
  138829. "adcs r3, r3, %[r]\n\t"
  138830. #elif defined(__clang__)
  138831. "adcs r3, %[r]\n\t"
  138832. #else
  138833. "adc r3, %[r]\n\t"
  138834. #endif
  138835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138836. "lsrs r7, %[b], #16\n\t"
  138837. #else
  138838. "lsr r7, %[b], #16\n\t"
  138839. #endif
  138840. #ifdef WOLFSSL_KEIL
  138841. "muls r6, r7, r6\n\t"
  138842. #elif defined(__clang__)
  138843. "muls r6, r7\n\t"
  138844. #else
  138845. "mul r6, r7\n\t"
  138846. #endif
  138847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138848. "lsrs r7, r6, #16\n\t"
  138849. #else
  138850. "lsr r7, r6, #16\n\t"
  138851. #endif
  138852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138853. "lsls r6, r6, #16\n\t"
  138854. #else
  138855. "lsl r6, r6, #16\n\t"
  138856. #endif
  138857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138858. "adds r4, r4, r6\n\t"
  138859. #else
  138860. "add r4, r4, r6\n\t"
  138861. #endif
  138862. #ifdef WOLFSSL_KEIL
  138863. "adcs r5, r5, r7\n\t"
  138864. #elif defined(__clang__)
  138865. "adcs r5, r7\n\t"
  138866. #else
  138867. "adc r5, r7\n\t"
  138868. #endif
  138869. #ifdef WOLFSSL_KEIL
  138870. "adcs r3, r3, %[r]\n\t"
  138871. #elif defined(__clang__)
  138872. "adcs r3, %[r]\n\t"
  138873. #else
  138874. "adc r3, %[r]\n\t"
  138875. #endif
  138876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138877. "lsrs r6, %[a], #16\n\t"
  138878. #else
  138879. "lsr r6, %[a], #16\n\t"
  138880. #endif
  138881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138882. "lsrs r7, %[b], #16\n\t"
  138883. #else
  138884. "lsr r7, %[b], #16\n\t"
  138885. #endif
  138886. #ifdef WOLFSSL_KEIL
  138887. "muls r7, r6, r7\n\t"
  138888. #elif defined(__clang__)
  138889. "muls r7, r6\n\t"
  138890. #else
  138891. "mul r7, r6\n\t"
  138892. #endif
  138893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138894. "adds r5, r5, r7\n\t"
  138895. #else
  138896. "add r5, r5, r7\n\t"
  138897. #endif
  138898. #ifdef WOLFSSL_KEIL
  138899. "adcs r3, r3, %[r]\n\t"
  138900. #elif defined(__clang__)
  138901. "adcs r3, %[r]\n\t"
  138902. #else
  138903. "adc r3, %[r]\n\t"
  138904. #endif
  138905. "uxth r7, %[b]\n\t"
  138906. #ifdef WOLFSSL_KEIL
  138907. "muls r6, r7, r6\n\t"
  138908. #elif defined(__clang__)
  138909. "muls r6, r7\n\t"
  138910. #else
  138911. "mul r6, r7\n\t"
  138912. #endif
  138913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138914. "lsrs r7, r6, #16\n\t"
  138915. #else
  138916. "lsr r7, r6, #16\n\t"
  138917. #endif
  138918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138919. "lsls r6, r6, #16\n\t"
  138920. #else
  138921. "lsl r6, r6, #16\n\t"
  138922. #endif
  138923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138924. "adds r4, r4, r6\n\t"
  138925. #else
  138926. "add r4, r4, r6\n\t"
  138927. #endif
  138928. #ifdef WOLFSSL_KEIL
  138929. "adcs r5, r5, r7\n\t"
  138930. #elif defined(__clang__)
  138931. "adcs r5, r7\n\t"
  138932. #else
  138933. "adc r5, r7\n\t"
  138934. #endif
  138935. #ifdef WOLFSSL_KEIL
  138936. "adcs r3, r3, %[r]\n\t"
  138937. #elif defined(__clang__)
  138938. "adcs r3, %[r]\n\t"
  138939. #else
  138940. "adc r3, %[r]\n\t"
  138941. #endif
  138942. "# A[3] * B[4]\n\t"
  138943. "mov %[a], r9\n\t"
  138944. "mov %[b], r10\n\t"
  138945. "ldr %[a], [%[a], #12]\n\t"
  138946. "ldr %[b], [%[b], #16]\n\t"
  138947. "uxth r6, %[a]\n\t"
  138948. "uxth r7, %[b]\n\t"
  138949. #ifdef WOLFSSL_KEIL
  138950. "muls r7, r6, r7\n\t"
  138951. #elif defined(__clang__)
  138952. "muls r7, r6\n\t"
  138953. #else
  138954. "mul r7, r6\n\t"
  138955. #endif
  138956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138957. "adds r4, r4, r7\n\t"
  138958. #else
  138959. "add r4, r4, r7\n\t"
  138960. #endif
  138961. #ifdef WOLFSSL_KEIL
  138962. "adcs r5, r5, %[r]\n\t"
  138963. #elif defined(__clang__)
  138964. "adcs r5, %[r]\n\t"
  138965. #else
  138966. "adc r5, %[r]\n\t"
  138967. #endif
  138968. #ifdef WOLFSSL_KEIL
  138969. "adcs r3, r3, %[r]\n\t"
  138970. #elif defined(__clang__)
  138971. "adcs r3, %[r]\n\t"
  138972. #else
  138973. "adc r3, %[r]\n\t"
  138974. #endif
  138975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138976. "lsrs r7, %[b], #16\n\t"
  138977. #else
  138978. "lsr r7, %[b], #16\n\t"
  138979. #endif
  138980. #ifdef WOLFSSL_KEIL
  138981. "muls r6, r7, r6\n\t"
  138982. #elif defined(__clang__)
  138983. "muls r6, r7\n\t"
  138984. #else
  138985. "mul r6, r7\n\t"
  138986. #endif
  138987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138988. "lsrs r7, r6, #16\n\t"
  138989. #else
  138990. "lsr r7, r6, #16\n\t"
  138991. #endif
  138992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138993. "lsls r6, r6, #16\n\t"
  138994. #else
  138995. "lsl r6, r6, #16\n\t"
  138996. #endif
  138997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138998. "adds r4, r4, r6\n\t"
  138999. #else
  139000. "add r4, r4, r6\n\t"
  139001. #endif
  139002. #ifdef WOLFSSL_KEIL
  139003. "adcs r5, r5, r7\n\t"
  139004. #elif defined(__clang__)
  139005. "adcs r5, r7\n\t"
  139006. #else
  139007. "adc r5, r7\n\t"
  139008. #endif
  139009. #ifdef WOLFSSL_KEIL
  139010. "adcs r3, r3, %[r]\n\t"
  139011. #elif defined(__clang__)
  139012. "adcs r3, %[r]\n\t"
  139013. #else
  139014. "adc r3, %[r]\n\t"
  139015. #endif
  139016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139017. "lsrs r6, %[a], #16\n\t"
  139018. #else
  139019. "lsr r6, %[a], #16\n\t"
  139020. #endif
  139021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139022. "lsrs r7, %[b], #16\n\t"
  139023. #else
  139024. "lsr r7, %[b], #16\n\t"
  139025. #endif
  139026. #ifdef WOLFSSL_KEIL
  139027. "muls r7, r6, r7\n\t"
  139028. #elif defined(__clang__)
  139029. "muls r7, r6\n\t"
  139030. #else
  139031. "mul r7, r6\n\t"
  139032. #endif
  139033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139034. "adds r5, r5, r7\n\t"
  139035. #else
  139036. "add r5, r5, r7\n\t"
  139037. #endif
  139038. #ifdef WOLFSSL_KEIL
  139039. "adcs r3, r3, %[r]\n\t"
  139040. #elif defined(__clang__)
  139041. "adcs r3, %[r]\n\t"
  139042. #else
  139043. "adc r3, %[r]\n\t"
  139044. #endif
  139045. "uxth r7, %[b]\n\t"
  139046. #ifdef WOLFSSL_KEIL
  139047. "muls r6, r7, r6\n\t"
  139048. #elif defined(__clang__)
  139049. "muls r6, r7\n\t"
  139050. #else
  139051. "mul r6, r7\n\t"
  139052. #endif
  139053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139054. "lsrs r7, r6, #16\n\t"
  139055. #else
  139056. "lsr r7, r6, #16\n\t"
  139057. #endif
  139058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139059. "lsls r6, r6, #16\n\t"
  139060. #else
  139061. "lsl r6, r6, #16\n\t"
  139062. #endif
  139063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139064. "adds r4, r4, r6\n\t"
  139065. #else
  139066. "add r4, r4, r6\n\t"
  139067. #endif
  139068. #ifdef WOLFSSL_KEIL
  139069. "adcs r5, r5, r7\n\t"
  139070. #elif defined(__clang__)
  139071. "adcs r5, r7\n\t"
  139072. #else
  139073. "adc r5, r7\n\t"
  139074. #endif
  139075. #ifdef WOLFSSL_KEIL
  139076. "adcs r3, r3, %[r]\n\t"
  139077. #elif defined(__clang__)
  139078. "adcs r3, %[r]\n\t"
  139079. #else
  139080. "adc r3, %[r]\n\t"
  139081. #endif
  139082. "# A[4] * B[3]\n\t"
  139083. "mov %[a], r9\n\t"
  139084. "mov %[b], r10\n\t"
  139085. "ldr %[a], [%[a], #16]\n\t"
  139086. "ldr %[b], [%[b], #12]\n\t"
  139087. "uxth r6, %[a]\n\t"
  139088. "uxth r7, %[b]\n\t"
  139089. #ifdef WOLFSSL_KEIL
  139090. "muls r7, r6, r7\n\t"
  139091. #elif defined(__clang__)
  139092. "muls r7, r6\n\t"
  139093. #else
  139094. "mul r7, r6\n\t"
  139095. #endif
  139096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139097. "adds r4, r4, r7\n\t"
  139098. #else
  139099. "add r4, r4, r7\n\t"
  139100. #endif
  139101. #ifdef WOLFSSL_KEIL
  139102. "adcs r5, r5, %[r]\n\t"
  139103. #elif defined(__clang__)
  139104. "adcs r5, %[r]\n\t"
  139105. #else
  139106. "adc r5, %[r]\n\t"
  139107. #endif
  139108. #ifdef WOLFSSL_KEIL
  139109. "adcs r3, r3, %[r]\n\t"
  139110. #elif defined(__clang__)
  139111. "adcs r3, %[r]\n\t"
  139112. #else
  139113. "adc r3, %[r]\n\t"
  139114. #endif
  139115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139116. "lsrs r7, %[b], #16\n\t"
  139117. #else
  139118. "lsr r7, %[b], #16\n\t"
  139119. #endif
  139120. #ifdef WOLFSSL_KEIL
  139121. "muls r6, r7, r6\n\t"
  139122. #elif defined(__clang__)
  139123. "muls r6, r7\n\t"
  139124. #else
  139125. "mul r6, r7\n\t"
  139126. #endif
  139127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139128. "lsrs r7, r6, #16\n\t"
  139129. #else
  139130. "lsr r7, r6, #16\n\t"
  139131. #endif
  139132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139133. "lsls r6, r6, #16\n\t"
  139134. #else
  139135. "lsl r6, r6, #16\n\t"
  139136. #endif
  139137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139138. "adds r4, r4, r6\n\t"
  139139. #else
  139140. "add r4, r4, r6\n\t"
  139141. #endif
  139142. #ifdef WOLFSSL_KEIL
  139143. "adcs r5, r5, r7\n\t"
  139144. #elif defined(__clang__)
  139145. "adcs r5, r7\n\t"
  139146. #else
  139147. "adc r5, r7\n\t"
  139148. #endif
  139149. #ifdef WOLFSSL_KEIL
  139150. "adcs r3, r3, %[r]\n\t"
  139151. #elif defined(__clang__)
  139152. "adcs r3, %[r]\n\t"
  139153. #else
  139154. "adc r3, %[r]\n\t"
  139155. #endif
  139156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139157. "lsrs r6, %[a], #16\n\t"
  139158. #else
  139159. "lsr r6, %[a], #16\n\t"
  139160. #endif
  139161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139162. "lsrs r7, %[b], #16\n\t"
  139163. #else
  139164. "lsr r7, %[b], #16\n\t"
  139165. #endif
  139166. #ifdef WOLFSSL_KEIL
  139167. "muls r7, r6, r7\n\t"
  139168. #elif defined(__clang__)
  139169. "muls r7, r6\n\t"
  139170. #else
  139171. "mul r7, r6\n\t"
  139172. #endif
  139173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139174. "adds r5, r5, r7\n\t"
  139175. #else
  139176. "add r5, r5, r7\n\t"
  139177. #endif
  139178. #ifdef WOLFSSL_KEIL
  139179. "adcs r3, r3, %[r]\n\t"
  139180. #elif defined(__clang__)
  139181. "adcs r3, %[r]\n\t"
  139182. #else
  139183. "adc r3, %[r]\n\t"
  139184. #endif
  139185. "uxth r7, %[b]\n\t"
  139186. #ifdef WOLFSSL_KEIL
  139187. "muls r6, r7, r6\n\t"
  139188. #elif defined(__clang__)
  139189. "muls r6, r7\n\t"
  139190. #else
  139191. "mul r6, r7\n\t"
  139192. #endif
  139193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139194. "lsrs r7, r6, #16\n\t"
  139195. #else
  139196. "lsr r7, r6, #16\n\t"
  139197. #endif
  139198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139199. "lsls r6, r6, #16\n\t"
  139200. #else
  139201. "lsl r6, r6, #16\n\t"
  139202. #endif
  139203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139204. "adds r4, r4, r6\n\t"
  139205. #else
  139206. "add r4, r4, r6\n\t"
  139207. #endif
  139208. #ifdef WOLFSSL_KEIL
  139209. "adcs r5, r5, r7\n\t"
  139210. #elif defined(__clang__)
  139211. "adcs r5, r7\n\t"
  139212. #else
  139213. "adc r5, r7\n\t"
  139214. #endif
  139215. #ifdef WOLFSSL_KEIL
  139216. "adcs r3, r3, %[r]\n\t"
  139217. #elif defined(__clang__)
  139218. "adcs r3, %[r]\n\t"
  139219. #else
  139220. "adc r3, %[r]\n\t"
  139221. #endif
  139222. "# A[5] * B[2]\n\t"
  139223. "mov %[a], r9\n\t"
  139224. "mov %[b], r10\n\t"
  139225. "ldr %[a], [%[a], #20]\n\t"
  139226. "ldr %[b], [%[b], #8]\n\t"
  139227. "uxth r6, %[a]\n\t"
  139228. "uxth r7, %[b]\n\t"
  139229. #ifdef WOLFSSL_KEIL
  139230. "muls r7, r6, r7\n\t"
  139231. #elif defined(__clang__)
  139232. "muls r7, r6\n\t"
  139233. #else
  139234. "mul r7, r6\n\t"
  139235. #endif
  139236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139237. "adds r4, r4, r7\n\t"
  139238. #else
  139239. "add r4, r4, r7\n\t"
  139240. #endif
  139241. #ifdef WOLFSSL_KEIL
  139242. "adcs r5, r5, %[r]\n\t"
  139243. #elif defined(__clang__)
  139244. "adcs r5, %[r]\n\t"
  139245. #else
  139246. "adc r5, %[r]\n\t"
  139247. #endif
  139248. #ifdef WOLFSSL_KEIL
  139249. "adcs r3, r3, %[r]\n\t"
  139250. #elif defined(__clang__)
  139251. "adcs r3, %[r]\n\t"
  139252. #else
  139253. "adc r3, %[r]\n\t"
  139254. #endif
  139255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139256. "lsrs r7, %[b], #16\n\t"
  139257. #else
  139258. "lsr r7, %[b], #16\n\t"
  139259. #endif
  139260. #ifdef WOLFSSL_KEIL
  139261. "muls r6, r7, r6\n\t"
  139262. #elif defined(__clang__)
  139263. "muls r6, r7\n\t"
  139264. #else
  139265. "mul r6, r7\n\t"
  139266. #endif
  139267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139268. "lsrs r7, r6, #16\n\t"
  139269. #else
  139270. "lsr r7, r6, #16\n\t"
  139271. #endif
  139272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139273. "lsls r6, r6, #16\n\t"
  139274. #else
  139275. "lsl r6, r6, #16\n\t"
  139276. #endif
  139277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139278. "adds r4, r4, r6\n\t"
  139279. #else
  139280. "add r4, r4, r6\n\t"
  139281. #endif
  139282. #ifdef WOLFSSL_KEIL
  139283. "adcs r5, r5, r7\n\t"
  139284. #elif defined(__clang__)
  139285. "adcs r5, r7\n\t"
  139286. #else
  139287. "adc r5, r7\n\t"
  139288. #endif
  139289. #ifdef WOLFSSL_KEIL
  139290. "adcs r3, r3, %[r]\n\t"
  139291. #elif defined(__clang__)
  139292. "adcs r3, %[r]\n\t"
  139293. #else
  139294. "adc r3, %[r]\n\t"
  139295. #endif
  139296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139297. "lsrs r6, %[a], #16\n\t"
  139298. #else
  139299. "lsr r6, %[a], #16\n\t"
  139300. #endif
  139301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139302. "lsrs r7, %[b], #16\n\t"
  139303. #else
  139304. "lsr r7, %[b], #16\n\t"
  139305. #endif
  139306. #ifdef WOLFSSL_KEIL
  139307. "muls r7, r6, r7\n\t"
  139308. #elif defined(__clang__)
  139309. "muls r7, r6\n\t"
  139310. #else
  139311. "mul r7, r6\n\t"
  139312. #endif
  139313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139314. "adds r5, r5, r7\n\t"
  139315. #else
  139316. "add r5, r5, r7\n\t"
  139317. #endif
  139318. #ifdef WOLFSSL_KEIL
  139319. "adcs r3, r3, %[r]\n\t"
  139320. #elif defined(__clang__)
  139321. "adcs r3, %[r]\n\t"
  139322. #else
  139323. "adc r3, %[r]\n\t"
  139324. #endif
  139325. "uxth r7, %[b]\n\t"
  139326. #ifdef WOLFSSL_KEIL
  139327. "muls r6, r7, r6\n\t"
  139328. #elif defined(__clang__)
  139329. "muls r6, r7\n\t"
  139330. #else
  139331. "mul r6, r7\n\t"
  139332. #endif
  139333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139334. "lsrs r7, r6, #16\n\t"
  139335. #else
  139336. "lsr r7, r6, #16\n\t"
  139337. #endif
  139338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139339. "lsls r6, r6, #16\n\t"
  139340. #else
  139341. "lsl r6, r6, #16\n\t"
  139342. #endif
  139343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139344. "adds r4, r4, r6\n\t"
  139345. #else
  139346. "add r4, r4, r6\n\t"
  139347. #endif
  139348. #ifdef WOLFSSL_KEIL
  139349. "adcs r5, r5, r7\n\t"
  139350. #elif defined(__clang__)
  139351. "adcs r5, r7\n\t"
  139352. #else
  139353. "adc r5, r7\n\t"
  139354. #endif
  139355. #ifdef WOLFSSL_KEIL
  139356. "adcs r3, r3, %[r]\n\t"
  139357. #elif defined(__clang__)
  139358. "adcs r3, %[r]\n\t"
  139359. #else
  139360. "adc r3, %[r]\n\t"
  139361. #endif
  139362. "# A[6] * B[1]\n\t"
  139363. "mov %[a], r9\n\t"
  139364. "mov %[b], r10\n\t"
  139365. "ldr %[a], [%[a], #24]\n\t"
  139366. "ldr %[b], [%[b], #4]\n\t"
  139367. "uxth r6, %[a]\n\t"
  139368. "uxth r7, %[b]\n\t"
  139369. #ifdef WOLFSSL_KEIL
  139370. "muls r7, r6, r7\n\t"
  139371. #elif defined(__clang__)
  139372. "muls r7, r6\n\t"
  139373. #else
  139374. "mul r7, r6\n\t"
  139375. #endif
  139376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139377. "adds r4, r4, r7\n\t"
  139378. #else
  139379. "add r4, r4, r7\n\t"
  139380. #endif
  139381. #ifdef WOLFSSL_KEIL
  139382. "adcs r5, r5, %[r]\n\t"
  139383. #elif defined(__clang__)
  139384. "adcs r5, %[r]\n\t"
  139385. #else
  139386. "adc r5, %[r]\n\t"
  139387. #endif
  139388. #ifdef WOLFSSL_KEIL
  139389. "adcs r3, r3, %[r]\n\t"
  139390. #elif defined(__clang__)
  139391. "adcs r3, %[r]\n\t"
  139392. #else
  139393. "adc r3, %[r]\n\t"
  139394. #endif
  139395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139396. "lsrs r7, %[b], #16\n\t"
  139397. #else
  139398. "lsr r7, %[b], #16\n\t"
  139399. #endif
  139400. #ifdef WOLFSSL_KEIL
  139401. "muls r6, r7, r6\n\t"
  139402. #elif defined(__clang__)
  139403. "muls r6, r7\n\t"
  139404. #else
  139405. "mul r6, r7\n\t"
  139406. #endif
  139407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139408. "lsrs r7, r6, #16\n\t"
  139409. #else
  139410. "lsr r7, r6, #16\n\t"
  139411. #endif
  139412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139413. "lsls r6, r6, #16\n\t"
  139414. #else
  139415. "lsl r6, r6, #16\n\t"
  139416. #endif
  139417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139418. "adds r4, r4, r6\n\t"
  139419. #else
  139420. "add r4, r4, r6\n\t"
  139421. #endif
  139422. #ifdef WOLFSSL_KEIL
  139423. "adcs r5, r5, r7\n\t"
  139424. #elif defined(__clang__)
  139425. "adcs r5, r7\n\t"
  139426. #else
  139427. "adc r5, r7\n\t"
  139428. #endif
  139429. #ifdef WOLFSSL_KEIL
  139430. "adcs r3, r3, %[r]\n\t"
  139431. #elif defined(__clang__)
  139432. "adcs r3, %[r]\n\t"
  139433. #else
  139434. "adc r3, %[r]\n\t"
  139435. #endif
  139436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139437. "lsrs r6, %[a], #16\n\t"
  139438. #else
  139439. "lsr r6, %[a], #16\n\t"
  139440. #endif
  139441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139442. "lsrs r7, %[b], #16\n\t"
  139443. #else
  139444. "lsr r7, %[b], #16\n\t"
  139445. #endif
  139446. #ifdef WOLFSSL_KEIL
  139447. "muls r7, r6, r7\n\t"
  139448. #elif defined(__clang__)
  139449. "muls r7, r6\n\t"
  139450. #else
  139451. "mul r7, r6\n\t"
  139452. #endif
  139453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139454. "adds r5, r5, r7\n\t"
  139455. #else
  139456. "add r5, r5, r7\n\t"
  139457. #endif
  139458. #ifdef WOLFSSL_KEIL
  139459. "adcs r3, r3, %[r]\n\t"
  139460. #elif defined(__clang__)
  139461. "adcs r3, %[r]\n\t"
  139462. #else
  139463. "adc r3, %[r]\n\t"
  139464. #endif
  139465. "uxth r7, %[b]\n\t"
  139466. #ifdef WOLFSSL_KEIL
  139467. "muls r6, r7, r6\n\t"
  139468. #elif defined(__clang__)
  139469. "muls r6, r7\n\t"
  139470. #else
  139471. "mul r6, r7\n\t"
  139472. #endif
  139473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139474. "lsrs r7, r6, #16\n\t"
  139475. #else
  139476. "lsr r7, r6, #16\n\t"
  139477. #endif
  139478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139479. "lsls r6, r6, #16\n\t"
  139480. #else
  139481. "lsl r6, r6, #16\n\t"
  139482. #endif
  139483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139484. "adds r4, r4, r6\n\t"
  139485. #else
  139486. "add r4, r4, r6\n\t"
  139487. #endif
  139488. #ifdef WOLFSSL_KEIL
  139489. "adcs r5, r5, r7\n\t"
  139490. #elif defined(__clang__)
  139491. "adcs r5, r7\n\t"
  139492. #else
  139493. "adc r5, r7\n\t"
  139494. #endif
  139495. #ifdef WOLFSSL_KEIL
  139496. "adcs r3, r3, %[r]\n\t"
  139497. #elif defined(__clang__)
  139498. "adcs r3, %[r]\n\t"
  139499. #else
  139500. "adc r3, %[r]\n\t"
  139501. #endif
  139502. "# A[7] * B[0]\n\t"
  139503. "mov %[a], r9\n\t"
  139504. "mov %[b], r10\n\t"
  139505. "ldr %[a], [%[a], #28]\n\t"
  139506. "ldr %[b], [%[b]]\n\t"
  139507. "uxth r6, %[a]\n\t"
  139508. "uxth r7, %[b]\n\t"
  139509. #ifdef WOLFSSL_KEIL
  139510. "muls r7, r6, r7\n\t"
  139511. #elif defined(__clang__)
  139512. "muls r7, r6\n\t"
  139513. #else
  139514. "mul r7, r6\n\t"
  139515. #endif
  139516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139517. "adds r4, r4, r7\n\t"
  139518. #else
  139519. "add r4, r4, r7\n\t"
  139520. #endif
  139521. #ifdef WOLFSSL_KEIL
  139522. "adcs r5, r5, %[r]\n\t"
  139523. #elif defined(__clang__)
  139524. "adcs r5, %[r]\n\t"
  139525. #else
  139526. "adc r5, %[r]\n\t"
  139527. #endif
  139528. #ifdef WOLFSSL_KEIL
  139529. "adcs r3, r3, %[r]\n\t"
  139530. #elif defined(__clang__)
  139531. "adcs r3, %[r]\n\t"
  139532. #else
  139533. "adc r3, %[r]\n\t"
  139534. #endif
  139535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139536. "lsrs r7, %[b], #16\n\t"
  139537. #else
  139538. "lsr r7, %[b], #16\n\t"
  139539. #endif
  139540. #ifdef WOLFSSL_KEIL
  139541. "muls r6, r7, r6\n\t"
  139542. #elif defined(__clang__)
  139543. "muls r6, r7\n\t"
  139544. #else
  139545. "mul r6, r7\n\t"
  139546. #endif
  139547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139548. "lsrs r7, r6, #16\n\t"
  139549. #else
  139550. "lsr r7, r6, #16\n\t"
  139551. #endif
  139552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139553. "lsls r6, r6, #16\n\t"
  139554. #else
  139555. "lsl r6, r6, #16\n\t"
  139556. #endif
  139557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139558. "adds r4, r4, r6\n\t"
  139559. #else
  139560. "add r4, r4, r6\n\t"
  139561. #endif
  139562. #ifdef WOLFSSL_KEIL
  139563. "adcs r5, r5, r7\n\t"
  139564. #elif defined(__clang__)
  139565. "adcs r5, r7\n\t"
  139566. #else
  139567. "adc r5, r7\n\t"
  139568. #endif
  139569. #ifdef WOLFSSL_KEIL
  139570. "adcs r3, r3, %[r]\n\t"
  139571. #elif defined(__clang__)
  139572. "adcs r3, %[r]\n\t"
  139573. #else
  139574. "adc r3, %[r]\n\t"
  139575. #endif
  139576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139577. "lsrs r6, %[a], #16\n\t"
  139578. #else
  139579. "lsr r6, %[a], #16\n\t"
  139580. #endif
  139581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139582. "lsrs r7, %[b], #16\n\t"
  139583. #else
  139584. "lsr r7, %[b], #16\n\t"
  139585. #endif
  139586. #ifdef WOLFSSL_KEIL
  139587. "muls r7, r6, r7\n\t"
  139588. #elif defined(__clang__)
  139589. "muls r7, r6\n\t"
  139590. #else
  139591. "mul r7, r6\n\t"
  139592. #endif
  139593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139594. "adds r5, r5, r7\n\t"
  139595. #else
  139596. "add r5, r5, r7\n\t"
  139597. #endif
  139598. #ifdef WOLFSSL_KEIL
  139599. "adcs r3, r3, %[r]\n\t"
  139600. #elif defined(__clang__)
  139601. "adcs r3, %[r]\n\t"
  139602. #else
  139603. "adc r3, %[r]\n\t"
  139604. #endif
  139605. "uxth r7, %[b]\n\t"
  139606. #ifdef WOLFSSL_KEIL
  139607. "muls r6, r7, r6\n\t"
  139608. #elif defined(__clang__)
  139609. "muls r6, r7\n\t"
  139610. #else
  139611. "mul r6, r7\n\t"
  139612. #endif
  139613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139614. "lsrs r7, r6, #16\n\t"
  139615. #else
  139616. "lsr r7, r6, #16\n\t"
  139617. #endif
  139618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139619. "lsls r6, r6, #16\n\t"
  139620. #else
  139621. "lsl r6, r6, #16\n\t"
  139622. #endif
  139623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139624. "adds r4, r4, r6\n\t"
  139625. #else
  139626. "add r4, r4, r6\n\t"
  139627. #endif
  139628. #ifdef WOLFSSL_KEIL
  139629. "adcs r5, r5, r7\n\t"
  139630. #elif defined(__clang__)
  139631. "adcs r5, r7\n\t"
  139632. #else
  139633. "adc r5, r7\n\t"
  139634. #endif
  139635. #ifdef WOLFSSL_KEIL
  139636. "adcs r3, r3, %[r]\n\t"
  139637. #elif defined(__clang__)
  139638. "adcs r3, %[r]\n\t"
  139639. #else
  139640. "adc r3, %[r]\n\t"
  139641. #endif
  139642. "str r4, [sp, #28]\n\t"
  139643. "# A[8] * B[0]\n\t"
  139644. "movs r4, #0\n\t"
  139645. "mov %[a], r9\n\t"
  139646. "mov %[b], r10\n\t"
  139647. "ldr %[a], [%[a], #32]\n\t"
  139648. "ldr %[b], [%[b]]\n\t"
  139649. "uxth r6, %[a]\n\t"
  139650. "uxth r7, %[b]\n\t"
  139651. #ifdef WOLFSSL_KEIL
  139652. "muls r7, r6, r7\n\t"
  139653. #elif defined(__clang__)
  139654. "muls r7, r6\n\t"
  139655. #else
  139656. "mul r7, r6\n\t"
  139657. #endif
  139658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139659. "adds r5, r5, r7\n\t"
  139660. #else
  139661. "add r5, r5, r7\n\t"
  139662. #endif
  139663. #ifdef WOLFSSL_KEIL
  139664. "adcs r3, r3, %[r]\n\t"
  139665. #elif defined(__clang__)
  139666. "adcs r3, %[r]\n\t"
  139667. #else
  139668. "adc r3, %[r]\n\t"
  139669. #endif
  139670. #ifdef WOLFSSL_KEIL
  139671. "adcs r4, r4, %[r]\n\t"
  139672. #elif defined(__clang__)
  139673. "adcs r4, %[r]\n\t"
  139674. #else
  139675. "adc r4, %[r]\n\t"
  139676. #endif
  139677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139678. "lsrs r7, %[b], #16\n\t"
  139679. #else
  139680. "lsr r7, %[b], #16\n\t"
  139681. #endif
  139682. #ifdef WOLFSSL_KEIL
  139683. "muls r6, r7, r6\n\t"
  139684. #elif defined(__clang__)
  139685. "muls r6, r7\n\t"
  139686. #else
  139687. "mul r6, r7\n\t"
  139688. #endif
  139689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139690. "lsrs r7, r6, #16\n\t"
  139691. #else
  139692. "lsr r7, r6, #16\n\t"
  139693. #endif
  139694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139695. "lsls r6, r6, #16\n\t"
  139696. #else
  139697. "lsl r6, r6, #16\n\t"
  139698. #endif
  139699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139700. "adds r5, r5, r6\n\t"
  139701. #else
  139702. "add r5, r5, r6\n\t"
  139703. #endif
  139704. #ifdef WOLFSSL_KEIL
  139705. "adcs r3, r3, r7\n\t"
  139706. #elif defined(__clang__)
  139707. "adcs r3, r7\n\t"
  139708. #else
  139709. "adc r3, r7\n\t"
  139710. #endif
  139711. #ifdef WOLFSSL_KEIL
  139712. "adcs r4, r4, %[r]\n\t"
  139713. #elif defined(__clang__)
  139714. "adcs r4, %[r]\n\t"
  139715. #else
  139716. "adc r4, %[r]\n\t"
  139717. #endif
  139718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139719. "lsrs r6, %[a], #16\n\t"
  139720. #else
  139721. "lsr r6, %[a], #16\n\t"
  139722. #endif
  139723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139724. "lsrs r7, %[b], #16\n\t"
  139725. #else
  139726. "lsr r7, %[b], #16\n\t"
  139727. #endif
  139728. #ifdef WOLFSSL_KEIL
  139729. "muls r7, r6, r7\n\t"
  139730. #elif defined(__clang__)
  139731. "muls r7, r6\n\t"
  139732. #else
  139733. "mul r7, r6\n\t"
  139734. #endif
  139735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139736. "adds r3, r3, r7\n\t"
  139737. #else
  139738. "add r3, r3, r7\n\t"
  139739. #endif
  139740. #ifdef WOLFSSL_KEIL
  139741. "adcs r4, r4, %[r]\n\t"
  139742. #elif defined(__clang__)
  139743. "adcs r4, %[r]\n\t"
  139744. #else
  139745. "adc r4, %[r]\n\t"
  139746. #endif
  139747. "uxth r7, %[b]\n\t"
  139748. #ifdef WOLFSSL_KEIL
  139749. "muls r6, r7, r6\n\t"
  139750. #elif defined(__clang__)
  139751. "muls r6, r7\n\t"
  139752. #else
  139753. "mul r6, r7\n\t"
  139754. #endif
  139755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139756. "lsrs r7, r6, #16\n\t"
  139757. #else
  139758. "lsr r7, r6, #16\n\t"
  139759. #endif
  139760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139761. "lsls r6, r6, #16\n\t"
  139762. #else
  139763. "lsl r6, r6, #16\n\t"
  139764. #endif
  139765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139766. "adds r5, r5, r6\n\t"
  139767. #else
  139768. "add r5, r5, r6\n\t"
  139769. #endif
  139770. #ifdef WOLFSSL_KEIL
  139771. "adcs r3, r3, r7\n\t"
  139772. #elif defined(__clang__)
  139773. "adcs r3, r7\n\t"
  139774. #else
  139775. "adc r3, r7\n\t"
  139776. #endif
  139777. #ifdef WOLFSSL_KEIL
  139778. "adcs r4, r4, %[r]\n\t"
  139779. #elif defined(__clang__)
  139780. "adcs r4, %[r]\n\t"
  139781. #else
  139782. "adc r4, %[r]\n\t"
  139783. #endif
  139784. "# A[7] * B[1]\n\t"
  139785. "mov %[a], r9\n\t"
  139786. "mov %[b], r10\n\t"
  139787. "ldr %[a], [%[a], #28]\n\t"
  139788. "ldr %[b], [%[b], #4]\n\t"
  139789. "uxth r6, %[a]\n\t"
  139790. "uxth r7, %[b]\n\t"
  139791. #ifdef WOLFSSL_KEIL
  139792. "muls r7, r6, r7\n\t"
  139793. #elif defined(__clang__)
  139794. "muls r7, r6\n\t"
  139795. #else
  139796. "mul r7, r6\n\t"
  139797. #endif
  139798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139799. "adds r5, r5, r7\n\t"
  139800. #else
  139801. "add r5, r5, r7\n\t"
  139802. #endif
  139803. #ifdef WOLFSSL_KEIL
  139804. "adcs r3, r3, %[r]\n\t"
  139805. #elif defined(__clang__)
  139806. "adcs r3, %[r]\n\t"
  139807. #else
  139808. "adc r3, %[r]\n\t"
  139809. #endif
  139810. #ifdef WOLFSSL_KEIL
  139811. "adcs r4, r4, %[r]\n\t"
  139812. #elif defined(__clang__)
  139813. "adcs r4, %[r]\n\t"
  139814. #else
  139815. "adc r4, %[r]\n\t"
  139816. #endif
  139817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139818. "lsrs r7, %[b], #16\n\t"
  139819. #else
  139820. "lsr r7, %[b], #16\n\t"
  139821. #endif
  139822. #ifdef WOLFSSL_KEIL
  139823. "muls r6, r7, r6\n\t"
  139824. #elif defined(__clang__)
  139825. "muls r6, r7\n\t"
  139826. #else
  139827. "mul r6, r7\n\t"
  139828. #endif
  139829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139830. "lsrs r7, r6, #16\n\t"
  139831. #else
  139832. "lsr r7, r6, #16\n\t"
  139833. #endif
  139834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139835. "lsls r6, r6, #16\n\t"
  139836. #else
  139837. "lsl r6, r6, #16\n\t"
  139838. #endif
  139839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139840. "adds r5, r5, r6\n\t"
  139841. #else
  139842. "add r5, r5, r6\n\t"
  139843. #endif
  139844. #ifdef WOLFSSL_KEIL
  139845. "adcs r3, r3, r7\n\t"
  139846. #elif defined(__clang__)
  139847. "adcs r3, r7\n\t"
  139848. #else
  139849. "adc r3, r7\n\t"
  139850. #endif
  139851. #ifdef WOLFSSL_KEIL
  139852. "adcs r4, r4, %[r]\n\t"
  139853. #elif defined(__clang__)
  139854. "adcs r4, %[r]\n\t"
  139855. #else
  139856. "adc r4, %[r]\n\t"
  139857. #endif
  139858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139859. "lsrs r6, %[a], #16\n\t"
  139860. #else
  139861. "lsr r6, %[a], #16\n\t"
  139862. #endif
  139863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139864. "lsrs r7, %[b], #16\n\t"
  139865. #else
  139866. "lsr r7, %[b], #16\n\t"
  139867. #endif
  139868. #ifdef WOLFSSL_KEIL
  139869. "muls r7, r6, r7\n\t"
  139870. #elif defined(__clang__)
  139871. "muls r7, r6\n\t"
  139872. #else
  139873. "mul r7, r6\n\t"
  139874. #endif
  139875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139876. "adds r3, r3, r7\n\t"
  139877. #else
  139878. "add r3, r3, r7\n\t"
  139879. #endif
  139880. #ifdef WOLFSSL_KEIL
  139881. "adcs r4, r4, %[r]\n\t"
  139882. #elif defined(__clang__)
  139883. "adcs r4, %[r]\n\t"
  139884. #else
  139885. "adc r4, %[r]\n\t"
  139886. #endif
  139887. "uxth r7, %[b]\n\t"
  139888. #ifdef WOLFSSL_KEIL
  139889. "muls r6, r7, r6\n\t"
  139890. #elif defined(__clang__)
  139891. "muls r6, r7\n\t"
  139892. #else
  139893. "mul r6, r7\n\t"
  139894. #endif
  139895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139896. "lsrs r7, r6, #16\n\t"
  139897. #else
  139898. "lsr r7, r6, #16\n\t"
  139899. #endif
  139900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139901. "lsls r6, r6, #16\n\t"
  139902. #else
  139903. "lsl r6, r6, #16\n\t"
  139904. #endif
  139905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139906. "adds r5, r5, r6\n\t"
  139907. #else
  139908. "add r5, r5, r6\n\t"
  139909. #endif
  139910. #ifdef WOLFSSL_KEIL
  139911. "adcs r3, r3, r7\n\t"
  139912. #elif defined(__clang__)
  139913. "adcs r3, r7\n\t"
  139914. #else
  139915. "adc r3, r7\n\t"
  139916. #endif
  139917. #ifdef WOLFSSL_KEIL
  139918. "adcs r4, r4, %[r]\n\t"
  139919. #elif defined(__clang__)
  139920. "adcs r4, %[r]\n\t"
  139921. #else
  139922. "adc r4, %[r]\n\t"
  139923. #endif
  139924. "# A[6] * B[2]\n\t"
  139925. "mov %[a], r9\n\t"
  139926. "mov %[b], r10\n\t"
  139927. "ldr %[a], [%[a], #24]\n\t"
  139928. "ldr %[b], [%[b], #8]\n\t"
  139929. "uxth r6, %[a]\n\t"
  139930. "uxth r7, %[b]\n\t"
  139931. #ifdef WOLFSSL_KEIL
  139932. "muls r7, r6, r7\n\t"
  139933. #elif defined(__clang__)
  139934. "muls r7, r6\n\t"
  139935. #else
  139936. "mul r7, r6\n\t"
  139937. #endif
  139938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139939. "adds r5, r5, r7\n\t"
  139940. #else
  139941. "add r5, r5, r7\n\t"
  139942. #endif
  139943. #ifdef WOLFSSL_KEIL
  139944. "adcs r3, r3, %[r]\n\t"
  139945. #elif defined(__clang__)
  139946. "adcs r3, %[r]\n\t"
  139947. #else
  139948. "adc r3, %[r]\n\t"
  139949. #endif
  139950. #ifdef WOLFSSL_KEIL
  139951. "adcs r4, r4, %[r]\n\t"
  139952. #elif defined(__clang__)
  139953. "adcs r4, %[r]\n\t"
  139954. #else
  139955. "adc r4, %[r]\n\t"
  139956. #endif
  139957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139958. "lsrs r7, %[b], #16\n\t"
  139959. #else
  139960. "lsr r7, %[b], #16\n\t"
  139961. #endif
  139962. #ifdef WOLFSSL_KEIL
  139963. "muls r6, r7, r6\n\t"
  139964. #elif defined(__clang__)
  139965. "muls r6, r7\n\t"
  139966. #else
  139967. "mul r6, r7\n\t"
  139968. #endif
  139969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139970. "lsrs r7, r6, #16\n\t"
  139971. #else
  139972. "lsr r7, r6, #16\n\t"
  139973. #endif
  139974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139975. "lsls r6, r6, #16\n\t"
  139976. #else
  139977. "lsl r6, r6, #16\n\t"
  139978. #endif
  139979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139980. "adds r5, r5, r6\n\t"
  139981. #else
  139982. "add r5, r5, r6\n\t"
  139983. #endif
  139984. #ifdef WOLFSSL_KEIL
  139985. "adcs r3, r3, r7\n\t"
  139986. #elif defined(__clang__)
  139987. "adcs r3, r7\n\t"
  139988. #else
  139989. "adc r3, r7\n\t"
  139990. #endif
  139991. #ifdef WOLFSSL_KEIL
  139992. "adcs r4, r4, %[r]\n\t"
  139993. #elif defined(__clang__)
  139994. "adcs r4, %[r]\n\t"
  139995. #else
  139996. "adc r4, %[r]\n\t"
  139997. #endif
  139998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139999. "lsrs r6, %[a], #16\n\t"
  140000. #else
  140001. "lsr r6, %[a], #16\n\t"
  140002. #endif
  140003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140004. "lsrs r7, %[b], #16\n\t"
  140005. #else
  140006. "lsr r7, %[b], #16\n\t"
  140007. #endif
  140008. #ifdef WOLFSSL_KEIL
  140009. "muls r7, r6, r7\n\t"
  140010. #elif defined(__clang__)
  140011. "muls r7, r6\n\t"
  140012. #else
  140013. "mul r7, r6\n\t"
  140014. #endif
  140015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140016. "adds r3, r3, r7\n\t"
  140017. #else
  140018. "add r3, r3, r7\n\t"
  140019. #endif
  140020. #ifdef WOLFSSL_KEIL
  140021. "adcs r4, r4, %[r]\n\t"
  140022. #elif defined(__clang__)
  140023. "adcs r4, %[r]\n\t"
  140024. #else
  140025. "adc r4, %[r]\n\t"
  140026. #endif
  140027. "uxth r7, %[b]\n\t"
  140028. #ifdef WOLFSSL_KEIL
  140029. "muls r6, r7, r6\n\t"
  140030. #elif defined(__clang__)
  140031. "muls r6, r7\n\t"
  140032. #else
  140033. "mul r6, r7\n\t"
  140034. #endif
  140035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140036. "lsrs r7, r6, #16\n\t"
  140037. #else
  140038. "lsr r7, r6, #16\n\t"
  140039. #endif
  140040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140041. "lsls r6, r6, #16\n\t"
  140042. #else
  140043. "lsl r6, r6, #16\n\t"
  140044. #endif
  140045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140046. "adds r5, r5, r6\n\t"
  140047. #else
  140048. "add r5, r5, r6\n\t"
  140049. #endif
  140050. #ifdef WOLFSSL_KEIL
  140051. "adcs r3, r3, r7\n\t"
  140052. #elif defined(__clang__)
  140053. "adcs r3, r7\n\t"
  140054. #else
  140055. "adc r3, r7\n\t"
  140056. #endif
  140057. #ifdef WOLFSSL_KEIL
  140058. "adcs r4, r4, %[r]\n\t"
  140059. #elif defined(__clang__)
  140060. "adcs r4, %[r]\n\t"
  140061. #else
  140062. "adc r4, %[r]\n\t"
  140063. #endif
  140064. "# A[5] * B[3]\n\t"
  140065. "mov %[a], r9\n\t"
  140066. "mov %[b], r10\n\t"
  140067. "ldr %[a], [%[a], #20]\n\t"
  140068. "ldr %[b], [%[b], #12]\n\t"
  140069. "uxth r6, %[a]\n\t"
  140070. "uxth r7, %[b]\n\t"
  140071. #ifdef WOLFSSL_KEIL
  140072. "muls r7, r6, r7\n\t"
  140073. #elif defined(__clang__)
  140074. "muls r7, r6\n\t"
  140075. #else
  140076. "mul r7, r6\n\t"
  140077. #endif
  140078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140079. "adds r5, r5, r7\n\t"
  140080. #else
  140081. "add r5, r5, r7\n\t"
  140082. #endif
  140083. #ifdef WOLFSSL_KEIL
  140084. "adcs r3, r3, %[r]\n\t"
  140085. #elif defined(__clang__)
  140086. "adcs r3, %[r]\n\t"
  140087. #else
  140088. "adc r3, %[r]\n\t"
  140089. #endif
  140090. #ifdef WOLFSSL_KEIL
  140091. "adcs r4, r4, %[r]\n\t"
  140092. #elif defined(__clang__)
  140093. "adcs r4, %[r]\n\t"
  140094. #else
  140095. "adc r4, %[r]\n\t"
  140096. #endif
  140097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140098. "lsrs r7, %[b], #16\n\t"
  140099. #else
  140100. "lsr r7, %[b], #16\n\t"
  140101. #endif
  140102. #ifdef WOLFSSL_KEIL
  140103. "muls r6, r7, r6\n\t"
  140104. #elif defined(__clang__)
  140105. "muls r6, r7\n\t"
  140106. #else
  140107. "mul r6, r7\n\t"
  140108. #endif
  140109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140110. "lsrs r7, r6, #16\n\t"
  140111. #else
  140112. "lsr r7, r6, #16\n\t"
  140113. #endif
  140114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140115. "lsls r6, r6, #16\n\t"
  140116. #else
  140117. "lsl r6, r6, #16\n\t"
  140118. #endif
  140119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140120. "adds r5, r5, r6\n\t"
  140121. #else
  140122. "add r5, r5, r6\n\t"
  140123. #endif
  140124. #ifdef WOLFSSL_KEIL
  140125. "adcs r3, r3, r7\n\t"
  140126. #elif defined(__clang__)
  140127. "adcs r3, r7\n\t"
  140128. #else
  140129. "adc r3, r7\n\t"
  140130. #endif
  140131. #ifdef WOLFSSL_KEIL
  140132. "adcs r4, r4, %[r]\n\t"
  140133. #elif defined(__clang__)
  140134. "adcs r4, %[r]\n\t"
  140135. #else
  140136. "adc r4, %[r]\n\t"
  140137. #endif
  140138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140139. "lsrs r6, %[a], #16\n\t"
  140140. #else
  140141. "lsr r6, %[a], #16\n\t"
  140142. #endif
  140143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140144. "lsrs r7, %[b], #16\n\t"
  140145. #else
  140146. "lsr r7, %[b], #16\n\t"
  140147. #endif
  140148. #ifdef WOLFSSL_KEIL
  140149. "muls r7, r6, r7\n\t"
  140150. #elif defined(__clang__)
  140151. "muls r7, r6\n\t"
  140152. #else
  140153. "mul r7, r6\n\t"
  140154. #endif
  140155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140156. "adds r3, r3, r7\n\t"
  140157. #else
  140158. "add r3, r3, r7\n\t"
  140159. #endif
  140160. #ifdef WOLFSSL_KEIL
  140161. "adcs r4, r4, %[r]\n\t"
  140162. #elif defined(__clang__)
  140163. "adcs r4, %[r]\n\t"
  140164. #else
  140165. "adc r4, %[r]\n\t"
  140166. #endif
  140167. "uxth r7, %[b]\n\t"
  140168. #ifdef WOLFSSL_KEIL
  140169. "muls r6, r7, r6\n\t"
  140170. #elif defined(__clang__)
  140171. "muls r6, r7\n\t"
  140172. #else
  140173. "mul r6, r7\n\t"
  140174. #endif
  140175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140176. "lsrs r7, r6, #16\n\t"
  140177. #else
  140178. "lsr r7, r6, #16\n\t"
  140179. #endif
  140180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140181. "lsls r6, r6, #16\n\t"
  140182. #else
  140183. "lsl r6, r6, #16\n\t"
  140184. #endif
  140185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140186. "adds r5, r5, r6\n\t"
  140187. #else
  140188. "add r5, r5, r6\n\t"
  140189. #endif
  140190. #ifdef WOLFSSL_KEIL
  140191. "adcs r3, r3, r7\n\t"
  140192. #elif defined(__clang__)
  140193. "adcs r3, r7\n\t"
  140194. #else
  140195. "adc r3, r7\n\t"
  140196. #endif
  140197. #ifdef WOLFSSL_KEIL
  140198. "adcs r4, r4, %[r]\n\t"
  140199. #elif defined(__clang__)
  140200. "adcs r4, %[r]\n\t"
  140201. #else
  140202. "adc r4, %[r]\n\t"
  140203. #endif
  140204. "# A[4] * B[4]\n\t"
  140205. "mov %[a], r9\n\t"
  140206. "mov %[b], r10\n\t"
  140207. "ldr %[a], [%[a], #16]\n\t"
  140208. "ldr %[b], [%[b], #16]\n\t"
  140209. "uxth r6, %[a]\n\t"
  140210. "uxth r7, %[b]\n\t"
  140211. #ifdef WOLFSSL_KEIL
  140212. "muls r7, r6, r7\n\t"
  140213. #elif defined(__clang__)
  140214. "muls r7, r6\n\t"
  140215. #else
  140216. "mul r7, r6\n\t"
  140217. #endif
  140218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140219. "adds r5, r5, r7\n\t"
  140220. #else
  140221. "add r5, r5, r7\n\t"
  140222. #endif
  140223. #ifdef WOLFSSL_KEIL
  140224. "adcs r3, r3, %[r]\n\t"
  140225. #elif defined(__clang__)
  140226. "adcs r3, %[r]\n\t"
  140227. #else
  140228. "adc r3, %[r]\n\t"
  140229. #endif
  140230. #ifdef WOLFSSL_KEIL
  140231. "adcs r4, r4, %[r]\n\t"
  140232. #elif defined(__clang__)
  140233. "adcs r4, %[r]\n\t"
  140234. #else
  140235. "adc r4, %[r]\n\t"
  140236. #endif
  140237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140238. "lsrs r7, %[b], #16\n\t"
  140239. #else
  140240. "lsr r7, %[b], #16\n\t"
  140241. #endif
  140242. #ifdef WOLFSSL_KEIL
  140243. "muls r6, r7, r6\n\t"
  140244. #elif defined(__clang__)
  140245. "muls r6, r7\n\t"
  140246. #else
  140247. "mul r6, r7\n\t"
  140248. #endif
  140249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140250. "lsrs r7, r6, #16\n\t"
  140251. #else
  140252. "lsr r7, r6, #16\n\t"
  140253. #endif
  140254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140255. "lsls r6, r6, #16\n\t"
  140256. #else
  140257. "lsl r6, r6, #16\n\t"
  140258. #endif
  140259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140260. "adds r5, r5, r6\n\t"
  140261. #else
  140262. "add r5, r5, r6\n\t"
  140263. #endif
  140264. #ifdef WOLFSSL_KEIL
  140265. "adcs r3, r3, r7\n\t"
  140266. #elif defined(__clang__)
  140267. "adcs r3, r7\n\t"
  140268. #else
  140269. "adc r3, r7\n\t"
  140270. #endif
  140271. #ifdef WOLFSSL_KEIL
  140272. "adcs r4, r4, %[r]\n\t"
  140273. #elif defined(__clang__)
  140274. "adcs r4, %[r]\n\t"
  140275. #else
  140276. "adc r4, %[r]\n\t"
  140277. #endif
  140278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140279. "lsrs r6, %[a], #16\n\t"
  140280. #else
  140281. "lsr r6, %[a], #16\n\t"
  140282. #endif
  140283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140284. "lsrs r7, %[b], #16\n\t"
  140285. #else
  140286. "lsr r7, %[b], #16\n\t"
  140287. #endif
  140288. #ifdef WOLFSSL_KEIL
  140289. "muls r7, r6, r7\n\t"
  140290. #elif defined(__clang__)
  140291. "muls r7, r6\n\t"
  140292. #else
  140293. "mul r7, r6\n\t"
  140294. #endif
  140295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140296. "adds r3, r3, r7\n\t"
  140297. #else
  140298. "add r3, r3, r7\n\t"
  140299. #endif
  140300. #ifdef WOLFSSL_KEIL
  140301. "adcs r4, r4, %[r]\n\t"
  140302. #elif defined(__clang__)
  140303. "adcs r4, %[r]\n\t"
  140304. #else
  140305. "adc r4, %[r]\n\t"
  140306. #endif
  140307. "uxth r7, %[b]\n\t"
  140308. #ifdef WOLFSSL_KEIL
  140309. "muls r6, r7, r6\n\t"
  140310. #elif defined(__clang__)
  140311. "muls r6, r7\n\t"
  140312. #else
  140313. "mul r6, r7\n\t"
  140314. #endif
  140315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140316. "lsrs r7, r6, #16\n\t"
  140317. #else
  140318. "lsr r7, r6, #16\n\t"
  140319. #endif
  140320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140321. "lsls r6, r6, #16\n\t"
  140322. #else
  140323. "lsl r6, r6, #16\n\t"
  140324. #endif
  140325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140326. "adds r5, r5, r6\n\t"
  140327. #else
  140328. "add r5, r5, r6\n\t"
  140329. #endif
  140330. #ifdef WOLFSSL_KEIL
  140331. "adcs r3, r3, r7\n\t"
  140332. #elif defined(__clang__)
  140333. "adcs r3, r7\n\t"
  140334. #else
  140335. "adc r3, r7\n\t"
  140336. #endif
  140337. #ifdef WOLFSSL_KEIL
  140338. "adcs r4, r4, %[r]\n\t"
  140339. #elif defined(__clang__)
  140340. "adcs r4, %[r]\n\t"
  140341. #else
  140342. "adc r4, %[r]\n\t"
  140343. #endif
  140344. "# A[3] * B[5]\n\t"
  140345. "mov %[a], r9\n\t"
  140346. "mov %[b], r10\n\t"
  140347. "ldr %[a], [%[a], #12]\n\t"
  140348. "ldr %[b], [%[b], #20]\n\t"
  140349. "uxth r6, %[a]\n\t"
  140350. "uxth r7, %[b]\n\t"
  140351. #ifdef WOLFSSL_KEIL
  140352. "muls r7, r6, r7\n\t"
  140353. #elif defined(__clang__)
  140354. "muls r7, r6\n\t"
  140355. #else
  140356. "mul r7, r6\n\t"
  140357. #endif
  140358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140359. "adds r5, r5, r7\n\t"
  140360. #else
  140361. "add r5, r5, r7\n\t"
  140362. #endif
  140363. #ifdef WOLFSSL_KEIL
  140364. "adcs r3, r3, %[r]\n\t"
  140365. #elif defined(__clang__)
  140366. "adcs r3, %[r]\n\t"
  140367. #else
  140368. "adc r3, %[r]\n\t"
  140369. #endif
  140370. #ifdef WOLFSSL_KEIL
  140371. "adcs r4, r4, %[r]\n\t"
  140372. #elif defined(__clang__)
  140373. "adcs r4, %[r]\n\t"
  140374. #else
  140375. "adc r4, %[r]\n\t"
  140376. #endif
  140377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140378. "lsrs r7, %[b], #16\n\t"
  140379. #else
  140380. "lsr r7, %[b], #16\n\t"
  140381. #endif
  140382. #ifdef WOLFSSL_KEIL
  140383. "muls r6, r7, r6\n\t"
  140384. #elif defined(__clang__)
  140385. "muls r6, r7\n\t"
  140386. #else
  140387. "mul r6, r7\n\t"
  140388. #endif
  140389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140390. "lsrs r7, r6, #16\n\t"
  140391. #else
  140392. "lsr r7, r6, #16\n\t"
  140393. #endif
  140394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140395. "lsls r6, r6, #16\n\t"
  140396. #else
  140397. "lsl r6, r6, #16\n\t"
  140398. #endif
  140399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140400. "adds r5, r5, r6\n\t"
  140401. #else
  140402. "add r5, r5, r6\n\t"
  140403. #endif
  140404. #ifdef WOLFSSL_KEIL
  140405. "adcs r3, r3, r7\n\t"
  140406. #elif defined(__clang__)
  140407. "adcs r3, r7\n\t"
  140408. #else
  140409. "adc r3, r7\n\t"
  140410. #endif
  140411. #ifdef WOLFSSL_KEIL
  140412. "adcs r4, r4, %[r]\n\t"
  140413. #elif defined(__clang__)
  140414. "adcs r4, %[r]\n\t"
  140415. #else
  140416. "adc r4, %[r]\n\t"
  140417. #endif
  140418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140419. "lsrs r6, %[a], #16\n\t"
  140420. #else
  140421. "lsr r6, %[a], #16\n\t"
  140422. #endif
  140423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140424. "lsrs r7, %[b], #16\n\t"
  140425. #else
  140426. "lsr r7, %[b], #16\n\t"
  140427. #endif
  140428. #ifdef WOLFSSL_KEIL
  140429. "muls r7, r6, r7\n\t"
  140430. #elif defined(__clang__)
  140431. "muls r7, r6\n\t"
  140432. #else
  140433. "mul r7, r6\n\t"
  140434. #endif
  140435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140436. "adds r3, r3, r7\n\t"
  140437. #else
  140438. "add r3, r3, r7\n\t"
  140439. #endif
  140440. #ifdef WOLFSSL_KEIL
  140441. "adcs r4, r4, %[r]\n\t"
  140442. #elif defined(__clang__)
  140443. "adcs r4, %[r]\n\t"
  140444. #else
  140445. "adc r4, %[r]\n\t"
  140446. #endif
  140447. "uxth r7, %[b]\n\t"
  140448. #ifdef WOLFSSL_KEIL
  140449. "muls r6, r7, r6\n\t"
  140450. #elif defined(__clang__)
  140451. "muls r6, r7\n\t"
  140452. #else
  140453. "mul r6, r7\n\t"
  140454. #endif
  140455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140456. "lsrs r7, r6, #16\n\t"
  140457. #else
  140458. "lsr r7, r6, #16\n\t"
  140459. #endif
  140460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140461. "lsls r6, r6, #16\n\t"
  140462. #else
  140463. "lsl r6, r6, #16\n\t"
  140464. #endif
  140465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140466. "adds r5, r5, r6\n\t"
  140467. #else
  140468. "add r5, r5, r6\n\t"
  140469. #endif
  140470. #ifdef WOLFSSL_KEIL
  140471. "adcs r3, r3, r7\n\t"
  140472. #elif defined(__clang__)
  140473. "adcs r3, r7\n\t"
  140474. #else
  140475. "adc r3, r7\n\t"
  140476. #endif
  140477. #ifdef WOLFSSL_KEIL
  140478. "adcs r4, r4, %[r]\n\t"
  140479. #elif defined(__clang__)
  140480. "adcs r4, %[r]\n\t"
  140481. #else
  140482. "adc r4, %[r]\n\t"
  140483. #endif
  140484. "# A[2] * B[6]\n\t"
  140485. "mov %[a], r9\n\t"
  140486. "mov %[b], r10\n\t"
  140487. "ldr %[a], [%[a], #8]\n\t"
  140488. "ldr %[b], [%[b], #24]\n\t"
  140489. "uxth r6, %[a]\n\t"
  140490. "uxth r7, %[b]\n\t"
  140491. #ifdef WOLFSSL_KEIL
  140492. "muls r7, r6, r7\n\t"
  140493. #elif defined(__clang__)
  140494. "muls r7, r6\n\t"
  140495. #else
  140496. "mul r7, r6\n\t"
  140497. #endif
  140498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140499. "adds r5, r5, r7\n\t"
  140500. #else
  140501. "add r5, r5, r7\n\t"
  140502. #endif
  140503. #ifdef WOLFSSL_KEIL
  140504. "adcs r3, r3, %[r]\n\t"
  140505. #elif defined(__clang__)
  140506. "adcs r3, %[r]\n\t"
  140507. #else
  140508. "adc r3, %[r]\n\t"
  140509. #endif
  140510. #ifdef WOLFSSL_KEIL
  140511. "adcs r4, r4, %[r]\n\t"
  140512. #elif defined(__clang__)
  140513. "adcs r4, %[r]\n\t"
  140514. #else
  140515. "adc r4, %[r]\n\t"
  140516. #endif
  140517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140518. "lsrs r7, %[b], #16\n\t"
  140519. #else
  140520. "lsr r7, %[b], #16\n\t"
  140521. #endif
  140522. #ifdef WOLFSSL_KEIL
  140523. "muls r6, r7, r6\n\t"
  140524. #elif defined(__clang__)
  140525. "muls r6, r7\n\t"
  140526. #else
  140527. "mul r6, r7\n\t"
  140528. #endif
  140529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140530. "lsrs r7, r6, #16\n\t"
  140531. #else
  140532. "lsr r7, r6, #16\n\t"
  140533. #endif
  140534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140535. "lsls r6, r6, #16\n\t"
  140536. #else
  140537. "lsl r6, r6, #16\n\t"
  140538. #endif
  140539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140540. "adds r5, r5, r6\n\t"
  140541. #else
  140542. "add r5, r5, r6\n\t"
  140543. #endif
  140544. #ifdef WOLFSSL_KEIL
  140545. "adcs r3, r3, r7\n\t"
  140546. #elif defined(__clang__)
  140547. "adcs r3, r7\n\t"
  140548. #else
  140549. "adc r3, r7\n\t"
  140550. #endif
  140551. #ifdef WOLFSSL_KEIL
  140552. "adcs r4, r4, %[r]\n\t"
  140553. #elif defined(__clang__)
  140554. "adcs r4, %[r]\n\t"
  140555. #else
  140556. "adc r4, %[r]\n\t"
  140557. #endif
  140558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140559. "lsrs r6, %[a], #16\n\t"
  140560. #else
  140561. "lsr r6, %[a], #16\n\t"
  140562. #endif
  140563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140564. "lsrs r7, %[b], #16\n\t"
  140565. #else
  140566. "lsr r7, %[b], #16\n\t"
  140567. #endif
  140568. #ifdef WOLFSSL_KEIL
  140569. "muls r7, r6, r7\n\t"
  140570. #elif defined(__clang__)
  140571. "muls r7, r6\n\t"
  140572. #else
  140573. "mul r7, r6\n\t"
  140574. #endif
  140575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140576. "adds r3, r3, r7\n\t"
  140577. #else
  140578. "add r3, r3, r7\n\t"
  140579. #endif
  140580. #ifdef WOLFSSL_KEIL
  140581. "adcs r4, r4, %[r]\n\t"
  140582. #elif defined(__clang__)
  140583. "adcs r4, %[r]\n\t"
  140584. #else
  140585. "adc r4, %[r]\n\t"
  140586. #endif
  140587. "uxth r7, %[b]\n\t"
  140588. #ifdef WOLFSSL_KEIL
  140589. "muls r6, r7, r6\n\t"
  140590. #elif defined(__clang__)
  140591. "muls r6, r7\n\t"
  140592. #else
  140593. "mul r6, r7\n\t"
  140594. #endif
  140595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140596. "lsrs r7, r6, #16\n\t"
  140597. #else
  140598. "lsr r7, r6, #16\n\t"
  140599. #endif
  140600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140601. "lsls r6, r6, #16\n\t"
  140602. #else
  140603. "lsl r6, r6, #16\n\t"
  140604. #endif
  140605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140606. "adds r5, r5, r6\n\t"
  140607. #else
  140608. "add r5, r5, r6\n\t"
  140609. #endif
  140610. #ifdef WOLFSSL_KEIL
  140611. "adcs r3, r3, r7\n\t"
  140612. #elif defined(__clang__)
  140613. "adcs r3, r7\n\t"
  140614. #else
  140615. "adc r3, r7\n\t"
  140616. #endif
  140617. #ifdef WOLFSSL_KEIL
  140618. "adcs r4, r4, %[r]\n\t"
  140619. #elif defined(__clang__)
  140620. "adcs r4, %[r]\n\t"
  140621. #else
  140622. "adc r4, %[r]\n\t"
  140623. #endif
  140624. "# A[1] * B[7]\n\t"
  140625. "mov %[a], r9\n\t"
  140626. "mov %[b], r10\n\t"
  140627. "ldr %[a], [%[a], #4]\n\t"
  140628. "ldr %[b], [%[b], #28]\n\t"
  140629. "uxth r6, %[a]\n\t"
  140630. "uxth r7, %[b]\n\t"
  140631. #ifdef WOLFSSL_KEIL
  140632. "muls r7, r6, r7\n\t"
  140633. #elif defined(__clang__)
  140634. "muls r7, r6\n\t"
  140635. #else
  140636. "mul r7, r6\n\t"
  140637. #endif
  140638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140639. "adds r5, r5, r7\n\t"
  140640. #else
  140641. "add r5, r5, r7\n\t"
  140642. #endif
  140643. #ifdef WOLFSSL_KEIL
  140644. "adcs r3, r3, %[r]\n\t"
  140645. #elif defined(__clang__)
  140646. "adcs r3, %[r]\n\t"
  140647. #else
  140648. "adc r3, %[r]\n\t"
  140649. #endif
  140650. #ifdef WOLFSSL_KEIL
  140651. "adcs r4, r4, %[r]\n\t"
  140652. #elif defined(__clang__)
  140653. "adcs r4, %[r]\n\t"
  140654. #else
  140655. "adc r4, %[r]\n\t"
  140656. #endif
  140657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140658. "lsrs r7, %[b], #16\n\t"
  140659. #else
  140660. "lsr r7, %[b], #16\n\t"
  140661. #endif
  140662. #ifdef WOLFSSL_KEIL
  140663. "muls r6, r7, r6\n\t"
  140664. #elif defined(__clang__)
  140665. "muls r6, r7\n\t"
  140666. #else
  140667. "mul r6, r7\n\t"
  140668. #endif
  140669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140670. "lsrs r7, r6, #16\n\t"
  140671. #else
  140672. "lsr r7, r6, #16\n\t"
  140673. #endif
  140674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140675. "lsls r6, r6, #16\n\t"
  140676. #else
  140677. "lsl r6, r6, #16\n\t"
  140678. #endif
  140679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140680. "adds r5, r5, r6\n\t"
  140681. #else
  140682. "add r5, r5, r6\n\t"
  140683. #endif
  140684. #ifdef WOLFSSL_KEIL
  140685. "adcs r3, r3, r7\n\t"
  140686. #elif defined(__clang__)
  140687. "adcs r3, r7\n\t"
  140688. #else
  140689. "adc r3, r7\n\t"
  140690. #endif
  140691. #ifdef WOLFSSL_KEIL
  140692. "adcs r4, r4, %[r]\n\t"
  140693. #elif defined(__clang__)
  140694. "adcs r4, %[r]\n\t"
  140695. #else
  140696. "adc r4, %[r]\n\t"
  140697. #endif
  140698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140699. "lsrs r6, %[a], #16\n\t"
  140700. #else
  140701. "lsr r6, %[a], #16\n\t"
  140702. #endif
  140703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140704. "lsrs r7, %[b], #16\n\t"
  140705. #else
  140706. "lsr r7, %[b], #16\n\t"
  140707. #endif
  140708. #ifdef WOLFSSL_KEIL
  140709. "muls r7, r6, r7\n\t"
  140710. #elif defined(__clang__)
  140711. "muls r7, r6\n\t"
  140712. #else
  140713. "mul r7, r6\n\t"
  140714. #endif
  140715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140716. "adds r3, r3, r7\n\t"
  140717. #else
  140718. "add r3, r3, r7\n\t"
  140719. #endif
  140720. #ifdef WOLFSSL_KEIL
  140721. "adcs r4, r4, %[r]\n\t"
  140722. #elif defined(__clang__)
  140723. "adcs r4, %[r]\n\t"
  140724. #else
  140725. "adc r4, %[r]\n\t"
  140726. #endif
  140727. "uxth r7, %[b]\n\t"
  140728. #ifdef WOLFSSL_KEIL
  140729. "muls r6, r7, r6\n\t"
  140730. #elif defined(__clang__)
  140731. "muls r6, r7\n\t"
  140732. #else
  140733. "mul r6, r7\n\t"
  140734. #endif
  140735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140736. "lsrs r7, r6, #16\n\t"
  140737. #else
  140738. "lsr r7, r6, #16\n\t"
  140739. #endif
  140740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140741. "lsls r6, r6, #16\n\t"
  140742. #else
  140743. "lsl r6, r6, #16\n\t"
  140744. #endif
  140745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140746. "adds r5, r5, r6\n\t"
  140747. #else
  140748. "add r5, r5, r6\n\t"
  140749. #endif
  140750. #ifdef WOLFSSL_KEIL
  140751. "adcs r3, r3, r7\n\t"
  140752. #elif defined(__clang__)
  140753. "adcs r3, r7\n\t"
  140754. #else
  140755. "adc r3, r7\n\t"
  140756. #endif
  140757. #ifdef WOLFSSL_KEIL
  140758. "adcs r4, r4, %[r]\n\t"
  140759. #elif defined(__clang__)
  140760. "adcs r4, %[r]\n\t"
  140761. #else
  140762. "adc r4, %[r]\n\t"
  140763. #endif
  140764. "# A[0] * B[8]\n\t"
  140765. "mov %[a], r9\n\t"
  140766. "mov %[b], r10\n\t"
  140767. "ldr %[a], [%[a]]\n\t"
  140768. "ldr %[b], [%[b], #32]\n\t"
  140769. "uxth r6, %[a]\n\t"
  140770. "uxth r7, %[b]\n\t"
  140771. #ifdef WOLFSSL_KEIL
  140772. "muls r7, r6, r7\n\t"
  140773. #elif defined(__clang__)
  140774. "muls r7, r6\n\t"
  140775. #else
  140776. "mul r7, r6\n\t"
  140777. #endif
  140778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140779. "adds r5, r5, r7\n\t"
  140780. #else
  140781. "add r5, r5, r7\n\t"
  140782. #endif
  140783. #ifdef WOLFSSL_KEIL
  140784. "adcs r3, r3, %[r]\n\t"
  140785. #elif defined(__clang__)
  140786. "adcs r3, %[r]\n\t"
  140787. #else
  140788. "adc r3, %[r]\n\t"
  140789. #endif
  140790. #ifdef WOLFSSL_KEIL
  140791. "adcs r4, r4, %[r]\n\t"
  140792. #elif defined(__clang__)
  140793. "adcs r4, %[r]\n\t"
  140794. #else
  140795. "adc r4, %[r]\n\t"
  140796. #endif
  140797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140798. "lsrs r7, %[b], #16\n\t"
  140799. #else
  140800. "lsr r7, %[b], #16\n\t"
  140801. #endif
  140802. #ifdef WOLFSSL_KEIL
  140803. "muls r6, r7, r6\n\t"
  140804. #elif defined(__clang__)
  140805. "muls r6, r7\n\t"
  140806. #else
  140807. "mul r6, r7\n\t"
  140808. #endif
  140809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140810. "lsrs r7, r6, #16\n\t"
  140811. #else
  140812. "lsr r7, r6, #16\n\t"
  140813. #endif
  140814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140815. "lsls r6, r6, #16\n\t"
  140816. #else
  140817. "lsl r6, r6, #16\n\t"
  140818. #endif
  140819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140820. "adds r5, r5, r6\n\t"
  140821. #else
  140822. "add r5, r5, r6\n\t"
  140823. #endif
  140824. #ifdef WOLFSSL_KEIL
  140825. "adcs r3, r3, r7\n\t"
  140826. #elif defined(__clang__)
  140827. "adcs r3, r7\n\t"
  140828. #else
  140829. "adc r3, r7\n\t"
  140830. #endif
  140831. #ifdef WOLFSSL_KEIL
  140832. "adcs r4, r4, %[r]\n\t"
  140833. #elif defined(__clang__)
  140834. "adcs r4, %[r]\n\t"
  140835. #else
  140836. "adc r4, %[r]\n\t"
  140837. #endif
  140838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140839. "lsrs r6, %[a], #16\n\t"
  140840. #else
  140841. "lsr r6, %[a], #16\n\t"
  140842. #endif
  140843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140844. "lsrs r7, %[b], #16\n\t"
  140845. #else
  140846. "lsr r7, %[b], #16\n\t"
  140847. #endif
  140848. #ifdef WOLFSSL_KEIL
  140849. "muls r7, r6, r7\n\t"
  140850. #elif defined(__clang__)
  140851. "muls r7, r6\n\t"
  140852. #else
  140853. "mul r7, r6\n\t"
  140854. #endif
  140855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140856. "adds r3, r3, r7\n\t"
  140857. #else
  140858. "add r3, r3, r7\n\t"
  140859. #endif
  140860. #ifdef WOLFSSL_KEIL
  140861. "adcs r4, r4, %[r]\n\t"
  140862. #elif defined(__clang__)
  140863. "adcs r4, %[r]\n\t"
  140864. #else
  140865. "adc r4, %[r]\n\t"
  140866. #endif
  140867. "uxth r7, %[b]\n\t"
  140868. #ifdef WOLFSSL_KEIL
  140869. "muls r6, r7, r6\n\t"
  140870. #elif defined(__clang__)
  140871. "muls r6, r7\n\t"
  140872. #else
  140873. "mul r6, r7\n\t"
  140874. #endif
  140875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140876. "lsrs r7, r6, #16\n\t"
  140877. #else
  140878. "lsr r7, r6, #16\n\t"
  140879. #endif
  140880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140881. "lsls r6, r6, #16\n\t"
  140882. #else
  140883. "lsl r6, r6, #16\n\t"
  140884. #endif
  140885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140886. "adds r5, r5, r6\n\t"
  140887. #else
  140888. "add r5, r5, r6\n\t"
  140889. #endif
  140890. #ifdef WOLFSSL_KEIL
  140891. "adcs r3, r3, r7\n\t"
  140892. #elif defined(__clang__)
  140893. "adcs r3, r7\n\t"
  140894. #else
  140895. "adc r3, r7\n\t"
  140896. #endif
  140897. #ifdef WOLFSSL_KEIL
  140898. "adcs r4, r4, %[r]\n\t"
  140899. #elif defined(__clang__)
  140900. "adcs r4, %[r]\n\t"
  140901. #else
  140902. "adc r4, %[r]\n\t"
  140903. #endif
  140904. "str r5, [sp, #32]\n\t"
  140905. "# A[0] * B[9]\n\t"
  140906. "movs r5, #0\n\t"
  140907. "mov %[a], r9\n\t"
  140908. "mov %[b], r10\n\t"
  140909. "ldr %[a], [%[a]]\n\t"
  140910. "ldr %[b], [%[b], #36]\n\t"
  140911. "uxth r6, %[a]\n\t"
  140912. "uxth r7, %[b]\n\t"
  140913. #ifdef WOLFSSL_KEIL
  140914. "muls r7, r6, r7\n\t"
  140915. #elif defined(__clang__)
  140916. "muls r7, r6\n\t"
  140917. #else
  140918. "mul r7, r6\n\t"
  140919. #endif
  140920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140921. "adds r3, r3, r7\n\t"
  140922. #else
  140923. "add r3, r3, r7\n\t"
  140924. #endif
  140925. #ifdef WOLFSSL_KEIL
  140926. "adcs r4, r4, %[r]\n\t"
  140927. #elif defined(__clang__)
  140928. "adcs r4, %[r]\n\t"
  140929. #else
  140930. "adc r4, %[r]\n\t"
  140931. #endif
  140932. #ifdef WOLFSSL_KEIL
  140933. "adcs r5, r5, %[r]\n\t"
  140934. #elif defined(__clang__)
  140935. "adcs r5, %[r]\n\t"
  140936. #else
  140937. "adc r5, %[r]\n\t"
  140938. #endif
  140939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140940. "lsrs r7, %[b], #16\n\t"
  140941. #else
  140942. "lsr r7, %[b], #16\n\t"
  140943. #endif
  140944. #ifdef WOLFSSL_KEIL
  140945. "muls r6, r7, r6\n\t"
  140946. #elif defined(__clang__)
  140947. "muls r6, r7\n\t"
  140948. #else
  140949. "mul r6, r7\n\t"
  140950. #endif
  140951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140952. "lsrs r7, r6, #16\n\t"
  140953. #else
  140954. "lsr r7, r6, #16\n\t"
  140955. #endif
  140956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140957. "lsls r6, r6, #16\n\t"
  140958. #else
  140959. "lsl r6, r6, #16\n\t"
  140960. #endif
  140961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140962. "adds r3, r3, r6\n\t"
  140963. #else
  140964. "add r3, r3, r6\n\t"
  140965. #endif
  140966. #ifdef WOLFSSL_KEIL
  140967. "adcs r4, r4, r7\n\t"
  140968. #elif defined(__clang__)
  140969. "adcs r4, r7\n\t"
  140970. #else
  140971. "adc r4, r7\n\t"
  140972. #endif
  140973. #ifdef WOLFSSL_KEIL
  140974. "adcs r5, r5, %[r]\n\t"
  140975. #elif defined(__clang__)
  140976. "adcs r5, %[r]\n\t"
  140977. #else
  140978. "adc r5, %[r]\n\t"
  140979. #endif
  140980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140981. "lsrs r6, %[a], #16\n\t"
  140982. #else
  140983. "lsr r6, %[a], #16\n\t"
  140984. #endif
  140985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140986. "lsrs r7, %[b], #16\n\t"
  140987. #else
  140988. "lsr r7, %[b], #16\n\t"
  140989. #endif
  140990. #ifdef WOLFSSL_KEIL
  140991. "muls r7, r6, r7\n\t"
  140992. #elif defined(__clang__)
  140993. "muls r7, r6\n\t"
  140994. #else
  140995. "mul r7, r6\n\t"
  140996. #endif
  140997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140998. "adds r4, r4, r7\n\t"
  140999. #else
  141000. "add r4, r4, r7\n\t"
  141001. #endif
  141002. #ifdef WOLFSSL_KEIL
  141003. "adcs r5, r5, %[r]\n\t"
  141004. #elif defined(__clang__)
  141005. "adcs r5, %[r]\n\t"
  141006. #else
  141007. "adc r5, %[r]\n\t"
  141008. #endif
  141009. "uxth r7, %[b]\n\t"
  141010. #ifdef WOLFSSL_KEIL
  141011. "muls r6, r7, r6\n\t"
  141012. #elif defined(__clang__)
  141013. "muls r6, r7\n\t"
  141014. #else
  141015. "mul r6, r7\n\t"
  141016. #endif
  141017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141018. "lsrs r7, r6, #16\n\t"
  141019. #else
  141020. "lsr r7, r6, #16\n\t"
  141021. #endif
  141022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141023. "lsls r6, r6, #16\n\t"
  141024. #else
  141025. "lsl r6, r6, #16\n\t"
  141026. #endif
  141027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141028. "adds r3, r3, r6\n\t"
  141029. #else
  141030. "add r3, r3, r6\n\t"
  141031. #endif
  141032. #ifdef WOLFSSL_KEIL
  141033. "adcs r4, r4, r7\n\t"
  141034. #elif defined(__clang__)
  141035. "adcs r4, r7\n\t"
  141036. #else
  141037. "adc r4, r7\n\t"
  141038. #endif
  141039. #ifdef WOLFSSL_KEIL
  141040. "adcs r5, r5, %[r]\n\t"
  141041. #elif defined(__clang__)
  141042. "adcs r5, %[r]\n\t"
  141043. #else
  141044. "adc r5, %[r]\n\t"
  141045. #endif
  141046. "# A[1] * B[8]\n\t"
  141047. "mov %[a], r9\n\t"
  141048. "mov %[b], r10\n\t"
  141049. "ldr %[a], [%[a], #4]\n\t"
  141050. "ldr %[b], [%[b], #32]\n\t"
  141051. "uxth r6, %[a]\n\t"
  141052. "uxth r7, %[b]\n\t"
  141053. #ifdef WOLFSSL_KEIL
  141054. "muls r7, r6, r7\n\t"
  141055. #elif defined(__clang__)
  141056. "muls r7, r6\n\t"
  141057. #else
  141058. "mul r7, r6\n\t"
  141059. #endif
  141060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141061. "adds r3, r3, r7\n\t"
  141062. #else
  141063. "add r3, r3, r7\n\t"
  141064. #endif
  141065. #ifdef WOLFSSL_KEIL
  141066. "adcs r4, r4, %[r]\n\t"
  141067. #elif defined(__clang__)
  141068. "adcs r4, %[r]\n\t"
  141069. #else
  141070. "adc r4, %[r]\n\t"
  141071. #endif
  141072. #ifdef WOLFSSL_KEIL
  141073. "adcs r5, r5, %[r]\n\t"
  141074. #elif defined(__clang__)
  141075. "adcs r5, %[r]\n\t"
  141076. #else
  141077. "adc r5, %[r]\n\t"
  141078. #endif
  141079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141080. "lsrs r7, %[b], #16\n\t"
  141081. #else
  141082. "lsr r7, %[b], #16\n\t"
  141083. #endif
  141084. #ifdef WOLFSSL_KEIL
  141085. "muls r6, r7, r6\n\t"
  141086. #elif defined(__clang__)
  141087. "muls r6, r7\n\t"
  141088. #else
  141089. "mul r6, r7\n\t"
  141090. #endif
  141091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141092. "lsrs r7, r6, #16\n\t"
  141093. #else
  141094. "lsr r7, r6, #16\n\t"
  141095. #endif
  141096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141097. "lsls r6, r6, #16\n\t"
  141098. #else
  141099. "lsl r6, r6, #16\n\t"
  141100. #endif
  141101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141102. "adds r3, r3, r6\n\t"
  141103. #else
  141104. "add r3, r3, r6\n\t"
  141105. #endif
  141106. #ifdef WOLFSSL_KEIL
  141107. "adcs r4, r4, r7\n\t"
  141108. #elif defined(__clang__)
  141109. "adcs r4, r7\n\t"
  141110. #else
  141111. "adc r4, r7\n\t"
  141112. #endif
  141113. #ifdef WOLFSSL_KEIL
  141114. "adcs r5, r5, %[r]\n\t"
  141115. #elif defined(__clang__)
  141116. "adcs r5, %[r]\n\t"
  141117. #else
  141118. "adc r5, %[r]\n\t"
  141119. #endif
  141120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141121. "lsrs r6, %[a], #16\n\t"
  141122. #else
  141123. "lsr r6, %[a], #16\n\t"
  141124. #endif
  141125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141126. "lsrs r7, %[b], #16\n\t"
  141127. #else
  141128. "lsr r7, %[b], #16\n\t"
  141129. #endif
  141130. #ifdef WOLFSSL_KEIL
  141131. "muls r7, r6, r7\n\t"
  141132. #elif defined(__clang__)
  141133. "muls r7, r6\n\t"
  141134. #else
  141135. "mul r7, r6\n\t"
  141136. #endif
  141137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141138. "adds r4, r4, r7\n\t"
  141139. #else
  141140. "add r4, r4, r7\n\t"
  141141. #endif
  141142. #ifdef WOLFSSL_KEIL
  141143. "adcs r5, r5, %[r]\n\t"
  141144. #elif defined(__clang__)
  141145. "adcs r5, %[r]\n\t"
  141146. #else
  141147. "adc r5, %[r]\n\t"
  141148. #endif
  141149. "uxth r7, %[b]\n\t"
  141150. #ifdef WOLFSSL_KEIL
  141151. "muls r6, r7, r6\n\t"
  141152. #elif defined(__clang__)
  141153. "muls r6, r7\n\t"
  141154. #else
  141155. "mul r6, r7\n\t"
  141156. #endif
  141157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141158. "lsrs r7, r6, #16\n\t"
  141159. #else
  141160. "lsr r7, r6, #16\n\t"
  141161. #endif
  141162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141163. "lsls r6, r6, #16\n\t"
  141164. #else
  141165. "lsl r6, r6, #16\n\t"
  141166. #endif
  141167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141168. "adds r3, r3, r6\n\t"
  141169. #else
  141170. "add r3, r3, r6\n\t"
  141171. #endif
  141172. #ifdef WOLFSSL_KEIL
  141173. "adcs r4, r4, r7\n\t"
  141174. #elif defined(__clang__)
  141175. "adcs r4, r7\n\t"
  141176. #else
  141177. "adc r4, r7\n\t"
  141178. #endif
  141179. #ifdef WOLFSSL_KEIL
  141180. "adcs r5, r5, %[r]\n\t"
  141181. #elif defined(__clang__)
  141182. "adcs r5, %[r]\n\t"
  141183. #else
  141184. "adc r5, %[r]\n\t"
  141185. #endif
  141186. "# A[2] * B[7]\n\t"
  141187. "mov %[a], r9\n\t"
  141188. "mov %[b], r10\n\t"
  141189. "ldr %[a], [%[a], #8]\n\t"
  141190. "ldr %[b], [%[b], #28]\n\t"
  141191. "uxth r6, %[a]\n\t"
  141192. "uxth r7, %[b]\n\t"
  141193. #ifdef WOLFSSL_KEIL
  141194. "muls r7, r6, r7\n\t"
  141195. #elif defined(__clang__)
  141196. "muls r7, r6\n\t"
  141197. #else
  141198. "mul r7, r6\n\t"
  141199. #endif
  141200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141201. "adds r3, r3, r7\n\t"
  141202. #else
  141203. "add r3, r3, r7\n\t"
  141204. #endif
  141205. #ifdef WOLFSSL_KEIL
  141206. "adcs r4, r4, %[r]\n\t"
  141207. #elif defined(__clang__)
  141208. "adcs r4, %[r]\n\t"
  141209. #else
  141210. "adc r4, %[r]\n\t"
  141211. #endif
  141212. #ifdef WOLFSSL_KEIL
  141213. "adcs r5, r5, %[r]\n\t"
  141214. #elif defined(__clang__)
  141215. "adcs r5, %[r]\n\t"
  141216. #else
  141217. "adc r5, %[r]\n\t"
  141218. #endif
  141219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141220. "lsrs r7, %[b], #16\n\t"
  141221. #else
  141222. "lsr r7, %[b], #16\n\t"
  141223. #endif
  141224. #ifdef WOLFSSL_KEIL
  141225. "muls r6, r7, r6\n\t"
  141226. #elif defined(__clang__)
  141227. "muls r6, r7\n\t"
  141228. #else
  141229. "mul r6, r7\n\t"
  141230. #endif
  141231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141232. "lsrs r7, r6, #16\n\t"
  141233. #else
  141234. "lsr r7, r6, #16\n\t"
  141235. #endif
  141236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141237. "lsls r6, r6, #16\n\t"
  141238. #else
  141239. "lsl r6, r6, #16\n\t"
  141240. #endif
  141241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141242. "adds r3, r3, r6\n\t"
  141243. #else
  141244. "add r3, r3, r6\n\t"
  141245. #endif
  141246. #ifdef WOLFSSL_KEIL
  141247. "adcs r4, r4, r7\n\t"
  141248. #elif defined(__clang__)
  141249. "adcs r4, r7\n\t"
  141250. #else
  141251. "adc r4, r7\n\t"
  141252. #endif
  141253. #ifdef WOLFSSL_KEIL
  141254. "adcs r5, r5, %[r]\n\t"
  141255. #elif defined(__clang__)
  141256. "adcs r5, %[r]\n\t"
  141257. #else
  141258. "adc r5, %[r]\n\t"
  141259. #endif
  141260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141261. "lsrs r6, %[a], #16\n\t"
  141262. #else
  141263. "lsr r6, %[a], #16\n\t"
  141264. #endif
  141265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141266. "lsrs r7, %[b], #16\n\t"
  141267. #else
  141268. "lsr r7, %[b], #16\n\t"
  141269. #endif
  141270. #ifdef WOLFSSL_KEIL
  141271. "muls r7, r6, r7\n\t"
  141272. #elif defined(__clang__)
  141273. "muls r7, r6\n\t"
  141274. #else
  141275. "mul r7, r6\n\t"
  141276. #endif
  141277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141278. "adds r4, r4, r7\n\t"
  141279. #else
  141280. "add r4, r4, r7\n\t"
  141281. #endif
  141282. #ifdef WOLFSSL_KEIL
  141283. "adcs r5, r5, %[r]\n\t"
  141284. #elif defined(__clang__)
  141285. "adcs r5, %[r]\n\t"
  141286. #else
  141287. "adc r5, %[r]\n\t"
  141288. #endif
  141289. "uxth r7, %[b]\n\t"
  141290. #ifdef WOLFSSL_KEIL
  141291. "muls r6, r7, r6\n\t"
  141292. #elif defined(__clang__)
  141293. "muls r6, r7\n\t"
  141294. #else
  141295. "mul r6, r7\n\t"
  141296. #endif
  141297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141298. "lsrs r7, r6, #16\n\t"
  141299. #else
  141300. "lsr r7, r6, #16\n\t"
  141301. #endif
  141302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141303. "lsls r6, r6, #16\n\t"
  141304. #else
  141305. "lsl r6, r6, #16\n\t"
  141306. #endif
  141307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141308. "adds r3, r3, r6\n\t"
  141309. #else
  141310. "add r3, r3, r6\n\t"
  141311. #endif
  141312. #ifdef WOLFSSL_KEIL
  141313. "adcs r4, r4, r7\n\t"
  141314. #elif defined(__clang__)
  141315. "adcs r4, r7\n\t"
  141316. #else
  141317. "adc r4, r7\n\t"
  141318. #endif
  141319. #ifdef WOLFSSL_KEIL
  141320. "adcs r5, r5, %[r]\n\t"
  141321. #elif defined(__clang__)
  141322. "adcs r5, %[r]\n\t"
  141323. #else
  141324. "adc r5, %[r]\n\t"
  141325. #endif
  141326. "# A[3] * B[6]\n\t"
  141327. "mov %[a], r9\n\t"
  141328. "mov %[b], r10\n\t"
  141329. "ldr %[a], [%[a], #12]\n\t"
  141330. "ldr %[b], [%[b], #24]\n\t"
  141331. "uxth r6, %[a]\n\t"
  141332. "uxth r7, %[b]\n\t"
  141333. #ifdef WOLFSSL_KEIL
  141334. "muls r7, r6, r7\n\t"
  141335. #elif defined(__clang__)
  141336. "muls r7, r6\n\t"
  141337. #else
  141338. "mul r7, r6\n\t"
  141339. #endif
  141340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141341. "adds r3, r3, r7\n\t"
  141342. #else
  141343. "add r3, r3, r7\n\t"
  141344. #endif
  141345. #ifdef WOLFSSL_KEIL
  141346. "adcs r4, r4, %[r]\n\t"
  141347. #elif defined(__clang__)
  141348. "adcs r4, %[r]\n\t"
  141349. #else
  141350. "adc r4, %[r]\n\t"
  141351. #endif
  141352. #ifdef WOLFSSL_KEIL
  141353. "adcs r5, r5, %[r]\n\t"
  141354. #elif defined(__clang__)
  141355. "adcs r5, %[r]\n\t"
  141356. #else
  141357. "adc r5, %[r]\n\t"
  141358. #endif
  141359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141360. "lsrs r7, %[b], #16\n\t"
  141361. #else
  141362. "lsr r7, %[b], #16\n\t"
  141363. #endif
  141364. #ifdef WOLFSSL_KEIL
  141365. "muls r6, r7, r6\n\t"
  141366. #elif defined(__clang__)
  141367. "muls r6, r7\n\t"
  141368. #else
  141369. "mul r6, r7\n\t"
  141370. #endif
  141371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141372. "lsrs r7, r6, #16\n\t"
  141373. #else
  141374. "lsr r7, r6, #16\n\t"
  141375. #endif
  141376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141377. "lsls r6, r6, #16\n\t"
  141378. #else
  141379. "lsl r6, r6, #16\n\t"
  141380. #endif
  141381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141382. "adds r3, r3, r6\n\t"
  141383. #else
  141384. "add r3, r3, r6\n\t"
  141385. #endif
  141386. #ifdef WOLFSSL_KEIL
  141387. "adcs r4, r4, r7\n\t"
  141388. #elif defined(__clang__)
  141389. "adcs r4, r7\n\t"
  141390. #else
  141391. "adc r4, r7\n\t"
  141392. #endif
  141393. #ifdef WOLFSSL_KEIL
  141394. "adcs r5, r5, %[r]\n\t"
  141395. #elif defined(__clang__)
  141396. "adcs r5, %[r]\n\t"
  141397. #else
  141398. "adc r5, %[r]\n\t"
  141399. #endif
  141400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141401. "lsrs r6, %[a], #16\n\t"
  141402. #else
  141403. "lsr r6, %[a], #16\n\t"
  141404. #endif
  141405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141406. "lsrs r7, %[b], #16\n\t"
  141407. #else
  141408. "lsr r7, %[b], #16\n\t"
  141409. #endif
  141410. #ifdef WOLFSSL_KEIL
  141411. "muls r7, r6, r7\n\t"
  141412. #elif defined(__clang__)
  141413. "muls r7, r6\n\t"
  141414. #else
  141415. "mul r7, r6\n\t"
  141416. #endif
  141417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141418. "adds r4, r4, r7\n\t"
  141419. #else
  141420. "add r4, r4, r7\n\t"
  141421. #endif
  141422. #ifdef WOLFSSL_KEIL
  141423. "adcs r5, r5, %[r]\n\t"
  141424. #elif defined(__clang__)
  141425. "adcs r5, %[r]\n\t"
  141426. #else
  141427. "adc r5, %[r]\n\t"
  141428. #endif
  141429. "uxth r7, %[b]\n\t"
  141430. #ifdef WOLFSSL_KEIL
  141431. "muls r6, r7, r6\n\t"
  141432. #elif defined(__clang__)
  141433. "muls r6, r7\n\t"
  141434. #else
  141435. "mul r6, r7\n\t"
  141436. #endif
  141437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141438. "lsrs r7, r6, #16\n\t"
  141439. #else
  141440. "lsr r7, r6, #16\n\t"
  141441. #endif
  141442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141443. "lsls r6, r6, #16\n\t"
  141444. #else
  141445. "lsl r6, r6, #16\n\t"
  141446. #endif
  141447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141448. "adds r3, r3, r6\n\t"
  141449. #else
  141450. "add r3, r3, r6\n\t"
  141451. #endif
  141452. #ifdef WOLFSSL_KEIL
  141453. "adcs r4, r4, r7\n\t"
  141454. #elif defined(__clang__)
  141455. "adcs r4, r7\n\t"
  141456. #else
  141457. "adc r4, r7\n\t"
  141458. #endif
  141459. #ifdef WOLFSSL_KEIL
  141460. "adcs r5, r5, %[r]\n\t"
  141461. #elif defined(__clang__)
  141462. "adcs r5, %[r]\n\t"
  141463. #else
  141464. "adc r5, %[r]\n\t"
  141465. #endif
  141466. "# A[4] * B[5]\n\t"
  141467. "mov %[a], r9\n\t"
  141468. "mov %[b], r10\n\t"
  141469. "ldr %[a], [%[a], #16]\n\t"
  141470. "ldr %[b], [%[b], #20]\n\t"
  141471. "uxth r6, %[a]\n\t"
  141472. "uxth r7, %[b]\n\t"
  141473. #ifdef WOLFSSL_KEIL
  141474. "muls r7, r6, r7\n\t"
  141475. #elif defined(__clang__)
  141476. "muls r7, r6\n\t"
  141477. #else
  141478. "mul r7, r6\n\t"
  141479. #endif
  141480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141481. "adds r3, r3, r7\n\t"
  141482. #else
  141483. "add r3, r3, r7\n\t"
  141484. #endif
  141485. #ifdef WOLFSSL_KEIL
  141486. "adcs r4, r4, %[r]\n\t"
  141487. #elif defined(__clang__)
  141488. "adcs r4, %[r]\n\t"
  141489. #else
  141490. "adc r4, %[r]\n\t"
  141491. #endif
  141492. #ifdef WOLFSSL_KEIL
  141493. "adcs r5, r5, %[r]\n\t"
  141494. #elif defined(__clang__)
  141495. "adcs r5, %[r]\n\t"
  141496. #else
  141497. "adc r5, %[r]\n\t"
  141498. #endif
  141499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141500. "lsrs r7, %[b], #16\n\t"
  141501. #else
  141502. "lsr r7, %[b], #16\n\t"
  141503. #endif
  141504. #ifdef WOLFSSL_KEIL
  141505. "muls r6, r7, r6\n\t"
  141506. #elif defined(__clang__)
  141507. "muls r6, r7\n\t"
  141508. #else
  141509. "mul r6, r7\n\t"
  141510. #endif
  141511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141512. "lsrs r7, r6, #16\n\t"
  141513. #else
  141514. "lsr r7, r6, #16\n\t"
  141515. #endif
  141516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141517. "lsls r6, r6, #16\n\t"
  141518. #else
  141519. "lsl r6, r6, #16\n\t"
  141520. #endif
  141521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141522. "adds r3, r3, r6\n\t"
  141523. #else
  141524. "add r3, r3, r6\n\t"
  141525. #endif
  141526. #ifdef WOLFSSL_KEIL
  141527. "adcs r4, r4, r7\n\t"
  141528. #elif defined(__clang__)
  141529. "adcs r4, r7\n\t"
  141530. #else
  141531. "adc r4, r7\n\t"
  141532. #endif
  141533. #ifdef WOLFSSL_KEIL
  141534. "adcs r5, r5, %[r]\n\t"
  141535. #elif defined(__clang__)
  141536. "adcs r5, %[r]\n\t"
  141537. #else
  141538. "adc r5, %[r]\n\t"
  141539. #endif
  141540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141541. "lsrs r6, %[a], #16\n\t"
  141542. #else
  141543. "lsr r6, %[a], #16\n\t"
  141544. #endif
  141545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141546. "lsrs r7, %[b], #16\n\t"
  141547. #else
  141548. "lsr r7, %[b], #16\n\t"
  141549. #endif
  141550. #ifdef WOLFSSL_KEIL
  141551. "muls r7, r6, r7\n\t"
  141552. #elif defined(__clang__)
  141553. "muls r7, r6\n\t"
  141554. #else
  141555. "mul r7, r6\n\t"
  141556. #endif
  141557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141558. "adds r4, r4, r7\n\t"
  141559. #else
  141560. "add r4, r4, r7\n\t"
  141561. #endif
  141562. #ifdef WOLFSSL_KEIL
  141563. "adcs r5, r5, %[r]\n\t"
  141564. #elif defined(__clang__)
  141565. "adcs r5, %[r]\n\t"
  141566. #else
  141567. "adc r5, %[r]\n\t"
  141568. #endif
  141569. "uxth r7, %[b]\n\t"
  141570. #ifdef WOLFSSL_KEIL
  141571. "muls r6, r7, r6\n\t"
  141572. #elif defined(__clang__)
  141573. "muls r6, r7\n\t"
  141574. #else
  141575. "mul r6, r7\n\t"
  141576. #endif
  141577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141578. "lsrs r7, r6, #16\n\t"
  141579. #else
  141580. "lsr r7, r6, #16\n\t"
  141581. #endif
  141582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141583. "lsls r6, r6, #16\n\t"
  141584. #else
  141585. "lsl r6, r6, #16\n\t"
  141586. #endif
  141587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141588. "adds r3, r3, r6\n\t"
  141589. #else
  141590. "add r3, r3, r6\n\t"
  141591. #endif
  141592. #ifdef WOLFSSL_KEIL
  141593. "adcs r4, r4, r7\n\t"
  141594. #elif defined(__clang__)
  141595. "adcs r4, r7\n\t"
  141596. #else
  141597. "adc r4, r7\n\t"
  141598. #endif
  141599. #ifdef WOLFSSL_KEIL
  141600. "adcs r5, r5, %[r]\n\t"
  141601. #elif defined(__clang__)
  141602. "adcs r5, %[r]\n\t"
  141603. #else
  141604. "adc r5, %[r]\n\t"
  141605. #endif
  141606. "# A[5] * B[4]\n\t"
  141607. "mov %[a], r9\n\t"
  141608. "mov %[b], r10\n\t"
  141609. "ldr %[a], [%[a], #20]\n\t"
  141610. "ldr %[b], [%[b], #16]\n\t"
  141611. "uxth r6, %[a]\n\t"
  141612. "uxth r7, %[b]\n\t"
  141613. #ifdef WOLFSSL_KEIL
  141614. "muls r7, r6, r7\n\t"
  141615. #elif defined(__clang__)
  141616. "muls r7, r6\n\t"
  141617. #else
  141618. "mul r7, r6\n\t"
  141619. #endif
  141620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141621. "adds r3, r3, r7\n\t"
  141622. #else
  141623. "add r3, r3, r7\n\t"
  141624. #endif
  141625. #ifdef WOLFSSL_KEIL
  141626. "adcs r4, r4, %[r]\n\t"
  141627. #elif defined(__clang__)
  141628. "adcs r4, %[r]\n\t"
  141629. #else
  141630. "adc r4, %[r]\n\t"
  141631. #endif
  141632. #ifdef WOLFSSL_KEIL
  141633. "adcs r5, r5, %[r]\n\t"
  141634. #elif defined(__clang__)
  141635. "adcs r5, %[r]\n\t"
  141636. #else
  141637. "adc r5, %[r]\n\t"
  141638. #endif
  141639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141640. "lsrs r7, %[b], #16\n\t"
  141641. #else
  141642. "lsr r7, %[b], #16\n\t"
  141643. #endif
  141644. #ifdef WOLFSSL_KEIL
  141645. "muls r6, r7, r6\n\t"
  141646. #elif defined(__clang__)
  141647. "muls r6, r7\n\t"
  141648. #else
  141649. "mul r6, r7\n\t"
  141650. #endif
  141651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141652. "lsrs r7, r6, #16\n\t"
  141653. #else
  141654. "lsr r7, r6, #16\n\t"
  141655. #endif
  141656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141657. "lsls r6, r6, #16\n\t"
  141658. #else
  141659. "lsl r6, r6, #16\n\t"
  141660. #endif
  141661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141662. "adds r3, r3, r6\n\t"
  141663. #else
  141664. "add r3, r3, r6\n\t"
  141665. #endif
  141666. #ifdef WOLFSSL_KEIL
  141667. "adcs r4, r4, r7\n\t"
  141668. #elif defined(__clang__)
  141669. "adcs r4, r7\n\t"
  141670. #else
  141671. "adc r4, r7\n\t"
  141672. #endif
  141673. #ifdef WOLFSSL_KEIL
  141674. "adcs r5, r5, %[r]\n\t"
  141675. #elif defined(__clang__)
  141676. "adcs r5, %[r]\n\t"
  141677. #else
  141678. "adc r5, %[r]\n\t"
  141679. #endif
  141680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141681. "lsrs r6, %[a], #16\n\t"
  141682. #else
  141683. "lsr r6, %[a], #16\n\t"
  141684. #endif
  141685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141686. "lsrs r7, %[b], #16\n\t"
  141687. #else
  141688. "lsr r7, %[b], #16\n\t"
  141689. #endif
  141690. #ifdef WOLFSSL_KEIL
  141691. "muls r7, r6, r7\n\t"
  141692. #elif defined(__clang__)
  141693. "muls r7, r6\n\t"
  141694. #else
  141695. "mul r7, r6\n\t"
  141696. #endif
  141697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141698. "adds r4, r4, r7\n\t"
  141699. #else
  141700. "add r4, r4, r7\n\t"
  141701. #endif
  141702. #ifdef WOLFSSL_KEIL
  141703. "adcs r5, r5, %[r]\n\t"
  141704. #elif defined(__clang__)
  141705. "adcs r5, %[r]\n\t"
  141706. #else
  141707. "adc r5, %[r]\n\t"
  141708. #endif
  141709. "uxth r7, %[b]\n\t"
  141710. #ifdef WOLFSSL_KEIL
  141711. "muls r6, r7, r6\n\t"
  141712. #elif defined(__clang__)
  141713. "muls r6, r7\n\t"
  141714. #else
  141715. "mul r6, r7\n\t"
  141716. #endif
  141717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141718. "lsrs r7, r6, #16\n\t"
  141719. #else
  141720. "lsr r7, r6, #16\n\t"
  141721. #endif
  141722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141723. "lsls r6, r6, #16\n\t"
  141724. #else
  141725. "lsl r6, r6, #16\n\t"
  141726. #endif
  141727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141728. "adds r3, r3, r6\n\t"
  141729. #else
  141730. "add r3, r3, r6\n\t"
  141731. #endif
  141732. #ifdef WOLFSSL_KEIL
  141733. "adcs r4, r4, r7\n\t"
  141734. #elif defined(__clang__)
  141735. "adcs r4, r7\n\t"
  141736. #else
  141737. "adc r4, r7\n\t"
  141738. #endif
  141739. #ifdef WOLFSSL_KEIL
  141740. "adcs r5, r5, %[r]\n\t"
  141741. #elif defined(__clang__)
  141742. "adcs r5, %[r]\n\t"
  141743. #else
  141744. "adc r5, %[r]\n\t"
  141745. #endif
  141746. "# A[6] * B[3]\n\t"
  141747. "mov %[a], r9\n\t"
  141748. "mov %[b], r10\n\t"
  141749. "ldr %[a], [%[a], #24]\n\t"
  141750. "ldr %[b], [%[b], #12]\n\t"
  141751. "uxth r6, %[a]\n\t"
  141752. "uxth r7, %[b]\n\t"
  141753. #ifdef WOLFSSL_KEIL
  141754. "muls r7, r6, r7\n\t"
  141755. #elif defined(__clang__)
  141756. "muls r7, r6\n\t"
  141757. #else
  141758. "mul r7, r6\n\t"
  141759. #endif
  141760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141761. "adds r3, r3, r7\n\t"
  141762. #else
  141763. "add r3, r3, r7\n\t"
  141764. #endif
  141765. #ifdef WOLFSSL_KEIL
  141766. "adcs r4, r4, %[r]\n\t"
  141767. #elif defined(__clang__)
  141768. "adcs r4, %[r]\n\t"
  141769. #else
  141770. "adc r4, %[r]\n\t"
  141771. #endif
  141772. #ifdef WOLFSSL_KEIL
  141773. "adcs r5, r5, %[r]\n\t"
  141774. #elif defined(__clang__)
  141775. "adcs r5, %[r]\n\t"
  141776. #else
  141777. "adc r5, %[r]\n\t"
  141778. #endif
  141779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141780. "lsrs r7, %[b], #16\n\t"
  141781. #else
  141782. "lsr r7, %[b], #16\n\t"
  141783. #endif
  141784. #ifdef WOLFSSL_KEIL
  141785. "muls r6, r7, r6\n\t"
  141786. #elif defined(__clang__)
  141787. "muls r6, r7\n\t"
  141788. #else
  141789. "mul r6, r7\n\t"
  141790. #endif
  141791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141792. "lsrs r7, r6, #16\n\t"
  141793. #else
  141794. "lsr r7, r6, #16\n\t"
  141795. #endif
  141796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141797. "lsls r6, r6, #16\n\t"
  141798. #else
  141799. "lsl r6, r6, #16\n\t"
  141800. #endif
  141801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141802. "adds r3, r3, r6\n\t"
  141803. #else
  141804. "add r3, r3, r6\n\t"
  141805. #endif
  141806. #ifdef WOLFSSL_KEIL
  141807. "adcs r4, r4, r7\n\t"
  141808. #elif defined(__clang__)
  141809. "adcs r4, r7\n\t"
  141810. #else
  141811. "adc r4, r7\n\t"
  141812. #endif
  141813. #ifdef WOLFSSL_KEIL
  141814. "adcs r5, r5, %[r]\n\t"
  141815. #elif defined(__clang__)
  141816. "adcs r5, %[r]\n\t"
  141817. #else
  141818. "adc r5, %[r]\n\t"
  141819. #endif
  141820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141821. "lsrs r6, %[a], #16\n\t"
  141822. #else
  141823. "lsr r6, %[a], #16\n\t"
  141824. #endif
  141825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141826. "lsrs r7, %[b], #16\n\t"
  141827. #else
  141828. "lsr r7, %[b], #16\n\t"
  141829. #endif
  141830. #ifdef WOLFSSL_KEIL
  141831. "muls r7, r6, r7\n\t"
  141832. #elif defined(__clang__)
  141833. "muls r7, r6\n\t"
  141834. #else
  141835. "mul r7, r6\n\t"
  141836. #endif
  141837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141838. "adds r4, r4, r7\n\t"
  141839. #else
  141840. "add r4, r4, r7\n\t"
  141841. #endif
  141842. #ifdef WOLFSSL_KEIL
  141843. "adcs r5, r5, %[r]\n\t"
  141844. #elif defined(__clang__)
  141845. "adcs r5, %[r]\n\t"
  141846. #else
  141847. "adc r5, %[r]\n\t"
  141848. #endif
  141849. "uxth r7, %[b]\n\t"
  141850. #ifdef WOLFSSL_KEIL
  141851. "muls r6, r7, r6\n\t"
  141852. #elif defined(__clang__)
  141853. "muls r6, r7\n\t"
  141854. #else
  141855. "mul r6, r7\n\t"
  141856. #endif
  141857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141858. "lsrs r7, r6, #16\n\t"
  141859. #else
  141860. "lsr r7, r6, #16\n\t"
  141861. #endif
  141862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141863. "lsls r6, r6, #16\n\t"
  141864. #else
  141865. "lsl r6, r6, #16\n\t"
  141866. #endif
  141867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141868. "adds r3, r3, r6\n\t"
  141869. #else
  141870. "add r3, r3, r6\n\t"
  141871. #endif
  141872. #ifdef WOLFSSL_KEIL
  141873. "adcs r4, r4, r7\n\t"
  141874. #elif defined(__clang__)
  141875. "adcs r4, r7\n\t"
  141876. #else
  141877. "adc r4, r7\n\t"
  141878. #endif
  141879. #ifdef WOLFSSL_KEIL
  141880. "adcs r5, r5, %[r]\n\t"
  141881. #elif defined(__clang__)
  141882. "adcs r5, %[r]\n\t"
  141883. #else
  141884. "adc r5, %[r]\n\t"
  141885. #endif
  141886. "# A[7] * B[2]\n\t"
  141887. "mov %[a], r9\n\t"
  141888. "mov %[b], r10\n\t"
  141889. "ldr %[a], [%[a], #28]\n\t"
  141890. "ldr %[b], [%[b], #8]\n\t"
  141891. "uxth r6, %[a]\n\t"
  141892. "uxth r7, %[b]\n\t"
  141893. #ifdef WOLFSSL_KEIL
  141894. "muls r7, r6, r7\n\t"
  141895. #elif defined(__clang__)
  141896. "muls r7, r6\n\t"
  141897. #else
  141898. "mul r7, r6\n\t"
  141899. #endif
  141900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141901. "adds r3, r3, r7\n\t"
  141902. #else
  141903. "add r3, r3, r7\n\t"
  141904. #endif
  141905. #ifdef WOLFSSL_KEIL
  141906. "adcs r4, r4, %[r]\n\t"
  141907. #elif defined(__clang__)
  141908. "adcs r4, %[r]\n\t"
  141909. #else
  141910. "adc r4, %[r]\n\t"
  141911. #endif
  141912. #ifdef WOLFSSL_KEIL
  141913. "adcs r5, r5, %[r]\n\t"
  141914. #elif defined(__clang__)
  141915. "adcs r5, %[r]\n\t"
  141916. #else
  141917. "adc r5, %[r]\n\t"
  141918. #endif
  141919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141920. "lsrs r7, %[b], #16\n\t"
  141921. #else
  141922. "lsr r7, %[b], #16\n\t"
  141923. #endif
  141924. #ifdef WOLFSSL_KEIL
  141925. "muls r6, r7, r6\n\t"
  141926. #elif defined(__clang__)
  141927. "muls r6, r7\n\t"
  141928. #else
  141929. "mul r6, r7\n\t"
  141930. #endif
  141931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141932. "lsrs r7, r6, #16\n\t"
  141933. #else
  141934. "lsr r7, r6, #16\n\t"
  141935. #endif
  141936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141937. "lsls r6, r6, #16\n\t"
  141938. #else
  141939. "lsl r6, r6, #16\n\t"
  141940. #endif
  141941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141942. "adds r3, r3, r6\n\t"
  141943. #else
  141944. "add r3, r3, r6\n\t"
  141945. #endif
  141946. #ifdef WOLFSSL_KEIL
  141947. "adcs r4, r4, r7\n\t"
  141948. #elif defined(__clang__)
  141949. "adcs r4, r7\n\t"
  141950. #else
  141951. "adc r4, r7\n\t"
  141952. #endif
  141953. #ifdef WOLFSSL_KEIL
  141954. "adcs r5, r5, %[r]\n\t"
  141955. #elif defined(__clang__)
  141956. "adcs r5, %[r]\n\t"
  141957. #else
  141958. "adc r5, %[r]\n\t"
  141959. #endif
  141960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141961. "lsrs r6, %[a], #16\n\t"
  141962. #else
  141963. "lsr r6, %[a], #16\n\t"
  141964. #endif
  141965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141966. "lsrs r7, %[b], #16\n\t"
  141967. #else
  141968. "lsr r7, %[b], #16\n\t"
  141969. #endif
  141970. #ifdef WOLFSSL_KEIL
  141971. "muls r7, r6, r7\n\t"
  141972. #elif defined(__clang__)
  141973. "muls r7, r6\n\t"
  141974. #else
  141975. "mul r7, r6\n\t"
  141976. #endif
  141977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141978. "adds r4, r4, r7\n\t"
  141979. #else
  141980. "add r4, r4, r7\n\t"
  141981. #endif
  141982. #ifdef WOLFSSL_KEIL
  141983. "adcs r5, r5, %[r]\n\t"
  141984. #elif defined(__clang__)
  141985. "adcs r5, %[r]\n\t"
  141986. #else
  141987. "adc r5, %[r]\n\t"
  141988. #endif
  141989. "uxth r7, %[b]\n\t"
  141990. #ifdef WOLFSSL_KEIL
  141991. "muls r6, r7, r6\n\t"
  141992. #elif defined(__clang__)
  141993. "muls r6, r7\n\t"
  141994. #else
  141995. "mul r6, r7\n\t"
  141996. #endif
  141997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141998. "lsrs r7, r6, #16\n\t"
  141999. #else
  142000. "lsr r7, r6, #16\n\t"
  142001. #endif
  142002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142003. "lsls r6, r6, #16\n\t"
  142004. #else
  142005. "lsl r6, r6, #16\n\t"
  142006. #endif
  142007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142008. "adds r3, r3, r6\n\t"
  142009. #else
  142010. "add r3, r3, r6\n\t"
  142011. #endif
  142012. #ifdef WOLFSSL_KEIL
  142013. "adcs r4, r4, r7\n\t"
  142014. #elif defined(__clang__)
  142015. "adcs r4, r7\n\t"
  142016. #else
  142017. "adc r4, r7\n\t"
  142018. #endif
  142019. #ifdef WOLFSSL_KEIL
  142020. "adcs r5, r5, %[r]\n\t"
  142021. #elif defined(__clang__)
  142022. "adcs r5, %[r]\n\t"
  142023. #else
  142024. "adc r5, %[r]\n\t"
  142025. #endif
  142026. "# A[8] * B[1]\n\t"
  142027. "mov %[a], r9\n\t"
  142028. "mov %[b], r10\n\t"
  142029. "ldr %[a], [%[a], #32]\n\t"
  142030. "ldr %[b], [%[b], #4]\n\t"
  142031. "uxth r6, %[a]\n\t"
  142032. "uxth r7, %[b]\n\t"
  142033. #ifdef WOLFSSL_KEIL
  142034. "muls r7, r6, r7\n\t"
  142035. #elif defined(__clang__)
  142036. "muls r7, r6\n\t"
  142037. #else
  142038. "mul r7, r6\n\t"
  142039. #endif
  142040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142041. "adds r3, r3, r7\n\t"
  142042. #else
  142043. "add r3, r3, r7\n\t"
  142044. #endif
  142045. #ifdef WOLFSSL_KEIL
  142046. "adcs r4, r4, %[r]\n\t"
  142047. #elif defined(__clang__)
  142048. "adcs r4, %[r]\n\t"
  142049. #else
  142050. "adc r4, %[r]\n\t"
  142051. #endif
  142052. #ifdef WOLFSSL_KEIL
  142053. "adcs r5, r5, %[r]\n\t"
  142054. #elif defined(__clang__)
  142055. "adcs r5, %[r]\n\t"
  142056. #else
  142057. "adc r5, %[r]\n\t"
  142058. #endif
  142059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142060. "lsrs r7, %[b], #16\n\t"
  142061. #else
  142062. "lsr r7, %[b], #16\n\t"
  142063. #endif
  142064. #ifdef WOLFSSL_KEIL
  142065. "muls r6, r7, r6\n\t"
  142066. #elif defined(__clang__)
  142067. "muls r6, r7\n\t"
  142068. #else
  142069. "mul r6, r7\n\t"
  142070. #endif
  142071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142072. "lsrs r7, r6, #16\n\t"
  142073. #else
  142074. "lsr r7, r6, #16\n\t"
  142075. #endif
  142076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142077. "lsls r6, r6, #16\n\t"
  142078. #else
  142079. "lsl r6, r6, #16\n\t"
  142080. #endif
  142081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142082. "adds r3, r3, r6\n\t"
  142083. #else
  142084. "add r3, r3, r6\n\t"
  142085. #endif
  142086. #ifdef WOLFSSL_KEIL
  142087. "adcs r4, r4, r7\n\t"
  142088. #elif defined(__clang__)
  142089. "adcs r4, r7\n\t"
  142090. #else
  142091. "adc r4, r7\n\t"
  142092. #endif
  142093. #ifdef WOLFSSL_KEIL
  142094. "adcs r5, r5, %[r]\n\t"
  142095. #elif defined(__clang__)
  142096. "adcs r5, %[r]\n\t"
  142097. #else
  142098. "adc r5, %[r]\n\t"
  142099. #endif
  142100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142101. "lsrs r6, %[a], #16\n\t"
  142102. #else
  142103. "lsr r6, %[a], #16\n\t"
  142104. #endif
  142105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142106. "lsrs r7, %[b], #16\n\t"
  142107. #else
  142108. "lsr r7, %[b], #16\n\t"
  142109. #endif
  142110. #ifdef WOLFSSL_KEIL
  142111. "muls r7, r6, r7\n\t"
  142112. #elif defined(__clang__)
  142113. "muls r7, r6\n\t"
  142114. #else
  142115. "mul r7, r6\n\t"
  142116. #endif
  142117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142118. "adds r4, r4, r7\n\t"
  142119. #else
  142120. "add r4, r4, r7\n\t"
  142121. #endif
  142122. #ifdef WOLFSSL_KEIL
  142123. "adcs r5, r5, %[r]\n\t"
  142124. #elif defined(__clang__)
  142125. "adcs r5, %[r]\n\t"
  142126. #else
  142127. "adc r5, %[r]\n\t"
  142128. #endif
  142129. "uxth r7, %[b]\n\t"
  142130. #ifdef WOLFSSL_KEIL
  142131. "muls r6, r7, r6\n\t"
  142132. #elif defined(__clang__)
  142133. "muls r6, r7\n\t"
  142134. #else
  142135. "mul r6, r7\n\t"
  142136. #endif
  142137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142138. "lsrs r7, r6, #16\n\t"
  142139. #else
  142140. "lsr r7, r6, #16\n\t"
  142141. #endif
  142142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142143. "lsls r6, r6, #16\n\t"
  142144. #else
  142145. "lsl r6, r6, #16\n\t"
  142146. #endif
  142147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142148. "adds r3, r3, r6\n\t"
  142149. #else
  142150. "add r3, r3, r6\n\t"
  142151. #endif
  142152. #ifdef WOLFSSL_KEIL
  142153. "adcs r4, r4, r7\n\t"
  142154. #elif defined(__clang__)
  142155. "adcs r4, r7\n\t"
  142156. #else
  142157. "adc r4, r7\n\t"
  142158. #endif
  142159. #ifdef WOLFSSL_KEIL
  142160. "adcs r5, r5, %[r]\n\t"
  142161. #elif defined(__clang__)
  142162. "adcs r5, %[r]\n\t"
  142163. #else
  142164. "adc r5, %[r]\n\t"
  142165. #endif
  142166. "# A[9] * B[0]\n\t"
  142167. "mov %[a], r9\n\t"
  142168. "mov %[b], r10\n\t"
  142169. "ldr %[a], [%[a], #36]\n\t"
  142170. "ldr %[b], [%[b]]\n\t"
  142171. "uxth r6, %[a]\n\t"
  142172. "uxth r7, %[b]\n\t"
  142173. #ifdef WOLFSSL_KEIL
  142174. "muls r7, r6, r7\n\t"
  142175. #elif defined(__clang__)
  142176. "muls r7, r6\n\t"
  142177. #else
  142178. "mul r7, r6\n\t"
  142179. #endif
  142180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142181. "adds r3, r3, r7\n\t"
  142182. #else
  142183. "add r3, r3, r7\n\t"
  142184. #endif
  142185. #ifdef WOLFSSL_KEIL
  142186. "adcs r4, r4, %[r]\n\t"
  142187. #elif defined(__clang__)
  142188. "adcs r4, %[r]\n\t"
  142189. #else
  142190. "adc r4, %[r]\n\t"
  142191. #endif
  142192. #ifdef WOLFSSL_KEIL
  142193. "adcs r5, r5, %[r]\n\t"
  142194. #elif defined(__clang__)
  142195. "adcs r5, %[r]\n\t"
  142196. #else
  142197. "adc r5, %[r]\n\t"
  142198. #endif
  142199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142200. "lsrs r7, %[b], #16\n\t"
  142201. #else
  142202. "lsr r7, %[b], #16\n\t"
  142203. #endif
  142204. #ifdef WOLFSSL_KEIL
  142205. "muls r6, r7, r6\n\t"
  142206. #elif defined(__clang__)
  142207. "muls r6, r7\n\t"
  142208. #else
  142209. "mul r6, r7\n\t"
  142210. #endif
  142211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142212. "lsrs r7, r6, #16\n\t"
  142213. #else
  142214. "lsr r7, r6, #16\n\t"
  142215. #endif
  142216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142217. "lsls r6, r6, #16\n\t"
  142218. #else
  142219. "lsl r6, r6, #16\n\t"
  142220. #endif
  142221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142222. "adds r3, r3, r6\n\t"
  142223. #else
  142224. "add r3, r3, r6\n\t"
  142225. #endif
  142226. #ifdef WOLFSSL_KEIL
  142227. "adcs r4, r4, r7\n\t"
  142228. #elif defined(__clang__)
  142229. "adcs r4, r7\n\t"
  142230. #else
  142231. "adc r4, r7\n\t"
  142232. #endif
  142233. #ifdef WOLFSSL_KEIL
  142234. "adcs r5, r5, %[r]\n\t"
  142235. #elif defined(__clang__)
  142236. "adcs r5, %[r]\n\t"
  142237. #else
  142238. "adc r5, %[r]\n\t"
  142239. #endif
  142240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142241. "lsrs r6, %[a], #16\n\t"
  142242. #else
  142243. "lsr r6, %[a], #16\n\t"
  142244. #endif
  142245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142246. "lsrs r7, %[b], #16\n\t"
  142247. #else
  142248. "lsr r7, %[b], #16\n\t"
  142249. #endif
  142250. #ifdef WOLFSSL_KEIL
  142251. "muls r7, r6, r7\n\t"
  142252. #elif defined(__clang__)
  142253. "muls r7, r6\n\t"
  142254. #else
  142255. "mul r7, r6\n\t"
  142256. #endif
  142257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142258. "adds r4, r4, r7\n\t"
  142259. #else
  142260. "add r4, r4, r7\n\t"
  142261. #endif
  142262. #ifdef WOLFSSL_KEIL
  142263. "adcs r5, r5, %[r]\n\t"
  142264. #elif defined(__clang__)
  142265. "adcs r5, %[r]\n\t"
  142266. #else
  142267. "adc r5, %[r]\n\t"
  142268. #endif
  142269. "uxth r7, %[b]\n\t"
  142270. #ifdef WOLFSSL_KEIL
  142271. "muls r6, r7, r6\n\t"
  142272. #elif defined(__clang__)
  142273. "muls r6, r7\n\t"
  142274. #else
  142275. "mul r6, r7\n\t"
  142276. #endif
  142277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142278. "lsrs r7, r6, #16\n\t"
  142279. #else
  142280. "lsr r7, r6, #16\n\t"
  142281. #endif
  142282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142283. "lsls r6, r6, #16\n\t"
  142284. #else
  142285. "lsl r6, r6, #16\n\t"
  142286. #endif
  142287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142288. "adds r3, r3, r6\n\t"
  142289. #else
  142290. "add r3, r3, r6\n\t"
  142291. #endif
  142292. #ifdef WOLFSSL_KEIL
  142293. "adcs r4, r4, r7\n\t"
  142294. #elif defined(__clang__)
  142295. "adcs r4, r7\n\t"
  142296. #else
  142297. "adc r4, r7\n\t"
  142298. #endif
  142299. #ifdef WOLFSSL_KEIL
  142300. "adcs r5, r5, %[r]\n\t"
  142301. #elif defined(__clang__)
  142302. "adcs r5, %[r]\n\t"
  142303. #else
  142304. "adc r5, %[r]\n\t"
  142305. #endif
  142306. "str r3, [sp, #36]\n\t"
  142307. "# A[10] * B[0]\n\t"
  142308. "movs r3, #0\n\t"
  142309. "mov %[a], r9\n\t"
  142310. "mov %[b], r10\n\t"
  142311. "ldr %[a], [%[a], #40]\n\t"
  142312. "ldr %[b], [%[b]]\n\t"
  142313. "uxth r6, %[a]\n\t"
  142314. "uxth r7, %[b]\n\t"
  142315. #ifdef WOLFSSL_KEIL
  142316. "muls r7, r6, r7\n\t"
  142317. #elif defined(__clang__)
  142318. "muls r7, r6\n\t"
  142319. #else
  142320. "mul r7, r6\n\t"
  142321. #endif
  142322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142323. "adds r4, r4, r7\n\t"
  142324. #else
  142325. "add r4, r4, r7\n\t"
  142326. #endif
  142327. #ifdef WOLFSSL_KEIL
  142328. "adcs r5, r5, %[r]\n\t"
  142329. #elif defined(__clang__)
  142330. "adcs r5, %[r]\n\t"
  142331. #else
  142332. "adc r5, %[r]\n\t"
  142333. #endif
  142334. #ifdef WOLFSSL_KEIL
  142335. "adcs r3, r3, %[r]\n\t"
  142336. #elif defined(__clang__)
  142337. "adcs r3, %[r]\n\t"
  142338. #else
  142339. "adc r3, %[r]\n\t"
  142340. #endif
  142341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142342. "lsrs r7, %[b], #16\n\t"
  142343. #else
  142344. "lsr r7, %[b], #16\n\t"
  142345. #endif
  142346. #ifdef WOLFSSL_KEIL
  142347. "muls r6, r7, r6\n\t"
  142348. #elif defined(__clang__)
  142349. "muls r6, r7\n\t"
  142350. #else
  142351. "mul r6, r7\n\t"
  142352. #endif
  142353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142354. "lsrs r7, r6, #16\n\t"
  142355. #else
  142356. "lsr r7, r6, #16\n\t"
  142357. #endif
  142358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142359. "lsls r6, r6, #16\n\t"
  142360. #else
  142361. "lsl r6, r6, #16\n\t"
  142362. #endif
  142363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142364. "adds r4, r4, r6\n\t"
  142365. #else
  142366. "add r4, r4, r6\n\t"
  142367. #endif
  142368. #ifdef WOLFSSL_KEIL
  142369. "adcs r5, r5, r7\n\t"
  142370. #elif defined(__clang__)
  142371. "adcs r5, r7\n\t"
  142372. #else
  142373. "adc r5, r7\n\t"
  142374. #endif
  142375. #ifdef WOLFSSL_KEIL
  142376. "adcs r3, r3, %[r]\n\t"
  142377. #elif defined(__clang__)
  142378. "adcs r3, %[r]\n\t"
  142379. #else
  142380. "adc r3, %[r]\n\t"
  142381. #endif
  142382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142383. "lsrs r6, %[a], #16\n\t"
  142384. #else
  142385. "lsr r6, %[a], #16\n\t"
  142386. #endif
  142387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142388. "lsrs r7, %[b], #16\n\t"
  142389. #else
  142390. "lsr r7, %[b], #16\n\t"
  142391. #endif
  142392. #ifdef WOLFSSL_KEIL
  142393. "muls r7, r6, r7\n\t"
  142394. #elif defined(__clang__)
  142395. "muls r7, r6\n\t"
  142396. #else
  142397. "mul r7, r6\n\t"
  142398. #endif
  142399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142400. "adds r5, r5, r7\n\t"
  142401. #else
  142402. "add r5, r5, r7\n\t"
  142403. #endif
  142404. #ifdef WOLFSSL_KEIL
  142405. "adcs r3, r3, %[r]\n\t"
  142406. #elif defined(__clang__)
  142407. "adcs r3, %[r]\n\t"
  142408. #else
  142409. "adc r3, %[r]\n\t"
  142410. #endif
  142411. "uxth r7, %[b]\n\t"
  142412. #ifdef WOLFSSL_KEIL
  142413. "muls r6, r7, r6\n\t"
  142414. #elif defined(__clang__)
  142415. "muls r6, r7\n\t"
  142416. #else
  142417. "mul r6, r7\n\t"
  142418. #endif
  142419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142420. "lsrs r7, r6, #16\n\t"
  142421. #else
  142422. "lsr r7, r6, #16\n\t"
  142423. #endif
  142424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142425. "lsls r6, r6, #16\n\t"
  142426. #else
  142427. "lsl r6, r6, #16\n\t"
  142428. #endif
  142429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142430. "adds r4, r4, r6\n\t"
  142431. #else
  142432. "add r4, r4, r6\n\t"
  142433. #endif
  142434. #ifdef WOLFSSL_KEIL
  142435. "adcs r5, r5, r7\n\t"
  142436. #elif defined(__clang__)
  142437. "adcs r5, r7\n\t"
  142438. #else
  142439. "adc r5, r7\n\t"
  142440. #endif
  142441. #ifdef WOLFSSL_KEIL
  142442. "adcs r3, r3, %[r]\n\t"
  142443. #elif defined(__clang__)
  142444. "adcs r3, %[r]\n\t"
  142445. #else
  142446. "adc r3, %[r]\n\t"
  142447. #endif
  142448. "# A[9] * B[1]\n\t"
  142449. "mov %[a], r9\n\t"
  142450. "mov %[b], r10\n\t"
  142451. "ldr %[a], [%[a], #36]\n\t"
  142452. "ldr %[b], [%[b], #4]\n\t"
  142453. "uxth r6, %[a]\n\t"
  142454. "uxth r7, %[b]\n\t"
  142455. #ifdef WOLFSSL_KEIL
  142456. "muls r7, r6, r7\n\t"
  142457. #elif defined(__clang__)
  142458. "muls r7, r6\n\t"
  142459. #else
  142460. "mul r7, r6\n\t"
  142461. #endif
  142462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142463. "adds r4, r4, r7\n\t"
  142464. #else
  142465. "add r4, r4, r7\n\t"
  142466. #endif
  142467. #ifdef WOLFSSL_KEIL
  142468. "adcs r5, r5, %[r]\n\t"
  142469. #elif defined(__clang__)
  142470. "adcs r5, %[r]\n\t"
  142471. #else
  142472. "adc r5, %[r]\n\t"
  142473. #endif
  142474. #ifdef WOLFSSL_KEIL
  142475. "adcs r3, r3, %[r]\n\t"
  142476. #elif defined(__clang__)
  142477. "adcs r3, %[r]\n\t"
  142478. #else
  142479. "adc r3, %[r]\n\t"
  142480. #endif
  142481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142482. "lsrs r7, %[b], #16\n\t"
  142483. #else
  142484. "lsr r7, %[b], #16\n\t"
  142485. #endif
  142486. #ifdef WOLFSSL_KEIL
  142487. "muls r6, r7, r6\n\t"
  142488. #elif defined(__clang__)
  142489. "muls r6, r7\n\t"
  142490. #else
  142491. "mul r6, r7\n\t"
  142492. #endif
  142493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142494. "lsrs r7, r6, #16\n\t"
  142495. #else
  142496. "lsr r7, r6, #16\n\t"
  142497. #endif
  142498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142499. "lsls r6, r6, #16\n\t"
  142500. #else
  142501. "lsl r6, r6, #16\n\t"
  142502. #endif
  142503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142504. "adds r4, r4, r6\n\t"
  142505. #else
  142506. "add r4, r4, r6\n\t"
  142507. #endif
  142508. #ifdef WOLFSSL_KEIL
  142509. "adcs r5, r5, r7\n\t"
  142510. #elif defined(__clang__)
  142511. "adcs r5, r7\n\t"
  142512. #else
  142513. "adc r5, r7\n\t"
  142514. #endif
  142515. #ifdef WOLFSSL_KEIL
  142516. "adcs r3, r3, %[r]\n\t"
  142517. #elif defined(__clang__)
  142518. "adcs r3, %[r]\n\t"
  142519. #else
  142520. "adc r3, %[r]\n\t"
  142521. #endif
  142522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142523. "lsrs r6, %[a], #16\n\t"
  142524. #else
  142525. "lsr r6, %[a], #16\n\t"
  142526. #endif
  142527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142528. "lsrs r7, %[b], #16\n\t"
  142529. #else
  142530. "lsr r7, %[b], #16\n\t"
  142531. #endif
  142532. #ifdef WOLFSSL_KEIL
  142533. "muls r7, r6, r7\n\t"
  142534. #elif defined(__clang__)
  142535. "muls r7, r6\n\t"
  142536. #else
  142537. "mul r7, r6\n\t"
  142538. #endif
  142539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142540. "adds r5, r5, r7\n\t"
  142541. #else
  142542. "add r5, r5, r7\n\t"
  142543. #endif
  142544. #ifdef WOLFSSL_KEIL
  142545. "adcs r3, r3, %[r]\n\t"
  142546. #elif defined(__clang__)
  142547. "adcs r3, %[r]\n\t"
  142548. #else
  142549. "adc r3, %[r]\n\t"
  142550. #endif
  142551. "uxth r7, %[b]\n\t"
  142552. #ifdef WOLFSSL_KEIL
  142553. "muls r6, r7, r6\n\t"
  142554. #elif defined(__clang__)
  142555. "muls r6, r7\n\t"
  142556. #else
  142557. "mul r6, r7\n\t"
  142558. #endif
  142559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142560. "lsrs r7, r6, #16\n\t"
  142561. #else
  142562. "lsr r7, r6, #16\n\t"
  142563. #endif
  142564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142565. "lsls r6, r6, #16\n\t"
  142566. #else
  142567. "lsl r6, r6, #16\n\t"
  142568. #endif
  142569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142570. "adds r4, r4, r6\n\t"
  142571. #else
  142572. "add r4, r4, r6\n\t"
  142573. #endif
  142574. #ifdef WOLFSSL_KEIL
  142575. "adcs r5, r5, r7\n\t"
  142576. #elif defined(__clang__)
  142577. "adcs r5, r7\n\t"
  142578. #else
  142579. "adc r5, r7\n\t"
  142580. #endif
  142581. #ifdef WOLFSSL_KEIL
  142582. "adcs r3, r3, %[r]\n\t"
  142583. #elif defined(__clang__)
  142584. "adcs r3, %[r]\n\t"
  142585. #else
  142586. "adc r3, %[r]\n\t"
  142587. #endif
  142588. "# A[8] * B[2]\n\t"
  142589. "mov %[a], r9\n\t"
  142590. "mov %[b], r10\n\t"
  142591. "ldr %[a], [%[a], #32]\n\t"
  142592. "ldr %[b], [%[b], #8]\n\t"
  142593. "uxth r6, %[a]\n\t"
  142594. "uxth r7, %[b]\n\t"
  142595. #ifdef WOLFSSL_KEIL
  142596. "muls r7, r6, r7\n\t"
  142597. #elif defined(__clang__)
  142598. "muls r7, r6\n\t"
  142599. #else
  142600. "mul r7, r6\n\t"
  142601. #endif
  142602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142603. "adds r4, r4, r7\n\t"
  142604. #else
  142605. "add r4, r4, r7\n\t"
  142606. #endif
  142607. #ifdef WOLFSSL_KEIL
  142608. "adcs r5, r5, %[r]\n\t"
  142609. #elif defined(__clang__)
  142610. "adcs r5, %[r]\n\t"
  142611. #else
  142612. "adc r5, %[r]\n\t"
  142613. #endif
  142614. #ifdef WOLFSSL_KEIL
  142615. "adcs r3, r3, %[r]\n\t"
  142616. #elif defined(__clang__)
  142617. "adcs r3, %[r]\n\t"
  142618. #else
  142619. "adc r3, %[r]\n\t"
  142620. #endif
  142621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142622. "lsrs r7, %[b], #16\n\t"
  142623. #else
  142624. "lsr r7, %[b], #16\n\t"
  142625. #endif
  142626. #ifdef WOLFSSL_KEIL
  142627. "muls r6, r7, r6\n\t"
  142628. #elif defined(__clang__)
  142629. "muls r6, r7\n\t"
  142630. #else
  142631. "mul r6, r7\n\t"
  142632. #endif
  142633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142634. "lsrs r7, r6, #16\n\t"
  142635. #else
  142636. "lsr r7, r6, #16\n\t"
  142637. #endif
  142638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142639. "lsls r6, r6, #16\n\t"
  142640. #else
  142641. "lsl r6, r6, #16\n\t"
  142642. #endif
  142643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142644. "adds r4, r4, r6\n\t"
  142645. #else
  142646. "add r4, r4, r6\n\t"
  142647. #endif
  142648. #ifdef WOLFSSL_KEIL
  142649. "adcs r5, r5, r7\n\t"
  142650. #elif defined(__clang__)
  142651. "adcs r5, r7\n\t"
  142652. #else
  142653. "adc r5, r7\n\t"
  142654. #endif
  142655. #ifdef WOLFSSL_KEIL
  142656. "adcs r3, r3, %[r]\n\t"
  142657. #elif defined(__clang__)
  142658. "adcs r3, %[r]\n\t"
  142659. #else
  142660. "adc r3, %[r]\n\t"
  142661. #endif
  142662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142663. "lsrs r6, %[a], #16\n\t"
  142664. #else
  142665. "lsr r6, %[a], #16\n\t"
  142666. #endif
  142667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142668. "lsrs r7, %[b], #16\n\t"
  142669. #else
  142670. "lsr r7, %[b], #16\n\t"
  142671. #endif
  142672. #ifdef WOLFSSL_KEIL
  142673. "muls r7, r6, r7\n\t"
  142674. #elif defined(__clang__)
  142675. "muls r7, r6\n\t"
  142676. #else
  142677. "mul r7, r6\n\t"
  142678. #endif
  142679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142680. "adds r5, r5, r7\n\t"
  142681. #else
  142682. "add r5, r5, r7\n\t"
  142683. #endif
  142684. #ifdef WOLFSSL_KEIL
  142685. "adcs r3, r3, %[r]\n\t"
  142686. #elif defined(__clang__)
  142687. "adcs r3, %[r]\n\t"
  142688. #else
  142689. "adc r3, %[r]\n\t"
  142690. #endif
  142691. "uxth r7, %[b]\n\t"
  142692. #ifdef WOLFSSL_KEIL
  142693. "muls r6, r7, r6\n\t"
  142694. #elif defined(__clang__)
  142695. "muls r6, r7\n\t"
  142696. #else
  142697. "mul r6, r7\n\t"
  142698. #endif
  142699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142700. "lsrs r7, r6, #16\n\t"
  142701. #else
  142702. "lsr r7, r6, #16\n\t"
  142703. #endif
  142704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142705. "lsls r6, r6, #16\n\t"
  142706. #else
  142707. "lsl r6, r6, #16\n\t"
  142708. #endif
  142709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142710. "adds r4, r4, r6\n\t"
  142711. #else
  142712. "add r4, r4, r6\n\t"
  142713. #endif
  142714. #ifdef WOLFSSL_KEIL
  142715. "adcs r5, r5, r7\n\t"
  142716. #elif defined(__clang__)
  142717. "adcs r5, r7\n\t"
  142718. #else
  142719. "adc r5, r7\n\t"
  142720. #endif
  142721. #ifdef WOLFSSL_KEIL
  142722. "adcs r3, r3, %[r]\n\t"
  142723. #elif defined(__clang__)
  142724. "adcs r3, %[r]\n\t"
  142725. #else
  142726. "adc r3, %[r]\n\t"
  142727. #endif
  142728. "# A[7] * B[3]\n\t"
  142729. "mov %[a], r9\n\t"
  142730. "mov %[b], r10\n\t"
  142731. "ldr %[a], [%[a], #28]\n\t"
  142732. "ldr %[b], [%[b], #12]\n\t"
  142733. "uxth r6, %[a]\n\t"
  142734. "uxth r7, %[b]\n\t"
  142735. #ifdef WOLFSSL_KEIL
  142736. "muls r7, r6, r7\n\t"
  142737. #elif defined(__clang__)
  142738. "muls r7, r6\n\t"
  142739. #else
  142740. "mul r7, r6\n\t"
  142741. #endif
  142742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142743. "adds r4, r4, r7\n\t"
  142744. #else
  142745. "add r4, r4, r7\n\t"
  142746. #endif
  142747. #ifdef WOLFSSL_KEIL
  142748. "adcs r5, r5, %[r]\n\t"
  142749. #elif defined(__clang__)
  142750. "adcs r5, %[r]\n\t"
  142751. #else
  142752. "adc r5, %[r]\n\t"
  142753. #endif
  142754. #ifdef WOLFSSL_KEIL
  142755. "adcs r3, r3, %[r]\n\t"
  142756. #elif defined(__clang__)
  142757. "adcs r3, %[r]\n\t"
  142758. #else
  142759. "adc r3, %[r]\n\t"
  142760. #endif
  142761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142762. "lsrs r7, %[b], #16\n\t"
  142763. #else
  142764. "lsr r7, %[b], #16\n\t"
  142765. #endif
  142766. #ifdef WOLFSSL_KEIL
  142767. "muls r6, r7, r6\n\t"
  142768. #elif defined(__clang__)
  142769. "muls r6, r7\n\t"
  142770. #else
  142771. "mul r6, r7\n\t"
  142772. #endif
  142773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142774. "lsrs r7, r6, #16\n\t"
  142775. #else
  142776. "lsr r7, r6, #16\n\t"
  142777. #endif
  142778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142779. "lsls r6, r6, #16\n\t"
  142780. #else
  142781. "lsl r6, r6, #16\n\t"
  142782. #endif
  142783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142784. "adds r4, r4, r6\n\t"
  142785. #else
  142786. "add r4, r4, r6\n\t"
  142787. #endif
  142788. #ifdef WOLFSSL_KEIL
  142789. "adcs r5, r5, r7\n\t"
  142790. #elif defined(__clang__)
  142791. "adcs r5, r7\n\t"
  142792. #else
  142793. "adc r5, r7\n\t"
  142794. #endif
  142795. #ifdef WOLFSSL_KEIL
  142796. "adcs r3, r3, %[r]\n\t"
  142797. #elif defined(__clang__)
  142798. "adcs r3, %[r]\n\t"
  142799. #else
  142800. "adc r3, %[r]\n\t"
  142801. #endif
  142802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142803. "lsrs r6, %[a], #16\n\t"
  142804. #else
  142805. "lsr r6, %[a], #16\n\t"
  142806. #endif
  142807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142808. "lsrs r7, %[b], #16\n\t"
  142809. #else
  142810. "lsr r7, %[b], #16\n\t"
  142811. #endif
  142812. #ifdef WOLFSSL_KEIL
  142813. "muls r7, r6, r7\n\t"
  142814. #elif defined(__clang__)
  142815. "muls r7, r6\n\t"
  142816. #else
  142817. "mul r7, r6\n\t"
  142818. #endif
  142819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142820. "adds r5, r5, r7\n\t"
  142821. #else
  142822. "add r5, r5, r7\n\t"
  142823. #endif
  142824. #ifdef WOLFSSL_KEIL
  142825. "adcs r3, r3, %[r]\n\t"
  142826. #elif defined(__clang__)
  142827. "adcs r3, %[r]\n\t"
  142828. #else
  142829. "adc r3, %[r]\n\t"
  142830. #endif
  142831. "uxth r7, %[b]\n\t"
  142832. #ifdef WOLFSSL_KEIL
  142833. "muls r6, r7, r6\n\t"
  142834. #elif defined(__clang__)
  142835. "muls r6, r7\n\t"
  142836. #else
  142837. "mul r6, r7\n\t"
  142838. #endif
  142839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142840. "lsrs r7, r6, #16\n\t"
  142841. #else
  142842. "lsr r7, r6, #16\n\t"
  142843. #endif
  142844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142845. "lsls r6, r6, #16\n\t"
  142846. #else
  142847. "lsl r6, r6, #16\n\t"
  142848. #endif
  142849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142850. "adds r4, r4, r6\n\t"
  142851. #else
  142852. "add r4, r4, r6\n\t"
  142853. #endif
  142854. #ifdef WOLFSSL_KEIL
  142855. "adcs r5, r5, r7\n\t"
  142856. #elif defined(__clang__)
  142857. "adcs r5, r7\n\t"
  142858. #else
  142859. "adc r5, r7\n\t"
  142860. #endif
  142861. #ifdef WOLFSSL_KEIL
  142862. "adcs r3, r3, %[r]\n\t"
  142863. #elif defined(__clang__)
  142864. "adcs r3, %[r]\n\t"
  142865. #else
  142866. "adc r3, %[r]\n\t"
  142867. #endif
  142868. "# A[6] * B[4]\n\t"
  142869. "mov %[a], r9\n\t"
  142870. "mov %[b], r10\n\t"
  142871. "ldr %[a], [%[a], #24]\n\t"
  142872. "ldr %[b], [%[b], #16]\n\t"
  142873. "uxth r6, %[a]\n\t"
  142874. "uxth r7, %[b]\n\t"
  142875. #ifdef WOLFSSL_KEIL
  142876. "muls r7, r6, r7\n\t"
  142877. #elif defined(__clang__)
  142878. "muls r7, r6\n\t"
  142879. #else
  142880. "mul r7, r6\n\t"
  142881. #endif
  142882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142883. "adds r4, r4, r7\n\t"
  142884. #else
  142885. "add r4, r4, r7\n\t"
  142886. #endif
  142887. #ifdef WOLFSSL_KEIL
  142888. "adcs r5, r5, %[r]\n\t"
  142889. #elif defined(__clang__)
  142890. "adcs r5, %[r]\n\t"
  142891. #else
  142892. "adc r5, %[r]\n\t"
  142893. #endif
  142894. #ifdef WOLFSSL_KEIL
  142895. "adcs r3, r3, %[r]\n\t"
  142896. #elif defined(__clang__)
  142897. "adcs r3, %[r]\n\t"
  142898. #else
  142899. "adc r3, %[r]\n\t"
  142900. #endif
  142901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142902. "lsrs r7, %[b], #16\n\t"
  142903. #else
  142904. "lsr r7, %[b], #16\n\t"
  142905. #endif
  142906. #ifdef WOLFSSL_KEIL
  142907. "muls r6, r7, r6\n\t"
  142908. #elif defined(__clang__)
  142909. "muls r6, r7\n\t"
  142910. #else
  142911. "mul r6, r7\n\t"
  142912. #endif
  142913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142914. "lsrs r7, r6, #16\n\t"
  142915. #else
  142916. "lsr r7, r6, #16\n\t"
  142917. #endif
  142918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142919. "lsls r6, r6, #16\n\t"
  142920. #else
  142921. "lsl r6, r6, #16\n\t"
  142922. #endif
  142923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142924. "adds r4, r4, r6\n\t"
  142925. #else
  142926. "add r4, r4, r6\n\t"
  142927. #endif
  142928. #ifdef WOLFSSL_KEIL
  142929. "adcs r5, r5, r7\n\t"
  142930. #elif defined(__clang__)
  142931. "adcs r5, r7\n\t"
  142932. #else
  142933. "adc r5, r7\n\t"
  142934. #endif
  142935. #ifdef WOLFSSL_KEIL
  142936. "adcs r3, r3, %[r]\n\t"
  142937. #elif defined(__clang__)
  142938. "adcs r3, %[r]\n\t"
  142939. #else
  142940. "adc r3, %[r]\n\t"
  142941. #endif
  142942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142943. "lsrs r6, %[a], #16\n\t"
  142944. #else
  142945. "lsr r6, %[a], #16\n\t"
  142946. #endif
  142947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142948. "lsrs r7, %[b], #16\n\t"
  142949. #else
  142950. "lsr r7, %[b], #16\n\t"
  142951. #endif
  142952. #ifdef WOLFSSL_KEIL
  142953. "muls r7, r6, r7\n\t"
  142954. #elif defined(__clang__)
  142955. "muls r7, r6\n\t"
  142956. #else
  142957. "mul r7, r6\n\t"
  142958. #endif
  142959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142960. "adds r5, r5, r7\n\t"
  142961. #else
  142962. "add r5, r5, r7\n\t"
  142963. #endif
  142964. #ifdef WOLFSSL_KEIL
  142965. "adcs r3, r3, %[r]\n\t"
  142966. #elif defined(__clang__)
  142967. "adcs r3, %[r]\n\t"
  142968. #else
  142969. "adc r3, %[r]\n\t"
  142970. #endif
  142971. "uxth r7, %[b]\n\t"
  142972. #ifdef WOLFSSL_KEIL
  142973. "muls r6, r7, r6\n\t"
  142974. #elif defined(__clang__)
  142975. "muls r6, r7\n\t"
  142976. #else
  142977. "mul r6, r7\n\t"
  142978. #endif
  142979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142980. "lsrs r7, r6, #16\n\t"
  142981. #else
  142982. "lsr r7, r6, #16\n\t"
  142983. #endif
  142984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142985. "lsls r6, r6, #16\n\t"
  142986. #else
  142987. "lsl r6, r6, #16\n\t"
  142988. #endif
  142989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142990. "adds r4, r4, r6\n\t"
  142991. #else
  142992. "add r4, r4, r6\n\t"
  142993. #endif
  142994. #ifdef WOLFSSL_KEIL
  142995. "adcs r5, r5, r7\n\t"
  142996. #elif defined(__clang__)
  142997. "adcs r5, r7\n\t"
  142998. #else
  142999. "adc r5, r7\n\t"
  143000. #endif
  143001. #ifdef WOLFSSL_KEIL
  143002. "adcs r3, r3, %[r]\n\t"
  143003. #elif defined(__clang__)
  143004. "adcs r3, %[r]\n\t"
  143005. #else
  143006. "adc r3, %[r]\n\t"
  143007. #endif
  143008. "# A[5] * B[5]\n\t"
  143009. "mov %[a], r9\n\t"
  143010. "mov %[b], r10\n\t"
  143011. "ldr %[a], [%[a], #20]\n\t"
  143012. "ldr %[b], [%[b], #20]\n\t"
  143013. "uxth r6, %[a]\n\t"
  143014. "uxth r7, %[b]\n\t"
  143015. #ifdef WOLFSSL_KEIL
  143016. "muls r7, r6, r7\n\t"
  143017. #elif defined(__clang__)
  143018. "muls r7, r6\n\t"
  143019. #else
  143020. "mul r7, r6\n\t"
  143021. #endif
  143022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143023. "adds r4, r4, r7\n\t"
  143024. #else
  143025. "add r4, r4, r7\n\t"
  143026. #endif
  143027. #ifdef WOLFSSL_KEIL
  143028. "adcs r5, r5, %[r]\n\t"
  143029. #elif defined(__clang__)
  143030. "adcs r5, %[r]\n\t"
  143031. #else
  143032. "adc r5, %[r]\n\t"
  143033. #endif
  143034. #ifdef WOLFSSL_KEIL
  143035. "adcs r3, r3, %[r]\n\t"
  143036. #elif defined(__clang__)
  143037. "adcs r3, %[r]\n\t"
  143038. #else
  143039. "adc r3, %[r]\n\t"
  143040. #endif
  143041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143042. "lsrs r7, %[b], #16\n\t"
  143043. #else
  143044. "lsr r7, %[b], #16\n\t"
  143045. #endif
  143046. #ifdef WOLFSSL_KEIL
  143047. "muls r6, r7, r6\n\t"
  143048. #elif defined(__clang__)
  143049. "muls r6, r7\n\t"
  143050. #else
  143051. "mul r6, r7\n\t"
  143052. #endif
  143053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143054. "lsrs r7, r6, #16\n\t"
  143055. #else
  143056. "lsr r7, r6, #16\n\t"
  143057. #endif
  143058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143059. "lsls r6, r6, #16\n\t"
  143060. #else
  143061. "lsl r6, r6, #16\n\t"
  143062. #endif
  143063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143064. "adds r4, r4, r6\n\t"
  143065. #else
  143066. "add r4, r4, r6\n\t"
  143067. #endif
  143068. #ifdef WOLFSSL_KEIL
  143069. "adcs r5, r5, r7\n\t"
  143070. #elif defined(__clang__)
  143071. "adcs r5, r7\n\t"
  143072. #else
  143073. "adc r5, r7\n\t"
  143074. #endif
  143075. #ifdef WOLFSSL_KEIL
  143076. "adcs r3, r3, %[r]\n\t"
  143077. #elif defined(__clang__)
  143078. "adcs r3, %[r]\n\t"
  143079. #else
  143080. "adc r3, %[r]\n\t"
  143081. #endif
  143082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143083. "lsrs r6, %[a], #16\n\t"
  143084. #else
  143085. "lsr r6, %[a], #16\n\t"
  143086. #endif
  143087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143088. "lsrs r7, %[b], #16\n\t"
  143089. #else
  143090. "lsr r7, %[b], #16\n\t"
  143091. #endif
  143092. #ifdef WOLFSSL_KEIL
  143093. "muls r7, r6, r7\n\t"
  143094. #elif defined(__clang__)
  143095. "muls r7, r6\n\t"
  143096. #else
  143097. "mul r7, r6\n\t"
  143098. #endif
  143099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143100. "adds r5, r5, r7\n\t"
  143101. #else
  143102. "add r5, r5, r7\n\t"
  143103. #endif
  143104. #ifdef WOLFSSL_KEIL
  143105. "adcs r3, r3, %[r]\n\t"
  143106. #elif defined(__clang__)
  143107. "adcs r3, %[r]\n\t"
  143108. #else
  143109. "adc r3, %[r]\n\t"
  143110. #endif
  143111. "uxth r7, %[b]\n\t"
  143112. #ifdef WOLFSSL_KEIL
  143113. "muls r6, r7, r6\n\t"
  143114. #elif defined(__clang__)
  143115. "muls r6, r7\n\t"
  143116. #else
  143117. "mul r6, r7\n\t"
  143118. #endif
  143119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143120. "lsrs r7, r6, #16\n\t"
  143121. #else
  143122. "lsr r7, r6, #16\n\t"
  143123. #endif
  143124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143125. "lsls r6, r6, #16\n\t"
  143126. #else
  143127. "lsl r6, r6, #16\n\t"
  143128. #endif
  143129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143130. "adds r4, r4, r6\n\t"
  143131. #else
  143132. "add r4, r4, r6\n\t"
  143133. #endif
  143134. #ifdef WOLFSSL_KEIL
  143135. "adcs r5, r5, r7\n\t"
  143136. #elif defined(__clang__)
  143137. "adcs r5, r7\n\t"
  143138. #else
  143139. "adc r5, r7\n\t"
  143140. #endif
  143141. #ifdef WOLFSSL_KEIL
  143142. "adcs r3, r3, %[r]\n\t"
  143143. #elif defined(__clang__)
  143144. "adcs r3, %[r]\n\t"
  143145. #else
  143146. "adc r3, %[r]\n\t"
  143147. #endif
  143148. "# A[4] * B[6]\n\t"
  143149. "mov %[a], r9\n\t"
  143150. "mov %[b], r10\n\t"
  143151. "ldr %[a], [%[a], #16]\n\t"
  143152. "ldr %[b], [%[b], #24]\n\t"
  143153. "uxth r6, %[a]\n\t"
  143154. "uxth r7, %[b]\n\t"
  143155. #ifdef WOLFSSL_KEIL
  143156. "muls r7, r6, r7\n\t"
  143157. #elif defined(__clang__)
  143158. "muls r7, r6\n\t"
  143159. #else
  143160. "mul r7, r6\n\t"
  143161. #endif
  143162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143163. "adds r4, r4, r7\n\t"
  143164. #else
  143165. "add r4, r4, r7\n\t"
  143166. #endif
  143167. #ifdef WOLFSSL_KEIL
  143168. "adcs r5, r5, %[r]\n\t"
  143169. #elif defined(__clang__)
  143170. "adcs r5, %[r]\n\t"
  143171. #else
  143172. "adc r5, %[r]\n\t"
  143173. #endif
  143174. #ifdef WOLFSSL_KEIL
  143175. "adcs r3, r3, %[r]\n\t"
  143176. #elif defined(__clang__)
  143177. "adcs r3, %[r]\n\t"
  143178. #else
  143179. "adc r3, %[r]\n\t"
  143180. #endif
  143181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143182. "lsrs r7, %[b], #16\n\t"
  143183. #else
  143184. "lsr r7, %[b], #16\n\t"
  143185. #endif
  143186. #ifdef WOLFSSL_KEIL
  143187. "muls r6, r7, r6\n\t"
  143188. #elif defined(__clang__)
  143189. "muls r6, r7\n\t"
  143190. #else
  143191. "mul r6, r7\n\t"
  143192. #endif
  143193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143194. "lsrs r7, r6, #16\n\t"
  143195. #else
  143196. "lsr r7, r6, #16\n\t"
  143197. #endif
  143198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143199. "lsls r6, r6, #16\n\t"
  143200. #else
  143201. "lsl r6, r6, #16\n\t"
  143202. #endif
  143203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143204. "adds r4, r4, r6\n\t"
  143205. #else
  143206. "add r4, r4, r6\n\t"
  143207. #endif
  143208. #ifdef WOLFSSL_KEIL
  143209. "adcs r5, r5, r7\n\t"
  143210. #elif defined(__clang__)
  143211. "adcs r5, r7\n\t"
  143212. #else
  143213. "adc r5, r7\n\t"
  143214. #endif
  143215. #ifdef WOLFSSL_KEIL
  143216. "adcs r3, r3, %[r]\n\t"
  143217. #elif defined(__clang__)
  143218. "adcs r3, %[r]\n\t"
  143219. #else
  143220. "adc r3, %[r]\n\t"
  143221. #endif
  143222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143223. "lsrs r6, %[a], #16\n\t"
  143224. #else
  143225. "lsr r6, %[a], #16\n\t"
  143226. #endif
  143227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143228. "lsrs r7, %[b], #16\n\t"
  143229. #else
  143230. "lsr r7, %[b], #16\n\t"
  143231. #endif
  143232. #ifdef WOLFSSL_KEIL
  143233. "muls r7, r6, r7\n\t"
  143234. #elif defined(__clang__)
  143235. "muls r7, r6\n\t"
  143236. #else
  143237. "mul r7, r6\n\t"
  143238. #endif
  143239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143240. "adds r5, r5, r7\n\t"
  143241. #else
  143242. "add r5, r5, r7\n\t"
  143243. #endif
  143244. #ifdef WOLFSSL_KEIL
  143245. "adcs r3, r3, %[r]\n\t"
  143246. #elif defined(__clang__)
  143247. "adcs r3, %[r]\n\t"
  143248. #else
  143249. "adc r3, %[r]\n\t"
  143250. #endif
  143251. "uxth r7, %[b]\n\t"
  143252. #ifdef WOLFSSL_KEIL
  143253. "muls r6, r7, r6\n\t"
  143254. #elif defined(__clang__)
  143255. "muls r6, r7\n\t"
  143256. #else
  143257. "mul r6, r7\n\t"
  143258. #endif
  143259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143260. "lsrs r7, r6, #16\n\t"
  143261. #else
  143262. "lsr r7, r6, #16\n\t"
  143263. #endif
  143264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143265. "lsls r6, r6, #16\n\t"
  143266. #else
  143267. "lsl r6, r6, #16\n\t"
  143268. #endif
  143269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143270. "adds r4, r4, r6\n\t"
  143271. #else
  143272. "add r4, r4, r6\n\t"
  143273. #endif
  143274. #ifdef WOLFSSL_KEIL
  143275. "adcs r5, r5, r7\n\t"
  143276. #elif defined(__clang__)
  143277. "adcs r5, r7\n\t"
  143278. #else
  143279. "adc r5, r7\n\t"
  143280. #endif
  143281. #ifdef WOLFSSL_KEIL
  143282. "adcs r3, r3, %[r]\n\t"
  143283. #elif defined(__clang__)
  143284. "adcs r3, %[r]\n\t"
  143285. #else
  143286. "adc r3, %[r]\n\t"
  143287. #endif
  143288. "# A[3] * B[7]\n\t"
  143289. "mov %[a], r9\n\t"
  143290. "mov %[b], r10\n\t"
  143291. "ldr %[a], [%[a], #12]\n\t"
  143292. "ldr %[b], [%[b], #28]\n\t"
  143293. "uxth r6, %[a]\n\t"
  143294. "uxth r7, %[b]\n\t"
  143295. #ifdef WOLFSSL_KEIL
  143296. "muls r7, r6, r7\n\t"
  143297. #elif defined(__clang__)
  143298. "muls r7, r6\n\t"
  143299. #else
  143300. "mul r7, r6\n\t"
  143301. #endif
  143302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143303. "adds r4, r4, r7\n\t"
  143304. #else
  143305. "add r4, r4, r7\n\t"
  143306. #endif
  143307. #ifdef WOLFSSL_KEIL
  143308. "adcs r5, r5, %[r]\n\t"
  143309. #elif defined(__clang__)
  143310. "adcs r5, %[r]\n\t"
  143311. #else
  143312. "adc r5, %[r]\n\t"
  143313. #endif
  143314. #ifdef WOLFSSL_KEIL
  143315. "adcs r3, r3, %[r]\n\t"
  143316. #elif defined(__clang__)
  143317. "adcs r3, %[r]\n\t"
  143318. #else
  143319. "adc r3, %[r]\n\t"
  143320. #endif
  143321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143322. "lsrs r7, %[b], #16\n\t"
  143323. #else
  143324. "lsr r7, %[b], #16\n\t"
  143325. #endif
  143326. #ifdef WOLFSSL_KEIL
  143327. "muls r6, r7, r6\n\t"
  143328. #elif defined(__clang__)
  143329. "muls r6, r7\n\t"
  143330. #else
  143331. "mul r6, r7\n\t"
  143332. #endif
  143333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143334. "lsrs r7, r6, #16\n\t"
  143335. #else
  143336. "lsr r7, r6, #16\n\t"
  143337. #endif
  143338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143339. "lsls r6, r6, #16\n\t"
  143340. #else
  143341. "lsl r6, r6, #16\n\t"
  143342. #endif
  143343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143344. "adds r4, r4, r6\n\t"
  143345. #else
  143346. "add r4, r4, r6\n\t"
  143347. #endif
  143348. #ifdef WOLFSSL_KEIL
  143349. "adcs r5, r5, r7\n\t"
  143350. #elif defined(__clang__)
  143351. "adcs r5, r7\n\t"
  143352. #else
  143353. "adc r5, r7\n\t"
  143354. #endif
  143355. #ifdef WOLFSSL_KEIL
  143356. "adcs r3, r3, %[r]\n\t"
  143357. #elif defined(__clang__)
  143358. "adcs r3, %[r]\n\t"
  143359. #else
  143360. "adc r3, %[r]\n\t"
  143361. #endif
  143362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143363. "lsrs r6, %[a], #16\n\t"
  143364. #else
  143365. "lsr r6, %[a], #16\n\t"
  143366. #endif
  143367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143368. "lsrs r7, %[b], #16\n\t"
  143369. #else
  143370. "lsr r7, %[b], #16\n\t"
  143371. #endif
  143372. #ifdef WOLFSSL_KEIL
  143373. "muls r7, r6, r7\n\t"
  143374. #elif defined(__clang__)
  143375. "muls r7, r6\n\t"
  143376. #else
  143377. "mul r7, r6\n\t"
  143378. #endif
  143379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143380. "adds r5, r5, r7\n\t"
  143381. #else
  143382. "add r5, r5, r7\n\t"
  143383. #endif
  143384. #ifdef WOLFSSL_KEIL
  143385. "adcs r3, r3, %[r]\n\t"
  143386. #elif defined(__clang__)
  143387. "adcs r3, %[r]\n\t"
  143388. #else
  143389. "adc r3, %[r]\n\t"
  143390. #endif
  143391. "uxth r7, %[b]\n\t"
  143392. #ifdef WOLFSSL_KEIL
  143393. "muls r6, r7, r6\n\t"
  143394. #elif defined(__clang__)
  143395. "muls r6, r7\n\t"
  143396. #else
  143397. "mul r6, r7\n\t"
  143398. #endif
  143399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143400. "lsrs r7, r6, #16\n\t"
  143401. #else
  143402. "lsr r7, r6, #16\n\t"
  143403. #endif
  143404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143405. "lsls r6, r6, #16\n\t"
  143406. #else
  143407. "lsl r6, r6, #16\n\t"
  143408. #endif
  143409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143410. "adds r4, r4, r6\n\t"
  143411. #else
  143412. "add r4, r4, r6\n\t"
  143413. #endif
  143414. #ifdef WOLFSSL_KEIL
  143415. "adcs r5, r5, r7\n\t"
  143416. #elif defined(__clang__)
  143417. "adcs r5, r7\n\t"
  143418. #else
  143419. "adc r5, r7\n\t"
  143420. #endif
  143421. #ifdef WOLFSSL_KEIL
  143422. "adcs r3, r3, %[r]\n\t"
  143423. #elif defined(__clang__)
  143424. "adcs r3, %[r]\n\t"
  143425. #else
  143426. "adc r3, %[r]\n\t"
  143427. #endif
  143428. "# A[2] * B[8]\n\t"
  143429. "mov %[a], r9\n\t"
  143430. "mov %[b], r10\n\t"
  143431. "ldr %[a], [%[a], #8]\n\t"
  143432. "ldr %[b], [%[b], #32]\n\t"
  143433. "uxth r6, %[a]\n\t"
  143434. "uxth r7, %[b]\n\t"
  143435. #ifdef WOLFSSL_KEIL
  143436. "muls r7, r6, r7\n\t"
  143437. #elif defined(__clang__)
  143438. "muls r7, r6\n\t"
  143439. #else
  143440. "mul r7, r6\n\t"
  143441. #endif
  143442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143443. "adds r4, r4, r7\n\t"
  143444. #else
  143445. "add r4, r4, r7\n\t"
  143446. #endif
  143447. #ifdef WOLFSSL_KEIL
  143448. "adcs r5, r5, %[r]\n\t"
  143449. #elif defined(__clang__)
  143450. "adcs r5, %[r]\n\t"
  143451. #else
  143452. "adc r5, %[r]\n\t"
  143453. #endif
  143454. #ifdef WOLFSSL_KEIL
  143455. "adcs r3, r3, %[r]\n\t"
  143456. #elif defined(__clang__)
  143457. "adcs r3, %[r]\n\t"
  143458. #else
  143459. "adc r3, %[r]\n\t"
  143460. #endif
  143461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143462. "lsrs r7, %[b], #16\n\t"
  143463. #else
  143464. "lsr r7, %[b], #16\n\t"
  143465. #endif
  143466. #ifdef WOLFSSL_KEIL
  143467. "muls r6, r7, r6\n\t"
  143468. #elif defined(__clang__)
  143469. "muls r6, r7\n\t"
  143470. #else
  143471. "mul r6, r7\n\t"
  143472. #endif
  143473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143474. "lsrs r7, r6, #16\n\t"
  143475. #else
  143476. "lsr r7, r6, #16\n\t"
  143477. #endif
  143478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143479. "lsls r6, r6, #16\n\t"
  143480. #else
  143481. "lsl r6, r6, #16\n\t"
  143482. #endif
  143483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143484. "adds r4, r4, r6\n\t"
  143485. #else
  143486. "add r4, r4, r6\n\t"
  143487. #endif
  143488. #ifdef WOLFSSL_KEIL
  143489. "adcs r5, r5, r7\n\t"
  143490. #elif defined(__clang__)
  143491. "adcs r5, r7\n\t"
  143492. #else
  143493. "adc r5, r7\n\t"
  143494. #endif
  143495. #ifdef WOLFSSL_KEIL
  143496. "adcs r3, r3, %[r]\n\t"
  143497. #elif defined(__clang__)
  143498. "adcs r3, %[r]\n\t"
  143499. #else
  143500. "adc r3, %[r]\n\t"
  143501. #endif
  143502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143503. "lsrs r6, %[a], #16\n\t"
  143504. #else
  143505. "lsr r6, %[a], #16\n\t"
  143506. #endif
  143507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143508. "lsrs r7, %[b], #16\n\t"
  143509. #else
  143510. "lsr r7, %[b], #16\n\t"
  143511. #endif
  143512. #ifdef WOLFSSL_KEIL
  143513. "muls r7, r6, r7\n\t"
  143514. #elif defined(__clang__)
  143515. "muls r7, r6\n\t"
  143516. #else
  143517. "mul r7, r6\n\t"
  143518. #endif
  143519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143520. "adds r5, r5, r7\n\t"
  143521. #else
  143522. "add r5, r5, r7\n\t"
  143523. #endif
  143524. #ifdef WOLFSSL_KEIL
  143525. "adcs r3, r3, %[r]\n\t"
  143526. #elif defined(__clang__)
  143527. "adcs r3, %[r]\n\t"
  143528. #else
  143529. "adc r3, %[r]\n\t"
  143530. #endif
  143531. "uxth r7, %[b]\n\t"
  143532. #ifdef WOLFSSL_KEIL
  143533. "muls r6, r7, r6\n\t"
  143534. #elif defined(__clang__)
  143535. "muls r6, r7\n\t"
  143536. #else
  143537. "mul r6, r7\n\t"
  143538. #endif
  143539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143540. "lsrs r7, r6, #16\n\t"
  143541. #else
  143542. "lsr r7, r6, #16\n\t"
  143543. #endif
  143544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143545. "lsls r6, r6, #16\n\t"
  143546. #else
  143547. "lsl r6, r6, #16\n\t"
  143548. #endif
  143549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143550. "adds r4, r4, r6\n\t"
  143551. #else
  143552. "add r4, r4, r6\n\t"
  143553. #endif
  143554. #ifdef WOLFSSL_KEIL
  143555. "adcs r5, r5, r7\n\t"
  143556. #elif defined(__clang__)
  143557. "adcs r5, r7\n\t"
  143558. #else
  143559. "adc r5, r7\n\t"
  143560. #endif
  143561. #ifdef WOLFSSL_KEIL
  143562. "adcs r3, r3, %[r]\n\t"
  143563. #elif defined(__clang__)
  143564. "adcs r3, %[r]\n\t"
  143565. #else
  143566. "adc r3, %[r]\n\t"
  143567. #endif
  143568. "# A[1] * B[9]\n\t"
  143569. "mov %[a], r9\n\t"
  143570. "mov %[b], r10\n\t"
  143571. "ldr %[a], [%[a], #4]\n\t"
  143572. "ldr %[b], [%[b], #36]\n\t"
  143573. "uxth r6, %[a]\n\t"
  143574. "uxth r7, %[b]\n\t"
  143575. #ifdef WOLFSSL_KEIL
  143576. "muls r7, r6, r7\n\t"
  143577. #elif defined(__clang__)
  143578. "muls r7, r6\n\t"
  143579. #else
  143580. "mul r7, r6\n\t"
  143581. #endif
  143582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143583. "adds r4, r4, r7\n\t"
  143584. #else
  143585. "add r4, r4, r7\n\t"
  143586. #endif
  143587. #ifdef WOLFSSL_KEIL
  143588. "adcs r5, r5, %[r]\n\t"
  143589. #elif defined(__clang__)
  143590. "adcs r5, %[r]\n\t"
  143591. #else
  143592. "adc r5, %[r]\n\t"
  143593. #endif
  143594. #ifdef WOLFSSL_KEIL
  143595. "adcs r3, r3, %[r]\n\t"
  143596. #elif defined(__clang__)
  143597. "adcs r3, %[r]\n\t"
  143598. #else
  143599. "adc r3, %[r]\n\t"
  143600. #endif
  143601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143602. "lsrs r7, %[b], #16\n\t"
  143603. #else
  143604. "lsr r7, %[b], #16\n\t"
  143605. #endif
  143606. #ifdef WOLFSSL_KEIL
  143607. "muls r6, r7, r6\n\t"
  143608. #elif defined(__clang__)
  143609. "muls r6, r7\n\t"
  143610. #else
  143611. "mul r6, r7\n\t"
  143612. #endif
  143613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143614. "lsrs r7, r6, #16\n\t"
  143615. #else
  143616. "lsr r7, r6, #16\n\t"
  143617. #endif
  143618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143619. "lsls r6, r6, #16\n\t"
  143620. #else
  143621. "lsl r6, r6, #16\n\t"
  143622. #endif
  143623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143624. "adds r4, r4, r6\n\t"
  143625. #else
  143626. "add r4, r4, r6\n\t"
  143627. #endif
  143628. #ifdef WOLFSSL_KEIL
  143629. "adcs r5, r5, r7\n\t"
  143630. #elif defined(__clang__)
  143631. "adcs r5, r7\n\t"
  143632. #else
  143633. "adc r5, r7\n\t"
  143634. #endif
  143635. #ifdef WOLFSSL_KEIL
  143636. "adcs r3, r3, %[r]\n\t"
  143637. #elif defined(__clang__)
  143638. "adcs r3, %[r]\n\t"
  143639. #else
  143640. "adc r3, %[r]\n\t"
  143641. #endif
  143642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143643. "lsrs r6, %[a], #16\n\t"
  143644. #else
  143645. "lsr r6, %[a], #16\n\t"
  143646. #endif
  143647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143648. "lsrs r7, %[b], #16\n\t"
  143649. #else
  143650. "lsr r7, %[b], #16\n\t"
  143651. #endif
  143652. #ifdef WOLFSSL_KEIL
  143653. "muls r7, r6, r7\n\t"
  143654. #elif defined(__clang__)
  143655. "muls r7, r6\n\t"
  143656. #else
  143657. "mul r7, r6\n\t"
  143658. #endif
  143659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143660. "adds r5, r5, r7\n\t"
  143661. #else
  143662. "add r5, r5, r7\n\t"
  143663. #endif
  143664. #ifdef WOLFSSL_KEIL
  143665. "adcs r3, r3, %[r]\n\t"
  143666. #elif defined(__clang__)
  143667. "adcs r3, %[r]\n\t"
  143668. #else
  143669. "adc r3, %[r]\n\t"
  143670. #endif
  143671. "uxth r7, %[b]\n\t"
  143672. #ifdef WOLFSSL_KEIL
  143673. "muls r6, r7, r6\n\t"
  143674. #elif defined(__clang__)
  143675. "muls r6, r7\n\t"
  143676. #else
  143677. "mul r6, r7\n\t"
  143678. #endif
  143679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143680. "lsrs r7, r6, #16\n\t"
  143681. #else
  143682. "lsr r7, r6, #16\n\t"
  143683. #endif
  143684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143685. "lsls r6, r6, #16\n\t"
  143686. #else
  143687. "lsl r6, r6, #16\n\t"
  143688. #endif
  143689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143690. "adds r4, r4, r6\n\t"
  143691. #else
  143692. "add r4, r4, r6\n\t"
  143693. #endif
  143694. #ifdef WOLFSSL_KEIL
  143695. "adcs r5, r5, r7\n\t"
  143696. #elif defined(__clang__)
  143697. "adcs r5, r7\n\t"
  143698. #else
  143699. "adc r5, r7\n\t"
  143700. #endif
  143701. #ifdef WOLFSSL_KEIL
  143702. "adcs r3, r3, %[r]\n\t"
  143703. #elif defined(__clang__)
  143704. "adcs r3, %[r]\n\t"
  143705. #else
  143706. "adc r3, %[r]\n\t"
  143707. #endif
  143708. "# A[0] * B[10]\n\t"
  143709. "mov %[a], r9\n\t"
  143710. "mov %[b], r10\n\t"
  143711. "ldr %[a], [%[a]]\n\t"
  143712. "ldr %[b], [%[b], #40]\n\t"
  143713. "uxth r6, %[a]\n\t"
  143714. "uxth r7, %[b]\n\t"
  143715. #ifdef WOLFSSL_KEIL
  143716. "muls r7, r6, r7\n\t"
  143717. #elif defined(__clang__)
  143718. "muls r7, r6\n\t"
  143719. #else
  143720. "mul r7, r6\n\t"
  143721. #endif
  143722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143723. "adds r4, r4, r7\n\t"
  143724. #else
  143725. "add r4, r4, r7\n\t"
  143726. #endif
  143727. #ifdef WOLFSSL_KEIL
  143728. "adcs r5, r5, %[r]\n\t"
  143729. #elif defined(__clang__)
  143730. "adcs r5, %[r]\n\t"
  143731. #else
  143732. "adc r5, %[r]\n\t"
  143733. #endif
  143734. #ifdef WOLFSSL_KEIL
  143735. "adcs r3, r3, %[r]\n\t"
  143736. #elif defined(__clang__)
  143737. "adcs r3, %[r]\n\t"
  143738. #else
  143739. "adc r3, %[r]\n\t"
  143740. #endif
  143741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143742. "lsrs r7, %[b], #16\n\t"
  143743. #else
  143744. "lsr r7, %[b], #16\n\t"
  143745. #endif
  143746. #ifdef WOLFSSL_KEIL
  143747. "muls r6, r7, r6\n\t"
  143748. #elif defined(__clang__)
  143749. "muls r6, r7\n\t"
  143750. #else
  143751. "mul r6, r7\n\t"
  143752. #endif
  143753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143754. "lsrs r7, r6, #16\n\t"
  143755. #else
  143756. "lsr r7, r6, #16\n\t"
  143757. #endif
  143758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143759. "lsls r6, r6, #16\n\t"
  143760. #else
  143761. "lsl r6, r6, #16\n\t"
  143762. #endif
  143763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143764. "adds r4, r4, r6\n\t"
  143765. #else
  143766. "add r4, r4, r6\n\t"
  143767. #endif
  143768. #ifdef WOLFSSL_KEIL
  143769. "adcs r5, r5, r7\n\t"
  143770. #elif defined(__clang__)
  143771. "adcs r5, r7\n\t"
  143772. #else
  143773. "adc r5, r7\n\t"
  143774. #endif
  143775. #ifdef WOLFSSL_KEIL
  143776. "adcs r3, r3, %[r]\n\t"
  143777. #elif defined(__clang__)
  143778. "adcs r3, %[r]\n\t"
  143779. #else
  143780. "adc r3, %[r]\n\t"
  143781. #endif
  143782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143783. "lsrs r6, %[a], #16\n\t"
  143784. #else
  143785. "lsr r6, %[a], #16\n\t"
  143786. #endif
  143787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143788. "lsrs r7, %[b], #16\n\t"
  143789. #else
  143790. "lsr r7, %[b], #16\n\t"
  143791. #endif
  143792. #ifdef WOLFSSL_KEIL
  143793. "muls r7, r6, r7\n\t"
  143794. #elif defined(__clang__)
  143795. "muls r7, r6\n\t"
  143796. #else
  143797. "mul r7, r6\n\t"
  143798. #endif
  143799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143800. "adds r5, r5, r7\n\t"
  143801. #else
  143802. "add r5, r5, r7\n\t"
  143803. #endif
  143804. #ifdef WOLFSSL_KEIL
  143805. "adcs r3, r3, %[r]\n\t"
  143806. #elif defined(__clang__)
  143807. "adcs r3, %[r]\n\t"
  143808. #else
  143809. "adc r3, %[r]\n\t"
  143810. #endif
  143811. "uxth r7, %[b]\n\t"
  143812. #ifdef WOLFSSL_KEIL
  143813. "muls r6, r7, r6\n\t"
  143814. #elif defined(__clang__)
  143815. "muls r6, r7\n\t"
  143816. #else
  143817. "mul r6, r7\n\t"
  143818. #endif
  143819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143820. "lsrs r7, r6, #16\n\t"
  143821. #else
  143822. "lsr r7, r6, #16\n\t"
  143823. #endif
  143824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143825. "lsls r6, r6, #16\n\t"
  143826. #else
  143827. "lsl r6, r6, #16\n\t"
  143828. #endif
  143829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143830. "adds r4, r4, r6\n\t"
  143831. #else
  143832. "add r4, r4, r6\n\t"
  143833. #endif
  143834. #ifdef WOLFSSL_KEIL
  143835. "adcs r5, r5, r7\n\t"
  143836. #elif defined(__clang__)
  143837. "adcs r5, r7\n\t"
  143838. #else
  143839. "adc r5, r7\n\t"
  143840. #endif
  143841. #ifdef WOLFSSL_KEIL
  143842. "adcs r3, r3, %[r]\n\t"
  143843. #elif defined(__clang__)
  143844. "adcs r3, %[r]\n\t"
  143845. #else
  143846. "adc r3, %[r]\n\t"
  143847. #endif
  143848. "str r4, [sp, #40]\n\t"
  143849. "# A[0] * B[11]\n\t"
  143850. "movs r4, #0\n\t"
  143851. "mov %[a], r9\n\t"
  143852. "mov %[b], r10\n\t"
  143853. "ldr %[a], [%[a]]\n\t"
  143854. "ldr %[b], [%[b], #44]\n\t"
  143855. "uxth r6, %[a]\n\t"
  143856. "uxth r7, %[b]\n\t"
  143857. #ifdef WOLFSSL_KEIL
  143858. "muls r7, r6, r7\n\t"
  143859. #elif defined(__clang__)
  143860. "muls r7, r6\n\t"
  143861. #else
  143862. "mul r7, r6\n\t"
  143863. #endif
  143864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143865. "adds r5, r5, r7\n\t"
  143866. #else
  143867. "add r5, r5, r7\n\t"
  143868. #endif
  143869. #ifdef WOLFSSL_KEIL
  143870. "adcs r3, r3, %[r]\n\t"
  143871. #elif defined(__clang__)
  143872. "adcs r3, %[r]\n\t"
  143873. #else
  143874. "adc r3, %[r]\n\t"
  143875. #endif
  143876. #ifdef WOLFSSL_KEIL
  143877. "adcs r4, r4, %[r]\n\t"
  143878. #elif defined(__clang__)
  143879. "adcs r4, %[r]\n\t"
  143880. #else
  143881. "adc r4, %[r]\n\t"
  143882. #endif
  143883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143884. "lsrs r7, %[b], #16\n\t"
  143885. #else
  143886. "lsr r7, %[b], #16\n\t"
  143887. #endif
  143888. #ifdef WOLFSSL_KEIL
  143889. "muls r6, r7, r6\n\t"
  143890. #elif defined(__clang__)
  143891. "muls r6, r7\n\t"
  143892. #else
  143893. "mul r6, r7\n\t"
  143894. #endif
  143895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143896. "lsrs r7, r6, #16\n\t"
  143897. #else
  143898. "lsr r7, r6, #16\n\t"
  143899. #endif
  143900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143901. "lsls r6, r6, #16\n\t"
  143902. #else
  143903. "lsl r6, r6, #16\n\t"
  143904. #endif
  143905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143906. "adds r5, r5, r6\n\t"
  143907. #else
  143908. "add r5, r5, r6\n\t"
  143909. #endif
  143910. #ifdef WOLFSSL_KEIL
  143911. "adcs r3, r3, r7\n\t"
  143912. #elif defined(__clang__)
  143913. "adcs r3, r7\n\t"
  143914. #else
  143915. "adc r3, r7\n\t"
  143916. #endif
  143917. #ifdef WOLFSSL_KEIL
  143918. "adcs r4, r4, %[r]\n\t"
  143919. #elif defined(__clang__)
  143920. "adcs r4, %[r]\n\t"
  143921. #else
  143922. "adc r4, %[r]\n\t"
  143923. #endif
  143924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143925. "lsrs r6, %[a], #16\n\t"
  143926. #else
  143927. "lsr r6, %[a], #16\n\t"
  143928. #endif
  143929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143930. "lsrs r7, %[b], #16\n\t"
  143931. #else
  143932. "lsr r7, %[b], #16\n\t"
  143933. #endif
  143934. #ifdef WOLFSSL_KEIL
  143935. "muls r7, r6, r7\n\t"
  143936. #elif defined(__clang__)
  143937. "muls r7, r6\n\t"
  143938. #else
  143939. "mul r7, r6\n\t"
  143940. #endif
  143941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143942. "adds r3, r3, r7\n\t"
  143943. #else
  143944. "add r3, r3, r7\n\t"
  143945. #endif
  143946. #ifdef WOLFSSL_KEIL
  143947. "adcs r4, r4, %[r]\n\t"
  143948. #elif defined(__clang__)
  143949. "adcs r4, %[r]\n\t"
  143950. #else
  143951. "adc r4, %[r]\n\t"
  143952. #endif
  143953. "uxth r7, %[b]\n\t"
  143954. #ifdef WOLFSSL_KEIL
  143955. "muls r6, r7, r6\n\t"
  143956. #elif defined(__clang__)
  143957. "muls r6, r7\n\t"
  143958. #else
  143959. "mul r6, r7\n\t"
  143960. #endif
  143961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143962. "lsrs r7, r6, #16\n\t"
  143963. #else
  143964. "lsr r7, r6, #16\n\t"
  143965. #endif
  143966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143967. "lsls r6, r6, #16\n\t"
  143968. #else
  143969. "lsl r6, r6, #16\n\t"
  143970. #endif
  143971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143972. "adds r5, r5, r6\n\t"
  143973. #else
  143974. "add r5, r5, r6\n\t"
  143975. #endif
  143976. #ifdef WOLFSSL_KEIL
  143977. "adcs r3, r3, r7\n\t"
  143978. #elif defined(__clang__)
  143979. "adcs r3, r7\n\t"
  143980. #else
  143981. "adc r3, r7\n\t"
  143982. #endif
  143983. #ifdef WOLFSSL_KEIL
  143984. "adcs r4, r4, %[r]\n\t"
  143985. #elif defined(__clang__)
  143986. "adcs r4, %[r]\n\t"
  143987. #else
  143988. "adc r4, %[r]\n\t"
  143989. #endif
  143990. "# A[1] * B[10]\n\t"
  143991. "mov %[a], r9\n\t"
  143992. "mov %[b], r10\n\t"
  143993. "ldr %[a], [%[a], #4]\n\t"
  143994. "ldr %[b], [%[b], #40]\n\t"
  143995. "uxth r6, %[a]\n\t"
  143996. "uxth r7, %[b]\n\t"
  143997. #ifdef WOLFSSL_KEIL
  143998. "muls r7, r6, r7\n\t"
  143999. #elif defined(__clang__)
  144000. "muls r7, r6\n\t"
  144001. #else
  144002. "mul r7, r6\n\t"
  144003. #endif
  144004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144005. "adds r5, r5, r7\n\t"
  144006. #else
  144007. "add r5, r5, r7\n\t"
  144008. #endif
  144009. #ifdef WOLFSSL_KEIL
  144010. "adcs r3, r3, %[r]\n\t"
  144011. #elif defined(__clang__)
  144012. "adcs r3, %[r]\n\t"
  144013. #else
  144014. "adc r3, %[r]\n\t"
  144015. #endif
  144016. #ifdef WOLFSSL_KEIL
  144017. "adcs r4, r4, %[r]\n\t"
  144018. #elif defined(__clang__)
  144019. "adcs r4, %[r]\n\t"
  144020. #else
  144021. "adc r4, %[r]\n\t"
  144022. #endif
  144023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144024. "lsrs r7, %[b], #16\n\t"
  144025. #else
  144026. "lsr r7, %[b], #16\n\t"
  144027. #endif
  144028. #ifdef WOLFSSL_KEIL
  144029. "muls r6, r7, r6\n\t"
  144030. #elif defined(__clang__)
  144031. "muls r6, r7\n\t"
  144032. #else
  144033. "mul r6, r7\n\t"
  144034. #endif
  144035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144036. "lsrs r7, r6, #16\n\t"
  144037. #else
  144038. "lsr r7, r6, #16\n\t"
  144039. #endif
  144040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144041. "lsls r6, r6, #16\n\t"
  144042. #else
  144043. "lsl r6, r6, #16\n\t"
  144044. #endif
  144045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144046. "adds r5, r5, r6\n\t"
  144047. #else
  144048. "add r5, r5, r6\n\t"
  144049. #endif
  144050. #ifdef WOLFSSL_KEIL
  144051. "adcs r3, r3, r7\n\t"
  144052. #elif defined(__clang__)
  144053. "adcs r3, r7\n\t"
  144054. #else
  144055. "adc r3, r7\n\t"
  144056. #endif
  144057. #ifdef WOLFSSL_KEIL
  144058. "adcs r4, r4, %[r]\n\t"
  144059. #elif defined(__clang__)
  144060. "adcs r4, %[r]\n\t"
  144061. #else
  144062. "adc r4, %[r]\n\t"
  144063. #endif
  144064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144065. "lsrs r6, %[a], #16\n\t"
  144066. #else
  144067. "lsr r6, %[a], #16\n\t"
  144068. #endif
  144069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144070. "lsrs r7, %[b], #16\n\t"
  144071. #else
  144072. "lsr r7, %[b], #16\n\t"
  144073. #endif
  144074. #ifdef WOLFSSL_KEIL
  144075. "muls r7, r6, r7\n\t"
  144076. #elif defined(__clang__)
  144077. "muls r7, r6\n\t"
  144078. #else
  144079. "mul r7, r6\n\t"
  144080. #endif
  144081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144082. "adds r3, r3, r7\n\t"
  144083. #else
  144084. "add r3, r3, r7\n\t"
  144085. #endif
  144086. #ifdef WOLFSSL_KEIL
  144087. "adcs r4, r4, %[r]\n\t"
  144088. #elif defined(__clang__)
  144089. "adcs r4, %[r]\n\t"
  144090. #else
  144091. "adc r4, %[r]\n\t"
  144092. #endif
  144093. "uxth r7, %[b]\n\t"
  144094. #ifdef WOLFSSL_KEIL
  144095. "muls r6, r7, r6\n\t"
  144096. #elif defined(__clang__)
  144097. "muls r6, r7\n\t"
  144098. #else
  144099. "mul r6, r7\n\t"
  144100. #endif
  144101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144102. "lsrs r7, r6, #16\n\t"
  144103. #else
  144104. "lsr r7, r6, #16\n\t"
  144105. #endif
  144106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144107. "lsls r6, r6, #16\n\t"
  144108. #else
  144109. "lsl r6, r6, #16\n\t"
  144110. #endif
  144111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144112. "adds r5, r5, r6\n\t"
  144113. #else
  144114. "add r5, r5, r6\n\t"
  144115. #endif
  144116. #ifdef WOLFSSL_KEIL
  144117. "adcs r3, r3, r7\n\t"
  144118. #elif defined(__clang__)
  144119. "adcs r3, r7\n\t"
  144120. #else
  144121. "adc r3, r7\n\t"
  144122. #endif
  144123. #ifdef WOLFSSL_KEIL
  144124. "adcs r4, r4, %[r]\n\t"
  144125. #elif defined(__clang__)
  144126. "adcs r4, %[r]\n\t"
  144127. #else
  144128. "adc r4, %[r]\n\t"
  144129. #endif
  144130. "# A[2] * B[9]\n\t"
  144131. "mov %[a], r9\n\t"
  144132. "mov %[b], r10\n\t"
  144133. "ldr %[a], [%[a], #8]\n\t"
  144134. "ldr %[b], [%[b], #36]\n\t"
  144135. "uxth r6, %[a]\n\t"
  144136. "uxth r7, %[b]\n\t"
  144137. #ifdef WOLFSSL_KEIL
  144138. "muls r7, r6, r7\n\t"
  144139. #elif defined(__clang__)
  144140. "muls r7, r6\n\t"
  144141. #else
  144142. "mul r7, r6\n\t"
  144143. #endif
  144144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144145. "adds r5, r5, r7\n\t"
  144146. #else
  144147. "add r5, r5, r7\n\t"
  144148. #endif
  144149. #ifdef WOLFSSL_KEIL
  144150. "adcs r3, r3, %[r]\n\t"
  144151. #elif defined(__clang__)
  144152. "adcs r3, %[r]\n\t"
  144153. #else
  144154. "adc r3, %[r]\n\t"
  144155. #endif
  144156. #ifdef WOLFSSL_KEIL
  144157. "adcs r4, r4, %[r]\n\t"
  144158. #elif defined(__clang__)
  144159. "adcs r4, %[r]\n\t"
  144160. #else
  144161. "adc r4, %[r]\n\t"
  144162. #endif
  144163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144164. "lsrs r7, %[b], #16\n\t"
  144165. #else
  144166. "lsr r7, %[b], #16\n\t"
  144167. #endif
  144168. #ifdef WOLFSSL_KEIL
  144169. "muls r6, r7, r6\n\t"
  144170. #elif defined(__clang__)
  144171. "muls r6, r7\n\t"
  144172. #else
  144173. "mul r6, r7\n\t"
  144174. #endif
  144175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144176. "lsrs r7, r6, #16\n\t"
  144177. #else
  144178. "lsr r7, r6, #16\n\t"
  144179. #endif
  144180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144181. "lsls r6, r6, #16\n\t"
  144182. #else
  144183. "lsl r6, r6, #16\n\t"
  144184. #endif
  144185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144186. "adds r5, r5, r6\n\t"
  144187. #else
  144188. "add r5, r5, r6\n\t"
  144189. #endif
  144190. #ifdef WOLFSSL_KEIL
  144191. "adcs r3, r3, r7\n\t"
  144192. #elif defined(__clang__)
  144193. "adcs r3, r7\n\t"
  144194. #else
  144195. "adc r3, r7\n\t"
  144196. #endif
  144197. #ifdef WOLFSSL_KEIL
  144198. "adcs r4, r4, %[r]\n\t"
  144199. #elif defined(__clang__)
  144200. "adcs r4, %[r]\n\t"
  144201. #else
  144202. "adc r4, %[r]\n\t"
  144203. #endif
  144204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144205. "lsrs r6, %[a], #16\n\t"
  144206. #else
  144207. "lsr r6, %[a], #16\n\t"
  144208. #endif
  144209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144210. "lsrs r7, %[b], #16\n\t"
  144211. #else
  144212. "lsr r7, %[b], #16\n\t"
  144213. #endif
  144214. #ifdef WOLFSSL_KEIL
  144215. "muls r7, r6, r7\n\t"
  144216. #elif defined(__clang__)
  144217. "muls r7, r6\n\t"
  144218. #else
  144219. "mul r7, r6\n\t"
  144220. #endif
  144221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144222. "adds r3, r3, r7\n\t"
  144223. #else
  144224. "add r3, r3, r7\n\t"
  144225. #endif
  144226. #ifdef WOLFSSL_KEIL
  144227. "adcs r4, r4, %[r]\n\t"
  144228. #elif defined(__clang__)
  144229. "adcs r4, %[r]\n\t"
  144230. #else
  144231. "adc r4, %[r]\n\t"
  144232. #endif
  144233. "uxth r7, %[b]\n\t"
  144234. #ifdef WOLFSSL_KEIL
  144235. "muls r6, r7, r6\n\t"
  144236. #elif defined(__clang__)
  144237. "muls r6, r7\n\t"
  144238. #else
  144239. "mul r6, r7\n\t"
  144240. #endif
  144241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144242. "lsrs r7, r6, #16\n\t"
  144243. #else
  144244. "lsr r7, r6, #16\n\t"
  144245. #endif
  144246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144247. "lsls r6, r6, #16\n\t"
  144248. #else
  144249. "lsl r6, r6, #16\n\t"
  144250. #endif
  144251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144252. "adds r5, r5, r6\n\t"
  144253. #else
  144254. "add r5, r5, r6\n\t"
  144255. #endif
  144256. #ifdef WOLFSSL_KEIL
  144257. "adcs r3, r3, r7\n\t"
  144258. #elif defined(__clang__)
  144259. "adcs r3, r7\n\t"
  144260. #else
  144261. "adc r3, r7\n\t"
  144262. #endif
  144263. #ifdef WOLFSSL_KEIL
  144264. "adcs r4, r4, %[r]\n\t"
  144265. #elif defined(__clang__)
  144266. "adcs r4, %[r]\n\t"
  144267. #else
  144268. "adc r4, %[r]\n\t"
  144269. #endif
  144270. "# A[3] * B[8]\n\t"
  144271. "mov %[a], r9\n\t"
  144272. "mov %[b], r10\n\t"
  144273. "ldr %[a], [%[a], #12]\n\t"
  144274. "ldr %[b], [%[b], #32]\n\t"
  144275. "uxth r6, %[a]\n\t"
  144276. "uxth r7, %[b]\n\t"
  144277. #ifdef WOLFSSL_KEIL
  144278. "muls r7, r6, r7\n\t"
  144279. #elif defined(__clang__)
  144280. "muls r7, r6\n\t"
  144281. #else
  144282. "mul r7, r6\n\t"
  144283. #endif
  144284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144285. "adds r5, r5, r7\n\t"
  144286. #else
  144287. "add r5, r5, r7\n\t"
  144288. #endif
  144289. #ifdef WOLFSSL_KEIL
  144290. "adcs r3, r3, %[r]\n\t"
  144291. #elif defined(__clang__)
  144292. "adcs r3, %[r]\n\t"
  144293. #else
  144294. "adc r3, %[r]\n\t"
  144295. #endif
  144296. #ifdef WOLFSSL_KEIL
  144297. "adcs r4, r4, %[r]\n\t"
  144298. #elif defined(__clang__)
  144299. "adcs r4, %[r]\n\t"
  144300. #else
  144301. "adc r4, %[r]\n\t"
  144302. #endif
  144303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144304. "lsrs r7, %[b], #16\n\t"
  144305. #else
  144306. "lsr r7, %[b], #16\n\t"
  144307. #endif
  144308. #ifdef WOLFSSL_KEIL
  144309. "muls r6, r7, r6\n\t"
  144310. #elif defined(__clang__)
  144311. "muls r6, r7\n\t"
  144312. #else
  144313. "mul r6, r7\n\t"
  144314. #endif
  144315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144316. "lsrs r7, r6, #16\n\t"
  144317. #else
  144318. "lsr r7, r6, #16\n\t"
  144319. #endif
  144320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144321. "lsls r6, r6, #16\n\t"
  144322. #else
  144323. "lsl r6, r6, #16\n\t"
  144324. #endif
  144325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144326. "adds r5, r5, r6\n\t"
  144327. #else
  144328. "add r5, r5, r6\n\t"
  144329. #endif
  144330. #ifdef WOLFSSL_KEIL
  144331. "adcs r3, r3, r7\n\t"
  144332. #elif defined(__clang__)
  144333. "adcs r3, r7\n\t"
  144334. #else
  144335. "adc r3, r7\n\t"
  144336. #endif
  144337. #ifdef WOLFSSL_KEIL
  144338. "adcs r4, r4, %[r]\n\t"
  144339. #elif defined(__clang__)
  144340. "adcs r4, %[r]\n\t"
  144341. #else
  144342. "adc r4, %[r]\n\t"
  144343. #endif
  144344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144345. "lsrs r6, %[a], #16\n\t"
  144346. #else
  144347. "lsr r6, %[a], #16\n\t"
  144348. #endif
  144349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144350. "lsrs r7, %[b], #16\n\t"
  144351. #else
  144352. "lsr r7, %[b], #16\n\t"
  144353. #endif
  144354. #ifdef WOLFSSL_KEIL
  144355. "muls r7, r6, r7\n\t"
  144356. #elif defined(__clang__)
  144357. "muls r7, r6\n\t"
  144358. #else
  144359. "mul r7, r6\n\t"
  144360. #endif
  144361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144362. "adds r3, r3, r7\n\t"
  144363. #else
  144364. "add r3, r3, r7\n\t"
  144365. #endif
  144366. #ifdef WOLFSSL_KEIL
  144367. "adcs r4, r4, %[r]\n\t"
  144368. #elif defined(__clang__)
  144369. "adcs r4, %[r]\n\t"
  144370. #else
  144371. "adc r4, %[r]\n\t"
  144372. #endif
  144373. "uxth r7, %[b]\n\t"
  144374. #ifdef WOLFSSL_KEIL
  144375. "muls r6, r7, r6\n\t"
  144376. #elif defined(__clang__)
  144377. "muls r6, r7\n\t"
  144378. #else
  144379. "mul r6, r7\n\t"
  144380. #endif
  144381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144382. "lsrs r7, r6, #16\n\t"
  144383. #else
  144384. "lsr r7, r6, #16\n\t"
  144385. #endif
  144386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144387. "lsls r6, r6, #16\n\t"
  144388. #else
  144389. "lsl r6, r6, #16\n\t"
  144390. #endif
  144391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144392. "adds r5, r5, r6\n\t"
  144393. #else
  144394. "add r5, r5, r6\n\t"
  144395. #endif
  144396. #ifdef WOLFSSL_KEIL
  144397. "adcs r3, r3, r7\n\t"
  144398. #elif defined(__clang__)
  144399. "adcs r3, r7\n\t"
  144400. #else
  144401. "adc r3, r7\n\t"
  144402. #endif
  144403. #ifdef WOLFSSL_KEIL
  144404. "adcs r4, r4, %[r]\n\t"
  144405. #elif defined(__clang__)
  144406. "adcs r4, %[r]\n\t"
  144407. #else
  144408. "adc r4, %[r]\n\t"
  144409. #endif
  144410. "# A[4] * B[7]\n\t"
  144411. "mov %[a], r9\n\t"
  144412. "mov %[b], r10\n\t"
  144413. "ldr %[a], [%[a], #16]\n\t"
  144414. "ldr %[b], [%[b], #28]\n\t"
  144415. "uxth r6, %[a]\n\t"
  144416. "uxth r7, %[b]\n\t"
  144417. #ifdef WOLFSSL_KEIL
  144418. "muls r7, r6, r7\n\t"
  144419. #elif defined(__clang__)
  144420. "muls r7, r6\n\t"
  144421. #else
  144422. "mul r7, r6\n\t"
  144423. #endif
  144424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144425. "adds r5, r5, r7\n\t"
  144426. #else
  144427. "add r5, r5, r7\n\t"
  144428. #endif
  144429. #ifdef WOLFSSL_KEIL
  144430. "adcs r3, r3, %[r]\n\t"
  144431. #elif defined(__clang__)
  144432. "adcs r3, %[r]\n\t"
  144433. #else
  144434. "adc r3, %[r]\n\t"
  144435. #endif
  144436. #ifdef WOLFSSL_KEIL
  144437. "adcs r4, r4, %[r]\n\t"
  144438. #elif defined(__clang__)
  144439. "adcs r4, %[r]\n\t"
  144440. #else
  144441. "adc r4, %[r]\n\t"
  144442. #endif
  144443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144444. "lsrs r7, %[b], #16\n\t"
  144445. #else
  144446. "lsr r7, %[b], #16\n\t"
  144447. #endif
  144448. #ifdef WOLFSSL_KEIL
  144449. "muls r6, r7, r6\n\t"
  144450. #elif defined(__clang__)
  144451. "muls r6, r7\n\t"
  144452. #else
  144453. "mul r6, r7\n\t"
  144454. #endif
  144455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144456. "lsrs r7, r6, #16\n\t"
  144457. #else
  144458. "lsr r7, r6, #16\n\t"
  144459. #endif
  144460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144461. "lsls r6, r6, #16\n\t"
  144462. #else
  144463. "lsl r6, r6, #16\n\t"
  144464. #endif
  144465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144466. "adds r5, r5, r6\n\t"
  144467. #else
  144468. "add r5, r5, r6\n\t"
  144469. #endif
  144470. #ifdef WOLFSSL_KEIL
  144471. "adcs r3, r3, r7\n\t"
  144472. #elif defined(__clang__)
  144473. "adcs r3, r7\n\t"
  144474. #else
  144475. "adc r3, r7\n\t"
  144476. #endif
  144477. #ifdef WOLFSSL_KEIL
  144478. "adcs r4, r4, %[r]\n\t"
  144479. #elif defined(__clang__)
  144480. "adcs r4, %[r]\n\t"
  144481. #else
  144482. "adc r4, %[r]\n\t"
  144483. #endif
  144484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144485. "lsrs r6, %[a], #16\n\t"
  144486. #else
  144487. "lsr r6, %[a], #16\n\t"
  144488. #endif
  144489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144490. "lsrs r7, %[b], #16\n\t"
  144491. #else
  144492. "lsr r7, %[b], #16\n\t"
  144493. #endif
  144494. #ifdef WOLFSSL_KEIL
  144495. "muls r7, r6, r7\n\t"
  144496. #elif defined(__clang__)
  144497. "muls r7, r6\n\t"
  144498. #else
  144499. "mul r7, r6\n\t"
  144500. #endif
  144501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144502. "adds r3, r3, r7\n\t"
  144503. #else
  144504. "add r3, r3, r7\n\t"
  144505. #endif
  144506. #ifdef WOLFSSL_KEIL
  144507. "adcs r4, r4, %[r]\n\t"
  144508. #elif defined(__clang__)
  144509. "adcs r4, %[r]\n\t"
  144510. #else
  144511. "adc r4, %[r]\n\t"
  144512. #endif
  144513. "uxth r7, %[b]\n\t"
  144514. #ifdef WOLFSSL_KEIL
  144515. "muls r6, r7, r6\n\t"
  144516. #elif defined(__clang__)
  144517. "muls r6, r7\n\t"
  144518. #else
  144519. "mul r6, r7\n\t"
  144520. #endif
  144521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144522. "lsrs r7, r6, #16\n\t"
  144523. #else
  144524. "lsr r7, r6, #16\n\t"
  144525. #endif
  144526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144527. "lsls r6, r6, #16\n\t"
  144528. #else
  144529. "lsl r6, r6, #16\n\t"
  144530. #endif
  144531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144532. "adds r5, r5, r6\n\t"
  144533. #else
  144534. "add r5, r5, r6\n\t"
  144535. #endif
  144536. #ifdef WOLFSSL_KEIL
  144537. "adcs r3, r3, r7\n\t"
  144538. #elif defined(__clang__)
  144539. "adcs r3, r7\n\t"
  144540. #else
  144541. "adc r3, r7\n\t"
  144542. #endif
  144543. #ifdef WOLFSSL_KEIL
  144544. "adcs r4, r4, %[r]\n\t"
  144545. #elif defined(__clang__)
  144546. "adcs r4, %[r]\n\t"
  144547. #else
  144548. "adc r4, %[r]\n\t"
  144549. #endif
  144550. "# A[5] * B[6]\n\t"
  144551. "mov %[a], r9\n\t"
  144552. "mov %[b], r10\n\t"
  144553. "ldr %[a], [%[a], #20]\n\t"
  144554. "ldr %[b], [%[b], #24]\n\t"
  144555. "uxth r6, %[a]\n\t"
  144556. "uxth r7, %[b]\n\t"
  144557. #ifdef WOLFSSL_KEIL
  144558. "muls r7, r6, r7\n\t"
  144559. #elif defined(__clang__)
  144560. "muls r7, r6\n\t"
  144561. #else
  144562. "mul r7, r6\n\t"
  144563. #endif
  144564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144565. "adds r5, r5, r7\n\t"
  144566. #else
  144567. "add r5, r5, r7\n\t"
  144568. #endif
  144569. #ifdef WOLFSSL_KEIL
  144570. "adcs r3, r3, %[r]\n\t"
  144571. #elif defined(__clang__)
  144572. "adcs r3, %[r]\n\t"
  144573. #else
  144574. "adc r3, %[r]\n\t"
  144575. #endif
  144576. #ifdef WOLFSSL_KEIL
  144577. "adcs r4, r4, %[r]\n\t"
  144578. #elif defined(__clang__)
  144579. "adcs r4, %[r]\n\t"
  144580. #else
  144581. "adc r4, %[r]\n\t"
  144582. #endif
  144583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144584. "lsrs r7, %[b], #16\n\t"
  144585. #else
  144586. "lsr r7, %[b], #16\n\t"
  144587. #endif
  144588. #ifdef WOLFSSL_KEIL
  144589. "muls r6, r7, r6\n\t"
  144590. #elif defined(__clang__)
  144591. "muls r6, r7\n\t"
  144592. #else
  144593. "mul r6, r7\n\t"
  144594. #endif
  144595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144596. "lsrs r7, r6, #16\n\t"
  144597. #else
  144598. "lsr r7, r6, #16\n\t"
  144599. #endif
  144600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144601. "lsls r6, r6, #16\n\t"
  144602. #else
  144603. "lsl r6, r6, #16\n\t"
  144604. #endif
  144605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144606. "adds r5, r5, r6\n\t"
  144607. #else
  144608. "add r5, r5, r6\n\t"
  144609. #endif
  144610. #ifdef WOLFSSL_KEIL
  144611. "adcs r3, r3, r7\n\t"
  144612. #elif defined(__clang__)
  144613. "adcs r3, r7\n\t"
  144614. #else
  144615. "adc r3, r7\n\t"
  144616. #endif
  144617. #ifdef WOLFSSL_KEIL
  144618. "adcs r4, r4, %[r]\n\t"
  144619. #elif defined(__clang__)
  144620. "adcs r4, %[r]\n\t"
  144621. #else
  144622. "adc r4, %[r]\n\t"
  144623. #endif
  144624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144625. "lsrs r6, %[a], #16\n\t"
  144626. #else
  144627. "lsr r6, %[a], #16\n\t"
  144628. #endif
  144629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144630. "lsrs r7, %[b], #16\n\t"
  144631. #else
  144632. "lsr r7, %[b], #16\n\t"
  144633. #endif
  144634. #ifdef WOLFSSL_KEIL
  144635. "muls r7, r6, r7\n\t"
  144636. #elif defined(__clang__)
  144637. "muls r7, r6\n\t"
  144638. #else
  144639. "mul r7, r6\n\t"
  144640. #endif
  144641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144642. "adds r3, r3, r7\n\t"
  144643. #else
  144644. "add r3, r3, r7\n\t"
  144645. #endif
  144646. #ifdef WOLFSSL_KEIL
  144647. "adcs r4, r4, %[r]\n\t"
  144648. #elif defined(__clang__)
  144649. "adcs r4, %[r]\n\t"
  144650. #else
  144651. "adc r4, %[r]\n\t"
  144652. #endif
  144653. "uxth r7, %[b]\n\t"
  144654. #ifdef WOLFSSL_KEIL
  144655. "muls r6, r7, r6\n\t"
  144656. #elif defined(__clang__)
  144657. "muls r6, r7\n\t"
  144658. #else
  144659. "mul r6, r7\n\t"
  144660. #endif
  144661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144662. "lsrs r7, r6, #16\n\t"
  144663. #else
  144664. "lsr r7, r6, #16\n\t"
  144665. #endif
  144666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144667. "lsls r6, r6, #16\n\t"
  144668. #else
  144669. "lsl r6, r6, #16\n\t"
  144670. #endif
  144671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144672. "adds r5, r5, r6\n\t"
  144673. #else
  144674. "add r5, r5, r6\n\t"
  144675. #endif
  144676. #ifdef WOLFSSL_KEIL
  144677. "adcs r3, r3, r7\n\t"
  144678. #elif defined(__clang__)
  144679. "adcs r3, r7\n\t"
  144680. #else
  144681. "adc r3, r7\n\t"
  144682. #endif
  144683. #ifdef WOLFSSL_KEIL
  144684. "adcs r4, r4, %[r]\n\t"
  144685. #elif defined(__clang__)
  144686. "adcs r4, %[r]\n\t"
  144687. #else
  144688. "adc r4, %[r]\n\t"
  144689. #endif
  144690. "# A[6] * B[5]\n\t"
  144691. "mov %[a], r9\n\t"
  144692. "mov %[b], r10\n\t"
  144693. "ldr %[a], [%[a], #24]\n\t"
  144694. "ldr %[b], [%[b], #20]\n\t"
  144695. "uxth r6, %[a]\n\t"
  144696. "uxth r7, %[b]\n\t"
  144697. #ifdef WOLFSSL_KEIL
  144698. "muls r7, r6, r7\n\t"
  144699. #elif defined(__clang__)
  144700. "muls r7, r6\n\t"
  144701. #else
  144702. "mul r7, r6\n\t"
  144703. #endif
  144704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144705. "adds r5, r5, r7\n\t"
  144706. #else
  144707. "add r5, r5, r7\n\t"
  144708. #endif
  144709. #ifdef WOLFSSL_KEIL
  144710. "adcs r3, r3, %[r]\n\t"
  144711. #elif defined(__clang__)
  144712. "adcs r3, %[r]\n\t"
  144713. #else
  144714. "adc r3, %[r]\n\t"
  144715. #endif
  144716. #ifdef WOLFSSL_KEIL
  144717. "adcs r4, r4, %[r]\n\t"
  144718. #elif defined(__clang__)
  144719. "adcs r4, %[r]\n\t"
  144720. #else
  144721. "adc r4, %[r]\n\t"
  144722. #endif
  144723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144724. "lsrs r7, %[b], #16\n\t"
  144725. #else
  144726. "lsr r7, %[b], #16\n\t"
  144727. #endif
  144728. #ifdef WOLFSSL_KEIL
  144729. "muls r6, r7, r6\n\t"
  144730. #elif defined(__clang__)
  144731. "muls r6, r7\n\t"
  144732. #else
  144733. "mul r6, r7\n\t"
  144734. #endif
  144735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144736. "lsrs r7, r6, #16\n\t"
  144737. #else
  144738. "lsr r7, r6, #16\n\t"
  144739. #endif
  144740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144741. "lsls r6, r6, #16\n\t"
  144742. #else
  144743. "lsl r6, r6, #16\n\t"
  144744. #endif
  144745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144746. "adds r5, r5, r6\n\t"
  144747. #else
  144748. "add r5, r5, r6\n\t"
  144749. #endif
  144750. #ifdef WOLFSSL_KEIL
  144751. "adcs r3, r3, r7\n\t"
  144752. #elif defined(__clang__)
  144753. "adcs r3, r7\n\t"
  144754. #else
  144755. "adc r3, r7\n\t"
  144756. #endif
  144757. #ifdef WOLFSSL_KEIL
  144758. "adcs r4, r4, %[r]\n\t"
  144759. #elif defined(__clang__)
  144760. "adcs r4, %[r]\n\t"
  144761. #else
  144762. "adc r4, %[r]\n\t"
  144763. #endif
  144764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144765. "lsrs r6, %[a], #16\n\t"
  144766. #else
  144767. "lsr r6, %[a], #16\n\t"
  144768. #endif
  144769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144770. "lsrs r7, %[b], #16\n\t"
  144771. #else
  144772. "lsr r7, %[b], #16\n\t"
  144773. #endif
  144774. #ifdef WOLFSSL_KEIL
  144775. "muls r7, r6, r7\n\t"
  144776. #elif defined(__clang__)
  144777. "muls r7, r6\n\t"
  144778. #else
  144779. "mul r7, r6\n\t"
  144780. #endif
  144781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144782. "adds r3, r3, r7\n\t"
  144783. #else
  144784. "add r3, r3, r7\n\t"
  144785. #endif
  144786. #ifdef WOLFSSL_KEIL
  144787. "adcs r4, r4, %[r]\n\t"
  144788. #elif defined(__clang__)
  144789. "adcs r4, %[r]\n\t"
  144790. #else
  144791. "adc r4, %[r]\n\t"
  144792. #endif
  144793. "uxth r7, %[b]\n\t"
  144794. #ifdef WOLFSSL_KEIL
  144795. "muls r6, r7, r6\n\t"
  144796. #elif defined(__clang__)
  144797. "muls r6, r7\n\t"
  144798. #else
  144799. "mul r6, r7\n\t"
  144800. #endif
  144801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144802. "lsrs r7, r6, #16\n\t"
  144803. #else
  144804. "lsr r7, r6, #16\n\t"
  144805. #endif
  144806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144807. "lsls r6, r6, #16\n\t"
  144808. #else
  144809. "lsl r6, r6, #16\n\t"
  144810. #endif
  144811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144812. "adds r5, r5, r6\n\t"
  144813. #else
  144814. "add r5, r5, r6\n\t"
  144815. #endif
  144816. #ifdef WOLFSSL_KEIL
  144817. "adcs r3, r3, r7\n\t"
  144818. #elif defined(__clang__)
  144819. "adcs r3, r7\n\t"
  144820. #else
  144821. "adc r3, r7\n\t"
  144822. #endif
  144823. #ifdef WOLFSSL_KEIL
  144824. "adcs r4, r4, %[r]\n\t"
  144825. #elif defined(__clang__)
  144826. "adcs r4, %[r]\n\t"
  144827. #else
  144828. "adc r4, %[r]\n\t"
  144829. #endif
  144830. "# A[7] * B[4]\n\t"
  144831. "mov %[a], r9\n\t"
  144832. "mov %[b], r10\n\t"
  144833. "ldr %[a], [%[a], #28]\n\t"
  144834. "ldr %[b], [%[b], #16]\n\t"
  144835. "uxth r6, %[a]\n\t"
  144836. "uxth r7, %[b]\n\t"
  144837. #ifdef WOLFSSL_KEIL
  144838. "muls r7, r6, r7\n\t"
  144839. #elif defined(__clang__)
  144840. "muls r7, r6\n\t"
  144841. #else
  144842. "mul r7, r6\n\t"
  144843. #endif
  144844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144845. "adds r5, r5, r7\n\t"
  144846. #else
  144847. "add r5, r5, r7\n\t"
  144848. #endif
  144849. #ifdef WOLFSSL_KEIL
  144850. "adcs r3, r3, %[r]\n\t"
  144851. #elif defined(__clang__)
  144852. "adcs r3, %[r]\n\t"
  144853. #else
  144854. "adc r3, %[r]\n\t"
  144855. #endif
  144856. #ifdef WOLFSSL_KEIL
  144857. "adcs r4, r4, %[r]\n\t"
  144858. #elif defined(__clang__)
  144859. "adcs r4, %[r]\n\t"
  144860. #else
  144861. "adc r4, %[r]\n\t"
  144862. #endif
  144863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144864. "lsrs r7, %[b], #16\n\t"
  144865. #else
  144866. "lsr r7, %[b], #16\n\t"
  144867. #endif
  144868. #ifdef WOLFSSL_KEIL
  144869. "muls r6, r7, r6\n\t"
  144870. #elif defined(__clang__)
  144871. "muls r6, r7\n\t"
  144872. #else
  144873. "mul r6, r7\n\t"
  144874. #endif
  144875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144876. "lsrs r7, r6, #16\n\t"
  144877. #else
  144878. "lsr r7, r6, #16\n\t"
  144879. #endif
  144880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144881. "lsls r6, r6, #16\n\t"
  144882. #else
  144883. "lsl r6, r6, #16\n\t"
  144884. #endif
  144885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144886. "adds r5, r5, r6\n\t"
  144887. #else
  144888. "add r5, r5, r6\n\t"
  144889. #endif
  144890. #ifdef WOLFSSL_KEIL
  144891. "adcs r3, r3, r7\n\t"
  144892. #elif defined(__clang__)
  144893. "adcs r3, r7\n\t"
  144894. #else
  144895. "adc r3, r7\n\t"
  144896. #endif
  144897. #ifdef WOLFSSL_KEIL
  144898. "adcs r4, r4, %[r]\n\t"
  144899. #elif defined(__clang__)
  144900. "adcs r4, %[r]\n\t"
  144901. #else
  144902. "adc r4, %[r]\n\t"
  144903. #endif
  144904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144905. "lsrs r6, %[a], #16\n\t"
  144906. #else
  144907. "lsr r6, %[a], #16\n\t"
  144908. #endif
  144909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144910. "lsrs r7, %[b], #16\n\t"
  144911. #else
  144912. "lsr r7, %[b], #16\n\t"
  144913. #endif
  144914. #ifdef WOLFSSL_KEIL
  144915. "muls r7, r6, r7\n\t"
  144916. #elif defined(__clang__)
  144917. "muls r7, r6\n\t"
  144918. #else
  144919. "mul r7, r6\n\t"
  144920. #endif
  144921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144922. "adds r3, r3, r7\n\t"
  144923. #else
  144924. "add r3, r3, r7\n\t"
  144925. #endif
  144926. #ifdef WOLFSSL_KEIL
  144927. "adcs r4, r4, %[r]\n\t"
  144928. #elif defined(__clang__)
  144929. "adcs r4, %[r]\n\t"
  144930. #else
  144931. "adc r4, %[r]\n\t"
  144932. #endif
  144933. "uxth r7, %[b]\n\t"
  144934. #ifdef WOLFSSL_KEIL
  144935. "muls r6, r7, r6\n\t"
  144936. #elif defined(__clang__)
  144937. "muls r6, r7\n\t"
  144938. #else
  144939. "mul r6, r7\n\t"
  144940. #endif
  144941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144942. "lsrs r7, r6, #16\n\t"
  144943. #else
  144944. "lsr r7, r6, #16\n\t"
  144945. #endif
  144946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144947. "lsls r6, r6, #16\n\t"
  144948. #else
  144949. "lsl r6, r6, #16\n\t"
  144950. #endif
  144951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144952. "adds r5, r5, r6\n\t"
  144953. #else
  144954. "add r5, r5, r6\n\t"
  144955. #endif
  144956. #ifdef WOLFSSL_KEIL
  144957. "adcs r3, r3, r7\n\t"
  144958. #elif defined(__clang__)
  144959. "adcs r3, r7\n\t"
  144960. #else
  144961. "adc r3, r7\n\t"
  144962. #endif
  144963. #ifdef WOLFSSL_KEIL
  144964. "adcs r4, r4, %[r]\n\t"
  144965. #elif defined(__clang__)
  144966. "adcs r4, %[r]\n\t"
  144967. #else
  144968. "adc r4, %[r]\n\t"
  144969. #endif
  144970. "# A[8] * B[3]\n\t"
  144971. "mov %[a], r9\n\t"
  144972. "mov %[b], r10\n\t"
  144973. "ldr %[a], [%[a], #32]\n\t"
  144974. "ldr %[b], [%[b], #12]\n\t"
  144975. "uxth r6, %[a]\n\t"
  144976. "uxth r7, %[b]\n\t"
  144977. #ifdef WOLFSSL_KEIL
  144978. "muls r7, r6, r7\n\t"
  144979. #elif defined(__clang__)
  144980. "muls r7, r6\n\t"
  144981. #else
  144982. "mul r7, r6\n\t"
  144983. #endif
  144984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144985. "adds r5, r5, r7\n\t"
  144986. #else
  144987. "add r5, r5, r7\n\t"
  144988. #endif
  144989. #ifdef WOLFSSL_KEIL
  144990. "adcs r3, r3, %[r]\n\t"
  144991. #elif defined(__clang__)
  144992. "adcs r3, %[r]\n\t"
  144993. #else
  144994. "adc r3, %[r]\n\t"
  144995. #endif
  144996. #ifdef WOLFSSL_KEIL
  144997. "adcs r4, r4, %[r]\n\t"
  144998. #elif defined(__clang__)
  144999. "adcs r4, %[r]\n\t"
  145000. #else
  145001. "adc r4, %[r]\n\t"
  145002. #endif
  145003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145004. "lsrs r7, %[b], #16\n\t"
  145005. #else
  145006. "lsr r7, %[b], #16\n\t"
  145007. #endif
  145008. #ifdef WOLFSSL_KEIL
  145009. "muls r6, r7, r6\n\t"
  145010. #elif defined(__clang__)
  145011. "muls r6, r7\n\t"
  145012. #else
  145013. "mul r6, r7\n\t"
  145014. #endif
  145015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145016. "lsrs r7, r6, #16\n\t"
  145017. #else
  145018. "lsr r7, r6, #16\n\t"
  145019. #endif
  145020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145021. "lsls r6, r6, #16\n\t"
  145022. #else
  145023. "lsl r6, r6, #16\n\t"
  145024. #endif
  145025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145026. "adds r5, r5, r6\n\t"
  145027. #else
  145028. "add r5, r5, r6\n\t"
  145029. #endif
  145030. #ifdef WOLFSSL_KEIL
  145031. "adcs r3, r3, r7\n\t"
  145032. #elif defined(__clang__)
  145033. "adcs r3, r7\n\t"
  145034. #else
  145035. "adc r3, r7\n\t"
  145036. #endif
  145037. #ifdef WOLFSSL_KEIL
  145038. "adcs r4, r4, %[r]\n\t"
  145039. #elif defined(__clang__)
  145040. "adcs r4, %[r]\n\t"
  145041. #else
  145042. "adc r4, %[r]\n\t"
  145043. #endif
  145044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145045. "lsrs r6, %[a], #16\n\t"
  145046. #else
  145047. "lsr r6, %[a], #16\n\t"
  145048. #endif
  145049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145050. "lsrs r7, %[b], #16\n\t"
  145051. #else
  145052. "lsr r7, %[b], #16\n\t"
  145053. #endif
  145054. #ifdef WOLFSSL_KEIL
  145055. "muls r7, r6, r7\n\t"
  145056. #elif defined(__clang__)
  145057. "muls r7, r6\n\t"
  145058. #else
  145059. "mul r7, r6\n\t"
  145060. #endif
  145061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145062. "adds r3, r3, r7\n\t"
  145063. #else
  145064. "add r3, r3, r7\n\t"
  145065. #endif
  145066. #ifdef WOLFSSL_KEIL
  145067. "adcs r4, r4, %[r]\n\t"
  145068. #elif defined(__clang__)
  145069. "adcs r4, %[r]\n\t"
  145070. #else
  145071. "adc r4, %[r]\n\t"
  145072. #endif
  145073. "uxth r7, %[b]\n\t"
  145074. #ifdef WOLFSSL_KEIL
  145075. "muls r6, r7, r6\n\t"
  145076. #elif defined(__clang__)
  145077. "muls r6, r7\n\t"
  145078. #else
  145079. "mul r6, r7\n\t"
  145080. #endif
  145081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145082. "lsrs r7, r6, #16\n\t"
  145083. #else
  145084. "lsr r7, r6, #16\n\t"
  145085. #endif
  145086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145087. "lsls r6, r6, #16\n\t"
  145088. #else
  145089. "lsl r6, r6, #16\n\t"
  145090. #endif
  145091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145092. "adds r5, r5, r6\n\t"
  145093. #else
  145094. "add r5, r5, r6\n\t"
  145095. #endif
  145096. #ifdef WOLFSSL_KEIL
  145097. "adcs r3, r3, r7\n\t"
  145098. #elif defined(__clang__)
  145099. "adcs r3, r7\n\t"
  145100. #else
  145101. "adc r3, r7\n\t"
  145102. #endif
  145103. #ifdef WOLFSSL_KEIL
  145104. "adcs r4, r4, %[r]\n\t"
  145105. #elif defined(__clang__)
  145106. "adcs r4, %[r]\n\t"
  145107. #else
  145108. "adc r4, %[r]\n\t"
  145109. #endif
  145110. "# A[9] * B[2]\n\t"
  145111. "mov %[a], r9\n\t"
  145112. "mov %[b], r10\n\t"
  145113. "ldr %[a], [%[a], #36]\n\t"
  145114. "ldr %[b], [%[b], #8]\n\t"
  145115. "uxth r6, %[a]\n\t"
  145116. "uxth r7, %[b]\n\t"
  145117. #ifdef WOLFSSL_KEIL
  145118. "muls r7, r6, r7\n\t"
  145119. #elif defined(__clang__)
  145120. "muls r7, r6\n\t"
  145121. #else
  145122. "mul r7, r6\n\t"
  145123. #endif
  145124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145125. "adds r5, r5, r7\n\t"
  145126. #else
  145127. "add r5, r5, r7\n\t"
  145128. #endif
  145129. #ifdef WOLFSSL_KEIL
  145130. "adcs r3, r3, %[r]\n\t"
  145131. #elif defined(__clang__)
  145132. "adcs r3, %[r]\n\t"
  145133. #else
  145134. "adc r3, %[r]\n\t"
  145135. #endif
  145136. #ifdef WOLFSSL_KEIL
  145137. "adcs r4, r4, %[r]\n\t"
  145138. #elif defined(__clang__)
  145139. "adcs r4, %[r]\n\t"
  145140. #else
  145141. "adc r4, %[r]\n\t"
  145142. #endif
  145143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145144. "lsrs r7, %[b], #16\n\t"
  145145. #else
  145146. "lsr r7, %[b], #16\n\t"
  145147. #endif
  145148. #ifdef WOLFSSL_KEIL
  145149. "muls r6, r7, r6\n\t"
  145150. #elif defined(__clang__)
  145151. "muls r6, r7\n\t"
  145152. #else
  145153. "mul r6, r7\n\t"
  145154. #endif
  145155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145156. "lsrs r7, r6, #16\n\t"
  145157. #else
  145158. "lsr r7, r6, #16\n\t"
  145159. #endif
  145160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145161. "lsls r6, r6, #16\n\t"
  145162. #else
  145163. "lsl r6, r6, #16\n\t"
  145164. #endif
  145165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145166. "adds r5, r5, r6\n\t"
  145167. #else
  145168. "add r5, r5, r6\n\t"
  145169. #endif
  145170. #ifdef WOLFSSL_KEIL
  145171. "adcs r3, r3, r7\n\t"
  145172. #elif defined(__clang__)
  145173. "adcs r3, r7\n\t"
  145174. #else
  145175. "adc r3, r7\n\t"
  145176. #endif
  145177. #ifdef WOLFSSL_KEIL
  145178. "adcs r4, r4, %[r]\n\t"
  145179. #elif defined(__clang__)
  145180. "adcs r4, %[r]\n\t"
  145181. #else
  145182. "adc r4, %[r]\n\t"
  145183. #endif
  145184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145185. "lsrs r6, %[a], #16\n\t"
  145186. #else
  145187. "lsr r6, %[a], #16\n\t"
  145188. #endif
  145189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145190. "lsrs r7, %[b], #16\n\t"
  145191. #else
  145192. "lsr r7, %[b], #16\n\t"
  145193. #endif
  145194. #ifdef WOLFSSL_KEIL
  145195. "muls r7, r6, r7\n\t"
  145196. #elif defined(__clang__)
  145197. "muls r7, r6\n\t"
  145198. #else
  145199. "mul r7, r6\n\t"
  145200. #endif
  145201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145202. "adds r3, r3, r7\n\t"
  145203. #else
  145204. "add r3, r3, r7\n\t"
  145205. #endif
  145206. #ifdef WOLFSSL_KEIL
  145207. "adcs r4, r4, %[r]\n\t"
  145208. #elif defined(__clang__)
  145209. "adcs r4, %[r]\n\t"
  145210. #else
  145211. "adc r4, %[r]\n\t"
  145212. #endif
  145213. "uxth r7, %[b]\n\t"
  145214. #ifdef WOLFSSL_KEIL
  145215. "muls r6, r7, r6\n\t"
  145216. #elif defined(__clang__)
  145217. "muls r6, r7\n\t"
  145218. #else
  145219. "mul r6, r7\n\t"
  145220. #endif
  145221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145222. "lsrs r7, r6, #16\n\t"
  145223. #else
  145224. "lsr r7, r6, #16\n\t"
  145225. #endif
  145226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145227. "lsls r6, r6, #16\n\t"
  145228. #else
  145229. "lsl r6, r6, #16\n\t"
  145230. #endif
  145231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145232. "adds r5, r5, r6\n\t"
  145233. #else
  145234. "add r5, r5, r6\n\t"
  145235. #endif
  145236. #ifdef WOLFSSL_KEIL
  145237. "adcs r3, r3, r7\n\t"
  145238. #elif defined(__clang__)
  145239. "adcs r3, r7\n\t"
  145240. #else
  145241. "adc r3, r7\n\t"
  145242. #endif
  145243. #ifdef WOLFSSL_KEIL
  145244. "adcs r4, r4, %[r]\n\t"
  145245. #elif defined(__clang__)
  145246. "adcs r4, %[r]\n\t"
  145247. #else
  145248. "adc r4, %[r]\n\t"
  145249. #endif
  145250. "# A[10] * B[1]\n\t"
  145251. "mov %[a], r9\n\t"
  145252. "mov %[b], r10\n\t"
  145253. "ldr %[a], [%[a], #40]\n\t"
  145254. "ldr %[b], [%[b], #4]\n\t"
  145255. "uxth r6, %[a]\n\t"
  145256. "uxth r7, %[b]\n\t"
  145257. #ifdef WOLFSSL_KEIL
  145258. "muls r7, r6, r7\n\t"
  145259. #elif defined(__clang__)
  145260. "muls r7, r6\n\t"
  145261. #else
  145262. "mul r7, r6\n\t"
  145263. #endif
  145264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145265. "adds r5, r5, r7\n\t"
  145266. #else
  145267. "add r5, r5, r7\n\t"
  145268. #endif
  145269. #ifdef WOLFSSL_KEIL
  145270. "adcs r3, r3, %[r]\n\t"
  145271. #elif defined(__clang__)
  145272. "adcs r3, %[r]\n\t"
  145273. #else
  145274. "adc r3, %[r]\n\t"
  145275. #endif
  145276. #ifdef WOLFSSL_KEIL
  145277. "adcs r4, r4, %[r]\n\t"
  145278. #elif defined(__clang__)
  145279. "adcs r4, %[r]\n\t"
  145280. #else
  145281. "adc r4, %[r]\n\t"
  145282. #endif
  145283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145284. "lsrs r7, %[b], #16\n\t"
  145285. #else
  145286. "lsr r7, %[b], #16\n\t"
  145287. #endif
  145288. #ifdef WOLFSSL_KEIL
  145289. "muls r6, r7, r6\n\t"
  145290. #elif defined(__clang__)
  145291. "muls r6, r7\n\t"
  145292. #else
  145293. "mul r6, r7\n\t"
  145294. #endif
  145295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145296. "lsrs r7, r6, #16\n\t"
  145297. #else
  145298. "lsr r7, r6, #16\n\t"
  145299. #endif
  145300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145301. "lsls r6, r6, #16\n\t"
  145302. #else
  145303. "lsl r6, r6, #16\n\t"
  145304. #endif
  145305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145306. "adds r5, r5, r6\n\t"
  145307. #else
  145308. "add r5, r5, r6\n\t"
  145309. #endif
  145310. #ifdef WOLFSSL_KEIL
  145311. "adcs r3, r3, r7\n\t"
  145312. #elif defined(__clang__)
  145313. "adcs r3, r7\n\t"
  145314. #else
  145315. "adc r3, r7\n\t"
  145316. #endif
  145317. #ifdef WOLFSSL_KEIL
  145318. "adcs r4, r4, %[r]\n\t"
  145319. #elif defined(__clang__)
  145320. "adcs r4, %[r]\n\t"
  145321. #else
  145322. "adc r4, %[r]\n\t"
  145323. #endif
  145324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145325. "lsrs r6, %[a], #16\n\t"
  145326. #else
  145327. "lsr r6, %[a], #16\n\t"
  145328. #endif
  145329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145330. "lsrs r7, %[b], #16\n\t"
  145331. #else
  145332. "lsr r7, %[b], #16\n\t"
  145333. #endif
  145334. #ifdef WOLFSSL_KEIL
  145335. "muls r7, r6, r7\n\t"
  145336. #elif defined(__clang__)
  145337. "muls r7, r6\n\t"
  145338. #else
  145339. "mul r7, r6\n\t"
  145340. #endif
  145341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145342. "adds r3, r3, r7\n\t"
  145343. #else
  145344. "add r3, r3, r7\n\t"
  145345. #endif
  145346. #ifdef WOLFSSL_KEIL
  145347. "adcs r4, r4, %[r]\n\t"
  145348. #elif defined(__clang__)
  145349. "adcs r4, %[r]\n\t"
  145350. #else
  145351. "adc r4, %[r]\n\t"
  145352. #endif
  145353. "uxth r7, %[b]\n\t"
  145354. #ifdef WOLFSSL_KEIL
  145355. "muls r6, r7, r6\n\t"
  145356. #elif defined(__clang__)
  145357. "muls r6, r7\n\t"
  145358. #else
  145359. "mul r6, r7\n\t"
  145360. #endif
  145361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145362. "lsrs r7, r6, #16\n\t"
  145363. #else
  145364. "lsr r7, r6, #16\n\t"
  145365. #endif
  145366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145367. "lsls r6, r6, #16\n\t"
  145368. #else
  145369. "lsl r6, r6, #16\n\t"
  145370. #endif
  145371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145372. "adds r5, r5, r6\n\t"
  145373. #else
  145374. "add r5, r5, r6\n\t"
  145375. #endif
  145376. #ifdef WOLFSSL_KEIL
  145377. "adcs r3, r3, r7\n\t"
  145378. #elif defined(__clang__)
  145379. "adcs r3, r7\n\t"
  145380. #else
  145381. "adc r3, r7\n\t"
  145382. #endif
  145383. #ifdef WOLFSSL_KEIL
  145384. "adcs r4, r4, %[r]\n\t"
  145385. #elif defined(__clang__)
  145386. "adcs r4, %[r]\n\t"
  145387. #else
  145388. "adc r4, %[r]\n\t"
  145389. #endif
  145390. "# A[11] * B[0]\n\t"
  145391. "mov %[a], r9\n\t"
  145392. "mov %[b], r10\n\t"
  145393. "ldr %[a], [%[a], #44]\n\t"
  145394. "ldr %[b], [%[b]]\n\t"
  145395. "uxth r6, %[a]\n\t"
  145396. "uxth r7, %[b]\n\t"
  145397. #ifdef WOLFSSL_KEIL
  145398. "muls r7, r6, r7\n\t"
  145399. #elif defined(__clang__)
  145400. "muls r7, r6\n\t"
  145401. #else
  145402. "mul r7, r6\n\t"
  145403. #endif
  145404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145405. "adds r5, r5, r7\n\t"
  145406. #else
  145407. "add r5, r5, r7\n\t"
  145408. #endif
  145409. #ifdef WOLFSSL_KEIL
  145410. "adcs r3, r3, %[r]\n\t"
  145411. #elif defined(__clang__)
  145412. "adcs r3, %[r]\n\t"
  145413. #else
  145414. "adc r3, %[r]\n\t"
  145415. #endif
  145416. #ifdef WOLFSSL_KEIL
  145417. "adcs r4, r4, %[r]\n\t"
  145418. #elif defined(__clang__)
  145419. "adcs r4, %[r]\n\t"
  145420. #else
  145421. "adc r4, %[r]\n\t"
  145422. #endif
  145423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145424. "lsrs r7, %[b], #16\n\t"
  145425. #else
  145426. "lsr r7, %[b], #16\n\t"
  145427. #endif
  145428. #ifdef WOLFSSL_KEIL
  145429. "muls r6, r7, r6\n\t"
  145430. #elif defined(__clang__)
  145431. "muls r6, r7\n\t"
  145432. #else
  145433. "mul r6, r7\n\t"
  145434. #endif
  145435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145436. "lsrs r7, r6, #16\n\t"
  145437. #else
  145438. "lsr r7, r6, #16\n\t"
  145439. #endif
  145440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145441. "lsls r6, r6, #16\n\t"
  145442. #else
  145443. "lsl r6, r6, #16\n\t"
  145444. #endif
  145445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145446. "adds r5, r5, r6\n\t"
  145447. #else
  145448. "add r5, r5, r6\n\t"
  145449. #endif
  145450. #ifdef WOLFSSL_KEIL
  145451. "adcs r3, r3, r7\n\t"
  145452. #elif defined(__clang__)
  145453. "adcs r3, r7\n\t"
  145454. #else
  145455. "adc r3, r7\n\t"
  145456. #endif
  145457. #ifdef WOLFSSL_KEIL
  145458. "adcs r4, r4, %[r]\n\t"
  145459. #elif defined(__clang__)
  145460. "adcs r4, %[r]\n\t"
  145461. #else
  145462. "adc r4, %[r]\n\t"
  145463. #endif
  145464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145465. "lsrs r6, %[a], #16\n\t"
  145466. #else
  145467. "lsr r6, %[a], #16\n\t"
  145468. #endif
  145469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145470. "lsrs r7, %[b], #16\n\t"
  145471. #else
  145472. "lsr r7, %[b], #16\n\t"
  145473. #endif
  145474. #ifdef WOLFSSL_KEIL
  145475. "muls r7, r6, r7\n\t"
  145476. #elif defined(__clang__)
  145477. "muls r7, r6\n\t"
  145478. #else
  145479. "mul r7, r6\n\t"
  145480. #endif
  145481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145482. "adds r3, r3, r7\n\t"
  145483. #else
  145484. "add r3, r3, r7\n\t"
  145485. #endif
  145486. #ifdef WOLFSSL_KEIL
  145487. "adcs r4, r4, %[r]\n\t"
  145488. #elif defined(__clang__)
  145489. "adcs r4, %[r]\n\t"
  145490. #else
  145491. "adc r4, %[r]\n\t"
  145492. #endif
  145493. "uxth r7, %[b]\n\t"
  145494. #ifdef WOLFSSL_KEIL
  145495. "muls r6, r7, r6\n\t"
  145496. #elif defined(__clang__)
  145497. "muls r6, r7\n\t"
  145498. #else
  145499. "mul r6, r7\n\t"
  145500. #endif
  145501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145502. "lsrs r7, r6, #16\n\t"
  145503. #else
  145504. "lsr r7, r6, #16\n\t"
  145505. #endif
  145506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145507. "lsls r6, r6, #16\n\t"
  145508. #else
  145509. "lsl r6, r6, #16\n\t"
  145510. #endif
  145511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145512. "adds r5, r5, r6\n\t"
  145513. #else
  145514. "add r5, r5, r6\n\t"
  145515. #endif
  145516. #ifdef WOLFSSL_KEIL
  145517. "adcs r3, r3, r7\n\t"
  145518. #elif defined(__clang__)
  145519. "adcs r3, r7\n\t"
  145520. #else
  145521. "adc r3, r7\n\t"
  145522. #endif
  145523. #ifdef WOLFSSL_KEIL
  145524. "adcs r4, r4, %[r]\n\t"
  145525. #elif defined(__clang__)
  145526. "adcs r4, %[r]\n\t"
  145527. #else
  145528. "adc r4, %[r]\n\t"
  145529. #endif
  145530. "str r5, [sp, #44]\n\t"
  145531. "# A[12] * B[0]\n\t"
  145532. "movs r5, #0\n\t"
  145533. "mov %[a], r9\n\t"
  145534. "mov %[b], r10\n\t"
  145535. "ldr %[a], [%[a], #48]\n\t"
  145536. "ldr %[b], [%[b]]\n\t"
  145537. "uxth r6, %[a]\n\t"
  145538. "uxth r7, %[b]\n\t"
  145539. #ifdef WOLFSSL_KEIL
  145540. "muls r7, r6, r7\n\t"
  145541. #elif defined(__clang__)
  145542. "muls r7, r6\n\t"
  145543. #else
  145544. "mul r7, r6\n\t"
  145545. #endif
  145546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145547. "adds r3, r3, r7\n\t"
  145548. #else
  145549. "add r3, r3, r7\n\t"
  145550. #endif
  145551. #ifdef WOLFSSL_KEIL
  145552. "adcs r4, r4, %[r]\n\t"
  145553. #elif defined(__clang__)
  145554. "adcs r4, %[r]\n\t"
  145555. #else
  145556. "adc r4, %[r]\n\t"
  145557. #endif
  145558. #ifdef WOLFSSL_KEIL
  145559. "adcs r5, r5, %[r]\n\t"
  145560. #elif defined(__clang__)
  145561. "adcs r5, %[r]\n\t"
  145562. #else
  145563. "adc r5, %[r]\n\t"
  145564. #endif
  145565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145566. "lsrs r7, %[b], #16\n\t"
  145567. #else
  145568. "lsr r7, %[b], #16\n\t"
  145569. #endif
  145570. #ifdef WOLFSSL_KEIL
  145571. "muls r6, r7, r6\n\t"
  145572. #elif defined(__clang__)
  145573. "muls r6, r7\n\t"
  145574. #else
  145575. "mul r6, r7\n\t"
  145576. #endif
  145577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145578. "lsrs r7, r6, #16\n\t"
  145579. #else
  145580. "lsr r7, r6, #16\n\t"
  145581. #endif
  145582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145583. "lsls r6, r6, #16\n\t"
  145584. #else
  145585. "lsl r6, r6, #16\n\t"
  145586. #endif
  145587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145588. "adds r3, r3, r6\n\t"
  145589. #else
  145590. "add r3, r3, r6\n\t"
  145591. #endif
  145592. #ifdef WOLFSSL_KEIL
  145593. "adcs r4, r4, r7\n\t"
  145594. #elif defined(__clang__)
  145595. "adcs r4, r7\n\t"
  145596. #else
  145597. "adc r4, r7\n\t"
  145598. #endif
  145599. #ifdef WOLFSSL_KEIL
  145600. "adcs r5, r5, %[r]\n\t"
  145601. #elif defined(__clang__)
  145602. "adcs r5, %[r]\n\t"
  145603. #else
  145604. "adc r5, %[r]\n\t"
  145605. #endif
  145606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145607. "lsrs r6, %[a], #16\n\t"
  145608. #else
  145609. "lsr r6, %[a], #16\n\t"
  145610. #endif
  145611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145612. "lsrs r7, %[b], #16\n\t"
  145613. #else
  145614. "lsr r7, %[b], #16\n\t"
  145615. #endif
  145616. #ifdef WOLFSSL_KEIL
  145617. "muls r7, r6, r7\n\t"
  145618. #elif defined(__clang__)
  145619. "muls r7, r6\n\t"
  145620. #else
  145621. "mul r7, r6\n\t"
  145622. #endif
  145623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145624. "adds r4, r4, r7\n\t"
  145625. #else
  145626. "add r4, r4, r7\n\t"
  145627. #endif
  145628. #ifdef WOLFSSL_KEIL
  145629. "adcs r5, r5, %[r]\n\t"
  145630. #elif defined(__clang__)
  145631. "adcs r5, %[r]\n\t"
  145632. #else
  145633. "adc r5, %[r]\n\t"
  145634. #endif
  145635. "uxth r7, %[b]\n\t"
  145636. #ifdef WOLFSSL_KEIL
  145637. "muls r6, r7, r6\n\t"
  145638. #elif defined(__clang__)
  145639. "muls r6, r7\n\t"
  145640. #else
  145641. "mul r6, r7\n\t"
  145642. #endif
  145643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145644. "lsrs r7, r6, #16\n\t"
  145645. #else
  145646. "lsr r7, r6, #16\n\t"
  145647. #endif
  145648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145649. "lsls r6, r6, #16\n\t"
  145650. #else
  145651. "lsl r6, r6, #16\n\t"
  145652. #endif
  145653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145654. "adds r3, r3, r6\n\t"
  145655. #else
  145656. "add r3, r3, r6\n\t"
  145657. #endif
  145658. #ifdef WOLFSSL_KEIL
  145659. "adcs r4, r4, r7\n\t"
  145660. #elif defined(__clang__)
  145661. "adcs r4, r7\n\t"
  145662. #else
  145663. "adc r4, r7\n\t"
  145664. #endif
  145665. #ifdef WOLFSSL_KEIL
  145666. "adcs r5, r5, %[r]\n\t"
  145667. #elif defined(__clang__)
  145668. "adcs r5, %[r]\n\t"
  145669. #else
  145670. "adc r5, %[r]\n\t"
  145671. #endif
  145672. "# A[11] * B[1]\n\t"
  145673. "mov %[a], r9\n\t"
  145674. "mov %[b], r10\n\t"
  145675. "ldr %[a], [%[a], #44]\n\t"
  145676. "ldr %[b], [%[b], #4]\n\t"
  145677. "uxth r6, %[a]\n\t"
  145678. "uxth r7, %[b]\n\t"
  145679. #ifdef WOLFSSL_KEIL
  145680. "muls r7, r6, r7\n\t"
  145681. #elif defined(__clang__)
  145682. "muls r7, r6\n\t"
  145683. #else
  145684. "mul r7, r6\n\t"
  145685. #endif
  145686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145687. "adds r3, r3, r7\n\t"
  145688. #else
  145689. "add r3, r3, r7\n\t"
  145690. #endif
  145691. #ifdef WOLFSSL_KEIL
  145692. "adcs r4, r4, %[r]\n\t"
  145693. #elif defined(__clang__)
  145694. "adcs r4, %[r]\n\t"
  145695. #else
  145696. "adc r4, %[r]\n\t"
  145697. #endif
  145698. #ifdef WOLFSSL_KEIL
  145699. "adcs r5, r5, %[r]\n\t"
  145700. #elif defined(__clang__)
  145701. "adcs r5, %[r]\n\t"
  145702. #else
  145703. "adc r5, %[r]\n\t"
  145704. #endif
  145705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145706. "lsrs r7, %[b], #16\n\t"
  145707. #else
  145708. "lsr r7, %[b], #16\n\t"
  145709. #endif
  145710. #ifdef WOLFSSL_KEIL
  145711. "muls r6, r7, r6\n\t"
  145712. #elif defined(__clang__)
  145713. "muls r6, r7\n\t"
  145714. #else
  145715. "mul r6, r7\n\t"
  145716. #endif
  145717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145718. "lsrs r7, r6, #16\n\t"
  145719. #else
  145720. "lsr r7, r6, #16\n\t"
  145721. #endif
  145722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145723. "lsls r6, r6, #16\n\t"
  145724. #else
  145725. "lsl r6, r6, #16\n\t"
  145726. #endif
  145727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145728. "adds r3, r3, r6\n\t"
  145729. #else
  145730. "add r3, r3, r6\n\t"
  145731. #endif
  145732. #ifdef WOLFSSL_KEIL
  145733. "adcs r4, r4, r7\n\t"
  145734. #elif defined(__clang__)
  145735. "adcs r4, r7\n\t"
  145736. #else
  145737. "adc r4, r7\n\t"
  145738. #endif
  145739. #ifdef WOLFSSL_KEIL
  145740. "adcs r5, r5, %[r]\n\t"
  145741. #elif defined(__clang__)
  145742. "adcs r5, %[r]\n\t"
  145743. #else
  145744. "adc r5, %[r]\n\t"
  145745. #endif
  145746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145747. "lsrs r6, %[a], #16\n\t"
  145748. #else
  145749. "lsr r6, %[a], #16\n\t"
  145750. #endif
  145751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145752. "lsrs r7, %[b], #16\n\t"
  145753. #else
  145754. "lsr r7, %[b], #16\n\t"
  145755. #endif
  145756. #ifdef WOLFSSL_KEIL
  145757. "muls r7, r6, r7\n\t"
  145758. #elif defined(__clang__)
  145759. "muls r7, r6\n\t"
  145760. #else
  145761. "mul r7, r6\n\t"
  145762. #endif
  145763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145764. "adds r4, r4, r7\n\t"
  145765. #else
  145766. "add r4, r4, r7\n\t"
  145767. #endif
  145768. #ifdef WOLFSSL_KEIL
  145769. "adcs r5, r5, %[r]\n\t"
  145770. #elif defined(__clang__)
  145771. "adcs r5, %[r]\n\t"
  145772. #else
  145773. "adc r5, %[r]\n\t"
  145774. #endif
  145775. "uxth r7, %[b]\n\t"
  145776. #ifdef WOLFSSL_KEIL
  145777. "muls r6, r7, r6\n\t"
  145778. #elif defined(__clang__)
  145779. "muls r6, r7\n\t"
  145780. #else
  145781. "mul r6, r7\n\t"
  145782. #endif
  145783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145784. "lsrs r7, r6, #16\n\t"
  145785. #else
  145786. "lsr r7, r6, #16\n\t"
  145787. #endif
  145788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145789. "lsls r6, r6, #16\n\t"
  145790. #else
  145791. "lsl r6, r6, #16\n\t"
  145792. #endif
  145793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145794. "adds r3, r3, r6\n\t"
  145795. #else
  145796. "add r3, r3, r6\n\t"
  145797. #endif
  145798. #ifdef WOLFSSL_KEIL
  145799. "adcs r4, r4, r7\n\t"
  145800. #elif defined(__clang__)
  145801. "adcs r4, r7\n\t"
  145802. #else
  145803. "adc r4, r7\n\t"
  145804. #endif
  145805. #ifdef WOLFSSL_KEIL
  145806. "adcs r5, r5, %[r]\n\t"
  145807. #elif defined(__clang__)
  145808. "adcs r5, %[r]\n\t"
  145809. #else
  145810. "adc r5, %[r]\n\t"
  145811. #endif
  145812. "# A[10] * B[2]\n\t"
  145813. "mov %[a], r9\n\t"
  145814. "mov %[b], r10\n\t"
  145815. "ldr %[a], [%[a], #40]\n\t"
  145816. "ldr %[b], [%[b], #8]\n\t"
  145817. "uxth r6, %[a]\n\t"
  145818. "uxth r7, %[b]\n\t"
  145819. #ifdef WOLFSSL_KEIL
  145820. "muls r7, r6, r7\n\t"
  145821. #elif defined(__clang__)
  145822. "muls r7, r6\n\t"
  145823. #else
  145824. "mul r7, r6\n\t"
  145825. #endif
  145826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145827. "adds r3, r3, r7\n\t"
  145828. #else
  145829. "add r3, r3, r7\n\t"
  145830. #endif
  145831. #ifdef WOLFSSL_KEIL
  145832. "adcs r4, r4, %[r]\n\t"
  145833. #elif defined(__clang__)
  145834. "adcs r4, %[r]\n\t"
  145835. #else
  145836. "adc r4, %[r]\n\t"
  145837. #endif
  145838. #ifdef WOLFSSL_KEIL
  145839. "adcs r5, r5, %[r]\n\t"
  145840. #elif defined(__clang__)
  145841. "adcs r5, %[r]\n\t"
  145842. #else
  145843. "adc r5, %[r]\n\t"
  145844. #endif
  145845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145846. "lsrs r7, %[b], #16\n\t"
  145847. #else
  145848. "lsr r7, %[b], #16\n\t"
  145849. #endif
  145850. #ifdef WOLFSSL_KEIL
  145851. "muls r6, r7, r6\n\t"
  145852. #elif defined(__clang__)
  145853. "muls r6, r7\n\t"
  145854. #else
  145855. "mul r6, r7\n\t"
  145856. #endif
  145857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145858. "lsrs r7, r6, #16\n\t"
  145859. #else
  145860. "lsr r7, r6, #16\n\t"
  145861. #endif
  145862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145863. "lsls r6, r6, #16\n\t"
  145864. #else
  145865. "lsl r6, r6, #16\n\t"
  145866. #endif
  145867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145868. "adds r3, r3, r6\n\t"
  145869. #else
  145870. "add r3, r3, r6\n\t"
  145871. #endif
  145872. #ifdef WOLFSSL_KEIL
  145873. "adcs r4, r4, r7\n\t"
  145874. #elif defined(__clang__)
  145875. "adcs r4, r7\n\t"
  145876. #else
  145877. "adc r4, r7\n\t"
  145878. #endif
  145879. #ifdef WOLFSSL_KEIL
  145880. "adcs r5, r5, %[r]\n\t"
  145881. #elif defined(__clang__)
  145882. "adcs r5, %[r]\n\t"
  145883. #else
  145884. "adc r5, %[r]\n\t"
  145885. #endif
  145886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145887. "lsrs r6, %[a], #16\n\t"
  145888. #else
  145889. "lsr r6, %[a], #16\n\t"
  145890. #endif
  145891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145892. "lsrs r7, %[b], #16\n\t"
  145893. #else
  145894. "lsr r7, %[b], #16\n\t"
  145895. #endif
  145896. #ifdef WOLFSSL_KEIL
  145897. "muls r7, r6, r7\n\t"
  145898. #elif defined(__clang__)
  145899. "muls r7, r6\n\t"
  145900. #else
  145901. "mul r7, r6\n\t"
  145902. #endif
  145903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145904. "adds r4, r4, r7\n\t"
  145905. #else
  145906. "add r4, r4, r7\n\t"
  145907. #endif
  145908. #ifdef WOLFSSL_KEIL
  145909. "adcs r5, r5, %[r]\n\t"
  145910. #elif defined(__clang__)
  145911. "adcs r5, %[r]\n\t"
  145912. #else
  145913. "adc r5, %[r]\n\t"
  145914. #endif
  145915. "uxth r7, %[b]\n\t"
  145916. #ifdef WOLFSSL_KEIL
  145917. "muls r6, r7, r6\n\t"
  145918. #elif defined(__clang__)
  145919. "muls r6, r7\n\t"
  145920. #else
  145921. "mul r6, r7\n\t"
  145922. #endif
  145923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145924. "lsrs r7, r6, #16\n\t"
  145925. #else
  145926. "lsr r7, r6, #16\n\t"
  145927. #endif
  145928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145929. "lsls r6, r6, #16\n\t"
  145930. #else
  145931. "lsl r6, r6, #16\n\t"
  145932. #endif
  145933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145934. "adds r3, r3, r6\n\t"
  145935. #else
  145936. "add r3, r3, r6\n\t"
  145937. #endif
  145938. #ifdef WOLFSSL_KEIL
  145939. "adcs r4, r4, r7\n\t"
  145940. #elif defined(__clang__)
  145941. "adcs r4, r7\n\t"
  145942. #else
  145943. "adc r4, r7\n\t"
  145944. #endif
  145945. #ifdef WOLFSSL_KEIL
  145946. "adcs r5, r5, %[r]\n\t"
  145947. #elif defined(__clang__)
  145948. "adcs r5, %[r]\n\t"
  145949. #else
  145950. "adc r5, %[r]\n\t"
  145951. #endif
  145952. "# A[9] * B[3]\n\t"
  145953. "mov %[a], r9\n\t"
  145954. "mov %[b], r10\n\t"
  145955. "ldr %[a], [%[a], #36]\n\t"
  145956. "ldr %[b], [%[b], #12]\n\t"
  145957. "uxth r6, %[a]\n\t"
  145958. "uxth r7, %[b]\n\t"
  145959. #ifdef WOLFSSL_KEIL
  145960. "muls r7, r6, r7\n\t"
  145961. #elif defined(__clang__)
  145962. "muls r7, r6\n\t"
  145963. #else
  145964. "mul r7, r6\n\t"
  145965. #endif
  145966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145967. "adds r3, r3, r7\n\t"
  145968. #else
  145969. "add r3, r3, r7\n\t"
  145970. #endif
  145971. #ifdef WOLFSSL_KEIL
  145972. "adcs r4, r4, %[r]\n\t"
  145973. #elif defined(__clang__)
  145974. "adcs r4, %[r]\n\t"
  145975. #else
  145976. "adc r4, %[r]\n\t"
  145977. #endif
  145978. #ifdef WOLFSSL_KEIL
  145979. "adcs r5, r5, %[r]\n\t"
  145980. #elif defined(__clang__)
  145981. "adcs r5, %[r]\n\t"
  145982. #else
  145983. "adc r5, %[r]\n\t"
  145984. #endif
  145985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145986. "lsrs r7, %[b], #16\n\t"
  145987. #else
  145988. "lsr r7, %[b], #16\n\t"
  145989. #endif
  145990. #ifdef WOLFSSL_KEIL
  145991. "muls r6, r7, r6\n\t"
  145992. #elif defined(__clang__)
  145993. "muls r6, r7\n\t"
  145994. #else
  145995. "mul r6, r7\n\t"
  145996. #endif
  145997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145998. "lsrs r7, r6, #16\n\t"
  145999. #else
  146000. "lsr r7, r6, #16\n\t"
  146001. #endif
  146002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146003. "lsls r6, r6, #16\n\t"
  146004. #else
  146005. "lsl r6, r6, #16\n\t"
  146006. #endif
  146007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146008. "adds r3, r3, r6\n\t"
  146009. #else
  146010. "add r3, r3, r6\n\t"
  146011. #endif
  146012. #ifdef WOLFSSL_KEIL
  146013. "adcs r4, r4, r7\n\t"
  146014. #elif defined(__clang__)
  146015. "adcs r4, r7\n\t"
  146016. #else
  146017. "adc r4, r7\n\t"
  146018. #endif
  146019. #ifdef WOLFSSL_KEIL
  146020. "adcs r5, r5, %[r]\n\t"
  146021. #elif defined(__clang__)
  146022. "adcs r5, %[r]\n\t"
  146023. #else
  146024. "adc r5, %[r]\n\t"
  146025. #endif
  146026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146027. "lsrs r6, %[a], #16\n\t"
  146028. #else
  146029. "lsr r6, %[a], #16\n\t"
  146030. #endif
  146031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146032. "lsrs r7, %[b], #16\n\t"
  146033. #else
  146034. "lsr r7, %[b], #16\n\t"
  146035. #endif
  146036. #ifdef WOLFSSL_KEIL
  146037. "muls r7, r6, r7\n\t"
  146038. #elif defined(__clang__)
  146039. "muls r7, r6\n\t"
  146040. #else
  146041. "mul r7, r6\n\t"
  146042. #endif
  146043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146044. "adds r4, r4, r7\n\t"
  146045. #else
  146046. "add r4, r4, r7\n\t"
  146047. #endif
  146048. #ifdef WOLFSSL_KEIL
  146049. "adcs r5, r5, %[r]\n\t"
  146050. #elif defined(__clang__)
  146051. "adcs r5, %[r]\n\t"
  146052. #else
  146053. "adc r5, %[r]\n\t"
  146054. #endif
  146055. "uxth r7, %[b]\n\t"
  146056. #ifdef WOLFSSL_KEIL
  146057. "muls r6, r7, r6\n\t"
  146058. #elif defined(__clang__)
  146059. "muls r6, r7\n\t"
  146060. #else
  146061. "mul r6, r7\n\t"
  146062. #endif
  146063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146064. "lsrs r7, r6, #16\n\t"
  146065. #else
  146066. "lsr r7, r6, #16\n\t"
  146067. #endif
  146068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146069. "lsls r6, r6, #16\n\t"
  146070. #else
  146071. "lsl r6, r6, #16\n\t"
  146072. #endif
  146073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146074. "adds r3, r3, r6\n\t"
  146075. #else
  146076. "add r3, r3, r6\n\t"
  146077. #endif
  146078. #ifdef WOLFSSL_KEIL
  146079. "adcs r4, r4, r7\n\t"
  146080. #elif defined(__clang__)
  146081. "adcs r4, r7\n\t"
  146082. #else
  146083. "adc r4, r7\n\t"
  146084. #endif
  146085. #ifdef WOLFSSL_KEIL
  146086. "adcs r5, r5, %[r]\n\t"
  146087. #elif defined(__clang__)
  146088. "adcs r5, %[r]\n\t"
  146089. #else
  146090. "adc r5, %[r]\n\t"
  146091. #endif
  146092. "# A[8] * B[4]\n\t"
  146093. "mov %[a], r9\n\t"
  146094. "mov %[b], r10\n\t"
  146095. "ldr %[a], [%[a], #32]\n\t"
  146096. "ldr %[b], [%[b], #16]\n\t"
  146097. "uxth r6, %[a]\n\t"
  146098. "uxth r7, %[b]\n\t"
  146099. #ifdef WOLFSSL_KEIL
  146100. "muls r7, r6, r7\n\t"
  146101. #elif defined(__clang__)
  146102. "muls r7, r6\n\t"
  146103. #else
  146104. "mul r7, r6\n\t"
  146105. #endif
  146106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146107. "adds r3, r3, r7\n\t"
  146108. #else
  146109. "add r3, r3, r7\n\t"
  146110. #endif
  146111. #ifdef WOLFSSL_KEIL
  146112. "adcs r4, r4, %[r]\n\t"
  146113. #elif defined(__clang__)
  146114. "adcs r4, %[r]\n\t"
  146115. #else
  146116. "adc r4, %[r]\n\t"
  146117. #endif
  146118. #ifdef WOLFSSL_KEIL
  146119. "adcs r5, r5, %[r]\n\t"
  146120. #elif defined(__clang__)
  146121. "adcs r5, %[r]\n\t"
  146122. #else
  146123. "adc r5, %[r]\n\t"
  146124. #endif
  146125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146126. "lsrs r7, %[b], #16\n\t"
  146127. #else
  146128. "lsr r7, %[b], #16\n\t"
  146129. #endif
  146130. #ifdef WOLFSSL_KEIL
  146131. "muls r6, r7, r6\n\t"
  146132. #elif defined(__clang__)
  146133. "muls r6, r7\n\t"
  146134. #else
  146135. "mul r6, r7\n\t"
  146136. #endif
  146137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146138. "lsrs r7, r6, #16\n\t"
  146139. #else
  146140. "lsr r7, r6, #16\n\t"
  146141. #endif
  146142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146143. "lsls r6, r6, #16\n\t"
  146144. #else
  146145. "lsl r6, r6, #16\n\t"
  146146. #endif
  146147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146148. "adds r3, r3, r6\n\t"
  146149. #else
  146150. "add r3, r3, r6\n\t"
  146151. #endif
  146152. #ifdef WOLFSSL_KEIL
  146153. "adcs r4, r4, r7\n\t"
  146154. #elif defined(__clang__)
  146155. "adcs r4, r7\n\t"
  146156. #else
  146157. "adc r4, r7\n\t"
  146158. #endif
  146159. #ifdef WOLFSSL_KEIL
  146160. "adcs r5, r5, %[r]\n\t"
  146161. #elif defined(__clang__)
  146162. "adcs r5, %[r]\n\t"
  146163. #else
  146164. "adc r5, %[r]\n\t"
  146165. #endif
  146166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146167. "lsrs r6, %[a], #16\n\t"
  146168. #else
  146169. "lsr r6, %[a], #16\n\t"
  146170. #endif
  146171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146172. "lsrs r7, %[b], #16\n\t"
  146173. #else
  146174. "lsr r7, %[b], #16\n\t"
  146175. #endif
  146176. #ifdef WOLFSSL_KEIL
  146177. "muls r7, r6, r7\n\t"
  146178. #elif defined(__clang__)
  146179. "muls r7, r6\n\t"
  146180. #else
  146181. "mul r7, r6\n\t"
  146182. #endif
  146183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146184. "adds r4, r4, r7\n\t"
  146185. #else
  146186. "add r4, r4, r7\n\t"
  146187. #endif
  146188. #ifdef WOLFSSL_KEIL
  146189. "adcs r5, r5, %[r]\n\t"
  146190. #elif defined(__clang__)
  146191. "adcs r5, %[r]\n\t"
  146192. #else
  146193. "adc r5, %[r]\n\t"
  146194. #endif
  146195. "uxth r7, %[b]\n\t"
  146196. #ifdef WOLFSSL_KEIL
  146197. "muls r6, r7, r6\n\t"
  146198. #elif defined(__clang__)
  146199. "muls r6, r7\n\t"
  146200. #else
  146201. "mul r6, r7\n\t"
  146202. #endif
  146203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146204. "lsrs r7, r6, #16\n\t"
  146205. #else
  146206. "lsr r7, r6, #16\n\t"
  146207. #endif
  146208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146209. "lsls r6, r6, #16\n\t"
  146210. #else
  146211. "lsl r6, r6, #16\n\t"
  146212. #endif
  146213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146214. "adds r3, r3, r6\n\t"
  146215. #else
  146216. "add r3, r3, r6\n\t"
  146217. #endif
  146218. #ifdef WOLFSSL_KEIL
  146219. "adcs r4, r4, r7\n\t"
  146220. #elif defined(__clang__)
  146221. "adcs r4, r7\n\t"
  146222. #else
  146223. "adc r4, r7\n\t"
  146224. #endif
  146225. #ifdef WOLFSSL_KEIL
  146226. "adcs r5, r5, %[r]\n\t"
  146227. #elif defined(__clang__)
  146228. "adcs r5, %[r]\n\t"
  146229. #else
  146230. "adc r5, %[r]\n\t"
  146231. #endif
  146232. "# A[7] * B[5]\n\t"
  146233. "mov %[a], r9\n\t"
  146234. "mov %[b], r10\n\t"
  146235. "ldr %[a], [%[a], #28]\n\t"
  146236. "ldr %[b], [%[b], #20]\n\t"
  146237. "uxth r6, %[a]\n\t"
  146238. "uxth r7, %[b]\n\t"
  146239. #ifdef WOLFSSL_KEIL
  146240. "muls r7, r6, r7\n\t"
  146241. #elif defined(__clang__)
  146242. "muls r7, r6\n\t"
  146243. #else
  146244. "mul r7, r6\n\t"
  146245. #endif
  146246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146247. "adds r3, r3, r7\n\t"
  146248. #else
  146249. "add r3, r3, r7\n\t"
  146250. #endif
  146251. #ifdef WOLFSSL_KEIL
  146252. "adcs r4, r4, %[r]\n\t"
  146253. #elif defined(__clang__)
  146254. "adcs r4, %[r]\n\t"
  146255. #else
  146256. "adc r4, %[r]\n\t"
  146257. #endif
  146258. #ifdef WOLFSSL_KEIL
  146259. "adcs r5, r5, %[r]\n\t"
  146260. #elif defined(__clang__)
  146261. "adcs r5, %[r]\n\t"
  146262. #else
  146263. "adc r5, %[r]\n\t"
  146264. #endif
  146265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146266. "lsrs r7, %[b], #16\n\t"
  146267. #else
  146268. "lsr r7, %[b], #16\n\t"
  146269. #endif
  146270. #ifdef WOLFSSL_KEIL
  146271. "muls r6, r7, r6\n\t"
  146272. #elif defined(__clang__)
  146273. "muls r6, r7\n\t"
  146274. #else
  146275. "mul r6, r7\n\t"
  146276. #endif
  146277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146278. "lsrs r7, r6, #16\n\t"
  146279. #else
  146280. "lsr r7, r6, #16\n\t"
  146281. #endif
  146282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146283. "lsls r6, r6, #16\n\t"
  146284. #else
  146285. "lsl r6, r6, #16\n\t"
  146286. #endif
  146287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146288. "adds r3, r3, r6\n\t"
  146289. #else
  146290. "add r3, r3, r6\n\t"
  146291. #endif
  146292. #ifdef WOLFSSL_KEIL
  146293. "adcs r4, r4, r7\n\t"
  146294. #elif defined(__clang__)
  146295. "adcs r4, r7\n\t"
  146296. #else
  146297. "adc r4, r7\n\t"
  146298. #endif
  146299. #ifdef WOLFSSL_KEIL
  146300. "adcs r5, r5, %[r]\n\t"
  146301. #elif defined(__clang__)
  146302. "adcs r5, %[r]\n\t"
  146303. #else
  146304. "adc r5, %[r]\n\t"
  146305. #endif
  146306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146307. "lsrs r6, %[a], #16\n\t"
  146308. #else
  146309. "lsr r6, %[a], #16\n\t"
  146310. #endif
  146311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146312. "lsrs r7, %[b], #16\n\t"
  146313. #else
  146314. "lsr r7, %[b], #16\n\t"
  146315. #endif
  146316. #ifdef WOLFSSL_KEIL
  146317. "muls r7, r6, r7\n\t"
  146318. #elif defined(__clang__)
  146319. "muls r7, r6\n\t"
  146320. #else
  146321. "mul r7, r6\n\t"
  146322. #endif
  146323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146324. "adds r4, r4, r7\n\t"
  146325. #else
  146326. "add r4, r4, r7\n\t"
  146327. #endif
  146328. #ifdef WOLFSSL_KEIL
  146329. "adcs r5, r5, %[r]\n\t"
  146330. #elif defined(__clang__)
  146331. "adcs r5, %[r]\n\t"
  146332. #else
  146333. "adc r5, %[r]\n\t"
  146334. #endif
  146335. "uxth r7, %[b]\n\t"
  146336. #ifdef WOLFSSL_KEIL
  146337. "muls r6, r7, r6\n\t"
  146338. #elif defined(__clang__)
  146339. "muls r6, r7\n\t"
  146340. #else
  146341. "mul r6, r7\n\t"
  146342. #endif
  146343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146344. "lsrs r7, r6, #16\n\t"
  146345. #else
  146346. "lsr r7, r6, #16\n\t"
  146347. #endif
  146348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146349. "lsls r6, r6, #16\n\t"
  146350. #else
  146351. "lsl r6, r6, #16\n\t"
  146352. #endif
  146353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146354. "adds r3, r3, r6\n\t"
  146355. #else
  146356. "add r3, r3, r6\n\t"
  146357. #endif
  146358. #ifdef WOLFSSL_KEIL
  146359. "adcs r4, r4, r7\n\t"
  146360. #elif defined(__clang__)
  146361. "adcs r4, r7\n\t"
  146362. #else
  146363. "adc r4, r7\n\t"
  146364. #endif
  146365. #ifdef WOLFSSL_KEIL
  146366. "adcs r5, r5, %[r]\n\t"
  146367. #elif defined(__clang__)
  146368. "adcs r5, %[r]\n\t"
  146369. #else
  146370. "adc r5, %[r]\n\t"
  146371. #endif
  146372. "# A[6] * B[6]\n\t"
  146373. "mov %[a], r9\n\t"
  146374. "mov %[b], r10\n\t"
  146375. "ldr %[a], [%[a], #24]\n\t"
  146376. "ldr %[b], [%[b], #24]\n\t"
  146377. "uxth r6, %[a]\n\t"
  146378. "uxth r7, %[b]\n\t"
  146379. #ifdef WOLFSSL_KEIL
  146380. "muls r7, r6, r7\n\t"
  146381. #elif defined(__clang__)
  146382. "muls r7, r6\n\t"
  146383. #else
  146384. "mul r7, r6\n\t"
  146385. #endif
  146386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146387. "adds r3, r3, r7\n\t"
  146388. #else
  146389. "add r3, r3, r7\n\t"
  146390. #endif
  146391. #ifdef WOLFSSL_KEIL
  146392. "adcs r4, r4, %[r]\n\t"
  146393. #elif defined(__clang__)
  146394. "adcs r4, %[r]\n\t"
  146395. #else
  146396. "adc r4, %[r]\n\t"
  146397. #endif
  146398. #ifdef WOLFSSL_KEIL
  146399. "adcs r5, r5, %[r]\n\t"
  146400. #elif defined(__clang__)
  146401. "adcs r5, %[r]\n\t"
  146402. #else
  146403. "adc r5, %[r]\n\t"
  146404. #endif
  146405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146406. "lsrs r7, %[b], #16\n\t"
  146407. #else
  146408. "lsr r7, %[b], #16\n\t"
  146409. #endif
  146410. #ifdef WOLFSSL_KEIL
  146411. "muls r6, r7, r6\n\t"
  146412. #elif defined(__clang__)
  146413. "muls r6, r7\n\t"
  146414. #else
  146415. "mul r6, r7\n\t"
  146416. #endif
  146417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146418. "lsrs r7, r6, #16\n\t"
  146419. #else
  146420. "lsr r7, r6, #16\n\t"
  146421. #endif
  146422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146423. "lsls r6, r6, #16\n\t"
  146424. #else
  146425. "lsl r6, r6, #16\n\t"
  146426. #endif
  146427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146428. "adds r3, r3, r6\n\t"
  146429. #else
  146430. "add r3, r3, r6\n\t"
  146431. #endif
  146432. #ifdef WOLFSSL_KEIL
  146433. "adcs r4, r4, r7\n\t"
  146434. #elif defined(__clang__)
  146435. "adcs r4, r7\n\t"
  146436. #else
  146437. "adc r4, r7\n\t"
  146438. #endif
  146439. #ifdef WOLFSSL_KEIL
  146440. "adcs r5, r5, %[r]\n\t"
  146441. #elif defined(__clang__)
  146442. "adcs r5, %[r]\n\t"
  146443. #else
  146444. "adc r5, %[r]\n\t"
  146445. #endif
  146446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146447. "lsrs r6, %[a], #16\n\t"
  146448. #else
  146449. "lsr r6, %[a], #16\n\t"
  146450. #endif
  146451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146452. "lsrs r7, %[b], #16\n\t"
  146453. #else
  146454. "lsr r7, %[b], #16\n\t"
  146455. #endif
  146456. #ifdef WOLFSSL_KEIL
  146457. "muls r7, r6, r7\n\t"
  146458. #elif defined(__clang__)
  146459. "muls r7, r6\n\t"
  146460. #else
  146461. "mul r7, r6\n\t"
  146462. #endif
  146463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146464. "adds r4, r4, r7\n\t"
  146465. #else
  146466. "add r4, r4, r7\n\t"
  146467. #endif
  146468. #ifdef WOLFSSL_KEIL
  146469. "adcs r5, r5, %[r]\n\t"
  146470. #elif defined(__clang__)
  146471. "adcs r5, %[r]\n\t"
  146472. #else
  146473. "adc r5, %[r]\n\t"
  146474. #endif
  146475. "uxth r7, %[b]\n\t"
  146476. #ifdef WOLFSSL_KEIL
  146477. "muls r6, r7, r6\n\t"
  146478. #elif defined(__clang__)
  146479. "muls r6, r7\n\t"
  146480. #else
  146481. "mul r6, r7\n\t"
  146482. #endif
  146483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146484. "lsrs r7, r6, #16\n\t"
  146485. #else
  146486. "lsr r7, r6, #16\n\t"
  146487. #endif
  146488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146489. "lsls r6, r6, #16\n\t"
  146490. #else
  146491. "lsl r6, r6, #16\n\t"
  146492. #endif
  146493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146494. "adds r3, r3, r6\n\t"
  146495. #else
  146496. "add r3, r3, r6\n\t"
  146497. #endif
  146498. #ifdef WOLFSSL_KEIL
  146499. "adcs r4, r4, r7\n\t"
  146500. #elif defined(__clang__)
  146501. "adcs r4, r7\n\t"
  146502. #else
  146503. "adc r4, r7\n\t"
  146504. #endif
  146505. #ifdef WOLFSSL_KEIL
  146506. "adcs r5, r5, %[r]\n\t"
  146507. #elif defined(__clang__)
  146508. "adcs r5, %[r]\n\t"
  146509. #else
  146510. "adc r5, %[r]\n\t"
  146511. #endif
  146512. "# A[5] * B[7]\n\t"
  146513. "mov %[a], r9\n\t"
  146514. "mov %[b], r10\n\t"
  146515. "ldr %[a], [%[a], #20]\n\t"
  146516. "ldr %[b], [%[b], #28]\n\t"
  146517. "uxth r6, %[a]\n\t"
  146518. "uxth r7, %[b]\n\t"
  146519. #ifdef WOLFSSL_KEIL
  146520. "muls r7, r6, r7\n\t"
  146521. #elif defined(__clang__)
  146522. "muls r7, r6\n\t"
  146523. #else
  146524. "mul r7, r6\n\t"
  146525. #endif
  146526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146527. "adds r3, r3, r7\n\t"
  146528. #else
  146529. "add r3, r3, r7\n\t"
  146530. #endif
  146531. #ifdef WOLFSSL_KEIL
  146532. "adcs r4, r4, %[r]\n\t"
  146533. #elif defined(__clang__)
  146534. "adcs r4, %[r]\n\t"
  146535. #else
  146536. "adc r4, %[r]\n\t"
  146537. #endif
  146538. #ifdef WOLFSSL_KEIL
  146539. "adcs r5, r5, %[r]\n\t"
  146540. #elif defined(__clang__)
  146541. "adcs r5, %[r]\n\t"
  146542. #else
  146543. "adc r5, %[r]\n\t"
  146544. #endif
  146545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146546. "lsrs r7, %[b], #16\n\t"
  146547. #else
  146548. "lsr r7, %[b], #16\n\t"
  146549. #endif
  146550. #ifdef WOLFSSL_KEIL
  146551. "muls r6, r7, r6\n\t"
  146552. #elif defined(__clang__)
  146553. "muls r6, r7\n\t"
  146554. #else
  146555. "mul r6, r7\n\t"
  146556. #endif
  146557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146558. "lsrs r7, r6, #16\n\t"
  146559. #else
  146560. "lsr r7, r6, #16\n\t"
  146561. #endif
  146562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146563. "lsls r6, r6, #16\n\t"
  146564. #else
  146565. "lsl r6, r6, #16\n\t"
  146566. #endif
  146567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146568. "adds r3, r3, r6\n\t"
  146569. #else
  146570. "add r3, r3, r6\n\t"
  146571. #endif
  146572. #ifdef WOLFSSL_KEIL
  146573. "adcs r4, r4, r7\n\t"
  146574. #elif defined(__clang__)
  146575. "adcs r4, r7\n\t"
  146576. #else
  146577. "adc r4, r7\n\t"
  146578. #endif
  146579. #ifdef WOLFSSL_KEIL
  146580. "adcs r5, r5, %[r]\n\t"
  146581. #elif defined(__clang__)
  146582. "adcs r5, %[r]\n\t"
  146583. #else
  146584. "adc r5, %[r]\n\t"
  146585. #endif
  146586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146587. "lsrs r6, %[a], #16\n\t"
  146588. #else
  146589. "lsr r6, %[a], #16\n\t"
  146590. #endif
  146591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146592. "lsrs r7, %[b], #16\n\t"
  146593. #else
  146594. "lsr r7, %[b], #16\n\t"
  146595. #endif
  146596. #ifdef WOLFSSL_KEIL
  146597. "muls r7, r6, r7\n\t"
  146598. #elif defined(__clang__)
  146599. "muls r7, r6\n\t"
  146600. #else
  146601. "mul r7, r6\n\t"
  146602. #endif
  146603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146604. "adds r4, r4, r7\n\t"
  146605. #else
  146606. "add r4, r4, r7\n\t"
  146607. #endif
  146608. #ifdef WOLFSSL_KEIL
  146609. "adcs r5, r5, %[r]\n\t"
  146610. #elif defined(__clang__)
  146611. "adcs r5, %[r]\n\t"
  146612. #else
  146613. "adc r5, %[r]\n\t"
  146614. #endif
  146615. "uxth r7, %[b]\n\t"
  146616. #ifdef WOLFSSL_KEIL
  146617. "muls r6, r7, r6\n\t"
  146618. #elif defined(__clang__)
  146619. "muls r6, r7\n\t"
  146620. #else
  146621. "mul r6, r7\n\t"
  146622. #endif
  146623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146624. "lsrs r7, r6, #16\n\t"
  146625. #else
  146626. "lsr r7, r6, #16\n\t"
  146627. #endif
  146628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146629. "lsls r6, r6, #16\n\t"
  146630. #else
  146631. "lsl r6, r6, #16\n\t"
  146632. #endif
  146633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146634. "adds r3, r3, r6\n\t"
  146635. #else
  146636. "add r3, r3, r6\n\t"
  146637. #endif
  146638. #ifdef WOLFSSL_KEIL
  146639. "adcs r4, r4, r7\n\t"
  146640. #elif defined(__clang__)
  146641. "adcs r4, r7\n\t"
  146642. #else
  146643. "adc r4, r7\n\t"
  146644. #endif
  146645. #ifdef WOLFSSL_KEIL
  146646. "adcs r5, r5, %[r]\n\t"
  146647. #elif defined(__clang__)
  146648. "adcs r5, %[r]\n\t"
  146649. #else
  146650. "adc r5, %[r]\n\t"
  146651. #endif
  146652. "# A[4] * B[8]\n\t"
  146653. "mov %[a], r9\n\t"
  146654. "mov %[b], r10\n\t"
  146655. "ldr %[a], [%[a], #16]\n\t"
  146656. "ldr %[b], [%[b], #32]\n\t"
  146657. "uxth r6, %[a]\n\t"
  146658. "uxth r7, %[b]\n\t"
  146659. #ifdef WOLFSSL_KEIL
  146660. "muls r7, r6, r7\n\t"
  146661. #elif defined(__clang__)
  146662. "muls r7, r6\n\t"
  146663. #else
  146664. "mul r7, r6\n\t"
  146665. #endif
  146666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146667. "adds r3, r3, r7\n\t"
  146668. #else
  146669. "add r3, r3, r7\n\t"
  146670. #endif
  146671. #ifdef WOLFSSL_KEIL
  146672. "adcs r4, r4, %[r]\n\t"
  146673. #elif defined(__clang__)
  146674. "adcs r4, %[r]\n\t"
  146675. #else
  146676. "adc r4, %[r]\n\t"
  146677. #endif
  146678. #ifdef WOLFSSL_KEIL
  146679. "adcs r5, r5, %[r]\n\t"
  146680. #elif defined(__clang__)
  146681. "adcs r5, %[r]\n\t"
  146682. #else
  146683. "adc r5, %[r]\n\t"
  146684. #endif
  146685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146686. "lsrs r7, %[b], #16\n\t"
  146687. #else
  146688. "lsr r7, %[b], #16\n\t"
  146689. #endif
  146690. #ifdef WOLFSSL_KEIL
  146691. "muls r6, r7, r6\n\t"
  146692. #elif defined(__clang__)
  146693. "muls r6, r7\n\t"
  146694. #else
  146695. "mul r6, r7\n\t"
  146696. #endif
  146697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146698. "lsrs r7, r6, #16\n\t"
  146699. #else
  146700. "lsr r7, r6, #16\n\t"
  146701. #endif
  146702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146703. "lsls r6, r6, #16\n\t"
  146704. #else
  146705. "lsl r6, r6, #16\n\t"
  146706. #endif
  146707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146708. "adds r3, r3, r6\n\t"
  146709. #else
  146710. "add r3, r3, r6\n\t"
  146711. #endif
  146712. #ifdef WOLFSSL_KEIL
  146713. "adcs r4, r4, r7\n\t"
  146714. #elif defined(__clang__)
  146715. "adcs r4, r7\n\t"
  146716. #else
  146717. "adc r4, r7\n\t"
  146718. #endif
  146719. #ifdef WOLFSSL_KEIL
  146720. "adcs r5, r5, %[r]\n\t"
  146721. #elif defined(__clang__)
  146722. "adcs r5, %[r]\n\t"
  146723. #else
  146724. "adc r5, %[r]\n\t"
  146725. #endif
  146726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146727. "lsrs r6, %[a], #16\n\t"
  146728. #else
  146729. "lsr r6, %[a], #16\n\t"
  146730. #endif
  146731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146732. "lsrs r7, %[b], #16\n\t"
  146733. #else
  146734. "lsr r7, %[b], #16\n\t"
  146735. #endif
  146736. #ifdef WOLFSSL_KEIL
  146737. "muls r7, r6, r7\n\t"
  146738. #elif defined(__clang__)
  146739. "muls r7, r6\n\t"
  146740. #else
  146741. "mul r7, r6\n\t"
  146742. #endif
  146743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146744. "adds r4, r4, r7\n\t"
  146745. #else
  146746. "add r4, r4, r7\n\t"
  146747. #endif
  146748. #ifdef WOLFSSL_KEIL
  146749. "adcs r5, r5, %[r]\n\t"
  146750. #elif defined(__clang__)
  146751. "adcs r5, %[r]\n\t"
  146752. #else
  146753. "adc r5, %[r]\n\t"
  146754. #endif
  146755. "uxth r7, %[b]\n\t"
  146756. #ifdef WOLFSSL_KEIL
  146757. "muls r6, r7, r6\n\t"
  146758. #elif defined(__clang__)
  146759. "muls r6, r7\n\t"
  146760. #else
  146761. "mul r6, r7\n\t"
  146762. #endif
  146763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146764. "lsrs r7, r6, #16\n\t"
  146765. #else
  146766. "lsr r7, r6, #16\n\t"
  146767. #endif
  146768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146769. "lsls r6, r6, #16\n\t"
  146770. #else
  146771. "lsl r6, r6, #16\n\t"
  146772. #endif
  146773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146774. "adds r3, r3, r6\n\t"
  146775. #else
  146776. "add r3, r3, r6\n\t"
  146777. #endif
  146778. #ifdef WOLFSSL_KEIL
  146779. "adcs r4, r4, r7\n\t"
  146780. #elif defined(__clang__)
  146781. "adcs r4, r7\n\t"
  146782. #else
  146783. "adc r4, r7\n\t"
  146784. #endif
  146785. #ifdef WOLFSSL_KEIL
  146786. "adcs r5, r5, %[r]\n\t"
  146787. #elif defined(__clang__)
  146788. "adcs r5, %[r]\n\t"
  146789. #else
  146790. "adc r5, %[r]\n\t"
  146791. #endif
  146792. "# A[3] * B[9]\n\t"
  146793. "mov %[a], r9\n\t"
  146794. "mov %[b], r10\n\t"
  146795. "ldr %[a], [%[a], #12]\n\t"
  146796. "ldr %[b], [%[b], #36]\n\t"
  146797. "uxth r6, %[a]\n\t"
  146798. "uxth r7, %[b]\n\t"
  146799. #ifdef WOLFSSL_KEIL
  146800. "muls r7, r6, r7\n\t"
  146801. #elif defined(__clang__)
  146802. "muls r7, r6\n\t"
  146803. #else
  146804. "mul r7, r6\n\t"
  146805. #endif
  146806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146807. "adds r3, r3, r7\n\t"
  146808. #else
  146809. "add r3, r3, r7\n\t"
  146810. #endif
  146811. #ifdef WOLFSSL_KEIL
  146812. "adcs r4, r4, %[r]\n\t"
  146813. #elif defined(__clang__)
  146814. "adcs r4, %[r]\n\t"
  146815. #else
  146816. "adc r4, %[r]\n\t"
  146817. #endif
  146818. #ifdef WOLFSSL_KEIL
  146819. "adcs r5, r5, %[r]\n\t"
  146820. #elif defined(__clang__)
  146821. "adcs r5, %[r]\n\t"
  146822. #else
  146823. "adc r5, %[r]\n\t"
  146824. #endif
  146825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146826. "lsrs r7, %[b], #16\n\t"
  146827. #else
  146828. "lsr r7, %[b], #16\n\t"
  146829. #endif
  146830. #ifdef WOLFSSL_KEIL
  146831. "muls r6, r7, r6\n\t"
  146832. #elif defined(__clang__)
  146833. "muls r6, r7\n\t"
  146834. #else
  146835. "mul r6, r7\n\t"
  146836. #endif
  146837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146838. "lsrs r7, r6, #16\n\t"
  146839. #else
  146840. "lsr r7, r6, #16\n\t"
  146841. #endif
  146842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146843. "lsls r6, r6, #16\n\t"
  146844. #else
  146845. "lsl r6, r6, #16\n\t"
  146846. #endif
  146847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146848. "adds r3, r3, r6\n\t"
  146849. #else
  146850. "add r3, r3, r6\n\t"
  146851. #endif
  146852. #ifdef WOLFSSL_KEIL
  146853. "adcs r4, r4, r7\n\t"
  146854. #elif defined(__clang__)
  146855. "adcs r4, r7\n\t"
  146856. #else
  146857. "adc r4, r7\n\t"
  146858. #endif
  146859. #ifdef WOLFSSL_KEIL
  146860. "adcs r5, r5, %[r]\n\t"
  146861. #elif defined(__clang__)
  146862. "adcs r5, %[r]\n\t"
  146863. #else
  146864. "adc r5, %[r]\n\t"
  146865. #endif
  146866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146867. "lsrs r6, %[a], #16\n\t"
  146868. #else
  146869. "lsr r6, %[a], #16\n\t"
  146870. #endif
  146871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146872. "lsrs r7, %[b], #16\n\t"
  146873. #else
  146874. "lsr r7, %[b], #16\n\t"
  146875. #endif
  146876. #ifdef WOLFSSL_KEIL
  146877. "muls r7, r6, r7\n\t"
  146878. #elif defined(__clang__)
  146879. "muls r7, r6\n\t"
  146880. #else
  146881. "mul r7, r6\n\t"
  146882. #endif
  146883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146884. "adds r4, r4, r7\n\t"
  146885. #else
  146886. "add r4, r4, r7\n\t"
  146887. #endif
  146888. #ifdef WOLFSSL_KEIL
  146889. "adcs r5, r5, %[r]\n\t"
  146890. #elif defined(__clang__)
  146891. "adcs r5, %[r]\n\t"
  146892. #else
  146893. "adc r5, %[r]\n\t"
  146894. #endif
  146895. "uxth r7, %[b]\n\t"
  146896. #ifdef WOLFSSL_KEIL
  146897. "muls r6, r7, r6\n\t"
  146898. #elif defined(__clang__)
  146899. "muls r6, r7\n\t"
  146900. #else
  146901. "mul r6, r7\n\t"
  146902. #endif
  146903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146904. "lsrs r7, r6, #16\n\t"
  146905. #else
  146906. "lsr r7, r6, #16\n\t"
  146907. #endif
  146908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146909. "lsls r6, r6, #16\n\t"
  146910. #else
  146911. "lsl r6, r6, #16\n\t"
  146912. #endif
  146913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146914. "adds r3, r3, r6\n\t"
  146915. #else
  146916. "add r3, r3, r6\n\t"
  146917. #endif
  146918. #ifdef WOLFSSL_KEIL
  146919. "adcs r4, r4, r7\n\t"
  146920. #elif defined(__clang__)
  146921. "adcs r4, r7\n\t"
  146922. #else
  146923. "adc r4, r7\n\t"
  146924. #endif
  146925. #ifdef WOLFSSL_KEIL
  146926. "adcs r5, r5, %[r]\n\t"
  146927. #elif defined(__clang__)
  146928. "adcs r5, %[r]\n\t"
  146929. #else
  146930. "adc r5, %[r]\n\t"
  146931. #endif
  146932. "# A[2] * B[10]\n\t"
  146933. "mov %[a], r9\n\t"
  146934. "mov %[b], r10\n\t"
  146935. "ldr %[a], [%[a], #8]\n\t"
  146936. "ldr %[b], [%[b], #40]\n\t"
  146937. "uxth r6, %[a]\n\t"
  146938. "uxth r7, %[b]\n\t"
  146939. #ifdef WOLFSSL_KEIL
  146940. "muls r7, r6, r7\n\t"
  146941. #elif defined(__clang__)
  146942. "muls r7, r6\n\t"
  146943. #else
  146944. "mul r7, r6\n\t"
  146945. #endif
  146946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146947. "adds r3, r3, r7\n\t"
  146948. #else
  146949. "add r3, r3, r7\n\t"
  146950. #endif
  146951. #ifdef WOLFSSL_KEIL
  146952. "adcs r4, r4, %[r]\n\t"
  146953. #elif defined(__clang__)
  146954. "adcs r4, %[r]\n\t"
  146955. #else
  146956. "adc r4, %[r]\n\t"
  146957. #endif
  146958. #ifdef WOLFSSL_KEIL
  146959. "adcs r5, r5, %[r]\n\t"
  146960. #elif defined(__clang__)
  146961. "adcs r5, %[r]\n\t"
  146962. #else
  146963. "adc r5, %[r]\n\t"
  146964. #endif
  146965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146966. "lsrs r7, %[b], #16\n\t"
  146967. #else
  146968. "lsr r7, %[b], #16\n\t"
  146969. #endif
  146970. #ifdef WOLFSSL_KEIL
  146971. "muls r6, r7, r6\n\t"
  146972. #elif defined(__clang__)
  146973. "muls r6, r7\n\t"
  146974. #else
  146975. "mul r6, r7\n\t"
  146976. #endif
  146977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146978. "lsrs r7, r6, #16\n\t"
  146979. #else
  146980. "lsr r7, r6, #16\n\t"
  146981. #endif
  146982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146983. "lsls r6, r6, #16\n\t"
  146984. #else
  146985. "lsl r6, r6, #16\n\t"
  146986. #endif
  146987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146988. "adds r3, r3, r6\n\t"
  146989. #else
  146990. "add r3, r3, r6\n\t"
  146991. #endif
  146992. #ifdef WOLFSSL_KEIL
  146993. "adcs r4, r4, r7\n\t"
  146994. #elif defined(__clang__)
  146995. "adcs r4, r7\n\t"
  146996. #else
  146997. "adc r4, r7\n\t"
  146998. #endif
  146999. #ifdef WOLFSSL_KEIL
  147000. "adcs r5, r5, %[r]\n\t"
  147001. #elif defined(__clang__)
  147002. "adcs r5, %[r]\n\t"
  147003. #else
  147004. "adc r5, %[r]\n\t"
  147005. #endif
  147006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147007. "lsrs r6, %[a], #16\n\t"
  147008. #else
  147009. "lsr r6, %[a], #16\n\t"
  147010. #endif
  147011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147012. "lsrs r7, %[b], #16\n\t"
  147013. #else
  147014. "lsr r7, %[b], #16\n\t"
  147015. #endif
  147016. #ifdef WOLFSSL_KEIL
  147017. "muls r7, r6, r7\n\t"
  147018. #elif defined(__clang__)
  147019. "muls r7, r6\n\t"
  147020. #else
  147021. "mul r7, r6\n\t"
  147022. #endif
  147023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147024. "adds r4, r4, r7\n\t"
  147025. #else
  147026. "add r4, r4, r7\n\t"
  147027. #endif
  147028. #ifdef WOLFSSL_KEIL
  147029. "adcs r5, r5, %[r]\n\t"
  147030. #elif defined(__clang__)
  147031. "adcs r5, %[r]\n\t"
  147032. #else
  147033. "adc r5, %[r]\n\t"
  147034. #endif
  147035. "uxth r7, %[b]\n\t"
  147036. #ifdef WOLFSSL_KEIL
  147037. "muls r6, r7, r6\n\t"
  147038. #elif defined(__clang__)
  147039. "muls r6, r7\n\t"
  147040. #else
  147041. "mul r6, r7\n\t"
  147042. #endif
  147043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147044. "lsrs r7, r6, #16\n\t"
  147045. #else
  147046. "lsr r7, r6, #16\n\t"
  147047. #endif
  147048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147049. "lsls r6, r6, #16\n\t"
  147050. #else
  147051. "lsl r6, r6, #16\n\t"
  147052. #endif
  147053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147054. "adds r3, r3, r6\n\t"
  147055. #else
  147056. "add r3, r3, r6\n\t"
  147057. #endif
  147058. #ifdef WOLFSSL_KEIL
  147059. "adcs r4, r4, r7\n\t"
  147060. #elif defined(__clang__)
  147061. "adcs r4, r7\n\t"
  147062. #else
  147063. "adc r4, r7\n\t"
  147064. #endif
  147065. #ifdef WOLFSSL_KEIL
  147066. "adcs r5, r5, %[r]\n\t"
  147067. #elif defined(__clang__)
  147068. "adcs r5, %[r]\n\t"
  147069. #else
  147070. "adc r5, %[r]\n\t"
  147071. #endif
  147072. "# A[1] * B[11]\n\t"
  147073. "mov %[a], r9\n\t"
  147074. "mov %[b], r10\n\t"
  147075. "ldr %[a], [%[a], #4]\n\t"
  147076. "ldr %[b], [%[b], #44]\n\t"
  147077. "uxth r6, %[a]\n\t"
  147078. "uxth r7, %[b]\n\t"
  147079. #ifdef WOLFSSL_KEIL
  147080. "muls r7, r6, r7\n\t"
  147081. #elif defined(__clang__)
  147082. "muls r7, r6\n\t"
  147083. #else
  147084. "mul r7, r6\n\t"
  147085. #endif
  147086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147087. "adds r3, r3, r7\n\t"
  147088. #else
  147089. "add r3, r3, r7\n\t"
  147090. #endif
  147091. #ifdef WOLFSSL_KEIL
  147092. "adcs r4, r4, %[r]\n\t"
  147093. #elif defined(__clang__)
  147094. "adcs r4, %[r]\n\t"
  147095. #else
  147096. "adc r4, %[r]\n\t"
  147097. #endif
  147098. #ifdef WOLFSSL_KEIL
  147099. "adcs r5, r5, %[r]\n\t"
  147100. #elif defined(__clang__)
  147101. "adcs r5, %[r]\n\t"
  147102. #else
  147103. "adc r5, %[r]\n\t"
  147104. #endif
  147105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147106. "lsrs r7, %[b], #16\n\t"
  147107. #else
  147108. "lsr r7, %[b], #16\n\t"
  147109. #endif
  147110. #ifdef WOLFSSL_KEIL
  147111. "muls r6, r7, r6\n\t"
  147112. #elif defined(__clang__)
  147113. "muls r6, r7\n\t"
  147114. #else
  147115. "mul r6, r7\n\t"
  147116. #endif
  147117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147118. "lsrs r7, r6, #16\n\t"
  147119. #else
  147120. "lsr r7, r6, #16\n\t"
  147121. #endif
  147122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147123. "lsls r6, r6, #16\n\t"
  147124. #else
  147125. "lsl r6, r6, #16\n\t"
  147126. #endif
  147127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147128. "adds r3, r3, r6\n\t"
  147129. #else
  147130. "add r3, r3, r6\n\t"
  147131. #endif
  147132. #ifdef WOLFSSL_KEIL
  147133. "adcs r4, r4, r7\n\t"
  147134. #elif defined(__clang__)
  147135. "adcs r4, r7\n\t"
  147136. #else
  147137. "adc r4, r7\n\t"
  147138. #endif
  147139. #ifdef WOLFSSL_KEIL
  147140. "adcs r5, r5, %[r]\n\t"
  147141. #elif defined(__clang__)
  147142. "adcs r5, %[r]\n\t"
  147143. #else
  147144. "adc r5, %[r]\n\t"
  147145. #endif
  147146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147147. "lsrs r6, %[a], #16\n\t"
  147148. #else
  147149. "lsr r6, %[a], #16\n\t"
  147150. #endif
  147151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147152. "lsrs r7, %[b], #16\n\t"
  147153. #else
  147154. "lsr r7, %[b], #16\n\t"
  147155. #endif
  147156. #ifdef WOLFSSL_KEIL
  147157. "muls r7, r6, r7\n\t"
  147158. #elif defined(__clang__)
  147159. "muls r7, r6\n\t"
  147160. #else
  147161. "mul r7, r6\n\t"
  147162. #endif
  147163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147164. "adds r4, r4, r7\n\t"
  147165. #else
  147166. "add r4, r4, r7\n\t"
  147167. #endif
  147168. #ifdef WOLFSSL_KEIL
  147169. "adcs r5, r5, %[r]\n\t"
  147170. #elif defined(__clang__)
  147171. "adcs r5, %[r]\n\t"
  147172. #else
  147173. "adc r5, %[r]\n\t"
  147174. #endif
  147175. "uxth r7, %[b]\n\t"
  147176. #ifdef WOLFSSL_KEIL
  147177. "muls r6, r7, r6\n\t"
  147178. #elif defined(__clang__)
  147179. "muls r6, r7\n\t"
  147180. #else
  147181. "mul r6, r7\n\t"
  147182. #endif
  147183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147184. "lsrs r7, r6, #16\n\t"
  147185. #else
  147186. "lsr r7, r6, #16\n\t"
  147187. #endif
  147188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147189. "lsls r6, r6, #16\n\t"
  147190. #else
  147191. "lsl r6, r6, #16\n\t"
  147192. #endif
  147193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147194. "adds r3, r3, r6\n\t"
  147195. #else
  147196. "add r3, r3, r6\n\t"
  147197. #endif
  147198. #ifdef WOLFSSL_KEIL
  147199. "adcs r4, r4, r7\n\t"
  147200. #elif defined(__clang__)
  147201. "adcs r4, r7\n\t"
  147202. #else
  147203. "adc r4, r7\n\t"
  147204. #endif
  147205. #ifdef WOLFSSL_KEIL
  147206. "adcs r5, r5, %[r]\n\t"
  147207. #elif defined(__clang__)
  147208. "adcs r5, %[r]\n\t"
  147209. #else
  147210. "adc r5, %[r]\n\t"
  147211. #endif
  147212. "# A[0] * B[12]\n\t"
  147213. "mov %[a], r9\n\t"
  147214. "mov %[b], r10\n\t"
  147215. "ldr %[a], [%[a]]\n\t"
  147216. "ldr %[b], [%[b], #48]\n\t"
  147217. "uxth r6, %[a]\n\t"
  147218. "uxth r7, %[b]\n\t"
  147219. #ifdef WOLFSSL_KEIL
  147220. "muls r7, r6, r7\n\t"
  147221. #elif defined(__clang__)
  147222. "muls r7, r6\n\t"
  147223. #else
  147224. "mul r7, r6\n\t"
  147225. #endif
  147226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147227. "adds r3, r3, r7\n\t"
  147228. #else
  147229. "add r3, r3, r7\n\t"
  147230. #endif
  147231. #ifdef WOLFSSL_KEIL
  147232. "adcs r4, r4, %[r]\n\t"
  147233. #elif defined(__clang__)
  147234. "adcs r4, %[r]\n\t"
  147235. #else
  147236. "adc r4, %[r]\n\t"
  147237. #endif
  147238. #ifdef WOLFSSL_KEIL
  147239. "adcs r5, r5, %[r]\n\t"
  147240. #elif defined(__clang__)
  147241. "adcs r5, %[r]\n\t"
  147242. #else
  147243. "adc r5, %[r]\n\t"
  147244. #endif
  147245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147246. "lsrs r7, %[b], #16\n\t"
  147247. #else
  147248. "lsr r7, %[b], #16\n\t"
  147249. #endif
  147250. #ifdef WOLFSSL_KEIL
  147251. "muls r6, r7, r6\n\t"
  147252. #elif defined(__clang__)
  147253. "muls r6, r7\n\t"
  147254. #else
  147255. "mul r6, r7\n\t"
  147256. #endif
  147257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147258. "lsrs r7, r6, #16\n\t"
  147259. #else
  147260. "lsr r7, r6, #16\n\t"
  147261. #endif
  147262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147263. "lsls r6, r6, #16\n\t"
  147264. #else
  147265. "lsl r6, r6, #16\n\t"
  147266. #endif
  147267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147268. "adds r3, r3, r6\n\t"
  147269. #else
  147270. "add r3, r3, r6\n\t"
  147271. #endif
  147272. #ifdef WOLFSSL_KEIL
  147273. "adcs r4, r4, r7\n\t"
  147274. #elif defined(__clang__)
  147275. "adcs r4, r7\n\t"
  147276. #else
  147277. "adc r4, r7\n\t"
  147278. #endif
  147279. #ifdef WOLFSSL_KEIL
  147280. "adcs r5, r5, %[r]\n\t"
  147281. #elif defined(__clang__)
  147282. "adcs r5, %[r]\n\t"
  147283. #else
  147284. "adc r5, %[r]\n\t"
  147285. #endif
  147286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147287. "lsrs r6, %[a], #16\n\t"
  147288. #else
  147289. "lsr r6, %[a], #16\n\t"
  147290. #endif
  147291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147292. "lsrs r7, %[b], #16\n\t"
  147293. #else
  147294. "lsr r7, %[b], #16\n\t"
  147295. #endif
  147296. #ifdef WOLFSSL_KEIL
  147297. "muls r7, r6, r7\n\t"
  147298. #elif defined(__clang__)
  147299. "muls r7, r6\n\t"
  147300. #else
  147301. "mul r7, r6\n\t"
  147302. #endif
  147303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147304. "adds r4, r4, r7\n\t"
  147305. #else
  147306. "add r4, r4, r7\n\t"
  147307. #endif
  147308. #ifdef WOLFSSL_KEIL
  147309. "adcs r5, r5, %[r]\n\t"
  147310. #elif defined(__clang__)
  147311. "adcs r5, %[r]\n\t"
  147312. #else
  147313. "adc r5, %[r]\n\t"
  147314. #endif
  147315. "uxth r7, %[b]\n\t"
  147316. #ifdef WOLFSSL_KEIL
  147317. "muls r6, r7, r6\n\t"
  147318. #elif defined(__clang__)
  147319. "muls r6, r7\n\t"
  147320. #else
  147321. "mul r6, r7\n\t"
  147322. #endif
  147323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147324. "lsrs r7, r6, #16\n\t"
  147325. #else
  147326. "lsr r7, r6, #16\n\t"
  147327. #endif
  147328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147329. "lsls r6, r6, #16\n\t"
  147330. #else
  147331. "lsl r6, r6, #16\n\t"
  147332. #endif
  147333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147334. "adds r3, r3, r6\n\t"
  147335. #else
  147336. "add r3, r3, r6\n\t"
  147337. #endif
  147338. #ifdef WOLFSSL_KEIL
  147339. "adcs r4, r4, r7\n\t"
  147340. #elif defined(__clang__)
  147341. "adcs r4, r7\n\t"
  147342. #else
  147343. "adc r4, r7\n\t"
  147344. #endif
  147345. #ifdef WOLFSSL_KEIL
  147346. "adcs r5, r5, %[r]\n\t"
  147347. #elif defined(__clang__)
  147348. "adcs r5, %[r]\n\t"
  147349. #else
  147350. "adc r5, %[r]\n\t"
  147351. #endif
  147352. "str r3, [sp, #48]\n\t"
  147353. "# A[0] * B[13]\n\t"
  147354. "movs r3, #0\n\t"
  147355. "mov %[a], r9\n\t"
  147356. "mov %[b], r10\n\t"
  147357. "ldr %[a], [%[a]]\n\t"
  147358. "ldr %[b], [%[b], #52]\n\t"
  147359. "uxth r6, %[a]\n\t"
  147360. "uxth r7, %[b]\n\t"
  147361. #ifdef WOLFSSL_KEIL
  147362. "muls r7, r6, r7\n\t"
  147363. #elif defined(__clang__)
  147364. "muls r7, r6\n\t"
  147365. #else
  147366. "mul r7, r6\n\t"
  147367. #endif
  147368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147369. "adds r4, r4, r7\n\t"
  147370. #else
  147371. "add r4, r4, r7\n\t"
  147372. #endif
  147373. #ifdef WOLFSSL_KEIL
  147374. "adcs r5, r5, %[r]\n\t"
  147375. #elif defined(__clang__)
  147376. "adcs r5, %[r]\n\t"
  147377. #else
  147378. "adc r5, %[r]\n\t"
  147379. #endif
  147380. #ifdef WOLFSSL_KEIL
  147381. "adcs r3, r3, %[r]\n\t"
  147382. #elif defined(__clang__)
  147383. "adcs r3, %[r]\n\t"
  147384. #else
  147385. "adc r3, %[r]\n\t"
  147386. #endif
  147387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147388. "lsrs r7, %[b], #16\n\t"
  147389. #else
  147390. "lsr r7, %[b], #16\n\t"
  147391. #endif
  147392. #ifdef WOLFSSL_KEIL
  147393. "muls r6, r7, r6\n\t"
  147394. #elif defined(__clang__)
  147395. "muls r6, r7\n\t"
  147396. #else
  147397. "mul r6, r7\n\t"
  147398. #endif
  147399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147400. "lsrs r7, r6, #16\n\t"
  147401. #else
  147402. "lsr r7, r6, #16\n\t"
  147403. #endif
  147404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147405. "lsls r6, r6, #16\n\t"
  147406. #else
  147407. "lsl r6, r6, #16\n\t"
  147408. #endif
  147409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147410. "adds r4, r4, r6\n\t"
  147411. #else
  147412. "add r4, r4, r6\n\t"
  147413. #endif
  147414. #ifdef WOLFSSL_KEIL
  147415. "adcs r5, r5, r7\n\t"
  147416. #elif defined(__clang__)
  147417. "adcs r5, r7\n\t"
  147418. #else
  147419. "adc r5, r7\n\t"
  147420. #endif
  147421. #ifdef WOLFSSL_KEIL
  147422. "adcs r3, r3, %[r]\n\t"
  147423. #elif defined(__clang__)
  147424. "adcs r3, %[r]\n\t"
  147425. #else
  147426. "adc r3, %[r]\n\t"
  147427. #endif
  147428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147429. "lsrs r6, %[a], #16\n\t"
  147430. #else
  147431. "lsr r6, %[a], #16\n\t"
  147432. #endif
  147433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147434. "lsrs r7, %[b], #16\n\t"
  147435. #else
  147436. "lsr r7, %[b], #16\n\t"
  147437. #endif
  147438. #ifdef WOLFSSL_KEIL
  147439. "muls r7, r6, r7\n\t"
  147440. #elif defined(__clang__)
  147441. "muls r7, r6\n\t"
  147442. #else
  147443. "mul r7, r6\n\t"
  147444. #endif
  147445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147446. "adds r5, r5, r7\n\t"
  147447. #else
  147448. "add r5, r5, r7\n\t"
  147449. #endif
  147450. #ifdef WOLFSSL_KEIL
  147451. "adcs r3, r3, %[r]\n\t"
  147452. #elif defined(__clang__)
  147453. "adcs r3, %[r]\n\t"
  147454. #else
  147455. "adc r3, %[r]\n\t"
  147456. #endif
  147457. "uxth r7, %[b]\n\t"
  147458. #ifdef WOLFSSL_KEIL
  147459. "muls r6, r7, r6\n\t"
  147460. #elif defined(__clang__)
  147461. "muls r6, r7\n\t"
  147462. #else
  147463. "mul r6, r7\n\t"
  147464. #endif
  147465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147466. "lsrs r7, r6, #16\n\t"
  147467. #else
  147468. "lsr r7, r6, #16\n\t"
  147469. #endif
  147470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147471. "lsls r6, r6, #16\n\t"
  147472. #else
  147473. "lsl r6, r6, #16\n\t"
  147474. #endif
  147475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147476. "adds r4, r4, r6\n\t"
  147477. #else
  147478. "add r4, r4, r6\n\t"
  147479. #endif
  147480. #ifdef WOLFSSL_KEIL
  147481. "adcs r5, r5, r7\n\t"
  147482. #elif defined(__clang__)
  147483. "adcs r5, r7\n\t"
  147484. #else
  147485. "adc r5, r7\n\t"
  147486. #endif
  147487. #ifdef WOLFSSL_KEIL
  147488. "adcs r3, r3, %[r]\n\t"
  147489. #elif defined(__clang__)
  147490. "adcs r3, %[r]\n\t"
  147491. #else
  147492. "adc r3, %[r]\n\t"
  147493. #endif
  147494. "# A[1] * B[12]\n\t"
  147495. "mov %[a], r9\n\t"
  147496. "mov %[b], r10\n\t"
  147497. "ldr %[a], [%[a], #4]\n\t"
  147498. "ldr %[b], [%[b], #48]\n\t"
  147499. "uxth r6, %[a]\n\t"
  147500. "uxth r7, %[b]\n\t"
  147501. #ifdef WOLFSSL_KEIL
  147502. "muls r7, r6, r7\n\t"
  147503. #elif defined(__clang__)
  147504. "muls r7, r6\n\t"
  147505. #else
  147506. "mul r7, r6\n\t"
  147507. #endif
  147508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147509. "adds r4, r4, r7\n\t"
  147510. #else
  147511. "add r4, r4, r7\n\t"
  147512. #endif
  147513. #ifdef WOLFSSL_KEIL
  147514. "adcs r5, r5, %[r]\n\t"
  147515. #elif defined(__clang__)
  147516. "adcs r5, %[r]\n\t"
  147517. #else
  147518. "adc r5, %[r]\n\t"
  147519. #endif
  147520. #ifdef WOLFSSL_KEIL
  147521. "adcs r3, r3, %[r]\n\t"
  147522. #elif defined(__clang__)
  147523. "adcs r3, %[r]\n\t"
  147524. #else
  147525. "adc r3, %[r]\n\t"
  147526. #endif
  147527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147528. "lsrs r7, %[b], #16\n\t"
  147529. #else
  147530. "lsr r7, %[b], #16\n\t"
  147531. #endif
  147532. #ifdef WOLFSSL_KEIL
  147533. "muls r6, r7, r6\n\t"
  147534. #elif defined(__clang__)
  147535. "muls r6, r7\n\t"
  147536. #else
  147537. "mul r6, r7\n\t"
  147538. #endif
  147539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147540. "lsrs r7, r6, #16\n\t"
  147541. #else
  147542. "lsr r7, r6, #16\n\t"
  147543. #endif
  147544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147545. "lsls r6, r6, #16\n\t"
  147546. #else
  147547. "lsl r6, r6, #16\n\t"
  147548. #endif
  147549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147550. "adds r4, r4, r6\n\t"
  147551. #else
  147552. "add r4, r4, r6\n\t"
  147553. #endif
  147554. #ifdef WOLFSSL_KEIL
  147555. "adcs r5, r5, r7\n\t"
  147556. #elif defined(__clang__)
  147557. "adcs r5, r7\n\t"
  147558. #else
  147559. "adc r5, r7\n\t"
  147560. #endif
  147561. #ifdef WOLFSSL_KEIL
  147562. "adcs r3, r3, %[r]\n\t"
  147563. #elif defined(__clang__)
  147564. "adcs r3, %[r]\n\t"
  147565. #else
  147566. "adc r3, %[r]\n\t"
  147567. #endif
  147568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147569. "lsrs r6, %[a], #16\n\t"
  147570. #else
  147571. "lsr r6, %[a], #16\n\t"
  147572. #endif
  147573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147574. "lsrs r7, %[b], #16\n\t"
  147575. #else
  147576. "lsr r7, %[b], #16\n\t"
  147577. #endif
  147578. #ifdef WOLFSSL_KEIL
  147579. "muls r7, r6, r7\n\t"
  147580. #elif defined(__clang__)
  147581. "muls r7, r6\n\t"
  147582. #else
  147583. "mul r7, r6\n\t"
  147584. #endif
  147585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147586. "adds r5, r5, r7\n\t"
  147587. #else
  147588. "add r5, r5, r7\n\t"
  147589. #endif
  147590. #ifdef WOLFSSL_KEIL
  147591. "adcs r3, r3, %[r]\n\t"
  147592. #elif defined(__clang__)
  147593. "adcs r3, %[r]\n\t"
  147594. #else
  147595. "adc r3, %[r]\n\t"
  147596. #endif
  147597. "uxth r7, %[b]\n\t"
  147598. #ifdef WOLFSSL_KEIL
  147599. "muls r6, r7, r6\n\t"
  147600. #elif defined(__clang__)
  147601. "muls r6, r7\n\t"
  147602. #else
  147603. "mul r6, r7\n\t"
  147604. #endif
  147605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147606. "lsrs r7, r6, #16\n\t"
  147607. #else
  147608. "lsr r7, r6, #16\n\t"
  147609. #endif
  147610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147611. "lsls r6, r6, #16\n\t"
  147612. #else
  147613. "lsl r6, r6, #16\n\t"
  147614. #endif
  147615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147616. "adds r4, r4, r6\n\t"
  147617. #else
  147618. "add r4, r4, r6\n\t"
  147619. #endif
  147620. #ifdef WOLFSSL_KEIL
  147621. "adcs r5, r5, r7\n\t"
  147622. #elif defined(__clang__)
  147623. "adcs r5, r7\n\t"
  147624. #else
  147625. "adc r5, r7\n\t"
  147626. #endif
  147627. #ifdef WOLFSSL_KEIL
  147628. "adcs r3, r3, %[r]\n\t"
  147629. #elif defined(__clang__)
  147630. "adcs r3, %[r]\n\t"
  147631. #else
  147632. "adc r3, %[r]\n\t"
  147633. #endif
  147634. "# A[2] * B[11]\n\t"
  147635. "mov %[a], r9\n\t"
  147636. "mov %[b], r10\n\t"
  147637. "ldr %[a], [%[a], #8]\n\t"
  147638. "ldr %[b], [%[b], #44]\n\t"
  147639. "uxth r6, %[a]\n\t"
  147640. "uxth r7, %[b]\n\t"
  147641. #ifdef WOLFSSL_KEIL
  147642. "muls r7, r6, r7\n\t"
  147643. #elif defined(__clang__)
  147644. "muls r7, r6\n\t"
  147645. #else
  147646. "mul r7, r6\n\t"
  147647. #endif
  147648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147649. "adds r4, r4, r7\n\t"
  147650. #else
  147651. "add r4, r4, r7\n\t"
  147652. #endif
  147653. #ifdef WOLFSSL_KEIL
  147654. "adcs r5, r5, %[r]\n\t"
  147655. #elif defined(__clang__)
  147656. "adcs r5, %[r]\n\t"
  147657. #else
  147658. "adc r5, %[r]\n\t"
  147659. #endif
  147660. #ifdef WOLFSSL_KEIL
  147661. "adcs r3, r3, %[r]\n\t"
  147662. #elif defined(__clang__)
  147663. "adcs r3, %[r]\n\t"
  147664. #else
  147665. "adc r3, %[r]\n\t"
  147666. #endif
  147667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147668. "lsrs r7, %[b], #16\n\t"
  147669. #else
  147670. "lsr r7, %[b], #16\n\t"
  147671. #endif
  147672. #ifdef WOLFSSL_KEIL
  147673. "muls r6, r7, r6\n\t"
  147674. #elif defined(__clang__)
  147675. "muls r6, r7\n\t"
  147676. #else
  147677. "mul r6, r7\n\t"
  147678. #endif
  147679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147680. "lsrs r7, r6, #16\n\t"
  147681. #else
  147682. "lsr r7, r6, #16\n\t"
  147683. #endif
  147684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147685. "lsls r6, r6, #16\n\t"
  147686. #else
  147687. "lsl r6, r6, #16\n\t"
  147688. #endif
  147689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147690. "adds r4, r4, r6\n\t"
  147691. #else
  147692. "add r4, r4, r6\n\t"
  147693. #endif
  147694. #ifdef WOLFSSL_KEIL
  147695. "adcs r5, r5, r7\n\t"
  147696. #elif defined(__clang__)
  147697. "adcs r5, r7\n\t"
  147698. #else
  147699. "adc r5, r7\n\t"
  147700. #endif
  147701. #ifdef WOLFSSL_KEIL
  147702. "adcs r3, r3, %[r]\n\t"
  147703. #elif defined(__clang__)
  147704. "adcs r3, %[r]\n\t"
  147705. #else
  147706. "adc r3, %[r]\n\t"
  147707. #endif
  147708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147709. "lsrs r6, %[a], #16\n\t"
  147710. #else
  147711. "lsr r6, %[a], #16\n\t"
  147712. #endif
  147713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147714. "lsrs r7, %[b], #16\n\t"
  147715. #else
  147716. "lsr r7, %[b], #16\n\t"
  147717. #endif
  147718. #ifdef WOLFSSL_KEIL
  147719. "muls r7, r6, r7\n\t"
  147720. #elif defined(__clang__)
  147721. "muls r7, r6\n\t"
  147722. #else
  147723. "mul r7, r6\n\t"
  147724. #endif
  147725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147726. "adds r5, r5, r7\n\t"
  147727. #else
  147728. "add r5, r5, r7\n\t"
  147729. #endif
  147730. #ifdef WOLFSSL_KEIL
  147731. "adcs r3, r3, %[r]\n\t"
  147732. #elif defined(__clang__)
  147733. "adcs r3, %[r]\n\t"
  147734. #else
  147735. "adc r3, %[r]\n\t"
  147736. #endif
  147737. "uxth r7, %[b]\n\t"
  147738. #ifdef WOLFSSL_KEIL
  147739. "muls r6, r7, r6\n\t"
  147740. #elif defined(__clang__)
  147741. "muls r6, r7\n\t"
  147742. #else
  147743. "mul r6, r7\n\t"
  147744. #endif
  147745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147746. "lsrs r7, r6, #16\n\t"
  147747. #else
  147748. "lsr r7, r6, #16\n\t"
  147749. #endif
  147750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147751. "lsls r6, r6, #16\n\t"
  147752. #else
  147753. "lsl r6, r6, #16\n\t"
  147754. #endif
  147755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147756. "adds r4, r4, r6\n\t"
  147757. #else
  147758. "add r4, r4, r6\n\t"
  147759. #endif
  147760. #ifdef WOLFSSL_KEIL
  147761. "adcs r5, r5, r7\n\t"
  147762. #elif defined(__clang__)
  147763. "adcs r5, r7\n\t"
  147764. #else
  147765. "adc r5, r7\n\t"
  147766. #endif
  147767. #ifdef WOLFSSL_KEIL
  147768. "adcs r3, r3, %[r]\n\t"
  147769. #elif defined(__clang__)
  147770. "adcs r3, %[r]\n\t"
  147771. #else
  147772. "adc r3, %[r]\n\t"
  147773. #endif
  147774. "# A[3] * B[10]\n\t"
  147775. "mov %[a], r9\n\t"
  147776. "mov %[b], r10\n\t"
  147777. "ldr %[a], [%[a], #12]\n\t"
  147778. "ldr %[b], [%[b], #40]\n\t"
  147779. "uxth r6, %[a]\n\t"
  147780. "uxth r7, %[b]\n\t"
  147781. #ifdef WOLFSSL_KEIL
  147782. "muls r7, r6, r7\n\t"
  147783. #elif defined(__clang__)
  147784. "muls r7, r6\n\t"
  147785. #else
  147786. "mul r7, r6\n\t"
  147787. #endif
  147788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147789. "adds r4, r4, r7\n\t"
  147790. #else
  147791. "add r4, r4, r7\n\t"
  147792. #endif
  147793. #ifdef WOLFSSL_KEIL
  147794. "adcs r5, r5, %[r]\n\t"
  147795. #elif defined(__clang__)
  147796. "adcs r5, %[r]\n\t"
  147797. #else
  147798. "adc r5, %[r]\n\t"
  147799. #endif
  147800. #ifdef WOLFSSL_KEIL
  147801. "adcs r3, r3, %[r]\n\t"
  147802. #elif defined(__clang__)
  147803. "adcs r3, %[r]\n\t"
  147804. #else
  147805. "adc r3, %[r]\n\t"
  147806. #endif
  147807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147808. "lsrs r7, %[b], #16\n\t"
  147809. #else
  147810. "lsr r7, %[b], #16\n\t"
  147811. #endif
  147812. #ifdef WOLFSSL_KEIL
  147813. "muls r6, r7, r6\n\t"
  147814. #elif defined(__clang__)
  147815. "muls r6, r7\n\t"
  147816. #else
  147817. "mul r6, r7\n\t"
  147818. #endif
  147819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147820. "lsrs r7, r6, #16\n\t"
  147821. #else
  147822. "lsr r7, r6, #16\n\t"
  147823. #endif
  147824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147825. "lsls r6, r6, #16\n\t"
  147826. #else
  147827. "lsl r6, r6, #16\n\t"
  147828. #endif
  147829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147830. "adds r4, r4, r6\n\t"
  147831. #else
  147832. "add r4, r4, r6\n\t"
  147833. #endif
  147834. #ifdef WOLFSSL_KEIL
  147835. "adcs r5, r5, r7\n\t"
  147836. #elif defined(__clang__)
  147837. "adcs r5, r7\n\t"
  147838. #else
  147839. "adc r5, r7\n\t"
  147840. #endif
  147841. #ifdef WOLFSSL_KEIL
  147842. "adcs r3, r3, %[r]\n\t"
  147843. #elif defined(__clang__)
  147844. "adcs r3, %[r]\n\t"
  147845. #else
  147846. "adc r3, %[r]\n\t"
  147847. #endif
  147848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147849. "lsrs r6, %[a], #16\n\t"
  147850. #else
  147851. "lsr r6, %[a], #16\n\t"
  147852. #endif
  147853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147854. "lsrs r7, %[b], #16\n\t"
  147855. #else
  147856. "lsr r7, %[b], #16\n\t"
  147857. #endif
  147858. #ifdef WOLFSSL_KEIL
  147859. "muls r7, r6, r7\n\t"
  147860. #elif defined(__clang__)
  147861. "muls r7, r6\n\t"
  147862. #else
  147863. "mul r7, r6\n\t"
  147864. #endif
  147865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147866. "adds r5, r5, r7\n\t"
  147867. #else
  147868. "add r5, r5, r7\n\t"
  147869. #endif
  147870. #ifdef WOLFSSL_KEIL
  147871. "adcs r3, r3, %[r]\n\t"
  147872. #elif defined(__clang__)
  147873. "adcs r3, %[r]\n\t"
  147874. #else
  147875. "adc r3, %[r]\n\t"
  147876. #endif
  147877. "uxth r7, %[b]\n\t"
  147878. #ifdef WOLFSSL_KEIL
  147879. "muls r6, r7, r6\n\t"
  147880. #elif defined(__clang__)
  147881. "muls r6, r7\n\t"
  147882. #else
  147883. "mul r6, r7\n\t"
  147884. #endif
  147885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147886. "lsrs r7, r6, #16\n\t"
  147887. #else
  147888. "lsr r7, r6, #16\n\t"
  147889. #endif
  147890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147891. "lsls r6, r6, #16\n\t"
  147892. #else
  147893. "lsl r6, r6, #16\n\t"
  147894. #endif
  147895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147896. "adds r4, r4, r6\n\t"
  147897. #else
  147898. "add r4, r4, r6\n\t"
  147899. #endif
  147900. #ifdef WOLFSSL_KEIL
  147901. "adcs r5, r5, r7\n\t"
  147902. #elif defined(__clang__)
  147903. "adcs r5, r7\n\t"
  147904. #else
  147905. "adc r5, r7\n\t"
  147906. #endif
  147907. #ifdef WOLFSSL_KEIL
  147908. "adcs r3, r3, %[r]\n\t"
  147909. #elif defined(__clang__)
  147910. "adcs r3, %[r]\n\t"
  147911. #else
  147912. "adc r3, %[r]\n\t"
  147913. #endif
  147914. "# A[4] * B[9]\n\t"
  147915. "mov %[a], r9\n\t"
  147916. "mov %[b], r10\n\t"
  147917. "ldr %[a], [%[a], #16]\n\t"
  147918. "ldr %[b], [%[b], #36]\n\t"
  147919. "uxth r6, %[a]\n\t"
  147920. "uxth r7, %[b]\n\t"
  147921. #ifdef WOLFSSL_KEIL
  147922. "muls r7, r6, r7\n\t"
  147923. #elif defined(__clang__)
  147924. "muls r7, r6\n\t"
  147925. #else
  147926. "mul r7, r6\n\t"
  147927. #endif
  147928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147929. "adds r4, r4, r7\n\t"
  147930. #else
  147931. "add r4, r4, r7\n\t"
  147932. #endif
  147933. #ifdef WOLFSSL_KEIL
  147934. "adcs r5, r5, %[r]\n\t"
  147935. #elif defined(__clang__)
  147936. "adcs r5, %[r]\n\t"
  147937. #else
  147938. "adc r5, %[r]\n\t"
  147939. #endif
  147940. #ifdef WOLFSSL_KEIL
  147941. "adcs r3, r3, %[r]\n\t"
  147942. #elif defined(__clang__)
  147943. "adcs r3, %[r]\n\t"
  147944. #else
  147945. "adc r3, %[r]\n\t"
  147946. #endif
  147947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147948. "lsrs r7, %[b], #16\n\t"
  147949. #else
  147950. "lsr r7, %[b], #16\n\t"
  147951. #endif
  147952. #ifdef WOLFSSL_KEIL
  147953. "muls r6, r7, r6\n\t"
  147954. #elif defined(__clang__)
  147955. "muls r6, r7\n\t"
  147956. #else
  147957. "mul r6, r7\n\t"
  147958. #endif
  147959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147960. "lsrs r7, r6, #16\n\t"
  147961. #else
  147962. "lsr r7, r6, #16\n\t"
  147963. #endif
  147964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147965. "lsls r6, r6, #16\n\t"
  147966. #else
  147967. "lsl r6, r6, #16\n\t"
  147968. #endif
  147969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147970. "adds r4, r4, r6\n\t"
  147971. #else
  147972. "add r4, r4, r6\n\t"
  147973. #endif
  147974. #ifdef WOLFSSL_KEIL
  147975. "adcs r5, r5, r7\n\t"
  147976. #elif defined(__clang__)
  147977. "adcs r5, r7\n\t"
  147978. #else
  147979. "adc r5, r7\n\t"
  147980. #endif
  147981. #ifdef WOLFSSL_KEIL
  147982. "adcs r3, r3, %[r]\n\t"
  147983. #elif defined(__clang__)
  147984. "adcs r3, %[r]\n\t"
  147985. #else
  147986. "adc r3, %[r]\n\t"
  147987. #endif
  147988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147989. "lsrs r6, %[a], #16\n\t"
  147990. #else
  147991. "lsr r6, %[a], #16\n\t"
  147992. #endif
  147993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147994. "lsrs r7, %[b], #16\n\t"
  147995. #else
  147996. "lsr r7, %[b], #16\n\t"
  147997. #endif
  147998. #ifdef WOLFSSL_KEIL
  147999. "muls r7, r6, r7\n\t"
  148000. #elif defined(__clang__)
  148001. "muls r7, r6\n\t"
  148002. #else
  148003. "mul r7, r6\n\t"
  148004. #endif
  148005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148006. "adds r5, r5, r7\n\t"
  148007. #else
  148008. "add r5, r5, r7\n\t"
  148009. #endif
  148010. #ifdef WOLFSSL_KEIL
  148011. "adcs r3, r3, %[r]\n\t"
  148012. #elif defined(__clang__)
  148013. "adcs r3, %[r]\n\t"
  148014. #else
  148015. "adc r3, %[r]\n\t"
  148016. #endif
  148017. "uxth r7, %[b]\n\t"
  148018. #ifdef WOLFSSL_KEIL
  148019. "muls r6, r7, r6\n\t"
  148020. #elif defined(__clang__)
  148021. "muls r6, r7\n\t"
  148022. #else
  148023. "mul r6, r7\n\t"
  148024. #endif
  148025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148026. "lsrs r7, r6, #16\n\t"
  148027. #else
  148028. "lsr r7, r6, #16\n\t"
  148029. #endif
  148030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148031. "lsls r6, r6, #16\n\t"
  148032. #else
  148033. "lsl r6, r6, #16\n\t"
  148034. #endif
  148035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148036. "adds r4, r4, r6\n\t"
  148037. #else
  148038. "add r4, r4, r6\n\t"
  148039. #endif
  148040. #ifdef WOLFSSL_KEIL
  148041. "adcs r5, r5, r7\n\t"
  148042. #elif defined(__clang__)
  148043. "adcs r5, r7\n\t"
  148044. #else
  148045. "adc r5, r7\n\t"
  148046. #endif
  148047. #ifdef WOLFSSL_KEIL
  148048. "adcs r3, r3, %[r]\n\t"
  148049. #elif defined(__clang__)
  148050. "adcs r3, %[r]\n\t"
  148051. #else
  148052. "adc r3, %[r]\n\t"
  148053. #endif
  148054. "# A[5] * B[8]\n\t"
  148055. "mov %[a], r9\n\t"
  148056. "mov %[b], r10\n\t"
  148057. "ldr %[a], [%[a], #20]\n\t"
  148058. "ldr %[b], [%[b], #32]\n\t"
  148059. "uxth r6, %[a]\n\t"
  148060. "uxth r7, %[b]\n\t"
  148061. #ifdef WOLFSSL_KEIL
  148062. "muls r7, r6, r7\n\t"
  148063. #elif defined(__clang__)
  148064. "muls r7, r6\n\t"
  148065. #else
  148066. "mul r7, r6\n\t"
  148067. #endif
  148068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148069. "adds r4, r4, r7\n\t"
  148070. #else
  148071. "add r4, r4, r7\n\t"
  148072. #endif
  148073. #ifdef WOLFSSL_KEIL
  148074. "adcs r5, r5, %[r]\n\t"
  148075. #elif defined(__clang__)
  148076. "adcs r5, %[r]\n\t"
  148077. #else
  148078. "adc r5, %[r]\n\t"
  148079. #endif
  148080. #ifdef WOLFSSL_KEIL
  148081. "adcs r3, r3, %[r]\n\t"
  148082. #elif defined(__clang__)
  148083. "adcs r3, %[r]\n\t"
  148084. #else
  148085. "adc r3, %[r]\n\t"
  148086. #endif
  148087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148088. "lsrs r7, %[b], #16\n\t"
  148089. #else
  148090. "lsr r7, %[b], #16\n\t"
  148091. #endif
  148092. #ifdef WOLFSSL_KEIL
  148093. "muls r6, r7, r6\n\t"
  148094. #elif defined(__clang__)
  148095. "muls r6, r7\n\t"
  148096. #else
  148097. "mul r6, r7\n\t"
  148098. #endif
  148099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148100. "lsrs r7, r6, #16\n\t"
  148101. #else
  148102. "lsr r7, r6, #16\n\t"
  148103. #endif
  148104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148105. "lsls r6, r6, #16\n\t"
  148106. #else
  148107. "lsl r6, r6, #16\n\t"
  148108. #endif
  148109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148110. "adds r4, r4, r6\n\t"
  148111. #else
  148112. "add r4, r4, r6\n\t"
  148113. #endif
  148114. #ifdef WOLFSSL_KEIL
  148115. "adcs r5, r5, r7\n\t"
  148116. #elif defined(__clang__)
  148117. "adcs r5, r7\n\t"
  148118. #else
  148119. "adc r5, r7\n\t"
  148120. #endif
  148121. #ifdef WOLFSSL_KEIL
  148122. "adcs r3, r3, %[r]\n\t"
  148123. #elif defined(__clang__)
  148124. "adcs r3, %[r]\n\t"
  148125. #else
  148126. "adc r3, %[r]\n\t"
  148127. #endif
  148128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148129. "lsrs r6, %[a], #16\n\t"
  148130. #else
  148131. "lsr r6, %[a], #16\n\t"
  148132. #endif
  148133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148134. "lsrs r7, %[b], #16\n\t"
  148135. #else
  148136. "lsr r7, %[b], #16\n\t"
  148137. #endif
  148138. #ifdef WOLFSSL_KEIL
  148139. "muls r7, r6, r7\n\t"
  148140. #elif defined(__clang__)
  148141. "muls r7, r6\n\t"
  148142. #else
  148143. "mul r7, r6\n\t"
  148144. #endif
  148145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148146. "adds r5, r5, r7\n\t"
  148147. #else
  148148. "add r5, r5, r7\n\t"
  148149. #endif
  148150. #ifdef WOLFSSL_KEIL
  148151. "adcs r3, r3, %[r]\n\t"
  148152. #elif defined(__clang__)
  148153. "adcs r3, %[r]\n\t"
  148154. #else
  148155. "adc r3, %[r]\n\t"
  148156. #endif
  148157. "uxth r7, %[b]\n\t"
  148158. #ifdef WOLFSSL_KEIL
  148159. "muls r6, r7, r6\n\t"
  148160. #elif defined(__clang__)
  148161. "muls r6, r7\n\t"
  148162. #else
  148163. "mul r6, r7\n\t"
  148164. #endif
  148165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148166. "lsrs r7, r6, #16\n\t"
  148167. #else
  148168. "lsr r7, r6, #16\n\t"
  148169. #endif
  148170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148171. "lsls r6, r6, #16\n\t"
  148172. #else
  148173. "lsl r6, r6, #16\n\t"
  148174. #endif
  148175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148176. "adds r4, r4, r6\n\t"
  148177. #else
  148178. "add r4, r4, r6\n\t"
  148179. #endif
  148180. #ifdef WOLFSSL_KEIL
  148181. "adcs r5, r5, r7\n\t"
  148182. #elif defined(__clang__)
  148183. "adcs r5, r7\n\t"
  148184. #else
  148185. "adc r5, r7\n\t"
  148186. #endif
  148187. #ifdef WOLFSSL_KEIL
  148188. "adcs r3, r3, %[r]\n\t"
  148189. #elif defined(__clang__)
  148190. "adcs r3, %[r]\n\t"
  148191. #else
  148192. "adc r3, %[r]\n\t"
  148193. #endif
  148194. "# A[6] * B[7]\n\t"
  148195. "mov %[a], r9\n\t"
  148196. "mov %[b], r10\n\t"
  148197. "ldr %[a], [%[a], #24]\n\t"
  148198. "ldr %[b], [%[b], #28]\n\t"
  148199. "uxth r6, %[a]\n\t"
  148200. "uxth r7, %[b]\n\t"
  148201. #ifdef WOLFSSL_KEIL
  148202. "muls r7, r6, r7\n\t"
  148203. #elif defined(__clang__)
  148204. "muls r7, r6\n\t"
  148205. #else
  148206. "mul r7, r6\n\t"
  148207. #endif
  148208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148209. "adds r4, r4, r7\n\t"
  148210. #else
  148211. "add r4, r4, r7\n\t"
  148212. #endif
  148213. #ifdef WOLFSSL_KEIL
  148214. "adcs r5, r5, %[r]\n\t"
  148215. #elif defined(__clang__)
  148216. "adcs r5, %[r]\n\t"
  148217. #else
  148218. "adc r5, %[r]\n\t"
  148219. #endif
  148220. #ifdef WOLFSSL_KEIL
  148221. "adcs r3, r3, %[r]\n\t"
  148222. #elif defined(__clang__)
  148223. "adcs r3, %[r]\n\t"
  148224. #else
  148225. "adc r3, %[r]\n\t"
  148226. #endif
  148227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148228. "lsrs r7, %[b], #16\n\t"
  148229. #else
  148230. "lsr r7, %[b], #16\n\t"
  148231. #endif
  148232. #ifdef WOLFSSL_KEIL
  148233. "muls r6, r7, r6\n\t"
  148234. #elif defined(__clang__)
  148235. "muls r6, r7\n\t"
  148236. #else
  148237. "mul r6, r7\n\t"
  148238. #endif
  148239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148240. "lsrs r7, r6, #16\n\t"
  148241. #else
  148242. "lsr r7, r6, #16\n\t"
  148243. #endif
  148244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148245. "lsls r6, r6, #16\n\t"
  148246. #else
  148247. "lsl r6, r6, #16\n\t"
  148248. #endif
  148249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148250. "adds r4, r4, r6\n\t"
  148251. #else
  148252. "add r4, r4, r6\n\t"
  148253. #endif
  148254. #ifdef WOLFSSL_KEIL
  148255. "adcs r5, r5, r7\n\t"
  148256. #elif defined(__clang__)
  148257. "adcs r5, r7\n\t"
  148258. #else
  148259. "adc r5, r7\n\t"
  148260. #endif
  148261. #ifdef WOLFSSL_KEIL
  148262. "adcs r3, r3, %[r]\n\t"
  148263. #elif defined(__clang__)
  148264. "adcs r3, %[r]\n\t"
  148265. #else
  148266. "adc r3, %[r]\n\t"
  148267. #endif
  148268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148269. "lsrs r6, %[a], #16\n\t"
  148270. #else
  148271. "lsr r6, %[a], #16\n\t"
  148272. #endif
  148273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148274. "lsrs r7, %[b], #16\n\t"
  148275. #else
  148276. "lsr r7, %[b], #16\n\t"
  148277. #endif
  148278. #ifdef WOLFSSL_KEIL
  148279. "muls r7, r6, r7\n\t"
  148280. #elif defined(__clang__)
  148281. "muls r7, r6\n\t"
  148282. #else
  148283. "mul r7, r6\n\t"
  148284. #endif
  148285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148286. "adds r5, r5, r7\n\t"
  148287. #else
  148288. "add r5, r5, r7\n\t"
  148289. #endif
  148290. #ifdef WOLFSSL_KEIL
  148291. "adcs r3, r3, %[r]\n\t"
  148292. #elif defined(__clang__)
  148293. "adcs r3, %[r]\n\t"
  148294. #else
  148295. "adc r3, %[r]\n\t"
  148296. #endif
  148297. "uxth r7, %[b]\n\t"
  148298. #ifdef WOLFSSL_KEIL
  148299. "muls r6, r7, r6\n\t"
  148300. #elif defined(__clang__)
  148301. "muls r6, r7\n\t"
  148302. #else
  148303. "mul r6, r7\n\t"
  148304. #endif
  148305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148306. "lsrs r7, r6, #16\n\t"
  148307. #else
  148308. "lsr r7, r6, #16\n\t"
  148309. #endif
  148310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148311. "lsls r6, r6, #16\n\t"
  148312. #else
  148313. "lsl r6, r6, #16\n\t"
  148314. #endif
  148315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148316. "adds r4, r4, r6\n\t"
  148317. #else
  148318. "add r4, r4, r6\n\t"
  148319. #endif
  148320. #ifdef WOLFSSL_KEIL
  148321. "adcs r5, r5, r7\n\t"
  148322. #elif defined(__clang__)
  148323. "adcs r5, r7\n\t"
  148324. #else
  148325. "adc r5, r7\n\t"
  148326. #endif
  148327. #ifdef WOLFSSL_KEIL
  148328. "adcs r3, r3, %[r]\n\t"
  148329. #elif defined(__clang__)
  148330. "adcs r3, %[r]\n\t"
  148331. #else
  148332. "adc r3, %[r]\n\t"
  148333. #endif
  148334. "# A[7] * B[6]\n\t"
  148335. "mov %[a], r9\n\t"
  148336. "mov %[b], r10\n\t"
  148337. "ldr %[a], [%[a], #28]\n\t"
  148338. "ldr %[b], [%[b], #24]\n\t"
  148339. "uxth r6, %[a]\n\t"
  148340. "uxth r7, %[b]\n\t"
  148341. #ifdef WOLFSSL_KEIL
  148342. "muls r7, r6, r7\n\t"
  148343. #elif defined(__clang__)
  148344. "muls r7, r6\n\t"
  148345. #else
  148346. "mul r7, r6\n\t"
  148347. #endif
  148348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148349. "adds r4, r4, r7\n\t"
  148350. #else
  148351. "add r4, r4, r7\n\t"
  148352. #endif
  148353. #ifdef WOLFSSL_KEIL
  148354. "adcs r5, r5, %[r]\n\t"
  148355. #elif defined(__clang__)
  148356. "adcs r5, %[r]\n\t"
  148357. #else
  148358. "adc r5, %[r]\n\t"
  148359. #endif
  148360. #ifdef WOLFSSL_KEIL
  148361. "adcs r3, r3, %[r]\n\t"
  148362. #elif defined(__clang__)
  148363. "adcs r3, %[r]\n\t"
  148364. #else
  148365. "adc r3, %[r]\n\t"
  148366. #endif
  148367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148368. "lsrs r7, %[b], #16\n\t"
  148369. #else
  148370. "lsr r7, %[b], #16\n\t"
  148371. #endif
  148372. #ifdef WOLFSSL_KEIL
  148373. "muls r6, r7, r6\n\t"
  148374. #elif defined(__clang__)
  148375. "muls r6, r7\n\t"
  148376. #else
  148377. "mul r6, r7\n\t"
  148378. #endif
  148379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148380. "lsrs r7, r6, #16\n\t"
  148381. #else
  148382. "lsr r7, r6, #16\n\t"
  148383. #endif
  148384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148385. "lsls r6, r6, #16\n\t"
  148386. #else
  148387. "lsl r6, r6, #16\n\t"
  148388. #endif
  148389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148390. "adds r4, r4, r6\n\t"
  148391. #else
  148392. "add r4, r4, r6\n\t"
  148393. #endif
  148394. #ifdef WOLFSSL_KEIL
  148395. "adcs r5, r5, r7\n\t"
  148396. #elif defined(__clang__)
  148397. "adcs r5, r7\n\t"
  148398. #else
  148399. "adc r5, r7\n\t"
  148400. #endif
  148401. #ifdef WOLFSSL_KEIL
  148402. "adcs r3, r3, %[r]\n\t"
  148403. #elif defined(__clang__)
  148404. "adcs r3, %[r]\n\t"
  148405. #else
  148406. "adc r3, %[r]\n\t"
  148407. #endif
  148408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148409. "lsrs r6, %[a], #16\n\t"
  148410. #else
  148411. "lsr r6, %[a], #16\n\t"
  148412. #endif
  148413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148414. "lsrs r7, %[b], #16\n\t"
  148415. #else
  148416. "lsr r7, %[b], #16\n\t"
  148417. #endif
  148418. #ifdef WOLFSSL_KEIL
  148419. "muls r7, r6, r7\n\t"
  148420. #elif defined(__clang__)
  148421. "muls r7, r6\n\t"
  148422. #else
  148423. "mul r7, r6\n\t"
  148424. #endif
  148425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148426. "adds r5, r5, r7\n\t"
  148427. #else
  148428. "add r5, r5, r7\n\t"
  148429. #endif
  148430. #ifdef WOLFSSL_KEIL
  148431. "adcs r3, r3, %[r]\n\t"
  148432. #elif defined(__clang__)
  148433. "adcs r3, %[r]\n\t"
  148434. #else
  148435. "adc r3, %[r]\n\t"
  148436. #endif
  148437. "uxth r7, %[b]\n\t"
  148438. #ifdef WOLFSSL_KEIL
  148439. "muls r6, r7, r6\n\t"
  148440. #elif defined(__clang__)
  148441. "muls r6, r7\n\t"
  148442. #else
  148443. "mul r6, r7\n\t"
  148444. #endif
  148445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148446. "lsrs r7, r6, #16\n\t"
  148447. #else
  148448. "lsr r7, r6, #16\n\t"
  148449. #endif
  148450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148451. "lsls r6, r6, #16\n\t"
  148452. #else
  148453. "lsl r6, r6, #16\n\t"
  148454. #endif
  148455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148456. "adds r4, r4, r6\n\t"
  148457. #else
  148458. "add r4, r4, r6\n\t"
  148459. #endif
  148460. #ifdef WOLFSSL_KEIL
  148461. "adcs r5, r5, r7\n\t"
  148462. #elif defined(__clang__)
  148463. "adcs r5, r7\n\t"
  148464. #else
  148465. "adc r5, r7\n\t"
  148466. #endif
  148467. #ifdef WOLFSSL_KEIL
  148468. "adcs r3, r3, %[r]\n\t"
  148469. #elif defined(__clang__)
  148470. "adcs r3, %[r]\n\t"
  148471. #else
  148472. "adc r3, %[r]\n\t"
  148473. #endif
  148474. "# A[8] * B[5]\n\t"
  148475. "mov %[a], r9\n\t"
  148476. "mov %[b], r10\n\t"
  148477. "ldr %[a], [%[a], #32]\n\t"
  148478. "ldr %[b], [%[b], #20]\n\t"
  148479. "uxth r6, %[a]\n\t"
  148480. "uxth r7, %[b]\n\t"
  148481. #ifdef WOLFSSL_KEIL
  148482. "muls r7, r6, r7\n\t"
  148483. #elif defined(__clang__)
  148484. "muls r7, r6\n\t"
  148485. #else
  148486. "mul r7, r6\n\t"
  148487. #endif
  148488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148489. "adds r4, r4, r7\n\t"
  148490. #else
  148491. "add r4, r4, r7\n\t"
  148492. #endif
  148493. #ifdef WOLFSSL_KEIL
  148494. "adcs r5, r5, %[r]\n\t"
  148495. #elif defined(__clang__)
  148496. "adcs r5, %[r]\n\t"
  148497. #else
  148498. "adc r5, %[r]\n\t"
  148499. #endif
  148500. #ifdef WOLFSSL_KEIL
  148501. "adcs r3, r3, %[r]\n\t"
  148502. #elif defined(__clang__)
  148503. "adcs r3, %[r]\n\t"
  148504. #else
  148505. "adc r3, %[r]\n\t"
  148506. #endif
  148507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148508. "lsrs r7, %[b], #16\n\t"
  148509. #else
  148510. "lsr r7, %[b], #16\n\t"
  148511. #endif
  148512. #ifdef WOLFSSL_KEIL
  148513. "muls r6, r7, r6\n\t"
  148514. #elif defined(__clang__)
  148515. "muls r6, r7\n\t"
  148516. #else
  148517. "mul r6, r7\n\t"
  148518. #endif
  148519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148520. "lsrs r7, r6, #16\n\t"
  148521. #else
  148522. "lsr r7, r6, #16\n\t"
  148523. #endif
  148524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148525. "lsls r6, r6, #16\n\t"
  148526. #else
  148527. "lsl r6, r6, #16\n\t"
  148528. #endif
  148529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148530. "adds r4, r4, r6\n\t"
  148531. #else
  148532. "add r4, r4, r6\n\t"
  148533. #endif
  148534. #ifdef WOLFSSL_KEIL
  148535. "adcs r5, r5, r7\n\t"
  148536. #elif defined(__clang__)
  148537. "adcs r5, r7\n\t"
  148538. #else
  148539. "adc r5, r7\n\t"
  148540. #endif
  148541. #ifdef WOLFSSL_KEIL
  148542. "adcs r3, r3, %[r]\n\t"
  148543. #elif defined(__clang__)
  148544. "adcs r3, %[r]\n\t"
  148545. #else
  148546. "adc r3, %[r]\n\t"
  148547. #endif
  148548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148549. "lsrs r6, %[a], #16\n\t"
  148550. #else
  148551. "lsr r6, %[a], #16\n\t"
  148552. #endif
  148553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148554. "lsrs r7, %[b], #16\n\t"
  148555. #else
  148556. "lsr r7, %[b], #16\n\t"
  148557. #endif
  148558. #ifdef WOLFSSL_KEIL
  148559. "muls r7, r6, r7\n\t"
  148560. #elif defined(__clang__)
  148561. "muls r7, r6\n\t"
  148562. #else
  148563. "mul r7, r6\n\t"
  148564. #endif
  148565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148566. "adds r5, r5, r7\n\t"
  148567. #else
  148568. "add r5, r5, r7\n\t"
  148569. #endif
  148570. #ifdef WOLFSSL_KEIL
  148571. "adcs r3, r3, %[r]\n\t"
  148572. #elif defined(__clang__)
  148573. "adcs r3, %[r]\n\t"
  148574. #else
  148575. "adc r3, %[r]\n\t"
  148576. #endif
  148577. "uxth r7, %[b]\n\t"
  148578. #ifdef WOLFSSL_KEIL
  148579. "muls r6, r7, r6\n\t"
  148580. #elif defined(__clang__)
  148581. "muls r6, r7\n\t"
  148582. #else
  148583. "mul r6, r7\n\t"
  148584. #endif
  148585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148586. "lsrs r7, r6, #16\n\t"
  148587. #else
  148588. "lsr r7, r6, #16\n\t"
  148589. #endif
  148590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148591. "lsls r6, r6, #16\n\t"
  148592. #else
  148593. "lsl r6, r6, #16\n\t"
  148594. #endif
  148595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148596. "adds r4, r4, r6\n\t"
  148597. #else
  148598. "add r4, r4, r6\n\t"
  148599. #endif
  148600. #ifdef WOLFSSL_KEIL
  148601. "adcs r5, r5, r7\n\t"
  148602. #elif defined(__clang__)
  148603. "adcs r5, r7\n\t"
  148604. #else
  148605. "adc r5, r7\n\t"
  148606. #endif
  148607. #ifdef WOLFSSL_KEIL
  148608. "adcs r3, r3, %[r]\n\t"
  148609. #elif defined(__clang__)
  148610. "adcs r3, %[r]\n\t"
  148611. #else
  148612. "adc r3, %[r]\n\t"
  148613. #endif
  148614. "# A[9] * B[4]\n\t"
  148615. "mov %[a], r9\n\t"
  148616. "mov %[b], r10\n\t"
  148617. "ldr %[a], [%[a], #36]\n\t"
  148618. "ldr %[b], [%[b], #16]\n\t"
  148619. "uxth r6, %[a]\n\t"
  148620. "uxth r7, %[b]\n\t"
  148621. #ifdef WOLFSSL_KEIL
  148622. "muls r7, r6, r7\n\t"
  148623. #elif defined(__clang__)
  148624. "muls r7, r6\n\t"
  148625. #else
  148626. "mul r7, r6\n\t"
  148627. #endif
  148628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148629. "adds r4, r4, r7\n\t"
  148630. #else
  148631. "add r4, r4, r7\n\t"
  148632. #endif
  148633. #ifdef WOLFSSL_KEIL
  148634. "adcs r5, r5, %[r]\n\t"
  148635. #elif defined(__clang__)
  148636. "adcs r5, %[r]\n\t"
  148637. #else
  148638. "adc r5, %[r]\n\t"
  148639. #endif
  148640. #ifdef WOLFSSL_KEIL
  148641. "adcs r3, r3, %[r]\n\t"
  148642. #elif defined(__clang__)
  148643. "adcs r3, %[r]\n\t"
  148644. #else
  148645. "adc r3, %[r]\n\t"
  148646. #endif
  148647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148648. "lsrs r7, %[b], #16\n\t"
  148649. #else
  148650. "lsr r7, %[b], #16\n\t"
  148651. #endif
  148652. #ifdef WOLFSSL_KEIL
  148653. "muls r6, r7, r6\n\t"
  148654. #elif defined(__clang__)
  148655. "muls r6, r7\n\t"
  148656. #else
  148657. "mul r6, r7\n\t"
  148658. #endif
  148659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148660. "lsrs r7, r6, #16\n\t"
  148661. #else
  148662. "lsr r7, r6, #16\n\t"
  148663. #endif
  148664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148665. "lsls r6, r6, #16\n\t"
  148666. #else
  148667. "lsl r6, r6, #16\n\t"
  148668. #endif
  148669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148670. "adds r4, r4, r6\n\t"
  148671. #else
  148672. "add r4, r4, r6\n\t"
  148673. #endif
  148674. #ifdef WOLFSSL_KEIL
  148675. "adcs r5, r5, r7\n\t"
  148676. #elif defined(__clang__)
  148677. "adcs r5, r7\n\t"
  148678. #else
  148679. "adc r5, r7\n\t"
  148680. #endif
  148681. #ifdef WOLFSSL_KEIL
  148682. "adcs r3, r3, %[r]\n\t"
  148683. #elif defined(__clang__)
  148684. "adcs r3, %[r]\n\t"
  148685. #else
  148686. "adc r3, %[r]\n\t"
  148687. #endif
  148688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148689. "lsrs r6, %[a], #16\n\t"
  148690. #else
  148691. "lsr r6, %[a], #16\n\t"
  148692. #endif
  148693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148694. "lsrs r7, %[b], #16\n\t"
  148695. #else
  148696. "lsr r7, %[b], #16\n\t"
  148697. #endif
  148698. #ifdef WOLFSSL_KEIL
  148699. "muls r7, r6, r7\n\t"
  148700. #elif defined(__clang__)
  148701. "muls r7, r6\n\t"
  148702. #else
  148703. "mul r7, r6\n\t"
  148704. #endif
  148705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148706. "adds r5, r5, r7\n\t"
  148707. #else
  148708. "add r5, r5, r7\n\t"
  148709. #endif
  148710. #ifdef WOLFSSL_KEIL
  148711. "adcs r3, r3, %[r]\n\t"
  148712. #elif defined(__clang__)
  148713. "adcs r3, %[r]\n\t"
  148714. #else
  148715. "adc r3, %[r]\n\t"
  148716. #endif
  148717. "uxth r7, %[b]\n\t"
  148718. #ifdef WOLFSSL_KEIL
  148719. "muls r6, r7, r6\n\t"
  148720. #elif defined(__clang__)
  148721. "muls r6, r7\n\t"
  148722. #else
  148723. "mul r6, r7\n\t"
  148724. #endif
  148725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148726. "lsrs r7, r6, #16\n\t"
  148727. #else
  148728. "lsr r7, r6, #16\n\t"
  148729. #endif
  148730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148731. "lsls r6, r6, #16\n\t"
  148732. #else
  148733. "lsl r6, r6, #16\n\t"
  148734. #endif
  148735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148736. "adds r4, r4, r6\n\t"
  148737. #else
  148738. "add r4, r4, r6\n\t"
  148739. #endif
  148740. #ifdef WOLFSSL_KEIL
  148741. "adcs r5, r5, r7\n\t"
  148742. #elif defined(__clang__)
  148743. "adcs r5, r7\n\t"
  148744. #else
  148745. "adc r5, r7\n\t"
  148746. #endif
  148747. #ifdef WOLFSSL_KEIL
  148748. "adcs r3, r3, %[r]\n\t"
  148749. #elif defined(__clang__)
  148750. "adcs r3, %[r]\n\t"
  148751. #else
  148752. "adc r3, %[r]\n\t"
  148753. #endif
  148754. "# A[10] * B[3]\n\t"
  148755. "mov %[a], r9\n\t"
  148756. "mov %[b], r10\n\t"
  148757. "ldr %[a], [%[a], #40]\n\t"
  148758. "ldr %[b], [%[b], #12]\n\t"
  148759. "uxth r6, %[a]\n\t"
  148760. "uxth r7, %[b]\n\t"
  148761. #ifdef WOLFSSL_KEIL
  148762. "muls r7, r6, r7\n\t"
  148763. #elif defined(__clang__)
  148764. "muls r7, r6\n\t"
  148765. #else
  148766. "mul r7, r6\n\t"
  148767. #endif
  148768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148769. "adds r4, r4, r7\n\t"
  148770. #else
  148771. "add r4, r4, r7\n\t"
  148772. #endif
  148773. #ifdef WOLFSSL_KEIL
  148774. "adcs r5, r5, %[r]\n\t"
  148775. #elif defined(__clang__)
  148776. "adcs r5, %[r]\n\t"
  148777. #else
  148778. "adc r5, %[r]\n\t"
  148779. #endif
  148780. #ifdef WOLFSSL_KEIL
  148781. "adcs r3, r3, %[r]\n\t"
  148782. #elif defined(__clang__)
  148783. "adcs r3, %[r]\n\t"
  148784. #else
  148785. "adc r3, %[r]\n\t"
  148786. #endif
  148787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148788. "lsrs r7, %[b], #16\n\t"
  148789. #else
  148790. "lsr r7, %[b], #16\n\t"
  148791. #endif
  148792. #ifdef WOLFSSL_KEIL
  148793. "muls r6, r7, r6\n\t"
  148794. #elif defined(__clang__)
  148795. "muls r6, r7\n\t"
  148796. #else
  148797. "mul r6, r7\n\t"
  148798. #endif
  148799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148800. "lsrs r7, r6, #16\n\t"
  148801. #else
  148802. "lsr r7, r6, #16\n\t"
  148803. #endif
  148804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148805. "lsls r6, r6, #16\n\t"
  148806. #else
  148807. "lsl r6, r6, #16\n\t"
  148808. #endif
  148809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148810. "adds r4, r4, r6\n\t"
  148811. #else
  148812. "add r4, r4, r6\n\t"
  148813. #endif
  148814. #ifdef WOLFSSL_KEIL
  148815. "adcs r5, r5, r7\n\t"
  148816. #elif defined(__clang__)
  148817. "adcs r5, r7\n\t"
  148818. #else
  148819. "adc r5, r7\n\t"
  148820. #endif
  148821. #ifdef WOLFSSL_KEIL
  148822. "adcs r3, r3, %[r]\n\t"
  148823. #elif defined(__clang__)
  148824. "adcs r3, %[r]\n\t"
  148825. #else
  148826. "adc r3, %[r]\n\t"
  148827. #endif
  148828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148829. "lsrs r6, %[a], #16\n\t"
  148830. #else
  148831. "lsr r6, %[a], #16\n\t"
  148832. #endif
  148833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148834. "lsrs r7, %[b], #16\n\t"
  148835. #else
  148836. "lsr r7, %[b], #16\n\t"
  148837. #endif
  148838. #ifdef WOLFSSL_KEIL
  148839. "muls r7, r6, r7\n\t"
  148840. #elif defined(__clang__)
  148841. "muls r7, r6\n\t"
  148842. #else
  148843. "mul r7, r6\n\t"
  148844. #endif
  148845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148846. "adds r5, r5, r7\n\t"
  148847. #else
  148848. "add r5, r5, r7\n\t"
  148849. #endif
  148850. #ifdef WOLFSSL_KEIL
  148851. "adcs r3, r3, %[r]\n\t"
  148852. #elif defined(__clang__)
  148853. "adcs r3, %[r]\n\t"
  148854. #else
  148855. "adc r3, %[r]\n\t"
  148856. #endif
  148857. "uxth r7, %[b]\n\t"
  148858. #ifdef WOLFSSL_KEIL
  148859. "muls r6, r7, r6\n\t"
  148860. #elif defined(__clang__)
  148861. "muls r6, r7\n\t"
  148862. #else
  148863. "mul r6, r7\n\t"
  148864. #endif
  148865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148866. "lsrs r7, r6, #16\n\t"
  148867. #else
  148868. "lsr r7, r6, #16\n\t"
  148869. #endif
  148870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148871. "lsls r6, r6, #16\n\t"
  148872. #else
  148873. "lsl r6, r6, #16\n\t"
  148874. #endif
  148875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148876. "adds r4, r4, r6\n\t"
  148877. #else
  148878. "add r4, r4, r6\n\t"
  148879. #endif
  148880. #ifdef WOLFSSL_KEIL
  148881. "adcs r5, r5, r7\n\t"
  148882. #elif defined(__clang__)
  148883. "adcs r5, r7\n\t"
  148884. #else
  148885. "adc r5, r7\n\t"
  148886. #endif
  148887. #ifdef WOLFSSL_KEIL
  148888. "adcs r3, r3, %[r]\n\t"
  148889. #elif defined(__clang__)
  148890. "adcs r3, %[r]\n\t"
  148891. #else
  148892. "adc r3, %[r]\n\t"
  148893. #endif
  148894. "# A[11] * B[2]\n\t"
  148895. "mov %[a], r9\n\t"
  148896. "mov %[b], r10\n\t"
  148897. "ldr %[a], [%[a], #44]\n\t"
  148898. "ldr %[b], [%[b], #8]\n\t"
  148899. "uxth r6, %[a]\n\t"
  148900. "uxth r7, %[b]\n\t"
  148901. #ifdef WOLFSSL_KEIL
  148902. "muls r7, r6, r7\n\t"
  148903. #elif defined(__clang__)
  148904. "muls r7, r6\n\t"
  148905. #else
  148906. "mul r7, r6\n\t"
  148907. #endif
  148908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148909. "adds r4, r4, r7\n\t"
  148910. #else
  148911. "add r4, r4, r7\n\t"
  148912. #endif
  148913. #ifdef WOLFSSL_KEIL
  148914. "adcs r5, r5, %[r]\n\t"
  148915. #elif defined(__clang__)
  148916. "adcs r5, %[r]\n\t"
  148917. #else
  148918. "adc r5, %[r]\n\t"
  148919. #endif
  148920. #ifdef WOLFSSL_KEIL
  148921. "adcs r3, r3, %[r]\n\t"
  148922. #elif defined(__clang__)
  148923. "adcs r3, %[r]\n\t"
  148924. #else
  148925. "adc r3, %[r]\n\t"
  148926. #endif
  148927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148928. "lsrs r7, %[b], #16\n\t"
  148929. #else
  148930. "lsr r7, %[b], #16\n\t"
  148931. #endif
  148932. #ifdef WOLFSSL_KEIL
  148933. "muls r6, r7, r6\n\t"
  148934. #elif defined(__clang__)
  148935. "muls r6, r7\n\t"
  148936. #else
  148937. "mul r6, r7\n\t"
  148938. #endif
  148939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148940. "lsrs r7, r6, #16\n\t"
  148941. #else
  148942. "lsr r7, r6, #16\n\t"
  148943. #endif
  148944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148945. "lsls r6, r6, #16\n\t"
  148946. #else
  148947. "lsl r6, r6, #16\n\t"
  148948. #endif
  148949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148950. "adds r4, r4, r6\n\t"
  148951. #else
  148952. "add r4, r4, r6\n\t"
  148953. #endif
  148954. #ifdef WOLFSSL_KEIL
  148955. "adcs r5, r5, r7\n\t"
  148956. #elif defined(__clang__)
  148957. "adcs r5, r7\n\t"
  148958. #else
  148959. "adc r5, r7\n\t"
  148960. #endif
  148961. #ifdef WOLFSSL_KEIL
  148962. "adcs r3, r3, %[r]\n\t"
  148963. #elif defined(__clang__)
  148964. "adcs r3, %[r]\n\t"
  148965. #else
  148966. "adc r3, %[r]\n\t"
  148967. #endif
  148968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148969. "lsrs r6, %[a], #16\n\t"
  148970. #else
  148971. "lsr r6, %[a], #16\n\t"
  148972. #endif
  148973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148974. "lsrs r7, %[b], #16\n\t"
  148975. #else
  148976. "lsr r7, %[b], #16\n\t"
  148977. #endif
  148978. #ifdef WOLFSSL_KEIL
  148979. "muls r7, r6, r7\n\t"
  148980. #elif defined(__clang__)
  148981. "muls r7, r6\n\t"
  148982. #else
  148983. "mul r7, r6\n\t"
  148984. #endif
  148985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148986. "adds r5, r5, r7\n\t"
  148987. #else
  148988. "add r5, r5, r7\n\t"
  148989. #endif
  148990. #ifdef WOLFSSL_KEIL
  148991. "adcs r3, r3, %[r]\n\t"
  148992. #elif defined(__clang__)
  148993. "adcs r3, %[r]\n\t"
  148994. #else
  148995. "adc r3, %[r]\n\t"
  148996. #endif
  148997. "uxth r7, %[b]\n\t"
  148998. #ifdef WOLFSSL_KEIL
  148999. "muls r6, r7, r6\n\t"
  149000. #elif defined(__clang__)
  149001. "muls r6, r7\n\t"
  149002. #else
  149003. "mul r6, r7\n\t"
  149004. #endif
  149005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149006. "lsrs r7, r6, #16\n\t"
  149007. #else
  149008. "lsr r7, r6, #16\n\t"
  149009. #endif
  149010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149011. "lsls r6, r6, #16\n\t"
  149012. #else
  149013. "lsl r6, r6, #16\n\t"
  149014. #endif
  149015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149016. "adds r4, r4, r6\n\t"
  149017. #else
  149018. "add r4, r4, r6\n\t"
  149019. #endif
  149020. #ifdef WOLFSSL_KEIL
  149021. "adcs r5, r5, r7\n\t"
  149022. #elif defined(__clang__)
  149023. "adcs r5, r7\n\t"
  149024. #else
  149025. "adc r5, r7\n\t"
  149026. #endif
  149027. #ifdef WOLFSSL_KEIL
  149028. "adcs r3, r3, %[r]\n\t"
  149029. #elif defined(__clang__)
  149030. "adcs r3, %[r]\n\t"
  149031. #else
  149032. "adc r3, %[r]\n\t"
  149033. #endif
  149034. "# A[12] * B[1]\n\t"
  149035. "mov %[a], r9\n\t"
  149036. "mov %[b], r10\n\t"
  149037. "ldr %[a], [%[a], #48]\n\t"
  149038. "ldr %[b], [%[b], #4]\n\t"
  149039. "uxth r6, %[a]\n\t"
  149040. "uxth r7, %[b]\n\t"
  149041. #ifdef WOLFSSL_KEIL
  149042. "muls r7, r6, r7\n\t"
  149043. #elif defined(__clang__)
  149044. "muls r7, r6\n\t"
  149045. #else
  149046. "mul r7, r6\n\t"
  149047. #endif
  149048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149049. "adds r4, r4, r7\n\t"
  149050. #else
  149051. "add r4, r4, r7\n\t"
  149052. #endif
  149053. #ifdef WOLFSSL_KEIL
  149054. "adcs r5, r5, %[r]\n\t"
  149055. #elif defined(__clang__)
  149056. "adcs r5, %[r]\n\t"
  149057. #else
  149058. "adc r5, %[r]\n\t"
  149059. #endif
  149060. #ifdef WOLFSSL_KEIL
  149061. "adcs r3, r3, %[r]\n\t"
  149062. #elif defined(__clang__)
  149063. "adcs r3, %[r]\n\t"
  149064. #else
  149065. "adc r3, %[r]\n\t"
  149066. #endif
  149067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149068. "lsrs r7, %[b], #16\n\t"
  149069. #else
  149070. "lsr r7, %[b], #16\n\t"
  149071. #endif
  149072. #ifdef WOLFSSL_KEIL
  149073. "muls r6, r7, r6\n\t"
  149074. #elif defined(__clang__)
  149075. "muls r6, r7\n\t"
  149076. #else
  149077. "mul r6, r7\n\t"
  149078. #endif
  149079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149080. "lsrs r7, r6, #16\n\t"
  149081. #else
  149082. "lsr r7, r6, #16\n\t"
  149083. #endif
  149084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149085. "lsls r6, r6, #16\n\t"
  149086. #else
  149087. "lsl r6, r6, #16\n\t"
  149088. #endif
  149089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149090. "adds r4, r4, r6\n\t"
  149091. #else
  149092. "add r4, r4, r6\n\t"
  149093. #endif
  149094. #ifdef WOLFSSL_KEIL
  149095. "adcs r5, r5, r7\n\t"
  149096. #elif defined(__clang__)
  149097. "adcs r5, r7\n\t"
  149098. #else
  149099. "adc r5, r7\n\t"
  149100. #endif
  149101. #ifdef WOLFSSL_KEIL
  149102. "adcs r3, r3, %[r]\n\t"
  149103. #elif defined(__clang__)
  149104. "adcs r3, %[r]\n\t"
  149105. #else
  149106. "adc r3, %[r]\n\t"
  149107. #endif
  149108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149109. "lsrs r6, %[a], #16\n\t"
  149110. #else
  149111. "lsr r6, %[a], #16\n\t"
  149112. #endif
  149113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149114. "lsrs r7, %[b], #16\n\t"
  149115. #else
  149116. "lsr r7, %[b], #16\n\t"
  149117. #endif
  149118. #ifdef WOLFSSL_KEIL
  149119. "muls r7, r6, r7\n\t"
  149120. #elif defined(__clang__)
  149121. "muls r7, r6\n\t"
  149122. #else
  149123. "mul r7, r6\n\t"
  149124. #endif
  149125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149126. "adds r5, r5, r7\n\t"
  149127. #else
  149128. "add r5, r5, r7\n\t"
  149129. #endif
  149130. #ifdef WOLFSSL_KEIL
  149131. "adcs r3, r3, %[r]\n\t"
  149132. #elif defined(__clang__)
  149133. "adcs r3, %[r]\n\t"
  149134. #else
  149135. "adc r3, %[r]\n\t"
  149136. #endif
  149137. "uxth r7, %[b]\n\t"
  149138. #ifdef WOLFSSL_KEIL
  149139. "muls r6, r7, r6\n\t"
  149140. #elif defined(__clang__)
  149141. "muls r6, r7\n\t"
  149142. #else
  149143. "mul r6, r7\n\t"
  149144. #endif
  149145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149146. "lsrs r7, r6, #16\n\t"
  149147. #else
  149148. "lsr r7, r6, #16\n\t"
  149149. #endif
  149150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149151. "lsls r6, r6, #16\n\t"
  149152. #else
  149153. "lsl r6, r6, #16\n\t"
  149154. #endif
  149155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149156. "adds r4, r4, r6\n\t"
  149157. #else
  149158. "add r4, r4, r6\n\t"
  149159. #endif
  149160. #ifdef WOLFSSL_KEIL
  149161. "adcs r5, r5, r7\n\t"
  149162. #elif defined(__clang__)
  149163. "adcs r5, r7\n\t"
  149164. #else
  149165. "adc r5, r7\n\t"
  149166. #endif
  149167. #ifdef WOLFSSL_KEIL
  149168. "adcs r3, r3, %[r]\n\t"
  149169. #elif defined(__clang__)
  149170. "adcs r3, %[r]\n\t"
  149171. #else
  149172. "adc r3, %[r]\n\t"
  149173. #endif
  149174. "# A[13] * B[0]\n\t"
  149175. "mov %[a], r9\n\t"
  149176. "mov %[b], r10\n\t"
  149177. "ldr %[a], [%[a], #52]\n\t"
  149178. "ldr %[b], [%[b]]\n\t"
  149179. "uxth r6, %[a]\n\t"
  149180. "uxth r7, %[b]\n\t"
  149181. #ifdef WOLFSSL_KEIL
  149182. "muls r7, r6, r7\n\t"
  149183. #elif defined(__clang__)
  149184. "muls r7, r6\n\t"
  149185. #else
  149186. "mul r7, r6\n\t"
  149187. #endif
  149188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149189. "adds r4, r4, r7\n\t"
  149190. #else
  149191. "add r4, r4, r7\n\t"
  149192. #endif
  149193. #ifdef WOLFSSL_KEIL
  149194. "adcs r5, r5, %[r]\n\t"
  149195. #elif defined(__clang__)
  149196. "adcs r5, %[r]\n\t"
  149197. #else
  149198. "adc r5, %[r]\n\t"
  149199. #endif
  149200. #ifdef WOLFSSL_KEIL
  149201. "adcs r3, r3, %[r]\n\t"
  149202. #elif defined(__clang__)
  149203. "adcs r3, %[r]\n\t"
  149204. #else
  149205. "adc r3, %[r]\n\t"
  149206. #endif
  149207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149208. "lsrs r7, %[b], #16\n\t"
  149209. #else
  149210. "lsr r7, %[b], #16\n\t"
  149211. #endif
  149212. #ifdef WOLFSSL_KEIL
  149213. "muls r6, r7, r6\n\t"
  149214. #elif defined(__clang__)
  149215. "muls r6, r7\n\t"
  149216. #else
  149217. "mul r6, r7\n\t"
  149218. #endif
  149219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149220. "lsrs r7, r6, #16\n\t"
  149221. #else
  149222. "lsr r7, r6, #16\n\t"
  149223. #endif
  149224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149225. "lsls r6, r6, #16\n\t"
  149226. #else
  149227. "lsl r6, r6, #16\n\t"
  149228. #endif
  149229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149230. "adds r4, r4, r6\n\t"
  149231. #else
  149232. "add r4, r4, r6\n\t"
  149233. #endif
  149234. #ifdef WOLFSSL_KEIL
  149235. "adcs r5, r5, r7\n\t"
  149236. #elif defined(__clang__)
  149237. "adcs r5, r7\n\t"
  149238. #else
  149239. "adc r5, r7\n\t"
  149240. #endif
  149241. #ifdef WOLFSSL_KEIL
  149242. "adcs r3, r3, %[r]\n\t"
  149243. #elif defined(__clang__)
  149244. "adcs r3, %[r]\n\t"
  149245. #else
  149246. "adc r3, %[r]\n\t"
  149247. #endif
  149248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149249. "lsrs r6, %[a], #16\n\t"
  149250. #else
  149251. "lsr r6, %[a], #16\n\t"
  149252. #endif
  149253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149254. "lsrs r7, %[b], #16\n\t"
  149255. #else
  149256. "lsr r7, %[b], #16\n\t"
  149257. #endif
  149258. #ifdef WOLFSSL_KEIL
  149259. "muls r7, r6, r7\n\t"
  149260. #elif defined(__clang__)
  149261. "muls r7, r6\n\t"
  149262. #else
  149263. "mul r7, r6\n\t"
  149264. #endif
  149265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149266. "adds r5, r5, r7\n\t"
  149267. #else
  149268. "add r5, r5, r7\n\t"
  149269. #endif
  149270. #ifdef WOLFSSL_KEIL
  149271. "adcs r3, r3, %[r]\n\t"
  149272. #elif defined(__clang__)
  149273. "adcs r3, %[r]\n\t"
  149274. #else
  149275. "adc r3, %[r]\n\t"
  149276. #endif
  149277. "uxth r7, %[b]\n\t"
  149278. #ifdef WOLFSSL_KEIL
  149279. "muls r6, r7, r6\n\t"
  149280. #elif defined(__clang__)
  149281. "muls r6, r7\n\t"
  149282. #else
  149283. "mul r6, r7\n\t"
  149284. #endif
  149285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149286. "lsrs r7, r6, #16\n\t"
  149287. #else
  149288. "lsr r7, r6, #16\n\t"
  149289. #endif
  149290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149291. "lsls r6, r6, #16\n\t"
  149292. #else
  149293. "lsl r6, r6, #16\n\t"
  149294. #endif
  149295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149296. "adds r4, r4, r6\n\t"
  149297. #else
  149298. "add r4, r4, r6\n\t"
  149299. #endif
  149300. #ifdef WOLFSSL_KEIL
  149301. "adcs r5, r5, r7\n\t"
  149302. #elif defined(__clang__)
  149303. "adcs r5, r7\n\t"
  149304. #else
  149305. "adc r5, r7\n\t"
  149306. #endif
  149307. #ifdef WOLFSSL_KEIL
  149308. "adcs r3, r3, %[r]\n\t"
  149309. #elif defined(__clang__)
  149310. "adcs r3, %[r]\n\t"
  149311. #else
  149312. "adc r3, %[r]\n\t"
  149313. #endif
  149314. "str r4, [sp, #52]\n\t"
  149315. "# A[14] * B[0]\n\t"
  149316. "movs r4, #0\n\t"
  149317. "mov %[a], r9\n\t"
  149318. "mov %[b], r10\n\t"
  149319. "ldr %[a], [%[a], #56]\n\t"
  149320. "ldr %[b], [%[b]]\n\t"
  149321. "uxth r6, %[a]\n\t"
  149322. "uxth r7, %[b]\n\t"
  149323. #ifdef WOLFSSL_KEIL
  149324. "muls r7, r6, r7\n\t"
  149325. #elif defined(__clang__)
  149326. "muls r7, r6\n\t"
  149327. #else
  149328. "mul r7, r6\n\t"
  149329. #endif
  149330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149331. "adds r5, r5, r7\n\t"
  149332. #else
  149333. "add r5, r5, r7\n\t"
  149334. #endif
  149335. #ifdef WOLFSSL_KEIL
  149336. "adcs r3, r3, %[r]\n\t"
  149337. #elif defined(__clang__)
  149338. "adcs r3, %[r]\n\t"
  149339. #else
  149340. "adc r3, %[r]\n\t"
  149341. #endif
  149342. #ifdef WOLFSSL_KEIL
  149343. "adcs r4, r4, %[r]\n\t"
  149344. #elif defined(__clang__)
  149345. "adcs r4, %[r]\n\t"
  149346. #else
  149347. "adc r4, %[r]\n\t"
  149348. #endif
  149349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149350. "lsrs r7, %[b], #16\n\t"
  149351. #else
  149352. "lsr r7, %[b], #16\n\t"
  149353. #endif
  149354. #ifdef WOLFSSL_KEIL
  149355. "muls r6, r7, r6\n\t"
  149356. #elif defined(__clang__)
  149357. "muls r6, r7\n\t"
  149358. #else
  149359. "mul r6, r7\n\t"
  149360. #endif
  149361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149362. "lsrs r7, r6, #16\n\t"
  149363. #else
  149364. "lsr r7, r6, #16\n\t"
  149365. #endif
  149366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149367. "lsls r6, r6, #16\n\t"
  149368. #else
  149369. "lsl r6, r6, #16\n\t"
  149370. #endif
  149371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149372. "adds r5, r5, r6\n\t"
  149373. #else
  149374. "add r5, r5, r6\n\t"
  149375. #endif
  149376. #ifdef WOLFSSL_KEIL
  149377. "adcs r3, r3, r7\n\t"
  149378. #elif defined(__clang__)
  149379. "adcs r3, r7\n\t"
  149380. #else
  149381. "adc r3, r7\n\t"
  149382. #endif
  149383. #ifdef WOLFSSL_KEIL
  149384. "adcs r4, r4, %[r]\n\t"
  149385. #elif defined(__clang__)
  149386. "adcs r4, %[r]\n\t"
  149387. #else
  149388. "adc r4, %[r]\n\t"
  149389. #endif
  149390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149391. "lsrs r6, %[a], #16\n\t"
  149392. #else
  149393. "lsr r6, %[a], #16\n\t"
  149394. #endif
  149395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149396. "lsrs r7, %[b], #16\n\t"
  149397. #else
  149398. "lsr r7, %[b], #16\n\t"
  149399. #endif
  149400. #ifdef WOLFSSL_KEIL
  149401. "muls r7, r6, r7\n\t"
  149402. #elif defined(__clang__)
  149403. "muls r7, r6\n\t"
  149404. #else
  149405. "mul r7, r6\n\t"
  149406. #endif
  149407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149408. "adds r3, r3, r7\n\t"
  149409. #else
  149410. "add r3, r3, r7\n\t"
  149411. #endif
  149412. #ifdef WOLFSSL_KEIL
  149413. "adcs r4, r4, %[r]\n\t"
  149414. #elif defined(__clang__)
  149415. "adcs r4, %[r]\n\t"
  149416. #else
  149417. "adc r4, %[r]\n\t"
  149418. #endif
  149419. "uxth r7, %[b]\n\t"
  149420. #ifdef WOLFSSL_KEIL
  149421. "muls r6, r7, r6\n\t"
  149422. #elif defined(__clang__)
  149423. "muls r6, r7\n\t"
  149424. #else
  149425. "mul r6, r7\n\t"
  149426. #endif
  149427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149428. "lsrs r7, r6, #16\n\t"
  149429. #else
  149430. "lsr r7, r6, #16\n\t"
  149431. #endif
  149432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149433. "lsls r6, r6, #16\n\t"
  149434. #else
  149435. "lsl r6, r6, #16\n\t"
  149436. #endif
  149437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149438. "adds r5, r5, r6\n\t"
  149439. #else
  149440. "add r5, r5, r6\n\t"
  149441. #endif
  149442. #ifdef WOLFSSL_KEIL
  149443. "adcs r3, r3, r7\n\t"
  149444. #elif defined(__clang__)
  149445. "adcs r3, r7\n\t"
  149446. #else
  149447. "adc r3, r7\n\t"
  149448. #endif
  149449. #ifdef WOLFSSL_KEIL
  149450. "adcs r4, r4, %[r]\n\t"
  149451. #elif defined(__clang__)
  149452. "adcs r4, %[r]\n\t"
  149453. #else
  149454. "adc r4, %[r]\n\t"
  149455. #endif
  149456. "# A[13] * B[1]\n\t"
  149457. "mov %[a], r9\n\t"
  149458. "mov %[b], r10\n\t"
  149459. "ldr %[a], [%[a], #52]\n\t"
  149460. "ldr %[b], [%[b], #4]\n\t"
  149461. "uxth r6, %[a]\n\t"
  149462. "uxth r7, %[b]\n\t"
  149463. #ifdef WOLFSSL_KEIL
  149464. "muls r7, r6, r7\n\t"
  149465. #elif defined(__clang__)
  149466. "muls r7, r6\n\t"
  149467. #else
  149468. "mul r7, r6\n\t"
  149469. #endif
  149470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149471. "adds r5, r5, r7\n\t"
  149472. #else
  149473. "add r5, r5, r7\n\t"
  149474. #endif
  149475. #ifdef WOLFSSL_KEIL
  149476. "adcs r3, r3, %[r]\n\t"
  149477. #elif defined(__clang__)
  149478. "adcs r3, %[r]\n\t"
  149479. #else
  149480. "adc r3, %[r]\n\t"
  149481. #endif
  149482. #ifdef WOLFSSL_KEIL
  149483. "adcs r4, r4, %[r]\n\t"
  149484. #elif defined(__clang__)
  149485. "adcs r4, %[r]\n\t"
  149486. #else
  149487. "adc r4, %[r]\n\t"
  149488. #endif
  149489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149490. "lsrs r7, %[b], #16\n\t"
  149491. #else
  149492. "lsr r7, %[b], #16\n\t"
  149493. #endif
  149494. #ifdef WOLFSSL_KEIL
  149495. "muls r6, r7, r6\n\t"
  149496. #elif defined(__clang__)
  149497. "muls r6, r7\n\t"
  149498. #else
  149499. "mul r6, r7\n\t"
  149500. #endif
  149501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149502. "lsrs r7, r6, #16\n\t"
  149503. #else
  149504. "lsr r7, r6, #16\n\t"
  149505. #endif
  149506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149507. "lsls r6, r6, #16\n\t"
  149508. #else
  149509. "lsl r6, r6, #16\n\t"
  149510. #endif
  149511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149512. "adds r5, r5, r6\n\t"
  149513. #else
  149514. "add r5, r5, r6\n\t"
  149515. #endif
  149516. #ifdef WOLFSSL_KEIL
  149517. "adcs r3, r3, r7\n\t"
  149518. #elif defined(__clang__)
  149519. "adcs r3, r7\n\t"
  149520. #else
  149521. "adc r3, r7\n\t"
  149522. #endif
  149523. #ifdef WOLFSSL_KEIL
  149524. "adcs r4, r4, %[r]\n\t"
  149525. #elif defined(__clang__)
  149526. "adcs r4, %[r]\n\t"
  149527. #else
  149528. "adc r4, %[r]\n\t"
  149529. #endif
  149530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149531. "lsrs r6, %[a], #16\n\t"
  149532. #else
  149533. "lsr r6, %[a], #16\n\t"
  149534. #endif
  149535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149536. "lsrs r7, %[b], #16\n\t"
  149537. #else
  149538. "lsr r7, %[b], #16\n\t"
  149539. #endif
  149540. #ifdef WOLFSSL_KEIL
  149541. "muls r7, r6, r7\n\t"
  149542. #elif defined(__clang__)
  149543. "muls r7, r6\n\t"
  149544. #else
  149545. "mul r7, r6\n\t"
  149546. #endif
  149547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149548. "adds r3, r3, r7\n\t"
  149549. #else
  149550. "add r3, r3, r7\n\t"
  149551. #endif
  149552. #ifdef WOLFSSL_KEIL
  149553. "adcs r4, r4, %[r]\n\t"
  149554. #elif defined(__clang__)
  149555. "adcs r4, %[r]\n\t"
  149556. #else
  149557. "adc r4, %[r]\n\t"
  149558. #endif
  149559. "uxth r7, %[b]\n\t"
  149560. #ifdef WOLFSSL_KEIL
  149561. "muls r6, r7, r6\n\t"
  149562. #elif defined(__clang__)
  149563. "muls r6, r7\n\t"
  149564. #else
  149565. "mul r6, r7\n\t"
  149566. #endif
  149567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149568. "lsrs r7, r6, #16\n\t"
  149569. #else
  149570. "lsr r7, r6, #16\n\t"
  149571. #endif
  149572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149573. "lsls r6, r6, #16\n\t"
  149574. #else
  149575. "lsl r6, r6, #16\n\t"
  149576. #endif
  149577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149578. "adds r5, r5, r6\n\t"
  149579. #else
  149580. "add r5, r5, r6\n\t"
  149581. #endif
  149582. #ifdef WOLFSSL_KEIL
  149583. "adcs r3, r3, r7\n\t"
  149584. #elif defined(__clang__)
  149585. "adcs r3, r7\n\t"
  149586. #else
  149587. "adc r3, r7\n\t"
  149588. #endif
  149589. #ifdef WOLFSSL_KEIL
  149590. "adcs r4, r4, %[r]\n\t"
  149591. #elif defined(__clang__)
  149592. "adcs r4, %[r]\n\t"
  149593. #else
  149594. "adc r4, %[r]\n\t"
  149595. #endif
  149596. "# A[12] * B[2]\n\t"
  149597. "mov %[a], r9\n\t"
  149598. "mov %[b], r10\n\t"
  149599. "ldr %[a], [%[a], #48]\n\t"
  149600. "ldr %[b], [%[b], #8]\n\t"
  149601. "uxth r6, %[a]\n\t"
  149602. "uxth r7, %[b]\n\t"
  149603. #ifdef WOLFSSL_KEIL
  149604. "muls r7, r6, r7\n\t"
  149605. #elif defined(__clang__)
  149606. "muls r7, r6\n\t"
  149607. #else
  149608. "mul r7, r6\n\t"
  149609. #endif
  149610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149611. "adds r5, r5, r7\n\t"
  149612. #else
  149613. "add r5, r5, r7\n\t"
  149614. #endif
  149615. #ifdef WOLFSSL_KEIL
  149616. "adcs r3, r3, %[r]\n\t"
  149617. #elif defined(__clang__)
  149618. "adcs r3, %[r]\n\t"
  149619. #else
  149620. "adc r3, %[r]\n\t"
  149621. #endif
  149622. #ifdef WOLFSSL_KEIL
  149623. "adcs r4, r4, %[r]\n\t"
  149624. #elif defined(__clang__)
  149625. "adcs r4, %[r]\n\t"
  149626. #else
  149627. "adc r4, %[r]\n\t"
  149628. #endif
  149629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149630. "lsrs r7, %[b], #16\n\t"
  149631. #else
  149632. "lsr r7, %[b], #16\n\t"
  149633. #endif
  149634. #ifdef WOLFSSL_KEIL
  149635. "muls r6, r7, r6\n\t"
  149636. #elif defined(__clang__)
  149637. "muls r6, r7\n\t"
  149638. #else
  149639. "mul r6, r7\n\t"
  149640. #endif
  149641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149642. "lsrs r7, r6, #16\n\t"
  149643. #else
  149644. "lsr r7, r6, #16\n\t"
  149645. #endif
  149646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149647. "lsls r6, r6, #16\n\t"
  149648. #else
  149649. "lsl r6, r6, #16\n\t"
  149650. #endif
  149651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149652. "adds r5, r5, r6\n\t"
  149653. #else
  149654. "add r5, r5, r6\n\t"
  149655. #endif
  149656. #ifdef WOLFSSL_KEIL
  149657. "adcs r3, r3, r7\n\t"
  149658. #elif defined(__clang__)
  149659. "adcs r3, r7\n\t"
  149660. #else
  149661. "adc r3, r7\n\t"
  149662. #endif
  149663. #ifdef WOLFSSL_KEIL
  149664. "adcs r4, r4, %[r]\n\t"
  149665. #elif defined(__clang__)
  149666. "adcs r4, %[r]\n\t"
  149667. #else
  149668. "adc r4, %[r]\n\t"
  149669. #endif
  149670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149671. "lsrs r6, %[a], #16\n\t"
  149672. #else
  149673. "lsr r6, %[a], #16\n\t"
  149674. #endif
  149675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149676. "lsrs r7, %[b], #16\n\t"
  149677. #else
  149678. "lsr r7, %[b], #16\n\t"
  149679. #endif
  149680. #ifdef WOLFSSL_KEIL
  149681. "muls r7, r6, r7\n\t"
  149682. #elif defined(__clang__)
  149683. "muls r7, r6\n\t"
  149684. #else
  149685. "mul r7, r6\n\t"
  149686. #endif
  149687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149688. "adds r3, r3, r7\n\t"
  149689. #else
  149690. "add r3, r3, r7\n\t"
  149691. #endif
  149692. #ifdef WOLFSSL_KEIL
  149693. "adcs r4, r4, %[r]\n\t"
  149694. #elif defined(__clang__)
  149695. "adcs r4, %[r]\n\t"
  149696. #else
  149697. "adc r4, %[r]\n\t"
  149698. #endif
  149699. "uxth r7, %[b]\n\t"
  149700. #ifdef WOLFSSL_KEIL
  149701. "muls r6, r7, r6\n\t"
  149702. #elif defined(__clang__)
  149703. "muls r6, r7\n\t"
  149704. #else
  149705. "mul r6, r7\n\t"
  149706. #endif
  149707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149708. "lsrs r7, r6, #16\n\t"
  149709. #else
  149710. "lsr r7, r6, #16\n\t"
  149711. #endif
  149712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149713. "lsls r6, r6, #16\n\t"
  149714. #else
  149715. "lsl r6, r6, #16\n\t"
  149716. #endif
  149717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149718. "adds r5, r5, r6\n\t"
  149719. #else
  149720. "add r5, r5, r6\n\t"
  149721. #endif
  149722. #ifdef WOLFSSL_KEIL
  149723. "adcs r3, r3, r7\n\t"
  149724. #elif defined(__clang__)
  149725. "adcs r3, r7\n\t"
  149726. #else
  149727. "adc r3, r7\n\t"
  149728. #endif
  149729. #ifdef WOLFSSL_KEIL
  149730. "adcs r4, r4, %[r]\n\t"
  149731. #elif defined(__clang__)
  149732. "adcs r4, %[r]\n\t"
  149733. #else
  149734. "adc r4, %[r]\n\t"
  149735. #endif
  149736. "# A[11] * B[3]\n\t"
  149737. "mov %[a], r9\n\t"
  149738. "mov %[b], r10\n\t"
  149739. "ldr %[a], [%[a], #44]\n\t"
  149740. "ldr %[b], [%[b], #12]\n\t"
  149741. "uxth r6, %[a]\n\t"
  149742. "uxth r7, %[b]\n\t"
  149743. #ifdef WOLFSSL_KEIL
  149744. "muls r7, r6, r7\n\t"
  149745. #elif defined(__clang__)
  149746. "muls r7, r6\n\t"
  149747. #else
  149748. "mul r7, r6\n\t"
  149749. #endif
  149750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149751. "adds r5, r5, r7\n\t"
  149752. #else
  149753. "add r5, r5, r7\n\t"
  149754. #endif
  149755. #ifdef WOLFSSL_KEIL
  149756. "adcs r3, r3, %[r]\n\t"
  149757. #elif defined(__clang__)
  149758. "adcs r3, %[r]\n\t"
  149759. #else
  149760. "adc r3, %[r]\n\t"
  149761. #endif
  149762. #ifdef WOLFSSL_KEIL
  149763. "adcs r4, r4, %[r]\n\t"
  149764. #elif defined(__clang__)
  149765. "adcs r4, %[r]\n\t"
  149766. #else
  149767. "adc r4, %[r]\n\t"
  149768. #endif
  149769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149770. "lsrs r7, %[b], #16\n\t"
  149771. #else
  149772. "lsr r7, %[b], #16\n\t"
  149773. #endif
  149774. #ifdef WOLFSSL_KEIL
  149775. "muls r6, r7, r6\n\t"
  149776. #elif defined(__clang__)
  149777. "muls r6, r7\n\t"
  149778. #else
  149779. "mul r6, r7\n\t"
  149780. #endif
  149781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149782. "lsrs r7, r6, #16\n\t"
  149783. #else
  149784. "lsr r7, r6, #16\n\t"
  149785. #endif
  149786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149787. "lsls r6, r6, #16\n\t"
  149788. #else
  149789. "lsl r6, r6, #16\n\t"
  149790. #endif
  149791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149792. "adds r5, r5, r6\n\t"
  149793. #else
  149794. "add r5, r5, r6\n\t"
  149795. #endif
  149796. #ifdef WOLFSSL_KEIL
  149797. "adcs r3, r3, r7\n\t"
  149798. #elif defined(__clang__)
  149799. "adcs r3, r7\n\t"
  149800. #else
  149801. "adc r3, r7\n\t"
  149802. #endif
  149803. #ifdef WOLFSSL_KEIL
  149804. "adcs r4, r4, %[r]\n\t"
  149805. #elif defined(__clang__)
  149806. "adcs r4, %[r]\n\t"
  149807. #else
  149808. "adc r4, %[r]\n\t"
  149809. #endif
  149810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149811. "lsrs r6, %[a], #16\n\t"
  149812. #else
  149813. "lsr r6, %[a], #16\n\t"
  149814. #endif
  149815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149816. "lsrs r7, %[b], #16\n\t"
  149817. #else
  149818. "lsr r7, %[b], #16\n\t"
  149819. #endif
  149820. #ifdef WOLFSSL_KEIL
  149821. "muls r7, r6, r7\n\t"
  149822. #elif defined(__clang__)
  149823. "muls r7, r6\n\t"
  149824. #else
  149825. "mul r7, r6\n\t"
  149826. #endif
  149827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149828. "adds r3, r3, r7\n\t"
  149829. #else
  149830. "add r3, r3, r7\n\t"
  149831. #endif
  149832. #ifdef WOLFSSL_KEIL
  149833. "adcs r4, r4, %[r]\n\t"
  149834. #elif defined(__clang__)
  149835. "adcs r4, %[r]\n\t"
  149836. #else
  149837. "adc r4, %[r]\n\t"
  149838. #endif
  149839. "uxth r7, %[b]\n\t"
  149840. #ifdef WOLFSSL_KEIL
  149841. "muls r6, r7, r6\n\t"
  149842. #elif defined(__clang__)
  149843. "muls r6, r7\n\t"
  149844. #else
  149845. "mul r6, r7\n\t"
  149846. #endif
  149847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149848. "lsrs r7, r6, #16\n\t"
  149849. #else
  149850. "lsr r7, r6, #16\n\t"
  149851. #endif
  149852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149853. "lsls r6, r6, #16\n\t"
  149854. #else
  149855. "lsl r6, r6, #16\n\t"
  149856. #endif
  149857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149858. "adds r5, r5, r6\n\t"
  149859. #else
  149860. "add r5, r5, r6\n\t"
  149861. #endif
  149862. #ifdef WOLFSSL_KEIL
  149863. "adcs r3, r3, r7\n\t"
  149864. #elif defined(__clang__)
  149865. "adcs r3, r7\n\t"
  149866. #else
  149867. "adc r3, r7\n\t"
  149868. #endif
  149869. #ifdef WOLFSSL_KEIL
  149870. "adcs r4, r4, %[r]\n\t"
  149871. #elif defined(__clang__)
  149872. "adcs r4, %[r]\n\t"
  149873. #else
  149874. "adc r4, %[r]\n\t"
  149875. #endif
  149876. "# A[10] * B[4]\n\t"
  149877. "mov %[a], r9\n\t"
  149878. "mov %[b], r10\n\t"
  149879. "ldr %[a], [%[a], #40]\n\t"
  149880. "ldr %[b], [%[b], #16]\n\t"
  149881. "uxth r6, %[a]\n\t"
  149882. "uxth r7, %[b]\n\t"
  149883. #ifdef WOLFSSL_KEIL
  149884. "muls r7, r6, r7\n\t"
  149885. #elif defined(__clang__)
  149886. "muls r7, r6\n\t"
  149887. #else
  149888. "mul r7, r6\n\t"
  149889. #endif
  149890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149891. "adds r5, r5, r7\n\t"
  149892. #else
  149893. "add r5, r5, r7\n\t"
  149894. #endif
  149895. #ifdef WOLFSSL_KEIL
  149896. "adcs r3, r3, %[r]\n\t"
  149897. #elif defined(__clang__)
  149898. "adcs r3, %[r]\n\t"
  149899. #else
  149900. "adc r3, %[r]\n\t"
  149901. #endif
  149902. #ifdef WOLFSSL_KEIL
  149903. "adcs r4, r4, %[r]\n\t"
  149904. #elif defined(__clang__)
  149905. "adcs r4, %[r]\n\t"
  149906. #else
  149907. "adc r4, %[r]\n\t"
  149908. #endif
  149909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149910. "lsrs r7, %[b], #16\n\t"
  149911. #else
  149912. "lsr r7, %[b], #16\n\t"
  149913. #endif
  149914. #ifdef WOLFSSL_KEIL
  149915. "muls r6, r7, r6\n\t"
  149916. #elif defined(__clang__)
  149917. "muls r6, r7\n\t"
  149918. #else
  149919. "mul r6, r7\n\t"
  149920. #endif
  149921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149922. "lsrs r7, r6, #16\n\t"
  149923. #else
  149924. "lsr r7, r6, #16\n\t"
  149925. #endif
  149926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149927. "lsls r6, r6, #16\n\t"
  149928. #else
  149929. "lsl r6, r6, #16\n\t"
  149930. #endif
  149931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149932. "adds r5, r5, r6\n\t"
  149933. #else
  149934. "add r5, r5, r6\n\t"
  149935. #endif
  149936. #ifdef WOLFSSL_KEIL
  149937. "adcs r3, r3, r7\n\t"
  149938. #elif defined(__clang__)
  149939. "adcs r3, r7\n\t"
  149940. #else
  149941. "adc r3, r7\n\t"
  149942. #endif
  149943. #ifdef WOLFSSL_KEIL
  149944. "adcs r4, r4, %[r]\n\t"
  149945. #elif defined(__clang__)
  149946. "adcs r4, %[r]\n\t"
  149947. #else
  149948. "adc r4, %[r]\n\t"
  149949. #endif
  149950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149951. "lsrs r6, %[a], #16\n\t"
  149952. #else
  149953. "lsr r6, %[a], #16\n\t"
  149954. #endif
  149955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149956. "lsrs r7, %[b], #16\n\t"
  149957. #else
  149958. "lsr r7, %[b], #16\n\t"
  149959. #endif
  149960. #ifdef WOLFSSL_KEIL
  149961. "muls r7, r6, r7\n\t"
  149962. #elif defined(__clang__)
  149963. "muls r7, r6\n\t"
  149964. #else
  149965. "mul r7, r6\n\t"
  149966. #endif
  149967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149968. "adds r3, r3, r7\n\t"
  149969. #else
  149970. "add r3, r3, r7\n\t"
  149971. #endif
  149972. #ifdef WOLFSSL_KEIL
  149973. "adcs r4, r4, %[r]\n\t"
  149974. #elif defined(__clang__)
  149975. "adcs r4, %[r]\n\t"
  149976. #else
  149977. "adc r4, %[r]\n\t"
  149978. #endif
  149979. "uxth r7, %[b]\n\t"
  149980. #ifdef WOLFSSL_KEIL
  149981. "muls r6, r7, r6\n\t"
  149982. #elif defined(__clang__)
  149983. "muls r6, r7\n\t"
  149984. #else
  149985. "mul r6, r7\n\t"
  149986. #endif
  149987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149988. "lsrs r7, r6, #16\n\t"
  149989. #else
  149990. "lsr r7, r6, #16\n\t"
  149991. #endif
  149992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149993. "lsls r6, r6, #16\n\t"
  149994. #else
  149995. "lsl r6, r6, #16\n\t"
  149996. #endif
  149997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149998. "adds r5, r5, r6\n\t"
  149999. #else
  150000. "add r5, r5, r6\n\t"
  150001. #endif
  150002. #ifdef WOLFSSL_KEIL
  150003. "adcs r3, r3, r7\n\t"
  150004. #elif defined(__clang__)
  150005. "adcs r3, r7\n\t"
  150006. #else
  150007. "adc r3, r7\n\t"
  150008. #endif
  150009. #ifdef WOLFSSL_KEIL
  150010. "adcs r4, r4, %[r]\n\t"
  150011. #elif defined(__clang__)
  150012. "adcs r4, %[r]\n\t"
  150013. #else
  150014. "adc r4, %[r]\n\t"
  150015. #endif
  150016. "# A[9] * B[5]\n\t"
  150017. "mov %[a], r9\n\t"
  150018. "mov %[b], r10\n\t"
  150019. "ldr %[a], [%[a], #36]\n\t"
  150020. "ldr %[b], [%[b], #20]\n\t"
  150021. "uxth r6, %[a]\n\t"
  150022. "uxth r7, %[b]\n\t"
  150023. #ifdef WOLFSSL_KEIL
  150024. "muls r7, r6, r7\n\t"
  150025. #elif defined(__clang__)
  150026. "muls r7, r6\n\t"
  150027. #else
  150028. "mul r7, r6\n\t"
  150029. #endif
  150030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150031. "adds r5, r5, r7\n\t"
  150032. #else
  150033. "add r5, r5, r7\n\t"
  150034. #endif
  150035. #ifdef WOLFSSL_KEIL
  150036. "adcs r3, r3, %[r]\n\t"
  150037. #elif defined(__clang__)
  150038. "adcs r3, %[r]\n\t"
  150039. #else
  150040. "adc r3, %[r]\n\t"
  150041. #endif
  150042. #ifdef WOLFSSL_KEIL
  150043. "adcs r4, r4, %[r]\n\t"
  150044. #elif defined(__clang__)
  150045. "adcs r4, %[r]\n\t"
  150046. #else
  150047. "adc r4, %[r]\n\t"
  150048. #endif
  150049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150050. "lsrs r7, %[b], #16\n\t"
  150051. #else
  150052. "lsr r7, %[b], #16\n\t"
  150053. #endif
  150054. #ifdef WOLFSSL_KEIL
  150055. "muls r6, r7, r6\n\t"
  150056. #elif defined(__clang__)
  150057. "muls r6, r7\n\t"
  150058. #else
  150059. "mul r6, r7\n\t"
  150060. #endif
  150061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150062. "lsrs r7, r6, #16\n\t"
  150063. #else
  150064. "lsr r7, r6, #16\n\t"
  150065. #endif
  150066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150067. "lsls r6, r6, #16\n\t"
  150068. #else
  150069. "lsl r6, r6, #16\n\t"
  150070. #endif
  150071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150072. "adds r5, r5, r6\n\t"
  150073. #else
  150074. "add r5, r5, r6\n\t"
  150075. #endif
  150076. #ifdef WOLFSSL_KEIL
  150077. "adcs r3, r3, r7\n\t"
  150078. #elif defined(__clang__)
  150079. "adcs r3, r7\n\t"
  150080. #else
  150081. "adc r3, r7\n\t"
  150082. #endif
  150083. #ifdef WOLFSSL_KEIL
  150084. "adcs r4, r4, %[r]\n\t"
  150085. #elif defined(__clang__)
  150086. "adcs r4, %[r]\n\t"
  150087. #else
  150088. "adc r4, %[r]\n\t"
  150089. #endif
  150090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150091. "lsrs r6, %[a], #16\n\t"
  150092. #else
  150093. "lsr r6, %[a], #16\n\t"
  150094. #endif
  150095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150096. "lsrs r7, %[b], #16\n\t"
  150097. #else
  150098. "lsr r7, %[b], #16\n\t"
  150099. #endif
  150100. #ifdef WOLFSSL_KEIL
  150101. "muls r7, r6, r7\n\t"
  150102. #elif defined(__clang__)
  150103. "muls r7, r6\n\t"
  150104. #else
  150105. "mul r7, r6\n\t"
  150106. #endif
  150107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150108. "adds r3, r3, r7\n\t"
  150109. #else
  150110. "add r3, r3, r7\n\t"
  150111. #endif
  150112. #ifdef WOLFSSL_KEIL
  150113. "adcs r4, r4, %[r]\n\t"
  150114. #elif defined(__clang__)
  150115. "adcs r4, %[r]\n\t"
  150116. #else
  150117. "adc r4, %[r]\n\t"
  150118. #endif
  150119. "uxth r7, %[b]\n\t"
  150120. #ifdef WOLFSSL_KEIL
  150121. "muls r6, r7, r6\n\t"
  150122. #elif defined(__clang__)
  150123. "muls r6, r7\n\t"
  150124. #else
  150125. "mul r6, r7\n\t"
  150126. #endif
  150127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150128. "lsrs r7, r6, #16\n\t"
  150129. #else
  150130. "lsr r7, r6, #16\n\t"
  150131. #endif
  150132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150133. "lsls r6, r6, #16\n\t"
  150134. #else
  150135. "lsl r6, r6, #16\n\t"
  150136. #endif
  150137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150138. "adds r5, r5, r6\n\t"
  150139. #else
  150140. "add r5, r5, r6\n\t"
  150141. #endif
  150142. #ifdef WOLFSSL_KEIL
  150143. "adcs r3, r3, r7\n\t"
  150144. #elif defined(__clang__)
  150145. "adcs r3, r7\n\t"
  150146. #else
  150147. "adc r3, r7\n\t"
  150148. #endif
  150149. #ifdef WOLFSSL_KEIL
  150150. "adcs r4, r4, %[r]\n\t"
  150151. #elif defined(__clang__)
  150152. "adcs r4, %[r]\n\t"
  150153. #else
  150154. "adc r4, %[r]\n\t"
  150155. #endif
  150156. "# A[8] * B[6]\n\t"
  150157. "mov %[a], r9\n\t"
  150158. "mov %[b], r10\n\t"
  150159. "ldr %[a], [%[a], #32]\n\t"
  150160. "ldr %[b], [%[b], #24]\n\t"
  150161. "uxth r6, %[a]\n\t"
  150162. "uxth r7, %[b]\n\t"
  150163. #ifdef WOLFSSL_KEIL
  150164. "muls r7, r6, r7\n\t"
  150165. #elif defined(__clang__)
  150166. "muls r7, r6\n\t"
  150167. #else
  150168. "mul r7, r6\n\t"
  150169. #endif
  150170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150171. "adds r5, r5, r7\n\t"
  150172. #else
  150173. "add r5, r5, r7\n\t"
  150174. #endif
  150175. #ifdef WOLFSSL_KEIL
  150176. "adcs r3, r3, %[r]\n\t"
  150177. #elif defined(__clang__)
  150178. "adcs r3, %[r]\n\t"
  150179. #else
  150180. "adc r3, %[r]\n\t"
  150181. #endif
  150182. #ifdef WOLFSSL_KEIL
  150183. "adcs r4, r4, %[r]\n\t"
  150184. #elif defined(__clang__)
  150185. "adcs r4, %[r]\n\t"
  150186. #else
  150187. "adc r4, %[r]\n\t"
  150188. #endif
  150189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150190. "lsrs r7, %[b], #16\n\t"
  150191. #else
  150192. "lsr r7, %[b], #16\n\t"
  150193. #endif
  150194. #ifdef WOLFSSL_KEIL
  150195. "muls r6, r7, r6\n\t"
  150196. #elif defined(__clang__)
  150197. "muls r6, r7\n\t"
  150198. #else
  150199. "mul r6, r7\n\t"
  150200. #endif
  150201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150202. "lsrs r7, r6, #16\n\t"
  150203. #else
  150204. "lsr r7, r6, #16\n\t"
  150205. #endif
  150206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150207. "lsls r6, r6, #16\n\t"
  150208. #else
  150209. "lsl r6, r6, #16\n\t"
  150210. #endif
  150211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150212. "adds r5, r5, r6\n\t"
  150213. #else
  150214. "add r5, r5, r6\n\t"
  150215. #endif
  150216. #ifdef WOLFSSL_KEIL
  150217. "adcs r3, r3, r7\n\t"
  150218. #elif defined(__clang__)
  150219. "adcs r3, r7\n\t"
  150220. #else
  150221. "adc r3, r7\n\t"
  150222. #endif
  150223. #ifdef WOLFSSL_KEIL
  150224. "adcs r4, r4, %[r]\n\t"
  150225. #elif defined(__clang__)
  150226. "adcs r4, %[r]\n\t"
  150227. #else
  150228. "adc r4, %[r]\n\t"
  150229. #endif
  150230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150231. "lsrs r6, %[a], #16\n\t"
  150232. #else
  150233. "lsr r6, %[a], #16\n\t"
  150234. #endif
  150235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150236. "lsrs r7, %[b], #16\n\t"
  150237. #else
  150238. "lsr r7, %[b], #16\n\t"
  150239. #endif
  150240. #ifdef WOLFSSL_KEIL
  150241. "muls r7, r6, r7\n\t"
  150242. #elif defined(__clang__)
  150243. "muls r7, r6\n\t"
  150244. #else
  150245. "mul r7, r6\n\t"
  150246. #endif
  150247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150248. "adds r3, r3, r7\n\t"
  150249. #else
  150250. "add r3, r3, r7\n\t"
  150251. #endif
  150252. #ifdef WOLFSSL_KEIL
  150253. "adcs r4, r4, %[r]\n\t"
  150254. #elif defined(__clang__)
  150255. "adcs r4, %[r]\n\t"
  150256. #else
  150257. "adc r4, %[r]\n\t"
  150258. #endif
  150259. "uxth r7, %[b]\n\t"
  150260. #ifdef WOLFSSL_KEIL
  150261. "muls r6, r7, r6\n\t"
  150262. #elif defined(__clang__)
  150263. "muls r6, r7\n\t"
  150264. #else
  150265. "mul r6, r7\n\t"
  150266. #endif
  150267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150268. "lsrs r7, r6, #16\n\t"
  150269. #else
  150270. "lsr r7, r6, #16\n\t"
  150271. #endif
  150272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150273. "lsls r6, r6, #16\n\t"
  150274. #else
  150275. "lsl r6, r6, #16\n\t"
  150276. #endif
  150277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150278. "adds r5, r5, r6\n\t"
  150279. #else
  150280. "add r5, r5, r6\n\t"
  150281. #endif
  150282. #ifdef WOLFSSL_KEIL
  150283. "adcs r3, r3, r7\n\t"
  150284. #elif defined(__clang__)
  150285. "adcs r3, r7\n\t"
  150286. #else
  150287. "adc r3, r7\n\t"
  150288. #endif
  150289. #ifdef WOLFSSL_KEIL
  150290. "adcs r4, r4, %[r]\n\t"
  150291. #elif defined(__clang__)
  150292. "adcs r4, %[r]\n\t"
  150293. #else
  150294. "adc r4, %[r]\n\t"
  150295. #endif
  150296. "# A[7] * B[7]\n\t"
  150297. "mov %[a], r9\n\t"
  150298. "mov %[b], r10\n\t"
  150299. "ldr %[a], [%[a], #28]\n\t"
  150300. "ldr %[b], [%[b], #28]\n\t"
  150301. "uxth r6, %[a]\n\t"
  150302. "uxth r7, %[b]\n\t"
  150303. #ifdef WOLFSSL_KEIL
  150304. "muls r7, r6, r7\n\t"
  150305. #elif defined(__clang__)
  150306. "muls r7, r6\n\t"
  150307. #else
  150308. "mul r7, r6\n\t"
  150309. #endif
  150310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150311. "adds r5, r5, r7\n\t"
  150312. #else
  150313. "add r5, r5, r7\n\t"
  150314. #endif
  150315. #ifdef WOLFSSL_KEIL
  150316. "adcs r3, r3, %[r]\n\t"
  150317. #elif defined(__clang__)
  150318. "adcs r3, %[r]\n\t"
  150319. #else
  150320. "adc r3, %[r]\n\t"
  150321. #endif
  150322. #ifdef WOLFSSL_KEIL
  150323. "adcs r4, r4, %[r]\n\t"
  150324. #elif defined(__clang__)
  150325. "adcs r4, %[r]\n\t"
  150326. #else
  150327. "adc r4, %[r]\n\t"
  150328. #endif
  150329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150330. "lsrs r7, %[b], #16\n\t"
  150331. #else
  150332. "lsr r7, %[b], #16\n\t"
  150333. #endif
  150334. #ifdef WOLFSSL_KEIL
  150335. "muls r6, r7, r6\n\t"
  150336. #elif defined(__clang__)
  150337. "muls r6, r7\n\t"
  150338. #else
  150339. "mul r6, r7\n\t"
  150340. #endif
  150341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150342. "lsrs r7, r6, #16\n\t"
  150343. #else
  150344. "lsr r7, r6, #16\n\t"
  150345. #endif
  150346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150347. "lsls r6, r6, #16\n\t"
  150348. #else
  150349. "lsl r6, r6, #16\n\t"
  150350. #endif
  150351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150352. "adds r5, r5, r6\n\t"
  150353. #else
  150354. "add r5, r5, r6\n\t"
  150355. #endif
  150356. #ifdef WOLFSSL_KEIL
  150357. "adcs r3, r3, r7\n\t"
  150358. #elif defined(__clang__)
  150359. "adcs r3, r7\n\t"
  150360. #else
  150361. "adc r3, r7\n\t"
  150362. #endif
  150363. #ifdef WOLFSSL_KEIL
  150364. "adcs r4, r4, %[r]\n\t"
  150365. #elif defined(__clang__)
  150366. "adcs r4, %[r]\n\t"
  150367. #else
  150368. "adc r4, %[r]\n\t"
  150369. #endif
  150370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150371. "lsrs r6, %[a], #16\n\t"
  150372. #else
  150373. "lsr r6, %[a], #16\n\t"
  150374. #endif
  150375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150376. "lsrs r7, %[b], #16\n\t"
  150377. #else
  150378. "lsr r7, %[b], #16\n\t"
  150379. #endif
  150380. #ifdef WOLFSSL_KEIL
  150381. "muls r7, r6, r7\n\t"
  150382. #elif defined(__clang__)
  150383. "muls r7, r6\n\t"
  150384. #else
  150385. "mul r7, r6\n\t"
  150386. #endif
  150387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150388. "adds r3, r3, r7\n\t"
  150389. #else
  150390. "add r3, r3, r7\n\t"
  150391. #endif
  150392. #ifdef WOLFSSL_KEIL
  150393. "adcs r4, r4, %[r]\n\t"
  150394. #elif defined(__clang__)
  150395. "adcs r4, %[r]\n\t"
  150396. #else
  150397. "adc r4, %[r]\n\t"
  150398. #endif
  150399. "uxth r7, %[b]\n\t"
  150400. #ifdef WOLFSSL_KEIL
  150401. "muls r6, r7, r6\n\t"
  150402. #elif defined(__clang__)
  150403. "muls r6, r7\n\t"
  150404. #else
  150405. "mul r6, r7\n\t"
  150406. #endif
  150407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150408. "lsrs r7, r6, #16\n\t"
  150409. #else
  150410. "lsr r7, r6, #16\n\t"
  150411. #endif
  150412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150413. "lsls r6, r6, #16\n\t"
  150414. #else
  150415. "lsl r6, r6, #16\n\t"
  150416. #endif
  150417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150418. "adds r5, r5, r6\n\t"
  150419. #else
  150420. "add r5, r5, r6\n\t"
  150421. #endif
  150422. #ifdef WOLFSSL_KEIL
  150423. "adcs r3, r3, r7\n\t"
  150424. #elif defined(__clang__)
  150425. "adcs r3, r7\n\t"
  150426. #else
  150427. "adc r3, r7\n\t"
  150428. #endif
  150429. #ifdef WOLFSSL_KEIL
  150430. "adcs r4, r4, %[r]\n\t"
  150431. #elif defined(__clang__)
  150432. "adcs r4, %[r]\n\t"
  150433. #else
  150434. "adc r4, %[r]\n\t"
  150435. #endif
  150436. "# A[6] * B[8]\n\t"
  150437. "mov %[a], r9\n\t"
  150438. "mov %[b], r10\n\t"
  150439. "ldr %[a], [%[a], #24]\n\t"
  150440. "ldr %[b], [%[b], #32]\n\t"
  150441. "uxth r6, %[a]\n\t"
  150442. "uxth r7, %[b]\n\t"
  150443. #ifdef WOLFSSL_KEIL
  150444. "muls r7, r6, r7\n\t"
  150445. #elif defined(__clang__)
  150446. "muls r7, r6\n\t"
  150447. #else
  150448. "mul r7, r6\n\t"
  150449. #endif
  150450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150451. "adds r5, r5, r7\n\t"
  150452. #else
  150453. "add r5, r5, r7\n\t"
  150454. #endif
  150455. #ifdef WOLFSSL_KEIL
  150456. "adcs r3, r3, %[r]\n\t"
  150457. #elif defined(__clang__)
  150458. "adcs r3, %[r]\n\t"
  150459. #else
  150460. "adc r3, %[r]\n\t"
  150461. #endif
  150462. #ifdef WOLFSSL_KEIL
  150463. "adcs r4, r4, %[r]\n\t"
  150464. #elif defined(__clang__)
  150465. "adcs r4, %[r]\n\t"
  150466. #else
  150467. "adc r4, %[r]\n\t"
  150468. #endif
  150469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150470. "lsrs r7, %[b], #16\n\t"
  150471. #else
  150472. "lsr r7, %[b], #16\n\t"
  150473. #endif
  150474. #ifdef WOLFSSL_KEIL
  150475. "muls r6, r7, r6\n\t"
  150476. #elif defined(__clang__)
  150477. "muls r6, r7\n\t"
  150478. #else
  150479. "mul r6, r7\n\t"
  150480. #endif
  150481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150482. "lsrs r7, r6, #16\n\t"
  150483. #else
  150484. "lsr r7, r6, #16\n\t"
  150485. #endif
  150486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150487. "lsls r6, r6, #16\n\t"
  150488. #else
  150489. "lsl r6, r6, #16\n\t"
  150490. #endif
  150491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150492. "adds r5, r5, r6\n\t"
  150493. #else
  150494. "add r5, r5, r6\n\t"
  150495. #endif
  150496. #ifdef WOLFSSL_KEIL
  150497. "adcs r3, r3, r7\n\t"
  150498. #elif defined(__clang__)
  150499. "adcs r3, r7\n\t"
  150500. #else
  150501. "adc r3, r7\n\t"
  150502. #endif
  150503. #ifdef WOLFSSL_KEIL
  150504. "adcs r4, r4, %[r]\n\t"
  150505. #elif defined(__clang__)
  150506. "adcs r4, %[r]\n\t"
  150507. #else
  150508. "adc r4, %[r]\n\t"
  150509. #endif
  150510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150511. "lsrs r6, %[a], #16\n\t"
  150512. #else
  150513. "lsr r6, %[a], #16\n\t"
  150514. #endif
  150515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150516. "lsrs r7, %[b], #16\n\t"
  150517. #else
  150518. "lsr r7, %[b], #16\n\t"
  150519. #endif
  150520. #ifdef WOLFSSL_KEIL
  150521. "muls r7, r6, r7\n\t"
  150522. #elif defined(__clang__)
  150523. "muls r7, r6\n\t"
  150524. #else
  150525. "mul r7, r6\n\t"
  150526. #endif
  150527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150528. "adds r3, r3, r7\n\t"
  150529. #else
  150530. "add r3, r3, r7\n\t"
  150531. #endif
  150532. #ifdef WOLFSSL_KEIL
  150533. "adcs r4, r4, %[r]\n\t"
  150534. #elif defined(__clang__)
  150535. "adcs r4, %[r]\n\t"
  150536. #else
  150537. "adc r4, %[r]\n\t"
  150538. #endif
  150539. "uxth r7, %[b]\n\t"
  150540. #ifdef WOLFSSL_KEIL
  150541. "muls r6, r7, r6\n\t"
  150542. #elif defined(__clang__)
  150543. "muls r6, r7\n\t"
  150544. #else
  150545. "mul r6, r7\n\t"
  150546. #endif
  150547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150548. "lsrs r7, r6, #16\n\t"
  150549. #else
  150550. "lsr r7, r6, #16\n\t"
  150551. #endif
  150552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150553. "lsls r6, r6, #16\n\t"
  150554. #else
  150555. "lsl r6, r6, #16\n\t"
  150556. #endif
  150557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150558. "adds r5, r5, r6\n\t"
  150559. #else
  150560. "add r5, r5, r6\n\t"
  150561. #endif
  150562. #ifdef WOLFSSL_KEIL
  150563. "adcs r3, r3, r7\n\t"
  150564. #elif defined(__clang__)
  150565. "adcs r3, r7\n\t"
  150566. #else
  150567. "adc r3, r7\n\t"
  150568. #endif
  150569. #ifdef WOLFSSL_KEIL
  150570. "adcs r4, r4, %[r]\n\t"
  150571. #elif defined(__clang__)
  150572. "adcs r4, %[r]\n\t"
  150573. #else
  150574. "adc r4, %[r]\n\t"
  150575. #endif
  150576. "# A[5] * B[9]\n\t"
  150577. "mov %[a], r9\n\t"
  150578. "mov %[b], r10\n\t"
  150579. "ldr %[a], [%[a], #20]\n\t"
  150580. "ldr %[b], [%[b], #36]\n\t"
  150581. "uxth r6, %[a]\n\t"
  150582. "uxth r7, %[b]\n\t"
  150583. #ifdef WOLFSSL_KEIL
  150584. "muls r7, r6, r7\n\t"
  150585. #elif defined(__clang__)
  150586. "muls r7, r6\n\t"
  150587. #else
  150588. "mul r7, r6\n\t"
  150589. #endif
  150590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150591. "adds r5, r5, r7\n\t"
  150592. #else
  150593. "add r5, r5, r7\n\t"
  150594. #endif
  150595. #ifdef WOLFSSL_KEIL
  150596. "adcs r3, r3, %[r]\n\t"
  150597. #elif defined(__clang__)
  150598. "adcs r3, %[r]\n\t"
  150599. #else
  150600. "adc r3, %[r]\n\t"
  150601. #endif
  150602. #ifdef WOLFSSL_KEIL
  150603. "adcs r4, r4, %[r]\n\t"
  150604. #elif defined(__clang__)
  150605. "adcs r4, %[r]\n\t"
  150606. #else
  150607. "adc r4, %[r]\n\t"
  150608. #endif
  150609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150610. "lsrs r7, %[b], #16\n\t"
  150611. #else
  150612. "lsr r7, %[b], #16\n\t"
  150613. #endif
  150614. #ifdef WOLFSSL_KEIL
  150615. "muls r6, r7, r6\n\t"
  150616. #elif defined(__clang__)
  150617. "muls r6, r7\n\t"
  150618. #else
  150619. "mul r6, r7\n\t"
  150620. #endif
  150621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150622. "lsrs r7, r6, #16\n\t"
  150623. #else
  150624. "lsr r7, r6, #16\n\t"
  150625. #endif
  150626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150627. "lsls r6, r6, #16\n\t"
  150628. #else
  150629. "lsl r6, r6, #16\n\t"
  150630. #endif
  150631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150632. "adds r5, r5, r6\n\t"
  150633. #else
  150634. "add r5, r5, r6\n\t"
  150635. #endif
  150636. #ifdef WOLFSSL_KEIL
  150637. "adcs r3, r3, r7\n\t"
  150638. #elif defined(__clang__)
  150639. "adcs r3, r7\n\t"
  150640. #else
  150641. "adc r3, r7\n\t"
  150642. #endif
  150643. #ifdef WOLFSSL_KEIL
  150644. "adcs r4, r4, %[r]\n\t"
  150645. #elif defined(__clang__)
  150646. "adcs r4, %[r]\n\t"
  150647. #else
  150648. "adc r4, %[r]\n\t"
  150649. #endif
  150650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150651. "lsrs r6, %[a], #16\n\t"
  150652. #else
  150653. "lsr r6, %[a], #16\n\t"
  150654. #endif
  150655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150656. "lsrs r7, %[b], #16\n\t"
  150657. #else
  150658. "lsr r7, %[b], #16\n\t"
  150659. #endif
  150660. #ifdef WOLFSSL_KEIL
  150661. "muls r7, r6, r7\n\t"
  150662. #elif defined(__clang__)
  150663. "muls r7, r6\n\t"
  150664. #else
  150665. "mul r7, r6\n\t"
  150666. #endif
  150667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150668. "adds r3, r3, r7\n\t"
  150669. #else
  150670. "add r3, r3, r7\n\t"
  150671. #endif
  150672. #ifdef WOLFSSL_KEIL
  150673. "adcs r4, r4, %[r]\n\t"
  150674. #elif defined(__clang__)
  150675. "adcs r4, %[r]\n\t"
  150676. #else
  150677. "adc r4, %[r]\n\t"
  150678. #endif
  150679. "uxth r7, %[b]\n\t"
  150680. #ifdef WOLFSSL_KEIL
  150681. "muls r6, r7, r6\n\t"
  150682. #elif defined(__clang__)
  150683. "muls r6, r7\n\t"
  150684. #else
  150685. "mul r6, r7\n\t"
  150686. #endif
  150687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150688. "lsrs r7, r6, #16\n\t"
  150689. #else
  150690. "lsr r7, r6, #16\n\t"
  150691. #endif
  150692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150693. "lsls r6, r6, #16\n\t"
  150694. #else
  150695. "lsl r6, r6, #16\n\t"
  150696. #endif
  150697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150698. "adds r5, r5, r6\n\t"
  150699. #else
  150700. "add r5, r5, r6\n\t"
  150701. #endif
  150702. #ifdef WOLFSSL_KEIL
  150703. "adcs r3, r3, r7\n\t"
  150704. #elif defined(__clang__)
  150705. "adcs r3, r7\n\t"
  150706. #else
  150707. "adc r3, r7\n\t"
  150708. #endif
  150709. #ifdef WOLFSSL_KEIL
  150710. "adcs r4, r4, %[r]\n\t"
  150711. #elif defined(__clang__)
  150712. "adcs r4, %[r]\n\t"
  150713. #else
  150714. "adc r4, %[r]\n\t"
  150715. #endif
  150716. "# A[4] * B[10]\n\t"
  150717. "mov %[a], r9\n\t"
  150718. "mov %[b], r10\n\t"
  150719. "ldr %[a], [%[a], #16]\n\t"
  150720. "ldr %[b], [%[b], #40]\n\t"
  150721. "uxth r6, %[a]\n\t"
  150722. "uxth r7, %[b]\n\t"
  150723. #ifdef WOLFSSL_KEIL
  150724. "muls r7, r6, r7\n\t"
  150725. #elif defined(__clang__)
  150726. "muls r7, r6\n\t"
  150727. #else
  150728. "mul r7, r6\n\t"
  150729. #endif
  150730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150731. "adds r5, r5, r7\n\t"
  150732. #else
  150733. "add r5, r5, r7\n\t"
  150734. #endif
  150735. #ifdef WOLFSSL_KEIL
  150736. "adcs r3, r3, %[r]\n\t"
  150737. #elif defined(__clang__)
  150738. "adcs r3, %[r]\n\t"
  150739. #else
  150740. "adc r3, %[r]\n\t"
  150741. #endif
  150742. #ifdef WOLFSSL_KEIL
  150743. "adcs r4, r4, %[r]\n\t"
  150744. #elif defined(__clang__)
  150745. "adcs r4, %[r]\n\t"
  150746. #else
  150747. "adc r4, %[r]\n\t"
  150748. #endif
  150749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150750. "lsrs r7, %[b], #16\n\t"
  150751. #else
  150752. "lsr r7, %[b], #16\n\t"
  150753. #endif
  150754. #ifdef WOLFSSL_KEIL
  150755. "muls r6, r7, r6\n\t"
  150756. #elif defined(__clang__)
  150757. "muls r6, r7\n\t"
  150758. #else
  150759. "mul r6, r7\n\t"
  150760. #endif
  150761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150762. "lsrs r7, r6, #16\n\t"
  150763. #else
  150764. "lsr r7, r6, #16\n\t"
  150765. #endif
  150766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150767. "lsls r6, r6, #16\n\t"
  150768. #else
  150769. "lsl r6, r6, #16\n\t"
  150770. #endif
  150771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150772. "adds r5, r5, r6\n\t"
  150773. #else
  150774. "add r5, r5, r6\n\t"
  150775. #endif
  150776. #ifdef WOLFSSL_KEIL
  150777. "adcs r3, r3, r7\n\t"
  150778. #elif defined(__clang__)
  150779. "adcs r3, r7\n\t"
  150780. #else
  150781. "adc r3, r7\n\t"
  150782. #endif
  150783. #ifdef WOLFSSL_KEIL
  150784. "adcs r4, r4, %[r]\n\t"
  150785. #elif defined(__clang__)
  150786. "adcs r4, %[r]\n\t"
  150787. #else
  150788. "adc r4, %[r]\n\t"
  150789. #endif
  150790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150791. "lsrs r6, %[a], #16\n\t"
  150792. #else
  150793. "lsr r6, %[a], #16\n\t"
  150794. #endif
  150795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150796. "lsrs r7, %[b], #16\n\t"
  150797. #else
  150798. "lsr r7, %[b], #16\n\t"
  150799. #endif
  150800. #ifdef WOLFSSL_KEIL
  150801. "muls r7, r6, r7\n\t"
  150802. #elif defined(__clang__)
  150803. "muls r7, r6\n\t"
  150804. #else
  150805. "mul r7, r6\n\t"
  150806. #endif
  150807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150808. "adds r3, r3, r7\n\t"
  150809. #else
  150810. "add r3, r3, r7\n\t"
  150811. #endif
  150812. #ifdef WOLFSSL_KEIL
  150813. "adcs r4, r4, %[r]\n\t"
  150814. #elif defined(__clang__)
  150815. "adcs r4, %[r]\n\t"
  150816. #else
  150817. "adc r4, %[r]\n\t"
  150818. #endif
  150819. "uxth r7, %[b]\n\t"
  150820. #ifdef WOLFSSL_KEIL
  150821. "muls r6, r7, r6\n\t"
  150822. #elif defined(__clang__)
  150823. "muls r6, r7\n\t"
  150824. #else
  150825. "mul r6, r7\n\t"
  150826. #endif
  150827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150828. "lsrs r7, r6, #16\n\t"
  150829. #else
  150830. "lsr r7, r6, #16\n\t"
  150831. #endif
  150832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150833. "lsls r6, r6, #16\n\t"
  150834. #else
  150835. "lsl r6, r6, #16\n\t"
  150836. #endif
  150837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150838. "adds r5, r5, r6\n\t"
  150839. #else
  150840. "add r5, r5, r6\n\t"
  150841. #endif
  150842. #ifdef WOLFSSL_KEIL
  150843. "adcs r3, r3, r7\n\t"
  150844. #elif defined(__clang__)
  150845. "adcs r3, r7\n\t"
  150846. #else
  150847. "adc r3, r7\n\t"
  150848. #endif
  150849. #ifdef WOLFSSL_KEIL
  150850. "adcs r4, r4, %[r]\n\t"
  150851. #elif defined(__clang__)
  150852. "adcs r4, %[r]\n\t"
  150853. #else
  150854. "adc r4, %[r]\n\t"
  150855. #endif
  150856. "# A[3] * B[11]\n\t"
  150857. "mov %[a], r9\n\t"
  150858. "mov %[b], r10\n\t"
  150859. "ldr %[a], [%[a], #12]\n\t"
  150860. "ldr %[b], [%[b], #44]\n\t"
  150861. "uxth r6, %[a]\n\t"
  150862. "uxth r7, %[b]\n\t"
  150863. #ifdef WOLFSSL_KEIL
  150864. "muls r7, r6, r7\n\t"
  150865. #elif defined(__clang__)
  150866. "muls r7, r6\n\t"
  150867. #else
  150868. "mul r7, r6\n\t"
  150869. #endif
  150870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150871. "adds r5, r5, r7\n\t"
  150872. #else
  150873. "add r5, r5, r7\n\t"
  150874. #endif
  150875. #ifdef WOLFSSL_KEIL
  150876. "adcs r3, r3, %[r]\n\t"
  150877. #elif defined(__clang__)
  150878. "adcs r3, %[r]\n\t"
  150879. #else
  150880. "adc r3, %[r]\n\t"
  150881. #endif
  150882. #ifdef WOLFSSL_KEIL
  150883. "adcs r4, r4, %[r]\n\t"
  150884. #elif defined(__clang__)
  150885. "adcs r4, %[r]\n\t"
  150886. #else
  150887. "adc r4, %[r]\n\t"
  150888. #endif
  150889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150890. "lsrs r7, %[b], #16\n\t"
  150891. #else
  150892. "lsr r7, %[b], #16\n\t"
  150893. #endif
  150894. #ifdef WOLFSSL_KEIL
  150895. "muls r6, r7, r6\n\t"
  150896. #elif defined(__clang__)
  150897. "muls r6, r7\n\t"
  150898. #else
  150899. "mul r6, r7\n\t"
  150900. #endif
  150901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150902. "lsrs r7, r6, #16\n\t"
  150903. #else
  150904. "lsr r7, r6, #16\n\t"
  150905. #endif
  150906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150907. "lsls r6, r6, #16\n\t"
  150908. #else
  150909. "lsl r6, r6, #16\n\t"
  150910. #endif
  150911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150912. "adds r5, r5, r6\n\t"
  150913. #else
  150914. "add r5, r5, r6\n\t"
  150915. #endif
  150916. #ifdef WOLFSSL_KEIL
  150917. "adcs r3, r3, r7\n\t"
  150918. #elif defined(__clang__)
  150919. "adcs r3, r7\n\t"
  150920. #else
  150921. "adc r3, r7\n\t"
  150922. #endif
  150923. #ifdef WOLFSSL_KEIL
  150924. "adcs r4, r4, %[r]\n\t"
  150925. #elif defined(__clang__)
  150926. "adcs r4, %[r]\n\t"
  150927. #else
  150928. "adc r4, %[r]\n\t"
  150929. #endif
  150930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150931. "lsrs r6, %[a], #16\n\t"
  150932. #else
  150933. "lsr r6, %[a], #16\n\t"
  150934. #endif
  150935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150936. "lsrs r7, %[b], #16\n\t"
  150937. #else
  150938. "lsr r7, %[b], #16\n\t"
  150939. #endif
  150940. #ifdef WOLFSSL_KEIL
  150941. "muls r7, r6, r7\n\t"
  150942. #elif defined(__clang__)
  150943. "muls r7, r6\n\t"
  150944. #else
  150945. "mul r7, r6\n\t"
  150946. #endif
  150947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150948. "adds r3, r3, r7\n\t"
  150949. #else
  150950. "add r3, r3, r7\n\t"
  150951. #endif
  150952. #ifdef WOLFSSL_KEIL
  150953. "adcs r4, r4, %[r]\n\t"
  150954. #elif defined(__clang__)
  150955. "adcs r4, %[r]\n\t"
  150956. #else
  150957. "adc r4, %[r]\n\t"
  150958. #endif
  150959. "uxth r7, %[b]\n\t"
  150960. #ifdef WOLFSSL_KEIL
  150961. "muls r6, r7, r6\n\t"
  150962. #elif defined(__clang__)
  150963. "muls r6, r7\n\t"
  150964. #else
  150965. "mul r6, r7\n\t"
  150966. #endif
  150967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150968. "lsrs r7, r6, #16\n\t"
  150969. #else
  150970. "lsr r7, r6, #16\n\t"
  150971. #endif
  150972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150973. "lsls r6, r6, #16\n\t"
  150974. #else
  150975. "lsl r6, r6, #16\n\t"
  150976. #endif
  150977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150978. "adds r5, r5, r6\n\t"
  150979. #else
  150980. "add r5, r5, r6\n\t"
  150981. #endif
  150982. #ifdef WOLFSSL_KEIL
  150983. "adcs r3, r3, r7\n\t"
  150984. #elif defined(__clang__)
  150985. "adcs r3, r7\n\t"
  150986. #else
  150987. "adc r3, r7\n\t"
  150988. #endif
  150989. #ifdef WOLFSSL_KEIL
  150990. "adcs r4, r4, %[r]\n\t"
  150991. #elif defined(__clang__)
  150992. "adcs r4, %[r]\n\t"
  150993. #else
  150994. "adc r4, %[r]\n\t"
  150995. #endif
  150996. "# A[2] * B[12]\n\t"
  150997. "mov %[a], r9\n\t"
  150998. "mov %[b], r10\n\t"
  150999. "ldr %[a], [%[a], #8]\n\t"
  151000. "ldr %[b], [%[b], #48]\n\t"
  151001. "uxth r6, %[a]\n\t"
  151002. "uxth r7, %[b]\n\t"
  151003. #ifdef WOLFSSL_KEIL
  151004. "muls r7, r6, r7\n\t"
  151005. #elif defined(__clang__)
  151006. "muls r7, r6\n\t"
  151007. #else
  151008. "mul r7, r6\n\t"
  151009. #endif
  151010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151011. "adds r5, r5, r7\n\t"
  151012. #else
  151013. "add r5, r5, r7\n\t"
  151014. #endif
  151015. #ifdef WOLFSSL_KEIL
  151016. "adcs r3, r3, %[r]\n\t"
  151017. #elif defined(__clang__)
  151018. "adcs r3, %[r]\n\t"
  151019. #else
  151020. "adc r3, %[r]\n\t"
  151021. #endif
  151022. #ifdef WOLFSSL_KEIL
  151023. "adcs r4, r4, %[r]\n\t"
  151024. #elif defined(__clang__)
  151025. "adcs r4, %[r]\n\t"
  151026. #else
  151027. "adc r4, %[r]\n\t"
  151028. #endif
  151029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151030. "lsrs r7, %[b], #16\n\t"
  151031. #else
  151032. "lsr r7, %[b], #16\n\t"
  151033. #endif
  151034. #ifdef WOLFSSL_KEIL
  151035. "muls r6, r7, r6\n\t"
  151036. #elif defined(__clang__)
  151037. "muls r6, r7\n\t"
  151038. #else
  151039. "mul r6, r7\n\t"
  151040. #endif
  151041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151042. "lsrs r7, r6, #16\n\t"
  151043. #else
  151044. "lsr r7, r6, #16\n\t"
  151045. #endif
  151046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151047. "lsls r6, r6, #16\n\t"
  151048. #else
  151049. "lsl r6, r6, #16\n\t"
  151050. #endif
  151051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151052. "adds r5, r5, r6\n\t"
  151053. #else
  151054. "add r5, r5, r6\n\t"
  151055. #endif
  151056. #ifdef WOLFSSL_KEIL
  151057. "adcs r3, r3, r7\n\t"
  151058. #elif defined(__clang__)
  151059. "adcs r3, r7\n\t"
  151060. #else
  151061. "adc r3, r7\n\t"
  151062. #endif
  151063. #ifdef WOLFSSL_KEIL
  151064. "adcs r4, r4, %[r]\n\t"
  151065. #elif defined(__clang__)
  151066. "adcs r4, %[r]\n\t"
  151067. #else
  151068. "adc r4, %[r]\n\t"
  151069. #endif
  151070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151071. "lsrs r6, %[a], #16\n\t"
  151072. #else
  151073. "lsr r6, %[a], #16\n\t"
  151074. #endif
  151075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151076. "lsrs r7, %[b], #16\n\t"
  151077. #else
  151078. "lsr r7, %[b], #16\n\t"
  151079. #endif
  151080. #ifdef WOLFSSL_KEIL
  151081. "muls r7, r6, r7\n\t"
  151082. #elif defined(__clang__)
  151083. "muls r7, r6\n\t"
  151084. #else
  151085. "mul r7, r6\n\t"
  151086. #endif
  151087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151088. "adds r3, r3, r7\n\t"
  151089. #else
  151090. "add r3, r3, r7\n\t"
  151091. #endif
  151092. #ifdef WOLFSSL_KEIL
  151093. "adcs r4, r4, %[r]\n\t"
  151094. #elif defined(__clang__)
  151095. "adcs r4, %[r]\n\t"
  151096. #else
  151097. "adc r4, %[r]\n\t"
  151098. #endif
  151099. "uxth r7, %[b]\n\t"
  151100. #ifdef WOLFSSL_KEIL
  151101. "muls r6, r7, r6\n\t"
  151102. #elif defined(__clang__)
  151103. "muls r6, r7\n\t"
  151104. #else
  151105. "mul r6, r7\n\t"
  151106. #endif
  151107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151108. "lsrs r7, r6, #16\n\t"
  151109. #else
  151110. "lsr r7, r6, #16\n\t"
  151111. #endif
  151112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151113. "lsls r6, r6, #16\n\t"
  151114. #else
  151115. "lsl r6, r6, #16\n\t"
  151116. #endif
  151117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151118. "adds r5, r5, r6\n\t"
  151119. #else
  151120. "add r5, r5, r6\n\t"
  151121. #endif
  151122. #ifdef WOLFSSL_KEIL
  151123. "adcs r3, r3, r7\n\t"
  151124. #elif defined(__clang__)
  151125. "adcs r3, r7\n\t"
  151126. #else
  151127. "adc r3, r7\n\t"
  151128. #endif
  151129. #ifdef WOLFSSL_KEIL
  151130. "adcs r4, r4, %[r]\n\t"
  151131. #elif defined(__clang__)
  151132. "adcs r4, %[r]\n\t"
  151133. #else
  151134. "adc r4, %[r]\n\t"
  151135. #endif
  151136. "# A[1] * B[13]\n\t"
  151137. "mov %[a], r9\n\t"
  151138. "mov %[b], r10\n\t"
  151139. "ldr %[a], [%[a], #4]\n\t"
  151140. "ldr %[b], [%[b], #52]\n\t"
  151141. "uxth r6, %[a]\n\t"
  151142. "uxth r7, %[b]\n\t"
  151143. #ifdef WOLFSSL_KEIL
  151144. "muls r7, r6, r7\n\t"
  151145. #elif defined(__clang__)
  151146. "muls r7, r6\n\t"
  151147. #else
  151148. "mul r7, r6\n\t"
  151149. #endif
  151150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151151. "adds r5, r5, r7\n\t"
  151152. #else
  151153. "add r5, r5, r7\n\t"
  151154. #endif
  151155. #ifdef WOLFSSL_KEIL
  151156. "adcs r3, r3, %[r]\n\t"
  151157. #elif defined(__clang__)
  151158. "adcs r3, %[r]\n\t"
  151159. #else
  151160. "adc r3, %[r]\n\t"
  151161. #endif
  151162. #ifdef WOLFSSL_KEIL
  151163. "adcs r4, r4, %[r]\n\t"
  151164. #elif defined(__clang__)
  151165. "adcs r4, %[r]\n\t"
  151166. #else
  151167. "adc r4, %[r]\n\t"
  151168. #endif
  151169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151170. "lsrs r7, %[b], #16\n\t"
  151171. #else
  151172. "lsr r7, %[b], #16\n\t"
  151173. #endif
  151174. #ifdef WOLFSSL_KEIL
  151175. "muls r6, r7, r6\n\t"
  151176. #elif defined(__clang__)
  151177. "muls r6, r7\n\t"
  151178. #else
  151179. "mul r6, r7\n\t"
  151180. #endif
  151181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151182. "lsrs r7, r6, #16\n\t"
  151183. #else
  151184. "lsr r7, r6, #16\n\t"
  151185. #endif
  151186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151187. "lsls r6, r6, #16\n\t"
  151188. #else
  151189. "lsl r6, r6, #16\n\t"
  151190. #endif
  151191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151192. "adds r5, r5, r6\n\t"
  151193. #else
  151194. "add r5, r5, r6\n\t"
  151195. #endif
  151196. #ifdef WOLFSSL_KEIL
  151197. "adcs r3, r3, r7\n\t"
  151198. #elif defined(__clang__)
  151199. "adcs r3, r7\n\t"
  151200. #else
  151201. "adc r3, r7\n\t"
  151202. #endif
  151203. #ifdef WOLFSSL_KEIL
  151204. "adcs r4, r4, %[r]\n\t"
  151205. #elif defined(__clang__)
  151206. "adcs r4, %[r]\n\t"
  151207. #else
  151208. "adc r4, %[r]\n\t"
  151209. #endif
  151210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151211. "lsrs r6, %[a], #16\n\t"
  151212. #else
  151213. "lsr r6, %[a], #16\n\t"
  151214. #endif
  151215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151216. "lsrs r7, %[b], #16\n\t"
  151217. #else
  151218. "lsr r7, %[b], #16\n\t"
  151219. #endif
  151220. #ifdef WOLFSSL_KEIL
  151221. "muls r7, r6, r7\n\t"
  151222. #elif defined(__clang__)
  151223. "muls r7, r6\n\t"
  151224. #else
  151225. "mul r7, r6\n\t"
  151226. #endif
  151227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151228. "adds r3, r3, r7\n\t"
  151229. #else
  151230. "add r3, r3, r7\n\t"
  151231. #endif
  151232. #ifdef WOLFSSL_KEIL
  151233. "adcs r4, r4, %[r]\n\t"
  151234. #elif defined(__clang__)
  151235. "adcs r4, %[r]\n\t"
  151236. #else
  151237. "adc r4, %[r]\n\t"
  151238. #endif
  151239. "uxth r7, %[b]\n\t"
  151240. #ifdef WOLFSSL_KEIL
  151241. "muls r6, r7, r6\n\t"
  151242. #elif defined(__clang__)
  151243. "muls r6, r7\n\t"
  151244. #else
  151245. "mul r6, r7\n\t"
  151246. #endif
  151247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151248. "lsrs r7, r6, #16\n\t"
  151249. #else
  151250. "lsr r7, r6, #16\n\t"
  151251. #endif
  151252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151253. "lsls r6, r6, #16\n\t"
  151254. #else
  151255. "lsl r6, r6, #16\n\t"
  151256. #endif
  151257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151258. "adds r5, r5, r6\n\t"
  151259. #else
  151260. "add r5, r5, r6\n\t"
  151261. #endif
  151262. #ifdef WOLFSSL_KEIL
  151263. "adcs r3, r3, r7\n\t"
  151264. #elif defined(__clang__)
  151265. "adcs r3, r7\n\t"
  151266. #else
  151267. "adc r3, r7\n\t"
  151268. #endif
  151269. #ifdef WOLFSSL_KEIL
  151270. "adcs r4, r4, %[r]\n\t"
  151271. #elif defined(__clang__)
  151272. "adcs r4, %[r]\n\t"
  151273. #else
  151274. "adc r4, %[r]\n\t"
  151275. #endif
  151276. "# A[0] * B[14]\n\t"
  151277. "mov %[a], r9\n\t"
  151278. "mov %[b], r10\n\t"
  151279. "ldr %[a], [%[a]]\n\t"
  151280. "ldr %[b], [%[b], #56]\n\t"
  151281. "uxth r6, %[a]\n\t"
  151282. "uxth r7, %[b]\n\t"
  151283. #ifdef WOLFSSL_KEIL
  151284. "muls r7, r6, r7\n\t"
  151285. #elif defined(__clang__)
  151286. "muls r7, r6\n\t"
  151287. #else
  151288. "mul r7, r6\n\t"
  151289. #endif
  151290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151291. "adds r5, r5, r7\n\t"
  151292. #else
  151293. "add r5, r5, r7\n\t"
  151294. #endif
  151295. #ifdef WOLFSSL_KEIL
  151296. "adcs r3, r3, %[r]\n\t"
  151297. #elif defined(__clang__)
  151298. "adcs r3, %[r]\n\t"
  151299. #else
  151300. "adc r3, %[r]\n\t"
  151301. #endif
  151302. #ifdef WOLFSSL_KEIL
  151303. "adcs r4, r4, %[r]\n\t"
  151304. #elif defined(__clang__)
  151305. "adcs r4, %[r]\n\t"
  151306. #else
  151307. "adc r4, %[r]\n\t"
  151308. #endif
  151309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151310. "lsrs r7, %[b], #16\n\t"
  151311. #else
  151312. "lsr r7, %[b], #16\n\t"
  151313. #endif
  151314. #ifdef WOLFSSL_KEIL
  151315. "muls r6, r7, r6\n\t"
  151316. #elif defined(__clang__)
  151317. "muls r6, r7\n\t"
  151318. #else
  151319. "mul r6, r7\n\t"
  151320. #endif
  151321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151322. "lsrs r7, r6, #16\n\t"
  151323. #else
  151324. "lsr r7, r6, #16\n\t"
  151325. #endif
  151326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151327. "lsls r6, r6, #16\n\t"
  151328. #else
  151329. "lsl r6, r6, #16\n\t"
  151330. #endif
  151331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151332. "adds r5, r5, r6\n\t"
  151333. #else
  151334. "add r5, r5, r6\n\t"
  151335. #endif
  151336. #ifdef WOLFSSL_KEIL
  151337. "adcs r3, r3, r7\n\t"
  151338. #elif defined(__clang__)
  151339. "adcs r3, r7\n\t"
  151340. #else
  151341. "adc r3, r7\n\t"
  151342. #endif
  151343. #ifdef WOLFSSL_KEIL
  151344. "adcs r4, r4, %[r]\n\t"
  151345. #elif defined(__clang__)
  151346. "adcs r4, %[r]\n\t"
  151347. #else
  151348. "adc r4, %[r]\n\t"
  151349. #endif
  151350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151351. "lsrs r6, %[a], #16\n\t"
  151352. #else
  151353. "lsr r6, %[a], #16\n\t"
  151354. #endif
  151355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151356. "lsrs r7, %[b], #16\n\t"
  151357. #else
  151358. "lsr r7, %[b], #16\n\t"
  151359. #endif
  151360. #ifdef WOLFSSL_KEIL
  151361. "muls r7, r6, r7\n\t"
  151362. #elif defined(__clang__)
  151363. "muls r7, r6\n\t"
  151364. #else
  151365. "mul r7, r6\n\t"
  151366. #endif
  151367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151368. "adds r3, r3, r7\n\t"
  151369. #else
  151370. "add r3, r3, r7\n\t"
  151371. #endif
  151372. #ifdef WOLFSSL_KEIL
  151373. "adcs r4, r4, %[r]\n\t"
  151374. #elif defined(__clang__)
  151375. "adcs r4, %[r]\n\t"
  151376. #else
  151377. "adc r4, %[r]\n\t"
  151378. #endif
  151379. "uxth r7, %[b]\n\t"
  151380. #ifdef WOLFSSL_KEIL
  151381. "muls r6, r7, r6\n\t"
  151382. #elif defined(__clang__)
  151383. "muls r6, r7\n\t"
  151384. #else
  151385. "mul r6, r7\n\t"
  151386. #endif
  151387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151388. "lsrs r7, r6, #16\n\t"
  151389. #else
  151390. "lsr r7, r6, #16\n\t"
  151391. #endif
  151392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151393. "lsls r6, r6, #16\n\t"
  151394. #else
  151395. "lsl r6, r6, #16\n\t"
  151396. #endif
  151397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151398. "adds r5, r5, r6\n\t"
  151399. #else
  151400. "add r5, r5, r6\n\t"
  151401. #endif
  151402. #ifdef WOLFSSL_KEIL
  151403. "adcs r3, r3, r7\n\t"
  151404. #elif defined(__clang__)
  151405. "adcs r3, r7\n\t"
  151406. #else
  151407. "adc r3, r7\n\t"
  151408. #endif
  151409. #ifdef WOLFSSL_KEIL
  151410. "adcs r4, r4, %[r]\n\t"
  151411. #elif defined(__clang__)
  151412. "adcs r4, %[r]\n\t"
  151413. #else
  151414. "adc r4, %[r]\n\t"
  151415. #endif
  151416. "str r5, [sp, #56]\n\t"
  151417. "# A[0] * B[15]\n\t"
  151418. "movs r5, #0\n\t"
  151419. "mov %[a], r9\n\t"
  151420. "mov %[b], r10\n\t"
  151421. "ldr %[a], [%[a]]\n\t"
  151422. "ldr %[b], [%[b], #60]\n\t"
  151423. "uxth r6, %[a]\n\t"
  151424. "uxth r7, %[b]\n\t"
  151425. #ifdef WOLFSSL_KEIL
  151426. "muls r7, r6, r7\n\t"
  151427. #elif defined(__clang__)
  151428. "muls r7, r6\n\t"
  151429. #else
  151430. "mul r7, r6\n\t"
  151431. #endif
  151432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151433. "adds r3, r3, r7\n\t"
  151434. #else
  151435. "add r3, r3, r7\n\t"
  151436. #endif
  151437. #ifdef WOLFSSL_KEIL
  151438. "adcs r4, r4, %[r]\n\t"
  151439. #elif defined(__clang__)
  151440. "adcs r4, %[r]\n\t"
  151441. #else
  151442. "adc r4, %[r]\n\t"
  151443. #endif
  151444. #ifdef WOLFSSL_KEIL
  151445. "adcs r5, r5, %[r]\n\t"
  151446. #elif defined(__clang__)
  151447. "adcs r5, %[r]\n\t"
  151448. #else
  151449. "adc r5, %[r]\n\t"
  151450. #endif
  151451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151452. "lsrs r7, %[b], #16\n\t"
  151453. #else
  151454. "lsr r7, %[b], #16\n\t"
  151455. #endif
  151456. #ifdef WOLFSSL_KEIL
  151457. "muls r6, r7, r6\n\t"
  151458. #elif defined(__clang__)
  151459. "muls r6, r7\n\t"
  151460. #else
  151461. "mul r6, r7\n\t"
  151462. #endif
  151463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151464. "lsrs r7, r6, #16\n\t"
  151465. #else
  151466. "lsr r7, r6, #16\n\t"
  151467. #endif
  151468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151469. "lsls r6, r6, #16\n\t"
  151470. #else
  151471. "lsl r6, r6, #16\n\t"
  151472. #endif
  151473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151474. "adds r3, r3, r6\n\t"
  151475. #else
  151476. "add r3, r3, r6\n\t"
  151477. #endif
  151478. #ifdef WOLFSSL_KEIL
  151479. "adcs r4, r4, r7\n\t"
  151480. #elif defined(__clang__)
  151481. "adcs r4, r7\n\t"
  151482. #else
  151483. "adc r4, r7\n\t"
  151484. #endif
  151485. #ifdef WOLFSSL_KEIL
  151486. "adcs r5, r5, %[r]\n\t"
  151487. #elif defined(__clang__)
  151488. "adcs r5, %[r]\n\t"
  151489. #else
  151490. "adc r5, %[r]\n\t"
  151491. #endif
  151492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151493. "lsrs r6, %[a], #16\n\t"
  151494. #else
  151495. "lsr r6, %[a], #16\n\t"
  151496. #endif
  151497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151498. "lsrs r7, %[b], #16\n\t"
  151499. #else
  151500. "lsr r7, %[b], #16\n\t"
  151501. #endif
  151502. #ifdef WOLFSSL_KEIL
  151503. "muls r7, r6, r7\n\t"
  151504. #elif defined(__clang__)
  151505. "muls r7, r6\n\t"
  151506. #else
  151507. "mul r7, r6\n\t"
  151508. #endif
  151509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151510. "adds r4, r4, r7\n\t"
  151511. #else
  151512. "add r4, r4, r7\n\t"
  151513. #endif
  151514. #ifdef WOLFSSL_KEIL
  151515. "adcs r5, r5, %[r]\n\t"
  151516. #elif defined(__clang__)
  151517. "adcs r5, %[r]\n\t"
  151518. #else
  151519. "adc r5, %[r]\n\t"
  151520. #endif
  151521. "uxth r7, %[b]\n\t"
  151522. #ifdef WOLFSSL_KEIL
  151523. "muls r6, r7, r6\n\t"
  151524. #elif defined(__clang__)
  151525. "muls r6, r7\n\t"
  151526. #else
  151527. "mul r6, r7\n\t"
  151528. #endif
  151529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151530. "lsrs r7, r6, #16\n\t"
  151531. #else
  151532. "lsr r7, r6, #16\n\t"
  151533. #endif
  151534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151535. "lsls r6, r6, #16\n\t"
  151536. #else
  151537. "lsl r6, r6, #16\n\t"
  151538. #endif
  151539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151540. "adds r3, r3, r6\n\t"
  151541. #else
  151542. "add r3, r3, r6\n\t"
  151543. #endif
  151544. #ifdef WOLFSSL_KEIL
  151545. "adcs r4, r4, r7\n\t"
  151546. #elif defined(__clang__)
  151547. "adcs r4, r7\n\t"
  151548. #else
  151549. "adc r4, r7\n\t"
  151550. #endif
  151551. #ifdef WOLFSSL_KEIL
  151552. "adcs r5, r5, %[r]\n\t"
  151553. #elif defined(__clang__)
  151554. "adcs r5, %[r]\n\t"
  151555. #else
  151556. "adc r5, %[r]\n\t"
  151557. #endif
  151558. "# A[1] * B[14]\n\t"
  151559. "mov %[a], r9\n\t"
  151560. "mov %[b], r10\n\t"
  151561. "ldr %[a], [%[a], #4]\n\t"
  151562. "ldr %[b], [%[b], #56]\n\t"
  151563. "uxth r6, %[a]\n\t"
  151564. "uxth r7, %[b]\n\t"
  151565. #ifdef WOLFSSL_KEIL
  151566. "muls r7, r6, r7\n\t"
  151567. #elif defined(__clang__)
  151568. "muls r7, r6\n\t"
  151569. #else
  151570. "mul r7, r6\n\t"
  151571. #endif
  151572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151573. "adds r3, r3, r7\n\t"
  151574. #else
  151575. "add r3, r3, r7\n\t"
  151576. #endif
  151577. #ifdef WOLFSSL_KEIL
  151578. "adcs r4, r4, %[r]\n\t"
  151579. #elif defined(__clang__)
  151580. "adcs r4, %[r]\n\t"
  151581. #else
  151582. "adc r4, %[r]\n\t"
  151583. #endif
  151584. #ifdef WOLFSSL_KEIL
  151585. "adcs r5, r5, %[r]\n\t"
  151586. #elif defined(__clang__)
  151587. "adcs r5, %[r]\n\t"
  151588. #else
  151589. "adc r5, %[r]\n\t"
  151590. #endif
  151591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151592. "lsrs r7, %[b], #16\n\t"
  151593. #else
  151594. "lsr r7, %[b], #16\n\t"
  151595. #endif
  151596. #ifdef WOLFSSL_KEIL
  151597. "muls r6, r7, r6\n\t"
  151598. #elif defined(__clang__)
  151599. "muls r6, r7\n\t"
  151600. #else
  151601. "mul r6, r7\n\t"
  151602. #endif
  151603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151604. "lsrs r7, r6, #16\n\t"
  151605. #else
  151606. "lsr r7, r6, #16\n\t"
  151607. #endif
  151608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151609. "lsls r6, r6, #16\n\t"
  151610. #else
  151611. "lsl r6, r6, #16\n\t"
  151612. #endif
  151613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151614. "adds r3, r3, r6\n\t"
  151615. #else
  151616. "add r3, r3, r6\n\t"
  151617. #endif
  151618. #ifdef WOLFSSL_KEIL
  151619. "adcs r4, r4, r7\n\t"
  151620. #elif defined(__clang__)
  151621. "adcs r4, r7\n\t"
  151622. #else
  151623. "adc r4, r7\n\t"
  151624. #endif
  151625. #ifdef WOLFSSL_KEIL
  151626. "adcs r5, r5, %[r]\n\t"
  151627. #elif defined(__clang__)
  151628. "adcs r5, %[r]\n\t"
  151629. #else
  151630. "adc r5, %[r]\n\t"
  151631. #endif
  151632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151633. "lsrs r6, %[a], #16\n\t"
  151634. #else
  151635. "lsr r6, %[a], #16\n\t"
  151636. #endif
  151637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151638. "lsrs r7, %[b], #16\n\t"
  151639. #else
  151640. "lsr r7, %[b], #16\n\t"
  151641. #endif
  151642. #ifdef WOLFSSL_KEIL
  151643. "muls r7, r6, r7\n\t"
  151644. #elif defined(__clang__)
  151645. "muls r7, r6\n\t"
  151646. #else
  151647. "mul r7, r6\n\t"
  151648. #endif
  151649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151650. "adds r4, r4, r7\n\t"
  151651. #else
  151652. "add r4, r4, r7\n\t"
  151653. #endif
  151654. #ifdef WOLFSSL_KEIL
  151655. "adcs r5, r5, %[r]\n\t"
  151656. #elif defined(__clang__)
  151657. "adcs r5, %[r]\n\t"
  151658. #else
  151659. "adc r5, %[r]\n\t"
  151660. #endif
  151661. "uxth r7, %[b]\n\t"
  151662. #ifdef WOLFSSL_KEIL
  151663. "muls r6, r7, r6\n\t"
  151664. #elif defined(__clang__)
  151665. "muls r6, r7\n\t"
  151666. #else
  151667. "mul r6, r7\n\t"
  151668. #endif
  151669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151670. "lsrs r7, r6, #16\n\t"
  151671. #else
  151672. "lsr r7, r6, #16\n\t"
  151673. #endif
  151674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151675. "lsls r6, r6, #16\n\t"
  151676. #else
  151677. "lsl r6, r6, #16\n\t"
  151678. #endif
  151679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151680. "adds r3, r3, r6\n\t"
  151681. #else
  151682. "add r3, r3, r6\n\t"
  151683. #endif
  151684. #ifdef WOLFSSL_KEIL
  151685. "adcs r4, r4, r7\n\t"
  151686. #elif defined(__clang__)
  151687. "adcs r4, r7\n\t"
  151688. #else
  151689. "adc r4, r7\n\t"
  151690. #endif
  151691. #ifdef WOLFSSL_KEIL
  151692. "adcs r5, r5, %[r]\n\t"
  151693. #elif defined(__clang__)
  151694. "adcs r5, %[r]\n\t"
  151695. #else
  151696. "adc r5, %[r]\n\t"
  151697. #endif
  151698. "# A[2] * B[13]\n\t"
  151699. "mov %[a], r9\n\t"
  151700. "mov %[b], r10\n\t"
  151701. "ldr %[a], [%[a], #8]\n\t"
  151702. "ldr %[b], [%[b], #52]\n\t"
  151703. "uxth r6, %[a]\n\t"
  151704. "uxth r7, %[b]\n\t"
  151705. #ifdef WOLFSSL_KEIL
  151706. "muls r7, r6, r7\n\t"
  151707. #elif defined(__clang__)
  151708. "muls r7, r6\n\t"
  151709. #else
  151710. "mul r7, r6\n\t"
  151711. #endif
  151712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151713. "adds r3, r3, r7\n\t"
  151714. #else
  151715. "add r3, r3, r7\n\t"
  151716. #endif
  151717. #ifdef WOLFSSL_KEIL
  151718. "adcs r4, r4, %[r]\n\t"
  151719. #elif defined(__clang__)
  151720. "adcs r4, %[r]\n\t"
  151721. #else
  151722. "adc r4, %[r]\n\t"
  151723. #endif
  151724. #ifdef WOLFSSL_KEIL
  151725. "adcs r5, r5, %[r]\n\t"
  151726. #elif defined(__clang__)
  151727. "adcs r5, %[r]\n\t"
  151728. #else
  151729. "adc r5, %[r]\n\t"
  151730. #endif
  151731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151732. "lsrs r7, %[b], #16\n\t"
  151733. #else
  151734. "lsr r7, %[b], #16\n\t"
  151735. #endif
  151736. #ifdef WOLFSSL_KEIL
  151737. "muls r6, r7, r6\n\t"
  151738. #elif defined(__clang__)
  151739. "muls r6, r7\n\t"
  151740. #else
  151741. "mul r6, r7\n\t"
  151742. #endif
  151743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151744. "lsrs r7, r6, #16\n\t"
  151745. #else
  151746. "lsr r7, r6, #16\n\t"
  151747. #endif
  151748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151749. "lsls r6, r6, #16\n\t"
  151750. #else
  151751. "lsl r6, r6, #16\n\t"
  151752. #endif
  151753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151754. "adds r3, r3, r6\n\t"
  151755. #else
  151756. "add r3, r3, r6\n\t"
  151757. #endif
  151758. #ifdef WOLFSSL_KEIL
  151759. "adcs r4, r4, r7\n\t"
  151760. #elif defined(__clang__)
  151761. "adcs r4, r7\n\t"
  151762. #else
  151763. "adc r4, r7\n\t"
  151764. #endif
  151765. #ifdef WOLFSSL_KEIL
  151766. "adcs r5, r5, %[r]\n\t"
  151767. #elif defined(__clang__)
  151768. "adcs r5, %[r]\n\t"
  151769. #else
  151770. "adc r5, %[r]\n\t"
  151771. #endif
  151772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151773. "lsrs r6, %[a], #16\n\t"
  151774. #else
  151775. "lsr r6, %[a], #16\n\t"
  151776. #endif
  151777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151778. "lsrs r7, %[b], #16\n\t"
  151779. #else
  151780. "lsr r7, %[b], #16\n\t"
  151781. #endif
  151782. #ifdef WOLFSSL_KEIL
  151783. "muls r7, r6, r7\n\t"
  151784. #elif defined(__clang__)
  151785. "muls r7, r6\n\t"
  151786. #else
  151787. "mul r7, r6\n\t"
  151788. #endif
  151789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151790. "adds r4, r4, r7\n\t"
  151791. #else
  151792. "add r4, r4, r7\n\t"
  151793. #endif
  151794. #ifdef WOLFSSL_KEIL
  151795. "adcs r5, r5, %[r]\n\t"
  151796. #elif defined(__clang__)
  151797. "adcs r5, %[r]\n\t"
  151798. #else
  151799. "adc r5, %[r]\n\t"
  151800. #endif
  151801. "uxth r7, %[b]\n\t"
  151802. #ifdef WOLFSSL_KEIL
  151803. "muls r6, r7, r6\n\t"
  151804. #elif defined(__clang__)
  151805. "muls r6, r7\n\t"
  151806. #else
  151807. "mul r6, r7\n\t"
  151808. #endif
  151809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151810. "lsrs r7, r6, #16\n\t"
  151811. #else
  151812. "lsr r7, r6, #16\n\t"
  151813. #endif
  151814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151815. "lsls r6, r6, #16\n\t"
  151816. #else
  151817. "lsl r6, r6, #16\n\t"
  151818. #endif
  151819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151820. "adds r3, r3, r6\n\t"
  151821. #else
  151822. "add r3, r3, r6\n\t"
  151823. #endif
  151824. #ifdef WOLFSSL_KEIL
  151825. "adcs r4, r4, r7\n\t"
  151826. #elif defined(__clang__)
  151827. "adcs r4, r7\n\t"
  151828. #else
  151829. "adc r4, r7\n\t"
  151830. #endif
  151831. #ifdef WOLFSSL_KEIL
  151832. "adcs r5, r5, %[r]\n\t"
  151833. #elif defined(__clang__)
  151834. "adcs r5, %[r]\n\t"
  151835. #else
  151836. "adc r5, %[r]\n\t"
  151837. #endif
  151838. "# A[3] * B[12]\n\t"
  151839. "mov %[a], r9\n\t"
  151840. "mov %[b], r10\n\t"
  151841. "ldr %[a], [%[a], #12]\n\t"
  151842. "ldr %[b], [%[b], #48]\n\t"
  151843. "uxth r6, %[a]\n\t"
  151844. "uxth r7, %[b]\n\t"
  151845. #ifdef WOLFSSL_KEIL
  151846. "muls r7, r6, r7\n\t"
  151847. #elif defined(__clang__)
  151848. "muls r7, r6\n\t"
  151849. #else
  151850. "mul r7, r6\n\t"
  151851. #endif
  151852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151853. "adds r3, r3, r7\n\t"
  151854. #else
  151855. "add r3, r3, r7\n\t"
  151856. #endif
  151857. #ifdef WOLFSSL_KEIL
  151858. "adcs r4, r4, %[r]\n\t"
  151859. #elif defined(__clang__)
  151860. "adcs r4, %[r]\n\t"
  151861. #else
  151862. "adc r4, %[r]\n\t"
  151863. #endif
  151864. #ifdef WOLFSSL_KEIL
  151865. "adcs r5, r5, %[r]\n\t"
  151866. #elif defined(__clang__)
  151867. "adcs r5, %[r]\n\t"
  151868. #else
  151869. "adc r5, %[r]\n\t"
  151870. #endif
  151871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151872. "lsrs r7, %[b], #16\n\t"
  151873. #else
  151874. "lsr r7, %[b], #16\n\t"
  151875. #endif
  151876. #ifdef WOLFSSL_KEIL
  151877. "muls r6, r7, r6\n\t"
  151878. #elif defined(__clang__)
  151879. "muls r6, r7\n\t"
  151880. #else
  151881. "mul r6, r7\n\t"
  151882. #endif
  151883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151884. "lsrs r7, r6, #16\n\t"
  151885. #else
  151886. "lsr r7, r6, #16\n\t"
  151887. #endif
  151888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151889. "lsls r6, r6, #16\n\t"
  151890. #else
  151891. "lsl r6, r6, #16\n\t"
  151892. #endif
  151893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151894. "adds r3, r3, r6\n\t"
  151895. #else
  151896. "add r3, r3, r6\n\t"
  151897. #endif
  151898. #ifdef WOLFSSL_KEIL
  151899. "adcs r4, r4, r7\n\t"
  151900. #elif defined(__clang__)
  151901. "adcs r4, r7\n\t"
  151902. #else
  151903. "adc r4, r7\n\t"
  151904. #endif
  151905. #ifdef WOLFSSL_KEIL
  151906. "adcs r5, r5, %[r]\n\t"
  151907. #elif defined(__clang__)
  151908. "adcs r5, %[r]\n\t"
  151909. #else
  151910. "adc r5, %[r]\n\t"
  151911. #endif
  151912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151913. "lsrs r6, %[a], #16\n\t"
  151914. #else
  151915. "lsr r6, %[a], #16\n\t"
  151916. #endif
  151917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151918. "lsrs r7, %[b], #16\n\t"
  151919. #else
  151920. "lsr r7, %[b], #16\n\t"
  151921. #endif
  151922. #ifdef WOLFSSL_KEIL
  151923. "muls r7, r6, r7\n\t"
  151924. #elif defined(__clang__)
  151925. "muls r7, r6\n\t"
  151926. #else
  151927. "mul r7, r6\n\t"
  151928. #endif
  151929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151930. "adds r4, r4, r7\n\t"
  151931. #else
  151932. "add r4, r4, r7\n\t"
  151933. #endif
  151934. #ifdef WOLFSSL_KEIL
  151935. "adcs r5, r5, %[r]\n\t"
  151936. #elif defined(__clang__)
  151937. "adcs r5, %[r]\n\t"
  151938. #else
  151939. "adc r5, %[r]\n\t"
  151940. #endif
  151941. "uxth r7, %[b]\n\t"
  151942. #ifdef WOLFSSL_KEIL
  151943. "muls r6, r7, r6\n\t"
  151944. #elif defined(__clang__)
  151945. "muls r6, r7\n\t"
  151946. #else
  151947. "mul r6, r7\n\t"
  151948. #endif
  151949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151950. "lsrs r7, r6, #16\n\t"
  151951. #else
  151952. "lsr r7, r6, #16\n\t"
  151953. #endif
  151954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151955. "lsls r6, r6, #16\n\t"
  151956. #else
  151957. "lsl r6, r6, #16\n\t"
  151958. #endif
  151959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151960. "adds r3, r3, r6\n\t"
  151961. #else
  151962. "add r3, r3, r6\n\t"
  151963. #endif
  151964. #ifdef WOLFSSL_KEIL
  151965. "adcs r4, r4, r7\n\t"
  151966. #elif defined(__clang__)
  151967. "adcs r4, r7\n\t"
  151968. #else
  151969. "adc r4, r7\n\t"
  151970. #endif
  151971. #ifdef WOLFSSL_KEIL
  151972. "adcs r5, r5, %[r]\n\t"
  151973. #elif defined(__clang__)
  151974. "adcs r5, %[r]\n\t"
  151975. #else
  151976. "adc r5, %[r]\n\t"
  151977. #endif
  151978. "# A[4] * B[11]\n\t"
  151979. "mov %[a], r9\n\t"
  151980. "mov %[b], r10\n\t"
  151981. "ldr %[a], [%[a], #16]\n\t"
  151982. "ldr %[b], [%[b], #44]\n\t"
  151983. "uxth r6, %[a]\n\t"
  151984. "uxth r7, %[b]\n\t"
  151985. #ifdef WOLFSSL_KEIL
  151986. "muls r7, r6, r7\n\t"
  151987. #elif defined(__clang__)
  151988. "muls r7, r6\n\t"
  151989. #else
  151990. "mul r7, r6\n\t"
  151991. #endif
  151992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151993. "adds r3, r3, r7\n\t"
  151994. #else
  151995. "add r3, r3, r7\n\t"
  151996. #endif
  151997. #ifdef WOLFSSL_KEIL
  151998. "adcs r4, r4, %[r]\n\t"
  151999. #elif defined(__clang__)
  152000. "adcs r4, %[r]\n\t"
  152001. #else
  152002. "adc r4, %[r]\n\t"
  152003. #endif
  152004. #ifdef WOLFSSL_KEIL
  152005. "adcs r5, r5, %[r]\n\t"
  152006. #elif defined(__clang__)
  152007. "adcs r5, %[r]\n\t"
  152008. #else
  152009. "adc r5, %[r]\n\t"
  152010. #endif
  152011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152012. "lsrs r7, %[b], #16\n\t"
  152013. #else
  152014. "lsr r7, %[b], #16\n\t"
  152015. #endif
  152016. #ifdef WOLFSSL_KEIL
  152017. "muls r6, r7, r6\n\t"
  152018. #elif defined(__clang__)
  152019. "muls r6, r7\n\t"
  152020. #else
  152021. "mul r6, r7\n\t"
  152022. #endif
  152023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152024. "lsrs r7, r6, #16\n\t"
  152025. #else
  152026. "lsr r7, r6, #16\n\t"
  152027. #endif
  152028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152029. "lsls r6, r6, #16\n\t"
  152030. #else
  152031. "lsl r6, r6, #16\n\t"
  152032. #endif
  152033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152034. "adds r3, r3, r6\n\t"
  152035. #else
  152036. "add r3, r3, r6\n\t"
  152037. #endif
  152038. #ifdef WOLFSSL_KEIL
  152039. "adcs r4, r4, r7\n\t"
  152040. #elif defined(__clang__)
  152041. "adcs r4, r7\n\t"
  152042. #else
  152043. "adc r4, r7\n\t"
  152044. #endif
  152045. #ifdef WOLFSSL_KEIL
  152046. "adcs r5, r5, %[r]\n\t"
  152047. #elif defined(__clang__)
  152048. "adcs r5, %[r]\n\t"
  152049. #else
  152050. "adc r5, %[r]\n\t"
  152051. #endif
  152052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152053. "lsrs r6, %[a], #16\n\t"
  152054. #else
  152055. "lsr r6, %[a], #16\n\t"
  152056. #endif
  152057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152058. "lsrs r7, %[b], #16\n\t"
  152059. #else
  152060. "lsr r7, %[b], #16\n\t"
  152061. #endif
  152062. #ifdef WOLFSSL_KEIL
  152063. "muls r7, r6, r7\n\t"
  152064. #elif defined(__clang__)
  152065. "muls r7, r6\n\t"
  152066. #else
  152067. "mul r7, r6\n\t"
  152068. #endif
  152069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152070. "adds r4, r4, r7\n\t"
  152071. #else
  152072. "add r4, r4, r7\n\t"
  152073. #endif
  152074. #ifdef WOLFSSL_KEIL
  152075. "adcs r5, r5, %[r]\n\t"
  152076. #elif defined(__clang__)
  152077. "adcs r5, %[r]\n\t"
  152078. #else
  152079. "adc r5, %[r]\n\t"
  152080. #endif
  152081. "uxth r7, %[b]\n\t"
  152082. #ifdef WOLFSSL_KEIL
  152083. "muls r6, r7, r6\n\t"
  152084. #elif defined(__clang__)
  152085. "muls r6, r7\n\t"
  152086. #else
  152087. "mul r6, r7\n\t"
  152088. #endif
  152089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152090. "lsrs r7, r6, #16\n\t"
  152091. #else
  152092. "lsr r7, r6, #16\n\t"
  152093. #endif
  152094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152095. "lsls r6, r6, #16\n\t"
  152096. #else
  152097. "lsl r6, r6, #16\n\t"
  152098. #endif
  152099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152100. "adds r3, r3, r6\n\t"
  152101. #else
  152102. "add r3, r3, r6\n\t"
  152103. #endif
  152104. #ifdef WOLFSSL_KEIL
  152105. "adcs r4, r4, r7\n\t"
  152106. #elif defined(__clang__)
  152107. "adcs r4, r7\n\t"
  152108. #else
  152109. "adc r4, r7\n\t"
  152110. #endif
  152111. #ifdef WOLFSSL_KEIL
  152112. "adcs r5, r5, %[r]\n\t"
  152113. #elif defined(__clang__)
  152114. "adcs r5, %[r]\n\t"
  152115. #else
  152116. "adc r5, %[r]\n\t"
  152117. #endif
  152118. "# A[5] * B[10]\n\t"
  152119. "mov %[a], r9\n\t"
  152120. "mov %[b], r10\n\t"
  152121. "ldr %[a], [%[a], #20]\n\t"
  152122. "ldr %[b], [%[b], #40]\n\t"
  152123. "uxth r6, %[a]\n\t"
  152124. "uxth r7, %[b]\n\t"
  152125. #ifdef WOLFSSL_KEIL
  152126. "muls r7, r6, r7\n\t"
  152127. #elif defined(__clang__)
  152128. "muls r7, r6\n\t"
  152129. #else
  152130. "mul r7, r6\n\t"
  152131. #endif
  152132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152133. "adds r3, r3, r7\n\t"
  152134. #else
  152135. "add r3, r3, r7\n\t"
  152136. #endif
  152137. #ifdef WOLFSSL_KEIL
  152138. "adcs r4, r4, %[r]\n\t"
  152139. #elif defined(__clang__)
  152140. "adcs r4, %[r]\n\t"
  152141. #else
  152142. "adc r4, %[r]\n\t"
  152143. #endif
  152144. #ifdef WOLFSSL_KEIL
  152145. "adcs r5, r5, %[r]\n\t"
  152146. #elif defined(__clang__)
  152147. "adcs r5, %[r]\n\t"
  152148. #else
  152149. "adc r5, %[r]\n\t"
  152150. #endif
  152151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152152. "lsrs r7, %[b], #16\n\t"
  152153. #else
  152154. "lsr r7, %[b], #16\n\t"
  152155. #endif
  152156. #ifdef WOLFSSL_KEIL
  152157. "muls r6, r7, r6\n\t"
  152158. #elif defined(__clang__)
  152159. "muls r6, r7\n\t"
  152160. #else
  152161. "mul r6, r7\n\t"
  152162. #endif
  152163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152164. "lsrs r7, r6, #16\n\t"
  152165. #else
  152166. "lsr r7, r6, #16\n\t"
  152167. #endif
  152168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152169. "lsls r6, r6, #16\n\t"
  152170. #else
  152171. "lsl r6, r6, #16\n\t"
  152172. #endif
  152173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152174. "adds r3, r3, r6\n\t"
  152175. #else
  152176. "add r3, r3, r6\n\t"
  152177. #endif
  152178. #ifdef WOLFSSL_KEIL
  152179. "adcs r4, r4, r7\n\t"
  152180. #elif defined(__clang__)
  152181. "adcs r4, r7\n\t"
  152182. #else
  152183. "adc r4, r7\n\t"
  152184. #endif
  152185. #ifdef WOLFSSL_KEIL
  152186. "adcs r5, r5, %[r]\n\t"
  152187. #elif defined(__clang__)
  152188. "adcs r5, %[r]\n\t"
  152189. #else
  152190. "adc r5, %[r]\n\t"
  152191. #endif
  152192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152193. "lsrs r6, %[a], #16\n\t"
  152194. #else
  152195. "lsr r6, %[a], #16\n\t"
  152196. #endif
  152197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152198. "lsrs r7, %[b], #16\n\t"
  152199. #else
  152200. "lsr r7, %[b], #16\n\t"
  152201. #endif
  152202. #ifdef WOLFSSL_KEIL
  152203. "muls r7, r6, r7\n\t"
  152204. #elif defined(__clang__)
  152205. "muls r7, r6\n\t"
  152206. #else
  152207. "mul r7, r6\n\t"
  152208. #endif
  152209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152210. "adds r4, r4, r7\n\t"
  152211. #else
  152212. "add r4, r4, r7\n\t"
  152213. #endif
  152214. #ifdef WOLFSSL_KEIL
  152215. "adcs r5, r5, %[r]\n\t"
  152216. #elif defined(__clang__)
  152217. "adcs r5, %[r]\n\t"
  152218. #else
  152219. "adc r5, %[r]\n\t"
  152220. #endif
  152221. "uxth r7, %[b]\n\t"
  152222. #ifdef WOLFSSL_KEIL
  152223. "muls r6, r7, r6\n\t"
  152224. #elif defined(__clang__)
  152225. "muls r6, r7\n\t"
  152226. #else
  152227. "mul r6, r7\n\t"
  152228. #endif
  152229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152230. "lsrs r7, r6, #16\n\t"
  152231. #else
  152232. "lsr r7, r6, #16\n\t"
  152233. #endif
  152234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152235. "lsls r6, r6, #16\n\t"
  152236. #else
  152237. "lsl r6, r6, #16\n\t"
  152238. #endif
  152239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152240. "adds r3, r3, r6\n\t"
  152241. #else
  152242. "add r3, r3, r6\n\t"
  152243. #endif
  152244. #ifdef WOLFSSL_KEIL
  152245. "adcs r4, r4, r7\n\t"
  152246. #elif defined(__clang__)
  152247. "adcs r4, r7\n\t"
  152248. #else
  152249. "adc r4, r7\n\t"
  152250. #endif
  152251. #ifdef WOLFSSL_KEIL
  152252. "adcs r5, r5, %[r]\n\t"
  152253. #elif defined(__clang__)
  152254. "adcs r5, %[r]\n\t"
  152255. #else
  152256. "adc r5, %[r]\n\t"
  152257. #endif
  152258. "# A[6] * B[9]\n\t"
  152259. "mov %[a], r9\n\t"
  152260. "mov %[b], r10\n\t"
  152261. "ldr %[a], [%[a], #24]\n\t"
  152262. "ldr %[b], [%[b], #36]\n\t"
  152263. "uxth r6, %[a]\n\t"
  152264. "uxth r7, %[b]\n\t"
  152265. #ifdef WOLFSSL_KEIL
  152266. "muls r7, r6, r7\n\t"
  152267. #elif defined(__clang__)
  152268. "muls r7, r6\n\t"
  152269. #else
  152270. "mul r7, r6\n\t"
  152271. #endif
  152272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152273. "adds r3, r3, r7\n\t"
  152274. #else
  152275. "add r3, r3, r7\n\t"
  152276. #endif
  152277. #ifdef WOLFSSL_KEIL
  152278. "adcs r4, r4, %[r]\n\t"
  152279. #elif defined(__clang__)
  152280. "adcs r4, %[r]\n\t"
  152281. #else
  152282. "adc r4, %[r]\n\t"
  152283. #endif
  152284. #ifdef WOLFSSL_KEIL
  152285. "adcs r5, r5, %[r]\n\t"
  152286. #elif defined(__clang__)
  152287. "adcs r5, %[r]\n\t"
  152288. #else
  152289. "adc r5, %[r]\n\t"
  152290. #endif
  152291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152292. "lsrs r7, %[b], #16\n\t"
  152293. #else
  152294. "lsr r7, %[b], #16\n\t"
  152295. #endif
  152296. #ifdef WOLFSSL_KEIL
  152297. "muls r6, r7, r6\n\t"
  152298. #elif defined(__clang__)
  152299. "muls r6, r7\n\t"
  152300. #else
  152301. "mul r6, r7\n\t"
  152302. #endif
  152303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152304. "lsrs r7, r6, #16\n\t"
  152305. #else
  152306. "lsr r7, r6, #16\n\t"
  152307. #endif
  152308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152309. "lsls r6, r6, #16\n\t"
  152310. #else
  152311. "lsl r6, r6, #16\n\t"
  152312. #endif
  152313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152314. "adds r3, r3, r6\n\t"
  152315. #else
  152316. "add r3, r3, r6\n\t"
  152317. #endif
  152318. #ifdef WOLFSSL_KEIL
  152319. "adcs r4, r4, r7\n\t"
  152320. #elif defined(__clang__)
  152321. "adcs r4, r7\n\t"
  152322. #else
  152323. "adc r4, r7\n\t"
  152324. #endif
  152325. #ifdef WOLFSSL_KEIL
  152326. "adcs r5, r5, %[r]\n\t"
  152327. #elif defined(__clang__)
  152328. "adcs r5, %[r]\n\t"
  152329. #else
  152330. "adc r5, %[r]\n\t"
  152331. #endif
  152332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152333. "lsrs r6, %[a], #16\n\t"
  152334. #else
  152335. "lsr r6, %[a], #16\n\t"
  152336. #endif
  152337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152338. "lsrs r7, %[b], #16\n\t"
  152339. #else
  152340. "lsr r7, %[b], #16\n\t"
  152341. #endif
  152342. #ifdef WOLFSSL_KEIL
  152343. "muls r7, r6, r7\n\t"
  152344. #elif defined(__clang__)
  152345. "muls r7, r6\n\t"
  152346. #else
  152347. "mul r7, r6\n\t"
  152348. #endif
  152349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152350. "adds r4, r4, r7\n\t"
  152351. #else
  152352. "add r4, r4, r7\n\t"
  152353. #endif
  152354. #ifdef WOLFSSL_KEIL
  152355. "adcs r5, r5, %[r]\n\t"
  152356. #elif defined(__clang__)
  152357. "adcs r5, %[r]\n\t"
  152358. #else
  152359. "adc r5, %[r]\n\t"
  152360. #endif
  152361. "uxth r7, %[b]\n\t"
  152362. #ifdef WOLFSSL_KEIL
  152363. "muls r6, r7, r6\n\t"
  152364. #elif defined(__clang__)
  152365. "muls r6, r7\n\t"
  152366. #else
  152367. "mul r6, r7\n\t"
  152368. #endif
  152369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152370. "lsrs r7, r6, #16\n\t"
  152371. #else
  152372. "lsr r7, r6, #16\n\t"
  152373. #endif
  152374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152375. "lsls r6, r6, #16\n\t"
  152376. #else
  152377. "lsl r6, r6, #16\n\t"
  152378. #endif
  152379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152380. "adds r3, r3, r6\n\t"
  152381. #else
  152382. "add r3, r3, r6\n\t"
  152383. #endif
  152384. #ifdef WOLFSSL_KEIL
  152385. "adcs r4, r4, r7\n\t"
  152386. #elif defined(__clang__)
  152387. "adcs r4, r7\n\t"
  152388. #else
  152389. "adc r4, r7\n\t"
  152390. #endif
  152391. #ifdef WOLFSSL_KEIL
  152392. "adcs r5, r5, %[r]\n\t"
  152393. #elif defined(__clang__)
  152394. "adcs r5, %[r]\n\t"
  152395. #else
  152396. "adc r5, %[r]\n\t"
  152397. #endif
  152398. "# A[7] * B[8]\n\t"
  152399. "mov %[a], r9\n\t"
  152400. "mov %[b], r10\n\t"
  152401. "ldr %[a], [%[a], #28]\n\t"
  152402. "ldr %[b], [%[b], #32]\n\t"
  152403. "uxth r6, %[a]\n\t"
  152404. "uxth r7, %[b]\n\t"
  152405. #ifdef WOLFSSL_KEIL
  152406. "muls r7, r6, r7\n\t"
  152407. #elif defined(__clang__)
  152408. "muls r7, r6\n\t"
  152409. #else
  152410. "mul r7, r6\n\t"
  152411. #endif
  152412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152413. "adds r3, r3, r7\n\t"
  152414. #else
  152415. "add r3, r3, r7\n\t"
  152416. #endif
  152417. #ifdef WOLFSSL_KEIL
  152418. "adcs r4, r4, %[r]\n\t"
  152419. #elif defined(__clang__)
  152420. "adcs r4, %[r]\n\t"
  152421. #else
  152422. "adc r4, %[r]\n\t"
  152423. #endif
  152424. #ifdef WOLFSSL_KEIL
  152425. "adcs r5, r5, %[r]\n\t"
  152426. #elif defined(__clang__)
  152427. "adcs r5, %[r]\n\t"
  152428. #else
  152429. "adc r5, %[r]\n\t"
  152430. #endif
  152431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152432. "lsrs r7, %[b], #16\n\t"
  152433. #else
  152434. "lsr r7, %[b], #16\n\t"
  152435. #endif
  152436. #ifdef WOLFSSL_KEIL
  152437. "muls r6, r7, r6\n\t"
  152438. #elif defined(__clang__)
  152439. "muls r6, r7\n\t"
  152440. #else
  152441. "mul r6, r7\n\t"
  152442. #endif
  152443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152444. "lsrs r7, r6, #16\n\t"
  152445. #else
  152446. "lsr r7, r6, #16\n\t"
  152447. #endif
  152448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152449. "lsls r6, r6, #16\n\t"
  152450. #else
  152451. "lsl r6, r6, #16\n\t"
  152452. #endif
  152453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152454. "adds r3, r3, r6\n\t"
  152455. #else
  152456. "add r3, r3, r6\n\t"
  152457. #endif
  152458. #ifdef WOLFSSL_KEIL
  152459. "adcs r4, r4, r7\n\t"
  152460. #elif defined(__clang__)
  152461. "adcs r4, r7\n\t"
  152462. #else
  152463. "adc r4, r7\n\t"
  152464. #endif
  152465. #ifdef WOLFSSL_KEIL
  152466. "adcs r5, r5, %[r]\n\t"
  152467. #elif defined(__clang__)
  152468. "adcs r5, %[r]\n\t"
  152469. #else
  152470. "adc r5, %[r]\n\t"
  152471. #endif
  152472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152473. "lsrs r6, %[a], #16\n\t"
  152474. #else
  152475. "lsr r6, %[a], #16\n\t"
  152476. #endif
  152477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152478. "lsrs r7, %[b], #16\n\t"
  152479. #else
  152480. "lsr r7, %[b], #16\n\t"
  152481. #endif
  152482. #ifdef WOLFSSL_KEIL
  152483. "muls r7, r6, r7\n\t"
  152484. #elif defined(__clang__)
  152485. "muls r7, r6\n\t"
  152486. #else
  152487. "mul r7, r6\n\t"
  152488. #endif
  152489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152490. "adds r4, r4, r7\n\t"
  152491. #else
  152492. "add r4, r4, r7\n\t"
  152493. #endif
  152494. #ifdef WOLFSSL_KEIL
  152495. "adcs r5, r5, %[r]\n\t"
  152496. #elif defined(__clang__)
  152497. "adcs r5, %[r]\n\t"
  152498. #else
  152499. "adc r5, %[r]\n\t"
  152500. #endif
  152501. "uxth r7, %[b]\n\t"
  152502. #ifdef WOLFSSL_KEIL
  152503. "muls r6, r7, r6\n\t"
  152504. #elif defined(__clang__)
  152505. "muls r6, r7\n\t"
  152506. #else
  152507. "mul r6, r7\n\t"
  152508. #endif
  152509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152510. "lsrs r7, r6, #16\n\t"
  152511. #else
  152512. "lsr r7, r6, #16\n\t"
  152513. #endif
  152514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152515. "lsls r6, r6, #16\n\t"
  152516. #else
  152517. "lsl r6, r6, #16\n\t"
  152518. #endif
  152519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152520. "adds r3, r3, r6\n\t"
  152521. #else
  152522. "add r3, r3, r6\n\t"
  152523. #endif
  152524. #ifdef WOLFSSL_KEIL
  152525. "adcs r4, r4, r7\n\t"
  152526. #elif defined(__clang__)
  152527. "adcs r4, r7\n\t"
  152528. #else
  152529. "adc r4, r7\n\t"
  152530. #endif
  152531. #ifdef WOLFSSL_KEIL
  152532. "adcs r5, r5, %[r]\n\t"
  152533. #elif defined(__clang__)
  152534. "adcs r5, %[r]\n\t"
  152535. #else
  152536. "adc r5, %[r]\n\t"
  152537. #endif
  152538. "# A[8] * B[7]\n\t"
  152539. "mov %[a], r9\n\t"
  152540. "mov %[b], r10\n\t"
  152541. "ldr %[a], [%[a], #32]\n\t"
  152542. "ldr %[b], [%[b], #28]\n\t"
  152543. "uxth r6, %[a]\n\t"
  152544. "uxth r7, %[b]\n\t"
  152545. #ifdef WOLFSSL_KEIL
  152546. "muls r7, r6, r7\n\t"
  152547. #elif defined(__clang__)
  152548. "muls r7, r6\n\t"
  152549. #else
  152550. "mul r7, r6\n\t"
  152551. #endif
  152552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152553. "adds r3, r3, r7\n\t"
  152554. #else
  152555. "add r3, r3, r7\n\t"
  152556. #endif
  152557. #ifdef WOLFSSL_KEIL
  152558. "adcs r4, r4, %[r]\n\t"
  152559. #elif defined(__clang__)
  152560. "adcs r4, %[r]\n\t"
  152561. #else
  152562. "adc r4, %[r]\n\t"
  152563. #endif
  152564. #ifdef WOLFSSL_KEIL
  152565. "adcs r5, r5, %[r]\n\t"
  152566. #elif defined(__clang__)
  152567. "adcs r5, %[r]\n\t"
  152568. #else
  152569. "adc r5, %[r]\n\t"
  152570. #endif
  152571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152572. "lsrs r7, %[b], #16\n\t"
  152573. #else
  152574. "lsr r7, %[b], #16\n\t"
  152575. #endif
  152576. #ifdef WOLFSSL_KEIL
  152577. "muls r6, r7, r6\n\t"
  152578. #elif defined(__clang__)
  152579. "muls r6, r7\n\t"
  152580. #else
  152581. "mul r6, r7\n\t"
  152582. #endif
  152583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152584. "lsrs r7, r6, #16\n\t"
  152585. #else
  152586. "lsr r7, r6, #16\n\t"
  152587. #endif
  152588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152589. "lsls r6, r6, #16\n\t"
  152590. #else
  152591. "lsl r6, r6, #16\n\t"
  152592. #endif
  152593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152594. "adds r3, r3, r6\n\t"
  152595. #else
  152596. "add r3, r3, r6\n\t"
  152597. #endif
  152598. #ifdef WOLFSSL_KEIL
  152599. "adcs r4, r4, r7\n\t"
  152600. #elif defined(__clang__)
  152601. "adcs r4, r7\n\t"
  152602. #else
  152603. "adc r4, r7\n\t"
  152604. #endif
  152605. #ifdef WOLFSSL_KEIL
  152606. "adcs r5, r5, %[r]\n\t"
  152607. #elif defined(__clang__)
  152608. "adcs r5, %[r]\n\t"
  152609. #else
  152610. "adc r5, %[r]\n\t"
  152611. #endif
  152612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152613. "lsrs r6, %[a], #16\n\t"
  152614. #else
  152615. "lsr r6, %[a], #16\n\t"
  152616. #endif
  152617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152618. "lsrs r7, %[b], #16\n\t"
  152619. #else
  152620. "lsr r7, %[b], #16\n\t"
  152621. #endif
  152622. #ifdef WOLFSSL_KEIL
  152623. "muls r7, r6, r7\n\t"
  152624. #elif defined(__clang__)
  152625. "muls r7, r6\n\t"
  152626. #else
  152627. "mul r7, r6\n\t"
  152628. #endif
  152629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152630. "adds r4, r4, r7\n\t"
  152631. #else
  152632. "add r4, r4, r7\n\t"
  152633. #endif
  152634. #ifdef WOLFSSL_KEIL
  152635. "adcs r5, r5, %[r]\n\t"
  152636. #elif defined(__clang__)
  152637. "adcs r5, %[r]\n\t"
  152638. #else
  152639. "adc r5, %[r]\n\t"
  152640. #endif
  152641. "uxth r7, %[b]\n\t"
  152642. #ifdef WOLFSSL_KEIL
  152643. "muls r6, r7, r6\n\t"
  152644. #elif defined(__clang__)
  152645. "muls r6, r7\n\t"
  152646. #else
  152647. "mul r6, r7\n\t"
  152648. #endif
  152649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152650. "lsrs r7, r6, #16\n\t"
  152651. #else
  152652. "lsr r7, r6, #16\n\t"
  152653. #endif
  152654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152655. "lsls r6, r6, #16\n\t"
  152656. #else
  152657. "lsl r6, r6, #16\n\t"
  152658. #endif
  152659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152660. "adds r3, r3, r6\n\t"
  152661. #else
  152662. "add r3, r3, r6\n\t"
  152663. #endif
  152664. #ifdef WOLFSSL_KEIL
  152665. "adcs r4, r4, r7\n\t"
  152666. #elif defined(__clang__)
  152667. "adcs r4, r7\n\t"
  152668. #else
  152669. "adc r4, r7\n\t"
  152670. #endif
  152671. #ifdef WOLFSSL_KEIL
  152672. "adcs r5, r5, %[r]\n\t"
  152673. #elif defined(__clang__)
  152674. "adcs r5, %[r]\n\t"
  152675. #else
  152676. "adc r5, %[r]\n\t"
  152677. #endif
  152678. "# A[9] * B[6]\n\t"
  152679. "mov %[a], r9\n\t"
  152680. "mov %[b], r10\n\t"
  152681. "ldr %[a], [%[a], #36]\n\t"
  152682. "ldr %[b], [%[b], #24]\n\t"
  152683. "uxth r6, %[a]\n\t"
  152684. "uxth r7, %[b]\n\t"
  152685. #ifdef WOLFSSL_KEIL
  152686. "muls r7, r6, r7\n\t"
  152687. #elif defined(__clang__)
  152688. "muls r7, r6\n\t"
  152689. #else
  152690. "mul r7, r6\n\t"
  152691. #endif
  152692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152693. "adds r3, r3, r7\n\t"
  152694. #else
  152695. "add r3, r3, r7\n\t"
  152696. #endif
  152697. #ifdef WOLFSSL_KEIL
  152698. "adcs r4, r4, %[r]\n\t"
  152699. #elif defined(__clang__)
  152700. "adcs r4, %[r]\n\t"
  152701. #else
  152702. "adc r4, %[r]\n\t"
  152703. #endif
  152704. #ifdef WOLFSSL_KEIL
  152705. "adcs r5, r5, %[r]\n\t"
  152706. #elif defined(__clang__)
  152707. "adcs r5, %[r]\n\t"
  152708. #else
  152709. "adc r5, %[r]\n\t"
  152710. #endif
  152711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152712. "lsrs r7, %[b], #16\n\t"
  152713. #else
  152714. "lsr r7, %[b], #16\n\t"
  152715. #endif
  152716. #ifdef WOLFSSL_KEIL
  152717. "muls r6, r7, r6\n\t"
  152718. #elif defined(__clang__)
  152719. "muls r6, r7\n\t"
  152720. #else
  152721. "mul r6, r7\n\t"
  152722. #endif
  152723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152724. "lsrs r7, r6, #16\n\t"
  152725. #else
  152726. "lsr r7, r6, #16\n\t"
  152727. #endif
  152728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152729. "lsls r6, r6, #16\n\t"
  152730. #else
  152731. "lsl r6, r6, #16\n\t"
  152732. #endif
  152733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152734. "adds r3, r3, r6\n\t"
  152735. #else
  152736. "add r3, r3, r6\n\t"
  152737. #endif
  152738. #ifdef WOLFSSL_KEIL
  152739. "adcs r4, r4, r7\n\t"
  152740. #elif defined(__clang__)
  152741. "adcs r4, r7\n\t"
  152742. #else
  152743. "adc r4, r7\n\t"
  152744. #endif
  152745. #ifdef WOLFSSL_KEIL
  152746. "adcs r5, r5, %[r]\n\t"
  152747. #elif defined(__clang__)
  152748. "adcs r5, %[r]\n\t"
  152749. #else
  152750. "adc r5, %[r]\n\t"
  152751. #endif
  152752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152753. "lsrs r6, %[a], #16\n\t"
  152754. #else
  152755. "lsr r6, %[a], #16\n\t"
  152756. #endif
  152757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152758. "lsrs r7, %[b], #16\n\t"
  152759. #else
  152760. "lsr r7, %[b], #16\n\t"
  152761. #endif
  152762. #ifdef WOLFSSL_KEIL
  152763. "muls r7, r6, r7\n\t"
  152764. #elif defined(__clang__)
  152765. "muls r7, r6\n\t"
  152766. #else
  152767. "mul r7, r6\n\t"
  152768. #endif
  152769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152770. "adds r4, r4, r7\n\t"
  152771. #else
  152772. "add r4, r4, r7\n\t"
  152773. #endif
  152774. #ifdef WOLFSSL_KEIL
  152775. "adcs r5, r5, %[r]\n\t"
  152776. #elif defined(__clang__)
  152777. "adcs r5, %[r]\n\t"
  152778. #else
  152779. "adc r5, %[r]\n\t"
  152780. #endif
  152781. "uxth r7, %[b]\n\t"
  152782. #ifdef WOLFSSL_KEIL
  152783. "muls r6, r7, r6\n\t"
  152784. #elif defined(__clang__)
  152785. "muls r6, r7\n\t"
  152786. #else
  152787. "mul r6, r7\n\t"
  152788. #endif
  152789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152790. "lsrs r7, r6, #16\n\t"
  152791. #else
  152792. "lsr r7, r6, #16\n\t"
  152793. #endif
  152794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152795. "lsls r6, r6, #16\n\t"
  152796. #else
  152797. "lsl r6, r6, #16\n\t"
  152798. #endif
  152799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152800. "adds r3, r3, r6\n\t"
  152801. #else
  152802. "add r3, r3, r6\n\t"
  152803. #endif
  152804. #ifdef WOLFSSL_KEIL
  152805. "adcs r4, r4, r7\n\t"
  152806. #elif defined(__clang__)
  152807. "adcs r4, r7\n\t"
  152808. #else
  152809. "adc r4, r7\n\t"
  152810. #endif
  152811. #ifdef WOLFSSL_KEIL
  152812. "adcs r5, r5, %[r]\n\t"
  152813. #elif defined(__clang__)
  152814. "adcs r5, %[r]\n\t"
  152815. #else
  152816. "adc r5, %[r]\n\t"
  152817. #endif
  152818. "# A[10] * B[5]\n\t"
  152819. "mov %[a], r9\n\t"
  152820. "mov %[b], r10\n\t"
  152821. "ldr %[a], [%[a], #40]\n\t"
  152822. "ldr %[b], [%[b], #20]\n\t"
  152823. "uxth r6, %[a]\n\t"
  152824. "uxth r7, %[b]\n\t"
  152825. #ifdef WOLFSSL_KEIL
  152826. "muls r7, r6, r7\n\t"
  152827. #elif defined(__clang__)
  152828. "muls r7, r6\n\t"
  152829. #else
  152830. "mul r7, r6\n\t"
  152831. #endif
  152832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152833. "adds r3, r3, r7\n\t"
  152834. #else
  152835. "add r3, r3, r7\n\t"
  152836. #endif
  152837. #ifdef WOLFSSL_KEIL
  152838. "adcs r4, r4, %[r]\n\t"
  152839. #elif defined(__clang__)
  152840. "adcs r4, %[r]\n\t"
  152841. #else
  152842. "adc r4, %[r]\n\t"
  152843. #endif
  152844. #ifdef WOLFSSL_KEIL
  152845. "adcs r5, r5, %[r]\n\t"
  152846. #elif defined(__clang__)
  152847. "adcs r5, %[r]\n\t"
  152848. #else
  152849. "adc r5, %[r]\n\t"
  152850. #endif
  152851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152852. "lsrs r7, %[b], #16\n\t"
  152853. #else
  152854. "lsr r7, %[b], #16\n\t"
  152855. #endif
  152856. #ifdef WOLFSSL_KEIL
  152857. "muls r6, r7, r6\n\t"
  152858. #elif defined(__clang__)
  152859. "muls r6, r7\n\t"
  152860. #else
  152861. "mul r6, r7\n\t"
  152862. #endif
  152863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152864. "lsrs r7, r6, #16\n\t"
  152865. #else
  152866. "lsr r7, r6, #16\n\t"
  152867. #endif
  152868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152869. "lsls r6, r6, #16\n\t"
  152870. #else
  152871. "lsl r6, r6, #16\n\t"
  152872. #endif
  152873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152874. "adds r3, r3, r6\n\t"
  152875. #else
  152876. "add r3, r3, r6\n\t"
  152877. #endif
  152878. #ifdef WOLFSSL_KEIL
  152879. "adcs r4, r4, r7\n\t"
  152880. #elif defined(__clang__)
  152881. "adcs r4, r7\n\t"
  152882. #else
  152883. "adc r4, r7\n\t"
  152884. #endif
  152885. #ifdef WOLFSSL_KEIL
  152886. "adcs r5, r5, %[r]\n\t"
  152887. #elif defined(__clang__)
  152888. "adcs r5, %[r]\n\t"
  152889. #else
  152890. "adc r5, %[r]\n\t"
  152891. #endif
  152892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152893. "lsrs r6, %[a], #16\n\t"
  152894. #else
  152895. "lsr r6, %[a], #16\n\t"
  152896. #endif
  152897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152898. "lsrs r7, %[b], #16\n\t"
  152899. #else
  152900. "lsr r7, %[b], #16\n\t"
  152901. #endif
  152902. #ifdef WOLFSSL_KEIL
  152903. "muls r7, r6, r7\n\t"
  152904. #elif defined(__clang__)
  152905. "muls r7, r6\n\t"
  152906. #else
  152907. "mul r7, r6\n\t"
  152908. #endif
  152909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152910. "adds r4, r4, r7\n\t"
  152911. #else
  152912. "add r4, r4, r7\n\t"
  152913. #endif
  152914. #ifdef WOLFSSL_KEIL
  152915. "adcs r5, r5, %[r]\n\t"
  152916. #elif defined(__clang__)
  152917. "adcs r5, %[r]\n\t"
  152918. #else
  152919. "adc r5, %[r]\n\t"
  152920. #endif
  152921. "uxth r7, %[b]\n\t"
  152922. #ifdef WOLFSSL_KEIL
  152923. "muls r6, r7, r6\n\t"
  152924. #elif defined(__clang__)
  152925. "muls r6, r7\n\t"
  152926. #else
  152927. "mul r6, r7\n\t"
  152928. #endif
  152929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152930. "lsrs r7, r6, #16\n\t"
  152931. #else
  152932. "lsr r7, r6, #16\n\t"
  152933. #endif
  152934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152935. "lsls r6, r6, #16\n\t"
  152936. #else
  152937. "lsl r6, r6, #16\n\t"
  152938. #endif
  152939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152940. "adds r3, r3, r6\n\t"
  152941. #else
  152942. "add r3, r3, r6\n\t"
  152943. #endif
  152944. #ifdef WOLFSSL_KEIL
  152945. "adcs r4, r4, r7\n\t"
  152946. #elif defined(__clang__)
  152947. "adcs r4, r7\n\t"
  152948. #else
  152949. "adc r4, r7\n\t"
  152950. #endif
  152951. #ifdef WOLFSSL_KEIL
  152952. "adcs r5, r5, %[r]\n\t"
  152953. #elif defined(__clang__)
  152954. "adcs r5, %[r]\n\t"
  152955. #else
  152956. "adc r5, %[r]\n\t"
  152957. #endif
  152958. "# A[11] * B[4]\n\t"
  152959. "mov %[a], r9\n\t"
  152960. "mov %[b], r10\n\t"
  152961. "ldr %[a], [%[a], #44]\n\t"
  152962. "ldr %[b], [%[b], #16]\n\t"
  152963. "uxth r6, %[a]\n\t"
  152964. "uxth r7, %[b]\n\t"
  152965. #ifdef WOLFSSL_KEIL
  152966. "muls r7, r6, r7\n\t"
  152967. #elif defined(__clang__)
  152968. "muls r7, r6\n\t"
  152969. #else
  152970. "mul r7, r6\n\t"
  152971. #endif
  152972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152973. "adds r3, r3, r7\n\t"
  152974. #else
  152975. "add r3, r3, r7\n\t"
  152976. #endif
  152977. #ifdef WOLFSSL_KEIL
  152978. "adcs r4, r4, %[r]\n\t"
  152979. #elif defined(__clang__)
  152980. "adcs r4, %[r]\n\t"
  152981. #else
  152982. "adc r4, %[r]\n\t"
  152983. #endif
  152984. #ifdef WOLFSSL_KEIL
  152985. "adcs r5, r5, %[r]\n\t"
  152986. #elif defined(__clang__)
  152987. "adcs r5, %[r]\n\t"
  152988. #else
  152989. "adc r5, %[r]\n\t"
  152990. #endif
  152991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152992. "lsrs r7, %[b], #16\n\t"
  152993. #else
  152994. "lsr r7, %[b], #16\n\t"
  152995. #endif
  152996. #ifdef WOLFSSL_KEIL
  152997. "muls r6, r7, r6\n\t"
  152998. #elif defined(__clang__)
  152999. "muls r6, r7\n\t"
  153000. #else
  153001. "mul r6, r7\n\t"
  153002. #endif
  153003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153004. "lsrs r7, r6, #16\n\t"
  153005. #else
  153006. "lsr r7, r6, #16\n\t"
  153007. #endif
  153008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153009. "lsls r6, r6, #16\n\t"
  153010. #else
  153011. "lsl r6, r6, #16\n\t"
  153012. #endif
  153013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153014. "adds r3, r3, r6\n\t"
  153015. #else
  153016. "add r3, r3, r6\n\t"
  153017. #endif
  153018. #ifdef WOLFSSL_KEIL
  153019. "adcs r4, r4, r7\n\t"
  153020. #elif defined(__clang__)
  153021. "adcs r4, r7\n\t"
  153022. #else
  153023. "adc r4, r7\n\t"
  153024. #endif
  153025. #ifdef WOLFSSL_KEIL
  153026. "adcs r5, r5, %[r]\n\t"
  153027. #elif defined(__clang__)
  153028. "adcs r5, %[r]\n\t"
  153029. #else
  153030. "adc r5, %[r]\n\t"
  153031. #endif
  153032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153033. "lsrs r6, %[a], #16\n\t"
  153034. #else
  153035. "lsr r6, %[a], #16\n\t"
  153036. #endif
  153037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153038. "lsrs r7, %[b], #16\n\t"
  153039. #else
  153040. "lsr r7, %[b], #16\n\t"
  153041. #endif
  153042. #ifdef WOLFSSL_KEIL
  153043. "muls r7, r6, r7\n\t"
  153044. #elif defined(__clang__)
  153045. "muls r7, r6\n\t"
  153046. #else
  153047. "mul r7, r6\n\t"
  153048. #endif
  153049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153050. "adds r4, r4, r7\n\t"
  153051. #else
  153052. "add r4, r4, r7\n\t"
  153053. #endif
  153054. #ifdef WOLFSSL_KEIL
  153055. "adcs r5, r5, %[r]\n\t"
  153056. #elif defined(__clang__)
  153057. "adcs r5, %[r]\n\t"
  153058. #else
  153059. "adc r5, %[r]\n\t"
  153060. #endif
  153061. "uxth r7, %[b]\n\t"
  153062. #ifdef WOLFSSL_KEIL
  153063. "muls r6, r7, r6\n\t"
  153064. #elif defined(__clang__)
  153065. "muls r6, r7\n\t"
  153066. #else
  153067. "mul r6, r7\n\t"
  153068. #endif
  153069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153070. "lsrs r7, r6, #16\n\t"
  153071. #else
  153072. "lsr r7, r6, #16\n\t"
  153073. #endif
  153074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153075. "lsls r6, r6, #16\n\t"
  153076. #else
  153077. "lsl r6, r6, #16\n\t"
  153078. #endif
  153079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153080. "adds r3, r3, r6\n\t"
  153081. #else
  153082. "add r3, r3, r6\n\t"
  153083. #endif
  153084. #ifdef WOLFSSL_KEIL
  153085. "adcs r4, r4, r7\n\t"
  153086. #elif defined(__clang__)
  153087. "adcs r4, r7\n\t"
  153088. #else
  153089. "adc r4, r7\n\t"
  153090. #endif
  153091. #ifdef WOLFSSL_KEIL
  153092. "adcs r5, r5, %[r]\n\t"
  153093. #elif defined(__clang__)
  153094. "adcs r5, %[r]\n\t"
  153095. #else
  153096. "adc r5, %[r]\n\t"
  153097. #endif
  153098. "# A[12] * B[3]\n\t"
  153099. "mov %[a], r9\n\t"
  153100. "mov %[b], r10\n\t"
  153101. "ldr %[a], [%[a], #48]\n\t"
  153102. "ldr %[b], [%[b], #12]\n\t"
  153103. "uxth r6, %[a]\n\t"
  153104. "uxth r7, %[b]\n\t"
  153105. #ifdef WOLFSSL_KEIL
  153106. "muls r7, r6, r7\n\t"
  153107. #elif defined(__clang__)
  153108. "muls r7, r6\n\t"
  153109. #else
  153110. "mul r7, r6\n\t"
  153111. #endif
  153112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153113. "adds r3, r3, r7\n\t"
  153114. #else
  153115. "add r3, r3, r7\n\t"
  153116. #endif
  153117. #ifdef WOLFSSL_KEIL
  153118. "adcs r4, r4, %[r]\n\t"
  153119. #elif defined(__clang__)
  153120. "adcs r4, %[r]\n\t"
  153121. #else
  153122. "adc r4, %[r]\n\t"
  153123. #endif
  153124. #ifdef WOLFSSL_KEIL
  153125. "adcs r5, r5, %[r]\n\t"
  153126. #elif defined(__clang__)
  153127. "adcs r5, %[r]\n\t"
  153128. #else
  153129. "adc r5, %[r]\n\t"
  153130. #endif
  153131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153132. "lsrs r7, %[b], #16\n\t"
  153133. #else
  153134. "lsr r7, %[b], #16\n\t"
  153135. #endif
  153136. #ifdef WOLFSSL_KEIL
  153137. "muls r6, r7, r6\n\t"
  153138. #elif defined(__clang__)
  153139. "muls r6, r7\n\t"
  153140. #else
  153141. "mul r6, r7\n\t"
  153142. #endif
  153143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153144. "lsrs r7, r6, #16\n\t"
  153145. #else
  153146. "lsr r7, r6, #16\n\t"
  153147. #endif
  153148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153149. "lsls r6, r6, #16\n\t"
  153150. #else
  153151. "lsl r6, r6, #16\n\t"
  153152. #endif
  153153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153154. "adds r3, r3, r6\n\t"
  153155. #else
  153156. "add r3, r3, r6\n\t"
  153157. #endif
  153158. #ifdef WOLFSSL_KEIL
  153159. "adcs r4, r4, r7\n\t"
  153160. #elif defined(__clang__)
  153161. "adcs r4, r7\n\t"
  153162. #else
  153163. "adc r4, r7\n\t"
  153164. #endif
  153165. #ifdef WOLFSSL_KEIL
  153166. "adcs r5, r5, %[r]\n\t"
  153167. #elif defined(__clang__)
  153168. "adcs r5, %[r]\n\t"
  153169. #else
  153170. "adc r5, %[r]\n\t"
  153171. #endif
  153172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153173. "lsrs r6, %[a], #16\n\t"
  153174. #else
  153175. "lsr r6, %[a], #16\n\t"
  153176. #endif
  153177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153178. "lsrs r7, %[b], #16\n\t"
  153179. #else
  153180. "lsr r7, %[b], #16\n\t"
  153181. #endif
  153182. #ifdef WOLFSSL_KEIL
  153183. "muls r7, r6, r7\n\t"
  153184. #elif defined(__clang__)
  153185. "muls r7, r6\n\t"
  153186. #else
  153187. "mul r7, r6\n\t"
  153188. #endif
  153189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153190. "adds r4, r4, r7\n\t"
  153191. #else
  153192. "add r4, r4, r7\n\t"
  153193. #endif
  153194. #ifdef WOLFSSL_KEIL
  153195. "adcs r5, r5, %[r]\n\t"
  153196. #elif defined(__clang__)
  153197. "adcs r5, %[r]\n\t"
  153198. #else
  153199. "adc r5, %[r]\n\t"
  153200. #endif
  153201. "uxth r7, %[b]\n\t"
  153202. #ifdef WOLFSSL_KEIL
  153203. "muls r6, r7, r6\n\t"
  153204. #elif defined(__clang__)
  153205. "muls r6, r7\n\t"
  153206. #else
  153207. "mul r6, r7\n\t"
  153208. #endif
  153209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153210. "lsrs r7, r6, #16\n\t"
  153211. #else
  153212. "lsr r7, r6, #16\n\t"
  153213. #endif
  153214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153215. "lsls r6, r6, #16\n\t"
  153216. #else
  153217. "lsl r6, r6, #16\n\t"
  153218. #endif
  153219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153220. "adds r3, r3, r6\n\t"
  153221. #else
  153222. "add r3, r3, r6\n\t"
  153223. #endif
  153224. #ifdef WOLFSSL_KEIL
  153225. "adcs r4, r4, r7\n\t"
  153226. #elif defined(__clang__)
  153227. "adcs r4, r7\n\t"
  153228. #else
  153229. "adc r4, r7\n\t"
  153230. #endif
  153231. #ifdef WOLFSSL_KEIL
  153232. "adcs r5, r5, %[r]\n\t"
  153233. #elif defined(__clang__)
  153234. "adcs r5, %[r]\n\t"
  153235. #else
  153236. "adc r5, %[r]\n\t"
  153237. #endif
  153238. "# A[13] * B[2]\n\t"
  153239. "mov %[a], r9\n\t"
  153240. "mov %[b], r10\n\t"
  153241. "ldr %[a], [%[a], #52]\n\t"
  153242. "ldr %[b], [%[b], #8]\n\t"
  153243. "uxth r6, %[a]\n\t"
  153244. "uxth r7, %[b]\n\t"
  153245. #ifdef WOLFSSL_KEIL
  153246. "muls r7, r6, r7\n\t"
  153247. #elif defined(__clang__)
  153248. "muls r7, r6\n\t"
  153249. #else
  153250. "mul r7, r6\n\t"
  153251. #endif
  153252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153253. "adds r3, r3, r7\n\t"
  153254. #else
  153255. "add r3, r3, r7\n\t"
  153256. #endif
  153257. #ifdef WOLFSSL_KEIL
  153258. "adcs r4, r4, %[r]\n\t"
  153259. #elif defined(__clang__)
  153260. "adcs r4, %[r]\n\t"
  153261. #else
  153262. "adc r4, %[r]\n\t"
  153263. #endif
  153264. #ifdef WOLFSSL_KEIL
  153265. "adcs r5, r5, %[r]\n\t"
  153266. #elif defined(__clang__)
  153267. "adcs r5, %[r]\n\t"
  153268. #else
  153269. "adc r5, %[r]\n\t"
  153270. #endif
  153271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153272. "lsrs r7, %[b], #16\n\t"
  153273. #else
  153274. "lsr r7, %[b], #16\n\t"
  153275. #endif
  153276. #ifdef WOLFSSL_KEIL
  153277. "muls r6, r7, r6\n\t"
  153278. #elif defined(__clang__)
  153279. "muls r6, r7\n\t"
  153280. #else
  153281. "mul r6, r7\n\t"
  153282. #endif
  153283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153284. "lsrs r7, r6, #16\n\t"
  153285. #else
  153286. "lsr r7, r6, #16\n\t"
  153287. #endif
  153288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153289. "lsls r6, r6, #16\n\t"
  153290. #else
  153291. "lsl r6, r6, #16\n\t"
  153292. #endif
  153293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153294. "adds r3, r3, r6\n\t"
  153295. #else
  153296. "add r3, r3, r6\n\t"
  153297. #endif
  153298. #ifdef WOLFSSL_KEIL
  153299. "adcs r4, r4, r7\n\t"
  153300. #elif defined(__clang__)
  153301. "adcs r4, r7\n\t"
  153302. #else
  153303. "adc r4, r7\n\t"
  153304. #endif
  153305. #ifdef WOLFSSL_KEIL
  153306. "adcs r5, r5, %[r]\n\t"
  153307. #elif defined(__clang__)
  153308. "adcs r5, %[r]\n\t"
  153309. #else
  153310. "adc r5, %[r]\n\t"
  153311. #endif
  153312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153313. "lsrs r6, %[a], #16\n\t"
  153314. #else
  153315. "lsr r6, %[a], #16\n\t"
  153316. #endif
  153317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153318. "lsrs r7, %[b], #16\n\t"
  153319. #else
  153320. "lsr r7, %[b], #16\n\t"
  153321. #endif
  153322. #ifdef WOLFSSL_KEIL
  153323. "muls r7, r6, r7\n\t"
  153324. #elif defined(__clang__)
  153325. "muls r7, r6\n\t"
  153326. #else
  153327. "mul r7, r6\n\t"
  153328. #endif
  153329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153330. "adds r4, r4, r7\n\t"
  153331. #else
  153332. "add r4, r4, r7\n\t"
  153333. #endif
  153334. #ifdef WOLFSSL_KEIL
  153335. "adcs r5, r5, %[r]\n\t"
  153336. #elif defined(__clang__)
  153337. "adcs r5, %[r]\n\t"
  153338. #else
  153339. "adc r5, %[r]\n\t"
  153340. #endif
  153341. "uxth r7, %[b]\n\t"
  153342. #ifdef WOLFSSL_KEIL
  153343. "muls r6, r7, r6\n\t"
  153344. #elif defined(__clang__)
  153345. "muls r6, r7\n\t"
  153346. #else
  153347. "mul r6, r7\n\t"
  153348. #endif
  153349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153350. "lsrs r7, r6, #16\n\t"
  153351. #else
  153352. "lsr r7, r6, #16\n\t"
  153353. #endif
  153354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153355. "lsls r6, r6, #16\n\t"
  153356. #else
  153357. "lsl r6, r6, #16\n\t"
  153358. #endif
  153359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153360. "adds r3, r3, r6\n\t"
  153361. #else
  153362. "add r3, r3, r6\n\t"
  153363. #endif
  153364. #ifdef WOLFSSL_KEIL
  153365. "adcs r4, r4, r7\n\t"
  153366. #elif defined(__clang__)
  153367. "adcs r4, r7\n\t"
  153368. #else
  153369. "adc r4, r7\n\t"
  153370. #endif
  153371. #ifdef WOLFSSL_KEIL
  153372. "adcs r5, r5, %[r]\n\t"
  153373. #elif defined(__clang__)
  153374. "adcs r5, %[r]\n\t"
  153375. #else
  153376. "adc r5, %[r]\n\t"
  153377. #endif
  153378. "# A[14] * B[1]\n\t"
  153379. "mov %[a], r9\n\t"
  153380. "mov %[b], r10\n\t"
  153381. "ldr %[a], [%[a], #56]\n\t"
  153382. "ldr %[b], [%[b], #4]\n\t"
  153383. "uxth r6, %[a]\n\t"
  153384. "uxth r7, %[b]\n\t"
  153385. #ifdef WOLFSSL_KEIL
  153386. "muls r7, r6, r7\n\t"
  153387. #elif defined(__clang__)
  153388. "muls r7, r6\n\t"
  153389. #else
  153390. "mul r7, r6\n\t"
  153391. #endif
  153392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153393. "adds r3, r3, r7\n\t"
  153394. #else
  153395. "add r3, r3, r7\n\t"
  153396. #endif
  153397. #ifdef WOLFSSL_KEIL
  153398. "adcs r4, r4, %[r]\n\t"
  153399. #elif defined(__clang__)
  153400. "adcs r4, %[r]\n\t"
  153401. #else
  153402. "adc r4, %[r]\n\t"
  153403. #endif
  153404. #ifdef WOLFSSL_KEIL
  153405. "adcs r5, r5, %[r]\n\t"
  153406. #elif defined(__clang__)
  153407. "adcs r5, %[r]\n\t"
  153408. #else
  153409. "adc r5, %[r]\n\t"
  153410. #endif
  153411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153412. "lsrs r7, %[b], #16\n\t"
  153413. #else
  153414. "lsr r7, %[b], #16\n\t"
  153415. #endif
  153416. #ifdef WOLFSSL_KEIL
  153417. "muls r6, r7, r6\n\t"
  153418. #elif defined(__clang__)
  153419. "muls r6, r7\n\t"
  153420. #else
  153421. "mul r6, r7\n\t"
  153422. #endif
  153423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153424. "lsrs r7, r6, #16\n\t"
  153425. #else
  153426. "lsr r7, r6, #16\n\t"
  153427. #endif
  153428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153429. "lsls r6, r6, #16\n\t"
  153430. #else
  153431. "lsl r6, r6, #16\n\t"
  153432. #endif
  153433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153434. "adds r3, r3, r6\n\t"
  153435. #else
  153436. "add r3, r3, r6\n\t"
  153437. #endif
  153438. #ifdef WOLFSSL_KEIL
  153439. "adcs r4, r4, r7\n\t"
  153440. #elif defined(__clang__)
  153441. "adcs r4, r7\n\t"
  153442. #else
  153443. "adc r4, r7\n\t"
  153444. #endif
  153445. #ifdef WOLFSSL_KEIL
  153446. "adcs r5, r5, %[r]\n\t"
  153447. #elif defined(__clang__)
  153448. "adcs r5, %[r]\n\t"
  153449. #else
  153450. "adc r5, %[r]\n\t"
  153451. #endif
  153452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153453. "lsrs r6, %[a], #16\n\t"
  153454. #else
  153455. "lsr r6, %[a], #16\n\t"
  153456. #endif
  153457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153458. "lsrs r7, %[b], #16\n\t"
  153459. #else
  153460. "lsr r7, %[b], #16\n\t"
  153461. #endif
  153462. #ifdef WOLFSSL_KEIL
  153463. "muls r7, r6, r7\n\t"
  153464. #elif defined(__clang__)
  153465. "muls r7, r6\n\t"
  153466. #else
  153467. "mul r7, r6\n\t"
  153468. #endif
  153469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153470. "adds r4, r4, r7\n\t"
  153471. #else
  153472. "add r4, r4, r7\n\t"
  153473. #endif
  153474. #ifdef WOLFSSL_KEIL
  153475. "adcs r5, r5, %[r]\n\t"
  153476. #elif defined(__clang__)
  153477. "adcs r5, %[r]\n\t"
  153478. #else
  153479. "adc r5, %[r]\n\t"
  153480. #endif
  153481. "uxth r7, %[b]\n\t"
  153482. #ifdef WOLFSSL_KEIL
  153483. "muls r6, r7, r6\n\t"
  153484. #elif defined(__clang__)
  153485. "muls r6, r7\n\t"
  153486. #else
  153487. "mul r6, r7\n\t"
  153488. #endif
  153489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153490. "lsrs r7, r6, #16\n\t"
  153491. #else
  153492. "lsr r7, r6, #16\n\t"
  153493. #endif
  153494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153495. "lsls r6, r6, #16\n\t"
  153496. #else
  153497. "lsl r6, r6, #16\n\t"
  153498. #endif
  153499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153500. "adds r3, r3, r6\n\t"
  153501. #else
  153502. "add r3, r3, r6\n\t"
  153503. #endif
  153504. #ifdef WOLFSSL_KEIL
  153505. "adcs r4, r4, r7\n\t"
  153506. #elif defined(__clang__)
  153507. "adcs r4, r7\n\t"
  153508. #else
  153509. "adc r4, r7\n\t"
  153510. #endif
  153511. #ifdef WOLFSSL_KEIL
  153512. "adcs r5, r5, %[r]\n\t"
  153513. #elif defined(__clang__)
  153514. "adcs r5, %[r]\n\t"
  153515. #else
  153516. "adc r5, %[r]\n\t"
  153517. #endif
  153518. "# A[15] * B[0]\n\t"
  153519. "mov %[a], r9\n\t"
  153520. "mov %[b], r10\n\t"
  153521. "ldr %[a], [%[a], #60]\n\t"
  153522. "ldr %[b], [%[b]]\n\t"
  153523. "uxth r6, %[a]\n\t"
  153524. "uxth r7, %[b]\n\t"
  153525. #ifdef WOLFSSL_KEIL
  153526. "muls r7, r6, r7\n\t"
  153527. #elif defined(__clang__)
  153528. "muls r7, r6\n\t"
  153529. #else
  153530. "mul r7, r6\n\t"
  153531. #endif
  153532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153533. "adds r3, r3, r7\n\t"
  153534. #else
  153535. "add r3, r3, r7\n\t"
  153536. #endif
  153537. #ifdef WOLFSSL_KEIL
  153538. "adcs r4, r4, %[r]\n\t"
  153539. #elif defined(__clang__)
  153540. "adcs r4, %[r]\n\t"
  153541. #else
  153542. "adc r4, %[r]\n\t"
  153543. #endif
  153544. #ifdef WOLFSSL_KEIL
  153545. "adcs r5, r5, %[r]\n\t"
  153546. #elif defined(__clang__)
  153547. "adcs r5, %[r]\n\t"
  153548. #else
  153549. "adc r5, %[r]\n\t"
  153550. #endif
  153551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153552. "lsrs r7, %[b], #16\n\t"
  153553. #else
  153554. "lsr r7, %[b], #16\n\t"
  153555. #endif
  153556. #ifdef WOLFSSL_KEIL
  153557. "muls r6, r7, r6\n\t"
  153558. #elif defined(__clang__)
  153559. "muls r6, r7\n\t"
  153560. #else
  153561. "mul r6, r7\n\t"
  153562. #endif
  153563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153564. "lsrs r7, r6, #16\n\t"
  153565. #else
  153566. "lsr r7, r6, #16\n\t"
  153567. #endif
  153568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153569. "lsls r6, r6, #16\n\t"
  153570. #else
  153571. "lsl r6, r6, #16\n\t"
  153572. #endif
  153573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153574. "adds r3, r3, r6\n\t"
  153575. #else
  153576. "add r3, r3, r6\n\t"
  153577. #endif
  153578. #ifdef WOLFSSL_KEIL
  153579. "adcs r4, r4, r7\n\t"
  153580. #elif defined(__clang__)
  153581. "adcs r4, r7\n\t"
  153582. #else
  153583. "adc r4, r7\n\t"
  153584. #endif
  153585. #ifdef WOLFSSL_KEIL
  153586. "adcs r5, r5, %[r]\n\t"
  153587. #elif defined(__clang__)
  153588. "adcs r5, %[r]\n\t"
  153589. #else
  153590. "adc r5, %[r]\n\t"
  153591. #endif
  153592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153593. "lsrs r6, %[a], #16\n\t"
  153594. #else
  153595. "lsr r6, %[a], #16\n\t"
  153596. #endif
  153597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153598. "lsrs r7, %[b], #16\n\t"
  153599. #else
  153600. "lsr r7, %[b], #16\n\t"
  153601. #endif
  153602. #ifdef WOLFSSL_KEIL
  153603. "muls r7, r6, r7\n\t"
  153604. #elif defined(__clang__)
  153605. "muls r7, r6\n\t"
  153606. #else
  153607. "mul r7, r6\n\t"
  153608. #endif
  153609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153610. "adds r4, r4, r7\n\t"
  153611. #else
  153612. "add r4, r4, r7\n\t"
  153613. #endif
  153614. #ifdef WOLFSSL_KEIL
  153615. "adcs r5, r5, %[r]\n\t"
  153616. #elif defined(__clang__)
  153617. "adcs r5, %[r]\n\t"
  153618. #else
  153619. "adc r5, %[r]\n\t"
  153620. #endif
  153621. "uxth r7, %[b]\n\t"
  153622. #ifdef WOLFSSL_KEIL
  153623. "muls r6, r7, r6\n\t"
  153624. #elif defined(__clang__)
  153625. "muls r6, r7\n\t"
  153626. #else
  153627. "mul r6, r7\n\t"
  153628. #endif
  153629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153630. "lsrs r7, r6, #16\n\t"
  153631. #else
  153632. "lsr r7, r6, #16\n\t"
  153633. #endif
  153634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153635. "lsls r6, r6, #16\n\t"
  153636. #else
  153637. "lsl r6, r6, #16\n\t"
  153638. #endif
  153639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153640. "adds r3, r3, r6\n\t"
  153641. #else
  153642. "add r3, r3, r6\n\t"
  153643. #endif
  153644. #ifdef WOLFSSL_KEIL
  153645. "adcs r4, r4, r7\n\t"
  153646. #elif defined(__clang__)
  153647. "adcs r4, r7\n\t"
  153648. #else
  153649. "adc r4, r7\n\t"
  153650. #endif
  153651. #ifdef WOLFSSL_KEIL
  153652. "adcs r5, r5, %[r]\n\t"
  153653. #elif defined(__clang__)
  153654. "adcs r5, %[r]\n\t"
  153655. #else
  153656. "adc r5, %[r]\n\t"
  153657. #endif
  153658. "str r3, [sp, #60]\n\t"
  153659. "# A[15] * B[1]\n\t"
  153660. "movs r3, #0\n\t"
  153661. "mov %[a], r9\n\t"
  153662. "mov %[b], r10\n\t"
  153663. "ldr %[a], [%[a], #60]\n\t"
  153664. "ldr %[b], [%[b], #4]\n\t"
  153665. "uxth r6, %[a]\n\t"
  153666. "uxth r7, %[b]\n\t"
  153667. #ifdef WOLFSSL_KEIL
  153668. "muls r7, r6, r7\n\t"
  153669. #elif defined(__clang__)
  153670. "muls r7, r6\n\t"
  153671. #else
  153672. "mul r7, r6\n\t"
  153673. #endif
  153674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153675. "adds r4, r4, r7\n\t"
  153676. #else
  153677. "add r4, r4, r7\n\t"
  153678. #endif
  153679. #ifdef WOLFSSL_KEIL
  153680. "adcs r5, r5, %[r]\n\t"
  153681. #elif defined(__clang__)
  153682. "adcs r5, %[r]\n\t"
  153683. #else
  153684. "adc r5, %[r]\n\t"
  153685. #endif
  153686. #ifdef WOLFSSL_KEIL
  153687. "adcs r3, r3, %[r]\n\t"
  153688. #elif defined(__clang__)
  153689. "adcs r3, %[r]\n\t"
  153690. #else
  153691. "adc r3, %[r]\n\t"
  153692. #endif
  153693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153694. "lsrs r7, %[b], #16\n\t"
  153695. #else
  153696. "lsr r7, %[b], #16\n\t"
  153697. #endif
  153698. #ifdef WOLFSSL_KEIL
  153699. "muls r6, r7, r6\n\t"
  153700. #elif defined(__clang__)
  153701. "muls r6, r7\n\t"
  153702. #else
  153703. "mul r6, r7\n\t"
  153704. #endif
  153705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153706. "lsrs r7, r6, #16\n\t"
  153707. #else
  153708. "lsr r7, r6, #16\n\t"
  153709. #endif
  153710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153711. "lsls r6, r6, #16\n\t"
  153712. #else
  153713. "lsl r6, r6, #16\n\t"
  153714. #endif
  153715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153716. "adds r4, r4, r6\n\t"
  153717. #else
  153718. "add r4, r4, r6\n\t"
  153719. #endif
  153720. #ifdef WOLFSSL_KEIL
  153721. "adcs r5, r5, r7\n\t"
  153722. #elif defined(__clang__)
  153723. "adcs r5, r7\n\t"
  153724. #else
  153725. "adc r5, r7\n\t"
  153726. #endif
  153727. #ifdef WOLFSSL_KEIL
  153728. "adcs r3, r3, %[r]\n\t"
  153729. #elif defined(__clang__)
  153730. "adcs r3, %[r]\n\t"
  153731. #else
  153732. "adc r3, %[r]\n\t"
  153733. #endif
  153734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153735. "lsrs r6, %[a], #16\n\t"
  153736. #else
  153737. "lsr r6, %[a], #16\n\t"
  153738. #endif
  153739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153740. "lsrs r7, %[b], #16\n\t"
  153741. #else
  153742. "lsr r7, %[b], #16\n\t"
  153743. #endif
  153744. #ifdef WOLFSSL_KEIL
  153745. "muls r7, r6, r7\n\t"
  153746. #elif defined(__clang__)
  153747. "muls r7, r6\n\t"
  153748. #else
  153749. "mul r7, r6\n\t"
  153750. #endif
  153751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153752. "adds r5, r5, r7\n\t"
  153753. #else
  153754. "add r5, r5, r7\n\t"
  153755. #endif
  153756. #ifdef WOLFSSL_KEIL
  153757. "adcs r3, r3, %[r]\n\t"
  153758. #elif defined(__clang__)
  153759. "adcs r3, %[r]\n\t"
  153760. #else
  153761. "adc r3, %[r]\n\t"
  153762. #endif
  153763. "uxth r7, %[b]\n\t"
  153764. #ifdef WOLFSSL_KEIL
  153765. "muls r6, r7, r6\n\t"
  153766. #elif defined(__clang__)
  153767. "muls r6, r7\n\t"
  153768. #else
  153769. "mul r6, r7\n\t"
  153770. #endif
  153771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153772. "lsrs r7, r6, #16\n\t"
  153773. #else
  153774. "lsr r7, r6, #16\n\t"
  153775. #endif
  153776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153777. "lsls r6, r6, #16\n\t"
  153778. #else
  153779. "lsl r6, r6, #16\n\t"
  153780. #endif
  153781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153782. "adds r4, r4, r6\n\t"
  153783. #else
  153784. "add r4, r4, r6\n\t"
  153785. #endif
  153786. #ifdef WOLFSSL_KEIL
  153787. "adcs r5, r5, r7\n\t"
  153788. #elif defined(__clang__)
  153789. "adcs r5, r7\n\t"
  153790. #else
  153791. "adc r5, r7\n\t"
  153792. #endif
  153793. #ifdef WOLFSSL_KEIL
  153794. "adcs r3, r3, %[r]\n\t"
  153795. #elif defined(__clang__)
  153796. "adcs r3, %[r]\n\t"
  153797. #else
  153798. "adc r3, %[r]\n\t"
  153799. #endif
  153800. "# A[14] * B[2]\n\t"
  153801. "mov %[a], r9\n\t"
  153802. "mov %[b], r10\n\t"
  153803. "ldr %[a], [%[a], #56]\n\t"
  153804. "ldr %[b], [%[b], #8]\n\t"
  153805. "uxth r6, %[a]\n\t"
  153806. "uxth r7, %[b]\n\t"
  153807. #ifdef WOLFSSL_KEIL
  153808. "muls r7, r6, r7\n\t"
  153809. #elif defined(__clang__)
  153810. "muls r7, r6\n\t"
  153811. #else
  153812. "mul r7, r6\n\t"
  153813. #endif
  153814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153815. "adds r4, r4, r7\n\t"
  153816. #else
  153817. "add r4, r4, r7\n\t"
  153818. #endif
  153819. #ifdef WOLFSSL_KEIL
  153820. "adcs r5, r5, %[r]\n\t"
  153821. #elif defined(__clang__)
  153822. "adcs r5, %[r]\n\t"
  153823. #else
  153824. "adc r5, %[r]\n\t"
  153825. #endif
  153826. #ifdef WOLFSSL_KEIL
  153827. "adcs r3, r3, %[r]\n\t"
  153828. #elif defined(__clang__)
  153829. "adcs r3, %[r]\n\t"
  153830. #else
  153831. "adc r3, %[r]\n\t"
  153832. #endif
  153833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153834. "lsrs r7, %[b], #16\n\t"
  153835. #else
  153836. "lsr r7, %[b], #16\n\t"
  153837. #endif
  153838. #ifdef WOLFSSL_KEIL
  153839. "muls r6, r7, r6\n\t"
  153840. #elif defined(__clang__)
  153841. "muls r6, r7\n\t"
  153842. #else
  153843. "mul r6, r7\n\t"
  153844. #endif
  153845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153846. "lsrs r7, r6, #16\n\t"
  153847. #else
  153848. "lsr r7, r6, #16\n\t"
  153849. #endif
  153850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153851. "lsls r6, r6, #16\n\t"
  153852. #else
  153853. "lsl r6, r6, #16\n\t"
  153854. #endif
  153855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153856. "adds r4, r4, r6\n\t"
  153857. #else
  153858. "add r4, r4, r6\n\t"
  153859. #endif
  153860. #ifdef WOLFSSL_KEIL
  153861. "adcs r5, r5, r7\n\t"
  153862. #elif defined(__clang__)
  153863. "adcs r5, r7\n\t"
  153864. #else
  153865. "adc r5, r7\n\t"
  153866. #endif
  153867. #ifdef WOLFSSL_KEIL
  153868. "adcs r3, r3, %[r]\n\t"
  153869. #elif defined(__clang__)
  153870. "adcs r3, %[r]\n\t"
  153871. #else
  153872. "adc r3, %[r]\n\t"
  153873. #endif
  153874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153875. "lsrs r6, %[a], #16\n\t"
  153876. #else
  153877. "lsr r6, %[a], #16\n\t"
  153878. #endif
  153879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153880. "lsrs r7, %[b], #16\n\t"
  153881. #else
  153882. "lsr r7, %[b], #16\n\t"
  153883. #endif
  153884. #ifdef WOLFSSL_KEIL
  153885. "muls r7, r6, r7\n\t"
  153886. #elif defined(__clang__)
  153887. "muls r7, r6\n\t"
  153888. #else
  153889. "mul r7, r6\n\t"
  153890. #endif
  153891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153892. "adds r5, r5, r7\n\t"
  153893. #else
  153894. "add r5, r5, r7\n\t"
  153895. #endif
  153896. #ifdef WOLFSSL_KEIL
  153897. "adcs r3, r3, %[r]\n\t"
  153898. #elif defined(__clang__)
  153899. "adcs r3, %[r]\n\t"
  153900. #else
  153901. "adc r3, %[r]\n\t"
  153902. #endif
  153903. "uxth r7, %[b]\n\t"
  153904. #ifdef WOLFSSL_KEIL
  153905. "muls r6, r7, r6\n\t"
  153906. #elif defined(__clang__)
  153907. "muls r6, r7\n\t"
  153908. #else
  153909. "mul r6, r7\n\t"
  153910. #endif
  153911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153912. "lsrs r7, r6, #16\n\t"
  153913. #else
  153914. "lsr r7, r6, #16\n\t"
  153915. #endif
  153916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153917. "lsls r6, r6, #16\n\t"
  153918. #else
  153919. "lsl r6, r6, #16\n\t"
  153920. #endif
  153921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153922. "adds r4, r4, r6\n\t"
  153923. #else
  153924. "add r4, r4, r6\n\t"
  153925. #endif
  153926. #ifdef WOLFSSL_KEIL
  153927. "adcs r5, r5, r7\n\t"
  153928. #elif defined(__clang__)
  153929. "adcs r5, r7\n\t"
  153930. #else
  153931. "adc r5, r7\n\t"
  153932. #endif
  153933. #ifdef WOLFSSL_KEIL
  153934. "adcs r3, r3, %[r]\n\t"
  153935. #elif defined(__clang__)
  153936. "adcs r3, %[r]\n\t"
  153937. #else
  153938. "adc r3, %[r]\n\t"
  153939. #endif
  153940. "# A[13] * B[3]\n\t"
  153941. "mov %[a], r9\n\t"
  153942. "mov %[b], r10\n\t"
  153943. "ldr %[a], [%[a], #52]\n\t"
  153944. "ldr %[b], [%[b], #12]\n\t"
  153945. "uxth r6, %[a]\n\t"
  153946. "uxth r7, %[b]\n\t"
  153947. #ifdef WOLFSSL_KEIL
  153948. "muls r7, r6, r7\n\t"
  153949. #elif defined(__clang__)
  153950. "muls r7, r6\n\t"
  153951. #else
  153952. "mul r7, r6\n\t"
  153953. #endif
  153954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153955. "adds r4, r4, r7\n\t"
  153956. #else
  153957. "add r4, r4, r7\n\t"
  153958. #endif
  153959. #ifdef WOLFSSL_KEIL
  153960. "adcs r5, r5, %[r]\n\t"
  153961. #elif defined(__clang__)
  153962. "adcs r5, %[r]\n\t"
  153963. #else
  153964. "adc r5, %[r]\n\t"
  153965. #endif
  153966. #ifdef WOLFSSL_KEIL
  153967. "adcs r3, r3, %[r]\n\t"
  153968. #elif defined(__clang__)
  153969. "adcs r3, %[r]\n\t"
  153970. #else
  153971. "adc r3, %[r]\n\t"
  153972. #endif
  153973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153974. "lsrs r7, %[b], #16\n\t"
  153975. #else
  153976. "lsr r7, %[b], #16\n\t"
  153977. #endif
  153978. #ifdef WOLFSSL_KEIL
  153979. "muls r6, r7, r6\n\t"
  153980. #elif defined(__clang__)
  153981. "muls r6, r7\n\t"
  153982. #else
  153983. "mul r6, r7\n\t"
  153984. #endif
  153985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153986. "lsrs r7, r6, #16\n\t"
  153987. #else
  153988. "lsr r7, r6, #16\n\t"
  153989. #endif
  153990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153991. "lsls r6, r6, #16\n\t"
  153992. #else
  153993. "lsl r6, r6, #16\n\t"
  153994. #endif
  153995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153996. "adds r4, r4, r6\n\t"
  153997. #else
  153998. "add r4, r4, r6\n\t"
  153999. #endif
  154000. #ifdef WOLFSSL_KEIL
  154001. "adcs r5, r5, r7\n\t"
  154002. #elif defined(__clang__)
  154003. "adcs r5, r7\n\t"
  154004. #else
  154005. "adc r5, r7\n\t"
  154006. #endif
  154007. #ifdef WOLFSSL_KEIL
  154008. "adcs r3, r3, %[r]\n\t"
  154009. #elif defined(__clang__)
  154010. "adcs r3, %[r]\n\t"
  154011. #else
  154012. "adc r3, %[r]\n\t"
  154013. #endif
  154014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154015. "lsrs r6, %[a], #16\n\t"
  154016. #else
  154017. "lsr r6, %[a], #16\n\t"
  154018. #endif
  154019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154020. "lsrs r7, %[b], #16\n\t"
  154021. #else
  154022. "lsr r7, %[b], #16\n\t"
  154023. #endif
  154024. #ifdef WOLFSSL_KEIL
  154025. "muls r7, r6, r7\n\t"
  154026. #elif defined(__clang__)
  154027. "muls r7, r6\n\t"
  154028. #else
  154029. "mul r7, r6\n\t"
  154030. #endif
  154031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154032. "adds r5, r5, r7\n\t"
  154033. #else
  154034. "add r5, r5, r7\n\t"
  154035. #endif
  154036. #ifdef WOLFSSL_KEIL
  154037. "adcs r3, r3, %[r]\n\t"
  154038. #elif defined(__clang__)
  154039. "adcs r3, %[r]\n\t"
  154040. #else
  154041. "adc r3, %[r]\n\t"
  154042. #endif
  154043. "uxth r7, %[b]\n\t"
  154044. #ifdef WOLFSSL_KEIL
  154045. "muls r6, r7, r6\n\t"
  154046. #elif defined(__clang__)
  154047. "muls r6, r7\n\t"
  154048. #else
  154049. "mul r6, r7\n\t"
  154050. #endif
  154051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154052. "lsrs r7, r6, #16\n\t"
  154053. #else
  154054. "lsr r7, r6, #16\n\t"
  154055. #endif
  154056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154057. "lsls r6, r6, #16\n\t"
  154058. #else
  154059. "lsl r6, r6, #16\n\t"
  154060. #endif
  154061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154062. "adds r4, r4, r6\n\t"
  154063. #else
  154064. "add r4, r4, r6\n\t"
  154065. #endif
  154066. #ifdef WOLFSSL_KEIL
  154067. "adcs r5, r5, r7\n\t"
  154068. #elif defined(__clang__)
  154069. "adcs r5, r7\n\t"
  154070. #else
  154071. "adc r5, r7\n\t"
  154072. #endif
  154073. #ifdef WOLFSSL_KEIL
  154074. "adcs r3, r3, %[r]\n\t"
  154075. #elif defined(__clang__)
  154076. "adcs r3, %[r]\n\t"
  154077. #else
  154078. "adc r3, %[r]\n\t"
  154079. #endif
  154080. "# A[12] * B[4]\n\t"
  154081. "mov %[a], r9\n\t"
  154082. "mov %[b], r10\n\t"
  154083. "ldr %[a], [%[a], #48]\n\t"
  154084. "ldr %[b], [%[b], #16]\n\t"
  154085. "uxth r6, %[a]\n\t"
  154086. "uxth r7, %[b]\n\t"
  154087. #ifdef WOLFSSL_KEIL
  154088. "muls r7, r6, r7\n\t"
  154089. #elif defined(__clang__)
  154090. "muls r7, r6\n\t"
  154091. #else
  154092. "mul r7, r6\n\t"
  154093. #endif
  154094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154095. "adds r4, r4, r7\n\t"
  154096. #else
  154097. "add r4, r4, r7\n\t"
  154098. #endif
  154099. #ifdef WOLFSSL_KEIL
  154100. "adcs r5, r5, %[r]\n\t"
  154101. #elif defined(__clang__)
  154102. "adcs r5, %[r]\n\t"
  154103. #else
  154104. "adc r5, %[r]\n\t"
  154105. #endif
  154106. #ifdef WOLFSSL_KEIL
  154107. "adcs r3, r3, %[r]\n\t"
  154108. #elif defined(__clang__)
  154109. "adcs r3, %[r]\n\t"
  154110. #else
  154111. "adc r3, %[r]\n\t"
  154112. #endif
  154113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154114. "lsrs r7, %[b], #16\n\t"
  154115. #else
  154116. "lsr r7, %[b], #16\n\t"
  154117. #endif
  154118. #ifdef WOLFSSL_KEIL
  154119. "muls r6, r7, r6\n\t"
  154120. #elif defined(__clang__)
  154121. "muls r6, r7\n\t"
  154122. #else
  154123. "mul r6, r7\n\t"
  154124. #endif
  154125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154126. "lsrs r7, r6, #16\n\t"
  154127. #else
  154128. "lsr r7, r6, #16\n\t"
  154129. #endif
  154130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154131. "lsls r6, r6, #16\n\t"
  154132. #else
  154133. "lsl r6, r6, #16\n\t"
  154134. #endif
  154135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154136. "adds r4, r4, r6\n\t"
  154137. #else
  154138. "add r4, r4, r6\n\t"
  154139. #endif
  154140. #ifdef WOLFSSL_KEIL
  154141. "adcs r5, r5, r7\n\t"
  154142. #elif defined(__clang__)
  154143. "adcs r5, r7\n\t"
  154144. #else
  154145. "adc r5, r7\n\t"
  154146. #endif
  154147. #ifdef WOLFSSL_KEIL
  154148. "adcs r3, r3, %[r]\n\t"
  154149. #elif defined(__clang__)
  154150. "adcs r3, %[r]\n\t"
  154151. #else
  154152. "adc r3, %[r]\n\t"
  154153. #endif
  154154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154155. "lsrs r6, %[a], #16\n\t"
  154156. #else
  154157. "lsr r6, %[a], #16\n\t"
  154158. #endif
  154159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154160. "lsrs r7, %[b], #16\n\t"
  154161. #else
  154162. "lsr r7, %[b], #16\n\t"
  154163. #endif
  154164. #ifdef WOLFSSL_KEIL
  154165. "muls r7, r6, r7\n\t"
  154166. #elif defined(__clang__)
  154167. "muls r7, r6\n\t"
  154168. #else
  154169. "mul r7, r6\n\t"
  154170. #endif
  154171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154172. "adds r5, r5, r7\n\t"
  154173. #else
  154174. "add r5, r5, r7\n\t"
  154175. #endif
  154176. #ifdef WOLFSSL_KEIL
  154177. "adcs r3, r3, %[r]\n\t"
  154178. #elif defined(__clang__)
  154179. "adcs r3, %[r]\n\t"
  154180. #else
  154181. "adc r3, %[r]\n\t"
  154182. #endif
  154183. "uxth r7, %[b]\n\t"
  154184. #ifdef WOLFSSL_KEIL
  154185. "muls r6, r7, r6\n\t"
  154186. #elif defined(__clang__)
  154187. "muls r6, r7\n\t"
  154188. #else
  154189. "mul r6, r7\n\t"
  154190. #endif
  154191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154192. "lsrs r7, r6, #16\n\t"
  154193. #else
  154194. "lsr r7, r6, #16\n\t"
  154195. #endif
  154196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154197. "lsls r6, r6, #16\n\t"
  154198. #else
  154199. "lsl r6, r6, #16\n\t"
  154200. #endif
  154201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154202. "adds r4, r4, r6\n\t"
  154203. #else
  154204. "add r4, r4, r6\n\t"
  154205. #endif
  154206. #ifdef WOLFSSL_KEIL
  154207. "adcs r5, r5, r7\n\t"
  154208. #elif defined(__clang__)
  154209. "adcs r5, r7\n\t"
  154210. #else
  154211. "adc r5, r7\n\t"
  154212. #endif
  154213. #ifdef WOLFSSL_KEIL
  154214. "adcs r3, r3, %[r]\n\t"
  154215. #elif defined(__clang__)
  154216. "adcs r3, %[r]\n\t"
  154217. #else
  154218. "adc r3, %[r]\n\t"
  154219. #endif
  154220. "# A[11] * B[5]\n\t"
  154221. "mov %[a], r9\n\t"
  154222. "mov %[b], r10\n\t"
  154223. "ldr %[a], [%[a], #44]\n\t"
  154224. "ldr %[b], [%[b], #20]\n\t"
  154225. "uxth r6, %[a]\n\t"
  154226. "uxth r7, %[b]\n\t"
  154227. #ifdef WOLFSSL_KEIL
  154228. "muls r7, r6, r7\n\t"
  154229. #elif defined(__clang__)
  154230. "muls r7, r6\n\t"
  154231. #else
  154232. "mul r7, r6\n\t"
  154233. #endif
  154234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154235. "adds r4, r4, r7\n\t"
  154236. #else
  154237. "add r4, r4, r7\n\t"
  154238. #endif
  154239. #ifdef WOLFSSL_KEIL
  154240. "adcs r5, r5, %[r]\n\t"
  154241. #elif defined(__clang__)
  154242. "adcs r5, %[r]\n\t"
  154243. #else
  154244. "adc r5, %[r]\n\t"
  154245. #endif
  154246. #ifdef WOLFSSL_KEIL
  154247. "adcs r3, r3, %[r]\n\t"
  154248. #elif defined(__clang__)
  154249. "adcs r3, %[r]\n\t"
  154250. #else
  154251. "adc r3, %[r]\n\t"
  154252. #endif
  154253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154254. "lsrs r7, %[b], #16\n\t"
  154255. #else
  154256. "lsr r7, %[b], #16\n\t"
  154257. #endif
  154258. #ifdef WOLFSSL_KEIL
  154259. "muls r6, r7, r6\n\t"
  154260. #elif defined(__clang__)
  154261. "muls r6, r7\n\t"
  154262. #else
  154263. "mul r6, r7\n\t"
  154264. #endif
  154265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154266. "lsrs r7, r6, #16\n\t"
  154267. #else
  154268. "lsr r7, r6, #16\n\t"
  154269. #endif
  154270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154271. "lsls r6, r6, #16\n\t"
  154272. #else
  154273. "lsl r6, r6, #16\n\t"
  154274. #endif
  154275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154276. "adds r4, r4, r6\n\t"
  154277. #else
  154278. "add r4, r4, r6\n\t"
  154279. #endif
  154280. #ifdef WOLFSSL_KEIL
  154281. "adcs r5, r5, r7\n\t"
  154282. #elif defined(__clang__)
  154283. "adcs r5, r7\n\t"
  154284. #else
  154285. "adc r5, r7\n\t"
  154286. #endif
  154287. #ifdef WOLFSSL_KEIL
  154288. "adcs r3, r3, %[r]\n\t"
  154289. #elif defined(__clang__)
  154290. "adcs r3, %[r]\n\t"
  154291. #else
  154292. "adc r3, %[r]\n\t"
  154293. #endif
  154294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154295. "lsrs r6, %[a], #16\n\t"
  154296. #else
  154297. "lsr r6, %[a], #16\n\t"
  154298. #endif
  154299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154300. "lsrs r7, %[b], #16\n\t"
  154301. #else
  154302. "lsr r7, %[b], #16\n\t"
  154303. #endif
  154304. #ifdef WOLFSSL_KEIL
  154305. "muls r7, r6, r7\n\t"
  154306. #elif defined(__clang__)
  154307. "muls r7, r6\n\t"
  154308. #else
  154309. "mul r7, r6\n\t"
  154310. #endif
  154311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154312. "adds r5, r5, r7\n\t"
  154313. #else
  154314. "add r5, r5, r7\n\t"
  154315. #endif
  154316. #ifdef WOLFSSL_KEIL
  154317. "adcs r3, r3, %[r]\n\t"
  154318. #elif defined(__clang__)
  154319. "adcs r3, %[r]\n\t"
  154320. #else
  154321. "adc r3, %[r]\n\t"
  154322. #endif
  154323. "uxth r7, %[b]\n\t"
  154324. #ifdef WOLFSSL_KEIL
  154325. "muls r6, r7, r6\n\t"
  154326. #elif defined(__clang__)
  154327. "muls r6, r7\n\t"
  154328. #else
  154329. "mul r6, r7\n\t"
  154330. #endif
  154331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154332. "lsrs r7, r6, #16\n\t"
  154333. #else
  154334. "lsr r7, r6, #16\n\t"
  154335. #endif
  154336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154337. "lsls r6, r6, #16\n\t"
  154338. #else
  154339. "lsl r6, r6, #16\n\t"
  154340. #endif
  154341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154342. "adds r4, r4, r6\n\t"
  154343. #else
  154344. "add r4, r4, r6\n\t"
  154345. #endif
  154346. #ifdef WOLFSSL_KEIL
  154347. "adcs r5, r5, r7\n\t"
  154348. #elif defined(__clang__)
  154349. "adcs r5, r7\n\t"
  154350. #else
  154351. "adc r5, r7\n\t"
  154352. #endif
  154353. #ifdef WOLFSSL_KEIL
  154354. "adcs r3, r3, %[r]\n\t"
  154355. #elif defined(__clang__)
  154356. "adcs r3, %[r]\n\t"
  154357. #else
  154358. "adc r3, %[r]\n\t"
  154359. #endif
  154360. "# A[10] * B[6]\n\t"
  154361. "mov %[a], r9\n\t"
  154362. "mov %[b], r10\n\t"
  154363. "ldr %[a], [%[a], #40]\n\t"
  154364. "ldr %[b], [%[b], #24]\n\t"
  154365. "uxth r6, %[a]\n\t"
  154366. "uxth r7, %[b]\n\t"
  154367. #ifdef WOLFSSL_KEIL
  154368. "muls r7, r6, r7\n\t"
  154369. #elif defined(__clang__)
  154370. "muls r7, r6\n\t"
  154371. #else
  154372. "mul r7, r6\n\t"
  154373. #endif
  154374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154375. "adds r4, r4, r7\n\t"
  154376. #else
  154377. "add r4, r4, r7\n\t"
  154378. #endif
  154379. #ifdef WOLFSSL_KEIL
  154380. "adcs r5, r5, %[r]\n\t"
  154381. #elif defined(__clang__)
  154382. "adcs r5, %[r]\n\t"
  154383. #else
  154384. "adc r5, %[r]\n\t"
  154385. #endif
  154386. #ifdef WOLFSSL_KEIL
  154387. "adcs r3, r3, %[r]\n\t"
  154388. #elif defined(__clang__)
  154389. "adcs r3, %[r]\n\t"
  154390. #else
  154391. "adc r3, %[r]\n\t"
  154392. #endif
  154393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154394. "lsrs r7, %[b], #16\n\t"
  154395. #else
  154396. "lsr r7, %[b], #16\n\t"
  154397. #endif
  154398. #ifdef WOLFSSL_KEIL
  154399. "muls r6, r7, r6\n\t"
  154400. #elif defined(__clang__)
  154401. "muls r6, r7\n\t"
  154402. #else
  154403. "mul r6, r7\n\t"
  154404. #endif
  154405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154406. "lsrs r7, r6, #16\n\t"
  154407. #else
  154408. "lsr r7, r6, #16\n\t"
  154409. #endif
  154410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154411. "lsls r6, r6, #16\n\t"
  154412. #else
  154413. "lsl r6, r6, #16\n\t"
  154414. #endif
  154415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154416. "adds r4, r4, r6\n\t"
  154417. #else
  154418. "add r4, r4, r6\n\t"
  154419. #endif
  154420. #ifdef WOLFSSL_KEIL
  154421. "adcs r5, r5, r7\n\t"
  154422. #elif defined(__clang__)
  154423. "adcs r5, r7\n\t"
  154424. #else
  154425. "adc r5, r7\n\t"
  154426. #endif
  154427. #ifdef WOLFSSL_KEIL
  154428. "adcs r3, r3, %[r]\n\t"
  154429. #elif defined(__clang__)
  154430. "adcs r3, %[r]\n\t"
  154431. #else
  154432. "adc r3, %[r]\n\t"
  154433. #endif
  154434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154435. "lsrs r6, %[a], #16\n\t"
  154436. #else
  154437. "lsr r6, %[a], #16\n\t"
  154438. #endif
  154439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154440. "lsrs r7, %[b], #16\n\t"
  154441. #else
  154442. "lsr r7, %[b], #16\n\t"
  154443. #endif
  154444. #ifdef WOLFSSL_KEIL
  154445. "muls r7, r6, r7\n\t"
  154446. #elif defined(__clang__)
  154447. "muls r7, r6\n\t"
  154448. #else
  154449. "mul r7, r6\n\t"
  154450. #endif
  154451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154452. "adds r5, r5, r7\n\t"
  154453. #else
  154454. "add r5, r5, r7\n\t"
  154455. #endif
  154456. #ifdef WOLFSSL_KEIL
  154457. "adcs r3, r3, %[r]\n\t"
  154458. #elif defined(__clang__)
  154459. "adcs r3, %[r]\n\t"
  154460. #else
  154461. "adc r3, %[r]\n\t"
  154462. #endif
  154463. "uxth r7, %[b]\n\t"
  154464. #ifdef WOLFSSL_KEIL
  154465. "muls r6, r7, r6\n\t"
  154466. #elif defined(__clang__)
  154467. "muls r6, r7\n\t"
  154468. #else
  154469. "mul r6, r7\n\t"
  154470. #endif
  154471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154472. "lsrs r7, r6, #16\n\t"
  154473. #else
  154474. "lsr r7, r6, #16\n\t"
  154475. #endif
  154476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154477. "lsls r6, r6, #16\n\t"
  154478. #else
  154479. "lsl r6, r6, #16\n\t"
  154480. #endif
  154481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154482. "adds r4, r4, r6\n\t"
  154483. #else
  154484. "add r4, r4, r6\n\t"
  154485. #endif
  154486. #ifdef WOLFSSL_KEIL
  154487. "adcs r5, r5, r7\n\t"
  154488. #elif defined(__clang__)
  154489. "adcs r5, r7\n\t"
  154490. #else
  154491. "adc r5, r7\n\t"
  154492. #endif
  154493. #ifdef WOLFSSL_KEIL
  154494. "adcs r3, r3, %[r]\n\t"
  154495. #elif defined(__clang__)
  154496. "adcs r3, %[r]\n\t"
  154497. #else
  154498. "adc r3, %[r]\n\t"
  154499. #endif
  154500. "# A[9] * B[7]\n\t"
  154501. "mov %[a], r9\n\t"
  154502. "mov %[b], r10\n\t"
  154503. "ldr %[a], [%[a], #36]\n\t"
  154504. "ldr %[b], [%[b], #28]\n\t"
  154505. "uxth r6, %[a]\n\t"
  154506. "uxth r7, %[b]\n\t"
  154507. #ifdef WOLFSSL_KEIL
  154508. "muls r7, r6, r7\n\t"
  154509. #elif defined(__clang__)
  154510. "muls r7, r6\n\t"
  154511. #else
  154512. "mul r7, r6\n\t"
  154513. #endif
  154514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154515. "adds r4, r4, r7\n\t"
  154516. #else
  154517. "add r4, r4, r7\n\t"
  154518. #endif
  154519. #ifdef WOLFSSL_KEIL
  154520. "adcs r5, r5, %[r]\n\t"
  154521. #elif defined(__clang__)
  154522. "adcs r5, %[r]\n\t"
  154523. #else
  154524. "adc r5, %[r]\n\t"
  154525. #endif
  154526. #ifdef WOLFSSL_KEIL
  154527. "adcs r3, r3, %[r]\n\t"
  154528. #elif defined(__clang__)
  154529. "adcs r3, %[r]\n\t"
  154530. #else
  154531. "adc r3, %[r]\n\t"
  154532. #endif
  154533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154534. "lsrs r7, %[b], #16\n\t"
  154535. #else
  154536. "lsr r7, %[b], #16\n\t"
  154537. #endif
  154538. #ifdef WOLFSSL_KEIL
  154539. "muls r6, r7, r6\n\t"
  154540. #elif defined(__clang__)
  154541. "muls r6, r7\n\t"
  154542. #else
  154543. "mul r6, r7\n\t"
  154544. #endif
  154545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154546. "lsrs r7, r6, #16\n\t"
  154547. #else
  154548. "lsr r7, r6, #16\n\t"
  154549. #endif
  154550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154551. "lsls r6, r6, #16\n\t"
  154552. #else
  154553. "lsl r6, r6, #16\n\t"
  154554. #endif
  154555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154556. "adds r4, r4, r6\n\t"
  154557. #else
  154558. "add r4, r4, r6\n\t"
  154559. #endif
  154560. #ifdef WOLFSSL_KEIL
  154561. "adcs r5, r5, r7\n\t"
  154562. #elif defined(__clang__)
  154563. "adcs r5, r7\n\t"
  154564. #else
  154565. "adc r5, r7\n\t"
  154566. #endif
  154567. #ifdef WOLFSSL_KEIL
  154568. "adcs r3, r3, %[r]\n\t"
  154569. #elif defined(__clang__)
  154570. "adcs r3, %[r]\n\t"
  154571. #else
  154572. "adc r3, %[r]\n\t"
  154573. #endif
  154574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154575. "lsrs r6, %[a], #16\n\t"
  154576. #else
  154577. "lsr r6, %[a], #16\n\t"
  154578. #endif
  154579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154580. "lsrs r7, %[b], #16\n\t"
  154581. #else
  154582. "lsr r7, %[b], #16\n\t"
  154583. #endif
  154584. #ifdef WOLFSSL_KEIL
  154585. "muls r7, r6, r7\n\t"
  154586. #elif defined(__clang__)
  154587. "muls r7, r6\n\t"
  154588. #else
  154589. "mul r7, r6\n\t"
  154590. #endif
  154591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154592. "adds r5, r5, r7\n\t"
  154593. #else
  154594. "add r5, r5, r7\n\t"
  154595. #endif
  154596. #ifdef WOLFSSL_KEIL
  154597. "adcs r3, r3, %[r]\n\t"
  154598. #elif defined(__clang__)
  154599. "adcs r3, %[r]\n\t"
  154600. #else
  154601. "adc r3, %[r]\n\t"
  154602. #endif
  154603. "uxth r7, %[b]\n\t"
  154604. #ifdef WOLFSSL_KEIL
  154605. "muls r6, r7, r6\n\t"
  154606. #elif defined(__clang__)
  154607. "muls r6, r7\n\t"
  154608. #else
  154609. "mul r6, r7\n\t"
  154610. #endif
  154611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154612. "lsrs r7, r6, #16\n\t"
  154613. #else
  154614. "lsr r7, r6, #16\n\t"
  154615. #endif
  154616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154617. "lsls r6, r6, #16\n\t"
  154618. #else
  154619. "lsl r6, r6, #16\n\t"
  154620. #endif
  154621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154622. "adds r4, r4, r6\n\t"
  154623. #else
  154624. "add r4, r4, r6\n\t"
  154625. #endif
  154626. #ifdef WOLFSSL_KEIL
  154627. "adcs r5, r5, r7\n\t"
  154628. #elif defined(__clang__)
  154629. "adcs r5, r7\n\t"
  154630. #else
  154631. "adc r5, r7\n\t"
  154632. #endif
  154633. #ifdef WOLFSSL_KEIL
  154634. "adcs r3, r3, %[r]\n\t"
  154635. #elif defined(__clang__)
  154636. "adcs r3, %[r]\n\t"
  154637. #else
  154638. "adc r3, %[r]\n\t"
  154639. #endif
  154640. "# A[8] * B[8]\n\t"
  154641. "mov %[a], r9\n\t"
  154642. "mov %[b], r10\n\t"
  154643. "ldr %[a], [%[a], #32]\n\t"
  154644. "ldr %[b], [%[b], #32]\n\t"
  154645. "uxth r6, %[a]\n\t"
  154646. "uxth r7, %[b]\n\t"
  154647. #ifdef WOLFSSL_KEIL
  154648. "muls r7, r6, r7\n\t"
  154649. #elif defined(__clang__)
  154650. "muls r7, r6\n\t"
  154651. #else
  154652. "mul r7, r6\n\t"
  154653. #endif
  154654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154655. "adds r4, r4, r7\n\t"
  154656. #else
  154657. "add r4, r4, r7\n\t"
  154658. #endif
  154659. #ifdef WOLFSSL_KEIL
  154660. "adcs r5, r5, %[r]\n\t"
  154661. #elif defined(__clang__)
  154662. "adcs r5, %[r]\n\t"
  154663. #else
  154664. "adc r5, %[r]\n\t"
  154665. #endif
  154666. #ifdef WOLFSSL_KEIL
  154667. "adcs r3, r3, %[r]\n\t"
  154668. #elif defined(__clang__)
  154669. "adcs r3, %[r]\n\t"
  154670. #else
  154671. "adc r3, %[r]\n\t"
  154672. #endif
  154673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154674. "lsrs r7, %[b], #16\n\t"
  154675. #else
  154676. "lsr r7, %[b], #16\n\t"
  154677. #endif
  154678. #ifdef WOLFSSL_KEIL
  154679. "muls r6, r7, r6\n\t"
  154680. #elif defined(__clang__)
  154681. "muls r6, r7\n\t"
  154682. #else
  154683. "mul r6, r7\n\t"
  154684. #endif
  154685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154686. "lsrs r7, r6, #16\n\t"
  154687. #else
  154688. "lsr r7, r6, #16\n\t"
  154689. #endif
  154690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154691. "lsls r6, r6, #16\n\t"
  154692. #else
  154693. "lsl r6, r6, #16\n\t"
  154694. #endif
  154695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154696. "adds r4, r4, r6\n\t"
  154697. #else
  154698. "add r4, r4, r6\n\t"
  154699. #endif
  154700. #ifdef WOLFSSL_KEIL
  154701. "adcs r5, r5, r7\n\t"
  154702. #elif defined(__clang__)
  154703. "adcs r5, r7\n\t"
  154704. #else
  154705. "adc r5, r7\n\t"
  154706. #endif
  154707. #ifdef WOLFSSL_KEIL
  154708. "adcs r3, r3, %[r]\n\t"
  154709. #elif defined(__clang__)
  154710. "adcs r3, %[r]\n\t"
  154711. #else
  154712. "adc r3, %[r]\n\t"
  154713. #endif
  154714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154715. "lsrs r6, %[a], #16\n\t"
  154716. #else
  154717. "lsr r6, %[a], #16\n\t"
  154718. #endif
  154719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154720. "lsrs r7, %[b], #16\n\t"
  154721. #else
  154722. "lsr r7, %[b], #16\n\t"
  154723. #endif
  154724. #ifdef WOLFSSL_KEIL
  154725. "muls r7, r6, r7\n\t"
  154726. #elif defined(__clang__)
  154727. "muls r7, r6\n\t"
  154728. #else
  154729. "mul r7, r6\n\t"
  154730. #endif
  154731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154732. "adds r5, r5, r7\n\t"
  154733. #else
  154734. "add r5, r5, r7\n\t"
  154735. #endif
  154736. #ifdef WOLFSSL_KEIL
  154737. "adcs r3, r3, %[r]\n\t"
  154738. #elif defined(__clang__)
  154739. "adcs r3, %[r]\n\t"
  154740. #else
  154741. "adc r3, %[r]\n\t"
  154742. #endif
  154743. "uxth r7, %[b]\n\t"
  154744. #ifdef WOLFSSL_KEIL
  154745. "muls r6, r7, r6\n\t"
  154746. #elif defined(__clang__)
  154747. "muls r6, r7\n\t"
  154748. #else
  154749. "mul r6, r7\n\t"
  154750. #endif
  154751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154752. "lsrs r7, r6, #16\n\t"
  154753. #else
  154754. "lsr r7, r6, #16\n\t"
  154755. #endif
  154756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154757. "lsls r6, r6, #16\n\t"
  154758. #else
  154759. "lsl r6, r6, #16\n\t"
  154760. #endif
  154761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154762. "adds r4, r4, r6\n\t"
  154763. #else
  154764. "add r4, r4, r6\n\t"
  154765. #endif
  154766. #ifdef WOLFSSL_KEIL
  154767. "adcs r5, r5, r7\n\t"
  154768. #elif defined(__clang__)
  154769. "adcs r5, r7\n\t"
  154770. #else
  154771. "adc r5, r7\n\t"
  154772. #endif
  154773. #ifdef WOLFSSL_KEIL
  154774. "adcs r3, r3, %[r]\n\t"
  154775. #elif defined(__clang__)
  154776. "adcs r3, %[r]\n\t"
  154777. #else
  154778. "adc r3, %[r]\n\t"
  154779. #endif
  154780. "# A[7] * B[9]\n\t"
  154781. "mov %[a], r9\n\t"
  154782. "mov %[b], r10\n\t"
  154783. "ldr %[a], [%[a], #28]\n\t"
  154784. "ldr %[b], [%[b], #36]\n\t"
  154785. "uxth r6, %[a]\n\t"
  154786. "uxth r7, %[b]\n\t"
  154787. #ifdef WOLFSSL_KEIL
  154788. "muls r7, r6, r7\n\t"
  154789. #elif defined(__clang__)
  154790. "muls r7, r6\n\t"
  154791. #else
  154792. "mul r7, r6\n\t"
  154793. #endif
  154794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154795. "adds r4, r4, r7\n\t"
  154796. #else
  154797. "add r4, r4, r7\n\t"
  154798. #endif
  154799. #ifdef WOLFSSL_KEIL
  154800. "adcs r5, r5, %[r]\n\t"
  154801. #elif defined(__clang__)
  154802. "adcs r5, %[r]\n\t"
  154803. #else
  154804. "adc r5, %[r]\n\t"
  154805. #endif
  154806. #ifdef WOLFSSL_KEIL
  154807. "adcs r3, r3, %[r]\n\t"
  154808. #elif defined(__clang__)
  154809. "adcs r3, %[r]\n\t"
  154810. #else
  154811. "adc r3, %[r]\n\t"
  154812. #endif
  154813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154814. "lsrs r7, %[b], #16\n\t"
  154815. #else
  154816. "lsr r7, %[b], #16\n\t"
  154817. #endif
  154818. #ifdef WOLFSSL_KEIL
  154819. "muls r6, r7, r6\n\t"
  154820. #elif defined(__clang__)
  154821. "muls r6, r7\n\t"
  154822. #else
  154823. "mul r6, r7\n\t"
  154824. #endif
  154825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154826. "lsrs r7, r6, #16\n\t"
  154827. #else
  154828. "lsr r7, r6, #16\n\t"
  154829. #endif
  154830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154831. "lsls r6, r6, #16\n\t"
  154832. #else
  154833. "lsl r6, r6, #16\n\t"
  154834. #endif
  154835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154836. "adds r4, r4, r6\n\t"
  154837. #else
  154838. "add r4, r4, r6\n\t"
  154839. #endif
  154840. #ifdef WOLFSSL_KEIL
  154841. "adcs r5, r5, r7\n\t"
  154842. #elif defined(__clang__)
  154843. "adcs r5, r7\n\t"
  154844. #else
  154845. "adc r5, r7\n\t"
  154846. #endif
  154847. #ifdef WOLFSSL_KEIL
  154848. "adcs r3, r3, %[r]\n\t"
  154849. #elif defined(__clang__)
  154850. "adcs r3, %[r]\n\t"
  154851. #else
  154852. "adc r3, %[r]\n\t"
  154853. #endif
  154854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154855. "lsrs r6, %[a], #16\n\t"
  154856. #else
  154857. "lsr r6, %[a], #16\n\t"
  154858. #endif
  154859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154860. "lsrs r7, %[b], #16\n\t"
  154861. #else
  154862. "lsr r7, %[b], #16\n\t"
  154863. #endif
  154864. #ifdef WOLFSSL_KEIL
  154865. "muls r7, r6, r7\n\t"
  154866. #elif defined(__clang__)
  154867. "muls r7, r6\n\t"
  154868. #else
  154869. "mul r7, r6\n\t"
  154870. #endif
  154871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154872. "adds r5, r5, r7\n\t"
  154873. #else
  154874. "add r5, r5, r7\n\t"
  154875. #endif
  154876. #ifdef WOLFSSL_KEIL
  154877. "adcs r3, r3, %[r]\n\t"
  154878. #elif defined(__clang__)
  154879. "adcs r3, %[r]\n\t"
  154880. #else
  154881. "adc r3, %[r]\n\t"
  154882. #endif
  154883. "uxth r7, %[b]\n\t"
  154884. #ifdef WOLFSSL_KEIL
  154885. "muls r6, r7, r6\n\t"
  154886. #elif defined(__clang__)
  154887. "muls r6, r7\n\t"
  154888. #else
  154889. "mul r6, r7\n\t"
  154890. #endif
  154891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154892. "lsrs r7, r6, #16\n\t"
  154893. #else
  154894. "lsr r7, r6, #16\n\t"
  154895. #endif
  154896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154897. "lsls r6, r6, #16\n\t"
  154898. #else
  154899. "lsl r6, r6, #16\n\t"
  154900. #endif
  154901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154902. "adds r4, r4, r6\n\t"
  154903. #else
  154904. "add r4, r4, r6\n\t"
  154905. #endif
  154906. #ifdef WOLFSSL_KEIL
  154907. "adcs r5, r5, r7\n\t"
  154908. #elif defined(__clang__)
  154909. "adcs r5, r7\n\t"
  154910. #else
  154911. "adc r5, r7\n\t"
  154912. #endif
  154913. #ifdef WOLFSSL_KEIL
  154914. "adcs r3, r3, %[r]\n\t"
  154915. #elif defined(__clang__)
  154916. "adcs r3, %[r]\n\t"
  154917. #else
  154918. "adc r3, %[r]\n\t"
  154919. #endif
  154920. "# A[6] * B[10]\n\t"
  154921. "mov %[a], r9\n\t"
  154922. "mov %[b], r10\n\t"
  154923. "ldr %[a], [%[a], #24]\n\t"
  154924. "ldr %[b], [%[b], #40]\n\t"
  154925. "uxth r6, %[a]\n\t"
  154926. "uxth r7, %[b]\n\t"
  154927. #ifdef WOLFSSL_KEIL
  154928. "muls r7, r6, r7\n\t"
  154929. #elif defined(__clang__)
  154930. "muls r7, r6\n\t"
  154931. #else
  154932. "mul r7, r6\n\t"
  154933. #endif
  154934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154935. "adds r4, r4, r7\n\t"
  154936. #else
  154937. "add r4, r4, r7\n\t"
  154938. #endif
  154939. #ifdef WOLFSSL_KEIL
  154940. "adcs r5, r5, %[r]\n\t"
  154941. #elif defined(__clang__)
  154942. "adcs r5, %[r]\n\t"
  154943. #else
  154944. "adc r5, %[r]\n\t"
  154945. #endif
  154946. #ifdef WOLFSSL_KEIL
  154947. "adcs r3, r3, %[r]\n\t"
  154948. #elif defined(__clang__)
  154949. "adcs r3, %[r]\n\t"
  154950. #else
  154951. "adc r3, %[r]\n\t"
  154952. #endif
  154953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154954. "lsrs r7, %[b], #16\n\t"
  154955. #else
  154956. "lsr r7, %[b], #16\n\t"
  154957. #endif
  154958. #ifdef WOLFSSL_KEIL
  154959. "muls r6, r7, r6\n\t"
  154960. #elif defined(__clang__)
  154961. "muls r6, r7\n\t"
  154962. #else
  154963. "mul r6, r7\n\t"
  154964. #endif
  154965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154966. "lsrs r7, r6, #16\n\t"
  154967. #else
  154968. "lsr r7, r6, #16\n\t"
  154969. #endif
  154970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154971. "lsls r6, r6, #16\n\t"
  154972. #else
  154973. "lsl r6, r6, #16\n\t"
  154974. #endif
  154975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154976. "adds r4, r4, r6\n\t"
  154977. #else
  154978. "add r4, r4, r6\n\t"
  154979. #endif
  154980. #ifdef WOLFSSL_KEIL
  154981. "adcs r5, r5, r7\n\t"
  154982. #elif defined(__clang__)
  154983. "adcs r5, r7\n\t"
  154984. #else
  154985. "adc r5, r7\n\t"
  154986. #endif
  154987. #ifdef WOLFSSL_KEIL
  154988. "adcs r3, r3, %[r]\n\t"
  154989. #elif defined(__clang__)
  154990. "adcs r3, %[r]\n\t"
  154991. #else
  154992. "adc r3, %[r]\n\t"
  154993. #endif
  154994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154995. "lsrs r6, %[a], #16\n\t"
  154996. #else
  154997. "lsr r6, %[a], #16\n\t"
  154998. #endif
  154999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155000. "lsrs r7, %[b], #16\n\t"
  155001. #else
  155002. "lsr r7, %[b], #16\n\t"
  155003. #endif
  155004. #ifdef WOLFSSL_KEIL
  155005. "muls r7, r6, r7\n\t"
  155006. #elif defined(__clang__)
  155007. "muls r7, r6\n\t"
  155008. #else
  155009. "mul r7, r6\n\t"
  155010. #endif
  155011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155012. "adds r5, r5, r7\n\t"
  155013. #else
  155014. "add r5, r5, r7\n\t"
  155015. #endif
  155016. #ifdef WOLFSSL_KEIL
  155017. "adcs r3, r3, %[r]\n\t"
  155018. #elif defined(__clang__)
  155019. "adcs r3, %[r]\n\t"
  155020. #else
  155021. "adc r3, %[r]\n\t"
  155022. #endif
  155023. "uxth r7, %[b]\n\t"
  155024. #ifdef WOLFSSL_KEIL
  155025. "muls r6, r7, r6\n\t"
  155026. #elif defined(__clang__)
  155027. "muls r6, r7\n\t"
  155028. #else
  155029. "mul r6, r7\n\t"
  155030. #endif
  155031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155032. "lsrs r7, r6, #16\n\t"
  155033. #else
  155034. "lsr r7, r6, #16\n\t"
  155035. #endif
  155036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155037. "lsls r6, r6, #16\n\t"
  155038. #else
  155039. "lsl r6, r6, #16\n\t"
  155040. #endif
  155041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155042. "adds r4, r4, r6\n\t"
  155043. #else
  155044. "add r4, r4, r6\n\t"
  155045. #endif
  155046. #ifdef WOLFSSL_KEIL
  155047. "adcs r5, r5, r7\n\t"
  155048. #elif defined(__clang__)
  155049. "adcs r5, r7\n\t"
  155050. #else
  155051. "adc r5, r7\n\t"
  155052. #endif
  155053. #ifdef WOLFSSL_KEIL
  155054. "adcs r3, r3, %[r]\n\t"
  155055. #elif defined(__clang__)
  155056. "adcs r3, %[r]\n\t"
  155057. #else
  155058. "adc r3, %[r]\n\t"
  155059. #endif
  155060. "# A[5] * B[11]\n\t"
  155061. "mov %[a], r9\n\t"
  155062. "mov %[b], r10\n\t"
  155063. "ldr %[a], [%[a], #20]\n\t"
  155064. "ldr %[b], [%[b], #44]\n\t"
  155065. "uxth r6, %[a]\n\t"
  155066. "uxth r7, %[b]\n\t"
  155067. #ifdef WOLFSSL_KEIL
  155068. "muls r7, r6, r7\n\t"
  155069. #elif defined(__clang__)
  155070. "muls r7, r6\n\t"
  155071. #else
  155072. "mul r7, r6\n\t"
  155073. #endif
  155074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155075. "adds r4, r4, r7\n\t"
  155076. #else
  155077. "add r4, r4, r7\n\t"
  155078. #endif
  155079. #ifdef WOLFSSL_KEIL
  155080. "adcs r5, r5, %[r]\n\t"
  155081. #elif defined(__clang__)
  155082. "adcs r5, %[r]\n\t"
  155083. #else
  155084. "adc r5, %[r]\n\t"
  155085. #endif
  155086. #ifdef WOLFSSL_KEIL
  155087. "adcs r3, r3, %[r]\n\t"
  155088. #elif defined(__clang__)
  155089. "adcs r3, %[r]\n\t"
  155090. #else
  155091. "adc r3, %[r]\n\t"
  155092. #endif
  155093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155094. "lsrs r7, %[b], #16\n\t"
  155095. #else
  155096. "lsr r7, %[b], #16\n\t"
  155097. #endif
  155098. #ifdef WOLFSSL_KEIL
  155099. "muls r6, r7, r6\n\t"
  155100. #elif defined(__clang__)
  155101. "muls r6, r7\n\t"
  155102. #else
  155103. "mul r6, r7\n\t"
  155104. #endif
  155105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155106. "lsrs r7, r6, #16\n\t"
  155107. #else
  155108. "lsr r7, r6, #16\n\t"
  155109. #endif
  155110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155111. "lsls r6, r6, #16\n\t"
  155112. #else
  155113. "lsl r6, r6, #16\n\t"
  155114. #endif
  155115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155116. "adds r4, r4, r6\n\t"
  155117. #else
  155118. "add r4, r4, r6\n\t"
  155119. #endif
  155120. #ifdef WOLFSSL_KEIL
  155121. "adcs r5, r5, r7\n\t"
  155122. #elif defined(__clang__)
  155123. "adcs r5, r7\n\t"
  155124. #else
  155125. "adc r5, r7\n\t"
  155126. #endif
  155127. #ifdef WOLFSSL_KEIL
  155128. "adcs r3, r3, %[r]\n\t"
  155129. #elif defined(__clang__)
  155130. "adcs r3, %[r]\n\t"
  155131. #else
  155132. "adc r3, %[r]\n\t"
  155133. #endif
  155134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155135. "lsrs r6, %[a], #16\n\t"
  155136. #else
  155137. "lsr r6, %[a], #16\n\t"
  155138. #endif
  155139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155140. "lsrs r7, %[b], #16\n\t"
  155141. #else
  155142. "lsr r7, %[b], #16\n\t"
  155143. #endif
  155144. #ifdef WOLFSSL_KEIL
  155145. "muls r7, r6, r7\n\t"
  155146. #elif defined(__clang__)
  155147. "muls r7, r6\n\t"
  155148. #else
  155149. "mul r7, r6\n\t"
  155150. #endif
  155151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155152. "adds r5, r5, r7\n\t"
  155153. #else
  155154. "add r5, r5, r7\n\t"
  155155. #endif
  155156. #ifdef WOLFSSL_KEIL
  155157. "adcs r3, r3, %[r]\n\t"
  155158. #elif defined(__clang__)
  155159. "adcs r3, %[r]\n\t"
  155160. #else
  155161. "adc r3, %[r]\n\t"
  155162. #endif
  155163. "uxth r7, %[b]\n\t"
  155164. #ifdef WOLFSSL_KEIL
  155165. "muls r6, r7, r6\n\t"
  155166. #elif defined(__clang__)
  155167. "muls r6, r7\n\t"
  155168. #else
  155169. "mul r6, r7\n\t"
  155170. #endif
  155171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155172. "lsrs r7, r6, #16\n\t"
  155173. #else
  155174. "lsr r7, r6, #16\n\t"
  155175. #endif
  155176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155177. "lsls r6, r6, #16\n\t"
  155178. #else
  155179. "lsl r6, r6, #16\n\t"
  155180. #endif
  155181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155182. "adds r4, r4, r6\n\t"
  155183. #else
  155184. "add r4, r4, r6\n\t"
  155185. #endif
  155186. #ifdef WOLFSSL_KEIL
  155187. "adcs r5, r5, r7\n\t"
  155188. #elif defined(__clang__)
  155189. "adcs r5, r7\n\t"
  155190. #else
  155191. "adc r5, r7\n\t"
  155192. #endif
  155193. #ifdef WOLFSSL_KEIL
  155194. "adcs r3, r3, %[r]\n\t"
  155195. #elif defined(__clang__)
  155196. "adcs r3, %[r]\n\t"
  155197. #else
  155198. "adc r3, %[r]\n\t"
  155199. #endif
  155200. "# A[4] * B[12]\n\t"
  155201. "mov %[a], r9\n\t"
  155202. "mov %[b], r10\n\t"
  155203. "ldr %[a], [%[a], #16]\n\t"
  155204. "ldr %[b], [%[b], #48]\n\t"
  155205. "uxth r6, %[a]\n\t"
  155206. "uxth r7, %[b]\n\t"
  155207. #ifdef WOLFSSL_KEIL
  155208. "muls r7, r6, r7\n\t"
  155209. #elif defined(__clang__)
  155210. "muls r7, r6\n\t"
  155211. #else
  155212. "mul r7, r6\n\t"
  155213. #endif
  155214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155215. "adds r4, r4, r7\n\t"
  155216. #else
  155217. "add r4, r4, r7\n\t"
  155218. #endif
  155219. #ifdef WOLFSSL_KEIL
  155220. "adcs r5, r5, %[r]\n\t"
  155221. #elif defined(__clang__)
  155222. "adcs r5, %[r]\n\t"
  155223. #else
  155224. "adc r5, %[r]\n\t"
  155225. #endif
  155226. #ifdef WOLFSSL_KEIL
  155227. "adcs r3, r3, %[r]\n\t"
  155228. #elif defined(__clang__)
  155229. "adcs r3, %[r]\n\t"
  155230. #else
  155231. "adc r3, %[r]\n\t"
  155232. #endif
  155233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155234. "lsrs r7, %[b], #16\n\t"
  155235. #else
  155236. "lsr r7, %[b], #16\n\t"
  155237. #endif
  155238. #ifdef WOLFSSL_KEIL
  155239. "muls r6, r7, r6\n\t"
  155240. #elif defined(__clang__)
  155241. "muls r6, r7\n\t"
  155242. #else
  155243. "mul r6, r7\n\t"
  155244. #endif
  155245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155246. "lsrs r7, r6, #16\n\t"
  155247. #else
  155248. "lsr r7, r6, #16\n\t"
  155249. #endif
  155250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155251. "lsls r6, r6, #16\n\t"
  155252. #else
  155253. "lsl r6, r6, #16\n\t"
  155254. #endif
  155255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155256. "adds r4, r4, r6\n\t"
  155257. #else
  155258. "add r4, r4, r6\n\t"
  155259. #endif
  155260. #ifdef WOLFSSL_KEIL
  155261. "adcs r5, r5, r7\n\t"
  155262. #elif defined(__clang__)
  155263. "adcs r5, r7\n\t"
  155264. #else
  155265. "adc r5, r7\n\t"
  155266. #endif
  155267. #ifdef WOLFSSL_KEIL
  155268. "adcs r3, r3, %[r]\n\t"
  155269. #elif defined(__clang__)
  155270. "adcs r3, %[r]\n\t"
  155271. #else
  155272. "adc r3, %[r]\n\t"
  155273. #endif
  155274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155275. "lsrs r6, %[a], #16\n\t"
  155276. #else
  155277. "lsr r6, %[a], #16\n\t"
  155278. #endif
  155279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155280. "lsrs r7, %[b], #16\n\t"
  155281. #else
  155282. "lsr r7, %[b], #16\n\t"
  155283. #endif
  155284. #ifdef WOLFSSL_KEIL
  155285. "muls r7, r6, r7\n\t"
  155286. #elif defined(__clang__)
  155287. "muls r7, r6\n\t"
  155288. #else
  155289. "mul r7, r6\n\t"
  155290. #endif
  155291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155292. "adds r5, r5, r7\n\t"
  155293. #else
  155294. "add r5, r5, r7\n\t"
  155295. #endif
  155296. #ifdef WOLFSSL_KEIL
  155297. "adcs r3, r3, %[r]\n\t"
  155298. #elif defined(__clang__)
  155299. "adcs r3, %[r]\n\t"
  155300. #else
  155301. "adc r3, %[r]\n\t"
  155302. #endif
  155303. "uxth r7, %[b]\n\t"
  155304. #ifdef WOLFSSL_KEIL
  155305. "muls r6, r7, r6\n\t"
  155306. #elif defined(__clang__)
  155307. "muls r6, r7\n\t"
  155308. #else
  155309. "mul r6, r7\n\t"
  155310. #endif
  155311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155312. "lsrs r7, r6, #16\n\t"
  155313. #else
  155314. "lsr r7, r6, #16\n\t"
  155315. #endif
  155316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155317. "lsls r6, r6, #16\n\t"
  155318. #else
  155319. "lsl r6, r6, #16\n\t"
  155320. #endif
  155321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155322. "adds r4, r4, r6\n\t"
  155323. #else
  155324. "add r4, r4, r6\n\t"
  155325. #endif
  155326. #ifdef WOLFSSL_KEIL
  155327. "adcs r5, r5, r7\n\t"
  155328. #elif defined(__clang__)
  155329. "adcs r5, r7\n\t"
  155330. #else
  155331. "adc r5, r7\n\t"
  155332. #endif
  155333. #ifdef WOLFSSL_KEIL
  155334. "adcs r3, r3, %[r]\n\t"
  155335. #elif defined(__clang__)
  155336. "adcs r3, %[r]\n\t"
  155337. #else
  155338. "adc r3, %[r]\n\t"
  155339. #endif
  155340. "# A[3] * B[13]\n\t"
  155341. "mov %[a], r9\n\t"
  155342. "mov %[b], r10\n\t"
  155343. "ldr %[a], [%[a], #12]\n\t"
  155344. "ldr %[b], [%[b], #52]\n\t"
  155345. "uxth r6, %[a]\n\t"
  155346. "uxth r7, %[b]\n\t"
  155347. #ifdef WOLFSSL_KEIL
  155348. "muls r7, r6, r7\n\t"
  155349. #elif defined(__clang__)
  155350. "muls r7, r6\n\t"
  155351. #else
  155352. "mul r7, r6\n\t"
  155353. #endif
  155354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155355. "adds r4, r4, r7\n\t"
  155356. #else
  155357. "add r4, r4, r7\n\t"
  155358. #endif
  155359. #ifdef WOLFSSL_KEIL
  155360. "adcs r5, r5, %[r]\n\t"
  155361. #elif defined(__clang__)
  155362. "adcs r5, %[r]\n\t"
  155363. #else
  155364. "adc r5, %[r]\n\t"
  155365. #endif
  155366. #ifdef WOLFSSL_KEIL
  155367. "adcs r3, r3, %[r]\n\t"
  155368. #elif defined(__clang__)
  155369. "adcs r3, %[r]\n\t"
  155370. #else
  155371. "adc r3, %[r]\n\t"
  155372. #endif
  155373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155374. "lsrs r7, %[b], #16\n\t"
  155375. #else
  155376. "lsr r7, %[b], #16\n\t"
  155377. #endif
  155378. #ifdef WOLFSSL_KEIL
  155379. "muls r6, r7, r6\n\t"
  155380. #elif defined(__clang__)
  155381. "muls r6, r7\n\t"
  155382. #else
  155383. "mul r6, r7\n\t"
  155384. #endif
  155385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155386. "lsrs r7, r6, #16\n\t"
  155387. #else
  155388. "lsr r7, r6, #16\n\t"
  155389. #endif
  155390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155391. "lsls r6, r6, #16\n\t"
  155392. #else
  155393. "lsl r6, r6, #16\n\t"
  155394. #endif
  155395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155396. "adds r4, r4, r6\n\t"
  155397. #else
  155398. "add r4, r4, r6\n\t"
  155399. #endif
  155400. #ifdef WOLFSSL_KEIL
  155401. "adcs r5, r5, r7\n\t"
  155402. #elif defined(__clang__)
  155403. "adcs r5, r7\n\t"
  155404. #else
  155405. "adc r5, r7\n\t"
  155406. #endif
  155407. #ifdef WOLFSSL_KEIL
  155408. "adcs r3, r3, %[r]\n\t"
  155409. #elif defined(__clang__)
  155410. "adcs r3, %[r]\n\t"
  155411. #else
  155412. "adc r3, %[r]\n\t"
  155413. #endif
  155414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155415. "lsrs r6, %[a], #16\n\t"
  155416. #else
  155417. "lsr r6, %[a], #16\n\t"
  155418. #endif
  155419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155420. "lsrs r7, %[b], #16\n\t"
  155421. #else
  155422. "lsr r7, %[b], #16\n\t"
  155423. #endif
  155424. #ifdef WOLFSSL_KEIL
  155425. "muls r7, r6, r7\n\t"
  155426. #elif defined(__clang__)
  155427. "muls r7, r6\n\t"
  155428. #else
  155429. "mul r7, r6\n\t"
  155430. #endif
  155431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155432. "adds r5, r5, r7\n\t"
  155433. #else
  155434. "add r5, r5, r7\n\t"
  155435. #endif
  155436. #ifdef WOLFSSL_KEIL
  155437. "adcs r3, r3, %[r]\n\t"
  155438. #elif defined(__clang__)
  155439. "adcs r3, %[r]\n\t"
  155440. #else
  155441. "adc r3, %[r]\n\t"
  155442. #endif
  155443. "uxth r7, %[b]\n\t"
  155444. #ifdef WOLFSSL_KEIL
  155445. "muls r6, r7, r6\n\t"
  155446. #elif defined(__clang__)
  155447. "muls r6, r7\n\t"
  155448. #else
  155449. "mul r6, r7\n\t"
  155450. #endif
  155451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155452. "lsrs r7, r6, #16\n\t"
  155453. #else
  155454. "lsr r7, r6, #16\n\t"
  155455. #endif
  155456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155457. "lsls r6, r6, #16\n\t"
  155458. #else
  155459. "lsl r6, r6, #16\n\t"
  155460. #endif
  155461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155462. "adds r4, r4, r6\n\t"
  155463. #else
  155464. "add r4, r4, r6\n\t"
  155465. #endif
  155466. #ifdef WOLFSSL_KEIL
  155467. "adcs r5, r5, r7\n\t"
  155468. #elif defined(__clang__)
  155469. "adcs r5, r7\n\t"
  155470. #else
  155471. "adc r5, r7\n\t"
  155472. #endif
  155473. #ifdef WOLFSSL_KEIL
  155474. "adcs r3, r3, %[r]\n\t"
  155475. #elif defined(__clang__)
  155476. "adcs r3, %[r]\n\t"
  155477. #else
  155478. "adc r3, %[r]\n\t"
  155479. #endif
  155480. "# A[2] * B[14]\n\t"
  155481. "mov %[a], r9\n\t"
  155482. "mov %[b], r10\n\t"
  155483. "ldr %[a], [%[a], #8]\n\t"
  155484. "ldr %[b], [%[b], #56]\n\t"
  155485. "uxth r6, %[a]\n\t"
  155486. "uxth r7, %[b]\n\t"
  155487. #ifdef WOLFSSL_KEIL
  155488. "muls r7, r6, r7\n\t"
  155489. #elif defined(__clang__)
  155490. "muls r7, r6\n\t"
  155491. #else
  155492. "mul r7, r6\n\t"
  155493. #endif
  155494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155495. "adds r4, r4, r7\n\t"
  155496. #else
  155497. "add r4, r4, r7\n\t"
  155498. #endif
  155499. #ifdef WOLFSSL_KEIL
  155500. "adcs r5, r5, %[r]\n\t"
  155501. #elif defined(__clang__)
  155502. "adcs r5, %[r]\n\t"
  155503. #else
  155504. "adc r5, %[r]\n\t"
  155505. #endif
  155506. #ifdef WOLFSSL_KEIL
  155507. "adcs r3, r3, %[r]\n\t"
  155508. #elif defined(__clang__)
  155509. "adcs r3, %[r]\n\t"
  155510. #else
  155511. "adc r3, %[r]\n\t"
  155512. #endif
  155513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155514. "lsrs r7, %[b], #16\n\t"
  155515. #else
  155516. "lsr r7, %[b], #16\n\t"
  155517. #endif
  155518. #ifdef WOLFSSL_KEIL
  155519. "muls r6, r7, r6\n\t"
  155520. #elif defined(__clang__)
  155521. "muls r6, r7\n\t"
  155522. #else
  155523. "mul r6, r7\n\t"
  155524. #endif
  155525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155526. "lsrs r7, r6, #16\n\t"
  155527. #else
  155528. "lsr r7, r6, #16\n\t"
  155529. #endif
  155530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155531. "lsls r6, r6, #16\n\t"
  155532. #else
  155533. "lsl r6, r6, #16\n\t"
  155534. #endif
  155535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155536. "adds r4, r4, r6\n\t"
  155537. #else
  155538. "add r4, r4, r6\n\t"
  155539. #endif
  155540. #ifdef WOLFSSL_KEIL
  155541. "adcs r5, r5, r7\n\t"
  155542. #elif defined(__clang__)
  155543. "adcs r5, r7\n\t"
  155544. #else
  155545. "adc r5, r7\n\t"
  155546. #endif
  155547. #ifdef WOLFSSL_KEIL
  155548. "adcs r3, r3, %[r]\n\t"
  155549. #elif defined(__clang__)
  155550. "adcs r3, %[r]\n\t"
  155551. #else
  155552. "adc r3, %[r]\n\t"
  155553. #endif
  155554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155555. "lsrs r6, %[a], #16\n\t"
  155556. #else
  155557. "lsr r6, %[a], #16\n\t"
  155558. #endif
  155559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155560. "lsrs r7, %[b], #16\n\t"
  155561. #else
  155562. "lsr r7, %[b], #16\n\t"
  155563. #endif
  155564. #ifdef WOLFSSL_KEIL
  155565. "muls r7, r6, r7\n\t"
  155566. #elif defined(__clang__)
  155567. "muls r7, r6\n\t"
  155568. #else
  155569. "mul r7, r6\n\t"
  155570. #endif
  155571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155572. "adds r5, r5, r7\n\t"
  155573. #else
  155574. "add r5, r5, r7\n\t"
  155575. #endif
  155576. #ifdef WOLFSSL_KEIL
  155577. "adcs r3, r3, %[r]\n\t"
  155578. #elif defined(__clang__)
  155579. "adcs r3, %[r]\n\t"
  155580. #else
  155581. "adc r3, %[r]\n\t"
  155582. #endif
  155583. "uxth r7, %[b]\n\t"
  155584. #ifdef WOLFSSL_KEIL
  155585. "muls r6, r7, r6\n\t"
  155586. #elif defined(__clang__)
  155587. "muls r6, r7\n\t"
  155588. #else
  155589. "mul r6, r7\n\t"
  155590. #endif
  155591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155592. "lsrs r7, r6, #16\n\t"
  155593. #else
  155594. "lsr r7, r6, #16\n\t"
  155595. #endif
  155596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155597. "lsls r6, r6, #16\n\t"
  155598. #else
  155599. "lsl r6, r6, #16\n\t"
  155600. #endif
  155601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155602. "adds r4, r4, r6\n\t"
  155603. #else
  155604. "add r4, r4, r6\n\t"
  155605. #endif
  155606. #ifdef WOLFSSL_KEIL
  155607. "adcs r5, r5, r7\n\t"
  155608. #elif defined(__clang__)
  155609. "adcs r5, r7\n\t"
  155610. #else
  155611. "adc r5, r7\n\t"
  155612. #endif
  155613. #ifdef WOLFSSL_KEIL
  155614. "adcs r3, r3, %[r]\n\t"
  155615. #elif defined(__clang__)
  155616. "adcs r3, %[r]\n\t"
  155617. #else
  155618. "adc r3, %[r]\n\t"
  155619. #endif
  155620. "# A[1] * B[15]\n\t"
  155621. "mov %[a], r9\n\t"
  155622. "mov %[b], r10\n\t"
  155623. "ldr %[a], [%[a], #4]\n\t"
  155624. "ldr %[b], [%[b], #60]\n\t"
  155625. "uxth r6, %[a]\n\t"
  155626. "uxth r7, %[b]\n\t"
  155627. #ifdef WOLFSSL_KEIL
  155628. "muls r7, r6, r7\n\t"
  155629. #elif defined(__clang__)
  155630. "muls r7, r6\n\t"
  155631. #else
  155632. "mul r7, r6\n\t"
  155633. #endif
  155634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155635. "adds r4, r4, r7\n\t"
  155636. #else
  155637. "add r4, r4, r7\n\t"
  155638. #endif
  155639. #ifdef WOLFSSL_KEIL
  155640. "adcs r5, r5, %[r]\n\t"
  155641. #elif defined(__clang__)
  155642. "adcs r5, %[r]\n\t"
  155643. #else
  155644. "adc r5, %[r]\n\t"
  155645. #endif
  155646. #ifdef WOLFSSL_KEIL
  155647. "adcs r3, r3, %[r]\n\t"
  155648. #elif defined(__clang__)
  155649. "adcs r3, %[r]\n\t"
  155650. #else
  155651. "adc r3, %[r]\n\t"
  155652. #endif
  155653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155654. "lsrs r7, %[b], #16\n\t"
  155655. #else
  155656. "lsr r7, %[b], #16\n\t"
  155657. #endif
  155658. #ifdef WOLFSSL_KEIL
  155659. "muls r6, r7, r6\n\t"
  155660. #elif defined(__clang__)
  155661. "muls r6, r7\n\t"
  155662. #else
  155663. "mul r6, r7\n\t"
  155664. #endif
  155665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155666. "lsrs r7, r6, #16\n\t"
  155667. #else
  155668. "lsr r7, r6, #16\n\t"
  155669. #endif
  155670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155671. "lsls r6, r6, #16\n\t"
  155672. #else
  155673. "lsl r6, r6, #16\n\t"
  155674. #endif
  155675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155676. "adds r4, r4, r6\n\t"
  155677. #else
  155678. "add r4, r4, r6\n\t"
  155679. #endif
  155680. #ifdef WOLFSSL_KEIL
  155681. "adcs r5, r5, r7\n\t"
  155682. #elif defined(__clang__)
  155683. "adcs r5, r7\n\t"
  155684. #else
  155685. "adc r5, r7\n\t"
  155686. #endif
  155687. #ifdef WOLFSSL_KEIL
  155688. "adcs r3, r3, %[r]\n\t"
  155689. #elif defined(__clang__)
  155690. "adcs r3, %[r]\n\t"
  155691. #else
  155692. "adc r3, %[r]\n\t"
  155693. #endif
  155694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155695. "lsrs r6, %[a], #16\n\t"
  155696. #else
  155697. "lsr r6, %[a], #16\n\t"
  155698. #endif
  155699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155700. "lsrs r7, %[b], #16\n\t"
  155701. #else
  155702. "lsr r7, %[b], #16\n\t"
  155703. #endif
  155704. #ifdef WOLFSSL_KEIL
  155705. "muls r7, r6, r7\n\t"
  155706. #elif defined(__clang__)
  155707. "muls r7, r6\n\t"
  155708. #else
  155709. "mul r7, r6\n\t"
  155710. #endif
  155711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155712. "adds r5, r5, r7\n\t"
  155713. #else
  155714. "add r5, r5, r7\n\t"
  155715. #endif
  155716. #ifdef WOLFSSL_KEIL
  155717. "adcs r3, r3, %[r]\n\t"
  155718. #elif defined(__clang__)
  155719. "adcs r3, %[r]\n\t"
  155720. #else
  155721. "adc r3, %[r]\n\t"
  155722. #endif
  155723. "uxth r7, %[b]\n\t"
  155724. #ifdef WOLFSSL_KEIL
  155725. "muls r6, r7, r6\n\t"
  155726. #elif defined(__clang__)
  155727. "muls r6, r7\n\t"
  155728. #else
  155729. "mul r6, r7\n\t"
  155730. #endif
  155731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155732. "lsrs r7, r6, #16\n\t"
  155733. #else
  155734. "lsr r7, r6, #16\n\t"
  155735. #endif
  155736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155737. "lsls r6, r6, #16\n\t"
  155738. #else
  155739. "lsl r6, r6, #16\n\t"
  155740. #endif
  155741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155742. "adds r4, r4, r6\n\t"
  155743. #else
  155744. "add r4, r4, r6\n\t"
  155745. #endif
  155746. #ifdef WOLFSSL_KEIL
  155747. "adcs r5, r5, r7\n\t"
  155748. #elif defined(__clang__)
  155749. "adcs r5, r7\n\t"
  155750. #else
  155751. "adc r5, r7\n\t"
  155752. #endif
  155753. #ifdef WOLFSSL_KEIL
  155754. "adcs r3, r3, %[r]\n\t"
  155755. #elif defined(__clang__)
  155756. "adcs r3, %[r]\n\t"
  155757. #else
  155758. "adc r3, %[r]\n\t"
  155759. #endif
  155760. "mov %[r], r8\n\t"
  155761. "str r4, [%[r], #64]\n\t"
  155762. "movs %[r], #0\n\t"
  155763. "# A[2] * B[15]\n\t"
  155764. "movs r4, #0\n\t"
  155765. "mov %[a], r9\n\t"
  155766. "mov %[b], r10\n\t"
  155767. "ldr %[a], [%[a], #8]\n\t"
  155768. "ldr %[b], [%[b], #60]\n\t"
  155769. "uxth r6, %[a]\n\t"
  155770. "uxth r7, %[b]\n\t"
  155771. #ifdef WOLFSSL_KEIL
  155772. "muls r7, r6, r7\n\t"
  155773. #elif defined(__clang__)
  155774. "muls r7, r6\n\t"
  155775. #else
  155776. "mul r7, r6\n\t"
  155777. #endif
  155778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155779. "adds r5, r5, r7\n\t"
  155780. #else
  155781. "add r5, r5, r7\n\t"
  155782. #endif
  155783. #ifdef WOLFSSL_KEIL
  155784. "adcs r3, r3, %[r]\n\t"
  155785. #elif defined(__clang__)
  155786. "adcs r3, %[r]\n\t"
  155787. #else
  155788. "adc r3, %[r]\n\t"
  155789. #endif
  155790. #ifdef WOLFSSL_KEIL
  155791. "adcs r4, r4, %[r]\n\t"
  155792. #elif defined(__clang__)
  155793. "adcs r4, %[r]\n\t"
  155794. #else
  155795. "adc r4, %[r]\n\t"
  155796. #endif
  155797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155798. "lsrs r7, %[b], #16\n\t"
  155799. #else
  155800. "lsr r7, %[b], #16\n\t"
  155801. #endif
  155802. #ifdef WOLFSSL_KEIL
  155803. "muls r6, r7, r6\n\t"
  155804. #elif defined(__clang__)
  155805. "muls r6, r7\n\t"
  155806. #else
  155807. "mul r6, r7\n\t"
  155808. #endif
  155809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155810. "lsrs r7, r6, #16\n\t"
  155811. #else
  155812. "lsr r7, r6, #16\n\t"
  155813. #endif
  155814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155815. "lsls r6, r6, #16\n\t"
  155816. #else
  155817. "lsl r6, r6, #16\n\t"
  155818. #endif
  155819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155820. "adds r5, r5, r6\n\t"
  155821. #else
  155822. "add r5, r5, r6\n\t"
  155823. #endif
  155824. #ifdef WOLFSSL_KEIL
  155825. "adcs r3, r3, r7\n\t"
  155826. #elif defined(__clang__)
  155827. "adcs r3, r7\n\t"
  155828. #else
  155829. "adc r3, r7\n\t"
  155830. #endif
  155831. #ifdef WOLFSSL_KEIL
  155832. "adcs r4, r4, %[r]\n\t"
  155833. #elif defined(__clang__)
  155834. "adcs r4, %[r]\n\t"
  155835. #else
  155836. "adc r4, %[r]\n\t"
  155837. #endif
  155838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155839. "lsrs r6, %[a], #16\n\t"
  155840. #else
  155841. "lsr r6, %[a], #16\n\t"
  155842. #endif
  155843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155844. "lsrs r7, %[b], #16\n\t"
  155845. #else
  155846. "lsr r7, %[b], #16\n\t"
  155847. #endif
  155848. #ifdef WOLFSSL_KEIL
  155849. "muls r7, r6, r7\n\t"
  155850. #elif defined(__clang__)
  155851. "muls r7, r6\n\t"
  155852. #else
  155853. "mul r7, r6\n\t"
  155854. #endif
  155855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155856. "adds r3, r3, r7\n\t"
  155857. #else
  155858. "add r3, r3, r7\n\t"
  155859. #endif
  155860. #ifdef WOLFSSL_KEIL
  155861. "adcs r4, r4, %[r]\n\t"
  155862. #elif defined(__clang__)
  155863. "adcs r4, %[r]\n\t"
  155864. #else
  155865. "adc r4, %[r]\n\t"
  155866. #endif
  155867. "uxth r7, %[b]\n\t"
  155868. #ifdef WOLFSSL_KEIL
  155869. "muls r6, r7, r6\n\t"
  155870. #elif defined(__clang__)
  155871. "muls r6, r7\n\t"
  155872. #else
  155873. "mul r6, r7\n\t"
  155874. #endif
  155875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155876. "lsrs r7, r6, #16\n\t"
  155877. #else
  155878. "lsr r7, r6, #16\n\t"
  155879. #endif
  155880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155881. "lsls r6, r6, #16\n\t"
  155882. #else
  155883. "lsl r6, r6, #16\n\t"
  155884. #endif
  155885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155886. "adds r5, r5, r6\n\t"
  155887. #else
  155888. "add r5, r5, r6\n\t"
  155889. #endif
  155890. #ifdef WOLFSSL_KEIL
  155891. "adcs r3, r3, r7\n\t"
  155892. #elif defined(__clang__)
  155893. "adcs r3, r7\n\t"
  155894. #else
  155895. "adc r3, r7\n\t"
  155896. #endif
  155897. #ifdef WOLFSSL_KEIL
  155898. "adcs r4, r4, %[r]\n\t"
  155899. #elif defined(__clang__)
  155900. "adcs r4, %[r]\n\t"
  155901. #else
  155902. "adc r4, %[r]\n\t"
  155903. #endif
  155904. "# A[3] * B[14]\n\t"
  155905. "mov %[a], r9\n\t"
  155906. "mov %[b], r10\n\t"
  155907. "ldr %[a], [%[a], #12]\n\t"
  155908. "ldr %[b], [%[b], #56]\n\t"
  155909. "uxth r6, %[a]\n\t"
  155910. "uxth r7, %[b]\n\t"
  155911. #ifdef WOLFSSL_KEIL
  155912. "muls r7, r6, r7\n\t"
  155913. #elif defined(__clang__)
  155914. "muls r7, r6\n\t"
  155915. #else
  155916. "mul r7, r6\n\t"
  155917. #endif
  155918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155919. "adds r5, r5, r7\n\t"
  155920. #else
  155921. "add r5, r5, r7\n\t"
  155922. #endif
  155923. #ifdef WOLFSSL_KEIL
  155924. "adcs r3, r3, %[r]\n\t"
  155925. #elif defined(__clang__)
  155926. "adcs r3, %[r]\n\t"
  155927. #else
  155928. "adc r3, %[r]\n\t"
  155929. #endif
  155930. #ifdef WOLFSSL_KEIL
  155931. "adcs r4, r4, %[r]\n\t"
  155932. #elif defined(__clang__)
  155933. "adcs r4, %[r]\n\t"
  155934. #else
  155935. "adc r4, %[r]\n\t"
  155936. #endif
  155937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155938. "lsrs r7, %[b], #16\n\t"
  155939. #else
  155940. "lsr r7, %[b], #16\n\t"
  155941. #endif
  155942. #ifdef WOLFSSL_KEIL
  155943. "muls r6, r7, r6\n\t"
  155944. #elif defined(__clang__)
  155945. "muls r6, r7\n\t"
  155946. #else
  155947. "mul r6, r7\n\t"
  155948. #endif
  155949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155950. "lsrs r7, r6, #16\n\t"
  155951. #else
  155952. "lsr r7, r6, #16\n\t"
  155953. #endif
  155954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155955. "lsls r6, r6, #16\n\t"
  155956. #else
  155957. "lsl r6, r6, #16\n\t"
  155958. #endif
  155959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155960. "adds r5, r5, r6\n\t"
  155961. #else
  155962. "add r5, r5, r6\n\t"
  155963. #endif
  155964. #ifdef WOLFSSL_KEIL
  155965. "adcs r3, r3, r7\n\t"
  155966. #elif defined(__clang__)
  155967. "adcs r3, r7\n\t"
  155968. #else
  155969. "adc r3, r7\n\t"
  155970. #endif
  155971. #ifdef WOLFSSL_KEIL
  155972. "adcs r4, r4, %[r]\n\t"
  155973. #elif defined(__clang__)
  155974. "adcs r4, %[r]\n\t"
  155975. #else
  155976. "adc r4, %[r]\n\t"
  155977. #endif
  155978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155979. "lsrs r6, %[a], #16\n\t"
  155980. #else
  155981. "lsr r6, %[a], #16\n\t"
  155982. #endif
  155983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155984. "lsrs r7, %[b], #16\n\t"
  155985. #else
  155986. "lsr r7, %[b], #16\n\t"
  155987. #endif
  155988. #ifdef WOLFSSL_KEIL
  155989. "muls r7, r6, r7\n\t"
  155990. #elif defined(__clang__)
  155991. "muls r7, r6\n\t"
  155992. #else
  155993. "mul r7, r6\n\t"
  155994. #endif
  155995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155996. "adds r3, r3, r7\n\t"
  155997. #else
  155998. "add r3, r3, r7\n\t"
  155999. #endif
  156000. #ifdef WOLFSSL_KEIL
  156001. "adcs r4, r4, %[r]\n\t"
  156002. #elif defined(__clang__)
  156003. "adcs r4, %[r]\n\t"
  156004. #else
  156005. "adc r4, %[r]\n\t"
  156006. #endif
  156007. "uxth r7, %[b]\n\t"
  156008. #ifdef WOLFSSL_KEIL
  156009. "muls r6, r7, r6\n\t"
  156010. #elif defined(__clang__)
  156011. "muls r6, r7\n\t"
  156012. #else
  156013. "mul r6, r7\n\t"
  156014. #endif
  156015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156016. "lsrs r7, r6, #16\n\t"
  156017. #else
  156018. "lsr r7, r6, #16\n\t"
  156019. #endif
  156020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156021. "lsls r6, r6, #16\n\t"
  156022. #else
  156023. "lsl r6, r6, #16\n\t"
  156024. #endif
  156025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156026. "adds r5, r5, r6\n\t"
  156027. #else
  156028. "add r5, r5, r6\n\t"
  156029. #endif
  156030. #ifdef WOLFSSL_KEIL
  156031. "adcs r3, r3, r7\n\t"
  156032. #elif defined(__clang__)
  156033. "adcs r3, r7\n\t"
  156034. #else
  156035. "adc r3, r7\n\t"
  156036. #endif
  156037. #ifdef WOLFSSL_KEIL
  156038. "adcs r4, r4, %[r]\n\t"
  156039. #elif defined(__clang__)
  156040. "adcs r4, %[r]\n\t"
  156041. #else
  156042. "adc r4, %[r]\n\t"
  156043. #endif
  156044. "# A[4] * B[13]\n\t"
  156045. "mov %[a], r9\n\t"
  156046. "mov %[b], r10\n\t"
  156047. "ldr %[a], [%[a], #16]\n\t"
  156048. "ldr %[b], [%[b], #52]\n\t"
  156049. "uxth r6, %[a]\n\t"
  156050. "uxth r7, %[b]\n\t"
  156051. #ifdef WOLFSSL_KEIL
  156052. "muls r7, r6, r7\n\t"
  156053. #elif defined(__clang__)
  156054. "muls r7, r6\n\t"
  156055. #else
  156056. "mul r7, r6\n\t"
  156057. #endif
  156058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156059. "adds r5, r5, r7\n\t"
  156060. #else
  156061. "add r5, r5, r7\n\t"
  156062. #endif
  156063. #ifdef WOLFSSL_KEIL
  156064. "adcs r3, r3, %[r]\n\t"
  156065. #elif defined(__clang__)
  156066. "adcs r3, %[r]\n\t"
  156067. #else
  156068. "adc r3, %[r]\n\t"
  156069. #endif
  156070. #ifdef WOLFSSL_KEIL
  156071. "adcs r4, r4, %[r]\n\t"
  156072. #elif defined(__clang__)
  156073. "adcs r4, %[r]\n\t"
  156074. #else
  156075. "adc r4, %[r]\n\t"
  156076. #endif
  156077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156078. "lsrs r7, %[b], #16\n\t"
  156079. #else
  156080. "lsr r7, %[b], #16\n\t"
  156081. #endif
  156082. #ifdef WOLFSSL_KEIL
  156083. "muls r6, r7, r6\n\t"
  156084. #elif defined(__clang__)
  156085. "muls r6, r7\n\t"
  156086. #else
  156087. "mul r6, r7\n\t"
  156088. #endif
  156089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156090. "lsrs r7, r6, #16\n\t"
  156091. #else
  156092. "lsr r7, r6, #16\n\t"
  156093. #endif
  156094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156095. "lsls r6, r6, #16\n\t"
  156096. #else
  156097. "lsl r6, r6, #16\n\t"
  156098. #endif
  156099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156100. "adds r5, r5, r6\n\t"
  156101. #else
  156102. "add r5, r5, r6\n\t"
  156103. #endif
  156104. #ifdef WOLFSSL_KEIL
  156105. "adcs r3, r3, r7\n\t"
  156106. #elif defined(__clang__)
  156107. "adcs r3, r7\n\t"
  156108. #else
  156109. "adc r3, r7\n\t"
  156110. #endif
  156111. #ifdef WOLFSSL_KEIL
  156112. "adcs r4, r4, %[r]\n\t"
  156113. #elif defined(__clang__)
  156114. "adcs r4, %[r]\n\t"
  156115. #else
  156116. "adc r4, %[r]\n\t"
  156117. #endif
  156118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156119. "lsrs r6, %[a], #16\n\t"
  156120. #else
  156121. "lsr r6, %[a], #16\n\t"
  156122. #endif
  156123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156124. "lsrs r7, %[b], #16\n\t"
  156125. #else
  156126. "lsr r7, %[b], #16\n\t"
  156127. #endif
  156128. #ifdef WOLFSSL_KEIL
  156129. "muls r7, r6, r7\n\t"
  156130. #elif defined(__clang__)
  156131. "muls r7, r6\n\t"
  156132. #else
  156133. "mul r7, r6\n\t"
  156134. #endif
  156135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156136. "adds r3, r3, r7\n\t"
  156137. #else
  156138. "add r3, r3, r7\n\t"
  156139. #endif
  156140. #ifdef WOLFSSL_KEIL
  156141. "adcs r4, r4, %[r]\n\t"
  156142. #elif defined(__clang__)
  156143. "adcs r4, %[r]\n\t"
  156144. #else
  156145. "adc r4, %[r]\n\t"
  156146. #endif
  156147. "uxth r7, %[b]\n\t"
  156148. #ifdef WOLFSSL_KEIL
  156149. "muls r6, r7, r6\n\t"
  156150. #elif defined(__clang__)
  156151. "muls r6, r7\n\t"
  156152. #else
  156153. "mul r6, r7\n\t"
  156154. #endif
  156155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156156. "lsrs r7, r6, #16\n\t"
  156157. #else
  156158. "lsr r7, r6, #16\n\t"
  156159. #endif
  156160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156161. "lsls r6, r6, #16\n\t"
  156162. #else
  156163. "lsl r6, r6, #16\n\t"
  156164. #endif
  156165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156166. "adds r5, r5, r6\n\t"
  156167. #else
  156168. "add r5, r5, r6\n\t"
  156169. #endif
  156170. #ifdef WOLFSSL_KEIL
  156171. "adcs r3, r3, r7\n\t"
  156172. #elif defined(__clang__)
  156173. "adcs r3, r7\n\t"
  156174. #else
  156175. "adc r3, r7\n\t"
  156176. #endif
  156177. #ifdef WOLFSSL_KEIL
  156178. "adcs r4, r4, %[r]\n\t"
  156179. #elif defined(__clang__)
  156180. "adcs r4, %[r]\n\t"
  156181. #else
  156182. "adc r4, %[r]\n\t"
  156183. #endif
  156184. "# A[5] * B[12]\n\t"
  156185. "mov %[a], r9\n\t"
  156186. "mov %[b], r10\n\t"
  156187. "ldr %[a], [%[a], #20]\n\t"
  156188. "ldr %[b], [%[b], #48]\n\t"
  156189. "uxth r6, %[a]\n\t"
  156190. "uxth r7, %[b]\n\t"
  156191. #ifdef WOLFSSL_KEIL
  156192. "muls r7, r6, r7\n\t"
  156193. #elif defined(__clang__)
  156194. "muls r7, r6\n\t"
  156195. #else
  156196. "mul r7, r6\n\t"
  156197. #endif
  156198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156199. "adds r5, r5, r7\n\t"
  156200. #else
  156201. "add r5, r5, r7\n\t"
  156202. #endif
  156203. #ifdef WOLFSSL_KEIL
  156204. "adcs r3, r3, %[r]\n\t"
  156205. #elif defined(__clang__)
  156206. "adcs r3, %[r]\n\t"
  156207. #else
  156208. "adc r3, %[r]\n\t"
  156209. #endif
  156210. #ifdef WOLFSSL_KEIL
  156211. "adcs r4, r4, %[r]\n\t"
  156212. #elif defined(__clang__)
  156213. "adcs r4, %[r]\n\t"
  156214. #else
  156215. "adc r4, %[r]\n\t"
  156216. #endif
  156217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156218. "lsrs r7, %[b], #16\n\t"
  156219. #else
  156220. "lsr r7, %[b], #16\n\t"
  156221. #endif
  156222. #ifdef WOLFSSL_KEIL
  156223. "muls r6, r7, r6\n\t"
  156224. #elif defined(__clang__)
  156225. "muls r6, r7\n\t"
  156226. #else
  156227. "mul r6, r7\n\t"
  156228. #endif
  156229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156230. "lsrs r7, r6, #16\n\t"
  156231. #else
  156232. "lsr r7, r6, #16\n\t"
  156233. #endif
  156234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156235. "lsls r6, r6, #16\n\t"
  156236. #else
  156237. "lsl r6, r6, #16\n\t"
  156238. #endif
  156239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156240. "adds r5, r5, r6\n\t"
  156241. #else
  156242. "add r5, r5, r6\n\t"
  156243. #endif
  156244. #ifdef WOLFSSL_KEIL
  156245. "adcs r3, r3, r7\n\t"
  156246. #elif defined(__clang__)
  156247. "adcs r3, r7\n\t"
  156248. #else
  156249. "adc r3, r7\n\t"
  156250. #endif
  156251. #ifdef WOLFSSL_KEIL
  156252. "adcs r4, r4, %[r]\n\t"
  156253. #elif defined(__clang__)
  156254. "adcs r4, %[r]\n\t"
  156255. #else
  156256. "adc r4, %[r]\n\t"
  156257. #endif
  156258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156259. "lsrs r6, %[a], #16\n\t"
  156260. #else
  156261. "lsr r6, %[a], #16\n\t"
  156262. #endif
  156263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156264. "lsrs r7, %[b], #16\n\t"
  156265. #else
  156266. "lsr r7, %[b], #16\n\t"
  156267. #endif
  156268. #ifdef WOLFSSL_KEIL
  156269. "muls r7, r6, r7\n\t"
  156270. #elif defined(__clang__)
  156271. "muls r7, r6\n\t"
  156272. #else
  156273. "mul r7, r6\n\t"
  156274. #endif
  156275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156276. "adds r3, r3, r7\n\t"
  156277. #else
  156278. "add r3, r3, r7\n\t"
  156279. #endif
  156280. #ifdef WOLFSSL_KEIL
  156281. "adcs r4, r4, %[r]\n\t"
  156282. #elif defined(__clang__)
  156283. "adcs r4, %[r]\n\t"
  156284. #else
  156285. "adc r4, %[r]\n\t"
  156286. #endif
  156287. "uxth r7, %[b]\n\t"
  156288. #ifdef WOLFSSL_KEIL
  156289. "muls r6, r7, r6\n\t"
  156290. #elif defined(__clang__)
  156291. "muls r6, r7\n\t"
  156292. #else
  156293. "mul r6, r7\n\t"
  156294. #endif
  156295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156296. "lsrs r7, r6, #16\n\t"
  156297. #else
  156298. "lsr r7, r6, #16\n\t"
  156299. #endif
  156300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156301. "lsls r6, r6, #16\n\t"
  156302. #else
  156303. "lsl r6, r6, #16\n\t"
  156304. #endif
  156305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156306. "adds r5, r5, r6\n\t"
  156307. #else
  156308. "add r5, r5, r6\n\t"
  156309. #endif
  156310. #ifdef WOLFSSL_KEIL
  156311. "adcs r3, r3, r7\n\t"
  156312. #elif defined(__clang__)
  156313. "adcs r3, r7\n\t"
  156314. #else
  156315. "adc r3, r7\n\t"
  156316. #endif
  156317. #ifdef WOLFSSL_KEIL
  156318. "adcs r4, r4, %[r]\n\t"
  156319. #elif defined(__clang__)
  156320. "adcs r4, %[r]\n\t"
  156321. #else
  156322. "adc r4, %[r]\n\t"
  156323. #endif
  156324. "# A[6] * B[11]\n\t"
  156325. "mov %[a], r9\n\t"
  156326. "mov %[b], r10\n\t"
  156327. "ldr %[a], [%[a], #24]\n\t"
  156328. "ldr %[b], [%[b], #44]\n\t"
  156329. "uxth r6, %[a]\n\t"
  156330. "uxth r7, %[b]\n\t"
  156331. #ifdef WOLFSSL_KEIL
  156332. "muls r7, r6, r7\n\t"
  156333. #elif defined(__clang__)
  156334. "muls r7, r6\n\t"
  156335. #else
  156336. "mul r7, r6\n\t"
  156337. #endif
  156338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156339. "adds r5, r5, r7\n\t"
  156340. #else
  156341. "add r5, r5, r7\n\t"
  156342. #endif
  156343. #ifdef WOLFSSL_KEIL
  156344. "adcs r3, r3, %[r]\n\t"
  156345. #elif defined(__clang__)
  156346. "adcs r3, %[r]\n\t"
  156347. #else
  156348. "adc r3, %[r]\n\t"
  156349. #endif
  156350. #ifdef WOLFSSL_KEIL
  156351. "adcs r4, r4, %[r]\n\t"
  156352. #elif defined(__clang__)
  156353. "adcs r4, %[r]\n\t"
  156354. #else
  156355. "adc r4, %[r]\n\t"
  156356. #endif
  156357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156358. "lsrs r7, %[b], #16\n\t"
  156359. #else
  156360. "lsr r7, %[b], #16\n\t"
  156361. #endif
  156362. #ifdef WOLFSSL_KEIL
  156363. "muls r6, r7, r6\n\t"
  156364. #elif defined(__clang__)
  156365. "muls r6, r7\n\t"
  156366. #else
  156367. "mul r6, r7\n\t"
  156368. #endif
  156369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156370. "lsrs r7, r6, #16\n\t"
  156371. #else
  156372. "lsr r7, r6, #16\n\t"
  156373. #endif
  156374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156375. "lsls r6, r6, #16\n\t"
  156376. #else
  156377. "lsl r6, r6, #16\n\t"
  156378. #endif
  156379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156380. "adds r5, r5, r6\n\t"
  156381. #else
  156382. "add r5, r5, r6\n\t"
  156383. #endif
  156384. #ifdef WOLFSSL_KEIL
  156385. "adcs r3, r3, r7\n\t"
  156386. #elif defined(__clang__)
  156387. "adcs r3, r7\n\t"
  156388. #else
  156389. "adc r3, r7\n\t"
  156390. #endif
  156391. #ifdef WOLFSSL_KEIL
  156392. "adcs r4, r4, %[r]\n\t"
  156393. #elif defined(__clang__)
  156394. "adcs r4, %[r]\n\t"
  156395. #else
  156396. "adc r4, %[r]\n\t"
  156397. #endif
  156398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156399. "lsrs r6, %[a], #16\n\t"
  156400. #else
  156401. "lsr r6, %[a], #16\n\t"
  156402. #endif
  156403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156404. "lsrs r7, %[b], #16\n\t"
  156405. #else
  156406. "lsr r7, %[b], #16\n\t"
  156407. #endif
  156408. #ifdef WOLFSSL_KEIL
  156409. "muls r7, r6, r7\n\t"
  156410. #elif defined(__clang__)
  156411. "muls r7, r6\n\t"
  156412. #else
  156413. "mul r7, r6\n\t"
  156414. #endif
  156415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156416. "adds r3, r3, r7\n\t"
  156417. #else
  156418. "add r3, r3, r7\n\t"
  156419. #endif
  156420. #ifdef WOLFSSL_KEIL
  156421. "adcs r4, r4, %[r]\n\t"
  156422. #elif defined(__clang__)
  156423. "adcs r4, %[r]\n\t"
  156424. #else
  156425. "adc r4, %[r]\n\t"
  156426. #endif
  156427. "uxth r7, %[b]\n\t"
  156428. #ifdef WOLFSSL_KEIL
  156429. "muls r6, r7, r6\n\t"
  156430. #elif defined(__clang__)
  156431. "muls r6, r7\n\t"
  156432. #else
  156433. "mul r6, r7\n\t"
  156434. #endif
  156435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156436. "lsrs r7, r6, #16\n\t"
  156437. #else
  156438. "lsr r7, r6, #16\n\t"
  156439. #endif
  156440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156441. "lsls r6, r6, #16\n\t"
  156442. #else
  156443. "lsl r6, r6, #16\n\t"
  156444. #endif
  156445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156446. "adds r5, r5, r6\n\t"
  156447. #else
  156448. "add r5, r5, r6\n\t"
  156449. #endif
  156450. #ifdef WOLFSSL_KEIL
  156451. "adcs r3, r3, r7\n\t"
  156452. #elif defined(__clang__)
  156453. "adcs r3, r7\n\t"
  156454. #else
  156455. "adc r3, r7\n\t"
  156456. #endif
  156457. #ifdef WOLFSSL_KEIL
  156458. "adcs r4, r4, %[r]\n\t"
  156459. #elif defined(__clang__)
  156460. "adcs r4, %[r]\n\t"
  156461. #else
  156462. "adc r4, %[r]\n\t"
  156463. #endif
  156464. "# A[7] * B[10]\n\t"
  156465. "mov %[a], r9\n\t"
  156466. "mov %[b], r10\n\t"
  156467. "ldr %[a], [%[a], #28]\n\t"
  156468. "ldr %[b], [%[b], #40]\n\t"
  156469. "uxth r6, %[a]\n\t"
  156470. "uxth r7, %[b]\n\t"
  156471. #ifdef WOLFSSL_KEIL
  156472. "muls r7, r6, r7\n\t"
  156473. #elif defined(__clang__)
  156474. "muls r7, r6\n\t"
  156475. #else
  156476. "mul r7, r6\n\t"
  156477. #endif
  156478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156479. "adds r5, r5, r7\n\t"
  156480. #else
  156481. "add r5, r5, r7\n\t"
  156482. #endif
  156483. #ifdef WOLFSSL_KEIL
  156484. "adcs r3, r3, %[r]\n\t"
  156485. #elif defined(__clang__)
  156486. "adcs r3, %[r]\n\t"
  156487. #else
  156488. "adc r3, %[r]\n\t"
  156489. #endif
  156490. #ifdef WOLFSSL_KEIL
  156491. "adcs r4, r4, %[r]\n\t"
  156492. #elif defined(__clang__)
  156493. "adcs r4, %[r]\n\t"
  156494. #else
  156495. "adc r4, %[r]\n\t"
  156496. #endif
  156497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156498. "lsrs r7, %[b], #16\n\t"
  156499. #else
  156500. "lsr r7, %[b], #16\n\t"
  156501. #endif
  156502. #ifdef WOLFSSL_KEIL
  156503. "muls r6, r7, r6\n\t"
  156504. #elif defined(__clang__)
  156505. "muls r6, r7\n\t"
  156506. #else
  156507. "mul r6, r7\n\t"
  156508. #endif
  156509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156510. "lsrs r7, r6, #16\n\t"
  156511. #else
  156512. "lsr r7, r6, #16\n\t"
  156513. #endif
  156514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156515. "lsls r6, r6, #16\n\t"
  156516. #else
  156517. "lsl r6, r6, #16\n\t"
  156518. #endif
  156519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156520. "adds r5, r5, r6\n\t"
  156521. #else
  156522. "add r5, r5, r6\n\t"
  156523. #endif
  156524. #ifdef WOLFSSL_KEIL
  156525. "adcs r3, r3, r7\n\t"
  156526. #elif defined(__clang__)
  156527. "adcs r3, r7\n\t"
  156528. #else
  156529. "adc r3, r7\n\t"
  156530. #endif
  156531. #ifdef WOLFSSL_KEIL
  156532. "adcs r4, r4, %[r]\n\t"
  156533. #elif defined(__clang__)
  156534. "adcs r4, %[r]\n\t"
  156535. #else
  156536. "adc r4, %[r]\n\t"
  156537. #endif
  156538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156539. "lsrs r6, %[a], #16\n\t"
  156540. #else
  156541. "lsr r6, %[a], #16\n\t"
  156542. #endif
  156543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156544. "lsrs r7, %[b], #16\n\t"
  156545. #else
  156546. "lsr r7, %[b], #16\n\t"
  156547. #endif
  156548. #ifdef WOLFSSL_KEIL
  156549. "muls r7, r6, r7\n\t"
  156550. #elif defined(__clang__)
  156551. "muls r7, r6\n\t"
  156552. #else
  156553. "mul r7, r6\n\t"
  156554. #endif
  156555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156556. "adds r3, r3, r7\n\t"
  156557. #else
  156558. "add r3, r3, r7\n\t"
  156559. #endif
  156560. #ifdef WOLFSSL_KEIL
  156561. "adcs r4, r4, %[r]\n\t"
  156562. #elif defined(__clang__)
  156563. "adcs r4, %[r]\n\t"
  156564. #else
  156565. "adc r4, %[r]\n\t"
  156566. #endif
  156567. "uxth r7, %[b]\n\t"
  156568. #ifdef WOLFSSL_KEIL
  156569. "muls r6, r7, r6\n\t"
  156570. #elif defined(__clang__)
  156571. "muls r6, r7\n\t"
  156572. #else
  156573. "mul r6, r7\n\t"
  156574. #endif
  156575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156576. "lsrs r7, r6, #16\n\t"
  156577. #else
  156578. "lsr r7, r6, #16\n\t"
  156579. #endif
  156580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156581. "lsls r6, r6, #16\n\t"
  156582. #else
  156583. "lsl r6, r6, #16\n\t"
  156584. #endif
  156585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156586. "adds r5, r5, r6\n\t"
  156587. #else
  156588. "add r5, r5, r6\n\t"
  156589. #endif
  156590. #ifdef WOLFSSL_KEIL
  156591. "adcs r3, r3, r7\n\t"
  156592. #elif defined(__clang__)
  156593. "adcs r3, r7\n\t"
  156594. #else
  156595. "adc r3, r7\n\t"
  156596. #endif
  156597. #ifdef WOLFSSL_KEIL
  156598. "adcs r4, r4, %[r]\n\t"
  156599. #elif defined(__clang__)
  156600. "adcs r4, %[r]\n\t"
  156601. #else
  156602. "adc r4, %[r]\n\t"
  156603. #endif
  156604. "# A[8] * B[9]\n\t"
  156605. "mov %[a], r9\n\t"
  156606. "mov %[b], r10\n\t"
  156607. "ldr %[a], [%[a], #32]\n\t"
  156608. "ldr %[b], [%[b], #36]\n\t"
  156609. "uxth r6, %[a]\n\t"
  156610. "uxth r7, %[b]\n\t"
  156611. #ifdef WOLFSSL_KEIL
  156612. "muls r7, r6, r7\n\t"
  156613. #elif defined(__clang__)
  156614. "muls r7, r6\n\t"
  156615. #else
  156616. "mul r7, r6\n\t"
  156617. #endif
  156618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156619. "adds r5, r5, r7\n\t"
  156620. #else
  156621. "add r5, r5, r7\n\t"
  156622. #endif
  156623. #ifdef WOLFSSL_KEIL
  156624. "adcs r3, r3, %[r]\n\t"
  156625. #elif defined(__clang__)
  156626. "adcs r3, %[r]\n\t"
  156627. #else
  156628. "adc r3, %[r]\n\t"
  156629. #endif
  156630. #ifdef WOLFSSL_KEIL
  156631. "adcs r4, r4, %[r]\n\t"
  156632. #elif defined(__clang__)
  156633. "adcs r4, %[r]\n\t"
  156634. #else
  156635. "adc r4, %[r]\n\t"
  156636. #endif
  156637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156638. "lsrs r7, %[b], #16\n\t"
  156639. #else
  156640. "lsr r7, %[b], #16\n\t"
  156641. #endif
  156642. #ifdef WOLFSSL_KEIL
  156643. "muls r6, r7, r6\n\t"
  156644. #elif defined(__clang__)
  156645. "muls r6, r7\n\t"
  156646. #else
  156647. "mul r6, r7\n\t"
  156648. #endif
  156649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156650. "lsrs r7, r6, #16\n\t"
  156651. #else
  156652. "lsr r7, r6, #16\n\t"
  156653. #endif
  156654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156655. "lsls r6, r6, #16\n\t"
  156656. #else
  156657. "lsl r6, r6, #16\n\t"
  156658. #endif
  156659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156660. "adds r5, r5, r6\n\t"
  156661. #else
  156662. "add r5, r5, r6\n\t"
  156663. #endif
  156664. #ifdef WOLFSSL_KEIL
  156665. "adcs r3, r3, r7\n\t"
  156666. #elif defined(__clang__)
  156667. "adcs r3, r7\n\t"
  156668. #else
  156669. "adc r3, r7\n\t"
  156670. #endif
  156671. #ifdef WOLFSSL_KEIL
  156672. "adcs r4, r4, %[r]\n\t"
  156673. #elif defined(__clang__)
  156674. "adcs r4, %[r]\n\t"
  156675. #else
  156676. "adc r4, %[r]\n\t"
  156677. #endif
  156678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156679. "lsrs r6, %[a], #16\n\t"
  156680. #else
  156681. "lsr r6, %[a], #16\n\t"
  156682. #endif
  156683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156684. "lsrs r7, %[b], #16\n\t"
  156685. #else
  156686. "lsr r7, %[b], #16\n\t"
  156687. #endif
  156688. #ifdef WOLFSSL_KEIL
  156689. "muls r7, r6, r7\n\t"
  156690. #elif defined(__clang__)
  156691. "muls r7, r6\n\t"
  156692. #else
  156693. "mul r7, r6\n\t"
  156694. #endif
  156695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156696. "adds r3, r3, r7\n\t"
  156697. #else
  156698. "add r3, r3, r7\n\t"
  156699. #endif
  156700. #ifdef WOLFSSL_KEIL
  156701. "adcs r4, r4, %[r]\n\t"
  156702. #elif defined(__clang__)
  156703. "adcs r4, %[r]\n\t"
  156704. #else
  156705. "adc r4, %[r]\n\t"
  156706. #endif
  156707. "uxth r7, %[b]\n\t"
  156708. #ifdef WOLFSSL_KEIL
  156709. "muls r6, r7, r6\n\t"
  156710. #elif defined(__clang__)
  156711. "muls r6, r7\n\t"
  156712. #else
  156713. "mul r6, r7\n\t"
  156714. #endif
  156715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156716. "lsrs r7, r6, #16\n\t"
  156717. #else
  156718. "lsr r7, r6, #16\n\t"
  156719. #endif
  156720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156721. "lsls r6, r6, #16\n\t"
  156722. #else
  156723. "lsl r6, r6, #16\n\t"
  156724. #endif
  156725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156726. "adds r5, r5, r6\n\t"
  156727. #else
  156728. "add r5, r5, r6\n\t"
  156729. #endif
  156730. #ifdef WOLFSSL_KEIL
  156731. "adcs r3, r3, r7\n\t"
  156732. #elif defined(__clang__)
  156733. "adcs r3, r7\n\t"
  156734. #else
  156735. "adc r3, r7\n\t"
  156736. #endif
  156737. #ifdef WOLFSSL_KEIL
  156738. "adcs r4, r4, %[r]\n\t"
  156739. #elif defined(__clang__)
  156740. "adcs r4, %[r]\n\t"
  156741. #else
  156742. "adc r4, %[r]\n\t"
  156743. #endif
  156744. "# A[9] * B[8]\n\t"
  156745. "mov %[a], r9\n\t"
  156746. "mov %[b], r10\n\t"
  156747. "ldr %[a], [%[a], #36]\n\t"
  156748. "ldr %[b], [%[b], #32]\n\t"
  156749. "uxth r6, %[a]\n\t"
  156750. "uxth r7, %[b]\n\t"
  156751. #ifdef WOLFSSL_KEIL
  156752. "muls r7, r6, r7\n\t"
  156753. #elif defined(__clang__)
  156754. "muls r7, r6\n\t"
  156755. #else
  156756. "mul r7, r6\n\t"
  156757. #endif
  156758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156759. "adds r5, r5, r7\n\t"
  156760. #else
  156761. "add r5, r5, r7\n\t"
  156762. #endif
  156763. #ifdef WOLFSSL_KEIL
  156764. "adcs r3, r3, %[r]\n\t"
  156765. #elif defined(__clang__)
  156766. "adcs r3, %[r]\n\t"
  156767. #else
  156768. "adc r3, %[r]\n\t"
  156769. #endif
  156770. #ifdef WOLFSSL_KEIL
  156771. "adcs r4, r4, %[r]\n\t"
  156772. #elif defined(__clang__)
  156773. "adcs r4, %[r]\n\t"
  156774. #else
  156775. "adc r4, %[r]\n\t"
  156776. #endif
  156777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156778. "lsrs r7, %[b], #16\n\t"
  156779. #else
  156780. "lsr r7, %[b], #16\n\t"
  156781. #endif
  156782. #ifdef WOLFSSL_KEIL
  156783. "muls r6, r7, r6\n\t"
  156784. #elif defined(__clang__)
  156785. "muls r6, r7\n\t"
  156786. #else
  156787. "mul r6, r7\n\t"
  156788. #endif
  156789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156790. "lsrs r7, r6, #16\n\t"
  156791. #else
  156792. "lsr r7, r6, #16\n\t"
  156793. #endif
  156794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156795. "lsls r6, r6, #16\n\t"
  156796. #else
  156797. "lsl r6, r6, #16\n\t"
  156798. #endif
  156799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156800. "adds r5, r5, r6\n\t"
  156801. #else
  156802. "add r5, r5, r6\n\t"
  156803. #endif
  156804. #ifdef WOLFSSL_KEIL
  156805. "adcs r3, r3, r7\n\t"
  156806. #elif defined(__clang__)
  156807. "adcs r3, r7\n\t"
  156808. #else
  156809. "adc r3, r7\n\t"
  156810. #endif
  156811. #ifdef WOLFSSL_KEIL
  156812. "adcs r4, r4, %[r]\n\t"
  156813. #elif defined(__clang__)
  156814. "adcs r4, %[r]\n\t"
  156815. #else
  156816. "adc r4, %[r]\n\t"
  156817. #endif
  156818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156819. "lsrs r6, %[a], #16\n\t"
  156820. #else
  156821. "lsr r6, %[a], #16\n\t"
  156822. #endif
  156823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156824. "lsrs r7, %[b], #16\n\t"
  156825. #else
  156826. "lsr r7, %[b], #16\n\t"
  156827. #endif
  156828. #ifdef WOLFSSL_KEIL
  156829. "muls r7, r6, r7\n\t"
  156830. #elif defined(__clang__)
  156831. "muls r7, r6\n\t"
  156832. #else
  156833. "mul r7, r6\n\t"
  156834. #endif
  156835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156836. "adds r3, r3, r7\n\t"
  156837. #else
  156838. "add r3, r3, r7\n\t"
  156839. #endif
  156840. #ifdef WOLFSSL_KEIL
  156841. "adcs r4, r4, %[r]\n\t"
  156842. #elif defined(__clang__)
  156843. "adcs r4, %[r]\n\t"
  156844. #else
  156845. "adc r4, %[r]\n\t"
  156846. #endif
  156847. "uxth r7, %[b]\n\t"
  156848. #ifdef WOLFSSL_KEIL
  156849. "muls r6, r7, r6\n\t"
  156850. #elif defined(__clang__)
  156851. "muls r6, r7\n\t"
  156852. #else
  156853. "mul r6, r7\n\t"
  156854. #endif
  156855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156856. "lsrs r7, r6, #16\n\t"
  156857. #else
  156858. "lsr r7, r6, #16\n\t"
  156859. #endif
  156860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156861. "lsls r6, r6, #16\n\t"
  156862. #else
  156863. "lsl r6, r6, #16\n\t"
  156864. #endif
  156865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156866. "adds r5, r5, r6\n\t"
  156867. #else
  156868. "add r5, r5, r6\n\t"
  156869. #endif
  156870. #ifdef WOLFSSL_KEIL
  156871. "adcs r3, r3, r7\n\t"
  156872. #elif defined(__clang__)
  156873. "adcs r3, r7\n\t"
  156874. #else
  156875. "adc r3, r7\n\t"
  156876. #endif
  156877. #ifdef WOLFSSL_KEIL
  156878. "adcs r4, r4, %[r]\n\t"
  156879. #elif defined(__clang__)
  156880. "adcs r4, %[r]\n\t"
  156881. #else
  156882. "adc r4, %[r]\n\t"
  156883. #endif
  156884. "# A[10] * B[7]\n\t"
  156885. "mov %[a], r9\n\t"
  156886. "mov %[b], r10\n\t"
  156887. "ldr %[a], [%[a], #40]\n\t"
  156888. "ldr %[b], [%[b], #28]\n\t"
  156889. "uxth r6, %[a]\n\t"
  156890. "uxth r7, %[b]\n\t"
  156891. #ifdef WOLFSSL_KEIL
  156892. "muls r7, r6, r7\n\t"
  156893. #elif defined(__clang__)
  156894. "muls r7, r6\n\t"
  156895. #else
  156896. "mul r7, r6\n\t"
  156897. #endif
  156898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156899. "adds r5, r5, r7\n\t"
  156900. #else
  156901. "add r5, r5, r7\n\t"
  156902. #endif
  156903. #ifdef WOLFSSL_KEIL
  156904. "adcs r3, r3, %[r]\n\t"
  156905. #elif defined(__clang__)
  156906. "adcs r3, %[r]\n\t"
  156907. #else
  156908. "adc r3, %[r]\n\t"
  156909. #endif
  156910. #ifdef WOLFSSL_KEIL
  156911. "adcs r4, r4, %[r]\n\t"
  156912. #elif defined(__clang__)
  156913. "adcs r4, %[r]\n\t"
  156914. #else
  156915. "adc r4, %[r]\n\t"
  156916. #endif
  156917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156918. "lsrs r7, %[b], #16\n\t"
  156919. #else
  156920. "lsr r7, %[b], #16\n\t"
  156921. #endif
  156922. #ifdef WOLFSSL_KEIL
  156923. "muls r6, r7, r6\n\t"
  156924. #elif defined(__clang__)
  156925. "muls r6, r7\n\t"
  156926. #else
  156927. "mul r6, r7\n\t"
  156928. #endif
  156929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156930. "lsrs r7, r6, #16\n\t"
  156931. #else
  156932. "lsr r7, r6, #16\n\t"
  156933. #endif
  156934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156935. "lsls r6, r6, #16\n\t"
  156936. #else
  156937. "lsl r6, r6, #16\n\t"
  156938. #endif
  156939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156940. "adds r5, r5, r6\n\t"
  156941. #else
  156942. "add r5, r5, r6\n\t"
  156943. #endif
  156944. #ifdef WOLFSSL_KEIL
  156945. "adcs r3, r3, r7\n\t"
  156946. #elif defined(__clang__)
  156947. "adcs r3, r7\n\t"
  156948. #else
  156949. "adc r3, r7\n\t"
  156950. #endif
  156951. #ifdef WOLFSSL_KEIL
  156952. "adcs r4, r4, %[r]\n\t"
  156953. #elif defined(__clang__)
  156954. "adcs r4, %[r]\n\t"
  156955. #else
  156956. "adc r4, %[r]\n\t"
  156957. #endif
  156958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156959. "lsrs r6, %[a], #16\n\t"
  156960. #else
  156961. "lsr r6, %[a], #16\n\t"
  156962. #endif
  156963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156964. "lsrs r7, %[b], #16\n\t"
  156965. #else
  156966. "lsr r7, %[b], #16\n\t"
  156967. #endif
  156968. #ifdef WOLFSSL_KEIL
  156969. "muls r7, r6, r7\n\t"
  156970. #elif defined(__clang__)
  156971. "muls r7, r6\n\t"
  156972. #else
  156973. "mul r7, r6\n\t"
  156974. #endif
  156975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156976. "adds r3, r3, r7\n\t"
  156977. #else
  156978. "add r3, r3, r7\n\t"
  156979. #endif
  156980. #ifdef WOLFSSL_KEIL
  156981. "adcs r4, r4, %[r]\n\t"
  156982. #elif defined(__clang__)
  156983. "adcs r4, %[r]\n\t"
  156984. #else
  156985. "adc r4, %[r]\n\t"
  156986. #endif
  156987. "uxth r7, %[b]\n\t"
  156988. #ifdef WOLFSSL_KEIL
  156989. "muls r6, r7, r6\n\t"
  156990. #elif defined(__clang__)
  156991. "muls r6, r7\n\t"
  156992. #else
  156993. "mul r6, r7\n\t"
  156994. #endif
  156995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156996. "lsrs r7, r6, #16\n\t"
  156997. #else
  156998. "lsr r7, r6, #16\n\t"
  156999. #endif
  157000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157001. "lsls r6, r6, #16\n\t"
  157002. #else
  157003. "lsl r6, r6, #16\n\t"
  157004. #endif
  157005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157006. "adds r5, r5, r6\n\t"
  157007. #else
  157008. "add r5, r5, r6\n\t"
  157009. #endif
  157010. #ifdef WOLFSSL_KEIL
  157011. "adcs r3, r3, r7\n\t"
  157012. #elif defined(__clang__)
  157013. "adcs r3, r7\n\t"
  157014. #else
  157015. "adc r3, r7\n\t"
  157016. #endif
  157017. #ifdef WOLFSSL_KEIL
  157018. "adcs r4, r4, %[r]\n\t"
  157019. #elif defined(__clang__)
  157020. "adcs r4, %[r]\n\t"
  157021. #else
  157022. "adc r4, %[r]\n\t"
  157023. #endif
  157024. "# A[11] * B[6]\n\t"
  157025. "mov %[a], r9\n\t"
  157026. "mov %[b], r10\n\t"
  157027. "ldr %[a], [%[a], #44]\n\t"
  157028. "ldr %[b], [%[b], #24]\n\t"
  157029. "uxth r6, %[a]\n\t"
  157030. "uxth r7, %[b]\n\t"
  157031. #ifdef WOLFSSL_KEIL
  157032. "muls r7, r6, r7\n\t"
  157033. #elif defined(__clang__)
  157034. "muls r7, r6\n\t"
  157035. #else
  157036. "mul r7, r6\n\t"
  157037. #endif
  157038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157039. "adds r5, r5, r7\n\t"
  157040. #else
  157041. "add r5, r5, r7\n\t"
  157042. #endif
  157043. #ifdef WOLFSSL_KEIL
  157044. "adcs r3, r3, %[r]\n\t"
  157045. #elif defined(__clang__)
  157046. "adcs r3, %[r]\n\t"
  157047. #else
  157048. "adc r3, %[r]\n\t"
  157049. #endif
  157050. #ifdef WOLFSSL_KEIL
  157051. "adcs r4, r4, %[r]\n\t"
  157052. #elif defined(__clang__)
  157053. "adcs r4, %[r]\n\t"
  157054. #else
  157055. "adc r4, %[r]\n\t"
  157056. #endif
  157057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157058. "lsrs r7, %[b], #16\n\t"
  157059. #else
  157060. "lsr r7, %[b], #16\n\t"
  157061. #endif
  157062. #ifdef WOLFSSL_KEIL
  157063. "muls r6, r7, r6\n\t"
  157064. #elif defined(__clang__)
  157065. "muls r6, r7\n\t"
  157066. #else
  157067. "mul r6, r7\n\t"
  157068. #endif
  157069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157070. "lsrs r7, r6, #16\n\t"
  157071. #else
  157072. "lsr r7, r6, #16\n\t"
  157073. #endif
  157074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157075. "lsls r6, r6, #16\n\t"
  157076. #else
  157077. "lsl r6, r6, #16\n\t"
  157078. #endif
  157079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157080. "adds r5, r5, r6\n\t"
  157081. #else
  157082. "add r5, r5, r6\n\t"
  157083. #endif
  157084. #ifdef WOLFSSL_KEIL
  157085. "adcs r3, r3, r7\n\t"
  157086. #elif defined(__clang__)
  157087. "adcs r3, r7\n\t"
  157088. #else
  157089. "adc r3, r7\n\t"
  157090. #endif
  157091. #ifdef WOLFSSL_KEIL
  157092. "adcs r4, r4, %[r]\n\t"
  157093. #elif defined(__clang__)
  157094. "adcs r4, %[r]\n\t"
  157095. #else
  157096. "adc r4, %[r]\n\t"
  157097. #endif
  157098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157099. "lsrs r6, %[a], #16\n\t"
  157100. #else
  157101. "lsr r6, %[a], #16\n\t"
  157102. #endif
  157103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157104. "lsrs r7, %[b], #16\n\t"
  157105. #else
  157106. "lsr r7, %[b], #16\n\t"
  157107. #endif
  157108. #ifdef WOLFSSL_KEIL
  157109. "muls r7, r6, r7\n\t"
  157110. #elif defined(__clang__)
  157111. "muls r7, r6\n\t"
  157112. #else
  157113. "mul r7, r6\n\t"
  157114. #endif
  157115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157116. "adds r3, r3, r7\n\t"
  157117. #else
  157118. "add r3, r3, r7\n\t"
  157119. #endif
  157120. #ifdef WOLFSSL_KEIL
  157121. "adcs r4, r4, %[r]\n\t"
  157122. #elif defined(__clang__)
  157123. "adcs r4, %[r]\n\t"
  157124. #else
  157125. "adc r4, %[r]\n\t"
  157126. #endif
  157127. "uxth r7, %[b]\n\t"
  157128. #ifdef WOLFSSL_KEIL
  157129. "muls r6, r7, r6\n\t"
  157130. #elif defined(__clang__)
  157131. "muls r6, r7\n\t"
  157132. #else
  157133. "mul r6, r7\n\t"
  157134. #endif
  157135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157136. "lsrs r7, r6, #16\n\t"
  157137. #else
  157138. "lsr r7, r6, #16\n\t"
  157139. #endif
  157140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157141. "lsls r6, r6, #16\n\t"
  157142. #else
  157143. "lsl r6, r6, #16\n\t"
  157144. #endif
  157145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157146. "adds r5, r5, r6\n\t"
  157147. #else
  157148. "add r5, r5, r6\n\t"
  157149. #endif
  157150. #ifdef WOLFSSL_KEIL
  157151. "adcs r3, r3, r7\n\t"
  157152. #elif defined(__clang__)
  157153. "adcs r3, r7\n\t"
  157154. #else
  157155. "adc r3, r7\n\t"
  157156. #endif
  157157. #ifdef WOLFSSL_KEIL
  157158. "adcs r4, r4, %[r]\n\t"
  157159. #elif defined(__clang__)
  157160. "adcs r4, %[r]\n\t"
  157161. #else
  157162. "adc r4, %[r]\n\t"
  157163. #endif
  157164. "# A[12] * B[5]\n\t"
  157165. "mov %[a], r9\n\t"
  157166. "mov %[b], r10\n\t"
  157167. "ldr %[a], [%[a], #48]\n\t"
  157168. "ldr %[b], [%[b], #20]\n\t"
  157169. "uxth r6, %[a]\n\t"
  157170. "uxth r7, %[b]\n\t"
  157171. #ifdef WOLFSSL_KEIL
  157172. "muls r7, r6, r7\n\t"
  157173. #elif defined(__clang__)
  157174. "muls r7, r6\n\t"
  157175. #else
  157176. "mul r7, r6\n\t"
  157177. #endif
  157178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157179. "adds r5, r5, r7\n\t"
  157180. #else
  157181. "add r5, r5, r7\n\t"
  157182. #endif
  157183. #ifdef WOLFSSL_KEIL
  157184. "adcs r3, r3, %[r]\n\t"
  157185. #elif defined(__clang__)
  157186. "adcs r3, %[r]\n\t"
  157187. #else
  157188. "adc r3, %[r]\n\t"
  157189. #endif
  157190. #ifdef WOLFSSL_KEIL
  157191. "adcs r4, r4, %[r]\n\t"
  157192. #elif defined(__clang__)
  157193. "adcs r4, %[r]\n\t"
  157194. #else
  157195. "adc r4, %[r]\n\t"
  157196. #endif
  157197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157198. "lsrs r7, %[b], #16\n\t"
  157199. #else
  157200. "lsr r7, %[b], #16\n\t"
  157201. #endif
  157202. #ifdef WOLFSSL_KEIL
  157203. "muls r6, r7, r6\n\t"
  157204. #elif defined(__clang__)
  157205. "muls r6, r7\n\t"
  157206. #else
  157207. "mul r6, r7\n\t"
  157208. #endif
  157209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157210. "lsrs r7, r6, #16\n\t"
  157211. #else
  157212. "lsr r7, r6, #16\n\t"
  157213. #endif
  157214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157215. "lsls r6, r6, #16\n\t"
  157216. #else
  157217. "lsl r6, r6, #16\n\t"
  157218. #endif
  157219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157220. "adds r5, r5, r6\n\t"
  157221. #else
  157222. "add r5, r5, r6\n\t"
  157223. #endif
  157224. #ifdef WOLFSSL_KEIL
  157225. "adcs r3, r3, r7\n\t"
  157226. #elif defined(__clang__)
  157227. "adcs r3, r7\n\t"
  157228. #else
  157229. "adc r3, r7\n\t"
  157230. #endif
  157231. #ifdef WOLFSSL_KEIL
  157232. "adcs r4, r4, %[r]\n\t"
  157233. #elif defined(__clang__)
  157234. "adcs r4, %[r]\n\t"
  157235. #else
  157236. "adc r4, %[r]\n\t"
  157237. #endif
  157238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157239. "lsrs r6, %[a], #16\n\t"
  157240. #else
  157241. "lsr r6, %[a], #16\n\t"
  157242. #endif
  157243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157244. "lsrs r7, %[b], #16\n\t"
  157245. #else
  157246. "lsr r7, %[b], #16\n\t"
  157247. #endif
  157248. #ifdef WOLFSSL_KEIL
  157249. "muls r7, r6, r7\n\t"
  157250. #elif defined(__clang__)
  157251. "muls r7, r6\n\t"
  157252. #else
  157253. "mul r7, r6\n\t"
  157254. #endif
  157255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157256. "adds r3, r3, r7\n\t"
  157257. #else
  157258. "add r3, r3, r7\n\t"
  157259. #endif
  157260. #ifdef WOLFSSL_KEIL
  157261. "adcs r4, r4, %[r]\n\t"
  157262. #elif defined(__clang__)
  157263. "adcs r4, %[r]\n\t"
  157264. #else
  157265. "adc r4, %[r]\n\t"
  157266. #endif
  157267. "uxth r7, %[b]\n\t"
  157268. #ifdef WOLFSSL_KEIL
  157269. "muls r6, r7, r6\n\t"
  157270. #elif defined(__clang__)
  157271. "muls r6, r7\n\t"
  157272. #else
  157273. "mul r6, r7\n\t"
  157274. #endif
  157275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157276. "lsrs r7, r6, #16\n\t"
  157277. #else
  157278. "lsr r7, r6, #16\n\t"
  157279. #endif
  157280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157281. "lsls r6, r6, #16\n\t"
  157282. #else
  157283. "lsl r6, r6, #16\n\t"
  157284. #endif
  157285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157286. "adds r5, r5, r6\n\t"
  157287. #else
  157288. "add r5, r5, r6\n\t"
  157289. #endif
  157290. #ifdef WOLFSSL_KEIL
  157291. "adcs r3, r3, r7\n\t"
  157292. #elif defined(__clang__)
  157293. "adcs r3, r7\n\t"
  157294. #else
  157295. "adc r3, r7\n\t"
  157296. #endif
  157297. #ifdef WOLFSSL_KEIL
  157298. "adcs r4, r4, %[r]\n\t"
  157299. #elif defined(__clang__)
  157300. "adcs r4, %[r]\n\t"
  157301. #else
  157302. "adc r4, %[r]\n\t"
  157303. #endif
  157304. "# A[13] * B[4]\n\t"
  157305. "mov %[a], r9\n\t"
  157306. "mov %[b], r10\n\t"
  157307. "ldr %[a], [%[a], #52]\n\t"
  157308. "ldr %[b], [%[b], #16]\n\t"
  157309. "uxth r6, %[a]\n\t"
  157310. "uxth r7, %[b]\n\t"
  157311. #ifdef WOLFSSL_KEIL
  157312. "muls r7, r6, r7\n\t"
  157313. #elif defined(__clang__)
  157314. "muls r7, r6\n\t"
  157315. #else
  157316. "mul r7, r6\n\t"
  157317. #endif
  157318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157319. "adds r5, r5, r7\n\t"
  157320. #else
  157321. "add r5, r5, r7\n\t"
  157322. #endif
  157323. #ifdef WOLFSSL_KEIL
  157324. "adcs r3, r3, %[r]\n\t"
  157325. #elif defined(__clang__)
  157326. "adcs r3, %[r]\n\t"
  157327. #else
  157328. "adc r3, %[r]\n\t"
  157329. #endif
  157330. #ifdef WOLFSSL_KEIL
  157331. "adcs r4, r4, %[r]\n\t"
  157332. #elif defined(__clang__)
  157333. "adcs r4, %[r]\n\t"
  157334. #else
  157335. "adc r4, %[r]\n\t"
  157336. #endif
  157337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157338. "lsrs r7, %[b], #16\n\t"
  157339. #else
  157340. "lsr r7, %[b], #16\n\t"
  157341. #endif
  157342. #ifdef WOLFSSL_KEIL
  157343. "muls r6, r7, r6\n\t"
  157344. #elif defined(__clang__)
  157345. "muls r6, r7\n\t"
  157346. #else
  157347. "mul r6, r7\n\t"
  157348. #endif
  157349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157350. "lsrs r7, r6, #16\n\t"
  157351. #else
  157352. "lsr r7, r6, #16\n\t"
  157353. #endif
  157354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157355. "lsls r6, r6, #16\n\t"
  157356. #else
  157357. "lsl r6, r6, #16\n\t"
  157358. #endif
  157359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157360. "adds r5, r5, r6\n\t"
  157361. #else
  157362. "add r5, r5, r6\n\t"
  157363. #endif
  157364. #ifdef WOLFSSL_KEIL
  157365. "adcs r3, r3, r7\n\t"
  157366. #elif defined(__clang__)
  157367. "adcs r3, r7\n\t"
  157368. #else
  157369. "adc r3, r7\n\t"
  157370. #endif
  157371. #ifdef WOLFSSL_KEIL
  157372. "adcs r4, r4, %[r]\n\t"
  157373. #elif defined(__clang__)
  157374. "adcs r4, %[r]\n\t"
  157375. #else
  157376. "adc r4, %[r]\n\t"
  157377. #endif
  157378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157379. "lsrs r6, %[a], #16\n\t"
  157380. #else
  157381. "lsr r6, %[a], #16\n\t"
  157382. #endif
  157383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157384. "lsrs r7, %[b], #16\n\t"
  157385. #else
  157386. "lsr r7, %[b], #16\n\t"
  157387. #endif
  157388. #ifdef WOLFSSL_KEIL
  157389. "muls r7, r6, r7\n\t"
  157390. #elif defined(__clang__)
  157391. "muls r7, r6\n\t"
  157392. #else
  157393. "mul r7, r6\n\t"
  157394. #endif
  157395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157396. "adds r3, r3, r7\n\t"
  157397. #else
  157398. "add r3, r3, r7\n\t"
  157399. #endif
  157400. #ifdef WOLFSSL_KEIL
  157401. "adcs r4, r4, %[r]\n\t"
  157402. #elif defined(__clang__)
  157403. "adcs r4, %[r]\n\t"
  157404. #else
  157405. "adc r4, %[r]\n\t"
  157406. #endif
  157407. "uxth r7, %[b]\n\t"
  157408. #ifdef WOLFSSL_KEIL
  157409. "muls r6, r7, r6\n\t"
  157410. #elif defined(__clang__)
  157411. "muls r6, r7\n\t"
  157412. #else
  157413. "mul r6, r7\n\t"
  157414. #endif
  157415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157416. "lsrs r7, r6, #16\n\t"
  157417. #else
  157418. "lsr r7, r6, #16\n\t"
  157419. #endif
  157420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157421. "lsls r6, r6, #16\n\t"
  157422. #else
  157423. "lsl r6, r6, #16\n\t"
  157424. #endif
  157425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157426. "adds r5, r5, r6\n\t"
  157427. #else
  157428. "add r5, r5, r6\n\t"
  157429. #endif
  157430. #ifdef WOLFSSL_KEIL
  157431. "adcs r3, r3, r7\n\t"
  157432. #elif defined(__clang__)
  157433. "adcs r3, r7\n\t"
  157434. #else
  157435. "adc r3, r7\n\t"
  157436. #endif
  157437. #ifdef WOLFSSL_KEIL
  157438. "adcs r4, r4, %[r]\n\t"
  157439. #elif defined(__clang__)
  157440. "adcs r4, %[r]\n\t"
  157441. #else
  157442. "adc r4, %[r]\n\t"
  157443. #endif
  157444. "# A[14] * B[3]\n\t"
  157445. "mov %[a], r9\n\t"
  157446. "mov %[b], r10\n\t"
  157447. "ldr %[a], [%[a], #56]\n\t"
  157448. "ldr %[b], [%[b], #12]\n\t"
  157449. "uxth r6, %[a]\n\t"
  157450. "uxth r7, %[b]\n\t"
  157451. #ifdef WOLFSSL_KEIL
  157452. "muls r7, r6, r7\n\t"
  157453. #elif defined(__clang__)
  157454. "muls r7, r6\n\t"
  157455. #else
  157456. "mul r7, r6\n\t"
  157457. #endif
  157458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157459. "adds r5, r5, r7\n\t"
  157460. #else
  157461. "add r5, r5, r7\n\t"
  157462. #endif
  157463. #ifdef WOLFSSL_KEIL
  157464. "adcs r3, r3, %[r]\n\t"
  157465. #elif defined(__clang__)
  157466. "adcs r3, %[r]\n\t"
  157467. #else
  157468. "adc r3, %[r]\n\t"
  157469. #endif
  157470. #ifdef WOLFSSL_KEIL
  157471. "adcs r4, r4, %[r]\n\t"
  157472. #elif defined(__clang__)
  157473. "adcs r4, %[r]\n\t"
  157474. #else
  157475. "adc r4, %[r]\n\t"
  157476. #endif
  157477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157478. "lsrs r7, %[b], #16\n\t"
  157479. #else
  157480. "lsr r7, %[b], #16\n\t"
  157481. #endif
  157482. #ifdef WOLFSSL_KEIL
  157483. "muls r6, r7, r6\n\t"
  157484. #elif defined(__clang__)
  157485. "muls r6, r7\n\t"
  157486. #else
  157487. "mul r6, r7\n\t"
  157488. #endif
  157489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157490. "lsrs r7, r6, #16\n\t"
  157491. #else
  157492. "lsr r7, r6, #16\n\t"
  157493. #endif
  157494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157495. "lsls r6, r6, #16\n\t"
  157496. #else
  157497. "lsl r6, r6, #16\n\t"
  157498. #endif
  157499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157500. "adds r5, r5, r6\n\t"
  157501. #else
  157502. "add r5, r5, r6\n\t"
  157503. #endif
  157504. #ifdef WOLFSSL_KEIL
  157505. "adcs r3, r3, r7\n\t"
  157506. #elif defined(__clang__)
  157507. "adcs r3, r7\n\t"
  157508. #else
  157509. "adc r3, r7\n\t"
  157510. #endif
  157511. #ifdef WOLFSSL_KEIL
  157512. "adcs r4, r4, %[r]\n\t"
  157513. #elif defined(__clang__)
  157514. "adcs r4, %[r]\n\t"
  157515. #else
  157516. "adc r4, %[r]\n\t"
  157517. #endif
  157518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157519. "lsrs r6, %[a], #16\n\t"
  157520. #else
  157521. "lsr r6, %[a], #16\n\t"
  157522. #endif
  157523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157524. "lsrs r7, %[b], #16\n\t"
  157525. #else
  157526. "lsr r7, %[b], #16\n\t"
  157527. #endif
  157528. #ifdef WOLFSSL_KEIL
  157529. "muls r7, r6, r7\n\t"
  157530. #elif defined(__clang__)
  157531. "muls r7, r6\n\t"
  157532. #else
  157533. "mul r7, r6\n\t"
  157534. #endif
  157535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157536. "adds r3, r3, r7\n\t"
  157537. #else
  157538. "add r3, r3, r7\n\t"
  157539. #endif
  157540. #ifdef WOLFSSL_KEIL
  157541. "adcs r4, r4, %[r]\n\t"
  157542. #elif defined(__clang__)
  157543. "adcs r4, %[r]\n\t"
  157544. #else
  157545. "adc r4, %[r]\n\t"
  157546. #endif
  157547. "uxth r7, %[b]\n\t"
  157548. #ifdef WOLFSSL_KEIL
  157549. "muls r6, r7, r6\n\t"
  157550. #elif defined(__clang__)
  157551. "muls r6, r7\n\t"
  157552. #else
  157553. "mul r6, r7\n\t"
  157554. #endif
  157555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157556. "lsrs r7, r6, #16\n\t"
  157557. #else
  157558. "lsr r7, r6, #16\n\t"
  157559. #endif
  157560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157561. "lsls r6, r6, #16\n\t"
  157562. #else
  157563. "lsl r6, r6, #16\n\t"
  157564. #endif
  157565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157566. "adds r5, r5, r6\n\t"
  157567. #else
  157568. "add r5, r5, r6\n\t"
  157569. #endif
  157570. #ifdef WOLFSSL_KEIL
  157571. "adcs r3, r3, r7\n\t"
  157572. #elif defined(__clang__)
  157573. "adcs r3, r7\n\t"
  157574. #else
  157575. "adc r3, r7\n\t"
  157576. #endif
  157577. #ifdef WOLFSSL_KEIL
  157578. "adcs r4, r4, %[r]\n\t"
  157579. #elif defined(__clang__)
  157580. "adcs r4, %[r]\n\t"
  157581. #else
  157582. "adc r4, %[r]\n\t"
  157583. #endif
  157584. "# A[15] * B[2]\n\t"
  157585. "mov %[a], r9\n\t"
  157586. "mov %[b], r10\n\t"
  157587. "ldr %[a], [%[a], #60]\n\t"
  157588. "ldr %[b], [%[b], #8]\n\t"
  157589. "uxth r6, %[a]\n\t"
  157590. "uxth r7, %[b]\n\t"
  157591. #ifdef WOLFSSL_KEIL
  157592. "muls r7, r6, r7\n\t"
  157593. #elif defined(__clang__)
  157594. "muls r7, r6\n\t"
  157595. #else
  157596. "mul r7, r6\n\t"
  157597. #endif
  157598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157599. "adds r5, r5, r7\n\t"
  157600. #else
  157601. "add r5, r5, r7\n\t"
  157602. #endif
  157603. #ifdef WOLFSSL_KEIL
  157604. "adcs r3, r3, %[r]\n\t"
  157605. #elif defined(__clang__)
  157606. "adcs r3, %[r]\n\t"
  157607. #else
  157608. "adc r3, %[r]\n\t"
  157609. #endif
  157610. #ifdef WOLFSSL_KEIL
  157611. "adcs r4, r4, %[r]\n\t"
  157612. #elif defined(__clang__)
  157613. "adcs r4, %[r]\n\t"
  157614. #else
  157615. "adc r4, %[r]\n\t"
  157616. #endif
  157617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157618. "lsrs r7, %[b], #16\n\t"
  157619. #else
  157620. "lsr r7, %[b], #16\n\t"
  157621. #endif
  157622. #ifdef WOLFSSL_KEIL
  157623. "muls r6, r7, r6\n\t"
  157624. #elif defined(__clang__)
  157625. "muls r6, r7\n\t"
  157626. #else
  157627. "mul r6, r7\n\t"
  157628. #endif
  157629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157630. "lsrs r7, r6, #16\n\t"
  157631. #else
  157632. "lsr r7, r6, #16\n\t"
  157633. #endif
  157634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157635. "lsls r6, r6, #16\n\t"
  157636. #else
  157637. "lsl r6, r6, #16\n\t"
  157638. #endif
  157639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157640. "adds r5, r5, r6\n\t"
  157641. #else
  157642. "add r5, r5, r6\n\t"
  157643. #endif
  157644. #ifdef WOLFSSL_KEIL
  157645. "adcs r3, r3, r7\n\t"
  157646. #elif defined(__clang__)
  157647. "adcs r3, r7\n\t"
  157648. #else
  157649. "adc r3, r7\n\t"
  157650. #endif
  157651. #ifdef WOLFSSL_KEIL
  157652. "adcs r4, r4, %[r]\n\t"
  157653. #elif defined(__clang__)
  157654. "adcs r4, %[r]\n\t"
  157655. #else
  157656. "adc r4, %[r]\n\t"
  157657. #endif
  157658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157659. "lsrs r6, %[a], #16\n\t"
  157660. #else
  157661. "lsr r6, %[a], #16\n\t"
  157662. #endif
  157663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157664. "lsrs r7, %[b], #16\n\t"
  157665. #else
  157666. "lsr r7, %[b], #16\n\t"
  157667. #endif
  157668. #ifdef WOLFSSL_KEIL
  157669. "muls r7, r6, r7\n\t"
  157670. #elif defined(__clang__)
  157671. "muls r7, r6\n\t"
  157672. #else
  157673. "mul r7, r6\n\t"
  157674. #endif
  157675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157676. "adds r3, r3, r7\n\t"
  157677. #else
  157678. "add r3, r3, r7\n\t"
  157679. #endif
  157680. #ifdef WOLFSSL_KEIL
  157681. "adcs r4, r4, %[r]\n\t"
  157682. #elif defined(__clang__)
  157683. "adcs r4, %[r]\n\t"
  157684. #else
  157685. "adc r4, %[r]\n\t"
  157686. #endif
  157687. "uxth r7, %[b]\n\t"
  157688. #ifdef WOLFSSL_KEIL
  157689. "muls r6, r7, r6\n\t"
  157690. #elif defined(__clang__)
  157691. "muls r6, r7\n\t"
  157692. #else
  157693. "mul r6, r7\n\t"
  157694. #endif
  157695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157696. "lsrs r7, r6, #16\n\t"
  157697. #else
  157698. "lsr r7, r6, #16\n\t"
  157699. #endif
  157700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157701. "lsls r6, r6, #16\n\t"
  157702. #else
  157703. "lsl r6, r6, #16\n\t"
  157704. #endif
  157705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157706. "adds r5, r5, r6\n\t"
  157707. #else
  157708. "add r5, r5, r6\n\t"
  157709. #endif
  157710. #ifdef WOLFSSL_KEIL
  157711. "adcs r3, r3, r7\n\t"
  157712. #elif defined(__clang__)
  157713. "adcs r3, r7\n\t"
  157714. #else
  157715. "adc r3, r7\n\t"
  157716. #endif
  157717. #ifdef WOLFSSL_KEIL
  157718. "adcs r4, r4, %[r]\n\t"
  157719. #elif defined(__clang__)
  157720. "adcs r4, %[r]\n\t"
  157721. #else
  157722. "adc r4, %[r]\n\t"
  157723. #endif
  157724. "mov %[r], r8\n\t"
  157725. "str r5, [%[r], #68]\n\t"
  157726. "movs %[r], #0\n\t"
  157727. "# A[15] * B[3]\n\t"
  157728. "movs r5, #0\n\t"
  157729. "mov %[a], r9\n\t"
  157730. "mov %[b], r10\n\t"
  157731. "ldr %[a], [%[a], #60]\n\t"
  157732. "ldr %[b], [%[b], #12]\n\t"
  157733. "uxth r6, %[a]\n\t"
  157734. "uxth r7, %[b]\n\t"
  157735. #ifdef WOLFSSL_KEIL
  157736. "muls r7, r6, r7\n\t"
  157737. #elif defined(__clang__)
  157738. "muls r7, r6\n\t"
  157739. #else
  157740. "mul r7, r6\n\t"
  157741. #endif
  157742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157743. "adds r3, r3, r7\n\t"
  157744. #else
  157745. "add r3, r3, r7\n\t"
  157746. #endif
  157747. #ifdef WOLFSSL_KEIL
  157748. "adcs r4, r4, %[r]\n\t"
  157749. #elif defined(__clang__)
  157750. "adcs r4, %[r]\n\t"
  157751. #else
  157752. "adc r4, %[r]\n\t"
  157753. #endif
  157754. #ifdef WOLFSSL_KEIL
  157755. "adcs r5, r5, %[r]\n\t"
  157756. #elif defined(__clang__)
  157757. "adcs r5, %[r]\n\t"
  157758. #else
  157759. "adc r5, %[r]\n\t"
  157760. #endif
  157761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157762. "lsrs r7, %[b], #16\n\t"
  157763. #else
  157764. "lsr r7, %[b], #16\n\t"
  157765. #endif
  157766. #ifdef WOLFSSL_KEIL
  157767. "muls r6, r7, r6\n\t"
  157768. #elif defined(__clang__)
  157769. "muls r6, r7\n\t"
  157770. #else
  157771. "mul r6, r7\n\t"
  157772. #endif
  157773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157774. "lsrs r7, r6, #16\n\t"
  157775. #else
  157776. "lsr r7, r6, #16\n\t"
  157777. #endif
  157778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157779. "lsls r6, r6, #16\n\t"
  157780. #else
  157781. "lsl r6, r6, #16\n\t"
  157782. #endif
  157783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157784. "adds r3, r3, r6\n\t"
  157785. #else
  157786. "add r3, r3, r6\n\t"
  157787. #endif
  157788. #ifdef WOLFSSL_KEIL
  157789. "adcs r4, r4, r7\n\t"
  157790. #elif defined(__clang__)
  157791. "adcs r4, r7\n\t"
  157792. #else
  157793. "adc r4, r7\n\t"
  157794. #endif
  157795. #ifdef WOLFSSL_KEIL
  157796. "adcs r5, r5, %[r]\n\t"
  157797. #elif defined(__clang__)
  157798. "adcs r5, %[r]\n\t"
  157799. #else
  157800. "adc r5, %[r]\n\t"
  157801. #endif
  157802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157803. "lsrs r6, %[a], #16\n\t"
  157804. #else
  157805. "lsr r6, %[a], #16\n\t"
  157806. #endif
  157807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157808. "lsrs r7, %[b], #16\n\t"
  157809. #else
  157810. "lsr r7, %[b], #16\n\t"
  157811. #endif
  157812. #ifdef WOLFSSL_KEIL
  157813. "muls r7, r6, r7\n\t"
  157814. #elif defined(__clang__)
  157815. "muls r7, r6\n\t"
  157816. #else
  157817. "mul r7, r6\n\t"
  157818. #endif
  157819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157820. "adds r4, r4, r7\n\t"
  157821. #else
  157822. "add r4, r4, r7\n\t"
  157823. #endif
  157824. #ifdef WOLFSSL_KEIL
  157825. "adcs r5, r5, %[r]\n\t"
  157826. #elif defined(__clang__)
  157827. "adcs r5, %[r]\n\t"
  157828. #else
  157829. "adc r5, %[r]\n\t"
  157830. #endif
  157831. "uxth r7, %[b]\n\t"
  157832. #ifdef WOLFSSL_KEIL
  157833. "muls r6, r7, r6\n\t"
  157834. #elif defined(__clang__)
  157835. "muls r6, r7\n\t"
  157836. #else
  157837. "mul r6, r7\n\t"
  157838. #endif
  157839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157840. "lsrs r7, r6, #16\n\t"
  157841. #else
  157842. "lsr r7, r6, #16\n\t"
  157843. #endif
  157844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157845. "lsls r6, r6, #16\n\t"
  157846. #else
  157847. "lsl r6, r6, #16\n\t"
  157848. #endif
  157849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157850. "adds r3, r3, r6\n\t"
  157851. #else
  157852. "add r3, r3, r6\n\t"
  157853. #endif
  157854. #ifdef WOLFSSL_KEIL
  157855. "adcs r4, r4, r7\n\t"
  157856. #elif defined(__clang__)
  157857. "adcs r4, r7\n\t"
  157858. #else
  157859. "adc r4, r7\n\t"
  157860. #endif
  157861. #ifdef WOLFSSL_KEIL
  157862. "adcs r5, r5, %[r]\n\t"
  157863. #elif defined(__clang__)
  157864. "adcs r5, %[r]\n\t"
  157865. #else
  157866. "adc r5, %[r]\n\t"
  157867. #endif
  157868. "# A[14] * B[4]\n\t"
  157869. "mov %[a], r9\n\t"
  157870. "mov %[b], r10\n\t"
  157871. "ldr %[a], [%[a], #56]\n\t"
  157872. "ldr %[b], [%[b], #16]\n\t"
  157873. "uxth r6, %[a]\n\t"
  157874. "uxth r7, %[b]\n\t"
  157875. #ifdef WOLFSSL_KEIL
  157876. "muls r7, r6, r7\n\t"
  157877. #elif defined(__clang__)
  157878. "muls r7, r6\n\t"
  157879. #else
  157880. "mul r7, r6\n\t"
  157881. #endif
  157882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157883. "adds r3, r3, r7\n\t"
  157884. #else
  157885. "add r3, r3, r7\n\t"
  157886. #endif
  157887. #ifdef WOLFSSL_KEIL
  157888. "adcs r4, r4, %[r]\n\t"
  157889. #elif defined(__clang__)
  157890. "adcs r4, %[r]\n\t"
  157891. #else
  157892. "adc r4, %[r]\n\t"
  157893. #endif
  157894. #ifdef WOLFSSL_KEIL
  157895. "adcs r5, r5, %[r]\n\t"
  157896. #elif defined(__clang__)
  157897. "adcs r5, %[r]\n\t"
  157898. #else
  157899. "adc r5, %[r]\n\t"
  157900. #endif
  157901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157902. "lsrs r7, %[b], #16\n\t"
  157903. #else
  157904. "lsr r7, %[b], #16\n\t"
  157905. #endif
  157906. #ifdef WOLFSSL_KEIL
  157907. "muls r6, r7, r6\n\t"
  157908. #elif defined(__clang__)
  157909. "muls r6, r7\n\t"
  157910. #else
  157911. "mul r6, r7\n\t"
  157912. #endif
  157913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157914. "lsrs r7, r6, #16\n\t"
  157915. #else
  157916. "lsr r7, r6, #16\n\t"
  157917. #endif
  157918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157919. "lsls r6, r6, #16\n\t"
  157920. #else
  157921. "lsl r6, r6, #16\n\t"
  157922. #endif
  157923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157924. "adds r3, r3, r6\n\t"
  157925. #else
  157926. "add r3, r3, r6\n\t"
  157927. #endif
  157928. #ifdef WOLFSSL_KEIL
  157929. "adcs r4, r4, r7\n\t"
  157930. #elif defined(__clang__)
  157931. "adcs r4, r7\n\t"
  157932. #else
  157933. "adc r4, r7\n\t"
  157934. #endif
  157935. #ifdef WOLFSSL_KEIL
  157936. "adcs r5, r5, %[r]\n\t"
  157937. #elif defined(__clang__)
  157938. "adcs r5, %[r]\n\t"
  157939. #else
  157940. "adc r5, %[r]\n\t"
  157941. #endif
  157942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157943. "lsrs r6, %[a], #16\n\t"
  157944. #else
  157945. "lsr r6, %[a], #16\n\t"
  157946. #endif
  157947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157948. "lsrs r7, %[b], #16\n\t"
  157949. #else
  157950. "lsr r7, %[b], #16\n\t"
  157951. #endif
  157952. #ifdef WOLFSSL_KEIL
  157953. "muls r7, r6, r7\n\t"
  157954. #elif defined(__clang__)
  157955. "muls r7, r6\n\t"
  157956. #else
  157957. "mul r7, r6\n\t"
  157958. #endif
  157959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157960. "adds r4, r4, r7\n\t"
  157961. #else
  157962. "add r4, r4, r7\n\t"
  157963. #endif
  157964. #ifdef WOLFSSL_KEIL
  157965. "adcs r5, r5, %[r]\n\t"
  157966. #elif defined(__clang__)
  157967. "adcs r5, %[r]\n\t"
  157968. #else
  157969. "adc r5, %[r]\n\t"
  157970. #endif
  157971. "uxth r7, %[b]\n\t"
  157972. #ifdef WOLFSSL_KEIL
  157973. "muls r6, r7, r6\n\t"
  157974. #elif defined(__clang__)
  157975. "muls r6, r7\n\t"
  157976. #else
  157977. "mul r6, r7\n\t"
  157978. #endif
  157979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157980. "lsrs r7, r6, #16\n\t"
  157981. #else
  157982. "lsr r7, r6, #16\n\t"
  157983. #endif
  157984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157985. "lsls r6, r6, #16\n\t"
  157986. #else
  157987. "lsl r6, r6, #16\n\t"
  157988. #endif
  157989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157990. "adds r3, r3, r6\n\t"
  157991. #else
  157992. "add r3, r3, r6\n\t"
  157993. #endif
  157994. #ifdef WOLFSSL_KEIL
  157995. "adcs r4, r4, r7\n\t"
  157996. #elif defined(__clang__)
  157997. "adcs r4, r7\n\t"
  157998. #else
  157999. "adc r4, r7\n\t"
  158000. #endif
  158001. #ifdef WOLFSSL_KEIL
  158002. "adcs r5, r5, %[r]\n\t"
  158003. #elif defined(__clang__)
  158004. "adcs r5, %[r]\n\t"
  158005. #else
  158006. "adc r5, %[r]\n\t"
  158007. #endif
  158008. "# A[13] * B[5]\n\t"
  158009. "mov %[a], r9\n\t"
  158010. "mov %[b], r10\n\t"
  158011. "ldr %[a], [%[a], #52]\n\t"
  158012. "ldr %[b], [%[b], #20]\n\t"
  158013. "uxth r6, %[a]\n\t"
  158014. "uxth r7, %[b]\n\t"
  158015. #ifdef WOLFSSL_KEIL
  158016. "muls r7, r6, r7\n\t"
  158017. #elif defined(__clang__)
  158018. "muls r7, r6\n\t"
  158019. #else
  158020. "mul r7, r6\n\t"
  158021. #endif
  158022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158023. "adds r3, r3, r7\n\t"
  158024. #else
  158025. "add r3, r3, r7\n\t"
  158026. #endif
  158027. #ifdef WOLFSSL_KEIL
  158028. "adcs r4, r4, %[r]\n\t"
  158029. #elif defined(__clang__)
  158030. "adcs r4, %[r]\n\t"
  158031. #else
  158032. "adc r4, %[r]\n\t"
  158033. #endif
  158034. #ifdef WOLFSSL_KEIL
  158035. "adcs r5, r5, %[r]\n\t"
  158036. #elif defined(__clang__)
  158037. "adcs r5, %[r]\n\t"
  158038. #else
  158039. "adc r5, %[r]\n\t"
  158040. #endif
  158041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158042. "lsrs r7, %[b], #16\n\t"
  158043. #else
  158044. "lsr r7, %[b], #16\n\t"
  158045. #endif
  158046. #ifdef WOLFSSL_KEIL
  158047. "muls r6, r7, r6\n\t"
  158048. #elif defined(__clang__)
  158049. "muls r6, r7\n\t"
  158050. #else
  158051. "mul r6, r7\n\t"
  158052. #endif
  158053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158054. "lsrs r7, r6, #16\n\t"
  158055. #else
  158056. "lsr r7, r6, #16\n\t"
  158057. #endif
  158058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158059. "lsls r6, r6, #16\n\t"
  158060. #else
  158061. "lsl r6, r6, #16\n\t"
  158062. #endif
  158063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158064. "adds r3, r3, r6\n\t"
  158065. #else
  158066. "add r3, r3, r6\n\t"
  158067. #endif
  158068. #ifdef WOLFSSL_KEIL
  158069. "adcs r4, r4, r7\n\t"
  158070. #elif defined(__clang__)
  158071. "adcs r4, r7\n\t"
  158072. #else
  158073. "adc r4, r7\n\t"
  158074. #endif
  158075. #ifdef WOLFSSL_KEIL
  158076. "adcs r5, r5, %[r]\n\t"
  158077. #elif defined(__clang__)
  158078. "adcs r5, %[r]\n\t"
  158079. #else
  158080. "adc r5, %[r]\n\t"
  158081. #endif
  158082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158083. "lsrs r6, %[a], #16\n\t"
  158084. #else
  158085. "lsr r6, %[a], #16\n\t"
  158086. #endif
  158087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158088. "lsrs r7, %[b], #16\n\t"
  158089. #else
  158090. "lsr r7, %[b], #16\n\t"
  158091. #endif
  158092. #ifdef WOLFSSL_KEIL
  158093. "muls r7, r6, r7\n\t"
  158094. #elif defined(__clang__)
  158095. "muls r7, r6\n\t"
  158096. #else
  158097. "mul r7, r6\n\t"
  158098. #endif
  158099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158100. "adds r4, r4, r7\n\t"
  158101. #else
  158102. "add r4, r4, r7\n\t"
  158103. #endif
  158104. #ifdef WOLFSSL_KEIL
  158105. "adcs r5, r5, %[r]\n\t"
  158106. #elif defined(__clang__)
  158107. "adcs r5, %[r]\n\t"
  158108. #else
  158109. "adc r5, %[r]\n\t"
  158110. #endif
  158111. "uxth r7, %[b]\n\t"
  158112. #ifdef WOLFSSL_KEIL
  158113. "muls r6, r7, r6\n\t"
  158114. #elif defined(__clang__)
  158115. "muls r6, r7\n\t"
  158116. #else
  158117. "mul r6, r7\n\t"
  158118. #endif
  158119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158120. "lsrs r7, r6, #16\n\t"
  158121. #else
  158122. "lsr r7, r6, #16\n\t"
  158123. #endif
  158124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158125. "lsls r6, r6, #16\n\t"
  158126. #else
  158127. "lsl r6, r6, #16\n\t"
  158128. #endif
  158129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158130. "adds r3, r3, r6\n\t"
  158131. #else
  158132. "add r3, r3, r6\n\t"
  158133. #endif
  158134. #ifdef WOLFSSL_KEIL
  158135. "adcs r4, r4, r7\n\t"
  158136. #elif defined(__clang__)
  158137. "adcs r4, r7\n\t"
  158138. #else
  158139. "adc r4, r7\n\t"
  158140. #endif
  158141. #ifdef WOLFSSL_KEIL
  158142. "adcs r5, r5, %[r]\n\t"
  158143. #elif defined(__clang__)
  158144. "adcs r5, %[r]\n\t"
  158145. #else
  158146. "adc r5, %[r]\n\t"
  158147. #endif
  158148. "# A[12] * B[6]\n\t"
  158149. "mov %[a], r9\n\t"
  158150. "mov %[b], r10\n\t"
  158151. "ldr %[a], [%[a], #48]\n\t"
  158152. "ldr %[b], [%[b], #24]\n\t"
  158153. "uxth r6, %[a]\n\t"
  158154. "uxth r7, %[b]\n\t"
  158155. #ifdef WOLFSSL_KEIL
  158156. "muls r7, r6, r7\n\t"
  158157. #elif defined(__clang__)
  158158. "muls r7, r6\n\t"
  158159. #else
  158160. "mul r7, r6\n\t"
  158161. #endif
  158162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158163. "adds r3, r3, r7\n\t"
  158164. #else
  158165. "add r3, r3, r7\n\t"
  158166. #endif
  158167. #ifdef WOLFSSL_KEIL
  158168. "adcs r4, r4, %[r]\n\t"
  158169. #elif defined(__clang__)
  158170. "adcs r4, %[r]\n\t"
  158171. #else
  158172. "adc r4, %[r]\n\t"
  158173. #endif
  158174. #ifdef WOLFSSL_KEIL
  158175. "adcs r5, r5, %[r]\n\t"
  158176. #elif defined(__clang__)
  158177. "adcs r5, %[r]\n\t"
  158178. #else
  158179. "adc r5, %[r]\n\t"
  158180. #endif
  158181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158182. "lsrs r7, %[b], #16\n\t"
  158183. #else
  158184. "lsr r7, %[b], #16\n\t"
  158185. #endif
  158186. #ifdef WOLFSSL_KEIL
  158187. "muls r6, r7, r6\n\t"
  158188. #elif defined(__clang__)
  158189. "muls r6, r7\n\t"
  158190. #else
  158191. "mul r6, r7\n\t"
  158192. #endif
  158193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158194. "lsrs r7, r6, #16\n\t"
  158195. #else
  158196. "lsr r7, r6, #16\n\t"
  158197. #endif
  158198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158199. "lsls r6, r6, #16\n\t"
  158200. #else
  158201. "lsl r6, r6, #16\n\t"
  158202. #endif
  158203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158204. "adds r3, r3, r6\n\t"
  158205. #else
  158206. "add r3, r3, r6\n\t"
  158207. #endif
  158208. #ifdef WOLFSSL_KEIL
  158209. "adcs r4, r4, r7\n\t"
  158210. #elif defined(__clang__)
  158211. "adcs r4, r7\n\t"
  158212. #else
  158213. "adc r4, r7\n\t"
  158214. #endif
  158215. #ifdef WOLFSSL_KEIL
  158216. "adcs r5, r5, %[r]\n\t"
  158217. #elif defined(__clang__)
  158218. "adcs r5, %[r]\n\t"
  158219. #else
  158220. "adc r5, %[r]\n\t"
  158221. #endif
  158222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158223. "lsrs r6, %[a], #16\n\t"
  158224. #else
  158225. "lsr r6, %[a], #16\n\t"
  158226. #endif
  158227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158228. "lsrs r7, %[b], #16\n\t"
  158229. #else
  158230. "lsr r7, %[b], #16\n\t"
  158231. #endif
  158232. #ifdef WOLFSSL_KEIL
  158233. "muls r7, r6, r7\n\t"
  158234. #elif defined(__clang__)
  158235. "muls r7, r6\n\t"
  158236. #else
  158237. "mul r7, r6\n\t"
  158238. #endif
  158239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158240. "adds r4, r4, r7\n\t"
  158241. #else
  158242. "add r4, r4, r7\n\t"
  158243. #endif
  158244. #ifdef WOLFSSL_KEIL
  158245. "adcs r5, r5, %[r]\n\t"
  158246. #elif defined(__clang__)
  158247. "adcs r5, %[r]\n\t"
  158248. #else
  158249. "adc r5, %[r]\n\t"
  158250. #endif
  158251. "uxth r7, %[b]\n\t"
  158252. #ifdef WOLFSSL_KEIL
  158253. "muls r6, r7, r6\n\t"
  158254. #elif defined(__clang__)
  158255. "muls r6, r7\n\t"
  158256. #else
  158257. "mul r6, r7\n\t"
  158258. #endif
  158259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158260. "lsrs r7, r6, #16\n\t"
  158261. #else
  158262. "lsr r7, r6, #16\n\t"
  158263. #endif
  158264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158265. "lsls r6, r6, #16\n\t"
  158266. #else
  158267. "lsl r6, r6, #16\n\t"
  158268. #endif
  158269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158270. "adds r3, r3, r6\n\t"
  158271. #else
  158272. "add r3, r3, r6\n\t"
  158273. #endif
  158274. #ifdef WOLFSSL_KEIL
  158275. "adcs r4, r4, r7\n\t"
  158276. #elif defined(__clang__)
  158277. "adcs r4, r7\n\t"
  158278. #else
  158279. "adc r4, r7\n\t"
  158280. #endif
  158281. #ifdef WOLFSSL_KEIL
  158282. "adcs r5, r5, %[r]\n\t"
  158283. #elif defined(__clang__)
  158284. "adcs r5, %[r]\n\t"
  158285. #else
  158286. "adc r5, %[r]\n\t"
  158287. #endif
  158288. "# A[11] * B[7]\n\t"
  158289. "mov %[a], r9\n\t"
  158290. "mov %[b], r10\n\t"
  158291. "ldr %[a], [%[a], #44]\n\t"
  158292. "ldr %[b], [%[b], #28]\n\t"
  158293. "uxth r6, %[a]\n\t"
  158294. "uxth r7, %[b]\n\t"
  158295. #ifdef WOLFSSL_KEIL
  158296. "muls r7, r6, r7\n\t"
  158297. #elif defined(__clang__)
  158298. "muls r7, r6\n\t"
  158299. #else
  158300. "mul r7, r6\n\t"
  158301. #endif
  158302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158303. "adds r3, r3, r7\n\t"
  158304. #else
  158305. "add r3, r3, r7\n\t"
  158306. #endif
  158307. #ifdef WOLFSSL_KEIL
  158308. "adcs r4, r4, %[r]\n\t"
  158309. #elif defined(__clang__)
  158310. "adcs r4, %[r]\n\t"
  158311. #else
  158312. "adc r4, %[r]\n\t"
  158313. #endif
  158314. #ifdef WOLFSSL_KEIL
  158315. "adcs r5, r5, %[r]\n\t"
  158316. #elif defined(__clang__)
  158317. "adcs r5, %[r]\n\t"
  158318. #else
  158319. "adc r5, %[r]\n\t"
  158320. #endif
  158321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158322. "lsrs r7, %[b], #16\n\t"
  158323. #else
  158324. "lsr r7, %[b], #16\n\t"
  158325. #endif
  158326. #ifdef WOLFSSL_KEIL
  158327. "muls r6, r7, r6\n\t"
  158328. #elif defined(__clang__)
  158329. "muls r6, r7\n\t"
  158330. #else
  158331. "mul r6, r7\n\t"
  158332. #endif
  158333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158334. "lsrs r7, r6, #16\n\t"
  158335. #else
  158336. "lsr r7, r6, #16\n\t"
  158337. #endif
  158338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158339. "lsls r6, r6, #16\n\t"
  158340. #else
  158341. "lsl r6, r6, #16\n\t"
  158342. #endif
  158343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158344. "adds r3, r3, r6\n\t"
  158345. #else
  158346. "add r3, r3, r6\n\t"
  158347. #endif
  158348. #ifdef WOLFSSL_KEIL
  158349. "adcs r4, r4, r7\n\t"
  158350. #elif defined(__clang__)
  158351. "adcs r4, r7\n\t"
  158352. #else
  158353. "adc r4, r7\n\t"
  158354. #endif
  158355. #ifdef WOLFSSL_KEIL
  158356. "adcs r5, r5, %[r]\n\t"
  158357. #elif defined(__clang__)
  158358. "adcs r5, %[r]\n\t"
  158359. #else
  158360. "adc r5, %[r]\n\t"
  158361. #endif
  158362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158363. "lsrs r6, %[a], #16\n\t"
  158364. #else
  158365. "lsr r6, %[a], #16\n\t"
  158366. #endif
  158367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158368. "lsrs r7, %[b], #16\n\t"
  158369. #else
  158370. "lsr r7, %[b], #16\n\t"
  158371. #endif
  158372. #ifdef WOLFSSL_KEIL
  158373. "muls r7, r6, r7\n\t"
  158374. #elif defined(__clang__)
  158375. "muls r7, r6\n\t"
  158376. #else
  158377. "mul r7, r6\n\t"
  158378. #endif
  158379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158380. "adds r4, r4, r7\n\t"
  158381. #else
  158382. "add r4, r4, r7\n\t"
  158383. #endif
  158384. #ifdef WOLFSSL_KEIL
  158385. "adcs r5, r5, %[r]\n\t"
  158386. #elif defined(__clang__)
  158387. "adcs r5, %[r]\n\t"
  158388. #else
  158389. "adc r5, %[r]\n\t"
  158390. #endif
  158391. "uxth r7, %[b]\n\t"
  158392. #ifdef WOLFSSL_KEIL
  158393. "muls r6, r7, r6\n\t"
  158394. #elif defined(__clang__)
  158395. "muls r6, r7\n\t"
  158396. #else
  158397. "mul r6, r7\n\t"
  158398. #endif
  158399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158400. "lsrs r7, r6, #16\n\t"
  158401. #else
  158402. "lsr r7, r6, #16\n\t"
  158403. #endif
  158404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158405. "lsls r6, r6, #16\n\t"
  158406. #else
  158407. "lsl r6, r6, #16\n\t"
  158408. #endif
  158409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158410. "adds r3, r3, r6\n\t"
  158411. #else
  158412. "add r3, r3, r6\n\t"
  158413. #endif
  158414. #ifdef WOLFSSL_KEIL
  158415. "adcs r4, r4, r7\n\t"
  158416. #elif defined(__clang__)
  158417. "adcs r4, r7\n\t"
  158418. #else
  158419. "adc r4, r7\n\t"
  158420. #endif
  158421. #ifdef WOLFSSL_KEIL
  158422. "adcs r5, r5, %[r]\n\t"
  158423. #elif defined(__clang__)
  158424. "adcs r5, %[r]\n\t"
  158425. #else
  158426. "adc r5, %[r]\n\t"
  158427. #endif
  158428. "# A[10] * B[8]\n\t"
  158429. "mov %[a], r9\n\t"
  158430. "mov %[b], r10\n\t"
  158431. "ldr %[a], [%[a], #40]\n\t"
  158432. "ldr %[b], [%[b], #32]\n\t"
  158433. "uxth r6, %[a]\n\t"
  158434. "uxth r7, %[b]\n\t"
  158435. #ifdef WOLFSSL_KEIL
  158436. "muls r7, r6, r7\n\t"
  158437. #elif defined(__clang__)
  158438. "muls r7, r6\n\t"
  158439. #else
  158440. "mul r7, r6\n\t"
  158441. #endif
  158442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158443. "adds r3, r3, r7\n\t"
  158444. #else
  158445. "add r3, r3, r7\n\t"
  158446. #endif
  158447. #ifdef WOLFSSL_KEIL
  158448. "adcs r4, r4, %[r]\n\t"
  158449. #elif defined(__clang__)
  158450. "adcs r4, %[r]\n\t"
  158451. #else
  158452. "adc r4, %[r]\n\t"
  158453. #endif
  158454. #ifdef WOLFSSL_KEIL
  158455. "adcs r5, r5, %[r]\n\t"
  158456. #elif defined(__clang__)
  158457. "adcs r5, %[r]\n\t"
  158458. #else
  158459. "adc r5, %[r]\n\t"
  158460. #endif
  158461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158462. "lsrs r7, %[b], #16\n\t"
  158463. #else
  158464. "lsr r7, %[b], #16\n\t"
  158465. #endif
  158466. #ifdef WOLFSSL_KEIL
  158467. "muls r6, r7, r6\n\t"
  158468. #elif defined(__clang__)
  158469. "muls r6, r7\n\t"
  158470. #else
  158471. "mul r6, r7\n\t"
  158472. #endif
  158473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158474. "lsrs r7, r6, #16\n\t"
  158475. #else
  158476. "lsr r7, r6, #16\n\t"
  158477. #endif
  158478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158479. "lsls r6, r6, #16\n\t"
  158480. #else
  158481. "lsl r6, r6, #16\n\t"
  158482. #endif
  158483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158484. "adds r3, r3, r6\n\t"
  158485. #else
  158486. "add r3, r3, r6\n\t"
  158487. #endif
  158488. #ifdef WOLFSSL_KEIL
  158489. "adcs r4, r4, r7\n\t"
  158490. #elif defined(__clang__)
  158491. "adcs r4, r7\n\t"
  158492. #else
  158493. "adc r4, r7\n\t"
  158494. #endif
  158495. #ifdef WOLFSSL_KEIL
  158496. "adcs r5, r5, %[r]\n\t"
  158497. #elif defined(__clang__)
  158498. "adcs r5, %[r]\n\t"
  158499. #else
  158500. "adc r5, %[r]\n\t"
  158501. #endif
  158502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158503. "lsrs r6, %[a], #16\n\t"
  158504. #else
  158505. "lsr r6, %[a], #16\n\t"
  158506. #endif
  158507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158508. "lsrs r7, %[b], #16\n\t"
  158509. #else
  158510. "lsr r7, %[b], #16\n\t"
  158511. #endif
  158512. #ifdef WOLFSSL_KEIL
  158513. "muls r7, r6, r7\n\t"
  158514. #elif defined(__clang__)
  158515. "muls r7, r6\n\t"
  158516. #else
  158517. "mul r7, r6\n\t"
  158518. #endif
  158519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158520. "adds r4, r4, r7\n\t"
  158521. #else
  158522. "add r4, r4, r7\n\t"
  158523. #endif
  158524. #ifdef WOLFSSL_KEIL
  158525. "adcs r5, r5, %[r]\n\t"
  158526. #elif defined(__clang__)
  158527. "adcs r5, %[r]\n\t"
  158528. #else
  158529. "adc r5, %[r]\n\t"
  158530. #endif
  158531. "uxth r7, %[b]\n\t"
  158532. #ifdef WOLFSSL_KEIL
  158533. "muls r6, r7, r6\n\t"
  158534. #elif defined(__clang__)
  158535. "muls r6, r7\n\t"
  158536. #else
  158537. "mul r6, r7\n\t"
  158538. #endif
  158539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158540. "lsrs r7, r6, #16\n\t"
  158541. #else
  158542. "lsr r7, r6, #16\n\t"
  158543. #endif
  158544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158545. "lsls r6, r6, #16\n\t"
  158546. #else
  158547. "lsl r6, r6, #16\n\t"
  158548. #endif
  158549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158550. "adds r3, r3, r6\n\t"
  158551. #else
  158552. "add r3, r3, r6\n\t"
  158553. #endif
  158554. #ifdef WOLFSSL_KEIL
  158555. "adcs r4, r4, r7\n\t"
  158556. #elif defined(__clang__)
  158557. "adcs r4, r7\n\t"
  158558. #else
  158559. "adc r4, r7\n\t"
  158560. #endif
  158561. #ifdef WOLFSSL_KEIL
  158562. "adcs r5, r5, %[r]\n\t"
  158563. #elif defined(__clang__)
  158564. "adcs r5, %[r]\n\t"
  158565. #else
  158566. "adc r5, %[r]\n\t"
  158567. #endif
  158568. "# A[9] * B[9]\n\t"
  158569. "mov %[a], r9\n\t"
  158570. "mov %[b], r10\n\t"
  158571. "ldr %[a], [%[a], #36]\n\t"
  158572. "ldr %[b], [%[b], #36]\n\t"
  158573. "uxth r6, %[a]\n\t"
  158574. "uxth r7, %[b]\n\t"
  158575. #ifdef WOLFSSL_KEIL
  158576. "muls r7, r6, r7\n\t"
  158577. #elif defined(__clang__)
  158578. "muls r7, r6\n\t"
  158579. #else
  158580. "mul r7, r6\n\t"
  158581. #endif
  158582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158583. "adds r3, r3, r7\n\t"
  158584. #else
  158585. "add r3, r3, r7\n\t"
  158586. #endif
  158587. #ifdef WOLFSSL_KEIL
  158588. "adcs r4, r4, %[r]\n\t"
  158589. #elif defined(__clang__)
  158590. "adcs r4, %[r]\n\t"
  158591. #else
  158592. "adc r4, %[r]\n\t"
  158593. #endif
  158594. #ifdef WOLFSSL_KEIL
  158595. "adcs r5, r5, %[r]\n\t"
  158596. #elif defined(__clang__)
  158597. "adcs r5, %[r]\n\t"
  158598. #else
  158599. "adc r5, %[r]\n\t"
  158600. #endif
  158601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158602. "lsrs r7, %[b], #16\n\t"
  158603. #else
  158604. "lsr r7, %[b], #16\n\t"
  158605. #endif
  158606. #ifdef WOLFSSL_KEIL
  158607. "muls r6, r7, r6\n\t"
  158608. #elif defined(__clang__)
  158609. "muls r6, r7\n\t"
  158610. #else
  158611. "mul r6, r7\n\t"
  158612. #endif
  158613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158614. "lsrs r7, r6, #16\n\t"
  158615. #else
  158616. "lsr r7, r6, #16\n\t"
  158617. #endif
  158618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158619. "lsls r6, r6, #16\n\t"
  158620. #else
  158621. "lsl r6, r6, #16\n\t"
  158622. #endif
  158623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158624. "adds r3, r3, r6\n\t"
  158625. #else
  158626. "add r3, r3, r6\n\t"
  158627. #endif
  158628. #ifdef WOLFSSL_KEIL
  158629. "adcs r4, r4, r7\n\t"
  158630. #elif defined(__clang__)
  158631. "adcs r4, r7\n\t"
  158632. #else
  158633. "adc r4, r7\n\t"
  158634. #endif
  158635. #ifdef WOLFSSL_KEIL
  158636. "adcs r5, r5, %[r]\n\t"
  158637. #elif defined(__clang__)
  158638. "adcs r5, %[r]\n\t"
  158639. #else
  158640. "adc r5, %[r]\n\t"
  158641. #endif
  158642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158643. "lsrs r6, %[a], #16\n\t"
  158644. #else
  158645. "lsr r6, %[a], #16\n\t"
  158646. #endif
  158647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158648. "lsrs r7, %[b], #16\n\t"
  158649. #else
  158650. "lsr r7, %[b], #16\n\t"
  158651. #endif
  158652. #ifdef WOLFSSL_KEIL
  158653. "muls r7, r6, r7\n\t"
  158654. #elif defined(__clang__)
  158655. "muls r7, r6\n\t"
  158656. #else
  158657. "mul r7, r6\n\t"
  158658. #endif
  158659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158660. "adds r4, r4, r7\n\t"
  158661. #else
  158662. "add r4, r4, r7\n\t"
  158663. #endif
  158664. #ifdef WOLFSSL_KEIL
  158665. "adcs r5, r5, %[r]\n\t"
  158666. #elif defined(__clang__)
  158667. "adcs r5, %[r]\n\t"
  158668. #else
  158669. "adc r5, %[r]\n\t"
  158670. #endif
  158671. "uxth r7, %[b]\n\t"
  158672. #ifdef WOLFSSL_KEIL
  158673. "muls r6, r7, r6\n\t"
  158674. #elif defined(__clang__)
  158675. "muls r6, r7\n\t"
  158676. #else
  158677. "mul r6, r7\n\t"
  158678. #endif
  158679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158680. "lsrs r7, r6, #16\n\t"
  158681. #else
  158682. "lsr r7, r6, #16\n\t"
  158683. #endif
  158684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158685. "lsls r6, r6, #16\n\t"
  158686. #else
  158687. "lsl r6, r6, #16\n\t"
  158688. #endif
  158689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158690. "adds r3, r3, r6\n\t"
  158691. #else
  158692. "add r3, r3, r6\n\t"
  158693. #endif
  158694. #ifdef WOLFSSL_KEIL
  158695. "adcs r4, r4, r7\n\t"
  158696. #elif defined(__clang__)
  158697. "adcs r4, r7\n\t"
  158698. #else
  158699. "adc r4, r7\n\t"
  158700. #endif
  158701. #ifdef WOLFSSL_KEIL
  158702. "adcs r5, r5, %[r]\n\t"
  158703. #elif defined(__clang__)
  158704. "adcs r5, %[r]\n\t"
  158705. #else
  158706. "adc r5, %[r]\n\t"
  158707. #endif
  158708. "# A[8] * B[10]\n\t"
  158709. "mov %[a], r9\n\t"
  158710. "mov %[b], r10\n\t"
  158711. "ldr %[a], [%[a], #32]\n\t"
  158712. "ldr %[b], [%[b], #40]\n\t"
  158713. "uxth r6, %[a]\n\t"
  158714. "uxth r7, %[b]\n\t"
  158715. #ifdef WOLFSSL_KEIL
  158716. "muls r7, r6, r7\n\t"
  158717. #elif defined(__clang__)
  158718. "muls r7, r6\n\t"
  158719. #else
  158720. "mul r7, r6\n\t"
  158721. #endif
  158722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158723. "adds r3, r3, r7\n\t"
  158724. #else
  158725. "add r3, r3, r7\n\t"
  158726. #endif
  158727. #ifdef WOLFSSL_KEIL
  158728. "adcs r4, r4, %[r]\n\t"
  158729. #elif defined(__clang__)
  158730. "adcs r4, %[r]\n\t"
  158731. #else
  158732. "adc r4, %[r]\n\t"
  158733. #endif
  158734. #ifdef WOLFSSL_KEIL
  158735. "adcs r5, r5, %[r]\n\t"
  158736. #elif defined(__clang__)
  158737. "adcs r5, %[r]\n\t"
  158738. #else
  158739. "adc r5, %[r]\n\t"
  158740. #endif
  158741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158742. "lsrs r7, %[b], #16\n\t"
  158743. #else
  158744. "lsr r7, %[b], #16\n\t"
  158745. #endif
  158746. #ifdef WOLFSSL_KEIL
  158747. "muls r6, r7, r6\n\t"
  158748. #elif defined(__clang__)
  158749. "muls r6, r7\n\t"
  158750. #else
  158751. "mul r6, r7\n\t"
  158752. #endif
  158753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158754. "lsrs r7, r6, #16\n\t"
  158755. #else
  158756. "lsr r7, r6, #16\n\t"
  158757. #endif
  158758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158759. "lsls r6, r6, #16\n\t"
  158760. #else
  158761. "lsl r6, r6, #16\n\t"
  158762. #endif
  158763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158764. "adds r3, r3, r6\n\t"
  158765. #else
  158766. "add r3, r3, r6\n\t"
  158767. #endif
  158768. #ifdef WOLFSSL_KEIL
  158769. "adcs r4, r4, r7\n\t"
  158770. #elif defined(__clang__)
  158771. "adcs r4, r7\n\t"
  158772. #else
  158773. "adc r4, r7\n\t"
  158774. #endif
  158775. #ifdef WOLFSSL_KEIL
  158776. "adcs r5, r5, %[r]\n\t"
  158777. #elif defined(__clang__)
  158778. "adcs r5, %[r]\n\t"
  158779. #else
  158780. "adc r5, %[r]\n\t"
  158781. #endif
  158782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158783. "lsrs r6, %[a], #16\n\t"
  158784. #else
  158785. "lsr r6, %[a], #16\n\t"
  158786. #endif
  158787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158788. "lsrs r7, %[b], #16\n\t"
  158789. #else
  158790. "lsr r7, %[b], #16\n\t"
  158791. #endif
  158792. #ifdef WOLFSSL_KEIL
  158793. "muls r7, r6, r7\n\t"
  158794. #elif defined(__clang__)
  158795. "muls r7, r6\n\t"
  158796. #else
  158797. "mul r7, r6\n\t"
  158798. #endif
  158799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158800. "adds r4, r4, r7\n\t"
  158801. #else
  158802. "add r4, r4, r7\n\t"
  158803. #endif
  158804. #ifdef WOLFSSL_KEIL
  158805. "adcs r5, r5, %[r]\n\t"
  158806. #elif defined(__clang__)
  158807. "adcs r5, %[r]\n\t"
  158808. #else
  158809. "adc r5, %[r]\n\t"
  158810. #endif
  158811. "uxth r7, %[b]\n\t"
  158812. #ifdef WOLFSSL_KEIL
  158813. "muls r6, r7, r6\n\t"
  158814. #elif defined(__clang__)
  158815. "muls r6, r7\n\t"
  158816. #else
  158817. "mul r6, r7\n\t"
  158818. #endif
  158819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158820. "lsrs r7, r6, #16\n\t"
  158821. #else
  158822. "lsr r7, r6, #16\n\t"
  158823. #endif
  158824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158825. "lsls r6, r6, #16\n\t"
  158826. #else
  158827. "lsl r6, r6, #16\n\t"
  158828. #endif
  158829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158830. "adds r3, r3, r6\n\t"
  158831. #else
  158832. "add r3, r3, r6\n\t"
  158833. #endif
  158834. #ifdef WOLFSSL_KEIL
  158835. "adcs r4, r4, r7\n\t"
  158836. #elif defined(__clang__)
  158837. "adcs r4, r7\n\t"
  158838. #else
  158839. "adc r4, r7\n\t"
  158840. #endif
  158841. #ifdef WOLFSSL_KEIL
  158842. "adcs r5, r5, %[r]\n\t"
  158843. #elif defined(__clang__)
  158844. "adcs r5, %[r]\n\t"
  158845. #else
  158846. "adc r5, %[r]\n\t"
  158847. #endif
  158848. "# A[7] * B[11]\n\t"
  158849. "mov %[a], r9\n\t"
  158850. "mov %[b], r10\n\t"
  158851. "ldr %[a], [%[a], #28]\n\t"
  158852. "ldr %[b], [%[b], #44]\n\t"
  158853. "uxth r6, %[a]\n\t"
  158854. "uxth r7, %[b]\n\t"
  158855. #ifdef WOLFSSL_KEIL
  158856. "muls r7, r6, r7\n\t"
  158857. #elif defined(__clang__)
  158858. "muls r7, r6\n\t"
  158859. #else
  158860. "mul r7, r6\n\t"
  158861. #endif
  158862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158863. "adds r3, r3, r7\n\t"
  158864. #else
  158865. "add r3, r3, r7\n\t"
  158866. #endif
  158867. #ifdef WOLFSSL_KEIL
  158868. "adcs r4, r4, %[r]\n\t"
  158869. #elif defined(__clang__)
  158870. "adcs r4, %[r]\n\t"
  158871. #else
  158872. "adc r4, %[r]\n\t"
  158873. #endif
  158874. #ifdef WOLFSSL_KEIL
  158875. "adcs r5, r5, %[r]\n\t"
  158876. #elif defined(__clang__)
  158877. "adcs r5, %[r]\n\t"
  158878. #else
  158879. "adc r5, %[r]\n\t"
  158880. #endif
  158881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158882. "lsrs r7, %[b], #16\n\t"
  158883. #else
  158884. "lsr r7, %[b], #16\n\t"
  158885. #endif
  158886. #ifdef WOLFSSL_KEIL
  158887. "muls r6, r7, r6\n\t"
  158888. #elif defined(__clang__)
  158889. "muls r6, r7\n\t"
  158890. #else
  158891. "mul r6, r7\n\t"
  158892. #endif
  158893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158894. "lsrs r7, r6, #16\n\t"
  158895. #else
  158896. "lsr r7, r6, #16\n\t"
  158897. #endif
  158898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158899. "lsls r6, r6, #16\n\t"
  158900. #else
  158901. "lsl r6, r6, #16\n\t"
  158902. #endif
  158903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158904. "adds r3, r3, r6\n\t"
  158905. #else
  158906. "add r3, r3, r6\n\t"
  158907. #endif
  158908. #ifdef WOLFSSL_KEIL
  158909. "adcs r4, r4, r7\n\t"
  158910. #elif defined(__clang__)
  158911. "adcs r4, r7\n\t"
  158912. #else
  158913. "adc r4, r7\n\t"
  158914. #endif
  158915. #ifdef WOLFSSL_KEIL
  158916. "adcs r5, r5, %[r]\n\t"
  158917. #elif defined(__clang__)
  158918. "adcs r5, %[r]\n\t"
  158919. #else
  158920. "adc r5, %[r]\n\t"
  158921. #endif
  158922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158923. "lsrs r6, %[a], #16\n\t"
  158924. #else
  158925. "lsr r6, %[a], #16\n\t"
  158926. #endif
  158927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158928. "lsrs r7, %[b], #16\n\t"
  158929. #else
  158930. "lsr r7, %[b], #16\n\t"
  158931. #endif
  158932. #ifdef WOLFSSL_KEIL
  158933. "muls r7, r6, r7\n\t"
  158934. #elif defined(__clang__)
  158935. "muls r7, r6\n\t"
  158936. #else
  158937. "mul r7, r6\n\t"
  158938. #endif
  158939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158940. "adds r4, r4, r7\n\t"
  158941. #else
  158942. "add r4, r4, r7\n\t"
  158943. #endif
  158944. #ifdef WOLFSSL_KEIL
  158945. "adcs r5, r5, %[r]\n\t"
  158946. #elif defined(__clang__)
  158947. "adcs r5, %[r]\n\t"
  158948. #else
  158949. "adc r5, %[r]\n\t"
  158950. #endif
  158951. "uxth r7, %[b]\n\t"
  158952. #ifdef WOLFSSL_KEIL
  158953. "muls r6, r7, r6\n\t"
  158954. #elif defined(__clang__)
  158955. "muls r6, r7\n\t"
  158956. #else
  158957. "mul r6, r7\n\t"
  158958. #endif
  158959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158960. "lsrs r7, r6, #16\n\t"
  158961. #else
  158962. "lsr r7, r6, #16\n\t"
  158963. #endif
  158964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158965. "lsls r6, r6, #16\n\t"
  158966. #else
  158967. "lsl r6, r6, #16\n\t"
  158968. #endif
  158969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158970. "adds r3, r3, r6\n\t"
  158971. #else
  158972. "add r3, r3, r6\n\t"
  158973. #endif
  158974. #ifdef WOLFSSL_KEIL
  158975. "adcs r4, r4, r7\n\t"
  158976. #elif defined(__clang__)
  158977. "adcs r4, r7\n\t"
  158978. #else
  158979. "adc r4, r7\n\t"
  158980. #endif
  158981. #ifdef WOLFSSL_KEIL
  158982. "adcs r5, r5, %[r]\n\t"
  158983. #elif defined(__clang__)
  158984. "adcs r5, %[r]\n\t"
  158985. #else
  158986. "adc r5, %[r]\n\t"
  158987. #endif
  158988. "# A[6] * B[12]\n\t"
  158989. "mov %[a], r9\n\t"
  158990. "mov %[b], r10\n\t"
  158991. "ldr %[a], [%[a], #24]\n\t"
  158992. "ldr %[b], [%[b], #48]\n\t"
  158993. "uxth r6, %[a]\n\t"
  158994. "uxth r7, %[b]\n\t"
  158995. #ifdef WOLFSSL_KEIL
  158996. "muls r7, r6, r7\n\t"
  158997. #elif defined(__clang__)
  158998. "muls r7, r6\n\t"
  158999. #else
  159000. "mul r7, r6\n\t"
  159001. #endif
  159002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159003. "adds r3, r3, r7\n\t"
  159004. #else
  159005. "add r3, r3, r7\n\t"
  159006. #endif
  159007. #ifdef WOLFSSL_KEIL
  159008. "adcs r4, r4, %[r]\n\t"
  159009. #elif defined(__clang__)
  159010. "adcs r4, %[r]\n\t"
  159011. #else
  159012. "adc r4, %[r]\n\t"
  159013. #endif
  159014. #ifdef WOLFSSL_KEIL
  159015. "adcs r5, r5, %[r]\n\t"
  159016. #elif defined(__clang__)
  159017. "adcs r5, %[r]\n\t"
  159018. #else
  159019. "adc r5, %[r]\n\t"
  159020. #endif
  159021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159022. "lsrs r7, %[b], #16\n\t"
  159023. #else
  159024. "lsr r7, %[b], #16\n\t"
  159025. #endif
  159026. #ifdef WOLFSSL_KEIL
  159027. "muls r6, r7, r6\n\t"
  159028. #elif defined(__clang__)
  159029. "muls r6, r7\n\t"
  159030. #else
  159031. "mul r6, r7\n\t"
  159032. #endif
  159033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159034. "lsrs r7, r6, #16\n\t"
  159035. #else
  159036. "lsr r7, r6, #16\n\t"
  159037. #endif
  159038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159039. "lsls r6, r6, #16\n\t"
  159040. #else
  159041. "lsl r6, r6, #16\n\t"
  159042. #endif
  159043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159044. "adds r3, r3, r6\n\t"
  159045. #else
  159046. "add r3, r3, r6\n\t"
  159047. #endif
  159048. #ifdef WOLFSSL_KEIL
  159049. "adcs r4, r4, r7\n\t"
  159050. #elif defined(__clang__)
  159051. "adcs r4, r7\n\t"
  159052. #else
  159053. "adc r4, r7\n\t"
  159054. #endif
  159055. #ifdef WOLFSSL_KEIL
  159056. "adcs r5, r5, %[r]\n\t"
  159057. #elif defined(__clang__)
  159058. "adcs r5, %[r]\n\t"
  159059. #else
  159060. "adc r5, %[r]\n\t"
  159061. #endif
  159062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159063. "lsrs r6, %[a], #16\n\t"
  159064. #else
  159065. "lsr r6, %[a], #16\n\t"
  159066. #endif
  159067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159068. "lsrs r7, %[b], #16\n\t"
  159069. #else
  159070. "lsr r7, %[b], #16\n\t"
  159071. #endif
  159072. #ifdef WOLFSSL_KEIL
  159073. "muls r7, r6, r7\n\t"
  159074. #elif defined(__clang__)
  159075. "muls r7, r6\n\t"
  159076. #else
  159077. "mul r7, r6\n\t"
  159078. #endif
  159079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159080. "adds r4, r4, r7\n\t"
  159081. #else
  159082. "add r4, r4, r7\n\t"
  159083. #endif
  159084. #ifdef WOLFSSL_KEIL
  159085. "adcs r5, r5, %[r]\n\t"
  159086. #elif defined(__clang__)
  159087. "adcs r5, %[r]\n\t"
  159088. #else
  159089. "adc r5, %[r]\n\t"
  159090. #endif
  159091. "uxth r7, %[b]\n\t"
  159092. #ifdef WOLFSSL_KEIL
  159093. "muls r6, r7, r6\n\t"
  159094. #elif defined(__clang__)
  159095. "muls r6, r7\n\t"
  159096. #else
  159097. "mul r6, r7\n\t"
  159098. #endif
  159099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159100. "lsrs r7, r6, #16\n\t"
  159101. #else
  159102. "lsr r7, r6, #16\n\t"
  159103. #endif
  159104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159105. "lsls r6, r6, #16\n\t"
  159106. #else
  159107. "lsl r6, r6, #16\n\t"
  159108. #endif
  159109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159110. "adds r3, r3, r6\n\t"
  159111. #else
  159112. "add r3, r3, r6\n\t"
  159113. #endif
  159114. #ifdef WOLFSSL_KEIL
  159115. "adcs r4, r4, r7\n\t"
  159116. #elif defined(__clang__)
  159117. "adcs r4, r7\n\t"
  159118. #else
  159119. "adc r4, r7\n\t"
  159120. #endif
  159121. #ifdef WOLFSSL_KEIL
  159122. "adcs r5, r5, %[r]\n\t"
  159123. #elif defined(__clang__)
  159124. "adcs r5, %[r]\n\t"
  159125. #else
  159126. "adc r5, %[r]\n\t"
  159127. #endif
  159128. "# A[5] * B[13]\n\t"
  159129. "mov %[a], r9\n\t"
  159130. "mov %[b], r10\n\t"
  159131. "ldr %[a], [%[a], #20]\n\t"
  159132. "ldr %[b], [%[b], #52]\n\t"
  159133. "uxth r6, %[a]\n\t"
  159134. "uxth r7, %[b]\n\t"
  159135. #ifdef WOLFSSL_KEIL
  159136. "muls r7, r6, r7\n\t"
  159137. #elif defined(__clang__)
  159138. "muls r7, r6\n\t"
  159139. #else
  159140. "mul r7, r6\n\t"
  159141. #endif
  159142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159143. "adds r3, r3, r7\n\t"
  159144. #else
  159145. "add r3, r3, r7\n\t"
  159146. #endif
  159147. #ifdef WOLFSSL_KEIL
  159148. "adcs r4, r4, %[r]\n\t"
  159149. #elif defined(__clang__)
  159150. "adcs r4, %[r]\n\t"
  159151. #else
  159152. "adc r4, %[r]\n\t"
  159153. #endif
  159154. #ifdef WOLFSSL_KEIL
  159155. "adcs r5, r5, %[r]\n\t"
  159156. #elif defined(__clang__)
  159157. "adcs r5, %[r]\n\t"
  159158. #else
  159159. "adc r5, %[r]\n\t"
  159160. #endif
  159161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159162. "lsrs r7, %[b], #16\n\t"
  159163. #else
  159164. "lsr r7, %[b], #16\n\t"
  159165. #endif
  159166. #ifdef WOLFSSL_KEIL
  159167. "muls r6, r7, r6\n\t"
  159168. #elif defined(__clang__)
  159169. "muls r6, r7\n\t"
  159170. #else
  159171. "mul r6, r7\n\t"
  159172. #endif
  159173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159174. "lsrs r7, r6, #16\n\t"
  159175. #else
  159176. "lsr r7, r6, #16\n\t"
  159177. #endif
  159178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159179. "lsls r6, r6, #16\n\t"
  159180. #else
  159181. "lsl r6, r6, #16\n\t"
  159182. #endif
  159183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159184. "adds r3, r3, r6\n\t"
  159185. #else
  159186. "add r3, r3, r6\n\t"
  159187. #endif
  159188. #ifdef WOLFSSL_KEIL
  159189. "adcs r4, r4, r7\n\t"
  159190. #elif defined(__clang__)
  159191. "adcs r4, r7\n\t"
  159192. #else
  159193. "adc r4, r7\n\t"
  159194. #endif
  159195. #ifdef WOLFSSL_KEIL
  159196. "adcs r5, r5, %[r]\n\t"
  159197. #elif defined(__clang__)
  159198. "adcs r5, %[r]\n\t"
  159199. #else
  159200. "adc r5, %[r]\n\t"
  159201. #endif
  159202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159203. "lsrs r6, %[a], #16\n\t"
  159204. #else
  159205. "lsr r6, %[a], #16\n\t"
  159206. #endif
  159207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159208. "lsrs r7, %[b], #16\n\t"
  159209. #else
  159210. "lsr r7, %[b], #16\n\t"
  159211. #endif
  159212. #ifdef WOLFSSL_KEIL
  159213. "muls r7, r6, r7\n\t"
  159214. #elif defined(__clang__)
  159215. "muls r7, r6\n\t"
  159216. #else
  159217. "mul r7, r6\n\t"
  159218. #endif
  159219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159220. "adds r4, r4, r7\n\t"
  159221. #else
  159222. "add r4, r4, r7\n\t"
  159223. #endif
  159224. #ifdef WOLFSSL_KEIL
  159225. "adcs r5, r5, %[r]\n\t"
  159226. #elif defined(__clang__)
  159227. "adcs r5, %[r]\n\t"
  159228. #else
  159229. "adc r5, %[r]\n\t"
  159230. #endif
  159231. "uxth r7, %[b]\n\t"
  159232. #ifdef WOLFSSL_KEIL
  159233. "muls r6, r7, r6\n\t"
  159234. #elif defined(__clang__)
  159235. "muls r6, r7\n\t"
  159236. #else
  159237. "mul r6, r7\n\t"
  159238. #endif
  159239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159240. "lsrs r7, r6, #16\n\t"
  159241. #else
  159242. "lsr r7, r6, #16\n\t"
  159243. #endif
  159244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159245. "lsls r6, r6, #16\n\t"
  159246. #else
  159247. "lsl r6, r6, #16\n\t"
  159248. #endif
  159249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159250. "adds r3, r3, r6\n\t"
  159251. #else
  159252. "add r3, r3, r6\n\t"
  159253. #endif
  159254. #ifdef WOLFSSL_KEIL
  159255. "adcs r4, r4, r7\n\t"
  159256. #elif defined(__clang__)
  159257. "adcs r4, r7\n\t"
  159258. #else
  159259. "adc r4, r7\n\t"
  159260. #endif
  159261. #ifdef WOLFSSL_KEIL
  159262. "adcs r5, r5, %[r]\n\t"
  159263. #elif defined(__clang__)
  159264. "adcs r5, %[r]\n\t"
  159265. #else
  159266. "adc r5, %[r]\n\t"
  159267. #endif
  159268. "# A[4] * B[14]\n\t"
  159269. "mov %[a], r9\n\t"
  159270. "mov %[b], r10\n\t"
  159271. "ldr %[a], [%[a], #16]\n\t"
  159272. "ldr %[b], [%[b], #56]\n\t"
  159273. "uxth r6, %[a]\n\t"
  159274. "uxth r7, %[b]\n\t"
  159275. #ifdef WOLFSSL_KEIL
  159276. "muls r7, r6, r7\n\t"
  159277. #elif defined(__clang__)
  159278. "muls r7, r6\n\t"
  159279. #else
  159280. "mul r7, r6\n\t"
  159281. #endif
  159282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159283. "adds r3, r3, r7\n\t"
  159284. #else
  159285. "add r3, r3, r7\n\t"
  159286. #endif
  159287. #ifdef WOLFSSL_KEIL
  159288. "adcs r4, r4, %[r]\n\t"
  159289. #elif defined(__clang__)
  159290. "adcs r4, %[r]\n\t"
  159291. #else
  159292. "adc r4, %[r]\n\t"
  159293. #endif
  159294. #ifdef WOLFSSL_KEIL
  159295. "adcs r5, r5, %[r]\n\t"
  159296. #elif defined(__clang__)
  159297. "adcs r5, %[r]\n\t"
  159298. #else
  159299. "adc r5, %[r]\n\t"
  159300. #endif
  159301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159302. "lsrs r7, %[b], #16\n\t"
  159303. #else
  159304. "lsr r7, %[b], #16\n\t"
  159305. #endif
  159306. #ifdef WOLFSSL_KEIL
  159307. "muls r6, r7, r6\n\t"
  159308. #elif defined(__clang__)
  159309. "muls r6, r7\n\t"
  159310. #else
  159311. "mul r6, r7\n\t"
  159312. #endif
  159313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159314. "lsrs r7, r6, #16\n\t"
  159315. #else
  159316. "lsr r7, r6, #16\n\t"
  159317. #endif
  159318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159319. "lsls r6, r6, #16\n\t"
  159320. #else
  159321. "lsl r6, r6, #16\n\t"
  159322. #endif
  159323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159324. "adds r3, r3, r6\n\t"
  159325. #else
  159326. "add r3, r3, r6\n\t"
  159327. #endif
  159328. #ifdef WOLFSSL_KEIL
  159329. "adcs r4, r4, r7\n\t"
  159330. #elif defined(__clang__)
  159331. "adcs r4, r7\n\t"
  159332. #else
  159333. "adc r4, r7\n\t"
  159334. #endif
  159335. #ifdef WOLFSSL_KEIL
  159336. "adcs r5, r5, %[r]\n\t"
  159337. #elif defined(__clang__)
  159338. "adcs r5, %[r]\n\t"
  159339. #else
  159340. "adc r5, %[r]\n\t"
  159341. #endif
  159342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159343. "lsrs r6, %[a], #16\n\t"
  159344. #else
  159345. "lsr r6, %[a], #16\n\t"
  159346. #endif
  159347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159348. "lsrs r7, %[b], #16\n\t"
  159349. #else
  159350. "lsr r7, %[b], #16\n\t"
  159351. #endif
  159352. #ifdef WOLFSSL_KEIL
  159353. "muls r7, r6, r7\n\t"
  159354. #elif defined(__clang__)
  159355. "muls r7, r6\n\t"
  159356. #else
  159357. "mul r7, r6\n\t"
  159358. #endif
  159359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159360. "adds r4, r4, r7\n\t"
  159361. #else
  159362. "add r4, r4, r7\n\t"
  159363. #endif
  159364. #ifdef WOLFSSL_KEIL
  159365. "adcs r5, r5, %[r]\n\t"
  159366. #elif defined(__clang__)
  159367. "adcs r5, %[r]\n\t"
  159368. #else
  159369. "adc r5, %[r]\n\t"
  159370. #endif
  159371. "uxth r7, %[b]\n\t"
  159372. #ifdef WOLFSSL_KEIL
  159373. "muls r6, r7, r6\n\t"
  159374. #elif defined(__clang__)
  159375. "muls r6, r7\n\t"
  159376. #else
  159377. "mul r6, r7\n\t"
  159378. #endif
  159379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159380. "lsrs r7, r6, #16\n\t"
  159381. #else
  159382. "lsr r7, r6, #16\n\t"
  159383. #endif
  159384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159385. "lsls r6, r6, #16\n\t"
  159386. #else
  159387. "lsl r6, r6, #16\n\t"
  159388. #endif
  159389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159390. "adds r3, r3, r6\n\t"
  159391. #else
  159392. "add r3, r3, r6\n\t"
  159393. #endif
  159394. #ifdef WOLFSSL_KEIL
  159395. "adcs r4, r4, r7\n\t"
  159396. #elif defined(__clang__)
  159397. "adcs r4, r7\n\t"
  159398. #else
  159399. "adc r4, r7\n\t"
  159400. #endif
  159401. #ifdef WOLFSSL_KEIL
  159402. "adcs r5, r5, %[r]\n\t"
  159403. #elif defined(__clang__)
  159404. "adcs r5, %[r]\n\t"
  159405. #else
  159406. "adc r5, %[r]\n\t"
  159407. #endif
  159408. "# A[3] * B[15]\n\t"
  159409. "mov %[a], r9\n\t"
  159410. "mov %[b], r10\n\t"
  159411. "ldr %[a], [%[a], #12]\n\t"
  159412. "ldr %[b], [%[b], #60]\n\t"
  159413. "uxth r6, %[a]\n\t"
  159414. "uxth r7, %[b]\n\t"
  159415. #ifdef WOLFSSL_KEIL
  159416. "muls r7, r6, r7\n\t"
  159417. #elif defined(__clang__)
  159418. "muls r7, r6\n\t"
  159419. #else
  159420. "mul r7, r6\n\t"
  159421. #endif
  159422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159423. "adds r3, r3, r7\n\t"
  159424. #else
  159425. "add r3, r3, r7\n\t"
  159426. #endif
  159427. #ifdef WOLFSSL_KEIL
  159428. "adcs r4, r4, %[r]\n\t"
  159429. #elif defined(__clang__)
  159430. "adcs r4, %[r]\n\t"
  159431. #else
  159432. "adc r4, %[r]\n\t"
  159433. #endif
  159434. #ifdef WOLFSSL_KEIL
  159435. "adcs r5, r5, %[r]\n\t"
  159436. #elif defined(__clang__)
  159437. "adcs r5, %[r]\n\t"
  159438. #else
  159439. "adc r5, %[r]\n\t"
  159440. #endif
  159441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159442. "lsrs r7, %[b], #16\n\t"
  159443. #else
  159444. "lsr r7, %[b], #16\n\t"
  159445. #endif
  159446. #ifdef WOLFSSL_KEIL
  159447. "muls r6, r7, r6\n\t"
  159448. #elif defined(__clang__)
  159449. "muls r6, r7\n\t"
  159450. #else
  159451. "mul r6, r7\n\t"
  159452. #endif
  159453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159454. "lsrs r7, r6, #16\n\t"
  159455. #else
  159456. "lsr r7, r6, #16\n\t"
  159457. #endif
  159458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159459. "lsls r6, r6, #16\n\t"
  159460. #else
  159461. "lsl r6, r6, #16\n\t"
  159462. #endif
  159463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159464. "adds r3, r3, r6\n\t"
  159465. #else
  159466. "add r3, r3, r6\n\t"
  159467. #endif
  159468. #ifdef WOLFSSL_KEIL
  159469. "adcs r4, r4, r7\n\t"
  159470. #elif defined(__clang__)
  159471. "adcs r4, r7\n\t"
  159472. #else
  159473. "adc r4, r7\n\t"
  159474. #endif
  159475. #ifdef WOLFSSL_KEIL
  159476. "adcs r5, r5, %[r]\n\t"
  159477. #elif defined(__clang__)
  159478. "adcs r5, %[r]\n\t"
  159479. #else
  159480. "adc r5, %[r]\n\t"
  159481. #endif
  159482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159483. "lsrs r6, %[a], #16\n\t"
  159484. #else
  159485. "lsr r6, %[a], #16\n\t"
  159486. #endif
  159487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159488. "lsrs r7, %[b], #16\n\t"
  159489. #else
  159490. "lsr r7, %[b], #16\n\t"
  159491. #endif
  159492. #ifdef WOLFSSL_KEIL
  159493. "muls r7, r6, r7\n\t"
  159494. #elif defined(__clang__)
  159495. "muls r7, r6\n\t"
  159496. #else
  159497. "mul r7, r6\n\t"
  159498. #endif
  159499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159500. "adds r4, r4, r7\n\t"
  159501. #else
  159502. "add r4, r4, r7\n\t"
  159503. #endif
  159504. #ifdef WOLFSSL_KEIL
  159505. "adcs r5, r5, %[r]\n\t"
  159506. #elif defined(__clang__)
  159507. "adcs r5, %[r]\n\t"
  159508. #else
  159509. "adc r5, %[r]\n\t"
  159510. #endif
  159511. "uxth r7, %[b]\n\t"
  159512. #ifdef WOLFSSL_KEIL
  159513. "muls r6, r7, r6\n\t"
  159514. #elif defined(__clang__)
  159515. "muls r6, r7\n\t"
  159516. #else
  159517. "mul r6, r7\n\t"
  159518. #endif
  159519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159520. "lsrs r7, r6, #16\n\t"
  159521. #else
  159522. "lsr r7, r6, #16\n\t"
  159523. #endif
  159524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159525. "lsls r6, r6, #16\n\t"
  159526. #else
  159527. "lsl r6, r6, #16\n\t"
  159528. #endif
  159529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159530. "adds r3, r3, r6\n\t"
  159531. #else
  159532. "add r3, r3, r6\n\t"
  159533. #endif
  159534. #ifdef WOLFSSL_KEIL
  159535. "adcs r4, r4, r7\n\t"
  159536. #elif defined(__clang__)
  159537. "adcs r4, r7\n\t"
  159538. #else
  159539. "adc r4, r7\n\t"
  159540. #endif
  159541. #ifdef WOLFSSL_KEIL
  159542. "adcs r5, r5, %[r]\n\t"
  159543. #elif defined(__clang__)
  159544. "adcs r5, %[r]\n\t"
  159545. #else
  159546. "adc r5, %[r]\n\t"
  159547. #endif
  159548. "mov %[r], r8\n\t"
  159549. "str r3, [%[r], #72]\n\t"
  159550. "movs %[r], #0\n\t"
  159551. "# A[4] * B[15]\n\t"
  159552. "movs r3, #0\n\t"
  159553. "mov %[a], r9\n\t"
  159554. "mov %[b], r10\n\t"
  159555. "ldr %[a], [%[a], #16]\n\t"
  159556. "ldr %[b], [%[b], #60]\n\t"
  159557. "uxth r6, %[a]\n\t"
  159558. "uxth r7, %[b]\n\t"
  159559. #ifdef WOLFSSL_KEIL
  159560. "muls r7, r6, r7\n\t"
  159561. #elif defined(__clang__)
  159562. "muls r7, r6\n\t"
  159563. #else
  159564. "mul r7, r6\n\t"
  159565. #endif
  159566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159567. "adds r4, r4, r7\n\t"
  159568. #else
  159569. "add r4, r4, r7\n\t"
  159570. #endif
  159571. #ifdef WOLFSSL_KEIL
  159572. "adcs r5, r5, %[r]\n\t"
  159573. #elif defined(__clang__)
  159574. "adcs r5, %[r]\n\t"
  159575. #else
  159576. "adc r5, %[r]\n\t"
  159577. #endif
  159578. #ifdef WOLFSSL_KEIL
  159579. "adcs r3, r3, %[r]\n\t"
  159580. #elif defined(__clang__)
  159581. "adcs r3, %[r]\n\t"
  159582. #else
  159583. "adc r3, %[r]\n\t"
  159584. #endif
  159585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159586. "lsrs r7, %[b], #16\n\t"
  159587. #else
  159588. "lsr r7, %[b], #16\n\t"
  159589. #endif
  159590. #ifdef WOLFSSL_KEIL
  159591. "muls r6, r7, r6\n\t"
  159592. #elif defined(__clang__)
  159593. "muls r6, r7\n\t"
  159594. #else
  159595. "mul r6, r7\n\t"
  159596. #endif
  159597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159598. "lsrs r7, r6, #16\n\t"
  159599. #else
  159600. "lsr r7, r6, #16\n\t"
  159601. #endif
  159602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159603. "lsls r6, r6, #16\n\t"
  159604. #else
  159605. "lsl r6, r6, #16\n\t"
  159606. #endif
  159607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159608. "adds r4, r4, r6\n\t"
  159609. #else
  159610. "add r4, r4, r6\n\t"
  159611. #endif
  159612. #ifdef WOLFSSL_KEIL
  159613. "adcs r5, r5, r7\n\t"
  159614. #elif defined(__clang__)
  159615. "adcs r5, r7\n\t"
  159616. #else
  159617. "adc r5, r7\n\t"
  159618. #endif
  159619. #ifdef WOLFSSL_KEIL
  159620. "adcs r3, r3, %[r]\n\t"
  159621. #elif defined(__clang__)
  159622. "adcs r3, %[r]\n\t"
  159623. #else
  159624. "adc r3, %[r]\n\t"
  159625. #endif
  159626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159627. "lsrs r6, %[a], #16\n\t"
  159628. #else
  159629. "lsr r6, %[a], #16\n\t"
  159630. #endif
  159631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159632. "lsrs r7, %[b], #16\n\t"
  159633. #else
  159634. "lsr r7, %[b], #16\n\t"
  159635. #endif
  159636. #ifdef WOLFSSL_KEIL
  159637. "muls r7, r6, r7\n\t"
  159638. #elif defined(__clang__)
  159639. "muls r7, r6\n\t"
  159640. #else
  159641. "mul r7, r6\n\t"
  159642. #endif
  159643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159644. "adds r5, r5, r7\n\t"
  159645. #else
  159646. "add r5, r5, r7\n\t"
  159647. #endif
  159648. #ifdef WOLFSSL_KEIL
  159649. "adcs r3, r3, %[r]\n\t"
  159650. #elif defined(__clang__)
  159651. "adcs r3, %[r]\n\t"
  159652. #else
  159653. "adc r3, %[r]\n\t"
  159654. #endif
  159655. "uxth r7, %[b]\n\t"
  159656. #ifdef WOLFSSL_KEIL
  159657. "muls r6, r7, r6\n\t"
  159658. #elif defined(__clang__)
  159659. "muls r6, r7\n\t"
  159660. #else
  159661. "mul r6, r7\n\t"
  159662. #endif
  159663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159664. "lsrs r7, r6, #16\n\t"
  159665. #else
  159666. "lsr r7, r6, #16\n\t"
  159667. #endif
  159668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159669. "lsls r6, r6, #16\n\t"
  159670. #else
  159671. "lsl r6, r6, #16\n\t"
  159672. #endif
  159673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159674. "adds r4, r4, r6\n\t"
  159675. #else
  159676. "add r4, r4, r6\n\t"
  159677. #endif
  159678. #ifdef WOLFSSL_KEIL
  159679. "adcs r5, r5, r7\n\t"
  159680. #elif defined(__clang__)
  159681. "adcs r5, r7\n\t"
  159682. #else
  159683. "adc r5, r7\n\t"
  159684. #endif
  159685. #ifdef WOLFSSL_KEIL
  159686. "adcs r3, r3, %[r]\n\t"
  159687. #elif defined(__clang__)
  159688. "adcs r3, %[r]\n\t"
  159689. #else
  159690. "adc r3, %[r]\n\t"
  159691. #endif
  159692. "# A[5] * B[14]\n\t"
  159693. "mov %[a], r9\n\t"
  159694. "mov %[b], r10\n\t"
  159695. "ldr %[a], [%[a], #20]\n\t"
  159696. "ldr %[b], [%[b], #56]\n\t"
  159697. "uxth r6, %[a]\n\t"
  159698. "uxth r7, %[b]\n\t"
  159699. #ifdef WOLFSSL_KEIL
  159700. "muls r7, r6, r7\n\t"
  159701. #elif defined(__clang__)
  159702. "muls r7, r6\n\t"
  159703. #else
  159704. "mul r7, r6\n\t"
  159705. #endif
  159706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159707. "adds r4, r4, r7\n\t"
  159708. #else
  159709. "add r4, r4, r7\n\t"
  159710. #endif
  159711. #ifdef WOLFSSL_KEIL
  159712. "adcs r5, r5, %[r]\n\t"
  159713. #elif defined(__clang__)
  159714. "adcs r5, %[r]\n\t"
  159715. #else
  159716. "adc r5, %[r]\n\t"
  159717. #endif
  159718. #ifdef WOLFSSL_KEIL
  159719. "adcs r3, r3, %[r]\n\t"
  159720. #elif defined(__clang__)
  159721. "adcs r3, %[r]\n\t"
  159722. #else
  159723. "adc r3, %[r]\n\t"
  159724. #endif
  159725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159726. "lsrs r7, %[b], #16\n\t"
  159727. #else
  159728. "lsr r7, %[b], #16\n\t"
  159729. #endif
  159730. #ifdef WOLFSSL_KEIL
  159731. "muls r6, r7, r6\n\t"
  159732. #elif defined(__clang__)
  159733. "muls r6, r7\n\t"
  159734. #else
  159735. "mul r6, r7\n\t"
  159736. #endif
  159737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159738. "lsrs r7, r6, #16\n\t"
  159739. #else
  159740. "lsr r7, r6, #16\n\t"
  159741. #endif
  159742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159743. "lsls r6, r6, #16\n\t"
  159744. #else
  159745. "lsl r6, r6, #16\n\t"
  159746. #endif
  159747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159748. "adds r4, r4, r6\n\t"
  159749. #else
  159750. "add r4, r4, r6\n\t"
  159751. #endif
  159752. #ifdef WOLFSSL_KEIL
  159753. "adcs r5, r5, r7\n\t"
  159754. #elif defined(__clang__)
  159755. "adcs r5, r7\n\t"
  159756. #else
  159757. "adc r5, r7\n\t"
  159758. #endif
  159759. #ifdef WOLFSSL_KEIL
  159760. "adcs r3, r3, %[r]\n\t"
  159761. #elif defined(__clang__)
  159762. "adcs r3, %[r]\n\t"
  159763. #else
  159764. "adc r3, %[r]\n\t"
  159765. #endif
  159766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159767. "lsrs r6, %[a], #16\n\t"
  159768. #else
  159769. "lsr r6, %[a], #16\n\t"
  159770. #endif
  159771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159772. "lsrs r7, %[b], #16\n\t"
  159773. #else
  159774. "lsr r7, %[b], #16\n\t"
  159775. #endif
  159776. #ifdef WOLFSSL_KEIL
  159777. "muls r7, r6, r7\n\t"
  159778. #elif defined(__clang__)
  159779. "muls r7, r6\n\t"
  159780. #else
  159781. "mul r7, r6\n\t"
  159782. #endif
  159783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159784. "adds r5, r5, r7\n\t"
  159785. #else
  159786. "add r5, r5, r7\n\t"
  159787. #endif
  159788. #ifdef WOLFSSL_KEIL
  159789. "adcs r3, r3, %[r]\n\t"
  159790. #elif defined(__clang__)
  159791. "adcs r3, %[r]\n\t"
  159792. #else
  159793. "adc r3, %[r]\n\t"
  159794. #endif
  159795. "uxth r7, %[b]\n\t"
  159796. #ifdef WOLFSSL_KEIL
  159797. "muls r6, r7, r6\n\t"
  159798. #elif defined(__clang__)
  159799. "muls r6, r7\n\t"
  159800. #else
  159801. "mul r6, r7\n\t"
  159802. #endif
  159803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159804. "lsrs r7, r6, #16\n\t"
  159805. #else
  159806. "lsr r7, r6, #16\n\t"
  159807. #endif
  159808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159809. "lsls r6, r6, #16\n\t"
  159810. #else
  159811. "lsl r6, r6, #16\n\t"
  159812. #endif
  159813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159814. "adds r4, r4, r6\n\t"
  159815. #else
  159816. "add r4, r4, r6\n\t"
  159817. #endif
  159818. #ifdef WOLFSSL_KEIL
  159819. "adcs r5, r5, r7\n\t"
  159820. #elif defined(__clang__)
  159821. "adcs r5, r7\n\t"
  159822. #else
  159823. "adc r5, r7\n\t"
  159824. #endif
  159825. #ifdef WOLFSSL_KEIL
  159826. "adcs r3, r3, %[r]\n\t"
  159827. #elif defined(__clang__)
  159828. "adcs r3, %[r]\n\t"
  159829. #else
  159830. "adc r3, %[r]\n\t"
  159831. #endif
  159832. "# A[6] * B[13]\n\t"
  159833. "mov %[a], r9\n\t"
  159834. "mov %[b], r10\n\t"
  159835. "ldr %[a], [%[a], #24]\n\t"
  159836. "ldr %[b], [%[b], #52]\n\t"
  159837. "uxth r6, %[a]\n\t"
  159838. "uxth r7, %[b]\n\t"
  159839. #ifdef WOLFSSL_KEIL
  159840. "muls r7, r6, r7\n\t"
  159841. #elif defined(__clang__)
  159842. "muls r7, r6\n\t"
  159843. #else
  159844. "mul r7, r6\n\t"
  159845. #endif
  159846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159847. "adds r4, r4, r7\n\t"
  159848. #else
  159849. "add r4, r4, r7\n\t"
  159850. #endif
  159851. #ifdef WOLFSSL_KEIL
  159852. "adcs r5, r5, %[r]\n\t"
  159853. #elif defined(__clang__)
  159854. "adcs r5, %[r]\n\t"
  159855. #else
  159856. "adc r5, %[r]\n\t"
  159857. #endif
  159858. #ifdef WOLFSSL_KEIL
  159859. "adcs r3, r3, %[r]\n\t"
  159860. #elif defined(__clang__)
  159861. "adcs r3, %[r]\n\t"
  159862. #else
  159863. "adc r3, %[r]\n\t"
  159864. #endif
  159865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159866. "lsrs r7, %[b], #16\n\t"
  159867. #else
  159868. "lsr r7, %[b], #16\n\t"
  159869. #endif
  159870. #ifdef WOLFSSL_KEIL
  159871. "muls r6, r7, r6\n\t"
  159872. #elif defined(__clang__)
  159873. "muls r6, r7\n\t"
  159874. #else
  159875. "mul r6, r7\n\t"
  159876. #endif
  159877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159878. "lsrs r7, r6, #16\n\t"
  159879. #else
  159880. "lsr r7, r6, #16\n\t"
  159881. #endif
  159882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159883. "lsls r6, r6, #16\n\t"
  159884. #else
  159885. "lsl r6, r6, #16\n\t"
  159886. #endif
  159887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159888. "adds r4, r4, r6\n\t"
  159889. #else
  159890. "add r4, r4, r6\n\t"
  159891. #endif
  159892. #ifdef WOLFSSL_KEIL
  159893. "adcs r5, r5, r7\n\t"
  159894. #elif defined(__clang__)
  159895. "adcs r5, r7\n\t"
  159896. #else
  159897. "adc r5, r7\n\t"
  159898. #endif
  159899. #ifdef WOLFSSL_KEIL
  159900. "adcs r3, r3, %[r]\n\t"
  159901. #elif defined(__clang__)
  159902. "adcs r3, %[r]\n\t"
  159903. #else
  159904. "adc r3, %[r]\n\t"
  159905. #endif
  159906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159907. "lsrs r6, %[a], #16\n\t"
  159908. #else
  159909. "lsr r6, %[a], #16\n\t"
  159910. #endif
  159911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159912. "lsrs r7, %[b], #16\n\t"
  159913. #else
  159914. "lsr r7, %[b], #16\n\t"
  159915. #endif
  159916. #ifdef WOLFSSL_KEIL
  159917. "muls r7, r6, r7\n\t"
  159918. #elif defined(__clang__)
  159919. "muls r7, r6\n\t"
  159920. #else
  159921. "mul r7, r6\n\t"
  159922. #endif
  159923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159924. "adds r5, r5, r7\n\t"
  159925. #else
  159926. "add r5, r5, r7\n\t"
  159927. #endif
  159928. #ifdef WOLFSSL_KEIL
  159929. "adcs r3, r3, %[r]\n\t"
  159930. #elif defined(__clang__)
  159931. "adcs r3, %[r]\n\t"
  159932. #else
  159933. "adc r3, %[r]\n\t"
  159934. #endif
  159935. "uxth r7, %[b]\n\t"
  159936. #ifdef WOLFSSL_KEIL
  159937. "muls r6, r7, r6\n\t"
  159938. #elif defined(__clang__)
  159939. "muls r6, r7\n\t"
  159940. #else
  159941. "mul r6, r7\n\t"
  159942. #endif
  159943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159944. "lsrs r7, r6, #16\n\t"
  159945. #else
  159946. "lsr r7, r6, #16\n\t"
  159947. #endif
  159948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159949. "lsls r6, r6, #16\n\t"
  159950. #else
  159951. "lsl r6, r6, #16\n\t"
  159952. #endif
  159953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159954. "adds r4, r4, r6\n\t"
  159955. #else
  159956. "add r4, r4, r6\n\t"
  159957. #endif
  159958. #ifdef WOLFSSL_KEIL
  159959. "adcs r5, r5, r7\n\t"
  159960. #elif defined(__clang__)
  159961. "adcs r5, r7\n\t"
  159962. #else
  159963. "adc r5, r7\n\t"
  159964. #endif
  159965. #ifdef WOLFSSL_KEIL
  159966. "adcs r3, r3, %[r]\n\t"
  159967. #elif defined(__clang__)
  159968. "adcs r3, %[r]\n\t"
  159969. #else
  159970. "adc r3, %[r]\n\t"
  159971. #endif
  159972. "# A[7] * B[12]\n\t"
  159973. "mov %[a], r9\n\t"
  159974. "mov %[b], r10\n\t"
  159975. "ldr %[a], [%[a], #28]\n\t"
  159976. "ldr %[b], [%[b], #48]\n\t"
  159977. "uxth r6, %[a]\n\t"
  159978. "uxth r7, %[b]\n\t"
  159979. #ifdef WOLFSSL_KEIL
  159980. "muls r7, r6, r7\n\t"
  159981. #elif defined(__clang__)
  159982. "muls r7, r6\n\t"
  159983. #else
  159984. "mul r7, r6\n\t"
  159985. #endif
  159986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159987. "adds r4, r4, r7\n\t"
  159988. #else
  159989. "add r4, r4, r7\n\t"
  159990. #endif
  159991. #ifdef WOLFSSL_KEIL
  159992. "adcs r5, r5, %[r]\n\t"
  159993. #elif defined(__clang__)
  159994. "adcs r5, %[r]\n\t"
  159995. #else
  159996. "adc r5, %[r]\n\t"
  159997. #endif
  159998. #ifdef WOLFSSL_KEIL
  159999. "adcs r3, r3, %[r]\n\t"
  160000. #elif defined(__clang__)
  160001. "adcs r3, %[r]\n\t"
  160002. #else
  160003. "adc r3, %[r]\n\t"
  160004. #endif
  160005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160006. "lsrs r7, %[b], #16\n\t"
  160007. #else
  160008. "lsr r7, %[b], #16\n\t"
  160009. #endif
  160010. #ifdef WOLFSSL_KEIL
  160011. "muls r6, r7, r6\n\t"
  160012. #elif defined(__clang__)
  160013. "muls r6, r7\n\t"
  160014. #else
  160015. "mul r6, r7\n\t"
  160016. #endif
  160017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160018. "lsrs r7, r6, #16\n\t"
  160019. #else
  160020. "lsr r7, r6, #16\n\t"
  160021. #endif
  160022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160023. "lsls r6, r6, #16\n\t"
  160024. #else
  160025. "lsl r6, r6, #16\n\t"
  160026. #endif
  160027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160028. "adds r4, r4, r6\n\t"
  160029. #else
  160030. "add r4, r4, r6\n\t"
  160031. #endif
  160032. #ifdef WOLFSSL_KEIL
  160033. "adcs r5, r5, r7\n\t"
  160034. #elif defined(__clang__)
  160035. "adcs r5, r7\n\t"
  160036. #else
  160037. "adc r5, r7\n\t"
  160038. #endif
  160039. #ifdef WOLFSSL_KEIL
  160040. "adcs r3, r3, %[r]\n\t"
  160041. #elif defined(__clang__)
  160042. "adcs r3, %[r]\n\t"
  160043. #else
  160044. "adc r3, %[r]\n\t"
  160045. #endif
  160046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160047. "lsrs r6, %[a], #16\n\t"
  160048. #else
  160049. "lsr r6, %[a], #16\n\t"
  160050. #endif
  160051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160052. "lsrs r7, %[b], #16\n\t"
  160053. #else
  160054. "lsr r7, %[b], #16\n\t"
  160055. #endif
  160056. #ifdef WOLFSSL_KEIL
  160057. "muls r7, r6, r7\n\t"
  160058. #elif defined(__clang__)
  160059. "muls r7, r6\n\t"
  160060. #else
  160061. "mul r7, r6\n\t"
  160062. #endif
  160063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160064. "adds r5, r5, r7\n\t"
  160065. #else
  160066. "add r5, r5, r7\n\t"
  160067. #endif
  160068. #ifdef WOLFSSL_KEIL
  160069. "adcs r3, r3, %[r]\n\t"
  160070. #elif defined(__clang__)
  160071. "adcs r3, %[r]\n\t"
  160072. #else
  160073. "adc r3, %[r]\n\t"
  160074. #endif
  160075. "uxth r7, %[b]\n\t"
  160076. #ifdef WOLFSSL_KEIL
  160077. "muls r6, r7, r6\n\t"
  160078. #elif defined(__clang__)
  160079. "muls r6, r7\n\t"
  160080. #else
  160081. "mul r6, r7\n\t"
  160082. #endif
  160083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160084. "lsrs r7, r6, #16\n\t"
  160085. #else
  160086. "lsr r7, r6, #16\n\t"
  160087. #endif
  160088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160089. "lsls r6, r6, #16\n\t"
  160090. #else
  160091. "lsl r6, r6, #16\n\t"
  160092. #endif
  160093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160094. "adds r4, r4, r6\n\t"
  160095. #else
  160096. "add r4, r4, r6\n\t"
  160097. #endif
  160098. #ifdef WOLFSSL_KEIL
  160099. "adcs r5, r5, r7\n\t"
  160100. #elif defined(__clang__)
  160101. "adcs r5, r7\n\t"
  160102. #else
  160103. "adc r5, r7\n\t"
  160104. #endif
  160105. #ifdef WOLFSSL_KEIL
  160106. "adcs r3, r3, %[r]\n\t"
  160107. #elif defined(__clang__)
  160108. "adcs r3, %[r]\n\t"
  160109. #else
  160110. "adc r3, %[r]\n\t"
  160111. #endif
  160112. "# A[8] * B[11]\n\t"
  160113. "mov %[a], r9\n\t"
  160114. "mov %[b], r10\n\t"
  160115. "ldr %[a], [%[a], #32]\n\t"
  160116. "ldr %[b], [%[b], #44]\n\t"
  160117. "uxth r6, %[a]\n\t"
  160118. "uxth r7, %[b]\n\t"
  160119. #ifdef WOLFSSL_KEIL
  160120. "muls r7, r6, r7\n\t"
  160121. #elif defined(__clang__)
  160122. "muls r7, r6\n\t"
  160123. #else
  160124. "mul r7, r6\n\t"
  160125. #endif
  160126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160127. "adds r4, r4, r7\n\t"
  160128. #else
  160129. "add r4, r4, r7\n\t"
  160130. #endif
  160131. #ifdef WOLFSSL_KEIL
  160132. "adcs r5, r5, %[r]\n\t"
  160133. #elif defined(__clang__)
  160134. "adcs r5, %[r]\n\t"
  160135. #else
  160136. "adc r5, %[r]\n\t"
  160137. #endif
  160138. #ifdef WOLFSSL_KEIL
  160139. "adcs r3, r3, %[r]\n\t"
  160140. #elif defined(__clang__)
  160141. "adcs r3, %[r]\n\t"
  160142. #else
  160143. "adc r3, %[r]\n\t"
  160144. #endif
  160145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160146. "lsrs r7, %[b], #16\n\t"
  160147. #else
  160148. "lsr r7, %[b], #16\n\t"
  160149. #endif
  160150. #ifdef WOLFSSL_KEIL
  160151. "muls r6, r7, r6\n\t"
  160152. #elif defined(__clang__)
  160153. "muls r6, r7\n\t"
  160154. #else
  160155. "mul r6, r7\n\t"
  160156. #endif
  160157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160158. "lsrs r7, r6, #16\n\t"
  160159. #else
  160160. "lsr r7, r6, #16\n\t"
  160161. #endif
  160162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160163. "lsls r6, r6, #16\n\t"
  160164. #else
  160165. "lsl r6, r6, #16\n\t"
  160166. #endif
  160167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160168. "adds r4, r4, r6\n\t"
  160169. #else
  160170. "add r4, r4, r6\n\t"
  160171. #endif
  160172. #ifdef WOLFSSL_KEIL
  160173. "adcs r5, r5, r7\n\t"
  160174. #elif defined(__clang__)
  160175. "adcs r5, r7\n\t"
  160176. #else
  160177. "adc r5, r7\n\t"
  160178. #endif
  160179. #ifdef WOLFSSL_KEIL
  160180. "adcs r3, r3, %[r]\n\t"
  160181. #elif defined(__clang__)
  160182. "adcs r3, %[r]\n\t"
  160183. #else
  160184. "adc r3, %[r]\n\t"
  160185. #endif
  160186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160187. "lsrs r6, %[a], #16\n\t"
  160188. #else
  160189. "lsr r6, %[a], #16\n\t"
  160190. #endif
  160191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160192. "lsrs r7, %[b], #16\n\t"
  160193. #else
  160194. "lsr r7, %[b], #16\n\t"
  160195. #endif
  160196. #ifdef WOLFSSL_KEIL
  160197. "muls r7, r6, r7\n\t"
  160198. #elif defined(__clang__)
  160199. "muls r7, r6\n\t"
  160200. #else
  160201. "mul r7, r6\n\t"
  160202. #endif
  160203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160204. "adds r5, r5, r7\n\t"
  160205. #else
  160206. "add r5, r5, r7\n\t"
  160207. #endif
  160208. #ifdef WOLFSSL_KEIL
  160209. "adcs r3, r3, %[r]\n\t"
  160210. #elif defined(__clang__)
  160211. "adcs r3, %[r]\n\t"
  160212. #else
  160213. "adc r3, %[r]\n\t"
  160214. #endif
  160215. "uxth r7, %[b]\n\t"
  160216. #ifdef WOLFSSL_KEIL
  160217. "muls r6, r7, r6\n\t"
  160218. #elif defined(__clang__)
  160219. "muls r6, r7\n\t"
  160220. #else
  160221. "mul r6, r7\n\t"
  160222. #endif
  160223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160224. "lsrs r7, r6, #16\n\t"
  160225. #else
  160226. "lsr r7, r6, #16\n\t"
  160227. #endif
  160228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160229. "lsls r6, r6, #16\n\t"
  160230. #else
  160231. "lsl r6, r6, #16\n\t"
  160232. #endif
  160233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160234. "adds r4, r4, r6\n\t"
  160235. #else
  160236. "add r4, r4, r6\n\t"
  160237. #endif
  160238. #ifdef WOLFSSL_KEIL
  160239. "adcs r5, r5, r7\n\t"
  160240. #elif defined(__clang__)
  160241. "adcs r5, r7\n\t"
  160242. #else
  160243. "adc r5, r7\n\t"
  160244. #endif
  160245. #ifdef WOLFSSL_KEIL
  160246. "adcs r3, r3, %[r]\n\t"
  160247. #elif defined(__clang__)
  160248. "adcs r3, %[r]\n\t"
  160249. #else
  160250. "adc r3, %[r]\n\t"
  160251. #endif
  160252. "# A[9] * B[10]\n\t"
  160253. "mov %[a], r9\n\t"
  160254. "mov %[b], r10\n\t"
  160255. "ldr %[a], [%[a], #36]\n\t"
  160256. "ldr %[b], [%[b], #40]\n\t"
  160257. "uxth r6, %[a]\n\t"
  160258. "uxth r7, %[b]\n\t"
  160259. #ifdef WOLFSSL_KEIL
  160260. "muls r7, r6, r7\n\t"
  160261. #elif defined(__clang__)
  160262. "muls r7, r6\n\t"
  160263. #else
  160264. "mul r7, r6\n\t"
  160265. #endif
  160266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160267. "adds r4, r4, r7\n\t"
  160268. #else
  160269. "add r4, r4, r7\n\t"
  160270. #endif
  160271. #ifdef WOLFSSL_KEIL
  160272. "adcs r5, r5, %[r]\n\t"
  160273. #elif defined(__clang__)
  160274. "adcs r5, %[r]\n\t"
  160275. #else
  160276. "adc r5, %[r]\n\t"
  160277. #endif
  160278. #ifdef WOLFSSL_KEIL
  160279. "adcs r3, r3, %[r]\n\t"
  160280. #elif defined(__clang__)
  160281. "adcs r3, %[r]\n\t"
  160282. #else
  160283. "adc r3, %[r]\n\t"
  160284. #endif
  160285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160286. "lsrs r7, %[b], #16\n\t"
  160287. #else
  160288. "lsr r7, %[b], #16\n\t"
  160289. #endif
  160290. #ifdef WOLFSSL_KEIL
  160291. "muls r6, r7, r6\n\t"
  160292. #elif defined(__clang__)
  160293. "muls r6, r7\n\t"
  160294. #else
  160295. "mul r6, r7\n\t"
  160296. #endif
  160297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160298. "lsrs r7, r6, #16\n\t"
  160299. #else
  160300. "lsr r7, r6, #16\n\t"
  160301. #endif
  160302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160303. "lsls r6, r6, #16\n\t"
  160304. #else
  160305. "lsl r6, r6, #16\n\t"
  160306. #endif
  160307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160308. "adds r4, r4, r6\n\t"
  160309. #else
  160310. "add r4, r4, r6\n\t"
  160311. #endif
  160312. #ifdef WOLFSSL_KEIL
  160313. "adcs r5, r5, r7\n\t"
  160314. #elif defined(__clang__)
  160315. "adcs r5, r7\n\t"
  160316. #else
  160317. "adc r5, r7\n\t"
  160318. #endif
  160319. #ifdef WOLFSSL_KEIL
  160320. "adcs r3, r3, %[r]\n\t"
  160321. #elif defined(__clang__)
  160322. "adcs r3, %[r]\n\t"
  160323. #else
  160324. "adc r3, %[r]\n\t"
  160325. #endif
  160326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160327. "lsrs r6, %[a], #16\n\t"
  160328. #else
  160329. "lsr r6, %[a], #16\n\t"
  160330. #endif
  160331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160332. "lsrs r7, %[b], #16\n\t"
  160333. #else
  160334. "lsr r7, %[b], #16\n\t"
  160335. #endif
  160336. #ifdef WOLFSSL_KEIL
  160337. "muls r7, r6, r7\n\t"
  160338. #elif defined(__clang__)
  160339. "muls r7, r6\n\t"
  160340. #else
  160341. "mul r7, r6\n\t"
  160342. #endif
  160343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160344. "adds r5, r5, r7\n\t"
  160345. #else
  160346. "add r5, r5, r7\n\t"
  160347. #endif
  160348. #ifdef WOLFSSL_KEIL
  160349. "adcs r3, r3, %[r]\n\t"
  160350. #elif defined(__clang__)
  160351. "adcs r3, %[r]\n\t"
  160352. #else
  160353. "adc r3, %[r]\n\t"
  160354. #endif
  160355. "uxth r7, %[b]\n\t"
  160356. #ifdef WOLFSSL_KEIL
  160357. "muls r6, r7, r6\n\t"
  160358. #elif defined(__clang__)
  160359. "muls r6, r7\n\t"
  160360. #else
  160361. "mul r6, r7\n\t"
  160362. #endif
  160363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160364. "lsrs r7, r6, #16\n\t"
  160365. #else
  160366. "lsr r7, r6, #16\n\t"
  160367. #endif
  160368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160369. "lsls r6, r6, #16\n\t"
  160370. #else
  160371. "lsl r6, r6, #16\n\t"
  160372. #endif
  160373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160374. "adds r4, r4, r6\n\t"
  160375. #else
  160376. "add r4, r4, r6\n\t"
  160377. #endif
  160378. #ifdef WOLFSSL_KEIL
  160379. "adcs r5, r5, r7\n\t"
  160380. #elif defined(__clang__)
  160381. "adcs r5, r7\n\t"
  160382. #else
  160383. "adc r5, r7\n\t"
  160384. #endif
  160385. #ifdef WOLFSSL_KEIL
  160386. "adcs r3, r3, %[r]\n\t"
  160387. #elif defined(__clang__)
  160388. "adcs r3, %[r]\n\t"
  160389. #else
  160390. "adc r3, %[r]\n\t"
  160391. #endif
  160392. "# A[10] * B[9]\n\t"
  160393. "mov %[a], r9\n\t"
  160394. "mov %[b], r10\n\t"
  160395. "ldr %[a], [%[a], #40]\n\t"
  160396. "ldr %[b], [%[b], #36]\n\t"
  160397. "uxth r6, %[a]\n\t"
  160398. "uxth r7, %[b]\n\t"
  160399. #ifdef WOLFSSL_KEIL
  160400. "muls r7, r6, r7\n\t"
  160401. #elif defined(__clang__)
  160402. "muls r7, r6\n\t"
  160403. #else
  160404. "mul r7, r6\n\t"
  160405. #endif
  160406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160407. "adds r4, r4, r7\n\t"
  160408. #else
  160409. "add r4, r4, r7\n\t"
  160410. #endif
  160411. #ifdef WOLFSSL_KEIL
  160412. "adcs r5, r5, %[r]\n\t"
  160413. #elif defined(__clang__)
  160414. "adcs r5, %[r]\n\t"
  160415. #else
  160416. "adc r5, %[r]\n\t"
  160417. #endif
  160418. #ifdef WOLFSSL_KEIL
  160419. "adcs r3, r3, %[r]\n\t"
  160420. #elif defined(__clang__)
  160421. "adcs r3, %[r]\n\t"
  160422. #else
  160423. "adc r3, %[r]\n\t"
  160424. #endif
  160425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160426. "lsrs r7, %[b], #16\n\t"
  160427. #else
  160428. "lsr r7, %[b], #16\n\t"
  160429. #endif
  160430. #ifdef WOLFSSL_KEIL
  160431. "muls r6, r7, r6\n\t"
  160432. #elif defined(__clang__)
  160433. "muls r6, r7\n\t"
  160434. #else
  160435. "mul r6, r7\n\t"
  160436. #endif
  160437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160438. "lsrs r7, r6, #16\n\t"
  160439. #else
  160440. "lsr r7, r6, #16\n\t"
  160441. #endif
  160442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160443. "lsls r6, r6, #16\n\t"
  160444. #else
  160445. "lsl r6, r6, #16\n\t"
  160446. #endif
  160447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160448. "adds r4, r4, r6\n\t"
  160449. #else
  160450. "add r4, r4, r6\n\t"
  160451. #endif
  160452. #ifdef WOLFSSL_KEIL
  160453. "adcs r5, r5, r7\n\t"
  160454. #elif defined(__clang__)
  160455. "adcs r5, r7\n\t"
  160456. #else
  160457. "adc r5, r7\n\t"
  160458. #endif
  160459. #ifdef WOLFSSL_KEIL
  160460. "adcs r3, r3, %[r]\n\t"
  160461. #elif defined(__clang__)
  160462. "adcs r3, %[r]\n\t"
  160463. #else
  160464. "adc r3, %[r]\n\t"
  160465. #endif
  160466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160467. "lsrs r6, %[a], #16\n\t"
  160468. #else
  160469. "lsr r6, %[a], #16\n\t"
  160470. #endif
  160471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160472. "lsrs r7, %[b], #16\n\t"
  160473. #else
  160474. "lsr r7, %[b], #16\n\t"
  160475. #endif
  160476. #ifdef WOLFSSL_KEIL
  160477. "muls r7, r6, r7\n\t"
  160478. #elif defined(__clang__)
  160479. "muls r7, r6\n\t"
  160480. #else
  160481. "mul r7, r6\n\t"
  160482. #endif
  160483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160484. "adds r5, r5, r7\n\t"
  160485. #else
  160486. "add r5, r5, r7\n\t"
  160487. #endif
  160488. #ifdef WOLFSSL_KEIL
  160489. "adcs r3, r3, %[r]\n\t"
  160490. #elif defined(__clang__)
  160491. "adcs r3, %[r]\n\t"
  160492. #else
  160493. "adc r3, %[r]\n\t"
  160494. #endif
  160495. "uxth r7, %[b]\n\t"
  160496. #ifdef WOLFSSL_KEIL
  160497. "muls r6, r7, r6\n\t"
  160498. #elif defined(__clang__)
  160499. "muls r6, r7\n\t"
  160500. #else
  160501. "mul r6, r7\n\t"
  160502. #endif
  160503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160504. "lsrs r7, r6, #16\n\t"
  160505. #else
  160506. "lsr r7, r6, #16\n\t"
  160507. #endif
  160508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160509. "lsls r6, r6, #16\n\t"
  160510. #else
  160511. "lsl r6, r6, #16\n\t"
  160512. #endif
  160513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160514. "adds r4, r4, r6\n\t"
  160515. #else
  160516. "add r4, r4, r6\n\t"
  160517. #endif
  160518. #ifdef WOLFSSL_KEIL
  160519. "adcs r5, r5, r7\n\t"
  160520. #elif defined(__clang__)
  160521. "adcs r5, r7\n\t"
  160522. #else
  160523. "adc r5, r7\n\t"
  160524. #endif
  160525. #ifdef WOLFSSL_KEIL
  160526. "adcs r3, r3, %[r]\n\t"
  160527. #elif defined(__clang__)
  160528. "adcs r3, %[r]\n\t"
  160529. #else
  160530. "adc r3, %[r]\n\t"
  160531. #endif
  160532. "# A[11] * B[8]\n\t"
  160533. "mov %[a], r9\n\t"
  160534. "mov %[b], r10\n\t"
  160535. "ldr %[a], [%[a], #44]\n\t"
  160536. "ldr %[b], [%[b], #32]\n\t"
  160537. "uxth r6, %[a]\n\t"
  160538. "uxth r7, %[b]\n\t"
  160539. #ifdef WOLFSSL_KEIL
  160540. "muls r7, r6, r7\n\t"
  160541. #elif defined(__clang__)
  160542. "muls r7, r6\n\t"
  160543. #else
  160544. "mul r7, r6\n\t"
  160545. #endif
  160546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160547. "adds r4, r4, r7\n\t"
  160548. #else
  160549. "add r4, r4, r7\n\t"
  160550. #endif
  160551. #ifdef WOLFSSL_KEIL
  160552. "adcs r5, r5, %[r]\n\t"
  160553. #elif defined(__clang__)
  160554. "adcs r5, %[r]\n\t"
  160555. #else
  160556. "adc r5, %[r]\n\t"
  160557. #endif
  160558. #ifdef WOLFSSL_KEIL
  160559. "adcs r3, r3, %[r]\n\t"
  160560. #elif defined(__clang__)
  160561. "adcs r3, %[r]\n\t"
  160562. #else
  160563. "adc r3, %[r]\n\t"
  160564. #endif
  160565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160566. "lsrs r7, %[b], #16\n\t"
  160567. #else
  160568. "lsr r7, %[b], #16\n\t"
  160569. #endif
  160570. #ifdef WOLFSSL_KEIL
  160571. "muls r6, r7, r6\n\t"
  160572. #elif defined(__clang__)
  160573. "muls r6, r7\n\t"
  160574. #else
  160575. "mul r6, r7\n\t"
  160576. #endif
  160577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160578. "lsrs r7, r6, #16\n\t"
  160579. #else
  160580. "lsr r7, r6, #16\n\t"
  160581. #endif
  160582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160583. "lsls r6, r6, #16\n\t"
  160584. #else
  160585. "lsl r6, r6, #16\n\t"
  160586. #endif
  160587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160588. "adds r4, r4, r6\n\t"
  160589. #else
  160590. "add r4, r4, r6\n\t"
  160591. #endif
  160592. #ifdef WOLFSSL_KEIL
  160593. "adcs r5, r5, r7\n\t"
  160594. #elif defined(__clang__)
  160595. "adcs r5, r7\n\t"
  160596. #else
  160597. "adc r5, r7\n\t"
  160598. #endif
  160599. #ifdef WOLFSSL_KEIL
  160600. "adcs r3, r3, %[r]\n\t"
  160601. #elif defined(__clang__)
  160602. "adcs r3, %[r]\n\t"
  160603. #else
  160604. "adc r3, %[r]\n\t"
  160605. #endif
  160606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160607. "lsrs r6, %[a], #16\n\t"
  160608. #else
  160609. "lsr r6, %[a], #16\n\t"
  160610. #endif
  160611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160612. "lsrs r7, %[b], #16\n\t"
  160613. #else
  160614. "lsr r7, %[b], #16\n\t"
  160615. #endif
  160616. #ifdef WOLFSSL_KEIL
  160617. "muls r7, r6, r7\n\t"
  160618. #elif defined(__clang__)
  160619. "muls r7, r6\n\t"
  160620. #else
  160621. "mul r7, r6\n\t"
  160622. #endif
  160623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160624. "adds r5, r5, r7\n\t"
  160625. #else
  160626. "add r5, r5, r7\n\t"
  160627. #endif
  160628. #ifdef WOLFSSL_KEIL
  160629. "adcs r3, r3, %[r]\n\t"
  160630. #elif defined(__clang__)
  160631. "adcs r3, %[r]\n\t"
  160632. #else
  160633. "adc r3, %[r]\n\t"
  160634. #endif
  160635. "uxth r7, %[b]\n\t"
  160636. #ifdef WOLFSSL_KEIL
  160637. "muls r6, r7, r6\n\t"
  160638. #elif defined(__clang__)
  160639. "muls r6, r7\n\t"
  160640. #else
  160641. "mul r6, r7\n\t"
  160642. #endif
  160643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160644. "lsrs r7, r6, #16\n\t"
  160645. #else
  160646. "lsr r7, r6, #16\n\t"
  160647. #endif
  160648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160649. "lsls r6, r6, #16\n\t"
  160650. #else
  160651. "lsl r6, r6, #16\n\t"
  160652. #endif
  160653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160654. "adds r4, r4, r6\n\t"
  160655. #else
  160656. "add r4, r4, r6\n\t"
  160657. #endif
  160658. #ifdef WOLFSSL_KEIL
  160659. "adcs r5, r5, r7\n\t"
  160660. #elif defined(__clang__)
  160661. "adcs r5, r7\n\t"
  160662. #else
  160663. "adc r5, r7\n\t"
  160664. #endif
  160665. #ifdef WOLFSSL_KEIL
  160666. "adcs r3, r3, %[r]\n\t"
  160667. #elif defined(__clang__)
  160668. "adcs r3, %[r]\n\t"
  160669. #else
  160670. "adc r3, %[r]\n\t"
  160671. #endif
  160672. "# A[12] * B[7]\n\t"
  160673. "mov %[a], r9\n\t"
  160674. "mov %[b], r10\n\t"
  160675. "ldr %[a], [%[a], #48]\n\t"
  160676. "ldr %[b], [%[b], #28]\n\t"
  160677. "uxth r6, %[a]\n\t"
  160678. "uxth r7, %[b]\n\t"
  160679. #ifdef WOLFSSL_KEIL
  160680. "muls r7, r6, r7\n\t"
  160681. #elif defined(__clang__)
  160682. "muls r7, r6\n\t"
  160683. #else
  160684. "mul r7, r6\n\t"
  160685. #endif
  160686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160687. "adds r4, r4, r7\n\t"
  160688. #else
  160689. "add r4, r4, r7\n\t"
  160690. #endif
  160691. #ifdef WOLFSSL_KEIL
  160692. "adcs r5, r5, %[r]\n\t"
  160693. #elif defined(__clang__)
  160694. "adcs r5, %[r]\n\t"
  160695. #else
  160696. "adc r5, %[r]\n\t"
  160697. #endif
  160698. #ifdef WOLFSSL_KEIL
  160699. "adcs r3, r3, %[r]\n\t"
  160700. #elif defined(__clang__)
  160701. "adcs r3, %[r]\n\t"
  160702. #else
  160703. "adc r3, %[r]\n\t"
  160704. #endif
  160705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160706. "lsrs r7, %[b], #16\n\t"
  160707. #else
  160708. "lsr r7, %[b], #16\n\t"
  160709. #endif
  160710. #ifdef WOLFSSL_KEIL
  160711. "muls r6, r7, r6\n\t"
  160712. #elif defined(__clang__)
  160713. "muls r6, r7\n\t"
  160714. #else
  160715. "mul r6, r7\n\t"
  160716. #endif
  160717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160718. "lsrs r7, r6, #16\n\t"
  160719. #else
  160720. "lsr r7, r6, #16\n\t"
  160721. #endif
  160722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160723. "lsls r6, r6, #16\n\t"
  160724. #else
  160725. "lsl r6, r6, #16\n\t"
  160726. #endif
  160727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160728. "adds r4, r4, r6\n\t"
  160729. #else
  160730. "add r4, r4, r6\n\t"
  160731. #endif
  160732. #ifdef WOLFSSL_KEIL
  160733. "adcs r5, r5, r7\n\t"
  160734. #elif defined(__clang__)
  160735. "adcs r5, r7\n\t"
  160736. #else
  160737. "adc r5, r7\n\t"
  160738. #endif
  160739. #ifdef WOLFSSL_KEIL
  160740. "adcs r3, r3, %[r]\n\t"
  160741. #elif defined(__clang__)
  160742. "adcs r3, %[r]\n\t"
  160743. #else
  160744. "adc r3, %[r]\n\t"
  160745. #endif
  160746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160747. "lsrs r6, %[a], #16\n\t"
  160748. #else
  160749. "lsr r6, %[a], #16\n\t"
  160750. #endif
  160751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160752. "lsrs r7, %[b], #16\n\t"
  160753. #else
  160754. "lsr r7, %[b], #16\n\t"
  160755. #endif
  160756. #ifdef WOLFSSL_KEIL
  160757. "muls r7, r6, r7\n\t"
  160758. #elif defined(__clang__)
  160759. "muls r7, r6\n\t"
  160760. #else
  160761. "mul r7, r6\n\t"
  160762. #endif
  160763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160764. "adds r5, r5, r7\n\t"
  160765. #else
  160766. "add r5, r5, r7\n\t"
  160767. #endif
  160768. #ifdef WOLFSSL_KEIL
  160769. "adcs r3, r3, %[r]\n\t"
  160770. #elif defined(__clang__)
  160771. "adcs r3, %[r]\n\t"
  160772. #else
  160773. "adc r3, %[r]\n\t"
  160774. #endif
  160775. "uxth r7, %[b]\n\t"
  160776. #ifdef WOLFSSL_KEIL
  160777. "muls r6, r7, r6\n\t"
  160778. #elif defined(__clang__)
  160779. "muls r6, r7\n\t"
  160780. #else
  160781. "mul r6, r7\n\t"
  160782. #endif
  160783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160784. "lsrs r7, r6, #16\n\t"
  160785. #else
  160786. "lsr r7, r6, #16\n\t"
  160787. #endif
  160788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160789. "lsls r6, r6, #16\n\t"
  160790. #else
  160791. "lsl r6, r6, #16\n\t"
  160792. #endif
  160793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160794. "adds r4, r4, r6\n\t"
  160795. #else
  160796. "add r4, r4, r6\n\t"
  160797. #endif
  160798. #ifdef WOLFSSL_KEIL
  160799. "adcs r5, r5, r7\n\t"
  160800. #elif defined(__clang__)
  160801. "adcs r5, r7\n\t"
  160802. #else
  160803. "adc r5, r7\n\t"
  160804. #endif
  160805. #ifdef WOLFSSL_KEIL
  160806. "adcs r3, r3, %[r]\n\t"
  160807. #elif defined(__clang__)
  160808. "adcs r3, %[r]\n\t"
  160809. #else
  160810. "adc r3, %[r]\n\t"
  160811. #endif
  160812. "# A[13] * B[6]\n\t"
  160813. "mov %[a], r9\n\t"
  160814. "mov %[b], r10\n\t"
  160815. "ldr %[a], [%[a], #52]\n\t"
  160816. "ldr %[b], [%[b], #24]\n\t"
  160817. "uxth r6, %[a]\n\t"
  160818. "uxth r7, %[b]\n\t"
  160819. #ifdef WOLFSSL_KEIL
  160820. "muls r7, r6, r7\n\t"
  160821. #elif defined(__clang__)
  160822. "muls r7, r6\n\t"
  160823. #else
  160824. "mul r7, r6\n\t"
  160825. #endif
  160826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160827. "adds r4, r4, r7\n\t"
  160828. #else
  160829. "add r4, r4, r7\n\t"
  160830. #endif
  160831. #ifdef WOLFSSL_KEIL
  160832. "adcs r5, r5, %[r]\n\t"
  160833. #elif defined(__clang__)
  160834. "adcs r5, %[r]\n\t"
  160835. #else
  160836. "adc r5, %[r]\n\t"
  160837. #endif
  160838. #ifdef WOLFSSL_KEIL
  160839. "adcs r3, r3, %[r]\n\t"
  160840. #elif defined(__clang__)
  160841. "adcs r3, %[r]\n\t"
  160842. #else
  160843. "adc r3, %[r]\n\t"
  160844. #endif
  160845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160846. "lsrs r7, %[b], #16\n\t"
  160847. #else
  160848. "lsr r7, %[b], #16\n\t"
  160849. #endif
  160850. #ifdef WOLFSSL_KEIL
  160851. "muls r6, r7, r6\n\t"
  160852. #elif defined(__clang__)
  160853. "muls r6, r7\n\t"
  160854. #else
  160855. "mul r6, r7\n\t"
  160856. #endif
  160857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160858. "lsrs r7, r6, #16\n\t"
  160859. #else
  160860. "lsr r7, r6, #16\n\t"
  160861. #endif
  160862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160863. "lsls r6, r6, #16\n\t"
  160864. #else
  160865. "lsl r6, r6, #16\n\t"
  160866. #endif
  160867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160868. "adds r4, r4, r6\n\t"
  160869. #else
  160870. "add r4, r4, r6\n\t"
  160871. #endif
  160872. #ifdef WOLFSSL_KEIL
  160873. "adcs r5, r5, r7\n\t"
  160874. #elif defined(__clang__)
  160875. "adcs r5, r7\n\t"
  160876. #else
  160877. "adc r5, r7\n\t"
  160878. #endif
  160879. #ifdef WOLFSSL_KEIL
  160880. "adcs r3, r3, %[r]\n\t"
  160881. #elif defined(__clang__)
  160882. "adcs r3, %[r]\n\t"
  160883. #else
  160884. "adc r3, %[r]\n\t"
  160885. #endif
  160886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160887. "lsrs r6, %[a], #16\n\t"
  160888. #else
  160889. "lsr r6, %[a], #16\n\t"
  160890. #endif
  160891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160892. "lsrs r7, %[b], #16\n\t"
  160893. #else
  160894. "lsr r7, %[b], #16\n\t"
  160895. #endif
  160896. #ifdef WOLFSSL_KEIL
  160897. "muls r7, r6, r7\n\t"
  160898. #elif defined(__clang__)
  160899. "muls r7, r6\n\t"
  160900. #else
  160901. "mul r7, r6\n\t"
  160902. #endif
  160903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160904. "adds r5, r5, r7\n\t"
  160905. #else
  160906. "add r5, r5, r7\n\t"
  160907. #endif
  160908. #ifdef WOLFSSL_KEIL
  160909. "adcs r3, r3, %[r]\n\t"
  160910. #elif defined(__clang__)
  160911. "adcs r3, %[r]\n\t"
  160912. #else
  160913. "adc r3, %[r]\n\t"
  160914. #endif
  160915. "uxth r7, %[b]\n\t"
  160916. #ifdef WOLFSSL_KEIL
  160917. "muls r6, r7, r6\n\t"
  160918. #elif defined(__clang__)
  160919. "muls r6, r7\n\t"
  160920. #else
  160921. "mul r6, r7\n\t"
  160922. #endif
  160923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160924. "lsrs r7, r6, #16\n\t"
  160925. #else
  160926. "lsr r7, r6, #16\n\t"
  160927. #endif
  160928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160929. "lsls r6, r6, #16\n\t"
  160930. #else
  160931. "lsl r6, r6, #16\n\t"
  160932. #endif
  160933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160934. "adds r4, r4, r6\n\t"
  160935. #else
  160936. "add r4, r4, r6\n\t"
  160937. #endif
  160938. #ifdef WOLFSSL_KEIL
  160939. "adcs r5, r5, r7\n\t"
  160940. #elif defined(__clang__)
  160941. "adcs r5, r7\n\t"
  160942. #else
  160943. "adc r5, r7\n\t"
  160944. #endif
  160945. #ifdef WOLFSSL_KEIL
  160946. "adcs r3, r3, %[r]\n\t"
  160947. #elif defined(__clang__)
  160948. "adcs r3, %[r]\n\t"
  160949. #else
  160950. "adc r3, %[r]\n\t"
  160951. #endif
  160952. "# A[14] * B[5]\n\t"
  160953. "mov %[a], r9\n\t"
  160954. "mov %[b], r10\n\t"
  160955. "ldr %[a], [%[a], #56]\n\t"
  160956. "ldr %[b], [%[b], #20]\n\t"
  160957. "uxth r6, %[a]\n\t"
  160958. "uxth r7, %[b]\n\t"
  160959. #ifdef WOLFSSL_KEIL
  160960. "muls r7, r6, r7\n\t"
  160961. #elif defined(__clang__)
  160962. "muls r7, r6\n\t"
  160963. #else
  160964. "mul r7, r6\n\t"
  160965. #endif
  160966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160967. "adds r4, r4, r7\n\t"
  160968. #else
  160969. "add r4, r4, r7\n\t"
  160970. #endif
  160971. #ifdef WOLFSSL_KEIL
  160972. "adcs r5, r5, %[r]\n\t"
  160973. #elif defined(__clang__)
  160974. "adcs r5, %[r]\n\t"
  160975. #else
  160976. "adc r5, %[r]\n\t"
  160977. #endif
  160978. #ifdef WOLFSSL_KEIL
  160979. "adcs r3, r3, %[r]\n\t"
  160980. #elif defined(__clang__)
  160981. "adcs r3, %[r]\n\t"
  160982. #else
  160983. "adc r3, %[r]\n\t"
  160984. #endif
  160985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160986. "lsrs r7, %[b], #16\n\t"
  160987. #else
  160988. "lsr r7, %[b], #16\n\t"
  160989. #endif
  160990. #ifdef WOLFSSL_KEIL
  160991. "muls r6, r7, r6\n\t"
  160992. #elif defined(__clang__)
  160993. "muls r6, r7\n\t"
  160994. #else
  160995. "mul r6, r7\n\t"
  160996. #endif
  160997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160998. "lsrs r7, r6, #16\n\t"
  160999. #else
  161000. "lsr r7, r6, #16\n\t"
  161001. #endif
  161002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161003. "lsls r6, r6, #16\n\t"
  161004. #else
  161005. "lsl r6, r6, #16\n\t"
  161006. #endif
  161007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161008. "adds r4, r4, r6\n\t"
  161009. #else
  161010. "add r4, r4, r6\n\t"
  161011. #endif
  161012. #ifdef WOLFSSL_KEIL
  161013. "adcs r5, r5, r7\n\t"
  161014. #elif defined(__clang__)
  161015. "adcs r5, r7\n\t"
  161016. #else
  161017. "adc r5, r7\n\t"
  161018. #endif
  161019. #ifdef WOLFSSL_KEIL
  161020. "adcs r3, r3, %[r]\n\t"
  161021. #elif defined(__clang__)
  161022. "adcs r3, %[r]\n\t"
  161023. #else
  161024. "adc r3, %[r]\n\t"
  161025. #endif
  161026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161027. "lsrs r6, %[a], #16\n\t"
  161028. #else
  161029. "lsr r6, %[a], #16\n\t"
  161030. #endif
  161031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161032. "lsrs r7, %[b], #16\n\t"
  161033. #else
  161034. "lsr r7, %[b], #16\n\t"
  161035. #endif
  161036. #ifdef WOLFSSL_KEIL
  161037. "muls r7, r6, r7\n\t"
  161038. #elif defined(__clang__)
  161039. "muls r7, r6\n\t"
  161040. #else
  161041. "mul r7, r6\n\t"
  161042. #endif
  161043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161044. "adds r5, r5, r7\n\t"
  161045. #else
  161046. "add r5, r5, r7\n\t"
  161047. #endif
  161048. #ifdef WOLFSSL_KEIL
  161049. "adcs r3, r3, %[r]\n\t"
  161050. #elif defined(__clang__)
  161051. "adcs r3, %[r]\n\t"
  161052. #else
  161053. "adc r3, %[r]\n\t"
  161054. #endif
  161055. "uxth r7, %[b]\n\t"
  161056. #ifdef WOLFSSL_KEIL
  161057. "muls r6, r7, r6\n\t"
  161058. #elif defined(__clang__)
  161059. "muls r6, r7\n\t"
  161060. #else
  161061. "mul r6, r7\n\t"
  161062. #endif
  161063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161064. "lsrs r7, r6, #16\n\t"
  161065. #else
  161066. "lsr r7, r6, #16\n\t"
  161067. #endif
  161068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161069. "lsls r6, r6, #16\n\t"
  161070. #else
  161071. "lsl r6, r6, #16\n\t"
  161072. #endif
  161073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161074. "adds r4, r4, r6\n\t"
  161075. #else
  161076. "add r4, r4, r6\n\t"
  161077. #endif
  161078. #ifdef WOLFSSL_KEIL
  161079. "adcs r5, r5, r7\n\t"
  161080. #elif defined(__clang__)
  161081. "adcs r5, r7\n\t"
  161082. #else
  161083. "adc r5, r7\n\t"
  161084. #endif
  161085. #ifdef WOLFSSL_KEIL
  161086. "adcs r3, r3, %[r]\n\t"
  161087. #elif defined(__clang__)
  161088. "adcs r3, %[r]\n\t"
  161089. #else
  161090. "adc r3, %[r]\n\t"
  161091. #endif
  161092. "# A[15] * B[4]\n\t"
  161093. "mov %[a], r9\n\t"
  161094. "mov %[b], r10\n\t"
  161095. "ldr %[a], [%[a], #60]\n\t"
  161096. "ldr %[b], [%[b], #16]\n\t"
  161097. "uxth r6, %[a]\n\t"
  161098. "uxth r7, %[b]\n\t"
  161099. #ifdef WOLFSSL_KEIL
  161100. "muls r7, r6, r7\n\t"
  161101. #elif defined(__clang__)
  161102. "muls r7, r6\n\t"
  161103. #else
  161104. "mul r7, r6\n\t"
  161105. #endif
  161106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161107. "adds r4, r4, r7\n\t"
  161108. #else
  161109. "add r4, r4, r7\n\t"
  161110. #endif
  161111. #ifdef WOLFSSL_KEIL
  161112. "adcs r5, r5, %[r]\n\t"
  161113. #elif defined(__clang__)
  161114. "adcs r5, %[r]\n\t"
  161115. #else
  161116. "adc r5, %[r]\n\t"
  161117. #endif
  161118. #ifdef WOLFSSL_KEIL
  161119. "adcs r3, r3, %[r]\n\t"
  161120. #elif defined(__clang__)
  161121. "adcs r3, %[r]\n\t"
  161122. #else
  161123. "adc r3, %[r]\n\t"
  161124. #endif
  161125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161126. "lsrs r7, %[b], #16\n\t"
  161127. #else
  161128. "lsr r7, %[b], #16\n\t"
  161129. #endif
  161130. #ifdef WOLFSSL_KEIL
  161131. "muls r6, r7, r6\n\t"
  161132. #elif defined(__clang__)
  161133. "muls r6, r7\n\t"
  161134. #else
  161135. "mul r6, r7\n\t"
  161136. #endif
  161137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161138. "lsrs r7, r6, #16\n\t"
  161139. #else
  161140. "lsr r7, r6, #16\n\t"
  161141. #endif
  161142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161143. "lsls r6, r6, #16\n\t"
  161144. #else
  161145. "lsl r6, r6, #16\n\t"
  161146. #endif
  161147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161148. "adds r4, r4, r6\n\t"
  161149. #else
  161150. "add r4, r4, r6\n\t"
  161151. #endif
  161152. #ifdef WOLFSSL_KEIL
  161153. "adcs r5, r5, r7\n\t"
  161154. #elif defined(__clang__)
  161155. "adcs r5, r7\n\t"
  161156. #else
  161157. "adc r5, r7\n\t"
  161158. #endif
  161159. #ifdef WOLFSSL_KEIL
  161160. "adcs r3, r3, %[r]\n\t"
  161161. #elif defined(__clang__)
  161162. "adcs r3, %[r]\n\t"
  161163. #else
  161164. "adc r3, %[r]\n\t"
  161165. #endif
  161166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161167. "lsrs r6, %[a], #16\n\t"
  161168. #else
  161169. "lsr r6, %[a], #16\n\t"
  161170. #endif
  161171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161172. "lsrs r7, %[b], #16\n\t"
  161173. #else
  161174. "lsr r7, %[b], #16\n\t"
  161175. #endif
  161176. #ifdef WOLFSSL_KEIL
  161177. "muls r7, r6, r7\n\t"
  161178. #elif defined(__clang__)
  161179. "muls r7, r6\n\t"
  161180. #else
  161181. "mul r7, r6\n\t"
  161182. #endif
  161183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161184. "adds r5, r5, r7\n\t"
  161185. #else
  161186. "add r5, r5, r7\n\t"
  161187. #endif
  161188. #ifdef WOLFSSL_KEIL
  161189. "adcs r3, r3, %[r]\n\t"
  161190. #elif defined(__clang__)
  161191. "adcs r3, %[r]\n\t"
  161192. #else
  161193. "adc r3, %[r]\n\t"
  161194. #endif
  161195. "uxth r7, %[b]\n\t"
  161196. #ifdef WOLFSSL_KEIL
  161197. "muls r6, r7, r6\n\t"
  161198. #elif defined(__clang__)
  161199. "muls r6, r7\n\t"
  161200. #else
  161201. "mul r6, r7\n\t"
  161202. #endif
  161203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161204. "lsrs r7, r6, #16\n\t"
  161205. #else
  161206. "lsr r7, r6, #16\n\t"
  161207. #endif
  161208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161209. "lsls r6, r6, #16\n\t"
  161210. #else
  161211. "lsl r6, r6, #16\n\t"
  161212. #endif
  161213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161214. "adds r4, r4, r6\n\t"
  161215. #else
  161216. "add r4, r4, r6\n\t"
  161217. #endif
  161218. #ifdef WOLFSSL_KEIL
  161219. "adcs r5, r5, r7\n\t"
  161220. #elif defined(__clang__)
  161221. "adcs r5, r7\n\t"
  161222. #else
  161223. "adc r5, r7\n\t"
  161224. #endif
  161225. #ifdef WOLFSSL_KEIL
  161226. "adcs r3, r3, %[r]\n\t"
  161227. #elif defined(__clang__)
  161228. "adcs r3, %[r]\n\t"
  161229. #else
  161230. "adc r3, %[r]\n\t"
  161231. #endif
  161232. "mov %[r], r8\n\t"
  161233. "str r4, [%[r], #76]\n\t"
  161234. "movs %[r], #0\n\t"
  161235. "# A[15] * B[5]\n\t"
  161236. "movs r4, #0\n\t"
  161237. "mov %[a], r9\n\t"
  161238. "mov %[b], r10\n\t"
  161239. "ldr %[a], [%[a], #60]\n\t"
  161240. "ldr %[b], [%[b], #20]\n\t"
  161241. "uxth r6, %[a]\n\t"
  161242. "uxth r7, %[b]\n\t"
  161243. #ifdef WOLFSSL_KEIL
  161244. "muls r7, r6, r7\n\t"
  161245. #elif defined(__clang__)
  161246. "muls r7, r6\n\t"
  161247. #else
  161248. "mul r7, r6\n\t"
  161249. #endif
  161250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161251. "adds r5, r5, r7\n\t"
  161252. #else
  161253. "add r5, r5, r7\n\t"
  161254. #endif
  161255. #ifdef WOLFSSL_KEIL
  161256. "adcs r3, r3, %[r]\n\t"
  161257. #elif defined(__clang__)
  161258. "adcs r3, %[r]\n\t"
  161259. #else
  161260. "adc r3, %[r]\n\t"
  161261. #endif
  161262. #ifdef WOLFSSL_KEIL
  161263. "adcs r4, r4, %[r]\n\t"
  161264. #elif defined(__clang__)
  161265. "adcs r4, %[r]\n\t"
  161266. #else
  161267. "adc r4, %[r]\n\t"
  161268. #endif
  161269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161270. "lsrs r7, %[b], #16\n\t"
  161271. #else
  161272. "lsr r7, %[b], #16\n\t"
  161273. #endif
  161274. #ifdef WOLFSSL_KEIL
  161275. "muls r6, r7, r6\n\t"
  161276. #elif defined(__clang__)
  161277. "muls r6, r7\n\t"
  161278. #else
  161279. "mul r6, r7\n\t"
  161280. #endif
  161281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161282. "lsrs r7, r6, #16\n\t"
  161283. #else
  161284. "lsr r7, r6, #16\n\t"
  161285. #endif
  161286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161287. "lsls r6, r6, #16\n\t"
  161288. #else
  161289. "lsl r6, r6, #16\n\t"
  161290. #endif
  161291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161292. "adds r5, r5, r6\n\t"
  161293. #else
  161294. "add r5, r5, r6\n\t"
  161295. #endif
  161296. #ifdef WOLFSSL_KEIL
  161297. "adcs r3, r3, r7\n\t"
  161298. #elif defined(__clang__)
  161299. "adcs r3, r7\n\t"
  161300. #else
  161301. "adc r3, r7\n\t"
  161302. #endif
  161303. #ifdef WOLFSSL_KEIL
  161304. "adcs r4, r4, %[r]\n\t"
  161305. #elif defined(__clang__)
  161306. "adcs r4, %[r]\n\t"
  161307. #else
  161308. "adc r4, %[r]\n\t"
  161309. #endif
  161310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161311. "lsrs r6, %[a], #16\n\t"
  161312. #else
  161313. "lsr r6, %[a], #16\n\t"
  161314. #endif
  161315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161316. "lsrs r7, %[b], #16\n\t"
  161317. #else
  161318. "lsr r7, %[b], #16\n\t"
  161319. #endif
  161320. #ifdef WOLFSSL_KEIL
  161321. "muls r7, r6, r7\n\t"
  161322. #elif defined(__clang__)
  161323. "muls r7, r6\n\t"
  161324. #else
  161325. "mul r7, r6\n\t"
  161326. #endif
  161327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161328. "adds r3, r3, r7\n\t"
  161329. #else
  161330. "add r3, r3, r7\n\t"
  161331. #endif
  161332. #ifdef WOLFSSL_KEIL
  161333. "adcs r4, r4, %[r]\n\t"
  161334. #elif defined(__clang__)
  161335. "adcs r4, %[r]\n\t"
  161336. #else
  161337. "adc r4, %[r]\n\t"
  161338. #endif
  161339. "uxth r7, %[b]\n\t"
  161340. #ifdef WOLFSSL_KEIL
  161341. "muls r6, r7, r6\n\t"
  161342. #elif defined(__clang__)
  161343. "muls r6, r7\n\t"
  161344. #else
  161345. "mul r6, r7\n\t"
  161346. #endif
  161347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161348. "lsrs r7, r6, #16\n\t"
  161349. #else
  161350. "lsr r7, r6, #16\n\t"
  161351. #endif
  161352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161353. "lsls r6, r6, #16\n\t"
  161354. #else
  161355. "lsl r6, r6, #16\n\t"
  161356. #endif
  161357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161358. "adds r5, r5, r6\n\t"
  161359. #else
  161360. "add r5, r5, r6\n\t"
  161361. #endif
  161362. #ifdef WOLFSSL_KEIL
  161363. "adcs r3, r3, r7\n\t"
  161364. #elif defined(__clang__)
  161365. "adcs r3, r7\n\t"
  161366. #else
  161367. "adc r3, r7\n\t"
  161368. #endif
  161369. #ifdef WOLFSSL_KEIL
  161370. "adcs r4, r4, %[r]\n\t"
  161371. #elif defined(__clang__)
  161372. "adcs r4, %[r]\n\t"
  161373. #else
  161374. "adc r4, %[r]\n\t"
  161375. #endif
  161376. "# A[14] * B[6]\n\t"
  161377. "mov %[a], r9\n\t"
  161378. "mov %[b], r10\n\t"
  161379. "ldr %[a], [%[a], #56]\n\t"
  161380. "ldr %[b], [%[b], #24]\n\t"
  161381. "uxth r6, %[a]\n\t"
  161382. "uxth r7, %[b]\n\t"
  161383. #ifdef WOLFSSL_KEIL
  161384. "muls r7, r6, r7\n\t"
  161385. #elif defined(__clang__)
  161386. "muls r7, r6\n\t"
  161387. #else
  161388. "mul r7, r6\n\t"
  161389. #endif
  161390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161391. "adds r5, r5, r7\n\t"
  161392. #else
  161393. "add r5, r5, r7\n\t"
  161394. #endif
  161395. #ifdef WOLFSSL_KEIL
  161396. "adcs r3, r3, %[r]\n\t"
  161397. #elif defined(__clang__)
  161398. "adcs r3, %[r]\n\t"
  161399. #else
  161400. "adc r3, %[r]\n\t"
  161401. #endif
  161402. #ifdef WOLFSSL_KEIL
  161403. "adcs r4, r4, %[r]\n\t"
  161404. #elif defined(__clang__)
  161405. "adcs r4, %[r]\n\t"
  161406. #else
  161407. "adc r4, %[r]\n\t"
  161408. #endif
  161409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161410. "lsrs r7, %[b], #16\n\t"
  161411. #else
  161412. "lsr r7, %[b], #16\n\t"
  161413. #endif
  161414. #ifdef WOLFSSL_KEIL
  161415. "muls r6, r7, r6\n\t"
  161416. #elif defined(__clang__)
  161417. "muls r6, r7\n\t"
  161418. #else
  161419. "mul r6, r7\n\t"
  161420. #endif
  161421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161422. "lsrs r7, r6, #16\n\t"
  161423. #else
  161424. "lsr r7, r6, #16\n\t"
  161425. #endif
  161426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161427. "lsls r6, r6, #16\n\t"
  161428. #else
  161429. "lsl r6, r6, #16\n\t"
  161430. #endif
  161431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161432. "adds r5, r5, r6\n\t"
  161433. #else
  161434. "add r5, r5, r6\n\t"
  161435. #endif
  161436. #ifdef WOLFSSL_KEIL
  161437. "adcs r3, r3, r7\n\t"
  161438. #elif defined(__clang__)
  161439. "adcs r3, r7\n\t"
  161440. #else
  161441. "adc r3, r7\n\t"
  161442. #endif
  161443. #ifdef WOLFSSL_KEIL
  161444. "adcs r4, r4, %[r]\n\t"
  161445. #elif defined(__clang__)
  161446. "adcs r4, %[r]\n\t"
  161447. #else
  161448. "adc r4, %[r]\n\t"
  161449. #endif
  161450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161451. "lsrs r6, %[a], #16\n\t"
  161452. #else
  161453. "lsr r6, %[a], #16\n\t"
  161454. #endif
  161455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161456. "lsrs r7, %[b], #16\n\t"
  161457. #else
  161458. "lsr r7, %[b], #16\n\t"
  161459. #endif
  161460. #ifdef WOLFSSL_KEIL
  161461. "muls r7, r6, r7\n\t"
  161462. #elif defined(__clang__)
  161463. "muls r7, r6\n\t"
  161464. #else
  161465. "mul r7, r6\n\t"
  161466. #endif
  161467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161468. "adds r3, r3, r7\n\t"
  161469. #else
  161470. "add r3, r3, r7\n\t"
  161471. #endif
  161472. #ifdef WOLFSSL_KEIL
  161473. "adcs r4, r4, %[r]\n\t"
  161474. #elif defined(__clang__)
  161475. "adcs r4, %[r]\n\t"
  161476. #else
  161477. "adc r4, %[r]\n\t"
  161478. #endif
  161479. "uxth r7, %[b]\n\t"
  161480. #ifdef WOLFSSL_KEIL
  161481. "muls r6, r7, r6\n\t"
  161482. #elif defined(__clang__)
  161483. "muls r6, r7\n\t"
  161484. #else
  161485. "mul r6, r7\n\t"
  161486. #endif
  161487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161488. "lsrs r7, r6, #16\n\t"
  161489. #else
  161490. "lsr r7, r6, #16\n\t"
  161491. #endif
  161492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161493. "lsls r6, r6, #16\n\t"
  161494. #else
  161495. "lsl r6, r6, #16\n\t"
  161496. #endif
  161497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161498. "adds r5, r5, r6\n\t"
  161499. #else
  161500. "add r5, r5, r6\n\t"
  161501. #endif
  161502. #ifdef WOLFSSL_KEIL
  161503. "adcs r3, r3, r7\n\t"
  161504. #elif defined(__clang__)
  161505. "adcs r3, r7\n\t"
  161506. #else
  161507. "adc r3, r7\n\t"
  161508. #endif
  161509. #ifdef WOLFSSL_KEIL
  161510. "adcs r4, r4, %[r]\n\t"
  161511. #elif defined(__clang__)
  161512. "adcs r4, %[r]\n\t"
  161513. #else
  161514. "adc r4, %[r]\n\t"
  161515. #endif
  161516. "# A[13] * B[7]\n\t"
  161517. "mov %[a], r9\n\t"
  161518. "mov %[b], r10\n\t"
  161519. "ldr %[a], [%[a], #52]\n\t"
  161520. "ldr %[b], [%[b], #28]\n\t"
  161521. "uxth r6, %[a]\n\t"
  161522. "uxth r7, %[b]\n\t"
  161523. #ifdef WOLFSSL_KEIL
  161524. "muls r7, r6, r7\n\t"
  161525. #elif defined(__clang__)
  161526. "muls r7, r6\n\t"
  161527. #else
  161528. "mul r7, r6\n\t"
  161529. #endif
  161530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161531. "adds r5, r5, r7\n\t"
  161532. #else
  161533. "add r5, r5, r7\n\t"
  161534. #endif
  161535. #ifdef WOLFSSL_KEIL
  161536. "adcs r3, r3, %[r]\n\t"
  161537. #elif defined(__clang__)
  161538. "adcs r3, %[r]\n\t"
  161539. #else
  161540. "adc r3, %[r]\n\t"
  161541. #endif
  161542. #ifdef WOLFSSL_KEIL
  161543. "adcs r4, r4, %[r]\n\t"
  161544. #elif defined(__clang__)
  161545. "adcs r4, %[r]\n\t"
  161546. #else
  161547. "adc r4, %[r]\n\t"
  161548. #endif
  161549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161550. "lsrs r7, %[b], #16\n\t"
  161551. #else
  161552. "lsr r7, %[b], #16\n\t"
  161553. #endif
  161554. #ifdef WOLFSSL_KEIL
  161555. "muls r6, r7, r6\n\t"
  161556. #elif defined(__clang__)
  161557. "muls r6, r7\n\t"
  161558. #else
  161559. "mul r6, r7\n\t"
  161560. #endif
  161561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161562. "lsrs r7, r6, #16\n\t"
  161563. #else
  161564. "lsr r7, r6, #16\n\t"
  161565. #endif
  161566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161567. "lsls r6, r6, #16\n\t"
  161568. #else
  161569. "lsl r6, r6, #16\n\t"
  161570. #endif
  161571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161572. "adds r5, r5, r6\n\t"
  161573. #else
  161574. "add r5, r5, r6\n\t"
  161575. #endif
  161576. #ifdef WOLFSSL_KEIL
  161577. "adcs r3, r3, r7\n\t"
  161578. #elif defined(__clang__)
  161579. "adcs r3, r7\n\t"
  161580. #else
  161581. "adc r3, r7\n\t"
  161582. #endif
  161583. #ifdef WOLFSSL_KEIL
  161584. "adcs r4, r4, %[r]\n\t"
  161585. #elif defined(__clang__)
  161586. "adcs r4, %[r]\n\t"
  161587. #else
  161588. "adc r4, %[r]\n\t"
  161589. #endif
  161590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161591. "lsrs r6, %[a], #16\n\t"
  161592. #else
  161593. "lsr r6, %[a], #16\n\t"
  161594. #endif
  161595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161596. "lsrs r7, %[b], #16\n\t"
  161597. #else
  161598. "lsr r7, %[b], #16\n\t"
  161599. #endif
  161600. #ifdef WOLFSSL_KEIL
  161601. "muls r7, r6, r7\n\t"
  161602. #elif defined(__clang__)
  161603. "muls r7, r6\n\t"
  161604. #else
  161605. "mul r7, r6\n\t"
  161606. #endif
  161607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161608. "adds r3, r3, r7\n\t"
  161609. #else
  161610. "add r3, r3, r7\n\t"
  161611. #endif
  161612. #ifdef WOLFSSL_KEIL
  161613. "adcs r4, r4, %[r]\n\t"
  161614. #elif defined(__clang__)
  161615. "adcs r4, %[r]\n\t"
  161616. #else
  161617. "adc r4, %[r]\n\t"
  161618. #endif
  161619. "uxth r7, %[b]\n\t"
  161620. #ifdef WOLFSSL_KEIL
  161621. "muls r6, r7, r6\n\t"
  161622. #elif defined(__clang__)
  161623. "muls r6, r7\n\t"
  161624. #else
  161625. "mul r6, r7\n\t"
  161626. #endif
  161627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161628. "lsrs r7, r6, #16\n\t"
  161629. #else
  161630. "lsr r7, r6, #16\n\t"
  161631. #endif
  161632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161633. "lsls r6, r6, #16\n\t"
  161634. #else
  161635. "lsl r6, r6, #16\n\t"
  161636. #endif
  161637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161638. "adds r5, r5, r6\n\t"
  161639. #else
  161640. "add r5, r5, r6\n\t"
  161641. #endif
  161642. #ifdef WOLFSSL_KEIL
  161643. "adcs r3, r3, r7\n\t"
  161644. #elif defined(__clang__)
  161645. "adcs r3, r7\n\t"
  161646. #else
  161647. "adc r3, r7\n\t"
  161648. #endif
  161649. #ifdef WOLFSSL_KEIL
  161650. "adcs r4, r4, %[r]\n\t"
  161651. #elif defined(__clang__)
  161652. "adcs r4, %[r]\n\t"
  161653. #else
  161654. "adc r4, %[r]\n\t"
  161655. #endif
  161656. "# A[12] * B[8]\n\t"
  161657. "mov %[a], r9\n\t"
  161658. "mov %[b], r10\n\t"
  161659. "ldr %[a], [%[a], #48]\n\t"
  161660. "ldr %[b], [%[b], #32]\n\t"
  161661. "uxth r6, %[a]\n\t"
  161662. "uxth r7, %[b]\n\t"
  161663. #ifdef WOLFSSL_KEIL
  161664. "muls r7, r6, r7\n\t"
  161665. #elif defined(__clang__)
  161666. "muls r7, r6\n\t"
  161667. #else
  161668. "mul r7, r6\n\t"
  161669. #endif
  161670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161671. "adds r5, r5, r7\n\t"
  161672. #else
  161673. "add r5, r5, r7\n\t"
  161674. #endif
  161675. #ifdef WOLFSSL_KEIL
  161676. "adcs r3, r3, %[r]\n\t"
  161677. #elif defined(__clang__)
  161678. "adcs r3, %[r]\n\t"
  161679. #else
  161680. "adc r3, %[r]\n\t"
  161681. #endif
  161682. #ifdef WOLFSSL_KEIL
  161683. "adcs r4, r4, %[r]\n\t"
  161684. #elif defined(__clang__)
  161685. "adcs r4, %[r]\n\t"
  161686. #else
  161687. "adc r4, %[r]\n\t"
  161688. #endif
  161689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161690. "lsrs r7, %[b], #16\n\t"
  161691. #else
  161692. "lsr r7, %[b], #16\n\t"
  161693. #endif
  161694. #ifdef WOLFSSL_KEIL
  161695. "muls r6, r7, r6\n\t"
  161696. #elif defined(__clang__)
  161697. "muls r6, r7\n\t"
  161698. #else
  161699. "mul r6, r7\n\t"
  161700. #endif
  161701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161702. "lsrs r7, r6, #16\n\t"
  161703. #else
  161704. "lsr r7, r6, #16\n\t"
  161705. #endif
  161706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161707. "lsls r6, r6, #16\n\t"
  161708. #else
  161709. "lsl r6, r6, #16\n\t"
  161710. #endif
  161711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161712. "adds r5, r5, r6\n\t"
  161713. #else
  161714. "add r5, r5, r6\n\t"
  161715. #endif
  161716. #ifdef WOLFSSL_KEIL
  161717. "adcs r3, r3, r7\n\t"
  161718. #elif defined(__clang__)
  161719. "adcs r3, r7\n\t"
  161720. #else
  161721. "adc r3, r7\n\t"
  161722. #endif
  161723. #ifdef WOLFSSL_KEIL
  161724. "adcs r4, r4, %[r]\n\t"
  161725. #elif defined(__clang__)
  161726. "adcs r4, %[r]\n\t"
  161727. #else
  161728. "adc r4, %[r]\n\t"
  161729. #endif
  161730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161731. "lsrs r6, %[a], #16\n\t"
  161732. #else
  161733. "lsr r6, %[a], #16\n\t"
  161734. #endif
  161735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161736. "lsrs r7, %[b], #16\n\t"
  161737. #else
  161738. "lsr r7, %[b], #16\n\t"
  161739. #endif
  161740. #ifdef WOLFSSL_KEIL
  161741. "muls r7, r6, r7\n\t"
  161742. #elif defined(__clang__)
  161743. "muls r7, r6\n\t"
  161744. #else
  161745. "mul r7, r6\n\t"
  161746. #endif
  161747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161748. "adds r3, r3, r7\n\t"
  161749. #else
  161750. "add r3, r3, r7\n\t"
  161751. #endif
  161752. #ifdef WOLFSSL_KEIL
  161753. "adcs r4, r4, %[r]\n\t"
  161754. #elif defined(__clang__)
  161755. "adcs r4, %[r]\n\t"
  161756. #else
  161757. "adc r4, %[r]\n\t"
  161758. #endif
  161759. "uxth r7, %[b]\n\t"
  161760. #ifdef WOLFSSL_KEIL
  161761. "muls r6, r7, r6\n\t"
  161762. #elif defined(__clang__)
  161763. "muls r6, r7\n\t"
  161764. #else
  161765. "mul r6, r7\n\t"
  161766. #endif
  161767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161768. "lsrs r7, r6, #16\n\t"
  161769. #else
  161770. "lsr r7, r6, #16\n\t"
  161771. #endif
  161772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161773. "lsls r6, r6, #16\n\t"
  161774. #else
  161775. "lsl r6, r6, #16\n\t"
  161776. #endif
  161777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161778. "adds r5, r5, r6\n\t"
  161779. #else
  161780. "add r5, r5, r6\n\t"
  161781. #endif
  161782. #ifdef WOLFSSL_KEIL
  161783. "adcs r3, r3, r7\n\t"
  161784. #elif defined(__clang__)
  161785. "adcs r3, r7\n\t"
  161786. #else
  161787. "adc r3, r7\n\t"
  161788. #endif
  161789. #ifdef WOLFSSL_KEIL
  161790. "adcs r4, r4, %[r]\n\t"
  161791. #elif defined(__clang__)
  161792. "adcs r4, %[r]\n\t"
  161793. #else
  161794. "adc r4, %[r]\n\t"
  161795. #endif
  161796. "# A[11] * B[9]\n\t"
  161797. "mov %[a], r9\n\t"
  161798. "mov %[b], r10\n\t"
  161799. "ldr %[a], [%[a], #44]\n\t"
  161800. "ldr %[b], [%[b], #36]\n\t"
  161801. "uxth r6, %[a]\n\t"
  161802. "uxth r7, %[b]\n\t"
  161803. #ifdef WOLFSSL_KEIL
  161804. "muls r7, r6, r7\n\t"
  161805. #elif defined(__clang__)
  161806. "muls r7, r6\n\t"
  161807. #else
  161808. "mul r7, r6\n\t"
  161809. #endif
  161810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161811. "adds r5, r5, r7\n\t"
  161812. #else
  161813. "add r5, r5, r7\n\t"
  161814. #endif
  161815. #ifdef WOLFSSL_KEIL
  161816. "adcs r3, r3, %[r]\n\t"
  161817. #elif defined(__clang__)
  161818. "adcs r3, %[r]\n\t"
  161819. #else
  161820. "adc r3, %[r]\n\t"
  161821. #endif
  161822. #ifdef WOLFSSL_KEIL
  161823. "adcs r4, r4, %[r]\n\t"
  161824. #elif defined(__clang__)
  161825. "adcs r4, %[r]\n\t"
  161826. #else
  161827. "adc r4, %[r]\n\t"
  161828. #endif
  161829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161830. "lsrs r7, %[b], #16\n\t"
  161831. #else
  161832. "lsr r7, %[b], #16\n\t"
  161833. #endif
  161834. #ifdef WOLFSSL_KEIL
  161835. "muls r6, r7, r6\n\t"
  161836. #elif defined(__clang__)
  161837. "muls r6, r7\n\t"
  161838. #else
  161839. "mul r6, r7\n\t"
  161840. #endif
  161841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161842. "lsrs r7, r6, #16\n\t"
  161843. #else
  161844. "lsr r7, r6, #16\n\t"
  161845. #endif
  161846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161847. "lsls r6, r6, #16\n\t"
  161848. #else
  161849. "lsl r6, r6, #16\n\t"
  161850. #endif
  161851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161852. "adds r5, r5, r6\n\t"
  161853. #else
  161854. "add r5, r5, r6\n\t"
  161855. #endif
  161856. #ifdef WOLFSSL_KEIL
  161857. "adcs r3, r3, r7\n\t"
  161858. #elif defined(__clang__)
  161859. "adcs r3, r7\n\t"
  161860. #else
  161861. "adc r3, r7\n\t"
  161862. #endif
  161863. #ifdef WOLFSSL_KEIL
  161864. "adcs r4, r4, %[r]\n\t"
  161865. #elif defined(__clang__)
  161866. "adcs r4, %[r]\n\t"
  161867. #else
  161868. "adc r4, %[r]\n\t"
  161869. #endif
  161870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161871. "lsrs r6, %[a], #16\n\t"
  161872. #else
  161873. "lsr r6, %[a], #16\n\t"
  161874. #endif
  161875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161876. "lsrs r7, %[b], #16\n\t"
  161877. #else
  161878. "lsr r7, %[b], #16\n\t"
  161879. #endif
  161880. #ifdef WOLFSSL_KEIL
  161881. "muls r7, r6, r7\n\t"
  161882. #elif defined(__clang__)
  161883. "muls r7, r6\n\t"
  161884. #else
  161885. "mul r7, r6\n\t"
  161886. #endif
  161887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161888. "adds r3, r3, r7\n\t"
  161889. #else
  161890. "add r3, r3, r7\n\t"
  161891. #endif
  161892. #ifdef WOLFSSL_KEIL
  161893. "adcs r4, r4, %[r]\n\t"
  161894. #elif defined(__clang__)
  161895. "adcs r4, %[r]\n\t"
  161896. #else
  161897. "adc r4, %[r]\n\t"
  161898. #endif
  161899. "uxth r7, %[b]\n\t"
  161900. #ifdef WOLFSSL_KEIL
  161901. "muls r6, r7, r6\n\t"
  161902. #elif defined(__clang__)
  161903. "muls r6, r7\n\t"
  161904. #else
  161905. "mul r6, r7\n\t"
  161906. #endif
  161907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161908. "lsrs r7, r6, #16\n\t"
  161909. #else
  161910. "lsr r7, r6, #16\n\t"
  161911. #endif
  161912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161913. "lsls r6, r6, #16\n\t"
  161914. #else
  161915. "lsl r6, r6, #16\n\t"
  161916. #endif
  161917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161918. "adds r5, r5, r6\n\t"
  161919. #else
  161920. "add r5, r5, r6\n\t"
  161921. #endif
  161922. #ifdef WOLFSSL_KEIL
  161923. "adcs r3, r3, r7\n\t"
  161924. #elif defined(__clang__)
  161925. "adcs r3, r7\n\t"
  161926. #else
  161927. "adc r3, r7\n\t"
  161928. #endif
  161929. #ifdef WOLFSSL_KEIL
  161930. "adcs r4, r4, %[r]\n\t"
  161931. #elif defined(__clang__)
  161932. "adcs r4, %[r]\n\t"
  161933. #else
  161934. "adc r4, %[r]\n\t"
  161935. #endif
  161936. "# A[10] * B[10]\n\t"
  161937. "mov %[a], r9\n\t"
  161938. "mov %[b], r10\n\t"
  161939. "ldr %[a], [%[a], #40]\n\t"
  161940. "ldr %[b], [%[b], #40]\n\t"
  161941. "uxth r6, %[a]\n\t"
  161942. "uxth r7, %[b]\n\t"
  161943. #ifdef WOLFSSL_KEIL
  161944. "muls r7, r6, r7\n\t"
  161945. #elif defined(__clang__)
  161946. "muls r7, r6\n\t"
  161947. #else
  161948. "mul r7, r6\n\t"
  161949. #endif
  161950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161951. "adds r5, r5, r7\n\t"
  161952. #else
  161953. "add r5, r5, r7\n\t"
  161954. #endif
  161955. #ifdef WOLFSSL_KEIL
  161956. "adcs r3, r3, %[r]\n\t"
  161957. #elif defined(__clang__)
  161958. "adcs r3, %[r]\n\t"
  161959. #else
  161960. "adc r3, %[r]\n\t"
  161961. #endif
  161962. #ifdef WOLFSSL_KEIL
  161963. "adcs r4, r4, %[r]\n\t"
  161964. #elif defined(__clang__)
  161965. "adcs r4, %[r]\n\t"
  161966. #else
  161967. "adc r4, %[r]\n\t"
  161968. #endif
  161969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161970. "lsrs r7, %[b], #16\n\t"
  161971. #else
  161972. "lsr r7, %[b], #16\n\t"
  161973. #endif
  161974. #ifdef WOLFSSL_KEIL
  161975. "muls r6, r7, r6\n\t"
  161976. #elif defined(__clang__)
  161977. "muls r6, r7\n\t"
  161978. #else
  161979. "mul r6, r7\n\t"
  161980. #endif
  161981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161982. "lsrs r7, r6, #16\n\t"
  161983. #else
  161984. "lsr r7, r6, #16\n\t"
  161985. #endif
  161986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161987. "lsls r6, r6, #16\n\t"
  161988. #else
  161989. "lsl r6, r6, #16\n\t"
  161990. #endif
  161991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161992. "adds r5, r5, r6\n\t"
  161993. #else
  161994. "add r5, r5, r6\n\t"
  161995. #endif
  161996. #ifdef WOLFSSL_KEIL
  161997. "adcs r3, r3, r7\n\t"
  161998. #elif defined(__clang__)
  161999. "adcs r3, r7\n\t"
  162000. #else
  162001. "adc r3, r7\n\t"
  162002. #endif
  162003. #ifdef WOLFSSL_KEIL
  162004. "adcs r4, r4, %[r]\n\t"
  162005. #elif defined(__clang__)
  162006. "adcs r4, %[r]\n\t"
  162007. #else
  162008. "adc r4, %[r]\n\t"
  162009. #endif
  162010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162011. "lsrs r6, %[a], #16\n\t"
  162012. #else
  162013. "lsr r6, %[a], #16\n\t"
  162014. #endif
  162015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162016. "lsrs r7, %[b], #16\n\t"
  162017. #else
  162018. "lsr r7, %[b], #16\n\t"
  162019. #endif
  162020. #ifdef WOLFSSL_KEIL
  162021. "muls r7, r6, r7\n\t"
  162022. #elif defined(__clang__)
  162023. "muls r7, r6\n\t"
  162024. #else
  162025. "mul r7, r6\n\t"
  162026. #endif
  162027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162028. "adds r3, r3, r7\n\t"
  162029. #else
  162030. "add r3, r3, r7\n\t"
  162031. #endif
  162032. #ifdef WOLFSSL_KEIL
  162033. "adcs r4, r4, %[r]\n\t"
  162034. #elif defined(__clang__)
  162035. "adcs r4, %[r]\n\t"
  162036. #else
  162037. "adc r4, %[r]\n\t"
  162038. #endif
  162039. "uxth r7, %[b]\n\t"
  162040. #ifdef WOLFSSL_KEIL
  162041. "muls r6, r7, r6\n\t"
  162042. #elif defined(__clang__)
  162043. "muls r6, r7\n\t"
  162044. #else
  162045. "mul r6, r7\n\t"
  162046. #endif
  162047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162048. "lsrs r7, r6, #16\n\t"
  162049. #else
  162050. "lsr r7, r6, #16\n\t"
  162051. #endif
  162052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162053. "lsls r6, r6, #16\n\t"
  162054. #else
  162055. "lsl r6, r6, #16\n\t"
  162056. #endif
  162057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162058. "adds r5, r5, r6\n\t"
  162059. #else
  162060. "add r5, r5, r6\n\t"
  162061. #endif
  162062. #ifdef WOLFSSL_KEIL
  162063. "adcs r3, r3, r7\n\t"
  162064. #elif defined(__clang__)
  162065. "adcs r3, r7\n\t"
  162066. #else
  162067. "adc r3, r7\n\t"
  162068. #endif
  162069. #ifdef WOLFSSL_KEIL
  162070. "adcs r4, r4, %[r]\n\t"
  162071. #elif defined(__clang__)
  162072. "adcs r4, %[r]\n\t"
  162073. #else
  162074. "adc r4, %[r]\n\t"
  162075. #endif
  162076. "# A[9] * B[11]\n\t"
  162077. "mov %[a], r9\n\t"
  162078. "mov %[b], r10\n\t"
  162079. "ldr %[a], [%[a], #36]\n\t"
  162080. "ldr %[b], [%[b], #44]\n\t"
  162081. "uxth r6, %[a]\n\t"
  162082. "uxth r7, %[b]\n\t"
  162083. #ifdef WOLFSSL_KEIL
  162084. "muls r7, r6, r7\n\t"
  162085. #elif defined(__clang__)
  162086. "muls r7, r6\n\t"
  162087. #else
  162088. "mul r7, r6\n\t"
  162089. #endif
  162090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162091. "adds r5, r5, r7\n\t"
  162092. #else
  162093. "add r5, r5, r7\n\t"
  162094. #endif
  162095. #ifdef WOLFSSL_KEIL
  162096. "adcs r3, r3, %[r]\n\t"
  162097. #elif defined(__clang__)
  162098. "adcs r3, %[r]\n\t"
  162099. #else
  162100. "adc r3, %[r]\n\t"
  162101. #endif
  162102. #ifdef WOLFSSL_KEIL
  162103. "adcs r4, r4, %[r]\n\t"
  162104. #elif defined(__clang__)
  162105. "adcs r4, %[r]\n\t"
  162106. #else
  162107. "adc r4, %[r]\n\t"
  162108. #endif
  162109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162110. "lsrs r7, %[b], #16\n\t"
  162111. #else
  162112. "lsr r7, %[b], #16\n\t"
  162113. #endif
  162114. #ifdef WOLFSSL_KEIL
  162115. "muls r6, r7, r6\n\t"
  162116. #elif defined(__clang__)
  162117. "muls r6, r7\n\t"
  162118. #else
  162119. "mul r6, r7\n\t"
  162120. #endif
  162121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162122. "lsrs r7, r6, #16\n\t"
  162123. #else
  162124. "lsr r7, r6, #16\n\t"
  162125. #endif
  162126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162127. "lsls r6, r6, #16\n\t"
  162128. #else
  162129. "lsl r6, r6, #16\n\t"
  162130. #endif
  162131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162132. "adds r5, r5, r6\n\t"
  162133. #else
  162134. "add r5, r5, r6\n\t"
  162135. #endif
  162136. #ifdef WOLFSSL_KEIL
  162137. "adcs r3, r3, r7\n\t"
  162138. #elif defined(__clang__)
  162139. "adcs r3, r7\n\t"
  162140. #else
  162141. "adc r3, r7\n\t"
  162142. #endif
  162143. #ifdef WOLFSSL_KEIL
  162144. "adcs r4, r4, %[r]\n\t"
  162145. #elif defined(__clang__)
  162146. "adcs r4, %[r]\n\t"
  162147. #else
  162148. "adc r4, %[r]\n\t"
  162149. #endif
  162150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162151. "lsrs r6, %[a], #16\n\t"
  162152. #else
  162153. "lsr r6, %[a], #16\n\t"
  162154. #endif
  162155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162156. "lsrs r7, %[b], #16\n\t"
  162157. #else
  162158. "lsr r7, %[b], #16\n\t"
  162159. #endif
  162160. #ifdef WOLFSSL_KEIL
  162161. "muls r7, r6, r7\n\t"
  162162. #elif defined(__clang__)
  162163. "muls r7, r6\n\t"
  162164. #else
  162165. "mul r7, r6\n\t"
  162166. #endif
  162167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162168. "adds r3, r3, r7\n\t"
  162169. #else
  162170. "add r3, r3, r7\n\t"
  162171. #endif
  162172. #ifdef WOLFSSL_KEIL
  162173. "adcs r4, r4, %[r]\n\t"
  162174. #elif defined(__clang__)
  162175. "adcs r4, %[r]\n\t"
  162176. #else
  162177. "adc r4, %[r]\n\t"
  162178. #endif
  162179. "uxth r7, %[b]\n\t"
  162180. #ifdef WOLFSSL_KEIL
  162181. "muls r6, r7, r6\n\t"
  162182. #elif defined(__clang__)
  162183. "muls r6, r7\n\t"
  162184. #else
  162185. "mul r6, r7\n\t"
  162186. #endif
  162187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162188. "lsrs r7, r6, #16\n\t"
  162189. #else
  162190. "lsr r7, r6, #16\n\t"
  162191. #endif
  162192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162193. "lsls r6, r6, #16\n\t"
  162194. #else
  162195. "lsl r6, r6, #16\n\t"
  162196. #endif
  162197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162198. "adds r5, r5, r6\n\t"
  162199. #else
  162200. "add r5, r5, r6\n\t"
  162201. #endif
  162202. #ifdef WOLFSSL_KEIL
  162203. "adcs r3, r3, r7\n\t"
  162204. #elif defined(__clang__)
  162205. "adcs r3, r7\n\t"
  162206. #else
  162207. "adc r3, r7\n\t"
  162208. #endif
  162209. #ifdef WOLFSSL_KEIL
  162210. "adcs r4, r4, %[r]\n\t"
  162211. #elif defined(__clang__)
  162212. "adcs r4, %[r]\n\t"
  162213. #else
  162214. "adc r4, %[r]\n\t"
  162215. #endif
  162216. "# A[8] * B[12]\n\t"
  162217. "mov %[a], r9\n\t"
  162218. "mov %[b], r10\n\t"
  162219. "ldr %[a], [%[a], #32]\n\t"
  162220. "ldr %[b], [%[b], #48]\n\t"
  162221. "uxth r6, %[a]\n\t"
  162222. "uxth r7, %[b]\n\t"
  162223. #ifdef WOLFSSL_KEIL
  162224. "muls r7, r6, r7\n\t"
  162225. #elif defined(__clang__)
  162226. "muls r7, r6\n\t"
  162227. #else
  162228. "mul r7, r6\n\t"
  162229. #endif
  162230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162231. "adds r5, r5, r7\n\t"
  162232. #else
  162233. "add r5, r5, r7\n\t"
  162234. #endif
  162235. #ifdef WOLFSSL_KEIL
  162236. "adcs r3, r3, %[r]\n\t"
  162237. #elif defined(__clang__)
  162238. "adcs r3, %[r]\n\t"
  162239. #else
  162240. "adc r3, %[r]\n\t"
  162241. #endif
  162242. #ifdef WOLFSSL_KEIL
  162243. "adcs r4, r4, %[r]\n\t"
  162244. #elif defined(__clang__)
  162245. "adcs r4, %[r]\n\t"
  162246. #else
  162247. "adc r4, %[r]\n\t"
  162248. #endif
  162249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162250. "lsrs r7, %[b], #16\n\t"
  162251. #else
  162252. "lsr r7, %[b], #16\n\t"
  162253. #endif
  162254. #ifdef WOLFSSL_KEIL
  162255. "muls r6, r7, r6\n\t"
  162256. #elif defined(__clang__)
  162257. "muls r6, r7\n\t"
  162258. #else
  162259. "mul r6, r7\n\t"
  162260. #endif
  162261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162262. "lsrs r7, r6, #16\n\t"
  162263. #else
  162264. "lsr r7, r6, #16\n\t"
  162265. #endif
  162266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162267. "lsls r6, r6, #16\n\t"
  162268. #else
  162269. "lsl r6, r6, #16\n\t"
  162270. #endif
  162271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162272. "adds r5, r5, r6\n\t"
  162273. #else
  162274. "add r5, r5, r6\n\t"
  162275. #endif
  162276. #ifdef WOLFSSL_KEIL
  162277. "adcs r3, r3, r7\n\t"
  162278. #elif defined(__clang__)
  162279. "adcs r3, r7\n\t"
  162280. #else
  162281. "adc r3, r7\n\t"
  162282. #endif
  162283. #ifdef WOLFSSL_KEIL
  162284. "adcs r4, r4, %[r]\n\t"
  162285. #elif defined(__clang__)
  162286. "adcs r4, %[r]\n\t"
  162287. #else
  162288. "adc r4, %[r]\n\t"
  162289. #endif
  162290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162291. "lsrs r6, %[a], #16\n\t"
  162292. #else
  162293. "lsr r6, %[a], #16\n\t"
  162294. #endif
  162295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162296. "lsrs r7, %[b], #16\n\t"
  162297. #else
  162298. "lsr r7, %[b], #16\n\t"
  162299. #endif
  162300. #ifdef WOLFSSL_KEIL
  162301. "muls r7, r6, r7\n\t"
  162302. #elif defined(__clang__)
  162303. "muls r7, r6\n\t"
  162304. #else
  162305. "mul r7, r6\n\t"
  162306. #endif
  162307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162308. "adds r3, r3, r7\n\t"
  162309. #else
  162310. "add r3, r3, r7\n\t"
  162311. #endif
  162312. #ifdef WOLFSSL_KEIL
  162313. "adcs r4, r4, %[r]\n\t"
  162314. #elif defined(__clang__)
  162315. "adcs r4, %[r]\n\t"
  162316. #else
  162317. "adc r4, %[r]\n\t"
  162318. #endif
  162319. "uxth r7, %[b]\n\t"
  162320. #ifdef WOLFSSL_KEIL
  162321. "muls r6, r7, r6\n\t"
  162322. #elif defined(__clang__)
  162323. "muls r6, r7\n\t"
  162324. #else
  162325. "mul r6, r7\n\t"
  162326. #endif
  162327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162328. "lsrs r7, r6, #16\n\t"
  162329. #else
  162330. "lsr r7, r6, #16\n\t"
  162331. #endif
  162332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162333. "lsls r6, r6, #16\n\t"
  162334. #else
  162335. "lsl r6, r6, #16\n\t"
  162336. #endif
  162337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162338. "adds r5, r5, r6\n\t"
  162339. #else
  162340. "add r5, r5, r6\n\t"
  162341. #endif
  162342. #ifdef WOLFSSL_KEIL
  162343. "adcs r3, r3, r7\n\t"
  162344. #elif defined(__clang__)
  162345. "adcs r3, r7\n\t"
  162346. #else
  162347. "adc r3, r7\n\t"
  162348. #endif
  162349. #ifdef WOLFSSL_KEIL
  162350. "adcs r4, r4, %[r]\n\t"
  162351. #elif defined(__clang__)
  162352. "adcs r4, %[r]\n\t"
  162353. #else
  162354. "adc r4, %[r]\n\t"
  162355. #endif
  162356. "# A[7] * B[13]\n\t"
  162357. "mov %[a], r9\n\t"
  162358. "mov %[b], r10\n\t"
  162359. "ldr %[a], [%[a], #28]\n\t"
  162360. "ldr %[b], [%[b], #52]\n\t"
  162361. "uxth r6, %[a]\n\t"
  162362. "uxth r7, %[b]\n\t"
  162363. #ifdef WOLFSSL_KEIL
  162364. "muls r7, r6, r7\n\t"
  162365. #elif defined(__clang__)
  162366. "muls r7, r6\n\t"
  162367. #else
  162368. "mul r7, r6\n\t"
  162369. #endif
  162370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162371. "adds r5, r5, r7\n\t"
  162372. #else
  162373. "add r5, r5, r7\n\t"
  162374. #endif
  162375. #ifdef WOLFSSL_KEIL
  162376. "adcs r3, r3, %[r]\n\t"
  162377. #elif defined(__clang__)
  162378. "adcs r3, %[r]\n\t"
  162379. #else
  162380. "adc r3, %[r]\n\t"
  162381. #endif
  162382. #ifdef WOLFSSL_KEIL
  162383. "adcs r4, r4, %[r]\n\t"
  162384. #elif defined(__clang__)
  162385. "adcs r4, %[r]\n\t"
  162386. #else
  162387. "adc r4, %[r]\n\t"
  162388. #endif
  162389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162390. "lsrs r7, %[b], #16\n\t"
  162391. #else
  162392. "lsr r7, %[b], #16\n\t"
  162393. #endif
  162394. #ifdef WOLFSSL_KEIL
  162395. "muls r6, r7, r6\n\t"
  162396. #elif defined(__clang__)
  162397. "muls r6, r7\n\t"
  162398. #else
  162399. "mul r6, r7\n\t"
  162400. #endif
  162401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162402. "lsrs r7, r6, #16\n\t"
  162403. #else
  162404. "lsr r7, r6, #16\n\t"
  162405. #endif
  162406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162407. "lsls r6, r6, #16\n\t"
  162408. #else
  162409. "lsl r6, r6, #16\n\t"
  162410. #endif
  162411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162412. "adds r5, r5, r6\n\t"
  162413. #else
  162414. "add r5, r5, r6\n\t"
  162415. #endif
  162416. #ifdef WOLFSSL_KEIL
  162417. "adcs r3, r3, r7\n\t"
  162418. #elif defined(__clang__)
  162419. "adcs r3, r7\n\t"
  162420. #else
  162421. "adc r3, r7\n\t"
  162422. #endif
  162423. #ifdef WOLFSSL_KEIL
  162424. "adcs r4, r4, %[r]\n\t"
  162425. #elif defined(__clang__)
  162426. "adcs r4, %[r]\n\t"
  162427. #else
  162428. "adc r4, %[r]\n\t"
  162429. #endif
  162430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162431. "lsrs r6, %[a], #16\n\t"
  162432. #else
  162433. "lsr r6, %[a], #16\n\t"
  162434. #endif
  162435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162436. "lsrs r7, %[b], #16\n\t"
  162437. #else
  162438. "lsr r7, %[b], #16\n\t"
  162439. #endif
  162440. #ifdef WOLFSSL_KEIL
  162441. "muls r7, r6, r7\n\t"
  162442. #elif defined(__clang__)
  162443. "muls r7, r6\n\t"
  162444. #else
  162445. "mul r7, r6\n\t"
  162446. #endif
  162447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162448. "adds r3, r3, r7\n\t"
  162449. #else
  162450. "add r3, r3, r7\n\t"
  162451. #endif
  162452. #ifdef WOLFSSL_KEIL
  162453. "adcs r4, r4, %[r]\n\t"
  162454. #elif defined(__clang__)
  162455. "adcs r4, %[r]\n\t"
  162456. #else
  162457. "adc r4, %[r]\n\t"
  162458. #endif
  162459. "uxth r7, %[b]\n\t"
  162460. #ifdef WOLFSSL_KEIL
  162461. "muls r6, r7, r6\n\t"
  162462. #elif defined(__clang__)
  162463. "muls r6, r7\n\t"
  162464. #else
  162465. "mul r6, r7\n\t"
  162466. #endif
  162467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162468. "lsrs r7, r6, #16\n\t"
  162469. #else
  162470. "lsr r7, r6, #16\n\t"
  162471. #endif
  162472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162473. "lsls r6, r6, #16\n\t"
  162474. #else
  162475. "lsl r6, r6, #16\n\t"
  162476. #endif
  162477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162478. "adds r5, r5, r6\n\t"
  162479. #else
  162480. "add r5, r5, r6\n\t"
  162481. #endif
  162482. #ifdef WOLFSSL_KEIL
  162483. "adcs r3, r3, r7\n\t"
  162484. #elif defined(__clang__)
  162485. "adcs r3, r7\n\t"
  162486. #else
  162487. "adc r3, r7\n\t"
  162488. #endif
  162489. #ifdef WOLFSSL_KEIL
  162490. "adcs r4, r4, %[r]\n\t"
  162491. #elif defined(__clang__)
  162492. "adcs r4, %[r]\n\t"
  162493. #else
  162494. "adc r4, %[r]\n\t"
  162495. #endif
  162496. "# A[6] * B[14]\n\t"
  162497. "mov %[a], r9\n\t"
  162498. "mov %[b], r10\n\t"
  162499. "ldr %[a], [%[a], #24]\n\t"
  162500. "ldr %[b], [%[b], #56]\n\t"
  162501. "uxth r6, %[a]\n\t"
  162502. "uxth r7, %[b]\n\t"
  162503. #ifdef WOLFSSL_KEIL
  162504. "muls r7, r6, r7\n\t"
  162505. #elif defined(__clang__)
  162506. "muls r7, r6\n\t"
  162507. #else
  162508. "mul r7, r6\n\t"
  162509. #endif
  162510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162511. "adds r5, r5, r7\n\t"
  162512. #else
  162513. "add r5, r5, r7\n\t"
  162514. #endif
  162515. #ifdef WOLFSSL_KEIL
  162516. "adcs r3, r3, %[r]\n\t"
  162517. #elif defined(__clang__)
  162518. "adcs r3, %[r]\n\t"
  162519. #else
  162520. "adc r3, %[r]\n\t"
  162521. #endif
  162522. #ifdef WOLFSSL_KEIL
  162523. "adcs r4, r4, %[r]\n\t"
  162524. #elif defined(__clang__)
  162525. "adcs r4, %[r]\n\t"
  162526. #else
  162527. "adc r4, %[r]\n\t"
  162528. #endif
  162529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162530. "lsrs r7, %[b], #16\n\t"
  162531. #else
  162532. "lsr r7, %[b], #16\n\t"
  162533. #endif
  162534. #ifdef WOLFSSL_KEIL
  162535. "muls r6, r7, r6\n\t"
  162536. #elif defined(__clang__)
  162537. "muls r6, r7\n\t"
  162538. #else
  162539. "mul r6, r7\n\t"
  162540. #endif
  162541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162542. "lsrs r7, r6, #16\n\t"
  162543. #else
  162544. "lsr r7, r6, #16\n\t"
  162545. #endif
  162546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162547. "lsls r6, r6, #16\n\t"
  162548. #else
  162549. "lsl r6, r6, #16\n\t"
  162550. #endif
  162551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162552. "adds r5, r5, r6\n\t"
  162553. #else
  162554. "add r5, r5, r6\n\t"
  162555. #endif
  162556. #ifdef WOLFSSL_KEIL
  162557. "adcs r3, r3, r7\n\t"
  162558. #elif defined(__clang__)
  162559. "adcs r3, r7\n\t"
  162560. #else
  162561. "adc r3, r7\n\t"
  162562. #endif
  162563. #ifdef WOLFSSL_KEIL
  162564. "adcs r4, r4, %[r]\n\t"
  162565. #elif defined(__clang__)
  162566. "adcs r4, %[r]\n\t"
  162567. #else
  162568. "adc r4, %[r]\n\t"
  162569. #endif
  162570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162571. "lsrs r6, %[a], #16\n\t"
  162572. #else
  162573. "lsr r6, %[a], #16\n\t"
  162574. #endif
  162575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162576. "lsrs r7, %[b], #16\n\t"
  162577. #else
  162578. "lsr r7, %[b], #16\n\t"
  162579. #endif
  162580. #ifdef WOLFSSL_KEIL
  162581. "muls r7, r6, r7\n\t"
  162582. #elif defined(__clang__)
  162583. "muls r7, r6\n\t"
  162584. #else
  162585. "mul r7, r6\n\t"
  162586. #endif
  162587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162588. "adds r3, r3, r7\n\t"
  162589. #else
  162590. "add r3, r3, r7\n\t"
  162591. #endif
  162592. #ifdef WOLFSSL_KEIL
  162593. "adcs r4, r4, %[r]\n\t"
  162594. #elif defined(__clang__)
  162595. "adcs r4, %[r]\n\t"
  162596. #else
  162597. "adc r4, %[r]\n\t"
  162598. #endif
  162599. "uxth r7, %[b]\n\t"
  162600. #ifdef WOLFSSL_KEIL
  162601. "muls r6, r7, r6\n\t"
  162602. #elif defined(__clang__)
  162603. "muls r6, r7\n\t"
  162604. #else
  162605. "mul r6, r7\n\t"
  162606. #endif
  162607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162608. "lsrs r7, r6, #16\n\t"
  162609. #else
  162610. "lsr r7, r6, #16\n\t"
  162611. #endif
  162612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162613. "lsls r6, r6, #16\n\t"
  162614. #else
  162615. "lsl r6, r6, #16\n\t"
  162616. #endif
  162617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162618. "adds r5, r5, r6\n\t"
  162619. #else
  162620. "add r5, r5, r6\n\t"
  162621. #endif
  162622. #ifdef WOLFSSL_KEIL
  162623. "adcs r3, r3, r7\n\t"
  162624. #elif defined(__clang__)
  162625. "adcs r3, r7\n\t"
  162626. #else
  162627. "adc r3, r7\n\t"
  162628. #endif
  162629. #ifdef WOLFSSL_KEIL
  162630. "adcs r4, r4, %[r]\n\t"
  162631. #elif defined(__clang__)
  162632. "adcs r4, %[r]\n\t"
  162633. #else
  162634. "adc r4, %[r]\n\t"
  162635. #endif
  162636. "# A[5] * B[15]\n\t"
  162637. "mov %[a], r9\n\t"
  162638. "mov %[b], r10\n\t"
  162639. "ldr %[a], [%[a], #20]\n\t"
  162640. "ldr %[b], [%[b], #60]\n\t"
  162641. "uxth r6, %[a]\n\t"
  162642. "uxth r7, %[b]\n\t"
  162643. #ifdef WOLFSSL_KEIL
  162644. "muls r7, r6, r7\n\t"
  162645. #elif defined(__clang__)
  162646. "muls r7, r6\n\t"
  162647. #else
  162648. "mul r7, r6\n\t"
  162649. #endif
  162650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162651. "adds r5, r5, r7\n\t"
  162652. #else
  162653. "add r5, r5, r7\n\t"
  162654. #endif
  162655. #ifdef WOLFSSL_KEIL
  162656. "adcs r3, r3, %[r]\n\t"
  162657. #elif defined(__clang__)
  162658. "adcs r3, %[r]\n\t"
  162659. #else
  162660. "adc r3, %[r]\n\t"
  162661. #endif
  162662. #ifdef WOLFSSL_KEIL
  162663. "adcs r4, r4, %[r]\n\t"
  162664. #elif defined(__clang__)
  162665. "adcs r4, %[r]\n\t"
  162666. #else
  162667. "adc r4, %[r]\n\t"
  162668. #endif
  162669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162670. "lsrs r7, %[b], #16\n\t"
  162671. #else
  162672. "lsr r7, %[b], #16\n\t"
  162673. #endif
  162674. #ifdef WOLFSSL_KEIL
  162675. "muls r6, r7, r6\n\t"
  162676. #elif defined(__clang__)
  162677. "muls r6, r7\n\t"
  162678. #else
  162679. "mul r6, r7\n\t"
  162680. #endif
  162681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162682. "lsrs r7, r6, #16\n\t"
  162683. #else
  162684. "lsr r7, r6, #16\n\t"
  162685. #endif
  162686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162687. "lsls r6, r6, #16\n\t"
  162688. #else
  162689. "lsl r6, r6, #16\n\t"
  162690. #endif
  162691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162692. "adds r5, r5, r6\n\t"
  162693. #else
  162694. "add r5, r5, r6\n\t"
  162695. #endif
  162696. #ifdef WOLFSSL_KEIL
  162697. "adcs r3, r3, r7\n\t"
  162698. #elif defined(__clang__)
  162699. "adcs r3, r7\n\t"
  162700. #else
  162701. "adc r3, r7\n\t"
  162702. #endif
  162703. #ifdef WOLFSSL_KEIL
  162704. "adcs r4, r4, %[r]\n\t"
  162705. #elif defined(__clang__)
  162706. "adcs r4, %[r]\n\t"
  162707. #else
  162708. "adc r4, %[r]\n\t"
  162709. #endif
  162710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162711. "lsrs r6, %[a], #16\n\t"
  162712. #else
  162713. "lsr r6, %[a], #16\n\t"
  162714. #endif
  162715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162716. "lsrs r7, %[b], #16\n\t"
  162717. #else
  162718. "lsr r7, %[b], #16\n\t"
  162719. #endif
  162720. #ifdef WOLFSSL_KEIL
  162721. "muls r7, r6, r7\n\t"
  162722. #elif defined(__clang__)
  162723. "muls r7, r6\n\t"
  162724. #else
  162725. "mul r7, r6\n\t"
  162726. #endif
  162727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162728. "adds r3, r3, r7\n\t"
  162729. #else
  162730. "add r3, r3, r7\n\t"
  162731. #endif
  162732. #ifdef WOLFSSL_KEIL
  162733. "adcs r4, r4, %[r]\n\t"
  162734. #elif defined(__clang__)
  162735. "adcs r4, %[r]\n\t"
  162736. #else
  162737. "adc r4, %[r]\n\t"
  162738. #endif
  162739. "uxth r7, %[b]\n\t"
  162740. #ifdef WOLFSSL_KEIL
  162741. "muls r6, r7, r6\n\t"
  162742. #elif defined(__clang__)
  162743. "muls r6, r7\n\t"
  162744. #else
  162745. "mul r6, r7\n\t"
  162746. #endif
  162747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162748. "lsrs r7, r6, #16\n\t"
  162749. #else
  162750. "lsr r7, r6, #16\n\t"
  162751. #endif
  162752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162753. "lsls r6, r6, #16\n\t"
  162754. #else
  162755. "lsl r6, r6, #16\n\t"
  162756. #endif
  162757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162758. "adds r5, r5, r6\n\t"
  162759. #else
  162760. "add r5, r5, r6\n\t"
  162761. #endif
  162762. #ifdef WOLFSSL_KEIL
  162763. "adcs r3, r3, r7\n\t"
  162764. #elif defined(__clang__)
  162765. "adcs r3, r7\n\t"
  162766. #else
  162767. "adc r3, r7\n\t"
  162768. #endif
  162769. #ifdef WOLFSSL_KEIL
  162770. "adcs r4, r4, %[r]\n\t"
  162771. #elif defined(__clang__)
  162772. "adcs r4, %[r]\n\t"
  162773. #else
  162774. "adc r4, %[r]\n\t"
  162775. #endif
  162776. "mov %[r], r8\n\t"
  162777. "str r5, [%[r], #80]\n\t"
  162778. "movs %[r], #0\n\t"
  162779. "# A[6] * B[15]\n\t"
  162780. "movs r5, #0\n\t"
  162781. "mov %[a], r9\n\t"
  162782. "mov %[b], r10\n\t"
  162783. "ldr %[a], [%[a], #24]\n\t"
  162784. "ldr %[b], [%[b], #60]\n\t"
  162785. "uxth r6, %[a]\n\t"
  162786. "uxth r7, %[b]\n\t"
  162787. #ifdef WOLFSSL_KEIL
  162788. "muls r7, r6, r7\n\t"
  162789. #elif defined(__clang__)
  162790. "muls r7, r6\n\t"
  162791. #else
  162792. "mul r7, r6\n\t"
  162793. #endif
  162794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162795. "adds r3, r3, r7\n\t"
  162796. #else
  162797. "add r3, r3, r7\n\t"
  162798. #endif
  162799. #ifdef WOLFSSL_KEIL
  162800. "adcs r4, r4, %[r]\n\t"
  162801. #elif defined(__clang__)
  162802. "adcs r4, %[r]\n\t"
  162803. #else
  162804. "adc r4, %[r]\n\t"
  162805. #endif
  162806. #ifdef WOLFSSL_KEIL
  162807. "adcs r5, r5, %[r]\n\t"
  162808. #elif defined(__clang__)
  162809. "adcs r5, %[r]\n\t"
  162810. #else
  162811. "adc r5, %[r]\n\t"
  162812. #endif
  162813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162814. "lsrs r7, %[b], #16\n\t"
  162815. #else
  162816. "lsr r7, %[b], #16\n\t"
  162817. #endif
  162818. #ifdef WOLFSSL_KEIL
  162819. "muls r6, r7, r6\n\t"
  162820. #elif defined(__clang__)
  162821. "muls r6, r7\n\t"
  162822. #else
  162823. "mul r6, r7\n\t"
  162824. #endif
  162825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162826. "lsrs r7, r6, #16\n\t"
  162827. #else
  162828. "lsr r7, r6, #16\n\t"
  162829. #endif
  162830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162831. "lsls r6, r6, #16\n\t"
  162832. #else
  162833. "lsl r6, r6, #16\n\t"
  162834. #endif
  162835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162836. "adds r3, r3, r6\n\t"
  162837. #else
  162838. "add r3, r3, r6\n\t"
  162839. #endif
  162840. #ifdef WOLFSSL_KEIL
  162841. "adcs r4, r4, r7\n\t"
  162842. #elif defined(__clang__)
  162843. "adcs r4, r7\n\t"
  162844. #else
  162845. "adc r4, r7\n\t"
  162846. #endif
  162847. #ifdef WOLFSSL_KEIL
  162848. "adcs r5, r5, %[r]\n\t"
  162849. #elif defined(__clang__)
  162850. "adcs r5, %[r]\n\t"
  162851. #else
  162852. "adc r5, %[r]\n\t"
  162853. #endif
  162854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162855. "lsrs r6, %[a], #16\n\t"
  162856. #else
  162857. "lsr r6, %[a], #16\n\t"
  162858. #endif
  162859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162860. "lsrs r7, %[b], #16\n\t"
  162861. #else
  162862. "lsr r7, %[b], #16\n\t"
  162863. #endif
  162864. #ifdef WOLFSSL_KEIL
  162865. "muls r7, r6, r7\n\t"
  162866. #elif defined(__clang__)
  162867. "muls r7, r6\n\t"
  162868. #else
  162869. "mul r7, r6\n\t"
  162870. #endif
  162871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162872. "adds r4, r4, r7\n\t"
  162873. #else
  162874. "add r4, r4, r7\n\t"
  162875. #endif
  162876. #ifdef WOLFSSL_KEIL
  162877. "adcs r5, r5, %[r]\n\t"
  162878. #elif defined(__clang__)
  162879. "adcs r5, %[r]\n\t"
  162880. #else
  162881. "adc r5, %[r]\n\t"
  162882. #endif
  162883. "uxth r7, %[b]\n\t"
  162884. #ifdef WOLFSSL_KEIL
  162885. "muls r6, r7, r6\n\t"
  162886. #elif defined(__clang__)
  162887. "muls r6, r7\n\t"
  162888. #else
  162889. "mul r6, r7\n\t"
  162890. #endif
  162891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162892. "lsrs r7, r6, #16\n\t"
  162893. #else
  162894. "lsr r7, r6, #16\n\t"
  162895. #endif
  162896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162897. "lsls r6, r6, #16\n\t"
  162898. #else
  162899. "lsl r6, r6, #16\n\t"
  162900. #endif
  162901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162902. "adds r3, r3, r6\n\t"
  162903. #else
  162904. "add r3, r3, r6\n\t"
  162905. #endif
  162906. #ifdef WOLFSSL_KEIL
  162907. "adcs r4, r4, r7\n\t"
  162908. #elif defined(__clang__)
  162909. "adcs r4, r7\n\t"
  162910. #else
  162911. "adc r4, r7\n\t"
  162912. #endif
  162913. #ifdef WOLFSSL_KEIL
  162914. "adcs r5, r5, %[r]\n\t"
  162915. #elif defined(__clang__)
  162916. "adcs r5, %[r]\n\t"
  162917. #else
  162918. "adc r5, %[r]\n\t"
  162919. #endif
  162920. "# A[7] * B[14]\n\t"
  162921. "mov %[a], r9\n\t"
  162922. "mov %[b], r10\n\t"
  162923. "ldr %[a], [%[a], #28]\n\t"
  162924. "ldr %[b], [%[b], #56]\n\t"
  162925. "uxth r6, %[a]\n\t"
  162926. "uxth r7, %[b]\n\t"
  162927. #ifdef WOLFSSL_KEIL
  162928. "muls r7, r6, r7\n\t"
  162929. #elif defined(__clang__)
  162930. "muls r7, r6\n\t"
  162931. #else
  162932. "mul r7, r6\n\t"
  162933. #endif
  162934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162935. "adds r3, r3, r7\n\t"
  162936. #else
  162937. "add r3, r3, r7\n\t"
  162938. #endif
  162939. #ifdef WOLFSSL_KEIL
  162940. "adcs r4, r4, %[r]\n\t"
  162941. #elif defined(__clang__)
  162942. "adcs r4, %[r]\n\t"
  162943. #else
  162944. "adc r4, %[r]\n\t"
  162945. #endif
  162946. #ifdef WOLFSSL_KEIL
  162947. "adcs r5, r5, %[r]\n\t"
  162948. #elif defined(__clang__)
  162949. "adcs r5, %[r]\n\t"
  162950. #else
  162951. "adc r5, %[r]\n\t"
  162952. #endif
  162953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162954. "lsrs r7, %[b], #16\n\t"
  162955. #else
  162956. "lsr r7, %[b], #16\n\t"
  162957. #endif
  162958. #ifdef WOLFSSL_KEIL
  162959. "muls r6, r7, r6\n\t"
  162960. #elif defined(__clang__)
  162961. "muls r6, r7\n\t"
  162962. #else
  162963. "mul r6, r7\n\t"
  162964. #endif
  162965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162966. "lsrs r7, r6, #16\n\t"
  162967. #else
  162968. "lsr r7, r6, #16\n\t"
  162969. #endif
  162970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162971. "lsls r6, r6, #16\n\t"
  162972. #else
  162973. "lsl r6, r6, #16\n\t"
  162974. #endif
  162975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162976. "adds r3, r3, r6\n\t"
  162977. #else
  162978. "add r3, r3, r6\n\t"
  162979. #endif
  162980. #ifdef WOLFSSL_KEIL
  162981. "adcs r4, r4, r7\n\t"
  162982. #elif defined(__clang__)
  162983. "adcs r4, r7\n\t"
  162984. #else
  162985. "adc r4, r7\n\t"
  162986. #endif
  162987. #ifdef WOLFSSL_KEIL
  162988. "adcs r5, r5, %[r]\n\t"
  162989. #elif defined(__clang__)
  162990. "adcs r5, %[r]\n\t"
  162991. #else
  162992. "adc r5, %[r]\n\t"
  162993. #endif
  162994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162995. "lsrs r6, %[a], #16\n\t"
  162996. #else
  162997. "lsr r6, %[a], #16\n\t"
  162998. #endif
  162999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163000. "lsrs r7, %[b], #16\n\t"
  163001. #else
  163002. "lsr r7, %[b], #16\n\t"
  163003. #endif
  163004. #ifdef WOLFSSL_KEIL
  163005. "muls r7, r6, r7\n\t"
  163006. #elif defined(__clang__)
  163007. "muls r7, r6\n\t"
  163008. #else
  163009. "mul r7, r6\n\t"
  163010. #endif
  163011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163012. "adds r4, r4, r7\n\t"
  163013. #else
  163014. "add r4, r4, r7\n\t"
  163015. #endif
  163016. #ifdef WOLFSSL_KEIL
  163017. "adcs r5, r5, %[r]\n\t"
  163018. #elif defined(__clang__)
  163019. "adcs r5, %[r]\n\t"
  163020. #else
  163021. "adc r5, %[r]\n\t"
  163022. #endif
  163023. "uxth r7, %[b]\n\t"
  163024. #ifdef WOLFSSL_KEIL
  163025. "muls r6, r7, r6\n\t"
  163026. #elif defined(__clang__)
  163027. "muls r6, r7\n\t"
  163028. #else
  163029. "mul r6, r7\n\t"
  163030. #endif
  163031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163032. "lsrs r7, r6, #16\n\t"
  163033. #else
  163034. "lsr r7, r6, #16\n\t"
  163035. #endif
  163036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163037. "lsls r6, r6, #16\n\t"
  163038. #else
  163039. "lsl r6, r6, #16\n\t"
  163040. #endif
  163041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163042. "adds r3, r3, r6\n\t"
  163043. #else
  163044. "add r3, r3, r6\n\t"
  163045. #endif
  163046. #ifdef WOLFSSL_KEIL
  163047. "adcs r4, r4, r7\n\t"
  163048. #elif defined(__clang__)
  163049. "adcs r4, r7\n\t"
  163050. #else
  163051. "adc r4, r7\n\t"
  163052. #endif
  163053. #ifdef WOLFSSL_KEIL
  163054. "adcs r5, r5, %[r]\n\t"
  163055. #elif defined(__clang__)
  163056. "adcs r5, %[r]\n\t"
  163057. #else
  163058. "adc r5, %[r]\n\t"
  163059. #endif
  163060. "# A[8] * B[13]\n\t"
  163061. "mov %[a], r9\n\t"
  163062. "mov %[b], r10\n\t"
  163063. "ldr %[a], [%[a], #32]\n\t"
  163064. "ldr %[b], [%[b], #52]\n\t"
  163065. "uxth r6, %[a]\n\t"
  163066. "uxth r7, %[b]\n\t"
  163067. #ifdef WOLFSSL_KEIL
  163068. "muls r7, r6, r7\n\t"
  163069. #elif defined(__clang__)
  163070. "muls r7, r6\n\t"
  163071. #else
  163072. "mul r7, r6\n\t"
  163073. #endif
  163074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163075. "adds r3, r3, r7\n\t"
  163076. #else
  163077. "add r3, r3, r7\n\t"
  163078. #endif
  163079. #ifdef WOLFSSL_KEIL
  163080. "adcs r4, r4, %[r]\n\t"
  163081. #elif defined(__clang__)
  163082. "adcs r4, %[r]\n\t"
  163083. #else
  163084. "adc r4, %[r]\n\t"
  163085. #endif
  163086. #ifdef WOLFSSL_KEIL
  163087. "adcs r5, r5, %[r]\n\t"
  163088. #elif defined(__clang__)
  163089. "adcs r5, %[r]\n\t"
  163090. #else
  163091. "adc r5, %[r]\n\t"
  163092. #endif
  163093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163094. "lsrs r7, %[b], #16\n\t"
  163095. #else
  163096. "lsr r7, %[b], #16\n\t"
  163097. #endif
  163098. #ifdef WOLFSSL_KEIL
  163099. "muls r6, r7, r6\n\t"
  163100. #elif defined(__clang__)
  163101. "muls r6, r7\n\t"
  163102. #else
  163103. "mul r6, r7\n\t"
  163104. #endif
  163105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163106. "lsrs r7, r6, #16\n\t"
  163107. #else
  163108. "lsr r7, r6, #16\n\t"
  163109. #endif
  163110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163111. "lsls r6, r6, #16\n\t"
  163112. #else
  163113. "lsl r6, r6, #16\n\t"
  163114. #endif
  163115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163116. "adds r3, r3, r6\n\t"
  163117. #else
  163118. "add r3, r3, r6\n\t"
  163119. #endif
  163120. #ifdef WOLFSSL_KEIL
  163121. "adcs r4, r4, r7\n\t"
  163122. #elif defined(__clang__)
  163123. "adcs r4, r7\n\t"
  163124. #else
  163125. "adc r4, r7\n\t"
  163126. #endif
  163127. #ifdef WOLFSSL_KEIL
  163128. "adcs r5, r5, %[r]\n\t"
  163129. #elif defined(__clang__)
  163130. "adcs r5, %[r]\n\t"
  163131. #else
  163132. "adc r5, %[r]\n\t"
  163133. #endif
  163134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163135. "lsrs r6, %[a], #16\n\t"
  163136. #else
  163137. "lsr r6, %[a], #16\n\t"
  163138. #endif
  163139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163140. "lsrs r7, %[b], #16\n\t"
  163141. #else
  163142. "lsr r7, %[b], #16\n\t"
  163143. #endif
  163144. #ifdef WOLFSSL_KEIL
  163145. "muls r7, r6, r7\n\t"
  163146. #elif defined(__clang__)
  163147. "muls r7, r6\n\t"
  163148. #else
  163149. "mul r7, r6\n\t"
  163150. #endif
  163151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163152. "adds r4, r4, r7\n\t"
  163153. #else
  163154. "add r4, r4, r7\n\t"
  163155. #endif
  163156. #ifdef WOLFSSL_KEIL
  163157. "adcs r5, r5, %[r]\n\t"
  163158. #elif defined(__clang__)
  163159. "adcs r5, %[r]\n\t"
  163160. #else
  163161. "adc r5, %[r]\n\t"
  163162. #endif
  163163. "uxth r7, %[b]\n\t"
  163164. #ifdef WOLFSSL_KEIL
  163165. "muls r6, r7, r6\n\t"
  163166. #elif defined(__clang__)
  163167. "muls r6, r7\n\t"
  163168. #else
  163169. "mul r6, r7\n\t"
  163170. #endif
  163171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163172. "lsrs r7, r6, #16\n\t"
  163173. #else
  163174. "lsr r7, r6, #16\n\t"
  163175. #endif
  163176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163177. "lsls r6, r6, #16\n\t"
  163178. #else
  163179. "lsl r6, r6, #16\n\t"
  163180. #endif
  163181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163182. "adds r3, r3, r6\n\t"
  163183. #else
  163184. "add r3, r3, r6\n\t"
  163185. #endif
  163186. #ifdef WOLFSSL_KEIL
  163187. "adcs r4, r4, r7\n\t"
  163188. #elif defined(__clang__)
  163189. "adcs r4, r7\n\t"
  163190. #else
  163191. "adc r4, r7\n\t"
  163192. #endif
  163193. #ifdef WOLFSSL_KEIL
  163194. "adcs r5, r5, %[r]\n\t"
  163195. #elif defined(__clang__)
  163196. "adcs r5, %[r]\n\t"
  163197. #else
  163198. "adc r5, %[r]\n\t"
  163199. #endif
  163200. "# A[9] * B[12]\n\t"
  163201. "mov %[a], r9\n\t"
  163202. "mov %[b], r10\n\t"
  163203. "ldr %[a], [%[a], #36]\n\t"
  163204. "ldr %[b], [%[b], #48]\n\t"
  163205. "uxth r6, %[a]\n\t"
  163206. "uxth r7, %[b]\n\t"
  163207. #ifdef WOLFSSL_KEIL
  163208. "muls r7, r6, r7\n\t"
  163209. #elif defined(__clang__)
  163210. "muls r7, r6\n\t"
  163211. #else
  163212. "mul r7, r6\n\t"
  163213. #endif
  163214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163215. "adds r3, r3, r7\n\t"
  163216. #else
  163217. "add r3, r3, r7\n\t"
  163218. #endif
  163219. #ifdef WOLFSSL_KEIL
  163220. "adcs r4, r4, %[r]\n\t"
  163221. #elif defined(__clang__)
  163222. "adcs r4, %[r]\n\t"
  163223. #else
  163224. "adc r4, %[r]\n\t"
  163225. #endif
  163226. #ifdef WOLFSSL_KEIL
  163227. "adcs r5, r5, %[r]\n\t"
  163228. #elif defined(__clang__)
  163229. "adcs r5, %[r]\n\t"
  163230. #else
  163231. "adc r5, %[r]\n\t"
  163232. #endif
  163233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163234. "lsrs r7, %[b], #16\n\t"
  163235. #else
  163236. "lsr r7, %[b], #16\n\t"
  163237. #endif
  163238. #ifdef WOLFSSL_KEIL
  163239. "muls r6, r7, r6\n\t"
  163240. #elif defined(__clang__)
  163241. "muls r6, r7\n\t"
  163242. #else
  163243. "mul r6, r7\n\t"
  163244. #endif
  163245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163246. "lsrs r7, r6, #16\n\t"
  163247. #else
  163248. "lsr r7, r6, #16\n\t"
  163249. #endif
  163250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163251. "lsls r6, r6, #16\n\t"
  163252. #else
  163253. "lsl r6, r6, #16\n\t"
  163254. #endif
  163255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163256. "adds r3, r3, r6\n\t"
  163257. #else
  163258. "add r3, r3, r6\n\t"
  163259. #endif
  163260. #ifdef WOLFSSL_KEIL
  163261. "adcs r4, r4, r7\n\t"
  163262. #elif defined(__clang__)
  163263. "adcs r4, r7\n\t"
  163264. #else
  163265. "adc r4, r7\n\t"
  163266. #endif
  163267. #ifdef WOLFSSL_KEIL
  163268. "adcs r5, r5, %[r]\n\t"
  163269. #elif defined(__clang__)
  163270. "adcs r5, %[r]\n\t"
  163271. #else
  163272. "adc r5, %[r]\n\t"
  163273. #endif
  163274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163275. "lsrs r6, %[a], #16\n\t"
  163276. #else
  163277. "lsr r6, %[a], #16\n\t"
  163278. #endif
  163279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163280. "lsrs r7, %[b], #16\n\t"
  163281. #else
  163282. "lsr r7, %[b], #16\n\t"
  163283. #endif
  163284. #ifdef WOLFSSL_KEIL
  163285. "muls r7, r6, r7\n\t"
  163286. #elif defined(__clang__)
  163287. "muls r7, r6\n\t"
  163288. #else
  163289. "mul r7, r6\n\t"
  163290. #endif
  163291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163292. "adds r4, r4, r7\n\t"
  163293. #else
  163294. "add r4, r4, r7\n\t"
  163295. #endif
  163296. #ifdef WOLFSSL_KEIL
  163297. "adcs r5, r5, %[r]\n\t"
  163298. #elif defined(__clang__)
  163299. "adcs r5, %[r]\n\t"
  163300. #else
  163301. "adc r5, %[r]\n\t"
  163302. #endif
  163303. "uxth r7, %[b]\n\t"
  163304. #ifdef WOLFSSL_KEIL
  163305. "muls r6, r7, r6\n\t"
  163306. #elif defined(__clang__)
  163307. "muls r6, r7\n\t"
  163308. #else
  163309. "mul r6, r7\n\t"
  163310. #endif
  163311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163312. "lsrs r7, r6, #16\n\t"
  163313. #else
  163314. "lsr r7, r6, #16\n\t"
  163315. #endif
  163316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163317. "lsls r6, r6, #16\n\t"
  163318. #else
  163319. "lsl r6, r6, #16\n\t"
  163320. #endif
  163321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163322. "adds r3, r3, r6\n\t"
  163323. #else
  163324. "add r3, r3, r6\n\t"
  163325. #endif
  163326. #ifdef WOLFSSL_KEIL
  163327. "adcs r4, r4, r7\n\t"
  163328. #elif defined(__clang__)
  163329. "adcs r4, r7\n\t"
  163330. #else
  163331. "adc r4, r7\n\t"
  163332. #endif
  163333. #ifdef WOLFSSL_KEIL
  163334. "adcs r5, r5, %[r]\n\t"
  163335. #elif defined(__clang__)
  163336. "adcs r5, %[r]\n\t"
  163337. #else
  163338. "adc r5, %[r]\n\t"
  163339. #endif
  163340. "# A[10] * B[11]\n\t"
  163341. "mov %[a], r9\n\t"
  163342. "mov %[b], r10\n\t"
  163343. "ldr %[a], [%[a], #40]\n\t"
  163344. "ldr %[b], [%[b], #44]\n\t"
  163345. "uxth r6, %[a]\n\t"
  163346. "uxth r7, %[b]\n\t"
  163347. #ifdef WOLFSSL_KEIL
  163348. "muls r7, r6, r7\n\t"
  163349. #elif defined(__clang__)
  163350. "muls r7, r6\n\t"
  163351. #else
  163352. "mul r7, r6\n\t"
  163353. #endif
  163354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163355. "adds r3, r3, r7\n\t"
  163356. #else
  163357. "add r3, r3, r7\n\t"
  163358. #endif
  163359. #ifdef WOLFSSL_KEIL
  163360. "adcs r4, r4, %[r]\n\t"
  163361. #elif defined(__clang__)
  163362. "adcs r4, %[r]\n\t"
  163363. #else
  163364. "adc r4, %[r]\n\t"
  163365. #endif
  163366. #ifdef WOLFSSL_KEIL
  163367. "adcs r5, r5, %[r]\n\t"
  163368. #elif defined(__clang__)
  163369. "adcs r5, %[r]\n\t"
  163370. #else
  163371. "adc r5, %[r]\n\t"
  163372. #endif
  163373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163374. "lsrs r7, %[b], #16\n\t"
  163375. #else
  163376. "lsr r7, %[b], #16\n\t"
  163377. #endif
  163378. #ifdef WOLFSSL_KEIL
  163379. "muls r6, r7, r6\n\t"
  163380. #elif defined(__clang__)
  163381. "muls r6, r7\n\t"
  163382. #else
  163383. "mul r6, r7\n\t"
  163384. #endif
  163385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163386. "lsrs r7, r6, #16\n\t"
  163387. #else
  163388. "lsr r7, r6, #16\n\t"
  163389. #endif
  163390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163391. "lsls r6, r6, #16\n\t"
  163392. #else
  163393. "lsl r6, r6, #16\n\t"
  163394. #endif
  163395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163396. "adds r3, r3, r6\n\t"
  163397. #else
  163398. "add r3, r3, r6\n\t"
  163399. #endif
  163400. #ifdef WOLFSSL_KEIL
  163401. "adcs r4, r4, r7\n\t"
  163402. #elif defined(__clang__)
  163403. "adcs r4, r7\n\t"
  163404. #else
  163405. "adc r4, r7\n\t"
  163406. #endif
  163407. #ifdef WOLFSSL_KEIL
  163408. "adcs r5, r5, %[r]\n\t"
  163409. #elif defined(__clang__)
  163410. "adcs r5, %[r]\n\t"
  163411. #else
  163412. "adc r5, %[r]\n\t"
  163413. #endif
  163414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163415. "lsrs r6, %[a], #16\n\t"
  163416. #else
  163417. "lsr r6, %[a], #16\n\t"
  163418. #endif
  163419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163420. "lsrs r7, %[b], #16\n\t"
  163421. #else
  163422. "lsr r7, %[b], #16\n\t"
  163423. #endif
  163424. #ifdef WOLFSSL_KEIL
  163425. "muls r7, r6, r7\n\t"
  163426. #elif defined(__clang__)
  163427. "muls r7, r6\n\t"
  163428. #else
  163429. "mul r7, r6\n\t"
  163430. #endif
  163431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163432. "adds r4, r4, r7\n\t"
  163433. #else
  163434. "add r4, r4, r7\n\t"
  163435. #endif
  163436. #ifdef WOLFSSL_KEIL
  163437. "adcs r5, r5, %[r]\n\t"
  163438. #elif defined(__clang__)
  163439. "adcs r5, %[r]\n\t"
  163440. #else
  163441. "adc r5, %[r]\n\t"
  163442. #endif
  163443. "uxth r7, %[b]\n\t"
  163444. #ifdef WOLFSSL_KEIL
  163445. "muls r6, r7, r6\n\t"
  163446. #elif defined(__clang__)
  163447. "muls r6, r7\n\t"
  163448. #else
  163449. "mul r6, r7\n\t"
  163450. #endif
  163451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163452. "lsrs r7, r6, #16\n\t"
  163453. #else
  163454. "lsr r7, r6, #16\n\t"
  163455. #endif
  163456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163457. "lsls r6, r6, #16\n\t"
  163458. #else
  163459. "lsl r6, r6, #16\n\t"
  163460. #endif
  163461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163462. "adds r3, r3, r6\n\t"
  163463. #else
  163464. "add r3, r3, r6\n\t"
  163465. #endif
  163466. #ifdef WOLFSSL_KEIL
  163467. "adcs r4, r4, r7\n\t"
  163468. #elif defined(__clang__)
  163469. "adcs r4, r7\n\t"
  163470. #else
  163471. "adc r4, r7\n\t"
  163472. #endif
  163473. #ifdef WOLFSSL_KEIL
  163474. "adcs r5, r5, %[r]\n\t"
  163475. #elif defined(__clang__)
  163476. "adcs r5, %[r]\n\t"
  163477. #else
  163478. "adc r5, %[r]\n\t"
  163479. #endif
  163480. "# A[11] * B[10]\n\t"
  163481. "mov %[a], r9\n\t"
  163482. "mov %[b], r10\n\t"
  163483. "ldr %[a], [%[a], #44]\n\t"
  163484. "ldr %[b], [%[b], #40]\n\t"
  163485. "uxth r6, %[a]\n\t"
  163486. "uxth r7, %[b]\n\t"
  163487. #ifdef WOLFSSL_KEIL
  163488. "muls r7, r6, r7\n\t"
  163489. #elif defined(__clang__)
  163490. "muls r7, r6\n\t"
  163491. #else
  163492. "mul r7, r6\n\t"
  163493. #endif
  163494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163495. "adds r3, r3, r7\n\t"
  163496. #else
  163497. "add r3, r3, r7\n\t"
  163498. #endif
  163499. #ifdef WOLFSSL_KEIL
  163500. "adcs r4, r4, %[r]\n\t"
  163501. #elif defined(__clang__)
  163502. "adcs r4, %[r]\n\t"
  163503. #else
  163504. "adc r4, %[r]\n\t"
  163505. #endif
  163506. #ifdef WOLFSSL_KEIL
  163507. "adcs r5, r5, %[r]\n\t"
  163508. #elif defined(__clang__)
  163509. "adcs r5, %[r]\n\t"
  163510. #else
  163511. "adc r5, %[r]\n\t"
  163512. #endif
  163513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163514. "lsrs r7, %[b], #16\n\t"
  163515. #else
  163516. "lsr r7, %[b], #16\n\t"
  163517. #endif
  163518. #ifdef WOLFSSL_KEIL
  163519. "muls r6, r7, r6\n\t"
  163520. #elif defined(__clang__)
  163521. "muls r6, r7\n\t"
  163522. #else
  163523. "mul r6, r7\n\t"
  163524. #endif
  163525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163526. "lsrs r7, r6, #16\n\t"
  163527. #else
  163528. "lsr r7, r6, #16\n\t"
  163529. #endif
  163530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163531. "lsls r6, r6, #16\n\t"
  163532. #else
  163533. "lsl r6, r6, #16\n\t"
  163534. #endif
  163535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163536. "adds r3, r3, r6\n\t"
  163537. #else
  163538. "add r3, r3, r6\n\t"
  163539. #endif
  163540. #ifdef WOLFSSL_KEIL
  163541. "adcs r4, r4, r7\n\t"
  163542. #elif defined(__clang__)
  163543. "adcs r4, r7\n\t"
  163544. #else
  163545. "adc r4, r7\n\t"
  163546. #endif
  163547. #ifdef WOLFSSL_KEIL
  163548. "adcs r5, r5, %[r]\n\t"
  163549. #elif defined(__clang__)
  163550. "adcs r5, %[r]\n\t"
  163551. #else
  163552. "adc r5, %[r]\n\t"
  163553. #endif
  163554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163555. "lsrs r6, %[a], #16\n\t"
  163556. #else
  163557. "lsr r6, %[a], #16\n\t"
  163558. #endif
  163559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163560. "lsrs r7, %[b], #16\n\t"
  163561. #else
  163562. "lsr r7, %[b], #16\n\t"
  163563. #endif
  163564. #ifdef WOLFSSL_KEIL
  163565. "muls r7, r6, r7\n\t"
  163566. #elif defined(__clang__)
  163567. "muls r7, r6\n\t"
  163568. #else
  163569. "mul r7, r6\n\t"
  163570. #endif
  163571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163572. "adds r4, r4, r7\n\t"
  163573. #else
  163574. "add r4, r4, r7\n\t"
  163575. #endif
  163576. #ifdef WOLFSSL_KEIL
  163577. "adcs r5, r5, %[r]\n\t"
  163578. #elif defined(__clang__)
  163579. "adcs r5, %[r]\n\t"
  163580. #else
  163581. "adc r5, %[r]\n\t"
  163582. #endif
  163583. "uxth r7, %[b]\n\t"
  163584. #ifdef WOLFSSL_KEIL
  163585. "muls r6, r7, r6\n\t"
  163586. #elif defined(__clang__)
  163587. "muls r6, r7\n\t"
  163588. #else
  163589. "mul r6, r7\n\t"
  163590. #endif
  163591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163592. "lsrs r7, r6, #16\n\t"
  163593. #else
  163594. "lsr r7, r6, #16\n\t"
  163595. #endif
  163596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163597. "lsls r6, r6, #16\n\t"
  163598. #else
  163599. "lsl r6, r6, #16\n\t"
  163600. #endif
  163601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163602. "adds r3, r3, r6\n\t"
  163603. #else
  163604. "add r3, r3, r6\n\t"
  163605. #endif
  163606. #ifdef WOLFSSL_KEIL
  163607. "adcs r4, r4, r7\n\t"
  163608. #elif defined(__clang__)
  163609. "adcs r4, r7\n\t"
  163610. #else
  163611. "adc r4, r7\n\t"
  163612. #endif
  163613. #ifdef WOLFSSL_KEIL
  163614. "adcs r5, r5, %[r]\n\t"
  163615. #elif defined(__clang__)
  163616. "adcs r5, %[r]\n\t"
  163617. #else
  163618. "adc r5, %[r]\n\t"
  163619. #endif
  163620. "# A[12] * B[9]\n\t"
  163621. "mov %[a], r9\n\t"
  163622. "mov %[b], r10\n\t"
  163623. "ldr %[a], [%[a], #48]\n\t"
  163624. "ldr %[b], [%[b], #36]\n\t"
  163625. "uxth r6, %[a]\n\t"
  163626. "uxth r7, %[b]\n\t"
  163627. #ifdef WOLFSSL_KEIL
  163628. "muls r7, r6, r7\n\t"
  163629. #elif defined(__clang__)
  163630. "muls r7, r6\n\t"
  163631. #else
  163632. "mul r7, r6\n\t"
  163633. #endif
  163634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163635. "adds r3, r3, r7\n\t"
  163636. #else
  163637. "add r3, r3, r7\n\t"
  163638. #endif
  163639. #ifdef WOLFSSL_KEIL
  163640. "adcs r4, r4, %[r]\n\t"
  163641. #elif defined(__clang__)
  163642. "adcs r4, %[r]\n\t"
  163643. #else
  163644. "adc r4, %[r]\n\t"
  163645. #endif
  163646. #ifdef WOLFSSL_KEIL
  163647. "adcs r5, r5, %[r]\n\t"
  163648. #elif defined(__clang__)
  163649. "adcs r5, %[r]\n\t"
  163650. #else
  163651. "adc r5, %[r]\n\t"
  163652. #endif
  163653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163654. "lsrs r7, %[b], #16\n\t"
  163655. #else
  163656. "lsr r7, %[b], #16\n\t"
  163657. #endif
  163658. #ifdef WOLFSSL_KEIL
  163659. "muls r6, r7, r6\n\t"
  163660. #elif defined(__clang__)
  163661. "muls r6, r7\n\t"
  163662. #else
  163663. "mul r6, r7\n\t"
  163664. #endif
  163665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163666. "lsrs r7, r6, #16\n\t"
  163667. #else
  163668. "lsr r7, r6, #16\n\t"
  163669. #endif
  163670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163671. "lsls r6, r6, #16\n\t"
  163672. #else
  163673. "lsl r6, r6, #16\n\t"
  163674. #endif
  163675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163676. "adds r3, r3, r6\n\t"
  163677. #else
  163678. "add r3, r3, r6\n\t"
  163679. #endif
  163680. #ifdef WOLFSSL_KEIL
  163681. "adcs r4, r4, r7\n\t"
  163682. #elif defined(__clang__)
  163683. "adcs r4, r7\n\t"
  163684. #else
  163685. "adc r4, r7\n\t"
  163686. #endif
  163687. #ifdef WOLFSSL_KEIL
  163688. "adcs r5, r5, %[r]\n\t"
  163689. #elif defined(__clang__)
  163690. "adcs r5, %[r]\n\t"
  163691. #else
  163692. "adc r5, %[r]\n\t"
  163693. #endif
  163694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163695. "lsrs r6, %[a], #16\n\t"
  163696. #else
  163697. "lsr r6, %[a], #16\n\t"
  163698. #endif
  163699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163700. "lsrs r7, %[b], #16\n\t"
  163701. #else
  163702. "lsr r7, %[b], #16\n\t"
  163703. #endif
  163704. #ifdef WOLFSSL_KEIL
  163705. "muls r7, r6, r7\n\t"
  163706. #elif defined(__clang__)
  163707. "muls r7, r6\n\t"
  163708. #else
  163709. "mul r7, r6\n\t"
  163710. #endif
  163711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163712. "adds r4, r4, r7\n\t"
  163713. #else
  163714. "add r4, r4, r7\n\t"
  163715. #endif
  163716. #ifdef WOLFSSL_KEIL
  163717. "adcs r5, r5, %[r]\n\t"
  163718. #elif defined(__clang__)
  163719. "adcs r5, %[r]\n\t"
  163720. #else
  163721. "adc r5, %[r]\n\t"
  163722. #endif
  163723. "uxth r7, %[b]\n\t"
  163724. #ifdef WOLFSSL_KEIL
  163725. "muls r6, r7, r6\n\t"
  163726. #elif defined(__clang__)
  163727. "muls r6, r7\n\t"
  163728. #else
  163729. "mul r6, r7\n\t"
  163730. #endif
  163731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163732. "lsrs r7, r6, #16\n\t"
  163733. #else
  163734. "lsr r7, r6, #16\n\t"
  163735. #endif
  163736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163737. "lsls r6, r6, #16\n\t"
  163738. #else
  163739. "lsl r6, r6, #16\n\t"
  163740. #endif
  163741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163742. "adds r3, r3, r6\n\t"
  163743. #else
  163744. "add r3, r3, r6\n\t"
  163745. #endif
  163746. #ifdef WOLFSSL_KEIL
  163747. "adcs r4, r4, r7\n\t"
  163748. #elif defined(__clang__)
  163749. "adcs r4, r7\n\t"
  163750. #else
  163751. "adc r4, r7\n\t"
  163752. #endif
  163753. #ifdef WOLFSSL_KEIL
  163754. "adcs r5, r5, %[r]\n\t"
  163755. #elif defined(__clang__)
  163756. "adcs r5, %[r]\n\t"
  163757. #else
  163758. "adc r5, %[r]\n\t"
  163759. #endif
  163760. "# A[13] * B[8]\n\t"
  163761. "mov %[a], r9\n\t"
  163762. "mov %[b], r10\n\t"
  163763. "ldr %[a], [%[a], #52]\n\t"
  163764. "ldr %[b], [%[b], #32]\n\t"
  163765. "uxth r6, %[a]\n\t"
  163766. "uxth r7, %[b]\n\t"
  163767. #ifdef WOLFSSL_KEIL
  163768. "muls r7, r6, r7\n\t"
  163769. #elif defined(__clang__)
  163770. "muls r7, r6\n\t"
  163771. #else
  163772. "mul r7, r6\n\t"
  163773. #endif
  163774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163775. "adds r3, r3, r7\n\t"
  163776. #else
  163777. "add r3, r3, r7\n\t"
  163778. #endif
  163779. #ifdef WOLFSSL_KEIL
  163780. "adcs r4, r4, %[r]\n\t"
  163781. #elif defined(__clang__)
  163782. "adcs r4, %[r]\n\t"
  163783. #else
  163784. "adc r4, %[r]\n\t"
  163785. #endif
  163786. #ifdef WOLFSSL_KEIL
  163787. "adcs r5, r5, %[r]\n\t"
  163788. #elif defined(__clang__)
  163789. "adcs r5, %[r]\n\t"
  163790. #else
  163791. "adc r5, %[r]\n\t"
  163792. #endif
  163793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163794. "lsrs r7, %[b], #16\n\t"
  163795. #else
  163796. "lsr r7, %[b], #16\n\t"
  163797. #endif
  163798. #ifdef WOLFSSL_KEIL
  163799. "muls r6, r7, r6\n\t"
  163800. #elif defined(__clang__)
  163801. "muls r6, r7\n\t"
  163802. #else
  163803. "mul r6, r7\n\t"
  163804. #endif
  163805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163806. "lsrs r7, r6, #16\n\t"
  163807. #else
  163808. "lsr r7, r6, #16\n\t"
  163809. #endif
  163810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163811. "lsls r6, r6, #16\n\t"
  163812. #else
  163813. "lsl r6, r6, #16\n\t"
  163814. #endif
  163815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163816. "adds r3, r3, r6\n\t"
  163817. #else
  163818. "add r3, r3, r6\n\t"
  163819. #endif
  163820. #ifdef WOLFSSL_KEIL
  163821. "adcs r4, r4, r7\n\t"
  163822. #elif defined(__clang__)
  163823. "adcs r4, r7\n\t"
  163824. #else
  163825. "adc r4, r7\n\t"
  163826. #endif
  163827. #ifdef WOLFSSL_KEIL
  163828. "adcs r5, r5, %[r]\n\t"
  163829. #elif defined(__clang__)
  163830. "adcs r5, %[r]\n\t"
  163831. #else
  163832. "adc r5, %[r]\n\t"
  163833. #endif
  163834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163835. "lsrs r6, %[a], #16\n\t"
  163836. #else
  163837. "lsr r6, %[a], #16\n\t"
  163838. #endif
  163839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163840. "lsrs r7, %[b], #16\n\t"
  163841. #else
  163842. "lsr r7, %[b], #16\n\t"
  163843. #endif
  163844. #ifdef WOLFSSL_KEIL
  163845. "muls r7, r6, r7\n\t"
  163846. #elif defined(__clang__)
  163847. "muls r7, r6\n\t"
  163848. #else
  163849. "mul r7, r6\n\t"
  163850. #endif
  163851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163852. "adds r4, r4, r7\n\t"
  163853. #else
  163854. "add r4, r4, r7\n\t"
  163855. #endif
  163856. #ifdef WOLFSSL_KEIL
  163857. "adcs r5, r5, %[r]\n\t"
  163858. #elif defined(__clang__)
  163859. "adcs r5, %[r]\n\t"
  163860. #else
  163861. "adc r5, %[r]\n\t"
  163862. #endif
  163863. "uxth r7, %[b]\n\t"
  163864. #ifdef WOLFSSL_KEIL
  163865. "muls r6, r7, r6\n\t"
  163866. #elif defined(__clang__)
  163867. "muls r6, r7\n\t"
  163868. #else
  163869. "mul r6, r7\n\t"
  163870. #endif
  163871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163872. "lsrs r7, r6, #16\n\t"
  163873. #else
  163874. "lsr r7, r6, #16\n\t"
  163875. #endif
  163876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163877. "lsls r6, r6, #16\n\t"
  163878. #else
  163879. "lsl r6, r6, #16\n\t"
  163880. #endif
  163881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163882. "adds r3, r3, r6\n\t"
  163883. #else
  163884. "add r3, r3, r6\n\t"
  163885. #endif
  163886. #ifdef WOLFSSL_KEIL
  163887. "adcs r4, r4, r7\n\t"
  163888. #elif defined(__clang__)
  163889. "adcs r4, r7\n\t"
  163890. #else
  163891. "adc r4, r7\n\t"
  163892. #endif
  163893. #ifdef WOLFSSL_KEIL
  163894. "adcs r5, r5, %[r]\n\t"
  163895. #elif defined(__clang__)
  163896. "adcs r5, %[r]\n\t"
  163897. #else
  163898. "adc r5, %[r]\n\t"
  163899. #endif
  163900. "# A[14] * B[7]\n\t"
  163901. "mov %[a], r9\n\t"
  163902. "mov %[b], r10\n\t"
  163903. "ldr %[a], [%[a], #56]\n\t"
  163904. "ldr %[b], [%[b], #28]\n\t"
  163905. "uxth r6, %[a]\n\t"
  163906. "uxth r7, %[b]\n\t"
  163907. #ifdef WOLFSSL_KEIL
  163908. "muls r7, r6, r7\n\t"
  163909. #elif defined(__clang__)
  163910. "muls r7, r6\n\t"
  163911. #else
  163912. "mul r7, r6\n\t"
  163913. #endif
  163914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163915. "adds r3, r3, r7\n\t"
  163916. #else
  163917. "add r3, r3, r7\n\t"
  163918. #endif
  163919. #ifdef WOLFSSL_KEIL
  163920. "adcs r4, r4, %[r]\n\t"
  163921. #elif defined(__clang__)
  163922. "adcs r4, %[r]\n\t"
  163923. #else
  163924. "adc r4, %[r]\n\t"
  163925. #endif
  163926. #ifdef WOLFSSL_KEIL
  163927. "adcs r5, r5, %[r]\n\t"
  163928. #elif defined(__clang__)
  163929. "adcs r5, %[r]\n\t"
  163930. #else
  163931. "adc r5, %[r]\n\t"
  163932. #endif
  163933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163934. "lsrs r7, %[b], #16\n\t"
  163935. #else
  163936. "lsr r7, %[b], #16\n\t"
  163937. #endif
  163938. #ifdef WOLFSSL_KEIL
  163939. "muls r6, r7, r6\n\t"
  163940. #elif defined(__clang__)
  163941. "muls r6, r7\n\t"
  163942. #else
  163943. "mul r6, r7\n\t"
  163944. #endif
  163945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163946. "lsrs r7, r6, #16\n\t"
  163947. #else
  163948. "lsr r7, r6, #16\n\t"
  163949. #endif
  163950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163951. "lsls r6, r6, #16\n\t"
  163952. #else
  163953. "lsl r6, r6, #16\n\t"
  163954. #endif
  163955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163956. "adds r3, r3, r6\n\t"
  163957. #else
  163958. "add r3, r3, r6\n\t"
  163959. #endif
  163960. #ifdef WOLFSSL_KEIL
  163961. "adcs r4, r4, r7\n\t"
  163962. #elif defined(__clang__)
  163963. "adcs r4, r7\n\t"
  163964. #else
  163965. "adc r4, r7\n\t"
  163966. #endif
  163967. #ifdef WOLFSSL_KEIL
  163968. "adcs r5, r5, %[r]\n\t"
  163969. #elif defined(__clang__)
  163970. "adcs r5, %[r]\n\t"
  163971. #else
  163972. "adc r5, %[r]\n\t"
  163973. #endif
  163974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163975. "lsrs r6, %[a], #16\n\t"
  163976. #else
  163977. "lsr r6, %[a], #16\n\t"
  163978. #endif
  163979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163980. "lsrs r7, %[b], #16\n\t"
  163981. #else
  163982. "lsr r7, %[b], #16\n\t"
  163983. #endif
  163984. #ifdef WOLFSSL_KEIL
  163985. "muls r7, r6, r7\n\t"
  163986. #elif defined(__clang__)
  163987. "muls r7, r6\n\t"
  163988. #else
  163989. "mul r7, r6\n\t"
  163990. #endif
  163991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163992. "adds r4, r4, r7\n\t"
  163993. #else
  163994. "add r4, r4, r7\n\t"
  163995. #endif
  163996. #ifdef WOLFSSL_KEIL
  163997. "adcs r5, r5, %[r]\n\t"
  163998. #elif defined(__clang__)
  163999. "adcs r5, %[r]\n\t"
  164000. #else
  164001. "adc r5, %[r]\n\t"
  164002. #endif
  164003. "uxth r7, %[b]\n\t"
  164004. #ifdef WOLFSSL_KEIL
  164005. "muls r6, r7, r6\n\t"
  164006. #elif defined(__clang__)
  164007. "muls r6, r7\n\t"
  164008. #else
  164009. "mul r6, r7\n\t"
  164010. #endif
  164011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164012. "lsrs r7, r6, #16\n\t"
  164013. #else
  164014. "lsr r7, r6, #16\n\t"
  164015. #endif
  164016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164017. "lsls r6, r6, #16\n\t"
  164018. #else
  164019. "lsl r6, r6, #16\n\t"
  164020. #endif
  164021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164022. "adds r3, r3, r6\n\t"
  164023. #else
  164024. "add r3, r3, r6\n\t"
  164025. #endif
  164026. #ifdef WOLFSSL_KEIL
  164027. "adcs r4, r4, r7\n\t"
  164028. #elif defined(__clang__)
  164029. "adcs r4, r7\n\t"
  164030. #else
  164031. "adc r4, r7\n\t"
  164032. #endif
  164033. #ifdef WOLFSSL_KEIL
  164034. "adcs r5, r5, %[r]\n\t"
  164035. #elif defined(__clang__)
  164036. "adcs r5, %[r]\n\t"
  164037. #else
  164038. "adc r5, %[r]\n\t"
  164039. #endif
  164040. "# A[15] * B[6]\n\t"
  164041. "mov %[a], r9\n\t"
  164042. "mov %[b], r10\n\t"
  164043. "ldr %[a], [%[a], #60]\n\t"
  164044. "ldr %[b], [%[b], #24]\n\t"
  164045. "uxth r6, %[a]\n\t"
  164046. "uxth r7, %[b]\n\t"
  164047. #ifdef WOLFSSL_KEIL
  164048. "muls r7, r6, r7\n\t"
  164049. #elif defined(__clang__)
  164050. "muls r7, r6\n\t"
  164051. #else
  164052. "mul r7, r6\n\t"
  164053. #endif
  164054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164055. "adds r3, r3, r7\n\t"
  164056. #else
  164057. "add r3, r3, r7\n\t"
  164058. #endif
  164059. #ifdef WOLFSSL_KEIL
  164060. "adcs r4, r4, %[r]\n\t"
  164061. #elif defined(__clang__)
  164062. "adcs r4, %[r]\n\t"
  164063. #else
  164064. "adc r4, %[r]\n\t"
  164065. #endif
  164066. #ifdef WOLFSSL_KEIL
  164067. "adcs r5, r5, %[r]\n\t"
  164068. #elif defined(__clang__)
  164069. "adcs r5, %[r]\n\t"
  164070. #else
  164071. "adc r5, %[r]\n\t"
  164072. #endif
  164073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164074. "lsrs r7, %[b], #16\n\t"
  164075. #else
  164076. "lsr r7, %[b], #16\n\t"
  164077. #endif
  164078. #ifdef WOLFSSL_KEIL
  164079. "muls r6, r7, r6\n\t"
  164080. #elif defined(__clang__)
  164081. "muls r6, r7\n\t"
  164082. #else
  164083. "mul r6, r7\n\t"
  164084. #endif
  164085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164086. "lsrs r7, r6, #16\n\t"
  164087. #else
  164088. "lsr r7, r6, #16\n\t"
  164089. #endif
  164090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164091. "lsls r6, r6, #16\n\t"
  164092. #else
  164093. "lsl r6, r6, #16\n\t"
  164094. #endif
  164095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164096. "adds r3, r3, r6\n\t"
  164097. #else
  164098. "add r3, r3, r6\n\t"
  164099. #endif
  164100. #ifdef WOLFSSL_KEIL
  164101. "adcs r4, r4, r7\n\t"
  164102. #elif defined(__clang__)
  164103. "adcs r4, r7\n\t"
  164104. #else
  164105. "adc r4, r7\n\t"
  164106. #endif
  164107. #ifdef WOLFSSL_KEIL
  164108. "adcs r5, r5, %[r]\n\t"
  164109. #elif defined(__clang__)
  164110. "adcs r5, %[r]\n\t"
  164111. #else
  164112. "adc r5, %[r]\n\t"
  164113. #endif
  164114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164115. "lsrs r6, %[a], #16\n\t"
  164116. #else
  164117. "lsr r6, %[a], #16\n\t"
  164118. #endif
  164119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164120. "lsrs r7, %[b], #16\n\t"
  164121. #else
  164122. "lsr r7, %[b], #16\n\t"
  164123. #endif
  164124. #ifdef WOLFSSL_KEIL
  164125. "muls r7, r6, r7\n\t"
  164126. #elif defined(__clang__)
  164127. "muls r7, r6\n\t"
  164128. #else
  164129. "mul r7, r6\n\t"
  164130. #endif
  164131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164132. "adds r4, r4, r7\n\t"
  164133. #else
  164134. "add r4, r4, r7\n\t"
  164135. #endif
  164136. #ifdef WOLFSSL_KEIL
  164137. "adcs r5, r5, %[r]\n\t"
  164138. #elif defined(__clang__)
  164139. "adcs r5, %[r]\n\t"
  164140. #else
  164141. "adc r5, %[r]\n\t"
  164142. #endif
  164143. "uxth r7, %[b]\n\t"
  164144. #ifdef WOLFSSL_KEIL
  164145. "muls r6, r7, r6\n\t"
  164146. #elif defined(__clang__)
  164147. "muls r6, r7\n\t"
  164148. #else
  164149. "mul r6, r7\n\t"
  164150. #endif
  164151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164152. "lsrs r7, r6, #16\n\t"
  164153. #else
  164154. "lsr r7, r6, #16\n\t"
  164155. #endif
  164156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164157. "lsls r6, r6, #16\n\t"
  164158. #else
  164159. "lsl r6, r6, #16\n\t"
  164160. #endif
  164161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164162. "adds r3, r3, r6\n\t"
  164163. #else
  164164. "add r3, r3, r6\n\t"
  164165. #endif
  164166. #ifdef WOLFSSL_KEIL
  164167. "adcs r4, r4, r7\n\t"
  164168. #elif defined(__clang__)
  164169. "adcs r4, r7\n\t"
  164170. #else
  164171. "adc r4, r7\n\t"
  164172. #endif
  164173. #ifdef WOLFSSL_KEIL
  164174. "adcs r5, r5, %[r]\n\t"
  164175. #elif defined(__clang__)
  164176. "adcs r5, %[r]\n\t"
  164177. #else
  164178. "adc r5, %[r]\n\t"
  164179. #endif
  164180. "mov %[r], r8\n\t"
  164181. "str r3, [%[r], #84]\n\t"
  164182. "movs %[r], #0\n\t"
  164183. "# A[15] * B[7]\n\t"
  164184. "movs r3, #0\n\t"
  164185. "mov %[a], r9\n\t"
  164186. "mov %[b], r10\n\t"
  164187. "ldr %[a], [%[a], #60]\n\t"
  164188. "ldr %[b], [%[b], #28]\n\t"
  164189. "uxth r6, %[a]\n\t"
  164190. "uxth r7, %[b]\n\t"
  164191. #ifdef WOLFSSL_KEIL
  164192. "muls r7, r6, r7\n\t"
  164193. #elif defined(__clang__)
  164194. "muls r7, r6\n\t"
  164195. #else
  164196. "mul r7, r6\n\t"
  164197. #endif
  164198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164199. "adds r4, r4, r7\n\t"
  164200. #else
  164201. "add r4, r4, r7\n\t"
  164202. #endif
  164203. #ifdef WOLFSSL_KEIL
  164204. "adcs r5, r5, %[r]\n\t"
  164205. #elif defined(__clang__)
  164206. "adcs r5, %[r]\n\t"
  164207. #else
  164208. "adc r5, %[r]\n\t"
  164209. #endif
  164210. #ifdef WOLFSSL_KEIL
  164211. "adcs r3, r3, %[r]\n\t"
  164212. #elif defined(__clang__)
  164213. "adcs r3, %[r]\n\t"
  164214. #else
  164215. "adc r3, %[r]\n\t"
  164216. #endif
  164217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164218. "lsrs r7, %[b], #16\n\t"
  164219. #else
  164220. "lsr r7, %[b], #16\n\t"
  164221. #endif
  164222. #ifdef WOLFSSL_KEIL
  164223. "muls r6, r7, r6\n\t"
  164224. #elif defined(__clang__)
  164225. "muls r6, r7\n\t"
  164226. #else
  164227. "mul r6, r7\n\t"
  164228. #endif
  164229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164230. "lsrs r7, r6, #16\n\t"
  164231. #else
  164232. "lsr r7, r6, #16\n\t"
  164233. #endif
  164234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164235. "lsls r6, r6, #16\n\t"
  164236. #else
  164237. "lsl r6, r6, #16\n\t"
  164238. #endif
  164239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164240. "adds r4, r4, r6\n\t"
  164241. #else
  164242. "add r4, r4, r6\n\t"
  164243. #endif
  164244. #ifdef WOLFSSL_KEIL
  164245. "adcs r5, r5, r7\n\t"
  164246. #elif defined(__clang__)
  164247. "adcs r5, r7\n\t"
  164248. #else
  164249. "adc r5, r7\n\t"
  164250. #endif
  164251. #ifdef WOLFSSL_KEIL
  164252. "adcs r3, r3, %[r]\n\t"
  164253. #elif defined(__clang__)
  164254. "adcs r3, %[r]\n\t"
  164255. #else
  164256. "adc r3, %[r]\n\t"
  164257. #endif
  164258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164259. "lsrs r6, %[a], #16\n\t"
  164260. #else
  164261. "lsr r6, %[a], #16\n\t"
  164262. #endif
  164263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164264. "lsrs r7, %[b], #16\n\t"
  164265. #else
  164266. "lsr r7, %[b], #16\n\t"
  164267. #endif
  164268. #ifdef WOLFSSL_KEIL
  164269. "muls r7, r6, r7\n\t"
  164270. #elif defined(__clang__)
  164271. "muls r7, r6\n\t"
  164272. #else
  164273. "mul r7, r6\n\t"
  164274. #endif
  164275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164276. "adds r5, r5, r7\n\t"
  164277. #else
  164278. "add r5, r5, r7\n\t"
  164279. #endif
  164280. #ifdef WOLFSSL_KEIL
  164281. "adcs r3, r3, %[r]\n\t"
  164282. #elif defined(__clang__)
  164283. "adcs r3, %[r]\n\t"
  164284. #else
  164285. "adc r3, %[r]\n\t"
  164286. #endif
  164287. "uxth r7, %[b]\n\t"
  164288. #ifdef WOLFSSL_KEIL
  164289. "muls r6, r7, r6\n\t"
  164290. #elif defined(__clang__)
  164291. "muls r6, r7\n\t"
  164292. #else
  164293. "mul r6, r7\n\t"
  164294. #endif
  164295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164296. "lsrs r7, r6, #16\n\t"
  164297. #else
  164298. "lsr r7, r6, #16\n\t"
  164299. #endif
  164300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164301. "lsls r6, r6, #16\n\t"
  164302. #else
  164303. "lsl r6, r6, #16\n\t"
  164304. #endif
  164305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164306. "adds r4, r4, r6\n\t"
  164307. #else
  164308. "add r4, r4, r6\n\t"
  164309. #endif
  164310. #ifdef WOLFSSL_KEIL
  164311. "adcs r5, r5, r7\n\t"
  164312. #elif defined(__clang__)
  164313. "adcs r5, r7\n\t"
  164314. #else
  164315. "adc r5, r7\n\t"
  164316. #endif
  164317. #ifdef WOLFSSL_KEIL
  164318. "adcs r3, r3, %[r]\n\t"
  164319. #elif defined(__clang__)
  164320. "adcs r3, %[r]\n\t"
  164321. #else
  164322. "adc r3, %[r]\n\t"
  164323. #endif
  164324. "# A[14] * B[8]\n\t"
  164325. "mov %[a], r9\n\t"
  164326. "mov %[b], r10\n\t"
  164327. "ldr %[a], [%[a], #56]\n\t"
  164328. "ldr %[b], [%[b], #32]\n\t"
  164329. "uxth r6, %[a]\n\t"
  164330. "uxth r7, %[b]\n\t"
  164331. #ifdef WOLFSSL_KEIL
  164332. "muls r7, r6, r7\n\t"
  164333. #elif defined(__clang__)
  164334. "muls r7, r6\n\t"
  164335. #else
  164336. "mul r7, r6\n\t"
  164337. #endif
  164338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164339. "adds r4, r4, r7\n\t"
  164340. #else
  164341. "add r4, r4, r7\n\t"
  164342. #endif
  164343. #ifdef WOLFSSL_KEIL
  164344. "adcs r5, r5, %[r]\n\t"
  164345. #elif defined(__clang__)
  164346. "adcs r5, %[r]\n\t"
  164347. #else
  164348. "adc r5, %[r]\n\t"
  164349. #endif
  164350. #ifdef WOLFSSL_KEIL
  164351. "adcs r3, r3, %[r]\n\t"
  164352. #elif defined(__clang__)
  164353. "adcs r3, %[r]\n\t"
  164354. #else
  164355. "adc r3, %[r]\n\t"
  164356. #endif
  164357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164358. "lsrs r7, %[b], #16\n\t"
  164359. #else
  164360. "lsr r7, %[b], #16\n\t"
  164361. #endif
  164362. #ifdef WOLFSSL_KEIL
  164363. "muls r6, r7, r6\n\t"
  164364. #elif defined(__clang__)
  164365. "muls r6, r7\n\t"
  164366. #else
  164367. "mul r6, r7\n\t"
  164368. #endif
  164369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164370. "lsrs r7, r6, #16\n\t"
  164371. #else
  164372. "lsr r7, r6, #16\n\t"
  164373. #endif
  164374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164375. "lsls r6, r6, #16\n\t"
  164376. #else
  164377. "lsl r6, r6, #16\n\t"
  164378. #endif
  164379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164380. "adds r4, r4, r6\n\t"
  164381. #else
  164382. "add r4, r4, r6\n\t"
  164383. #endif
  164384. #ifdef WOLFSSL_KEIL
  164385. "adcs r5, r5, r7\n\t"
  164386. #elif defined(__clang__)
  164387. "adcs r5, r7\n\t"
  164388. #else
  164389. "adc r5, r7\n\t"
  164390. #endif
  164391. #ifdef WOLFSSL_KEIL
  164392. "adcs r3, r3, %[r]\n\t"
  164393. #elif defined(__clang__)
  164394. "adcs r3, %[r]\n\t"
  164395. #else
  164396. "adc r3, %[r]\n\t"
  164397. #endif
  164398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164399. "lsrs r6, %[a], #16\n\t"
  164400. #else
  164401. "lsr r6, %[a], #16\n\t"
  164402. #endif
  164403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164404. "lsrs r7, %[b], #16\n\t"
  164405. #else
  164406. "lsr r7, %[b], #16\n\t"
  164407. #endif
  164408. #ifdef WOLFSSL_KEIL
  164409. "muls r7, r6, r7\n\t"
  164410. #elif defined(__clang__)
  164411. "muls r7, r6\n\t"
  164412. #else
  164413. "mul r7, r6\n\t"
  164414. #endif
  164415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164416. "adds r5, r5, r7\n\t"
  164417. #else
  164418. "add r5, r5, r7\n\t"
  164419. #endif
  164420. #ifdef WOLFSSL_KEIL
  164421. "adcs r3, r3, %[r]\n\t"
  164422. #elif defined(__clang__)
  164423. "adcs r3, %[r]\n\t"
  164424. #else
  164425. "adc r3, %[r]\n\t"
  164426. #endif
  164427. "uxth r7, %[b]\n\t"
  164428. #ifdef WOLFSSL_KEIL
  164429. "muls r6, r7, r6\n\t"
  164430. #elif defined(__clang__)
  164431. "muls r6, r7\n\t"
  164432. #else
  164433. "mul r6, r7\n\t"
  164434. #endif
  164435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164436. "lsrs r7, r6, #16\n\t"
  164437. #else
  164438. "lsr r7, r6, #16\n\t"
  164439. #endif
  164440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164441. "lsls r6, r6, #16\n\t"
  164442. #else
  164443. "lsl r6, r6, #16\n\t"
  164444. #endif
  164445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164446. "adds r4, r4, r6\n\t"
  164447. #else
  164448. "add r4, r4, r6\n\t"
  164449. #endif
  164450. #ifdef WOLFSSL_KEIL
  164451. "adcs r5, r5, r7\n\t"
  164452. #elif defined(__clang__)
  164453. "adcs r5, r7\n\t"
  164454. #else
  164455. "adc r5, r7\n\t"
  164456. #endif
  164457. #ifdef WOLFSSL_KEIL
  164458. "adcs r3, r3, %[r]\n\t"
  164459. #elif defined(__clang__)
  164460. "adcs r3, %[r]\n\t"
  164461. #else
  164462. "adc r3, %[r]\n\t"
  164463. #endif
  164464. "# A[13] * B[9]\n\t"
  164465. "mov %[a], r9\n\t"
  164466. "mov %[b], r10\n\t"
  164467. "ldr %[a], [%[a], #52]\n\t"
  164468. "ldr %[b], [%[b], #36]\n\t"
  164469. "uxth r6, %[a]\n\t"
  164470. "uxth r7, %[b]\n\t"
  164471. #ifdef WOLFSSL_KEIL
  164472. "muls r7, r6, r7\n\t"
  164473. #elif defined(__clang__)
  164474. "muls r7, r6\n\t"
  164475. #else
  164476. "mul r7, r6\n\t"
  164477. #endif
  164478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164479. "adds r4, r4, r7\n\t"
  164480. #else
  164481. "add r4, r4, r7\n\t"
  164482. #endif
  164483. #ifdef WOLFSSL_KEIL
  164484. "adcs r5, r5, %[r]\n\t"
  164485. #elif defined(__clang__)
  164486. "adcs r5, %[r]\n\t"
  164487. #else
  164488. "adc r5, %[r]\n\t"
  164489. #endif
  164490. #ifdef WOLFSSL_KEIL
  164491. "adcs r3, r3, %[r]\n\t"
  164492. #elif defined(__clang__)
  164493. "adcs r3, %[r]\n\t"
  164494. #else
  164495. "adc r3, %[r]\n\t"
  164496. #endif
  164497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164498. "lsrs r7, %[b], #16\n\t"
  164499. #else
  164500. "lsr r7, %[b], #16\n\t"
  164501. #endif
  164502. #ifdef WOLFSSL_KEIL
  164503. "muls r6, r7, r6\n\t"
  164504. #elif defined(__clang__)
  164505. "muls r6, r7\n\t"
  164506. #else
  164507. "mul r6, r7\n\t"
  164508. #endif
  164509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164510. "lsrs r7, r6, #16\n\t"
  164511. #else
  164512. "lsr r7, r6, #16\n\t"
  164513. #endif
  164514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164515. "lsls r6, r6, #16\n\t"
  164516. #else
  164517. "lsl r6, r6, #16\n\t"
  164518. #endif
  164519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164520. "adds r4, r4, r6\n\t"
  164521. #else
  164522. "add r4, r4, r6\n\t"
  164523. #endif
  164524. #ifdef WOLFSSL_KEIL
  164525. "adcs r5, r5, r7\n\t"
  164526. #elif defined(__clang__)
  164527. "adcs r5, r7\n\t"
  164528. #else
  164529. "adc r5, r7\n\t"
  164530. #endif
  164531. #ifdef WOLFSSL_KEIL
  164532. "adcs r3, r3, %[r]\n\t"
  164533. #elif defined(__clang__)
  164534. "adcs r3, %[r]\n\t"
  164535. #else
  164536. "adc r3, %[r]\n\t"
  164537. #endif
  164538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164539. "lsrs r6, %[a], #16\n\t"
  164540. #else
  164541. "lsr r6, %[a], #16\n\t"
  164542. #endif
  164543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164544. "lsrs r7, %[b], #16\n\t"
  164545. #else
  164546. "lsr r7, %[b], #16\n\t"
  164547. #endif
  164548. #ifdef WOLFSSL_KEIL
  164549. "muls r7, r6, r7\n\t"
  164550. #elif defined(__clang__)
  164551. "muls r7, r6\n\t"
  164552. #else
  164553. "mul r7, r6\n\t"
  164554. #endif
  164555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164556. "adds r5, r5, r7\n\t"
  164557. #else
  164558. "add r5, r5, r7\n\t"
  164559. #endif
  164560. #ifdef WOLFSSL_KEIL
  164561. "adcs r3, r3, %[r]\n\t"
  164562. #elif defined(__clang__)
  164563. "adcs r3, %[r]\n\t"
  164564. #else
  164565. "adc r3, %[r]\n\t"
  164566. #endif
  164567. "uxth r7, %[b]\n\t"
  164568. #ifdef WOLFSSL_KEIL
  164569. "muls r6, r7, r6\n\t"
  164570. #elif defined(__clang__)
  164571. "muls r6, r7\n\t"
  164572. #else
  164573. "mul r6, r7\n\t"
  164574. #endif
  164575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164576. "lsrs r7, r6, #16\n\t"
  164577. #else
  164578. "lsr r7, r6, #16\n\t"
  164579. #endif
  164580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164581. "lsls r6, r6, #16\n\t"
  164582. #else
  164583. "lsl r6, r6, #16\n\t"
  164584. #endif
  164585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164586. "adds r4, r4, r6\n\t"
  164587. #else
  164588. "add r4, r4, r6\n\t"
  164589. #endif
  164590. #ifdef WOLFSSL_KEIL
  164591. "adcs r5, r5, r7\n\t"
  164592. #elif defined(__clang__)
  164593. "adcs r5, r7\n\t"
  164594. #else
  164595. "adc r5, r7\n\t"
  164596. #endif
  164597. #ifdef WOLFSSL_KEIL
  164598. "adcs r3, r3, %[r]\n\t"
  164599. #elif defined(__clang__)
  164600. "adcs r3, %[r]\n\t"
  164601. #else
  164602. "adc r3, %[r]\n\t"
  164603. #endif
  164604. "# A[12] * B[10]\n\t"
  164605. "mov %[a], r9\n\t"
  164606. "mov %[b], r10\n\t"
  164607. "ldr %[a], [%[a], #48]\n\t"
  164608. "ldr %[b], [%[b], #40]\n\t"
  164609. "uxth r6, %[a]\n\t"
  164610. "uxth r7, %[b]\n\t"
  164611. #ifdef WOLFSSL_KEIL
  164612. "muls r7, r6, r7\n\t"
  164613. #elif defined(__clang__)
  164614. "muls r7, r6\n\t"
  164615. #else
  164616. "mul r7, r6\n\t"
  164617. #endif
  164618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164619. "adds r4, r4, r7\n\t"
  164620. #else
  164621. "add r4, r4, r7\n\t"
  164622. #endif
  164623. #ifdef WOLFSSL_KEIL
  164624. "adcs r5, r5, %[r]\n\t"
  164625. #elif defined(__clang__)
  164626. "adcs r5, %[r]\n\t"
  164627. #else
  164628. "adc r5, %[r]\n\t"
  164629. #endif
  164630. #ifdef WOLFSSL_KEIL
  164631. "adcs r3, r3, %[r]\n\t"
  164632. #elif defined(__clang__)
  164633. "adcs r3, %[r]\n\t"
  164634. #else
  164635. "adc r3, %[r]\n\t"
  164636. #endif
  164637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164638. "lsrs r7, %[b], #16\n\t"
  164639. #else
  164640. "lsr r7, %[b], #16\n\t"
  164641. #endif
  164642. #ifdef WOLFSSL_KEIL
  164643. "muls r6, r7, r6\n\t"
  164644. #elif defined(__clang__)
  164645. "muls r6, r7\n\t"
  164646. #else
  164647. "mul r6, r7\n\t"
  164648. #endif
  164649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164650. "lsrs r7, r6, #16\n\t"
  164651. #else
  164652. "lsr r7, r6, #16\n\t"
  164653. #endif
  164654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164655. "lsls r6, r6, #16\n\t"
  164656. #else
  164657. "lsl r6, r6, #16\n\t"
  164658. #endif
  164659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164660. "adds r4, r4, r6\n\t"
  164661. #else
  164662. "add r4, r4, r6\n\t"
  164663. #endif
  164664. #ifdef WOLFSSL_KEIL
  164665. "adcs r5, r5, r7\n\t"
  164666. #elif defined(__clang__)
  164667. "adcs r5, r7\n\t"
  164668. #else
  164669. "adc r5, r7\n\t"
  164670. #endif
  164671. #ifdef WOLFSSL_KEIL
  164672. "adcs r3, r3, %[r]\n\t"
  164673. #elif defined(__clang__)
  164674. "adcs r3, %[r]\n\t"
  164675. #else
  164676. "adc r3, %[r]\n\t"
  164677. #endif
  164678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164679. "lsrs r6, %[a], #16\n\t"
  164680. #else
  164681. "lsr r6, %[a], #16\n\t"
  164682. #endif
  164683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164684. "lsrs r7, %[b], #16\n\t"
  164685. #else
  164686. "lsr r7, %[b], #16\n\t"
  164687. #endif
  164688. #ifdef WOLFSSL_KEIL
  164689. "muls r7, r6, r7\n\t"
  164690. #elif defined(__clang__)
  164691. "muls r7, r6\n\t"
  164692. #else
  164693. "mul r7, r6\n\t"
  164694. #endif
  164695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164696. "adds r5, r5, r7\n\t"
  164697. #else
  164698. "add r5, r5, r7\n\t"
  164699. #endif
  164700. #ifdef WOLFSSL_KEIL
  164701. "adcs r3, r3, %[r]\n\t"
  164702. #elif defined(__clang__)
  164703. "adcs r3, %[r]\n\t"
  164704. #else
  164705. "adc r3, %[r]\n\t"
  164706. #endif
  164707. "uxth r7, %[b]\n\t"
  164708. #ifdef WOLFSSL_KEIL
  164709. "muls r6, r7, r6\n\t"
  164710. #elif defined(__clang__)
  164711. "muls r6, r7\n\t"
  164712. #else
  164713. "mul r6, r7\n\t"
  164714. #endif
  164715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164716. "lsrs r7, r6, #16\n\t"
  164717. #else
  164718. "lsr r7, r6, #16\n\t"
  164719. #endif
  164720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164721. "lsls r6, r6, #16\n\t"
  164722. #else
  164723. "lsl r6, r6, #16\n\t"
  164724. #endif
  164725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164726. "adds r4, r4, r6\n\t"
  164727. #else
  164728. "add r4, r4, r6\n\t"
  164729. #endif
  164730. #ifdef WOLFSSL_KEIL
  164731. "adcs r5, r5, r7\n\t"
  164732. #elif defined(__clang__)
  164733. "adcs r5, r7\n\t"
  164734. #else
  164735. "adc r5, r7\n\t"
  164736. #endif
  164737. #ifdef WOLFSSL_KEIL
  164738. "adcs r3, r3, %[r]\n\t"
  164739. #elif defined(__clang__)
  164740. "adcs r3, %[r]\n\t"
  164741. #else
  164742. "adc r3, %[r]\n\t"
  164743. #endif
  164744. "# A[11] * B[11]\n\t"
  164745. "mov %[a], r9\n\t"
  164746. "mov %[b], r10\n\t"
  164747. "ldr %[a], [%[a], #44]\n\t"
  164748. "ldr %[b], [%[b], #44]\n\t"
  164749. "uxth r6, %[a]\n\t"
  164750. "uxth r7, %[b]\n\t"
  164751. #ifdef WOLFSSL_KEIL
  164752. "muls r7, r6, r7\n\t"
  164753. #elif defined(__clang__)
  164754. "muls r7, r6\n\t"
  164755. #else
  164756. "mul r7, r6\n\t"
  164757. #endif
  164758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164759. "adds r4, r4, r7\n\t"
  164760. #else
  164761. "add r4, r4, r7\n\t"
  164762. #endif
  164763. #ifdef WOLFSSL_KEIL
  164764. "adcs r5, r5, %[r]\n\t"
  164765. #elif defined(__clang__)
  164766. "adcs r5, %[r]\n\t"
  164767. #else
  164768. "adc r5, %[r]\n\t"
  164769. #endif
  164770. #ifdef WOLFSSL_KEIL
  164771. "adcs r3, r3, %[r]\n\t"
  164772. #elif defined(__clang__)
  164773. "adcs r3, %[r]\n\t"
  164774. #else
  164775. "adc r3, %[r]\n\t"
  164776. #endif
  164777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164778. "lsrs r7, %[b], #16\n\t"
  164779. #else
  164780. "lsr r7, %[b], #16\n\t"
  164781. #endif
  164782. #ifdef WOLFSSL_KEIL
  164783. "muls r6, r7, r6\n\t"
  164784. #elif defined(__clang__)
  164785. "muls r6, r7\n\t"
  164786. #else
  164787. "mul r6, r7\n\t"
  164788. #endif
  164789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164790. "lsrs r7, r6, #16\n\t"
  164791. #else
  164792. "lsr r7, r6, #16\n\t"
  164793. #endif
  164794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164795. "lsls r6, r6, #16\n\t"
  164796. #else
  164797. "lsl r6, r6, #16\n\t"
  164798. #endif
  164799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164800. "adds r4, r4, r6\n\t"
  164801. #else
  164802. "add r4, r4, r6\n\t"
  164803. #endif
  164804. #ifdef WOLFSSL_KEIL
  164805. "adcs r5, r5, r7\n\t"
  164806. #elif defined(__clang__)
  164807. "adcs r5, r7\n\t"
  164808. #else
  164809. "adc r5, r7\n\t"
  164810. #endif
  164811. #ifdef WOLFSSL_KEIL
  164812. "adcs r3, r3, %[r]\n\t"
  164813. #elif defined(__clang__)
  164814. "adcs r3, %[r]\n\t"
  164815. #else
  164816. "adc r3, %[r]\n\t"
  164817. #endif
  164818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164819. "lsrs r6, %[a], #16\n\t"
  164820. #else
  164821. "lsr r6, %[a], #16\n\t"
  164822. #endif
  164823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164824. "lsrs r7, %[b], #16\n\t"
  164825. #else
  164826. "lsr r7, %[b], #16\n\t"
  164827. #endif
  164828. #ifdef WOLFSSL_KEIL
  164829. "muls r7, r6, r7\n\t"
  164830. #elif defined(__clang__)
  164831. "muls r7, r6\n\t"
  164832. #else
  164833. "mul r7, r6\n\t"
  164834. #endif
  164835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164836. "adds r5, r5, r7\n\t"
  164837. #else
  164838. "add r5, r5, r7\n\t"
  164839. #endif
  164840. #ifdef WOLFSSL_KEIL
  164841. "adcs r3, r3, %[r]\n\t"
  164842. #elif defined(__clang__)
  164843. "adcs r3, %[r]\n\t"
  164844. #else
  164845. "adc r3, %[r]\n\t"
  164846. #endif
  164847. "uxth r7, %[b]\n\t"
  164848. #ifdef WOLFSSL_KEIL
  164849. "muls r6, r7, r6\n\t"
  164850. #elif defined(__clang__)
  164851. "muls r6, r7\n\t"
  164852. #else
  164853. "mul r6, r7\n\t"
  164854. #endif
  164855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164856. "lsrs r7, r6, #16\n\t"
  164857. #else
  164858. "lsr r7, r6, #16\n\t"
  164859. #endif
  164860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164861. "lsls r6, r6, #16\n\t"
  164862. #else
  164863. "lsl r6, r6, #16\n\t"
  164864. #endif
  164865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164866. "adds r4, r4, r6\n\t"
  164867. #else
  164868. "add r4, r4, r6\n\t"
  164869. #endif
  164870. #ifdef WOLFSSL_KEIL
  164871. "adcs r5, r5, r7\n\t"
  164872. #elif defined(__clang__)
  164873. "adcs r5, r7\n\t"
  164874. #else
  164875. "adc r5, r7\n\t"
  164876. #endif
  164877. #ifdef WOLFSSL_KEIL
  164878. "adcs r3, r3, %[r]\n\t"
  164879. #elif defined(__clang__)
  164880. "adcs r3, %[r]\n\t"
  164881. #else
  164882. "adc r3, %[r]\n\t"
  164883. #endif
  164884. "# A[10] * B[12]\n\t"
  164885. "mov %[a], r9\n\t"
  164886. "mov %[b], r10\n\t"
  164887. "ldr %[a], [%[a], #40]\n\t"
  164888. "ldr %[b], [%[b], #48]\n\t"
  164889. "uxth r6, %[a]\n\t"
  164890. "uxth r7, %[b]\n\t"
  164891. #ifdef WOLFSSL_KEIL
  164892. "muls r7, r6, r7\n\t"
  164893. #elif defined(__clang__)
  164894. "muls r7, r6\n\t"
  164895. #else
  164896. "mul r7, r6\n\t"
  164897. #endif
  164898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164899. "adds r4, r4, r7\n\t"
  164900. #else
  164901. "add r4, r4, r7\n\t"
  164902. #endif
  164903. #ifdef WOLFSSL_KEIL
  164904. "adcs r5, r5, %[r]\n\t"
  164905. #elif defined(__clang__)
  164906. "adcs r5, %[r]\n\t"
  164907. #else
  164908. "adc r5, %[r]\n\t"
  164909. #endif
  164910. #ifdef WOLFSSL_KEIL
  164911. "adcs r3, r3, %[r]\n\t"
  164912. #elif defined(__clang__)
  164913. "adcs r3, %[r]\n\t"
  164914. #else
  164915. "adc r3, %[r]\n\t"
  164916. #endif
  164917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164918. "lsrs r7, %[b], #16\n\t"
  164919. #else
  164920. "lsr r7, %[b], #16\n\t"
  164921. #endif
  164922. #ifdef WOLFSSL_KEIL
  164923. "muls r6, r7, r6\n\t"
  164924. #elif defined(__clang__)
  164925. "muls r6, r7\n\t"
  164926. #else
  164927. "mul r6, r7\n\t"
  164928. #endif
  164929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164930. "lsrs r7, r6, #16\n\t"
  164931. #else
  164932. "lsr r7, r6, #16\n\t"
  164933. #endif
  164934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164935. "lsls r6, r6, #16\n\t"
  164936. #else
  164937. "lsl r6, r6, #16\n\t"
  164938. #endif
  164939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164940. "adds r4, r4, r6\n\t"
  164941. #else
  164942. "add r4, r4, r6\n\t"
  164943. #endif
  164944. #ifdef WOLFSSL_KEIL
  164945. "adcs r5, r5, r7\n\t"
  164946. #elif defined(__clang__)
  164947. "adcs r5, r7\n\t"
  164948. #else
  164949. "adc r5, r7\n\t"
  164950. #endif
  164951. #ifdef WOLFSSL_KEIL
  164952. "adcs r3, r3, %[r]\n\t"
  164953. #elif defined(__clang__)
  164954. "adcs r3, %[r]\n\t"
  164955. #else
  164956. "adc r3, %[r]\n\t"
  164957. #endif
  164958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164959. "lsrs r6, %[a], #16\n\t"
  164960. #else
  164961. "lsr r6, %[a], #16\n\t"
  164962. #endif
  164963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164964. "lsrs r7, %[b], #16\n\t"
  164965. #else
  164966. "lsr r7, %[b], #16\n\t"
  164967. #endif
  164968. #ifdef WOLFSSL_KEIL
  164969. "muls r7, r6, r7\n\t"
  164970. #elif defined(__clang__)
  164971. "muls r7, r6\n\t"
  164972. #else
  164973. "mul r7, r6\n\t"
  164974. #endif
  164975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164976. "adds r5, r5, r7\n\t"
  164977. #else
  164978. "add r5, r5, r7\n\t"
  164979. #endif
  164980. #ifdef WOLFSSL_KEIL
  164981. "adcs r3, r3, %[r]\n\t"
  164982. #elif defined(__clang__)
  164983. "adcs r3, %[r]\n\t"
  164984. #else
  164985. "adc r3, %[r]\n\t"
  164986. #endif
  164987. "uxth r7, %[b]\n\t"
  164988. #ifdef WOLFSSL_KEIL
  164989. "muls r6, r7, r6\n\t"
  164990. #elif defined(__clang__)
  164991. "muls r6, r7\n\t"
  164992. #else
  164993. "mul r6, r7\n\t"
  164994. #endif
  164995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164996. "lsrs r7, r6, #16\n\t"
  164997. #else
  164998. "lsr r7, r6, #16\n\t"
  164999. #endif
  165000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165001. "lsls r6, r6, #16\n\t"
  165002. #else
  165003. "lsl r6, r6, #16\n\t"
  165004. #endif
  165005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165006. "adds r4, r4, r6\n\t"
  165007. #else
  165008. "add r4, r4, r6\n\t"
  165009. #endif
  165010. #ifdef WOLFSSL_KEIL
  165011. "adcs r5, r5, r7\n\t"
  165012. #elif defined(__clang__)
  165013. "adcs r5, r7\n\t"
  165014. #else
  165015. "adc r5, r7\n\t"
  165016. #endif
  165017. #ifdef WOLFSSL_KEIL
  165018. "adcs r3, r3, %[r]\n\t"
  165019. #elif defined(__clang__)
  165020. "adcs r3, %[r]\n\t"
  165021. #else
  165022. "adc r3, %[r]\n\t"
  165023. #endif
  165024. "# A[9] * B[13]\n\t"
  165025. "mov %[a], r9\n\t"
  165026. "mov %[b], r10\n\t"
  165027. "ldr %[a], [%[a], #36]\n\t"
  165028. "ldr %[b], [%[b], #52]\n\t"
  165029. "uxth r6, %[a]\n\t"
  165030. "uxth r7, %[b]\n\t"
  165031. #ifdef WOLFSSL_KEIL
  165032. "muls r7, r6, r7\n\t"
  165033. #elif defined(__clang__)
  165034. "muls r7, r6\n\t"
  165035. #else
  165036. "mul r7, r6\n\t"
  165037. #endif
  165038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165039. "adds r4, r4, r7\n\t"
  165040. #else
  165041. "add r4, r4, r7\n\t"
  165042. #endif
  165043. #ifdef WOLFSSL_KEIL
  165044. "adcs r5, r5, %[r]\n\t"
  165045. #elif defined(__clang__)
  165046. "adcs r5, %[r]\n\t"
  165047. #else
  165048. "adc r5, %[r]\n\t"
  165049. #endif
  165050. #ifdef WOLFSSL_KEIL
  165051. "adcs r3, r3, %[r]\n\t"
  165052. #elif defined(__clang__)
  165053. "adcs r3, %[r]\n\t"
  165054. #else
  165055. "adc r3, %[r]\n\t"
  165056. #endif
  165057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165058. "lsrs r7, %[b], #16\n\t"
  165059. #else
  165060. "lsr r7, %[b], #16\n\t"
  165061. #endif
  165062. #ifdef WOLFSSL_KEIL
  165063. "muls r6, r7, r6\n\t"
  165064. #elif defined(__clang__)
  165065. "muls r6, r7\n\t"
  165066. #else
  165067. "mul r6, r7\n\t"
  165068. #endif
  165069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165070. "lsrs r7, r6, #16\n\t"
  165071. #else
  165072. "lsr r7, r6, #16\n\t"
  165073. #endif
  165074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165075. "lsls r6, r6, #16\n\t"
  165076. #else
  165077. "lsl r6, r6, #16\n\t"
  165078. #endif
  165079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165080. "adds r4, r4, r6\n\t"
  165081. #else
  165082. "add r4, r4, r6\n\t"
  165083. #endif
  165084. #ifdef WOLFSSL_KEIL
  165085. "adcs r5, r5, r7\n\t"
  165086. #elif defined(__clang__)
  165087. "adcs r5, r7\n\t"
  165088. #else
  165089. "adc r5, r7\n\t"
  165090. #endif
  165091. #ifdef WOLFSSL_KEIL
  165092. "adcs r3, r3, %[r]\n\t"
  165093. #elif defined(__clang__)
  165094. "adcs r3, %[r]\n\t"
  165095. #else
  165096. "adc r3, %[r]\n\t"
  165097. #endif
  165098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165099. "lsrs r6, %[a], #16\n\t"
  165100. #else
  165101. "lsr r6, %[a], #16\n\t"
  165102. #endif
  165103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165104. "lsrs r7, %[b], #16\n\t"
  165105. #else
  165106. "lsr r7, %[b], #16\n\t"
  165107. #endif
  165108. #ifdef WOLFSSL_KEIL
  165109. "muls r7, r6, r7\n\t"
  165110. #elif defined(__clang__)
  165111. "muls r7, r6\n\t"
  165112. #else
  165113. "mul r7, r6\n\t"
  165114. #endif
  165115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165116. "adds r5, r5, r7\n\t"
  165117. #else
  165118. "add r5, r5, r7\n\t"
  165119. #endif
  165120. #ifdef WOLFSSL_KEIL
  165121. "adcs r3, r3, %[r]\n\t"
  165122. #elif defined(__clang__)
  165123. "adcs r3, %[r]\n\t"
  165124. #else
  165125. "adc r3, %[r]\n\t"
  165126. #endif
  165127. "uxth r7, %[b]\n\t"
  165128. #ifdef WOLFSSL_KEIL
  165129. "muls r6, r7, r6\n\t"
  165130. #elif defined(__clang__)
  165131. "muls r6, r7\n\t"
  165132. #else
  165133. "mul r6, r7\n\t"
  165134. #endif
  165135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165136. "lsrs r7, r6, #16\n\t"
  165137. #else
  165138. "lsr r7, r6, #16\n\t"
  165139. #endif
  165140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165141. "lsls r6, r6, #16\n\t"
  165142. #else
  165143. "lsl r6, r6, #16\n\t"
  165144. #endif
  165145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165146. "adds r4, r4, r6\n\t"
  165147. #else
  165148. "add r4, r4, r6\n\t"
  165149. #endif
  165150. #ifdef WOLFSSL_KEIL
  165151. "adcs r5, r5, r7\n\t"
  165152. #elif defined(__clang__)
  165153. "adcs r5, r7\n\t"
  165154. #else
  165155. "adc r5, r7\n\t"
  165156. #endif
  165157. #ifdef WOLFSSL_KEIL
  165158. "adcs r3, r3, %[r]\n\t"
  165159. #elif defined(__clang__)
  165160. "adcs r3, %[r]\n\t"
  165161. #else
  165162. "adc r3, %[r]\n\t"
  165163. #endif
  165164. "# A[8] * B[14]\n\t"
  165165. "mov %[a], r9\n\t"
  165166. "mov %[b], r10\n\t"
  165167. "ldr %[a], [%[a], #32]\n\t"
  165168. "ldr %[b], [%[b], #56]\n\t"
  165169. "uxth r6, %[a]\n\t"
  165170. "uxth r7, %[b]\n\t"
  165171. #ifdef WOLFSSL_KEIL
  165172. "muls r7, r6, r7\n\t"
  165173. #elif defined(__clang__)
  165174. "muls r7, r6\n\t"
  165175. #else
  165176. "mul r7, r6\n\t"
  165177. #endif
  165178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165179. "adds r4, r4, r7\n\t"
  165180. #else
  165181. "add r4, r4, r7\n\t"
  165182. #endif
  165183. #ifdef WOLFSSL_KEIL
  165184. "adcs r5, r5, %[r]\n\t"
  165185. #elif defined(__clang__)
  165186. "adcs r5, %[r]\n\t"
  165187. #else
  165188. "adc r5, %[r]\n\t"
  165189. #endif
  165190. #ifdef WOLFSSL_KEIL
  165191. "adcs r3, r3, %[r]\n\t"
  165192. #elif defined(__clang__)
  165193. "adcs r3, %[r]\n\t"
  165194. #else
  165195. "adc r3, %[r]\n\t"
  165196. #endif
  165197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165198. "lsrs r7, %[b], #16\n\t"
  165199. #else
  165200. "lsr r7, %[b], #16\n\t"
  165201. #endif
  165202. #ifdef WOLFSSL_KEIL
  165203. "muls r6, r7, r6\n\t"
  165204. #elif defined(__clang__)
  165205. "muls r6, r7\n\t"
  165206. #else
  165207. "mul r6, r7\n\t"
  165208. #endif
  165209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165210. "lsrs r7, r6, #16\n\t"
  165211. #else
  165212. "lsr r7, r6, #16\n\t"
  165213. #endif
  165214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165215. "lsls r6, r6, #16\n\t"
  165216. #else
  165217. "lsl r6, r6, #16\n\t"
  165218. #endif
  165219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165220. "adds r4, r4, r6\n\t"
  165221. #else
  165222. "add r4, r4, r6\n\t"
  165223. #endif
  165224. #ifdef WOLFSSL_KEIL
  165225. "adcs r5, r5, r7\n\t"
  165226. #elif defined(__clang__)
  165227. "adcs r5, r7\n\t"
  165228. #else
  165229. "adc r5, r7\n\t"
  165230. #endif
  165231. #ifdef WOLFSSL_KEIL
  165232. "adcs r3, r3, %[r]\n\t"
  165233. #elif defined(__clang__)
  165234. "adcs r3, %[r]\n\t"
  165235. #else
  165236. "adc r3, %[r]\n\t"
  165237. #endif
  165238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165239. "lsrs r6, %[a], #16\n\t"
  165240. #else
  165241. "lsr r6, %[a], #16\n\t"
  165242. #endif
  165243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165244. "lsrs r7, %[b], #16\n\t"
  165245. #else
  165246. "lsr r7, %[b], #16\n\t"
  165247. #endif
  165248. #ifdef WOLFSSL_KEIL
  165249. "muls r7, r6, r7\n\t"
  165250. #elif defined(__clang__)
  165251. "muls r7, r6\n\t"
  165252. #else
  165253. "mul r7, r6\n\t"
  165254. #endif
  165255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165256. "adds r5, r5, r7\n\t"
  165257. #else
  165258. "add r5, r5, r7\n\t"
  165259. #endif
  165260. #ifdef WOLFSSL_KEIL
  165261. "adcs r3, r3, %[r]\n\t"
  165262. #elif defined(__clang__)
  165263. "adcs r3, %[r]\n\t"
  165264. #else
  165265. "adc r3, %[r]\n\t"
  165266. #endif
  165267. "uxth r7, %[b]\n\t"
  165268. #ifdef WOLFSSL_KEIL
  165269. "muls r6, r7, r6\n\t"
  165270. #elif defined(__clang__)
  165271. "muls r6, r7\n\t"
  165272. #else
  165273. "mul r6, r7\n\t"
  165274. #endif
  165275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165276. "lsrs r7, r6, #16\n\t"
  165277. #else
  165278. "lsr r7, r6, #16\n\t"
  165279. #endif
  165280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165281. "lsls r6, r6, #16\n\t"
  165282. #else
  165283. "lsl r6, r6, #16\n\t"
  165284. #endif
  165285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165286. "adds r4, r4, r6\n\t"
  165287. #else
  165288. "add r4, r4, r6\n\t"
  165289. #endif
  165290. #ifdef WOLFSSL_KEIL
  165291. "adcs r5, r5, r7\n\t"
  165292. #elif defined(__clang__)
  165293. "adcs r5, r7\n\t"
  165294. #else
  165295. "adc r5, r7\n\t"
  165296. #endif
  165297. #ifdef WOLFSSL_KEIL
  165298. "adcs r3, r3, %[r]\n\t"
  165299. #elif defined(__clang__)
  165300. "adcs r3, %[r]\n\t"
  165301. #else
  165302. "adc r3, %[r]\n\t"
  165303. #endif
  165304. "# A[7] * B[15]\n\t"
  165305. "mov %[a], r9\n\t"
  165306. "mov %[b], r10\n\t"
  165307. "ldr %[a], [%[a], #28]\n\t"
  165308. "ldr %[b], [%[b], #60]\n\t"
  165309. "uxth r6, %[a]\n\t"
  165310. "uxth r7, %[b]\n\t"
  165311. #ifdef WOLFSSL_KEIL
  165312. "muls r7, r6, r7\n\t"
  165313. #elif defined(__clang__)
  165314. "muls r7, r6\n\t"
  165315. #else
  165316. "mul r7, r6\n\t"
  165317. #endif
  165318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165319. "adds r4, r4, r7\n\t"
  165320. #else
  165321. "add r4, r4, r7\n\t"
  165322. #endif
  165323. #ifdef WOLFSSL_KEIL
  165324. "adcs r5, r5, %[r]\n\t"
  165325. #elif defined(__clang__)
  165326. "adcs r5, %[r]\n\t"
  165327. #else
  165328. "adc r5, %[r]\n\t"
  165329. #endif
  165330. #ifdef WOLFSSL_KEIL
  165331. "adcs r3, r3, %[r]\n\t"
  165332. #elif defined(__clang__)
  165333. "adcs r3, %[r]\n\t"
  165334. #else
  165335. "adc r3, %[r]\n\t"
  165336. #endif
  165337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165338. "lsrs r7, %[b], #16\n\t"
  165339. #else
  165340. "lsr r7, %[b], #16\n\t"
  165341. #endif
  165342. #ifdef WOLFSSL_KEIL
  165343. "muls r6, r7, r6\n\t"
  165344. #elif defined(__clang__)
  165345. "muls r6, r7\n\t"
  165346. #else
  165347. "mul r6, r7\n\t"
  165348. #endif
  165349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165350. "lsrs r7, r6, #16\n\t"
  165351. #else
  165352. "lsr r7, r6, #16\n\t"
  165353. #endif
  165354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165355. "lsls r6, r6, #16\n\t"
  165356. #else
  165357. "lsl r6, r6, #16\n\t"
  165358. #endif
  165359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165360. "adds r4, r4, r6\n\t"
  165361. #else
  165362. "add r4, r4, r6\n\t"
  165363. #endif
  165364. #ifdef WOLFSSL_KEIL
  165365. "adcs r5, r5, r7\n\t"
  165366. #elif defined(__clang__)
  165367. "adcs r5, r7\n\t"
  165368. #else
  165369. "adc r5, r7\n\t"
  165370. #endif
  165371. #ifdef WOLFSSL_KEIL
  165372. "adcs r3, r3, %[r]\n\t"
  165373. #elif defined(__clang__)
  165374. "adcs r3, %[r]\n\t"
  165375. #else
  165376. "adc r3, %[r]\n\t"
  165377. #endif
  165378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165379. "lsrs r6, %[a], #16\n\t"
  165380. #else
  165381. "lsr r6, %[a], #16\n\t"
  165382. #endif
  165383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165384. "lsrs r7, %[b], #16\n\t"
  165385. #else
  165386. "lsr r7, %[b], #16\n\t"
  165387. #endif
  165388. #ifdef WOLFSSL_KEIL
  165389. "muls r7, r6, r7\n\t"
  165390. #elif defined(__clang__)
  165391. "muls r7, r6\n\t"
  165392. #else
  165393. "mul r7, r6\n\t"
  165394. #endif
  165395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165396. "adds r5, r5, r7\n\t"
  165397. #else
  165398. "add r5, r5, r7\n\t"
  165399. #endif
  165400. #ifdef WOLFSSL_KEIL
  165401. "adcs r3, r3, %[r]\n\t"
  165402. #elif defined(__clang__)
  165403. "adcs r3, %[r]\n\t"
  165404. #else
  165405. "adc r3, %[r]\n\t"
  165406. #endif
  165407. "uxth r7, %[b]\n\t"
  165408. #ifdef WOLFSSL_KEIL
  165409. "muls r6, r7, r6\n\t"
  165410. #elif defined(__clang__)
  165411. "muls r6, r7\n\t"
  165412. #else
  165413. "mul r6, r7\n\t"
  165414. #endif
  165415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165416. "lsrs r7, r6, #16\n\t"
  165417. #else
  165418. "lsr r7, r6, #16\n\t"
  165419. #endif
  165420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165421. "lsls r6, r6, #16\n\t"
  165422. #else
  165423. "lsl r6, r6, #16\n\t"
  165424. #endif
  165425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165426. "adds r4, r4, r6\n\t"
  165427. #else
  165428. "add r4, r4, r6\n\t"
  165429. #endif
  165430. #ifdef WOLFSSL_KEIL
  165431. "adcs r5, r5, r7\n\t"
  165432. #elif defined(__clang__)
  165433. "adcs r5, r7\n\t"
  165434. #else
  165435. "adc r5, r7\n\t"
  165436. #endif
  165437. #ifdef WOLFSSL_KEIL
  165438. "adcs r3, r3, %[r]\n\t"
  165439. #elif defined(__clang__)
  165440. "adcs r3, %[r]\n\t"
  165441. #else
  165442. "adc r3, %[r]\n\t"
  165443. #endif
  165444. "mov %[r], r8\n\t"
  165445. "str r4, [%[r], #88]\n\t"
  165446. "movs %[r], #0\n\t"
  165447. "# A[8] * B[15]\n\t"
  165448. "movs r4, #0\n\t"
  165449. "mov %[a], r9\n\t"
  165450. "mov %[b], r10\n\t"
  165451. "ldr %[a], [%[a], #32]\n\t"
  165452. "ldr %[b], [%[b], #60]\n\t"
  165453. "uxth r6, %[a]\n\t"
  165454. "uxth r7, %[b]\n\t"
  165455. #ifdef WOLFSSL_KEIL
  165456. "muls r7, r6, r7\n\t"
  165457. #elif defined(__clang__)
  165458. "muls r7, r6\n\t"
  165459. #else
  165460. "mul r7, r6\n\t"
  165461. #endif
  165462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165463. "adds r5, r5, r7\n\t"
  165464. #else
  165465. "add r5, r5, r7\n\t"
  165466. #endif
  165467. #ifdef WOLFSSL_KEIL
  165468. "adcs r3, r3, %[r]\n\t"
  165469. #elif defined(__clang__)
  165470. "adcs r3, %[r]\n\t"
  165471. #else
  165472. "adc r3, %[r]\n\t"
  165473. #endif
  165474. #ifdef WOLFSSL_KEIL
  165475. "adcs r4, r4, %[r]\n\t"
  165476. #elif defined(__clang__)
  165477. "adcs r4, %[r]\n\t"
  165478. #else
  165479. "adc r4, %[r]\n\t"
  165480. #endif
  165481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165482. "lsrs r7, %[b], #16\n\t"
  165483. #else
  165484. "lsr r7, %[b], #16\n\t"
  165485. #endif
  165486. #ifdef WOLFSSL_KEIL
  165487. "muls r6, r7, r6\n\t"
  165488. #elif defined(__clang__)
  165489. "muls r6, r7\n\t"
  165490. #else
  165491. "mul r6, r7\n\t"
  165492. #endif
  165493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165494. "lsrs r7, r6, #16\n\t"
  165495. #else
  165496. "lsr r7, r6, #16\n\t"
  165497. #endif
  165498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165499. "lsls r6, r6, #16\n\t"
  165500. #else
  165501. "lsl r6, r6, #16\n\t"
  165502. #endif
  165503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165504. "adds r5, r5, r6\n\t"
  165505. #else
  165506. "add r5, r5, r6\n\t"
  165507. #endif
  165508. #ifdef WOLFSSL_KEIL
  165509. "adcs r3, r3, r7\n\t"
  165510. #elif defined(__clang__)
  165511. "adcs r3, r7\n\t"
  165512. #else
  165513. "adc r3, r7\n\t"
  165514. #endif
  165515. #ifdef WOLFSSL_KEIL
  165516. "adcs r4, r4, %[r]\n\t"
  165517. #elif defined(__clang__)
  165518. "adcs r4, %[r]\n\t"
  165519. #else
  165520. "adc r4, %[r]\n\t"
  165521. #endif
  165522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165523. "lsrs r6, %[a], #16\n\t"
  165524. #else
  165525. "lsr r6, %[a], #16\n\t"
  165526. #endif
  165527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165528. "lsrs r7, %[b], #16\n\t"
  165529. #else
  165530. "lsr r7, %[b], #16\n\t"
  165531. #endif
  165532. #ifdef WOLFSSL_KEIL
  165533. "muls r7, r6, r7\n\t"
  165534. #elif defined(__clang__)
  165535. "muls r7, r6\n\t"
  165536. #else
  165537. "mul r7, r6\n\t"
  165538. #endif
  165539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165540. "adds r3, r3, r7\n\t"
  165541. #else
  165542. "add r3, r3, r7\n\t"
  165543. #endif
  165544. #ifdef WOLFSSL_KEIL
  165545. "adcs r4, r4, %[r]\n\t"
  165546. #elif defined(__clang__)
  165547. "adcs r4, %[r]\n\t"
  165548. #else
  165549. "adc r4, %[r]\n\t"
  165550. #endif
  165551. "uxth r7, %[b]\n\t"
  165552. #ifdef WOLFSSL_KEIL
  165553. "muls r6, r7, r6\n\t"
  165554. #elif defined(__clang__)
  165555. "muls r6, r7\n\t"
  165556. #else
  165557. "mul r6, r7\n\t"
  165558. #endif
  165559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165560. "lsrs r7, r6, #16\n\t"
  165561. #else
  165562. "lsr r7, r6, #16\n\t"
  165563. #endif
  165564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165565. "lsls r6, r6, #16\n\t"
  165566. #else
  165567. "lsl r6, r6, #16\n\t"
  165568. #endif
  165569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165570. "adds r5, r5, r6\n\t"
  165571. #else
  165572. "add r5, r5, r6\n\t"
  165573. #endif
  165574. #ifdef WOLFSSL_KEIL
  165575. "adcs r3, r3, r7\n\t"
  165576. #elif defined(__clang__)
  165577. "adcs r3, r7\n\t"
  165578. #else
  165579. "adc r3, r7\n\t"
  165580. #endif
  165581. #ifdef WOLFSSL_KEIL
  165582. "adcs r4, r4, %[r]\n\t"
  165583. #elif defined(__clang__)
  165584. "adcs r4, %[r]\n\t"
  165585. #else
  165586. "adc r4, %[r]\n\t"
  165587. #endif
  165588. "# A[9] * B[14]\n\t"
  165589. "mov %[a], r9\n\t"
  165590. "mov %[b], r10\n\t"
  165591. "ldr %[a], [%[a], #36]\n\t"
  165592. "ldr %[b], [%[b], #56]\n\t"
  165593. "uxth r6, %[a]\n\t"
  165594. "uxth r7, %[b]\n\t"
  165595. #ifdef WOLFSSL_KEIL
  165596. "muls r7, r6, r7\n\t"
  165597. #elif defined(__clang__)
  165598. "muls r7, r6\n\t"
  165599. #else
  165600. "mul r7, r6\n\t"
  165601. #endif
  165602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165603. "adds r5, r5, r7\n\t"
  165604. #else
  165605. "add r5, r5, r7\n\t"
  165606. #endif
  165607. #ifdef WOLFSSL_KEIL
  165608. "adcs r3, r3, %[r]\n\t"
  165609. #elif defined(__clang__)
  165610. "adcs r3, %[r]\n\t"
  165611. #else
  165612. "adc r3, %[r]\n\t"
  165613. #endif
  165614. #ifdef WOLFSSL_KEIL
  165615. "adcs r4, r4, %[r]\n\t"
  165616. #elif defined(__clang__)
  165617. "adcs r4, %[r]\n\t"
  165618. #else
  165619. "adc r4, %[r]\n\t"
  165620. #endif
  165621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165622. "lsrs r7, %[b], #16\n\t"
  165623. #else
  165624. "lsr r7, %[b], #16\n\t"
  165625. #endif
  165626. #ifdef WOLFSSL_KEIL
  165627. "muls r6, r7, r6\n\t"
  165628. #elif defined(__clang__)
  165629. "muls r6, r7\n\t"
  165630. #else
  165631. "mul r6, r7\n\t"
  165632. #endif
  165633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165634. "lsrs r7, r6, #16\n\t"
  165635. #else
  165636. "lsr r7, r6, #16\n\t"
  165637. #endif
  165638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165639. "lsls r6, r6, #16\n\t"
  165640. #else
  165641. "lsl r6, r6, #16\n\t"
  165642. #endif
  165643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165644. "adds r5, r5, r6\n\t"
  165645. #else
  165646. "add r5, r5, r6\n\t"
  165647. #endif
  165648. #ifdef WOLFSSL_KEIL
  165649. "adcs r3, r3, r7\n\t"
  165650. #elif defined(__clang__)
  165651. "adcs r3, r7\n\t"
  165652. #else
  165653. "adc r3, r7\n\t"
  165654. #endif
  165655. #ifdef WOLFSSL_KEIL
  165656. "adcs r4, r4, %[r]\n\t"
  165657. #elif defined(__clang__)
  165658. "adcs r4, %[r]\n\t"
  165659. #else
  165660. "adc r4, %[r]\n\t"
  165661. #endif
  165662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165663. "lsrs r6, %[a], #16\n\t"
  165664. #else
  165665. "lsr r6, %[a], #16\n\t"
  165666. #endif
  165667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165668. "lsrs r7, %[b], #16\n\t"
  165669. #else
  165670. "lsr r7, %[b], #16\n\t"
  165671. #endif
  165672. #ifdef WOLFSSL_KEIL
  165673. "muls r7, r6, r7\n\t"
  165674. #elif defined(__clang__)
  165675. "muls r7, r6\n\t"
  165676. #else
  165677. "mul r7, r6\n\t"
  165678. #endif
  165679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165680. "adds r3, r3, r7\n\t"
  165681. #else
  165682. "add r3, r3, r7\n\t"
  165683. #endif
  165684. #ifdef WOLFSSL_KEIL
  165685. "adcs r4, r4, %[r]\n\t"
  165686. #elif defined(__clang__)
  165687. "adcs r4, %[r]\n\t"
  165688. #else
  165689. "adc r4, %[r]\n\t"
  165690. #endif
  165691. "uxth r7, %[b]\n\t"
  165692. #ifdef WOLFSSL_KEIL
  165693. "muls r6, r7, r6\n\t"
  165694. #elif defined(__clang__)
  165695. "muls r6, r7\n\t"
  165696. #else
  165697. "mul r6, r7\n\t"
  165698. #endif
  165699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165700. "lsrs r7, r6, #16\n\t"
  165701. #else
  165702. "lsr r7, r6, #16\n\t"
  165703. #endif
  165704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165705. "lsls r6, r6, #16\n\t"
  165706. #else
  165707. "lsl r6, r6, #16\n\t"
  165708. #endif
  165709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165710. "adds r5, r5, r6\n\t"
  165711. #else
  165712. "add r5, r5, r6\n\t"
  165713. #endif
  165714. #ifdef WOLFSSL_KEIL
  165715. "adcs r3, r3, r7\n\t"
  165716. #elif defined(__clang__)
  165717. "adcs r3, r7\n\t"
  165718. #else
  165719. "adc r3, r7\n\t"
  165720. #endif
  165721. #ifdef WOLFSSL_KEIL
  165722. "adcs r4, r4, %[r]\n\t"
  165723. #elif defined(__clang__)
  165724. "adcs r4, %[r]\n\t"
  165725. #else
  165726. "adc r4, %[r]\n\t"
  165727. #endif
  165728. "# A[10] * B[13]\n\t"
  165729. "mov %[a], r9\n\t"
  165730. "mov %[b], r10\n\t"
  165731. "ldr %[a], [%[a], #40]\n\t"
  165732. "ldr %[b], [%[b], #52]\n\t"
  165733. "uxth r6, %[a]\n\t"
  165734. "uxth r7, %[b]\n\t"
  165735. #ifdef WOLFSSL_KEIL
  165736. "muls r7, r6, r7\n\t"
  165737. #elif defined(__clang__)
  165738. "muls r7, r6\n\t"
  165739. #else
  165740. "mul r7, r6\n\t"
  165741. #endif
  165742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165743. "adds r5, r5, r7\n\t"
  165744. #else
  165745. "add r5, r5, r7\n\t"
  165746. #endif
  165747. #ifdef WOLFSSL_KEIL
  165748. "adcs r3, r3, %[r]\n\t"
  165749. #elif defined(__clang__)
  165750. "adcs r3, %[r]\n\t"
  165751. #else
  165752. "adc r3, %[r]\n\t"
  165753. #endif
  165754. #ifdef WOLFSSL_KEIL
  165755. "adcs r4, r4, %[r]\n\t"
  165756. #elif defined(__clang__)
  165757. "adcs r4, %[r]\n\t"
  165758. #else
  165759. "adc r4, %[r]\n\t"
  165760. #endif
  165761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165762. "lsrs r7, %[b], #16\n\t"
  165763. #else
  165764. "lsr r7, %[b], #16\n\t"
  165765. #endif
  165766. #ifdef WOLFSSL_KEIL
  165767. "muls r6, r7, r6\n\t"
  165768. #elif defined(__clang__)
  165769. "muls r6, r7\n\t"
  165770. #else
  165771. "mul r6, r7\n\t"
  165772. #endif
  165773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165774. "lsrs r7, r6, #16\n\t"
  165775. #else
  165776. "lsr r7, r6, #16\n\t"
  165777. #endif
  165778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165779. "lsls r6, r6, #16\n\t"
  165780. #else
  165781. "lsl r6, r6, #16\n\t"
  165782. #endif
  165783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165784. "adds r5, r5, r6\n\t"
  165785. #else
  165786. "add r5, r5, r6\n\t"
  165787. #endif
  165788. #ifdef WOLFSSL_KEIL
  165789. "adcs r3, r3, r7\n\t"
  165790. #elif defined(__clang__)
  165791. "adcs r3, r7\n\t"
  165792. #else
  165793. "adc r3, r7\n\t"
  165794. #endif
  165795. #ifdef WOLFSSL_KEIL
  165796. "adcs r4, r4, %[r]\n\t"
  165797. #elif defined(__clang__)
  165798. "adcs r4, %[r]\n\t"
  165799. #else
  165800. "adc r4, %[r]\n\t"
  165801. #endif
  165802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165803. "lsrs r6, %[a], #16\n\t"
  165804. #else
  165805. "lsr r6, %[a], #16\n\t"
  165806. #endif
  165807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165808. "lsrs r7, %[b], #16\n\t"
  165809. #else
  165810. "lsr r7, %[b], #16\n\t"
  165811. #endif
  165812. #ifdef WOLFSSL_KEIL
  165813. "muls r7, r6, r7\n\t"
  165814. #elif defined(__clang__)
  165815. "muls r7, r6\n\t"
  165816. #else
  165817. "mul r7, r6\n\t"
  165818. #endif
  165819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165820. "adds r3, r3, r7\n\t"
  165821. #else
  165822. "add r3, r3, r7\n\t"
  165823. #endif
  165824. #ifdef WOLFSSL_KEIL
  165825. "adcs r4, r4, %[r]\n\t"
  165826. #elif defined(__clang__)
  165827. "adcs r4, %[r]\n\t"
  165828. #else
  165829. "adc r4, %[r]\n\t"
  165830. #endif
  165831. "uxth r7, %[b]\n\t"
  165832. #ifdef WOLFSSL_KEIL
  165833. "muls r6, r7, r6\n\t"
  165834. #elif defined(__clang__)
  165835. "muls r6, r7\n\t"
  165836. #else
  165837. "mul r6, r7\n\t"
  165838. #endif
  165839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165840. "lsrs r7, r6, #16\n\t"
  165841. #else
  165842. "lsr r7, r6, #16\n\t"
  165843. #endif
  165844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165845. "lsls r6, r6, #16\n\t"
  165846. #else
  165847. "lsl r6, r6, #16\n\t"
  165848. #endif
  165849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165850. "adds r5, r5, r6\n\t"
  165851. #else
  165852. "add r5, r5, r6\n\t"
  165853. #endif
  165854. #ifdef WOLFSSL_KEIL
  165855. "adcs r3, r3, r7\n\t"
  165856. #elif defined(__clang__)
  165857. "adcs r3, r7\n\t"
  165858. #else
  165859. "adc r3, r7\n\t"
  165860. #endif
  165861. #ifdef WOLFSSL_KEIL
  165862. "adcs r4, r4, %[r]\n\t"
  165863. #elif defined(__clang__)
  165864. "adcs r4, %[r]\n\t"
  165865. #else
  165866. "adc r4, %[r]\n\t"
  165867. #endif
  165868. "# A[11] * B[12]\n\t"
  165869. "mov %[a], r9\n\t"
  165870. "mov %[b], r10\n\t"
  165871. "ldr %[a], [%[a], #44]\n\t"
  165872. "ldr %[b], [%[b], #48]\n\t"
  165873. "uxth r6, %[a]\n\t"
  165874. "uxth r7, %[b]\n\t"
  165875. #ifdef WOLFSSL_KEIL
  165876. "muls r7, r6, r7\n\t"
  165877. #elif defined(__clang__)
  165878. "muls r7, r6\n\t"
  165879. #else
  165880. "mul r7, r6\n\t"
  165881. #endif
  165882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165883. "adds r5, r5, r7\n\t"
  165884. #else
  165885. "add r5, r5, r7\n\t"
  165886. #endif
  165887. #ifdef WOLFSSL_KEIL
  165888. "adcs r3, r3, %[r]\n\t"
  165889. #elif defined(__clang__)
  165890. "adcs r3, %[r]\n\t"
  165891. #else
  165892. "adc r3, %[r]\n\t"
  165893. #endif
  165894. #ifdef WOLFSSL_KEIL
  165895. "adcs r4, r4, %[r]\n\t"
  165896. #elif defined(__clang__)
  165897. "adcs r4, %[r]\n\t"
  165898. #else
  165899. "adc r4, %[r]\n\t"
  165900. #endif
  165901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165902. "lsrs r7, %[b], #16\n\t"
  165903. #else
  165904. "lsr r7, %[b], #16\n\t"
  165905. #endif
  165906. #ifdef WOLFSSL_KEIL
  165907. "muls r6, r7, r6\n\t"
  165908. #elif defined(__clang__)
  165909. "muls r6, r7\n\t"
  165910. #else
  165911. "mul r6, r7\n\t"
  165912. #endif
  165913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165914. "lsrs r7, r6, #16\n\t"
  165915. #else
  165916. "lsr r7, r6, #16\n\t"
  165917. #endif
  165918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165919. "lsls r6, r6, #16\n\t"
  165920. #else
  165921. "lsl r6, r6, #16\n\t"
  165922. #endif
  165923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165924. "adds r5, r5, r6\n\t"
  165925. #else
  165926. "add r5, r5, r6\n\t"
  165927. #endif
  165928. #ifdef WOLFSSL_KEIL
  165929. "adcs r3, r3, r7\n\t"
  165930. #elif defined(__clang__)
  165931. "adcs r3, r7\n\t"
  165932. #else
  165933. "adc r3, r7\n\t"
  165934. #endif
  165935. #ifdef WOLFSSL_KEIL
  165936. "adcs r4, r4, %[r]\n\t"
  165937. #elif defined(__clang__)
  165938. "adcs r4, %[r]\n\t"
  165939. #else
  165940. "adc r4, %[r]\n\t"
  165941. #endif
  165942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165943. "lsrs r6, %[a], #16\n\t"
  165944. #else
  165945. "lsr r6, %[a], #16\n\t"
  165946. #endif
  165947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165948. "lsrs r7, %[b], #16\n\t"
  165949. #else
  165950. "lsr r7, %[b], #16\n\t"
  165951. #endif
  165952. #ifdef WOLFSSL_KEIL
  165953. "muls r7, r6, r7\n\t"
  165954. #elif defined(__clang__)
  165955. "muls r7, r6\n\t"
  165956. #else
  165957. "mul r7, r6\n\t"
  165958. #endif
  165959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165960. "adds r3, r3, r7\n\t"
  165961. #else
  165962. "add r3, r3, r7\n\t"
  165963. #endif
  165964. #ifdef WOLFSSL_KEIL
  165965. "adcs r4, r4, %[r]\n\t"
  165966. #elif defined(__clang__)
  165967. "adcs r4, %[r]\n\t"
  165968. #else
  165969. "adc r4, %[r]\n\t"
  165970. #endif
  165971. "uxth r7, %[b]\n\t"
  165972. #ifdef WOLFSSL_KEIL
  165973. "muls r6, r7, r6\n\t"
  165974. #elif defined(__clang__)
  165975. "muls r6, r7\n\t"
  165976. #else
  165977. "mul r6, r7\n\t"
  165978. #endif
  165979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165980. "lsrs r7, r6, #16\n\t"
  165981. #else
  165982. "lsr r7, r6, #16\n\t"
  165983. #endif
  165984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165985. "lsls r6, r6, #16\n\t"
  165986. #else
  165987. "lsl r6, r6, #16\n\t"
  165988. #endif
  165989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165990. "adds r5, r5, r6\n\t"
  165991. #else
  165992. "add r5, r5, r6\n\t"
  165993. #endif
  165994. #ifdef WOLFSSL_KEIL
  165995. "adcs r3, r3, r7\n\t"
  165996. #elif defined(__clang__)
  165997. "adcs r3, r7\n\t"
  165998. #else
  165999. "adc r3, r7\n\t"
  166000. #endif
  166001. #ifdef WOLFSSL_KEIL
  166002. "adcs r4, r4, %[r]\n\t"
  166003. #elif defined(__clang__)
  166004. "adcs r4, %[r]\n\t"
  166005. #else
  166006. "adc r4, %[r]\n\t"
  166007. #endif
  166008. "# A[12] * B[11]\n\t"
  166009. "mov %[a], r9\n\t"
  166010. "mov %[b], r10\n\t"
  166011. "ldr %[a], [%[a], #48]\n\t"
  166012. "ldr %[b], [%[b], #44]\n\t"
  166013. "uxth r6, %[a]\n\t"
  166014. "uxth r7, %[b]\n\t"
  166015. #ifdef WOLFSSL_KEIL
  166016. "muls r7, r6, r7\n\t"
  166017. #elif defined(__clang__)
  166018. "muls r7, r6\n\t"
  166019. #else
  166020. "mul r7, r6\n\t"
  166021. #endif
  166022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166023. "adds r5, r5, r7\n\t"
  166024. #else
  166025. "add r5, r5, r7\n\t"
  166026. #endif
  166027. #ifdef WOLFSSL_KEIL
  166028. "adcs r3, r3, %[r]\n\t"
  166029. #elif defined(__clang__)
  166030. "adcs r3, %[r]\n\t"
  166031. #else
  166032. "adc r3, %[r]\n\t"
  166033. #endif
  166034. #ifdef WOLFSSL_KEIL
  166035. "adcs r4, r4, %[r]\n\t"
  166036. #elif defined(__clang__)
  166037. "adcs r4, %[r]\n\t"
  166038. #else
  166039. "adc r4, %[r]\n\t"
  166040. #endif
  166041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166042. "lsrs r7, %[b], #16\n\t"
  166043. #else
  166044. "lsr r7, %[b], #16\n\t"
  166045. #endif
  166046. #ifdef WOLFSSL_KEIL
  166047. "muls r6, r7, r6\n\t"
  166048. #elif defined(__clang__)
  166049. "muls r6, r7\n\t"
  166050. #else
  166051. "mul r6, r7\n\t"
  166052. #endif
  166053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166054. "lsrs r7, r6, #16\n\t"
  166055. #else
  166056. "lsr r7, r6, #16\n\t"
  166057. #endif
  166058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166059. "lsls r6, r6, #16\n\t"
  166060. #else
  166061. "lsl r6, r6, #16\n\t"
  166062. #endif
  166063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166064. "adds r5, r5, r6\n\t"
  166065. #else
  166066. "add r5, r5, r6\n\t"
  166067. #endif
  166068. #ifdef WOLFSSL_KEIL
  166069. "adcs r3, r3, r7\n\t"
  166070. #elif defined(__clang__)
  166071. "adcs r3, r7\n\t"
  166072. #else
  166073. "adc r3, r7\n\t"
  166074. #endif
  166075. #ifdef WOLFSSL_KEIL
  166076. "adcs r4, r4, %[r]\n\t"
  166077. #elif defined(__clang__)
  166078. "adcs r4, %[r]\n\t"
  166079. #else
  166080. "adc r4, %[r]\n\t"
  166081. #endif
  166082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166083. "lsrs r6, %[a], #16\n\t"
  166084. #else
  166085. "lsr r6, %[a], #16\n\t"
  166086. #endif
  166087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166088. "lsrs r7, %[b], #16\n\t"
  166089. #else
  166090. "lsr r7, %[b], #16\n\t"
  166091. #endif
  166092. #ifdef WOLFSSL_KEIL
  166093. "muls r7, r6, r7\n\t"
  166094. #elif defined(__clang__)
  166095. "muls r7, r6\n\t"
  166096. #else
  166097. "mul r7, r6\n\t"
  166098. #endif
  166099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166100. "adds r3, r3, r7\n\t"
  166101. #else
  166102. "add r3, r3, r7\n\t"
  166103. #endif
  166104. #ifdef WOLFSSL_KEIL
  166105. "adcs r4, r4, %[r]\n\t"
  166106. #elif defined(__clang__)
  166107. "adcs r4, %[r]\n\t"
  166108. #else
  166109. "adc r4, %[r]\n\t"
  166110. #endif
  166111. "uxth r7, %[b]\n\t"
  166112. #ifdef WOLFSSL_KEIL
  166113. "muls r6, r7, r6\n\t"
  166114. #elif defined(__clang__)
  166115. "muls r6, r7\n\t"
  166116. #else
  166117. "mul r6, r7\n\t"
  166118. #endif
  166119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166120. "lsrs r7, r6, #16\n\t"
  166121. #else
  166122. "lsr r7, r6, #16\n\t"
  166123. #endif
  166124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166125. "lsls r6, r6, #16\n\t"
  166126. #else
  166127. "lsl r6, r6, #16\n\t"
  166128. #endif
  166129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166130. "adds r5, r5, r6\n\t"
  166131. #else
  166132. "add r5, r5, r6\n\t"
  166133. #endif
  166134. #ifdef WOLFSSL_KEIL
  166135. "adcs r3, r3, r7\n\t"
  166136. #elif defined(__clang__)
  166137. "adcs r3, r7\n\t"
  166138. #else
  166139. "adc r3, r7\n\t"
  166140. #endif
  166141. #ifdef WOLFSSL_KEIL
  166142. "adcs r4, r4, %[r]\n\t"
  166143. #elif defined(__clang__)
  166144. "adcs r4, %[r]\n\t"
  166145. #else
  166146. "adc r4, %[r]\n\t"
  166147. #endif
  166148. "# A[13] * B[10]\n\t"
  166149. "mov %[a], r9\n\t"
  166150. "mov %[b], r10\n\t"
  166151. "ldr %[a], [%[a], #52]\n\t"
  166152. "ldr %[b], [%[b], #40]\n\t"
  166153. "uxth r6, %[a]\n\t"
  166154. "uxth r7, %[b]\n\t"
  166155. #ifdef WOLFSSL_KEIL
  166156. "muls r7, r6, r7\n\t"
  166157. #elif defined(__clang__)
  166158. "muls r7, r6\n\t"
  166159. #else
  166160. "mul r7, r6\n\t"
  166161. #endif
  166162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166163. "adds r5, r5, r7\n\t"
  166164. #else
  166165. "add r5, r5, r7\n\t"
  166166. #endif
  166167. #ifdef WOLFSSL_KEIL
  166168. "adcs r3, r3, %[r]\n\t"
  166169. #elif defined(__clang__)
  166170. "adcs r3, %[r]\n\t"
  166171. #else
  166172. "adc r3, %[r]\n\t"
  166173. #endif
  166174. #ifdef WOLFSSL_KEIL
  166175. "adcs r4, r4, %[r]\n\t"
  166176. #elif defined(__clang__)
  166177. "adcs r4, %[r]\n\t"
  166178. #else
  166179. "adc r4, %[r]\n\t"
  166180. #endif
  166181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166182. "lsrs r7, %[b], #16\n\t"
  166183. #else
  166184. "lsr r7, %[b], #16\n\t"
  166185. #endif
  166186. #ifdef WOLFSSL_KEIL
  166187. "muls r6, r7, r6\n\t"
  166188. #elif defined(__clang__)
  166189. "muls r6, r7\n\t"
  166190. #else
  166191. "mul r6, r7\n\t"
  166192. #endif
  166193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166194. "lsrs r7, r6, #16\n\t"
  166195. #else
  166196. "lsr r7, r6, #16\n\t"
  166197. #endif
  166198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166199. "lsls r6, r6, #16\n\t"
  166200. #else
  166201. "lsl r6, r6, #16\n\t"
  166202. #endif
  166203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166204. "adds r5, r5, r6\n\t"
  166205. #else
  166206. "add r5, r5, r6\n\t"
  166207. #endif
  166208. #ifdef WOLFSSL_KEIL
  166209. "adcs r3, r3, r7\n\t"
  166210. #elif defined(__clang__)
  166211. "adcs r3, r7\n\t"
  166212. #else
  166213. "adc r3, r7\n\t"
  166214. #endif
  166215. #ifdef WOLFSSL_KEIL
  166216. "adcs r4, r4, %[r]\n\t"
  166217. #elif defined(__clang__)
  166218. "adcs r4, %[r]\n\t"
  166219. #else
  166220. "adc r4, %[r]\n\t"
  166221. #endif
  166222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166223. "lsrs r6, %[a], #16\n\t"
  166224. #else
  166225. "lsr r6, %[a], #16\n\t"
  166226. #endif
  166227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166228. "lsrs r7, %[b], #16\n\t"
  166229. #else
  166230. "lsr r7, %[b], #16\n\t"
  166231. #endif
  166232. #ifdef WOLFSSL_KEIL
  166233. "muls r7, r6, r7\n\t"
  166234. #elif defined(__clang__)
  166235. "muls r7, r6\n\t"
  166236. #else
  166237. "mul r7, r6\n\t"
  166238. #endif
  166239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166240. "adds r3, r3, r7\n\t"
  166241. #else
  166242. "add r3, r3, r7\n\t"
  166243. #endif
  166244. #ifdef WOLFSSL_KEIL
  166245. "adcs r4, r4, %[r]\n\t"
  166246. #elif defined(__clang__)
  166247. "adcs r4, %[r]\n\t"
  166248. #else
  166249. "adc r4, %[r]\n\t"
  166250. #endif
  166251. "uxth r7, %[b]\n\t"
  166252. #ifdef WOLFSSL_KEIL
  166253. "muls r6, r7, r6\n\t"
  166254. #elif defined(__clang__)
  166255. "muls r6, r7\n\t"
  166256. #else
  166257. "mul r6, r7\n\t"
  166258. #endif
  166259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166260. "lsrs r7, r6, #16\n\t"
  166261. #else
  166262. "lsr r7, r6, #16\n\t"
  166263. #endif
  166264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166265. "lsls r6, r6, #16\n\t"
  166266. #else
  166267. "lsl r6, r6, #16\n\t"
  166268. #endif
  166269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166270. "adds r5, r5, r6\n\t"
  166271. #else
  166272. "add r5, r5, r6\n\t"
  166273. #endif
  166274. #ifdef WOLFSSL_KEIL
  166275. "adcs r3, r3, r7\n\t"
  166276. #elif defined(__clang__)
  166277. "adcs r3, r7\n\t"
  166278. #else
  166279. "adc r3, r7\n\t"
  166280. #endif
  166281. #ifdef WOLFSSL_KEIL
  166282. "adcs r4, r4, %[r]\n\t"
  166283. #elif defined(__clang__)
  166284. "adcs r4, %[r]\n\t"
  166285. #else
  166286. "adc r4, %[r]\n\t"
  166287. #endif
  166288. "# A[14] * B[9]\n\t"
  166289. "mov %[a], r9\n\t"
  166290. "mov %[b], r10\n\t"
  166291. "ldr %[a], [%[a], #56]\n\t"
  166292. "ldr %[b], [%[b], #36]\n\t"
  166293. "uxth r6, %[a]\n\t"
  166294. "uxth r7, %[b]\n\t"
  166295. #ifdef WOLFSSL_KEIL
  166296. "muls r7, r6, r7\n\t"
  166297. #elif defined(__clang__)
  166298. "muls r7, r6\n\t"
  166299. #else
  166300. "mul r7, r6\n\t"
  166301. #endif
  166302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166303. "adds r5, r5, r7\n\t"
  166304. #else
  166305. "add r5, r5, r7\n\t"
  166306. #endif
  166307. #ifdef WOLFSSL_KEIL
  166308. "adcs r3, r3, %[r]\n\t"
  166309. #elif defined(__clang__)
  166310. "adcs r3, %[r]\n\t"
  166311. #else
  166312. "adc r3, %[r]\n\t"
  166313. #endif
  166314. #ifdef WOLFSSL_KEIL
  166315. "adcs r4, r4, %[r]\n\t"
  166316. #elif defined(__clang__)
  166317. "adcs r4, %[r]\n\t"
  166318. #else
  166319. "adc r4, %[r]\n\t"
  166320. #endif
  166321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166322. "lsrs r7, %[b], #16\n\t"
  166323. #else
  166324. "lsr r7, %[b], #16\n\t"
  166325. #endif
  166326. #ifdef WOLFSSL_KEIL
  166327. "muls r6, r7, r6\n\t"
  166328. #elif defined(__clang__)
  166329. "muls r6, r7\n\t"
  166330. #else
  166331. "mul r6, r7\n\t"
  166332. #endif
  166333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166334. "lsrs r7, r6, #16\n\t"
  166335. #else
  166336. "lsr r7, r6, #16\n\t"
  166337. #endif
  166338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166339. "lsls r6, r6, #16\n\t"
  166340. #else
  166341. "lsl r6, r6, #16\n\t"
  166342. #endif
  166343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166344. "adds r5, r5, r6\n\t"
  166345. #else
  166346. "add r5, r5, r6\n\t"
  166347. #endif
  166348. #ifdef WOLFSSL_KEIL
  166349. "adcs r3, r3, r7\n\t"
  166350. #elif defined(__clang__)
  166351. "adcs r3, r7\n\t"
  166352. #else
  166353. "adc r3, r7\n\t"
  166354. #endif
  166355. #ifdef WOLFSSL_KEIL
  166356. "adcs r4, r4, %[r]\n\t"
  166357. #elif defined(__clang__)
  166358. "adcs r4, %[r]\n\t"
  166359. #else
  166360. "adc r4, %[r]\n\t"
  166361. #endif
  166362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166363. "lsrs r6, %[a], #16\n\t"
  166364. #else
  166365. "lsr r6, %[a], #16\n\t"
  166366. #endif
  166367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166368. "lsrs r7, %[b], #16\n\t"
  166369. #else
  166370. "lsr r7, %[b], #16\n\t"
  166371. #endif
  166372. #ifdef WOLFSSL_KEIL
  166373. "muls r7, r6, r7\n\t"
  166374. #elif defined(__clang__)
  166375. "muls r7, r6\n\t"
  166376. #else
  166377. "mul r7, r6\n\t"
  166378. #endif
  166379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166380. "adds r3, r3, r7\n\t"
  166381. #else
  166382. "add r3, r3, r7\n\t"
  166383. #endif
  166384. #ifdef WOLFSSL_KEIL
  166385. "adcs r4, r4, %[r]\n\t"
  166386. #elif defined(__clang__)
  166387. "adcs r4, %[r]\n\t"
  166388. #else
  166389. "adc r4, %[r]\n\t"
  166390. #endif
  166391. "uxth r7, %[b]\n\t"
  166392. #ifdef WOLFSSL_KEIL
  166393. "muls r6, r7, r6\n\t"
  166394. #elif defined(__clang__)
  166395. "muls r6, r7\n\t"
  166396. #else
  166397. "mul r6, r7\n\t"
  166398. #endif
  166399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166400. "lsrs r7, r6, #16\n\t"
  166401. #else
  166402. "lsr r7, r6, #16\n\t"
  166403. #endif
  166404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166405. "lsls r6, r6, #16\n\t"
  166406. #else
  166407. "lsl r6, r6, #16\n\t"
  166408. #endif
  166409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166410. "adds r5, r5, r6\n\t"
  166411. #else
  166412. "add r5, r5, r6\n\t"
  166413. #endif
  166414. #ifdef WOLFSSL_KEIL
  166415. "adcs r3, r3, r7\n\t"
  166416. #elif defined(__clang__)
  166417. "adcs r3, r7\n\t"
  166418. #else
  166419. "adc r3, r7\n\t"
  166420. #endif
  166421. #ifdef WOLFSSL_KEIL
  166422. "adcs r4, r4, %[r]\n\t"
  166423. #elif defined(__clang__)
  166424. "adcs r4, %[r]\n\t"
  166425. #else
  166426. "adc r4, %[r]\n\t"
  166427. #endif
  166428. "# A[15] * B[8]\n\t"
  166429. "mov %[a], r9\n\t"
  166430. "mov %[b], r10\n\t"
  166431. "ldr %[a], [%[a], #60]\n\t"
  166432. "ldr %[b], [%[b], #32]\n\t"
  166433. "uxth r6, %[a]\n\t"
  166434. "uxth r7, %[b]\n\t"
  166435. #ifdef WOLFSSL_KEIL
  166436. "muls r7, r6, r7\n\t"
  166437. #elif defined(__clang__)
  166438. "muls r7, r6\n\t"
  166439. #else
  166440. "mul r7, r6\n\t"
  166441. #endif
  166442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166443. "adds r5, r5, r7\n\t"
  166444. #else
  166445. "add r5, r5, r7\n\t"
  166446. #endif
  166447. #ifdef WOLFSSL_KEIL
  166448. "adcs r3, r3, %[r]\n\t"
  166449. #elif defined(__clang__)
  166450. "adcs r3, %[r]\n\t"
  166451. #else
  166452. "adc r3, %[r]\n\t"
  166453. #endif
  166454. #ifdef WOLFSSL_KEIL
  166455. "adcs r4, r4, %[r]\n\t"
  166456. #elif defined(__clang__)
  166457. "adcs r4, %[r]\n\t"
  166458. #else
  166459. "adc r4, %[r]\n\t"
  166460. #endif
  166461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166462. "lsrs r7, %[b], #16\n\t"
  166463. #else
  166464. "lsr r7, %[b], #16\n\t"
  166465. #endif
  166466. #ifdef WOLFSSL_KEIL
  166467. "muls r6, r7, r6\n\t"
  166468. #elif defined(__clang__)
  166469. "muls r6, r7\n\t"
  166470. #else
  166471. "mul r6, r7\n\t"
  166472. #endif
  166473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166474. "lsrs r7, r6, #16\n\t"
  166475. #else
  166476. "lsr r7, r6, #16\n\t"
  166477. #endif
  166478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166479. "lsls r6, r6, #16\n\t"
  166480. #else
  166481. "lsl r6, r6, #16\n\t"
  166482. #endif
  166483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166484. "adds r5, r5, r6\n\t"
  166485. #else
  166486. "add r5, r5, r6\n\t"
  166487. #endif
  166488. #ifdef WOLFSSL_KEIL
  166489. "adcs r3, r3, r7\n\t"
  166490. #elif defined(__clang__)
  166491. "adcs r3, r7\n\t"
  166492. #else
  166493. "adc r3, r7\n\t"
  166494. #endif
  166495. #ifdef WOLFSSL_KEIL
  166496. "adcs r4, r4, %[r]\n\t"
  166497. #elif defined(__clang__)
  166498. "adcs r4, %[r]\n\t"
  166499. #else
  166500. "adc r4, %[r]\n\t"
  166501. #endif
  166502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166503. "lsrs r6, %[a], #16\n\t"
  166504. #else
  166505. "lsr r6, %[a], #16\n\t"
  166506. #endif
  166507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166508. "lsrs r7, %[b], #16\n\t"
  166509. #else
  166510. "lsr r7, %[b], #16\n\t"
  166511. #endif
  166512. #ifdef WOLFSSL_KEIL
  166513. "muls r7, r6, r7\n\t"
  166514. #elif defined(__clang__)
  166515. "muls r7, r6\n\t"
  166516. #else
  166517. "mul r7, r6\n\t"
  166518. #endif
  166519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166520. "adds r3, r3, r7\n\t"
  166521. #else
  166522. "add r3, r3, r7\n\t"
  166523. #endif
  166524. #ifdef WOLFSSL_KEIL
  166525. "adcs r4, r4, %[r]\n\t"
  166526. #elif defined(__clang__)
  166527. "adcs r4, %[r]\n\t"
  166528. #else
  166529. "adc r4, %[r]\n\t"
  166530. #endif
  166531. "uxth r7, %[b]\n\t"
  166532. #ifdef WOLFSSL_KEIL
  166533. "muls r6, r7, r6\n\t"
  166534. #elif defined(__clang__)
  166535. "muls r6, r7\n\t"
  166536. #else
  166537. "mul r6, r7\n\t"
  166538. #endif
  166539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166540. "lsrs r7, r6, #16\n\t"
  166541. #else
  166542. "lsr r7, r6, #16\n\t"
  166543. #endif
  166544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166545. "lsls r6, r6, #16\n\t"
  166546. #else
  166547. "lsl r6, r6, #16\n\t"
  166548. #endif
  166549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166550. "adds r5, r5, r6\n\t"
  166551. #else
  166552. "add r5, r5, r6\n\t"
  166553. #endif
  166554. #ifdef WOLFSSL_KEIL
  166555. "adcs r3, r3, r7\n\t"
  166556. #elif defined(__clang__)
  166557. "adcs r3, r7\n\t"
  166558. #else
  166559. "adc r3, r7\n\t"
  166560. #endif
  166561. #ifdef WOLFSSL_KEIL
  166562. "adcs r4, r4, %[r]\n\t"
  166563. #elif defined(__clang__)
  166564. "adcs r4, %[r]\n\t"
  166565. #else
  166566. "adc r4, %[r]\n\t"
  166567. #endif
  166568. "mov %[r], r8\n\t"
  166569. "str r5, [%[r], #92]\n\t"
  166570. "movs %[r], #0\n\t"
  166571. "# A[15] * B[9]\n\t"
  166572. "movs r5, #0\n\t"
  166573. "mov %[a], r9\n\t"
  166574. "mov %[b], r10\n\t"
  166575. "ldr %[a], [%[a], #60]\n\t"
  166576. "ldr %[b], [%[b], #36]\n\t"
  166577. "uxth r6, %[a]\n\t"
  166578. "uxth r7, %[b]\n\t"
  166579. #ifdef WOLFSSL_KEIL
  166580. "muls r7, r6, r7\n\t"
  166581. #elif defined(__clang__)
  166582. "muls r7, r6\n\t"
  166583. #else
  166584. "mul r7, r6\n\t"
  166585. #endif
  166586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166587. "adds r3, r3, r7\n\t"
  166588. #else
  166589. "add r3, r3, r7\n\t"
  166590. #endif
  166591. #ifdef WOLFSSL_KEIL
  166592. "adcs r4, r4, %[r]\n\t"
  166593. #elif defined(__clang__)
  166594. "adcs r4, %[r]\n\t"
  166595. #else
  166596. "adc r4, %[r]\n\t"
  166597. #endif
  166598. #ifdef WOLFSSL_KEIL
  166599. "adcs r5, r5, %[r]\n\t"
  166600. #elif defined(__clang__)
  166601. "adcs r5, %[r]\n\t"
  166602. #else
  166603. "adc r5, %[r]\n\t"
  166604. #endif
  166605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166606. "lsrs r7, %[b], #16\n\t"
  166607. #else
  166608. "lsr r7, %[b], #16\n\t"
  166609. #endif
  166610. #ifdef WOLFSSL_KEIL
  166611. "muls r6, r7, r6\n\t"
  166612. #elif defined(__clang__)
  166613. "muls r6, r7\n\t"
  166614. #else
  166615. "mul r6, r7\n\t"
  166616. #endif
  166617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166618. "lsrs r7, r6, #16\n\t"
  166619. #else
  166620. "lsr r7, r6, #16\n\t"
  166621. #endif
  166622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166623. "lsls r6, r6, #16\n\t"
  166624. #else
  166625. "lsl r6, r6, #16\n\t"
  166626. #endif
  166627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166628. "adds r3, r3, r6\n\t"
  166629. #else
  166630. "add r3, r3, r6\n\t"
  166631. #endif
  166632. #ifdef WOLFSSL_KEIL
  166633. "adcs r4, r4, r7\n\t"
  166634. #elif defined(__clang__)
  166635. "adcs r4, r7\n\t"
  166636. #else
  166637. "adc r4, r7\n\t"
  166638. #endif
  166639. #ifdef WOLFSSL_KEIL
  166640. "adcs r5, r5, %[r]\n\t"
  166641. #elif defined(__clang__)
  166642. "adcs r5, %[r]\n\t"
  166643. #else
  166644. "adc r5, %[r]\n\t"
  166645. #endif
  166646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166647. "lsrs r6, %[a], #16\n\t"
  166648. #else
  166649. "lsr r6, %[a], #16\n\t"
  166650. #endif
  166651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166652. "lsrs r7, %[b], #16\n\t"
  166653. #else
  166654. "lsr r7, %[b], #16\n\t"
  166655. #endif
  166656. #ifdef WOLFSSL_KEIL
  166657. "muls r7, r6, r7\n\t"
  166658. #elif defined(__clang__)
  166659. "muls r7, r6\n\t"
  166660. #else
  166661. "mul r7, r6\n\t"
  166662. #endif
  166663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166664. "adds r4, r4, r7\n\t"
  166665. #else
  166666. "add r4, r4, r7\n\t"
  166667. #endif
  166668. #ifdef WOLFSSL_KEIL
  166669. "adcs r5, r5, %[r]\n\t"
  166670. #elif defined(__clang__)
  166671. "adcs r5, %[r]\n\t"
  166672. #else
  166673. "adc r5, %[r]\n\t"
  166674. #endif
  166675. "uxth r7, %[b]\n\t"
  166676. #ifdef WOLFSSL_KEIL
  166677. "muls r6, r7, r6\n\t"
  166678. #elif defined(__clang__)
  166679. "muls r6, r7\n\t"
  166680. #else
  166681. "mul r6, r7\n\t"
  166682. #endif
  166683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166684. "lsrs r7, r6, #16\n\t"
  166685. #else
  166686. "lsr r7, r6, #16\n\t"
  166687. #endif
  166688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166689. "lsls r6, r6, #16\n\t"
  166690. #else
  166691. "lsl r6, r6, #16\n\t"
  166692. #endif
  166693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166694. "adds r3, r3, r6\n\t"
  166695. #else
  166696. "add r3, r3, r6\n\t"
  166697. #endif
  166698. #ifdef WOLFSSL_KEIL
  166699. "adcs r4, r4, r7\n\t"
  166700. #elif defined(__clang__)
  166701. "adcs r4, r7\n\t"
  166702. #else
  166703. "adc r4, r7\n\t"
  166704. #endif
  166705. #ifdef WOLFSSL_KEIL
  166706. "adcs r5, r5, %[r]\n\t"
  166707. #elif defined(__clang__)
  166708. "adcs r5, %[r]\n\t"
  166709. #else
  166710. "adc r5, %[r]\n\t"
  166711. #endif
  166712. "# A[14] * B[10]\n\t"
  166713. "mov %[a], r9\n\t"
  166714. "mov %[b], r10\n\t"
  166715. "ldr %[a], [%[a], #56]\n\t"
  166716. "ldr %[b], [%[b], #40]\n\t"
  166717. "uxth r6, %[a]\n\t"
  166718. "uxth r7, %[b]\n\t"
  166719. #ifdef WOLFSSL_KEIL
  166720. "muls r7, r6, r7\n\t"
  166721. #elif defined(__clang__)
  166722. "muls r7, r6\n\t"
  166723. #else
  166724. "mul r7, r6\n\t"
  166725. #endif
  166726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166727. "adds r3, r3, r7\n\t"
  166728. #else
  166729. "add r3, r3, r7\n\t"
  166730. #endif
  166731. #ifdef WOLFSSL_KEIL
  166732. "adcs r4, r4, %[r]\n\t"
  166733. #elif defined(__clang__)
  166734. "adcs r4, %[r]\n\t"
  166735. #else
  166736. "adc r4, %[r]\n\t"
  166737. #endif
  166738. #ifdef WOLFSSL_KEIL
  166739. "adcs r5, r5, %[r]\n\t"
  166740. #elif defined(__clang__)
  166741. "adcs r5, %[r]\n\t"
  166742. #else
  166743. "adc r5, %[r]\n\t"
  166744. #endif
  166745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166746. "lsrs r7, %[b], #16\n\t"
  166747. #else
  166748. "lsr r7, %[b], #16\n\t"
  166749. #endif
  166750. #ifdef WOLFSSL_KEIL
  166751. "muls r6, r7, r6\n\t"
  166752. #elif defined(__clang__)
  166753. "muls r6, r7\n\t"
  166754. #else
  166755. "mul r6, r7\n\t"
  166756. #endif
  166757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166758. "lsrs r7, r6, #16\n\t"
  166759. #else
  166760. "lsr r7, r6, #16\n\t"
  166761. #endif
  166762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166763. "lsls r6, r6, #16\n\t"
  166764. #else
  166765. "lsl r6, r6, #16\n\t"
  166766. #endif
  166767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166768. "adds r3, r3, r6\n\t"
  166769. #else
  166770. "add r3, r3, r6\n\t"
  166771. #endif
  166772. #ifdef WOLFSSL_KEIL
  166773. "adcs r4, r4, r7\n\t"
  166774. #elif defined(__clang__)
  166775. "adcs r4, r7\n\t"
  166776. #else
  166777. "adc r4, r7\n\t"
  166778. #endif
  166779. #ifdef WOLFSSL_KEIL
  166780. "adcs r5, r5, %[r]\n\t"
  166781. #elif defined(__clang__)
  166782. "adcs r5, %[r]\n\t"
  166783. #else
  166784. "adc r5, %[r]\n\t"
  166785. #endif
  166786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166787. "lsrs r6, %[a], #16\n\t"
  166788. #else
  166789. "lsr r6, %[a], #16\n\t"
  166790. #endif
  166791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166792. "lsrs r7, %[b], #16\n\t"
  166793. #else
  166794. "lsr r7, %[b], #16\n\t"
  166795. #endif
  166796. #ifdef WOLFSSL_KEIL
  166797. "muls r7, r6, r7\n\t"
  166798. #elif defined(__clang__)
  166799. "muls r7, r6\n\t"
  166800. #else
  166801. "mul r7, r6\n\t"
  166802. #endif
  166803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166804. "adds r4, r4, r7\n\t"
  166805. #else
  166806. "add r4, r4, r7\n\t"
  166807. #endif
  166808. #ifdef WOLFSSL_KEIL
  166809. "adcs r5, r5, %[r]\n\t"
  166810. #elif defined(__clang__)
  166811. "adcs r5, %[r]\n\t"
  166812. #else
  166813. "adc r5, %[r]\n\t"
  166814. #endif
  166815. "uxth r7, %[b]\n\t"
  166816. #ifdef WOLFSSL_KEIL
  166817. "muls r6, r7, r6\n\t"
  166818. #elif defined(__clang__)
  166819. "muls r6, r7\n\t"
  166820. #else
  166821. "mul r6, r7\n\t"
  166822. #endif
  166823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166824. "lsrs r7, r6, #16\n\t"
  166825. #else
  166826. "lsr r7, r6, #16\n\t"
  166827. #endif
  166828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166829. "lsls r6, r6, #16\n\t"
  166830. #else
  166831. "lsl r6, r6, #16\n\t"
  166832. #endif
  166833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166834. "adds r3, r3, r6\n\t"
  166835. #else
  166836. "add r3, r3, r6\n\t"
  166837. #endif
  166838. #ifdef WOLFSSL_KEIL
  166839. "adcs r4, r4, r7\n\t"
  166840. #elif defined(__clang__)
  166841. "adcs r4, r7\n\t"
  166842. #else
  166843. "adc r4, r7\n\t"
  166844. #endif
  166845. #ifdef WOLFSSL_KEIL
  166846. "adcs r5, r5, %[r]\n\t"
  166847. #elif defined(__clang__)
  166848. "adcs r5, %[r]\n\t"
  166849. #else
  166850. "adc r5, %[r]\n\t"
  166851. #endif
  166852. "# A[13] * B[11]\n\t"
  166853. "mov %[a], r9\n\t"
  166854. "mov %[b], r10\n\t"
  166855. "ldr %[a], [%[a], #52]\n\t"
  166856. "ldr %[b], [%[b], #44]\n\t"
  166857. "uxth r6, %[a]\n\t"
  166858. "uxth r7, %[b]\n\t"
  166859. #ifdef WOLFSSL_KEIL
  166860. "muls r7, r6, r7\n\t"
  166861. #elif defined(__clang__)
  166862. "muls r7, r6\n\t"
  166863. #else
  166864. "mul r7, r6\n\t"
  166865. #endif
  166866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166867. "adds r3, r3, r7\n\t"
  166868. #else
  166869. "add r3, r3, r7\n\t"
  166870. #endif
  166871. #ifdef WOLFSSL_KEIL
  166872. "adcs r4, r4, %[r]\n\t"
  166873. #elif defined(__clang__)
  166874. "adcs r4, %[r]\n\t"
  166875. #else
  166876. "adc r4, %[r]\n\t"
  166877. #endif
  166878. #ifdef WOLFSSL_KEIL
  166879. "adcs r5, r5, %[r]\n\t"
  166880. #elif defined(__clang__)
  166881. "adcs r5, %[r]\n\t"
  166882. #else
  166883. "adc r5, %[r]\n\t"
  166884. #endif
  166885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166886. "lsrs r7, %[b], #16\n\t"
  166887. #else
  166888. "lsr r7, %[b], #16\n\t"
  166889. #endif
  166890. #ifdef WOLFSSL_KEIL
  166891. "muls r6, r7, r6\n\t"
  166892. #elif defined(__clang__)
  166893. "muls r6, r7\n\t"
  166894. #else
  166895. "mul r6, r7\n\t"
  166896. #endif
  166897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166898. "lsrs r7, r6, #16\n\t"
  166899. #else
  166900. "lsr r7, r6, #16\n\t"
  166901. #endif
  166902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166903. "lsls r6, r6, #16\n\t"
  166904. #else
  166905. "lsl r6, r6, #16\n\t"
  166906. #endif
  166907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166908. "adds r3, r3, r6\n\t"
  166909. #else
  166910. "add r3, r3, r6\n\t"
  166911. #endif
  166912. #ifdef WOLFSSL_KEIL
  166913. "adcs r4, r4, r7\n\t"
  166914. #elif defined(__clang__)
  166915. "adcs r4, r7\n\t"
  166916. #else
  166917. "adc r4, r7\n\t"
  166918. #endif
  166919. #ifdef WOLFSSL_KEIL
  166920. "adcs r5, r5, %[r]\n\t"
  166921. #elif defined(__clang__)
  166922. "adcs r5, %[r]\n\t"
  166923. #else
  166924. "adc r5, %[r]\n\t"
  166925. #endif
  166926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166927. "lsrs r6, %[a], #16\n\t"
  166928. #else
  166929. "lsr r6, %[a], #16\n\t"
  166930. #endif
  166931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166932. "lsrs r7, %[b], #16\n\t"
  166933. #else
  166934. "lsr r7, %[b], #16\n\t"
  166935. #endif
  166936. #ifdef WOLFSSL_KEIL
  166937. "muls r7, r6, r7\n\t"
  166938. #elif defined(__clang__)
  166939. "muls r7, r6\n\t"
  166940. #else
  166941. "mul r7, r6\n\t"
  166942. #endif
  166943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166944. "adds r4, r4, r7\n\t"
  166945. #else
  166946. "add r4, r4, r7\n\t"
  166947. #endif
  166948. #ifdef WOLFSSL_KEIL
  166949. "adcs r5, r5, %[r]\n\t"
  166950. #elif defined(__clang__)
  166951. "adcs r5, %[r]\n\t"
  166952. #else
  166953. "adc r5, %[r]\n\t"
  166954. #endif
  166955. "uxth r7, %[b]\n\t"
  166956. #ifdef WOLFSSL_KEIL
  166957. "muls r6, r7, r6\n\t"
  166958. #elif defined(__clang__)
  166959. "muls r6, r7\n\t"
  166960. #else
  166961. "mul r6, r7\n\t"
  166962. #endif
  166963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166964. "lsrs r7, r6, #16\n\t"
  166965. #else
  166966. "lsr r7, r6, #16\n\t"
  166967. #endif
  166968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166969. "lsls r6, r6, #16\n\t"
  166970. #else
  166971. "lsl r6, r6, #16\n\t"
  166972. #endif
  166973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166974. "adds r3, r3, r6\n\t"
  166975. #else
  166976. "add r3, r3, r6\n\t"
  166977. #endif
  166978. #ifdef WOLFSSL_KEIL
  166979. "adcs r4, r4, r7\n\t"
  166980. #elif defined(__clang__)
  166981. "adcs r4, r7\n\t"
  166982. #else
  166983. "adc r4, r7\n\t"
  166984. #endif
  166985. #ifdef WOLFSSL_KEIL
  166986. "adcs r5, r5, %[r]\n\t"
  166987. #elif defined(__clang__)
  166988. "adcs r5, %[r]\n\t"
  166989. #else
  166990. "adc r5, %[r]\n\t"
  166991. #endif
  166992. "# A[12] * B[12]\n\t"
  166993. "mov %[a], r9\n\t"
  166994. "mov %[b], r10\n\t"
  166995. "ldr %[a], [%[a], #48]\n\t"
  166996. "ldr %[b], [%[b], #48]\n\t"
  166997. "uxth r6, %[a]\n\t"
  166998. "uxth r7, %[b]\n\t"
  166999. #ifdef WOLFSSL_KEIL
  167000. "muls r7, r6, r7\n\t"
  167001. #elif defined(__clang__)
  167002. "muls r7, r6\n\t"
  167003. #else
  167004. "mul r7, r6\n\t"
  167005. #endif
  167006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167007. "adds r3, r3, r7\n\t"
  167008. #else
  167009. "add r3, r3, r7\n\t"
  167010. #endif
  167011. #ifdef WOLFSSL_KEIL
  167012. "adcs r4, r4, %[r]\n\t"
  167013. #elif defined(__clang__)
  167014. "adcs r4, %[r]\n\t"
  167015. #else
  167016. "adc r4, %[r]\n\t"
  167017. #endif
  167018. #ifdef WOLFSSL_KEIL
  167019. "adcs r5, r5, %[r]\n\t"
  167020. #elif defined(__clang__)
  167021. "adcs r5, %[r]\n\t"
  167022. #else
  167023. "adc r5, %[r]\n\t"
  167024. #endif
  167025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167026. "lsrs r7, %[b], #16\n\t"
  167027. #else
  167028. "lsr r7, %[b], #16\n\t"
  167029. #endif
  167030. #ifdef WOLFSSL_KEIL
  167031. "muls r6, r7, r6\n\t"
  167032. #elif defined(__clang__)
  167033. "muls r6, r7\n\t"
  167034. #else
  167035. "mul r6, r7\n\t"
  167036. #endif
  167037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167038. "lsrs r7, r6, #16\n\t"
  167039. #else
  167040. "lsr r7, r6, #16\n\t"
  167041. #endif
  167042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167043. "lsls r6, r6, #16\n\t"
  167044. #else
  167045. "lsl r6, r6, #16\n\t"
  167046. #endif
  167047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167048. "adds r3, r3, r6\n\t"
  167049. #else
  167050. "add r3, r3, r6\n\t"
  167051. #endif
  167052. #ifdef WOLFSSL_KEIL
  167053. "adcs r4, r4, r7\n\t"
  167054. #elif defined(__clang__)
  167055. "adcs r4, r7\n\t"
  167056. #else
  167057. "adc r4, r7\n\t"
  167058. #endif
  167059. #ifdef WOLFSSL_KEIL
  167060. "adcs r5, r5, %[r]\n\t"
  167061. #elif defined(__clang__)
  167062. "adcs r5, %[r]\n\t"
  167063. #else
  167064. "adc r5, %[r]\n\t"
  167065. #endif
  167066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167067. "lsrs r6, %[a], #16\n\t"
  167068. #else
  167069. "lsr r6, %[a], #16\n\t"
  167070. #endif
  167071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167072. "lsrs r7, %[b], #16\n\t"
  167073. #else
  167074. "lsr r7, %[b], #16\n\t"
  167075. #endif
  167076. #ifdef WOLFSSL_KEIL
  167077. "muls r7, r6, r7\n\t"
  167078. #elif defined(__clang__)
  167079. "muls r7, r6\n\t"
  167080. #else
  167081. "mul r7, r6\n\t"
  167082. #endif
  167083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167084. "adds r4, r4, r7\n\t"
  167085. #else
  167086. "add r4, r4, r7\n\t"
  167087. #endif
  167088. #ifdef WOLFSSL_KEIL
  167089. "adcs r5, r5, %[r]\n\t"
  167090. #elif defined(__clang__)
  167091. "adcs r5, %[r]\n\t"
  167092. #else
  167093. "adc r5, %[r]\n\t"
  167094. #endif
  167095. "uxth r7, %[b]\n\t"
  167096. #ifdef WOLFSSL_KEIL
  167097. "muls r6, r7, r6\n\t"
  167098. #elif defined(__clang__)
  167099. "muls r6, r7\n\t"
  167100. #else
  167101. "mul r6, r7\n\t"
  167102. #endif
  167103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167104. "lsrs r7, r6, #16\n\t"
  167105. #else
  167106. "lsr r7, r6, #16\n\t"
  167107. #endif
  167108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167109. "lsls r6, r6, #16\n\t"
  167110. #else
  167111. "lsl r6, r6, #16\n\t"
  167112. #endif
  167113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167114. "adds r3, r3, r6\n\t"
  167115. #else
  167116. "add r3, r3, r6\n\t"
  167117. #endif
  167118. #ifdef WOLFSSL_KEIL
  167119. "adcs r4, r4, r7\n\t"
  167120. #elif defined(__clang__)
  167121. "adcs r4, r7\n\t"
  167122. #else
  167123. "adc r4, r7\n\t"
  167124. #endif
  167125. #ifdef WOLFSSL_KEIL
  167126. "adcs r5, r5, %[r]\n\t"
  167127. #elif defined(__clang__)
  167128. "adcs r5, %[r]\n\t"
  167129. #else
  167130. "adc r5, %[r]\n\t"
  167131. #endif
  167132. "# A[11] * B[13]\n\t"
  167133. "mov %[a], r9\n\t"
  167134. "mov %[b], r10\n\t"
  167135. "ldr %[a], [%[a], #44]\n\t"
  167136. "ldr %[b], [%[b], #52]\n\t"
  167137. "uxth r6, %[a]\n\t"
  167138. "uxth r7, %[b]\n\t"
  167139. #ifdef WOLFSSL_KEIL
  167140. "muls r7, r6, r7\n\t"
  167141. #elif defined(__clang__)
  167142. "muls r7, r6\n\t"
  167143. #else
  167144. "mul r7, r6\n\t"
  167145. #endif
  167146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167147. "adds r3, r3, r7\n\t"
  167148. #else
  167149. "add r3, r3, r7\n\t"
  167150. #endif
  167151. #ifdef WOLFSSL_KEIL
  167152. "adcs r4, r4, %[r]\n\t"
  167153. #elif defined(__clang__)
  167154. "adcs r4, %[r]\n\t"
  167155. #else
  167156. "adc r4, %[r]\n\t"
  167157. #endif
  167158. #ifdef WOLFSSL_KEIL
  167159. "adcs r5, r5, %[r]\n\t"
  167160. #elif defined(__clang__)
  167161. "adcs r5, %[r]\n\t"
  167162. #else
  167163. "adc r5, %[r]\n\t"
  167164. #endif
  167165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167166. "lsrs r7, %[b], #16\n\t"
  167167. #else
  167168. "lsr r7, %[b], #16\n\t"
  167169. #endif
  167170. #ifdef WOLFSSL_KEIL
  167171. "muls r6, r7, r6\n\t"
  167172. #elif defined(__clang__)
  167173. "muls r6, r7\n\t"
  167174. #else
  167175. "mul r6, r7\n\t"
  167176. #endif
  167177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167178. "lsrs r7, r6, #16\n\t"
  167179. #else
  167180. "lsr r7, r6, #16\n\t"
  167181. #endif
  167182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167183. "lsls r6, r6, #16\n\t"
  167184. #else
  167185. "lsl r6, r6, #16\n\t"
  167186. #endif
  167187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167188. "adds r3, r3, r6\n\t"
  167189. #else
  167190. "add r3, r3, r6\n\t"
  167191. #endif
  167192. #ifdef WOLFSSL_KEIL
  167193. "adcs r4, r4, r7\n\t"
  167194. #elif defined(__clang__)
  167195. "adcs r4, r7\n\t"
  167196. #else
  167197. "adc r4, r7\n\t"
  167198. #endif
  167199. #ifdef WOLFSSL_KEIL
  167200. "adcs r5, r5, %[r]\n\t"
  167201. #elif defined(__clang__)
  167202. "adcs r5, %[r]\n\t"
  167203. #else
  167204. "adc r5, %[r]\n\t"
  167205. #endif
  167206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167207. "lsrs r6, %[a], #16\n\t"
  167208. #else
  167209. "lsr r6, %[a], #16\n\t"
  167210. #endif
  167211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167212. "lsrs r7, %[b], #16\n\t"
  167213. #else
  167214. "lsr r7, %[b], #16\n\t"
  167215. #endif
  167216. #ifdef WOLFSSL_KEIL
  167217. "muls r7, r6, r7\n\t"
  167218. #elif defined(__clang__)
  167219. "muls r7, r6\n\t"
  167220. #else
  167221. "mul r7, r6\n\t"
  167222. #endif
  167223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167224. "adds r4, r4, r7\n\t"
  167225. #else
  167226. "add r4, r4, r7\n\t"
  167227. #endif
  167228. #ifdef WOLFSSL_KEIL
  167229. "adcs r5, r5, %[r]\n\t"
  167230. #elif defined(__clang__)
  167231. "adcs r5, %[r]\n\t"
  167232. #else
  167233. "adc r5, %[r]\n\t"
  167234. #endif
  167235. "uxth r7, %[b]\n\t"
  167236. #ifdef WOLFSSL_KEIL
  167237. "muls r6, r7, r6\n\t"
  167238. #elif defined(__clang__)
  167239. "muls r6, r7\n\t"
  167240. #else
  167241. "mul r6, r7\n\t"
  167242. #endif
  167243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167244. "lsrs r7, r6, #16\n\t"
  167245. #else
  167246. "lsr r7, r6, #16\n\t"
  167247. #endif
  167248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167249. "lsls r6, r6, #16\n\t"
  167250. #else
  167251. "lsl r6, r6, #16\n\t"
  167252. #endif
  167253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167254. "adds r3, r3, r6\n\t"
  167255. #else
  167256. "add r3, r3, r6\n\t"
  167257. #endif
  167258. #ifdef WOLFSSL_KEIL
  167259. "adcs r4, r4, r7\n\t"
  167260. #elif defined(__clang__)
  167261. "adcs r4, r7\n\t"
  167262. #else
  167263. "adc r4, r7\n\t"
  167264. #endif
  167265. #ifdef WOLFSSL_KEIL
  167266. "adcs r5, r5, %[r]\n\t"
  167267. #elif defined(__clang__)
  167268. "adcs r5, %[r]\n\t"
  167269. #else
  167270. "adc r5, %[r]\n\t"
  167271. #endif
  167272. "# A[10] * B[14]\n\t"
  167273. "mov %[a], r9\n\t"
  167274. "mov %[b], r10\n\t"
  167275. "ldr %[a], [%[a], #40]\n\t"
  167276. "ldr %[b], [%[b], #56]\n\t"
  167277. "uxth r6, %[a]\n\t"
  167278. "uxth r7, %[b]\n\t"
  167279. #ifdef WOLFSSL_KEIL
  167280. "muls r7, r6, r7\n\t"
  167281. #elif defined(__clang__)
  167282. "muls r7, r6\n\t"
  167283. #else
  167284. "mul r7, r6\n\t"
  167285. #endif
  167286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167287. "adds r3, r3, r7\n\t"
  167288. #else
  167289. "add r3, r3, r7\n\t"
  167290. #endif
  167291. #ifdef WOLFSSL_KEIL
  167292. "adcs r4, r4, %[r]\n\t"
  167293. #elif defined(__clang__)
  167294. "adcs r4, %[r]\n\t"
  167295. #else
  167296. "adc r4, %[r]\n\t"
  167297. #endif
  167298. #ifdef WOLFSSL_KEIL
  167299. "adcs r5, r5, %[r]\n\t"
  167300. #elif defined(__clang__)
  167301. "adcs r5, %[r]\n\t"
  167302. #else
  167303. "adc r5, %[r]\n\t"
  167304. #endif
  167305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167306. "lsrs r7, %[b], #16\n\t"
  167307. #else
  167308. "lsr r7, %[b], #16\n\t"
  167309. #endif
  167310. #ifdef WOLFSSL_KEIL
  167311. "muls r6, r7, r6\n\t"
  167312. #elif defined(__clang__)
  167313. "muls r6, r7\n\t"
  167314. #else
  167315. "mul r6, r7\n\t"
  167316. #endif
  167317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167318. "lsrs r7, r6, #16\n\t"
  167319. #else
  167320. "lsr r7, r6, #16\n\t"
  167321. #endif
  167322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167323. "lsls r6, r6, #16\n\t"
  167324. #else
  167325. "lsl r6, r6, #16\n\t"
  167326. #endif
  167327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167328. "adds r3, r3, r6\n\t"
  167329. #else
  167330. "add r3, r3, r6\n\t"
  167331. #endif
  167332. #ifdef WOLFSSL_KEIL
  167333. "adcs r4, r4, r7\n\t"
  167334. #elif defined(__clang__)
  167335. "adcs r4, r7\n\t"
  167336. #else
  167337. "adc r4, r7\n\t"
  167338. #endif
  167339. #ifdef WOLFSSL_KEIL
  167340. "adcs r5, r5, %[r]\n\t"
  167341. #elif defined(__clang__)
  167342. "adcs r5, %[r]\n\t"
  167343. #else
  167344. "adc r5, %[r]\n\t"
  167345. #endif
  167346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167347. "lsrs r6, %[a], #16\n\t"
  167348. #else
  167349. "lsr r6, %[a], #16\n\t"
  167350. #endif
  167351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167352. "lsrs r7, %[b], #16\n\t"
  167353. #else
  167354. "lsr r7, %[b], #16\n\t"
  167355. #endif
  167356. #ifdef WOLFSSL_KEIL
  167357. "muls r7, r6, r7\n\t"
  167358. #elif defined(__clang__)
  167359. "muls r7, r6\n\t"
  167360. #else
  167361. "mul r7, r6\n\t"
  167362. #endif
  167363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167364. "adds r4, r4, r7\n\t"
  167365. #else
  167366. "add r4, r4, r7\n\t"
  167367. #endif
  167368. #ifdef WOLFSSL_KEIL
  167369. "adcs r5, r5, %[r]\n\t"
  167370. #elif defined(__clang__)
  167371. "adcs r5, %[r]\n\t"
  167372. #else
  167373. "adc r5, %[r]\n\t"
  167374. #endif
  167375. "uxth r7, %[b]\n\t"
  167376. #ifdef WOLFSSL_KEIL
  167377. "muls r6, r7, r6\n\t"
  167378. #elif defined(__clang__)
  167379. "muls r6, r7\n\t"
  167380. #else
  167381. "mul r6, r7\n\t"
  167382. #endif
  167383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167384. "lsrs r7, r6, #16\n\t"
  167385. #else
  167386. "lsr r7, r6, #16\n\t"
  167387. #endif
  167388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167389. "lsls r6, r6, #16\n\t"
  167390. #else
  167391. "lsl r6, r6, #16\n\t"
  167392. #endif
  167393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167394. "adds r3, r3, r6\n\t"
  167395. #else
  167396. "add r3, r3, r6\n\t"
  167397. #endif
  167398. #ifdef WOLFSSL_KEIL
  167399. "adcs r4, r4, r7\n\t"
  167400. #elif defined(__clang__)
  167401. "adcs r4, r7\n\t"
  167402. #else
  167403. "adc r4, r7\n\t"
  167404. #endif
  167405. #ifdef WOLFSSL_KEIL
  167406. "adcs r5, r5, %[r]\n\t"
  167407. #elif defined(__clang__)
  167408. "adcs r5, %[r]\n\t"
  167409. #else
  167410. "adc r5, %[r]\n\t"
  167411. #endif
  167412. "# A[9] * B[15]\n\t"
  167413. "mov %[a], r9\n\t"
  167414. "mov %[b], r10\n\t"
  167415. "ldr %[a], [%[a], #36]\n\t"
  167416. "ldr %[b], [%[b], #60]\n\t"
  167417. "uxth r6, %[a]\n\t"
  167418. "uxth r7, %[b]\n\t"
  167419. #ifdef WOLFSSL_KEIL
  167420. "muls r7, r6, r7\n\t"
  167421. #elif defined(__clang__)
  167422. "muls r7, r6\n\t"
  167423. #else
  167424. "mul r7, r6\n\t"
  167425. #endif
  167426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167427. "adds r3, r3, r7\n\t"
  167428. #else
  167429. "add r3, r3, r7\n\t"
  167430. #endif
  167431. #ifdef WOLFSSL_KEIL
  167432. "adcs r4, r4, %[r]\n\t"
  167433. #elif defined(__clang__)
  167434. "adcs r4, %[r]\n\t"
  167435. #else
  167436. "adc r4, %[r]\n\t"
  167437. #endif
  167438. #ifdef WOLFSSL_KEIL
  167439. "adcs r5, r5, %[r]\n\t"
  167440. #elif defined(__clang__)
  167441. "adcs r5, %[r]\n\t"
  167442. #else
  167443. "adc r5, %[r]\n\t"
  167444. #endif
  167445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167446. "lsrs r7, %[b], #16\n\t"
  167447. #else
  167448. "lsr r7, %[b], #16\n\t"
  167449. #endif
  167450. #ifdef WOLFSSL_KEIL
  167451. "muls r6, r7, r6\n\t"
  167452. #elif defined(__clang__)
  167453. "muls r6, r7\n\t"
  167454. #else
  167455. "mul r6, r7\n\t"
  167456. #endif
  167457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167458. "lsrs r7, r6, #16\n\t"
  167459. #else
  167460. "lsr r7, r6, #16\n\t"
  167461. #endif
  167462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167463. "lsls r6, r6, #16\n\t"
  167464. #else
  167465. "lsl r6, r6, #16\n\t"
  167466. #endif
  167467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167468. "adds r3, r3, r6\n\t"
  167469. #else
  167470. "add r3, r3, r6\n\t"
  167471. #endif
  167472. #ifdef WOLFSSL_KEIL
  167473. "adcs r4, r4, r7\n\t"
  167474. #elif defined(__clang__)
  167475. "adcs r4, r7\n\t"
  167476. #else
  167477. "adc r4, r7\n\t"
  167478. #endif
  167479. #ifdef WOLFSSL_KEIL
  167480. "adcs r5, r5, %[r]\n\t"
  167481. #elif defined(__clang__)
  167482. "adcs r5, %[r]\n\t"
  167483. #else
  167484. "adc r5, %[r]\n\t"
  167485. #endif
  167486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167487. "lsrs r6, %[a], #16\n\t"
  167488. #else
  167489. "lsr r6, %[a], #16\n\t"
  167490. #endif
  167491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167492. "lsrs r7, %[b], #16\n\t"
  167493. #else
  167494. "lsr r7, %[b], #16\n\t"
  167495. #endif
  167496. #ifdef WOLFSSL_KEIL
  167497. "muls r7, r6, r7\n\t"
  167498. #elif defined(__clang__)
  167499. "muls r7, r6\n\t"
  167500. #else
  167501. "mul r7, r6\n\t"
  167502. #endif
  167503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167504. "adds r4, r4, r7\n\t"
  167505. #else
  167506. "add r4, r4, r7\n\t"
  167507. #endif
  167508. #ifdef WOLFSSL_KEIL
  167509. "adcs r5, r5, %[r]\n\t"
  167510. #elif defined(__clang__)
  167511. "adcs r5, %[r]\n\t"
  167512. #else
  167513. "adc r5, %[r]\n\t"
  167514. #endif
  167515. "uxth r7, %[b]\n\t"
  167516. #ifdef WOLFSSL_KEIL
  167517. "muls r6, r7, r6\n\t"
  167518. #elif defined(__clang__)
  167519. "muls r6, r7\n\t"
  167520. #else
  167521. "mul r6, r7\n\t"
  167522. #endif
  167523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167524. "lsrs r7, r6, #16\n\t"
  167525. #else
  167526. "lsr r7, r6, #16\n\t"
  167527. #endif
  167528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167529. "lsls r6, r6, #16\n\t"
  167530. #else
  167531. "lsl r6, r6, #16\n\t"
  167532. #endif
  167533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167534. "adds r3, r3, r6\n\t"
  167535. #else
  167536. "add r3, r3, r6\n\t"
  167537. #endif
  167538. #ifdef WOLFSSL_KEIL
  167539. "adcs r4, r4, r7\n\t"
  167540. #elif defined(__clang__)
  167541. "adcs r4, r7\n\t"
  167542. #else
  167543. "adc r4, r7\n\t"
  167544. #endif
  167545. #ifdef WOLFSSL_KEIL
  167546. "adcs r5, r5, %[r]\n\t"
  167547. #elif defined(__clang__)
  167548. "adcs r5, %[r]\n\t"
  167549. #else
  167550. "adc r5, %[r]\n\t"
  167551. #endif
  167552. "mov %[r], r8\n\t"
  167553. "str r3, [%[r], #96]\n\t"
  167554. "movs %[r], #0\n\t"
  167555. "# A[10] * B[15]\n\t"
  167556. "movs r3, #0\n\t"
  167557. "mov %[a], r9\n\t"
  167558. "mov %[b], r10\n\t"
  167559. "ldr %[a], [%[a], #40]\n\t"
  167560. "ldr %[b], [%[b], #60]\n\t"
  167561. "uxth r6, %[a]\n\t"
  167562. "uxth r7, %[b]\n\t"
  167563. #ifdef WOLFSSL_KEIL
  167564. "muls r7, r6, r7\n\t"
  167565. #elif defined(__clang__)
  167566. "muls r7, r6\n\t"
  167567. #else
  167568. "mul r7, r6\n\t"
  167569. #endif
  167570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167571. "adds r4, r4, r7\n\t"
  167572. #else
  167573. "add r4, r4, r7\n\t"
  167574. #endif
  167575. #ifdef WOLFSSL_KEIL
  167576. "adcs r5, r5, %[r]\n\t"
  167577. #elif defined(__clang__)
  167578. "adcs r5, %[r]\n\t"
  167579. #else
  167580. "adc r5, %[r]\n\t"
  167581. #endif
  167582. #ifdef WOLFSSL_KEIL
  167583. "adcs r3, r3, %[r]\n\t"
  167584. #elif defined(__clang__)
  167585. "adcs r3, %[r]\n\t"
  167586. #else
  167587. "adc r3, %[r]\n\t"
  167588. #endif
  167589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167590. "lsrs r7, %[b], #16\n\t"
  167591. #else
  167592. "lsr r7, %[b], #16\n\t"
  167593. #endif
  167594. #ifdef WOLFSSL_KEIL
  167595. "muls r6, r7, r6\n\t"
  167596. #elif defined(__clang__)
  167597. "muls r6, r7\n\t"
  167598. #else
  167599. "mul r6, r7\n\t"
  167600. #endif
  167601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167602. "lsrs r7, r6, #16\n\t"
  167603. #else
  167604. "lsr r7, r6, #16\n\t"
  167605. #endif
  167606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167607. "lsls r6, r6, #16\n\t"
  167608. #else
  167609. "lsl r6, r6, #16\n\t"
  167610. #endif
  167611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167612. "adds r4, r4, r6\n\t"
  167613. #else
  167614. "add r4, r4, r6\n\t"
  167615. #endif
  167616. #ifdef WOLFSSL_KEIL
  167617. "adcs r5, r5, r7\n\t"
  167618. #elif defined(__clang__)
  167619. "adcs r5, r7\n\t"
  167620. #else
  167621. "adc r5, r7\n\t"
  167622. #endif
  167623. #ifdef WOLFSSL_KEIL
  167624. "adcs r3, r3, %[r]\n\t"
  167625. #elif defined(__clang__)
  167626. "adcs r3, %[r]\n\t"
  167627. #else
  167628. "adc r3, %[r]\n\t"
  167629. #endif
  167630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167631. "lsrs r6, %[a], #16\n\t"
  167632. #else
  167633. "lsr r6, %[a], #16\n\t"
  167634. #endif
  167635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167636. "lsrs r7, %[b], #16\n\t"
  167637. #else
  167638. "lsr r7, %[b], #16\n\t"
  167639. #endif
  167640. #ifdef WOLFSSL_KEIL
  167641. "muls r7, r6, r7\n\t"
  167642. #elif defined(__clang__)
  167643. "muls r7, r6\n\t"
  167644. #else
  167645. "mul r7, r6\n\t"
  167646. #endif
  167647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167648. "adds r5, r5, r7\n\t"
  167649. #else
  167650. "add r5, r5, r7\n\t"
  167651. #endif
  167652. #ifdef WOLFSSL_KEIL
  167653. "adcs r3, r3, %[r]\n\t"
  167654. #elif defined(__clang__)
  167655. "adcs r3, %[r]\n\t"
  167656. #else
  167657. "adc r3, %[r]\n\t"
  167658. #endif
  167659. "uxth r7, %[b]\n\t"
  167660. #ifdef WOLFSSL_KEIL
  167661. "muls r6, r7, r6\n\t"
  167662. #elif defined(__clang__)
  167663. "muls r6, r7\n\t"
  167664. #else
  167665. "mul r6, r7\n\t"
  167666. #endif
  167667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167668. "lsrs r7, r6, #16\n\t"
  167669. #else
  167670. "lsr r7, r6, #16\n\t"
  167671. #endif
  167672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167673. "lsls r6, r6, #16\n\t"
  167674. #else
  167675. "lsl r6, r6, #16\n\t"
  167676. #endif
  167677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167678. "adds r4, r4, r6\n\t"
  167679. #else
  167680. "add r4, r4, r6\n\t"
  167681. #endif
  167682. #ifdef WOLFSSL_KEIL
  167683. "adcs r5, r5, r7\n\t"
  167684. #elif defined(__clang__)
  167685. "adcs r5, r7\n\t"
  167686. #else
  167687. "adc r5, r7\n\t"
  167688. #endif
  167689. #ifdef WOLFSSL_KEIL
  167690. "adcs r3, r3, %[r]\n\t"
  167691. #elif defined(__clang__)
  167692. "adcs r3, %[r]\n\t"
  167693. #else
  167694. "adc r3, %[r]\n\t"
  167695. #endif
  167696. "# A[11] * B[14]\n\t"
  167697. "mov %[a], r9\n\t"
  167698. "mov %[b], r10\n\t"
  167699. "ldr %[a], [%[a], #44]\n\t"
  167700. "ldr %[b], [%[b], #56]\n\t"
  167701. "uxth r6, %[a]\n\t"
  167702. "uxth r7, %[b]\n\t"
  167703. #ifdef WOLFSSL_KEIL
  167704. "muls r7, r6, r7\n\t"
  167705. #elif defined(__clang__)
  167706. "muls r7, r6\n\t"
  167707. #else
  167708. "mul r7, r6\n\t"
  167709. #endif
  167710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167711. "adds r4, r4, r7\n\t"
  167712. #else
  167713. "add r4, r4, r7\n\t"
  167714. #endif
  167715. #ifdef WOLFSSL_KEIL
  167716. "adcs r5, r5, %[r]\n\t"
  167717. #elif defined(__clang__)
  167718. "adcs r5, %[r]\n\t"
  167719. #else
  167720. "adc r5, %[r]\n\t"
  167721. #endif
  167722. #ifdef WOLFSSL_KEIL
  167723. "adcs r3, r3, %[r]\n\t"
  167724. #elif defined(__clang__)
  167725. "adcs r3, %[r]\n\t"
  167726. #else
  167727. "adc r3, %[r]\n\t"
  167728. #endif
  167729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167730. "lsrs r7, %[b], #16\n\t"
  167731. #else
  167732. "lsr r7, %[b], #16\n\t"
  167733. #endif
  167734. #ifdef WOLFSSL_KEIL
  167735. "muls r6, r7, r6\n\t"
  167736. #elif defined(__clang__)
  167737. "muls r6, r7\n\t"
  167738. #else
  167739. "mul r6, r7\n\t"
  167740. #endif
  167741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167742. "lsrs r7, r6, #16\n\t"
  167743. #else
  167744. "lsr r7, r6, #16\n\t"
  167745. #endif
  167746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167747. "lsls r6, r6, #16\n\t"
  167748. #else
  167749. "lsl r6, r6, #16\n\t"
  167750. #endif
  167751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167752. "adds r4, r4, r6\n\t"
  167753. #else
  167754. "add r4, r4, r6\n\t"
  167755. #endif
  167756. #ifdef WOLFSSL_KEIL
  167757. "adcs r5, r5, r7\n\t"
  167758. #elif defined(__clang__)
  167759. "adcs r5, r7\n\t"
  167760. #else
  167761. "adc r5, r7\n\t"
  167762. #endif
  167763. #ifdef WOLFSSL_KEIL
  167764. "adcs r3, r3, %[r]\n\t"
  167765. #elif defined(__clang__)
  167766. "adcs r3, %[r]\n\t"
  167767. #else
  167768. "adc r3, %[r]\n\t"
  167769. #endif
  167770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167771. "lsrs r6, %[a], #16\n\t"
  167772. #else
  167773. "lsr r6, %[a], #16\n\t"
  167774. #endif
  167775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167776. "lsrs r7, %[b], #16\n\t"
  167777. #else
  167778. "lsr r7, %[b], #16\n\t"
  167779. #endif
  167780. #ifdef WOLFSSL_KEIL
  167781. "muls r7, r6, r7\n\t"
  167782. #elif defined(__clang__)
  167783. "muls r7, r6\n\t"
  167784. #else
  167785. "mul r7, r6\n\t"
  167786. #endif
  167787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167788. "adds r5, r5, r7\n\t"
  167789. #else
  167790. "add r5, r5, r7\n\t"
  167791. #endif
  167792. #ifdef WOLFSSL_KEIL
  167793. "adcs r3, r3, %[r]\n\t"
  167794. #elif defined(__clang__)
  167795. "adcs r3, %[r]\n\t"
  167796. #else
  167797. "adc r3, %[r]\n\t"
  167798. #endif
  167799. "uxth r7, %[b]\n\t"
  167800. #ifdef WOLFSSL_KEIL
  167801. "muls r6, r7, r6\n\t"
  167802. #elif defined(__clang__)
  167803. "muls r6, r7\n\t"
  167804. #else
  167805. "mul r6, r7\n\t"
  167806. #endif
  167807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167808. "lsrs r7, r6, #16\n\t"
  167809. #else
  167810. "lsr r7, r6, #16\n\t"
  167811. #endif
  167812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167813. "lsls r6, r6, #16\n\t"
  167814. #else
  167815. "lsl r6, r6, #16\n\t"
  167816. #endif
  167817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167818. "adds r4, r4, r6\n\t"
  167819. #else
  167820. "add r4, r4, r6\n\t"
  167821. #endif
  167822. #ifdef WOLFSSL_KEIL
  167823. "adcs r5, r5, r7\n\t"
  167824. #elif defined(__clang__)
  167825. "adcs r5, r7\n\t"
  167826. #else
  167827. "adc r5, r7\n\t"
  167828. #endif
  167829. #ifdef WOLFSSL_KEIL
  167830. "adcs r3, r3, %[r]\n\t"
  167831. #elif defined(__clang__)
  167832. "adcs r3, %[r]\n\t"
  167833. #else
  167834. "adc r3, %[r]\n\t"
  167835. #endif
  167836. "# A[12] * B[13]\n\t"
  167837. "mov %[a], r9\n\t"
  167838. "mov %[b], r10\n\t"
  167839. "ldr %[a], [%[a], #48]\n\t"
  167840. "ldr %[b], [%[b], #52]\n\t"
  167841. "uxth r6, %[a]\n\t"
  167842. "uxth r7, %[b]\n\t"
  167843. #ifdef WOLFSSL_KEIL
  167844. "muls r7, r6, r7\n\t"
  167845. #elif defined(__clang__)
  167846. "muls r7, r6\n\t"
  167847. #else
  167848. "mul r7, r6\n\t"
  167849. #endif
  167850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167851. "adds r4, r4, r7\n\t"
  167852. #else
  167853. "add r4, r4, r7\n\t"
  167854. #endif
  167855. #ifdef WOLFSSL_KEIL
  167856. "adcs r5, r5, %[r]\n\t"
  167857. #elif defined(__clang__)
  167858. "adcs r5, %[r]\n\t"
  167859. #else
  167860. "adc r5, %[r]\n\t"
  167861. #endif
  167862. #ifdef WOLFSSL_KEIL
  167863. "adcs r3, r3, %[r]\n\t"
  167864. #elif defined(__clang__)
  167865. "adcs r3, %[r]\n\t"
  167866. #else
  167867. "adc r3, %[r]\n\t"
  167868. #endif
  167869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167870. "lsrs r7, %[b], #16\n\t"
  167871. #else
  167872. "lsr r7, %[b], #16\n\t"
  167873. #endif
  167874. #ifdef WOLFSSL_KEIL
  167875. "muls r6, r7, r6\n\t"
  167876. #elif defined(__clang__)
  167877. "muls r6, r7\n\t"
  167878. #else
  167879. "mul r6, r7\n\t"
  167880. #endif
  167881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167882. "lsrs r7, r6, #16\n\t"
  167883. #else
  167884. "lsr r7, r6, #16\n\t"
  167885. #endif
  167886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167887. "lsls r6, r6, #16\n\t"
  167888. #else
  167889. "lsl r6, r6, #16\n\t"
  167890. #endif
  167891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167892. "adds r4, r4, r6\n\t"
  167893. #else
  167894. "add r4, r4, r6\n\t"
  167895. #endif
  167896. #ifdef WOLFSSL_KEIL
  167897. "adcs r5, r5, r7\n\t"
  167898. #elif defined(__clang__)
  167899. "adcs r5, r7\n\t"
  167900. #else
  167901. "adc r5, r7\n\t"
  167902. #endif
  167903. #ifdef WOLFSSL_KEIL
  167904. "adcs r3, r3, %[r]\n\t"
  167905. #elif defined(__clang__)
  167906. "adcs r3, %[r]\n\t"
  167907. #else
  167908. "adc r3, %[r]\n\t"
  167909. #endif
  167910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167911. "lsrs r6, %[a], #16\n\t"
  167912. #else
  167913. "lsr r6, %[a], #16\n\t"
  167914. #endif
  167915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167916. "lsrs r7, %[b], #16\n\t"
  167917. #else
  167918. "lsr r7, %[b], #16\n\t"
  167919. #endif
  167920. #ifdef WOLFSSL_KEIL
  167921. "muls r7, r6, r7\n\t"
  167922. #elif defined(__clang__)
  167923. "muls r7, r6\n\t"
  167924. #else
  167925. "mul r7, r6\n\t"
  167926. #endif
  167927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167928. "adds r5, r5, r7\n\t"
  167929. #else
  167930. "add r5, r5, r7\n\t"
  167931. #endif
  167932. #ifdef WOLFSSL_KEIL
  167933. "adcs r3, r3, %[r]\n\t"
  167934. #elif defined(__clang__)
  167935. "adcs r3, %[r]\n\t"
  167936. #else
  167937. "adc r3, %[r]\n\t"
  167938. #endif
  167939. "uxth r7, %[b]\n\t"
  167940. #ifdef WOLFSSL_KEIL
  167941. "muls r6, r7, r6\n\t"
  167942. #elif defined(__clang__)
  167943. "muls r6, r7\n\t"
  167944. #else
  167945. "mul r6, r7\n\t"
  167946. #endif
  167947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167948. "lsrs r7, r6, #16\n\t"
  167949. #else
  167950. "lsr r7, r6, #16\n\t"
  167951. #endif
  167952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167953. "lsls r6, r6, #16\n\t"
  167954. #else
  167955. "lsl r6, r6, #16\n\t"
  167956. #endif
  167957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167958. "adds r4, r4, r6\n\t"
  167959. #else
  167960. "add r4, r4, r6\n\t"
  167961. #endif
  167962. #ifdef WOLFSSL_KEIL
  167963. "adcs r5, r5, r7\n\t"
  167964. #elif defined(__clang__)
  167965. "adcs r5, r7\n\t"
  167966. #else
  167967. "adc r5, r7\n\t"
  167968. #endif
  167969. #ifdef WOLFSSL_KEIL
  167970. "adcs r3, r3, %[r]\n\t"
  167971. #elif defined(__clang__)
  167972. "adcs r3, %[r]\n\t"
  167973. #else
  167974. "adc r3, %[r]\n\t"
  167975. #endif
  167976. "# A[13] * B[12]\n\t"
  167977. "mov %[a], r9\n\t"
  167978. "mov %[b], r10\n\t"
  167979. "ldr %[a], [%[a], #52]\n\t"
  167980. "ldr %[b], [%[b], #48]\n\t"
  167981. "uxth r6, %[a]\n\t"
  167982. "uxth r7, %[b]\n\t"
  167983. #ifdef WOLFSSL_KEIL
  167984. "muls r7, r6, r7\n\t"
  167985. #elif defined(__clang__)
  167986. "muls r7, r6\n\t"
  167987. #else
  167988. "mul r7, r6\n\t"
  167989. #endif
  167990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167991. "adds r4, r4, r7\n\t"
  167992. #else
  167993. "add r4, r4, r7\n\t"
  167994. #endif
  167995. #ifdef WOLFSSL_KEIL
  167996. "adcs r5, r5, %[r]\n\t"
  167997. #elif defined(__clang__)
  167998. "adcs r5, %[r]\n\t"
  167999. #else
  168000. "adc r5, %[r]\n\t"
  168001. #endif
  168002. #ifdef WOLFSSL_KEIL
  168003. "adcs r3, r3, %[r]\n\t"
  168004. #elif defined(__clang__)
  168005. "adcs r3, %[r]\n\t"
  168006. #else
  168007. "adc r3, %[r]\n\t"
  168008. #endif
  168009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168010. "lsrs r7, %[b], #16\n\t"
  168011. #else
  168012. "lsr r7, %[b], #16\n\t"
  168013. #endif
  168014. #ifdef WOLFSSL_KEIL
  168015. "muls r6, r7, r6\n\t"
  168016. #elif defined(__clang__)
  168017. "muls r6, r7\n\t"
  168018. #else
  168019. "mul r6, r7\n\t"
  168020. #endif
  168021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168022. "lsrs r7, r6, #16\n\t"
  168023. #else
  168024. "lsr r7, r6, #16\n\t"
  168025. #endif
  168026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168027. "lsls r6, r6, #16\n\t"
  168028. #else
  168029. "lsl r6, r6, #16\n\t"
  168030. #endif
  168031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168032. "adds r4, r4, r6\n\t"
  168033. #else
  168034. "add r4, r4, r6\n\t"
  168035. #endif
  168036. #ifdef WOLFSSL_KEIL
  168037. "adcs r5, r5, r7\n\t"
  168038. #elif defined(__clang__)
  168039. "adcs r5, r7\n\t"
  168040. #else
  168041. "adc r5, r7\n\t"
  168042. #endif
  168043. #ifdef WOLFSSL_KEIL
  168044. "adcs r3, r3, %[r]\n\t"
  168045. #elif defined(__clang__)
  168046. "adcs r3, %[r]\n\t"
  168047. #else
  168048. "adc r3, %[r]\n\t"
  168049. #endif
  168050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168051. "lsrs r6, %[a], #16\n\t"
  168052. #else
  168053. "lsr r6, %[a], #16\n\t"
  168054. #endif
  168055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168056. "lsrs r7, %[b], #16\n\t"
  168057. #else
  168058. "lsr r7, %[b], #16\n\t"
  168059. #endif
  168060. #ifdef WOLFSSL_KEIL
  168061. "muls r7, r6, r7\n\t"
  168062. #elif defined(__clang__)
  168063. "muls r7, r6\n\t"
  168064. #else
  168065. "mul r7, r6\n\t"
  168066. #endif
  168067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168068. "adds r5, r5, r7\n\t"
  168069. #else
  168070. "add r5, r5, r7\n\t"
  168071. #endif
  168072. #ifdef WOLFSSL_KEIL
  168073. "adcs r3, r3, %[r]\n\t"
  168074. #elif defined(__clang__)
  168075. "adcs r3, %[r]\n\t"
  168076. #else
  168077. "adc r3, %[r]\n\t"
  168078. #endif
  168079. "uxth r7, %[b]\n\t"
  168080. #ifdef WOLFSSL_KEIL
  168081. "muls r6, r7, r6\n\t"
  168082. #elif defined(__clang__)
  168083. "muls r6, r7\n\t"
  168084. #else
  168085. "mul r6, r7\n\t"
  168086. #endif
  168087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168088. "lsrs r7, r6, #16\n\t"
  168089. #else
  168090. "lsr r7, r6, #16\n\t"
  168091. #endif
  168092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168093. "lsls r6, r6, #16\n\t"
  168094. #else
  168095. "lsl r6, r6, #16\n\t"
  168096. #endif
  168097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168098. "adds r4, r4, r6\n\t"
  168099. #else
  168100. "add r4, r4, r6\n\t"
  168101. #endif
  168102. #ifdef WOLFSSL_KEIL
  168103. "adcs r5, r5, r7\n\t"
  168104. #elif defined(__clang__)
  168105. "adcs r5, r7\n\t"
  168106. #else
  168107. "adc r5, r7\n\t"
  168108. #endif
  168109. #ifdef WOLFSSL_KEIL
  168110. "adcs r3, r3, %[r]\n\t"
  168111. #elif defined(__clang__)
  168112. "adcs r3, %[r]\n\t"
  168113. #else
  168114. "adc r3, %[r]\n\t"
  168115. #endif
  168116. "# A[14] * B[11]\n\t"
  168117. "mov %[a], r9\n\t"
  168118. "mov %[b], r10\n\t"
  168119. "ldr %[a], [%[a], #56]\n\t"
  168120. "ldr %[b], [%[b], #44]\n\t"
  168121. "uxth r6, %[a]\n\t"
  168122. "uxth r7, %[b]\n\t"
  168123. #ifdef WOLFSSL_KEIL
  168124. "muls r7, r6, r7\n\t"
  168125. #elif defined(__clang__)
  168126. "muls r7, r6\n\t"
  168127. #else
  168128. "mul r7, r6\n\t"
  168129. #endif
  168130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168131. "adds r4, r4, r7\n\t"
  168132. #else
  168133. "add r4, r4, r7\n\t"
  168134. #endif
  168135. #ifdef WOLFSSL_KEIL
  168136. "adcs r5, r5, %[r]\n\t"
  168137. #elif defined(__clang__)
  168138. "adcs r5, %[r]\n\t"
  168139. #else
  168140. "adc r5, %[r]\n\t"
  168141. #endif
  168142. #ifdef WOLFSSL_KEIL
  168143. "adcs r3, r3, %[r]\n\t"
  168144. #elif defined(__clang__)
  168145. "adcs r3, %[r]\n\t"
  168146. #else
  168147. "adc r3, %[r]\n\t"
  168148. #endif
  168149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168150. "lsrs r7, %[b], #16\n\t"
  168151. #else
  168152. "lsr r7, %[b], #16\n\t"
  168153. #endif
  168154. #ifdef WOLFSSL_KEIL
  168155. "muls r6, r7, r6\n\t"
  168156. #elif defined(__clang__)
  168157. "muls r6, r7\n\t"
  168158. #else
  168159. "mul r6, r7\n\t"
  168160. #endif
  168161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168162. "lsrs r7, r6, #16\n\t"
  168163. #else
  168164. "lsr r7, r6, #16\n\t"
  168165. #endif
  168166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168167. "lsls r6, r6, #16\n\t"
  168168. #else
  168169. "lsl r6, r6, #16\n\t"
  168170. #endif
  168171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168172. "adds r4, r4, r6\n\t"
  168173. #else
  168174. "add r4, r4, r6\n\t"
  168175. #endif
  168176. #ifdef WOLFSSL_KEIL
  168177. "adcs r5, r5, r7\n\t"
  168178. #elif defined(__clang__)
  168179. "adcs r5, r7\n\t"
  168180. #else
  168181. "adc r5, r7\n\t"
  168182. #endif
  168183. #ifdef WOLFSSL_KEIL
  168184. "adcs r3, r3, %[r]\n\t"
  168185. #elif defined(__clang__)
  168186. "adcs r3, %[r]\n\t"
  168187. #else
  168188. "adc r3, %[r]\n\t"
  168189. #endif
  168190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168191. "lsrs r6, %[a], #16\n\t"
  168192. #else
  168193. "lsr r6, %[a], #16\n\t"
  168194. #endif
  168195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168196. "lsrs r7, %[b], #16\n\t"
  168197. #else
  168198. "lsr r7, %[b], #16\n\t"
  168199. #endif
  168200. #ifdef WOLFSSL_KEIL
  168201. "muls r7, r6, r7\n\t"
  168202. #elif defined(__clang__)
  168203. "muls r7, r6\n\t"
  168204. #else
  168205. "mul r7, r6\n\t"
  168206. #endif
  168207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168208. "adds r5, r5, r7\n\t"
  168209. #else
  168210. "add r5, r5, r7\n\t"
  168211. #endif
  168212. #ifdef WOLFSSL_KEIL
  168213. "adcs r3, r3, %[r]\n\t"
  168214. #elif defined(__clang__)
  168215. "adcs r3, %[r]\n\t"
  168216. #else
  168217. "adc r3, %[r]\n\t"
  168218. #endif
  168219. "uxth r7, %[b]\n\t"
  168220. #ifdef WOLFSSL_KEIL
  168221. "muls r6, r7, r6\n\t"
  168222. #elif defined(__clang__)
  168223. "muls r6, r7\n\t"
  168224. #else
  168225. "mul r6, r7\n\t"
  168226. #endif
  168227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168228. "lsrs r7, r6, #16\n\t"
  168229. #else
  168230. "lsr r7, r6, #16\n\t"
  168231. #endif
  168232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168233. "lsls r6, r6, #16\n\t"
  168234. #else
  168235. "lsl r6, r6, #16\n\t"
  168236. #endif
  168237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168238. "adds r4, r4, r6\n\t"
  168239. #else
  168240. "add r4, r4, r6\n\t"
  168241. #endif
  168242. #ifdef WOLFSSL_KEIL
  168243. "adcs r5, r5, r7\n\t"
  168244. #elif defined(__clang__)
  168245. "adcs r5, r7\n\t"
  168246. #else
  168247. "adc r5, r7\n\t"
  168248. #endif
  168249. #ifdef WOLFSSL_KEIL
  168250. "adcs r3, r3, %[r]\n\t"
  168251. #elif defined(__clang__)
  168252. "adcs r3, %[r]\n\t"
  168253. #else
  168254. "adc r3, %[r]\n\t"
  168255. #endif
  168256. "# A[15] * B[10]\n\t"
  168257. "mov %[a], r9\n\t"
  168258. "mov %[b], r10\n\t"
  168259. "ldr %[a], [%[a], #60]\n\t"
  168260. "ldr %[b], [%[b], #40]\n\t"
  168261. "uxth r6, %[a]\n\t"
  168262. "uxth r7, %[b]\n\t"
  168263. #ifdef WOLFSSL_KEIL
  168264. "muls r7, r6, r7\n\t"
  168265. #elif defined(__clang__)
  168266. "muls r7, r6\n\t"
  168267. #else
  168268. "mul r7, r6\n\t"
  168269. #endif
  168270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168271. "adds r4, r4, r7\n\t"
  168272. #else
  168273. "add r4, r4, r7\n\t"
  168274. #endif
  168275. #ifdef WOLFSSL_KEIL
  168276. "adcs r5, r5, %[r]\n\t"
  168277. #elif defined(__clang__)
  168278. "adcs r5, %[r]\n\t"
  168279. #else
  168280. "adc r5, %[r]\n\t"
  168281. #endif
  168282. #ifdef WOLFSSL_KEIL
  168283. "adcs r3, r3, %[r]\n\t"
  168284. #elif defined(__clang__)
  168285. "adcs r3, %[r]\n\t"
  168286. #else
  168287. "adc r3, %[r]\n\t"
  168288. #endif
  168289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168290. "lsrs r7, %[b], #16\n\t"
  168291. #else
  168292. "lsr r7, %[b], #16\n\t"
  168293. #endif
  168294. #ifdef WOLFSSL_KEIL
  168295. "muls r6, r7, r6\n\t"
  168296. #elif defined(__clang__)
  168297. "muls r6, r7\n\t"
  168298. #else
  168299. "mul r6, r7\n\t"
  168300. #endif
  168301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168302. "lsrs r7, r6, #16\n\t"
  168303. #else
  168304. "lsr r7, r6, #16\n\t"
  168305. #endif
  168306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168307. "lsls r6, r6, #16\n\t"
  168308. #else
  168309. "lsl r6, r6, #16\n\t"
  168310. #endif
  168311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168312. "adds r4, r4, r6\n\t"
  168313. #else
  168314. "add r4, r4, r6\n\t"
  168315. #endif
  168316. #ifdef WOLFSSL_KEIL
  168317. "adcs r5, r5, r7\n\t"
  168318. #elif defined(__clang__)
  168319. "adcs r5, r7\n\t"
  168320. #else
  168321. "adc r5, r7\n\t"
  168322. #endif
  168323. #ifdef WOLFSSL_KEIL
  168324. "adcs r3, r3, %[r]\n\t"
  168325. #elif defined(__clang__)
  168326. "adcs r3, %[r]\n\t"
  168327. #else
  168328. "adc r3, %[r]\n\t"
  168329. #endif
  168330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168331. "lsrs r6, %[a], #16\n\t"
  168332. #else
  168333. "lsr r6, %[a], #16\n\t"
  168334. #endif
  168335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168336. "lsrs r7, %[b], #16\n\t"
  168337. #else
  168338. "lsr r7, %[b], #16\n\t"
  168339. #endif
  168340. #ifdef WOLFSSL_KEIL
  168341. "muls r7, r6, r7\n\t"
  168342. #elif defined(__clang__)
  168343. "muls r7, r6\n\t"
  168344. #else
  168345. "mul r7, r6\n\t"
  168346. #endif
  168347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168348. "adds r5, r5, r7\n\t"
  168349. #else
  168350. "add r5, r5, r7\n\t"
  168351. #endif
  168352. #ifdef WOLFSSL_KEIL
  168353. "adcs r3, r3, %[r]\n\t"
  168354. #elif defined(__clang__)
  168355. "adcs r3, %[r]\n\t"
  168356. #else
  168357. "adc r3, %[r]\n\t"
  168358. #endif
  168359. "uxth r7, %[b]\n\t"
  168360. #ifdef WOLFSSL_KEIL
  168361. "muls r6, r7, r6\n\t"
  168362. #elif defined(__clang__)
  168363. "muls r6, r7\n\t"
  168364. #else
  168365. "mul r6, r7\n\t"
  168366. #endif
  168367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168368. "lsrs r7, r6, #16\n\t"
  168369. #else
  168370. "lsr r7, r6, #16\n\t"
  168371. #endif
  168372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168373. "lsls r6, r6, #16\n\t"
  168374. #else
  168375. "lsl r6, r6, #16\n\t"
  168376. #endif
  168377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168378. "adds r4, r4, r6\n\t"
  168379. #else
  168380. "add r4, r4, r6\n\t"
  168381. #endif
  168382. #ifdef WOLFSSL_KEIL
  168383. "adcs r5, r5, r7\n\t"
  168384. #elif defined(__clang__)
  168385. "adcs r5, r7\n\t"
  168386. #else
  168387. "adc r5, r7\n\t"
  168388. #endif
  168389. #ifdef WOLFSSL_KEIL
  168390. "adcs r3, r3, %[r]\n\t"
  168391. #elif defined(__clang__)
  168392. "adcs r3, %[r]\n\t"
  168393. #else
  168394. "adc r3, %[r]\n\t"
  168395. #endif
  168396. "mov %[r], r8\n\t"
  168397. "str r4, [%[r], #100]\n\t"
  168398. "movs %[r], #0\n\t"
  168399. "# A[15] * B[11]\n\t"
  168400. "movs r4, #0\n\t"
  168401. "mov %[a], r9\n\t"
  168402. "mov %[b], r10\n\t"
  168403. "ldr %[a], [%[a], #60]\n\t"
  168404. "ldr %[b], [%[b], #44]\n\t"
  168405. "uxth r6, %[a]\n\t"
  168406. "uxth r7, %[b]\n\t"
  168407. #ifdef WOLFSSL_KEIL
  168408. "muls r7, r6, r7\n\t"
  168409. #elif defined(__clang__)
  168410. "muls r7, r6\n\t"
  168411. #else
  168412. "mul r7, r6\n\t"
  168413. #endif
  168414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168415. "adds r5, r5, r7\n\t"
  168416. #else
  168417. "add r5, r5, r7\n\t"
  168418. #endif
  168419. #ifdef WOLFSSL_KEIL
  168420. "adcs r3, r3, %[r]\n\t"
  168421. #elif defined(__clang__)
  168422. "adcs r3, %[r]\n\t"
  168423. #else
  168424. "adc r3, %[r]\n\t"
  168425. #endif
  168426. #ifdef WOLFSSL_KEIL
  168427. "adcs r4, r4, %[r]\n\t"
  168428. #elif defined(__clang__)
  168429. "adcs r4, %[r]\n\t"
  168430. #else
  168431. "adc r4, %[r]\n\t"
  168432. #endif
  168433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168434. "lsrs r7, %[b], #16\n\t"
  168435. #else
  168436. "lsr r7, %[b], #16\n\t"
  168437. #endif
  168438. #ifdef WOLFSSL_KEIL
  168439. "muls r6, r7, r6\n\t"
  168440. #elif defined(__clang__)
  168441. "muls r6, r7\n\t"
  168442. #else
  168443. "mul r6, r7\n\t"
  168444. #endif
  168445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168446. "lsrs r7, r6, #16\n\t"
  168447. #else
  168448. "lsr r7, r6, #16\n\t"
  168449. #endif
  168450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168451. "lsls r6, r6, #16\n\t"
  168452. #else
  168453. "lsl r6, r6, #16\n\t"
  168454. #endif
  168455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168456. "adds r5, r5, r6\n\t"
  168457. #else
  168458. "add r5, r5, r6\n\t"
  168459. #endif
  168460. #ifdef WOLFSSL_KEIL
  168461. "adcs r3, r3, r7\n\t"
  168462. #elif defined(__clang__)
  168463. "adcs r3, r7\n\t"
  168464. #else
  168465. "adc r3, r7\n\t"
  168466. #endif
  168467. #ifdef WOLFSSL_KEIL
  168468. "adcs r4, r4, %[r]\n\t"
  168469. #elif defined(__clang__)
  168470. "adcs r4, %[r]\n\t"
  168471. #else
  168472. "adc r4, %[r]\n\t"
  168473. #endif
  168474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168475. "lsrs r6, %[a], #16\n\t"
  168476. #else
  168477. "lsr r6, %[a], #16\n\t"
  168478. #endif
  168479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168480. "lsrs r7, %[b], #16\n\t"
  168481. #else
  168482. "lsr r7, %[b], #16\n\t"
  168483. #endif
  168484. #ifdef WOLFSSL_KEIL
  168485. "muls r7, r6, r7\n\t"
  168486. #elif defined(__clang__)
  168487. "muls r7, r6\n\t"
  168488. #else
  168489. "mul r7, r6\n\t"
  168490. #endif
  168491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168492. "adds r3, r3, r7\n\t"
  168493. #else
  168494. "add r3, r3, r7\n\t"
  168495. #endif
  168496. #ifdef WOLFSSL_KEIL
  168497. "adcs r4, r4, %[r]\n\t"
  168498. #elif defined(__clang__)
  168499. "adcs r4, %[r]\n\t"
  168500. #else
  168501. "adc r4, %[r]\n\t"
  168502. #endif
  168503. "uxth r7, %[b]\n\t"
  168504. #ifdef WOLFSSL_KEIL
  168505. "muls r6, r7, r6\n\t"
  168506. #elif defined(__clang__)
  168507. "muls r6, r7\n\t"
  168508. #else
  168509. "mul r6, r7\n\t"
  168510. #endif
  168511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168512. "lsrs r7, r6, #16\n\t"
  168513. #else
  168514. "lsr r7, r6, #16\n\t"
  168515. #endif
  168516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168517. "lsls r6, r6, #16\n\t"
  168518. #else
  168519. "lsl r6, r6, #16\n\t"
  168520. #endif
  168521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168522. "adds r5, r5, r6\n\t"
  168523. #else
  168524. "add r5, r5, r6\n\t"
  168525. #endif
  168526. #ifdef WOLFSSL_KEIL
  168527. "adcs r3, r3, r7\n\t"
  168528. #elif defined(__clang__)
  168529. "adcs r3, r7\n\t"
  168530. #else
  168531. "adc r3, r7\n\t"
  168532. #endif
  168533. #ifdef WOLFSSL_KEIL
  168534. "adcs r4, r4, %[r]\n\t"
  168535. #elif defined(__clang__)
  168536. "adcs r4, %[r]\n\t"
  168537. #else
  168538. "adc r4, %[r]\n\t"
  168539. #endif
  168540. "# A[14] * B[12]\n\t"
  168541. "mov %[a], r9\n\t"
  168542. "mov %[b], r10\n\t"
  168543. "ldr %[a], [%[a], #56]\n\t"
  168544. "ldr %[b], [%[b], #48]\n\t"
  168545. "uxth r6, %[a]\n\t"
  168546. "uxth r7, %[b]\n\t"
  168547. #ifdef WOLFSSL_KEIL
  168548. "muls r7, r6, r7\n\t"
  168549. #elif defined(__clang__)
  168550. "muls r7, r6\n\t"
  168551. #else
  168552. "mul r7, r6\n\t"
  168553. #endif
  168554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168555. "adds r5, r5, r7\n\t"
  168556. #else
  168557. "add r5, r5, r7\n\t"
  168558. #endif
  168559. #ifdef WOLFSSL_KEIL
  168560. "adcs r3, r3, %[r]\n\t"
  168561. #elif defined(__clang__)
  168562. "adcs r3, %[r]\n\t"
  168563. #else
  168564. "adc r3, %[r]\n\t"
  168565. #endif
  168566. #ifdef WOLFSSL_KEIL
  168567. "adcs r4, r4, %[r]\n\t"
  168568. #elif defined(__clang__)
  168569. "adcs r4, %[r]\n\t"
  168570. #else
  168571. "adc r4, %[r]\n\t"
  168572. #endif
  168573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168574. "lsrs r7, %[b], #16\n\t"
  168575. #else
  168576. "lsr r7, %[b], #16\n\t"
  168577. #endif
  168578. #ifdef WOLFSSL_KEIL
  168579. "muls r6, r7, r6\n\t"
  168580. #elif defined(__clang__)
  168581. "muls r6, r7\n\t"
  168582. #else
  168583. "mul r6, r7\n\t"
  168584. #endif
  168585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168586. "lsrs r7, r6, #16\n\t"
  168587. #else
  168588. "lsr r7, r6, #16\n\t"
  168589. #endif
  168590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168591. "lsls r6, r6, #16\n\t"
  168592. #else
  168593. "lsl r6, r6, #16\n\t"
  168594. #endif
  168595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168596. "adds r5, r5, r6\n\t"
  168597. #else
  168598. "add r5, r5, r6\n\t"
  168599. #endif
  168600. #ifdef WOLFSSL_KEIL
  168601. "adcs r3, r3, r7\n\t"
  168602. #elif defined(__clang__)
  168603. "adcs r3, r7\n\t"
  168604. #else
  168605. "adc r3, r7\n\t"
  168606. #endif
  168607. #ifdef WOLFSSL_KEIL
  168608. "adcs r4, r4, %[r]\n\t"
  168609. #elif defined(__clang__)
  168610. "adcs r4, %[r]\n\t"
  168611. #else
  168612. "adc r4, %[r]\n\t"
  168613. #endif
  168614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168615. "lsrs r6, %[a], #16\n\t"
  168616. #else
  168617. "lsr r6, %[a], #16\n\t"
  168618. #endif
  168619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168620. "lsrs r7, %[b], #16\n\t"
  168621. #else
  168622. "lsr r7, %[b], #16\n\t"
  168623. #endif
  168624. #ifdef WOLFSSL_KEIL
  168625. "muls r7, r6, r7\n\t"
  168626. #elif defined(__clang__)
  168627. "muls r7, r6\n\t"
  168628. #else
  168629. "mul r7, r6\n\t"
  168630. #endif
  168631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168632. "adds r3, r3, r7\n\t"
  168633. #else
  168634. "add r3, r3, r7\n\t"
  168635. #endif
  168636. #ifdef WOLFSSL_KEIL
  168637. "adcs r4, r4, %[r]\n\t"
  168638. #elif defined(__clang__)
  168639. "adcs r4, %[r]\n\t"
  168640. #else
  168641. "adc r4, %[r]\n\t"
  168642. #endif
  168643. "uxth r7, %[b]\n\t"
  168644. #ifdef WOLFSSL_KEIL
  168645. "muls r6, r7, r6\n\t"
  168646. #elif defined(__clang__)
  168647. "muls r6, r7\n\t"
  168648. #else
  168649. "mul r6, r7\n\t"
  168650. #endif
  168651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168652. "lsrs r7, r6, #16\n\t"
  168653. #else
  168654. "lsr r7, r6, #16\n\t"
  168655. #endif
  168656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168657. "lsls r6, r6, #16\n\t"
  168658. #else
  168659. "lsl r6, r6, #16\n\t"
  168660. #endif
  168661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168662. "adds r5, r5, r6\n\t"
  168663. #else
  168664. "add r5, r5, r6\n\t"
  168665. #endif
  168666. #ifdef WOLFSSL_KEIL
  168667. "adcs r3, r3, r7\n\t"
  168668. #elif defined(__clang__)
  168669. "adcs r3, r7\n\t"
  168670. #else
  168671. "adc r3, r7\n\t"
  168672. #endif
  168673. #ifdef WOLFSSL_KEIL
  168674. "adcs r4, r4, %[r]\n\t"
  168675. #elif defined(__clang__)
  168676. "adcs r4, %[r]\n\t"
  168677. #else
  168678. "adc r4, %[r]\n\t"
  168679. #endif
  168680. "# A[13] * B[13]\n\t"
  168681. "mov %[a], r9\n\t"
  168682. "mov %[b], r10\n\t"
  168683. "ldr %[a], [%[a], #52]\n\t"
  168684. "ldr %[b], [%[b], #52]\n\t"
  168685. "uxth r6, %[a]\n\t"
  168686. "uxth r7, %[b]\n\t"
  168687. #ifdef WOLFSSL_KEIL
  168688. "muls r7, r6, r7\n\t"
  168689. #elif defined(__clang__)
  168690. "muls r7, r6\n\t"
  168691. #else
  168692. "mul r7, r6\n\t"
  168693. #endif
  168694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168695. "adds r5, r5, r7\n\t"
  168696. #else
  168697. "add r5, r5, r7\n\t"
  168698. #endif
  168699. #ifdef WOLFSSL_KEIL
  168700. "adcs r3, r3, %[r]\n\t"
  168701. #elif defined(__clang__)
  168702. "adcs r3, %[r]\n\t"
  168703. #else
  168704. "adc r3, %[r]\n\t"
  168705. #endif
  168706. #ifdef WOLFSSL_KEIL
  168707. "adcs r4, r4, %[r]\n\t"
  168708. #elif defined(__clang__)
  168709. "adcs r4, %[r]\n\t"
  168710. #else
  168711. "adc r4, %[r]\n\t"
  168712. #endif
  168713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168714. "lsrs r7, %[b], #16\n\t"
  168715. #else
  168716. "lsr r7, %[b], #16\n\t"
  168717. #endif
  168718. #ifdef WOLFSSL_KEIL
  168719. "muls r6, r7, r6\n\t"
  168720. #elif defined(__clang__)
  168721. "muls r6, r7\n\t"
  168722. #else
  168723. "mul r6, r7\n\t"
  168724. #endif
  168725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168726. "lsrs r7, r6, #16\n\t"
  168727. #else
  168728. "lsr r7, r6, #16\n\t"
  168729. #endif
  168730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168731. "lsls r6, r6, #16\n\t"
  168732. #else
  168733. "lsl r6, r6, #16\n\t"
  168734. #endif
  168735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168736. "adds r5, r5, r6\n\t"
  168737. #else
  168738. "add r5, r5, r6\n\t"
  168739. #endif
  168740. #ifdef WOLFSSL_KEIL
  168741. "adcs r3, r3, r7\n\t"
  168742. #elif defined(__clang__)
  168743. "adcs r3, r7\n\t"
  168744. #else
  168745. "adc r3, r7\n\t"
  168746. #endif
  168747. #ifdef WOLFSSL_KEIL
  168748. "adcs r4, r4, %[r]\n\t"
  168749. #elif defined(__clang__)
  168750. "adcs r4, %[r]\n\t"
  168751. #else
  168752. "adc r4, %[r]\n\t"
  168753. #endif
  168754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168755. "lsrs r6, %[a], #16\n\t"
  168756. #else
  168757. "lsr r6, %[a], #16\n\t"
  168758. #endif
  168759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168760. "lsrs r7, %[b], #16\n\t"
  168761. #else
  168762. "lsr r7, %[b], #16\n\t"
  168763. #endif
  168764. #ifdef WOLFSSL_KEIL
  168765. "muls r7, r6, r7\n\t"
  168766. #elif defined(__clang__)
  168767. "muls r7, r6\n\t"
  168768. #else
  168769. "mul r7, r6\n\t"
  168770. #endif
  168771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168772. "adds r3, r3, r7\n\t"
  168773. #else
  168774. "add r3, r3, r7\n\t"
  168775. #endif
  168776. #ifdef WOLFSSL_KEIL
  168777. "adcs r4, r4, %[r]\n\t"
  168778. #elif defined(__clang__)
  168779. "adcs r4, %[r]\n\t"
  168780. #else
  168781. "adc r4, %[r]\n\t"
  168782. #endif
  168783. "uxth r7, %[b]\n\t"
  168784. #ifdef WOLFSSL_KEIL
  168785. "muls r6, r7, r6\n\t"
  168786. #elif defined(__clang__)
  168787. "muls r6, r7\n\t"
  168788. #else
  168789. "mul r6, r7\n\t"
  168790. #endif
  168791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168792. "lsrs r7, r6, #16\n\t"
  168793. #else
  168794. "lsr r7, r6, #16\n\t"
  168795. #endif
  168796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168797. "lsls r6, r6, #16\n\t"
  168798. #else
  168799. "lsl r6, r6, #16\n\t"
  168800. #endif
  168801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168802. "adds r5, r5, r6\n\t"
  168803. #else
  168804. "add r5, r5, r6\n\t"
  168805. #endif
  168806. #ifdef WOLFSSL_KEIL
  168807. "adcs r3, r3, r7\n\t"
  168808. #elif defined(__clang__)
  168809. "adcs r3, r7\n\t"
  168810. #else
  168811. "adc r3, r7\n\t"
  168812. #endif
  168813. #ifdef WOLFSSL_KEIL
  168814. "adcs r4, r4, %[r]\n\t"
  168815. #elif defined(__clang__)
  168816. "adcs r4, %[r]\n\t"
  168817. #else
  168818. "adc r4, %[r]\n\t"
  168819. #endif
  168820. "# A[12] * B[14]\n\t"
  168821. "mov %[a], r9\n\t"
  168822. "mov %[b], r10\n\t"
  168823. "ldr %[a], [%[a], #48]\n\t"
  168824. "ldr %[b], [%[b], #56]\n\t"
  168825. "uxth r6, %[a]\n\t"
  168826. "uxth r7, %[b]\n\t"
  168827. #ifdef WOLFSSL_KEIL
  168828. "muls r7, r6, r7\n\t"
  168829. #elif defined(__clang__)
  168830. "muls r7, r6\n\t"
  168831. #else
  168832. "mul r7, r6\n\t"
  168833. #endif
  168834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168835. "adds r5, r5, r7\n\t"
  168836. #else
  168837. "add r5, r5, r7\n\t"
  168838. #endif
  168839. #ifdef WOLFSSL_KEIL
  168840. "adcs r3, r3, %[r]\n\t"
  168841. #elif defined(__clang__)
  168842. "adcs r3, %[r]\n\t"
  168843. #else
  168844. "adc r3, %[r]\n\t"
  168845. #endif
  168846. #ifdef WOLFSSL_KEIL
  168847. "adcs r4, r4, %[r]\n\t"
  168848. #elif defined(__clang__)
  168849. "adcs r4, %[r]\n\t"
  168850. #else
  168851. "adc r4, %[r]\n\t"
  168852. #endif
  168853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168854. "lsrs r7, %[b], #16\n\t"
  168855. #else
  168856. "lsr r7, %[b], #16\n\t"
  168857. #endif
  168858. #ifdef WOLFSSL_KEIL
  168859. "muls r6, r7, r6\n\t"
  168860. #elif defined(__clang__)
  168861. "muls r6, r7\n\t"
  168862. #else
  168863. "mul r6, r7\n\t"
  168864. #endif
  168865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168866. "lsrs r7, r6, #16\n\t"
  168867. #else
  168868. "lsr r7, r6, #16\n\t"
  168869. #endif
  168870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168871. "lsls r6, r6, #16\n\t"
  168872. #else
  168873. "lsl r6, r6, #16\n\t"
  168874. #endif
  168875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168876. "adds r5, r5, r6\n\t"
  168877. #else
  168878. "add r5, r5, r6\n\t"
  168879. #endif
  168880. #ifdef WOLFSSL_KEIL
  168881. "adcs r3, r3, r7\n\t"
  168882. #elif defined(__clang__)
  168883. "adcs r3, r7\n\t"
  168884. #else
  168885. "adc r3, r7\n\t"
  168886. #endif
  168887. #ifdef WOLFSSL_KEIL
  168888. "adcs r4, r4, %[r]\n\t"
  168889. #elif defined(__clang__)
  168890. "adcs r4, %[r]\n\t"
  168891. #else
  168892. "adc r4, %[r]\n\t"
  168893. #endif
  168894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168895. "lsrs r6, %[a], #16\n\t"
  168896. #else
  168897. "lsr r6, %[a], #16\n\t"
  168898. #endif
  168899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168900. "lsrs r7, %[b], #16\n\t"
  168901. #else
  168902. "lsr r7, %[b], #16\n\t"
  168903. #endif
  168904. #ifdef WOLFSSL_KEIL
  168905. "muls r7, r6, r7\n\t"
  168906. #elif defined(__clang__)
  168907. "muls r7, r6\n\t"
  168908. #else
  168909. "mul r7, r6\n\t"
  168910. #endif
  168911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168912. "adds r3, r3, r7\n\t"
  168913. #else
  168914. "add r3, r3, r7\n\t"
  168915. #endif
  168916. #ifdef WOLFSSL_KEIL
  168917. "adcs r4, r4, %[r]\n\t"
  168918. #elif defined(__clang__)
  168919. "adcs r4, %[r]\n\t"
  168920. #else
  168921. "adc r4, %[r]\n\t"
  168922. #endif
  168923. "uxth r7, %[b]\n\t"
  168924. #ifdef WOLFSSL_KEIL
  168925. "muls r6, r7, r6\n\t"
  168926. #elif defined(__clang__)
  168927. "muls r6, r7\n\t"
  168928. #else
  168929. "mul r6, r7\n\t"
  168930. #endif
  168931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168932. "lsrs r7, r6, #16\n\t"
  168933. #else
  168934. "lsr r7, r6, #16\n\t"
  168935. #endif
  168936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168937. "lsls r6, r6, #16\n\t"
  168938. #else
  168939. "lsl r6, r6, #16\n\t"
  168940. #endif
  168941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168942. "adds r5, r5, r6\n\t"
  168943. #else
  168944. "add r5, r5, r6\n\t"
  168945. #endif
  168946. #ifdef WOLFSSL_KEIL
  168947. "adcs r3, r3, r7\n\t"
  168948. #elif defined(__clang__)
  168949. "adcs r3, r7\n\t"
  168950. #else
  168951. "adc r3, r7\n\t"
  168952. #endif
  168953. #ifdef WOLFSSL_KEIL
  168954. "adcs r4, r4, %[r]\n\t"
  168955. #elif defined(__clang__)
  168956. "adcs r4, %[r]\n\t"
  168957. #else
  168958. "adc r4, %[r]\n\t"
  168959. #endif
  168960. "# A[11] * B[15]\n\t"
  168961. "mov %[a], r9\n\t"
  168962. "mov %[b], r10\n\t"
  168963. "ldr %[a], [%[a], #44]\n\t"
  168964. "ldr %[b], [%[b], #60]\n\t"
  168965. "uxth r6, %[a]\n\t"
  168966. "uxth r7, %[b]\n\t"
  168967. #ifdef WOLFSSL_KEIL
  168968. "muls r7, r6, r7\n\t"
  168969. #elif defined(__clang__)
  168970. "muls r7, r6\n\t"
  168971. #else
  168972. "mul r7, r6\n\t"
  168973. #endif
  168974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168975. "adds r5, r5, r7\n\t"
  168976. #else
  168977. "add r5, r5, r7\n\t"
  168978. #endif
  168979. #ifdef WOLFSSL_KEIL
  168980. "adcs r3, r3, %[r]\n\t"
  168981. #elif defined(__clang__)
  168982. "adcs r3, %[r]\n\t"
  168983. #else
  168984. "adc r3, %[r]\n\t"
  168985. #endif
  168986. #ifdef WOLFSSL_KEIL
  168987. "adcs r4, r4, %[r]\n\t"
  168988. #elif defined(__clang__)
  168989. "adcs r4, %[r]\n\t"
  168990. #else
  168991. "adc r4, %[r]\n\t"
  168992. #endif
  168993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168994. "lsrs r7, %[b], #16\n\t"
  168995. #else
  168996. "lsr r7, %[b], #16\n\t"
  168997. #endif
  168998. #ifdef WOLFSSL_KEIL
  168999. "muls r6, r7, r6\n\t"
  169000. #elif defined(__clang__)
  169001. "muls r6, r7\n\t"
  169002. #else
  169003. "mul r6, r7\n\t"
  169004. #endif
  169005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169006. "lsrs r7, r6, #16\n\t"
  169007. #else
  169008. "lsr r7, r6, #16\n\t"
  169009. #endif
  169010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169011. "lsls r6, r6, #16\n\t"
  169012. #else
  169013. "lsl r6, r6, #16\n\t"
  169014. #endif
  169015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169016. "adds r5, r5, r6\n\t"
  169017. #else
  169018. "add r5, r5, r6\n\t"
  169019. #endif
  169020. #ifdef WOLFSSL_KEIL
  169021. "adcs r3, r3, r7\n\t"
  169022. #elif defined(__clang__)
  169023. "adcs r3, r7\n\t"
  169024. #else
  169025. "adc r3, r7\n\t"
  169026. #endif
  169027. #ifdef WOLFSSL_KEIL
  169028. "adcs r4, r4, %[r]\n\t"
  169029. #elif defined(__clang__)
  169030. "adcs r4, %[r]\n\t"
  169031. #else
  169032. "adc r4, %[r]\n\t"
  169033. #endif
  169034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169035. "lsrs r6, %[a], #16\n\t"
  169036. #else
  169037. "lsr r6, %[a], #16\n\t"
  169038. #endif
  169039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169040. "lsrs r7, %[b], #16\n\t"
  169041. #else
  169042. "lsr r7, %[b], #16\n\t"
  169043. #endif
  169044. #ifdef WOLFSSL_KEIL
  169045. "muls r7, r6, r7\n\t"
  169046. #elif defined(__clang__)
  169047. "muls r7, r6\n\t"
  169048. #else
  169049. "mul r7, r6\n\t"
  169050. #endif
  169051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169052. "adds r3, r3, r7\n\t"
  169053. #else
  169054. "add r3, r3, r7\n\t"
  169055. #endif
  169056. #ifdef WOLFSSL_KEIL
  169057. "adcs r4, r4, %[r]\n\t"
  169058. #elif defined(__clang__)
  169059. "adcs r4, %[r]\n\t"
  169060. #else
  169061. "adc r4, %[r]\n\t"
  169062. #endif
  169063. "uxth r7, %[b]\n\t"
  169064. #ifdef WOLFSSL_KEIL
  169065. "muls r6, r7, r6\n\t"
  169066. #elif defined(__clang__)
  169067. "muls r6, r7\n\t"
  169068. #else
  169069. "mul r6, r7\n\t"
  169070. #endif
  169071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169072. "lsrs r7, r6, #16\n\t"
  169073. #else
  169074. "lsr r7, r6, #16\n\t"
  169075. #endif
  169076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169077. "lsls r6, r6, #16\n\t"
  169078. #else
  169079. "lsl r6, r6, #16\n\t"
  169080. #endif
  169081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169082. "adds r5, r5, r6\n\t"
  169083. #else
  169084. "add r5, r5, r6\n\t"
  169085. #endif
  169086. #ifdef WOLFSSL_KEIL
  169087. "adcs r3, r3, r7\n\t"
  169088. #elif defined(__clang__)
  169089. "adcs r3, r7\n\t"
  169090. #else
  169091. "adc r3, r7\n\t"
  169092. #endif
  169093. #ifdef WOLFSSL_KEIL
  169094. "adcs r4, r4, %[r]\n\t"
  169095. #elif defined(__clang__)
  169096. "adcs r4, %[r]\n\t"
  169097. #else
  169098. "adc r4, %[r]\n\t"
  169099. #endif
  169100. "mov %[r], r8\n\t"
  169101. "str r5, [%[r], #104]\n\t"
  169102. "movs %[r], #0\n\t"
  169103. "# A[12] * B[15]\n\t"
  169104. "movs r5, #0\n\t"
  169105. "mov %[a], r9\n\t"
  169106. "mov %[b], r10\n\t"
  169107. "ldr %[a], [%[a], #48]\n\t"
  169108. "ldr %[b], [%[b], #60]\n\t"
  169109. "uxth r6, %[a]\n\t"
  169110. "uxth r7, %[b]\n\t"
  169111. #ifdef WOLFSSL_KEIL
  169112. "muls r7, r6, r7\n\t"
  169113. #elif defined(__clang__)
  169114. "muls r7, r6\n\t"
  169115. #else
  169116. "mul r7, r6\n\t"
  169117. #endif
  169118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169119. "adds r3, r3, r7\n\t"
  169120. #else
  169121. "add r3, r3, r7\n\t"
  169122. #endif
  169123. #ifdef WOLFSSL_KEIL
  169124. "adcs r4, r4, %[r]\n\t"
  169125. #elif defined(__clang__)
  169126. "adcs r4, %[r]\n\t"
  169127. #else
  169128. "adc r4, %[r]\n\t"
  169129. #endif
  169130. #ifdef WOLFSSL_KEIL
  169131. "adcs r5, r5, %[r]\n\t"
  169132. #elif defined(__clang__)
  169133. "adcs r5, %[r]\n\t"
  169134. #else
  169135. "adc r5, %[r]\n\t"
  169136. #endif
  169137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169138. "lsrs r7, %[b], #16\n\t"
  169139. #else
  169140. "lsr r7, %[b], #16\n\t"
  169141. #endif
  169142. #ifdef WOLFSSL_KEIL
  169143. "muls r6, r7, r6\n\t"
  169144. #elif defined(__clang__)
  169145. "muls r6, r7\n\t"
  169146. #else
  169147. "mul r6, r7\n\t"
  169148. #endif
  169149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169150. "lsrs r7, r6, #16\n\t"
  169151. #else
  169152. "lsr r7, r6, #16\n\t"
  169153. #endif
  169154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169155. "lsls r6, r6, #16\n\t"
  169156. #else
  169157. "lsl r6, r6, #16\n\t"
  169158. #endif
  169159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169160. "adds r3, r3, r6\n\t"
  169161. #else
  169162. "add r3, r3, r6\n\t"
  169163. #endif
  169164. #ifdef WOLFSSL_KEIL
  169165. "adcs r4, r4, r7\n\t"
  169166. #elif defined(__clang__)
  169167. "adcs r4, r7\n\t"
  169168. #else
  169169. "adc r4, r7\n\t"
  169170. #endif
  169171. #ifdef WOLFSSL_KEIL
  169172. "adcs r5, r5, %[r]\n\t"
  169173. #elif defined(__clang__)
  169174. "adcs r5, %[r]\n\t"
  169175. #else
  169176. "adc r5, %[r]\n\t"
  169177. #endif
  169178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169179. "lsrs r6, %[a], #16\n\t"
  169180. #else
  169181. "lsr r6, %[a], #16\n\t"
  169182. #endif
  169183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169184. "lsrs r7, %[b], #16\n\t"
  169185. #else
  169186. "lsr r7, %[b], #16\n\t"
  169187. #endif
  169188. #ifdef WOLFSSL_KEIL
  169189. "muls r7, r6, r7\n\t"
  169190. #elif defined(__clang__)
  169191. "muls r7, r6\n\t"
  169192. #else
  169193. "mul r7, r6\n\t"
  169194. #endif
  169195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169196. "adds r4, r4, r7\n\t"
  169197. #else
  169198. "add r4, r4, r7\n\t"
  169199. #endif
  169200. #ifdef WOLFSSL_KEIL
  169201. "adcs r5, r5, %[r]\n\t"
  169202. #elif defined(__clang__)
  169203. "adcs r5, %[r]\n\t"
  169204. #else
  169205. "adc r5, %[r]\n\t"
  169206. #endif
  169207. "uxth r7, %[b]\n\t"
  169208. #ifdef WOLFSSL_KEIL
  169209. "muls r6, r7, r6\n\t"
  169210. #elif defined(__clang__)
  169211. "muls r6, r7\n\t"
  169212. #else
  169213. "mul r6, r7\n\t"
  169214. #endif
  169215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169216. "lsrs r7, r6, #16\n\t"
  169217. #else
  169218. "lsr r7, r6, #16\n\t"
  169219. #endif
  169220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169221. "lsls r6, r6, #16\n\t"
  169222. #else
  169223. "lsl r6, r6, #16\n\t"
  169224. #endif
  169225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169226. "adds r3, r3, r6\n\t"
  169227. #else
  169228. "add r3, r3, r6\n\t"
  169229. #endif
  169230. #ifdef WOLFSSL_KEIL
  169231. "adcs r4, r4, r7\n\t"
  169232. #elif defined(__clang__)
  169233. "adcs r4, r7\n\t"
  169234. #else
  169235. "adc r4, r7\n\t"
  169236. #endif
  169237. #ifdef WOLFSSL_KEIL
  169238. "adcs r5, r5, %[r]\n\t"
  169239. #elif defined(__clang__)
  169240. "adcs r5, %[r]\n\t"
  169241. #else
  169242. "adc r5, %[r]\n\t"
  169243. #endif
  169244. "# A[13] * B[14]\n\t"
  169245. "mov %[a], r9\n\t"
  169246. "mov %[b], r10\n\t"
  169247. "ldr %[a], [%[a], #52]\n\t"
  169248. "ldr %[b], [%[b], #56]\n\t"
  169249. "uxth r6, %[a]\n\t"
  169250. "uxth r7, %[b]\n\t"
  169251. #ifdef WOLFSSL_KEIL
  169252. "muls r7, r6, r7\n\t"
  169253. #elif defined(__clang__)
  169254. "muls r7, r6\n\t"
  169255. #else
  169256. "mul r7, r6\n\t"
  169257. #endif
  169258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169259. "adds r3, r3, r7\n\t"
  169260. #else
  169261. "add r3, r3, r7\n\t"
  169262. #endif
  169263. #ifdef WOLFSSL_KEIL
  169264. "adcs r4, r4, %[r]\n\t"
  169265. #elif defined(__clang__)
  169266. "adcs r4, %[r]\n\t"
  169267. #else
  169268. "adc r4, %[r]\n\t"
  169269. #endif
  169270. #ifdef WOLFSSL_KEIL
  169271. "adcs r5, r5, %[r]\n\t"
  169272. #elif defined(__clang__)
  169273. "adcs r5, %[r]\n\t"
  169274. #else
  169275. "adc r5, %[r]\n\t"
  169276. #endif
  169277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169278. "lsrs r7, %[b], #16\n\t"
  169279. #else
  169280. "lsr r7, %[b], #16\n\t"
  169281. #endif
  169282. #ifdef WOLFSSL_KEIL
  169283. "muls r6, r7, r6\n\t"
  169284. #elif defined(__clang__)
  169285. "muls r6, r7\n\t"
  169286. #else
  169287. "mul r6, r7\n\t"
  169288. #endif
  169289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169290. "lsrs r7, r6, #16\n\t"
  169291. #else
  169292. "lsr r7, r6, #16\n\t"
  169293. #endif
  169294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169295. "lsls r6, r6, #16\n\t"
  169296. #else
  169297. "lsl r6, r6, #16\n\t"
  169298. #endif
  169299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169300. "adds r3, r3, r6\n\t"
  169301. #else
  169302. "add r3, r3, r6\n\t"
  169303. #endif
  169304. #ifdef WOLFSSL_KEIL
  169305. "adcs r4, r4, r7\n\t"
  169306. #elif defined(__clang__)
  169307. "adcs r4, r7\n\t"
  169308. #else
  169309. "adc r4, r7\n\t"
  169310. #endif
  169311. #ifdef WOLFSSL_KEIL
  169312. "adcs r5, r5, %[r]\n\t"
  169313. #elif defined(__clang__)
  169314. "adcs r5, %[r]\n\t"
  169315. #else
  169316. "adc r5, %[r]\n\t"
  169317. #endif
  169318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169319. "lsrs r6, %[a], #16\n\t"
  169320. #else
  169321. "lsr r6, %[a], #16\n\t"
  169322. #endif
  169323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169324. "lsrs r7, %[b], #16\n\t"
  169325. #else
  169326. "lsr r7, %[b], #16\n\t"
  169327. #endif
  169328. #ifdef WOLFSSL_KEIL
  169329. "muls r7, r6, r7\n\t"
  169330. #elif defined(__clang__)
  169331. "muls r7, r6\n\t"
  169332. #else
  169333. "mul r7, r6\n\t"
  169334. #endif
  169335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169336. "adds r4, r4, r7\n\t"
  169337. #else
  169338. "add r4, r4, r7\n\t"
  169339. #endif
  169340. #ifdef WOLFSSL_KEIL
  169341. "adcs r5, r5, %[r]\n\t"
  169342. #elif defined(__clang__)
  169343. "adcs r5, %[r]\n\t"
  169344. #else
  169345. "adc r5, %[r]\n\t"
  169346. #endif
  169347. "uxth r7, %[b]\n\t"
  169348. #ifdef WOLFSSL_KEIL
  169349. "muls r6, r7, r6\n\t"
  169350. #elif defined(__clang__)
  169351. "muls r6, r7\n\t"
  169352. #else
  169353. "mul r6, r7\n\t"
  169354. #endif
  169355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169356. "lsrs r7, r6, #16\n\t"
  169357. #else
  169358. "lsr r7, r6, #16\n\t"
  169359. #endif
  169360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169361. "lsls r6, r6, #16\n\t"
  169362. #else
  169363. "lsl r6, r6, #16\n\t"
  169364. #endif
  169365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169366. "adds r3, r3, r6\n\t"
  169367. #else
  169368. "add r3, r3, r6\n\t"
  169369. #endif
  169370. #ifdef WOLFSSL_KEIL
  169371. "adcs r4, r4, r7\n\t"
  169372. #elif defined(__clang__)
  169373. "adcs r4, r7\n\t"
  169374. #else
  169375. "adc r4, r7\n\t"
  169376. #endif
  169377. #ifdef WOLFSSL_KEIL
  169378. "adcs r5, r5, %[r]\n\t"
  169379. #elif defined(__clang__)
  169380. "adcs r5, %[r]\n\t"
  169381. #else
  169382. "adc r5, %[r]\n\t"
  169383. #endif
  169384. "# A[14] * B[13]\n\t"
  169385. "mov %[a], r9\n\t"
  169386. "mov %[b], r10\n\t"
  169387. "ldr %[a], [%[a], #56]\n\t"
  169388. "ldr %[b], [%[b], #52]\n\t"
  169389. "uxth r6, %[a]\n\t"
  169390. "uxth r7, %[b]\n\t"
  169391. #ifdef WOLFSSL_KEIL
  169392. "muls r7, r6, r7\n\t"
  169393. #elif defined(__clang__)
  169394. "muls r7, r6\n\t"
  169395. #else
  169396. "mul r7, r6\n\t"
  169397. #endif
  169398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169399. "adds r3, r3, r7\n\t"
  169400. #else
  169401. "add r3, r3, r7\n\t"
  169402. #endif
  169403. #ifdef WOLFSSL_KEIL
  169404. "adcs r4, r4, %[r]\n\t"
  169405. #elif defined(__clang__)
  169406. "adcs r4, %[r]\n\t"
  169407. #else
  169408. "adc r4, %[r]\n\t"
  169409. #endif
  169410. #ifdef WOLFSSL_KEIL
  169411. "adcs r5, r5, %[r]\n\t"
  169412. #elif defined(__clang__)
  169413. "adcs r5, %[r]\n\t"
  169414. #else
  169415. "adc r5, %[r]\n\t"
  169416. #endif
  169417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169418. "lsrs r7, %[b], #16\n\t"
  169419. #else
  169420. "lsr r7, %[b], #16\n\t"
  169421. #endif
  169422. #ifdef WOLFSSL_KEIL
  169423. "muls r6, r7, r6\n\t"
  169424. #elif defined(__clang__)
  169425. "muls r6, r7\n\t"
  169426. #else
  169427. "mul r6, r7\n\t"
  169428. #endif
  169429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169430. "lsrs r7, r6, #16\n\t"
  169431. #else
  169432. "lsr r7, r6, #16\n\t"
  169433. #endif
  169434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169435. "lsls r6, r6, #16\n\t"
  169436. #else
  169437. "lsl r6, r6, #16\n\t"
  169438. #endif
  169439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169440. "adds r3, r3, r6\n\t"
  169441. #else
  169442. "add r3, r3, r6\n\t"
  169443. #endif
  169444. #ifdef WOLFSSL_KEIL
  169445. "adcs r4, r4, r7\n\t"
  169446. #elif defined(__clang__)
  169447. "adcs r4, r7\n\t"
  169448. #else
  169449. "adc r4, r7\n\t"
  169450. #endif
  169451. #ifdef WOLFSSL_KEIL
  169452. "adcs r5, r5, %[r]\n\t"
  169453. #elif defined(__clang__)
  169454. "adcs r5, %[r]\n\t"
  169455. #else
  169456. "adc r5, %[r]\n\t"
  169457. #endif
  169458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169459. "lsrs r6, %[a], #16\n\t"
  169460. #else
  169461. "lsr r6, %[a], #16\n\t"
  169462. #endif
  169463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169464. "lsrs r7, %[b], #16\n\t"
  169465. #else
  169466. "lsr r7, %[b], #16\n\t"
  169467. #endif
  169468. #ifdef WOLFSSL_KEIL
  169469. "muls r7, r6, r7\n\t"
  169470. #elif defined(__clang__)
  169471. "muls r7, r6\n\t"
  169472. #else
  169473. "mul r7, r6\n\t"
  169474. #endif
  169475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169476. "adds r4, r4, r7\n\t"
  169477. #else
  169478. "add r4, r4, r7\n\t"
  169479. #endif
  169480. #ifdef WOLFSSL_KEIL
  169481. "adcs r5, r5, %[r]\n\t"
  169482. #elif defined(__clang__)
  169483. "adcs r5, %[r]\n\t"
  169484. #else
  169485. "adc r5, %[r]\n\t"
  169486. #endif
  169487. "uxth r7, %[b]\n\t"
  169488. #ifdef WOLFSSL_KEIL
  169489. "muls r6, r7, r6\n\t"
  169490. #elif defined(__clang__)
  169491. "muls r6, r7\n\t"
  169492. #else
  169493. "mul r6, r7\n\t"
  169494. #endif
  169495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169496. "lsrs r7, r6, #16\n\t"
  169497. #else
  169498. "lsr r7, r6, #16\n\t"
  169499. #endif
  169500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169501. "lsls r6, r6, #16\n\t"
  169502. #else
  169503. "lsl r6, r6, #16\n\t"
  169504. #endif
  169505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169506. "adds r3, r3, r6\n\t"
  169507. #else
  169508. "add r3, r3, r6\n\t"
  169509. #endif
  169510. #ifdef WOLFSSL_KEIL
  169511. "adcs r4, r4, r7\n\t"
  169512. #elif defined(__clang__)
  169513. "adcs r4, r7\n\t"
  169514. #else
  169515. "adc r4, r7\n\t"
  169516. #endif
  169517. #ifdef WOLFSSL_KEIL
  169518. "adcs r5, r5, %[r]\n\t"
  169519. #elif defined(__clang__)
  169520. "adcs r5, %[r]\n\t"
  169521. #else
  169522. "adc r5, %[r]\n\t"
  169523. #endif
  169524. "# A[15] * B[12]\n\t"
  169525. "mov %[a], r9\n\t"
  169526. "mov %[b], r10\n\t"
  169527. "ldr %[a], [%[a], #60]\n\t"
  169528. "ldr %[b], [%[b], #48]\n\t"
  169529. "uxth r6, %[a]\n\t"
  169530. "uxth r7, %[b]\n\t"
  169531. #ifdef WOLFSSL_KEIL
  169532. "muls r7, r6, r7\n\t"
  169533. #elif defined(__clang__)
  169534. "muls r7, r6\n\t"
  169535. #else
  169536. "mul r7, r6\n\t"
  169537. #endif
  169538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169539. "adds r3, r3, r7\n\t"
  169540. #else
  169541. "add r3, r3, r7\n\t"
  169542. #endif
  169543. #ifdef WOLFSSL_KEIL
  169544. "adcs r4, r4, %[r]\n\t"
  169545. #elif defined(__clang__)
  169546. "adcs r4, %[r]\n\t"
  169547. #else
  169548. "adc r4, %[r]\n\t"
  169549. #endif
  169550. #ifdef WOLFSSL_KEIL
  169551. "adcs r5, r5, %[r]\n\t"
  169552. #elif defined(__clang__)
  169553. "adcs r5, %[r]\n\t"
  169554. #else
  169555. "adc r5, %[r]\n\t"
  169556. #endif
  169557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169558. "lsrs r7, %[b], #16\n\t"
  169559. #else
  169560. "lsr r7, %[b], #16\n\t"
  169561. #endif
  169562. #ifdef WOLFSSL_KEIL
  169563. "muls r6, r7, r6\n\t"
  169564. #elif defined(__clang__)
  169565. "muls r6, r7\n\t"
  169566. #else
  169567. "mul r6, r7\n\t"
  169568. #endif
  169569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169570. "lsrs r7, r6, #16\n\t"
  169571. #else
  169572. "lsr r7, r6, #16\n\t"
  169573. #endif
  169574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169575. "lsls r6, r6, #16\n\t"
  169576. #else
  169577. "lsl r6, r6, #16\n\t"
  169578. #endif
  169579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169580. "adds r3, r3, r6\n\t"
  169581. #else
  169582. "add r3, r3, r6\n\t"
  169583. #endif
  169584. #ifdef WOLFSSL_KEIL
  169585. "adcs r4, r4, r7\n\t"
  169586. #elif defined(__clang__)
  169587. "adcs r4, r7\n\t"
  169588. #else
  169589. "adc r4, r7\n\t"
  169590. #endif
  169591. #ifdef WOLFSSL_KEIL
  169592. "adcs r5, r5, %[r]\n\t"
  169593. #elif defined(__clang__)
  169594. "adcs r5, %[r]\n\t"
  169595. #else
  169596. "adc r5, %[r]\n\t"
  169597. #endif
  169598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169599. "lsrs r6, %[a], #16\n\t"
  169600. #else
  169601. "lsr r6, %[a], #16\n\t"
  169602. #endif
  169603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169604. "lsrs r7, %[b], #16\n\t"
  169605. #else
  169606. "lsr r7, %[b], #16\n\t"
  169607. #endif
  169608. #ifdef WOLFSSL_KEIL
  169609. "muls r7, r6, r7\n\t"
  169610. #elif defined(__clang__)
  169611. "muls r7, r6\n\t"
  169612. #else
  169613. "mul r7, r6\n\t"
  169614. #endif
  169615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169616. "adds r4, r4, r7\n\t"
  169617. #else
  169618. "add r4, r4, r7\n\t"
  169619. #endif
  169620. #ifdef WOLFSSL_KEIL
  169621. "adcs r5, r5, %[r]\n\t"
  169622. #elif defined(__clang__)
  169623. "adcs r5, %[r]\n\t"
  169624. #else
  169625. "adc r5, %[r]\n\t"
  169626. #endif
  169627. "uxth r7, %[b]\n\t"
  169628. #ifdef WOLFSSL_KEIL
  169629. "muls r6, r7, r6\n\t"
  169630. #elif defined(__clang__)
  169631. "muls r6, r7\n\t"
  169632. #else
  169633. "mul r6, r7\n\t"
  169634. #endif
  169635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169636. "lsrs r7, r6, #16\n\t"
  169637. #else
  169638. "lsr r7, r6, #16\n\t"
  169639. #endif
  169640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169641. "lsls r6, r6, #16\n\t"
  169642. #else
  169643. "lsl r6, r6, #16\n\t"
  169644. #endif
  169645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169646. "adds r3, r3, r6\n\t"
  169647. #else
  169648. "add r3, r3, r6\n\t"
  169649. #endif
  169650. #ifdef WOLFSSL_KEIL
  169651. "adcs r4, r4, r7\n\t"
  169652. #elif defined(__clang__)
  169653. "adcs r4, r7\n\t"
  169654. #else
  169655. "adc r4, r7\n\t"
  169656. #endif
  169657. #ifdef WOLFSSL_KEIL
  169658. "adcs r5, r5, %[r]\n\t"
  169659. #elif defined(__clang__)
  169660. "adcs r5, %[r]\n\t"
  169661. #else
  169662. "adc r5, %[r]\n\t"
  169663. #endif
  169664. "mov %[r], r8\n\t"
  169665. "str r3, [%[r], #108]\n\t"
  169666. "movs %[r], #0\n\t"
  169667. "# A[15] * B[13]\n\t"
  169668. "movs r3, #0\n\t"
  169669. "mov %[a], r9\n\t"
  169670. "mov %[b], r10\n\t"
  169671. "ldr %[a], [%[a], #60]\n\t"
  169672. "ldr %[b], [%[b], #52]\n\t"
  169673. "uxth r6, %[a]\n\t"
  169674. "uxth r7, %[b]\n\t"
  169675. #ifdef WOLFSSL_KEIL
  169676. "muls r7, r6, r7\n\t"
  169677. #elif defined(__clang__)
  169678. "muls r7, r6\n\t"
  169679. #else
  169680. "mul r7, r6\n\t"
  169681. #endif
  169682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169683. "adds r4, r4, r7\n\t"
  169684. #else
  169685. "add r4, r4, r7\n\t"
  169686. #endif
  169687. #ifdef WOLFSSL_KEIL
  169688. "adcs r5, r5, %[r]\n\t"
  169689. #elif defined(__clang__)
  169690. "adcs r5, %[r]\n\t"
  169691. #else
  169692. "adc r5, %[r]\n\t"
  169693. #endif
  169694. #ifdef WOLFSSL_KEIL
  169695. "adcs r3, r3, %[r]\n\t"
  169696. #elif defined(__clang__)
  169697. "adcs r3, %[r]\n\t"
  169698. #else
  169699. "adc r3, %[r]\n\t"
  169700. #endif
  169701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169702. "lsrs r7, %[b], #16\n\t"
  169703. #else
  169704. "lsr r7, %[b], #16\n\t"
  169705. #endif
  169706. #ifdef WOLFSSL_KEIL
  169707. "muls r6, r7, r6\n\t"
  169708. #elif defined(__clang__)
  169709. "muls r6, r7\n\t"
  169710. #else
  169711. "mul r6, r7\n\t"
  169712. #endif
  169713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169714. "lsrs r7, r6, #16\n\t"
  169715. #else
  169716. "lsr r7, r6, #16\n\t"
  169717. #endif
  169718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169719. "lsls r6, r6, #16\n\t"
  169720. #else
  169721. "lsl r6, r6, #16\n\t"
  169722. #endif
  169723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169724. "adds r4, r4, r6\n\t"
  169725. #else
  169726. "add r4, r4, r6\n\t"
  169727. #endif
  169728. #ifdef WOLFSSL_KEIL
  169729. "adcs r5, r5, r7\n\t"
  169730. #elif defined(__clang__)
  169731. "adcs r5, r7\n\t"
  169732. #else
  169733. "adc r5, r7\n\t"
  169734. #endif
  169735. #ifdef WOLFSSL_KEIL
  169736. "adcs r3, r3, %[r]\n\t"
  169737. #elif defined(__clang__)
  169738. "adcs r3, %[r]\n\t"
  169739. #else
  169740. "adc r3, %[r]\n\t"
  169741. #endif
  169742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169743. "lsrs r6, %[a], #16\n\t"
  169744. #else
  169745. "lsr r6, %[a], #16\n\t"
  169746. #endif
  169747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169748. "lsrs r7, %[b], #16\n\t"
  169749. #else
  169750. "lsr r7, %[b], #16\n\t"
  169751. #endif
  169752. #ifdef WOLFSSL_KEIL
  169753. "muls r7, r6, r7\n\t"
  169754. #elif defined(__clang__)
  169755. "muls r7, r6\n\t"
  169756. #else
  169757. "mul r7, r6\n\t"
  169758. #endif
  169759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169760. "adds r5, r5, r7\n\t"
  169761. #else
  169762. "add r5, r5, r7\n\t"
  169763. #endif
  169764. #ifdef WOLFSSL_KEIL
  169765. "adcs r3, r3, %[r]\n\t"
  169766. #elif defined(__clang__)
  169767. "adcs r3, %[r]\n\t"
  169768. #else
  169769. "adc r3, %[r]\n\t"
  169770. #endif
  169771. "uxth r7, %[b]\n\t"
  169772. #ifdef WOLFSSL_KEIL
  169773. "muls r6, r7, r6\n\t"
  169774. #elif defined(__clang__)
  169775. "muls r6, r7\n\t"
  169776. #else
  169777. "mul r6, r7\n\t"
  169778. #endif
  169779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169780. "lsrs r7, r6, #16\n\t"
  169781. #else
  169782. "lsr r7, r6, #16\n\t"
  169783. #endif
  169784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169785. "lsls r6, r6, #16\n\t"
  169786. #else
  169787. "lsl r6, r6, #16\n\t"
  169788. #endif
  169789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169790. "adds r4, r4, r6\n\t"
  169791. #else
  169792. "add r4, r4, r6\n\t"
  169793. #endif
  169794. #ifdef WOLFSSL_KEIL
  169795. "adcs r5, r5, r7\n\t"
  169796. #elif defined(__clang__)
  169797. "adcs r5, r7\n\t"
  169798. #else
  169799. "adc r5, r7\n\t"
  169800. #endif
  169801. #ifdef WOLFSSL_KEIL
  169802. "adcs r3, r3, %[r]\n\t"
  169803. #elif defined(__clang__)
  169804. "adcs r3, %[r]\n\t"
  169805. #else
  169806. "adc r3, %[r]\n\t"
  169807. #endif
  169808. "# A[14] * B[14]\n\t"
  169809. "mov %[a], r9\n\t"
  169810. "mov %[b], r10\n\t"
  169811. "ldr %[a], [%[a], #56]\n\t"
  169812. "ldr %[b], [%[b], #56]\n\t"
  169813. "uxth r6, %[a]\n\t"
  169814. "uxth r7, %[b]\n\t"
  169815. #ifdef WOLFSSL_KEIL
  169816. "muls r7, r6, r7\n\t"
  169817. #elif defined(__clang__)
  169818. "muls r7, r6\n\t"
  169819. #else
  169820. "mul r7, r6\n\t"
  169821. #endif
  169822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169823. "adds r4, r4, r7\n\t"
  169824. #else
  169825. "add r4, r4, r7\n\t"
  169826. #endif
  169827. #ifdef WOLFSSL_KEIL
  169828. "adcs r5, r5, %[r]\n\t"
  169829. #elif defined(__clang__)
  169830. "adcs r5, %[r]\n\t"
  169831. #else
  169832. "adc r5, %[r]\n\t"
  169833. #endif
  169834. #ifdef WOLFSSL_KEIL
  169835. "adcs r3, r3, %[r]\n\t"
  169836. #elif defined(__clang__)
  169837. "adcs r3, %[r]\n\t"
  169838. #else
  169839. "adc r3, %[r]\n\t"
  169840. #endif
  169841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169842. "lsrs r7, %[b], #16\n\t"
  169843. #else
  169844. "lsr r7, %[b], #16\n\t"
  169845. #endif
  169846. #ifdef WOLFSSL_KEIL
  169847. "muls r6, r7, r6\n\t"
  169848. #elif defined(__clang__)
  169849. "muls r6, r7\n\t"
  169850. #else
  169851. "mul r6, r7\n\t"
  169852. #endif
  169853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169854. "lsrs r7, r6, #16\n\t"
  169855. #else
  169856. "lsr r7, r6, #16\n\t"
  169857. #endif
  169858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169859. "lsls r6, r6, #16\n\t"
  169860. #else
  169861. "lsl r6, r6, #16\n\t"
  169862. #endif
  169863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169864. "adds r4, r4, r6\n\t"
  169865. #else
  169866. "add r4, r4, r6\n\t"
  169867. #endif
  169868. #ifdef WOLFSSL_KEIL
  169869. "adcs r5, r5, r7\n\t"
  169870. #elif defined(__clang__)
  169871. "adcs r5, r7\n\t"
  169872. #else
  169873. "adc r5, r7\n\t"
  169874. #endif
  169875. #ifdef WOLFSSL_KEIL
  169876. "adcs r3, r3, %[r]\n\t"
  169877. #elif defined(__clang__)
  169878. "adcs r3, %[r]\n\t"
  169879. #else
  169880. "adc r3, %[r]\n\t"
  169881. #endif
  169882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169883. "lsrs r6, %[a], #16\n\t"
  169884. #else
  169885. "lsr r6, %[a], #16\n\t"
  169886. #endif
  169887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169888. "lsrs r7, %[b], #16\n\t"
  169889. #else
  169890. "lsr r7, %[b], #16\n\t"
  169891. #endif
  169892. #ifdef WOLFSSL_KEIL
  169893. "muls r7, r6, r7\n\t"
  169894. #elif defined(__clang__)
  169895. "muls r7, r6\n\t"
  169896. #else
  169897. "mul r7, r6\n\t"
  169898. #endif
  169899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169900. "adds r5, r5, r7\n\t"
  169901. #else
  169902. "add r5, r5, r7\n\t"
  169903. #endif
  169904. #ifdef WOLFSSL_KEIL
  169905. "adcs r3, r3, %[r]\n\t"
  169906. #elif defined(__clang__)
  169907. "adcs r3, %[r]\n\t"
  169908. #else
  169909. "adc r3, %[r]\n\t"
  169910. #endif
  169911. "uxth r7, %[b]\n\t"
  169912. #ifdef WOLFSSL_KEIL
  169913. "muls r6, r7, r6\n\t"
  169914. #elif defined(__clang__)
  169915. "muls r6, r7\n\t"
  169916. #else
  169917. "mul r6, r7\n\t"
  169918. #endif
  169919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169920. "lsrs r7, r6, #16\n\t"
  169921. #else
  169922. "lsr r7, r6, #16\n\t"
  169923. #endif
  169924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169925. "lsls r6, r6, #16\n\t"
  169926. #else
  169927. "lsl r6, r6, #16\n\t"
  169928. #endif
  169929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169930. "adds r4, r4, r6\n\t"
  169931. #else
  169932. "add r4, r4, r6\n\t"
  169933. #endif
  169934. #ifdef WOLFSSL_KEIL
  169935. "adcs r5, r5, r7\n\t"
  169936. #elif defined(__clang__)
  169937. "adcs r5, r7\n\t"
  169938. #else
  169939. "adc r5, r7\n\t"
  169940. #endif
  169941. #ifdef WOLFSSL_KEIL
  169942. "adcs r3, r3, %[r]\n\t"
  169943. #elif defined(__clang__)
  169944. "adcs r3, %[r]\n\t"
  169945. #else
  169946. "adc r3, %[r]\n\t"
  169947. #endif
  169948. "# A[13] * B[15]\n\t"
  169949. "mov %[a], r9\n\t"
  169950. "mov %[b], r10\n\t"
  169951. "ldr %[a], [%[a], #52]\n\t"
  169952. "ldr %[b], [%[b], #60]\n\t"
  169953. "uxth r6, %[a]\n\t"
  169954. "uxth r7, %[b]\n\t"
  169955. #ifdef WOLFSSL_KEIL
  169956. "muls r7, r6, r7\n\t"
  169957. #elif defined(__clang__)
  169958. "muls r7, r6\n\t"
  169959. #else
  169960. "mul r7, r6\n\t"
  169961. #endif
  169962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169963. "adds r4, r4, r7\n\t"
  169964. #else
  169965. "add r4, r4, r7\n\t"
  169966. #endif
  169967. #ifdef WOLFSSL_KEIL
  169968. "adcs r5, r5, %[r]\n\t"
  169969. #elif defined(__clang__)
  169970. "adcs r5, %[r]\n\t"
  169971. #else
  169972. "adc r5, %[r]\n\t"
  169973. #endif
  169974. #ifdef WOLFSSL_KEIL
  169975. "adcs r3, r3, %[r]\n\t"
  169976. #elif defined(__clang__)
  169977. "adcs r3, %[r]\n\t"
  169978. #else
  169979. "adc r3, %[r]\n\t"
  169980. #endif
  169981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169982. "lsrs r7, %[b], #16\n\t"
  169983. #else
  169984. "lsr r7, %[b], #16\n\t"
  169985. #endif
  169986. #ifdef WOLFSSL_KEIL
  169987. "muls r6, r7, r6\n\t"
  169988. #elif defined(__clang__)
  169989. "muls r6, r7\n\t"
  169990. #else
  169991. "mul r6, r7\n\t"
  169992. #endif
  169993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169994. "lsrs r7, r6, #16\n\t"
  169995. #else
  169996. "lsr r7, r6, #16\n\t"
  169997. #endif
  169998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169999. "lsls r6, r6, #16\n\t"
  170000. #else
  170001. "lsl r6, r6, #16\n\t"
  170002. #endif
  170003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170004. "adds r4, r4, r6\n\t"
  170005. #else
  170006. "add r4, r4, r6\n\t"
  170007. #endif
  170008. #ifdef WOLFSSL_KEIL
  170009. "adcs r5, r5, r7\n\t"
  170010. #elif defined(__clang__)
  170011. "adcs r5, r7\n\t"
  170012. #else
  170013. "adc r5, r7\n\t"
  170014. #endif
  170015. #ifdef WOLFSSL_KEIL
  170016. "adcs r3, r3, %[r]\n\t"
  170017. #elif defined(__clang__)
  170018. "adcs r3, %[r]\n\t"
  170019. #else
  170020. "adc r3, %[r]\n\t"
  170021. #endif
  170022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170023. "lsrs r6, %[a], #16\n\t"
  170024. #else
  170025. "lsr r6, %[a], #16\n\t"
  170026. #endif
  170027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170028. "lsrs r7, %[b], #16\n\t"
  170029. #else
  170030. "lsr r7, %[b], #16\n\t"
  170031. #endif
  170032. #ifdef WOLFSSL_KEIL
  170033. "muls r7, r6, r7\n\t"
  170034. #elif defined(__clang__)
  170035. "muls r7, r6\n\t"
  170036. #else
  170037. "mul r7, r6\n\t"
  170038. #endif
  170039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170040. "adds r5, r5, r7\n\t"
  170041. #else
  170042. "add r5, r5, r7\n\t"
  170043. #endif
  170044. #ifdef WOLFSSL_KEIL
  170045. "adcs r3, r3, %[r]\n\t"
  170046. #elif defined(__clang__)
  170047. "adcs r3, %[r]\n\t"
  170048. #else
  170049. "adc r3, %[r]\n\t"
  170050. #endif
  170051. "uxth r7, %[b]\n\t"
  170052. #ifdef WOLFSSL_KEIL
  170053. "muls r6, r7, r6\n\t"
  170054. #elif defined(__clang__)
  170055. "muls r6, r7\n\t"
  170056. #else
  170057. "mul r6, r7\n\t"
  170058. #endif
  170059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170060. "lsrs r7, r6, #16\n\t"
  170061. #else
  170062. "lsr r7, r6, #16\n\t"
  170063. #endif
  170064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170065. "lsls r6, r6, #16\n\t"
  170066. #else
  170067. "lsl r6, r6, #16\n\t"
  170068. #endif
  170069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170070. "adds r4, r4, r6\n\t"
  170071. #else
  170072. "add r4, r4, r6\n\t"
  170073. #endif
  170074. #ifdef WOLFSSL_KEIL
  170075. "adcs r5, r5, r7\n\t"
  170076. #elif defined(__clang__)
  170077. "adcs r5, r7\n\t"
  170078. #else
  170079. "adc r5, r7\n\t"
  170080. #endif
  170081. #ifdef WOLFSSL_KEIL
  170082. "adcs r3, r3, %[r]\n\t"
  170083. #elif defined(__clang__)
  170084. "adcs r3, %[r]\n\t"
  170085. #else
  170086. "adc r3, %[r]\n\t"
  170087. #endif
  170088. "mov %[r], r8\n\t"
  170089. "str r4, [%[r], #112]\n\t"
  170090. "movs %[r], #0\n\t"
  170091. "# A[14] * B[15]\n\t"
  170092. "movs r4, #0\n\t"
  170093. "mov %[a], r9\n\t"
  170094. "mov %[b], r10\n\t"
  170095. "ldr %[a], [%[a], #56]\n\t"
  170096. "ldr %[b], [%[b], #60]\n\t"
  170097. "uxth r6, %[a]\n\t"
  170098. "uxth r7, %[b]\n\t"
  170099. #ifdef WOLFSSL_KEIL
  170100. "muls r7, r6, r7\n\t"
  170101. #elif defined(__clang__)
  170102. "muls r7, r6\n\t"
  170103. #else
  170104. "mul r7, r6\n\t"
  170105. #endif
  170106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170107. "adds r5, r5, r7\n\t"
  170108. #else
  170109. "add r5, r5, r7\n\t"
  170110. #endif
  170111. #ifdef WOLFSSL_KEIL
  170112. "adcs r3, r3, %[r]\n\t"
  170113. #elif defined(__clang__)
  170114. "adcs r3, %[r]\n\t"
  170115. #else
  170116. "adc r3, %[r]\n\t"
  170117. #endif
  170118. #ifdef WOLFSSL_KEIL
  170119. "adcs r4, r4, %[r]\n\t"
  170120. #elif defined(__clang__)
  170121. "adcs r4, %[r]\n\t"
  170122. #else
  170123. "adc r4, %[r]\n\t"
  170124. #endif
  170125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170126. "lsrs r7, %[b], #16\n\t"
  170127. #else
  170128. "lsr r7, %[b], #16\n\t"
  170129. #endif
  170130. #ifdef WOLFSSL_KEIL
  170131. "muls r6, r7, r6\n\t"
  170132. #elif defined(__clang__)
  170133. "muls r6, r7\n\t"
  170134. #else
  170135. "mul r6, r7\n\t"
  170136. #endif
  170137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170138. "lsrs r7, r6, #16\n\t"
  170139. #else
  170140. "lsr r7, r6, #16\n\t"
  170141. #endif
  170142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170143. "lsls r6, r6, #16\n\t"
  170144. #else
  170145. "lsl r6, r6, #16\n\t"
  170146. #endif
  170147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170148. "adds r5, r5, r6\n\t"
  170149. #else
  170150. "add r5, r5, r6\n\t"
  170151. #endif
  170152. #ifdef WOLFSSL_KEIL
  170153. "adcs r3, r3, r7\n\t"
  170154. #elif defined(__clang__)
  170155. "adcs r3, r7\n\t"
  170156. #else
  170157. "adc r3, r7\n\t"
  170158. #endif
  170159. #ifdef WOLFSSL_KEIL
  170160. "adcs r4, r4, %[r]\n\t"
  170161. #elif defined(__clang__)
  170162. "adcs r4, %[r]\n\t"
  170163. #else
  170164. "adc r4, %[r]\n\t"
  170165. #endif
  170166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170167. "lsrs r6, %[a], #16\n\t"
  170168. #else
  170169. "lsr r6, %[a], #16\n\t"
  170170. #endif
  170171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170172. "lsrs r7, %[b], #16\n\t"
  170173. #else
  170174. "lsr r7, %[b], #16\n\t"
  170175. #endif
  170176. #ifdef WOLFSSL_KEIL
  170177. "muls r7, r6, r7\n\t"
  170178. #elif defined(__clang__)
  170179. "muls r7, r6\n\t"
  170180. #else
  170181. "mul r7, r6\n\t"
  170182. #endif
  170183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170184. "adds r3, r3, r7\n\t"
  170185. #else
  170186. "add r3, r3, r7\n\t"
  170187. #endif
  170188. #ifdef WOLFSSL_KEIL
  170189. "adcs r4, r4, %[r]\n\t"
  170190. #elif defined(__clang__)
  170191. "adcs r4, %[r]\n\t"
  170192. #else
  170193. "adc r4, %[r]\n\t"
  170194. #endif
  170195. "uxth r7, %[b]\n\t"
  170196. #ifdef WOLFSSL_KEIL
  170197. "muls r6, r7, r6\n\t"
  170198. #elif defined(__clang__)
  170199. "muls r6, r7\n\t"
  170200. #else
  170201. "mul r6, r7\n\t"
  170202. #endif
  170203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170204. "lsrs r7, r6, #16\n\t"
  170205. #else
  170206. "lsr r7, r6, #16\n\t"
  170207. #endif
  170208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170209. "lsls r6, r6, #16\n\t"
  170210. #else
  170211. "lsl r6, r6, #16\n\t"
  170212. #endif
  170213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170214. "adds r5, r5, r6\n\t"
  170215. #else
  170216. "add r5, r5, r6\n\t"
  170217. #endif
  170218. #ifdef WOLFSSL_KEIL
  170219. "adcs r3, r3, r7\n\t"
  170220. #elif defined(__clang__)
  170221. "adcs r3, r7\n\t"
  170222. #else
  170223. "adc r3, r7\n\t"
  170224. #endif
  170225. #ifdef WOLFSSL_KEIL
  170226. "adcs r4, r4, %[r]\n\t"
  170227. #elif defined(__clang__)
  170228. "adcs r4, %[r]\n\t"
  170229. #else
  170230. "adc r4, %[r]\n\t"
  170231. #endif
  170232. "# A[15] * B[14]\n\t"
  170233. "mov %[a], r9\n\t"
  170234. "mov %[b], r10\n\t"
  170235. "ldr %[a], [%[a], #60]\n\t"
  170236. "ldr %[b], [%[b], #56]\n\t"
  170237. "uxth r6, %[a]\n\t"
  170238. "uxth r7, %[b]\n\t"
  170239. #ifdef WOLFSSL_KEIL
  170240. "muls r7, r6, r7\n\t"
  170241. #elif defined(__clang__)
  170242. "muls r7, r6\n\t"
  170243. #else
  170244. "mul r7, r6\n\t"
  170245. #endif
  170246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170247. "adds r5, r5, r7\n\t"
  170248. #else
  170249. "add r5, r5, r7\n\t"
  170250. #endif
  170251. #ifdef WOLFSSL_KEIL
  170252. "adcs r3, r3, %[r]\n\t"
  170253. #elif defined(__clang__)
  170254. "adcs r3, %[r]\n\t"
  170255. #else
  170256. "adc r3, %[r]\n\t"
  170257. #endif
  170258. #ifdef WOLFSSL_KEIL
  170259. "adcs r4, r4, %[r]\n\t"
  170260. #elif defined(__clang__)
  170261. "adcs r4, %[r]\n\t"
  170262. #else
  170263. "adc r4, %[r]\n\t"
  170264. #endif
  170265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170266. "lsrs r7, %[b], #16\n\t"
  170267. #else
  170268. "lsr r7, %[b], #16\n\t"
  170269. #endif
  170270. #ifdef WOLFSSL_KEIL
  170271. "muls r6, r7, r6\n\t"
  170272. #elif defined(__clang__)
  170273. "muls r6, r7\n\t"
  170274. #else
  170275. "mul r6, r7\n\t"
  170276. #endif
  170277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170278. "lsrs r7, r6, #16\n\t"
  170279. #else
  170280. "lsr r7, r6, #16\n\t"
  170281. #endif
  170282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170283. "lsls r6, r6, #16\n\t"
  170284. #else
  170285. "lsl r6, r6, #16\n\t"
  170286. #endif
  170287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170288. "adds r5, r5, r6\n\t"
  170289. #else
  170290. "add r5, r5, r6\n\t"
  170291. #endif
  170292. #ifdef WOLFSSL_KEIL
  170293. "adcs r3, r3, r7\n\t"
  170294. #elif defined(__clang__)
  170295. "adcs r3, r7\n\t"
  170296. #else
  170297. "adc r3, r7\n\t"
  170298. #endif
  170299. #ifdef WOLFSSL_KEIL
  170300. "adcs r4, r4, %[r]\n\t"
  170301. #elif defined(__clang__)
  170302. "adcs r4, %[r]\n\t"
  170303. #else
  170304. "adc r4, %[r]\n\t"
  170305. #endif
  170306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170307. "lsrs r6, %[a], #16\n\t"
  170308. #else
  170309. "lsr r6, %[a], #16\n\t"
  170310. #endif
  170311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170312. "lsrs r7, %[b], #16\n\t"
  170313. #else
  170314. "lsr r7, %[b], #16\n\t"
  170315. #endif
  170316. #ifdef WOLFSSL_KEIL
  170317. "muls r7, r6, r7\n\t"
  170318. #elif defined(__clang__)
  170319. "muls r7, r6\n\t"
  170320. #else
  170321. "mul r7, r6\n\t"
  170322. #endif
  170323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170324. "adds r3, r3, r7\n\t"
  170325. #else
  170326. "add r3, r3, r7\n\t"
  170327. #endif
  170328. #ifdef WOLFSSL_KEIL
  170329. "adcs r4, r4, %[r]\n\t"
  170330. #elif defined(__clang__)
  170331. "adcs r4, %[r]\n\t"
  170332. #else
  170333. "adc r4, %[r]\n\t"
  170334. #endif
  170335. "uxth r7, %[b]\n\t"
  170336. #ifdef WOLFSSL_KEIL
  170337. "muls r6, r7, r6\n\t"
  170338. #elif defined(__clang__)
  170339. "muls r6, r7\n\t"
  170340. #else
  170341. "mul r6, r7\n\t"
  170342. #endif
  170343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170344. "lsrs r7, r6, #16\n\t"
  170345. #else
  170346. "lsr r7, r6, #16\n\t"
  170347. #endif
  170348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170349. "lsls r6, r6, #16\n\t"
  170350. #else
  170351. "lsl r6, r6, #16\n\t"
  170352. #endif
  170353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170354. "adds r5, r5, r6\n\t"
  170355. #else
  170356. "add r5, r5, r6\n\t"
  170357. #endif
  170358. #ifdef WOLFSSL_KEIL
  170359. "adcs r3, r3, r7\n\t"
  170360. #elif defined(__clang__)
  170361. "adcs r3, r7\n\t"
  170362. #else
  170363. "adc r3, r7\n\t"
  170364. #endif
  170365. #ifdef WOLFSSL_KEIL
  170366. "adcs r4, r4, %[r]\n\t"
  170367. #elif defined(__clang__)
  170368. "adcs r4, %[r]\n\t"
  170369. #else
  170370. "adc r4, %[r]\n\t"
  170371. #endif
  170372. "mov %[r], r8\n\t"
  170373. "str r5, [%[r], #116]\n\t"
  170374. "movs %[r], #0\n\t"
  170375. "# A[15] * B[15]\n\t"
  170376. "mov %[a], r9\n\t"
  170377. "mov %[b], r10\n\t"
  170378. "ldr %[a], [%[a], #60]\n\t"
  170379. "ldr %[b], [%[b], #60]\n\t"
  170380. "uxth r6, %[a]\n\t"
  170381. "uxth r7, %[b]\n\t"
  170382. #ifdef WOLFSSL_KEIL
  170383. "muls r7, r6, r7\n\t"
  170384. #elif defined(__clang__)
  170385. "muls r7, r6\n\t"
  170386. #else
  170387. "mul r7, r6\n\t"
  170388. #endif
  170389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170390. "adds r3, r3, r7\n\t"
  170391. #else
  170392. "add r3, r3, r7\n\t"
  170393. #endif
  170394. #ifdef WOLFSSL_KEIL
  170395. "adcs r4, r4, %[r]\n\t"
  170396. #elif defined(__clang__)
  170397. "adcs r4, %[r]\n\t"
  170398. #else
  170399. "adc r4, %[r]\n\t"
  170400. #endif
  170401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170402. "lsrs r7, %[b], #16\n\t"
  170403. #else
  170404. "lsr r7, %[b], #16\n\t"
  170405. #endif
  170406. #ifdef WOLFSSL_KEIL
  170407. "muls r6, r7, r6\n\t"
  170408. #elif defined(__clang__)
  170409. "muls r6, r7\n\t"
  170410. #else
  170411. "mul r6, r7\n\t"
  170412. #endif
  170413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170414. "lsrs r7, r6, #16\n\t"
  170415. #else
  170416. "lsr r7, r6, #16\n\t"
  170417. #endif
  170418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170419. "lsls r6, r6, #16\n\t"
  170420. #else
  170421. "lsl r6, r6, #16\n\t"
  170422. #endif
  170423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170424. "adds r3, r3, r6\n\t"
  170425. #else
  170426. "add r3, r3, r6\n\t"
  170427. #endif
  170428. #ifdef WOLFSSL_KEIL
  170429. "adcs r4, r4, r7\n\t"
  170430. #elif defined(__clang__)
  170431. "adcs r4, r7\n\t"
  170432. #else
  170433. "adc r4, r7\n\t"
  170434. #endif
  170435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170436. "lsrs r6, %[a], #16\n\t"
  170437. #else
  170438. "lsr r6, %[a], #16\n\t"
  170439. #endif
  170440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170441. "lsrs r7, %[b], #16\n\t"
  170442. #else
  170443. "lsr r7, %[b], #16\n\t"
  170444. #endif
  170445. #ifdef WOLFSSL_KEIL
  170446. "muls r7, r6, r7\n\t"
  170447. #elif defined(__clang__)
  170448. "muls r7, r6\n\t"
  170449. #else
  170450. "mul r7, r6\n\t"
  170451. #endif
  170452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170453. "adds r4, r4, r7\n\t"
  170454. #else
  170455. "add r4, r4, r7\n\t"
  170456. #endif
  170457. "uxth r7, %[b]\n\t"
  170458. #ifdef WOLFSSL_KEIL
  170459. "muls r6, r7, r6\n\t"
  170460. #elif defined(__clang__)
  170461. "muls r6, r7\n\t"
  170462. #else
  170463. "mul r6, r7\n\t"
  170464. #endif
  170465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170466. "lsrs r7, r6, #16\n\t"
  170467. #else
  170468. "lsr r7, r6, #16\n\t"
  170469. #endif
  170470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170471. "lsls r6, r6, #16\n\t"
  170472. #else
  170473. "lsl r6, r6, #16\n\t"
  170474. #endif
  170475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170476. "adds r3, r3, r6\n\t"
  170477. #else
  170478. "add r3, r3, r6\n\t"
  170479. #endif
  170480. #ifdef WOLFSSL_KEIL
  170481. "adcs r4, r4, r7\n\t"
  170482. #elif defined(__clang__)
  170483. "adcs r4, r7\n\t"
  170484. #else
  170485. "adc r4, r7\n\t"
  170486. #endif
  170487. "mov %[r], r8\n\t"
  170488. "str r3, [%[r], #120]\n\t"
  170489. "str r4, [%[r], #124]\n\t"
  170490. "pop {r3, r4, r5, r6}\n\t"
  170491. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  170492. "pop {r3, r4, r5, r6}\n\t"
  170493. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  170494. "pop {r3, r4, r5, r6}\n\t"
  170495. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  170496. "pop {r3, r4, r5, r6}\n\t"
  170497. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  170498. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  170499. :
  170500. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  170501. );
  170502. }
  170503. #endif /* !WOLFSSL_SP_LARGE_CODE */
  170504. #ifndef WOLFSSL_SP_LARGE_CODE
  170505. /* Square a and put result in r. (r = a * a)
  170506. *
  170507. * r A single precision integer.
  170508. * a A single precision integer.
  170509. */
  170510. SP_NOINLINE static void sp_1024_sqr_16(sp_digit* r, const sp_digit* a)
  170511. {
  170512. __asm__ __volatile__ (
  170513. "movs r3, #0\n\t"
  170514. "movs r4, #0\n\t"
  170515. "movs r5, #0\n\t"
  170516. "mov r8, r3\n\t"
  170517. "mov r11, %[r]\n\t"
  170518. "movs r6, #0x80\n\t"
  170519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170520. "negs r6, r6\n\t"
  170521. #else
  170522. "neg r6, r6\n\t"
  170523. #endif
  170524. "add sp, sp, r6\n\t"
  170525. "mov r10, sp\n\t"
  170526. "mov r9, %[a]\n\t"
  170527. "\n"
  170528. "L_sp_1024_sqr_16_words_%=:\n\t"
  170529. "movs %[r], #0\n\t"
  170530. "movs r6, #60\n\t"
  170531. "mov %[a], r8\n\t"
  170532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170533. "subs %[a], %[a], r6\n\t"
  170534. #else
  170535. "sub %[a], %[a], r6\n\t"
  170536. #endif
  170537. #ifdef WOLFSSL_KEIL
  170538. "sbcs r6, r6, r6\n\t"
  170539. #elif defined(__clang__)
  170540. "sbcs r6, r6\n\t"
  170541. #else
  170542. "sbc r6, r6\n\t"
  170543. #endif
  170544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170545. "mvns r6, r6\n\t"
  170546. #else
  170547. "mvn r6, r6\n\t"
  170548. #endif
  170549. #ifdef WOLFSSL_KEIL
  170550. "ands %[a], %[a], r6\n\t"
  170551. #elif defined(__clang__)
  170552. "ands %[a], r6\n\t"
  170553. #else
  170554. "and %[a], r6\n\t"
  170555. #endif
  170556. "mov r2, r8\n\t"
  170557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170558. "subs r2, r2, %[a]\n\t"
  170559. #else
  170560. "sub r2, r2, %[a]\n\t"
  170561. #endif
  170562. "add %[a], %[a], r9\n\t"
  170563. "add r2, r2, r9\n\t"
  170564. "\n"
  170565. "L_sp_1024_sqr_16_mul_%=:\n\t"
  170566. "cmp r2, %[a]\n\t"
  170567. "beq L_sp_1024_sqr_16_sqr_%=\n\t"
  170568. "# Multiply * 2: Start\n\t"
  170569. "ldrh r6, [%[a]]\n\t"
  170570. "ldrh r7, [r2]\n\t"
  170571. #ifdef WOLFSSL_KEIL
  170572. "muls r7, r6, r7\n\t"
  170573. #elif defined(__clang__)
  170574. "muls r7, r6\n\t"
  170575. #else
  170576. "mul r7, r6\n\t"
  170577. #endif
  170578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170579. "adds r3, r3, r7\n\t"
  170580. #else
  170581. "add r3, r3, r7\n\t"
  170582. #endif
  170583. #ifdef WOLFSSL_KEIL
  170584. "adcs r4, r4, %[r]\n\t"
  170585. #elif defined(__clang__)
  170586. "adcs r4, %[r]\n\t"
  170587. #else
  170588. "adc r4, %[r]\n\t"
  170589. #endif
  170590. #ifdef WOLFSSL_KEIL
  170591. "adcs r5, r5, %[r]\n\t"
  170592. #elif defined(__clang__)
  170593. "adcs r5, %[r]\n\t"
  170594. #else
  170595. "adc r5, %[r]\n\t"
  170596. #endif
  170597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170598. "adds r3, r3, r7\n\t"
  170599. #else
  170600. "add r3, r3, r7\n\t"
  170601. #endif
  170602. #ifdef WOLFSSL_KEIL
  170603. "adcs r4, r4, %[r]\n\t"
  170604. #elif defined(__clang__)
  170605. "adcs r4, %[r]\n\t"
  170606. #else
  170607. "adc r4, %[r]\n\t"
  170608. #endif
  170609. #ifdef WOLFSSL_KEIL
  170610. "adcs r5, r5, %[r]\n\t"
  170611. #elif defined(__clang__)
  170612. "adcs r5, %[r]\n\t"
  170613. #else
  170614. "adc r5, %[r]\n\t"
  170615. #endif
  170616. "ldr r7, [r2]\n\t"
  170617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170618. "lsrs r7, r7, #16\n\t"
  170619. #else
  170620. "lsr r7, r7, #16\n\t"
  170621. #endif
  170622. #ifdef WOLFSSL_KEIL
  170623. "muls r6, r7, r6\n\t"
  170624. #elif defined(__clang__)
  170625. "muls r6, r7\n\t"
  170626. #else
  170627. "mul r6, r7\n\t"
  170628. #endif
  170629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170630. "lsrs r7, r6, #16\n\t"
  170631. #else
  170632. "lsr r7, r6, #16\n\t"
  170633. #endif
  170634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170635. "lsls r6, r6, #16\n\t"
  170636. #else
  170637. "lsl r6, r6, #16\n\t"
  170638. #endif
  170639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170640. "adds r3, r3, r6\n\t"
  170641. #else
  170642. "add r3, r3, r6\n\t"
  170643. #endif
  170644. #ifdef WOLFSSL_KEIL
  170645. "adcs r4, r4, r7\n\t"
  170646. #elif defined(__clang__)
  170647. "adcs r4, r7\n\t"
  170648. #else
  170649. "adc r4, r7\n\t"
  170650. #endif
  170651. #ifdef WOLFSSL_KEIL
  170652. "adcs r5, r5, %[r]\n\t"
  170653. #elif defined(__clang__)
  170654. "adcs r5, %[r]\n\t"
  170655. #else
  170656. "adc r5, %[r]\n\t"
  170657. #endif
  170658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170659. "adds r3, r3, r6\n\t"
  170660. #else
  170661. "add r3, r3, r6\n\t"
  170662. #endif
  170663. #ifdef WOLFSSL_KEIL
  170664. "adcs r4, r4, r7\n\t"
  170665. #elif defined(__clang__)
  170666. "adcs r4, r7\n\t"
  170667. #else
  170668. "adc r4, r7\n\t"
  170669. #endif
  170670. #ifdef WOLFSSL_KEIL
  170671. "adcs r5, r5, %[r]\n\t"
  170672. #elif defined(__clang__)
  170673. "adcs r5, %[r]\n\t"
  170674. #else
  170675. "adc r5, %[r]\n\t"
  170676. #endif
  170677. "ldr r6, [%[a]]\n\t"
  170678. "ldr r7, [r2]\n\t"
  170679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170680. "lsrs r6, r6, #16\n\t"
  170681. #else
  170682. "lsr r6, r6, #16\n\t"
  170683. #endif
  170684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170685. "lsrs r7, r7, #16\n\t"
  170686. #else
  170687. "lsr r7, r7, #16\n\t"
  170688. #endif
  170689. #ifdef WOLFSSL_KEIL
  170690. "muls r7, r6, r7\n\t"
  170691. #elif defined(__clang__)
  170692. "muls r7, r6\n\t"
  170693. #else
  170694. "mul r7, r6\n\t"
  170695. #endif
  170696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170697. "adds r4, r4, r7\n\t"
  170698. #else
  170699. "add r4, r4, r7\n\t"
  170700. #endif
  170701. #ifdef WOLFSSL_KEIL
  170702. "adcs r5, r5, %[r]\n\t"
  170703. #elif defined(__clang__)
  170704. "adcs r5, %[r]\n\t"
  170705. #else
  170706. "adc r5, %[r]\n\t"
  170707. #endif
  170708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170709. "adds r4, r4, r7\n\t"
  170710. #else
  170711. "add r4, r4, r7\n\t"
  170712. #endif
  170713. #ifdef WOLFSSL_KEIL
  170714. "adcs r5, r5, %[r]\n\t"
  170715. #elif defined(__clang__)
  170716. "adcs r5, %[r]\n\t"
  170717. #else
  170718. "adc r5, %[r]\n\t"
  170719. #endif
  170720. "ldrh r7, [r2]\n\t"
  170721. #ifdef WOLFSSL_KEIL
  170722. "muls r6, r7, r6\n\t"
  170723. #elif defined(__clang__)
  170724. "muls r6, r7\n\t"
  170725. #else
  170726. "mul r6, r7\n\t"
  170727. #endif
  170728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170729. "lsrs r7, r6, #16\n\t"
  170730. #else
  170731. "lsr r7, r6, #16\n\t"
  170732. #endif
  170733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170734. "lsls r6, r6, #16\n\t"
  170735. #else
  170736. "lsl r6, r6, #16\n\t"
  170737. #endif
  170738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170739. "adds r3, r3, r6\n\t"
  170740. #else
  170741. "add r3, r3, r6\n\t"
  170742. #endif
  170743. #ifdef WOLFSSL_KEIL
  170744. "adcs r4, r4, r7\n\t"
  170745. #elif defined(__clang__)
  170746. "adcs r4, r7\n\t"
  170747. #else
  170748. "adc r4, r7\n\t"
  170749. #endif
  170750. #ifdef WOLFSSL_KEIL
  170751. "adcs r5, r5, %[r]\n\t"
  170752. #elif defined(__clang__)
  170753. "adcs r5, %[r]\n\t"
  170754. #else
  170755. "adc r5, %[r]\n\t"
  170756. #endif
  170757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170758. "adds r3, r3, r6\n\t"
  170759. #else
  170760. "add r3, r3, r6\n\t"
  170761. #endif
  170762. #ifdef WOLFSSL_KEIL
  170763. "adcs r4, r4, r7\n\t"
  170764. #elif defined(__clang__)
  170765. "adcs r4, r7\n\t"
  170766. #else
  170767. "adc r4, r7\n\t"
  170768. #endif
  170769. #ifdef WOLFSSL_KEIL
  170770. "adcs r5, r5, %[r]\n\t"
  170771. #elif defined(__clang__)
  170772. "adcs r5, %[r]\n\t"
  170773. #else
  170774. "adc r5, %[r]\n\t"
  170775. #endif
  170776. "# Multiply * 2: Done\n\t"
  170777. "bal L_sp_1024_sqr_16_done_sqr_%=\n\t"
  170778. "\n"
  170779. "L_sp_1024_sqr_16_sqr_%=:\n\t"
  170780. "mov r12, r2\n\t"
  170781. "ldr r2, [%[a]]\n\t"
  170782. "# Square: Start\n\t"
  170783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170784. "lsrs r7, r2, #16\n\t"
  170785. #else
  170786. "lsr r7, r2, #16\n\t"
  170787. #endif
  170788. "uxth r6, r2\n\t"
  170789. #ifdef WOLFSSL_KEIL
  170790. "muls r6, r6, r6\n\t"
  170791. #elif defined(__clang__)
  170792. "muls r6, r6\n\t"
  170793. #else
  170794. "mul r6, r6\n\t"
  170795. #endif
  170796. #ifdef WOLFSSL_KEIL
  170797. "muls r7, r7, r7\n\t"
  170798. #elif defined(__clang__)
  170799. "muls r7, r7\n\t"
  170800. #else
  170801. "mul r7, r7\n\t"
  170802. #endif
  170803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170804. "adds r3, r3, r6\n\t"
  170805. #else
  170806. "add r3, r3, r6\n\t"
  170807. #endif
  170808. #ifdef WOLFSSL_KEIL
  170809. "adcs r4, r4, r7\n\t"
  170810. #elif defined(__clang__)
  170811. "adcs r4, r7\n\t"
  170812. #else
  170813. "adc r4, r7\n\t"
  170814. #endif
  170815. #ifdef WOLFSSL_KEIL
  170816. "adcs r5, r5, %[r]\n\t"
  170817. #elif defined(__clang__)
  170818. "adcs r5, %[r]\n\t"
  170819. #else
  170820. "adc r5, %[r]\n\t"
  170821. #endif
  170822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170823. "lsrs r7, r2, #16\n\t"
  170824. #else
  170825. "lsr r7, r2, #16\n\t"
  170826. #endif
  170827. "uxth r6, r2\n\t"
  170828. #ifdef WOLFSSL_KEIL
  170829. "muls r6, r7, r6\n\t"
  170830. #elif defined(__clang__)
  170831. "muls r6, r7\n\t"
  170832. #else
  170833. "mul r6, r7\n\t"
  170834. #endif
  170835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170836. "lsrs r7, r6, #15\n\t"
  170837. #else
  170838. "lsr r7, r6, #15\n\t"
  170839. #endif
  170840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170841. "lsls r6, r6, #17\n\t"
  170842. #else
  170843. "lsl r6, r6, #17\n\t"
  170844. #endif
  170845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170846. "adds r3, r3, r6\n\t"
  170847. #else
  170848. "add r3, r3, r6\n\t"
  170849. #endif
  170850. #ifdef WOLFSSL_KEIL
  170851. "adcs r4, r4, r7\n\t"
  170852. #elif defined(__clang__)
  170853. "adcs r4, r7\n\t"
  170854. #else
  170855. "adc r4, r7\n\t"
  170856. #endif
  170857. #ifdef WOLFSSL_KEIL
  170858. "adcs r5, r5, %[r]\n\t"
  170859. #elif defined(__clang__)
  170860. "adcs r5, %[r]\n\t"
  170861. #else
  170862. "adc r5, %[r]\n\t"
  170863. #endif
  170864. "# Square: Done\n\t"
  170865. "mov r2, r12\n\t"
  170866. "\n"
  170867. "L_sp_1024_sqr_16_done_sqr_%=:\n\t"
  170868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170869. "adds %[a], %[a], #4\n\t"
  170870. #else
  170871. "add %[a], %[a], #4\n\t"
  170872. #endif
  170873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170874. "subs r2, r2, #4\n\t"
  170875. #else
  170876. "sub r2, r2, #4\n\t"
  170877. #endif
  170878. "movs r6, #0x40\n\t"
  170879. "add r6, r6, r9\n\t"
  170880. "cmp %[a], r6\n\t"
  170881. "beq L_sp_1024_sqr_16_done_mul_%=\n\t"
  170882. "cmp %[a], r2\n\t"
  170883. "bgt L_sp_1024_sqr_16_done_mul_%=\n\t"
  170884. "mov r7, r8\n\t"
  170885. "add r7, r7, r9\n\t"
  170886. "cmp %[a], r7\n\t"
  170887. "ble L_sp_1024_sqr_16_mul_%=\n\t"
  170888. "\n"
  170889. "L_sp_1024_sqr_16_done_mul_%=:\n\t"
  170890. "mov %[r], r10\n\t"
  170891. "mov r7, r8\n\t"
  170892. "str r3, [%[r], r7]\n\t"
  170893. "movs r3, r4\n\t"
  170894. "movs r4, r5\n\t"
  170895. "movs r5, #0\n\t"
  170896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170897. "adds r7, r7, #4\n\t"
  170898. #else
  170899. "add r7, r7, #4\n\t"
  170900. #endif
  170901. "mov r8, r7\n\t"
  170902. "movs r6, #0x78\n\t"
  170903. "cmp r7, r6\n\t"
  170904. "ble L_sp_1024_sqr_16_words_%=\n\t"
  170905. "mov %[a], r9\n\t"
  170906. "str r3, [%[r], r7]\n\t"
  170907. "mov %[r], r11\n\t"
  170908. "mov %[a], r10\n\t"
  170909. "movs r3, #0x7c\n\t"
  170910. "\n"
  170911. "L_sp_1024_sqr_16_store_%=:\n\t"
  170912. "ldr r6, [%[a], r3]\n\t"
  170913. "str r6, [%[r], r3]\n\t"
  170914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170915. "subs r3, r3, #4\n\t"
  170916. #else
  170917. "sub r3, r3, #4\n\t"
  170918. #endif
  170919. "bge L_sp_1024_sqr_16_store_%=\n\t"
  170920. "movs r6, #0x80\n\t"
  170921. "add sp, sp, r6\n\t"
  170922. : [r] "+l" (r), [a] "+l" (a)
  170923. :
  170924. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  170925. );
  170926. }
  170927. #else
  170928. /* Square a and put result in r. (r = a * a)
  170929. *
  170930. * r A single precision integer.
  170931. * a A single precision integer.
  170932. */
  170933. SP_NOINLINE static void sp_1024_sqr_16(sp_digit* r, const sp_digit* a)
  170934. {
  170935. __asm__ __volatile__ (
  170936. "sub sp, sp, #0x40\n\t"
  170937. "mov r8, %[r]\n\t"
  170938. "mov r9, %[a]\n\t"
  170939. "movs %[r], #0\n\t"
  170940. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  170941. "mov r10, r2\n\t"
  170942. "mov r11, r3\n\t"
  170943. "mov r12, r4\n\t"
  170944. "mov lr, r5\n\t"
  170945. "mov %[a], r9\n\t"
  170946. "# A[0] * A[0]\n\t"
  170947. "movs r4, #0\n\t"
  170948. "mov r7, r10\n\t"
  170949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170950. "lsrs r6, r7, #16\n\t"
  170951. #else
  170952. "lsr r6, r7, #16\n\t"
  170953. #endif
  170954. "uxth r5, r7\n\t"
  170955. "movs r2, r5\n\t"
  170956. "movs r3, r6\n\t"
  170957. #ifdef WOLFSSL_KEIL
  170958. "muls r2, r2, r2\n\t"
  170959. #elif defined(__clang__)
  170960. "muls r2, r2\n\t"
  170961. #else
  170962. "mul r2, r2\n\t"
  170963. #endif
  170964. #ifdef WOLFSSL_KEIL
  170965. "muls r3, r3, r3\n\t"
  170966. #elif defined(__clang__)
  170967. "muls r3, r3\n\t"
  170968. #else
  170969. "mul r3, r3\n\t"
  170970. #endif
  170971. #ifdef WOLFSSL_KEIL
  170972. "muls r5, r6, r5\n\t"
  170973. #elif defined(__clang__)
  170974. "muls r5, r6\n\t"
  170975. #else
  170976. "mul r5, r6\n\t"
  170977. #endif
  170978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170979. "lsrs r6, r5, #15\n\t"
  170980. #else
  170981. "lsr r6, r5, #15\n\t"
  170982. #endif
  170983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170984. "lsls r5, r5, #17\n\t"
  170985. #else
  170986. "lsl r5, r5, #17\n\t"
  170987. #endif
  170988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170989. "adds r2, r2, r5\n\t"
  170990. #else
  170991. "add r2, r2, r5\n\t"
  170992. #endif
  170993. #ifdef WOLFSSL_KEIL
  170994. "adcs r3, r3, r6\n\t"
  170995. #elif defined(__clang__)
  170996. "adcs r3, r6\n\t"
  170997. #else
  170998. "adc r3, r6\n\t"
  170999. #endif
  171000. "str r2, [sp]\n\t"
  171001. "# A[1] * A[0]\n\t"
  171002. "movs r2, #0\n\t"
  171003. "mov %[a], r11\n\t"
  171004. "uxth r5, %[a]\n\t"
  171005. "uxth r6, r7\n\t"
  171006. #ifdef WOLFSSL_KEIL
  171007. "muls r6, r5, r6\n\t"
  171008. #elif defined(__clang__)
  171009. "muls r6, r5\n\t"
  171010. #else
  171011. "mul r6, r5\n\t"
  171012. #endif
  171013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171014. "adds r3, r3, r6\n\t"
  171015. #else
  171016. "add r3, r3, r6\n\t"
  171017. #endif
  171018. #ifdef WOLFSSL_KEIL
  171019. "adcs r4, r4, %[r]\n\t"
  171020. #elif defined(__clang__)
  171021. "adcs r4, %[r]\n\t"
  171022. #else
  171023. "adc r4, %[r]\n\t"
  171024. #endif
  171025. #ifdef WOLFSSL_KEIL
  171026. "adcs r2, r2, %[r]\n\t"
  171027. #elif defined(__clang__)
  171028. "adcs r2, %[r]\n\t"
  171029. #else
  171030. "adc r2, %[r]\n\t"
  171031. #endif
  171032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171033. "adds r3, r3, r6\n\t"
  171034. #else
  171035. "add r3, r3, r6\n\t"
  171036. #endif
  171037. #ifdef WOLFSSL_KEIL
  171038. "adcs r4, r4, %[r]\n\t"
  171039. #elif defined(__clang__)
  171040. "adcs r4, %[r]\n\t"
  171041. #else
  171042. "adc r4, %[r]\n\t"
  171043. #endif
  171044. #ifdef WOLFSSL_KEIL
  171045. "adcs r2, r2, %[r]\n\t"
  171046. #elif defined(__clang__)
  171047. "adcs r2, %[r]\n\t"
  171048. #else
  171049. "adc r2, %[r]\n\t"
  171050. #endif
  171051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171052. "lsrs r6, r7, #16\n\t"
  171053. #else
  171054. "lsr r6, r7, #16\n\t"
  171055. #endif
  171056. #ifdef WOLFSSL_KEIL
  171057. "muls r5, r6, r5\n\t"
  171058. #elif defined(__clang__)
  171059. "muls r5, r6\n\t"
  171060. #else
  171061. "mul r5, r6\n\t"
  171062. #endif
  171063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171064. "lsrs r6, r5, #16\n\t"
  171065. #else
  171066. "lsr r6, r5, #16\n\t"
  171067. #endif
  171068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171069. "lsls r5, r5, #16\n\t"
  171070. #else
  171071. "lsl r5, r5, #16\n\t"
  171072. #endif
  171073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171074. "adds r3, r3, r5\n\t"
  171075. #else
  171076. "add r3, r3, r5\n\t"
  171077. #endif
  171078. #ifdef WOLFSSL_KEIL
  171079. "adcs r4, r4, r6\n\t"
  171080. #elif defined(__clang__)
  171081. "adcs r4, r6\n\t"
  171082. #else
  171083. "adc r4, r6\n\t"
  171084. #endif
  171085. #ifdef WOLFSSL_KEIL
  171086. "adcs r2, r2, %[r]\n\t"
  171087. #elif defined(__clang__)
  171088. "adcs r2, %[r]\n\t"
  171089. #else
  171090. "adc r2, %[r]\n\t"
  171091. #endif
  171092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171093. "adds r3, r3, r5\n\t"
  171094. #else
  171095. "add r3, r3, r5\n\t"
  171096. #endif
  171097. #ifdef WOLFSSL_KEIL
  171098. "adcs r4, r4, r6\n\t"
  171099. #elif defined(__clang__)
  171100. "adcs r4, r6\n\t"
  171101. #else
  171102. "adc r4, r6\n\t"
  171103. #endif
  171104. #ifdef WOLFSSL_KEIL
  171105. "adcs r2, r2, %[r]\n\t"
  171106. #elif defined(__clang__)
  171107. "adcs r2, %[r]\n\t"
  171108. #else
  171109. "adc r2, %[r]\n\t"
  171110. #endif
  171111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171112. "lsrs r5, %[a], #16\n\t"
  171113. #else
  171114. "lsr r5, %[a], #16\n\t"
  171115. #endif
  171116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171117. "lsrs r6, r7, #16\n\t"
  171118. #else
  171119. "lsr r6, r7, #16\n\t"
  171120. #endif
  171121. #ifdef WOLFSSL_KEIL
  171122. "muls r6, r5, r6\n\t"
  171123. #elif defined(__clang__)
  171124. "muls r6, r5\n\t"
  171125. #else
  171126. "mul r6, r5\n\t"
  171127. #endif
  171128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171129. "adds r4, r4, r6\n\t"
  171130. #else
  171131. "add r4, r4, r6\n\t"
  171132. #endif
  171133. #ifdef WOLFSSL_KEIL
  171134. "adcs r2, r2, %[r]\n\t"
  171135. #elif defined(__clang__)
  171136. "adcs r2, %[r]\n\t"
  171137. #else
  171138. "adc r2, %[r]\n\t"
  171139. #endif
  171140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171141. "adds r4, r4, r6\n\t"
  171142. #else
  171143. "add r4, r4, r6\n\t"
  171144. #endif
  171145. #ifdef WOLFSSL_KEIL
  171146. "adcs r2, r2, %[r]\n\t"
  171147. #elif defined(__clang__)
  171148. "adcs r2, %[r]\n\t"
  171149. #else
  171150. "adc r2, %[r]\n\t"
  171151. #endif
  171152. "uxth r6, r7\n\t"
  171153. #ifdef WOLFSSL_KEIL
  171154. "muls r5, r6, r5\n\t"
  171155. #elif defined(__clang__)
  171156. "muls r5, r6\n\t"
  171157. #else
  171158. "mul r5, r6\n\t"
  171159. #endif
  171160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171161. "lsrs r6, r5, #16\n\t"
  171162. #else
  171163. "lsr r6, r5, #16\n\t"
  171164. #endif
  171165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171166. "lsls r5, r5, #16\n\t"
  171167. #else
  171168. "lsl r5, r5, #16\n\t"
  171169. #endif
  171170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171171. "adds r3, r3, r5\n\t"
  171172. #else
  171173. "add r3, r3, r5\n\t"
  171174. #endif
  171175. #ifdef WOLFSSL_KEIL
  171176. "adcs r4, r4, r6\n\t"
  171177. #elif defined(__clang__)
  171178. "adcs r4, r6\n\t"
  171179. #else
  171180. "adc r4, r6\n\t"
  171181. #endif
  171182. #ifdef WOLFSSL_KEIL
  171183. "adcs r2, r2, %[r]\n\t"
  171184. #elif defined(__clang__)
  171185. "adcs r2, %[r]\n\t"
  171186. #else
  171187. "adc r2, %[r]\n\t"
  171188. #endif
  171189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171190. "adds r3, r3, r5\n\t"
  171191. #else
  171192. "add r3, r3, r5\n\t"
  171193. #endif
  171194. #ifdef WOLFSSL_KEIL
  171195. "adcs r4, r4, r6\n\t"
  171196. #elif defined(__clang__)
  171197. "adcs r4, r6\n\t"
  171198. #else
  171199. "adc r4, r6\n\t"
  171200. #endif
  171201. #ifdef WOLFSSL_KEIL
  171202. "adcs r2, r2, %[r]\n\t"
  171203. #elif defined(__clang__)
  171204. "adcs r2, %[r]\n\t"
  171205. #else
  171206. "adc r2, %[r]\n\t"
  171207. #endif
  171208. "str r3, [sp, #4]\n\t"
  171209. "# A[2] * A[0]\n\t"
  171210. "movs r3, #0\n\t"
  171211. "mov %[a], r9\n\t"
  171212. "mov %[a], r12\n\t"
  171213. "uxth r5, %[a]\n\t"
  171214. "uxth r6, r7\n\t"
  171215. #ifdef WOLFSSL_KEIL
  171216. "muls r6, r5, r6\n\t"
  171217. #elif defined(__clang__)
  171218. "muls r6, r5\n\t"
  171219. #else
  171220. "mul r6, r5\n\t"
  171221. #endif
  171222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171223. "adds r4, r4, r6\n\t"
  171224. #else
  171225. "add r4, r4, r6\n\t"
  171226. #endif
  171227. #ifdef WOLFSSL_KEIL
  171228. "adcs r2, r2, %[r]\n\t"
  171229. #elif defined(__clang__)
  171230. "adcs r2, %[r]\n\t"
  171231. #else
  171232. "adc r2, %[r]\n\t"
  171233. #endif
  171234. #ifdef WOLFSSL_KEIL
  171235. "adcs r3, r3, %[r]\n\t"
  171236. #elif defined(__clang__)
  171237. "adcs r3, %[r]\n\t"
  171238. #else
  171239. "adc r3, %[r]\n\t"
  171240. #endif
  171241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171242. "adds r4, r4, r6\n\t"
  171243. #else
  171244. "add r4, r4, r6\n\t"
  171245. #endif
  171246. #ifdef WOLFSSL_KEIL
  171247. "adcs r2, r2, %[r]\n\t"
  171248. #elif defined(__clang__)
  171249. "adcs r2, %[r]\n\t"
  171250. #else
  171251. "adc r2, %[r]\n\t"
  171252. #endif
  171253. #ifdef WOLFSSL_KEIL
  171254. "adcs r3, r3, %[r]\n\t"
  171255. #elif defined(__clang__)
  171256. "adcs r3, %[r]\n\t"
  171257. #else
  171258. "adc r3, %[r]\n\t"
  171259. #endif
  171260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171261. "lsrs r6, r7, #16\n\t"
  171262. #else
  171263. "lsr r6, r7, #16\n\t"
  171264. #endif
  171265. #ifdef WOLFSSL_KEIL
  171266. "muls r5, r6, r5\n\t"
  171267. #elif defined(__clang__)
  171268. "muls r5, r6\n\t"
  171269. #else
  171270. "mul r5, r6\n\t"
  171271. #endif
  171272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171273. "lsrs r6, r5, #16\n\t"
  171274. #else
  171275. "lsr r6, r5, #16\n\t"
  171276. #endif
  171277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171278. "lsls r5, r5, #16\n\t"
  171279. #else
  171280. "lsl r5, r5, #16\n\t"
  171281. #endif
  171282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171283. "adds r4, r4, r5\n\t"
  171284. #else
  171285. "add r4, r4, r5\n\t"
  171286. #endif
  171287. #ifdef WOLFSSL_KEIL
  171288. "adcs r2, r2, r6\n\t"
  171289. #elif defined(__clang__)
  171290. "adcs r2, r6\n\t"
  171291. #else
  171292. "adc r2, r6\n\t"
  171293. #endif
  171294. #ifdef WOLFSSL_KEIL
  171295. "adcs r3, r3, %[r]\n\t"
  171296. #elif defined(__clang__)
  171297. "adcs r3, %[r]\n\t"
  171298. #else
  171299. "adc r3, %[r]\n\t"
  171300. #endif
  171301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171302. "adds r4, r4, r5\n\t"
  171303. #else
  171304. "add r4, r4, r5\n\t"
  171305. #endif
  171306. #ifdef WOLFSSL_KEIL
  171307. "adcs r2, r2, r6\n\t"
  171308. #elif defined(__clang__)
  171309. "adcs r2, r6\n\t"
  171310. #else
  171311. "adc r2, r6\n\t"
  171312. #endif
  171313. #ifdef WOLFSSL_KEIL
  171314. "adcs r3, r3, %[r]\n\t"
  171315. #elif defined(__clang__)
  171316. "adcs r3, %[r]\n\t"
  171317. #else
  171318. "adc r3, %[r]\n\t"
  171319. #endif
  171320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171321. "lsrs r5, %[a], #16\n\t"
  171322. #else
  171323. "lsr r5, %[a], #16\n\t"
  171324. #endif
  171325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171326. "lsrs r6, r7, #16\n\t"
  171327. #else
  171328. "lsr r6, r7, #16\n\t"
  171329. #endif
  171330. #ifdef WOLFSSL_KEIL
  171331. "muls r6, r5, r6\n\t"
  171332. #elif defined(__clang__)
  171333. "muls r6, r5\n\t"
  171334. #else
  171335. "mul r6, r5\n\t"
  171336. #endif
  171337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171338. "adds r2, r2, r6\n\t"
  171339. #else
  171340. "add r2, r2, r6\n\t"
  171341. #endif
  171342. #ifdef WOLFSSL_KEIL
  171343. "adcs r3, r3, %[r]\n\t"
  171344. #elif defined(__clang__)
  171345. "adcs r3, %[r]\n\t"
  171346. #else
  171347. "adc r3, %[r]\n\t"
  171348. #endif
  171349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171350. "adds r2, r2, r6\n\t"
  171351. #else
  171352. "add r2, r2, r6\n\t"
  171353. #endif
  171354. #ifdef WOLFSSL_KEIL
  171355. "adcs r3, r3, %[r]\n\t"
  171356. #elif defined(__clang__)
  171357. "adcs r3, %[r]\n\t"
  171358. #else
  171359. "adc r3, %[r]\n\t"
  171360. #endif
  171361. "uxth r6, r7\n\t"
  171362. #ifdef WOLFSSL_KEIL
  171363. "muls r5, r6, r5\n\t"
  171364. #elif defined(__clang__)
  171365. "muls r5, r6\n\t"
  171366. #else
  171367. "mul r5, r6\n\t"
  171368. #endif
  171369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171370. "lsrs r6, r5, #16\n\t"
  171371. #else
  171372. "lsr r6, r5, #16\n\t"
  171373. #endif
  171374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171375. "lsls r5, r5, #16\n\t"
  171376. #else
  171377. "lsl r5, r5, #16\n\t"
  171378. #endif
  171379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171380. "adds r4, r4, r5\n\t"
  171381. #else
  171382. "add r4, r4, r5\n\t"
  171383. #endif
  171384. #ifdef WOLFSSL_KEIL
  171385. "adcs r2, r2, r6\n\t"
  171386. #elif defined(__clang__)
  171387. "adcs r2, r6\n\t"
  171388. #else
  171389. "adc r2, r6\n\t"
  171390. #endif
  171391. #ifdef WOLFSSL_KEIL
  171392. "adcs r3, r3, %[r]\n\t"
  171393. #elif defined(__clang__)
  171394. "adcs r3, %[r]\n\t"
  171395. #else
  171396. "adc r3, %[r]\n\t"
  171397. #endif
  171398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171399. "adds r4, r4, r5\n\t"
  171400. #else
  171401. "add r4, r4, r5\n\t"
  171402. #endif
  171403. #ifdef WOLFSSL_KEIL
  171404. "adcs r2, r2, r6\n\t"
  171405. #elif defined(__clang__)
  171406. "adcs r2, r6\n\t"
  171407. #else
  171408. "adc r2, r6\n\t"
  171409. #endif
  171410. #ifdef WOLFSSL_KEIL
  171411. "adcs r3, r3, %[r]\n\t"
  171412. #elif defined(__clang__)
  171413. "adcs r3, %[r]\n\t"
  171414. #else
  171415. "adc r3, %[r]\n\t"
  171416. #endif
  171417. "# A[1] * A[1]\n\t"
  171418. "mov r7, r11\n\t"
  171419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171420. "lsrs r6, r7, #16\n\t"
  171421. #else
  171422. "lsr r6, r7, #16\n\t"
  171423. #endif
  171424. "uxth r5, r7\n\t"
  171425. #ifdef WOLFSSL_KEIL
  171426. "muls r5, r5, r5\n\t"
  171427. #elif defined(__clang__)
  171428. "muls r5, r5\n\t"
  171429. #else
  171430. "mul r5, r5\n\t"
  171431. #endif
  171432. #ifdef WOLFSSL_KEIL
  171433. "muls r6, r6, r6\n\t"
  171434. #elif defined(__clang__)
  171435. "muls r6, r6\n\t"
  171436. #else
  171437. "mul r6, r6\n\t"
  171438. #endif
  171439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171440. "adds r4, r4, r5\n\t"
  171441. #else
  171442. "add r4, r4, r5\n\t"
  171443. #endif
  171444. #ifdef WOLFSSL_KEIL
  171445. "adcs r2, r2, r6\n\t"
  171446. #elif defined(__clang__)
  171447. "adcs r2, r6\n\t"
  171448. #else
  171449. "adc r2, r6\n\t"
  171450. #endif
  171451. #ifdef WOLFSSL_KEIL
  171452. "adcs r3, r3, %[r]\n\t"
  171453. #elif defined(__clang__)
  171454. "adcs r3, %[r]\n\t"
  171455. #else
  171456. "adc r3, %[r]\n\t"
  171457. #endif
  171458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171459. "lsrs r6, r7, #16\n\t"
  171460. #else
  171461. "lsr r6, r7, #16\n\t"
  171462. #endif
  171463. "uxth r5, r7\n\t"
  171464. #ifdef WOLFSSL_KEIL
  171465. "muls r5, r6, r5\n\t"
  171466. #elif defined(__clang__)
  171467. "muls r5, r6\n\t"
  171468. #else
  171469. "mul r5, r6\n\t"
  171470. #endif
  171471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171472. "lsrs r6, r5, #15\n\t"
  171473. #else
  171474. "lsr r6, r5, #15\n\t"
  171475. #endif
  171476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171477. "lsls r5, r5, #17\n\t"
  171478. #else
  171479. "lsl r5, r5, #17\n\t"
  171480. #endif
  171481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171482. "adds r4, r4, r5\n\t"
  171483. #else
  171484. "add r4, r4, r5\n\t"
  171485. #endif
  171486. #ifdef WOLFSSL_KEIL
  171487. "adcs r2, r2, r6\n\t"
  171488. #elif defined(__clang__)
  171489. "adcs r2, r6\n\t"
  171490. #else
  171491. "adc r2, r6\n\t"
  171492. #endif
  171493. #ifdef WOLFSSL_KEIL
  171494. "adcs r3, r3, %[r]\n\t"
  171495. #elif defined(__clang__)
  171496. "adcs r3, %[r]\n\t"
  171497. #else
  171498. "adc r3, %[r]\n\t"
  171499. #endif
  171500. "str r4, [sp, #8]\n\t"
  171501. "# A[2] * A[1]\n\t"
  171502. "movs r4, #0\n\t"
  171503. "mov %[a], r9\n\t"
  171504. "mov %[a], r12\n\t"
  171505. "uxth r5, %[a]\n\t"
  171506. "uxth r6, r7\n\t"
  171507. #ifdef WOLFSSL_KEIL
  171508. "muls r6, r5, r6\n\t"
  171509. #elif defined(__clang__)
  171510. "muls r6, r5\n\t"
  171511. #else
  171512. "mul r6, r5\n\t"
  171513. #endif
  171514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171515. "adds r2, r2, r6\n\t"
  171516. #else
  171517. "add r2, r2, r6\n\t"
  171518. #endif
  171519. #ifdef WOLFSSL_KEIL
  171520. "adcs r3, r3, %[r]\n\t"
  171521. #elif defined(__clang__)
  171522. "adcs r3, %[r]\n\t"
  171523. #else
  171524. "adc r3, %[r]\n\t"
  171525. #endif
  171526. #ifdef WOLFSSL_KEIL
  171527. "adcs r4, r4, %[r]\n\t"
  171528. #elif defined(__clang__)
  171529. "adcs r4, %[r]\n\t"
  171530. #else
  171531. "adc r4, %[r]\n\t"
  171532. #endif
  171533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171534. "adds r2, r2, r6\n\t"
  171535. #else
  171536. "add r2, r2, r6\n\t"
  171537. #endif
  171538. #ifdef WOLFSSL_KEIL
  171539. "adcs r3, r3, %[r]\n\t"
  171540. #elif defined(__clang__)
  171541. "adcs r3, %[r]\n\t"
  171542. #else
  171543. "adc r3, %[r]\n\t"
  171544. #endif
  171545. #ifdef WOLFSSL_KEIL
  171546. "adcs r4, r4, %[r]\n\t"
  171547. #elif defined(__clang__)
  171548. "adcs r4, %[r]\n\t"
  171549. #else
  171550. "adc r4, %[r]\n\t"
  171551. #endif
  171552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171553. "lsrs r6, r7, #16\n\t"
  171554. #else
  171555. "lsr r6, r7, #16\n\t"
  171556. #endif
  171557. #ifdef WOLFSSL_KEIL
  171558. "muls r5, r6, r5\n\t"
  171559. #elif defined(__clang__)
  171560. "muls r5, r6\n\t"
  171561. #else
  171562. "mul r5, r6\n\t"
  171563. #endif
  171564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171565. "lsrs r6, r5, #16\n\t"
  171566. #else
  171567. "lsr r6, r5, #16\n\t"
  171568. #endif
  171569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171570. "lsls r5, r5, #16\n\t"
  171571. #else
  171572. "lsl r5, r5, #16\n\t"
  171573. #endif
  171574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171575. "adds r2, r2, r5\n\t"
  171576. #else
  171577. "add r2, r2, r5\n\t"
  171578. #endif
  171579. #ifdef WOLFSSL_KEIL
  171580. "adcs r3, r3, r6\n\t"
  171581. #elif defined(__clang__)
  171582. "adcs r3, r6\n\t"
  171583. #else
  171584. "adc r3, r6\n\t"
  171585. #endif
  171586. #ifdef WOLFSSL_KEIL
  171587. "adcs r4, r4, %[r]\n\t"
  171588. #elif defined(__clang__)
  171589. "adcs r4, %[r]\n\t"
  171590. #else
  171591. "adc r4, %[r]\n\t"
  171592. #endif
  171593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171594. "adds r2, r2, r5\n\t"
  171595. #else
  171596. "add r2, r2, r5\n\t"
  171597. #endif
  171598. #ifdef WOLFSSL_KEIL
  171599. "adcs r3, r3, r6\n\t"
  171600. #elif defined(__clang__)
  171601. "adcs r3, r6\n\t"
  171602. #else
  171603. "adc r3, r6\n\t"
  171604. #endif
  171605. #ifdef WOLFSSL_KEIL
  171606. "adcs r4, r4, %[r]\n\t"
  171607. #elif defined(__clang__)
  171608. "adcs r4, %[r]\n\t"
  171609. #else
  171610. "adc r4, %[r]\n\t"
  171611. #endif
  171612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171613. "lsrs r5, %[a], #16\n\t"
  171614. #else
  171615. "lsr r5, %[a], #16\n\t"
  171616. #endif
  171617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171618. "lsrs r6, r7, #16\n\t"
  171619. #else
  171620. "lsr r6, r7, #16\n\t"
  171621. #endif
  171622. #ifdef WOLFSSL_KEIL
  171623. "muls r6, r5, r6\n\t"
  171624. #elif defined(__clang__)
  171625. "muls r6, r5\n\t"
  171626. #else
  171627. "mul r6, r5\n\t"
  171628. #endif
  171629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171630. "adds r3, r3, r6\n\t"
  171631. #else
  171632. "add r3, r3, r6\n\t"
  171633. #endif
  171634. #ifdef WOLFSSL_KEIL
  171635. "adcs r4, r4, %[r]\n\t"
  171636. #elif defined(__clang__)
  171637. "adcs r4, %[r]\n\t"
  171638. #else
  171639. "adc r4, %[r]\n\t"
  171640. #endif
  171641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171642. "adds r3, r3, r6\n\t"
  171643. #else
  171644. "add r3, r3, r6\n\t"
  171645. #endif
  171646. #ifdef WOLFSSL_KEIL
  171647. "adcs r4, r4, %[r]\n\t"
  171648. #elif defined(__clang__)
  171649. "adcs r4, %[r]\n\t"
  171650. #else
  171651. "adc r4, %[r]\n\t"
  171652. #endif
  171653. "uxth r6, r7\n\t"
  171654. #ifdef WOLFSSL_KEIL
  171655. "muls r5, r6, r5\n\t"
  171656. #elif defined(__clang__)
  171657. "muls r5, r6\n\t"
  171658. #else
  171659. "mul r5, r6\n\t"
  171660. #endif
  171661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171662. "lsrs r6, r5, #16\n\t"
  171663. #else
  171664. "lsr r6, r5, #16\n\t"
  171665. #endif
  171666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171667. "lsls r5, r5, #16\n\t"
  171668. #else
  171669. "lsl r5, r5, #16\n\t"
  171670. #endif
  171671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171672. "adds r2, r2, r5\n\t"
  171673. #else
  171674. "add r2, r2, r5\n\t"
  171675. #endif
  171676. #ifdef WOLFSSL_KEIL
  171677. "adcs r3, r3, r6\n\t"
  171678. #elif defined(__clang__)
  171679. "adcs r3, r6\n\t"
  171680. #else
  171681. "adc r3, r6\n\t"
  171682. #endif
  171683. #ifdef WOLFSSL_KEIL
  171684. "adcs r4, r4, %[r]\n\t"
  171685. #elif defined(__clang__)
  171686. "adcs r4, %[r]\n\t"
  171687. #else
  171688. "adc r4, %[r]\n\t"
  171689. #endif
  171690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171691. "adds r2, r2, r5\n\t"
  171692. #else
  171693. "add r2, r2, r5\n\t"
  171694. #endif
  171695. #ifdef WOLFSSL_KEIL
  171696. "adcs r3, r3, r6\n\t"
  171697. #elif defined(__clang__)
  171698. "adcs r3, r6\n\t"
  171699. #else
  171700. "adc r3, r6\n\t"
  171701. #endif
  171702. #ifdef WOLFSSL_KEIL
  171703. "adcs r4, r4, %[r]\n\t"
  171704. #elif defined(__clang__)
  171705. "adcs r4, %[r]\n\t"
  171706. #else
  171707. "adc r4, %[r]\n\t"
  171708. #endif
  171709. "# A[3] * A[0]\n\t"
  171710. "mov %[a], r9\n\t"
  171711. "mov r7, r10\n\t"
  171712. "mov %[a], lr\n\t"
  171713. "uxth r5, %[a]\n\t"
  171714. "uxth r6, r7\n\t"
  171715. #ifdef WOLFSSL_KEIL
  171716. "muls r6, r5, r6\n\t"
  171717. #elif defined(__clang__)
  171718. "muls r6, r5\n\t"
  171719. #else
  171720. "mul r6, r5\n\t"
  171721. #endif
  171722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171723. "adds r2, r2, r6\n\t"
  171724. #else
  171725. "add r2, r2, r6\n\t"
  171726. #endif
  171727. #ifdef WOLFSSL_KEIL
  171728. "adcs r3, r3, %[r]\n\t"
  171729. #elif defined(__clang__)
  171730. "adcs r3, %[r]\n\t"
  171731. #else
  171732. "adc r3, %[r]\n\t"
  171733. #endif
  171734. #ifdef WOLFSSL_KEIL
  171735. "adcs r4, r4, %[r]\n\t"
  171736. #elif defined(__clang__)
  171737. "adcs r4, %[r]\n\t"
  171738. #else
  171739. "adc r4, %[r]\n\t"
  171740. #endif
  171741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171742. "adds r2, r2, r6\n\t"
  171743. #else
  171744. "add r2, r2, r6\n\t"
  171745. #endif
  171746. #ifdef WOLFSSL_KEIL
  171747. "adcs r3, r3, %[r]\n\t"
  171748. #elif defined(__clang__)
  171749. "adcs r3, %[r]\n\t"
  171750. #else
  171751. "adc r3, %[r]\n\t"
  171752. #endif
  171753. #ifdef WOLFSSL_KEIL
  171754. "adcs r4, r4, %[r]\n\t"
  171755. #elif defined(__clang__)
  171756. "adcs r4, %[r]\n\t"
  171757. #else
  171758. "adc r4, %[r]\n\t"
  171759. #endif
  171760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171761. "lsrs r6, r7, #16\n\t"
  171762. #else
  171763. "lsr r6, r7, #16\n\t"
  171764. #endif
  171765. #ifdef WOLFSSL_KEIL
  171766. "muls r5, r6, r5\n\t"
  171767. #elif defined(__clang__)
  171768. "muls r5, r6\n\t"
  171769. #else
  171770. "mul r5, r6\n\t"
  171771. #endif
  171772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171773. "lsrs r6, r5, #16\n\t"
  171774. #else
  171775. "lsr r6, r5, #16\n\t"
  171776. #endif
  171777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171778. "lsls r5, r5, #16\n\t"
  171779. #else
  171780. "lsl r5, r5, #16\n\t"
  171781. #endif
  171782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171783. "adds r2, r2, r5\n\t"
  171784. #else
  171785. "add r2, r2, r5\n\t"
  171786. #endif
  171787. #ifdef WOLFSSL_KEIL
  171788. "adcs r3, r3, r6\n\t"
  171789. #elif defined(__clang__)
  171790. "adcs r3, r6\n\t"
  171791. #else
  171792. "adc r3, r6\n\t"
  171793. #endif
  171794. #ifdef WOLFSSL_KEIL
  171795. "adcs r4, r4, %[r]\n\t"
  171796. #elif defined(__clang__)
  171797. "adcs r4, %[r]\n\t"
  171798. #else
  171799. "adc r4, %[r]\n\t"
  171800. #endif
  171801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171802. "adds r2, r2, r5\n\t"
  171803. #else
  171804. "add r2, r2, r5\n\t"
  171805. #endif
  171806. #ifdef WOLFSSL_KEIL
  171807. "adcs r3, r3, r6\n\t"
  171808. #elif defined(__clang__)
  171809. "adcs r3, r6\n\t"
  171810. #else
  171811. "adc r3, r6\n\t"
  171812. #endif
  171813. #ifdef WOLFSSL_KEIL
  171814. "adcs r4, r4, %[r]\n\t"
  171815. #elif defined(__clang__)
  171816. "adcs r4, %[r]\n\t"
  171817. #else
  171818. "adc r4, %[r]\n\t"
  171819. #endif
  171820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171821. "lsrs r5, %[a], #16\n\t"
  171822. #else
  171823. "lsr r5, %[a], #16\n\t"
  171824. #endif
  171825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171826. "lsrs r6, r7, #16\n\t"
  171827. #else
  171828. "lsr r6, r7, #16\n\t"
  171829. #endif
  171830. #ifdef WOLFSSL_KEIL
  171831. "muls r6, r5, r6\n\t"
  171832. #elif defined(__clang__)
  171833. "muls r6, r5\n\t"
  171834. #else
  171835. "mul r6, r5\n\t"
  171836. #endif
  171837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171838. "adds r3, r3, r6\n\t"
  171839. #else
  171840. "add r3, r3, r6\n\t"
  171841. #endif
  171842. #ifdef WOLFSSL_KEIL
  171843. "adcs r4, r4, %[r]\n\t"
  171844. #elif defined(__clang__)
  171845. "adcs r4, %[r]\n\t"
  171846. #else
  171847. "adc r4, %[r]\n\t"
  171848. #endif
  171849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171850. "adds r3, r3, r6\n\t"
  171851. #else
  171852. "add r3, r3, r6\n\t"
  171853. #endif
  171854. #ifdef WOLFSSL_KEIL
  171855. "adcs r4, r4, %[r]\n\t"
  171856. #elif defined(__clang__)
  171857. "adcs r4, %[r]\n\t"
  171858. #else
  171859. "adc r4, %[r]\n\t"
  171860. #endif
  171861. "uxth r6, r7\n\t"
  171862. #ifdef WOLFSSL_KEIL
  171863. "muls r5, r6, r5\n\t"
  171864. #elif defined(__clang__)
  171865. "muls r5, r6\n\t"
  171866. #else
  171867. "mul r5, r6\n\t"
  171868. #endif
  171869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171870. "lsrs r6, r5, #16\n\t"
  171871. #else
  171872. "lsr r6, r5, #16\n\t"
  171873. #endif
  171874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171875. "lsls r5, r5, #16\n\t"
  171876. #else
  171877. "lsl r5, r5, #16\n\t"
  171878. #endif
  171879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171880. "adds r2, r2, r5\n\t"
  171881. #else
  171882. "add r2, r2, r5\n\t"
  171883. #endif
  171884. #ifdef WOLFSSL_KEIL
  171885. "adcs r3, r3, r6\n\t"
  171886. #elif defined(__clang__)
  171887. "adcs r3, r6\n\t"
  171888. #else
  171889. "adc r3, r6\n\t"
  171890. #endif
  171891. #ifdef WOLFSSL_KEIL
  171892. "adcs r4, r4, %[r]\n\t"
  171893. #elif defined(__clang__)
  171894. "adcs r4, %[r]\n\t"
  171895. #else
  171896. "adc r4, %[r]\n\t"
  171897. #endif
  171898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171899. "adds r2, r2, r5\n\t"
  171900. #else
  171901. "add r2, r2, r5\n\t"
  171902. #endif
  171903. #ifdef WOLFSSL_KEIL
  171904. "adcs r3, r3, r6\n\t"
  171905. #elif defined(__clang__)
  171906. "adcs r3, r6\n\t"
  171907. #else
  171908. "adc r3, r6\n\t"
  171909. #endif
  171910. #ifdef WOLFSSL_KEIL
  171911. "adcs r4, r4, %[r]\n\t"
  171912. #elif defined(__clang__)
  171913. "adcs r4, %[r]\n\t"
  171914. #else
  171915. "adc r4, %[r]\n\t"
  171916. #endif
  171917. "str r2, [sp, #12]\n\t"
  171918. "# A[4] * A[0]\n\t"
  171919. "movs r2, #0\n\t"
  171920. "mov %[a], r9\n\t"
  171921. "ldr %[a], [%[a], #16]\n\t"
  171922. "uxth r5, %[a]\n\t"
  171923. "uxth r6, r7\n\t"
  171924. #ifdef WOLFSSL_KEIL
  171925. "muls r6, r5, r6\n\t"
  171926. #elif defined(__clang__)
  171927. "muls r6, r5\n\t"
  171928. #else
  171929. "mul r6, r5\n\t"
  171930. #endif
  171931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171932. "adds r3, r3, r6\n\t"
  171933. #else
  171934. "add r3, r3, r6\n\t"
  171935. #endif
  171936. #ifdef WOLFSSL_KEIL
  171937. "adcs r4, r4, %[r]\n\t"
  171938. #elif defined(__clang__)
  171939. "adcs r4, %[r]\n\t"
  171940. #else
  171941. "adc r4, %[r]\n\t"
  171942. #endif
  171943. #ifdef WOLFSSL_KEIL
  171944. "adcs r2, r2, %[r]\n\t"
  171945. #elif defined(__clang__)
  171946. "adcs r2, %[r]\n\t"
  171947. #else
  171948. "adc r2, %[r]\n\t"
  171949. #endif
  171950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171951. "adds r3, r3, r6\n\t"
  171952. #else
  171953. "add r3, r3, r6\n\t"
  171954. #endif
  171955. #ifdef WOLFSSL_KEIL
  171956. "adcs r4, r4, %[r]\n\t"
  171957. #elif defined(__clang__)
  171958. "adcs r4, %[r]\n\t"
  171959. #else
  171960. "adc r4, %[r]\n\t"
  171961. #endif
  171962. #ifdef WOLFSSL_KEIL
  171963. "adcs r2, r2, %[r]\n\t"
  171964. #elif defined(__clang__)
  171965. "adcs r2, %[r]\n\t"
  171966. #else
  171967. "adc r2, %[r]\n\t"
  171968. #endif
  171969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171970. "lsrs r6, r7, #16\n\t"
  171971. #else
  171972. "lsr r6, r7, #16\n\t"
  171973. #endif
  171974. #ifdef WOLFSSL_KEIL
  171975. "muls r5, r6, r5\n\t"
  171976. #elif defined(__clang__)
  171977. "muls r5, r6\n\t"
  171978. #else
  171979. "mul r5, r6\n\t"
  171980. #endif
  171981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171982. "lsrs r6, r5, #16\n\t"
  171983. #else
  171984. "lsr r6, r5, #16\n\t"
  171985. #endif
  171986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171987. "lsls r5, r5, #16\n\t"
  171988. #else
  171989. "lsl r5, r5, #16\n\t"
  171990. #endif
  171991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171992. "adds r3, r3, r5\n\t"
  171993. #else
  171994. "add r3, r3, r5\n\t"
  171995. #endif
  171996. #ifdef WOLFSSL_KEIL
  171997. "adcs r4, r4, r6\n\t"
  171998. #elif defined(__clang__)
  171999. "adcs r4, r6\n\t"
  172000. #else
  172001. "adc r4, r6\n\t"
  172002. #endif
  172003. #ifdef WOLFSSL_KEIL
  172004. "adcs r2, r2, %[r]\n\t"
  172005. #elif defined(__clang__)
  172006. "adcs r2, %[r]\n\t"
  172007. #else
  172008. "adc r2, %[r]\n\t"
  172009. #endif
  172010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172011. "adds r3, r3, r5\n\t"
  172012. #else
  172013. "add r3, r3, r5\n\t"
  172014. #endif
  172015. #ifdef WOLFSSL_KEIL
  172016. "adcs r4, r4, r6\n\t"
  172017. #elif defined(__clang__)
  172018. "adcs r4, r6\n\t"
  172019. #else
  172020. "adc r4, r6\n\t"
  172021. #endif
  172022. #ifdef WOLFSSL_KEIL
  172023. "adcs r2, r2, %[r]\n\t"
  172024. #elif defined(__clang__)
  172025. "adcs r2, %[r]\n\t"
  172026. #else
  172027. "adc r2, %[r]\n\t"
  172028. #endif
  172029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172030. "lsrs r5, %[a], #16\n\t"
  172031. #else
  172032. "lsr r5, %[a], #16\n\t"
  172033. #endif
  172034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172035. "lsrs r6, r7, #16\n\t"
  172036. #else
  172037. "lsr r6, r7, #16\n\t"
  172038. #endif
  172039. #ifdef WOLFSSL_KEIL
  172040. "muls r6, r5, r6\n\t"
  172041. #elif defined(__clang__)
  172042. "muls r6, r5\n\t"
  172043. #else
  172044. "mul r6, r5\n\t"
  172045. #endif
  172046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172047. "adds r4, r4, r6\n\t"
  172048. #else
  172049. "add r4, r4, r6\n\t"
  172050. #endif
  172051. #ifdef WOLFSSL_KEIL
  172052. "adcs r2, r2, %[r]\n\t"
  172053. #elif defined(__clang__)
  172054. "adcs r2, %[r]\n\t"
  172055. #else
  172056. "adc r2, %[r]\n\t"
  172057. #endif
  172058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172059. "adds r4, r4, r6\n\t"
  172060. #else
  172061. "add r4, r4, r6\n\t"
  172062. #endif
  172063. #ifdef WOLFSSL_KEIL
  172064. "adcs r2, r2, %[r]\n\t"
  172065. #elif defined(__clang__)
  172066. "adcs r2, %[r]\n\t"
  172067. #else
  172068. "adc r2, %[r]\n\t"
  172069. #endif
  172070. "uxth r6, r7\n\t"
  172071. #ifdef WOLFSSL_KEIL
  172072. "muls r5, r6, r5\n\t"
  172073. #elif defined(__clang__)
  172074. "muls r5, r6\n\t"
  172075. #else
  172076. "mul r5, r6\n\t"
  172077. #endif
  172078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172079. "lsrs r6, r5, #16\n\t"
  172080. #else
  172081. "lsr r6, r5, #16\n\t"
  172082. #endif
  172083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172084. "lsls r5, r5, #16\n\t"
  172085. #else
  172086. "lsl r5, r5, #16\n\t"
  172087. #endif
  172088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172089. "adds r3, r3, r5\n\t"
  172090. #else
  172091. "add r3, r3, r5\n\t"
  172092. #endif
  172093. #ifdef WOLFSSL_KEIL
  172094. "adcs r4, r4, r6\n\t"
  172095. #elif defined(__clang__)
  172096. "adcs r4, r6\n\t"
  172097. #else
  172098. "adc r4, r6\n\t"
  172099. #endif
  172100. #ifdef WOLFSSL_KEIL
  172101. "adcs r2, r2, %[r]\n\t"
  172102. #elif defined(__clang__)
  172103. "adcs r2, %[r]\n\t"
  172104. #else
  172105. "adc r2, %[r]\n\t"
  172106. #endif
  172107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172108. "adds r3, r3, r5\n\t"
  172109. #else
  172110. "add r3, r3, r5\n\t"
  172111. #endif
  172112. #ifdef WOLFSSL_KEIL
  172113. "adcs r4, r4, r6\n\t"
  172114. #elif defined(__clang__)
  172115. "adcs r4, r6\n\t"
  172116. #else
  172117. "adc r4, r6\n\t"
  172118. #endif
  172119. #ifdef WOLFSSL_KEIL
  172120. "adcs r2, r2, %[r]\n\t"
  172121. #elif defined(__clang__)
  172122. "adcs r2, %[r]\n\t"
  172123. #else
  172124. "adc r2, %[r]\n\t"
  172125. #endif
  172126. "# A[3] * A[1]\n\t"
  172127. "mov %[a], r9\n\t"
  172128. "mov r7, r11\n\t"
  172129. "mov %[a], lr\n\t"
  172130. "uxth r5, %[a]\n\t"
  172131. "uxth r6, r7\n\t"
  172132. #ifdef WOLFSSL_KEIL
  172133. "muls r6, r5, r6\n\t"
  172134. #elif defined(__clang__)
  172135. "muls r6, r5\n\t"
  172136. #else
  172137. "mul r6, r5\n\t"
  172138. #endif
  172139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172140. "adds r3, r3, r6\n\t"
  172141. #else
  172142. "add r3, r3, r6\n\t"
  172143. #endif
  172144. #ifdef WOLFSSL_KEIL
  172145. "adcs r4, r4, %[r]\n\t"
  172146. #elif defined(__clang__)
  172147. "adcs r4, %[r]\n\t"
  172148. #else
  172149. "adc r4, %[r]\n\t"
  172150. #endif
  172151. #ifdef WOLFSSL_KEIL
  172152. "adcs r2, r2, %[r]\n\t"
  172153. #elif defined(__clang__)
  172154. "adcs r2, %[r]\n\t"
  172155. #else
  172156. "adc r2, %[r]\n\t"
  172157. #endif
  172158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172159. "adds r3, r3, r6\n\t"
  172160. #else
  172161. "add r3, r3, r6\n\t"
  172162. #endif
  172163. #ifdef WOLFSSL_KEIL
  172164. "adcs r4, r4, %[r]\n\t"
  172165. #elif defined(__clang__)
  172166. "adcs r4, %[r]\n\t"
  172167. #else
  172168. "adc r4, %[r]\n\t"
  172169. #endif
  172170. #ifdef WOLFSSL_KEIL
  172171. "adcs r2, r2, %[r]\n\t"
  172172. #elif defined(__clang__)
  172173. "adcs r2, %[r]\n\t"
  172174. #else
  172175. "adc r2, %[r]\n\t"
  172176. #endif
  172177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172178. "lsrs r6, r7, #16\n\t"
  172179. #else
  172180. "lsr r6, r7, #16\n\t"
  172181. #endif
  172182. #ifdef WOLFSSL_KEIL
  172183. "muls r5, r6, r5\n\t"
  172184. #elif defined(__clang__)
  172185. "muls r5, r6\n\t"
  172186. #else
  172187. "mul r5, r6\n\t"
  172188. #endif
  172189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172190. "lsrs r6, r5, #16\n\t"
  172191. #else
  172192. "lsr r6, r5, #16\n\t"
  172193. #endif
  172194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172195. "lsls r5, r5, #16\n\t"
  172196. #else
  172197. "lsl r5, r5, #16\n\t"
  172198. #endif
  172199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172200. "adds r3, r3, r5\n\t"
  172201. #else
  172202. "add r3, r3, r5\n\t"
  172203. #endif
  172204. #ifdef WOLFSSL_KEIL
  172205. "adcs r4, r4, r6\n\t"
  172206. #elif defined(__clang__)
  172207. "adcs r4, r6\n\t"
  172208. #else
  172209. "adc r4, r6\n\t"
  172210. #endif
  172211. #ifdef WOLFSSL_KEIL
  172212. "adcs r2, r2, %[r]\n\t"
  172213. #elif defined(__clang__)
  172214. "adcs r2, %[r]\n\t"
  172215. #else
  172216. "adc r2, %[r]\n\t"
  172217. #endif
  172218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172219. "adds r3, r3, r5\n\t"
  172220. #else
  172221. "add r3, r3, r5\n\t"
  172222. #endif
  172223. #ifdef WOLFSSL_KEIL
  172224. "adcs r4, r4, r6\n\t"
  172225. #elif defined(__clang__)
  172226. "adcs r4, r6\n\t"
  172227. #else
  172228. "adc r4, r6\n\t"
  172229. #endif
  172230. #ifdef WOLFSSL_KEIL
  172231. "adcs r2, r2, %[r]\n\t"
  172232. #elif defined(__clang__)
  172233. "adcs r2, %[r]\n\t"
  172234. #else
  172235. "adc r2, %[r]\n\t"
  172236. #endif
  172237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172238. "lsrs r5, %[a], #16\n\t"
  172239. #else
  172240. "lsr r5, %[a], #16\n\t"
  172241. #endif
  172242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172243. "lsrs r6, r7, #16\n\t"
  172244. #else
  172245. "lsr r6, r7, #16\n\t"
  172246. #endif
  172247. #ifdef WOLFSSL_KEIL
  172248. "muls r6, r5, r6\n\t"
  172249. #elif defined(__clang__)
  172250. "muls r6, r5\n\t"
  172251. #else
  172252. "mul r6, r5\n\t"
  172253. #endif
  172254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172255. "adds r4, r4, r6\n\t"
  172256. #else
  172257. "add r4, r4, r6\n\t"
  172258. #endif
  172259. #ifdef WOLFSSL_KEIL
  172260. "adcs r2, r2, %[r]\n\t"
  172261. #elif defined(__clang__)
  172262. "adcs r2, %[r]\n\t"
  172263. #else
  172264. "adc r2, %[r]\n\t"
  172265. #endif
  172266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172267. "adds r4, r4, r6\n\t"
  172268. #else
  172269. "add r4, r4, r6\n\t"
  172270. #endif
  172271. #ifdef WOLFSSL_KEIL
  172272. "adcs r2, r2, %[r]\n\t"
  172273. #elif defined(__clang__)
  172274. "adcs r2, %[r]\n\t"
  172275. #else
  172276. "adc r2, %[r]\n\t"
  172277. #endif
  172278. "uxth r6, r7\n\t"
  172279. #ifdef WOLFSSL_KEIL
  172280. "muls r5, r6, r5\n\t"
  172281. #elif defined(__clang__)
  172282. "muls r5, r6\n\t"
  172283. #else
  172284. "mul r5, r6\n\t"
  172285. #endif
  172286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172287. "lsrs r6, r5, #16\n\t"
  172288. #else
  172289. "lsr r6, r5, #16\n\t"
  172290. #endif
  172291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172292. "lsls r5, r5, #16\n\t"
  172293. #else
  172294. "lsl r5, r5, #16\n\t"
  172295. #endif
  172296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172297. "adds r3, r3, r5\n\t"
  172298. #else
  172299. "add r3, r3, r5\n\t"
  172300. #endif
  172301. #ifdef WOLFSSL_KEIL
  172302. "adcs r4, r4, r6\n\t"
  172303. #elif defined(__clang__)
  172304. "adcs r4, r6\n\t"
  172305. #else
  172306. "adc r4, r6\n\t"
  172307. #endif
  172308. #ifdef WOLFSSL_KEIL
  172309. "adcs r2, r2, %[r]\n\t"
  172310. #elif defined(__clang__)
  172311. "adcs r2, %[r]\n\t"
  172312. #else
  172313. "adc r2, %[r]\n\t"
  172314. #endif
  172315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172316. "adds r3, r3, r5\n\t"
  172317. #else
  172318. "add r3, r3, r5\n\t"
  172319. #endif
  172320. #ifdef WOLFSSL_KEIL
  172321. "adcs r4, r4, r6\n\t"
  172322. #elif defined(__clang__)
  172323. "adcs r4, r6\n\t"
  172324. #else
  172325. "adc r4, r6\n\t"
  172326. #endif
  172327. #ifdef WOLFSSL_KEIL
  172328. "adcs r2, r2, %[r]\n\t"
  172329. #elif defined(__clang__)
  172330. "adcs r2, %[r]\n\t"
  172331. #else
  172332. "adc r2, %[r]\n\t"
  172333. #endif
  172334. "# A[2] * A[2]\n\t"
  172335. "mov r7, r12\n\t"
  172336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172337. "lsrs r6, r7, #16\n\t"
  172338. #else
  172339. "lsr r6, r7, #16\n\t"
  172340. #endif
  172341. "uxth r5, r7\n\t"
  172342. #ifdef WOLFSSL_KEIL
  172343. "muls r5, r5, r5\n\t"
  172344. #elif defined(__clang__)
  172345. "muls r5, r5\n\t"
  172346. #else
  172347. "mul r5, r5\n\t"
  172348. #endif
  172349. #ifdef WOLFSSL_KEIL
  172350. "muls r6, r6, r6\n\t"
  172351. #elif defined(__clang__)
  172352. "muls r6, r6\n\t"
  172353. #else
  172354. "mul r6, r6\n\t"
  172355. #endif
  172356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172357. "adds r3, r3, r5\n\t"
  172358. #else
  172359. "add r3, r3, r5\n\t"
  172360. #endif
  172361. #ifdef WOLFSSL_KEIL
  172362. "adcs r4, r4, r6\n\t"
  172363. #elif defined(__clang__)
  172364. "adcs r4, r6\n\t"
  172365. #else
  172366. "adc r4, r6\n\t"
  172367. #endif
  172368. #ifdef WOLFSSL_KEIL
  172369. "adcs r2, r2, %[r]\n\t"
  172370. #elif defined(__clang__)
  172371. "adcs r2, %[r]\n\t"
  172372. #else
  172373. "adc r2, %[r]\n\t"
  172374. #endif
  172375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172376. "lsrs r6, r7, #16\n\t"
  172377. #else
  172378. "lsr r6, r7, #16\n\t"
  172379. #endif
  172380. "uxth r5, r7\n\t"
  172381. #ifdef WOLFSSL_KEIL
  172382. "muls r5, r6, r5\n\t"
  172383. #elif defined(__clang__)
  172384. "muls r5, r6\n\t"
  172385. #else
  172386. "mul r5, r6\n\t"
  172387. #endif
  172388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172389. "lsrs r6, r5, #15\n\t"
  172390. #else
  172391. "lsr r6, r5, #15\n\t"
  172392. #endif
  172393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172394. "lsls r5, r5, #17\n\t"
  172395. #else
  172396. "lsl r5, r5, #17\n\t"
  172397. #endif
  172398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172399. "adds r3, r3, r5\n\t"
  172400. #else
  172401. "add r3, r3, r5\n\t"
  172402. #endif
  172403. #ifdef WOLFSSL_KEIL
  172404. "adcs r4, r4, r6\n\t"
  172405. #elif defined(__clang__)
  172406. "adcs r4, r6\n\t"
  172407. #else
  172408. "adc r4, r6\n\t"
  172409. #endif
  172410. #ifdef WOLFSSL_KEIL
  172411. "adcs r2, r2, %[r]\n\t"
  172412. #elif defined(__clang__)
  172413. "adcs r2, %[r]\n\t"
  172414. #else
  172415. "adc r2, %[r]\n\t"
  172416. #endif
  172417. "str r3, [sp, #16]\n\t"
  172418. "# A[3] * A[2]\n\t"
  172419. "movs r3, #0\n\t"
  172420. "mov %[a], r9\n\t"
  172421. "mov %[a], lr\n\t"
  172422. "uxth r5, %[a]\n\t"
  172423. "uxth r6, r7\n\t"
  172424. #ifdef WOLFSSL_KEIL
  172425. "muls r6, r5, r6\n\t"
  172426. #elif defined(__clang__)
  172427. "muls r6, r5\n\t"
  172428. #else
  172429. "mul r6, r5\n\t"
  172430. #endif
  172431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172432. "adds r4, r4, r6\n\t"
  172433. #else
  172434. "add r4, r4, r6\n\t"
  172435. #endif
  172436. #ifdef WOLFSSL_KEIL
  172437. "adcs r2, r2, %[r]\n\t"
  172438. #elif defined(__clang__)
  172439. "adcs r2, %[r]\n\t"
  172440. #else
  172441. "adc r2, %[r]\n\t"
  172442. #endif
  172443. #ifdef WOLFSSL_KEIL
  172444. "adcs r3, r3, %[r]\n\t"
  172445. #elif defined(__clang__)
  172446. "adcs r3, %[r]\n\t"
  172447. #else
  172448. "adc r3, %[r]\n\t"
  172449. #endif
  172450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172451. "adds r4, r4, r6\n\t"
  172452. #else
  172453. "add r4, r4, r6\n\t"
  172454. #endif
  172455. #ifdef WOLFSSL_KEIL
  172456. "adcs r2, r2, %[r]\n\t"
  172457. #elif defined(__clang__)
  172458. "adcs r2, %[r]\n\t"
  172459. #else
  172460. "adc r2, %[r]\n\t"
  172461. #endif
  172462. #ifdef WOLFSSL_KEIL
  172463. "adcs r3, r3, %[r]\n\t"
  172464. #elif defined(__clang__)
  172465. "adcs r3, %[r]\n\t"
  172466. #else
  172467. "adc r3, %[r]\n\t"
  172468. #endif
  172469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172470. "lsrs r6, r7, #16\n\t"
  172471. #else
  172472. "lsr r6, r7, #16\n\t"
  172473. #endif
  172474. #ifdef WOLFSSL_KEIL
  172475. "muls r5, r6, r5\n\t"
  172476. #elif defined(__clang__)
  172477. "muls r5, r6\n\t"
  172478. #else
  172479. "mul r5, r6\n\t"
  172480. #endif
  172481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172482. "lsrs r6, r5, #16\n\t"
  172483. #else
  172484. "lsr r6, r5, #16\n\t"
  172485. #endif
  172486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172487. "lsls r5, r5, #16\n\t"
  172488. #else
  172489. "lsl r5, r5, #16\n\t"
  172490. #endif
  172491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172492. "adds r4, r4, r5\n\t"
  172493. #else
  172494. "add r4, r4, r5\n\t"
  172495. #endif
  172496. #ifdef WOLFSSL_KEIL
  172497. "adcs r2, r2, r6\n\t"
  172498. #elif defined(__clang__)
  172499. "adcs r2, r6\n\t"
  172500. #else
  172501. "adc r2, r6\n\t"
  172502. #endif
  172503. #ifdef WOLFSSL_KEIL
  172504. "adcs r3, r3, %[r]\n\t"
  172505. #elif defined(__clang__)
  172506. "adcs r3, %[r]\n\t"
  172507. #else
  172508. "adc r3, %[r]\n\t"
  172509. #endif
  172510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172511. "adds r4, r4, r5\n\t"
  172512. #else
  172513. "add r4, r4, r5\n\t"
  172514. #endif
  172515. #ifdef WOLFSSL_KEIL
  172516. "adcs r2, r2, r6\n\t"
  172517. #elif defined(__clang__)
  172518. "adcs r2, r6\n\t"
  172519. #else
  172520. "adc r2, r6\n\t"
  172521. #endif
  172522. #ifdef WOLFSSL_KEIL
  172523. "adcs r3, r3, %[r]\n\t"
  172524. #elif defined(__clang__)
  172525. "adcs r3, %[r]\n\t"
  172526. #else
  172527. "adc r3, %[r]\n\t"
  172528. #endif
  172529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172530. "lsrs r5, %[a], #16\n\t"
  172531. #else
  172532. "lsr r5, %[a], #16\n\t"
  172533. #endif
  172534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172535. "lsrs r6, r7, #16\n\t"
  172536. #else
  172537. "lsr r6, r7, #16\n\t"
  172538. #endif
  172539. #ifdef WOLFSSL_KEIL
  172540. "muls r6, r5, r6\n\t"
  172541. #elif defined(__clang__)
  172542. "muls r6, r5\n\t"
  172543. #else
  172544. "mul r6, r5\n\t"
  172545. #endif
  172546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172547. "adds r2, r2, r6\n\t"
  172548. #else
  172549. "add r2, r2, r6\n\t"
  172550. #endif
  172551. #ifdef WOLFSSL_KEIL
  172552. "adcs r3, r3, %[r]\n\t"
  172553. #elif defined(__clang__)
  172554. "adcs r3, %[r]\n\t"
  172555. #else
  172556. "adc r3, %[r]\n\t"
  172557. #endif
  172558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172559. "adds r2, r2, r6\n\t"
  172560. #else
  172561. "add r2, r2, r6\n\t"
  172562. #endif
  172563. #ifdef WOLFSSL_KEIL
  172564. "adcs r3, r3, %[r]\n\t"
  172565. #elif defined(__clang__)
  172566. "adcs r3, %[r]\n\t"
  172567. #else
  172568. "adc r3, %[r]\n\t"
  172569. #endif
  172570. "uxth r6, r7\n\t"
  172571. #ifdef WOLFSSL_KEIL
  172572. "muls r5, r6, r5\n\t"
  172573. #elif defined(__clang__)
  172574. "muls r5, r6\n\t"
  172575. #else
  172576. "mul r5, r6\n\t"
  172577. #endif
  172578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172579. "lsrs r6, r5, #16\n\t"
  172580. #else
  172581. "lsr r6, r5, #16\n\t"
  172582. #endif
  172583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172584. "lsls r5, r5, #16\n\t"
  172585. #else
  172586. "lsl r5, r5, #16\n\t"
  172587. #endif
  172588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172589. "adds r4, r4, r5\n\t"
  172590. #else
  172591. "add r4, r4, r5\n\t"
  172592. #endif
  172593. #ifdef WOLFSSL_KEIL
  172594. "adcs r2, r2, r6\n\t"
  172595. #elif defined(__clang__)
  172596. "adcs r2, r6\n\t"
  172597. #else
  172598. "adc r2, r6\n\t"
  172599. #endif
  172600. #ifdef WOLFSSL_KEIL
  172601. "adcs r3, r3, %[r]\n\t"
  172602. #elif defined(__clang__)
  172603. "adcs r3, %[r]\n\t"
  172604. #else
  172605. "adc r3, %[r]\n\t"
  172606. #endif
  172607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172608. "adds r4, r4, r5\n\t"
  172609. #else
  172610. "add r4, r4, r5\n\t"
  172611. #endif
  172612. #ifdef WOLFSSL_KEIL
  172613. "adcs r2, r2, r6\n\t"
  172614. #elif defined(__clang__)
  172615. "adcs r2, r6\n\t"
  172616. #else
  172617. "adc r2, r6\n\t"
  172618. #endif
  172619. #ifdef WOLFSSL_KEIL
  172620. "adcs r3, r3, %[r]\n\t"
  172621. #elif defined(__clang__)
  172622. "adcs r3, %[r]\n\t"
  172623. #else
  172624. "adc r3, %[r]\n\t"
  172625. #endif
  172626. "# A[4] * A[1]\n\t"
  172627. "mov %[a], r9\n\t"
  172628. "mov r7, r11\n\t"
  172629. "ldr %[a], [%[a], #16]\n\t"
  172630. "uxth r5, %[a]\n\t"
  172631. "uxth r6, r7\n\t"
  172632. #ifdef WOLFSSL_KEIL
  172633. "muls r6, r5, r6\n\t"
  172634. #elif defined(__clang__)
  172635. "muls r6, r5\n\t"
  172636. #else
  172637. "mul r6, r5\n\t"
  172638. #endif
  172639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172640. "adds r4, r4, r6\n\t"
  172641. #else
  172642. "add r4, r4, r6\n\t"
  172643. #endif
  172644. #ifdef WOLFSSL_KEIL
  172645. "adcs r2, r2, %[r]\n\t"
  172646. #elif defined(__clang__)
  172647. "adcs r2, %[r]\n\t"
  172648. #else
  172649. "adc r2, %[r]\n\t"
  172650. #endif
  172651. #ifdef WOLFSSL_KEIL
  172652. "adcs r3, r3, %[r]\n\t"
  172653. #elif defined(__clang__)
  172654. "adcs r3, %[r]\n\t"
  172655. #else
  172656. "adc r3, %[r]\n\t"
  172657. #endif
  172658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172659. "adds r4, r4, r6\n\t"
  172660. #else
  172661. "add r4, r4, r6\n\t"
  172662. #endif
  172663. #ifdef WOLFSSL_KEIL
  172664. "adcs r2, r2, %[r]\n\t"
  172665. #elif defined(__clang__)
  172666. "adcs r2, %[r]\n\t"
  172667. #else
  172668. "adc r2, %[r]\n\t"
  172669. #endif
  172670. #ifdef WOLFSSL_KEIL
  172671. "adcs r3, r3, %[r]\n\t"
  172672. #elif defined(__clang__)
  172673. "adcs r3, %[r]\n\t"
  172674. #else
  172675. "adc r3, %[r]\n\t"
  172676. #endif
  172677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172678. "lsrs r6, r7, #16\n\t"
  172679. #else
  172680. "lsr r6, r7, #16\n\t"
  172681. #endif
  172682. #ifdef WOLFSSL_KEIL
  172683. "muls r5, r6, r5\n\t"
  172684. #elif defined(__clang__)
  172685. "muls r5, r6\n\t"
  172686. #else
  172687. "mul r5, r6\n\t"
  172688. #endif
  172689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172690. "lsrs r6, r5, #16\n\t"
  172691. #else
  172692. "lsr r6, r5, #16\n\t"
  172693. #endif
  172694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172695. "lsls r5, r5, #16\n\t"
  172696. #else
  172697. "lsl r5, r5, #16\n\t"
  172698. #endif
  172699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172700. "adds r4, r4, r5\n\t"
  172701. #else
  172702. "add r4, r4, r5\n\t"
  172703. #endif
  172704. #ifdef WOLFSSL_KEIL
  172705. "adcs r2, r2, r6\n\t"
  172706. #elif defined(__clang__)
  172707. "adcs r2, r6\n\t"
  172708. #else
  172709. "adc r2, r6\n\t"
  172710. #endif
  172711. #ifdef WOLFSSL_KEIL
  172712. "adcs r3, r3, %[r]\n\t"
  172713. #elif defined(__clang__)
  172714. "adcs r3, %[r]\n\t"
  172715. #else
  172716. "adc r3, %[r]\n\t"
  172717. #endif
  172718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172719. "adds r4, r4, r5\n\t"
  172720. #else
  172721. "add r4, r4, r5\n\t"
  172722. #endif
  172723. #ifdef WOLFSSL_KEIL
  172724. "adcs r2, r2, r6\n\t"
  172725. #elif defined(__clang__)
  172726. "adcs r2, r6\n\t"
  172727. #else
  172728. "adc r2, r6\n\t"
  172729. #endif
  172730. #ifdef WOLFSSL_KEIL
  172731. "adcs r3, r3, %[r]\n\t"
  172732. #elif defined(__clang__)
  172733. "adcs r3, %[r]\n\t"
  172734. #else
  172735. "adc r3, %[r]\n\t"
  172736. #endif
  172737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172738. "lsrs r5, %[a], #16\n\t"
  172739. #else
  172740. "lsr r5, %[a], #16\n\t"
  172741. #endif
  172742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172743. "lsrs r6, r7, #16\n\t"
  172744. #else
  172745. "lsr r6, r7, #16\n\t"
  172746. #endif
  172747. #ifdef WOLFSSL_KEIL
  172748. "muls r6, r5, r6\n\t"
  172749. #elif defined(__clang__)
  172750. "muls r6, r5\n\t"
  172751. #else
  172752. "mul r6, r5\n\t"
  172753. #endif
  172754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172755. "adds r2, r2, r6\n\t"
  172756. #else
  172757. "add r2, r2, r6\n\t"
  172758. #endif
  172759. #ifdef WOLFSSL_KEIL
  172760. "adcs r3, r3, %[r]\n\t"
  172761. #elif defined(__clang__)
  172762. "adcs r3, %[r]\n\t"
  172763. #else
  172764. "adc r3, %[r]\n\t"
  172765. #endif
  172766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172767. "adds r2, r2, r6\n\t"
  172768. #else
  172769. "add r2, r2, r6\n\t"
  172770. #endif
  172771. #ifdef WOLFSSL_KEIL
  172772. "adcs r3, r3, %[r]\n\t"
  172773. #elif defined(__clang__)
  172774. "adcs r3, %[r]\n\t"
  172775. #else
  172776. "adc r3, %[r]\n\t"
  172777. #endif
  172778. "uxth r6, r7\n\t"
  172779. #ifdef WOLFSSL_KEIL
  172780. "muls r5, r6, r5\n\t"
  172781. #elif defined(__clang__)
  172782. "muls r5, r6\n\t"
  172783. #else
  172784. "mul r5, r6\n\t"
  172785. #endif
  172786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172787. "lsrs r6, r5, #16\n\t"
  172788. #else
  172789. "lsr r6, r5, #16\n\t"
  172790. #endif
  172791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172792. "lsls r5, r5, #16\n\t"
  172793. #else
  172794. "lsl r5, r5, #16\n\t"
  172795. #endif
  172796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172797. "adds r4, r4, r5\n\t"
  172798. #else
  172799. "add r4, r4, r5\n\t"
  172800. #endif
  172801. #ifdef WOLFSSL_KEIL
  172802. "adcs r2, r2, r6\n\t"
  172803. #elif defined(__clang__)
  172804. "adcs r2, r6\n\t"
  172805. #else
  172806. "adc r2, r6\n\t"
  172807. #endif
  172808. #ifdef WOLFSSL_KEIL
  172809. "adcs r3, r3, %[r]\n\t"
  172810. #elif defined(__clang__)
  172811. "adcs r3, %[r]\n\t"
  172812. #else
  172813. "adc r3, %[r]\n\t"
  172814. #endif
  172815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172816. "adds r4, r4, r5\n\t"
  172817. #else
  172818. "add r4, r4, r5\n\t"
  172819. #endif
  172820. #ifdef WOLFSSL_KEIL
  172821. "adcs r2, r2, r6\n\t"
  172822. #elif defined(__clang__)
  172823. "adcs r2, r6\n\t"
  172824. #else
  172825. "adc r2, r6\n\t"
  172826. #endif
  172827. #ifdef WOLFSSL_KEIL
  172828. "adcs r3, r3, %[r]\n\t"
  172829. #elif defined(__clang__)
  172830. "adcs r3, %[r]\n\t"
  172831. #else
  172832. "adc r3, %[r]\n\t"
  172833. #endif
  172834. "# A[5] * A[0]\n\t"
  172835. "mov %[a], r9\n\t"
  172836. "mov r7, r10\n\t"
  172837. "ldr %[a], [%[a], #20]\n\t"
  172838. "uxth r5, %[a]\n\t"
  172839. "uxth r6, r7\n\t"
  172840. #ifdef WOLFSSL_KEIL
  172841. "muls r6, r5, r6\n\t"
  172842. #elif defined(__clang__)
  172843. "muls r6, r5\n\t"
  172844. #else
  172845. "mul r6, r5\n\t"
  172846. #endif
  172847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172848. "adds r4, r4, r6\n\t"
  172849. #else
  172850. "add r4, r4, r6\n\t"
  172851. #endif
  172852. #ifdef WOLFSSL_KEIL
  172853. "adcs r2, r2, %[r]\n\t"
  172854. #elif defined(__clang__)
  172855. "adcs r2, %[r]\n\t"
  172856. #else
  172857. "adc r2, %[r]\n\t"
  172858. #endif
  172859. #ifdef WOLFSSL_KEIL
  172860. "adcs r3, r3, %[r]\n\t"
  172861. #elif defined(__clang__)
  172862. "adcs r3, %[r]\n\t"
  172863. #else
  172864. "adc r3, %[r]\n\t"
  172865. #endif
  172866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172867. "adds r4, r4, r6\n\t"
  172868. #else
  172869. "add r4, r4, r6\n\t"
  172870. #endif
  172871. #ifdef WOLFSSL_KEIL
  172872. "adcs r2, r2, %[r]\n\t"
  172873. #elif defined(__clang__)
  172874. "adcs r2, %[r]\n\t"
  172875. #else
  172876. "adc r2, %[r]\n\t"
  172877. #endif
  172878. #ifdef WOLFSSL_KEIL
  172879. "adcs r3, r3, %[r]\n\t"
  172880. #elif defined(__clang__)
  172881. "adcs r3, %[r]\n\t"
  172882. #else
  172883. "adc r3, %[r]\n\t"
  172884. #endif
  172885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172886. "lsrs r6, r7, #16\n\t"
  172887. #else
  172888. "lsr r6, r7, #16\n\t"
  172889. #endif
  172890. #ifdef WOLFSSL_KEIL
  172891. "muls r5, r6, r5\n\t"
  172892. #elif defined(__clang__)
  172893. "muls r5, r6\n\t"
  172894. #else
  172895. "mul r5, r6\n\t"
  172896. #endif
  172897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172898. "lsrs r6, r5, #16\n\t"
  172899. #else
  172900. "lsr r6, r5, #16\n\t"
  172901. #endif
  172902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172903. "lsls r5, r5, #16\n\t"
  172904. #else
  172905. "lsl r5, r5, #16\n\t"
  172906. #endif
  172907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172908. "adds r4, r4, r5\n\t"
  172909. #else
  172910. "add r4, r4, r5\n\t"
  172911. #endif
  172912. #ifdef WOLFSSL_KEIL
  172913. "adcs r2, r2, r6\n\t"
  172914. #elif defined(__clang__)
  172915. "adcs r2, r6\n\t"
  172916. #else
  172917. "adc r2, r6\n\t"
  172918. #endif
  172919. #ifdef WOLFSSL_KEIL
  172920. "adcs r3, r3, %[r]\n\t"
  172921. #elif defined(__clang__)
  172922. "adcs r3, %[r]\n\t"
  172923. #else
  172924. "adc r3, %[r]\n\t"
  172925. #endif
  172926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172927. "adds r4, r4, r5\n\t"
  172928. #else
  172929. "add r4, r4, r5\n\t"
  172930. #endif
  172931. #ifdef WOLFSSL_KEIL
  172932. "adcs r2, r2, r6\n\t"
  172933. #elif defined(__clang__)
  172934. "adcs r2, r6\n\t"
  172935. #else
  172936. "adc r2, r6\n\t"
  172937. #endif
  172938. #ifdef WOLFSSL_KEIL
  172939. "adcs r3, r3, %[r]\n\t"
  172940. #elif defined(__clang__)
  172941. "adcs r3, %[r]\n\t"
  172942. #else
  172943. "adc r3, %[r]\n\t"
  172944. #endif
  172945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172946. "lsrs r5, %[a], #16\n\t"
  172947. #else
  172948. "lsr r5, %[a], #16\n\t"
  172949. #endif
  172950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172951. "lsrs r6, r7, #16\n\t"
  172952. #else
  172953. "lsr r6, r7, #16\n\t"
  172954. #endif
  172955. #ifdef WOLFSSL_KEIL
  172956. "muls r6, r5, r6\n\t"
  172957. #elif defined(__clang__)
  172958. "muls r6, r5\n\t"
  172959. #else
  172960. "mul r6, r5\n\t"
  172961. #endif
  172962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172963. "adds r2, r2, r6\n\t"
  172964. #else
  172965. "add r2, r2, r6\n\t"
  172966. #endif
  172967. #ifdef WOLFSSL_KEIL
  172968. "adcs r3, r3, %[r]\n\t"
  172969. #elif defined(__clang__)
  172970. "adcs r3, %[r]\n\t"
  172971. #else
  172972. "adc r3, %[r]\n\t"
  172973. #endif
  172974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172975. "adds r2, r2, r6\n\t"
  172976. #else
  172977. "add r2, r2, r6\n\t"
  172978. #endif
  172979. #ifdef WOLFSSL_KEIL
  172980. "adcs r3, r3, %[r]\n\t"
  172981. #elif defined(__clang__)
  172982. "adcs r3, %[r]\n\t"
  172983. #else
  172984. "adc r3, %[r]\n\t"
  172985. #endif
  172986. "uxth r6, r7\n\t"
  172987. #ifdef WOLFSSL_KEIL
  172988. "muls r5, r6, r5\n\t"
  172989. #elif defined(__clang__)
  172990. "muls r5, r6\n\t"
  172991. #else
  172992. "mul r5, r6\n\t"
  172993. #endif
  172994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172995. "lsrs r6, r5, #16\n\t"
  172996. #else
  172997. "lsr r6, r5, #16\n\t"
  172998. #endif
  172999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173000. "lsls r5, r5, #16\n\t"
  173001. #else
  173002. "lsl r5, r5, #16\n\t"
  173003. #endif
  173004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173005. "adds r4, r4, r5\n\t"
  173006. #else
  173007. "add r4, r4, r5\n\t"
  173008. #endif
  173009. #ifdef WOLFSSL_KEIL
  173010. "adcs r2, r2, r6\n\t"
  173011. #elif defined(__clang__)
  173012. "adcs r2, r6\n\t"
  173013. #else
  173014. "adc r2, r6\n\t"
  173015. #endif
  173016. #ifdef WOLFSSL_KEIL
  173017. "adcs r3, r3, %[r]\n\t"
  173018. #elif defined(__clang__)
  173019. "adcs r3, %[r]\n\t"
  173020. #else
  173021. "adc r3, %[r]\n\t"
  173022. #endif
  173023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173024. "adds r4, r4, r5\n\t"
  173025. #else
  173026. "add r4, r4, r5\n\t"
  173027. #endif
  173028. #ifdef WOLFSSL_KEIL
  173029. "adcs r2, r2, r6\n\t"
  173030. #elif defined(__clang__)
  173031. "adcs r2, r6\n\t"
  173032. #else
  173033. "adc r2, r6\n\t"
  173034. #endif
  173035. #ifdef WOLFSSL_KEIL
  173036. "adcs r3, r3, %[r]\n\t"
  173037. #elif defined(__clang__)
  173038. "adcs r3, %[r]\n\t"
  173039. #else
  173040. "adc r3, %[r]\n\t"
  173041. #endif
  173042. "str r4, [sp, #20]\n\t"
  173043. "# A[6] * A[0]\n\t"
  173044. "movs r4, #0\n\t"
  173045. "mov %[a], r9\n\t"
  173046. "ldr %[a], [%[a], #24]\n\t"
  173047. "uxth r5, %[a]\n\t"
  173048. "uxth r6, r7\n\t"
  173049. #ifdef WOLFSSL_KEIL
  173050. "muls r6, r5, r6\n\t"
  173051. #elif defined(__clang__)
  173052. "muls r6, r5\n\t"
  173053. #else
  173054. "mul r6, r5\n\t"
  173055. #endif
  173056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173057. "adds r2, r2, r6\n\t"
  173058. #else
  173059. "add r2, r2, r6\n\t"
  173060. #endif
  173061. #ifdef WOLFSSL_KEIL
  173062. "adcs r3, r3, %[r]\n\t"
  173063. #elif defined(__clang__)
  173064. "adcs r3, %[r]\n\t"
  173065. #else
  173066. "adc r3, %[r]\n\t"
  173067. #endif
  173068. #ifdef WOLFSSL_KEIL
  173069. "adcs r4, r4, %[r]\n\t"
  173070. #elif defined(__clang__)
  173071. "adcs r4, %[r]\n\t"
  173072. #else
  173073. "adc r4, %[r]\n\t"
  173074. #endif
  173075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173076. "adds r2, r2, r6\n\t"
  173077. #else
  173078. "add r2, r2, r6\n\t"
  173079. #endif
  173080. #ifdef WOLFSSL_KEIL
  173081. "adcs r3, r3, %[r]\n\t"
  173082. #elif defined(__clang__)
  173083. "adcs r3, %[r]\n\t"
  173084. #else
  173085. "adc r3, %[r]\n\t"
  173086. #endif
  173087. #ifdef WOLFSSL_KEIL
  173088. "adcs r4, r4, %[r]\n\t"
  173089. #elif defined(__clang__)
  173090. "adcs r4, %[r]\n\t"
  173091. #else
  173092. "adc r4, %[r]\n\t"
  173093. #endif
  173094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173095. "lsrs r6, r7, #16\n\t"
  173096. #else
  173097. "lsr r6, r7, #16\n\t"
  173098. #endif
  173099. #ifdef WOLFSSL_KEIL
  173100. "muls r5, r6, r5\n\t"
  173101. #elif defined(__clang__)
  173102. "muls r5, r6\n\t"
  173103. #else
  173104. "mul r5, r6\n\t"
  173105. #endif
  173106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173107. "lsrs r6, r5, #16\n\t"
  173108. #else
  173109. "lsr r6, r5, #16\n\t"
  173110. #endif
  173111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173112. "lsls r5, r5, #16\n\t"
  173113. #else
  173114. "lsl r5, r5, #16\n\t"
  173115. #endif
  173116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173117. "adds r2, r2, r5\n\t"
  173118. #else
  173119. "add r2, r2, r5\n\t"
  173120. #endif
  173121. #ifdef WOLFSSL_KEIL
  173122. "adcs r3, r3, r6\n\t"
  173123. #elif defined(__clang__)
  173124. "adcs r3, r6\n\t"
  173125. #else
  173126. "adc r3, r6\n\t"
  173127. #endif
  173128. #ifdef WOLFSSL_KEIL
  173129. "adcs r4, r4, %[r]\n\t"
  173130. #elif defined(__clang__)
  173131. "adcs r4, %[r]\n\t"
  173132. #else
  173133. "adc r4, %[r]\n\t"
  173134. #endif
  173135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173136. "adds r2, r2, r5\n\t"
  173137. #else
  173138. "add r2, r2, r5\n\t"
  173139. #endif
  173140. #ifdef WOLFSSL_KEIL
  173141. "adcs r3, r3, r6\n\t"
  173142. #elif defined(__clang__)
  173143. "adcs r3, r6\n\t"
  173144. #else
  173145. "adc r3, r6\n\t"
  173146. #endif
  173147. #ifdef WOLFSSL_KEIL
  173148. "adcs r4, r4, %[r]\n\t"
  173149. #elif defined(__clang__)
  173150. "adcs r4, %[r]\n\t"
  173151. #else
  173152. "adc r4, %[r]\n\t"
  173153. #endif
  173154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173155. "lsrs r5, %[a], #16\n\t"
  173156. #else
  173157. "lsr r5, %[a], #16\n\t"
  173158. #endif
  173159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173160. "lsrs r6, r7, #16\n\t"
  173161. #else
  173162. "lsr r6, r7, #16\n\t"
  173163. #endif
  173164. #ifdef WOLFSSL_KEIL
  173165. "muls r6, r5, r6\n\t"
  173166. #elif defined(__clang__)
  173167. "muls r6, r5\n\t"
  173168. #else
  173169. "mul r6, r5\n\t"
  173170. #endif
  173171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173172. "adds r3, r3, r6\n\t"
  173173. #else
  173174. "add r3, r3, r6\n\t"
  173175. #endif
  173176. #ifdef WOLFSSL_KEIL
  173177. "adcs r4, r4, %[r]\n\t"
  173178. #elif defined(__clang__)
  173179. "adcs r4, %[r]\n\t"
  173180. #else
  173181. "adc r4, %[r]\n\t"
  173182. #endif
  173183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173184. "adds r3, r3, r6\n\t"
  173185. #else
  173186. "add r3, r3, r6\n\t"
  173187. #endif
  173188. #ifdef WOLFSSL_KEIL
  173189. "adcs r4, r4, %[r]\n\t"
  173190. #elif defined(__clang__)
  173191. "adcs r4, %[r]\n\t"
  173192. #else
  173193. "adc r4, %[r]\n\t"
  173194. #endif
  173195. "uxth r6, r7\n\t"
  173196. #ifdef WOLFSSL_KEIL
  173197. "muls r5, r6, r5\n\t"
  173198. #elif defined(__clang__)
  173199. "muls r5, r6\n\t"
  173200. #else
  173201. "mul r5, r6\n\t"
  173202. #endif
  173203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173204. "lsrs r6, r5, #16\n\t"
  173205. #else
  173206. "lsr r6, r5, #16\n\t"
  173207. #endif
  173208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173209. "lsls r5, r5, #16\n\t"
  173210. #else
  173211. "lsl r5, r5, #16\n\t"
  173212. #endif
  173213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173214. "adds r2, r2, r5\n\t"
  173215. #else
  173216. "add r2, r2, r5\n\t"
  173217. #endif
  173218. #ifdef WOLFSSL_KEIL
  173219. "adcs r3, r3, r6\n\t"
  173220. #elif defined(__clang__)
  173221. "adcs r3, r6\n\t"
  173222. #else
  173223. "adc r3, r6\n\t"
  173224. #endif
  173225. #ifdef WOLFSSL_KEIL
  173226. "adcs r4, r4, %[r]\n\t"
  173227. #elif defined(__clang__)
  173228. "adcs r4, %[r]\n\t"
  173229. #else
  173230. "adc r4, %[r]\n\t"
  173231. #endif
  173232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173233. "adds r2, r2, r5\n\t"
  173234. #else
  173235. "add r2, r2, r5\n\t"
  173236. #endif
  173237. #ifdef WOLFSSL_KEIL
  173238. "adcs r3, r3, r6\n\t"
  173239. #elif defined(__clang__)
  173240. "adcs r3, r6\n\t"
  173241. #else
  173242. "adc r3, r6\n\t"
  173243. #endif
  173244. #ifdef WOLFSSL_KEIL
  173245. "adcs r4, r4, %[r]\n\t"
  173246. #elif defined(__clang__)
  173247. "adcs r4, %[r]\n\t"
  173248. #else
  173249. "adc r4, %[r]\n\t"
  173250. #endif
  173251. "# A[5] * A[1]\n\t"
  173252. "mov %[a], r9\n\t"
  173253. "mov r7, r11\n\t"
  173254. "ldr %[a], [%[a], #20]\n\t"
  173255. "uxth r5, %[a]\n\t"
  173256. "uxth r6, r7\n\t"
  173257. #ifdef WOLFSSL_KEIL
  173258. "muls r6, r5, r6\n\t"
  173259. #elif defined(__clang__)
  173260. "muls r6, r5\n\t"
  173261. #else
  173262. "mul r6, r5\n\t"
  173263. #endif
  173264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173265. "adds r2, r2, r6\n\t"
  173266. #else
  173267. "add r2, r2, r6\n\t"
  173268. #endif
  173269. #ifdef WOLFSSL_KEIL
  173270. "adcs r3, r3, %[r]\n\t"
  173271. #elif defined(__clang__)
  173272. "adcs r3, %[r]\n\t"
  173273. #else
  173274. "adc r3, %[r]\n\t"
  173275. #endif
  173276. #ifdef WOLFSSL_KEIL
  173277. "adcs r4, r4, %[r]\n\t"
  173278. #elif defined(__clang__)
  173279. "adcs r4, %[r]\n\t"
  173280. #else
  173281. "adc r4, %[r]\n\t"
  173282. #endif
  173283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173284. "adds r2, r2, r6\n\t"
  173285. #else
  173286. "add r2, r2, r6\n\t"
  173287. #endif
  173288. #ifdef WOLFSSL_KEIL
  173289. "adcs r3, r3, %[r]\n\t"
  173290. #elif defined(__clang__)
  173291. "adcs r3, %[r]\n\t"
  173292. #else
  173293. "adc r3, %[r]\n\t"
  173294. #endif
  173295. #ifdef WOLFSSL_KEIL
  173296. "adcs r4, r4, %[r]\n\t"
  173297. #elif defined(__clang__)
  173298. "adcs r4, %[r]\n\t"
  173299. #else
  173300. "adc r4, %[r]\n\t"
  173301. #endif
  173302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173303. "lsrs r6, r7, #16\n\t"
  173304. #else
  173305. "lsr r6, r7, #16\n\t"
  173306. #endif
  173307. #ifdef WOLFSSL_KEIL
  173308. "muls r5, r6, r5\n\t"
  173309. #elif defined(__clang__)
  173310. "muls r5, r6\n\t"
  173311. #else
  173312. "mul r5, r6\n\t"
  173313. #endif
  173314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173315. "lsrs r6, r5, #16\n\t"
  173316. #else
  173317. "lsr r6, r5, #16\n\t"
  173318. #endif
  173319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173320. "lsls r5, r5, #16\n\t"
  173321. #else
  173322. "lsl r5, r5, #16\n\t"
  173323. #endif
  173324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173325. "adds r2, r2, r5\n\t"
  173326. #else
  173327. "add r2, r2, r5\n\t"
  173328. #endif
  173329. #ifdef WOLFSSL_KEIL
  173330. "adcs r3, r3, r6\n\t"
  173331. #elif defined(__clang__)
  173332. "adcs r3, r6\n\t"
  173333. #else
  173334. "adc r3, r6\n\t"
  173335. #endif
  173336. #ifdef WOLFSSL_KEIL
  173337. "adcs r4, r4, %[r]\n\t"
  173338. #elif defined(__clang__)
  173339. "adcs r4, %[r]\n\t"
  173340. #else
  173341. "adc r4, %[r]\n\t"
  173342. #endif
  173343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173344. "adds r2, r2, r5\n\t"
  173345. #else
  173346. "add r2, r2, r5\n\t"
  173347. #endif
  173348. #ifdef WOLFSSL_KEIL
  173349. "adcs r3, r3, r6\n\t"
  173350. #elif defined(__clang__)
  173351. "adcs r3, r6\n\t"
  173352. #else
  173353. "adc r3, r6\n\t"
  173354. #endif
  173355. #ifdef WOLFSSL_KEIL
  173356. "adcs r4, r4, %[r]\n\t"
  173357. #elif defined(__clang__)
  173358. "adcs r4, %[r]\n\t"
  173359. #else
  173360. "adc r4, %[r]\n\t"
  173361. #endif
  173362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173363. "lsrs r5, %[a], #16\n\t"
  173364. #else
  173365. "lsr r5, %[a], #16\n\t"
  173366. #endif
  173367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173368. "lsrs r6, r7, #16\n\t"
  173369. #else
  173370. "lsr r6, r7, #16\n\t"
  173371. #endif
  173372. #ifdef WOLFSSL_KEIL
  173373. "muls r6, r5, r6\n\t"
  173374. #elif defined(__clang__)
  173375. "muls r6, r5\n\t"
  173376. #else
  173377. "mul r6, r5\n\t"
  173378. #endif
  173379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173380. "adds r3, r3, r6\n\t"
  173381. #else
  173382. "add r3, r3, r6\n\t"
  173383. #endif
  173384. #ifdef WOLFSSL_KEIL
  173385. "adcs r4, r4, %[r]\n\t"
  173386. #elif defined(__clang__)
  173387. "adcs r4, %[r]\n\t"
  173388. #else
  173389. "adc r4, %[r]\n\t"
  173390. #endif
  173391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173392. "adds r3, r3, r6\n\t"
  173393. #else
  173394. "add r3, r3, r6\n\t"
  173395. #endif
  173396. #ifdef WOLFSSL_KEIL
  173397. "adcs r4, r4, %[r]\n\t"
  173398. #elif defined(__clang__)
  173399. "adcs r4, %[r]\n\t"
  173400. #else
  173401. "adc r4, %[r]\n\t"
  173402. #endif
  173403. "uxth r6, r7\n\t"
  173404. #ifdef WOLFSSL_KEIL
  173405. "muls r5, r6, r5\n\t"
  173406. #elif defined(__clang__)
  173407. "muls r5, r6\n\t"
  173408. #else
  173409. "mul r5, r6\n\t"
  173410. #endif
  173411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173412. "lsrs r6, r5, #16\n\t"
  173413. #else
  173414. "lsr r6, r5, #16\n\t"
  173415. #endif
  173416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173417. "lsls r5, r5, #16\n\t"
  173418. #else
  173419. "lsl r5, r5, #16\n\t"
  173420. #endif
  173421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173422. "adds r2, r2, r5\n\t"
  173423. #else
  173424. "add r2, r2, r5\n\t"
  173425. #endif
  173426. #ifdef WOLFSSL_KEIL
  173427. "adcs r3, r3, r6\n\t"
  173428. #elif defined(__clang__)
  173429. "adcs r3, r6\n\t"
  173430. #else
  173431. "adc r3, r6\n\t"
  173432. #endif
  173433. #ifdef WOLFSSL_KEIL
  173434. "adcs r4, r4, %[r]\n\t"
  173435. #elif defined(__clang__)
  173436. "adcs r4, %[r]\n\t"
  173437. #else
  173438. "adc r4, %[r]\n\t"
  173439. #endif
  173440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173441. "adds r2, r2, r5\n\t"
  173442. #else
  173443. "add r2, r2, r5\n\t"
  173444. #endif
  173445. #ifdef WOLFSSL_KEIL
  173446. "adcs r3, r3, r6\n\t"
  173447. #elif defined(__clang__)
  173448. "adcs r3, r6\n\t"
  173449. #else
  173450. "adc r3, r6\n\t"
  173451. #endif
  173452. #ifdef WOLFSSL_KEIL
  173453. "adcs r4, r4, %[r]\n\t"
  173454. #elif defined(__clang__)
  173455. "adcs r4, %[r]\n\t"
  173456. #else
  173457. "adc r4, %[r]\n\t"
  173458. #endif
  173459. "# A[4] * A[2]\n\t"
  173460. "mov %[a], r9\n\t"
  173461. "mov r7, r12\n\t"
  173462. "ldr %[a], [%[a], #16]\n\t"
  173463. "uxth r5, %[a]\n\t"
  173464. "uxth r6, r7\n\t"
  173465. #ifdef WOLFSSL_KEIL
  173466. "muls r6, r5, r6\n\t"
  173467. #elif defined(__clang__)
  173468. "muls r6, r5\n\t"
  173469. #else
  173470. "mul r6, r5\n\t"
  173471. #endif
  173472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173473. "adds r2, r2, r6\n\t"
  173474. #else
  173475. "add r2, r2, r6\n\t"
  173476. #endif
  173477. #ifdef WOLFSSL_KEIL
  173478. "adcs r3, r3, %[r]\n\t"
  173479. #elif defined(__clang__)
  173480. "adcs r3, %[r]\n\t"
  173481. #else
  173482. "adc r3, %[r]\n\t"
  173483. #endif
  173484. #ifdef WOLFSSL_KEIL
  173485. "adcs r4, r4, %[r]\n\t"
  173486. #elif defined(__clang__)
  173487. "adcs r4, %[r]\n\t"
  173488. #else
  173489. "adc r4, %[r]\n\t"
  173490. #endif
  173491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173492. "adds r2, r2, r6\n\t"
  173493. #else
  173494. "add r2, r2, r6\n\t"
  173495. #endif
  173496. #ifdef WOLFSSL_KEIL
  173497. "adcs r3, r3, %[r]\n\t"
  173498. #elif defined(__clang__)
  173499. "adcs r3, %[r]\n\t"
  173500. #else
  173501. "adc r3, %[r]\n\t"
  173502. #endif
  173503. #ifdef WOLFSSL_KEIL
  173504. "adcs r4, r4, %[r]\n\t"
  173505. #elif defined(__clang__)
  173506. "adcs r4, %[r]\n\t"
  173507. #else
  173508. "adc r4, %[r]\n\t"
  173509. #endif
  173510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173511. "lsrs r6, r7, #16\n\t"
  173512. #else
  173513. "lsr r6, r7, #16\n\t"
  173514. #endif
  173515. #ifdef WOLFSSL_KEIL
  173516. "muls r5, r6, r5\n\t"
  173517. #elif defined(__clang__)
  173518. "muls r5, r6\n\t"
  173519. #else
  173520. "mul r5, r6\n\t"
  173521. #endif
  173522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173523. "lsrs r6, r5, #16\n\t"
  173524. #else
  173525. "lsr r6, r5, #16\n\t"
  173526. #endif
  173527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173528. "lsls r5, r5, #16\n\t"
  173529. #else
  173530. "lsl r5, r5, #16\n\t"
  173531. #endif
  173532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173533. "adds r2, r2, r5\n\t"
  173534. #else
  173535. "add r2, r2, r5\n\t"
  173536. #endif
  173537. #ifdef WOLFSSL_KEIL
  173538. "adcs r3, r3, r6\n\t"
  173539. #elif defined(__clang__)
  173540. "adcs r3, r6\n\t"
  173541. #else
  173542. "adc r3, r6\n\t"
  173543. #endif
  173544. #ifdef WOLFSSL_KEIL
  173545. "adcs r4, r4, %[r]\n\t"
  173546. #elif defined(__clang__)
  173547. "adcs r4, %[r]\n\t"
  173548. #else
  173549. "adc r4, %[r]\n\t"
  173550. #endif
  173551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173552. "adds r2, r2, r5\n\t"
  173553. #else
  173554. "add r2, r2, r5\n\t"
  173555. #endif
  173556. #ifdef WOLFSSL_KEIL
  173557. "adcs r3, r3, r6\n\t"
  173558. #elif defined(__clang__)
  173559. "adcs r3, r6\n\t"
  173560. #else
  173561. "adc r3, r6\n\t"
  173562. #endif
  173563. #ifdef WOLFSSL_KEIL
  173564. "adcs r4, r4, %[r]\n\t"
  173565. #elif defined(__clang__)
  173566. "adcs r4, %[r]\n\t"
  173567. #else
  173568. "adc r4, %[r]\n\t"
  173569. #endif
  173570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173571. "lsrs r5, %[a], #16\n\t"
  173572. #else
  173573. "lsr r5, %[a], #16\n\t"
  173574. #endif
  173575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173576. "lsrs r6, r7, #16\n\t"
  173577. #else
  173578. "lsr r6, r7, #16\n\t"
  173579. #endif
  173580. #ifdef WOLFSSL_KEIL
  173581. "muls r6, r5, r6\n\t"
  173582. #elif defined(__clang__)
  173583. "muls r6, r5\n\t"
  173584. #else
  173585. "mul r6, r5\n\t"
  173586. #endif
  173587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173588. "adds r3, r3, r6\n\t"
  173589. #else
  173590. "add r3, r3, r6\n\t"
  173591. #endif
  173592. #ifdef WOLFSSL_KEIL
  173593. "adcs r4, r4, %[r]\n\t"
  173594. #elif defined(__clang__)
  173595. "adcs r4, %[r]\n\t"
  173596. #else
  173597. "adc r4, %[r]\n\t"
  173598. #endif
  173599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173600. "adds r3, r3, r6\n\t"
  173601. #else
  173602. "add r3, r3, r6\n\t"
  173603. #endif
  173604. #ifdef WOLFSSL_KEIL
  173605. "adcs r4, r4, %[r]\n\t"
  173606. #elif defined(__clang__)
  173607. "adcs r4, %[r]\n\t"
  173608. #else
  173609. "adc r4, %[r]\n\t"
  173610. #endif
  173611. "uxth r6, r7\n\t"
  173612. #ifdef WOLFSSL_KEIL
  173613. "muls r5, r6, r5\n\t"
  173614. #elif defined(__clang__)
  173615. "muls r5, r6\n\t"
  173616. #else
  173617. "mul r5, r6\n\t"
  173618. #endif
  173619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173620. "lsrs r6, r5, #16\n\t"
  173621. #else
  173622. "lsr r6, r5, #16\n\t"
  173623. #endif
  173624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173625. "lsls r5, r5, #16\n\t"
  173626. #else
  173627. "lsl r5, r5, #16\n\t"
  173628. #endif
  173629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173630. "adds r2, r2, r5\n\t"
  173631. #else
  173632. "add r2, r2, r5\n\t"
  173633. #endif
  173634. #ifdef WOLFSSL_KEIL
  173635. "adcs r3, r3, r6\n\t"
  173636. #elif defined(__clang__)
  173637. "adcs r3, r6\n\t"
  173638. #else
  173639. "adc r3, r6\n\t"
  173640. #endif
  173641. #ifdef WOLFSSL_KEIL
  173642. "adcs r4, r4, %[r]\n\t"
  173643. #elif defined(__clang__)
  173644. "adcs r4, %[r]\n\t"
  173645. #else
  173646. "adc r4, %[r]\n\t"
  173647. #endif
  173648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173649. "adds r2, r2, r5\n\t"
  173650. #else
  173651. "add r2, r2, r5\n\t"
  173652. #endif
  173653. #ifdef WOLFSSL_KEIL
  173654. "adcs r3, r3, r6\n\t"
  173655. #elif defined(__clang__)
  173656. "adcs r3, r6\n\t"
  173657. #else
  173658. "adc r3, r6\n\t"
  173659. #endif
  173660. #ifdef WOLFSSL_KEIL
  173661. "adcs r4, r4, %[r]\n\t"
  173662. #elif defined(__clang__)
  173663. "adcs r4, %[r]\n\t"
  173664. #else
  173665. "adc r4, %[r]\n\t"
  173666. #endif
  173667. "# A[3] * A[3]\n\t"
  173668. "mov r7, lr\n\t"
  173669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173670. "lsrs r6, r7, #16\n\t"
  173671. #else
  173672. "lsr r6, r7, #16\n\t"
  173673. #endif
  173674. "uxth r5, r7\n\t"
  173675. #ifdef WOLFSSL_KEIL
  173676. "muls r5, r5, r5\n\t"
  173677. #elif defined(__clang__)
  173678. "muls r5, r5\n\t"
  173679. #else
  173680. "mul r5, r5\n\t"
  173681. #endif
  173682. #ifdef WOLFSSL_KEIL
  173683. "muls r6, r6, r6\n\t"
  173684. #elif defined(__clang__)
  173685. "muls r6, r6\n\t"
  173686. #else
  173687. "mul r6, r6\n\t"
  173688. #endif
  173689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173690. "adds r2, r2, r5\n\t"
  173691. #else
  173692. "add r2, r2, r5\n\t"
  173693. #endif
  173694. #ifdef WOLFSSL_KEIL
  173695. "adcs r3, r3, r6\n\t"
  173696. #elif defined(__clang__)
  173697. "adcs r3, r6\n\t"
  173698. #else
  173699. "adc r3, r6\n\t"
  173700. #endif
  173701. #ifdef WOLFSSL_KEIL
  173702. "adcs r4, r4, %[r]\n\t"
  173703. #elif defined(__clang__)
  173704. "adcs r4, %[r]\n\t"
  173705. #else
  173706. "adc r4, %[r]\n\t"
  173707. #endif
  173708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173709. "lsrs r6, r7, #16\n\t"
  173710. #else
  173711. "lsr r6, r7, #16\n\t"
  173712. #endif
  173713. "uxth r5, r7\n\t"
  173714. #ifdef WOLFSSL_KEIL
  173715. "muls r5, r6, r5\n\t"
  173716. #elif defined(__clang__)
  173717. "muls r5, r6\n\t"
  173718. #else
  173719. "mul r5, r6\n\t"
  173720. #endif
  173721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173722. "lsrs r6, r5, #15\n\t"
  173723. #else
  173724. "lsr r6, r5, #15\n\t"
  173725. #endif
  173726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173727. "lsls r5, r5, #17\n\t"
  173728. #else
  173729. "lsl r5, r5, #17\n\t"
  173730. #endif
  173731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173732. "adds r2, r2, r5\n\t"
  173733. #else
  173734. "add r2, r2, r5\n\t"
  173735. #endif
  173736. #ifdef WOLFSSL_KEIL
  173737. "adcs r3, r3, r6\n\t"
  173738. #elif defined(__clang__)
  173739. "adcs r3, r6\n\t"
  173740. #else
  173741. "adc r3, r6\n\t"
  173742. #endif
  173743. #ifdef WOLFSSL_KEIL
  173744. "adcs r4, r4, %[r]\n\t"
  173745. #elif defined(__clang__)
  173746. "adcs r4, %[r]\n\t"
  173747. #else
  173748. "adc r4, %[r]\n\t"
  173749. #endif
  173750. "str r2, [sp, #24]\n\t"
  173751. "# A[4] * A[3]\n\t"
  173752. "movs r2, #0\n\t"
  173753. "mov %[a], r9\n\t"
  173754. "ldr %[a], [%[a], #16]\n\t"
  173755. "uxth r5, %[a]\n\t"
  173756. "uxth r6, r7\n\t"
  173757. #ifdef WOLFSSL_KEIL
  173758. "muls r6, r5, r6\n\t"
  173759. #elif defined(__clang__)
  173760. "muls r6, r5\n\t"
  173761. #else
  173762. "mul r6, r5\n\t"
  173763. #endif
  173764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173765. "adds r3, r3, r6\n\t"
  173766. #else
  173767. "add r3, r3, r6\n\t"
  173768. #endif
  173769. #ifdef WOLFSSL_KEIL
  173770. "adcs r4, r4, %[r]\n\t"
  173771. #elif defined(__clang__)
  173772. "adcs r4, %[r]\n\t"
  173773. #else
  173774. "adc r4, %[r]\n\t"
  173775. #endif
  173776. #ifdef WOLFSSL_KEIL
  173777. "adcs r2, r2, %[r]\n\t"
  173778. #elif defined(__clang__)
  173779. "adcs r2, %[r]\n\t"
  173780. #else
  173781. "adc r2, %[r]\n\t"
  173782. #endif
  173783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173784. "adds r3, r3, r6\n\t"
  173785. #else
  173786. "add r3, r3, r6\n\t"
  173787. #endif
  173788. #ifdef WOLFSSL_KEIL
  173789. "adcs r4, r4, %[r]\n\t"
  173790. #elif defined(__clang__)
  173791. "adcs r4, %[r]\n\t"
  173792. #else
  173793. "adc r4, %[r]\n\t"
  173794. #endif
  173795. #ifdef WOLFSSL_KEIL
  173796. "adcs r2, r2, %[r]\n\t"
  173797. #elif defined(__clang__)
  173798. "adcs r2, %[r]\n\t"
  173799. #else
  173800. "adc r2, %[r]\n\t"
  173801. #endif
  173802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173803. "lsrs r6, r7, #16\n\t"
  173804. #else
  173805. "lsr r6, r7, #16\n\t"
  173806. #endif
  173807. #ifdef WOLFSSL_KEIL
  173808. "muls r5, r6, r5\n\t"
  173809. #elif defined(__clang__)
  173810. "muls r5, r6\n\t"
  173811. #else
  173812. "mul r5, r6\n\t"
  173813. #endif
  173814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173815. "lsrs r6, r5, #16\n\t"
  173816. #else
  173817. "lsr r6, r5, #16\n\t"
  173818. #endif
  173819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173820. "lsls r5, r5, #16\n\t"
  173821. #else
  173822. "lsl r5, r5, #16\n\t"
  173823. #endif
  173824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173825. "adds r3, r3, r5\n\t"
  173826. #else
  173827. "add r3, r3, r5\n\t"
  173828. #endif
  173829. #ifdef WOLFSSL_KEIL
  173830. "adcs r4, r4, r6\n\t"
  173831. #elif defined(__clang__)
  173832. "adcs r4, r6\n\t"
  173833. #else
  173834. "adc r4, r6\n\t"
  173835. #endif
  173836. #ifdef WOLFSSL_KEIL
  173837. "adcs r2, r2, %[r]\n\t"
  173838. #elif defined(__clang__)
  173839. "adcs r2, %[r]\n\t"
  173840. #else
  173841. "adc r2, %[r]\n\t"
  173842. #endif
  173843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173844. "adds r3, r3, r5\n\t"
  173845. #else
  173846. "add r3, r3, r5\n\t"
  173847. #endif
  173848. #ifdef WOLFSSL_KEIL
  173849. "adcs r4, r4, r6\n\t"
  173850. #elif defined(__clang__)
  173851. "adcs r4, r6\n\t"
  173852. #else
  173853. "adc r4, r6\n\t"
  173854. #endif
  173855. #ifdef WOLFSSL_KEIL
  173856. "adcs r2, r2, %[r]\n\t"
  173857. #elif defined(__clang__)
  173858. "adcs r2, %[r]\n\t"
  173859. #else
  173860. "adc r2, %[r]\n\t"
  173861. #endif
  173862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173863. "lsrs r5, %[a], #16\n\t"
  173864. #else
  173865. "lsr r5, %[a], #16\n\t"
  173866. #endif
  173867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173868. "lsrs r6, r7, #16\n\t"
  173869. #else
  173870. "lsr r6, r7, #16\n\t"
  173871. #endif
  173872. #ifdef WOLFSSL_KEIL
  173873. "muls r6, r5, r6\n\t"
  173874. #elif defined(__clang__)
  173875. "muls r6, r5\n\t"
  173876. #else
  173877. "mul r6, r5\n\t"
  173878. #endif
  173879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173880. "adds r4, r4, r6\n\t"
  173881. #else
  173882. "add r4, r4, r6\n\t"
  173883. #endif
  173884. #ifdef WOLFSSL_KEIL
  173885. "adcs r2, r2, %[r]\n\t"
  173886. #elif defined(__clang__)
  173887. "adcs r2, %[r]\n\t"
  173888. #else
  173889. "adc r2, %[r]\n\t"
  173890. #endif
  173891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173892. "adds r4, r4, r6\n\t"
  173893. #else
  173894. "add r4, r4, r6\n\t"
  173895. #endif
  173896. #ifdef WOLFSSL_KEIL
  173897. "adcs r2, r2, %[r]\n\t"
  173898. #elif defined(__clang__)
  173899. "adcs r2, %[r]\n\t"
  173900. #else
  173901. "adc r2, %[r]\n\t"
  173902. #endif
  173903. "uxth r6, r7\n\t"
  173904. #ifdef WOLFSSL_KEIL
  173905. "muls r5, r6, r5\n\t"
  173906. #elif defined(__clang__)
  173907. "muls r5, r6\n\t"
  173908. #else
  173909. "mul r5, r6\n\t"
  173910. #endif
  173911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173912. "lsrs r6, r5, #16\n\t"
  173913. #else
  173914. "lsr r6, r5, #16\n\t"
  173915. #endif
  173916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173917. "lsls r5, r5, #16\n\t"
  173918. #else
  173919. "lsl r5, r5, #16\n\t"
  173920. #endif
  173921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173922. "adds r3, r3, r5\n\t"
  173923. #else
  173924. "add r3, r3, r5\n\t"
  173925. #endif
  173926. #ifdef WOLFSSL_KEIL
  173927. "adcs r4, r4, r6\n\t"
  173928. #elif defined(__clang__)
  173929. "adcs r4, r6\n\t"
  173930. #else
  173931. "adc r4, r6\n\t"
  173932. #endif
  173933. #ifdef WOLFSSL_KEIL
  173934. "adcs r2, r2, %[r]\n\t"
  173935. #elif defined(__clang__)
  173936. "adcs r2, %[r]\n\t"
  173937. #else
  173938. "adc r2, %[r]\n\t"
  173939. #endif
  173940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173941. "adds r3, r3, r5\n\t"
  173942. #else
  173943. "add r3, r3, r5\n\t"
  173944. #endif
  173945. #ifdef WOLFSSL_KEIL
  173946. "adcs r4, r4, r6\n\t"
  173947. #elif defined(__clang__)
  173948. "adcs r4, r6\n\t"
  173949. #else
  173950. "adc r4, r6\n\t"
  173951. #endif
  173952. #ifdef WOLFSSL_KEIL
  173953. "adcs r2, r2, %[r]\n\t"
  173954. #elif defined(__clang__)
  173955. "adcs r2, %[r]\n\t"
  173956. #else
  173957. "adc r2, %[r]\n\t"
  173958. #endif
  173959. "# A[5] * A[2]\n\t"
  173960. "mov %[a], r9\n\t"
  173961. "mov r7, r12\n\t"
  173962. "ldr %[a], [%[a], #20]\n\t"
  173963. "uxth r5, %[a]\n\t"
  173964. "uxth r6, r7\n\t"
  173965. #ifdef WOLFSSL_KEIL
  173966. "muls r6, r5, r6\n\t"
  173967. #elif defined(__clang__)
  173968. "muls r6, r5\n\t"
  173969. #else
  173970. "mul r6, r5\n\t"
  173971. #endif
  173972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173973. "adds r3, r3, r6\n\t"
  173974. #else
  173975. "add r3, r3, r6\n\t"
  173976. #endif
  173977. #ifdef WOLFSSL_KEIL
  173978. "adcs r4, r4, %[r]\n\t"
  173979. #elif defined(__clang__)
  173980. "adcs r4, %[r]\n\t"
  173981. #else
  173982. "adc r4, %[r]\n\t"
  173983. #endif
  173984. #ifdef WOLFSSL_KEIL
  173985. "adcs r2, r2, %[r]\n\t"
  173986. #elif defined(__clang__)
  173987. "adcs r2, %[r]\n\t"
  173988. #else
  173989. "adc r2, %[r]\n\t"
  173990. #endif
  173991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173992. "adds r3, r3, r6\n\t"
  173993. #else
  173994. "add r3, r3, r6\n\t"
  173995. #endif
  173996. #ifdef WOLFSSL_KEIL
  173997. "adcs r4, r4, %[r]\n\t"
  173998. #elif defined(__clang__)
  173999. "adcs r4, %[r]\n\t"
  174000. #else
  174001. "adc r4, %[r]\n\t"
  174002. #endif
  174003. #ifdef WOLFSSL_KEIL
  174004. "adcs r2, r2, %[r]\n\t"
  174005. #elif defined(__clang__)
  174006. "adcs r2, %[r]\n\t"
  174007. #else
  174008. "adc r2, %[r]\n\t"
  174009. #endif
  174010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174011. "lsrs r6, r7, #16\n\t"
  174012. #else
  174013. "lsr r6, r7, #16\n\t"
  174014. #endif
  174015. #ifdef WOLFSSL_KEIL
  174016. "muls r5, r6, r5\n\t"
  174017. #elif defined(__clang__)
  174018. "muls r5, r6\n\t"
  174019. #else
  174020. "mul r5, r6\n\t"
  174021. #endif
  174022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174023. "lsrs r6, r5, #16\n\t"
  174024. #else
  174025. "lsr r6, r5, #16\n\t"
  174026. #endif
  174027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174028. "lsls r5, r5, #16\n\t"
  174029. #else
  174030. "lsl r5, r5, #16\n\t"
  174031. #endif
  174032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174033. "adds r3, r3, r5\n\t"
  174034. #else
  174035. "add r3, r3, r5\n\t"
  174036. #endif
  174037. #ifdef WOLFSSL_KEIL
  174038. "adcs r4, r4, r6\n\t"
  174039. #elif defined(__clang__)
  174040. "adcs r4, r6\n\t"
  174041. #else
  174042. "adc r4, r6\n\t"
  174043. #endif
  174044. #ifdef WOLFSSL_KEIL
  174045. "adcs r2, r2, %[r]\n\t"
  174046. #elif defined(__clang__)
  174047. "adcs r2, %[r]\n\t"
  174048. #else
  174049. "adc r2, %[r]\n\t"
  174050. #endif
  174051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174052. "adds r3, r3, r5\n\t"
  174053. #else
  174054. "add r3, r3, r5\n\t"
  174055. #endif
  174056. #ifdef WOLFSSL_KEIL
  174057. "adcs r4, r4, r6\n\t"
  174058. #elif defined(__clang__)
  174059. "adcs r4, r6\n\t"
  174060. #else
  174061. "adc r4, r6\n\t"
  174062. #endif
  174063. #ifdef WOLFSSL_KEIL
  174064. "adcs r2, r2, %[r]\n\t"
  174065. #elif defined(__clang__)
  174066. "adcs r2, %[r]\n\t"
  174067. #else
  174068. "adc r2, %[r]\n\t"
  174069. #endif
  174070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174071. "lsrs r5, %[a], #16\n\t"
  174072. #else
  174073. "lsr r5, %[a], #16\n\t"
  174074. #endif
  174075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174076. "lsrs r6, r7, #16\n\t"
  174077. #else
  174078. "lsr r6, r7, #16\n\t"
  174079. #endif
  174080. #ifdef WOLFSSL_KEIL
  174081. "muls r6, r5, r6\n\t"
  174082. #elif defined(__clang__)
  174083. "muls r6, r5\n\t"
  174084. #else
  174085. "mul r6, r5\n\t"
  174086. #endif
  174087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174088. "adds r4, r4, r6\n\t"
  174089. #else
  174090. "add r4, r4, r6\n\t"
  174091. #endif
  174092. #ifdef WOLFSSL_KEIL
  174093. "adcs r2, r2, %[r]\n\t"
  174094. #elif defined(__clang__)
  174095. "adcs r2, %[r]\n\t"
  174096. #else
  174097. "adc r2, %[r]\n\t"
  174098. #endif
  174099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174100. "adds r4, r4, r6\n\t"
  174101. #else
  174102. "add r4, r4, r6\n\t"
  174103. #endif
  174104. #ifdef WOLFSSL_KEIL
  174105. "adcs r2, r2, %[r]\n\t"
  174106. #elif defined(__clang__)
  174107. "adcs r2, %[r]\n\t"
  174108. #else
  174109. "adc r2, %[r]\n\t"
  174110. #endif
  174111. "uxth r6, r7\n\t"
  174112. #ifdef WOLFSSL_KEIL
  174113. "muls r5, r6, r5\n\t"
  174114. #elif defined(__clang__)
  174115. "muls r5, r6\n\t"
  174116. #else
  174117. "mul r5, r6\n\t"
  174118. #endif
  174119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174120. "lsrs r6, r5, #16\n\t"
  174121. #else
  174122. "lsr r6, r5, #16\n\t"
  174123. #endif
  174124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174125. "lsls r5, r5, #16\n\t"
  174126. #else
  174127. "lsl r5, r5, #16\n\t"
  174128. #endif
  174129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174130. "adds r3, r3, r5\n\t"
  174131. #else
  174132. "add r3, r3, r5\n\t"
  174133. #endif
  174134. #ifdef WOLFSSL_KEIL
  174135. "adcs r4, r4, r6\n\t"
  174136. #elif defined(__clang__)
  174137. "adcs r4, r6\n\t"
  174138. #else
  174139. "adc r4, r6\n\t"
  174140. #endif
  174141. #ifdef WOLFSSL_KEIL
  174142. "adcs r2, r2, %[r]\n\t"
  174143. #elif defined(__clang__)
  174144. "adcs r2, %[r]\n\t"
  174145. #else
  174146. "adc r2, %[r]\n\t"
  174147. #endif
  174148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174149. "adds r3, r3, r5\n\t"
  174150. #else
  174151. "add r3, r3, r5\n\t"
  174152. #endif
  174153. #ifdef WOLFSSL_KEIL
  174154. "adcs r4, r4, r6\n\t"
  174155. #elif defined(__clang__)
  174156. "adcs r4, r6\n\t"
  174157. #else
  174158. "adc r4, r6\n\t"
  174159. #endif
  174160. #ifdef WOLFSSL_KEIL
  174161. "adcs r2, r2, %[r]\n\t"
  174162. #elif defined(__clang__)
  174163. "adcs r2, %[r]\n\t"
  174164. #else
  174165. "adc r2, %[r]\n\t"
  174166. #endif
  174167. "# A[6] * A[1]\n\t"
  174168. "mov %[a], r9\n\t"
  174169. "mov r7, r11\n\t"
  174170. "ldr %[a], [%[a], #24]\n\t"
  174171. "uxth r5, %[a]\n\t"
  174172. "uxth r6, r7\n\t"
  174173. #ifdef WOLFSSL_KEIL
  174174. "muls r6, r5, r6\n\t"
  174175. #elif defined(__clang__)
  174176. "muls r6, r5\n\t"
  174177. #else
  174178. "mul r6, r5\n\t"
  174179. #endif
  174180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174181. "adds r3, r3, r6\n\t"
  174182. #else
  174183. "add r3, r3, r6\n\t"
  174184. #endif
  174185. #ifdef WOLFSSL_KEIL
  174186. "adcs r4, r4, %[r]\n\t"
  174187. #elif defined(__clang__)
  174188. "adcs r4, %[r]\n\t"
  174189. #else
  174190. "adc r4, %[r]\n\t"
  174191. #endif
  174192. #ifdef WOLFSSL_KEIL
  174193. "adcs r2, r2, %[r]\n\t"
  174194. #elif defined(__clang__)
  174195. "adcs r2, %[r]\n\t"
  174196. #else
  174197. "adc r2, %[r]\n\t"
  174198. #endif
  174199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174200. "adds r3, r3, r6\n\t"
  174201. #else
  174202. "add r3, r3, r6\n\t"
  174203. #endif
  174204. #ifdef WOLFSSL_KEIL
  174205. "adcs r4, r4, %[r]\n\t"
  174206. #elif defined(__clang__)
  174207. "adcs r4, %[r]\n\t"
  174208. #else
  174209. "adc r4, %[r]\n\t"
  174210. #endif
  174211. #ifdef WOLFSSL_KEIL
  174212. "adcs r2, r2, %[r]\n\t"
  174213. #elif defined(__clang__)
  174214. "adcs r2, %[r]\n\t"
  174215. #else
  174216. "adc r2, %[r]\n\t"
  174217. #endif
  174218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174219. "lsrs r6, r7, #16\n\t"
  174220. #else
  174221. "lsr r6, r7, #16\n\t"
  174222. #endif
  174223. #ifdef WOLFSSL_KEIL
  174224. "muls r5, r6, r5\n\t"
  174225. #elif defined(__clang__)
  174226. "muls r5, r6\n\t"
  174227. #else
  174228. "mul r5, r6\n\t"
  174229. #endif
  174230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174231. "lsrs r6, r5, #16\n\t"
  174232. #else
  174233. "lsr r6, r5, #16\n\t"
  174234. #endif
  174235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174236. "lsls r5, r5, #16\n\t"
  174237. #else
  174238. "lsl r5, r5, #16\n\t"
  174239. #endif
  174240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174241. "adds r3, r3, r5\n\t"
  174242. #else
  174243. "add r3, r3, r5\n\t"
  174244. #endif
  174245. #ifdef WOLFSSL_KEIL
  174246. "adcs r4, r4, r6\n\t"
  174247. #elif defined(__clang__)
  174248. "adcs r4, r6\n\t"
  174249. #else
  174250. "adc r4, r6\n\t"
  174251. #endif
  174252. #ifdef WOLFSSL_KEIL
  174253. "adcs r2, r2, %[r]\n\t"
  174254. #elif defined(__clang__)
  174255. "adcs r2, %[r]\n\t"
  174256. #else
  174257. "adc r2, %[r]\n\t"
  174258. #endif
  174259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174260. "adds r3, r3, r5\n\t"
  174261. #else
  174262. "add r3, r3, r5\n\t"
  174263. #endif
  174264. #ifdef WOLFSSL_KEIL
  174265. "adcs r4, r4, r6\n\t"
  174266. #elif defined(__clang__)
  174267. "adcs r4, r6\n\t"
  174268. #else
  174269. "adc r4, r6\n\t"
  174270. #endif
  174271. #ifdef WOLFSSL_KEIL
  174272. "adcs r2, r2, %[r]\n\t"
  174273. #elif defined(__clang__)
  174274. "adcs r2, %[r]\n\t"
  174275. #else
  174276. "adc r2, %[r]\n\t"
  174277. #endif
  174278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174279. "lsrs r5, %[a], #16\n\t"
  174280. #else
  174281. "lsr r5, %[a], #16\n\t"
  174282. #endif
  174283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174284. "lsrs r6, r7, #16\n\t"
  174285. #else
  174286. "lsr r6, r7, #16\n\t"
  174287. #endif
  174288. #ifdef WOLFSSL_KEIL
  174289. "muls r6, r5, r6\n\t"
  174290. #elif defined(__clang__)
  174291. "muls r6, r5\n\t"
  174292. #else
  174293. "mul r6, r5\n\t"
  174294. #endif
  174295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174296. "adds r4, r4, r6\n\t"
  174297. #else
  174298. "add r4, r4, r6\n\t"
  174299. #endif
  174300. #ifdef WOLFSSL_KEIL
  174301. "adcs r2, r2, %[r]\n\t"
  174302. #elif defined(__clang__)
  174303. "adcs r2, %[r]\n\t"
  174304. #else
  174305. "adc r2, %[r]\n\t"
  174306. #endif
  174307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174308. "adds r4, r4, r6\n\t"
  174309. #else
  174310. "add r4, r4, r6\n\t"
  174311. #endif
  174312. #ifdef WOLFSSL_KEIL
  174313. "adcs r2, r2, %[r]\n\t"
  174314. #elif defined(__clang__)
  174315. "adcs r2, %[r]\n\t"
  174316. #else
  174317. "adc r2, %[r]\n\t"
  174318. #endif
  174319. "uxth r6, r7\n\t"
  174320. #ifdef WOLFSSL_KEIL
  174321. "muls r5, r6, r5\n\t"
  174322. #elif defined(__clang__)
  174323. "muls r5, r6\n\t"
  174324. #else
  174325. "mul r5, r6\n\t"
  174326. #endif
  174327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174328. "lsrs r6, r5, #16\n\t"
  174329. #else
  174330. "lsr r6, r5, #16\n\t"
  174331. #endif
  174332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174333. "lsls r5, r5, #16\n\t"
  174334. #else
  174335. "lsl r5, r5, #16\n\t"
  174336. #endif
  174337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174338. "adds r3, r3, r5\n\t"
  174339. #else
  174340. "add r3, r3, r5\n\t"
  174341. #endif
  174342. #ifdef WOLFSSL_KEIL
  174343. "adcs r4, r4, r6\n\t"
  174344. #elif defined(__clang__)
  174345. "adcs r4, r6\n\t"
  174346. #else
  174347. "adc r4, r6\n\t"
  174348. #endif
  174349. #ifdef WOLFSSL_KEIL
  174350. "adcs r2, r2, %[r]\n\t"
  174351. #elif defined(__clang__)
  174352. "adcs r2, %[r]\n\t"
  174353. #else
  174354. "adc r2, %[r]\n\t"
  174355. #endif
  174356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174357. "adds r3, r3, r5\n\t"
  174358. #else
  174359. "add r3, r3, r5\n\t"
  174360. #endif
  174361. #ifdef WOLFSSL_KEIL
  174362. "adcs r4, r4, r6\n\t"
  174363. #elif defined(__clang__)
  174364. "adcs r4, r6\n\t"
  174365. #else
  174366. "adc r4, r6\n\t"
  174367. #endif
  174368. #ifdef WOLFSSL_KEIL
  174369. "adcs r2, r2, %[r]\n\t"
  174370. #elif defined(__clang__)
  174371. "adcs r2, %[r]\n\t"
  174372. #else
  174373. "adc r2, %[r]\n\t"
  174374. #endif
  174375. "# A[7] * A[0]\n\t"
  174376. "mov %[a], r9\n\t"
  174377. "mov r7, r10\n\t"
  174378. "ldr %[a], [%[a], #28]\n\t"
  174379. "uxth r5, %[a]\n\t"
  174380. "uxth r6, r7\n\t"
  174381. #ifdef WOLFSSL_KEIL
  174382. "muls r6, r5, r6\n\t"
  174383. #elif defined(__clang__)
  174384. "muls r6, r5\n\t"
  174385. #else
  174386. "mul r6, r5\n\t"
  174387. #endif
  174388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174389. "adds r3, r3, r6\n\t"
  174390. #else
  174391. "add r3, r3, r6\n\t"
  174392. #endif
  174393. #ifdef WOLFSSL_KEIL
  174394. "adcs r4, r4, %[r]\n\t"
  174395. #elif defined(__clang__)
  174396. "adcs r4, %[r]\n\t"
  174397. #else
  174398. "adc r4, %[r]\n\t"
  174399. #endif
  174400. #ifdef WOLFSSL_KEIL
  174401. "adcs r2, r2, %[r]\n\t"
  174402. #elif defined(__clang__)
  174403. "adcs r2, %[r]\n\t"
  174404. #else
  174405. "adc r2, %[r]\n\t"
  174406. #endif
  174407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174408. "adds r3, r3, r6\n\t"
  174409. #else
  174410. "add r3, r3, r6\n\t"
  174411. #endif
  174412. #ifdef WOLFSSL_KEIL
  174413. "adcs r4, r4, %[r]\n\t"
  174414. #elif defined(__clang__)
  174415. "adcs r4, %[r]\n\t"
  174416. #else
  174417. "adc r4, %[r]\n\t"
  174418. #endif
  174419. #ifdef WOLFSSL_KEIL
  174420. "adcs r2, r2, %[r]\n\t"
  174421. #elif defined(__clang__)
  174422. "adcs r2, %[r]\n\t"
  174423. #else
  174424. "adc r2, %[r]\n\t"
  174425. #endif
  174426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174427. "lsrs r6, r7, #16\n\t"
  174428. #else
  174429. "lsr r6, r7, #16\n\t"
  174430. #endif
  174431. #ifdef WOLFSSL_KEIL
  174432. "muls r5, r6, r5\n\t"
  174433. #elif defined(__clang__)
  174434. "muls r5, r6\n\t"
  174435. #else
  174436. "mul r5, r6\n\t"
  174437. #endif
  174438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174439. "lsrs r6, r5, #16\n\t"
  174440. #else
  174441. "lsr r6, r5, #16\n\t"
  174442. #endif
  174443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174444. "lsls r5, r5, #16\n\t"
  174445. #else
  174446. "lsl r5, r5, #16\n\t"
  174447. #endif
  174448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174449. "adds r3, r3, r5\n\t"
  174450. #else
  174451. "add r3, r3, r5\n\t"
  174452. #endif
  174453. #ifdef WOLFSSL_KEIL
  174454. "adcs r4, r4, r6\n\t"
  174455. #elif defined(__clang__)
  174456. "adcs r4, r6\n\t"
  174457. #else
  174458. "adc r4, r6\n\t"
  174459. #endif
  174460. #ifdef WOLFSSL_KEIL
  174461. "adcs r2, r2, %[r]\n\t"
  174462. #elif defined(__clang__)
  174463. "adcs r2, %[r]\n\t"
  174464. #else
  174465. "adc r2, %[r]\n\t"
  174466. #endif
  174467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174468. "adds r3, r3, r5\n\t"
  174469. #else
  174470. "add r3, r3, r5\n\t"
  174471. #endif
  174472. #ifdef WOLFSSL_KEIL
  174473. "adcs r4, r4, r6\n\t"
  174474. #elif defined(__clang__)
  174475. "adcs r4, r6\n\t"
  174476. #else
  174477. "adc r4, r6\n\t"
  174478. #endif
  174479. #ifdef WOLFSSL_KEIL
  174480. "adcs r2, r2, %[r]\n\t"
  174481. #elif defined(__clang__)
  174482. "adcs r2, %[r]\n\t"
  174483. #else
  174484. "adc r2, %[r]\n\t"
  174485. #endif
  174486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174487. "lsrs r5, %[a], #16\n\t"
  174488. #else
  174489. "lsr r5, %[a], #16\n\t"
  174490. #endif
  174491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174492. "lsrs r6, r7, #16\n\t"
  174493. #else
  174494. "lsr r6, r7, #16\n\t"
  174495. #endif
  174496. #ifdef WOLFSSL_KEIL
  174497. "muls r6, r5, r6\n\t"
  174498. #elif defined(__clang__)
  174499. "muls r6, r5\n\t"
  174500. #else
  174501. "mul r6, r5\n\t"
  174502. #endif
  174503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174504. "adds r4, r4, r6\n\t"
  174505. #else
  174506. "add r4, r4, r6\n\t"
  174507. #endif
  174508. #ifdef WOLFSSL_KEIL
  174509. "adcs r2, r2, %[r]\n\t"
  174510. #elif defined(__clang__)
  174511. "adcs r2, %[r]\n\t"
  174512. #else
  174513. "adc r2, %[r]\n\t"
  174514. #endif
  174515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174516. "adds r4, r4, r6\n\t"
  174517. #else
  174518. "add r4, r4, r6\n\t"
  174519. #endif
  174520. #ifdef WOLFSSL_KEIL
  174521. "adcs r2, r2, %[r]\n\t"
  174522. #elif defined(__clang__)
  174523. "adcs r2, %[r]\n\t"
  174524. #else
  174525. "adc r2, %[r]\n\t"
  174526. #endif
  174527. "uxth r6, r7\n\t"
  174528. #ifdef WOLFSSL_KEIL
  174529. "muls r5, r6, r5\n\t"
  174530. #elif defined(__clang__)
  174531. "muls r5, r6\n\t"
  174532. #else
  174533. "mul r5, r6\n\t"
  174534. #endif
  174535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174536. "lsrs r6, r5, #16\n\t"
  174537. #else
  174538. "lsr r6, r5, #16\n\t"
  174539. #endif
  174540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174541. "lsls r5, r5, #16\n\t"
  174542. #else
  174543. "lsl r5, r5, #16\n\t"
  174544. #endif
  174545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174546. "adds r3, r3, r5\n\t"
  174547. #else
  174548. "add r3, r3, r5\n\t"
  174549. #endif
  174550. #ifdef WOLFSSL_KEIL
  174551. "adcs r4, r4, r6\n\t"
  174552. #elif defined(__clang__)
  174553. "adcs r4, r6\n\t"
  174554. #else
  174555. "adc r4, r6\n\t"
  174556. #endif
  174557. #ifdef WOLFSSL_KEIL
  174558. "adcs r2, r2, %[r]\n\t"
  174559. #elif defined(__clang__)
  174560. "adcs r2, %[r]\n\t"
  174561. #else
  174562. "adc r2, %[r]\n\t"
  174563. #endif
  174564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174565. "adds r3, r3, r5\n\t"
  174566. #else
  174567. "add r3, r3, r5\n\t"
  174568. #endif
  174569. #ifdef WOLFSSL_KEIL
  174570. "adcs r4, r4, r6\n\t"
  174571. #elif defined(__clang__)
  174572. "adcs r4, r6\n\t"
  174573. #else
  174574. "adc r4, r6\n\t"
  174575. #endif
  174576. #ifdef WOLFSSL_KEIL
  174577. "adcs r2, r2, %[r]\n\t"
  174578. #elif defined(__clang__)
  174579. "adcs r2, %[r]\n\t"
  174580. #else
  174581. "adc r2, %[r]\n\t"
  174582. #endif
  174583. "str r3, [sp, #28]\n\t"
  174584. "# A[8] * A[0]\n\t"
  174585. "movs r3, #0\n\t"
  174586. "mov %[a], r9\n\t"
  174587. "ldr %[a], [%[a], #32]\n\t"
  174588. "uxth r5, %[a]\n\t"
  174589. "uxth r6, r7\n\t"
  174590. #ifdef WOLFSSL_KEIL
  174591. "muls r6, r5, r6\n\t"
  174592. #elif defined(__clang__)
  174593. "muls r6, r5\n\t"
  174594. #else
  174595. "mul r6, r5\n\t"
  174596. #endif
  174597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174598. "adds r4, r4, r6\n\t"
  174599. #else
  174600. "add r4, r4, r6\n\t"
  174601. #endif
  174602. #ifdef WOLFSSL_KEIL
  174603. "adcs r2, r2, %[r]\n\t"
  174604. #elif defined(__clang__)
  174605. "adcs r2, %[r]\n\t"
  174606. #else
  174607. "adc r2, %[r]\n\t"
  174608. #endif
  174609. #ifdef WOLFSSL_KEIL
  174610. "adcs r3, r3, %[r]\n\t"
  174611. #elif defined(__clang__)
  174612. "adcs r3, %[r]\n\t"
  174613. #else
  174614. "adc r3, %[r]\n\t"
  174615. #endif
  174616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174617. "adds r4, r4, r6\n\t"
  174618. #else
  174619. "add r4, r4, r6\n\t"
  174620. #endif
  174621. #ifdef WOLFSSL_KEIL
  174622. "adcs r2, r2, %[r]\n\t"
  174623. #elif defined(__clang__)
  174624. "adcs r2, %[r]\n\t"
  174625. #else
  174626. "adc r2, %[r]\n\t"
  174627. #endif
  174628. #ifdef WOLFSSL_KEIL
  174629. "adcs r3, r3, %[r]\n\t"
  174630. #elif defined(__clang__)
  174631. "adcs r3, %[r]\n\t"
  174632. #else
  174633. "adc r3, %[r]\n\t"
  174634. #endif
  174635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174636. "lsrs r6, r7, #16\n\t"
  174637. #else
  174638. "lsr r6, r7, #16\n\t"
  174639. #endif
  174640. #ifdef WOLFSSL_KEIL
  174641. "muls r5, r6, r5\n\t"
  174642. #elif defined(__clang__)
  174643. "muls r5, r6\n\t"
  174644. #else
  174645. "mul r5, r6\n\t"
  174646. #endif
  174647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174648. "lsrs r6, r5, #16\n\t"
  174649. #else
  174650. "lsr r6, r5, #16\n\t"
  174651. #endif
  174652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174653. "lsls r5, r5, #16\n\t"
  174654. #else
  174655. "lsl r5, r5, #16\n\t"
  174656. #endif
  174657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174658. "adds r4, r4, r5\n\t"
  174659. #else
  174660. "add r4, r4, r5\n\t"
  174661. #endif
  174662. #ifdef WOLFSSL_KEIL
  174663. "adcs r2, r2, r6\n\t"
  174664. #elif defined(__clang__)
  174665. "adcs r2, r6\n\t"
  174666. #else
  174667. "adc r2, r6\n\t"
  174668. #endif
  174669. #ifdef WOLFSSL_KEIL
  174670. "adcs r3, r3, %[r]\n\t"
  174671. #elif defined(__clang__)
  174672. "adcs r3, %[r]\n\t"
  174673. #else
  174674. "adc r3, %[r]\n\t"
  174675. #endif
  174676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174677. "adds r4, r4, r5\n\t"
  174678. #else
  174679. "add r4, r4, r5\n\t"
  174680. #endif
  174681. #ifdef WOLFSSL_KEIL
  174682. "adcs r2, r2, r6\n\t"
  174683. #elif defined(__clang__)
  174684. "adcs r2, r6\n\t"
  174685. #else
  174686. "adc r2, r6\n\t"
  174687. #endif
  174688. #ifdef WOLFSSL_KEIL
  174689. "adcs r3, r3, %[r]\n\t"
  174690. #elif defined(__clang__)
  174691. "adcs r3, %[r]\n\t"
  174692. #else
  174693. "adc r3, %[r]\n\t"
  174694. #endif
  174695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174696. "lsrs r5, %[a], #16\n\t"
  174697. #else
  174698. "lsr r5, %[a], #16\n\t"
  174699. #endif
  174700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174701. "lsrs r6, r7, #16\n\t"
  174702. #else
  174703. "lsr r6, r7, #16\n\t"
  174704. #endif
  174705. #ifdef WOLFSSL_KEIL
  174706. "muls r6, r5, r6\n\t"
  174707. #elif defined(__clang__)
  174708. "muls r6, r5\n\t"
  174709. #else
  174710. "mul r6, r5\n\t"
  174711. #endif
  174712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174713. "adds r2, r2, r6\n\t"
  174714. #else
  174715. "add r2, r2, r6\n\t"
  174716. #endif
  174717. #ifdef WOLFSSL_KEIL
  174718. "adcs r3, r3, %[r]\n\t"
  174719. #elif defined(__clang__)
  174720. "adcs r3, %[r]\n\t"
  174721. #else
  174722. "adc r3, %[r]\n\t"
  174723. #endif
  174724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174725. "adds r2, r2, r6\n\t"
  174726. #else
  174727. "add r2, r2, r6\n\t"
  174728. #endif
  174729. #ifdef WOLFSSL_KEIL
  174730. "adcs r3, r3, %[r]\n\t"
  174731. #elif defined(__clang__)
  174732. "adcs r3, %[r]\n\t"
  174733. #else
  174734. "adc r3, %[r]\n\t"
  174735. #endif
  174736. "uxth r6, r7\n\t"
  174737. #ifdef WOLFSSL_KEIL
  174738. "muls r5, r6, r5\n\t"
  174739. #elif defined(__clang__)
  174740. "muls r5, r6\n\t"
  174741. #else
  174742. "mul r5, r6\n\t"
  174743. #endif
  174744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174745. "lsrs r6, r5, #16\n\t"
  174746. #else
  174747. "lsr r6, r5, #16\n\t"
  174748. #endif
  174749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174750. "lsls r5, r5, #16\n\t"
  174751. #else
  174752. "lsl r5, r5, #16\n\t"
  174753. #endif
  174754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174755. "adds r4, r4, r5\n\t"
  174756. #else
  174757. "add r4, r4, r5\n\t"
  174758. #endif
  174759. #ifdef WOLFSSL_KEIL
  174760. "adcs r2, r2, r6\n\t"
  174761. #elif defined(__clang__)
  174762. "adcs r2, r6\n\t"
  174763. #else
  174764. "adc r2, r6\n\t"
  174765. #endif
  174766. #ifdef WOLFSSL_KEIL
  174767. "adcs r3, r3, %[r]\n\t"
  174768. #elif defined(__clang__)
  174769. "adcs r3, %[r]\n\t"
  174770. #else
  174771. "adc r3, %[r]\n\t"
  174772. #endif
  174773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174774. "adds r4, r4, r5\n\t"
  174775. #else
  174776. "add r4, r4, r5\n\t"
  174777. #endif
  174778. #ifdef WOLFSSL_KEIL
  174779. "adcs r2, r2, r6\n\t"
  174780. #elif defined(__clang__)
  174781. "adcs r2, r6\n\t"
  174782. #else
  174783. "adc r2, r6\n\t"
  174784. #endif
  174785. #ifdef WOLFSSL_KEIL
  174786. "adcs r3, r3, %[r]\n\t"
  174787. #elif defined(__clang__)
  174788. "adcs r3, %[r]\n\t"
  174789. #else
  174790. "adc r3, %[r]\n\t"
  174791. #endif
  174792. "# A[7] * A[1]\n\t"
  174793. "mov %[a], r9\n\t"
  174794. "mov r7, r11\n\t"
  174795. "ldr %[a], [%[a], #28]\n\t"
  174796. "uxth r5, %[a]\n\t"
  174797. "uxth r6, r7\n\t"
  174798. #ifdef WOLFSSL_KEIL
  174799. "muls r6, r5, r6\n\t"
  174800. #elif defined(__clang__)
  174801. "muls r6, r5\n\t"
  174802. #else
  174803. "mul r6, r5\n\t"
  174804. #endif
  174805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174806. "adds r4, r4, r6\n\t"
  174807. #else
  174808. "add r4, r4, r6\n\t"
  174809. #endif
  174810. #ifdef WOLFSSL_KEIL
  174811. "adcs r2, r2, %[r]\n\t"
  174812. #elif defined(__clang__)
  174813. "adcs r2, %[r]\n\t"
  174814. #else
  174815. "adc r2, %[r]\n\t"
  174816. #endif
  174817. #ifdef WOLFSSL_KEIL
  174818. "adcs r3, r3, %[r]\n\t"
  174819. #elif defined(__clang__)
  174820. "adcs r3, %[r]\n\t"
  174821. #else
  174822. "adc r3, %[r]\n\t"
  174823. #endif
  174824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174825. "adds r4, r4, r6\n\t"
  174826. #else
  174827. "add r4, r4, r6\n\t"
  174828. #endif
  174829. #ifdef WOLFSSL_KEIL
  174830. "adcs r2, r2, %[r]\n\t"
  174831. #elif defined(__clang__)
  174832. "adcs r2, %[r]\n\t"
  174833. #else
  174834. "adc r2, %[r]\n\t"
  174835. #endif
  174836. #ifdef WOLFSSL_KEIL
  174837. "adcs r3, r3, %[r]\n\t"
  174838. #elif defined(__clang__)
  174839. "adcs r3, %[r]\n\t"
  174840. #else
  174841. "adc r3, %[r]\n\t"
  174842. #endif
  174843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174844. "lsrs r6, r7, #16\n\t"
  174845. #else
  174846. "lsr r6, r7, #16\n\t"
  174847. #endif
  174848. #ifdef WOLFSSL_KEIL
  174849. "muls r5, r6, r5\n\t"
  174850. #elif defined(__clang__)
  174851. "muls r5, r6\n\t"
  174852. #else
  174853. "mul r5, r6\n\t"
  174854. #endif
  174855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174856. "lsrs r6, r5, #16\n\t"
  174857. #else
  174858. "lsr r6, r5, #16\n\t"
  174859. #endif
  174860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174861. "lsls r5, r5, #16\n\t"
  174862. #else
  174863. "lsl r5, r5, #16\n\t"
  174864. #endif
  174865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174866. "adds r4, r4, r5\n\t"
  174867. #else
  174868. "add r4, r4, r5\n\t"
  174869. #endif
  174870. #ifdef WOLFSSL_KEIL
  174871. "adcs r2, r2, r6\n\t"
  174872. #elif defined(__clang__)
  174873. "adcs r2, r6\n\t"
  174874. #else
  174875. "adc r2, r6\n\t"
  174876. #endif
  174877. #ifdef WOLFSSL_KEIL
  174878. "adcs r3, r3, %[r]\n\t"
  174879. #elif defined(__clang__)
  174880. "adcs r3, %[r]\n\t"
  174881. #else
  174882. "adc r3, %[r]\n\t"
  174883. #endif
  174884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174885. "adds r4, r4, r5\n\t"
  174886. #else
  174887. "add r4, r4, r5\n\t"
  174888. #endif
  174889. #ifdef WOLFSSL_KEIL
  174890. "adcs r2, r2, r6\n\t"
  174891. #elif defined(__clang__)
  174892. "adcs r2, r6\n\t"
  174893. #else
  174894. "adc r2, r6\n\t"
  174895. #endif
  174896. #ifdef WOLFSSL_KEIL
  174897. "adcs r3, r3, %[r]\n\t"
  174898. #elif defined(__clang__)
  174899. "adcs r3, %[r]\n\t"
  174900. #else
  174901. "adc r3, %[r]\n\t"
  174902. #endif
  174903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174904. "lsrs r5, %[a], #16\n\t"
  174905. #else
  174906. "lsr r5, %[a], #16\n\t"
  174907. #endif
  174908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174909. "lsrs r6, r7, #16\n\t"
  174910. #else
  174911. "lsr r6, r7, #16\n\t"
  174912. #endif
  174913. #ifdef WOLFSSL_KEIL
  174914. "muls r6, r5, r6\n\t"
  174915. #elif defined(__clang__)
  174916. "muls r6, r5\n\t"
  174917. #else
  174918. "mul r6, r5\n\t"
  174919. #endif
  174920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174921. "adds r2, r2, r6\n\t"
  174922. #else
  174923. "add r2, r2, r6\n\t"
  174924. #endif
  174925. #ifdef WOLFSSL_KEIL
  174926. "adcs r3, r3, %[r]\n\t"
  174927. #elif defined(__clang__)
  174928. "adcs r3, %[r]\n\t"
  174929. #else
  174930. "adc r3, %[r]\n\t"
  174931. #endif
  174932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174933. "adds r2, r2, r6\n\t"
  174934. #else
  174935. "add r2, r2, r6\n\t"
  174936. #endif
  174937. #ifdef WOLFSSL_KEIL
  174938. "adcs r3, r3, %[r]\n\t"
  174939. #elif defined(__clang__)
  174940. "adcs r3, %[r]\n\t"
  174941. #else
  174942. "adc r3, %[r]\n\t"
  174943. #endif
  174944. "uxth r6, r7\n\t"
  174945. #ifdef WOLFSSL_KEIL
  174946. "muls r5, r6, r5\n\t"
  174947. #elif defined(__clang__)
  174948. "muls r5, r6\n\t"
  174949. #else
  174950. "mul r5, r6\n\t"
  174951. #endif
  174952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174953. "lsrs r6, r5, #16\n\t"
  174954. #else
  174955. "lsr r6, r5, #16\n\t"
  174956. #endif
  174957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174958. "lsls r5, r5, #16\n\t"
  174959. #else
  174960. "lsl r5, r5, #16\n\t"
  174961. #endif
  174962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174963. "adds r4, r4, r5\n\t"
  174964. #else
  174965. "add r4, r4, r5\n\t"
  174966. #endif
  174967. #ifdef WOLFSSL_KEIL
  174968. "adcs r2, r2, r6\n\t"
  174969. #elif defined(__clang__)
  174970. "adcs r2, r6\n\t"
  174971. #else
  174972. "adc r2, r6\n\t"
  174973. #endif
  174974. #ifdef WOLFSSL_KEIL
  174975. "adcs r3, r3, %[r]\n\t"
  174976. #elif defined(__clang__)
  174977. "adcs r3, %[r]\n\t"
  174978. #else
  174979. "adc r3, %[r]\n\t"
  174980. #endif
  174981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174982. "adds r4, r4, r5\n\t"
  174983. #else
  174984. "add r4, r4, r5\n\t"
  174985. #endif
  174986. #ifdef WOLFSSL_KEIL
  174987. "adcs r2, r2, r6\n\t"
  174988. #elif defined(__clang__)
  174989. "adcs r2, r6\n\t"
  174990. #else
  174991. "adc r2, r6\n\t"
  174992. #endif
  174993. #ifdef WOLFSSL_KEIL
  174994. "adcs r3, r3, %[r]\n\t"
  174995. #elif defined(__clang__)
  174996. "adcs r3, %[r]\n\t"
  174997. #else
  174998. "adc r3, %[r]\n\t"
  174999. #endif
  175000. "# A[6] * A[2]\n\t"
  175001. "mov %[a], r9\n\t"
  175002. "mov r7, r12\n\t"
  175003. "ldr %[a], [%[a], #24]\n\t"
  175004. "uxth r5, %[a]\n\t"
  175005. "uxth r6, r7\n\t"
  175006. #ifdef WOLFSSL_KEIL
  175007. "muls r6, r5, r6\n\t"
  175008. #elif defined(__clang__)
  175009. "muls r6, r5\n\t"
  175010. #else
  175011. "mul r6, r5\n\t"
  175012. #endif
  175013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175014. "adds r4, r4, r6\n\t"
  175015. #else
  175016. "add r4, r4, r6\n\t"
  175017. #endif
  175018. #ifdef WOLFSSL_KEIL
  175019. "adcs r2, r2, %[r]\n\t"
  175020. #elif defined(__clang__)
  175021. "adcs r2, %[r]\n\t"
  175022. #else
  175023. "adc r2, %[r]\n\t"
  175024. #endif
  175025. #ifdef WOLFSSL_KEIL
  175026. "adcs r3, r3, %[r]\n\t"
  175027. #elif defined(__clang__)
  175028. "adcs r3, %[r]\n\t"
  175029. #else
  175030. "adc r3, %[r]\n\t"
  175031. #endif
  175032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175033. "adds r4, r4, r6\n\t"
  175034. #else
  175035. "add r4, r4, r6\n\t"
  175036. #endif
  175037. #ifdef WOLFSSL_KEIL
  175038. "adcs r2, r2, %[r]\n\t"
  175039. #elif defined(__clang__)
  175040. "adcs r2, %[r]\n\t"
  175041. #else
  175042. "adc r2, %[r]\n\t"
  175043. #endif
  175044. #ifdef WOLFSSL_KEIL
  175045. "adcs r3, r3, %[r]\n\t"
  175046. #elif defined(__clang__)
  175047. "adcs r3, %[r]\n\t"
  175048. #else
  175049. "adc r3, %[r]\n\t"
  175050. #endif
  175051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175052. "lsrs r6, r7, #16\n\t"
  175053. #else
  175054. "lsr r6, r7, #16\n\t"
  175055. #endif
  175056. #ifdef WOLFSSL_KEIL
  175057. "muls r5, r6, r5\n\t"
  175058. #elif defined(__clang__)
  175059. "muls r5, r6\n\t"
  175060. #else
  175061. "mul r5, r6\n\t"
  175062. #endif
  175063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175064. "lsrs r6, r5, #16\n\t"
  175065. #else
  175066. "lsr r6, r5, #16\n\t"
  175067. #endif
  175068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175069. "lsls r5, r5, #16\n\t"
  175070. #else
  175071. "lsl r5, r5, #16\n\t"
  175072. #endif
  175073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175074. "adds r4, r4, r5\n\t"
  175075. #else
  175076. "add r4, r4, r5\n\t"
  175077. #endif
  175078. #ifdef WOLFSSL_KEIL
  175079. "adcs r2, r2, r6\n\t"
  175080. #elif defined(__clang__)
  175081. "adcs r2, r6\n\t"
  175082. #else
  175083. "adc r2, r6\n\t"
  175084. #endif
  175085. #ifdef WOLFSSL_KEIL
  175086. "adcs r3, r3, %[r]\n\t"
  175087. #elif defined(__clang__)
  175088. "adcs r3, %[r]\n\t"
  175089. #else
  175090. "adc r3, %[r]\n\t"
  175091. #endif
  175092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175093. "adds r4, r4, r5\n\t"
  175094. #else
  175095. "add r4, r4, r5\n\t"
  175096. #endif
  175097. #ifdef WOLFSSL_KEIL
  175098. "adcs r2, r2, r6\n\t"
  175099. #elif defined(__clang__)
  175100. "adcs r2, r6\n\t"
  175101. #else
  175102. "adc r2, r6\n\t"
  175103. #endif
  175104. #ifdef WOLFSSL_KEIL
  175105. "adcs r3, r3, %[r]\n\t"
  175106. #elif defined(__clang__)
  175107. "adcs r3, %[r]\n\t"
  175108. #else
  175109. "adc r3, %[r]\n\t"
  175110. #endif
  175111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175112. "lsrs r5, %[a], #16\n\t"
  175113. #else
  175114. "lsr r5, %[a], #16\n\t"
  175115. #endif
  175116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175117. "lsrs r6, r7, #16\n\t"
  175118. #else
  175119. "lsr r6, r7, #16\n\t"
  175120. #endif
  175121. #ifdef WOLFSSL_KEIL
  175122. "muls r6, r5, r6\n\t"
  175123. #elif defined(__clang__)
  175124. "muls r6, r5\n\t"
  175125. #else
  175126. "mul r6, r5\n\t"
  175127. #endif
  175128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175129. "adds r2, r2, r6\n\t"
  175130. #else
  175131. "add r2, r2, r6\n\t"
  175132. #endif
  175133. #ifdef WOLFSSL_KEIL
  175134. "adcs r3, r3, %[r]\n\t"
  175135. #elif defined(__clang__)
  175136. "adcs r3, %[r]\n\t"
  175137. #else
  175138. "adc r3, %[r]\n\t"
  175139. #endif
  175140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175141. "adds r2, r2, r6\n\t"
  175142. #else
  175143. "add r2, r2, r6\n\t"
  175144. #endif
  175145. #ifdef WOLFSSL_KEIL
  175146. "adcs r3, r3, %[r]\n\t"
  175147. #elif defined(__clang__)
  175148. "adcs r3, %[r]\n\t"
  175149. #else
  175150. "adc r3, %[r]\n\t"
  175151. #endif
  175152. "uxth r6, r7\n\t"
  175153. #ifdef WOLFSSL_KEIL
  175154. "muls r5, r6, r5\n\t"
  175155. #elif defined(__clang__)
  175156. "muls r5, r6\n\t"
  175157. #else
  175158. "mul r5, r6\n\t"
  175159. #endif
  175160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175161. "lsrs r6, r5, #16\n\t"
  175162. #else
  175163. "lsr r6, r5, #16\n\t"
  175164. #endif
  175165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175166. "lsls r5, r5, #16\n\t"
  175167. #else
  175168. "lsl r5, r5, #16\n\t"
  175169. #endif
  175170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175171. "adds r4, r4, r5\n\t"
  175172. #else
  175173. "add r4, r4, r5\n\t"
  175174. #endif
  175175. #ifdef WOLFSSL_KEIL
  175176. "adcs r2, r2, r6\n\t"
  175177. #elif defined(__clang__)
  175178. "adcs r2, r6\n\t"
  175179. #else
  175180. "adc r2, r6\n\t"
  175181. #endif
  175182. #ifdef WOLFSSL_KEIL
  175183. "adcs r3, r3, %[r]\n\t"
  175184. #elif defined(__clang__)
  175185. "adcs r3, %[r]\n\t"
  175186. #else
  175187. "adc r3, %[r]\n\t"
  175188. #endif
  175189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175190. "adds r4, r4, r5\n\t"
  175191. #else
  175192. "add r4, r4, r5\n\t"
  175193. #endif
  175194. #ifdef WOLFSSL_KEIL
  175195. "adcs r2, r2, r6\n\t"
  175196. #elif defined(__clang__)
  175197. "adcs r2, r6\n\t"
  175198. #else
  175199. "adc r2, r6\n\t"
  175200. #endif
  175201. #ifdef WOLFSSL_KEIL
  175202. "adcs r3, r3, %[r]\n\t"
  175203. #elif defined(__clang__)
  175204. "adcs r3, %[r]\n\t"
  175205. #else
  175206. "adc r3, %[r]\n\t"
  175207. #endif
  175208. "# A[5] * A[3]\n\t"
  175209. "mov %[a], r9\n\t"
  175210. "mov r7, lr\n\t"
  175211. "ldr %[a], [%[a], #20]\n\t"
  175212. "uxth r5, %[a]\n\t"
  175213. "uxth r6, r7\n\t"
  175214. #ifdef WOLFSSL_KEIL
  175215. "muls r6, r5, r6\n\t"
  175216. #elif defined(__clang__)
  175217. "muls r6, r5\n\t"
  175218. #else
  175219. "mul r6, r5\n\t"
  175220. #endif
  175221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175222. "adds r4, r4, r6\n\t"
  175223. #else
  175224. "add r4, r4, r6\n\t"
  175225. #endif
  175226. #ifdef WOLFSSL_KEIL
  175227. "adcs r2, r2, %[r]\n\t"
  175228. #elif defined(__clang__)
  175229. "adcs r2, %[r]\n\t"
  175230. #else
  175231. "adc r2, %[r]\n\t"
  175232. #endif
  175233. #ifdef WOLFSSL_KEIL
  175234. "adcs r3, r3, %[r]\n\t"
  175235. #elif defined(__clang__)
  175236. "adcs r3, %[r]\n\t"
  175237. #else
  175238. "adc r3, %[r]\n\t"
  175239. #endif
  175240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175241. "adds r4, r4, r6\n\t"
  175242. #else
  175243. "add r4, r4, r6\n\t"
  175244. #endif
  175245. #ifdef WOLFSSL_KEIL
  175246. "adcs r2, r2, %[r]\n\t"
  175247. #elif defined(__clang__)
  175248. "adcs r2, %[r]\n\t"
  175249. #else
  175250. "adc r2, %[r]\n\t"
  175251. #endif
  175252. #ifdef WOLFSSL_KEIL
  175253. "adcs r3, r3, %[r]\n\t"
  175254. #elif defined(__clang__)
  175255. "adcs r3, %[r]\n\t"
  175256. #else
  175257. "adc r3, %[r]\n\t"
  175258. #endif
  175259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175260. "lsrs r6, r7, #16\n\t"
  175261. #else
  175262. "lsr r6, r7, #16\n\t"
  175263. #endif
  175264. #ifdef WOLFSSL_KEIL
  175265. "muls r5, r6, r5\n\t"
  175266. #elif defined(__clang__)
  175267. "muls r5, r6\n\t"
  175268. #else
  175269. "mul r5, r6\n\t"
  175270. #endif
  175271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175272. "lsrs r6, r5, #16\n\t"
  175273. #else
  175274. "lsr r6, r5, #16\n\t"
  175275. #endif
  175276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175277. "lsls r5, r5, #16\n\t"
  175278. #else
  175279. "lsl r5, r5, #16\n\t"
  175280. #endif
  175281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175282. "adds r4, r4, r5\n\t"
  175283. #else
  175284. "add r4, r4, r5\n\t"
  175285. #endif
  175286. #ifdef WOLFSSL_KEIL
  175287. "adcs r2, r2, r6\n\t"
  175288. #elif defined(__clang__)
  175289. "adcs r2, r6\n\t"
  175290. #else
  175291. "adc r2, r6\n\t"
  175292. #endif
  175293. #ifdef WOLFSSL_KEIL
  175294. "adcs r3, r3, %[r]\n\t"
  175295. #elif defined(__clang__)
  175296. "adcs r3, %[r]\n\t"
  175297. #else
  175298. "adc r3, %[r]\n\t"
  175299. #endif
  175300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175301. "adds r4, r4, r5\n\t"
  175302. #else
  175303. "add r4, r4, r5\n\t"
  175304. #endif
  175305. #ifdef WOLFSSL_KEIL
  175306. "adcs r2, r2, r6\n\t"
  175307. #elif defined(__clang__)
  175308. "adcs r2, r6\n\t"
  175309. #else
  175310. "adc r2, r6\n\t"
  175311. #endif
  175312. #ifdef WOLFSSL_KEIL
  175313. "adcs r3, r3, %[r]\n\t"
  175314. #elif defined(__clang__)
  175315. "adcs r3, %[r]\n\t"
  175316. #else
  175317. "adc r3, %[r]\n\t"
  175318. #endif
  175319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175320. "lsrs r5, %[a], #16\n\t"
  175321. #else
  175322. "lsr r5, %[a], #16\n\t"
  175323. #endif
  175324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175325. "lsrs r6, r7, #16\n\t"
  175326. #else
  175327. "lsr r6, r7, #16\n\t"
  175328. #endif
  175329. #ifdef WOLFSSL_KEIL
  175330. "muls r6, r5, r6\n\t"
  175331. #elif defined(__clang__)
  175332. "muls r6, r5\n\t"
  175333. #else
  175334. "mul r6, r5\n\t"
  175335. #endif
  175336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175337. "adds r2, r2, r6\n\t"
  175338. #else
  175339. "add r2, r2, r6\n\t"
  175340. #endif
  175341. #ifdef WOLFSSL_KEIL
  175342. "adcs r3, r3, %[r]\n\t"
  175343. #elif defined(__clang__)
  175344. "adcs r3, %[r]\n\t"
  175345. #else
  175346. "adc r3, %[r]\n\t"
  175347. #endif
  175348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175349. "adds r2, r2, r6\n\t"
  175350. #else
  175351. "add r2, r2, r6\n\t"
  175352. #endif
  175353. #ifdef WOLFSSL_KEIL
  175354. "adcs r3, r3, %[r]\n\t"
  175355. #elif defined(__clang__)
  175356. "adcs r3, %[r]\n\t"
  175357. #else
  175358. "adc r3, %[r]\n\t"
  175359. #endif
  175360. "uxth r6, r7\n\t"
  175361. #ifdef WOLFSSL_KEIL
  175362. "muls r5, r6, r5\n\t"
  175363. #elif defined(__clang__)
  175364. "muls r5, r6\n\t"
  175365. #else
  175366. "mul r5, r6\n\t"
  175367. #endif
  175368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175369. "lsrs r6, r5, #16\n\t"
  175370. #else
  175371. "lsr r6, r5, #16\n\t"
  175372. #endif
  175373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175374. "lsls r5, r5, #16\n\t"
  175375. #else
  175376. "lsl r5, r5, #16\n\t"
  175377. #endif
  175378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175379. "adds r4, r4, r5\n\t"
  175380. #else
  175381. "add r4, r4, r5\n\t"
  175382. #endif
  175383. #ifdef WOLFSSL_KEIL
  175384. "adcs r2, r2, r6\n\t"
  175385. #elif defined(__clang__)
  175386. "adcs r2, r6\n\t"
  175387. #else
  175388. "adc r2, r6\n\t"
  175389. #endif
  175390. #ifdef WOLFSSL_KEIL
  175391. "adcs r3, r3, %[r]\n\t"
  175392. #elif defined(__clang__)
  175393. "adcs r3, %[r]\n\t"
  175394. #else
  175395. "adc r3, %[r]\n\t"
  175396. #endif
  175397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175398. "adds r4, r4, r5\n\t"
  175399. #else
  175400. "add r4, r4, r5\n\t"
  175401. #endif
  175402. #ifdef WOLFSSL_KEIL
  175403. "adcs r2, r2, r6\n\t"
  175404. #elif defined(__clang__)
  175405. "adcs r2, r6\n\t"
  175406. #else
  175407. "adc r2, r6\n\t"
  175408. #endif
  175409. #ifdef WOLFSSL_KEIL
  175410. "adcs r3, r3, %[r]\n\t"
  175411. #elif defined(__clang__)
  175412. "adcs r3, %[r]\n\t"
  175413. #else
  175414. "adc r3, %[r]\n\t"
  175415. #endif
  175416. "# A[4] * A[4]\n\t"
  175417. "mov %[a], r9\n\t"
  175418. "ldr r7, [%[a], #16]\n\t"
  175419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175420. "lsrs r6, r7, #16\n\t"
  175421. #else
  175422. "lsr r6, r7, #16\n\t"
  175423. #endif
  175424. "uxth r5, r7\n\t"
  175425. #ifdef WOLFSSL_KEIL
  175426. "muls r5, r5, r5\n\t"
  175427. #elif defined(__clang__)
  175428. "muls r5, r5\n\t"
  175429. #else
  175430. "mul r5, r5\n\t"
  175431. #endif
  175432. #ifdef WOLFSSL_KEIL
  175433. "muls r6, r6, r6\n\t"
  175434. #elif defined(__clang__)
  175435. "muls r6, r6\n\t"
  175436. #else
  175437. "mul r6, r6\n\t"
  175438. #endif
  175439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175440. "adds r4, r4, r5\n\t"
  175441. #else
  175442. "add r4, r4, r5\n\t"
  175443. #endif
  175444. #ifdef WOLFSSL_KEIL
  175445. "adcs r2, r2, r6\n\t"
  175446. #elif defined(__clang__)
  175447. "adcs r2, r6\n\t"
  175448. #else
  175449. "adc r2, r6\n\t"
  175450. #endif
  175451. #ifdef WOLFSSL_KEIL
  175452. "adcs r3, r3, %[r]\n\t"
  175453. #elif defined(__clang__)
  175454. "adcs r3, %[r]\n\t"
  175455. #else
  175456. "adc r3, %[r]\n\t"
  175457. #endif
  175458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175459. "lsrs r6, r7, #16\n\t"
  175460. #else
  175461. "lsr r6, r7, #16\n\t"
  175462. #endif
  175463. "uxth r5, r7\n\t"
  175464. #ifdef WOLFSSL_KEIL
  175465. "muls r5, r6, r5\n\t"
  175466. #elif defined(__clang__)
  175467. "muls r5, r6\n\t"
  175468. #else
  175469. "mul r5, r6\n\t"
  175470. #endif
  175471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175472. "lsrs r6, r5, #15\n\t"
  175473. #else
  175474. "lsr r6, r5, #15\n\t"
  175475. #endif
  175476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175477. "lsls r5, r5, #17\n\t"
  175478. #else
  175479. "lsl r5, r5, #17\n\t"
  175480. #endif
  175481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175482. "adds r4, r4, r5\n\t"
  175483. #else
  175484. "add r4, r4, r5\n\t"
  175485. #endif
  175486. #ifdef WOLFSSL_KEIL
  175487. "adcs r2, r2, r6\n\t"
  175488. #elif defined(__clang__)
  175489. "adcs r2, r6\n\t"
  175490. #else
  175491. "adc r2, r6\n\t"
  175492. #endif
  175493. #ifdef WOLFSSL_KEIL
  175494. "adcs r3, r3, %[r]\n\t"
  175495. #elif defined(__clang__)
  175496. "adcs r3, %[r]\n\t"
  175497. #else
  175498. "adc r3, %[r]\n\t"
  175499. #endif
  175500. "str r4, [sp, #32]\n\t"
  175501. "# A[5] * A[4]\n\t"
  175502. "movs r4, #0\n\t"
  175503. "ldr %[a], [%[a], #20]\n\t"
  175504. "uxth r5, %[a]\n\t"
  175505. "uxth r6, r7\n\t"
  175506. #ifdef WOLFSSL_KEIL
  175507. "muls r6, r5, r6\n\t"
  175508. #elif defined(__clang__)
  175509. "muls r6, r5\n\t"
  175510. #else
  175511. "mul r6, r5\n\t"
  175512. #endif
  175513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175514. "adds r2, r2, r6\n\t"
  175515. #else
  175516. "add r2, r2, r6\n\t"
  175517. #endif
  175518. #ifdef WOLFSSL_KEIL
  175519. "adcs r3, r3, %[r]\n\t"
  175520. #elif defined(__clang__)
  175521. "adcs r3, %[r]\n\t"
  175522. #else
  175523. "adc r3, %[r]\n\t"
  175524. #endif
  175525. #ifdef WOLFSSL_KEIL
  175526. "adcs r4, r4, %[r]\n\t"
  175527. #elif defined(__clang__)
  175528. "adcs r4, %[r]\n\t"
  175529. #else
  175530. "adc r4, %[r]\n\t"
  175531. #endif
  175532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175533. "adds r2, r2, r6\n\t"
  175534. #else
  175535. "add r2, r2, r6\n\t"
  175536. #endif
  175537. #ifdef WOLFSSL_KEIL
  175538. "adcs r3, r3, %[r]\n\t"
  175539. #elif defined(__clang__)
  175540. "adcs r3, %[r]\n\t"
  175541. #else
  175542. "adc r3, %[r]\n\t"
  175543. #endif
  175544. #ifdef WOLFSSL_KEIL
  175545. "adcs r4, r4, %[r]\n\t"
  175546. #elif defined(__clang__)
  175547. "adcs r4, %[r]\n\t"
  175548. #else
  175549. "adc r4, %[r]\n\t"
  175550. #endif
  175551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175552. "lsrs r6, r7, #16\n\t"
  175553. #else
  175554. "lsr r6, r7, #16\n\t"
  175555. #endif
  175556. #ifdef WOLFSSL_KEIL
  175557. "muls r5, r6, r5\n\t"
  175558. #elif defined(__clang__)
  175559. "muls r5, r6\n\t"
  175560. #else
  175561. "mul r5, r6\n\t"
  175562. #endif
  175563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175564. "lsrs r6, r5, #16\n\t"
  175565. #else
  175566. "lsr r6, r5, #16\n\t"
  175567. #endif
  175568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175569. "lsls r5, r5, #16\n\t"
  175570. #else
  175571. "lsl r5, r5, #16\n\t"
  175572. #endif
  175573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175574. "adds r2, r2, r5\n\t"
  175575. #else
  175576. "add r2, r2, r5\n\t"
  175577. #endif
  175578. #ifdef WOLFSSL_KEIL
  175579. "adcs r3, r3, r6\n\t"
  175580. #elif defined(__clang__)
  175581. "adcs r3, r6\n\t"
  175582. #else
  175583. "adc r3, r6\n\t"
  175584. #endif
  175585. #ifdef WOLFSSL_KEIL
  175586. "adcs r4, r4, %[r]\n\t"
  175587. #elif defined(__clang__)
  175588. "adcs r4, %[r]\n\t"
  175589. #else
  175590. "adc r4, %[r]\n\t"
  175591. #endif
  175592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175593. "adds r2, r2, r5\n\t"
  175594. #else
  175595. "add r2, r2, r5\n\t"
  175596. #endif
  175597. #ifdef WOLFSSL_KEIL
  175598. "adcs r3, r3, r6\n\t"
  175599. #elif defined(__clang__)
  175600. "adcs r3, r6\n\t"
  175601. #else
  175602. "adc r3, r6\n\t"
  175603. #endif
  175604. #ifdef WOLFSSL_KEIL
  175605. "adcs r4, r4, %[r]\n\t"
  175606. #elif defined(__clang__)
  175607. "adcs r4, %[r]\n\t"
  175608. #else
  175609. "adc r4, %[r]\n\t"
  175610. #endif
  175611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175612. "lsrs r5, %[a], #16\n\t"
  175613. #else
  175614. "lsr r5, %[a], #16\n\t"
  175615. #endif
  175616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175617. "lsrs r6, r7, #16\n\t"
  175618. #else
  175619. "lsr r6, r7, #16\n\t"
  175620. #endif
  175621. #ifdef WOLFSSL_KEIL
  175622. "muls r6, r5, r6\n\t"
  175623. #elif defined(__clang__)
  175624. "muls r6, r5\n\t"
  175625. #else
  175626. "mul r6, r5\n\t"
  175627. #endif
  175628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175629. "adds r3, r3, r6\n\t"
  175630. #else
  175631. "add r3, r3, r6\n\t"
  175632. #endif
  175633. #ifdef WOLFSSL_KEIL
  175634. "adcs r4, r4, %[r]\n\t"
  175635. #elif defined(__clang__)
  175636. "adcs r4, %[r]\n\t"
  175637. #else
  175638. "adc r4, %[r]\n\t"
  175639. #endif
  175640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175641. "adds r3, r3, r6\n\t"
  175642. #else
  175643. "add r3, r3, r6\n\t"
  175644. #endif
  175645. #ifdef WOLFSSL_KEIL
  175646. "adcs r4, r4, %[r]\n\t"
  175647. #elif defined(__clang__)
  175648. "adcs r4, %[r]\n\t"
  175649. #else
  175650. "adc r4, %[r]\n\t"
  175651. #endif
  175652. "uxth r6, r7\n\t"
  175653. #ifdef WOLFSSL_KEIL
  175654. "muls r5, r6, r5\n\t"
  175655. #elif defined(__clang__)
  175656. "muls r5, r6\n\t"
  175657. #else
  175658. "mul r5, r6\n\t"
  175659. #endif
  175660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175661. "lsrs r6, r5, #16\n\t"
  175662. #else
  175663. "lsr r6, r5, #16\n\t"
  175664. #endif
  175665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175666. "lsls r5, r5, #16\n\t"
  175667. #else
  175668. "lsl r5, r5, #16\n\t"
  175669. #endif
  175670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175671. "adds r2, r2, r5\n\t"
  175672. #else
  175673. "add r2, r2, r5\n\t"
  175674. #endif
  175675. #ifdef WOLFSSL_KEIL
  175676. "adcs r3, r3, r6\n\t"
  175677. #elif defined(__clang__)
  175678. "adcs r3, r6\n\t"
  175679. #else
  175680. "adc r3, r6\n\t"
  175681. #endif
  175682. #ifdef WOLFSSL_KEIL
  175683. "adcs r4, r4, %[r]\n\t"
  175684. #elif defined(__clang__)
  175685. "adcs r4, %[r]\n\t"
  175686. #else
  175687. "adc r4, %[r]\n\t"
  175688. #endif
  175689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175690. "adds r2, r2, r5\n\t"
  175691. #else
  175692. "add r2, r2, r5\n\t"
  175693. #endif
  175694. #ifdef WOLFSSL_KEIL
  175695. "adcs r3, r3, r6\n\t"
  175696. #elif defined(__clang__)
  175697. "adcs r3, r6\n\t"
  175698. #else
  175699. "adc r3, r6\n\t"
  175700. #endif
  175701. #ifdef WOLFSSL_KEIL
  175702. "adcs r4, r4, %[r]\n\t"
  175703. #elif defined(__clang__)
  175704. "adcs r4, %[r]\n\t"
  175705. #else
  175706. "adc r4, %[r]\n\t"
  175707. #endif
  175708. "# A[6] * A[3]\n\t"
  175709. "mov %[a], r9\n\t"
  175710. "mov r7, lr\n\t"
  175711. "ldr %[a], [%[a], #24]\n\t"
  175712. "uxth r5, %[a]\n\t"
  175713. "uxth r6, r7\n\t"
  175714. #ifdef WOLFSSL_KEIL
  175715. "muls r6, r5, r6\n\t"
  175716. #elif defined(__clang__)
  175717. "muls r6, r5\n\t"
  175718. #else
  175719. "mul r6, r5\n\t"
  175720. #endif
  175721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175722. "adds r2, r2, r6\n\t"
  175723. #else
  175724. "add r2, r2, r6\n\t"
  175725. #endif
  175726. #ifdef WOLFSSL_KEIL
  175727. "adcs r3, r3, %[r]\n\t"
  175728. #elif defined(__clang__)
  175729. "adcs r3, %[r]\n\t"
  175730. #else
  175731. "adc r3, %[r]\n\t"
  175732. #endif
  175733. #ifdef WOLFSSL_KEIL
  175734. "adcs r4, r4, %[r]\n\t"
  175735. #elif defined(__clang__)
  175736. "adcs r4, %[r]\n\t"
  175737. #else
  175738. "adc r4, %[r]\n\t"
  175739. #endif
  175740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175741. "adds r2, r2, r6\n\t"
  175742. #else
  175743. "add r2, r2, r6\n\t"
  175744. #endif
  175745. #ifdef WOLFSSL_KEIL
  175746. "adcs r3, r3, %[r]\n\t"
  175747. #elif defined(__clang__)
  175748. "adcs r3, %[r]\n\t"
  175749. #else
  175750. "adc r3, %[r]\n\t"
  175751. #endif
  175752. #ifdef WOLFSSL_KEIL
  175753. "adcs r4, r4, %[r]\n\t"
  175754. #elif defined(__clang__)
  175755. "adcs r4, %[r]\n\t"
  175756. #else
  175757. "adc r4, %[r]\n\t"
  175758. #endif
  175759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175760. "lsrs r6, r7, #16\n\t"
  175761. #else
  175762. "lsr r6, r7, #16\n\t"
  175763. #endif
  175764. #ifdef WOLFSSL_KEIL
  175765. "muls r5, r6, r5\n\t"
  175766. #elif defined(__clang__)
  175767. "muls r5, r6\n\t"
  175768. #else
  175769. "mul r5, r6\n\t"
  175770. #endif
  175771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175772. "lsrs r6, r5, #16\n\t"
  175773. #else
  175774. "lsr r6, r5, #16\n\t"
  175775. #endif
  175776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175777. "lsls r5, r5, #16\n\t"
  175778. #else
  175779. "lsl r5, r5, #16\n\t"
  175780. #endif
  175781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175782. "adds r2, r2, r5\n\t"
  175783. #else
  175784. "add r2, r2, r5\n\t"
  175785. #endif
  175786. #ifdef WOLFSSL_KEIL
  175787. "adcs r3, r3, r6\n\t"
  175788. #elif defined(__clang__)
  175789. "adcs r3, r6\n\t"
  175790. #else
  175791. "adc r3, r6\n\t"
  175792. #endif
  175793. #ifdef WOLFSSL_KEIL
  175794. "adcs r4, r4, %[r]\n\t"
  175795. #elif defined(__clang__)
  175796. "adcs r4, %[r]\n\t"
  175797. #else
  175798. "adc r4, %[r]\n\t"
  175799. #endif
  175800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175801. "adds r2, r2, r5\n\t"
  175802. #else
  175803. "add r2, r2, r5\n\t"
  175804. #endif
  175805. #ifdef WOLFSSL_KEIL
  175806. "adcs r3, r3, r6\n\t"
  175807. #elif defined(__clang__)
  175808. "adcs r3, r6\n\t"
  175809. #else
  175810. "adc r3, r6\n\t"
  175811. #endif
  175812. #ifdef WOLFSSL_KEIL
  175813. "adcs r4, r4, %[r]\n\t"
  175814. #elif defined(__clang__)
  175815. "adcs r4, %[r]\n\t"
  175816. #else
  175817. "adc r4, %[r]\n\t"
  175818. #endif
  175819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175820. "lsrs r5, %[a], #16\n\t"
  175821. #else
  175822. "lsr r5, %[a], #16\n\t"
  175823. #endif
  175824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175825. "lsrs r6, r7, #16\n\t"
  175826. #else
  175827. "lsr r6, r7, #16\n\t"
  175828. #endif
  175829. #ifdef WOLFSSL_KEIL
  175830. "muls r6, r5, r6\n\t"
  175831. #elif defined(__clang__)
  175832. "muls r6, r5\n\t"
  175833. #else
  175834. "mul r6, r5\n\t"
  175835. #endif
  175836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175837. "adds r3, r3, r6\n\t"
  175838. #else
  175839. "add r3, r3, r6\n\t"
  175840. #endif
  175841. #ifdef WOLFSSL_KEIL
  175842. "adcs r4, r4, %[r]\n\t"
  175843. #elif defined(__clang__)
  175844. "adcs r4, %[r]\n\t"
  175845. #else
  175846. "adc r4, %[r]\n\t"
  175847. #endif
  175848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175849. "adds r3, r3, r6\n\t"
  175850. #else
  175851. "add r3, r3, r6\n\t"
  175852. #endif
  175853. #ifdef WOLFSSL_KEIL
  175854. "adcs r4, r4, %[r]\n\t"
  175855. #elif defined(__clang__)
  175856. "adcs r4, %[r]\n\t"
  175857. #else
  175858. "adc r4, %[r]\n\t"
  175859. #endif
  175860. "uxth r6, r7\n\t"
  175861. #ifdef WOLFSSL_KEIL
  175862. "muls r5, r6, r5\n\t"
  175863. #elif defined(__clang__)
  175864. "muls r5, r6\n\t"
  175865. #else
  175866. "mul r5, r6\n\t"
  175867. #endif
  175868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175869. "lsrs r6, r5, #16\n\t"
  175870. #else
  175871. "lsr r6, r5, #16\n\t"
  175872. #endif
  175873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175874. "lsls r5, r5, #16\n\t"
  175875. #else
  175876. "lsl r5, r5, #16\n\t"
  175877. #endif
  175878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175879. "adds r2, r2, r5\n\t"
  175880. #else
  175881. "add r2, r2, r5\n\t"
  175882. #endif
  175883. #ifdef WOLFSSL_KEIL
  175884. "adcs r3, r3, r6\n\t"
  175885. #elif defined(__clang__)
  175886. "adcs r3, r6\n\t"
  175887. #else
  175888. "adc r3, r6\n\t"
  175889. #endif
  175890. #ifdef WOLFSSL_KEIL
  175891. "adcs r4, r4, %[r]\n\t"
  175892. #elif defined(__clang__)
  175893. "adcs r4, %[r]\n\t"
  175894. #else
  175895. "adc r4, %[r]\n\t"
  175896. #endif
  175897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175898. "adds r2, r2, r5\n\t"
  175899. #else
  175900. "add r2, r2, r5\n\t"
  175901. #endif
  175902. #ifdef WOLFSSL_KEIL
  175903. "adcs r3, r3, r6\n\t"
  175904. #elif defined(__clang__)
  175905. "adcs r3, r6\n\t"
  175906. #else
  175907. "adc r3, r6\n\t"
  175908. #endif
  175909. #ifdef WOLFSSL_KEIL
  175910. "adcs r4, r4, %[r]\n\t"
  175911. #elif defined(__clang__)
  175912. "adcs r4, %[r]\n\t"
  175913. #else
  175914. "adc r4, %[r]\n\t"
  175915. #endif
  175916. "# A[7] * A[2]\n\t"
  175917. "mov %[a], r9\n\t"
  175918. "mov r7, r12\n\t"
  175919. "ldr %[a], [%[a], #28]\n\t"
  175920. "uxth r5, %[a]\n\t"
  175921. "uxth r6, r7\n\t"
  175922. #ifdef WOLFSSL_KEIL
  175923. "muls r6, r5, r6\n\t"
  175924. #elif defined(__clang__)
  175925. "muls r6, r5\n\t"
  175926. #else
  175927. "mul r6, r5\n\t"
  175928. #endif
  175929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175930. "adds r2, r2, r6\n\t"
  175931. #else
  175932. "add r2, r2, r6\n\t"
  175933. #endif
  175934. #ifdef WOLFSSL_KEIL
  175935. "adcs r3, r3, %[r]\n\t"
  175936. #elif defined(__clang__)
  175937. "adcs r3, %[r]\n\t"
  175938. #else
  175939. "adc r3, %[r]\n\t"
  175940. #endif
  175941. #ifdef WOLFSSL_KEIL
  175942. "adcs r4, r4, %[r]\n\t"
  175943. #elif defined(__clang__)
  175944. "adcs r4, %[r]\n\t"
  175945. #else
  175946. "adc r4, %[r]\n\t"
  175947. #endif
  175948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175949. "adds r2, r2, r6\n\t"
  175950. #else
  175951. "add r2, r2, r6\n\t"
  175952. #endif
  175953. #ifdef WOLFSSL_KEIL
  175954. "adcs r3, r3, %[r]\n\t"
  175955. #elif defined(__clang__)
  175956. "adcs r3, %[r]\n\t"
  175957. #else
  175958. "adc r3, %[r]\n\t"
  175959. #endif
  175960. #ifdef WOLFSSL_KEIL
  175961. "adcs r4, r4, %[r]\n\t"
  175962. #elif defined(__clang__)
  175963. "adcs r4, %[r]\n\t"
  175964. #else
  175965. "adc r4, %[r]\n\t"
  175966. #endif
  175967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175968. "lsrs r6, r7, #16\n\t"
  175969. #else
  175970. "lsr r6, r7, #16\n\t"
  175971. #endif
  175972. #ifdef WOLFSSL_KEIL
  175973. "muls r5, r6, r5\n\t"
  175974. #elif defined(__clang__)
  175975. "muls r5, r6\n\t"
  175976. #else
  175977. "mul r5, r6\n\t"
  175978. #endif
  175979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175980. "lsrs r6, r5, #16\n\t"
  175981. #else
  175982. "lsr r6, r5, #16\n\t"
  175983. #endif
  175984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175985. "lsls r5, r5, #16\n\t"
  175986. #else
  175987. "lsl r5, r5, #16\n\t"
  175988. #endif
  175989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175990. "adds r2, r2, r5\n\t"
  175991. #else
  175992. "add r2, r2, r5\n\t"
  175993. #endif
  175994. #ifdef WOLFSSL_KEIL
  175995. "adcs r3, r3, r6\n\t"
  175996. #elif defined(__clang__)
  175997. "adcs r3, r6\n\t"
  175998. #else
  175999. "adc r3, r6\n\t"
  176000. #endif
  176001. #ifdef WOLFSSL_KEIL
  176002. "adcs r4, r4, %[r]\n\t"
  176003. #elif defined(__clang__)
  176004. "adcs r4, %[r]\n\t"
  176005. #else
  176006. "adc r4, %[r]\n\t"
  176007. #endif
  176008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176009. "adds r2, r2, r5\n\t"
  176010. #else
  176011. "add r2, r2, r5\n\t"
  176012. #endif
  176013. #ifdef WOLFSSL_KEIL
  176014. "adcs r3, r3, r6\n\t"
  176015. #elif defined(__clang__)
  176016. "adcs r3, r6\n\t"
  176017. #else
  176018. "adc r3, r6\n\t"
  176019. #endif
  176020. #ifdef WOLFSSL_KEIL
  176021. "adcs r4, r4, %[r]\n\t"
  176022. #elif defined(__clang__)
  176023. "adcs r4, %[r]\n\t"
  176024. #else
  176025. "adc r4, %[r]\n\t"
  176026. #endif
  176027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176028. "lsrs r5, %[a], #16\n\t"
  176029. #else
  176030. "lsr r5, %[a], #16\n\t"
  176031. #endif
  176032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176033. "lsrs r6, r7, #16\n\t"
  176034. #else
  176035. "lsr r6, r7, #16\n\t"
  176036. #endif
  176037. #ifdef WOLFSSL_KEIL
  176038. "muls r6, r5, r6\n\t"
  176039. #elif defined(__clang__)
  176040. "muls r6, r5\n\t"
  176041. #else
  176042. "mul r6, r5\n\t"
  176043. #endif
  176044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176045. "adds r3, r3, r6\n\t"
  176046. #else
  176047. "add r3, r3, r6\n\t"
  176048. #endif
  176049. #ifdef WOLFSSL_KEIL
  176050. "adcs r4, r4, %[r]\n\t"
  176051. #elif defined(__clang__)
  176052. "adcs r4, %[r]\n\t"
  176053. #else
  176054. "adc r4, %[r]\n\t"
  176055. #endif
  176056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176057. "adds r3, r3, r6\n\t"
  176058. #else
  176059. "add r3, r3, r6\n\t"
  176060. #endif
  176061. #ifdef WOLFSSL_KEIL
  176062. "adcs r4, r4, %[r]\n\t"
  176063. #elif defined(__clang__)
  176064. "adcs r4, %[r]\n\t"
  176065. #else
  176066. "adc r4, %[r]\n\t"
  176067. #endif
  176068. "uxth r6, r7\n\t"
  176069. #ifdef WOLFSSL_KEIL
  176070. "muls r5, r6, r5\n\t"
  176071. #elif defined(__clang__)
  176072. "muls r5, r6\n\t"
  176073. #else
  176074. "mul r5, r6\n\t"
  176075. #endif
  176076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176077. "lsrs r6, r5, #16\n\t"
  176078. #else
  176079. "lsr r6, r5, #16\n\t"
  176080. #endif
  176081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176082. "lsls r5, r5, #16\n\t"
  176083. #else
  176084. "lsl r5, r5, #16\n\t"
  176085. #endif
  176086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176087. "adds r2, r2, r5\n\t"
  176088. #else
  176089. "add r2, r2, r5\n\t"
  176090. #endif
  176091. #ifdef WOLFSSL_KEIL
  176092. "adcs r3, r3, r6\n\t"
  176093. #elif defined(__clang__)
  176094. "adcs r3, r6\n\t"
  176095. #else
  176096. "adc r3, r6\n\t"
  176097. #endif
  176098. #ifdef WOLFSSL_KEIL
  176099. "adcs r4, r4, %[r]\n\t"
  176100. #elif defined(__clang__)
  176101. "adcs r4, %[r]\n\t"
  176102. #else
  176103. "adc r4, %[r]\n\t"
  176104. #endif
  176105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176106. "adds r2, r2, r5\n\t"
  176107. #else
  176108. "add r2, r2, r5\n\t"
  176109. #endif
  176110. #ifdef WOLFSSL_KEIL
  176111. "adcs r3, r3, r6\n\t"
  176112. #elif defined(__clang__)
  176113. "adcs r3, r6\n\t"
  176114. #else
  176115. "adc r3, r6\n\t"
  176116. #endif
  176117. #ifdef WOLFSSL_KEIL
  176118. "adcs r4, r4, %[r]\n\t"
  176119. #elif defined(__clang__)
  176120. "adcs r4, %[r]\n\t"
  176121. #else
  176122. "adc r4, %[r]\n\t"
  176123. #endif
  176124. "# A[8] * A[1]\n\t"
  176125. "mov %[a], r9\n\t"
  176126. "mov r7, r11\n\t"
  176127. "ldr %[a], [%[a], #32]\n\t"
  176128. "uxth r5, %[a]\n\t"
  176129. "uxth r6, r7\n\t"
  176130. #ifdef WOLFSSL_KEIL
  176131. "muls r6, r5, r6\n\t"
  176132. #elif defined(__clang__)
  176133. "muls r6, r5\n\t"
  176134. #else
  176135. "mul r6, r5\n\t"
  176136. #endif
  176137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176138. "adds r2, r2, r6\n\t"
  176139. #else
  176140. "add r2, r2, r6\n\t"
  176141. #endif
  176142. #ifdef WOLFSSL_KEIL
  176143. "adcs r3, r3, %[r]\n\t"
  176144. #elif defined(__clang__)
  176145. "adcs r3, %[r]\n\t"
  176146. #else
  176147. "adc r3, %[r]\n\t"
  176148. #endif
  176149. #ifdef WOLFSSL_KEIL
  176150. "adcs r4, r4, %[r]\n\t"
  176151. #elif defined(__clang__)
  176152. "adcs r4, %[r]\n\t"
  176153. #else
  176154. "adc r4, %[r]\n\t"
  176155. #endif
  176156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176157. "adds r2, r2, r6\n\t"
  176158. #else
  176159. "add r2, r2, r6\n\t"
  176160. #endif
  176161. #ifdef WOLFSSL_KEIL
  176162. "adcs r3, r3, %[r]\n\t"
  176163. #elif defined(__clang__)
  176164. "adcs r3, %[r]\n\t"
  176165. #else
  176166. "adc r3, %[r]\n\t"
  176167. #endif
  176168. #ifdef WOLFSSL_KEIL
  176169. "adcs r4, r4, %[r]\n\t"
  176170. #elif defined(__clang__)
  176171. "adcs r4, %[r]\n\t"
  176172. #else
  176173. "adc r4, %[r]\n\t"
  176174. #endif
  176175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176176. "lsrs r6, r7, #16\n\t"
  176177. #else
  176178. "lsr r6, r7, #16\n\t"
  176179. #endif
  176180. #ifdef WOLFSSL_KEIL
  176181. "muls r5, r6, r5\n\t"
  176182. #elif defined(__clang__)
  176183. "muls r5, r6\n\t"
  176184. #else
  176185. "mul r5, r6\n\t"
  176186. #endif
  176187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176188. "lsrs r6, r5, #16\n\t"
  176189. #else
  176190. "lsr r6, r5, #16\n\t"
  176191. #endif
  176192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176193. "lsls r5, r5, #16\n\t"
  176194. #else
  176195. "lsl r5, r5, #16\n\t"
  176196. #endif
  176197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176198. "adds r2, r2, r5\n\t"
  176199. #else
  176200. "add r2, r2, r5\n\t"
  176201. #endif
  176202. #ifdef WOLFSSL_KEIL
  176203. "adcs r3, r3, r6\n\t"
  176204. #elif defined(__clang__)
  176205. "adcs r3, r6\n\t"
  176206. #else
  176207. "adc r3, r6\n\t"
  176208. #endif
  176209. #ifdef WOLFSSL_KEIL
  176210. "adcs r4, r4, %[r]\n\t"
  176211. #elif defined(__clang__)
  176212. "adcs r4, %[r]\n\t"
  176213. #else
  176214. "adc r4, %[r]\n\t"
  176215. #endif
  176216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176217. "adds r2, r2, r5\n\t"
  176218. #else
  176219. "add r2, r2, r5\n\t"
  176220. #endif
  176221. #ifdef WOLFSSL_KEIL
  176222. "adcs r3, r3, r6\n\t"
  176223. #elif defined(__clang__)
  176224. "adcs r3, r6\n\t"
  176225. #else
  176226. "adc r3, r6\n\t"
  176227. #endif
  176228. #ifdef WOLFSSL_KEIL
  176229. "adcs r4, r4, %[r]\n\t"
  176230. #elif defined(__clang__)
  176231. "adcs r4, %[r]\n\t"
  176232. #else
  176233. "adc r4, %[r]\n\t"
  176234. #endif
  176235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176236. "lsrs r5, %[a], #16\n\t"
  176237. #else
  176238. "lsr r5, %[a], #16\n\t"
  176239. #endif
  176240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176241. "lsrs r6, r7, #16\n\t"
  176242. #else
  176243. "lsr r6, r7, #16\n\t"
  176244. #endif
  176245. #ifdef WOLFSSL_KEIL
  176246. "muls r6, r5, r6\n\t"
  176247. #elif defined(__clang__)
  176248. "muls r6, r5\n\t"
  176249. #else
  176250. "mul r6, r5\n\t"
  176251. #endif
  176252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176253. "adds r3, r3, r6\n\t"
  176254. #else
  176255. "add r3, r3, r6\n\t"
  176256. #endif
  176257. #ifdef WOLFSSL_KEIL
  176258. "adcs r4, r4, %[r]\n\t"
  176259. #elif defined(__clang__)
  176260. "adcs r4, %[r]\n\t"
  176261. #else
  176262. "adc r4, %[r]\n\t"
  176263. #endif
  176264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176265. "adds r3, r3, r6\n\t"
  176266. #else
  176267. "add r3, r3, r6\n\t"
  176268. #endif
  176269. #ifdef WOLFSSL_KEIL
  176270. "adcs r4, r4, %[r]\n\t"
  176271. #elif defined(__clang__)
  176272. "adcs r4, %[r]\n\t"
  176273. #else
  176274. "adc r4, %[r]\n\t"
  176275. #endif
  176276. "uxth r6, r7\n\t"
  176277. #ifdef WOLFSSL_KEIL
  176278. "muls r5, r6, r5\n\t"
  176279. #elif defined(__clang__)
  176280. "muls r5, r6\n\t"
  176281. #else
  176282. "mul r5, r6\n\t"
  176283. #endif
  176284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176285. "lsrs r6, r5, #16\n\t"
  176286. #else
  176287. "lsr r6, r5, #16\n\t"
  176288. #endif
  176289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176290. "lsls r5, r5, #16\n\t"
  176291. #else
  176292. "lsl r5, r5, #16\n\t"
  176293. #endif
  176294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176295. "adds r2, r2, r5\n\t"
  176296. #else
  176297. "add r2, r2, r5\n\t"
  176298. #endif
  176299. #ifdef WOLFSSL_KEIL
  176300. "adcs r3, r3, r6\n\t"
  176301. #elif defined(__clang__)
  176302. "adcs r3, r6\n\t"
  176303. #else
  176304. "adc r3, r6\n\t"
  176305. #endif
  176306. #ifdef WOLFSSL_KEIL
  176307. "adcs r4, r4, %[r]\n\t"
  176308. #elif defined(__clang__)
  176309. "adcs r4, %[r]\n\t"
  176310. #else
  176311. "adc r4, %[r]\n\t"
  176312. #endif
  176313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176314. "adds r2, r2, r5\n\t"
  176315. #else
  176316. "add r2, r2, r5\n\t"
  176317. #endif
  176318. #ifdef WOLFSSL_KEIL
  176319. "adcs r3, r3, r6\n\t"
  176320. #elif defined(__clang__)
  176321. "adcs r3, r6\n\t"
  176322. #else
  176323. "adc r3, r6\n\t"
  176324. #endif
  176325. #ifdef WOLFSSL_KEIL
  176326. "adcs r4, r4, %[r]\n\t"
  176327. #elif defined(__clang__)
  176328. "adcs r4, %[r]\n\t"
  176329. #else
  176330. "adc r4, %[r]\n\t"
  176331. #endif
  176332. "# A[9] * A[0]\n\t"
  176333. "mov %[a], r9\n\t"
  176334. "mov r7, r10\n\t"
  176335. "ldr %[a], [%[a], #36]\n\t"
  176336. "uxth r5, %[a]\n\t"
  176337. "uxth r6, r7\n\t"
  176338. #ifdef WOLFSSL_KEIL
  176339. "muls r6, r5, r6\n\t"
  176340. #elif defined(__clang__)
  176341. "muls r6, r5\n\t"
  176342. #else
  176343. "mul r6, r5\n\t"
  176344. #endif
  176345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176346. "adds r2, r2, r6\n\t"
  176347. #else
  176348. "add r2, r2, r6\n\t"
  176349. #endif
  176350. #ifdef WOLFSSL_KEIL
  176351. "adcs r3, r3, %[r]\n\t"
  176352. #elif defined(__clang__)
  176353. "adcs r3, %[r]\n\t"
  176354. #else
  176355. "adc r3, %[r]\n\t"
  176356. #endif
  176357. #ifdef WOLFSSL_KEIL
  176358. "adcs r4, r4, %[r]\n\t"
  176359. #elif defined(__clang__)
  176360. "adcs r4, %[r]\n\t"
  176361. #else
  176362. "adc r4, %[r]\n\t"
  176363. #endif
  176364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176365. "adds r2, r2, r6\n\t"
  176366. #else
  176367. "add r2, r2, r6\n\t"
  176368. #endif
  176369. #ifdef WOLFSSL_KEIL
  176370. "adcs r3, r3, %[r]\n\t"
  176371. #elif defined(__clang__)
  176372. "adcs r3, %[r]\n\t"
  176373. #else
  176374. "adc r3, %[r]\n\t"
  176375. #endif
  176376. #ifdef WOLFSSL_KEIL
  176377. "adcs r4, r4, %[r]\n\t"
  176378. #elif defined(__clang__)
  176379. "adcs r4, %[r]\n\t"
  176380. #else
  176381. "adc r4, %[r]\n\t"
  176382. #endif
  176383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176384. "lsrs r6, r7, #16\n\t"
  176385. #else
  176386. "lsr r6, r7, #16\n\t"
  176387. #endif
  176388. #ifdef WOLFSSL_KEIL
  176389. "muls r5, r6, r5\n\t"
  176390. #elif defined(__clang__)
  176391. "muls r5, r6\n\t"
  176392. #else
  176393. "mul r5, r6\n\t"
  176394. #endif
  176395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176396. "lsrs r6, r5, #16\n\t"
  176397. #else
  176398. "lsr r6, r5, #16\n\t"
  176399. #endif
  176400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176401. "lsls r5, r5, #16\n\t"
  176402. #else
  176403. "lsl r5, r5, #16\n\t"
  176404. #endif
  176405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176406. "adds r2, r2, r5\n\t"
  176407. #else
  176408. "add r2, r2, r5\n\t"
  176409. #endif
  176410. #ifdef WOLFSSL_KEIL
  176411. "adcs r3, r3, r6\n\t"
  176412. #elif defined(__clang__)
  176413. "adcs r3, r6\n\t"
  176414. #else
  176415. "adc r3, r6\n\t"
  176416. #endif
  176417. #ifdef WOLFSSL_KEIL
  176418. "adcs r4, r4, %[r]\n\t"
  176419. #elif defined(__clang__)
  176420. "adcs r4, %[r]\n\t"
  176421. #else
  176422. "adc r4, %[r]\n\t"
  176423. #endif
  176424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176425. "adds r2, r2, r5\n\t"
  176426. #else
  176427. "add r2, r2, r5\n\t"
  176428. #endif
  176429. #ifdef WOLFSSL_KEIL
  176430. "adcs r3, r3, r6\n\t"
  176431. #elif defined(__clang__)
  176432. "adcs r3, r6\n\t"
  176433. #else
  176434. "adc r3, r6\n\t"
  176435. #endif
  176436. #ifdef WOLFSSL_KEIL
  176437. "adcs r4, r4, %[r]\n\t"
  176438. #elif defined(__clang__)
  176439. "adcs r4, %[r]\n\t"
  176440. #else
  176441. "adc r4, %[r]\n\t"
  176442. #endif
  176443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176444. "lsrs r5, %[a], #16\n\t"
  176445. #else
  176446. "lsr r5, %[a], #16\n\t"
  176447. #endif
  176448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176449. "lsrs r6, r7, #16\n\t"
  176450. #else
  176451. "lsr r6, r7, #16\n\t"
  176452. #endif
  176453. #ifdef WOLFSSL_KEIL
  176454. "muls r6, r5, r6\n\t"
  176455. #elif defined(__clang__)
  176456. "muls r6, r5\n\t"
  176457. #else
  176458. "mul r6, r5\n\t"
  176459. #endif
  176460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176461. "adds r3, r3, r6\n\t"
  176462. #else
  176463. "add r3, r3, r6\n\t"
  176464. #endif
  176465. #ifdef WOLFSSL_KEIL
  176466. "adcs r4, r4, %[r]\n\t"
  176467. #elif defined(__clang__)
  176468. "adcs r4, %[r]\n\t"
  176469. #else
  176470. "adc r4, %[r]\n\t"
  176471. #endif
  176472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176473. "adds r3, r3, r6\n\t"
  176474. #else
  176475. "add r3, r3, r6\n\t"
  176476. #endif
  176477. #ifdef WOLFSSL_KEIL
  176478. "adcs r4, r4, %[r]\n\t"
  176479. #elif defined(__clang__)
  176480. "adcs r4, %[r]\n\t"
  176481. #else
  176482. "adc r4, %[r]\n\t"
  176483. #endif
  176484. "uxth r6, r7\n\t"
  176485. #ifdef WOLFSSL_KEIL
  176486. "muls r5, r6, r5\n\t"
  176487. #elif defined(__clang__)
  176488. "muls r5, r6\n\t"
  176489. #else
  176490. "mul r5, r6\n\t"
  176491. #endif
  176492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176493. "lsrs r6, r5, #16\n\t"
  176494. #else
  176495. "lsr r6, r5, #16\n\t"
  176496. #endif
  176497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176498. "lsls r5, r5, #16\n\t"
  176499. #else
  176500. "lsl r5, r5, #16\n\t"
  176501. #endif
  176502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176503. "adds r2, r2, r5\n\t"
  176504. #else
  176505. "add r2, r2, r5\n\t"
  176506. #endif
  176507. #ifdef WOLFSSL_KEIL
  176508. "adcs r3, r3, r6\n\t"
  176509. #elif defined(__clang__)
  176510. "adcs r3, r6\n\t"
  176511. #else
  176512. "adc r3, r6\n\t"
  176513. #endif
  176514. #ifdef WOLFSSL_KEIL
  176515. "adcs r4, r4, %[r]\n\t"
  176516. #elif defined(__clang__)
  176517. "adcs r4, %[r]\n\t"
  176518. #else
  176519. "adc r4, %[r]\n\t"
  176520. #endif
  176521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176522. "adds r2, r2, r5\n\t"
  176523. #else
  176524. "add r2, r2, r5\n\t"
  176525. #endif
  176526. #ifdef WOLFSSL_KEIL
  176527. "adcs r3, r3, r6\n\t"
  176528. #elif defined(__clang__)
  176529. "adcs r3, r6\n\t"
  176530. #else
  176531. "adc r3, r6\n\t"
  176532. #endif
  176533. #ifdef WOLFSSL_KEIL
  176534. "adcs r4, r4, %[r]\n\t"
  176535. #elif defined(__clang__)
  176536. "adcs r4, %[r]\n\t"
  176537. #else
  176538. "adc r4, %[r]\n\t"
  176539. #endif
  176540. "str r2, [sp, #36]\n\t"
  176541. "# A[10] * A[0]\n\t"
  176542. "movs r2, #0\n\t"
  176543. "mov %[a], r9\n\t"
  176544. "ldr %[a], [%[a], #40]\n\t"
  176545. "uxth r5, %[a]\n\t"
  176546. "uxth r6, r7\n\t"
  176547. #ifdef WOLFSSL_KEIL
  176548. "muls r6, r5, r6\n\t"
  176549. #elif defined(__clang__)
  176550. "muls r6, r5\n\t"
  176551. #else
  176552. "mul r6, r5\n\t"
  176553. #endif
  176554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176555. "adds r3, r3, r6\n\t"
  176556. #else
  176557. "add r3, r3, r6\n\t"
  176558. #endif
  176559. #ifdef WOLFSSL_KEIL
  176560. "adcs r4, r4, %[r]\n\t"
  176561. #elif defined(__clang__)
  176562. "adcs r4, %[r]\n\t"
  176563. #else
  176564. "adc r4, %[r]\n\t"
  176565. #endif
  176566. #ifdef WOLFSSL_KEIL
  176567. "adcs r2, r2, %[r]\n\t"
  176568. #elif defined(__clang__)
  176569. "adcs r2, %[r]\n\t"
  176570. #else
  176571. "adc r2, %[r]\n\t"
  176572. #endif
  176573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176574. "adds r3, r3, r6\n\t"
  176575. #else
  176576. "add r3, r3, r6\n\t"
  176577. #endif
  176578. #ifdef WOLFSSL_KEIL
  176579. "adcs r4, r4, %[r]\n\t"
  176580. #elif defined(__clang__)
  176581. "adcs r4, %[r]\n\t"
  176582. #else
  176583. "adc r4, %[r]\n\t"
  176584. #endif
  176585. #ifdef WOLFSSL_KEIL
  176586. "adcs r2, r2, %[r]\n\t"
  176587. #elif defined(__clang__)
  176588. "adcs r2, %[r]\n\t"
  176589. #else
  176590. "adc r2, %[r]\n\t"
  176591. #endif
  176592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176593. "lsrs r6, r7, #16\n\t"
  176594. #else
  176595. "lsr r6, r7, #16\n\t"
  176596. #endif
  176597. #ifdef WOLFSSL_KEIL
  176598. "muls r5, r6, r5\n\t"
  176599. #elif defined(__clang__)
  176600. "muls r5, r6\n\t"
  176601. #else
  176602. "mul r5, r6\n\t"
  176603. #endif
  176604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176605. "lsrs r6, r5, #16\n\t"
  176606. #else
  176607. "lsr r6, r5, #16\n\t"
  176608. #endif
  176609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176610. "lsls r5, r5, #16\n\t"
  176611. #else
  176612. "lsl r5, r5, #16\n\t"
  176613. #endif
  176614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176615. "adds r3, r3, r5\n\t"
  176616. #else
  176617. "add r3, r3, r5\n\t"
  176618. #endif
  176619. #ifdef WOLFSSL_KEIL
  176620. "adcs r4, r4, r6\n\t"
  176621. #elif defined(__clang__)
  176622. "adcs r4, r6\n\t"
  176623. #else
  176624. "adc r4, r6\n\t"
  176625. #endif
  176626. #ifdef WOLFSSL_KEIL
  176627. "adcs r2, r2, %[r]\n\t"
  176628. #elif defined(__clang__)
  176629. "adcs r2, %[r]\n\t"
  176630. #else
  176631. "adc r2, %[r]\n\t"
  176632. #endif
  176633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176634. "adds r3, r3, r5\n\t"
  176635. #else
  176636. "add r3, r3, r5\n\t"
  176637. #endif
  176638. #ifdef WOLFSSL_KEIL
  176639. "adcs r4, r4, r6\n\t"
  176640. #elif defined(__clang__)
  176641. "adcs r4, r6\n\t"
  176642. #else
  176643. "adc r4, r6\n\t"
  176644. #endif
  176645. #ifdef WOLFSSL_KEIL
  176646. "adcs r2, r2, %[r]\n\t"
  176647. #elif defined(__clang__)
  176648. "adcs r2, %[r]\n\t"
  176649. #else
  176650. "adc r2, %[r]\n\t"
  176651. #endif
  176652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176653. "lsrs r5, %[a], #16\n\t"
  176654. #else
  176655. "lsr r5, %[a], #16\n\t"
  176656. #endif
  176657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176658. "lsrs r6, r7, #16\n\t"
  176659. #else
  176660. "lsr r6, r7, #16\n\t"
  176661. #endif
  176662. #ifdef WOLFSSL_KEIL
  176663. "muls r6, r5, r6\n\t"
  176664. #elif defined(__clang__)
  176665. "muls r6, r5\n\t"
  176666. #else
  176667. "mul r6, r5\n\t"
  176668. #endif
  176669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176670. "adds r4, r4, r6\n\t"
  176671. #else
  176672. "add r4, r4, r6\n\t"
  176673. #endif
  176674. #ifdef WOLFSSL_KEIL
  176675. "adcs r2, r2, %[r]\n\t"
  176676. #elif defined(__clang__)
  176677. "adcs r2, %[r]\n\t"
  176678. #else
  176679. "adc r2, %[r]\n\t"
  176680. #endif
  176681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176682. "adds r4, r4, r6\n\t"
  176683. #else
  176684. "add r4, r4, r6\n\t"
  176685. #endif
  176686. #ifdef WOLFSSL_KEIL
  176687. "adcs r2, r2, %[r]\n\t"
  176688. #elif defined(__clang__)
  176689. "adcs r2, %[r]\n\t"
  176690. #else
  176691. "adc r2, %[r]\n\t"
  176692. #endif
  176693. "uxth r6, r7\n\t"
  176694. #ifdef WOLFSSL_KEIL
  176695. "muls r5, r6, r5\n\t"
  176696. #elif defined(__clang__)
  176697. "muls r5, r6\n\t"
  176698. #else
  176699. "mul r5, r6\n\t"
  176700. #endif
  176701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176702. "lsrs r6, r5, #16\n\t"
  176703. #else
  176704. "lsr r6, r5, #16\n\t"
  176705. #endif
  176706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176707. "lsls r5, r5, #16\n\t"
  176708. #else
  176709. "lsl r5, r5, #16\n\t"
  176710. #endif
  176711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176712. "adds r3, r3, r5\n\t"
  176713. #else
  176714. "add r3, r3, r5\n\t"
  176715. #endif
  176716. #ifdef WOLFSSL_KEIL
  176717. "adcs r4, r4, r6\n\t"
  176718. #elif defined(__clang__)
  176719. "adcs r4, r6\n\t"
  176720. #else
  176721. "adc r4, r6\n\t"
  176722. #endif
  176723. #ifdef WOLFSSL_KEIL
  176724. "adcs r2, r2, %[r]\n\t"
  176725. #elif defined(__clang__)
  176726. "adcs r2, %[r]\n\t"
  176727. #else
  176728. "adc r2, %[r]\n\t"
  176729. #endif
  176730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176731. "adds r3, r3, r5\n\t"
  176732. #else
  176733. "add r3, r3, r5\n\t"
  176734. #endif
  176735. #ifdef WOLFSSL_KEIL
  176736. "adcs r4, r4, r6\n\t"
  176737. #elif defined(__clang__)
  176738. "adcs r4, r6\n\t"
  176739. #else
  176740. "adc r4, r6\n\t"
  176741. #endif
  176742. #ifdef WOLFSSL_KEIL
  176743. "adcs r2, r2, %[r]\n\t"
  176744. #elif defined(__clang__)
  176745. "adcs r2, %[r]\n\t"
  176746. #else
  176747. "adc r2, %[r]\n\t"
  176748. #endif
  176749. "# A[9] * A[1]\n\t"
  176750. "mov %[a], r9\n\t"
  176751. "mov r7, r11\n\t"
  176752. "ldr %[a], [%[a], #36]\n\t"
  176753. "uxth r5, %[a]\n\t"
  176754. "uxth r6, r7\n\t"
  176755. #ifdef WOLFSSL_KEIL
  176756. "muls r6, r5, r6\n\t"
  176757. #elif defined(__clang__)
  176758. "muls r6, r5\n\t"
  176759. #else
  176760. "mul r6, r5\n\t"
  176761. #endif
  176762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176763. "adds r3, r3, r6\n\t"
  176764. #else
  176765. "add r3, r3, r6\n\t"
  176766. #endif
  176767. #ifdef WOLFSSL_KEIL
  176768. "adcs r4, r4, %[r]\n\t"
  176769. #elif defined(__clang__)
  176770. "adcs r4, %[r]\n\t"
  176771. #else
  176772. "adc r4, %[r]\n\t"
  176773. #endif
  176774. #ifdef WOLFSSL_KEIL
  176775. "adcs r2, r2, %[r]\n\t"
  176776. #elif defined(__clang__)
  176777. "adcs r2, %[r]\n\t"
  176778. #else
  176779. "adc r2, %[r]\n\t"
  176780. #endif
  176781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176782. "adds r3, r3, r6\n\t"
  176783. #else
  176784. "add r3, r3, r6\n\t"
  176785. #endif
  176786. #ifdef WOLFSSL_KEIL
  176787. "adcs r4, r4, %[r]\n\t"
  176788. #elif defined(__clang__)
  176789. "adcs r4, %[r]\n\t"
  176790. #else
  176791. "adc r4, %[r]\n\t"
  176792. #endif
  176793. #ifdef WOLFSSL_KEIL
  176794. "adcs r2, r2, %[r]\n\t"
  176795. #elif defined(__clang__)
  176796. "adcs r2, %[r]\n\t"
  176797. #else
  176798. "adc r2, %[r]\n\t"
  176799. #endif
  176800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176801. "lsrs r6, r7, #16\n\t"
  176802. #else
  176803. "lsr r6, r7, #16\n\t"
  176804. #endif
  176805. #ifdef WOLFSSL_KEIL
  176806. "muls r5, r6, r5\n\t"
  176807. #elif defined(__clang__)
  176808. "muls r5, r6\n\t"
  176809. #else
  176810. "mul r5, r6\n\t"
  176811. #endif
  176812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176813. "lsrs r6, r5, #16\n\t"
  176814. #else
  176815. "lsr r6, r5, #16\n\t"
  176816. #endif
  176817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176818. "lsls r5, r5, #16\n\t"
  176819. #else
  176820. "lsl r5, r5, #16\n\t"
  176821. #endif
  176822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176823. "adds r3, r3, r5\n\t"
  176824. #else
  176825. "add r3, r3, r5\n\t"
  176826. #endif
  176827. #ifdef WOLFSSL_KEIL
  176828. "adcs r4, r4, r6\n\t"
  176829. #elif defined(__clang__)
  176830. "adcs r4, r6\n\t"
  176831. #else
  176832. "adc r4, r6\n\t"
  176833. #endif
  176834. #ifdef WOLFSSL_KEIL
  176835. "adcs r2, r2, %[r]\n\t"
  176836. #elif defined(__clang__)
  176837. "adcs r2, %[r]\n\t"
  176838. #else
  176839. "adc r2, %[r]\n\t"
  176840. #endif
  176841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176842. "adds r3, r3, r5\n\t"
  176843. #else
  176844. "add r3, r3, r5\n\t"
  176845. #endif
  176846. #ifdef WOLFSSL_KEIL
  176847. "adcs r4, r4, r6\n\t"
  176848. #elif defined(__clang__)
  176849. "adcs r4, r6\n\t"
  176850. #else
  176851. "adc r4, r6\n\t"
  176852. #endif
  176853. #ifdef WOLFSSL_KEIL
  176854. "adcs r2, r2, %[r]\n\t"
  176855. #elif defined(__clang__)
  176856. "adcs r2, %[r]\n\t"
  176857. #else
  176858. "adc r2, %[r]\n\t"
  176859. #endif
  176860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176861. "lsrs r5, %[a], #16\n\t"
  176862. #else
  176863. "lsr r5, %[a], #16\n\t"
  176864. #endif
  176865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176866. "lsrs r6, r7, #16\n\t"
  176867. #else
  176868. "lsr r6, r7, #16\n\t"
  176869. #endif
  176870. #ifdef WOLFSSL_KEIL
  176871. "muls r6, r5, r6\n\t"
  176872. #elif defined(__clang__)
  176873. "muls r6, r5\n\t"
  176874. #else
  176875. "mul r6, r5\n\t"
  176876. #endif
  176877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176878. "adds r4, r4, r6\n\t"
  176879. #else
  176880. "add r4, r4, r6\n\t"
  176881. #endif
  176882. #ifdef WOLFSSL_KEIL
  176883. "adcs r2, r2, %[r]\n\t"
  176884. #elif defined(__clang__)
  176885. "adcs r2, %[r]\n\t"
  176886. #else
  176887. "adc r2, %[r]\n\t"
  176888. #endif
  176889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176890. "adds r4, r4, r6\n\t"
  176891. #else
  176892. "add r4, r4, r6\n\t"
  176893. #endif
  176894. #ifdef WOLFSSL_KEIL
  176895. "adcs r2, r2, %[r]\n\t"
  176896. #elif defined(__clang__)
  176897. "adcs r2, %[r]\n\t"
  176898. #else
  176899. "adc r2, %[r]\n\t"
  176900. #endif
  176901. "uxth r6, r7\n\t"
  176902. #ifdef WOLFSSL_KEIL
  176903. "muls r5, r6, r5\n\t"
  176904. #elif defined(__clang__)
  176905. "muls r5, r6\n\t"
  176906. #else
  176907. "mul r5, r6\n\t"
  176908. #endif
  176909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176910. "lsrs r6, r5, #16\n\t"
  176911. #else
  176912. "lsr r6, r5, #16\n\t"
  176913. #endif
  176914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176915. "lsls r5, r5, #16\n\t"
  176916. #else
  176917. "lsl r5, r5, #16\n\t"
  176918. #endif
  176919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176920. "adds r3, r3, r5\n\t"
  176921. #else
  176922. "add r3, r3, r5\n\t"
  176923. #endif
  176924. #ifdef WOLFSSL_KEIL
  176925. "adcs r4, r4, r6\n\t"
  176926. #elif defined(__clang__)
  176927. "adcs r4, r6\n\t"
  176928. #else
  176929. "adc r4, r6\n\t"
  176930. #endif
  176931. #ifdef WOLFSSL_KEIL
  176932. "adcs r2, r2, %[r]\n\t"
  176933. #elif defined(__clang__)
  176934. "adcs r2, %[r]\n\t"
  176935. #else
  176936. "adc r2, %[r]\n\t"
  176937. #endif
  176938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176939. "adds r3, r3, r5\n\t"
  176940. #else
  176941. "add r3, r3, r5\n\t"
  176942. #endif
  176943. #ifdef WOLFSSL_KEIL
  176944. "adcs r4, r4, r6\n\t"
  176945. #elif defined(__clang__)
  176946. "adcs r4, r6\n\t"
  176947. #else
  176948. "adc r4, r6\n\t"
  176949. #endif
  176950. #ifdef WOLFSSL_KEIL
  176951. "adcs r2, r2, %[r]\n\t"
  176952. #elif defined(__clang__)
  176953. "adcs r2, %[r]\n\t"
  176954. #else
  176955. "adc r2, %[r]\n\t"
  176956. #endif
  176957. "# A[8] * A[2]\n\t"
  176958. "mov %[a], r9\n\t"
  176959. "mov r7, r12\n\t"
  176960. "ldr %[a], [%[a], #32]\n\t"
  176961. "uxth r5, %[a]\n\t"
  176962. "uxth r6, r7\n\t"
  176963. #ifdef WOLFSSL_KEIL
  176964. "muls r6, r5, r6\n\t"
  176965. #elif defined(__clang__)
  176966. "muls r6, r5\n\t"
  176967. #else
  176968. "mul r6, r5\n\t"
  176969. #endif
  176970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176971. "adds r3, r3, r6\n\t"
  176972. #else
  176973. "add r3, r3, r6\n\t"
  176974. #endif
  176975. #ifdef WOLFSSL_KEIL
  176976. "adcs r4, r4, %[r]\n\t"
  176977. #elif defined(__clang__)
  176978. "adcs r4, %[r]\n\t"
  176979. #else
  176980. "adc r4, %[r]\n\t"
  176981. #endif
  176982. #ifdef WOLFSSL_KEIL
  176983. "adcs r2, r2, %[r]\n\t"
  176984. #elif defined(__clang__)
  176985. "adcs r2, %[r]\n\t"
  176986. #else
  176987. "adc r2, %[r]\n\t"
  176988. #endif
  176989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176990. "adds r3, r3, r6\n\t"
  176991. #else
  176992. "add r3, r3, r6\n\t"
  176993. #endif
  176994. #ifdef WOLFSSL_KEIL
  176995. "adcs r4, r4, %[r]\n\t"
  176996. #elif defined(__clang__)
  176997. "adcs r4, %[r]\n\t"
  176998. #else
  176999. "adc r4, %[r]\n\t"
  177000. #endif
  177001. #ifdef WOLFSSL_KEIL
  177002. "adcs r2, r2, %[r]\n\t"
  177003. #elif defined(__clang__)
  177004. "adcs r2, %[r]\n\t"
  177005. #else
  177006. "adc r2, %[r]\n\t"
  177007. #endif
  177008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177009. "lsrs r6, r7, #16\n\t"
  177010. #else
  177011. "lsr r6, r7, #16\n\t"
  177012. #endif
  177013. #ifdef WOLFSSL_KEIL
  177014. "muls r5, r6, r5\n\t"
  177015. #elif defined(__clang__)
  177016. "muls r5, r6\n\t"
  177017. #else
  177018. "mul r5, r6\n\t"
  177019. #endif
  177020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177021. "lsrs r6, r5, #16\n\t"
  177022. #else
  177023. "lsr r6, r5, #16\n\t"
  177024. #endif
  177025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177026. "lsls r5, r5, #16\n\t"
  177027. #else
  177028. "lsl r5, r5, #16\n\t"
  177029. #endif
  177030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177031. "adds r3, r3, r5\n\t"
  177032. #else
  177033. "add r3, r3, r5\n\t"
  177034. #endif
  177035. #ifdef WOLFSSL_KEIL
  177036. "adcs r4, r4, r6\n\t"
  177037. #elif defined(__clang__)
  177038. "adcs r4, r6\n\t"
  177039. #else
  177040. "adc r4, r6\n\t"
  177041. #endif
  177042. #ifdef WOLFSSL_KEIL
  177043. "adcs r2, r2, %[r]\n\t"
  177044. #elif defined(__clang__)
  177045. "adcs r2, %[r]\n\t"
  177046. #else
  177047. "adc r2, %[r]\n\t"
  177048. #endif
  177049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177050. "adds r3, r3, r5\n\t"
  177051. #else
  177052. "add r3, r3, r5\n\t"
  177053. #endif
  177054. #ifdef WOLFSSL_KEIL
  177055. "adcs r4, r4, r6\n\t"
  177056. #elif defined(__clang__)
  177057. "adcs r4, r6\n\t"
  177058. #else
  177059. "adc r4, r6\n\t"
  177060. #endif
  177061. #ifdef WOLFSSL_KEIL
  177062. "adcs r2, r2, %[r]\n\t"
  177063. #elif defined(__clang__)
  177064. "adcs r2, %[r]\n\t"
  177065. #else
  177066. "adc r2, %[r]\n\t"
  177067. #endif
  177068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177069. "lsrs r5, %[a], #16\n\t"
  177070. #else
  177071. "lsr r5, %[a], #16\n\t"
  177072. #endif
  177073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177074. "lsrs r6, r7, #16\n\t"
  177075. #else
  177076. "lsr r6, r7, #16\n\t"
  177077. #endif
  177078. #ifdef WOLFSSL_KEIL
  177079. "muls r6, r5, r6\n\t"
  177080. #elif defined(__clang__)
  177081. "muls r6, r5\n\t"
  177082. #else
  177083. "mul r6, r5\n\t"
  177084. #endif
  177085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177086. "adds r4, r4, r6\n\t"
  177087. #else
  177088. "add r4, r4, r6\n\t"
  177089. #endif
  177090. #ifdef WOLFSSL_KEIL
  177091. "adcs r2, r2, %[r]\n\t"
  177092. #elif defined(__clang__)
  177093. "adcs r2, %[r]\n\t"
  177094. #else
  177095. "adc r2, %[r]\n\t"
  177096. #endif
  177097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177098. "adds r4, r4, r6\n\t"
  177099. #else
  177100. "add r4, r4, r6\n\t"
  177101. #endif
  177102. #ifdef WOLFSSL_KEIL
  177103. "adcs r2, r2, %[r]\n\t"
  177104. #elif defined(__clang__)
  177105. "adcs r2, %[r]\n\t"
  177106. #else
  177107. "adc r2, %[r]\n\t"
  177108. #endif
  177109. "uxth r6, r7\n\t"
  177110. #ifdef WOLFSSL_KEIL
  177111. "muls r5, r6, r5\n\t"
  177112. #elif defined(__clang__)
  177113. "muls r5, r6\n\t"
  177114. #else
  177115. "mul r5, r6\n\t"
  177116. #endif
  177117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177118. "lsrs r6, r5, #16\n\t"
  177119. #else
  177120. "lsr r6, r5, #16\n\t"
  177121. #endif
  177122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177123. "lsls r5, r5, #16\n\t"
  177124. #else
  177125. "lsl r5, r5, #16\n\t"
  177126. #endif
  177127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177128. "adds r3, r3, r5\n\t"
  177129. #else
  177130. "add r3, r3, r5\n\t"
  177131. #endif
  177132. #ifdef WOLFSSL_KEIL
  177133. "adcs r4, r4, r6\n\t"
  177134. #elif defined(__clang__)
  177135. "adcs r4, r6\n\t"
  177136. #else
  177137. "adc r4, r6\n\t"
  177138. #endif
  177139. #ifdef WOLFSSL_KEIL
  177140. "adcs r2, r2, %[r]\n\t"
  177141. #elif defined(__clang__)
  177142. "adcs r2, %[r]\n\t"
  177143. #else
  177144. "adc r2, %[r]\n\t"
  177145. #endif
  177146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177147. "adds r3, r3, r5\n\t"
  177148. #else
  177149. "add r3, r3, r5\n\t"
  177150. #endif
  177151. #ifdef WOLFSSL_KEIL
  177152. "adcs r4, r4, r6\n\t"
  177153. #elif defined(__clang__)
  177154. "adcs r4, r6\n\t"
  177155. #else
  177156. "adc r4, r6\n\t"
  177157. #endif
  177158. #ifdef WOLFSSL_KEIL
  177159. "adcs r2, r2, %[r]\n\t"
  177160. #elif defined(__clang__)
  177161. "adcs r2, %[r]\n\t"
  177162. #else
  177163. "adc r2, %[r]\n\t"
  177164. #endif
  177165. "# A[7] * A[3]\n\t"
  177166. "mov %[a], r9\n\t"
  177167. "mov r7, lr\n\t"
  177168. "ldr %[a], [%[a], #28]\n\t"
  177169. "uxth r5, %[a]\n\t"
  177170. "uxth r6, r7\n\t"
  177171. #ifdef WOLFSSL_KEIL
  177172. "muls r6, r5, r6\n\t"
  177173. #elif defined(__clang__)
  177174. "muls r6, r5\n\t"
  177175. #else
  177176. "mul r6, r5\n\t"
  177177. #endif
  177178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177179. "adds r3, r3, r6\n\t"
  177180. #else
  177181. "add r3, r3, r6\n\t"
  177182. #endif
  177183. #ifdef WOLFSSL_KEIL
  177184. "adcs r4, r4, %[r]\n\t"
  177185. #elif defined(__clang__)
  177186. "adcs r4, %[r]\n\t"
  177187. #else
  177188. "adc r4, %[r]\n\t"
  177189. #endif
  177190. #ifdef WOLFSSL_KEIL
  177191. "adcs r2, r2, %[r]\n\t"
  177192. #elif defined(__clang__)
  177193. "adcs r2, %[r]\n\t"
  177194. #else
  177195. "adc r2, %[r]\n\t"
  177196. #endif
  177197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177198. "adds r3, r3, r6\n\t"
  177199. #else
  177200. "add r3, r3, r6\n\t"
  177201. #endif
  177202. #ifdef WOLFSSL_KEIL
  177203. "adcs r4, r4, %[r]\n\t"
  177204. #elif defined(__clang__)
  177205. "adcs r4, %[r]\n\t"
  177206. #else
  177207. "adc r4, %[r]\n\t"
  177208. #endif
  177209. #ifdef WOLFSSL_KEIL
  177210. "adcs r2, r2, %[r]\n\t"
  177211. #elif defined(__clang__)
  177212. "adcs r2, %[r]\n\t"
  177213. #else
  177214. "adc r2, %[r]\n\t"
  177215. #endif
  177216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177217. "lsrs r6, r7, #16\n\t"
  177218. #else
  177219. "lsr r6, r7, #16\n\t"
  177220. #endif
  177221. #ifdef WOLFSSL_KEIL
  177222. "muls r5, r6, r5\n\t"
  177223. #elif defined(__clang__)
  177224. "muls r5, r6\n\t"
  177225. #else
  177226. "mul r5, r6\n\t"
  177227. #endif
  177228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177229. "lsrs r6, r5, #16\n\t"
  177230. #else
  177231. "lsr r6, r5, #16\n\t"
  177232. #endif
  177233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177234. "lsls r5, r5, #16\n\t"
  177235. #else
  177236. "lsl r5, r5, #16\n\t"
  177237. #endif
  177238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177239. "adds r3, r3, r5\n\t"
  177240. #else
  177241. "add r3, r3, r5\n\t"
  177242. #endif
  177243. #ifdef WOLFSSL_KEIL
  177244. "adcs r4, r4, r6\n\t"
  177245. #elif defined(__clang__)
  177246. "adcs r4, r6\n\t"
  177247. #else
  177248. "adc r4, r6\n\t"
  177249. #endif
  177250. #ifdef WOLFSSL_KEIL
  177251. "adcs r2, r2, %[r]\n\t"
  177252. #elif defined(__clang__)
  177253. "adcs r2, %[r]\n\t"
  177254. #else
  177255. "adc r2, %[r]\n\t"
  177256. #endif
  177257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177258. "adds r3, r3, r5\n\t"
  177259. #else
  177260. "add r3, r3, r5\n\t"
  177261. #endif
  177262. #ifdef WOLFSSL_KEIL
  177263. "adcs r4, r4, r6\n\t"
  177264. #elif defined(__clang__)
  177265. "adcs r4, r6\n\t"
  177266. #else
  177267. "adc r4, r6\n\t"
  177268. #endif
  177269. #ifdef WOLFSSL_KEIL
  177270. "adcs r2, r2, %[r]\n\t"
  177271. #elif defined(__clang__)
  177272. "adcs r2, %[r]\n\t"
  177273. #else
  177274. "adc r2, %[r]\n\t"
  177275. #endif
  177276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177277. "lsrs r5, %[a], #16\n\t"
  177278. #else
  177279. "lsr r5, %[a], #16\n\t"
  177280. #endif
  177281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177282. "lsrs r6, r7, #16\n\t"
  177283. #else
  177284. "lsr r6, r7, #16\n\t"
  177285. #endif
  177286. #ifdef WOLFSSL_KEIL
  177287. "muls r6, r5, r6\n\t"
  177288. #elif defined(__clang__)
  177289. "muls r6, r5\n\t"
  177290. #else
  177291. "mul r6, r5\n\t"
  177292. #endif
  177293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177294. "adds r4, r4, r6\n\t"
  177295. #else
  177296. "add r4, r4, r6\n\t"
  177297. #endif
  177298. #ifdef WOLFSSL_KEIL
  177299. "adcs r2, r2, %[r]\n\t"
  177300. #elif defined(__clang__)
  177301. "adcs r2, %[r]\n\t"
  177302. #else
  177303. "adc r2, %[r]\n\t"
  177304. #endif
  177305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177306. "adds r4, r4, r6\n\t"
  177307. #else
  177308. "add r4, r4, r6\n\t"
  177309. #endif
  177310. #ifdef WOLFSSL_KEIL
  177311. "adcs r2, r2, %[r]\n\t"
  177312. #elif defined(__clang__)
  177313. "adcs r2, %[r]\n\t"
  177314. #else
  177315. "adc r2, %[r]\n\t"
  177316. #endif
  177317. "uxth r6, r7\n\t"
  177318. #ifdef WOLFSSL_KEIL
  177319. "muls r5, r6, r5\n\t"
  177320. #elif defined(__clang__)
  177321. "muls r5, r6\n\t"
  177322. #else
  177323. "mul r5, r6\n\t"
  177324. #endif
  177325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177326. "lsrs r6, r5, #16\n\t"
  177327. #else
  177328. "lsr r6, r5, #16\n\t"
  177329. #endif
  177330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177331. "lsls r5, r5, #16\n\t"
  177332. #else
  177333. "lsl r5, r5, #16\n\t"
  177334. #endif
  177335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177336. "adds r3, r3, r5\n\t"
  177337. #else
  177338. "add r3, r3, r5\n\t"
  177339. #endif
  177340. #ifdef WOLFSSL_KEIL
  177341. "adcs r4, r4, r6\n\t"
  177342. #elif defined(__clang__)
  177343. "adcs r4, r6\n\t"
  177344. #else
  177345. "adc r4, r6\n\t"
  177346. #endif
  177347. #ifdef WOLFSSL_KEIL
  177348. "adcs r2, r2, %[r]\n\t"
  177349. #elif defined(__clang__)
  177350. "adcs r2, %[r]\n\t"
  177351. #else
  177352. "adc r2, %[r]\n\t"
  177353. #endif
  177354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177355. "adds r3, r3, r5\n\t"
  177356. #else
  177357. "add r3, r3, r5\n\t"
  177358. #endif
  177359. #ifdef WOLFSSL_KEIL
  177360. "adcs r4, r4, r6\n\t"
  177361. #elif defined(__clang__)
  177362. "adcs r4, r6\n\t"
  177363. #else
  177364. "adc r4, r6\n\t"
  177365. #endif
  177366. #ifdef WOLFSSL_KEIL
  177367. "adcs r2, r2, %[r]\n\t"
  177368. #elif defined(__clang__)
  177369. "adcs r2, %[r]\n\t"
  177370. #else
  177371. "adc r2, %[r]\n\t"
  177372. #endif
  177373. "# A[6] * A[4]\n\t"
  177374. "mov %[a], r9\n\t"
  177375. "ldr r7, [%[a], #16]\n\t"
  177376. "ldr %[a], [%[a], #24]\n\t"
  177377. "uxth r5, %[a]\n\t"
  177378. "uxth r6, r7\n\t"
  177379. #ifdef WOLFSSL_KEIL
  177380. "muls r6, r5, r6\n\t"
  177381. #elif defined(__clang__)
  177382. "muls r6, r5\n\t"
  177383. #else
  177384. "mul r6, r5\n\t"
  177385. #endif
  177386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177387. "adds r3, r3, r6\n\t"
  177388. #else
  177389. "add r3, r3, r6\n\t"
  177390. #endif
  177391. #ifdef WOLFSSL_KEIL
  177392. "adcs r4, r4, %[r]\n\t"
  177393. #elif defined(__clang__)
  177394. "adcs r4, %[r]\n\t"
  177395. #else
  177396. "adc r4, %[r]\n\t"
  177397. #endif
  177398. #ifdef WOLFSSL_KEIL
  177399. "adcs r2, r2, %[r]\n\t"
  177400. #elif defined(__clang__)
  177401. "adcs r2, %[r]\n\t"
  177402. #else
  177403. "adc r2, %[r]\n\t"
  177404. #endif
  177405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177406. "adds r3, r3, r6\n\t"
  177407. #else
  177408. "add r3, r3, r6\n\t"
  177409. #endif
  177410. #ifdef WOLFSSL_KEIL
  177411. "adcs r4, r4, %[r]\n\t"
  177412. #elif defined(__clang__)
  177413. "adcs r4, %[r]\n\t"
  177414. #else
  177415. "adc r4, %[r]\n\t"
  177416. #endif
  177417. #ifdef WOLFSSL_KEIL
  177418. "adcs r2, r2, %[r]\n\t"
  177419. #elif defined(__clang__)
  177420. "adcs r2, %[r]\n\t"
  177421. #else
  177422. "adc r2, %[r]\n\t"
  177423. #endif
  177424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177425. "lsrs r6, r7, #16\n\t"
  177426. #else
  177427. "lsr r6, r7, #16\n\t"
  177428. #endif
  177429. #ifdef WOLFSSL_KEIL
  177430. "muls r5, r6, r5\n\t"
  177431. #elif defined(__clang__)
  177432. "muls r5, r6\n\t"
  177433. #else
  177434. "mul r5, r6\n\t"
  177435. #endif
  177436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177437. "lsrs r6, r5, #16\n\t"
  177438. #else
  177439. "lsr r6, r5, #16\n\t"
  177440. #endif
  177441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177442. "lsls r5, r5, #16\n\t"
  177443. #else
  177444. "lsl r5, r5, #16\n\t"
  177445. #endif
  177446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177447. "adds r3, r3, r5\n\t"
  177448. #else
  177449. "add r3, r3, r5\n\t"
  177450. #endif
  177451. #ifdef WOLFSSL_KEIL
  177452. "adcs r4, r4, r6\n\t"
  177453. #elif defined(__clang__)
  177454. "adcs r4, r6\n\t"
  177455. #else
  177456. "adc r4, r6\n\t"
  177457. #endif
  177458. #ifdef WOLFSSL_KEIL
  177459. "adcs r2, r2, %[r]\n\t"
  177460. #elif defined(__clang__)
  177461. "adcs r2, %[r]\n\t"
  177462. #else
  177463. "adc r2, %[r]\n\t"
  177464. #endif
  177465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177466. "adds r3, r3, r5\n\t"
  177467. #else
  177468. "add r3, r3, r5\n\t"
  177469. #endif
  177470. #ifdef WOLFSSL_KEIL
  177471. "adcs r4, r4, r6\n\t"
  177472. #elif defined(__clang__)
  177473. "adcs r4, r6\n\t"
  177474. #else
  177475. "adc r4, r6\n\t"
  177476. #endif
  177477. #ifdef WOLFSSL_KEIL
  177478. "adcs r2, r2, %[r]\n\t"
  177479. #elif defined(__clang__)
  177480. "adcs r2, %[r]\n\t"
  177481. #else
  177482. "adc r2, %[r]\n\t"
  177483. #endif
  177484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177485. "lsrs r5, %[a], #16\n\t"
  177486. #else
  177487. "lsr r5, %[a], #16\n\t"
  177488. #endif
  177489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177490. "lsrs r6, r7, #16\n\t"
  177491. #else
  177492. "lsr r6, r7, #16\n\t"
  177493. #endif
  177494. #ifdef WOLFSSL_KEIL
  177495. "muls r6, r5, r6\n\t"
  177496. #elif defined(__clang__)
  177497. "muls r6, r5\n\t"
  177498. #else
  177499. "mul r6, r5\n\t"
  177500. #endif
  177501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177502. "adds r4, r4, r6\n\t"
  177503. #else
  177504. "add r4, r4, r6\n\t"
  177505. #endif
  177506. #ifdef WOLFSSL_KEIL
  177507. "adcs r2, r2, %[r]\n\t"
  177508. #elif defined(__clang__)
  177509. "adcs r2, %[r]\n\t"
  177510. #else
  177511. "adc r2, %[r]\n\t"
  177512. #endif
  177513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177514. "adds r4, r4, r6\n\t"
  177515. #else
  177516. "add r4, r4, r6\n\t"
  177517. #endif
  177518. #ifdef WOLFSSL_KEIL
  177519. "adcs r2, r2, %[r]\n\t"
  177520. #elif defined(__clang__)
  177521. "adcs r2, %[r]\n\t"
  177522. #else
  177523. "adc r2, %[r]\n\t"
  177524. #endif
  177525. "uxth r6, r7\n\t"
  177526. #ifdef WOLFSSL_KEIL
  177527. "muls r5, r6, r5\n\t"
  177528. #elif defined(__clang__)
  177529. "muls r5, r6\n\t"
  177530. #else
  177531. "mul r5, r6\n\t"
  177532. #endif
  177533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177534. "lsrs r6, r5, #16\n\t"
  177535. #else
  177536. "lsr r6, r5, #16\n\t"
  177537. #endif
  177538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177539. "lsls r5, r5, #16\n\t"
  177540. #else
  177541. "lsl r5, r5, #16\n\t"
  177542. #endif
  177543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177544. "adds r3, r3, r5\n\t"
  177545. #else
  177546. "add r3, r3, r5\n\t"
  177547. #endif
  177548. #ifdef WOLFSSL_KEIL
  177549. "adcs r4, r4, r6\n\t"
  177550. #elif defined(__clang__)
  177551. "adcs r4, r6\n\t"
  177552. #else
  177553. "adc r4, r6\n\t"
  177554. #endif
  177555. #ifdef WOLFSSL_KEIL
  177556. "adcs r2, r2, %[r]\n\t"
  177557. #elif defined(__clang__)
  177558. "adcs r2, %[r]\n\t"
  177559. #else
  177560. "adc r2, %[r]\n\t"
  177561. #endif
  177562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177563. "adds r3, r3, r5\n\t"
  177564. #else
  177565. "add r3, r3, r5\n\t"
  177566. #endif
  177567. #ifdef WOLFSSL_KEIL
  177568. "adcs r4, r4, r6\n\t"
  177569. #elif defined(__clang__)
  177570. "adcs r4, r6\n\t"
  177571. #else
  177572. "adc r4, r6\n\t"
  177573. #endif
  177574. #ifdef WOLFSSL_KEIL
  177575. "adcs r2, r2, %[r]\n\t"
  177576. #elif defined(__clang__)
  177577. "adcs r2, %[r]\n\t"
  177578. #else
  177579. "adc r2, %[r]\n\t"
  177580. #endif
  177581. "# A[5] * A[5]\n\t"
  177582. "mov %[a], r9\n\t"
  177583. "ldr r7, [%[a], #20]\n\t"
  177584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177585. "lsrs r6, r7, #16\n\t"
  177586. #else
  177587. "lsr r6, r7, #16\n\t"
  177588. #endif
  177589. "uxth r5, r7\n\t"
  177590. #ifdef WOLFSSL_KEIL
  177591. "muls r5, r5, r5\n\t"
  177592. #elif defined(__clang__)
  177593. "muls r5, r5\n\t"
  177594. #else
  177595. "mul r5, r5\n\t"
  177596. #endif
  177597. #ifdef WOLFSSL_KEIL
  177598. "muls r6, r6, r6\n\t"
  177599. #elif defined(__clang__)
  177600. "muls r6, r6\n\t"
  177601. #else
  177602. "mul r6, r6\n\t"
  177603. #endif
  177604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177605. "adds r3, r3, r5\n\t"
  177606. #else
  177607. "add r3, r3, r5\n\t"
  177608. #endif
  177609. #ifdef WOLFSSL_KEIL
  177610. "adcs r4, r4, r6\n\t"
  177611. #elif defined(__clang__)
  177612. "adcs r4, r6\n\t"
  177613. #else
  177614. "adc r4, r6\n\t"
  177615. #endif
  177616. #ifdef WOLFSSL_KEIL
  177617. "adcs r2, r2, %[r]\n\t"
  177618. #elif defined(__clang__)
  177619. "adcs r2, %[r]\n\t"
  177620. #else
  177621. "adc r2, %[r]\n\t"
  177622. #endif
  177623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177624. "lsrs r6, r7, #16\n\t"
  177625. #else
  177626. "lsr r6, r7, #16\n\t"
  177627. #endif
  177628. "uxth r5, r7\n\t"
  177629. #ifdef WOLFSSL_KEIL
  177630. "muls r5, r6, r5\n\t"
  177631. #elif defined(__clang__)
  177632. "muls r5, r6\n\t"
  177633. #else
  177634. "mul r5, r6\n\t"
  177635. #endif
  177636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177637. "lsrs r6, r5, #15\n\t"
  177638. #else
  177639. "lsr r6, r5, #15\n\t"
  177640. #endif
  177641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177642. "lsls r5, r5, #17\n\t"
  177643. #else
  177644. "lsl r5, r5, #17\n\t"
  177645. #endif
  177646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177647. "adds r3, r3, r5\n\t"
  177648. #else
  177649. "add r3, r3, r5\n\t"
  177650. #endif
  177651. #ifdef WOLFSSL_KEIL
  177652. "adcs r4, r4, r6\n\t"
  177653. #elif defined(__clang__)
  177654. "adcs r4, r6\n\t"
  177655. #else
  177656. "adc r4, r6\n\t"
  177657. #endif
  177658. #ifdef WOLFSSL_KEIL
  177659. "adcs r2, r2, %[r]\n\t"
  177660. #elif defined(__clang__)
  177661. "adcs r2, %[r]\n\t"
  177662. #else
  177663. "adc r2, %[r]\n\t"
  177664. #endif
  177665. "str r3, [sp, #40]\n\t"
  177666. "# A[6] * A[5]\n\t"
  177667. "movs r3, #0\n\t"
  177668. "ldr %[a], [%[a], #24]\n\t"
  177669. "uxth r5, %[a]\n\t"
  177670. "uxth r6, r7\n\t"
  177671. #ifdef WOLFSSL_KEIL
  177672. "muls r6, r5, r6\n\t"
  177673. #elif defined(__clang__)
  177674. "muls r6, r5\n\t"
  177675. #else
  177676. "mul r6, r5\n\t"
  177677. #endif
  177678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177679. "adds r4, r4, r6\n\t"
  177680. #else
  177681. "add r4, r4, r6\n\t"
  177682. #endif
  177683. #ifdef WOLFSSL_KEIL
  177684. "adcs r2, r2, %[r]\n\t"
  177685. #elif defined(__clang__)
  177686. "adcs r2, %[r]\n\t"
  177687. #else
  177688. "adc r2, %[r]\n\t"
  177689. #endif
  177690. #ifdef WOLFSSL_KEIL
  177691. "adcs r3, r3, %[r]\n\t"
  177692. #elif defined(__clang__)
  177693. "adcs r3, %[r]\n\t"
  177694. #else
  177695. "adc r3, %[r]\n\t"
  177696. #endif
  177697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177698. "adds r4, r4, r6\n\t"
  177699. #else
  177700. "add r4, r4, r6\n\t"
  177701. #endif
  177702. #ifdef WOLFSSL_KEIL
  177703. "adcs r2, r2, %[r]\n\t"
  177704. #elif defined(__clang__)
  177705. "adcs r2, %[r]\n\t"
  177706. #else
  177707. "adc r2, %[r]\n\t"
  177708. #endif
  177709. #ifdef WOLFSSL_KEIL
  177710. "adcs r3, r3, %[r]\n\t"
  177711. #elif defined(__clang__)
  177712. "adcs r3, %[r]\n\t"
  177713. #else
  177714. "adc r3, %[r]\n\t"
  177715. #endif
  177716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177717. "lsrs r6, r7, #16\n\t"
  177718. #else
  177719. "lsr r6, r7, #16\n\t"
  177720. #endif
  177721. #ifdef WOLFSSL_KEIL
  177722. "muls r5, r6, r5\n\t"
  177723. #elif defined(__clang__)
  177724. "muls r5, r6\n\t"
  177725. #else
  177726. "mul r5, r6\n\t"
  177727. #endif
  177728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177729. "lsrs r6, r5, #16\n\t"
  177730. #else
  177731. "lsr r6, r5, #16\n\t"
  177732. #endif
  177733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177734. "lsls r5, r5, #16\n\t"
  177735. #else
  177736. "lsl r5, r5, #16\n\t"
  177737. #endif
  177738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177739. "adds r4, r4, r5\n\t"
  177740. #else
  177741. "add r4, r4, r5\n\t"
  177742. #endif
  177743. #ifdef WOLFSSL_KEIL
  177744. "adcs r2, r2, r6\n\t"
  177745. #elif defined(__clang__)
  177746. "adcs r2, r6\n\t"
  177747. #else
  177748. "adc r2, r6\n\t"
  177749. #endif
  177750. #ifdef WOLFSSL_KEIL
  177751. "adcs r3, r3, %[r]\n\t"
  177752. #elif defined(__clang__)
  177753. "adcs r3, %[r]\n\t"
  177754. #else
  177755. "adc r3, %[r]\n\t"
  177756. #endif
  177757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177758. "adds r4, r4, r5\n\t"
  177759. #else
  177760. "add r4, r4, r5\n\t"
  177761. #endif
  177762. #ifdef WOLFSSL_KEIL
  177763. "adcs r2, r2, r6\n\t"
  177764. #elif defined(__clang__)
  177765. "adcs r2, r6\n\t"
  177766. #else
  177767. "adc r2, r6\n\t"
  177768. #endif
  177769. #ifdef WOLFSSL_KEIL
  177770. "adcs r3, r3, %[r]\n\t"
  177771. #elif defined(__clang__)
  177772. "adcs r3, %[r]\n\t"
  177773. #else
  177774. "adc r3, %[r]\n\t"
  177775. #endif
  177776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177777. "lsrs r5, %[a], #16\n\t"
  177778. #else
  177779. "lsr r5, %[a], #16\n\t"
  177780. #endif
  177781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177782. "lsrs r6, r7, #16\n\t"
  177783. #else
  177784. "lsr r6, r7, #16\n\t"
  177785. #endif
  177786. #ifdef WOLFSSL_KEIL
  177787. "muls r6, r5, r6\n\t"
  177788. #elif defined(__clang__)
  177789. "muls r6, r5\n\t"
  177790. #else
  177791. "mul r6, r5\n\t"
  177792. #endif
  177793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177794. "adds r2, r2, r6\n\t"
  177795. #else
  177796. "add r2, r2, r6\n\t"
  177797. #endif
  177798. #ifdef WOLFSSL_KEIL
  177799. "adcs r3, r3, %[r]\n\t"
  177800. #elif defined(__clang__)
  177801. "adcs r3, %[r]\n\t"
  177802. #else
  177803. "adc r3, %[r]\n\t"
  177804. #endif
  177805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177806. "adds r2, r2, r6\n\t"
  177807. #else
  177808. "add r2, r2, r6\n\t"
  177809. #endif
  177810. #ifdef WOLFSSL_KEIL
  177811. "adcs r3, r3, %[r]\n\t"
  177812. #elif defined(__clang__)
  177813. "adcs r3, %[r]\n\t"
  177814. #else
  177815. "adc r3, %[r]\n\t"
  177816. #endif
  177817. "uxth r6, r7\n\t"
  177818. #ifdef WOLFSSL_KEIL
  177819. "muls r5, r6, r5\n\t"
  177820. #elif defined(__clang__)
  177821. "muls r5, r6\n\t"
  177822. #else
  177823. "mul r5, r6\n\t"
  177824. #endif
  177825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177826. "lsrs r6, r5, #16\n\t"
  177827. #else
  177828. "lsr r6, r5, #16\n\t"
  177829. #endif
  177830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177831. "lsls r5, r5, #16\n\t"
  177832. #else
  177833. "lsl r5, r5, #16\n\t"
  177834. #endif
  177835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177836. "adds r4, r4, r5\n\t"
  177837. #else
  177838. "add r4, r4, r5\n\t"
  177839. #endif
  177840. #ifdef WOLFSSL_KEIL
  177841. "adcs r2, r2, r6\n\t"
  177842. #elif defined(__clang__)
  177843. "adcs r2, r6\n\t"
  177844. #else
  177845. "adc r2, r6\n\t"
  177846. #endif
  177847. #ifdef WOLFSSL_KEIL
  177848. "adcs r3, r3, %[r]\n\t"
  177849. #elif defined(__clang__)
  177850. "adcs r3, %[r]\n\t"
  177851. #else
  177852. "adc r3, %[r]\n\t"
  177853. #endif
  177854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177855. "adds r4, r4, r5\n\t"
  177856. #else
  177857. "add r4, r4, r5\n\t"
  177858. #endif
  177859. #ifdef WOLFSSL_KEIL
  177860. "adcs r2, r2, r6\n\t"
  177861. #elif defined(__clang__)
  177862. "adcs r2, r6\n\t"
  177863. #else
  177864. "adc r2, r6\n\t"
  177865. #endif
  177866. #ifdef WOLFSSL_KEIL
  177867. "adcs r3, r3, %[r]\n\t"
  177868. #elif defined(__clang__)
  177869. "adcs r3, %[r]\n\t"
  177870. #else
  177871. "adc r3, %[r]\n\t"
  177872. #endif
  177873. "# A[7] * A[4]\n\t"
  177874. "mov %[a], r9\n\t"
  177875. "ldr r7, [%[a], #16]\n\t"
  177876. "ldr %[a], [%[a], #28]\n\t"
  177877. "uxth r5, %[a]\n\t"
  177878. "uxth r6, r7\n\t"
  177879. #ifdef WOLFSSL_KEIL
  177880. "muls r6, r5, r6\n\t"
  177881. #elif defined(__clang__)
  177882. "muls r6, r5\n\t"
  177883. #else
  177884. "mul r6, r5\n\t"
  177885. #endif
  177886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177887. "adds r4, r4, r6\n\t"
  177888. #else
  177889. "add r4, r4, r6\n\t"
  177890. #endif
  177891. #ifdef WOLFSSL_KEIL
  177892. "adcs r2, r2, %[r]\n\t"
  177893. #elif defined(__clang__)
  177894. "adcs r2, %[r]\n\t"
  177895. #else
  177896. "adc r2, %[r]\n\t"
  177897. #endif
  177898. #ifdef WOLFSSL_KEIL
  177899. "adcs r3, r3, %[r]\n\t"
  177900. #elif defined(__clang__)
  177901. "adcs r3, %[r]\n\t"
  177902. #else
  177903. "adc r3, %[r]\n\t"
  177904. #endif
  177905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177906. "adds r4, r4, r6\n\t"
  177907. #else
  177908. "add r4, r4, r6\n\t"
  177909. #endif
  177910. #ifdef WOLFSSL_KEIL
  177911. "adcs r2, r2, %[r]\n\t"
  177912. #elif defined(__clang__)
  177913. "adcs r2, %[r]\n\t"
  177914. #else
  177915. "adc r2, %[r]\n\t"
  177916. #endif
  177917. #ifdef WOLFSSL_KEIL
  177918. "adcs r3, r3, %[r]\n\t"
  177919. #elif defined(__clang__)
  177920. "adcs r3, %[r]\n\t"
  177921. #else
  177922. "adc r3, %[r]\n\t"
  177923. #endif
  177924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177925. "lsrs r6, r7, #16\n\t"
  177926. #else
  177927. "lsr r6, r7, #16\n\t"
  177928. #endif
  177929. #ifdef WOLFSSL_KEIL
  177930. "muls r5, r6, r5\n\t"
  177931. #elif defined(__clang__)
  177932. "muls r5, r6\n\t"
  177933. #else
  177934. "mul r5, r6\n\t"
  177935. #endif
  177936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177937. "lsrs r6, r5, #16\n\t"
  177938. #else
  177939. "lsr r6, r5, #16\n\t"
  177940. #endif
  177941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177942. "lsls r5, r5, #16\n\t"
  177943. #else
  177944. "lsl r5, r5, #16\n\t"
  177945. #endif
  177946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177947. "adds r4, r4, r5\n\t"
  177948. #else
  177949. "add r4, r4, r5\n\t"
  177950. #endif
  177951. #ifdef WOLFSSL_KEIL
  177952. "adcs r2, r2, r6\n\t"
  177953. #elif defined(__clang__)
  177954. "adcs r2, r6\n\t"
  177955. #else
  177956. "adc r2, r6\n\t"
  177957. #endif
  177958. #ifdef WOLFSSL_KEIL
  177959. "adcs r3, r3, %[r]\n\t"
  177960. #elif defined(__clang__)
  177961. "adcs r3, %[r]\n\t"
  177962. #else
  177963. "adc r3, %[r]\n\t"
  177964. #endif
  177965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177966. "adds r4, r4, r5\n\t"
  177967. #else
  177968. "add r4, r4, r5\n\t"
  177969. #endif
  177970. #ifdef WOLFSSL_KEIL
  177971. "adcs r2, r2, r6\n\t"
  177972. #elif defined(__clang__)
  177973. "adcs r2, r6\n\t"
  177974. #else
  177975. "adc r2, r6\n\t"
  177976. #endif
  177977. #ifdef WOLFSSL_KEIL
  177978. "adcs r3, r3, %[r]\n\t"
  177979. #elif defined(__clang__)
  177980. "adcs r3, %[r]\n\t"
  177981. #else
  177982. "adc r3, %[r]\n\t"
  177983. #endif
  177984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177985. "lsrs r5, %[a], #16\n\t"
  177986. #else
  177987. "lsr r5, %[a], #16\n\t"
  177988. #endif
  177989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177990. "lsrs r6, r7, #16\n\t"
  177991. #else
  177992. "lsr r6, r7, #16\n\t"
  177993. #endif
  177994. #ifdef WOLFSSL_KEIL
  177995. "muls r6, r5, r6\n\t"
  177996. #elif defined(__clang__)
  177997. "muls r6, r5\n\t"
  177998. #else
  177999. "mul r6, r5\n\t"
  178000. #endif
  178001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178002. "adds r2, r2, r6\n\t"
  178003. #else
  178004. "add r2, r2, r6\n\t"
  178005. #endif
  178006. #ifdef WOLFSSL_KEIL
  178007. "adcs r3, r3, %[r]\n\t"
  178008. #elif defined(__clang__)
  178009. "adcs r3, %[r]\n\t"
  178010. #else
  178011. "adc r3, %[r]\n\t"
  178012. #endif
  178013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178014. "adds r2, r2, r6\n\t"
  178015. #else
  178016. "add r2, r2, r6\n\t"
  178017. #endif
  178018. #ifdef WOLFSSL_KEIL
  178019. "adcs r3, r3, %[r]\n\t"
  178020. #elif defined(__clang__)
  178021. "adcs r3, %[r]\n\t"
  178022. #else
  178023. "adc r3, %[r]\n\t"
  178024. #endif
  178025. "uxth r6, r7\n\t"
  178026. #ifdef WOLFSSL_KEIL
  178027. "muls r5, r6, r5\n\t"
  178028. #elif defined(__clang__)
  178029. "muls r5, r6\n\t"
  178030. #else
  178031. "mul r5, r6\n\t"
  178032. #endif
  178033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178034. "lsrs r6, r5, #16\n\t"
  178035. #else
  178036. "lsr r6, r5, #16\n\t"
  178037. #endif
  178038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178039. "lsls r5, r5, #16\n\t"
  178040. #else
  178041. "lsl r5, r5, #16\n\t"
  178042. #endif
  178043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178044. "adds r4, r4, r5\n\t"
  178045. #else
  178046. "add r4, r4, r5\n\t"
  178047. #endif
  178048. #ifdef WOLFSSL_KEIL
  178049. "adcs r2, r2, r6\n\t"
  178050. #elif defined(__clang__)
  178051. "adcs r2, r6\n\t"
  178052. #else
  178053. "adc r2, r6\n\t"
  178054. #endif
  178055. #ifdef WOLFSSL_KEIL
  178056. "adcs r3, r3, %[r]\n\t"
  178057. #elif defined(__clang__)
  178058. "adcs r3, %[r]\n\t"
  178059. #else
  178060. "adc r3, %[r]\n\t"
  178061. #endif
  178062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178063. "adds r4, r4, r5\n\t"
  178064. #else
  178065. "add r4, r4, r5\n\t"
  178066. #endif
  178067. #ifdef WOLFSSL_KEIL
  178068. "adcs r2, r2, r6\n\t"
  178069. #elif defined(__clang__)
  178070. "adcs r2, r6\n\t"
  178071. #else
  178072. "adc r2, r6\n\t"
  178073. #endif
  178074. #ifdef WOLFSSL_KEIL
  178075. "adcs r3, r3, %[r]\n\t"
  178076. #elif defined(__clang__)
  178077. "adcs r3, %[r]\n\t"
  178078. #else
  178079. "adc r3, %[r]\n\t"
  178080. #endif
  178081. "# A[8] * A[3]\n\t"
  178082. "mov %[a], r9\n\t"
  178083. "mov r7, lr\n\t"
  178084. "ldr %[a], [%[a], #32]\n\t"
  178085. "uxth r5, %[a]\n\t"
  178086. "uxth r6, r7\n\t"
  178087. #ifdef WOLFSSL_KEIL
  178088. "muls r6, r5, r6\n\t"
  178089. #elif defined(__clang__)
  178090. "muls r6, r5\n\t"
  178091. #else
  178092. "mul r6, r5\n\t"
  178093. #endif
  178094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178095. "adds r4, r4, r6\n\t"
  178096. #else
  178097. "add r4, r4, r6\n\t"
  178098. #endif
  178099. #ifdef WOLFSSL_KEIL
  178100. "adcs r2, r2, %[r]\n\t"
  178101. #elif defined(__clang__)
  178102. "adcs r2, %[r]\n\t"
  178103. #else
  178104. "adc r2, %[r]\n\t"
  178105. #endif
  178106. #ifdef WOLFSSL_KEIL
  178107. "adcs r3, r3, %[r]\n\t"
  178108. #elif defined(__clang__)
  178109. "adcs r3, %[r]\n\t"
  178110. #else
  178111. "adc r3, %[r]\n\t"
  178112. #endif
  178113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178114. "adds r4, r4, r6\n\t"
  178115. #else
  178116. "add r4, r4, r6\n\t"
  178117. #endif
  178118. #ifdef WOLFSSL_KEIL
  178119. "adcs r2, r2, %[r]\n\t"
  178120. #elif defined(__clang__)
  178121. "adcs r2, %[r]\n\t"
  178122. #else
  178123. "adc r2, %[r]\n\t"
  178124. #endif
  178125. #ifdef WOLFSSL_KEIL
  178126. "adcs r3, r3, %[r]\n\t"
  178127. #elif defined(__clang__)
  178128. "adcs r3, %[r]\n\t"
  178129. #else
  178130. "adc r3, %[r]\n\t"
  178131. #endif
  178132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178133. "lsrs r6, r7, #16\n\t"
  178134. #else
  178135. "lsr r6, r7, #16\n\t"
  178136. #endif
  178137. #ifdef WOLFSSL_KEIL
  178138. "muls r5, r6, r5\n\t"
  178139. #elif defined(__clang__)
  178140. "muls r5, r6\n\t"
  178141. #else
  178142. "mul r5, r6\n\t"
  178143. #endif
  178144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178145. "lsrs r6, r5, #16\n\t"
  178146. #else
  178147. "lsr r6, r5, #16\n\t"
  178148. #endif
  178149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178150. "lsls r5, r5, #16\n\t"
  178151. #else
  178152. "lsl r5, r5, #16\n\t"
  178153. #endif
  178154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178155. "adds r4, r4, r5\n\t"
  178156. #else
  178157. "add r4, r4, r5\n\t"
  178158. #endif
  178159. #ifdef WOLFSSL_KEIL
  178160. "adcs r2, r2, r6\n\t"
  178161. #elif defined(__clang__)
  178162. "adcs r2, r6\n\t"
  178163. #else
  178164. "adc r2, r6\n\t"
  178165. #endif
  178166. #ifdef WOLFSSL_KEIL
  178167. "adcs r3, r3, %[r]\n\t"
  178168. #elif defined(__clang__)
  178169. "adcs r3, %[r]\n\t"
  178170. #else
  178171. "adc r3, %[r]\n\t"
  178172. #endif
  178173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178174. "adds r4, r4, r5\n\t"
  178175. #else
  178176. "add r4, r4, r5\n\t"
  178177. #endif
  178178. #ifdef WOLFSSL_KEIL
  178179. "adcs r2, r2, r6\n\t"
  178180. #elif defined(__clang__)
  178181. "adcs r2, r6\n\t"
  178182. #else
  178183. "adc r2, r6\n\t"
  178184. #endif
  178185. #ifdef WOLFSSL_KEIL
  178186. "adcs r3, r3, %[r]\n\t"
  178187. #elif defined(__clang__)
  178188. "adcs r3, %[r]\n\t"
  178189. #else
  178190. "adc r3, %[r]\n\t"
  178191. #endif
  178192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178193. "lsrs r5, %[a], #16\n\t"
  178194. #else
  178195. "lsr r5, %[a], #16\n\t"
  178196. #endif
  178197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178198. "lsrs r6, r7, #16\n\t"
  178199. #else
  178200. "lsr r6, r7, #16\n\t"
  178201. #endif
  178202. #ifdef WOLFSSL_KEIL
  178203. "muls r6, r5, r6\n\t"
  178204. #elif defined(__clang__)
  178205. "muls r6, r5\n\t"
  178206. #else
  178207. "mul r6, r5\n\t"
  178208. #endif
  178209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178210. "adds r2, r2, r6\n\t"
  178211. #else
  178212. "add r2, r2, r6\n\t"
  178213. #endif
  178214. #ifdef WOLFSSL_KEIL
  178215. "adcs r3, r3, %[r]\n\t"
  178216. #elif defined(__clang__)
  178217. "adcs r3, %[r]\n\t"
  178218. #else
  178219. "adc r3, %[r]\n\t"
  178220. #endif
  178221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178222. "adds r2, r2, r6\n\t"
  178223. #else
  178224. "add r2, r2, r6\n\t"
  178225. #endif
  178226. #ifdef WOLFSSL_KEIL
  178227. "adcs r3, r3, %[r]\n\t"
  178228. #elif defined(__clang__)
  178229. "adcs r3, %[r]\n\t"
  178230. #else
  178231. "adc r3, %[r]\n\t"
  178232. #endif
  178233. "uxth r6, r7\n\t"
  178234. #ifdef WOLFSSL_KEIL
  178235. "muls r5, r6, r5\n\t"
  178236. #elif defined(__clang__)
  178237. "muls r5, r6\n\t"
  178238. #else
  178239. "mul r5, r6\n\t"
  178240. #endif
  178241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178242. "lsrs r6, r5, #16\n\t"
  178243. #else
  178244. "lsr r6, r5, #16\n\t"
  178245. #endif
  178246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178247. "lsls r5, r5, #16\n\t"
  178248. #else
  178249. "lsl r5, r5, #16\n\t"
  178250. #endif
  178251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178252. "adds r4, r4, r5\n\t"
  178253. #else
  178254. "add r4, r4, r5\n\t"
  178255. #endif
  178256. #ifdef WOLFSSL_KEIL
  178257. "adcs r2, r2, r6\n\t"
  178258. #elif defined(__clang__)
  178259. "adcs r2, r6\n\t"
  178260. #else
  178261. "adc r2, r6\n\t"
  178262. #endif
  178263. #ifdef WOLFSSL_KEIL
  178264. "adcs r3, r3, %[r]\n\t"
  178265. #elif defined(__clang__)
  178266. "adcs r3, %[r]\n\t"
  178267. #else
  178268. "adc r3, %[r]\n\t"
  178269. #endif
  178270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178271. "adds r4, r4, r5\n\t"
  178272. #else
  178273. "add r4, r4, r5\n\t"
  178274. #endif
  178275. #ifdef WOLFSSL_KEIL
  178276. "adcs r2, r2, r6\n\t"
  178277. #elif defined(__clang__)
  178278. "adcs r2, r6\n\t"
  178279. #else
  178280. "adc r2, r6\n\t"
  178281. #endif
  178282. #ifdef WOLFSSL_KEIL
  178283. "adcs r3, r3, %[r]\n\t"
  178284. #elif defined(__clang__)
  178285. "adcs r3, %[r]\n\t"
  178286. #else
  178287. "adc r3, %[r]\n\t"
  178288. #endif
  178289. "# A[9] * A[2]\n\t"
  178290. "mov %[a], r9\n\t"
  178291. "mov r7, r12\n\t"
  178292. "ldr %[a], [%[a], #36]\n\t"
  178293. "uxth r5, %[a]\n\t"
  178294. "uxth r6, r7\n\t"
  178295. #ifdef WOLFSSL_KEIL
  178296. "muls r6, r5, r6\n\t"
  178297. #elif defined(__clang__)
  178298. "muls r6, r5\n\t"
  178299. #else
  178300. "mul r6, r5\n\t"
  178301. #endif
  178302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178303. "adds r4, r4, r6\n\t"
  178304. #else
  178305. "add r4, r4, r6\n\t"
  178306. #endif
  178307. #ifdef WOLFSSL_KEIL
  178308. "adcs r2, r2, %[r]\n\t"
  178309. #elif defined(__clang__)
  178310. "adcs r2, %[r]\n\t"
  178311. #else
  178312. "adc r2, %[r]\n\t"
  178313. #endif
  178314. #ifdef WOLFSSL_KEIL
  178315. "adcs r3, r3, %[r]\n\t"
  178316. #elif defined(__clang__)
  178317. "adcs r3, %[r]\n\t"
  178318. #else
  178319. "adc r3, %[r]\n\t"
  178320. #endif
  178321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178322. "adds r4, r4, r6\n\t"
  178323. #else
  178324. "add r4, r4, r6\n\t"
  178325. #endif
  178326. #ifdef WOLFSSL_KEIL
  178327. "adcs r2, r2, %[r]\n\t"
  178328. #elif defined(__clang__)
  178329. "adcs r2, %[r]\n\t"
  178330. #else
  178331. "adc r2, %[r]\n\t"
  178332. #endif
  178333. #ifdef WOLFSSL_KEIL
  178334. "adcs r3, r3, %[r]\n\t"
  178335. #elif defined(__clang__)
  178336. "adcs r3, %[r]\n\t"
  178337. #else
  178338. "adc r3, %[r]\n\t"
  178339. #endif
  178340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178341. "lsrs r6, r7, #16\n\t"
  178342. #else
  178343. "lsr r6, r7, #16\n\t"
  178344. #endif
  178345. #ifdef WOLFSSL_KEIL
  178346. "muls r5, r6, r5\n\t"
  178347. #elif defined(__clang__)
  178348. "muls r5, r6\n\t"
  178349. #else
  178350. "mul r5, r6\n\t"
  178351. #endif
  178352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178353. "lsrs r6, r5, #16\n\t"
  178354. #else
  178355. "lsr r6, r5, #16\n\t"
  178356. #endif
  178357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178358. "lsls r5, r5, #16\n\t"
  178359. #else
  178360. "lsl r5, r5, #16\n\t"
  178361. #endif
  178362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178363. "adds r4, r4, r5\n\t"
  178364. #else
  178365. "add r4, r4, r5\n\t"
  178366. #endif
  178367. #ifdef WOLFSSL_KEIL
  178368. "adcs r2, r2, r6\n\t"
  178369. #elif defined(__clang__)
  178370. "adcs r2, r6\n\t"
  178371. #else
  178372. "adc r2, r6\n\t"
  178373. #endif
  178374. #ifdef WOLFSSL_KEIL
  178375. "adcs r3, r3, %[r]\n\t"
  178376. #elif defined(__clang__)
  178377. "adcs r3, %[r]\n\t"
  178378. #else
  178379. "adc r3, %[r]\n\t"
  178380. #endif
  178381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178382. "adds r4, r4, r5\n\t"
  178383. #else
  178384. "add r4, r4, r5\n\t"
  178385. #endif
  178386. #ifdef WOLFSSL_KEIL
  178387. "adcs r2, r2, r6\n\t"
  178388. #elif defined(__clang__)
  178389. "adcs r2, r6\n\t"
  178390. #else
  178391. "adc r2, r6\n\t"
  178392. #endif
  178393. #ifdef WOLFSSL_KEIL
  178394. "adcs r3, r3, %[r]\n\t"
  178395. #elif defined(__clang__)
  178396. "adcs r3, %[r]\n\t"
  178397. #else
  178398. "adc r3, %[r]\n\t"
  178399. #endif
  178400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178401. "lsrs r5, %[a], #16\n\t"
  178402. #else
  178403. "lsr r5, %[a], #16\n\t"
  178404. #endif
  178405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178406. "lsrs r6, r7, #16\n\t"
  178407. #else
  178408. "lsr r6, r7, #16\n\t"
  178409. #endif
  178410. #ifdef WOLFSSL_KEIL
  178411. "muls r6, r5, r6\n\t"
  178412. #elif defined(__clang__)
  178413. "muls r6, r5\n\t"
  178414. #else
  178415. "mul r6, r5\n\t"
  178416. #endif
  178417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178418. "adds r2, r2, r6\n\t"
  178419. #else
  178420. "add r2, r2, r6\n\t"
  178421. #endif
  178422. #ifdef WOLFSSL_KEIL
  178423. "adcs r3, r3, %[r]\n\t"
  178424. #elif defined(__clang__)
  178425. "adcs r3, %[r]\n\t"
  178426. #else
  178427. "adc r3, %[r]\n\t"
  178428. #endif
  178429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178430. "adds r2, r2, r6\n\t"
  178431. #else
  178432. "add r2, r2, r6\n\t"
  178433. #endif
  178434. #ifdef WOLFSSL_KEIL
  178435. "adcs r3, r3, %[r]\n\t"
  178436. #elif defined(__clang__)
  178437. "adcs r3, %[r]\n\t"
  178438. #else
  178439. "adc r3, %[r]\n\t"
  178440. #endif
  178441. "uxth r6, r7\n\t"
  178442. #ifdef WOLFSSL_KEIL
  178443. "muls r5, r6, r5\n\t"
  178444. #elif defined(__clang__)
  178445. "muls r5, r6\n\t"
  178446. #else
  178447. "mul r5, r6\n\t"
  178448. #endif
  178449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178450. "lsrs r6, r5, #16\n\t"
  178451. #else
  178452. "lsr r6, r5, #16\n\t"
  178453. #endif
  178454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178455. "lsls r5, r5, #16\n\t"
  178456. #else
  178457. "lsl r5, r5, #16\n\t"
  178458. #endif
  178459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178460. "adds r4, r4, r5\n\t"
  178461. #else
  178462. "add r4, r4, r5\n\t"
  178463. #endif
  178464. #ifdef WOLFSSL_KEIL
  178465. "adcs r2, r2, r6\n\t"
  178466. #elif defined(__clang__)
  178467. "adcs r2, r6\n\t"
  178468. #else
  178469. "adc r2, r6\n\t"
  178470. #endif
  178471. #ifdef WOLFSSL_KEIL
  178472. "adcs r3, r3, %[r]\n\t"
  178473. #elif defined(__clang__)
  178474. "adcs r3, %[r]\n\t"
  178475. #else
  178476. "adc r3, %[r]\n\t"
  178477. #endif
  178478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178479. "adds r4, r4, r5\n\t"
  178480. #else
  178481. "add r4, r4, r5\n\t"
  178482. #endif
  178483. #ifdef WOLFSSL_KEIL
  178484. "adcs r2, r2, r6\n\t"
  178485. #elif defined(__clang__)
  178486. "adcs r2, r6\n\t"
  178487. #else
  178488. "adc r2, r6\n\t"
  178489. #endif
  178490. #ifdef WOLFSSL_KEIL
  178491. "adcs r3, r3, %[r]\n\t"
  178492. #elif defined(__clang__)
  178493. "adcs r3, %[r]\n\t"
  178494. #else
  178495. "adc r3, %[r]\n\t"
  178496. #endif
  178497. "# A[10] * A[1]\n\t"
  178498. "mov %[a], r9\n\t"
  178499. "mov r7, r11\n\t"
  178500. "ldr %[a], [%[a], #40]\n\t"
  178501. "uxth r5, %[a]\n\t"
  178502. "uxth r6, r7\n\t"
  178503. #ifdef WOLFSSL_KEIL
  178504. "muls r6, r5, r6\n\t"
  178505. #elif defined(__clang__)
  178506. "muls r6, r5\n\t"
  178507. #else
  178508. "mul r6, r5\n\t"
  178509. #endif
  178510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178511. "adds r4, r4, r6\n\t"
  178512. #else
  178513. "add r4, r4, r6\n\t"
  178514. #endif
  178515. #ifdef WOLFSSL_KEIL
  178516. "adcs r2, r2, %[r]\n\t"
  178517. #elif defined(__clang__)
  178518. "adcs r2, %[r]\n\t"
  178519. #else
  178520. "adc r2, %[r]\n\t"
  178521. #endif
  178522. #ifdef WOLFSSL_KEIL
  178523. "adcs r3, r3, %[r]\n\t"
  178524. #elif defined(__clang__)
  178525. "adcs r3, %[r]\n\t"
  178526. #else
  178527. "adc r3, %[r]\n\t"
  178528. #endif
  178529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178530. "adds r4, r4, r6\n\t"
  178531. #else
  178532. "add r4, r4, r6\n\t"
  178533. #endif
  178534. #ifdef WOLFSSL_KEIL
  178535. "adcs r2, r2, %[r]\n\t"
  178536. #elif defined(__clang__)
  178537. "adcs r2, %[r]\n\t"
  178538. #else
  178539. "adc r2, %[r]\n\t"
  178540. #endif
  178541. #ifdef WOLFSSL_KEIL
  178542. "adcs r3, r3, %[r]\n\t"
  178543. #elif defined(__clang__)
  178544. "adcs r3, %[r]\n\t"
  178545. #else
  178546. "adc r3, %[r]\n\t"
  178547. #endif
  178548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178549. "lsrs r6, r7, #16\n\t"
  178550. #else
  178551. "lsr r6, r7, #16\n\t"
  178552. #endif
  178553. #ifdef WOLFSSL_KEIL
  178554. "muls r5, r6, r5\n\t"
  178555. #elif defined(__clang__)
  178556. "muls r5, r6\n\t"
  178557. #else
  178558. "mul r5, r6\n\t"
  178559. #endif
  178560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178561. "lsrs r6, r5, #16\n\t"
  178562. #else
  178563. "lsr r6, r5, #16\n\t"
  178564. #endif
  178565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178566. "lsls r5, r5, #16\n\t"
  178567. #else
  178568. "lsl r5, r5, #16\n\t"
  178569. #endif
  178570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178571. "adds r4, r4, r5\n\t"
  178572. #else
  178573. "add r4, r4, r5\n\t"
  178574. #endif
  178575. #ifdef WOLFSSL_KEIL
  178576. "adcs r2, r2, r6\n\t"
  178577. #elif defined(__clang__)
  178578. "adcs r2, r6\n\t"
  178579. #else
  178580. "adc r2, r6\n\t"
  178581. #endif
  178582. #ifdef WOLFSSL_KEIL
  178583. "adcs r3, r3, %[r]\n\t"
  178584. #elif defined(__clang__)
  178585. "adcs r3, %[r]\n\t"
  178586. #else
  178587. "adc r3, %[r]\n\t"
  178588. #endif
  178589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178590. "adds r4, r4, r5\n\t"
  178591. #else
  178592. "add r4, r4, r5\n\t"
  178593. #endif
  178594. #ifdef WOLFSSL_KEIL
  178595. "adcs r2, r2, r6\n\t"
  178596. #elif defined(__clang__)
  178597. "adcs r2, r6\n\t"
  178598. #else
  178599. "adc r2, r6\n\t"
  178600. #endif
  178601. #ifdef WOLFSSL_KEIL
  178602. "adcs r3, r3, %[r]\n\t"
  178603. #elif defined(__clang__)
  178604. "adcs r3, %[r]\n\t"
  178605. #else
  178606. "adc r3, %[r]\n\t"
  178607. #endif
  178608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178609. "lsrs r5, %[a], #16\n\t"
  178610. #else
  178611. "lsr r5, %[a], #16\n\t"
  178612. #endif
  178613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178614. "lsrs r6, r7, #16\n\t"
  178615. #else
  178616. "lsr r6, r7, #16\n\t"
  178617. #endif
  178618. #ifdef WOLFSSL_KEIL
  178619. "muls r6, r5, r6\n\t"
  178620. #elif defined(__clang__)
  178621. "muls r6, r5\n\t"
  178622. #else
  178623. "mul r6, r5\n\t"
  178624. #endif
  178625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178626. "adds r2, r2, r6\n\t"
  178627. #else
  178628. "add r2, r2, r6\n\t"
  178629. #endif
  178630. #ifdef WOLFSSL_KEIL
  178631. "adcs r3, r3, %[r]\n\t"
  178632. #elif defined(__clang__)
  178633. "adcs r3, %[r]\n\t"
  178634. #else
  178635. "adc r3, %[r]\n\t"
  178636. #endif
  178637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178638. "adds r2, r2, r6\n\t"
  178639. #else
  178640. "add r2, r2, r6\n\t"
  178641. #endif
  178642. #ifdef WOLFSSL_KEIL
  178643. "adcs r3, r3, %[r]\n\t"
  178644. #elif defined(__clang__)
  178645. "adcs r3, %[r]\n\t"
  178646. #else
  178647. "adc r3, %[r]\n\t"
  178648. #endif
  178649. "uxth r6, r7\n\t"
  178650. #ifdef WOLFSSL_KEIL
  178651. "muls r5, r6, r5\n\t"
  178652. #elif defined(__clang__)
  178653. "muls r5, r6\n\t"
  178654. #else
  178655. "mul r5, r6\n\t"
  178656. #endif
  178657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178658. "lsrs r6, r5, #16\n\t"
  178659. #else
  178660. "lsr r6, r5, #16\n\t"
  178661. #endif
  178662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178663. "lsls r5, r5, #16\n\t"
  178664. #else
  178665. "lsl r5, r5, #16\n\t"
  178666. #endif
  178667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178668. "adds r4, r4, r5\n\t"
  178669. #else
  178670. "add r4, r4, r5\n\t"
  178671. #endif
  178672. #ifdef WOLFSSL_KEIL
  178673. "adcs r2, r2, r6\n\t"
  178674. #elif defined(__clang__)
  178675. "adcs r2, r6\n\t"
  178676. #else
  178677. "adc r2, r6\n\t"
  178678. #endif
  178679. #ifdef WOLFSSL_KEIL
  178680. "adcs r3, r3, %[r]\n\t"
  178681. #elif defined(__clang__)
  178682. "adcs r3, %[r]\n\t"
  178683. #else
  178684. "adc r3, %[r]\n\t"
  178685. #endif
  178686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178687. "adds r4, r4, r5\n\t"
  178688. #else
  178689. "add r4, r4, r5\n\t"
  178690. #endif
  178691. #ifdef WOLFSSL_KEIL
  178692. "adcs r2, r2, r6\n\t"
  178693. #elif defined(__clang__)
  178694. "adcs r2, r6\n\t"
  178695. #else
  178696. "adc r2, r6\n\t"
  178697. #endif
  178698. #ifdef WOLFSSL_KEIL
  178699. "adcs r3, r3, %[r]\n\t"
  178700. #elif defined(__clang__)
  178701. "adcs r3, %[r]\n\t"
  178702. #else
  178703. "adc r3, %[r]\n\t"
  178704. #endif
  178705. "# A[11] * A[0]\n\t"
  178706. "mov %[a], r9\n\t"
  178707. "mov r7, r10\n\t"
  178708. "ldr %[a], [%[a], #44]\n\t"
  178709. "uxth r5, %[a]\n\t"
  178710. "uxth r6, r7\n\t"
  178711. #ifdef WOLFSSL_KEIL
  178712. "muls r6, r5, r6\n\t"
  178713. #elif defined(__clang__)
  178714. "muls r6, r5\n\t"
  178715. #else
  178716. "mul r6, r5\n\t"
  178717. #endif
  178718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178719. "adds r4, r4, r6\n\t"
  178720. #else
  178721. "add r4, r4, r6\n\t"
  178722. #endif
  178723. #ifdef WOLFSSL_KEIL
  178724. "adcs r2, r2, %[r]\n\t"
  178725. #elif defined(__clang__)
  178726. "adcs r2, %[r]\n\t"
  178727. #else
  178728. "adc r2, %[r]\n\t"
  178729. #endif
  178730. #ifdef WOLFSSL_KEIL
  178731. "adcs r3, r3, %[r]\n\t"
  178732. #elif defined(__clang__)
  178733. "adcs r3, %[r]\n\t"
  178734. #else
  178735. "adc r3, %[r]\n\t"
  178736. #endif
  178737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178738. "adds r4, r4, r6\n\t"
  178739. #else
  178740. "add r4, r4, r6\n\t"
  178741. #endif
  178742. #ifdef WOLFSSL_KEIL
  178743. "adcs r2, r2, %[r]\n\t"
  178744. #elif defined(__clang__)
  178745. "adcs r2, %[r]\n\t"
  178746. #else
  178747. "adc r2, %[r]\n\t"
  178748. #endif
  178749. #ifdef WOLFSSL_KEIL
  178750. "adcs r3, r3, %[r]\n\t"
  178751. #elif defined(__clang__)
  178752. "adcs r3, %[r]\n\t"
  178753. #else
  178754. "adc r3, %[r]\n\t"
  178755. #endif
  178756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178757. "lsrs r6, r7, #16\n\t"
  178758. #else
  178759. "lsr r6, r7, #16\n\t"
  178760. #endif
  178761. #ifdef WOLFSSL_KEIL
  178762. "muls r5, r6, r5\n\t"
  178763. #elif defined(__clang__)
  178764. "muls r5, r6\n\t"
  178765. #else
  178766. "mul r5, r6\n\t"
  178767. #endif
  178768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178769. "lsrs r6, r5, #16\n\t"
  178770. #else
  178771. "lsr r6, r5, #16\n\t"
  178772. #endif
  178773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178774. "lsls r5, r5, #16\n\t"
  178775. #else
  178776. "lsl r5, r5, #16\n\t"
  178777. #endif
  178778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178779. "adds r4, r4, r5\n\t"
  178780. #else
  178781. "add r4, r4, r5\n\t"
  178782. #endif
  178783. #ifdef WOLFSSL_KEIL
  178784. "adcs r2, r2, r6\n\t"
  178785. #elif defined(__clang__)
  178786. "adcs r2, r6\n\t"
  178787. #else
  178788. "adc r2, r6\n\t"
  178789. #endif
  178790. #ifdef WOLFSSL_KEIL
  178791. "adcs r3, r3, %[r]\n\t"
  178792. #elif defined(__clang__)
  178793. "adcs r3, %[r]\n\t"
  178794. #else
  178795. "adc r3, %[r]\n\t"
  178796. #endif
  178797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178798. "adds r4, r4, r5\n\t"
  178799. #else
  178800. "add r4, r4, r5\n\t"
  178801. #endif
  178802. #ifdef WOLFSSL_KEIL
  178803. "adcs r2, r2, r6\n\t"
  178804. #elif defined(__clang__)
  178805. "adcs r2, r6\n\t"
  178806. #else
  178807. "adc r2, r6\n\t"
  178808. #endif
  178809. #ifdef WOLFSSL_KEIL
  178810. "adcs r3, r3, %[r]\n\t"
  178811. #elif defined(__clang__)
  178812. "adcs r3, %[r]\n\t"
  178813. #else
  178814. "adc r3, %[r]\n\t"
  178815. #endif
  178816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178817. "lsrs r5, %[a], #16\n\t"
  178818. #else
  178819. "lsr r5, %[a], #16\n\t"
  178820. #endif
  178821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178822. "lsrs r6, r7, #16\n\t"
  178823. #else
  178824. "lsr r6, r7, #16\n\t"
  178825. #endif
  178826. #ifdef WOLFSSL_KEIL
  178827. "muls r6, r5, r6\n\t"
  178828. #elif defined(__clang__)
  178829. "muls r6, r5\n\t"
  178830. #else
  178831. "mul r6, r5\n\t"
  178832. #endif
  178833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178834. "adds r2, r2, r6\n\t"
  178835. #else
  178836. "add r2, r2, r6\n\t"
  178837. #endif
  178838. #ifdef WOLFSSL_KEIL
  178839. "adcs r3, r3, %[r]\n\t"
  178840. #elif defined(__clang__)
  178841. "adcs r3, %[r]\n\t"
  178842. #else
  178843. "adc r3, %[r]\n\t"
  178844. #endif
  178845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178846. "adds r2, r2, r6\n\t"
  178847. #else
  178848. "add r2, r2, r6\n\t"
  178849. #endif
  178850. #ifdef WOLFSSL_KEIL
  178851. "adcs r3, r3, %[r]\n\t"
  178852. #elif defined(__clang__)
  178853. "adcs r3, %[r]\n\t"
  178854. #else
  178855. "adc r3, %[r]\n\t"
  178856. #endif
  178857. "uxth r6, r7\n\t"
  178858. #ifdef WOLFSSL_KEIL
  178859. "muls r5, r6, r5\n\t"
  178860. #elif defined(__clang__)
  178861. "muls r5, r6\n\t"
  178862. #else
  178863. "mul r5, r6\n\t"
  178864. #endif
  178865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178866. "lsrs r6, r5, #16\n\t"
  178867. #else
  178868. "lsr r6, r5, #16\n\t"
  178869. #endif
  178870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178871. "lsls r5, r5, #16\n\t"
  178872. #else
  178873. "lsl r5, r5, #16\n\t"
  178874. #endif
  178875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178876. "adds r4, r4, r5\n\t"
  178877. #else
  178878. "add r4, r4, r5\n\t"
  178879. #endif
  178880. #ifdef WOLFSSL_KEIL
  178881. "adcs r2, r2, r6\n\t"
  178882. #elif defined(__clang__)
  178883. "adcs r2, r6\n\t"
  178884. #else
  178885. "adc r2, r6\n\t"
  178886. #endif
  178887. #ifdef WOLFSSL_KEIL
  178888. "adcs r3, r3, %[r]\n\t"
  178889. #elif defined(__clang__)
  178890. "adcs r3, %[r]\n\t"
  178891. #else
  178892. "adc r3, %[r]\n\t"
  178893. #endif
  178894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178895. "adds r4, r4, r5\n\t"
  178896. #else
  178897. "add r4, r4, r5\n\t"
  178898. #endif
  178899. #ifdef WOLFSSL_KEIL
  178900. "adcs r2, r2, r6\n\t"
  178901. #elif defined(__clang__)
  178902. "adcs r2, r6\n\t"
  178903. #else
  178904. "adc r2, r6\n\t"
  178905. #endif
  178906. #ifdef WOLFSSL_KEIL
  178907. "adcs r3, r3, %[r]\n\t"
  178908. #elif defined(__clang__)
  178909. "adcs r3, %[r]\n\t"
  178910. #else
  178911. "adc r3, %[r]\n\t"
  178912. #endif
  178913. "str r4, [sp, #44]\n\t"
  178914. "# A[12] * A[0]\n\t"
  178915. "movs r4, #0\n\t"
  178916. "mov %[a], r9\n\t"
  178917. "ldr %[a], [%[a], #48]\n\t"
  178918. "uxth r5, %[a]\n\t"
  178919. "uxth r6, r7\n\t"
  178920. #ifdef WOLFSSL_KEIL
  178921. "muls r6, r5, r6\n\t"
  178922. #elif defined(__clang__)
  178923. "muls r6, r5\n\t"
  178924. #else
  178925. "mul r6, r5\n\t"
  178926. #endif
  178927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178928. "adds r2, r2, r6\n\t"
  178929. #else
  178930. "add r2, r2, r6\n\t"
  178931. #endif
  178932. #ifdef WOLFSSL_KEIL
  178933. "adcs r3, r3, %[r]\n\t"
  178934. #elif defined(__clang__)
  178935. "adcs r3, %[r]\n\t"
  178936. #else
  178937. "adc r3, %[r]\n\t"
  178938. #endif
  178939. #ifdef WOLFSSL_KEIL
  178940. "adcs r4, r4, %[r]\n\t"
  178941. #elif defined(__clang__)
  178942. "adcs r4, %[r]\n\t"
  178943. #else
  178944. "adc r4, %[r]\n\t"
  178945. #endif
  178946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178947. "adds r2, r2, r6\n\t"
  178948. #else
  178949. "add r2, r2, r6\n\t"
  178950. #endif
  178951. #ifdef WOLFSSL_KEIL
  178952. "adcs r3, r3, %[r]\n\t"
  178953. #elif defined(__clang__)
  178954. "adcs r3, %[r]\n\t"
  178955. #else
  178956. "adc r3, %[r]\n\t"
  178957. #endif
  178958. #ifdef WOLFSSL_KEIL
  178959. "adcs r4, r4, %[r]\n\t"
  178960. #elif defined(__clang__)
  178961. "adcs r4, %[r]\n\t"
  178962. #else
  178963. "adc r4, %[r]\n\t"
  178964. #endif
  178965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178966. "lsrs r6, r7, #16\n\t"
  178967. #else
  178968. "lsr r6, r7, #16\n\t"
  178969. #endif
  178970. #ifdef WOLFSSL_KEIL
  178971. "muls r5, r6, r5\n\t"
  178972. #elif defined(__clang__)
  178973. "muls r5, r6\n\t"
  178974. #else
  178975. "mul r5, r6\n\t"
  178976. #endif
  178977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178978. "lsrs r6, r5, #16\n\t"
  178979. #else
  178980. "lsr r6, r5, #16\n\t"
  178981. #endif
  178982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178983. "lsls r5, r5, #16\n\t"
  178984. #else
  178985. "lsl r5, r5, #16\n\t"
  178986. #endif
  178987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178988. "adds r2, r2, r5\n\t"
  178989. #else
  178990. "add r2, r2, r5\n\t"
  178991. #endif
  178992. #ifdef WOLFSSL_KEIL
  178993. "adcs r3, r3, r6\n\t"
  178994. #elif defined(__clang__)
  178995. "adcs r3, r6\n\t"
  178996. #else
  178997. "adc r3, r6\n\t"
  178998. #endif
  178999. #ifdef WOLFSSL_KEIL
  179000. "adcs r4, r4, %[r]\n\t"
  179001. #elif defined(__clang__)
  179002. "adcs r4, %[r]\n\t"
  179003. #else
  179004. "adc r4, %[r]\n\t"
  179005. #endif
  179006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179007. "adds r2, r2, r5\n\t"
  179008. #else
  179009. "add r2, r2, r5\n\t"
  179010. #endif
  179011. #ifdef WOLFSSL_KEIL
  179012. "adcs r3, r3, r6\n\t"
  179013. #elif defined(__clang__)
  179014. "adcs r3, r6\n\t"
  179015. #else
  179016. "adc r3, r6\n\t"
  179017. #endif
  179018. #ifdef WOLFSSL_KEIL
  179019. "adcs r4, r4, %[r]\n\t"
  179020. #elif defined(__clang__)
  179021. "adcs r4, %[r]\n\t"
  179022. #else
  179023. "adc r4, %[r]\n\t"
  179024. #endif
  179025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179026. "lsrs r5, %[a], #16\n\t"
  179027. #else
  179028. "lsr r5, %[a], #16\n\t"
  179029. #endif
  179030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179031. "lsrs r6, r7, #16\n\t"
  179032. #else
  179033. "lsr r6, r7, #16\n\t"
  179034. #endif
  179035. #ifdef WOLFSSL_KEIL
  179036. "muls r6, r5, r6\n\t"
  179037. #elif defined(__clang__)
  179038. "muls r6, r5\n\t"
  179039. #else
  179040. "mul r6, r5\n\t"
  179041. #endif
  179042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179043. "adds r3, r3, r6\n\t"
  179044. #else
  179045. "add r3, r3, r6\n\t"
  179046. #endif
  179047. #ifdef WOLFSSL_KEIL
  179048. "adcs r4, r4, %[r]\n\t"
  179049. #elif defined(__clang__)
  179050. "adcs r4, %[r]\n\t"
  179051. #else
  179052. "adc r4, %[r]\n\t"
  179053. #endif
  179054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179055. "adds r3, r3, r6\n\t"
  179056. #else
  179057. "add r3, r3, r6\n\t"
  179058. #endif
  179059. #ifdef WOLFSSL_KEIL
  179060. "adcs r4, r4, %[r]\n\t"
  179061. #elif defined(__clang__)
  179062. "adcs r4, %[r]\n\t"
  179063. #else
  179064. "adc r4, %[r]\n\t"
  179065. #endif
  179066. "uxth r6, r7\n\t"
  179067. #ifdef WOLFSSL_KEIL
  179068. "muls r5, r6, r5\n\t"
  179069. #elif defined(__clang__)
  179070. "muls r5, r6\n\t"
  179071. #else
  179072. "mul r5, r6\n\t"
  179073. #endif
  179074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179075. "lsrs r6, r5, #16\n\t"
  179076. #else
  179077. "lsr r6, r5, #16\n\t"
  179078. #endif
  179079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179080. "lsls r5, r5, #16\n\t"
  179081. #else
  179082. "lsl r5, r5, #16\n\t"
  179083. #endif
  179084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179085. "adds r2, r2, r5\n\t"
  179086. #else
  179087. "add r2, r2, r5\n\t"
  179088. #endif
  179089. #ifdef WOLFSSL_KEIL
  179090. "adcs r3, r3, r6\n\t"
  179091. #elif defined(__clang__)
  179092. "adcs r3, r6\n\t"
  179093. #else
  179094. "adc r3, r6\n\t"
  179095. #endif
  179096. #ifdef WOLFSSL_KEIL
  179097. "adcs r4, r4, %[r]\n\t"
  179098. #elif defined(__clang__)
  179099. "adcs r4, %[r]\n\t"
  179100. #else
  179101. "adc r4, %[r]\n\t"
  179102. #endif
  179103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179104. "adds r2, r2, r5\n\t"
  179105. #else
  179106. "add r2, r2, r5\n\t"
  179107. #endif
  179108. #ifdef WOLFSSL_KEIL
  179109. "adcs r3, r3, r6\n\t"
  179110. #elif defined(__clang__)
  179111. "adcs r3, r6\n\t"
  179112. #else
  179113. "adc r3, r6\n\t"
  179114. #endif
  179115. #ifdef WOLFSSL_KEIL
  179116. "adcs r4, r4, %[r]\n\t"
  179117. #elif defined(__clang__)
  179118. "adcs r4, %[r]\n\t"
  179119. #else
  179120. "adc r4, %[r]\n\t"
  179121. #endif
  179122. "# A[11] * A[1]\n\t"
  179123. "mov %[a], r9\n\t"
  179124. "mov r7, r11\n\t"
  179125. "ldr %[a], [%[a], #44]\n\t"
  179126. "uxth r5, %[a]\n\t"
  179127. "uxth r6, r7\n\t"
  179128. #ifdef WOLFSSL_KEIL
  179129. "muls r6, r5, r6\n\t"
  179130. #elif defined(__clang__)
  179131. "muls r6, r5\n\t"
  179132. #else
  179133. "mul r6, r5\n\t"
  179134. #endif
  179135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179136. "adds r2, r2, r6\n\t"
  179137. #else
  179138. "add r2, r2, r6\n\t"
  179139. #endif
  179140. #ifdef WOLFSSL_KEIL
  179141. "adcs r3, r3, %[r]\n\t"
  179142. #elif defined(__clang__)
  179143. "adcs r3, %[r]\n\t"
  179144. #else
  179145. "adc r3, %[r]\n\t"
  179146. #endif
  179147. #ifdef WOLFSSL_KEIL
  179148. "adcs r4, r4, %[r]\n\t"
  179149. #elif defined(__clang__)
  179150. "adcs r4, %[r]\n\t"
  179151. #else
  179152. "adc r4, %[r]\n\t"
  179153. #endif
  179154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179155. "adds r2, r2, r6\n\t"
  179156. #else
  179157. "add r2, r2, r6\n\t"
  179158. #endif
  179159. #ifdef WOLFSSL_KEIL
  179160. "adcs r3, r3, %[r]\n\t"
  179161. #elif defined(__clang__)
  179162. "adcs r3, %[r]\n\t"
  179163. #else
  179164. "adc r3, %[r]\n\t"
  179165. #endif
  179166. #ifdef WOLFSSL_KEIL
  179167. "adcs r4, r4, %[r]\n\t"
  179168. #elif defined(__clang__)
  179169. "adcs r4, %[r]\n\t"
  179170. #else
  179171. "adc r4, %[r]\n\t"
  179172. #endif
  179173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179174. "lsrs r6, r7, #16\n\t"
  179175. #else
  179176. "lsr r6, r7, #16\n\t"
  179177. #endif
  179178. #ifdef WOLFSSL_KEIL
  179179. "muls r5, r6, r5\n\t"
  179180. #elif defined(__clang__)
  179181. "muls r5, r6\n\t"
  179182. #else
  179183. "mul r5, r6\n\t"
  179184. #endif
  179185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179186. "lsrs r6, r5, #16\n\t"
  179187. #else
  179188. "lsr r6, r5, #16\n\t"
  179189. #endif
  179190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179191. "lsls r5, r5, #16\n\t"
  179192. #else
  179193. "lsl r5, r5, #16\n\t"
  179194. #endif
  179195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179196. "adds r2, r2, r5\n\t"
  179197. #else
  179198. "add r2, r2, r5\n\t"
  179199. #endif
  179200. #ifdef WOLFSSL_KEIL
  179201. "adcs r3, r3, r6\n\t"
  179202. #elif defined(__clang__)
  179203. "adcs r3, r6\n\t"
  179204. #else
  179205. "adc r3, r6\n\t"
  179206. #endif
  179207. #ifdef WOLFSSL_KEIL
  179208. "adcs r4, r4, %[r]\n\t"
  179209. #elif defined(__clang__)
  179210. "adcs r4, %[r]\n\t"
  179211. #else
  179212. "adc r4, %[r]\n\t"
  179213. #endif
  179214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179215. "adds r2, r2, r5\n\t"
  179216. #else
  179217. "add r2, r2, r5\n\t"
  179218. #endif
  179219. #ifdef WOLFSSL_KEIL
  179220. "adcs r3, r3, r6\n\t"
  179221. #elif defined(__clang__)
  179222. "adcs r3, r6\n\t"
  179223. #else
  179224. "adc r3, r6\n\t"
  179225. #endif
  179226. #ifdef WOLFSSL_KEIL
  179227. "adcs r4, r4, %[r]\n\t"
  179228. #elif defined(__clang__)
  179229. "adcs r4, %[r]\n\t"
  179230. #else
  179231. "adc r4, %[r]\n\t"
  179232. #endif
  179233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179234. "lsrs r5, %[a], #16\n\t"
  179235. #else
  179236. "lsr r5, %[a], #16\n\t"
  179237. #endif
  179238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179239. "lsrs r6, r7, #16\n\t"
  179240. #else
  179241. "lsr r6, r7, #16\n\t"
  179242. #endif
  179243. #ifdef WOLFSSL_KEIL
  179244. "muls r6, r5, r6\n\t"
  179245. #elif defined(__clang__)
  179246. "muls r6, r5\n\t"
  179247. #else
  179248. "mul r6, r5\n\t"
  179249. #endif
  179250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179251. "adds r3, r3, r6\n\t"
  179252. #else
  179253. "add r3, r3, r6\n\t"
  179254. #endif
  179255. #ifdef WOLFSSL_KEIL
  179256. "adcs r4, r4, %[r]\n\t"
  179257. #elif defined(__clang__)
  179258. "adcs r4, %[r]\n\t"
  179259. #else
  179260. "adc r4, %[r]\n\t"
  179261. #endif
  179262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179263. "adds r3, r3, r6\n\t"
  179264. #else
  179265. "add r3, r3, r6\n\t"
  179266. #endif
  179267. #ifdef WOLFSSL_KEIL
  179268. "adcs r4, r4, %[r]\n\t"
  179269. #elif defined(__clang__)
  179270. "adcs r4, %[r]\n\t"
  179271. #else
  179272. "adc r4, %[r]\n\t"
  179273. #endif
  179274. "uxth r6, r7\n\t"
  179275. #ifdef WOLFSSL_KEIL
  179276. "muls r5, r6, r5\n\t"
  179277. #elif defined(__clang__)
  179278. "muls r5, r6\n\t"
  179279. #else
  179280. "mul r5, r6\n\t"
  179281. #endif
  179282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179283. "lsrs r6, r5, #16\n\t"
  179284. #else
  179285. "lsr r6, r5, #16\n\t"
  179286. #endif
  179287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179288. "lsls r5, r5, #16\n\t"
  179289. #else
  179290. "lsl r5, r5, #16\n\t"
  179291. #endif
  179292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179293. "adds r2, r2, r5\n\t"
  179294. #else
  179295. "add r2, r2, r5\n\t"
  179296. #endif
  179297. #ifdef WOLFSSL_KEIL
  179298. "adcs r3, r3, r6\n\t"
  179299. #elif defined(__clang__)
  179300. "adcs r3, r6\n\t"
  179301. #else
  179302. "adc r3, r6\n\t"
  179303. #endif
  179304. #ifdef WOLFSSL_KEIL
  179305. "adcs r4, r4, %[r]\n\t"
  179306. #elif defined(__clang__)
  179307. "adcs r4, %[r]\n\t"
  179308. #else
  179309. "adc r4, %[r]\n\t"
  179310. #endif
  179311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179312. "adds r2, r2, r5\n\t"
  179313. #else
  179314. "add r2, r2, r5\n\t"
  179315. #endif
  179316. #ifdef WOLFSSL_KEIL
  179317. "adcs r3, r3, r6\n\t"
  179318. #elif defined(__clang__)
  179319. "adcs r3, r6\n\t"
  179320. #else
  179321. "adc r3, r6\n\t"
  179322. #endif
  179323. #ifdef WOLFSSL_KEIL
  179324. "adcs r4, r4, %[r]\n\t"
  179325. #elif defined(__clang__)
  179326. "adcs r4, %[r]\n\t"
  179327. #else
  179328. "adc r4, %[r]\n\t"
  179329. #endif
  179330. "# A[10] * A[2]\n\t"
  179331. "mov %[a], r9\n\t"
  179332. "mov r7, r12\n\t"
  179333. "ldr %[a], [%[a], #40]\n\t"
  179334. "uxth r5, %[a]\n\t"
  179335. "uxth r6, r7\n\t"
  179336. #ifdef WOLFSSL_KEIL
  179337. "muls r6, r5, r6\n\t"
  179338. #elif defined(__clang__)
  179339. "muls r6, r5\n\t"
  179340. #else
  179341. "mul r6, r5\n\t"
  179342. #endif
  179343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179344. "adds r2, r2, r6\n\t"
  179345. #else
  179346. "add r2, r2, r6\n\t"
  179347. #endif
  179348. #ifdef WOLFSSL_KEIL
  179349. "adcs r3, r3, %[r]\n\t"
  179350. #elif defined(__clang__)
  179351. "adcs r3, %[r]\n\t"
  179352. #else
  179353. "adc r3, %[r]\n\t"
  179354. #endif
  179355. #ifdef WOLFSSL_KEIL
  179356. "adcs r4, r4, %[r]\n\t"
  179357. #elif defined(__clang__)
  179358. "adcs r4, %[r]\n\t"
  179359. #else
  179360. "adc r4, %[r]\n\t"
  179361. #endif
  179362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179363. "adds r2, r2, r6\n\t"
  179364. #else
  179365. "add r2, r2, r6\n\t"
  179366. #endif
  179367. #ifdef WOLFSSL_KEIL
  179368. "adcs r3, r3, %[r]\n\t"
  179369. #elif defined(__clang__)
  179370. "adcs r3, %[r]\n\t"
  179371. #else
  179372. "adc r3, %[r]\n\t"
  179373. #endif
  179374. #ifdef WOLFSSL_KEIL
  179375. "adcs r4, r4, %[r]\n\t"
  179376. #elif defined(__clang__)
  179377. "adcs r4, %[r]\n\t"
  179378. #else
  179379. "adc r4, %[r]\n\t"
  179380. #endif
  179381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179382. "lsrs r6, r7, #16\n\t"
  179383. #else
  179384. "lsr r6, r7, #16\n\t"
  179385. #endif
  179386. #ifdef WOLFSSL_KEIL
  179387. "muls r5, r6, r5\n\t"
  179388. #elif defined(__clang__)
  179389. "muls r5, r6\n\t"
  179390. #else
  179391. "mul r5, r6\n\t"
  179392. #endif
  179393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179394. "lsrs r6, r5, #16\n\t"
  179395. #else
  179396. "lsr r6, r5, #16\n\t"
  179397. #endif
  179398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179399. "lsls r5, r5, #16\n\t"
  179400. #else
  179401. "lsl r5, r5, #16\n\t"
  179402. #endif
  179403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179404. "adds r2, r2, r5\n\t"
  179405. #else
  179406. "add r2, r2, r5\n\t"
  179407. #endif
  179408. #ifdef WOLFSSL_KEIL
  179409. "adcs r3, r3, r6\n\t"
  179410. #elif defined(__clang__)
  179411. "adcs r3, r6\n\t"
  179412. #else
  179413. "adc r3, r6\n\t"
  179414. #endif
  179415. #ifdef WOLFSSL_KEIL
  179416. "adcs r4, r4, %[r]\n\t"
  179417. #elif defined(__clang__)
  179418. "adcs r4, %[r]\n\t"
  179419. #else
  179420. "adc r4, %[r]\n\t"
  179421. #endif
  179422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179423. "adds r2, r2, r5\n\t"
  179424. #else
  179425. "add r2, r2, r5\n\t"
  179426. #endif
  179427. #ifdef WOLFSSL_KEIL
  179428. "adcs r3, r3, r6\n\t"
  179429. #elif defined(__clang__)
  179430. "adcs r3, r6\n\t"
  179431. #else
  179432. "adc r3, r6\n\t"
  179433. #endif
  179434. #ifdef WOLFSSL_KEIL
  179435. "adcs r4, r4, %[r]\n\t"
  179436. #elif defined(__clang__)
  179437. "adcs r4, %[r]\n\t"
  179438. #else
  179439. "adc r4, %[r]\n\t"
  179440. #endif
  179441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179442. "lsrs r5, %[a], #16\n\t"
  179443. #else
  179444. "lsr r5, %[a], #16\n\t"
  179445. #endif
  179446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179447. "lsrs r6, r7, #16\n\t"
  179448. #else
  179449. "lsr r6, r7, #16\n\t"
  179450. #endif
  179451. #ifdef WOLFSSL_KEIL
  179452. "muls r6, r5, r6\n\t"
  179453. #elif defined(__clang__)
  179454. "muls r6, r5\n\t"
  179455. #else
  179456. "mul r6, r5\n\t"
  179457. #endif
  179458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179459. "adds r3, r3, r6\n\t"
  179460. #else
  179461. "add r3, r3, r6\n\t"
  179462. #endif
  179463. #ifdef WOLFSSL_KEIL
  179464. "adcs r4, r4, %[r]\n\t"
  179465. #elif defined(__clang__)
  179466. "adcs r4, %[r]\n\t"
  179467. #else
  179468. "adc r4, %[r]\n\t"
  179469. #endif
  179470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179471. "adds r3, r3, r6\n\t"
  179472. #else
  179473. "add r3, r3, r6\n\t"
  179474. #endif
  179475. #ifdef WOLFSSL_KEIL
  179476. "adcs r4, r4, %[r]\n\t"
  179477. #elif defined(__clang__)
  179478. "adcs r4, %[r]\n\t"
  179479. #else
  179480. "adc r4, %[r]\n\t"
  179481. #endif
  179482. "uxth r6, r7\n\t"
  179483. #ifdef WOLFSSL_KEIL
  179484. "muls r5, r6, r5\n\t"
  179485. #elif defined(__clang__)
  179486. "muls r5, r6\n\t"
  179487. #else
  179488. "mul r5, r6\n\t"
  179489. #endif
  179490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179491. "lsrs r6, r5, #16\n\t"
  179492. #else
  179493. "lsr r6, r5, #16\n\t"
  179494. #endif
  179495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179496. "lsls r5, r5, #16\n\t"
  179497. #else
  179498. "lsl r5, r5, #16\n\t"
  179499. #endif
  179500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179501. "adds r2, r2, r5\n\t"
  179502. #else
  179503. "add r2, r2, r5\n\t"
  179504. #endif
  179505. #ifdef WOLFSSL_KEIL
  179506. "adcs r3, r3, r6\n\t"
  179507. #elif defined(__clang__)
  179508. "adcs r3, r6\n\t"
  179509. #else
  179510. "adc r3, r6\n\t"
  179511. #endif
  179512. #ifdef WOLFSSL_KEIL
  179513. "adcs r4, r4, %[r]\n\t"
  179514. #elif defined(__clang__)
  179515. "adcs r4, %[r]\n\t"
  179516. #else
  179517. "adc r4, %[r]\n\t"
  179518. #endif
  179519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179520. "adds r2, r2, r5\n\t"
  179521. #else
  179522. "add r2, r2, r5\n\t"
  179523. #endif
  179524. #ifdef WOLFSSL_KEIL
  179525. "adcs r3, r3, r6\n\t"
  179526. #elif defined(__clang__)
  179527. "adcs r3, r6\n\t"
  179528. #else
  179529. "adc r3, r6\n\t"
  179530. #endif
  179531. #ifdef WOLFSSL_KEIL
  179532. "adcs r4, r4, %[r]\n\t"
  179533. #elif defined(__clang__)
  179534. "adcs r4, %[r]\n\t"
  179535. #else
  179536. "adc r4, %[r]\n\t"
  179537. #endif
  179538. "# A[9] * A[3]\n\t"
  179539. "mov %[a], r9\n\t"
  179540. "mov r7, lr\n\t"
  179541. "ldr %[a], [%[a], #36]\n\t"
  179542. "uxth r5, %[a]\n\t"
  179543. "uxth r6, r7\n\t"
  179544. #ifdef WOLFSSL_KEIL
  179545. "muls r6, r5, r6\n\t"
  179546. #elif defined(__clang__)
  179547. "muls r6, r5\n\t"
  179548. #else
  179549. "mul r6, r5\n\t"
  179550. #endif
  179551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179552. "adds r2, r2, r6\n\t"
  179553. #else
  179554. "add r2, r2, r6\n\t"
  179555. #endif
  179556. #ifdef WOLFSSL_KEIL
  179557. "adcs r3, r3, %[r]\n\t"
  179558. #elif defined(__clang__)
  179559. "adcs r3, %[r]\n\t"
  179560. #else
  179561. "adc r3, %[r]\n\t"
  179562. #endif
  179563. #ifdef WOLFSSL_KEIL
  179564. "adcs r4, r4, %[r]\n\t"
  179565. #elif defined(__clang__)
  179566. "adcs r4, %[r]\n\t"
  179567. #else
  179568. "adc r4, %[r]\n\t"
  179569. #endif
  179570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179571. "adds r2, r2, r6\n\t"
  179572. #else
  179573. "add r2, r2, r6\n\t"
  179574. #endif
  179575. #ifdef WOLFSSL_KEIL
  179576. "adcs r3, r3, %[r]\n\t"
  179577. #elif defined(__clang__)
  179578. "adcs r3, %[r]\n\t"
  179579. #else
  179580. "adc r3, %[r]\n\t"
  179581. #endif
  179582. #ifdef WOLFSSL_KEIL
  179583. "adcs r4, r4, %[r]\n\t"
  179584. #elif defined(__clang__)
  179585. "adcs r4, %[r]\n\t"
  179586. #else
  179587. "adc r4, %[r]\n\t"
  179588. #endif
  179589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179590. "lsrs r6, r7, #16\n\t"
  179591. #else
  179592. "lsr r6, r7, #16\n\t"
  179593. #endif
  179594. #ifdef WOLFSSL_KEIL
  179595. "muls r5, r6, r5\n\t"
  179596. #elif defined(__clang__)
  179597. "muls r5, r6\n\t"
  179598. #else
  179599. "mul r5, r6\n\t"
  179600. #endif
  179601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179602. "lsrs r6, r5, #16\n\t"
  179603. #else
  179604. "lsr r6, r5, #16\n\t"
  179605. #endif
  179606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179607. "lsls r5, r5, #16\n\t"
  179608. #else
  179609. "lsl r5, r5, #16\n\t"
  179610. #endif
  179611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179612. "adds r2, r2, r5\n\t"
  179613. #else
  179614. "add r2, r2, r5\n\t"
  179615. #endif
  179616. #ifdef WOLFSSL_KEIL
  179617. "adcs r3, r3, r6\n\t"
  179618. #elif defined(__clang__)
  179619. "adcs r3, r6\n\t"
  179620. #else
  179621. "adc r3, r6\n\t"
  179622. #endif
  179623. #ifdef WOLFSSL_KEIL
  179624. "adcs r4, r4, %[r]\n\t"
  179625. #elif defined(__clang__)
  179626. "adcs r4, %[r]\n\t"
  179627. #else
  179628. "adc r4, %[r]\n\t"
  179629. #endif
  179630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179631. "adds r2, r2, r5\n\t"
  179632. #else
  179633. "add r2, r2, r5\n\t"
  179634. #endif
  179635. #ifdef WOLFSSL_KEIL
  179636. "adcs r3, r3, r6\n\t"
  179637. #elif defined(__clang__)
  179638. "adcs r3, r6\n\t"
  179639. #else
  179640. "adc r3, r6\n\t"
  179641. #endif
  179642. #ifdef WOLFSSL_KEIL
  179643. "adcs r4, r4, %[r]\n\t"
  179644. #elif defined(__clang__)
  179645. "adcs r4, %[r]\n\t"
  179646. #else
  179647. "adc r4, %[r]\n\t"
  179648. #endif
  179649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179650. "lsrs r5, %[a], #16\n\t"
  179651. #else
  179652. "lsr r5, %[a], #16\n\t"
  179653. #endif
  179654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179655. "lsrs r6, r7, #16\n\t"
  179656. #else
  179657. "lsr r6, r7, #16\n\t"
  179658. #endif
  179659. #ifdef WOLFSSL_KEIL
  179660. "muls r6, r5, r6\n\t"
  179661. #elif defined(__clang__)
  179662. "muls r6, r5\n\t"
  179663. #else
  179664. "mul r6, r5\n\t"
  179665. #endif
  179666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179667. "adds r3, r3, r6\n\t"
  179668. #else
  179669. "add r3, r3, r6\n\t"
  179670. #endif
  179671. #ifdef WOLFSSL_KEIL
  179672. "adcs r4, r4, %[r]\n\t"
  179673. #elif defined(__clang__)
  179674. "adcs r4, %[r]\n\t"
  179675. #else
  179676. "adc r4, %[r]\n\t"
  179677. #endif
  179678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179679. "adds r3, r3, r6\n\t"
  179680. #else
  179681. "add r3, r3, r6\n\t"
  179682. #endif
  179683. #ifdef WOLFSSL_KEIL
  179684. "adcs r4, r4, %[r]\n\t"
  179685. #elif defined(__clang__)
  179686. "adcs r4, %[r]\n\t"
  179687. #else
  179688. "adc r4, %[r]\n\t"
  179689. #endif
  179690. "uxth r6, r7\n\t"
  179691. #ifdef WOLFSSL_KEIL
  179692. "muls r5, r6, r5\n\t"
  179693. #elif defined(__clang__)
  179694. "muls r5, r6\n\t"
  179695. #else
  179696. "mul r5, r6\n\t"
  179697. #endif
  179698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179699. "lsrs r6, r5, #16\n\t"
  179700. #else
  179701. "lsr r6, r5, #16\n\t"
  179702. #endif
  179703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179704. "lsls r5, r5, #16\n\t"
  179705. #else
  179706. "lsl r5, r5, #16\n\t"
  179707. #endif
  179708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179709. "adds r2, r2, r5\n\t"
  179710. #else
  179711. "add r2, r2, r5\n\t"
  179712. #endif
  179713. #ifdef WOLFSSL_KEIL
  179714. "adcs r3, r3, r6\n\t"
  179715. #elif defined(__clang__)
  179716. "adcs r3, r6\n\t"
  179717. #else
  179718. "adc r3, r6\n\t"
  179719. #endif
  179720. #ifdef WOLFSSL_KEIL
  179721. "adcs r4, r4, %[r]\n\t"
  179722. #elif defined(__clang__)
  179723. "adcs r4, %[r]\n\t"
  179724. #else
  179725. "adc r4, %[r]\n\t"
  179726. #endif
  179727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179728. "adds r2, r2, r5\n\t"
  179729. #else
  179730. "add r2, r2, r5\n\t"
  179731. #endif
  179732. #ifdef WOLFSSL_KEIL
  179733. "adcs r3, r3, r6\n\t"
  179734. #elif defined(__clang__)
  179735. "adcs r3, r6\n\t"
  179736. #else
  179737. "adc r3, r6\n\t"
  179738. #endif
  179739. #ifdef WOLFSSL_KEIL
  179740. "adcs r4, r4, %[r]\n\t"
  179741. #elif defined(__clang__)
  179742. "adcs r4, %[r]\n\t"
  179743. #else
  179744. "adc r4, %[r]\n\t"
  179745. #endif
  179746. "# A[8] * A[4]\n\t"
  179747. "mov %[a], r9\n\t"
  179748. "ldr r7, [%[a], #16]\n\t"
  179749. "ldr %[a], [%[a], #32]\n\t"
  179750. "uxth r5, %[a]\n\t"
  179751. "uxth r6, r7\n\t"
  179752. #ifdef WOLFSSL_KEIL
  179753. "muls r6, r5, r6\n\t"
  179754. #elif defined(__clang__)
  179755. "muls r6, r5\n\t"
  179756. #else
  179757. "mul r6, r5\n\t"
  179758. #endif
  179759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179760. "adds r2, r2, r6\n\t"
  179761. #else
  179762. "add r2, r2, r6\n\t"
  179763. #endif
  179764. #ifdef WOLFSSL_KEIL
  179765. "adcs r3, r3, %[r]\n\t"
  179766. #elif defined(__clang__)
  179767. "adcs r3, %[r]\n\t"
  179768. #else
  179769. "adc r3, %[r]\n\t"
  179770. #endif
  179771. #ifdef WOLFSSL_KEIL
  179772. "adcs r4, r4, %[r]\n\t"
  179773. #elif defined(__clang__)
  179774. "adcs r4, %[r]\n\t"
  179775. #else
  179776. "adc r4, %[r]\n\t"
  179777. #endif
  179778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179779. "adds r2, r2, r6\n\t"
  179780. #else
  179781. "add r2, r2, r6\n\t"
  179782. #endif
  179783. #ifdef WOLFSSL_KEIL
  179784. "adcs r3, r3, %[r]\n\t"
  179785. #elif defined(__clang__)
  179786. "adcs r3, %[r]\n\t"
  179787. #else
  179788. "adc r3, %[r]\n\t"
  179789. #endif
  179790. #ifdef WOLFSSL_KEIL
  179791. "adcs r4, r4, %[r]\n\t"
  179792. #elif defined(__clang__)
  179793. "adcs r4, %[r]\n\t"
  179794. #else
  179795. "adc r4, %[r]\n\t"
  179796. #endif
  179797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179798. "lsrs r6, r7, #16\n\t"
  179799. #else
  179800. "lsr r6, r7, #16\n\t"
  179801. #endif
  179802. #ifdef WOLFSSL_KEIL
  179803. "muls r5, r6, r5\n\t"
  179804. #elif defined(__clang__)
  179805. "muls r5, r6\n\t"
  179806. #else
  179807. "mul r5, r6\n\t"
  179808. #endif
  179809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179810. "lsrs r6, r5, #16\n\t"
  179811. #else
  179812. "lsr r6, r5, #16\n\t"
  179813. #endif
  179814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179815. "lsls r5, r5, #16\n\t"
  179816. #else
  179817. "lsl r5, r5, #16\n\t"
  179818. #endif
  179819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179820. "adds r2, r2, r5\n\t"
  179821. #else
  179822. "add r2, r2, r5\n\t"
  179823. #endif
  179824. #ifdef WOLFSSL_KEIL
  179825. "adcs r3, r3, r6\n\t"
  179826. #elif defined(__clang__)
  179827. "adcs r3, r6\n\t"
  179828. #else
  179829. "adc r3, r6\n\t"
  179830. #endif
  179831. #ifdef WOLFSSL_KEIL
  179832. "adcs r4, r4, %[r]\n\t"
  179833. #elif defined(__clang__)
  179834. "adcs r4, %[r]\n\t"
  179835. #else
  179836. "adc r4, %[r]\n\t"
  179837. #endif
  179838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179839. "adds r2, r2, r5\n\t"
  179840. #else
  179841. "add r2, r2, r5\n\t"
  179842. #endif
  179843. #ifdef WOLFSSL_KEIL
  179844. "adcs r3, r3, r6\n\t"
  179845. #elif defined(__clang__)
  179846. "adcs r3, r6\n\t"
  179847. #else
  179848. "adc r3, r6\n\t"
  179849. #endif
  179850. #ifdef WOLFSSL_KEIL
  179851. "adcs r4, r4, %[r]\n\t"
  179852. #elif defined(__clang__)
  179853. "adcs r4, %[r]\n\t"
  179854. #else
  179855. "adc r4, %[r]\n\t"
  179856. #endif
  179857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179858. "lsrs r5, %[a], #16\n\t"
  179859. #else
  179860. "lsr r5, %[a], #16\n\t"
  179861. #endif
  179862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179863. "lsrs r6, r7, #16\n\t"
  179864. #else
  179865. "lsr r6, r7, #16\n\t"
  179866. #endif
  179867. #ifdef WOLFSSL_KEIL
  179868. "muls r6, r5, r6\n\t"
  179869. #elif defined(__clang__)
  179870. "muls r6, r5\n\t"
  179871. #else
  179872. "mul r6, r5\n\t"
  179873. #endif
  179874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179875. "adds r3, r3, r6\n\t"
  179876. #else
  179877. "add r3, r3, r6\n\t"
  179878. #endif
  179879. #ifdef WOLFSSL_KEIL
  179880. "adcs r4, r4, %[r]\n\t"
  179881. #elif defined(__clang__)
  179882. "adcs r4, %[r]\n\t"
  179883. #else
  179884. "adc r4, %[r]\n\t"
  179885. #endif
  179886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179887. "adds r3, r3, r6\n\t"
  179888. #else
  179889. "add r3, r3, r6\n\t"
  179890. #endif
  179891. #ifdef WOLFSSL_KEIL
  179892. "adcs r4, r4, %[r]\n\t"
  179893. #elif defined(__clang__)
  179894. "adcs r4, %[r]\n\t"
  179895. #else
  179896. "adc r4, %[r]\n\t"
  179897. #endif
  179898. "uxth r6, r7\n\t"
  179899. #ifdef WOLFSSL_KEIL
  179900. "muls r5, r6, r5\n\t"
  179901. #elif defined(__clang__)
  179902. "muls r5, r6\n\t"
  179903. #else
  179904. "mul r5, r6\n\t"
  179905. #endif
  179906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179907. "lsrs r6, r5, #16\n\t"
  179908. #else
  179909. "lsr r6, r5, #16\n\t"
  179910. #endif
  179911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179912. "lsls r5, r5, #16\n\t"
  179913. #else
  179914. "lsl r5, r5, #16\n\t"
  179915. #endif
  179916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179917. "adds r2, r2, r5\n\t"
  179918. #else
  179919. "add r2, r2, r5\n\t"
  179920. #endif
  179921. #ifdef WOLFSSL_KEIL
  179922. "adcs r3, r3, r6\n\t"
  179923. #elif defined(__clang__)
  179924. "adcs r3, r6\n\t"
  179925. #else
  179926. "adc r3, r6\n\t"
  179927. #endif
  179928. #ifdef WOLFSSL_KEIL
  179929. "adcs r4, r4, %[r]\n\t"
  179930. #elif defined(__clang__)
  179931. "adcs r4, %[r]\n\t"
  179932. #else
  179933. "adc r4, %[r]\n\t"
  179934. #endif
  179935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179936. "adds r2, r2, r5\n\t"
  179937. #else
  179938. "add r2, r2, r5\n\t"
  179939. #endif
  179940. #ifdef WOLFSSL_KEIL
  179941. "adcs r3, r3, r6\n\t"
  179942. #elif defined(__clang__)
  179943. "adcs r3, r6\n\t"
  179944. #else
  179945. "adc r3, r6\n\t"
  179946. #endif
  179947. #ifdef WOLFSSL_KEIL
  179948. "adcs r4, r4, %[r]\n\t"
  179949. #elif defined(__clang__)
  179950. "adcs r4, %[r]\n\t"
  179951. #else
  179952. "adc r4, %[r]\n\t"
  179953. #endif
  179954. "# A[7] * A[5]\n\t"
  179955. "mov %[a], r9\n\t"
  179956. "ldr r7, [%[a], #20]\n\t"
  179957. "ldr %[a], [%[a], #28]\n\t"
  179958. "uxth r5, %[a]\n\t"
  179959. "uxth r6, r7\n\t"
  179960. #ifdef WOLFSSL_KEIL
  179961. "muls r6, r5, r6\n\t"
  179962. #elif defined(__clang__)
  179963. "muls r6, r5\n\t"
  179964. #else
  179965. "mul r6, r5\n\t"
  179966. #endif
  179967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179968. "adds r2, r2, r6\n\t"
  179969. #else
  179970. "add r2, r2, r6\n\t"
  179971. #endif
  179972. #ifdef WOLFSSL_KEIL
  179973. "adcs r3, r3, %[r]\n\t"
  179974. #elif defined(__clang__)
  179975. "adcs r3, %[r]\n\t"
  179976. #else
  179977. "adc r3, %[r]\n\t"
  179978. #endif
  179979. #ifdef WOLFSSL_KEIL
  179980. "adcs r4, r4, %[r]\n\t"
  179981. #elif defined(__clang__)
  179982. "adcs r4, %[r]\n\t"
  179983. #else
  179984. "adc r4, %[r]\n\t"
  179985. #endif
  179986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179987. "adds r2, r2, r6\n\t"
  179988. #else
  179989. "add r2, r2, r6\n\t"
  179990. #endif
  179991. #ifdef WOLFSSL_KEIL
  179992. "adcs r3, r3, %[r]\n\t"
  179993. #elif defined(__clang__)
  179994. "adcs r3, %[r]\n\t"
  179995. #else
  179996. "adc r3, %[r]\n\t"
  179997. #endif
  179998. #ifdef WOLFSSL_KEIL
  179999. "adcs r4, r4, %[r]\n\t"
  180000. #elif defined(__clang__)
  180001. "adcs r4, %[r]\n\t"
  180002. #else
  180003. "adc r4, %[r]\n\t"
  180004. #endif
  180005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180006. "lsrs r6, r7, #16\n\t"
  180007. #else
  180008. "lsr r6, r7, #16\n\t"
  180009. #endif
  180010. #ifdef WOLFSSL_KEIL
  180011. "muls r5, r6, r5\n\t"
  180012. #elif defined(__clang__)
  180013. "muls r5, r6\n\t"
  180014. #else
  180015. "mul r5, r6\n\t"
  180016. #endif
  180017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180018. "lsrs r6, r5, #16\n\t"
  180019. #else
  180020. "lsr r6, r5, #16\n\t"
  180021. #endif
  180022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180023. "lsls r5, r5, #16\n\t"
  180024. #else
  180025. "lsl r5, r5, #16\n\t"
  180026. #endif
  180027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180028. "adds r2, r2, r5\n\t"
  180029. #else
  180030. "add r2, r2, r5\n\t"
  180031. #endif
  180032. #ifdef WOLFSSL_KEIL
  180033. "adcs r3, r3, r6\n\t"
  180034. #elif defined(__clang__)
  180035. "adcs r3, r6\n\t"
  180036. #else
  180037. "adc r3, r6\n\t"
  180038. #endif
  180039. #ifdef WOLFSSL_KEIL
  180040. "adcs r4, r4, %[r]\n\t"
  180041. #elif defined(__clang__)
  180042. "adcs r4, %[r]\n\t"
  180043. #else
  180044. "adc r4, %[r]\n\t"
  180045. #endif
  180046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180047. "adds r2, r2, r5\n\t"
  180048. #else
  180049. "add r2, r2, r5\n\t"
  180050. #endif
  180051. #ifdef WOLFSSL_KEIL
  180052. "adcs r3, r3, r6\n\t"
  180053. #elif defined(__clang__)
  180054. "adcs r3, r6\n\t"
  180055. #else
  180056. "adc r3, r6\n\t"
  180057. #endif
  180058. #ifdef WOLFSSL_KEIL
  180059. "adcs r4, r4, %[r]\n\t"
  180060. #elif defined(__clang__)
  180061. "adcs r4, %[r]\n\t"
  180062. #else
  180063. "adc r4, %[r]\n\t"
  180064. #endif
  180065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180066. "lsrs r5, %[a], #16\n\t"
  180067. #else
  180068. "lsr r5, %[a], #16\n\t"
  180069. #endif
  180070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180071. "lsrs r6, r7, #16\n\t"
  180072. #else
  180073. "lsr r6, r7, #16\n\t"
  180074. #endif
  180075. #ifdef WOLFSSL_KEIL
  180076. "muls r6, r5, r6\n\t"
  180077. #elif defined(__clang__)
  180078. "muls r6, r5\n\t"
  180079. #else
  180080. "mul r6, r5\n\t"
  180081. #endif
  180082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180083. "adds r3, r3, r6\n\t"
  180084. #else
  180085. "add r3, r3, r6\n\t"
  180086. #endif
  180087. #ifdef WOLFSSL_KEIL
  180088. "adcs r4, r4, %[r]\n\t"
  180089. #elif defined(__clang__)
  180090. "adcs r4, %[r]\n\t"
  180091. #else
  180092. "adc r4, %[r]\n\t"
  180093. #endif
  180094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180095. "adds r3, r3, r6\n\t"
  180096. #else
  180097. "add r3, r3, r6\n\t"
  180098. #endif
  180099. #ifdef WOLFSSL_KEIL
  180100. "adcs r4, r4, %[r]\n\t"
  180101. #elif defined(__clang__)
  180102. "adcs r4, %[r]\n\t"
  180103. #else
  180104. "adc r4, %[r]\n\t"
  180105. #endif
  180106. "uxth r6, r7\n\t"
  180107. #ifdef WOLFSSL_KEIL
  180108. "muls r5, r6, r5\n\t"
  180109. #elif defined(__clang__)
  180110. "muls r5, r6\n\t"
  180111. #else
  180112. "mul r5, r6\n\t"
  180113. #endif
  180114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180115. "lsrs r6, r5, #16\n\t"
  180116. #else
  180117. "lsr r6, r5, #16\n\t"
  180118. #endif
  180119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180120. "lsls r5, r5, #16\n\t"
  180121. #else
  180122. "lsl r5, r5, #16\n\t"
  180123. #endif
  180124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180125. "adds r2, r2, r5\n\t"
  180126. #else
  180127. "add r2, r2, r5\n\t"
  180128. #endif
  180129. #ifdef WOLFSSL_KEIL
  180130. "adcs r3, r3, r6\n\t"
  180131. #elif defined(__clang__)
  180132. "adcs r3, r6\n\t"
  180133. #else
  180134. "adc r3, r6\n\t"
  180135. #endif
  180136. #ifdef WOLFSSL_KEIL
  180137. "adcs r4, r4, %[r]\n\t"
  180138. #elif defined(__clang__)
  180139. "adcs r4, %[r]\n\t"
  180140. #else
  180141. "adc r4, %[r]\n\t"
  180142. #endif
  180143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180144. "adds r2, r2, r5\n\t"
  180145. #else
  180146. "add r2, r2, r5\n\t"
  180147. #endif
  180148. #ifdef WOLFSSL_KEIL
  180149. "adcs r3, r3, r6\n\t"
  180150. #elif defined(__clang__)
  180151. "adcs r3, r6\n\t"
  180152. #else
  180153. "adc r3, r6\n\t"
  180154. #endif
  180155. #ifdef WOLFSSL_KEIL
  180156. "adcs r4, r4, %[r]\n\t"
  180157. #elif defined(__clang__)
  180158. "adcs r4, %[r]\n\t"
  180159. #else
  180160. "adc r4, %[r]\n\t"
  180161. #endif
  180162. "# A[6] * A[6]\n\t"
  180163. "mov %[a], r9\n\t"
  180164. "ldr r7, [%[a], #24]\n\t"
  180165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180166. "lsrs r6, r7, #16\n\t"
  180167. #else
  180168. "lsr r6, r7, #16\n\t"
  180169. #endif
  180170. "uxth r5, r7\n\t"
  180171. #ifdef WOLFSSL_KEIL
  180172. "muls r5, r5, r5\n\t"
  180173. #elif defined(__clang__)
  180174. "muls r5, r5\n\t"
  180175. #else
  180176. "mul r5, r5\n\t"
  180177. #endif
  180178. #ifdef WOLFSSL_KEIL
  180179. "muls r6, r6, r6\n\t"
  180180. #elif defined(__clang__)
  180181. "muls r6, r6\n\t"
  180182. #else
  180183. "mul r6, r6\n\t"
  180184. #endif
  180185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180186. "adds r2, r2, r5\n\t"
  180187. #else
  180188. "add r2, r2, r5\n\t"
  180189. #endif
  180190. #ifdef WOLFSSL_KEIL
  180191. "adcs r3, r3, r6\n\t"
  180192. #elif defined(__clang__)
  180193. "adcs r3, r6\n\t"
  180194. #else
  180195. "adc r3, r6\n\t"
  180196. #endif
  180197. #ifdef WOLFSSL_KEIL
  180198. "adcs r4, r4, %[r]\n\t"
  180199. #elif defined(__clang__)
  180200. "adcs r4, %[r]\n\t"
  180201. #else
  180202. "adc r4, %[r]\n\t"
  180203. #endif
  180204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180205. "lsrs r6, r7, #16\n\t"
  180206. #else
  180207. "lsr r6, r7, #16\n\t"
  180208. #endif
  180209. "uxth r5, r7\n\t"
  180210. #ifdef WOLFSSL_KEIL
  180211. "muls r5, r6, r5\n\t"
  180212. #elif defined(__clang__)
  180213. "muls r5, r6\n\t"
  180214. #else
  180215. "mul r5, r6\n\t"
  180216. #endif
  180217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180218. "lsrs r6, r5, #15\n\t"
  180219. #else
  180220. "lsr r6, r5, #15\n\t"
  180221. #endif
  180222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180223. "lsls r5, r5, #17\n\t"
  180224. #else
  180225. "lsl r5, r5, #17\n\t"
  180226. #endif
  180227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180228. "adds r2, r2, r5\n\t"
  180229. #else
  180230. "add r2, r2, r5\n\t"
  180231. #endif
  180232. #ifdef WOLFSSL_KEIL
  180233. "adcs r3, r3, r6\n\t"
  180234. #elif defined(__clang__)
  180235. "adcs r3, r6\n\t"
  180236. #else
  180237. "adc r3, r6\n\t"
  180238. #endif
  180239. #ifdef WOLFSSL_KEIL
  180240. "adcs r4, r4, %[r]\n\t"
  180241. #elif defined(__clang__)
  180242. "adcs r4, %[r]\n\t"
  180243. #else
  180244. "adc r4, %[r]\n\t"
  180245. #endif
  180246. "str r2, [sp, #48]\n\t"
  180247. "# A[7] * A[6]\n\t"
  180248. "movs r2, #0\n\t"
  180249. "ldr %[a], [%[a], #28]\n\t"
  180250. "uxth r5, %[a]\n\t"
  180251. "uxth r6, r7\n\t"
  180252. #ifdef WOLFSSL_KEIL
  180253. "muls r6, r5, r6\n\t"
  180254. #elif defined(__clang__)
  180255. "muls r6, r5\n\t"
  180256. #else
  180257. "mul r6, r5\n\t"
  180258. #endif
  180259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180260. "adds r3, r3, r6\n\t"
  180261. #else
  180262. "add r3, r3, r6\n\t"
  180263. #endif
  180264. #ifdef WOLFSSL_KEIL
  180265. "adcs r4, r4, %[r]\n\t"
  180266. #elif defined(__clang__)
  180267. "adcs r4, %[r]\n\t"
  180268. #else
  180269. "adc r4, %[r]\n\t"
  180270. #endif
  180271. #ifdef WOLFSSL_KEIL
  180272. "adcs r2, r2, %[r]\n\t"
  180273. #elif defined(__clang__)
  180274. "adcs r2, %[r]\n\t"
  180275. #else
  180276. "adc r2, %[r]\n\t"
  180277. #endif
  180278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180279. "adds r3, r3, r6\n\t"
  180280. #else
  180281. "add r3, r3, r6\n\t"
  180282. #endif
  180283. #ifdef WOLFSSL_KEIL
  180284. "adcs r4, r4, %[r]\n\t"
  180285. #elif defined(__clang__)
  180286. "adcs r4, %[r]\n\t"
  180287. #else
  180288. "adc r4, %[r]\n\t"
  180289. #endif
  180290. #ifdef WOLFSSL_KEIL
  180291. "adcs r2, r2, %[r]\n\t"
  180292. #elif defined(__clang__)
  180293. "adcs r2, %[r]\n\t"
  180294. #else
  180295. "adc r2, %[r]\n\t"
  180296. #endif
  180297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180298. "lsrs r6, r7, #16\n\t"
  180299. #else
  180300. "lsr r6, r7, #16\n\t"
  180301. #endif
  180302. #ifdef WOLFSSL_KEIL
  180303. "muls r5, r6, r5\n\t"
  180304. #elif defined(__clang__)
  180305. "muls r5, r6\n\t"
  180306. #else
  180307. "mul r5, r6\n\t"
  180308. #endif
  180309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180310. "lsrs r6, r5, #16\n\t"
  180311. #else
  180312. "lsr r6, r5, #16\n\t"
  180313. #endif
  180314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180315. "lsls r5, r5, #16\n\t"
  180316. #else
  180317. "lsl r5, r5, #16\n\t"
  180318. #endif
  180319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180320. "adds r3, r3, r5\n\t"
  180321. #else
  180322. "add r3, r3, r5\n\t"
  180323. #endif
  180324. #ifdef WOLFSSL_KEIL
  180325. "adcs r4, r4, r6\n\t"
  180326. #elif defined(__clang__)
  180327. "adcs r4, r6\n\t"
  180328. #else
  180329. "adc r4, r6\n\t"
  180330. #endif
  180331. #ifdef WOLFSSL_KEIL
  180332. "adcs r2, r2, %[r]\n\t"
  180333. #elif defined(__clang__)
  180334. "adcs r2, %[r]\n\t"
  180335. #else
  180336. "adc r2, %[r]\n\t"
  180337. #endif
  180338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180339. "adds r3, r3, r5\n\t"
  180340. #else
  180341. "add r3, r3, r5\n\t"
  180342. #endif
  180343. #ifdef WOLFSSL_KEIL
  180344. "adcs r4, r4, r6\n\t"
  180345. #elif defined(__clang__)
  180346. "adcs r4, r6\n\t"
  180347. #else
  180348. "adc r4, r6\n\t"
  180349. #endif
  180350. #ifdef WOLFSSL_KEIL
  180351. "adcs r2, r2, %[r]\n\t"
  180352. #elif defined(__clang__)
  180353. "adcs r2, %[r]\n\t"
  180354. #else
  180355. "adc r2, %[r]\n\t"
  180356. #endif
  180357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180358. "lsrs r5, %[a], #16\n\t"
  180359. #else
  180360. "lsr r5, %[a], #16\n\t"
  180361. #endif
  180362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180363. "lsrs r6, r7, #16\n\t"
  180364. #else
  180365. "lsr r6, r7, #16\n\t"
  180366. #endif
  180367. #ifdef WOLFSSL_KEIL
  180368. "muls r6, r5, r6\n\t"
  180369. #elif defined(__clang__)
  180370. "muls r6, r5\n\t"
  180371. #else
  180372. "mul r6, r5\n\t"
  180373. #endif
  180374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180375. "adds r4, r4, r6\n\t"
  180376. #else
  180377. "add r4, r4, r6\n\t"
  180378. #endif
  180379. #ifdef WOLFSSL_KEIL
  180380. "adcs r2, r2, %[r]\n\t"
  180381. #elif defined(__clang__)
  180382. "adcs r2, %[r]\n\t"
  180383. #else
  180384. "adc r2, %[r]\n\t"
  180385. #endif
  180386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180387. "adds r4, r4, r6\n\t"
  180388. #else
  180389. "add r4, r4, r6\n\t"
  180390. #endif
  180391. #ifdef WOLFSSL_KEIL
  180392. "adcs r2, r2, %[r]\n\t"
  180393. #elif defined(__clang__)
  180394. "adcs r2, %[r]\n\t"
  180395. #else
  180396. "adc r2, %[r]\n\t"
  180397. #endif
  180398. "uxth r6, r7\n\t"
  180399. #ifdef WOLFSSL_KEIL
  180400. "muls r5, r6, r5\n\t"
  180401. #elif defined(__clang__)
  180402. "muls r5, r6\n\t"
  180403. #else
  180404. "mul r5, r6\n\t"
  180405. #endif
  180406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180407. "lsrs r6, r5, #16\n\t"
  180408. #else
  180409. "lsr r6, r5, #16\n\t"
  180410. #endif
  180411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180412. "lsls r5, r5, #16\n\t"
  180413. #else
  180414. "lsl r5, r5, #16\n\t"
  180415. #endif
  180416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180417. "adds r3, r3, r5\n\t"
  180418. #else
  180419. "add r3, r3, r5\n\t"
  180420. #endif
  180421. #ifdef WOLFSSL_KEIL
  180422. "adcs r4, r4, r6\n\t"
  180423. #elif defined(__clang__)
  180424. "adcs r4, r6\n\t"
  180425. #else
  180426. "adc r4, r6\n\t"
  180427. #endif
  180428. #ifdef WOLFSSL_KEIL
  180429. "adcs r2, r2, %[r]\n\t"
  180430. #elif defined(__clang__)
  180431. "adcs r2, %[r]\n\t"
  180432. #else
  180433. "adc r2, %[r]\n\t"
  180434. #endif
  180435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180436. "adds r3, r3, r5\n\t"
  180437. #else
  180438. "add r3, r3, r5\n\t"
  180439. #endif
  180440. #ifdef WOLFSSL_KEIL
  180441. "adcs r4, r4, r6\n\t"
  180442. #elif defined(__clang__)
  180443. "adcs r4, r6\n\t"
  180444. #else
  180445. "adc r4, r6\n\t"
  180446. #endif
  180447. #ifdef WOLFSSL_KEIL
  180448. "adcs r2, r2, %[r]\n\t"
  180449. #elif defined(__clang__)
  180450. "adcs r2, %[r]\n\t"
  180451. #else
  180452. "adc r2, %[r]\n\t"
  180453. #endif
  180454. "# A[8] * A[5]\n\t"
  180455. "mov %[a], r9\n\t"
  180456. "ldr r7, [%[a], #20]\n\t"
  180457. "ldr %[a], [%[a], #32]\n\t"
  180458. "uxth r5, %[a]\n\t"
  180459. "uxth r6, r7\n\t"
  180460. #ifdef WOLFSSL_KEIL
  180461. "muls r6, r5, r6\n\t"
  180462. #elif defined(__clang__)
  180463. "muls r6, r5\n\t"
  180464. #else
  180465. "mul r6, r5\n\t"
  180466. #endif
  180467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180468. "adds r3, r3, r6\n\t"
  180469. #else
  180470. "add r3, r3, r6\n\t"
  180471. #endif
  180472. #ifdef WOLFSSL_KEIL
  180473. "adcs r4, r4, %[r]\n\t"
  180474. #elif defined(__clang__)
  180475. "adcs r4, %[r]\n\t"
  180476. #else
  180477. "adc r4, %[r]\n\t"
  180478. #endif
  180479. #ifdef WOLFSSL_KEIL
  180480. "adcs r2, r2, %[r]\n\t"
  180481. #elif defined(__clang__)
  180482. "adcs r2, %[r]\n\t"
  180483. #else
  180484. "adc r2, %[r]\n\t"
  180485. #endif
  180486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180487. "adds r3, r3, r6\n\t"
  180488. #else
  180489. "add r3, r3, r6\n\t"
  180490. #endif
  180491. #ifdef WOLFSSL_KEIL
  180492. "adcs r4, r4, %[r]\n\t"
  180493. #elif defined(__clang__)
  180494. "adcs r4, %[r]\n\t"
  180495. #else
  180496. "adc r4, %[r]\n\t"
  180497. #endif
  180498. #ifdef WOLFSSL_KEIL
  180499. "adcs r2, r2, %[r]\n\t"
  180500. #elif defined(__clang__)
  180501. "adcs r2, %[r]\n\t"
  180502. #else
  180503. "adc r2, %[r]\n\t"
  180504. #endif
  180505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180506. "lsrs r6, r7, #16\n\t"
  180507. #else
  180508. "lsr r6, r7, #16\n\t"
  180509. #endif
  180510. #ifdef WOLFSSL_KEIL
  180511. "muls r5, r6, r5\n\t"
  180512. #elif defined(__clang__)
  180513. "muls r5, r6\n\t"
  180514. #else
  180515. "mul r5, r6\n\t"
  180516. #endif
  180517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180518. "lsrs r6, r5, #16\n\t"
  180519. #else
  180520. "lsr r6, r5, #16\n\t"
  180521. #endif
  180522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180523. "lsls r5, r5, #16\n\t"
  180524. #else
  180525. "lsl r5, r5, #16\n\t"
  180526. #endif
  180527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180528. "adds r3, r3, r5\n\t"
  180529. #else
  180530. "add r3, r3, r5\n\t"
  180531. #endif
  180532. #ifdef WOLFSSL_KEIL
  180533. "adcs r4, r4, r6\n\t"
  180534. #elif defined(__clang__)
  180535. "adcs r4, r6\n\t"
  180536. #else
  180537. "adc r4, r6\n\t"
  180538. #endif
  180539. #ifdef WOLFSSL_KEIL
  180540. "adcs r2, r2, %[r]\n\t"
  180541. #elif defined(__clang__)
  180542. "adcs r2, %[r]\n\t"
  180543. #else
  180544. "adc r2, %[r]\n\t"
  180545. #endif
  180546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180547. "adds r3, r3, r5\n\t"
  180548. #else
  180549. "add r3, r3, r5\n\t"
  180550. #endif
  180551. #ifdef WOLFSSL_KEIL
  180552. "adcs r4, r4, r6\n\t"
  180553. #elif defined(__clang__)
  180554. "adcs r4, r6\n\t"
  180555. #else
  180556. "adc r4, r6\n\t"
  180557. #endif
  180558. #ifdef WOLFSSL_KEIL
  180559. "adcs r2, r2, %[r]\n\t"
  180560. #elif defined(__clang__)
  180561. "adcs r2, %[r]\n\t"
  180562. #else
  180563. "adc r2, %[r]\n\t"
  180564. #endif
  180565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180566. "lsrs r5, %[a], #16\n\t"
  180567. #else
  180568. "lsr r5, %[a], #16\n\t"
  180569. #endif
  180570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180571. "lsrs r6, r7, #16\n\t"
  180572. #else
  180573. "lsr r6, r7, #16\n\t"
  180574. #endif
  180575. #ifdef WOLFSSL_KEIL
  180576. "muls r6, r5, r6\n\t"
  180577. #elif defined(__clang__)
  180578. "muls r6, r5\n\t"
  180579. #else
  180580. "mul r6, r5\n\t"
  180581. #endif
  180582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180583. "adds r4, r4, r6\n\t"
  180584. #else
  180585. "add r4, r4, r6\n\t"
  180586. #endif
  180587. #ifdef WOLFSSL_KEIL
  180588. "adcs r2, r2, %[r]\n\t"
  180589. #elif defined(__clang__)
  180590. "adcs r2, %[r]\n\t"
  180591. #else
  180592. "adc r2, %[r]\n\t"
  180593. #endif
  180594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180595. "adds r4, r4, r6\n\t"
  180596. #else
  180597. "add r4, r4, r6\n\t"
  180598. #endif
  180599. #ifdef WOLFSSL_KEIL
  180600. "adcs r2, r2, %[r]\n\t"
  180601. #elif defined(__clang__)
  180602. "adcs r2, %[r]\n\t"
  180603. #else
  180604. "adc r2, %[r]\n\t"
  180605. #endif
  180606. "uxth r6, r7\n\t"
  180607. #ifdef WOLFSSL_KEIL
  180608. "muls r5, r6, r5\n\t"
  180609. #elif defined(__clang__)
  180610. "muls r5, r6\n\t"
  180611. #else
  180612. "mul r5, r6\n\t"
  180613. #endif
  180614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180615. "lsrs r6, r5, #16\n\t"
  180616. #else
  180617. "lsr r6, r5, #16\n\t"
  180618. #endif
  180619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180620. "lsls r5, r5, #16\n\t"
  180621. #else
  180622. "lsl r5, r5, #16\n\t"
  180623. #endif
  180624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180625. "adds r3, r3, r5\n\t"
  180626. #else
  180627. "add r3, r3, r5\n\t"
  180628. #endif
  180629. #ifdef WOLFSSL_KEIL
  180630. "adcs r4, r4, r6\n\t"
  180631. #elif defined(__clang__)
  180632. "adcs r4, r6\n\t"
  180633. #else
  180634. "adc r4, r6\n\t"
  180635. #endif
  180636. #ifdef WOLFSSL_KEIL
  180637. "adcs r2, r2, %[r]\n\t"
  180638. #elif defined(__clang__)
  180639. "adcs r2, %[r]\n\t"
  180640. #else
  180641. "adc r2, %[r]\n\t"
  180642. #endif
  180643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180644. "adds r3, r3, r5\n\t"
  180645. #else
  180646. "add r3, r3, r5\n\t"
  180647. #endif
  180648. #ifdef WOLFSSL_KEIL
  180649. "adcs r4, r4, r6\n\t"
  180650. #elif defined(__clang__)
  180651. "adcs r4, r6\n\t"
  180652. #else
  180653. "adc r4, r6\n\t"
  180654. #endif
  180655. #ifdef WOLFSSL_KEIL
  180656. "adcs r2, r2, %[r]\n\t"
  180657. #elif defined(__clang__)
  180658. "adcs r2, %[r]\n\t"
  180659. #else
  180660. "adc r2, %[r]\n\t"
  180661. #endif
  180662. "# A[9] * A[4]\n\t"
  180663. "mov %[a], r9\n\t"
  180664. "ldr r7, [%[a], #16]\n\t"
  180665. "ldr %[a], [%[a], #36]\n\t"
  180666. "uxth r5, %[a]\n\t"
  180667. "uxth r6, r7\n\t"
  180668. #ifdef WOLFSSL_KEIL
  180669. "muls r6, r5, r6\n\t"
  180670. #elif defined(__clang__)
  180671. "muls r6, r5\n\t"
  180672. #else
  180673. "mul r6, r5\n\t"
  180674. #endif
  180675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180676. "adds r3, r3, r6\n\t"
  180677. #else
  180678. "add r3, r3, r6\n\t"
  180679. #endif
  180680. #ifdef WOLFSSL_KEIL
  180681. "adcs r4, r4, %[r]\n\t"
  180682. #elif defined(__clang__)
  180683. "adcs r4, %[r]\n\t"
  180684. #else
  180685. "adc r4, %[r]\n\t"
  180686. #endif
  180687. #ifdef WOLFSSL_KEIL
  180688. "adcs r2, r2, %[r]\n\t"
  180689. #elif defined(__clang__)
  180690. "adcs r2, %[r]\n\t"
  180691. #else
  180692. "adc r2, %[r]\n\t"
  180693. #endif
  180694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180695. "adds r3, r3, r6\n\t"
  180696. #else
  180697. "add r3, r3, r6\n\t"
  180698. #endif
  180699. #ifdef WOLFSSL_KEIL
  180700. "adcs r4, r4, %[r]\n\t"
  180701. #elif defined(__clang__)
  180702. "adcs r4, %[r]\n\t"
  180703. #else
  180704. "adc r4, %[r]\n\t"
  180705. #endif
  180706. #ifdef WOLFSSL_KEIL
  180707. "adcs r2, r2, %[r]\n\t"
  180708. #elif defined(__clang__)
  180709. "adcs r2, %[r]\n\t"
  180710. #else
  180711. "adc r2, %[r]\n\t"
  180712. #endif
  180713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180714. "lsrs r6, r7, #16\n\t"
  180715. #else
  180716. "lsr r6, r7, #16\n\t"
  180717. #endif
  180718. #ifdef WOLFSSL_KEIL
  180719. "muls r5, r6, r5\n\t"
  180720. #elif defined(__clang__)
  180721. "muls r5, r6\n\t"
  180722. #else
  180723. "mul r5, r6\n\t"
  180724. #endif
  180725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180726. "lsrs r6, r5, #16\n\t"
  180727. #else
  180728. "lsr r6, r5, #16\n\t"
  180729. #endif
  180730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180731. "lsls r5, r5, #16\n\t"
  180732. #else
  180733. "lsl r5, r5, #16\n\t"
  180734. #endif
  180735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180736. "adds r3, r3, r5\n\t"
  180737. #else
  180738. "add r3, r3, r5\n\t"
  180739. #endif
  180740. #ifdef WOLFSSL_KEIL
  180741. "adcs r4, r4, r6\n\t"
  180742. #elif defined(__clang__)
  180743. "adcs r4, r6\n\t"
  180744. #else
  180745. "adc r4, r6\n\t"
  180746. #endif
  180747. #ifdef WOLFSSL_KEIL
  180748. "adcs r2, r2, %[r]\n\t"
  180749. #elif defined(__clang__)
  180750. "adcs r2, %[r]\n\t"
  180751. #else
  180752. "adc r2, %[r]\n\t"
  180753. #endif
  180754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180755. "adds r3, r3, r5\n\t"
  180756. #else
  180757. "add r3, r3, r5\n\t"
  180758. #endif
  180759. #ifdef WOLFSSL_KEIL
  180760. "adcs r4, r4, r6\n\t"
  180761. #elif defined(__clang__)
  180762. "adcs r4, r6\n\t"
  180763. #else
  180764. "adc r4, r6\n\t"
  180765. #endif
  180766. #ifdef WOLFSSL_KEIL
  180767. "adcs r2, r2, %[r]\n\t"
  180768. #elif defined(__clang__)
  180769. "adcs r2, %[r]\n\t"
  180770. #else
  180771. "adc r2, %[r]\n\t"
  180772. #endif
  180773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180774. "lsrs r5, %[a], #16\n\t"
  180775. #else
  180776. "lsr r5, %[a], #16\n\t"
  180777. #endif
  180778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180779. "lsrs r6, r7, #16\n\t"
  180780. #else
  180781. "lsr r6, r7, #16\n\t"
  180782. #endif
  180783. #ifdef WOLFSSL_KEIL
  180784. "muls r6, r5, r6\n\t"
  180785. #elif defined(__clang__)
  180786. "muls r6, r5\n\t"
  180787. #else
  180788. "mul r6, r5\n\t"
  180789. #endif
  180790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180791. "adds r4, r4, r6\n\t"
  180792. #else
  180793. "add r4, r4, r6\n\t"
  180794. #endif
  180795. #ifdef WOLFSSL_KEIL
  180796. "adcs r2, r2, %[r]\n\t"
  180797. #elif defined(__clang__)
  180798. "adcs r2, %[r]\n\t"
  180799. #else
  180800. "adc r2, %[r]\n\t"
  180801. #endif
  180802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180803. "adds r4, r4, r6\n\t"
  180804. #else
  180805. "add r4, r4, r6\n\t"
  180806. #endif
  180807. #ifdef WOLFSSL_KEIL
  180808. "adcs r2, r2, %[r]\n\t"
  180809. #elif defined(__clang__)
  180810. "adcs r2, %[r]\n\t"
  180811. #else
  180812. "adc r2, %[r]\n\t"
  180813. #endif
  180814. "uxth r6, r7\n\t"
  180815. #ifdef WOLFSSL_KEIL
  180816. "muls r5, r6, r5\n\t"
  180817. #elif defined(__clang__)
  180818. "muls r5, r6\n\t"
  180819. #else
  180820. "mul r5, r6\n\t"
  180821. #endif
  180822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180823. "lsrs r6, r5, #16\n\t"
  180824. #else
  180825. "lsr r6, r5, #16\n\t"
  180826. #endif
  180827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180828. "lsls r5, r5, #16\n\t"
  180829. #else
  180830. "lsl r5, r5, #16\n\t"
  180831. #endif
  180832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180833. "adds r3, r3, r5\n\t"
  180834. #else
  180835. "add r3, r3, r5\n\t"
  180836. #endif
  180837. #ifdef WOLFSSL_KEIL
  180838. "adcs r4, r4, r6\n\t"
  180839. #elif defined(__clang__)
  180840. "adcs r4, r6\n\t"
  180841. #else
  180842. "adc r4, r6\n\t"
  180843. #endif
  180844. #ifdef WOLFSSL_KEIL
  180845. "adcs r2, r2, %[r]\n\t"
  180846. #elif defined(__clang__)
  180847. "adcs r2, %[r]\n\t"
  180848. #else
  180849. "adc r2, %[r]\n\t"
  180850. #endif
  180851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180852. "adds r3, r3, r5\n\t"
  180853. #else
  180854. "add r3, r3, r5\n\t"
  180855. #endif
  180856. #ifdef WOLFSSL_KEIL
  180857. "adcs r4, r4, r6\n\t"
  180858. #elif defined(__clang__)
  180859. "adcs r4, r6\n\t"
  180860. #else
  180861. "adc r4, r6\n\t"
  180862. #endif
  180863. #ifdef WOLFSSL_KEIL
  180864. "adcs r2, r2, %[r]\n\t"
  180865. #elif defined(__clang__)
  180866. "adcs r2, %[r]\n\t"
  180867. #else
  180868. "adc r2, %[r]\n\t"
  180869. #endif
  180870. "# A[10] * A[3]\n\t"
  180871. "mov %[a], r9\n\t"
  180872. "mov r7, lr\n\t"
  180873. "ldr %[a], [%[a], #40]\n\t"
  180874. "uxth r5, %[a]\n\t"
  180875. "uxth r6, r7\n\t"
  180876. #ifdef WOLFSSL_KEIL
  180877. "muls r6, r5, r6\n\t"
  180878. #elif defined(__clang__)
  180879. "muls r6, r5\n\t"
  180880. #else
  180881. "mul r6, r5\n\t"
  180882. #endif
  180883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180884. "adds r3, r3, r6\n\t"
  180885. #else
  180886. "add r3, r3, r6\n\t"
  180887. #endif
  180888. #ifdef WOLFSSL_KEIL
  180889. "adcs r4, r4, %[r]\n\t"
  180890. #elif defined(__clang__)
  180891. "adcs r4, %[r]\n\t"
  180892. #else
  180893. "adc r4, %[r]\n\t"
  180894. #endif
  180895. #ifdef WOLFSSL_KEIL
  180896. "adcs r2, r2, %[r]\n\t"
  180897. #elif defined(__clang__)
  180898. "adcs r2, %[r]\n\t"
  180899. #else
  180900. "adc r2, %[r]\n\t"
  180901. #endif
  180902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180903. "adds r3, r3, r6\n\t"
  180904. #else
  180905. "add r3, r3, r6\n\t"
  180906. #endif
  180907. #ifdef WOLFSSL_KEIL
  180908. "adcs r4, r4, %[r]\n\t"
  180909. #elif defined(__clang__)
  180910. "adcs r4, %[r]\n\t"
  180911. #else
  180912. "adc r4, %[r]\n\t"
  180913. #endif
  180914. #ifdef WOLFSSL_KEIL
  180915. "adcs r2, r2, %[r]\n\t"
  180916. #elif defined(__clang__)
  180917. "adcs r2, %[r]\n\t"
  180918. #else
  180919. "adc r2, %[r]\n\t"
  180920. #endif
  180921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180922. "lsrs r6, r7, #16\n\t"
  180923. #else
  180924. "lsr r6, r7, #16\n\t"
  180925. #endif
  180926. #ifdef WOLFSSL_KEIL
  180927. "muls r5, r6, r5\n\t"
  180928. #elif defined(__clang__)
  180929. "muls r5, r6\n\t"
  180930. #else
  180931. "mul r5, r6\n\t"
  180932. #endif
  180933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180934. "lsrs r6, r5, #16\n\t"
  180935. #else
  180936. "lsr r6, r5, #16\n\t"
  180937. #endif
  180938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180939. "lsls r5, r5, #16\n\t"
  180940. #else
  180941. "lsl r5, r5, #16\n\t"
  180942. #endif
  180943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180944. "adds r3, r3, r5\n\t"
  180945. #else
  180946. "add r3, r3, r5\n\t"
  180947. #endif
  180948. #ifdef WOLFSSL_KEIL
  180949. "adcs r4, r4, r6\n\t"
  180950. #elif defined(__clang__)
  180951. "adcs r4, r6\n\t"
  180952. #else
  180953. "adc r4, r6\n\t"
  180954. #endif
  180955. #ifdef WOLFSSL_KEIL
  180956. "adcs r2, r2, %[r]\n\t"
  180957. #elif defined(__clang__)
  180958. "adcs r2, %[r]\n\t"
  180959. #else
  180960. "adc r2, %[r]\n\t"
  180961. #endif
  180962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180963. "adds r3, r3, r5\n\t"
  180964. #else
  180965. "add r3, r3, r5\n\t"
  180966. #endif
  180967. #ifdef WOLFSSL_KEIL
  180968. "adcs r4, r4, r6\n\t"
  180969. #elif defined(__clang__)
  180970. "adcs r4, r6\n\t"
  180971. #else
  180972. "adc r4, r6\n\t"
  180973. #endif
  180974. #ifdef WOLFSSL_KEIL
  180975. "adcs r2, r2, %[r]\n\t"
  180976. #elif defined(__clang__)
  180977. "adcs r2, %[r]\n\t"
  180978. #else
  180979. "adc r2, %[r]\n\t"
  180980. #endif
  180981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180982. "lsrs r5, %[a], #16\n\t"
  180983. #else
  180984. "lsr r5, %[a], #16\n\t"
  180985. #endif
  180986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180987. "lsrs r6, r7, #16\n\t"
  180988. #else
  180989. "lsr r6, r7, #16\n\t"
  180990. #endif
  180991. #ifdef WOLFSSL_KEIL
  180992. "muls r6, r5, r6\n\t"
  180993. #elif defined(__clang__)
  180994. "muls r6, r5\n\t"
  180995. #else
  180996. "mul r6, r5\n\t"
  180997. #endif
  180998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180999. "adds r4, r4, r6\n\t"
  181000. #else
  181001. "add r4, r4, r6\n\t"
  181002. #endif
  181003. #ifdef WOLFSSL_KEIL
  181004. "adcs r2, r2, %[r]\n\t"
  181005. #elif defined(__clang__)
  181006. "adcs r2, %[r]\n\t"
  181007. #else
  181008. "adc r2, %[r]\n\t"
  181009. #endif
  181010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181011. "adds r4, r4, r6\n\t"
  181012. #else
  181013. "add r4, r4, r6\n\t"
  181014. #endif
  181015. #ifdef WOLFSSL_KEIL
  181016. "adcs r2, r2, %[r]\n\t"
  181017. #elif defined(__clang__)
  181018. "adcs r2, %[r]\n\t"
  181019. #else
  181020. "adc r2, %[r]\n\t"
  181021. #endif
  181022. "uxth r6, r7\n\t"
  181023. #ifdef WOLFSSL_KEIL
  181024. "muls r5, r6, r5\n\t"
  181025. #elif defined(__clang__)
  181026. "muls r5, r6\n\t"
  181027. #else
  181028. "mul r5, r6\n\t"
  181029. #endif
  181030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181031. "lsrs r6, r5, #16\n\t"
  181032. #else
  181033. "lsr r6, r5, #16\n\t"
  181034. #endif
  181035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181036. "lsls r5, r5, #16\n\t"
  181037. #else
  181038. "lsl r5, r5, #16\n\t"
  181039. #endif
  181040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181041. "adds r3, r3, r5\n\t"
  181042. #else
  181043. "add r3, r3, r5\n\t"
  181044. #endif
  181045. #ifdef WOLFSSL_KEIL
  181046. "adcs r4, r4, r6\n\t"
  181047. #elif defined(__clang__)
  181048. "adcs r4, r6\n\t"
  181049. #else
  181050. "adc r4, r6\n\t"
  181051. #endif
  181052. #ifdef WOLFSSL_KEIL
  181053. "adcs r2, r2, %[r]\n\t"
  181054. #elif defined(__clang__)
  181055. "adcs r2, %[r]\n\t"
  181056. #else
  181057. "adc r2, %[r]\n\t"
  181058. #endif
  181059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181060. "adds r3, r3, r5\n\t"
  181061. #else
  181062. "add r3, r3, r5\n\t"
  181063. #endif
  181064. #ifdef WOLFSSL_KEIL
  181065. "adcs r4, r4, r6\n\t"
  181066. #elif defined(__clang__)
  181067. "adcs r4, r6\n\t"
  181068. #else
  181069. "adc r4, r6\n\t"
  181070. #endif
  181071. #ifdef WOLFSSL_KEIL
  181072. "adcs r2, r2, %[r]\n\t"
  181073. #elif defined(__clang__)
  181074. "adcs r2, %[r]\n\t"
  181075. #else
  181076. "adc r2, %[r]\n\t"
  181077. #endif
  181078. "# A[11] * A[2]\n\t"
  181079. "mov %[a], r9\n\t"
  181080. "mov r7, r12\n\t"
  181081. "ldr %[a], [%[a], #44]\n\t"
  181082. "uxth r5, %[a]\n\t"
  181083. "uxth r6, r7\n\t"
  181084. #ifdef WOLFSSL_KEIL
  181085. "muls r6, r5, r6\n\t"
  181086. #elif defined(__clang__)
  181087. "muls r6, r5\n\t"
  181088. #else
  181089. "mul r6, r5\n\t"
  181090. #endif
  181091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181092. "adds r3, r3, r6\n\t"
  181093. #else
  181094. "add r3, r3, r6\n\t"
  181095. #endif
  181096. #ifdef WOLFSSL_KEIL
  181097. "adcs r4, r4, %[r]\n\t"
  181098. #elif defined(__clang__)
  181099. "adcs r4, %[r]\n\t"
  181100. #else
  181101. "adc r4, %[r]\n\t"
  181102. #endif
  181103. #ifdef WOLFSSL_KEIL
  181104. "adcs r2, r2, %[r]\n\t"
  181105. #elif defined(__clang__)
  181106. "adcs r2, %[r]\n\t"
  181107. #else
  181108. "adc r2, %[r]\n\t"
  181109. #endif
  181110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181111. "adds r3, r3, r6\n\t"
  181112. #else
  181113. "add r3, r3, r6\n\t"
  181114. #endif
  181115. #ifdef WOLFSSL_KEIL
  181116. "adcs r4, r4, %[r]\n\t"
  181117. #elif defined(__clang__)
  181118. "adcs r4, %[r]\n\t"
  181119. #else
  181120. "adc r4, %[r]\n\t"
  181121. #endif
  181122. #ifdef WOLFSSL_KEIL
  181123. "adcs r2, r2, %[r]\n\t"
  181124. #elif defined(__clang__)
  181125. "adcs r2, %[r]\n\t"
  181126. #else
  181127. "adc r2, %[r]\n\t"
  181128. #endif
  181129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181130. "lsrs r6, r7, #16\n\t"
  181131. #else
  181132. "lsr r6, r7, #16\n\t"
  181133. #endif
  181134. #ifdef WOLFSSL_KEIL
  181135. "muls r5, r6, r5\n\t"
  181136. #elif defined(__clang__)
  181137. "muls r5, r6\n\t"
  181138. #else
  181139. "mul r5, r6\n\t"
  181140. #endif
  181141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181142. "lsrs r6, r5, #16\n\t"
  181143. #else
  181144. "lsr r6, r5, #16\n\t"
  181145. #endif
  181146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181147. "lsls r5, r5, #16\n\t"
  181148. #else
  181149. "lsl r5, r5, #16\n\t"
  181150. #endif
  181151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181152. "adds r3, r3, r5\n\t"
  181153. #else
  181154. "add r3, r3, r5\n\t"
  181155. #endif
  181156. #ifdef WOLFSSL_KEIL
  181157. "adcs r4, r4, r6\n\t"
  181158. #elif defined(__clang__)
  181159. "adcs r4, r6\n\t"
  181160. #else
  181161. "adc r4, r6\n\t"
  181162. #endif
  181163. #ifdef WOLFSSL_KEIL
  181164. "adcs r2, r2, %[r]\n\t"
  181165. #elif defined(__clang__)
  181166. "adcs r2, %[r]\n\t"
  181167. #else
  181168. "adc r2, %[r]\n\t"
  181169. #endif
  181170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181171. "adds r3, r3, r5\n\t"
  181172. #else
  181173. "add r3, r3, r5\n\t"
  181174. #endif
  181175. #ifdef WOLFSSL_KEIL
  181176. "adcs r4, r4, r6\n\t"
  181177. #elif defined(__clang__)
  181178. "adcs r4, r6\n\t"
  181179. #else
  181180. "adc r4, r6\n\t"
  181181. #endif
  181182. #ifdef WOLFSSL_KEIL
  181183. "adcs r2, r2, %[r]\n\t"
  181184. #elif defined(__clang__)
  181185. "adcs r2, %[r]\n\t"
  181186. #else
  181187. "adc r2, %[r]\n\t"
  181188. #endif
  181189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181190. "lsrs r5, %[a], #16\n\t"
  181191. #else
  181192. "lsr r5, %[a], #16\n\t"
  181193. #endif
  181194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181195. "lsrs r6, r7, #16\n\t"
  181196. #else
  181197. "lsr r6, r7, #16\n\t"
  181198. #endif
  181199. #ifdef WOLFSSL_KEIL
  181200. "muls r6, r5, r6\n\t"
  181201. #elif defined(__clang__)
  181202. "muls r6, r5\n\t"
  181203. #else
  181204. "mul r6, r5\n\t"
  181205. #endif
  181206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181207. "adds r4, r4, r6\n\t"
  181208. #else
  181209. "add r4, r4, r6\n\t"
  181210. #endif
  181211. #ifdef WOLFSSL_KEIL
  181212. "adcs r2, r2, %[r]\n\t"
  181213. #elif defined(__clang__)
  181214. "adcs r2, %[r]\n\t"
  181215. #else
  181216. "adc r2, %[r]\n\t"
  181217. #endif
  181218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181219. "adds r4, r4, r6\n\t"
  181220. #else
  181221. "add r4, r4, r6\n\t"
  181222. #endif
  181223. #ifdef WOLFSSL_KEIL
  181224. "adcs r2, r2, %[r]\n\t"
  181225. #elif defined(__clang__)
  181226. "adcs r2, %[r]\n\t"
  181227. #else
  181228. "adc r2, %[r]\n\t"
  181229. #endif
  181230. "uxth r6, r7\n\t"
  181231. #ifdef WOLFSSL_KEIL
  181232. "muls r5, r6, r5\n\t"
  181233. #elif defined(__clang__)
  181234. "muls r5, r6\n\t"
  181235. #else
  181236. "mul r5, r6\n\t"
  181237. #endif
  181238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181239. "lsrs r6, r5, #16\n\t"
  181240. #else
  181241. "lsr r6, r5, #16\n\t"
  181242. #endif
  181243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181244. "lsls r5, r5, #16\n\t"
  181245. #else
  181246. "lsl r5, r5, #16\n\t"
  181247. #endif
  181248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181249. "adds r3, r3, r5\n\t"
  181250. #else
  181251. "add r3, r3, r5\n\t"
  181252. #endif
  181253. #ifdef WOLFSSL_KEIL
  181254. "adcs r4, r4, r6\n\t"
  181255. #elif defined(__clang__)
  181256. "adcs r4, r6\n\t"
  181257. #else
  181258. "adc r4, r6\n\t"
  181259. #endif
  181260. #ifdef WOLFSSL_KEIL
  181261. "adcs r2, r2, %[r]\n\t"
  181262. #elif defined(__clang__)
  181263. "adcs r2, %[r]\n\t"
  181264. #else
  181265. "adc r2, %[r]\n\t"
  181266. #endif
  181267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181268. "adds r3, r3, r5\n\t"
  181269. #else
  181270. "add r3, r3, r5\n\t"
  181271. #endif
  181272. #ifdef WOLFSSL_KEIL
  181273. "adcs r4, r4, r6\n\t"
  181274. #elif defined(__clang__)
  181275. "adcs r4, r6\n\t"
  181276. #else
  181277. "adc r4, r6\n\t"
  181278. #endif
  181279. #ifdef WOLFSSL_KEIL
  181280. "adcs r2, r2, %[r]\n\t"
  181281. #elif defined(__clang__)
  181282. "adcs r2, %[r]\n\t"
  181283. #else
  181284. "adc r2, %[r]\n\t"
  181285. #endif
  181286. "# A[12] * A[1]\n\t"
  181287. "mov %[a], r9\n\t"
  181288. "mov r7, r11\n\t"
  181289. "ldr %[a], [%[a], #48]\n\t"
  181290. "uxth r5, %[a]\n\t"
  181291. "uxth r6, r7\n\t"
  181292. #ifdef WOLFSSL_KEIL
  181293. "muls r6, r5, r6\n\t"
  181294. #elif defined(__clang__)
  181295. "muls r6, r5\n\t"
  181296. #else
  181297. "mul r6, r5\n\t"
  181298. #endif
  181299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181300. "adds r3, r3, r6\n\t"
  181301. #else
  181302. "add r3, r3, r6\n\t"
  181303. #endif
  181304. #ifdef WOLFSSL_KEIL
  181305. "adcs r4, r4, %[r]\n\t"
  181306. #elif defined(__clang__)
  181307. "adcs r4, %[r]\n\t"
  181308. #else
  181309. "adc r4, %[r]\n\t"
  181310. #endif
  181311. #ifdef WOLFSSL_KEIL
  181312. "adcs r2, r2, %[r]\n\t"
  181313. #elif defined(__clang__)
  181314. "adcs r2, %[r]\n\t"
  181315. #else
  181316. "adc r2, %[r]\n\t"
  181317. #endif
  181318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181319. "adds r3, r3, r6\n\t"
  181320. #else
  181321. "add r3, r3, r6\n\t"
  181322. #endif
  181323. #ifdef WOLFSSL_KEIL
  181324. "adcs r4, r4, %[r]\n\t"
  181325. #elif defined(__clang__)
  181326. "adcs r4, %[r]\n\t"
  181327. #else
  181328. "adc r4, %[r]\n\t"
  181329. #endif
  181330. #ifdef WOLFSSL_KEIL
  181331. "adcs r2, r2, %[r]\n\t"
  181332. #elif defined(__clang__)
  181333. "adcs r2, %[r]\n\t"
  181334. #else
  181335. "adc r2, %[r]\n\t"
  181336. #endif
  181337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181338. "lsrs r6, r7, #16\n\t"
  181339. #else
  181340. "lsr r6, r7, #16\n\t"
  181341. #endif
  181342. #ifdef WOLFSSL_KEIL
  181343. "muls r5, r6, r5\n\t"
  181344. #elif defined(__clang__)
  181345. "muls r5, r6\n\t"
  181346. #else
  181347. "mul r5, r6\n\t"
  181348. #endif
  181349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181350. "lsrs r6, r5, #16\n\t"
  181351. #else
  181352. "lsr r6, r5, #16\n\t"
  181353. #endif
  181354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181355. "lsls r5, r5, #16\n\t"
  181356. #else
  181357. "lsl r5, r5, #16\n\t"
  181358. #endif
  181359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181360. "adds r3, r3, r5\n\t"
  181361. #else
  181362. "add r3, r3, r5\n\t"
  181363. #endif
  181364. #ifdef WOLFSSL_KEIL
  181365. "adcs r4, r4, r6\n\t"
  181366. #elif defined(__clang__)
  181367. "adcs r4, r6\n\t"
  181368. #else
  181369. "adc r4, r6\n\t"
  181370. #endif
  181371. #ifdef WOLFSSL_KEIL
  181372. "adcs r2, r2, %[r]\n\t"
  181373. #elif defined(__clang__)
  181374. "adcs r2, %[r]\n\t"
  181375. #else
  181376. "adc r2, %[r]\n\t"
  181377. #endif
  181378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181379. "adds r3, r3, r5\n\t"
  181380. #else
  181381. "add r3, r3, r5\n\t"
  181382. #endif
  181383. #ifdef WOLFSSL_KEIL
  181384. "adcs r4, r4, r6\n\t"
  181385. #elif defined(__clang__)
  181386. "adcs r4, r6\n\t"
  181387. #else
  181388. "adc r4, r6\n\t"
  181389. #endif
  181390. #ifdef WOLFSSL_KEIL
  181391. "adcs r2, r2, %[r]\n\t"
  181392. #elif defined(__clang__)
  181393. "adcs r2, %[r]\n\t"
  181394. #else
  181395. "adc r2, %[r]\n\t"
  181396. #endif
  181397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181398. "lsrs r5, %[a], #16\n\t"
  181399. #else
  181400. "lsr r5, %[a], #16\n\t"
  181401. #endif
  181402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181403. "lsrs r6, r7, #16\n\t"
  181404. #else
  181405. "lsr r6, r7, #16\n\t"
  181406. #endif
  181407. #ifdef WOLFSSL_KEIL
  181408. "muls r6, r5, r6\n\t"
  181409. #elif defined(__clang__)
  181410. "muls r6, r5\n\t"
  181411. #else
  181412. "mul r6, r5\n\t"
  181413. #endif
  181414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181415. "adds r4, r4, r6\n\t"
  181416. #else
  181417. "add r4, r4, r6\n\t"
  181418. #endif
  181419. #ifdef WOLFSSL_KEIL
  181420. "adcs r2, r2, %[r]\n\t"
  181421. #elif defined(__clang__)
  181422. "adcs r2, %[r]\n\t"
  181423. #else
  181424. "adc r2, %[r]\n\t"
  181425. #endif
  181426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181427. "adds r4, r4, r6\n\t"
  181428. #else
  181429. "add r4, r4, r6\n\t"
  181430. #endif
  181431. #ifdef WOLFSSL_KEIL
  181432. "adcs r2, r2, %[r]\n\t"
  181433. #elif defined(__clang__)
  181434. "adcs r2, %[r]\n\t"
  181435. #else
  181436. "adc r2, %[r]\n\t"
  181437. #endif
  181438. "uxth r6, r7\n\t"
  181439. #ifdef WOLFSSL_KEIL
  181440. "muls r5, r6, r5\n\t"
  181441. #elif defined(__clang__)
  181442. "muls r5, r6\n\t"
  181443. #else
  181444. "mul r5, r6\n\t"
  181445. #endif
  181446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181447. "lsrs r6, r5, #16\n\t"
  181448. #else
  181449. "lsr r6, r5, #16\n\t"
  181450. #endif
  181451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181452. "lsls r5, r5, #16\n\t"
  181453. #else
  181454. "lsl r5, r5, #16\n\t"
  181455. #endif
  181456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181457. "adds r3, r3, r5\n\t"
  181458. #else
  181459. "add r3, r3, r5\n\t"
  181460. #endif
  181461. #ifdef WOLFSSL_KEIL
  181462. "adcs r4, r4, r6\n\t"
  181463. #elif defined(__clang__)
  181464. "adcs r4, r6\n\t"
  181465. #else
  181466. "adc r4, r6\n\t"
  181467. #endif
  181468. #ifdef WOLFSSL_KEIL
  181469. "adcs r2, r2, %[r]\n\t"
  181470. #elif defined(__clang__)
  181471. "adcs r2, %[r]\n\t"
  181472. #else
  181473. "adc r2, %[r]\n\t"
  181474. #endif
  181475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181476. "adds r3, r3, r5\n\t"
  181477. #else
  181478. "add r3, r3, r5\n\t"
  181479. #endif
  181480. #ifdef WOLFSSL_KEIL
  181481. "adcs r4, r4, r6\n\t"
  181482. #elif defined(__clang__)
  181483. "adcs r4, r6\n\t"
  181484. #else
  181485. "adc r4, r6\n\t"
  181486. #endif
  181487. #ifdef WOLFSSL_KEIL
  181488. "adcs r2, r2, %[r]\n\t"
  181489. #elif defined(__clang__)
  181490. "adcs r2, %[r]\n\t"
  181491. #else
  181492. "adc r2, %[r]\n\t"
  181493. #endif
  181494. "# A[13] * A[0]\n\t"
  181495. "mov %[a], r9\n\t"
  181496. "mov r7, r10\n\t"
  181497. "ldr %[a], [%[a], #52]\n\t"
  181498. "uxth r5, %[a]\n\t"
  181499. "uxth r6, r7\n\t"
  181500. #ifdef WOLFSSL_KEIL
  181501. "muls r6, r5, r6\n\t"
  181502. #elif defined(__clang__)
  181503. "muls r6, r5\n\t"
  181504. #else
  181505. "mul r6, r5\n\t"
  181506. #endif
  181507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181508. "adds r3, r3, r6\n\t"
  181509. #else
  181510. "add r3, r3, r6\n\t"
  181511. #endif
  181512. #ifdef WOLFSSL_KEIL
  181513. "adcs r4, r4, %[r]\n\t"
  181514. #elif defined(__clang__)
  181515. "adcs r4, %[r]\n\t"
  181516. #else
  181517. "adc r4, %[r]\n\t"
  181518. #endif
  181519. #ifdef WOLFSSL_KEIL
  181520. "adcs r2, r2, %[r]\n\t"
  181521. #elif defined(__clang__)
  181522. "adcs r2, %[r]\n\t"
  181523. #else
  181524. "adc r2, %[r]\n\t"
  181525. #endif
  181526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181527. "adds r3, r3, r6\n\t"
  181528. #else
  181529. "add r3, r3, r6\n\t"
  181530. #endif
  181531. #ifdef WOLFSSL_KEIL
  181532. "adcs r4, r4, %[r]\n\t"
  181533. #elif defined(__clang__)
  181534. "adcs r4, %[r]\n\t"
  181535. #else
  181536. "adc r4, %[r]\n\t"
  181537. #endif
  181538. #ifdef WOLFSSL_KEIL
  181539. "adcs r2, r2, %[r]\n\t"
  181540. #elif defined(__clang__)
  181541. "adcs r2, %[r]\n\t"
  181542. #else
  181543. "adc r2, %[r]\n\t"
  181544. #endif
  181545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181546. "lsrs r6, r7, #16\n\t"
  181547. #else
  181548. "lsr r6, r7, #16\n\t"
  181549. #endif
  181550. #ifdef WOLFSSL_KEIL
  181551. "muls r5, r6, r5\n\t"
  181552. #elif defined(__clang__)
  181553. "muls r5, r6\n\t"
  181554. #else
  181555. "mul r5, r6\n\t"
  181556. #endif
  181557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181558. "lsrs r6, r5, #16\n\t"
  181559. #else
  181560. "lsr r6, r5, #16\n\t"
  181561. #endif
  181562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181563. "lsls r5, r5, #16\n\t"
  181564. #else
  181565. "lsl r5, r5, #16\n\t"
  181566. #endif
  181567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181568. "adds r3, r3, r5\n\t"
  181569. #else
  181570. "add r3, r3, r5\n\t"
  181571. #endif
  181572. #ifdef WOLFSSL_KEIL
  181573. "adcs r4, r4, r6\n\t"
  181574. #elif defined(__clang__)
  181575. "adcs r4, r6\n\t"
  181576. #else
  181577. "adc r4, r6\n\t"
  181578. #endif
  181579. #ifdef WOLFSSL_KEIL
  181580. "adcs r2, r2, %[r]\n\t"
  181581. #elif defined(__clang__)
  181582. "adcs r2, %[r]\n\t"
  181583. #else
  181584. "adc r2, %[r]\n\t"
  181585. #endif
  181586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181587. "adds r3, r3, r5\n\t"
  181588. #else
  181589. "add r3, r3, r5\n\t"
  181590. #endif
  181591. #ifdef WOLFSSL_KEIL
  181592. "adcs r4, r4, r6\n\t"
  181593. #elif defined(__clang__)
  181594. "adcs r4, r6\n\t"
  181595. #else
  181596. "adc r4, r6\n\t"
  181597. #endif
  181598. #ifdef WOLFSSL_KEIL
  181599. "adcs r2, r2, %[r]\n\t"
  181600. #elif defined(__clang__)
  181601. "adcs r2, %[r]\n\t"
  181602. #else
  181603. "adc r2, %[r]\n\t"
  181604. #endif
  181605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181606. "lsrs r5, %[a], #16\n\t"
  181607. #else
  181608. "lsr r5, %[a], #16\n\t"
  181609. #endif
  181610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181611. "lsrs r6, r7, #16\n\t"
  181612. #else
  181613. "lsr r6, r7, #16\n\t"
  181614. #endif
  181615. #ifdef WOLFSSL_KEIL
  181616. "muls r6, r5, r6\n\t"
  181617. #elif defined(__clang__)
  181618. "muls r6, r5\n\t"
  181619. #else
  181620. "mul r6, r5\n\t"
  181621. #endif
  181622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181623. "adds r4, r4, r6\n\t"
  181624. #else
  181625. "add r4, r4, r6\n\t"
  181626. #endif
  181627. #ifdef WOLFSSL_KEIL
  181628. "adcs r2, r2, %[r]\n\t"
  181629. #elif defined(__clang__)
  181630. "adcs r2, %[r]\n\t"
  181631. #else
  181632. "adc r2, %[r]\n\t"
  181633. #endif
  181634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181635. "adds r4, r4, r6\n\t"
  181636. #else
  181637. "add r4, r4, r6\n\t"
  181638. #endif
  181639. #ifdef WOLFSSL_KEIL
  181640. "adcs r2, r2, %[r]\n\t"
  181641. #elif defined(__clang__)
  181642. "adcs r2, %[r]\n\t"
  181643. #else
  181644. "adc r2, %[r]\n\t"
  181645. #endif
  181646. "uxth r6, r7\n\t"
  181647. #ifdef WOLFSSL_KEIL
  181648. "muls r5, r6, r5\n\t"
  181649. #elif defined(__clang__)
  181650. "muls r5, r6\n\t"
  181651. #else
  181652. "mul r5, r6\n\t"
  181653. #endif
  181654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181655. "lsrs r6, r5, #16\n\t"
  181656. #else
  181657. "lsr r6, r5, #16\n\t"
  181658. #endif
  181659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181660. "lsls r5, r5, #16\n\t"
  181661. #else
  181662. "lsl r5, r5, #16\n\t"
  181663. #endif
  181664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181665. "adds r3, r3, r5\n\t"
  181666. #else
  181667. "add r3, r3, r5\n\t"
  181668. #endif
  181669. #ifdef WOLFSSL_KEIL
  181670. "adcs r4, r4, r6\n\t"
  181671. #elif defined(__clang__)
  181672. "adcs r4, r6\n\t"
  181673. #else
  181674. "adc r4, r6\n\t"
  181675. #endif
  181676. #ifdef WOLFSSL_KEIL
  181677. "adcs r2, r2, %[r]\n\t"
  181678. #elif defined(__clang__)
  181679. "adcs r2, %[r]\n\t"
  181680. #else
  181681. "adc r2, %[r]\n\t"
  181682. #endif
  181683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181684. "adds r3, r3, r5\n\t"
  181685. #else
  181686. "add r3, r3, r5\n\t"
  181687. #endif
  181688. #ifdef WOLFSSL_KEIL
  181689. "adcs r4, r4, r6\n\t"
  181690. #elif defined(__clang__)
  181691. "adcs r4, r6\n\t"
  181692. #else
  181693. "adc r4, r6\n\t"
  181694. #endif
  181695. #ifdef WOLFSSL_KEIL
  181696. "adcs r2, r2, %[r]\n\t"
  181697. #elif defined(__clang__)
  181698. "adcs r2, %[r]\n\t"
  181699. #else
  181700. "adc r2, %[r]\n\t"
  181701. #endif
  181702. "str r3, [sp, #52]\n\t"
  181703. "# A[14] * A[0]\n\t"
  181704. "movs r3, #0\n\t"
  181705. "mov %[a], r9\n\t"
  181706. "ldr %[a], [%[a], #56]\n\t"
  181707. "uxth r5, %[a]\n\t"
  181708. "uxth r6, r7\n\t"
  181709. #ifdef WOLFSSL_KEIL
  181710. "muls r6, r5, r6\n\t"
  181711. #elif defined(__clang__)
  181712. "muls r6, r5\n\t"
  181713. #else
  181714. "mul r6, r5\n\t"
  181715. #endif
  181716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181717. "adds r4, r4, r6\n\t"
  181718. #else
  181719. "add r4, r4, r6\n\t"
  181720. #endif
  181721. #ifdef WOLFSSL_KEIL
  181722. "adcs r2, r2, %[r]\n\t"
  181723. #elif defined(__clang__)
  181724. "adcs r2, %[r]\n\t"
  181725. #else
  181726. "adc r2, %[r]\n\t"
  181727. #endif
  181728. #ifdef WOLFSSL_KEIL
  181729. "adcs r3, r3, %[r]\n\t"
  181730. #elif defined(__clang__)
  181731. "adcs r3, %[r]\n\t"
  181732. #else
  181733. "adc r3, %[r]\n\t"
  181734. #endif
  181735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181736. "adds r4, r4, r6\n\t"
  181737. #else
  181738. "add r4, r4, r6\n\t"
  181739. #endif
  181740. #ifdef WOLFSSL_KEIL
  181741. "adcs r2, r2, %[r]\n\t"
  181742. #elif defined(__clang__)
  181743. "adcs r2, %[r]\n\t"
  181744. #else
  181745. "adc r2, %[r]\n\t"
  181746. #endif
  181747. #ifdef WOLFSSL_KEIL
  181748. "adcs r3, r3, %[r]\n\t"
  181749. #elif defined(__clang__)
  181750. "adcs r3, %[r]\n\t"
  181751. #else
  181752. "adc r3, %[r]\n\t"
  181753. #endif
  181754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181755. "lsrs r6, r7, #16\n\t"
  181756. #else
  181757. "lsr r6, r7, #16\n\t"
  181758. #endif
  181759. #ifdef WOLFSSL_KEIL
  181760. "muls r5, r6, r5\n\t"
  181761. #elif defined(__clang__)
  181762. "muls r5, r6\n\t"
  181763. #else
  181764. "mul r5, r6\n\t"
  181765. #endif
  181766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181767. "lsrs r6, r5, #16\n\t"
  181768. #else
  181769. "lsr r6, r5, #16\n\t"
  181770. #endif
  181771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181772. "lsls r5, r5, #16\n\t"
  181773. #else
  181774. "lsl r5, r5, #16\n\t"
  181775. #endif
  181776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181777. "adds r4, r4, r5\n\t"
  181778. #else
  181779. "add r4, r4, r5\n\t"
  181780. #endif
  181781. #ifdef WOLFSSL_KEIL
  181782. "adcs r2, r2, r6\n\t"
  181783. #elif defined(__clang__)
  181784. "adcs r2, r6\n\t"
  181785. #else
  181786. "adc r2, r6\n\t"
  181787. #endif
  181788. #ifdef WOLFSSL_KEIL
  181789. "adcs r3, r3, %[r]\n\t"
  181790. #elif defined(__clang__)
  181791. "adcs r3, %[r]\n\t"
  181792. #else
  181793. "adc r3, %[r]\n\t"
  181794. #endif
  181795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181796. "adds r4, r4, r5\n\t"
  181797. #else
  181798. "add r4, r4, r5\n\t"
  181799. #endif
  181800. #ifdef WOLFSSL_KEIL
  181801. "adcs r2, r2, r6\n\t"
  181802. #elif defined(__clang__)
  181803. "adcs r2, r6\n\t"
  181804. #else
  181805. "adc r2, r6\n\t"
  181806. #endif
  181807. #ifdef WOLFSSL_KEIL
  181808. "adcs r3, r3, %[r]\n\t"
  181809. #elif defined(__clang__)
  181810. "adcs r3, %[r]\n\t"
  181811. #else
  181812. "adc r3, %[r]\n\t"
  181813. #endif
  181814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181815. "lsrs r5, %[a], #16\n\t"
  181816. #else
  181817. "lsr r5, %[a], #16\n\t"
  181818. #endif
  181819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181820. "lsrs r6, r7, #16\n\t"
  181821. #else
  181822. "lsr r6, r7, #16\n\t"
  181823. #endif
  181824. #ifdef WOLFSSL_KEIL
  181825. "muls r6, r5, r6\n\t"
  181826. #elif defined(__clang__)
  181827. "muls r6, r5\n\t"
  181828. #else
  181829. "mul r6, r5\n\t"
  181830. #endif
  181831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181832. "adds r2, r2, r6\n\t"
  181833. #else
  181834. "add r2, r2, r6\n\t"
  181835. #endif
  181836. #ifdef WOLFSSL_KEIL
  181837. "adcs r3, r3, %[r]\n\t"
  181838. #elif defined(__clang__)
  181839. "adcs r3, %[r]\n\t"
  181840. #else
  181841. "adc r3, %[r]\n\t"
  181842. #endif
  181843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181844. "adds r2, r2, r6\n\t"
  181845. #else
  181846. "add r2, r2, r6\n\t"
  181847. #endif
  181848. #ifdef WOLFSSL_KEIL
  181849. "adcs r3, r3, %[r]\n\t"
  181850. #elif defined(__clang__)
  181851. "adcs r3, %[r]\n\t"
  181852. #else
  181853. "adc r3, %[r]\n\t"
  181854. #endif
  181855. "uxth r6, r7\n\t"
  181856. #ifdef WOLFSSL_KEIL
  181857. "muls r5, r6, r5\n\t"
  181858. #elif defined(__clang__)
  181859. "muls r5, r6\n\t"
  181860. #else
  181861. "mul r5, r6\n\t"
  181862. #endif
  181863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181864. "lsrs r6, r5, #16\n\t"
  181865. #else
  181866. "lsr r6, r5, #16\n\t"
  181867. #endif
  181868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181869. "lsls r5, r5, #16\n\t"
  181870. #else
  181871. "lsl r5, r5, #16\n\t"
  181872. #endif
  181873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181874. "adds r4, r4, r5\n\t"
  181875. #else
  181876. "add r4, r4, r5\n\t"
  181877. #endif
  181878. #ifdef WOLFSSL_KEIL
  181879. "adcs r2, r2, r6\n\t"
  181880. #elif defined(__clang__)
  181881. "adcs r2, r6\n\t"
  181882. #else
  181883. "adc r2, r6\n\t"
  181884. #endif
  181885. #ifdef WOLFSSL_KEIL
  181886. "adcs r3, r3, %[r]\n\t"
  181887. #elif defined(__clang__)
  181888. "adcs r3, %[r]\n\t"
  181889. #else
  181890. "adc r3, %[r]\n\t"
  181891. #endif
  181892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181893. "adds r4, r4, r5\n\t"
  181894. #else
  181895. "add r4, r4, r5\n\t"
  181896. #endif
  181897. #ifdef WOLFSSL_KEIL
  181898. "adcs r2, r2, r6\n\t"
  181899. #elif defined(__clang__)
  181900. "adcs r2, r6\n\t"
  181901. #else
  181902. "adc r2, r6\n\t"
  181903. #endif
  181904. #ifdef WOLFSSL_KEIL
  181905. "adcs r3, r3, %[r]\n\t"
  181906. #elif defined(__clang__)
  181907. "adcs r3, %[r]\n\t"
  181908. #else
  181909. "adc r3, %[r]\n\t"
  181910. #endif
  181911. "# A[13] * A[1]\n\t"
  181912. "mov %[a], r9\n\t"
  181913. "mov r7, r11\n\t"
  181914. "ldr %[a], [%[a], #52]\n\t"
  181915. "uxth r5, %[a]\n\t"
  181916. "uxth r6, r7\n\t"
  181917. #ifdef WOLFSSL_KEIL
  181918. "muls r6, r5, r6\n\t"
  181919. #elif defined(__clang__)
  181920. "muls r6, r5\n\t"
  181921. #else
  181922. "mul r6, r5\n\t"
  181923. #endif
  181924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181925. "adds r4, r4, r6\n\t"
  181926. #else
  181927. "add r4, r4, r6\n\t"
  181928. #endif
  181929. #ifdef WOLFSSL_KEIL
  181930. "adcs r2, r2, %[r]\n\t"
  181931. #elif defined(__clang__)
  181932. "adcs r2, %[r]\n\t"
  181933. #else
  181934. "adc r2, %[r]\n\t"
  181935. #endif
  181936. #ifdef WOLFSSL_KEIL
  181937. "adcs r3, r3, %[r]\n\t"
  181938. #elif defined(__clang__)
  181939. "adcs r3, %[r]\n\t"
  181940. #else
  181941. "adc r3, %[r]\n\t"
  181942. #endif
  181943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181944. "adds r4, r4, r6\n\t"
  181945. #else
  181946. "add r4, r4, r6\n\t"
  181947. #endif
  181948. #ifdef WOLFSSL_KEIL
  181949. "adcs r2, r2, %[r]\n\t"
  181950. #elif defined(__clang__)
  181951. "adcs r2, %[r]\n\t"
  181952. #else
  181953. "adc r2, %[r]\n\t"
  181954. #endif
  181955. #ifdef WOLFSSL_KEIL
  181956. "adcs r3, r3, %[r]\n\t"
  181957. #elif defined(__clang__)
  181958. "adcs r3, %[r]\n\t"
  181959. #else
  181960. "adc r3, %[r]\n\t"
  181961. #endif
  181962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181963. "lsrs r6, r7, #16\n\t"
  181964. #else
  181965. "lsr r6, r7, #16\n\t"
  181966. #endif
  181967. #ifdef WOLFSSL_KEIL
  181968. "muls r5, r6, r5\n\t"
  181969. #elif defined(__clang__)
  181970. "muls r5, r6\n\t"
  181971. #else
  181972. "mul r5, r6\n\t"
  181973. #endif
  181974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181975. "lsrs r6, r5, #16\n\t"
  181976. #else
  181977. "lsr r6, r5, #16\n\t"
  181978. #endif
  181979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181980. "lsls r5, r5, #16\n\t"
  181981. #else
  181982. "lsl r5, r5, #16\n\t"
  181983. #endif
  181984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181985. "adds r4, r4, r5\n\t"
  181986. #else
  181987. "add r4, r4, r5\n\t"
  181988. #endif
  181989. #ifdef WOLFSSL_KEIL
  181990. "adcs r2, r2, r6\n\t"
  181991. #elif defined(__clang__)
  181992. "adcs r2, r6\n\t"
  181993. #else
  181994. "adc r2, r6\n\t"
  181995. #endif
  181996. #ifdef WOLFSSL_KEIL
  181997. "adcs r3, r3, %[r]\n\t"
  181998. #elif defined(__clang__)
  181999. "adcs r3, %[r]\n\t"
  182000. #else
  182001. "adc r3, %[r]\n\t"
  182002. #endif
  182003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182004. "adds r4, r4, r5\n\t"
  182005. #else
  182006. "add r4, r4, r5\n\t"
  182007. #endif
  182008. #ifdef WOLFSSL_KEIL
  182009. "adcs r2, r2, r6\n\t"
  182010. #elif defined(__clang__)
  182011. "adcs r2, r6\n\t"
  182012. #else
  182013. "adc r2, r6\n\t"
  182014. #endif
  182015. #ifdef WOLFSSL_KEIL
  182016. "adcs r3, r3, %[r]\n\t"
  182017. #elif defined(__clang__)
  182018. "adcs r3, %[r]\n\t"
  182019. #else
  182020. "adc r3, %[r]\n\t"
  182021. #endif
  182022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182023. "lsrs r5, %[a], #16\n\t"
  182024. #else
  182025. "lsr r5, %[a], #16\n\t"
  182026. #endif
  182027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182028. "lsrs r6, r7, #16\n\t"
  182029. #else
  182030. "lsr r6, r7, #16\n\t"
  182031. #endif
  182032. #ifdef WOLFSSL_KEIL
  182033. "muls r6, r5, r6\n\t"
  182034. #elif defined(__clang__)
  182035. "muls r6, r5\n\t"
  182036. #else
  182037. "mul r6, r5\n\t"
  182038. #endif
  182039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182040. "adds r2, r2, r6\n\t"
  182041. #else
  182042. "add r2, r2, r6\n\t"
  182043. #endif
  182044. #ifdef WOLFSSL_KEIL
  182045. "adcs r3, r3, %[r]\n\t"
  182046. #elif defined(__clang__)
  182047. "adcs r3, %[r]\n\t"
  182048. #else
  182049. "adc r3, %[r]\n\t"
  182050. #endif
  182051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182052. "adds r2, r2, r6\n\t"
  182053. #else
  182054. "add r2, r2, r6\n\t"
  182055. #endif
  182056. #ifdef WOLFSSL_KEIL
  182057. "adcs r3, r3, %[r]\n\t"
  182058. #elif defined(__clang__)
  182059. "adcs r3, %[r]\n\t"
  182060. #else
  182061. "adc r3, %[r]\n\t"
  182062. #endif
  182063. "uxth r6, r7\n\t"
  182064. #ifdef WOLFSSL_KEIL
  182065. "muls r5, r6, r5\n\t"
  182066. #elif defined(__clang__)
  182067. "muls r5, r6\n\t"
  182068. #else
  182069. "mul r5, r6\n\t"
  182070. #endif
  182071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182072. "lsrs r6, r5, #16\n\t"
  182073. #else
  182074. "lsr r6, r5, #16\n\t"
  182075. #endif
  182076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182077. "lsls r5, r5, #16\n\t"
  182078. #else
  182079. "lsl r5, r5, #16\n\t"
  182080. #endif
  182081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182082. "adds r4, r4, r5\n\t"
  182083. #else
  182084. "add r4, r4, r5\n\t"
  182085. #endif
  182086. #ifdef WOLFSSL_KEIL
  182087. "adcs r2, r2, r6\n\t"
  182088. #elif defined(__clang__)
  182089. "adcs r2, r6\n\t"
  182090. #else
  182091. "adc r2, r6\n\t"
  182092. #endif
  182093. #ifdef WOLFSSL_KEIL
  182094. "adcs r3, r3, %[r]\n\t"
  182095. #elif defined(__clang__)
  182096. "adcs r3, %[r]\n\t"
  182097. #else
  182098. "adc r3, %[r]\n\t"
  182099. #endif
  182100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182101. "adds r4, r4, r5\n\t"
  182102. #else
  182103. "add r4, r4, r5\n\t"
  182104. #endif
  182105. #ifdef WOLFSSL_KEIL
  182106. "adcs r2, r2, r6\n\t"
  182107. #elif defined(__clang__)
  182108. "adcs r2, r6\n\t"
  182109. #else
  182110. "adc r2, r6\n\t"
  182111. #endif
  182112. #ifdef WOLFSSL_KEIL
  182113. "adcs r3, r3, %[r]\n\t"
  182114. #elif defined(__clang__)
  182115. "adcs r3, %[r]\n\t"
  182116. #else
  182117. "adc r3, %[r]\n\t"
  182118. #endif
  182119. "# A[12] * A[2]\n\t"
  182120. "mov %[a], r9\n\t"
  182121. "mov r7, r12\n\t"
  182122. "ldr %[a], [%[a], #48]\n\t"
  182123. "uxth r5, %[a]\n\t"
  182124. "uxth r6, r7\n\t"
  182125. #ifdef WOLFSSL_KEIL
  182126. "muls r6, r5, r6\n\t"
  182127. #elif defined(__clang__)
  182128. "muls r6, r5\n\t"
  182129. #else
  182130. "mul r6, r5\n\t"
  182131. #endif
  182132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182133. "adds r4, r4, r6\n\t"
  182134. #else
  182135. "add r4, r4, r6\n\t"
  182136. #endif
  182137. #ifdef WOLFSSL_KEIL
  182138. "adcs r2, r2, %[r]\n\t"
  182139. #elif defined(__clang__)
  182140. "adcs r2, %[r]\n\t"
  182141. #else
  182142. "adc r2, %[r]\n\t"
  182143. #endif
  182144. #ifdef WOLFSSL_KEIL
  182145. "adcs r3, r3, %[r]\n\t"
  182146. #elif defined(__clang__)
  182147. "adcs r3, %[r]\n\t"
  182148. #else
  182149. "adc r3, %[r]\n\t"
  182150. #endif
  182151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182152. "adds r4, r4, r6\n\t"
  182153. #else
  182154. "add r4, r4, r6\n\t"
  182155. #endif
  182156. #ifdef WOLFSSL_KEIL
  182157. "adcs r2, r2, %[r]\n\t"
  182158. #elif defined(__clang__)
  182159. "adcs r2, %[r]\n\t"
  182160. #else
  182161. "adc r2, %[r]\n\t"
  182162. #endif
  182163. #ifdef WOLFSSL_KEIL
  182164. "adcs r3, r3, %[r]\n\t"
  182165. #elif defined(__clang__)
  182166. "adcs r3, %[r]\n\t"
  182167. #else
  182168. "adc r3, %[r]\n\t"
  182169. #endif
  182170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182171. "lsrs r6, r7, #16\n\t"
  182172. #else
  182173. "lsr r6, r7, #16\n\t"
  182174. #endif
  182175. #ifdef WOLFSSL_KEIL
  182176. "muls r5, r6, r5\n\t"
  182177. #elif defined(__clang__)
  182178. "muls r5, r6\n\t"
  182179. #else
  182180. "mul r5, r6\n\t"
  182181. #endif
  182182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182183. "lsrs r6, r5, #16\n\t"
  182184. #else
  182185. "lsr r6, r5, #16\n\t"
  182186. #endif
  182187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182188. "lsls r5, r5, #16\n\t"
  182189. #else
  182190. "lsl r5, r5, #16\n\t"
  182191. #endif
  182192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182193. "adds r4, r4, r5\n\t"
  182194. #else
  182195. "add r4, r4, r5\n\t"
  182196. #endif
  182197. #ifdef WOLFSSL_KEIL
  182198. "adcs r2, r2, r6\n\t"
  182199. #elif defined(__clang__)
  182200. "adcs r2, r6\n\t"
  182201. #else
  182202. "adc r2, r6\n\t"
  182203. #endif
  182204. #ifdef WOLFSSL_KEIL
  182205. "adcs r3, r3, %[r]\n\t"
  182206. #elif defined(__clang__)
  182207. "adcs r3, %[r]\n\t"
  182208. #else
  182209. "adc r3, %[r]\n\t"
  182210. #endif
  182211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182212. "adds r4, r4, r5\n\t"
  182213. #else
  182214. "add r4, r4, r5\n\t"
  182215. #endif
  182216. #ifdef WOLFSSL_KEIL
  182217. "adcs r2, r2, r6\n\t"
  182218. #elif defined(__clang__)
  182219. "adcs r2, r6\n\t"
  182220. #else
  182221. "adc r2, r6\n\t"
  182222. #endif
  182223. #ifdef WOLFSSL_KEIL
  182224. "adcs r3, r3, %[r]\n\t"
  182225. #elif defined(__clang__)
  182226. "adcs r3, %[r]\n\t"
  182227. #else
  182228. "adc r3, %[r]\n\t"
  182229. #endif
  182230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182231. "lsrs r5, %[a], #16\n\t"
  182232. #else
  182233. "lsr r5, %[a], #16\n\t"
  182234. #endif
  182235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182236. "lsrs r6, r7, #16\n\t"
  182237. #else
  182238. "lsr r6, r7, #16\n\t"
  182239. #endif
  182240. #ifdef WOLFSSL_KEIL
  182241. "muls r6, r5, r6\n\t"
  182242. #elif defined(__clang__)
  182243. "muls r6, r5\n\t"
  182244. #else
  182245. "mul r6, r5\n\t"
  182246. #endif
  182247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182248. "adds r2, r2, r6\n\t"
  182249. #else
  182250. "add r2, r2, r6\n\t"
  182251. #endif
  182252. #ifdef WOLFSSL_KEIL
  182253. "adcs r3, r3, %[r]\n\t"
  182254. #elif defined(__clang__)
  182255. "adcs r3, %[r]\n\t"
  182256. #else
  182257. "adc r3, %[r]\n\t"
  182258. #endif
  182259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182260. "adds r2, r2, r6\n\t"
  182261. #else
  182262. "add r2, r2, r6\n\t"
  182263. #endif
  182264. #ifdef WOLFSSL_KEIL
  182265. "adcs r3, r3, %[r]\n\t"
  182266. #elif defined(__clang__)
  182267. "adcs r3, %[r]\n\t"
  182268. #else
  182269. "adc r3, %[r]\n\t"
  182270. #endif
  182271. "uxth r6, r7\n\t"
  182272. #ifdef WOLFSSL_KEIL
  182273. "muls r5, r6, r5\n\t"
  182274. #elif defined(__clang__)
  182275. "muls r5, r6\n\t"
  182276. #else
  182277. "mul r5, r6\n\t"
  182278. #endif
  182279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182280. "lsrs r6, r5, #16\n\t"
  182281. #else
  182282. "lsr r6, r5, #16\n\t"
  182283. #endif
  182284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182285. "lsls r5, r5, #16\n\t"
  182286. #else
  182287. "lsl r5, r5, #16\n\t"
  182288. #endif
  182289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182290. "adds r4, r4, r5\n\t"
  182291. #else
  182292. "add r4, r4, r5\n\t"
  182293. #endif
  182294. #ifdef WOLFSSL_KEIL
  182295. "adcs r2, r2, r6\n\t"
  182296. #elif defined(__clang__)
  182297. "adcs r2, r6\n\t"
  182298. #else
  182299. "adc r2, r6\n\t"
  182300. #endif
  182301. #ifdef WOLFSSL_KEIL
  182302. "adcs r3, r3, %[r]\n\t"
  182303. #elif defined(__clang__)
  182304. "adcs r3, %[r]\n\t"
  182305. #else
  182306. "adc r3, %[r]\n\t"
  182307. #endif
  182308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182309. "adds r4, r4, r5\n\t"
  182310. #else
  182311. "add r4, r4, r5\n\t"
  182312. #endif
  182313. #ifdef WOLFSSL_KEIL
  182314. "adcs r2, r2, r6\n\t"
  182315. #elif defined(__clang__)
  182316. "adcs r2, r6\n\t"
  182317. #else
  182318. "adc r2, r6\n\t"
  182319. #endif
  182320. #ifdef WOLFSSL_KEIL
  182321. "adcs r3, r3, %[r]\n\t"
  182322. #elif defined(__clang__)
  182323. "adcs r3, %[r]\n\t"
  182324. #else
  182325. "adc r3, %[r]\n\t"
  182326. #endif
  182327. "# A[11] * A[3]\n\t"
  182328. "mov %[a], r9\n\t"
  182329. "mov r7, lr\n\t"
  182330. "ldr %[a], [%[a], #44]\n\t"
  182331. "uxth r5, %[a]\n\t"
  182332. "uxth r6, r7\n\t"
  182333. #ifdef WOLFSSL_KEIL
  182334. "muls r6, r5, r6\n\t"
  182335. #elif defined(__clang__)
  182336. "muls r6, r5\n\t"
  182337. #else
  182338. "mul r6, r5\n\t"
  182339. #endif
  182340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182341. "adds r4, r4, r6\n\t"
  182342. #else
  182343. "add r4, r4, r6\n\t"
  182344. #endif
  182345. #ifdef WOLFSSL_KEIL
  182346. "adcs r2, r2, %[r]\n\t"
  182347. #elif defined(__clang__)
  182348. "adcs r2, %[r]\n\t"
  182349. #else
  182350. "adc r2, %[r]\n\t"
  182351. #endif
  182352. #ifdef WOLFSSL_KEIL
  182353. "adcs r3, r3, %[r]\n\t"
  182354. #elif defined(__clang__)
  182355. "adcs r3, %[r]\n\t"
  182356. #else
  182357. "adc r3, %[r]\n\t"
  182358. #endif
  182359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182360. "adds r4, r4, r6\n\t"
  182361. #else
  182362. "add r4, r4, r6\n\t"
  182363. #endif
  182364. #ifdef WOLFSSL_KEIL
  182365. "adcs r2, r2, %[r]\n\t"
  182366. #elif defined(__clang__)
  182367. "adcs r2, %[r]\n\t"
  182368. #else
  182369. "adc r2, %[r]\n\t"
  182370. #endif
  182371. #ifdef WOLFSSL_KEIL
  182372. "adcs r3, r3, %[r]\n\t"
  182373. #elif defined(__clang__)
  182374. "adcs r3, %[r]\n\t"
  182375. #else
  182376. "adc r3, %[r]\n\t"
  182377. #endif
  182378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182379. "lsrs r6, r7, #16\n\t"
  182380. #else
  182381. "lsr r6, r7, #16\n\t"
  182382. #endif
  182383. #ifdef WOLFSSL_KEIL
  182384. "muls r5, r6, r5\n\t"
  182385. #elif defined(__clang__)
  182386. "muls r5, r6\n\t"
  182387. #else
  182388. "mul r5, r6\n\t"
  182389. #endif
  182390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182391. "lsrs r6, r5, #16\n\t"
  182392. #else
  182393. "lsr r6, r5, #16\n\t"
  182394. #endif
  182395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182396. "lsls r5, r5, #16\n\t"
  182397. #else
  182398. "lsl r5, r5, #16\n\t"
  182399. #endif
  182400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182401. "adds r4, r4, r5\n\t"
  182402. #else
  182403. "add r4, r4, r5\n\t"
  182404. #endif
  182405. #ifdef WOLFSSL_KEIL
  182406. "adcs r2, r2, r6\n\t"
  182407. #elif defined(__clang__)
  182408. "adcs r2, r6\n\t"
  182409. #else
  182410. "adc r2, r6\n\t"
  182411. #endif
  182412. #ifdef WOLFSSL_KEIL
  182413. "adcs r3, r3, %[r]\n\t"
  182414. #elif defined(__clang__)
  182415. "adcs r3, %[r]\n\t"
  182416. #else
  182417. "adc r3, %[r]\n\t"
  182418. #endif
  182419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182420. "adds r4, r4, r5\n\t"
  182421. #else
  182422. "add r4, r4, r5\n\t"
  182423. #endif
  182424. #ifdef WOLFSSL_KEIL
  182425. "adcs r2, r2, r6\n\t"
  182426. #elif defined(__clang__)
  182427. "adcs r2, r6\n\t"
  182428. #else
  182429. "adc r2, r6\n\t"
  182430. #endif
  182431. #ifdef WOLFSSL_KEIL
  182432. "adcs r3, r3, %[r]\n\t"
  182433. #elif defined(__clang__)
  182434. "adcs r3, %[r]\n\t"
  182435. #else
  182436. "adc r3, %[r]\n\t"
  182437. #endif
  182438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182439. "lsrs r5, %[a], #16\n\t"
  182440. #else
  182441. "lsr r5, %[a], #16\n\t"
  182442. #endif
  182443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182444. "lsrs r6, r7, #16\n\t"
  182445. #else
  182446. "lsr r6, r7, #16\n\t"
  182447. #endif
  182448. #ifdef WOLFSSL_KEIL
  182449. "muls r6, r5, r6\n\t"
  182450. #elif defined(__clang__)
  182451. "muls r6, r5\n\t"
  182452. #else
  182453. "mul r6, r5\n\t"
  182454. #endif
  182455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182456. "adds r2, r2, r6\n\t"
  182457. #else
  182458. "add r2, r2, r6\n\t"
  182459. #endif
  182460. #ifdef WOLFSSL_KEIL
  182461. "adcs r3, r3, %[r]\n\t"
  182462. #elif defined(__clang__)
  182463. "adcs r3, %[r]\n\t"
  182464. #else
  182465. "adc r3, %[r]\n\t"
  182466. #endif
  182467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182468. "adds r2, r2, r6\n\t"
  182469. #else
  182470. "add r2, r2, r6\n\t"
  182471. #endif
  182472. #ifdef WOLFSSL_KEIL
  182473. "adcs r3, r3, %[r]\n\t"
  182474. #elif defined(__clang__)
  182475. "adcs r3, %[r]\n\t"
  182476. #else
  182477. "adc r3, %[r]\n\t"
  182478. #endif
  182479. "uxth r6, r7\n\t"
  182480. #ifdef WOLFSSL_KEIL
  182481. "muls r5, r6, r5\n\t"
  182482. #elif defined(__clang__)
  182483. "muls r5, r6\n\t"
  182484. #else
  182485. "mul r5, r6\n\t"
  182486. #endif
  182487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182488. "lsrs r6, r5, #16\n\t"
  182489. #else
  182490. "lsr r6, r5, #16\n\t"
  182491. #endif
  182492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182493. "lsls r5, r5, #16\n\t"
  182494. #else
  182495. "lsl r5, r5, #16\n\t"
  182496. #endif
  182497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182498. "adds r4, r4, r5\n\t"
  182499. #else
  182500. "add r4, r4, r5\n\t"
  182501. #endif
  182502. #ifdef WOLFSSL_KEIL
  182503. "adcs r2, r2, r6\n\t"
  182504. #elif defined(__clang__)
  182505. "adcs r2, r6\n\t"
  182506. #else
  182507. "adc r2, r6\n\t"
  182508. #endif
  182509. #ifdef WOLFSSL_KEIL
  182510. "adcs r3, r3, %[r]\n\t"
  182511. #elif defined(__clang__)
  182512. "adcs r3, %[r]\n\t"
  182513. #else
  182514. "adc r3, %[r]\n\t"
  182515. #endif
  182516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182517. "adds r4, r4, r5\n\t"
  182518. #else
  182519. "add r4, r4, r5\n\t"
  182520. #endif
  182521. #ifdef WOLFSSL_KEIL
  182522. "adcs r2, r2, r6\n\t"
  182523. #elif defined(__clang__)
  182524. "adcs r2, r6\n\t"
  182525. #else
  182526. "adc r2, r6\n\t"
  182527. #endif
  182528. #ifdef WOLFSSL_KEIL
  182529. "adcs r3, r3, %[r]\n\t"
  182530. #elif defined(__clang__)
  182531. "adcs r3, %[r]\n\t"
  182532. #else
  182533. "adc r3, %[r]\n\t"
  182534. #endif
  182535. "# A[10] * A[4]\n\t"
  182536. "mov %[a], r9\n\t"
  182537. "ldr r7, [%[a], #16]\n\t"
  182538. "ldr %[a], [%[a], #40]\n\t"
  182539. "uxth r5, %[a]\n\t"
  182540. "uxth r6, r7\n\t"
  182541. #ifdef WOLFSSL_KEIL
  182542. "muls r6, r5, r6\n\t"
  182543. #elif defined(__clang__)
  182544. "muls r6, r5\n\t"
  182545. #else
  182546. "mul r6, r5\n\t"
  182547. #endif
  182548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182549. "adds r4, r4, r6\n\t"
  182550. #else
  182551. "add r4, r4, r6\n\t"
  182552. #endif
  182553. #ifdef WOLFSSL_KEIL
  182554. "adcs r2, r2, %[r]\n\t"
  182555. #elif defined(__clang__)
  182556. "adcs r2, %[r]\n\t"
  182557. #else
  182558. "adc r2, %[r]\n\t"
  182559. #endif
  182560. #ifdef WOLFSSL_KEIL
  182561. "adcs r3, r3, %[r]\n\t"
  182562. #elif defined(__clang__)
  182563. "adcs r3, %[r]\n\t"
  182564. #else
  182565. "adc r3, %[r]\n\t"
  182566. #endif
  182567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182568. "adds r4, r4, r6\n\t"
  182569. #else
  182570. "add r4, r4, r6\n\t"
  182571. #endif
  182572. #ifdef WOLFSSL_KEIL
  182573. "adcs r2, r2, %[r]\n\t"
  182574. #elif defined(__clang__)
  182575. "adcs r2, %[r]\n\t"
  182576. #else
  182577. "adc r2, %[r]\n\t"
  182578. #endif
  182579. #ifdef WOLFSSL_KEIL
  182580. "adcs r3, r3, %[r]\n\t"
  182581. #elif defined(__clang__)
  182582. "adcs r3, %[r]\n\t"
  182583. #else
  182584. "adc r3, %[r]\n\t"
  182585. #endif
  182586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182587. "lsrs r6, r7, #16\n\t"
  182588. #else
  182589. "lsr r6, r7, #16\n\t"
  182590. #endif
  182591. #ifdef WOLFSSL_KEIL
  182592. "muls r5, r6, r5\n\t"
  182593. #elif defined(__clang__)
  182594. "muls r5, r6\n\t"
  182595. #else
  182596. "mul r5, r6\n\t"
  182597. #endif
  182598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182599. "lsrs r6, r5, #16\n\t"
  182600. #else
  182601. "lsr r6, r5, #16\n\t"
  182602. #endif
  182603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182604. "lsls r5, r5, #16\n\t"
  182605. #else
  182606. "lsl r5, r5, #16\n\t"
  182607. #endif
  182608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182609. "adds r4, r4, r5\n\t"
  182610. #else
  182611. "add r4, r4, r5\n\t"
  182612. #endif
  182613. #ifdef WOLFSSL_KEIL
  182614. "adcs r2, r2, r6\n\t"
  182615. #elif defined(__clang__)
  182616. "adcs r2, r6\n\t"
  182617. #else
  182618. "adc r2, r6\n\t"
  182619. #endif
  182620. #ifdef WOLFSSL_KEIL
  182621. "adcs r3, r3, %[r]\n\t"
  182622. #elif defined(__clang__)
  182623. "adcs r3, %[r]\n\t"
  182624. #else
  182625. "adc r3, %[r]\n\t"
  182626. #endif
  182627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182628. "adds r4, r4, r5\n\t"
  182629. #else
  182630. "add r4, r4, r5\n\t"
  182631. #endif
  182632. #ifdef WOLFSSL_KEIL
  182633. "adcs r2, r2, r6\n\t"
  182634. #elif defined(__clang__)
  182635. "adcs r2, r6\n\t"
  182636. #else
  182637. "adc r2, r6\n\t"
  182638. #endif
  182639. #ifdef WOLFSSL_KEIL
  182640. "adcs r3, r3, %[r]\n\t"
  182641. #elif defined(__clang__)
  182642. "adcs r3, %[r]\n\t"
  182643. #else
  182644. "adc r3, %[r]\n\t"
  182645. #endif
  182646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182647. "lsrs r5, %[a], #16\n\t"
  182648. #else
  182649. "lsr r5, %[a], #16\n\t"
  182650. #endif
  182651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182652. "lsrs r6, r7, #16\n\t"
  182653. #else
  182654. "lsr r6, r7, #16\n\t"
  182655. #endif
  182656. #ifdef WOLFSSL_KEIL
  182657. "muls r6, r5, r6\n\t"
  182658. #elif defined(__clang__)
  182659. "muls r6, r5\n\t"
  182660. #else
  182661. "mul r6, r5\n\t"
  182662. #endif
  182663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182664. "adds r2, r2, r6\n\t"
  182665. #else
  182666. "add r2, r2, r6\n\t"
  182667. #endif
  182668. #ifdef WOLFSSL_KEIL
  182669. "adcs r3, r3, %[r]\n\t"
  182670. #elif defined(__clang__)
  182671. "adcs r3, %[r]\n\t"
  182672. #else
  182673. "adc r3, %[r]\n\t"
  182674. #endif
  182675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182676. "adds r2, r2, r6\n\t"
  182677. #else
  182678. "add r2, r2, r6\n\t"
  182679. #endif
  182680. #ifdef WOLFSSL_KEIL
  182681. "adcs r3, r3, %[r]\n\t"
  182682. #elif defined(__clang__)
  182683. "adcs r3, %[r]\n\t"
  182684. #else
  182685. "adc r3, %[r]\n\t"
  182686. #endif
  182687. "uxth r6, r7\n\t"
  182688. #ifdef WOLFSSL_KEIL
  182689. "muls r5, r6, r5\n\t"
  182690. #elif defined(__clang__)
  182691. "muls r5, r6\n\t"
  182692. #else
  182693. "mul r5, r6\n\t"
  182694. #endif
  182695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182696. "lsrs r6, r5, #16\n\t"
  182697. #else
  182698. "lsr r6, r5, #16\n\t"
  182699. #endif
  182700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182701. "lsls r5, r5, #16\n\t"
  182702. #else
  182703. "lsl r5, r5, #16\n\t"
  182704. #endif
  182705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182706. "adds r4, r4, r5\n\t"
  182707. #else
  182708. "add r4, r4, r5\n\t"
  182709. #endif
  182710. #ifdef WOLFSSL_KEIL
  182711. "adcs r2, r2, r6\n\t"
  182712. #elif defined(__clang__)
  182713. "adcs r2, r6\n\t"
  182714. #else
  182715. "adc r2, r6\n\t"
  182716. #endif
  182717. #ifdef WOLFSSL_KEIL
  182718. "adcs r3, r3, %[r]\n\t"
  182719. #elif defined(__clang__)
  182720. "adcs r3, %[r]\n\t"
  182721. #else
  182722. "adc r3, %[r]\n\t"
  182723. #endif
  182724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182725. "adds r4, r4, r5\n\t"
  182726. #else
  182727. "add r4, r4, r5\n\t"
  182728. #endif
  182729. #ifdef WOLFSSL_KEIL
  182730. "adcs r2, r2, r6\n\t"
  182731. #elif defined(__clang__)
  182732. "adcs r2, r6\n\t"
  182733. #else
  182734. "adc r2, r6\n\t"
  182735. #endif
  182736. #ifdef WOLFSSL_KEIL
  182737. "adcs r3, r3, %[r]\n\t"
  182738. #elif defined(__clang__)
  182739. "adcs r3, %[r]\n\t"
  182740. #else
  182741. "adc r3, %[r]\n\t"
  182742. #endif
  182743. "# A[9] * A[5]\n\t"
  182744. "mov %[a], r9\n\t"
  182745. "ldr r7, [%[a], #20]\n\t"
  182746. "ldr %[a], [%[a], #36]\n\t"
  182747. "uxth r5, %[a]\n\t"
  182748. "uxth r6, r7\n\t"
  182749. #ifdef WOLFSSL_KEIL
  182750. "muls r6, r5, r6\n\t"
  182751. #elif defined(__clang__)
  182752. "muls r6, r5\n\t"
  182753. #else
  182754. "mul r6, r5\n\t"
  182755. #endif
  182756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182757. "adds r4, r4, r6\n\t"
  182758. #else
  182759. "add r4, r4, r6\n\t"
  182760. #endif
  182761. #ifdef WOLFSSL_KEIL
  182762. "adcs r2, r2, %[r]\n\t"
  182763. #elif defined(__clang__)
  182764. "adcs r2, %[r]\n\t"
  182765. #else
  182766. "adc r2, %[r]\n\t"
  182767. #endif
  182768. #ifdef WOLFSSL_KEIL
  182769. "adcs r3, r3, %[r]\n\t"
  182770. #elif defined(__clang__)
  182771. "adcs r3, %[r]\n\t"
  182772. #else
  182773. "adc r3, %[r]\n\t"
  182774. #endif
  182775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182776. "adds r4, r4, r6\n\t"
  182777. #else
  182778. "add r4, r4, r6\n\t"
  182779. #endif
  182780. #ifdef WOLFSSL_KEIL
  182781. "adcs r2, r2, %[r]\n\t"
  182782. #elif defined(__clang__)
  182783. "adcs r2, %[r]\n\t"
  182784. #else
  182785. "adc r2, %[r]\n\t"
  182786. #endif
  182787. #ifdef WOLFSSL_KEIL
  182788. "adcs r3, r3, %[r]\n\t"
  182789. #elif defined(__clang__)
  182790. "adcs r3, %[r]\n\t"
  182791. #else
  182792. "adc r3, %[r]\n\t"
  182793. #endif
  182794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182795. "lsrs r6, r7, #16\n\t"
  182796. #else
  182797. "lsr r6, r7, #16\n\t"
  182798. #endif
  182799. #ifdef WOLFSSL_KEIL
  182800. "muls r5, r6, r5\n\t"
  182801. #elif defined(__clang__)
  182802. "muls r5, r6\n\t"
  182803. #else
  182804. "mul r5, r6\n\t"
  182805. #endif
  182806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182807. "lsrs r6, r5, #16\n\t"
  182808. #else
  182809. "lsr r6, r5, #16\n\t"
  182810. #endif
  182811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182812. "lsls r5, r5, #16\n\t"
  182813. #else
  182814. "lsl r5, r5, #16\n\t"
  182815. #endif
  182816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182817. "adds r4, r4, r5\n\t"
  182818. #else
  182819. "add r4, r4, r5\n\t"
  182820. #endif
  182821. #ifdef WOLFSSL_KEIL
  182822. "adcs r2, r2, r6\n\t"
  182823. #elif defined(__clang__)
  182824. "adcs r2, r6\n\t"
  182825. #else
  182826. "adc r2, r6\n\t"
  182827. #endif
  182828. #ifdef WOLFSSL_KEIL
  182829. "adcs r3, r3, %[r]\n\t"
  182830. #elif defined(__clang__)
  182831. "adcs r3, %[r]\n\t"
  182832. #else
  182833. "adc r3, %[r]\n\t"
  182834. #endif
  182835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182836. "adds r4, r4, r5\n\t"
  182837. #else
  182838. "add r4, r4, r5\n\t"
  182839. #endif
  182840. #ifdef WOLFSSL_KEIL
  182841. "adcs r2, r2, r6\n\t"
  182842. #elif defined(__clang__)
  182843. "adcs r2, r6\n\t"
  182844. #else
  182845. "adc r2, r6\n\t"
  182846. #endif
  182847. #ifdef WOLFSSL_KEIL
  182848. "adcs r3, r3, %[r]\n\t"
  182849. #elif defined(__clang__)
  182850. "adcs r3, %[r]\n\t"
  182851. #else
  182852. "adc r3, %[r]\n\t"
  182853. #endif
  182854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182855. "lsrs r5, %[a], #16\n\t"
  182856. #else
  182857. "lsr r5, %[a], #16\n\t"
  182858. #endif
  182859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182860. "lsrs r6, r7, #16\n\t"
  182861. #else
  182862. "lsr r6, r7, #16\n\t"
  182863. #endif
  182864. #ifdef WOLFSSL_KEIL
  182865. "muls r6, r5, r6\n\t"
  182866. #elif defined(__clang__)
  182867. "muls r6, r5\n\t"
  182868. #else
  182869. "mul r6, r5\n\t"
  182870. #endif
  182871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182872. "adds r2, r2, r6\n\t"
  182873. #else
  182874. "add r2, r2, r6\n\t"
  182875. #endif
  182876. #ifdef WOLFSSL_KEIL
  182877. "adcs r3, r3, %[r]\n\t"
  182878. #elif defined(__clang__)
  182879. "adcs r3, %[r]\n\t"
  182880. #else
  182881. "adc r3, %[r]\n\t"
  182882. #endif
  182883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182884. "adds r2, r2, r6\n\t"
  182885. #else
  182886. "add r2, r2, r6\n\t"
  182887. #endif
  182888. #ifdef WOLFSSL_KEIL
  182889. "adcs r3, r3, %[r]\n\t"
  182890. #elif defined(__clang__)
  182891. "adcs r3, %[r]\n\t"
  182892. #else
  182893. "adc r3, %[r]\n\t"
  182894. #endif
  182895. "uxth r6, r7\n\t"
  182896. #ifdef WOLFSSL_KEIL
  182897. "muls r5, r6, r5\n\t"
  182898. #elif defined(__clang__)
  182899. "muls r5, r6\n\t"
  182900. #else
  182901. "mul r5, r6\n\t"
  182902. #endif
  182903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182904. "lsrs r6, r5, #16\n\t"
  182905. #else
  182906. "lsr r6, r5, #16\n\t"
  182907. #endif
  182908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182909. "lsls r5, r5, #16\n\t"
  182910. #else
  182911. "lsl r5, r5, #16\n\t"
  182912. #endif
  182913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182914. "adds r4, r4, r5\n\t"
  182915. #else
  182916. "add r4, r4, r5\n\t"
  182917. #endif
  182918. #ifdef WOLFSSL_KEIL
  182919. "adcs r2, r2, r6\n\t"
  182920. #elif defined(__clang__)
  182921. "adcs r2, r6\n\t"
  182922. #else
  182923. "adc r2, r6\n\t"
  182924. #endif
  182925. #ifdef WOLFSSL_KEIL
  182926. "adcs r3, r3, %[r]\n\t"
  182927. #elif defined(__clang__)
  182928. "adcs r3, %[r]\n\t"
  182929. #else
  182930. "adc r3, %[r]\n\t"
  182931. #endif
  182932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182933. "adds r4, r4, r5\n\t"
  182934. #else
  182935. "add r4, r4, r5\n\t"
  182936. #endif
  182937. #ifdef WOLFSSL_KEIL
  182938. "adcs r2, r2, r6\n\t"
  182939. #elif defined(__clang__)
  182940. "adcs r2, r6\n\t"
  182941. #else
  182942. "adc r2, r6\n\t"
  182943. #endif
  182944. #ifdef WOLFSSL_KEIL
  182945. "adcs r3, r3, %[r]\n\t"
  182946. #elif defined(__clang__)
  182947. "adcs r3, %[r]\n\t"
  182948. #else
  182949. "adc r3, %[r]\n\t"
  182950. #endif
  182951. "# A[8] * A[6]\n\t"
  182952. "mov %[a], r9\n\t"
  182953. "ldr r7, [%[a], #24]\n\t"
  182954. "ldr %[a], [%[a], #32]\n\t"
  182955. "uxth r5, %[a]\n\t"
  182956. "uxth r6, r7\n\t"
  182957. #ifdef WOLFSSL_KEIL
  182958. "muls r6, r5, r6\n\t"
  182959. #elif defined(__clang__)
  182960. "muls r6, r5\n\t"
  182961. #else
  182962. "mul r6, r5\n\t"
  182963. #endif
  182964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182965. "adds r4, r4, r6\n\t"
  182966. #else
  182967. "add r4, r4, r6\n\t"
  182968. #endif
  182969. #ifdef WOLFSSL_KEIL
  182970. "adcs r2, r2, %[r]\n\t"
  182971. #elif defined(__clang__)
  182972. "adcs r2, %[r]\n\t"
  182973. #else
  182974. "adc r2, %[r]\n\t"
  182975. #endif
  182976. #ifdef WOLFSSL_KEIL
  182977. "adcs r3, r3, %[r]\n\t"
  182978. #elif defined(__clang__)
  182979. "adcs r3, %[r]\n\t"
  182980. #else
  182981. "adc r3, %[r]\n\t"
  182982. #endif
  182983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182984. "adds r4, r4, r6\n\t"
  182985. #else
  182986. "add r4, r4, r6\n\t"
  182987. #endif
  182988. #ifdef WOLFSSL_KEIL
  182989. "adcs r2, r2, %[r]\n\t"
  182990. #elif defined(__clang__)
  182991. "adcs r2, %[r]\n\t"
  182992. #else
  182993. "adc r2, %[r]\n\t"
  182994. #endif
  182995. #ifdef WOLFSSL_KEIL
  182996. "adcs r3, r3, %[r]\n\t"
  182997. #elif defined(__clang__)
  182998. "adcs r3, %[r]\n\t"
  182999. #else
  183000. "adc r3, %[r]\n\t"
  183001. #endif
  183002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183003. "lsrs r6, r7, #16\n\t"
  183004. #else
  183005. "lsr r6, r7, #16\n\t"
  183006. #endif
  183007. #ifdef WOLFSSL_KEIL
  183008. "muls r5, r6, r5\n\t"
  183009. #elif defined(__clang__)
  183010. "muls r5, r6\n\t"
  183011. #else
  183012. "mul r5, r6\n\t"
  183013. #endif
  183014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183015. "lsrs r6, r5, #16\n\t"
  183016. #else
  183017. "lsr r6, r5, #16\n\t"
  183018. #endif
  183019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183020. "lsls r5, r5, #16\n\t"
  183021. #else
  183022. "lsl r5, r5, #16\n\t"
  183023. #endif
  183024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183025. "adds r4, r4, r5\n\t"
  183026. #else
  183027. "add r4, r4, r5\n\t"
  183028. #endif
  183029. #ifdef WOLFSSL_KEIL
  183030. "adcs r2, r2, r6\n\t"
  183031. #elif defined(__clang__)
  183032. "adcs r2, r6\n\t"
  183033. #else
  183034. "adc r2, r6\n\t"
  183035. #endif
  183036. #ifdef WOLFSSL_KEIL
  183037. "adcs r3, r3, %[r]\n\t"
  183038. #elif defined(__clang__)
  183039. "adcs r3, %[r]\n\t"
  183040. #else
  183041. "adc r3, %[r]\n\t"
  183042. #endif
  183043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183044. "adds r4, r4, r5\n\t"
  183045. #else
  183046. "add r4, r4, r5\n\t"
  183047. #endif
  183048. #ifdef WOLFSSL_KEIL
  183049. "adcs r2, r2, r6\n\t"
  183050. #elif defined(__clang__)
  183051. "adcs r2, r6\n\t"
  183052. #else
  183053. "adc r2, r6\n\t"
  183054. #endif
  183055. #ifdef WOLFSSL_KEIL
  183056. "adcs r3, r3, %[r]\n\t"
  183057. #elif defined(__clang__)
  183058. "adcs r3, %[r]\n\t"
  183059. #else
  183060. "adc r3, %[r]\n\t"
  183061. #endif
  183062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183063. "lsrs r5, %[a], #16\n\t"
  183064. #else
  183065. "lsr r5, %[a], #16\n\t"
  183066. #endif
  183067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183068. "lsrs r6, r7, #16\n\t"
  183069. #else
  183070. "lsr r6, r7, #16\n\t"
  183071. #endif
  183072. #ifdef WOLFSSL_KEIL
  183073. "muls r6, r5, r6\n\t"
  183074. #elif defined(__clang__)
  183075. "muls r6, r5\n\t"
  183076. #else
  183077. "mul r6, r5\n\t"
  183078. #endif
  183079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183080. "adds r2, r2, r6\n\t"
  183081. #else
  183082. "add r2, r2, r6\n\t"
  183083. #endif
  183084. #ifdef WOLFSSL_KEIL
  183085. "adcs r3, r3, %[r]\n\t"
  183086. #elif defined(__clang__)
  183087. "adcs r3, %[r]\n\t"
  183088. #else
  183089. "adc r3, %[r]\n\t"
  183090. #endif
  183091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183092. "adds r2, r2, r6\n\t"
  183093. #else
  183094. "add r2, r2, r6\n\t"
  183095. #endif
  183096. #ifdef WOLFSSL_KEIL
  183097. "adcs r3, r3, %[r]\n\t"
  183098. #elif defined(__clang__)
  183099. "adcs r3, %[r]\n\t"
  183100. #else
  183101. "adc r3, %[r]\n\t"
  183102. #endif
  183103. "uxth r6, r7\n\t"
  183104. #ifdef WOLFSSL_KEIL
  183105. "muls r5, r6, r5\n\t"
  183106. #elif defined(__clang__)
  183107. "muls r5, r6\n\t"
  183108. #else
  183109. "mul r5, r6\n\t"
  183110. #endif
  183111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183112. "lsrs r6, r5, #16\n\t"
  183113. #else
  183114. "lsr r6, r5, #16\n\t"
  183115. #endif
  183116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183117. "lsls r5, r5, #16\n\t"
  183118. #else
  183119. "lsl r5, r5, #16\n\t"
  183120. #endif
  183121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183122. "adds r4, r4, r5\n\t"
  183123. #else
  183124. "add r4, r4, r5\n\t"
  183125. #endif
  183126. #ifdef WOLFSSL_KEIL
  183127. "adcs r2, r2, r6\n\t"
  183128. #elif defined(__clang__)
  183129. "adcs r2, r6\n\t"
  183130. #else
  183131. "adc r2, r6\n\t"
  183132. #endif
  183133. #ifdef WOLFSSL_KEIL
  183134. "adcs r3, r3, %[r]\n\t"
  183135. #elif defined(__clang__)
  183136. "adcs r3, %[r]\n\t"
  183137. #else
  183138. "adc r3, %[r]\n\t"
  183139. #endif
  183140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183141. "adds r4, r4, r5\n\t"
  183142. #else
  183143. "add r4, r4, r5\n\t"
  183144. #endif
  183145. #ifdef WOLFSSL_KEIL
  183146. "adcs r2, r2, r6\n\t"
  183147. #elif defined(__clang__)
  183148. "adcs r2, r6\n\t"
  183149. #else
  183150. "adc r2, r6\n\t"
  183151. #endif
  183152. #ifdef WOLFSSL_KEIL
  183153. "adcs r3, r3, %[r]\n\t"
  183154. #elif defined(__clang__)
  183155. "adcs r3, %[r]\n\t"
  183156. #else
  183157. "adc r3, %[r]\n\t"
  183158. #endif
  183159. "# A[7] * A[7]\n\t"
  183160. "mov %[a], r9\n\t"
  183161. "ldr r7, [%[a], #28]\n\t"
  183162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183163. "lsrs r6, r7, #16\n\t"
  183164. #else
  183165. "lsr r6, r7, #16\n\t"
  183166. #endif
  183167. "uxth r5, r7\n\t"
  183168. #ifdef WOLFSSL_KEIL
  183169. "muls r5, r5, r5\n\t"
  183170. #elif defined(__clang__)
  183171. "muls r5, r5\n\t"
  183172. #else
  183173. "mul r5, r5\n\t"
  183174. #endif
  183175. #ifdef WOLFSSL_KEIL
  183176. "muls r6, r6, r6\n\t"
  183177. #elif defined(__clang__)
  183178. "muls r6, r6\n\t"
  183179. #else
  183180. "mul r6, r6\n\t"
  183181. #endif
  183182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183183. "adds r4, r4, r5\n\t"
  183184. #else
  183185. "add r4, r4, r5\n\t"
  183186. #endif
  183187. #ifdef WOLFSSL_KEIL
  183188. "adcs r2, r2, r6\n\t"
  183189. #elif defined(__clang__)
  183190. "adcs r2, r6\n\t"
  183191. #else
  183192. "adc r2, r6\n\t"
  183193. #endif
  183194. #ifdef WOLFSSL_KEIL
  183195. "adcs r3, r3, %[r]\n\t"
  183196. #elif defined(__clang__)
  183197. "adcs r3, %[r]\n\t"
  183198. #else
  183199. "adc r3, %[r]\n\t"
  183200. #endif
  183201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183202. "lsrs r6, r7, #16\n\t"
  183203. #else
  183204. "lsr r6, r7, #16\n\t"
  183205. #endif
  183206. "uxth r5, r7\n\t"
  183207. #ifdef WOLFSSL_KEIL
  183208. "muls r5, r6, r5\n\t"
  183209. #elif defined(__clang__)
  183210. "muls r5, r6\n\t"
  183211. #else
  183212. "mul r5, r6\n\t"
  183213. #endif
  183214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183215. "lsrs r6, r5, #15\n\t"
  183216. #else
  183217. "lsr r6, r5, #15\n\t"
  183218. #endif
  183219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183220. "lsls r5, r5, #17\n\t"
  183221. #else
  183222. "lsl r5, r5, #17\n\t"
  183223. #endif
  183224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183225. "adds r4, r4, r5\n\t"
  183226. #else
  183227. "add r4, r4, r5\n\t"
  183228. #endif
  183229. #ifdef WOLFSSL_KEIL
  183230. "adcs r2, r2, r6\n\t"
  183231. #elif defined(__clang__)
  183232. "adcs r2, r6\n\t"
  183233. #else
  183234. "adc r2, r6\n\t"
  183235. #endif
  183236. #ifdef WOLFSSL_KEIL
  183237. "adcs r3, r3, %[r]\n\t"
  183238. #elif defined(__clang__)
  183239. "adcs r3, %[r]\n\t"
  183240. #else
  183241. "adc r3, %[r]\n\t"
  183242. #endif
  183243. "str r4, [sp, #56]\n\t"
  183244. "# A[8] * A[7]\n\t"
  183245. "movs r4, #0\n\t"
  183246. "ldr %[a], [%[a], #32]\n\t"
  183247. "uxth r5, %[a]\n\t"
  183248. "uxth r6, r7\n\t"
  183249. #ifdef WOLFSSL_KEIL
  183250. "muls r6, r5, r6\n\t"
  183251. #elif defined(__clang__)
  183252. "muls r6, r5\n\t"
  183253. #else
  183254. "mul r6, r5\n\t"
  183255. #endif
  183256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183257. "adds r2, r2, r6\n\t"
  183258. #else
  183259. "add r2, r2, r6\n\t"
  183260. #endif
  183261. #ifdef WOLFSSL_KEIL
  183262. "adcs r3, r3, %[r]\n\t"
  183263. #elif defined(__clang__)
  183264. "adcs r3, %[r]\n\t"
  183265. #else
  183266. "adc r3, %[r]\n\t"
  183267. #endif
  183268. #ifdef WOLFSSL_KEIL
  183269. "adcs r4, r4, %[r]\n\t"
  183270. #elif defined(__clang__)
  183271. "adcs r4, %[r]\n\t"
  183272. #else
  183273. "adc r4, %[r]\n\t"
  183274. #endif
  183275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183276. "adds r2, r2, r6\n\t"
  183277. #else
  183278. "add r2, r2, r6\n\t"
  183279. #endif
  183280. #ifdef WOLFSSL_KEIL
  183281. "adcs r3, r3, %[r]\n\t"
  183282. #elif defined(__clang__)
  183283. "adcs r3, %[r]\n\t"
  183284. #else
  183285. "adc r3, %[r]\n\t"
  183286. #endif
  183287. #ifdef WOLFSSL_KEIL
  183288. "adcs r4, r4, %[r]\n\t"
  183289. #elif defined(__clang__)
  183290. "adcs r4, %[r]\n\t"
  183291. #else
  183292. "adc r4, %[r]\n\t"
  183293. #endif
  183294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183295. "lsrs r6, r7, #16\n\t"
  183296. #else
  183297. "lsr r6, r7, #16\n\t"
  183298. #endif
  183299. #ifdef WOLFSSL_KEIL
  183300. "muls r5, r6, r5\n\t"
  183301. #elif defined(__clang__)
  183302. "muls r5, r6\n\t"
  183303. #else
  183304. "mul r5, r6\n\t"
  183305. #endif
  183306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183307. "lsrs r6, r5, #16\n\t"
  183308. #else
  183309. "lsr r6, r5, #16\n\t"
  183310. #endif
  183311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183312. "lsls r5, r5, #16\n\t"
  183313. #else
  183314. "lsl r5, r5, #16\n\t"
  183315. #endif
  183316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183317. "adds r2, r2, r5\n\t"
  183318. #else
  183319. "add r2, r2, r5\n\t"
  183320. #endif
  183321. #ifdef WOLFSSL_KEIL
  183322. "adcs r3, r3, r6\n\t"
  183323. #elif defined(__clang__)
  183324. "adcs r3, r6\n\t"
  183325. #else
  183326. "adc r3, r6\n\t"
  183327. #endif
  183328. #ifdef WOLFSSL_KEIL
  183329. "adcs r4, r4, %[r]\n\t"
  183330. #elif defined(__clang__)
  183331. "adcs r4, %[r]\n\t"
  183332. #else
  183333. "adc r4, %[r]\n\t"
  183334. #endif
  183335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183336. "adds r2, r2, r5\n\t"
  183337. #else
  183338. "add r2, r2, r5\n\t"
  183339. #endif
  183340. #ifdef WOLFSSL_KEIL
  183341. "adcs r3, r3, r6\n\t"
  183342. #elif defined(__clang__)
  183343. "adcs r3, r6\n\t"
  183344. #else
  183345. "adc r3, r6\n\t"
  183346. #endif
  183347. #ifdef WOLFSSL_KEIL
  183348. "adcs r4, r4, %[r]\n\t"
  183349. #elif defined(__clang__)
  183350. "adcs r4, %[r]\n\t"
  183351. #else
  183352. "adc r4, %[r]\n\t"
  183353. #endif
  183354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183355. "lsrs r5, %[a], #16\n\t"
  183356. #else
  183357. "lsr r5, %[a], #16\n\t"
  183358. #endif
  183359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183360. "lsrs r6, r7, #16\n\t"
  183361. #else
  183362. "lsr r6, r7, #16\n\t"
  183363. #endif
  183364. #ifdef WOLFSSL_KEIL
  183365. "muls r6, r5, r6\n\t"
  183366. #elif defined(__clang__)
  183367. "muls r6, r5\n\t"
  183368. #else
  183369. "mul r6, r5\n\t"
  183370. #endif
  183371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183372. "adds r3, r3, r6\n\t"
  183373. #else
  183374. "add r3, r3, r6\n\t"
  183375. #endif
  183376. #ifdef WOLFSSL_KEIL
  183377. "adcs r4, r4, %[r]\n\t"
  183378. #elif defined(__clang__)
  183379. "adcs r4, %[r]\n\t"
  183380. #else
  183381. "adc r4, %[r]\n\t"
  183382. #endif
  183383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183384. "adds r3, r3, r6\n\t"
  183385. #else
  183386. "add r3, r3, r6\n\t"
  183387. #endif
  183388. #ifdef WOLFSSL_KEIL
  183389. "adcs r4, r4, %[r]\n\t"
  183390. #elif defined(__clang__)
  183391. "adcs r4, %[r]\n\t"
  183392. #else
  183393. "adc r4, %[r]\n\t"
  183394. #endif
  183395. "uxth r6, r7\n\t"
  183396. #ifdef WOLFSSL_KEIL
  183397. "muls r5, r6, r5\n\t"
  183398. #elif defined(__clang__)
  183399. "muls r5, r6\n\t"
  183400. #else
  183401. "mul r5, r6\n\t"
  183402. #endif
  183403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183404. "lsrs r6, r5, #16\n\t"
  183405. #else
  183406. "lsr r6, r5, #16\n\t"
  183407. #endif
  183408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183409. "lsls r5, r5, #16\n\t"
  183410. #else
  183411. "lsl r5, r5, #16\n\t"
  183412. #endif
  183413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183414. "adds r2, r2, r5\n\t"
  183415. #else
  183416. "add r2, r2, r5\n\t"
  183417. #endif
  183418. #ifdef WOLFSSL_KEIL
  183419. "adcs r3, r3, r6\n\t"
  183420. #elif defined(__clang__)
  183421. "adcs r3, r6\n\t"
  183422. #else
  183423. "adc r3, r6\n\t"
  183424. #endif
  183425. #ifdef WOLFSSL_KEIL
  183426. "adcs r4, r4, %[r]\n\t"
  183427. #elif defined(__clang__)
  183428. "adcs r4, %[r]\n\t"
  183429. #else
  183430. "adc r4, %[r]\n\t"
  183431. #endif
  183432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183433. "adds r2, r2, r5\n\t"
  183434. #else
  183435. "add r2, r2, r5\n\t"
  183436. #endif
  183437. #ifdef WOLFSSL_KEIL
  183438. "adcs r3, r3, r6\n\t"
  183439. #elif defined(__clang__)
  183440. "adcs r3, r6\n\t"
  183441. #else
  183442. "adc r3, r6\n\t"
  183443. #endif
  183444. #ifdef WOLFSSL_KEIL
  183445. "adcs r4, r4, %[r]\n\t"
  183446. #elif defined(__clang__)
  183447. "adcs r4, %[r]\n\t"
  183448. #else
  183449. "adc r4, %[r]\n\t"
  183450. #endif
  183451. "# A[9] * A[6]\n\t"
  183452. "mov %[a], r9\n\t"
  183453. "ldr r7, [%[a], #24]\n\t"
  183454. "ldr %[a], [%[a], #36]\n\t"
  183455. "uxth r5, %[a]\n\t"
  183456. "uxth r6, r7\n\t"
  183457. #ifdef WOLFSSL_KEIL
  183458. "muls r6, r5, r6\n\t"
  183459. #elif defined(__clang__)
  183460. "muls r6, r5\n\t"
  183461. #else
  183462. "mul r6, r5\n\t"
  183463. #endif
  183464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183465. "adds r2, r2, r6\n\t"
  183466. #else
  183467. "add r2, r2, r6\n\t"
  183468. #endif
  183469. #ifdef WOLFSSL_KEIL
  183470. "adcs r3, r3, %[r]\n\t"
  183471. #elif defined(__clang__)
  183472. "adcs r3, %[r]\n\t"
  183473. #else
  183474. "adc r3, %[r]\n\t"
  183475. #endif
  183476. #ifdef WOLFSSL_KEIL
  183477. "adcs r4, r4, %[r]\n\t"
  183478. #elif defined(__clang__)
  183479. "adcs r4, %[r]\n\t"
  183480. #else
  183481. "adc r4, %[r]\n\t"
  183482. #endif
  183483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183484. "adds r2, r2, r6\n\t"
  183485. #else
  183486. "add r2, r2, r6\n\t"
  183487. #endif
  183488. #ifdef WOLFSSL_KEIL
  183489. "adcs r3, r3, %[r]\n\t"
  183490. #elif defined(__clang__)
  183491. "adcs r3, %[r]\n\t"
  183492. #else
  183493. "adc r3, %[r]\n\t"
  183494. #endif
  183495. #ifdef WOLFSSL_KEIL
  183496. "adcs r4, r4, %[r]\n\t"
  183497. #elif defined(__clang__)
  183498. "adcs r4, %[r]\n\t"
  183499. #else
  183500. "adc r4, %[r]\n\t"
  183501. #endif
  183502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183503. "lsrs r6, r7, #16\n\t"
  183504. #else
  183505. "lsr r6, r7, #16\n\t"
  183506. #endif
  183507. #ifdef WOLFSSL_KEIL
  183508. "muls r5, r6, r5\n\t"
  183509. #elif defined(__clang__)
  183510. "muls r5, r6\n\t"
  183511. #else
  183512. "mul r5, r6\n\t"
  183513. #endif
  183514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183515. "lsrs r6, r5, #16\n\t"
  183516. #else
  183517. "lsr r6, r5, #16\n\t"
  183518. #endif
  183519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183520. "lsls r5, r5, #16\n\t"
  183521. #else
  183522. "lsl r5, r5, #16\n\t"
  183523. #endif
  183524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183525. "adds r2, r2, r5\n\t"
  183526. #else
  183527. "add r2, r2, r5\n\t"
  183528. #endif
  183529. #ifdef WOLFSSL_KEIL
  183530. "adcs r3, r3, r6\n\t"
  183531. #elif defined(__clang__)
  183532. "adcs r3, r6\n\t"
  183533. #else
  183534. "adc r3, r6\n\t"
  183535. #endif
  183536. #ifdef WOLFSSL_KEIL
  183537. "adcs r4, r4, %[r]\n\t"
  183538. #elif defined(__clang__)
  183539. "adcs r4, %[r]\n\t"
  183540. #else
  183541. "adc r4, %[r]\n\t"
  183542. #endif
  183543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183544. "adds r2, r2, r5\n\t"
  183545. #else
  183546. "add r2, r2, r5\n\t"
  183547. #endif
  183548. #ifdef WOLFSSL_KEIL
  183549. "adcs r3, r3, r6\n\t"
  183550. #elif defined(__clang__)
  183551. "adcs r3, r6\n\t"
  183552. #else
  183553. "adc r3, r6\n\t"
  183554. #endif
  183555. #ifdef WOLFSSL_KEIL
  183556. "adcs r4, r4, %[r]\n\t"
  183557. #elif defined(__clang__)
  183558. "adcs r4, %[r]\n\t"
  183559. #else
  183560. "adc r4, %[r]\n\t"
  183561. #endif
  183562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183563. "lsrs r5, %[a], #16\n\t"
  183564. #else
  183565. "lsr r5, %[a], #16\n\t"
  183566. #endif
  183567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183568. "lsrs r6, r7, #16\n\t"
  183569. #else
  183570. "lsr r6, r7, #16\n\t"
  183571. #endif
  183572. #ifdef WOLFSSL_KEIL
  183573. "muls r6, r5, r6\n\t"
  183574. #elif defined(__clang__)
  183575. "muls r6, r5\n\t"
  183576. #else
  183577. "mul r6, r5\n\t"
  183578. #endif
  183579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183580. "adds r3, r3, r6\n\t"
  183581. #else
  183582. "add r3, r3, r6\n\t"
  183583. #endif
  183584. #ifdef WOLFSSL_KEIL
  183585. "adcs r4, r4, %[r]\n\t"
  183586. #elif defined(__clang__)
  183587. "adcs r4, %[r]\n\t"
  183588. #else
  183589. "adc r4, %[r]\n\t"
  183590. #endif
  183591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183592. "adds r3, r3, r6\n\t"
  183593. #else
  183594. "add r3, r3, r6\n\t"
  183595. #endif
  183596. #ifdef WOLFSSL_KEIL
  183597. "adcs r4, r4, %[r]\n\t"
  183598. #elif defined(__clang__)
  183599. "adcs r4, %[r]\n\t"
  183600. #else
  183601. "adc r4, %[r]\n\t"
  183602. #endif
  183603. "uxth r6, r7\n\t"
  183604. #ifdef WOLFSSL_KEIL
  183605. "muls r5, r6, r5\n\t"
  183606. #elif defined(__clang__)
  183607. "muls r5, r6\n\t"
  183608. #else
  183609. "mul r5, r6\n\t"
  183610. #endif
  183611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183612. "lsrs r6, r5, #16\n\t"
  183613. #else
  183614. "lsr r6, r5, #16\n\t"
  183615. #endif
  183616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183617. "lsls r5, r5, #16\n\t"
  183618. #else
  183619. "lsl r5, r5, #16\n\t"
  183620. #endif
  183621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183622. "adds r2, r2, r5\n\t"
  183623. #else
  183624. "add r2, r2, r5\n\t"
  183625. #endif
  183626. #ifdef WOLFSSL_KEIL
  183627. "adcs r3, r3, r6\n\t"
  183628. #elif defined(__clang__)
  183629. "adcs r3, r6\n\t"
  183630. #else
  183631. "adc r3, r6\n\t"
  183632. #endif
  183633. #ifdef WOLFSSL_KEIL
  183634. "adcs r4, r4, %[r]\n\t"
  183635. #elif defined(__clang__)
  183636. "adcs r4, %[r]\n\t"
  183637. #else
  183638. "adc r4, %[r]\n\t"
  183639. #endif
  183640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183641. "adds r2, r2, r5\n\t"
  183642. #else
  183643. "add r2, r2, r5\n\t"
  183644. #endif
  183645. #ifdef WOLFSSL_KEIL
  183646. "adcs r3, r3, r6\n\t"
  183647. #elif defined(__clang__)
  183648. "adcs r3, r6\n\t"
  183649. #else
  183650. "adc r3, r6\n\t"
  183651. #endif
  183652. #ifdef WOLFSSL_KEIL
  183653. "adcs r4, r4, %[r]\n\t"
  183654. #elif defined(__clang__)
  183655. "adcs r4, %[r]\n\t"
  183656. #else
  183657. "adc r4, %[r]\n\t"
  183658. #endif
  183659. "# A[10] * A[5]\n\t"
  183660. "mov %[a], r9\n\t"
  183661. "ldr r7, [%[a], #20]\n\t"
  183662. "ldr %[a], [%[a], #40]\n\t"
  183663. "uxth r5, %[a]\n\t"
  183664. "uxth r6, r7\n\t"
  183665. #ifdef WOLFSSL_KEIL
  183666. "muls r6, r5, r6\n\t"
  183667. #elif defined(__clang__)
  183668. "muls r6, r5\n\t"
  183669. #else
  183670. "mul r6, r5\n\t"
  183671. #endif
  183672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183673. "adds r2, r2, r6\n\t"
  183674. #else
  183675. "add r2, r2, r6\n\t"
  183676. #endif
  183677. #ifdef WOLFSSL_KEIL
  183678. "adcs r3, r3, %[r]\n\t"
  183679. #elif defined(__clang__)
  183680. "adcs r3, %[r]\n\t"
  183681. #else
  183682. "adc r3, %[r]\n\t"
  183683. #endif
  183684. #ifdef WOLFSSL_KEIL
  183685. "adcs r4, r4, %[r]\n\t"
  183686. #elif defined(__clang__)
  183687. "adcs r4, %[r]\n\t"
  183688. #else
  183689. "adc r4, %[r]\n\t"
  183690. #endif
  183691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183692. "adds r2, r2, r6\n\t"
  183693. #else
  183694. "add r2, r2, r6\n\t"
  183695. #endif
  183696. #ifdef WOLFSSL_KEIL
  183697. "adcs r3, r3, %[r]\n\t"
  183698. #elif defined(__clang__)
  183699. "adcs r3, %[r]\n\t"
  183700. #else
  183701. "adc r3, %[r]\n\t"
  183702. #endif
  183703. #ifdef WOLFSSL_KEIL
  183704. "adcs r4, r4, %[r]\n\t"
  183705. #elif defined(__clang__)
  183706. "adcs r4, %[r]\n\t"
  183707. #else
  183708. "adc r4, %[r]\n\t"
  183709. #endif
  183710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183711. "lsrs r6, r7, #16\n\t"
  183712. #else
  183713. "lsr r6, r7, #16\n\t"
  183714. #endif
  183715. #ifdef WOLFSSL_KEIL
  183716. "muls r5, r6, r5\n\t"
  183717. #elif defined(__clang__)
  183718. "muls r5, r6\n\t"
  183719. #else
  183720. "mul r5, r6\n\t"
  183721. #endif
  183722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183723. "lsrs r6, r5, #16\n\t"
  183724. #else
  183725. "lsr r6, r5, #16\n\t"
  183726. #endif
  183727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183728. "lsls r5, r5, #16\n\t"
  183729. #else
  183730. "lsl r5, r5, #16\n\t"
  183731. #endif
  183732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183733. "adds r2, r2, r5\n\t"
  183734. #else
  183735. "add r2, r2, r5\n\t"
  183736. #endif
  183737. #ifdef WOLFSSL_KEIL
  183738. "adcs r3, r3, r6\n\t"
  183739. #elif defined(__clang__)
  183740. "adcs r3, r6\n\t"
  183741. #else
  183742. "adc r3, r6\n\t"
  183743. #endif
  183744. #ifdef WOLFSSL_KEIL
  183745. "adcs r4, r4, %[r]\n\t"
  183746. #elif defined(__clang__)
  183747. "adcs r4, %[r]\n\t"
  183748. #else
  183749. "adc r4, %[r]\n\t"
  183750. #endif
  183751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183752. "adds r2, r2, r5\n\t"
  183753. #else
  183754. "add r2, r2, r5\n\t"
  183755. #endif
  183756. #ifdef WOLFSSL_KEIL
  183757. "adcs r3, r3, r6\n\t"
  183758. #elif defined(__clang__)
  183759. "adcs r3, r6\n\t"
  183760. #else
  183761. "adc r3, r6\n\t"
  183762. #endif
  183763. #ifdef WOLFSSL_KEIL
  183764. "adcs r4, r4, %[r]\n\t"
  183765. #elif defined(__clang__)
  183766. "adcs r4, %[r]\n\t"
  183767. #else
  183768. "adc r4, %[r]\n\t"
  183769. #endif
  183770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183771. "lsrs r5, %[a], #16\n\t"
  183772. #else
  183773. "lsr r5, %[a], #16\n\t"
  183774. #endif
  183775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183776. "lsrs r6, r7, #16\n\t"
  183777. #else
  183778. "lsr r6, r7, #16\n\t"
  183779. #endif
  183780. #ifdef WOLFSSL_KEIL
  183781. "muls r6, r5, r6\n\t"
  183782. #elif defined(__clang__)
  183783. "muls r6, r5\n\t"
  183784. #else
  183785. "mul r6, r5\n\t"
  183786. #endif
  183787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183788. "adds r3, r3, r6\n\t"
  183789. #else
  183790. "add r3, r3, r6\n\t"
  183791. #endif
  183792. #ifdef WOLFSSL_KEIL
  183793. "adcs r4, r4, %[r]\n\t"
  183794. #elif defined(__clang__)
  183795. "adcs r4, %[r]\n\t"
  183796. #else
  183797. "adc r4, %[r]\n\t"
  183798. #endif
  183799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183800. "adds r3, r3, r6\n\t"
  183801. #else
  183802. "add r3, r3, r6\n\t"
  183803. #endif
  183804. #ifdef WOLFSSL_KEIL
  183805. "adcs r4, r4, %[r]\n\t"
  183806. #elif defined(__clang__)
  183807. "adcs r4, %[r]\n\t"
  183808. #else
  183809. "adc r4, %[r]\n\t"
  183810. #endif
  183811. "uxth r6, r7\n\t"
  183812. #ifdef WOLFSSL_KEIL
  183813. "muls r5, r6, r5\n\t"
  183814. #elif defined(__clang__)
  183815. "muls r5, r6\n\t"
  183816. #else
  183817. "mul r5, r6\n\t"
  183818. #endif
  183819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183820. "lsrs r6, r5, #16\n\t"
  183821. #else
  183822. "lsr r6, r5, #16\n\t"
  183823. #endif
  183824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183825. "lsls r5, r5, #16\n\t"
  183826. #else
  183827. "lsl r5, r5, #16\n\t"
  183828. #endif
  183829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183830. "adds r2, r2, r5\n\t"
  183831. #else
  183832. "add r2, r2, r5\n\t"
  183833. #endif
  183834. #ifdef WOLFSSL_KEIL
  183835. "adcs r3, r3, r6\n\t"
  183836. #elif defined(__clang__)
  183837. "adcs r3, r6\n\t"
  183838. #else
  183839. "adc r3, r6\n\t"
  183840. #endif
  183841. #ifdef WOLFSSL_KEIL
  183842. "adcs r4, r4, %[r]\n\t"
  183843. #elif defined(__clang__)
  183844. "adcs r4, %[r]\n\t"
  183845. #else
  183846. "adc r4, %[r]\n\t"
  183847. #endif
  183848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183849. "adds r2, r2, r5\n\t"
  183850. #else
  183851. "add r2, r2, r5\n\t"
  183852. #endif
  183853. #ifdef WOLFSSL_KEIL
  183854. "adcs r3, r3, r6\n\t"
  183855. #elif defined(__clang__)
  183856. "adcs r3, r6\n\t"
  183857. #else
  183858. "adc r3, r6\n\t"
  183859. #endif
  183860. #ifdef WOLFSSL_KEIL
  183861. "adcs r4, r4, %[r]\n\t"
  183862. #elif defined(__clang__)
  183863. "adcs r4, %[r]\n\t"
  183864. #else
  183865. "adc r4, %[r]\n\t"
  183866. #endif
  183867. "# A[11] * A[4]\n\t"
  183868. "mov %[a], r9\n\t"
  183869. "ldr r7, [%[a], #16]\n\t"
  183870. "ldr %[a], [%[a], #44]\n\t"
  183871. "uxth r5, %[a]\n\t"
  183872. "uxth r6, r7\n\t"
  183873. #ifdef WOLFSSL_KEIL
  183874. "muls r6, r5, r6\n\t"
  183875. #elif defined(__clang__)
  183876. "muls r6, r5\n\t"
  183877. #else
  183878. "mul r6, r5\n\t"
  183879. #endif
  183880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183881. "adds r2, r2, r6\n\t"
  183882. #else
  183883. "add r2, r2, r6\n\t"
  183884. #endif
  183885. #ifdef WOLFSSL_KEIL
  183886. "adcs r3, r3, %[r]\n\t"
  183887. #elif defined(__clang__)
  183888. "adcs r3, %[r]\n\t"
  183889. #else
  183890. "adc r3, %[r]\n\t"
  183891. #endif
  183892. #ifdef WOLFSSL_KEIL
  183893. "adcs r4, r4, %[r]\n\t"
  183894. #elif defined(__clang__)
  183895. "adcs r4, %[r]\n\t"
  183896. #else
  183897. "adc r4, %[r]\n\t"
  183898. #endif
  183899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183900. "adds r2, r2, r6\n\t"
  183901. #else
  183902. "add r2, r2, r6\n\t"
  183903. #endif
  183904. #ifdef WOLFSSL_KEIL
  183905. "adcs r3, r3, %[r]\n\t"
  183906. #elif defined(__clang__)
  183907. "adcs r3, %[r]\n\t"
  183908. #else
  183909. "adc r3, %[r]\n\t"
  183910. #endif
  183911. #ifdef WOLFSSL_KEIL
  183912. "adcs r4, r4, %[r]\n\t"
  183913. #elif defined(__clang__)
  183914. "adcs r4, %[r]\n\t"
  183915. #else
  183916. "adc r4, %[r]\n\t"
  183917. #endif
  183918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183919. "lsrs r6, r7, #16\n\t"
  183920. #else
  183921. "lsr r6, r7, #16\n\t"
  183922. #endif
  183923. #ifdef WOLFSSL_KEIL
  183924. "muls r5, r6, r5\n\t"
  183925. #elif defined(__clang__)
  183926. "muls r5, r6\n\t"
  183927. #else
  183928. "mul r5, r6\n\t"
  183929. #endif
  183930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183931. "lsrs r6, r5, #16\n\t"
  183932. #else
  183933. "lsr r6, r5, #16\n\t"
  183934. #endif
  183935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183936. "lsls r5, r5, #16\n\t"
  183937. #else
  183938. "lsl r5, r5, #16\n\t"
  183939. #endif
  183940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183941. "adds r2, r2, r5\n\t"
  183942. #else
  183943. "add r2, r2, r5\n\t"
  183944. #endif
  183945. #ifdef WOLFSSL_KEIL
  183946. "adcs r3, r3, r6\n\t"
  183947. #elif defined(__clang__)
  183948. "adcs r3, r6\n\t"
  183949. #else
  183950. "adc r3, r6\n\t"
  183951. #endif
  183952. #ifdef WOLFSSL_KEIL
  183953. "adcs r4, r4, %[r]\n\t"
  183954. #elif defined(__clang__)
  183955. "adcs r4, %[r]\n\t"
  183956. #else
  183957. "adc r4, %[r]\n\t"
  183958. #endif
  183959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183960. "adds r2, r2, r5\n\t"
  183961. #else
  183962. "add r2, r2, r5\n\t"
  183963. #endif
  183964. #ifdef WOLFSSL_KEIL
  183965. "adcs r3, r3, r6\n\t"
  183966. #elif defined(__clang__)
  183967. "adcs r3, r6\n\t"
  183968. #else
  183969. "adc r3, r6\n\t"
  183970. #endif
  183971. #ifdef WOLFSSL_KEIL
  183972. "adcs r4, r4, %[r]\n\t"
  183973. #elif defined(__clang__)
  183974. "adcs r4, %[r]\n\t"
  183975. #else
  183976. "adc r4, %[r]\n\t"
  183977. #endif
  183978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183979. "lsrs r5, %[a], #16\n\t"
  183980. #else
  183981. "lsr r5, %[a], #16\n\t"
  183982. #endif
  183983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183984. "lsrs r6, r7, #16\n\t"
  183985. #else
  183986. "lsr r6, r7, #16\n\t"
  183987. #endif
  183988. #ifdef WOLFSSL_KEIL
  183989. "muls r6, r5, r6\n\t"
  183990. #elif defined(__clang__)
  183991. "muls r6, r5\n\t"
  183992. #else
  183993. "mul r6, r5\n\t"
  183994. #endif
  183995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183996. "adds r3, r3, r6\n\t"
  183997. #else
  183998. "add r3, r3, r6\n\t"
  183999. #endif
  184000. #ifdef WOLFSSL_KEIL
  184001. "adcs r4, r4, %[r]\n\t"
  184002. #elif defined(__clang__)
  184003. "adcs r4, %[r]\n\t"
  184004. #else
  184005. "adc r4, %[r]\n\t"
  184006. #endif
  184007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184008. "adds r3, r3, r6\n\t"
  184009. #else
  184010. "add r3, r3, r6\n\t"
  184011. #endif
  184012. #ifdef WOLFSSL_KEIL
  184013. "adcs r4, r4, %[r]\n\t"
  184014. #elif defined(__clang__)
  184015. "adcs r4, %[r]\n\t"
  184016. #else
  184017. "adc r4, %[r]\n\t"
  184018. #endif
  184019. "uxth r6, r7\n\t"
  184020. #ifdef WOLFSSL_KEIL
  184021. "muls r5, r6, r5\n\t"
  184022. #elif defined(__clang__)
  184023. "muls r5, r6\n\t"
  184024. #else
  184025. "mul r5, r6\n\t"
  184026. #endif
  184027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184028. "lsrs r6, r5, #16\n\t"
  184029. #else
  184030. "lsr r6, r5, #16\n\t"
  184031. #endif
  184032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184033. "lsls r5, r5, #16\n\t"
  184034. #else
  184035. "lsl r5, r5, #16\n\t"
  184036. #endif
  184037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184038. "adds r2, r2, r5\n\t"
  184039. #else
  184040. "add r2, r2, r5\n\t"
  184041. #endif
  184042. #ifdef WOLFSSL_KEIL
  184043. "adcs r3, r3, r6\n\t"
  184044. #elif defined(__clang__)
  184045. "adcs r3, r6\n\t"
  184046. #else
  184047. "adc r3, r6\n\t"
  184048. #endif
  184049. #ifdef WOLFSSL_KEIL
  184050. "adcs r4, r4, %[r]\n\t"
  184051. #elif defined(__clang__)
  184052. "adcs r4, %[r]\n\t"
  184053. #else
  184054. "adc r4, %[r]\n\t"
  184055. #endif
  184056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184057. "adds r2, r2, r5\n\t"
  184058. #else
  184059. "add r2, r2, r5\n\t"
  184060. #endif
  184061. #ifdef WOLFSSL_KEIL
  184062. "adcs r3, r3, r6\n\t"
  184063. #elif defined(__clang__)
  184064. "adcs r3, r6\n\t"
  184065. #else
  184066. "adc r3, r6\n\t"
  184067. #endif
  184068. #ifdef WOLFSSL_KEIL
  184069. "adcs r4, r4, %[r]\n\t"
  184070. #elif defined(__clang__)
  184071. "adcs r4, %[r]\n\t"
  184072. #else
  184073. "adc r4, %[r]\n\t"
  184074. #endif
  184075. "# A[12] * A[3]\n\t"
  184076. "mov %[a], r9\n\t"
  184077. "mov r7, lr\n\t"
  184078. "ldr %[a], [%[a], #48]\n\t"
  184079. "uxth r5, %[a]\n\t"
  184080. "uxth r6, r7\n\t"
  184081. #ifdef WOLFSSL_KEIL
  184082. "muls r6, r5, r6\n\t"
  184083. #elif defined(__clang__)
  184084. "muls r6, r5\n\t"
  184085. #else
  184086. "mul r6, r5\n\t"
  184087. #endif
  184088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184089. "adds r2, r2, r6\n\t"
  184090. #else
  184091. "add r2, r2, r6\n\t"
  184092. #endif
  184093. #ifdef WOLFSSL_KEIL
  184094. "adcs r3, r3, %[r]\n\t"
  184095. #elif defined(__clang__)
  184096. "adcs r3, %[r]\n\t"
  184097. #else
  184098. "adc r3, %[r]\n\t"
  184099. #endif
  184100. #ifdef WOLFSSL_KEIL
  184101. "adcs r4, r4, %[r]\n\t"
  184102. #elif defined(__clang__)
  184103. "adcs r4, %[r]\n\t"
  184104. #else
  184105. "adc r4, %[r]\n\t"
  184106. #endif
  184107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184108. "adds r2, r2, r6\n\t"
  184109. #else
  184110. "add r2, r2, r6\n\t"
  184111. #endif
  184112. #ifdef WOLFSSL_KEIL
  184113. "adcs r3, r3, %[r]\n\t"
  184114. #elif defined(__clang__)
  184115. "adcs r3, %[r]\n\t"
  184116. #else
  184117. "adc r3, %[r]\n\t"
  184118. #endif
  184119. #ifdef WOLFSSL_KEIL
  184120. "adcs r4, r4, %[r]\n\t"
  184121. #elif defined(__clang__)
  184122. "adcs r4, %[r]\n\t"
  184123. #else
  184124. "adc r4, %[r]\n\t"
  184125. #endif
  184126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184127. "lsrs r6, r7, #16\n\t"
  184128. #else
  184129. "lsr r6, r7, #16\n\t"
  184130. #endif
  184131. #ifdef WOLFSSL_KEIL
  184132. "muls r5, r6, r5\n\t"
  184133. #elif defined(__clang__)
  184134. "muls r5, r6\n\t"
  184135. #else
  184136. "mul r5, r6\n\t"
  184137. #endif
  184138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184139. "lsrs r6, r5, #16\n\t"
  184140. #else
  184141. "lsr r6, r5, #16\n\t"
  184142. #endif
  184143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184144. "lsls r5, r5, #16\n\t"
  184145. #else
  184146. "lsl r5, r5, #16\n\t"
  184147. #endif
  184148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184149. "adds r2, r2, r5\n\t"
  184150. #else
  184151. "add r2, r2, r5\n\t"
  184152. #endif
  184153. #ifdef WOLFSSL_KEIL
  184154. "adcs r3, r3, r6\n\t"
  184155. #elif defined(__clang__)
  184156. "adcs r3, r6\n\t"
  184157. #else
  184158. "adc r3, r6\n\t"
  184159. #endif
  184160. #ifdef WOLFSSL_KEIL
  184161. "adcs r4, r4, %[r]\n\t"
  184162. #elif defined(__clang__)
  184163. "adcs r4, %[r]\n\t"
  184164. #else
  184165. "adc r4, %[r]\n\t"
  184166. #endif
  184167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184168. "adds r2, r2, r5\n\t"
  184169. #else
  184170. "add r2, r2, r5\n\t"
  184171. #endif
  184172. #ifdef WOLFSSL_KEIL
  184173. "adcs r3, r3, r6\n\t"
  184174. #elif defined(__clang__)
  184175. "adcs r3, r6\n\t"
  184176. #else
  184177. "adc r3, r6\n\t"
  184178. #endif
  184179. #ifdef WOLFSSL_KEIL
  184180. "adcs r4, r4, %[r]\n\t"
  184181. #elif defined(__clang__)
  184182. "adcs r4, %[r]\n\t"
  184183. #else
  184184. "adc r4, %[r]\n\t"
  184185. #endif
  184186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184187. "lsrs r5, %[a], #16\n\t"
  184188. #else
  184189. "lsr r5, %[a], #16\n\t"
  184190. #endif
  184191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184192. "lsrs r6, r7, #16\n\t"
  184193. #else
  184194. "lsr r6, r7, #16\n\t"
  184195. #endif
  184196. #ifdef WOLFSSL_KEIL
  184197. "muls r6, r5, r6\n\t"
  184198. #elif defined(__clang__)
  184199. "muls r6, r5\n\t"
  184200. #else
  184201. "mul r6, r5\n\t"
  184202. #endif
  184203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184204. "adds r3, r3, r6\n\t"
  184205. #else
  184206. "add r3, r3, r6\n\t"
  184207. #endif
  184208. #ifdef WOLFSSL_KEIL
  184209. "adcs r4, r4, %[r]\n\t"
  184210. #elif defined(__clang__)
  184211. "adcs r4, %[r]\n\t"
  184212. #else
  184213. "adc r4, %[r]\n\t"
  184214. #endif
  184215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184216. "adds r3, r3, r6\n\t"
  184217. #else
  184218. "add r3, r3, r6\n\t"
  184219. #endif
  184220. #ifdef WOLFSSL_KEIL
  184221. "adcs r4, r4, %[r]\n\t"
  184222. #elif defined(__clang__)
  184223. "adcs r4, %[r]\n\t"
  184224. #else
  184225. "adc r4, %[r]\n\t"
  184226. #endif
  184227. "uxth r6, r7\n\t"
  184228. #ifdef WOLFSSL_KEIL
  184229. "muls r5, r6, r5\n\t"
  184230. #elif defined(__clang__)
  184231. "muls r5, r6\n\t"
  184232. #else
  184233. "mul r5, r6\n\t"
  184234. #endif
  184235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184236. "lsrs r6, r5, #16\n\t"
  184237. #else
  184238. "lsr r6, r5, #16\n\t"
  184239. #endif
  184240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184241. "lsls r5, r5, #16\n\t"
  184242. #else
  184243. "lsl r5, r5, #16\n\t"
  184244. #endif
  184245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184246. "adds r2, r2, r5\n\t"
  184247. #else
  184248. "add r2, r2, r5\n\t"
  184249. #endif
  184250. #ifdef WOLFSSL_KEIL
  184251. "adcs r3, r3, r6\n\t"
  184252. #elif defined(__clang__)
  184253. "adcs r3, r6\n\t"
  184254. #else
  184255. "adc r3, r6\n\t"
  184256. #endif
  184257. #ifdef WOLFSSL_KEIL
  184258. "adcs r4, r4, %[r]\n\t"
  184259. #elif defined(__clang__)
  184260. "adcs r4, %[r]\n\t"
  184261. #else
  184262. "adc r4, %[r]\n\t"
  184263. #endif
  184264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184265. "adds r2, r2, r5\n\t"
  184266. #else
  184267. "add r2, r2, r5\n\t"
  184268. #endif
  184269. #ifdef WOLFSSL_KEIL
  184270. "adcs r3, r3, r6\n\t"
  184271. #elif defined(__clang__)
  184272. "adcs r3, r6\n\t"
  184273. #else
  184274. "adc r3, r6\n\t"
  184275. #endif
  184276. #ifdef WOLFSSL_KEIL
  184277. "adcs r4, r4, %[r]\n\t"
  184278. #elif defined(__clang__)
  184279. "adcs r4, %[r]\n\t"
  184280. #else
  184281. "adc r4, %[r]\n\t"
  184282. #endif
  184283. "# A[13] * A[2]\n\t"
  184284. "mov %[a], r9\n\t"
  184285. "mov r7, r12\n\t"
  184286. "ldr %[a], [%[a], #52]\n\t"
  184287. "uxth r5, %[a]\n\t"
  184288. "uxth r6, r7\n\t"
  184289. #ifdef WOLFSSL_KEIL
  184290. "muls r6, r5, r6\n\t"
  184291. #elif defined(__clang__)
  184292. "muls r6, r5\n\t"
  184293. #else
  184294. "mul r6, r5\n\t"
  184295. #endif
  184296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184297. "adds r2, r2, r6\n\t"
  184298. #else
  184299. "add r2, r2, r6\n\t"
  184300. #endif
  184301. #ifdef WOLFSSL_KEIL
  184302. "adcs r3, r3, %[r]\n\t"
  184303. #elif defined(__clang__)
  184304. "adcs r3, %[r]\n\t"
  184305. #else
  184306. "adc r3, %[r]\n\t"
  184307. #endif
  184308. #ifdef WOLFSSL_KEIL
  184309. "adcs r4, r4, %[r]\n\t"
  184310. #elif defined(__clang__)
  184311. "adcs r4, %[r]\n\t"
  184312. #else
  184313. "adc r4, %[r]\n\t"
  184314. #endif
  184315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184316. "adds r2, r2, r6\n\t"
  184317. #else
  184318. "add r2, r2, r6\n\t"
  184319. #endif
  184320. #ifdef WOLFSSL_KEIL
  184321. "adcs r3, r3, %[r]\n\t"
  184322. #elif defined(__clang__)
  184323. "adcs r3, %[r]\n\t"
  184324. #else
  184325. "adc r3, %[r]\n\t"
  184326. #endif
  184327. #ifdef WOLFSSL_KEIL
  184328. "adcs r4, r4, %[r]\n\t"
  184329. #elif defined(__clang__)
  184330. "adcs r4, %[r]\n\t"
  184331. #else
  184332. "adc r4, %[r]\n\t"
  184333. #endif
  184334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184335. "lsrs r6, r7, #16\n\t"
  184336. #else
  184337. "lsr r6, r7, #16\n\t"
  184338. #endif
  184339. #ifdef WOLFSSL_KEIL
  184340. "muls r5, r6, r5\n\t"
  184341. #elif defined(__clang__)
  184342. "muls r5, r6\n\t"
  184343. #else
  184344. "mul r5, r6\n\t"
  184345. #endif
  184346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184347. "lsrs r6, r5, #16\n\t"
  184348. #else
  184349. "lsr r6, r5, #16\n\t"
  184350. #endif
  184351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184352. "lsls r5, r5, #16\n\t"
  184353. #else
  184354. "lsl r5, r5, #16\n\t"
  184355. #endif
  184356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184357. "adds r2, r2, r5\n\t"
  184358. #else
  184359. "add r2, r2, r5\n\t"
  184360. #endif
  184361. #ifdef WOLFSSL_KEIL
  184362. "adcs r3, r3, r6\n\t"
  184363. #elif defined(__clang__)
  184364. "adcs r3, r6\n\t"
  184365. #else
  184366. "adc r3, r6\n\t"
  184367. #endif
  184368. #ifdef WOLFSSL_KEIL
  184369. "adcs r4, r4, %[r]\n\t"
  184370. #elif defined(__clang__)
  184371. "adcs r4, %[r]\n\t"
  184372. #else
  184373. "adc r4, %[r]\n\t"
  184374. #endif
  184375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184376. "adds r2, r2, r5\n\t"
  184377. #else
  184378. "add r2, r2, r5\n\t"
  184379. #endif
  184380. #ifdef WOLFSSL_KEIL
  184381. "adcs r3, r3, r6\n\t"
  184382. #elif defined(__clang__)
  184383. "adcs r3, r6\n\t"
  184384. #else
  184385. "adc r3, r6\n\t"
  184386. #endif
  184387. #ifdef WOLFSSL_KEIL
  184388. "adcs r4, r4, %[r]\n\t"
  184389. #elif defined(__clang__)
  184390. "adcs r4, %[r]\n\t"
  184391. #else
  184392. "adc r4, %[r]\n\t"
  184393. #endif
  184394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184395. "lsrs r5, %[a], #16\n\t"
  184396. #else
  184397. "lsr r5, %[a], #16\n\t"
  184398. #endif
  184399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184400. "lsrs r6, r7, #16\n\t"
  184401. #else
  184402. "lsr r6, r7, #16\n\t"
  184403. #endif
  184404. #ifdef WOLFSSL_KEIL
  184405. "muls r6, r5, r6\n\t"
  184406. #elif defined(__clang__)
  184407. "muls r6, r5\n\t"
  184408. #else
  184409. "mul r6, r5\n\t"
  184410. #endif
  184411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184412. "adds r3, r3, r6\n\t"
  184413. #else
  184414. "add r3, r3, r6\n\t"
  184415. #endif
  184416. #ifdef WOLFSSL_KEIL
  184417. "adcs r4, r4, %[r]\n\t"
  184418. #elif defined(__clang__)
  184419. "adcs r4, %[r]\n\t"
  184420. #else
  184421. "adc r4, %[r]\n\t"
  184422. #endif
  184423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184424. "adds r3, r3, r6\n\t"
  184425. #else
  184426. "add r3, r3, r6\n\t"
  184427. #endif
  184428. #ifdef WOLFSSL_KEIL
  184429. "adcs r4, r4, %[r]\n\t"
  184430. #elif defined(__clang__)
  184431. "adcs r4, %[r]\n\t"
  184432. #else
  184433. "adc r4, %[r]\n\t"
  184434. #endif
  184435. "uxth r6, r7\n\t"
  184436. #ifdef WOLFSSL_KEIL
  184437. "muls r5, r6, r5\n\t"
  184438. #elif defined(__clang__)
  184439. "muls r5, r6\n\t"
  184440. #else
  184441. "mul r5, r6\n\t"
  184442. #endif
  184443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184444. "lsrs r6, r5, #16\n\t"
  184445. #else
  184446. "lsr r6, r5, #16\n\t"
  184447. #endif
  184448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184449. "lsls r5, r5, #16\n\t"
  184450. #else
  184451. "lsl r5, r5, #16\n\t"
  184452. #endif
  184453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184454. "adds r2, r2, r5\n\t"
  184455. #else
  184456. "add r2, r2, r5\n\t"
  184457. #endif
  184458. #ifdef WOLFSSL_KEIL
  184459. "adcs r3, r3, r6\n\t"
  184460. #elif defined(__clang__)
  184461. "adcs r3, r6\n\t"
  184462. #else
  184463. "adc r3, r6\n\t"
  184464. #endif
  184465. #ifdef WOLFSSL_KEIL
  184466. "adcs r4, r4, %[r]\n\t"
  184467. #elif defined(__clang__)
  184468. "adcs r4, %[r]\n\t"
  184469. #else
  184470. "adc r4, %[r]\n\t"
  184471. #endif
  184472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184473. "adds r2, r2, r5\n\t"
  184474. #else
  184475. "add r2, r2, r5\n\t"
  184476. #endif
  184477. #ifdef WOLFSSL_KEIL
  184478. "adcs r3, r3, r6\n\t"
  184479. #elif defined(__clang__)
  184480. "adcs r3, r6\n\t"
  184481. #else
  184482. "adc r3, r6\n\t"
  184483. #endif
  184484. #ifdef WOLFSSL_KEIL
  184485. "adcs r4, r4, %[r]\n\t"
  184486. #elif defined(__clang__)
  184487. "adcs r4, %[r]\n\t"
  184488. #else
  184489. "adc r4, %[r]\n\t"
  184490. #endif
  184491. "# A[14] * A[1]\n\t"
  184492. "mov %[a], r9\n\t"
  184493. "mov r7, r11\n\t"
  184494. "ldr %[a], [%[a], #56]\n\t"
  184495. "uxth r5, %[a]\n\t"
  184496. "uxth r6, r7\n\t"
  184497. #ifdef WOLFSSL_KEIL
  184498. "muls r6, r5, r6\n\t"
  184499. #elif defined(__clang__)
  184500. "muls r6, r5\n\t"
  184501. #else
  184502. "mul r6, r5\n\t"
  184503. #endif
  184504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184505. "adds r2, r2, r6\n\t"
  184506. #else
  184507. "add r2, r2, r6\n\t"
  184508. #endif
  184509. #ifdef WOLFSSL_KEIL
  184510. "adcs r3, r3, %[r]\n\t"
  184511. #elif defined(__clang__)
  184512. "adcs r3, %[r]\n\t"
  184513. #else
  184514. "adc r3, %[r]\n\t"
  184515. #endif
  184516. #ifdef WOLFSSL_KEIL
  184517. "adcs r4, r4, %[r]\n\t"
  184518. #elif defined(__clang__)
  184519. "adcs r4, %[r]\n\t"
  184520. #else
  184521. "adc r4, %[r]\n\t"
  184522. #endif
  184523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184524. "adds r2, r2, r6\n\t"
  184525. #else
  184526. "add r2, r2, r6\n\t"
  184527. #endif
  184528. #ifdef WOLFSSL_KEIL
  184529. "adcs r3, r3, %[r]\n\t"
  184530. #elif defined(__clang__)
  184531. "adcs r3, %[r]\n\t"
  184532. #else
  184533. "adc r3, %[r]\n\t"
  184534. #endif
  184535. #ifdef WOLFSSL_KEIL
  184536. "adcs r4, r4, %[r]\n\t"
  184537. #elif defined(__clang__)
  184538. "adcs r4, %[r]\n\t"
  184539. #else
  184540. "adc r4, %[r]\n\t"
  184541. #endif
  184542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184543. "lsrs r6, r7, #16\n\t"
  184544. #else
  184545. "lsr r6, r7, #16\n\t"
  184546. #endif
  184547. #ifdef WOLFSSL_KEIL
  184548. "muls r5, r6, r5\n\t"
  184549. #elif defined(__clang__)
  184550. "muls r5, r6\n\t"
  184551. #else
  184552. "mul r5, r6\n\t"
  184553. #endif
  184554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184555. "lsrs r6, r5, #16\n\t"
  184556. #else
  184557. "lsr r6, r5, #16\n\t"
  184558. #endif
  184559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184560. "lsls r5, r5, #16\n\t"
  184561. #else
  184562. "lsl r5, r5, #16\n\t"
  184563. #endif
  184564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184565. "adds r2, r2, r5\n\t"
  184566. #else
  184567. "add r2, r2, r5\n\t"
  184568. #endif
  184569. #ifdef WOLFSSL_KEIL
  184570. "adcs r3, r3, r6\n\t"
  184571. #elif defined(__clang__)
  184572. "adcs r3, r6\n\t"
  184573. #else
  184574. "adc r3, r6\n\t"
  184575. #endif
  184576. #ifdef WOLFSSL_KEIL
  184577. "adcs r4, r4, %[r]\n\t"
  184578. #elif defined(__clang__)
  184579. "adcs r4, %[r]\n\t"
  184580. #else
  184581. "adc r4, %[r]\n\t"
  184582. #endif
  184583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184584. "adds r2, r2, r5\n\t"
  184585. #else
  184586. "add r2, r2, r5\n\t"
  184587. #endif
  184588. #ifdef WOLFSSL_KEIL
  184589. "adcs r3, r3, r6\n\t"
  184590. #elif defined(__clang__)
  184591. "adcs r3, r6\n\t"
  184592. #else
  184593. "adc r3, r6\n\t"
  184594. #endif
  184595. #ifdef WOLFSSL_KEIL
  184596. "adcs r4, r4, %[r]\n\t"
  184597. #elif defined(__clang__)
  184598. "adcs r4, %[r]\n\t"
  184599. #else
  184600. "adc r4, %[r]\n\t"
  184601. #endif
  184602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184603. "lsrs r5, %[a], #16\n\t"
  184604. #else
  184605. "lsr r5, %[a], #16\n\t"
  184606. #endif
  184607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184608. "lsrs r6, r7, #16\n\t"
  184609. #else
  184610. "lsr r6, r7, #16\n\t"
  184611. #endif
  184612. #ifdef WOLFSSL_KEIL
  184613. "muls r6, r5, r6\n\t"
  184614. #elif defined(__clang__)
  184615. "muls r6, r5\n\t"
  184616. #else
  184617. "mul r6, r5\n\t"
  184618. #endif
  184619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184620. "adds r3, r3, r6\n\t"
  184621. #else
  184622. "add r3, r3, r6\n\t"
  184623. #endif
  184624. #ifdef WOLFSSL_KEIL
  184625. "adcs r4, r4, %[r]\n\t"
  184626. #elif defined(__clang__)
  184627. "adcs r4, %[r]\n\t"
  184628. #else
  184629. "adc r4, %[r]\n\t"
  184630. #endif
  184631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184632. "adds r3, r3, r6\n\t"
  184633. #else
  184634. "add r3, r3, r6\n\t"
  184635. #endif
  184636. #ifdef WOLFSSL_KEIL
  184637. "adcs r4, r4, %[r]\n\t"
  184638. #elif defined(__clang__)
  184639. "adcs r4, %[r]\n\t"
  184640. #else
  184641. "adc r4, %[r]\n\t"
  184642. #endif
  184643. "uxth r6, r7\n\t"
  184644. #ifdef WOLFSSL_KEIL
  184645. "muls r5, r6, r5\n\t"
  184646. #elif defined(__clang__)
  184647. "muls r5, r6\n\t"
  184648. #else
  184649. "mul r5, r6\n\t"
  184650. #endif
  184651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184652. "lsrs r6, r5, #16\n\t"
  184653. #else
  184654. "lsr r6, r5, #16\n\t"
  184655. #endif
  184656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184657. "lsls r5, r5, #16\n\t"
  184658. #else
  184659. "lsl r5, r5, #16\n\t"
  184660. #endif
  184661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184662. "adds r2, r2, r5\n\t"
  184663. #else
  184664. "add r2, r2, r5\n\t"
  184665. #endif
  184666. #ifdef WOLFSSL_KEIL
  184667. "adcs r3, r3, r6\n\t"
  184668. #elif defined(__clang__)
  184669. "adcs r3, r6\n\t"
  184670. #else
  184671. "adc r3, r6\n\t"
  184672. #endif
  184673. #ifdef WOLFSSL_KEIL
  184674. "adcs r4, r4, %[r]\n\t"
  184675. #elif defined(__clang__)
  184676. "adcs r4, %[r]\n\t"
  184677. #else
  184678. "adc r4, %[r]\n\t"
  184679. #endif
  184680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184681. "adds r2, r2, r5\n\t"
  184682. #else
  184683. "add r2, r2, r5\n\t"
  184684. #endif
  184685. #ifdef WOLFSSL_KEIL
  184686. "adcs r3, r3, r6\n\t"
  184687. #elif defined(__clang__)
  184688. "adcs r3, r6\n\t"
  184689. #else
  184690. "adc r3, r6\n\t"
  184691. #endif
  184692. #ifdef WOLFSSL_KEIL
  184693. "adcs r4, r4, %[r]\n\t"
  184694. #elif defined(__clang__)
  184695. "adcs r4, %[r]\n\t"
  184696. #else
  184697. "adc r4, %[r]\n\t"
  184698. #endif
  184699. "# A[15] * A[0]\n\t"
  184700. "mov %[a], r9\n\t"
  184701. "mov r7, r10\n\t"
  184702. "ldr %[a], [%[a], #60]\n\t"
  184703. "uxth r5, %[a]\n\t"
  184704. "uxth r6, r7\n\t"
  184705. #ifdef WOLFSSL_KEIL
  184706. "muls r6, r5, r6\n\t"
  184707. #elif defined(__clang__)
  184708. "muls r6, r5\n\t"
  184709. #else
  184710. "mul r6, r5\n\t"
  184711. #endif
  184712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184713. "adds r2, r2, r6\n\t"
  184714. #else
  184715. "add r2, r2, r6\n\t"
  184716. #endif
  184717. #ifdef WOLFSSL_KEIL
  184718. "adcs r3, r3, %[r]\n\t"
  184719. #elif defined(__clang__)
  184720. "adcs r3, %[r]\n\t"
  184721. #else
  184722. "adc r3, %[r]\n\t"
  184723. #endif
  184724. #ifdef WOLFSSL_KEIL
  184725. "adcs r4, r4, %[r]\n\t"
  184726. #elif defined(__clang__)
  184727. "adcs r4, %[r]\n\t"
  184728. #else
  184729. "adc r4, %[r]\n\t"
  184730. #endif
  184731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184732. "adds r2, r2, r6\n\t"
  184733. #else
  184734. "add r2, r2, r6\n\t"
  184735. #endif
  184736. #ifdef WOLFSSL_KEIL
  184737. "adcs r3, r3, %[r]\n\t"
  184738. #elif defined(__clang__)
  184739. "adcs r3, %[r]\n\t"
  184740. #else
  184741. "adc r3, %[r]\n\t"
  184742. #endif
  184743. #ifdef WOLFSSL_KEIL
  184744. "adcs r4, r4, %[r]\n\t"
  184745. #elif defined(__clang__)
  184746. "adcs r4, %[r]\n\t"
  184747. #else
  184748. "adc r4, %[r]\n\t"
  184749. #endif
  184750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184751. "lsrs r6, r7, #16\n\t"
  184752. #else
  184753. "lsr r6, r7, #16\n\t"
  184754. #endif
  184755. #ifdef WOLFSSL_KEIL
  184756. "muls r5, r6, r5\n\t"
  184757. #elif defined(__clang__)
  184758. "muls r5, r6\n\t"
  184759. #else
  184760. "mul r5, r6\n\t"
  184761. #endif
  184762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184763. "lsrs r6, r5, #16\n\t"
  184764. #else
  184765. "lsr r6, r5, #16\n\t"
  184766. #endif
  184767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184768. "lsls r5, r5, #16\n\t"
  184769. #else
  184770. "lsl r5, r5, #16\n\t"
  184771. #endif
  184772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184773. "adds r2, r2, r5\n\t"
  184774. #else
  184775. "add r2, r2, r5\n\t"
  184776. #endif
  184777. #ifdef WOLFSSL_KEIL
  184778. "adcs r3, r3, r6\n\t"
  184779. #elif defined(__clang__)
  184780. "adcs r3, r6\n\t"
  184781. #else
  184782. "adc r3, r6\n\t"
  184783. #endif
  184784. #ifdef WOLFSSL_KEIL
  184785. "adcs r4, r4, %[r]\n\t"
  184786. #elif defined(__clang__)
  184787. "adcs r4, %[r]\n\t"
  184788. #else
  184789. "adc r4, %[r]\n\t"
  184790. #endif
  184791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184792. "adds r2, r2, r5\n\t"
  184793. #else
  184794. "add r2, r2, r5\n\t"
  184795. #endif
  184796. #ifdef WOLFSSL_KEIL
  184797. "adcs r3, r3, r6\n\t"
  184798. #elif defined(__clang__)
  184799. "adcs r3, r6\n\t"
  184800. #else
  184801. "adc r3, r6\n\t"
  184802. #endif
  184803. #ifdef WOLFSSL_KEIL
  184804. "adcs r4, r4, %[r]\n\t"
  184805. #elif defined(__clang__)
  184806. "adcs r4, %[r]\n\t"
  184807. #else
  184808. "adc r4, %[r]\n\t"
  184809. #endif
  184810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184811. "lsrs r5, %[a], #16\n\t"
  184812. #else
  184813. "lsr r5, %[a], #16\n\t"
  184814. #endif
  184815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184816. "lsrs r6, r7, #16\n\t"
  184817. #else
  184818. "lsr r6, r7, #16\n\t"
  184819. #endif
  184820. #ifdef WOLFSSL_KEIL
  184821. "muls r6, r5, r6\n\t"
  184822. #elif defined(__clang__)
  184823. "muls r6, r5\n\t"
  184824. #else
  184825. "mul r6, r5\n\t"
  184826. #endif
  184827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184828. "adds r3, r3, r6\n\t"
  184829. #else
  184830. "add r3, r3, r6\n\t"
  184831. #endif
  184832. #ifdef WOLFSSL_KEIL
  184833. "adcs r4, r4, %[r]\n\t"
  184834. #elif defined(__clang__)
  184835. "adcs r4, %[r]\n\t"
  184836. #else
  184837. "adc r4, %[r]\n\t"
  184838. #endif
  184839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184840. "adds r3, r3, r6\n\t"
  184841. #else
  184842. "add r3, r3, r6\n\t"
  184843. #endif
  184844. #ifdef WOLFSSL_KEIL
  184845. "adcs r4, r4, %[r]\n\t"
  184846. #elif defined(__clang__)
  184847. "adcs r4, %[r]\n\t"
  184848. #else
  184849. "adc r4, %[r]\n\t"
  184850. #endif
  184851. "uxth r6, r7\n\t"
  184852. #ifdef WOLFSSL_KEIL
  184853. "muls r5, r6, r5\n\t"
  184854. #elif defined(__clang__)
  184855. "muls r5, r6\n\t"
  184856. #else
  184857. "mul r5, r6\n\t"
  184858. #endif
  184859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184860. "lsrs r6, r5, #16\n\t"
  184861. #else
  184862. "lsr r6, r5, #16\n\t"
  184863. #endif
  184864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184865. "lsls r5, r5, #16\n\t"
  184866. #else
  184867. "lsl r5, r5, #16\n\t"
  184868. #endif
  184869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184870. "adds r2, r2, r5\n\t"
  184871. #else
  184872. "add r2, r2, r5\n\t"
  184873. #endif
  184874. #ifdef WOLFSSL_KEIL
  184875. "adcs r3, r3, r6\n\t"
  184876. #elif defined(__clang__)
  184877. "adcs r3, r6\n\t"
  184878. #else
  184879. "adc r3, r6\n\t"
  184880. #endif
  184881. #ifdef WOLFSSL_KEIL
  184882. "adcs r4, r4, %[r]\n\t"
  184883. #elif defined(__clang__)
  184884. "adcs r4, %[r]\n\t"
  184885. #else
  184886. "adc r4, %[r]\n\t"
  184887. #endif
  184888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184889. "adds r2, r2, r5\n\t"
  184890. #else
  184891. "add r2, r2, r5\n\t"
  184892. #endif
  184893. #ifdef WOLFSSL_KEIL
  184894. "adcs r3, r3, r6\n\t"
  184895. #elif defined(__clang__)
  184896. "adcs r3, r6\n\t"
  184897. #else
  184898. "adc r3, r6\n\t"
  184899. #endif
  184900. #ifdef WOLFSSL_KEIL
  184901. "adcs r4, r4, %[r]\n\t"
  184902. #elif defined(__clang__)
  184903. "adcs r4, %[r]\n\t"
  184904. #else
  184905. "adc r4, %[r]\n\t"
  184906. #endif
  184907. "str r2, [sp, #60]\n\t"
  184908. "# A[15] * A[1]\n\t"
  184909. "movs r2, #0\n\t"
  184910. "mov %[a], r9\n\t"
  184911. "mov r7, r11\n\t"
  184912. "ldr %[a], [%[a], #60]\n\t"
  184913. "uxth r5, %[a]\n\t"
  184914. "uxth r6, r7\n\t"
  184915. #ifdef WOLFSSL_KEIL
  184916. "muls r6, r5, r6\n\t"
  184917. #elif defined(__clang__)
  184918. "muls r6, r5\n\t"
  184919. #else
  184920. "mul r6, r5\n\t"
  184921. #endif
  184922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184923. "adds r3, r3, r6\n\t"
  184924. #else
  184925. "add r3, r3, r6\n\t"
  184926. #endif
  184927. #ifdef WOLFSSL_KEIL
  184928. "adcs r4, r4, %[r]\n\t"
  184929. #elif defined(__clang__)
  184930. "adcs r4, %[r]\n\t"
  184931. #else
  184932. "adc r4, %[r]\n\t"
  184933. #endif
  184934. #ifdef WOLFSSL_KEIL
  184935. "adcs r2, r2, %[r]\n\t"
  184936. #elif defined(__clang__)
  184937. "adcs r2, %[r]\n\t"
  184938. #else
  184939. "adc r2, %[r]\n\t"
  184940. #endif
  184941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184942. "adds r3, r3, r6\n\t"
  184943. #else
  184944. "add r3, r3, r6\n\t"
  184945. #endif
  184946. #ifdef WOLFSSL_KEIL
  184947. "adcs r4, r4, %[r]\n\t"
  184948. #elif defined(__clang__)
  184949. "adcs r4, %[r]\n\t"
  184950. #else
  184951. "adc r4, %[r]\n\t"
  184952. #endif
  184953. #ifdef WOLFSSL_KEIL
  184954. "adcs r2, r2, %[r]\n\t"
  184955. #elif defined(__clang__)
  184956. "adcs r2, %[r]\n\t"
  184957. #else
  184958. "adc r2, %[r]\n\t"
  184959. #endif
  184960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184961. "lsrs r6, r7, #16\n\t"
  184962. #else
  184963. "lsr r6, r7, #16\n\t"
  184964. #endif
  184965. #ifdef WOLFSSL_KEIL
  184966. "muls r5, r6, r5\n\t"
  184967. #elif defined(__clang__)
  184968. "muls r5, r6\n\t"
  184969. #else
  184970. "mul r5, r6\n\t"
  184971. #endif
  184972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184973. "lsrs r6, r5, #16\n\t"
  184974. #else
  184975. "lsr r6, r5, #16\n\t"
  184976. #endif
  184977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184978. "lsls r5, r5, #16\n\t"
  184979. #else
  184980. "lsl r5, r5, #16\n\t"
  184981. #endif
  184982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184983. "adds r3, r3, r5\n\t"
  184984. #else
  184985. "add r3, r3, r5\n\t"
  184986. #endif
  184987. #ifdef WOLFSSL_KEIL
  184988. "adcs r4, r4, r6\n\t"
  184989. #elif defined(__clang__)
  184990. "adcs r4, r6\n\t"
  184991. #else
  184992. "adc r4, r6\n\t"
  184993. #endif
  184994. #ifdef WOLFSSL_KEIL
  184995. "adcs r2, r2, %[r]\n\t"
  184996. #elif defined(__clang__)
  184997. "adcs r2, %[r]\n\t"
  184998. #else
  184999. "adc r2, %[r]\n\t"
  185000. #endif
  185001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185002. "adds r3, r3, r5\n\t"
  185003. #else
  185004. "add r3, r3, r5\n\t"
  185005. #endif
  185006. #ifdef WOLFSSL_KEIL
  185007. "adcs r4, r4, r6\n\t"
  185008. #elif defined(__clang__)
  185009. "adcs r4, r6\n\t"
  185010. #else
  185011. "adc r4, r6\n\t"
  185012. #endif
  185013. #ifdef WOLFSSL_KEIL
  185014. "adcs r2, r2, %[r]\n\t"
  185015. #elif defined(__clang__)
  185016. "adcs r2, %[r]\n\t"
  185017. #else
  185018. "adc r2, %[r]\n\t"
  185019. #endif
  185020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185021. "lsrs r5, %[a], #16\n\t"
  185022. #else
  185023. "lsr r5, %[a], #16\n\t"
  185024. #endif
  185025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185026. "lsrs r6, r7, #16\n\t"
  185027. #else
  185028. "lsr r6, r7, #16\n\t"
  185029. #endif
  185030. #ifdef WOLFSSL_KEIL
  185031. "muls r6, r5, r6\n\t"
  185032. #elif defined(__clang__)
  185033. "muls r6, r5\n\t"
  185034. #else
  185035. "mul r6, r5\n\t"
  185036. #endif
  185037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185038. "adds r4, r4, r6\n\t"
  185039. #else
  185040. "add r4, r4, r6\n\t"
  185041. #endif
  185042. #ifdef WOLFSSL_KEIL
  185043. "adcs r2, r2, %[r]\n\t"
  185044. #elif defined(__clang__)
  185045. "adcs r2, %[r]\n\t"
  185046. #else
  185047. "adc r2, %[r]\n\t"
  185048. #endif
  185049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185050. "adds r4, r4, r6\n\t"
  185051. #else
  185052. "add r4, r4, r6\n\t"
  185053. #endif
  185054. #ifdef WOLFSSL_KEIL
  185055. "adcs r2, r2, %[r]\n\t"
  185056. #elif defined(__clang__)
  185057. "adcs r2, %[r]\n\t"
  185058. #else
  185059. "adc r2, %[r]\n\t"
  185060. #endif
  185061. "uxth r6, r7\n\t"
  185062. #ifdef WOLFSSL_KEIL
  185063. "muls r5, r6, r5\n\t"
  185064. #elif defined(__clang__)
  185065. "muls r5, r6\n\t"
  185066. #else
  185067. "mul r5, r6\n\t"
  185068. #endif
  185069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185070. "lsrs r6, r5, #16\n\t"
  185071. #else
  185072. "lsr r6, r5, #16\n\t"
  185073. #endif
  185074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185075. "lsls r5, r5, #16\n\t"
  185076. #else
  185077. "lsl r5, r5, #16\n\t"
  185078. #endif
  185079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185080. "adds r3, r3, r5\n\t"
  185081. #else
  185082. "add r3, r3, r5\n\t"
  185083. #endif
  185084. #ifdef WOLFSSL_KEIL
  185085. "adcs r4, r4, r6\n\t"
  185086. #elif defined(__clang__)
  185087. "adcs r4, r6\n\t"
  185088. #else
  185089. "adc r4, r6\n\t"
  185090. #endif
  185091. #ifdef WOLFSSL_KEIL
  185092. "adcs r2, r2, %[r]\n\t"
  185093. #elif defined(__clang__)
  185094. "adcs r2, %[r]\n\t"
  185095. #else
  185096. "adc r2, %[r]\n\t"
  185097. #endif
  185098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185099. "adds r3, r3, r5\n\t"
  185100. #else
  185101. "add r3, r3, r5\n\t"
  185102. #endif
  185103. #ifdef WOLFSSL_KEIL
  185104. "adcs r4, r4, r6\n\t"
  185105. #elif defined(__clang__)
  185106. "adcs r4, r6\n\t"
  185107. #else
  185108. "adc r4, r6\n\t"
  185109. #endif
  185110. #ifdef WOLFSSL_KEIL
  185111. "adcs r2, r2, %[r]\n\t"
  185112. #elif defined(__clang__)
  185113. "adcs r2, %[r]\n\t"
  185114. #else
  185115. "adc r2, %[r]\n\t"
  185116. #endif
  185117. "# A[14] * A[2]\n\t"
  185118. "mov %[a], r9\n\t"
  185119. "mov r7, r12\n\t"
  185120. "ldr %[a], [%[a], #56]\n\t"
  185121. "uxth r5, %[a]\n\t"
  185122. "uxth r6, r7\n\t"
  185123. #ifdef WOLFSSL_KEIL
  185124. "muls r6, r5, r6\n\t"
  185125. #elif defined(__clang__)
  185126. "muls r6, r5\n\t"
  185127. #else
  185128. "mul r6, r5\n\t"
  185129. #endif
  185130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185131. "adds r3, r3, r6\n\t"
  185132. #else
  185133. "add r3, r3, r6\n\t"
  185134. #endif
  185135. #ifdef WOLFSSL_KEIL
  185136. "adcs r4, r4, %[r]\n\t"
  185137. #elif defined(__clang__)
  185138. "adcs r4, %[r]\n\t"
  185139. #else
  185140. "adc r4, %[r]\n\t"
  185141. #endif
  185142. #ifdef WOLFSSL_KEIL
  185143. "adcs r2, r2, %[r]\n\t"
  185144. #elif defined(__clang__)
  185145. "adcs r2, %[r]\n\t"
  185146. #else
  185147. "adc r2, %[r]\n\t"
  185148. #endif
  185149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185150. "adds r3, r3, r6\n\t"
  185151. #else
  185152. "add r3, r3, r6\n\t"
  185153. #endif
  185154. #ifdef WOLFSSL_KEIL
  185155. "adcs r4, r4, %[r]\n\t"
  185156. #elif defined(__clang__)
  185157. "adcs r4, %[r]\n\t"
  185158. #else
  185159. "adc r4, %[r]\n\t"
  185160. #endif
  185161. #ifdef WOLFSSL_KEIL
  185162. "adcs r2, r2, %[r]\n\t"
  185163. #elif defined(__clang__)
  185164. "adcs r2, %[r]\n\t"
  185165. #else
  185166. "adc r2, %[r]\n\t"
  185167. #endif
  185168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185169. "lsrs r6, r7, #16\n\t"
  185170. #else
  185171. "lsr r6, r7, #16\n\t"
  185172. #endif
  185173. #ifdef WOLFSSL_KEIL
  185174. "muls r5, r6, r5\n\t"
  185175. #elif defined(__clang__)
  185176. "muls r5, r6\n\t"
  185177. #else
  185178. "mul r5, r6\n\t"
  185179. #endif
  185180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185181. "lsrs r6, r5, #16\n\t"
  185182. #else
  185183. "lsr r6, r5, #16\n\t"
  185184. #endif
  185185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185186. "lsls r5, r5, #16\n\t"
  185187. #else
  185188. "lsl r5, r5, #16\n\t"
  185189. #endif
  185190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185191. "adds r3, r3, r5\n\t"
  185192. #else
  185193. "add r3, r3, r5\n\t"
  185194. #endif
  185195. #ifdef WOLFSSL_KEIL
  185196. "adcs r4, r4, r6\n\t"
  185197. #elif defined(__clang__)
  185198. "adcs r4, r6\n\t"
  185199. #else
  185200. "adc r4, r6\n\t"
  185201. #endif
  185202. #ifdef WOLFSSL_KEIL
  185203. "adcs r2, r2, %[r]\n\t"
  185204. #elif defined(__clang__)
  185205. "adcs r2, %[r]\n\t"
  185206. #else
  185207. "adc r2, %[r]\n\t"
  185208. #endif
  185209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185210. "adds r3, r3, r5\n\t"
  185211. #else
  185212. "add r3, r3, r5\n\t"
  185213. #endif
  185214. #ifdef WOLFSSL_KEIL
  185215. "adcs r4, r4, r6\n\t"
  185216. #elif defined(__clang__)
  185217. "adcs r4, r6\n\t"
  185218. #else
  185219. "adc r4, r6\n\t"
  185220. #endif
  185221. #ifdef WOLFSSL_KEIL
  185222. "adcs r2, r2, %[r]\n\t"
  185223. #elif defined(__clang__)
  185224. "adcs r2, %[r]\n\t"
  185225. #else
  185226. "adc r2, %[r]\n\t"
  185227. #endif
  185228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185229. "lsrs r5, %[a], #16\n\t"
  185230. #else
  185231. "lsr r5, %[a], #16\n\t"
  185232. #endif
  185233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185234. "lsrs r6, r7, #16\n\t"
  185235. #else
  185236. "lsr r6, r7, #16\n\t"
  185237. #endif
  185238. #ifdef WOLFSSL_KEIL
  185239. "muls r6, r5, r6\n\t"
  185240. #elif defined(__clang__)
  185241. "muls r6, r5\n\t"
  185242. #else
  185243. "mul r6, r5\n\t"
  185244. #endif
  185245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185246. "adds r4, r4, r6\n\t"
  185247. #else
  185248. "add r4, r4, r6\n\t"
  185249. #endif
  185250. #ifdef WOLFSSL_KEIL
  185251. "adcs r2, r2, %[r]\n\t"
  185252. #elif defined(__clang__)
  185253. "adcs r2, %[r]\n\t"
  185254. #else
  185255. "adc r2, %[r]\n\t"
  185256. #endif
  185257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185258. "adds r4, r4, r6\n\t"
  185259. #else
  185260. "add r4, r4, r6\n\t"
  185261. #endif
  185262. #ifdef WOLFSSL_KEIL
  185263. "adcs r2, r2, %[r]\n\t"
  185264. #elif defined(__clang__)
  185265. "adcs r2, %[r]\n\t"
  185266. #else
  185267. "adc r2, %[r]\n\t"
  185268. #endif
  185269. "uxth r6, r7\n\t"
  185270. #ifdef WOLFSSL_KEIL
  185271. "muls r5, r6, r5\n\t"
  185272. #elif defined(__clang__)
  185273. "muls r5, r6\n\t"
  185274. #else
  185275. "mul r5, r6\n\t"
  185276. #endif
  185277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185278. "lsrs r6, r5, #16\n\t"
  185279. #else
  185280. "lsr r6, r5, #16\n\t"
  185281. #endif
  185282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185283. "lsls r5, r5, #16\n\t"
  185284. #else
  185285. "lsl r5, r5, #16\n\t"
  185286. #endif
  185287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185288. "adds r3, r3, r5\n\t"
  185289. #else
  185290. "add r3, r3, r5\n\t"
  185291. #endif
  185292. #ifdef WOLFSSL_KEIL
  185293. "adcs r4, r4, r6\n\t"
  185294. #elif defined(__clang__)
  185295. "adcs r4, r6\n\t"
  185296. #else
  185297. "adc r4, r6\n\t"
  185298. #endif
  185299. #ifdef WOLFSSL_KEIL
  185300. "adcs r2, r2, %[r]\n\t"
  185301. #elif defined(__clang__)
  185302. "adcs r2, %[r]\n\t"
  185303. #else
  185304. "adc r2, %[r]\n\t"
  185305. #endif
  185306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185307. "adds r3, r3, r5\n\t"
  185308. #else
  185309. "add r3, r3, r5\n\t"
  185310. #endif
  185311. #ifdef WOLFSSL_KEIL
  185312. "adcs r4, r4, r6\n\t"
  185313. #elif defined(__clang__)
  185314. "adcs r4, r6\n\t"
  185315. #else
  185316. "adc r4, r6\n\t"
  185317. #endif
  185318. #ifdef WOLFSSL_KEIL
  185319. "adcs r2, r2, %[r]\n\t"
  185320. #elif defined(__clang__)
  185321. "adcs r2, %[r]\n\t"
  185322. #else
  185323. "adc r2, %[r]\n\t"
  185324. #endif
  185325. "# A[13] * A[3]\n\t"
  185326. "mov %[a], r9\n\t"
  185327. "mov r7, lr\n\t"
  185328. "ldr %[a], [%[a], #52]\n\t"
  185329. "uxth r5, %[a]\n\t"
  185330. "uxth r6, r7\n\t"
  185331. #ifdef WOLFSSL_KEIL
  185332. "muls r6, r5, r6\n\t"
  185333. #elif defined(__clang__)
  185334. "muls r6, r5\n\t"
  185335. #else
  185336. "mul r6, r5\n\t"
  185337. #endif
  185338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185339. "adds r3, r3, r6\n\t"
  185340. #else
  185341. "add r3, r3, r6\n\t"
  185342. #endif
  185343. #ifdef WOLFSSL_KEIL
  185344. "adcs r4, r4, %[r]\n\t"
  185345. #elif defined(__clang__)
  185346. "adcs r4, %[r]\n\t"
  185347. #else
  185348. "adc r4, %[r]\n\t"
  185349. #endif
  185350. #ifdef WOLFSSL_KEIL
  185351. "adcs r2, r2, %[r]\n\t"
  185352. #elif defined(__clang__)
  185353. "adcs r2, %[r]\n\t"
  185354. #else
  185355. "adc r2, %[r]\n\t"
  185356. #endif
  185357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185358. "adds r3, r3, r6\n\t"
  185359. #else
  185360. "add r3, r3, r6\n\t"
  185361. #endif
  185362. #ifdef WOLFSSL_KEIL
  185363. "adcs r4, r4, %[r]\n\t"
  185364. #elif defined(__clang__)
  185365. "adcs r4, %[r]\n\t"
  185366. #else
  185367. "adc r4, %[r]\n\t"
  185368. #endif
  185369. #ifdef WOLFSSL_KEIL
  185370. "adcs r2, r2, %[r]\n\t"
  185371. #elif defined(__clang__)
  185372. "adcs r2, %[r]\n\t"
  185373. #else
  185374. "adc r2, %[r]\n\t"
  185375. #endif
  185376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185377. "lsrs r6, r7, #16\n\t"
  185378. #else
  185379. "lsr r6, r7, #16\n\t"
  185380. #endif
  185381. #ifdef WOLFSSL_KEIL
  185382. "muls r5, r6, r5\n\t"
  185383. #elif defined(__clang__)
  185384. "muls r5, r6\n\t"
  185385. #else
  185386. "mul r5, r6\n\t"
  185387. #endif
  185388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185389. "lsrs r6, r5, #16\n\t"
  185390. #else
  185391. "lsr r6, r5, #16\n\t"
  185392. #endif
  185393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185394. "lsls r5, r5, #16\n\t"
  185395. #else
  185396. "lsl r5, r5, #16\n\t"
  185397. #endif
  185398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185399. "adds r3, r3, r5\n\t"
  185400. #else
  185401. "add r3, r3, r5\n\t"
  185402. #endif
  185403. #ifdef WOLFSSL_KEIL
  185404. "adcs r4, r4, r6\n\t"
  185405. #elif defined(__clang__)
  185406. "adcs r4, r6\n\t"
  185407. #else
  185408. "adc r4, r6\n\t"
  185409. #endif
  185410. #ifdef WOLFSSL_KEIL
  185411. "adcs r2, r2, %[r]\n\t"
  185412. #elif defined(__clang__)
  185413. "adcs r2, %[r]\n\t"
  185414. #else
  185415. "adc r2, %[r]\n\t"
  185416. #endif
  185417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185418. "adds r3, r3, r5\n\t"
  185419. #else
  185420. "add r3, r3, r5\n\t"
  185421. #endif
  185422. #ifdef WOLFSSL_KEIL
  185423. "adcs r4, r4, r6\n\t"
  185424. #elif defined(__clang__)
  185425. "adcs r4, r6\n\t"
  185426. #else
  185427. "adc r4, r6\n\t"
  185428. #endif
  185429. #ifdef WOLFSSL_KEIL
  185430. "adcs r2, r2, %[r]\n\t"
  185431. #elif defined(__clang__)
  185432. "adcs r2, %[r]\n\t"
  185433. #else
  185434. "adc r2, %[r]\n\t"
  185435. #endif
  185436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185437. "lsrs r5, %[a], #16\n\t"
  185438. #else
  185439. "lsr r5, %[a], #16\n\t"
  185440. #endif
  185441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185442. "lsrs r6, r7, #16\n\t"
  185443. #else
  185444. "lsr r6, r7, #16\n\t"
  185445. #endif
  185446. #ifdef WOLFSSL_KEIL
  185447. "muls r6, r5, r6\n\t"
  185448. #elif defined(__clang__)
  185449. "muls r6, r5\n\t"
  185450. #else
  185451. "mul r6, r5\n\t"
  185452. #endif
  185453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185454. "adds r4, r4, r6\n\t"
  185455. #else
  185456. "add r4, r4, r6\n\t"
  185457. #endif
  185458. #ifdef WOLFSSL_KEIL
  185459. "adcs r2, r2, %[r]\n\t"
  185460. #elif defined(__clang__)
  185461. "adcs r2, %[r]\n\t"
  185462. #else
  185463. "adc r2, %[r]\n\t"
  185464. #endif
  185465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185466. "adds r4, r4, r6\n\t"
  185467. #else
  185468. "add r4, r4, r6\n\t"
  185469. #endif
  185470. #ifdef WOLFSSL_KEIL
  185471. "adcs r2, r2, %[r]\n\t"
  185472. #elif defined(__clang__)
  185473. "adcs r2, %[r]\n\t"
  185474. #else
  185475. "adc r2, %[r]\n\t"
  185476. #endif
  185477. "uxth r6, r7\n\t"
  185478. #ifdef WOLFSSL_KEIL
  185479. "muls r5, r6, r5\n\t"
  185480. #elif defined(__clang__)
  185481. "muls r5, r6\n\t"
  185482. #else
  185483. "mul r5, r6\n\t"
  185484. #endif
  185485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185486. "lsrs r6, r5, #16\n\t"
  185487. #else
  185488. "lsr r6, r5, #16\n\t"
  185489. #endif
  185490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185491. "lsls r5, r5, #16\n\t"
  185492. #else
  185493. "lsl r5, r5, #16\n\t"
  185494. #endif
  185495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185496. "adds r3, r3, r5\n\t"
  185497. #else
  185498. "add r3, r3, r5\n\t"
  185499. #endif
  185500. #ifdef WOLFSSL_KEIL
  185501. "adcs r4, r4, r6\n\t"
  185502. #elif defined(__clang__)
  185503. "adcs r4, r6\n\t"
  185504. #else
  185505. "adc r4, r6\n\t"
  185506. #endif
  185507. #ifdef WOLFSSL_KEIL
  185508. "adcs r2, r2, %[r]\n\t"
  185509. #elif defined(__clang__)
  185510. "adcs r2, %[r]\n\t"
  185511. #else
  185512. "adc r2, %[r]\n\t"
  185513. #endif
  185514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185515. "adds r3, r3, r5\n\t"
  185516. #else
  185517. "add r3, r3, r5\n\t"
  185518. #endif
  185519. #ifdef WOLFSSL_KEIL
  185520. "adcs r4, r4, r6\n\t"
  185521. #elif defined(__clang__)
  185522. "adcs r4, r6\n\t"
  185523. #else
  185524. "adc r4, r6\n\t"
  185525. #endif
  185526. #ifdef WOLFSSL_KEIL
  185527. "adcs r2, r2, %[r]\n\t"
  185528. #elif defined(__clang__)
  185529. "adcs r2, %[r]\n\t"
  185530. #else
  185531. "adc r2, %[r]\n\t"
  185532. #endif
  185533. "# A[12] * A[4]\n\t"
  185534. "mov %[a], r9\n\t"
  185535. "ldr r7, [%[a], #16]\n\t"
  185536. "ldr %[a], [%[a], #48]\n\t"
  185537. "uxth r5, %[a]\n\t"
  185538. "uxth r6, r7\n\t"
  185539. #ifdef WOLFSSL_KEIL
  185540. "muls r6, r5, r6\n\t"
  185541. #elif defined(__clang__)
  185542. "muls r6, r5\n\t"
  185543. #else
  185544. "mul r6, r5\n\t"
  185545. #endif
  185546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185547. "adds r3, r3, r6\n\t"
  185548. #else
  185549. "add r3, r3, r6\n\t"
  185550. #endif
  185551. #ifdef WOLFSSL_KEIL
  185552. "adcs r4, r4, %[r]\n\t"
  185553. #elif defined(__clang__)
  185554. "adcs r4, %[r]\n\t"
  185555. #else
  185556. "adc r4, %[r]\n\t"
  185557. #endif
  185558. #ifdef WOLFSSL_KEIL
  185559. "adcs r2, r2, %[r]\n\t"
  185560. #elif defined(__clang__)
  185561. "adcs r2, %[r]\n\t"
  185562. #else
  185563. "adc r2, %[r]\n\t"
  185564. #endif
  185565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185566. "adds r3, r3, r6\n\t"
  185567. #else
  185568. "add r3, r3, r6\n\t"
  185569. #endif
  185570. #ifdef WOLFSSL_KEIL
  185571. "adcs r4, r4, %[r]\n\t"
  185572. #elif defined(__clang__)
  185573. "adcs r4, %[r]\n\t"
  185574. #else
  185575. "adc r4, %[r]\n\t"
  185576. #endif
  185577. #ifdef WOLFSSL_KEIL
  185578. "adcs r2, r2, %[r]\n\t"
  185579. #elif defined(__clang__)
  185580. "adcs r2, %[r]\n\t"
  185581. #else
  185582. "adc r2, %[r]\n\t"
  185583. #endif
  185584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185585. "lsrs r6, r7, #16\n\t"
  185586. #else
  185587. "lsr r6, r7, #16\n\t"
  185588. #endif
  185589. #ifdef WOLFSSL_KEIL
  185590. "muls r5, r6, r5\n\t"
  185591. #elif defined(__clang__)
  185592. "muls r5, r6\n\t"
  185593. #else
  185594. "mul r5, r6\n\t"
  185595. #endif
  185596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185597. "lsrs r6, r5, #16\n\t"
  185598. #else
  185599. "lsr r6, r5, #16\n\t"
  185600. #endif
  185601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185602. "lsls r5, r5, #16\n\t"
  185603. #else
  185604. "lsl r5, r5, #16\n\t"
  185605. #endif
  185606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185607. "adds r3, r3, r5\n\t"
  185608. #else
  185609. "add r3, r3, r5\n\t"
  185610. #endif
  185611. #ifdef WOLFSSL_KEIL
  185612. "adcs r4, r4, r6\n\t"
  185613. #elif defined(__clang__)
  185614. "adcs r4, r6\n\t"
  185615. #else
  185616. "adc r4, r6\n\t"
  185617. #endif
  185618. #ifdef WOLFSSL_KEIL
  185619. "adcs r2, r2, %[r]\n\t"
  185620. #elif defined(__clang__)
  185621. "adcs r2, %[r]\n\t"
  185622. #else
  185623. "adc r2, %[r]\n\t"
  185624. #endif
  185625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185626. "adds r3, r3, r5\n\t"
  185627. #else
  185628. "add r3, r3, r5\n\t"
  185629. #endif
  185630. #ifdef WOLFSSL_KEIL
  185631. "adcs r4, r4, r6\n\t"
  185632. #elif defined(__clang__)
  185633. "adcs r4, r6\n\t"
  185634. #else
  185635. "adc r4, r6\n\t"
  185636. #endif
  185637. #ifdef WOLFSSL_KEIL
  185638. "adcs r2, r2, %[r]\n\t"
  185639. #elif defined(__clang__)
  185640. "adcs r2, %[r]\n\t"
  185641. #else
  185642. "adc r2, %[r]\n\t"
  185643. #endif
  185644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185645. "lsrs r5, %[a], #16\n\t"
  185646. #else
  185647. "lsr r5, %[a], #16\n\t"
  185648. #endif
  185649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185650. "lsrs r6, r7, #16\n\t"
  185651. #else
  185652. "lsr r6, r7, #16\n\t"
  185653. #endif
  185654. #ifdef WOLFSSL_KEIL
  185655. "muls r6, r5, r6\n\t"
  185656. #elif defined(__clang__)
  185657. "muls r6, r5\n\t"
  185658. #else
  185659. "mul r6, r5\n\t"
  185660. #endif
  185661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185662. "adds r4, r4, r6\n\t"
  185663. #else
  185664. "add r4, r4, r6\n\t"
  185665. #endif
  185666. #ifdef WOLFSSL_KEIL
  185667. "adcs r2, r2, %[r]\n\t"
  185668. #elif defined(__clang__)
  185669. "adcs r2, %[r]\n\t"
  185670. #else
  185671. "adc r2, %[r]\n\t"
  185672. #endif
  185673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185674. "adds r4, r4, r6\n\t"
  185675. #else
  185676. "add r4, r4, r6\n\t"
  185677. #endif
  185678. #ifdef WOLFSSL_KEIL
  185679. "adcs r2, r2, %[r]\n\t"
  185680. #elif defined(__clang__)
  185681. "adcs r2, %[r]\n\t"
  185682. #else
  185683. "adc r2, %[r]\n\t"
  185684. #endif
  185685. "uxth r6, r7\n\t"
  185686. #ifdef WOLFSSL_KEIL
  185687. "muls r5, r6, r5\n\t"
  185688. #elif defined(__clang__)
  185689. "muls r5, r6\n\t"
  185690. #else
  185691. "mul r5, r6\n\t"
  185692. #endif
  185693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185694. "lsrs r6, r5, #16\n\t"
  185695. #else
  185696. "lsr r6, r5, #16\n\t"
  185697. #endif
  185698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185699. "lsls r5, r5, #16\n\t"
  185700. #else
  185701. "lsl r5, r5, #16\n\t"
  185702. #endif
  185703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185704. "adds r3, r3, r5\n\t"
  185705. #else
  185706. "add r3, r3, r5\n\t"
  185707. #endif
  185708. #ifdef WOLFSSL_KEIL
  185709. "adcs r4, r4, r6\n\t"
  185710. #elif defined(__clang__)
  185711. "adcs r4, r6\n\t"
  185712. #else
  185713. "adc r4, r6\n\t"
  185714. #endif
  185715. #ifdef WOLFSSL_KEIL
  185716. "adcs r2, r2, %[r]\n\t"
  185717. #elif defined(__clang__)
  185718. "adcs r2, %[r]\n\t"
  185719. #else
  185720. "adc r2, %[r]\n\t"
  185721. #endif
  185722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185723. "adds r3, r3, r5\n\t"
  185724. #else
  185725. "add r3, r3, r5\n\t"
  185726. #endif
  185727. #ifdef WOLFSSL_KEIL
  185728. "adcs r4, r4, r6\n\t"
  185729. #elif defined(__clang__)
  185730. "adcs r4, r6\n\t"
  185731. #else
  185732. "adc r4, r6\n\t"
  185733. #endif
  185734. #ifdef WOLFSSL_KEIL
  185735. "adcs r2, r2, %[r]\n\t"
  185736. #elif defined(__clang__)
  185737. "adcs r2, %[r]\n\t"
  185738. #else
  185739. "adc r2, %[r]\n\t"
  185740. #endif
  185741. "# A[11] * A[5]\n\t"
  185742. "mov %[a], r9\n\t"
  185743. "ldr r7, [%[a], #20]\n\t"
  185744. "ldr %[a], [%[a], #44]\n\t"
  185745. "uxth r5, %[a]\n\t"
  185746. "uxth r6, r7\n\t"
  185747. #ifdef WOLFSSL_KEIL
  185748. "muls r6, r5, r6\n\t"
  185749. #elif defined(__clang__)
  185750. "muls r6, r5\n\t"
  185751. #else
  185752. "mul r6, r5\n\t"
  185753. #endif
  185754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185755. "adds r3, r3, r6\n\t"
  185756. #else
  185757. "add r3, r3, r6\n\t"
  185758. #endif
  185759. #ifdef WOLFSSL_KEIL
  185760. "adcs r4, r4, %[r]\n\t"
  185761. #elif defined(__clang__)
  185762. "adcs r4, %[r]\n\t"
  185763. #else
  185764. "adc r4, %[r]\n\t"
  185765. #endif
  185766. #ifdef WOLFSSL_KEIL
  185767. "adcs r2, r2, %[r]\n\t"
  185768. #elif defined(__clang__)
  185769. "adcs r2, %[r]\n\t"
  185770. #else
  185771. "adc r2, %[r]\n\t"
  185772. #endif
  185773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185774. "adds r3, r3, r6\n\t"
  185775. #else
  185776. "add r3, r3, r6\n\t"
  185777. #endif
  185778. #ifdef WOLFSSL_KEIL
  185779. "adcs r4, r4, %[r]\n\t"
  185780. #elif defined(__clang__)
  185781. "adcs r4, %[r]\n\t"
  185782. #else
  185783. "adc r4, %[r]\n\t"
  185784. #endif
  185785. #ifdef WOLFSSL_KEIL
  185786. "adcs r2, r2, %[r]\n\t"
  185787. #elif defined(__clang__)
  185788. "adcs r2, %[r]\n\t"
  185789. #else
  185790. "adc r2, %[r]\n\t"
  185791. #endif
  185792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185793. "lsrs r6, r7, #16\n\t"
  185794. #else
  185795. "lsr r6, r7, #16\n\t"
  185796. #endif
  185797. #ifdef WOLFSSL_KEIL
  185798. "muls r5, r6, r5\n\t"
  185799. #elif defined(__clang__)
  185800. "muls r5, r6\n\t"
  185801. #else
  185802. "mul r5, r6\n\t"
  185803. #endif
  185804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185805. "lsrs r6, r5, #16\n\t"
  185806. #else
  185807. "lsr r6, r5, #16\n\t"
  185808. #endif
  185809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185810. "lsls r5, r5, #16\n\t"
  185811. #else
  185812. "lsl r5, r5, #16\n\t"
  185813. #endif
  185814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185815. "adds r3, r3, r5\n\t"
  185816. #else
  185817. "add r3, r3, r5\n\t"
  185818. #endif
  185819. #ifdef WOLFSSL_KEIL
  185820. "adcs r4, r4, r6\n\t"
  185821. #elif defined(__clang__)
  185822. "adcs r4, r6\n\t"
  185823. #else
  185824. "adc r4, r6\n\t"
  185825. #endif
  185826. #ifdef WOLFSSL_KEIL
  185827. "adcs r2, r2, %[r]\n\t"
  185828. #elif defined(__clang__)
  185829. "adcs r2, %[r]\n\t"
  185830. #else
  185831. "adc r2, %[r]\n\t"
  185832. #endif
  185833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185834. "adds r3, r3, r5\n\t"
  185835. #else
  185836. "add r3, r3, r5\n\t"
  185837. #endif
  185838. #ifdef WOLFSSL_KEIL
  185839. "adcs r4, r4, r6\n\t"
  185840. #elif defined(__clang__)
  185841. "adcs r4, r6\n\t"
  185842. #else
  185843. "adc r4, r6\n\t"
  185844. #endif
  185845. #ifdef WOLFSSL_KEIL
  185846. "adcs r2, r2, %[r]\n\t"
  185847. #elif defined(__clang__)
  185848. "adcs r2, %[r]\n\t"
  185849. #else
  185850. "adc r2, %[r]\n\t"
  185851. #endif
  185852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185853. "lsrs r5, %[a], #16\n\t"
  185854. #else
  185855. "lsr r5, %[a], #16\n\t"
  185856. #endif
  185857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185858. "lsrs r6, r7, #16\n\t"
  185859. #else
  185860. "lsr r6, r7, #16\n\t"
  185861. #endif
  185862. #ifdef WOLFSSL_KEIL
  185863. "muls r6, r5, r6\n\t"
  185864. #elif defined(__clang__)
  185865. "muls r6, r5\n\t"
  185866. #else
  185867. "mul r6, r5\n\t"
  185868. #endif
  185869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185870. "adds r4, r4, r6\n\t"
  185871. #else
  185872. "add r4, r4, r6\n\t"
  185873. #endif
  185874. #ifdef WOLFSSL_KEIL
  185875. "adcs r2, r2, %[r]\n\t"
  185876. #elif defined(__clang__)
  185877. "adcs r2, %[r]\n\t"
  185878. #else
  185879. "adc r2, %[r]\n\t"
  185880. #endif
  185881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185882. "adds r4, r4, r6\n\t"
  185883. #else
  185884. "add r4, r4, r6\n\t"
  185885. #endif
  185886. #ifdef WOLFSSL_KEIL
  185887. "adcs r2, r2, %[r]\n\t"
  185888. #elif defined(__clang__)
  185889. "adcs r2, %[r]\n\t"
  185890. #else
  185891. "adc r2, %[r]\n\t"
  185892. #endif
  185893. "uxth r6, r7\n\t"
  185894. #ifdef WOLFSSL_KEIL
  185895. "muls r5, r6, r5\n\t"
  185896. #elif defined(__clang__)
  185897. "muls r5, r6\n\t"
  185898. #else
  185899. "mul r5, r6\n\t"
  185900. #endif
  185901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185902. "lsrs r6, r5, #16\n\t"
  185903. #else
  185904. "lsr r6, r5, #16\n\t"
  185905. #endif
  185906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185907. "lsls r5, r5, #16\n\t"
  185908. #else
  185909. "lsl r5, r5, #16\n\t"
  185910. #endif
  185911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185912. "adds r3, r3, r5\n\t"
  185913. #else
  185914. "add r3, r3, r5\n\t"
  185915. #endif
  185916. #ifdef WOLFSSL_KEIL
  185917. "adcs r4, r4, r6\n\t"
  185918. #elif defined(__clang__)
  185919. "adcs r4, r6\n\t"
  185920. #else
  185921. "adc r4, r6\n\t"
  185922. #endif
  185923. #ifdef WOLFSSL_KEIL
  185924. "adcs r2, r2, %[r]\n\t"
  185925. #elif defined(__clang__)
  185926. "adcs r2, %[r]\n\t"
  185927. #else
  185928. "adc r2, %[r]\n\t"
  185929. #endif
  185930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185931. "adds r3, r3, r5\n\t"
  185932. #else
  185933. "add r3, r3, r5\n\t"
  185934. #endif
  185935. #ifdef WOLFSSL_KEIL
  185936. "adcs r4, r4, r6\n\t"
  185937. #elif defined(__clang__)
  185938. "adcs r4, r6\n\t"
  185939. #else
  185940. "adc r4, r6\n\t"
  185941. #endif
  185942. #ifdef WOLFSSL_KEIL
  185943. "adcs r2, r2, %[r]\n\t"
  185944. #elif defined(__clang__)
  185945. "adcs r2, %[r]\n\t"
  185946. #else
  185947. "adc r2, %[r]\n\t"
  185948. #endif
  185949. "# A[10] * A[6]\n\t"
  185950. "mov %[a], r9\n\t"
  185951. "ldr r7, [%[a], #24]\n\t"
  185952. "ldr %[a], [%[a], #40]\n\t"
  185953. "uxth r5, %[a]\n\t"
  185954. "uxth r6, r7\n\t"
  185955. #ifdef WOLFSSL_KEIL
  185956. "muls r6, r5, r6\n\t"
  185957. #elif defined(__clang__)
  185958. "muls r6, r5\n\t"
  185959. #else
  185960. "mul r6, r5\n\t"
  185961. #endif
  185962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185963. "adds r3, r3, r6\n\t"
  185964. #else
  185965. "add r3, r3, r6\n\t"
  185966. #endif
  185967. #ifdef WOLFSSL_KEIL
  185968. "adcs r4, r4, %[r]\n\t"
  185969. #elif defined(__clang__)
  185970. "adcs r4, %[r]\n\t"
  185971. #else
  185972. "adc r4, %[r]\n\t"
  185973. #endif
  185974. #ifdef WOLFSSL_KEIL
  185975. "adcs r2, r2, %[r]\n\t"
  185976. #elif defined(__clang__)
  185977. "adcs r2, %[r]\n\t"
  185978. #else
  185979. "adc r2, %[r]\n\t"
  185980. #endif
  185981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185982. "adds r3, r3, r6\n\t"
  185983. #else
  185984. "add r3, r3, r6\n\t"
  185985. #endif
  185986. #ifdef WOLFSSL_KEIL
  185987. "adcs r4, r4, %[r]\n\t"
  185988. #elif defined(__clang__)
  185989. "adcs r4, %[r]\n\t"
  185990. #else
  185991. "adc r4, %[r]\n\t"
  185992. #endif
  185993. #ifdef WOLFSSL_KEIL
  185994. "adcs r2, r2, %[r]\n\t"
  185995. #elif defined(__clang__)
  185996. "adcs r2, %[r]\n\t"
  185997. #else
  185998. "adc r2, %[r]\n\t"
  185999. #endif
  186000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186001. "lsrs r6, r7, #16\n\t"
  186002. #else
  186003. "lsr r6, r7, #16\n\t"
  186004. #endif
  186005. #ifdef WOLFSSL_KEIL
  186006. "muls r5, r6, r5\n\t"
  186007. #elif defined(__clang__)
  186008. "muls r5, r6\n\t"
  186009. #else
  186010. "mul r5, r6\n\t"
  186011. #endif
  186012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186013. "lsrs r6, r5, #16\n\t"
  186014. #else
  186015. "lsr r6, r5, #16\n\t"
  186016. #endif
  186017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186018. "lsls r5, r5, #16\n\t"
  186019. #else
  186020. "lsl r5, r5, #16\n\t"
  186021. #endif
  186022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186023. "adds r3, r3, r5\n\t"
  186024. #else
  186025. "add r3, r3, r5\n\t"
  186026. #endif
  186027. #ifdef WOLFSSL_KEIL
  186028. "adcs r4, r4, r6\n\t"
  186029. #elif defined(__clang__)
  186030. "adcs r4, r6\n\t"
  186031. #else
  186032. "adc r4, r6\n\t"
  186033. #endif
  186034. #ifdef WOLFSSL_KEIL
  186035. "adcs r2, r2, %[r]\n\t"
  186036. #elif defined(__clang__)
  186037. "adcs r2, %[r]\n\t"
  186038. #else
  186039. "adc r2, %[r]\n\t"
  186040. #endif
  186041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186042. "adds r3, r3, r5\n\t"
  186043. #else
  186044. "add r3, r3, r5\n\t"
  186045. #endif
  186046. #ifdef WOLFSSL_KEIL
  186047. "adcs r4, r4, r6\n\t"
  186048. #elif defined(__clang__)
  186049. "adcs r4, r6\n\t"
  186050. #else
  186051. "adc r4, r6\n\t"
  186052. #endif
  186053. #ifdef WOLFSSL_KEIL
  186054. "adcs r2, r2, %[r]\n\t"
  186055. #elif defined(__clang__)
  186056. "adcs r2, %[r]\n\t"
  186057. #else
  186058. "adc r2, %[r]\n\t"
  186059. #endif
  186060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186061. "lsrs r5, %[a], #16\n\t"
  186062. #else
  186063. "lsr r5, %[a], #16\n\t"
  186064. #endif
  186065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186066. "lsrs r6, r7, #16\n\t"
  186067. #else
  186068. "lsr r6, r7, #16\n\t"
  186069. #endif
  186070. #ifdef WOLFSSL_KEIL
  186071. "muls r6, r5, r6\n\t"
  186072. #elif defined(__clang__)
  186073. "muls r6, r5\n\t"
  186074. #else
  186075. "mul r6, r5\n\t"
  186076. #endif
  186077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186078. "adds r4, r4, r6\n\t"
  186079. #else
  186080. "add r4, r4, r6\n\t"
  186081. #endif
  186082. #ifdef WOLFSSL_KEIL
  186083. "adcs r2, r2, %[r]\n\t"
  186084. #elif defined(__clang__)
  186085. "adcs r2, %[r]\n\t"
  186086. #else
  186087. "adc r2, %[r]\n\t"
  186088. #endif
  186089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186090. "adds r4, r4, r6\n\t"
  186091. #else
  186092. "add r4, r4, r6\n\t"
  186093. #endif
  186094. #ifdef WOLFSSL_KEIL
  186095. "adcs r2, r2, %[r]\n\t"
  186096. #elif defined(__clang__)
  186097. "adcs r2, %[r]\n\t"
  186098. #else
  186099. "adc r2, %[r]\n\t"
  186100. #endif
  186101. "uxth r6, r7\n\t"
  186102. #ifdef WOLFSSL_KEIL
  186103. "muls r5, r6, r5\n\t"
  186104. #elif defined(__clang__)
  186105. "muls r5, r6\n\t"
  186106. #else
  186107. "mul r5, r6\n\t"
  186108. #endif
  186109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186110. "lsrs r6, r5, #16\n\t"
  186111. #else
  186112. "lsr r6, r5, #16\n\t"
  186113. #endif
  186114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186115. "lsls r5, r5, #16\n\t"
  186116. #else
  186117. "lsl r5, r5, #16\n\t"
  186118. #endif
  186119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186120. "adds r3, r3, r5\n\t"
  186121. #else
  186122. "add r3, r3, r5\n\t"
  186123. #endif
  186124. #ifdef WOLFSSL_KEIL
  186125. "adcs r4, r4, r6\n\t"
  186126. #elif defined(__clang__)
  186127. "adcs r4, r6\n\t"
  186128. #else
  186129. "adc r4, r6\n\t"
  186130. #endif
  186131. #ifdef WOLFSSL_KEIL
  186132. "adcs r2, r2, %[r]\n\t"
  186133. #elif defined(__clang__)
  186134. "adcs r2, %[r]\n\t"
  186135. #else
  186136. "adc r2, %[r]\n\t"
  186137. #endif
  186138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186139. "adds r3, r3, r5\n\t"
  186140. #else
  186141. "add r3, r3, r5\n\t"
  186142. #endif
  186143. #ifdef WOLFSSL_KEIL
  186144. "adcs r4, r4, r6\n\t"
  186145. #elif defined(__clang__)
  186146. "adcs r4, r6\n\t"
  186147. #else
  186148. "adc r4, r6\n\t"
  186149. #endif
  186150. #ifdef WOLFSSL_KEIL
  186151. "adcs r2, r2, %[r]\n\t"
  186152. #elif defined(__clang__)
  186153. "adcs r2, %[r]\n\t"
  186154. #else
  186155. "adc r2, %[r]\n\t"
  186156. #endif
  186157. "# A[9] * A[7]\n\t"
  186158. "mov %[a], r9\n\t"
  186159. "ldr r7, [%[a], #28]\n\t"
  186160. "ldr %[a], [%[a], #36]\n\t"
  186161. "uxth r5, %[a]\n\t"
  186162. "uxth r6, r7\n\t"
  186163. #ifdef WOLFSSL_KEIL
  186164. "muls r6, r5, r6\n\t"
  186165. #elif defined(__clang__)
  186166. "muls r6, r5\n\t"
  186167. #else
  186168. "mul r6, r5\n\t"
  186169. #endif
  186170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186171. "adds r3, r3, r6\n\t"
  186172. #else
  186173. "add r3, r3, r6\n\t"
  186174. #endif
  186175. #ifdef WOLFSSL_KEIL
  186176. "adcs r4, r4, %[r]\n\t"
  186177. #elif defined(__clang__)
  186178. "adcs r4, %[r]\n\t"
  186179. #else
  186180. "adc r4, %[r]\n\t"
  186181. #endif
  186182. #ifdef WOLFSSL_KEIL
  186183. "adcs r2, r2, %[r]\n\t"
  186184. #elif defined(__clang__)
  186185. "adcs r2, %[r]\n\t"
  186186. #else
  186187. "adc r2, %[r]\n\t"
  186188. #endif
  186189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186190. "adds r3, r3, r6\n\t"
  186191. #else
  186192. "add r3, r3, r6\n\t"
  186193. #endif
  186194. #ifdef WOLFSSL_KEIL
  186195. "adcs r4, r4, %[r]\n\t"
  186196. #elif defined(__clang__)
  186197. "adcs r4, %[r]\n\t"
  186198. #else
  186199. "adc r4, %[r]\n\t"
  186200. #endif
  186201. #ifdef WOLFSSL_KEIL
  186202. "adcs r2, r2, %[r]\n\t"
  186203. #elif defined(__clang__)
  186204. "adcs r2, %[r]\n\t"
  186205. #else
  186206. "adc r2, %[r]\n\t"
  186207. #endif
  186208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186209. "lsrs r6, r7, #16\n\t"
  186210. #else
  186211. "lsr r6, r7, #16\n\t"
  186212. #endif
  186213. #ifdef WOLFSSL_KEIL
  186214. "muls r5, r6, r5\n\t"
  186215. #elif defined(__clang__)
  186216. "muls r5, r6\n\t"
  186217. #else
  186218. "mul r5, r6\n\t"
  186219. #endif
  186220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186221. "lsrs r6, r5, #16\n\t"
  186222. #else
  186223. "lsr r6, r5, #16\n\t"
  186224. #endif
  186225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186226. "lsls r5, r5, #16\n\t"
  186227. #else
  186228. "lsl r5, r5, #16\n\t"
  186229. #endif
  186230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186231. "adds r3, r3, r5\n\t"
  186232. #else
  186233. "add r3, r3, r5\n\t"
  186234. #endif
  186235. #ifdef WOLFSSL_KEIL
  186236. "adcs r4, r4, r6\n\t"
  186237. #elif defined(__clang__)
  186238. "adcs r4, r6\n\t"
  186239. #else
  186240. "adc r4, r6\n\t"
  186241. #endif
  186242. #ifdef WOLFSSL_KEIL
  186243. "adcs r2, r2, %[r]\n\t"
  186244. #elif defined(__clang__)
  186245. "adcs r2, %[r]\n\t"
  186246. #else
  186247. "adc r2, %[r]\n\t"
  186248. #endif
  186249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186250. "adds r3, r3, r5\n\t"
  186251. #else
  186252. "add r3, r3, r5\n\t"
  186253. #endif
  186254. #ifdef WOLFSSL_KEIL
  186255. "adcs r4, r4, r6\n\t"
  186256. #elif defined(__clang__)
  186257. "adcs r4, r6\n\t"
  186258. #else
  186259. "adc r4, r6\n\t"
  186260. #endif
  186261. #ifdef WOLFSSL_KEIL
  186262. "adcs r2, r2, %[r]\n\t"
  186263. #elif defined(__clang__)
  186264. "adcs r2, %[r]\n\t"
  186265. #else
  186266. "adc r2, %[r]\n\t"
  186267. #endif
  186268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186269. "lsrs r5, %[a], #16\n\t"
  186270. #else
  186271. "lsr r5, %[a], #16\n\t"
  186272. #endif
  186273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186274. "lsrs r6, r7, #16\n\t"
  186275. #else
  186276. "lsr r6, r7, #16\n\t"
  186277. #endif
  186278. #ifdef WOLFSSL_KEIL
  186279. "muls r6, r5, r6\n\t"
  186280. #elif defined(__clang__)
  186281. "muls r6, r5\n\t"
  186282. #else
  186283. "mul r6, r5\n\t"
  186284. #endif
  186285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186286. "adds r4, r4, r6\n\t"
  186287. #else
  186288. "add r4, r4, r6\n\t"
  186289. #endif
  186290. #ifdef WOLFSSL_KEIL
  186291. "adcs r2, r2, %[r]\n\t"
  186292. #elif defined(__clang__)
  186293. "adcs r2, %[r]\n\t"
  186294. #else
  186295. "adc r2, %[r]\n\t"
  186296. #endif
  186297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186298. "adds r4, r4, r6\n\t"
  186299. #else
  186300. "add r4, r4, r6\n\t"
  186301. #endif
  186302. #ifdef WOLFSSL_KEIL
  186303. "adcs r2, r2, %[r]\n\t"
  186304. #elif defined(__clang__)
  186305. "adcs r2, %[r]\n\t"
  186306. #else
  186307. "adc r2, %[r]\n\t"
  186308. #endif
  186309. "uxth r6, r7\n\t"
  186310. #ifdef WOLFSSL_KEIL
  186311. "muls r5, r6, r5\n\t"
  186312. #elif defined(__clang__)
  186313. "muls r5, r6\n\t"
  186314. #else
  186315. "mul r5, r6\n\t"
  186316. #endif
  186317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186318. "lsrs r6, r5, #16\n\t"
  186319. #else
  186320. "lsr r6, r5, #16\n\t"
  186321. #endif
  186322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186323. "lsls r5, r5, #16\n\t"
  186324. #else
  186325. "lsl r5, r5, #16\n\t"
  186326. #endif
  186327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186328. "adds r3, r3, r5\n\t"
  186329. #else
  186330. "add r3, r3, r5\n\t"
  186331. #endif
  186332. #ifdef WOLFSSL_KEIL
  186333. "adcs r4, r4, r6\n\t"
  186334. #elif defined(__clang__)
  186335. "adcs r4, r6\n\t"
  186336. #else
  186337. "adc r4, r6\n\t"
  186338. #endif
  186339. #ifdef WOLFSSL_KEIL
  186340. "adcs r2, r2, %[r]\n\t"
  186341. #elif defined(__clang__)
  186342. "adcs r2, %[r]\n\t"
  186343. #else
  186344. "adc r2, %[r]\n\t"
  186345. #endif
  186346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186347. "adds r3, r3, r5\n\t"
  186348. #else
  186349. "add r3, r3, r5\n\t"
  186350. #endif
  186351. #ifdef WOLFSSL_KEIL
  186352. "adcs r4, r4, r6\n\t"
  186353. #elif defined(__clang__)
  186354. "adcs r4, r6\n\t"
  186355. #else
  186356. "adc r4, r6\n\t"
  186357. #endif
  186358. #ifdef WOLFSSL_KEIL
  186359. "adcs r2, r2, %[r]\n\t"
  186360. #elif defined(__clang__)
  186361. "adcs r2, %[r]\n\t"
  186362. #else
  186363. "adc r2, %[r]\n\t"
  186364. #endif
  186365. "# A[8] * A[8]\n\t"
  186366. "mov %[a], r9\n\t"
  186367. "ldr r7, [%[a], #32]\n\t"
  186368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186369. "lsrs r6, r7, #16\n\t"
  186370. #else
  186371. "lsr r6, r7, #16\n\t"
  186372. #endif
  186373. "uxth r5, r7\n\t"
  186374. #ifdef WOLFSSL_KEIL
  186375. "muls r5, r5, r5\n\t"
  186376. #elif defined(__clang__)
  186377. "muls r5, r5\n\t"
  186378. #else
  186379. "mul r5, r5\n\t"
  186380. #endif
  186381. #ifdef WOLFSSL_KEIL
  186382. "muls r6, r6, r6\n\t"
  186383. #elif defined(__clang__)
  186384. "muls r6, r6\n\t"
  186385. #else
  186386. "mul r6, r6\n\t"
  186387. #endif
  186388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186389. "adds r3, r3, r5\n\t"
  186390. #else
  186391. "add r3, r3, r5\n\t"
  186392. #endif
  186393. #ifdef WOLFSSL_KEIL
  186394. "adcs r4, r4, r6\n\t"
  186395. #elif defined(__clang__)
  186396. "adcs r4, r6\n\t"
  186397. #else
  186398. "adc r4, r6\n\t"
  186399. #endif
  186400. #ifdef WOLFSSL_KEIL
  186401. "adcs r2, r2, %[r]\n\t"
  186402. #elif defined(__clang__)
  186403. "adcs r2, %[r]\n\t"
  186404. #else
  186405. "adc r2, %[r]\n\t"
  186406. #endif
  186407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186408. "lsrs r6, r7, #16\n\t"
  186409. #else
  186410. "lsr r6, r7, #16\n\t"
  186411. #endif
  186412. "uxth r5, r7\n\t"
  186413. #ifdef WOLFSSL_KEIL
  186414. "muls r5, r6, r5\n\t"
  186415. #elif defined(__clang__)
  186416. "muls r5, r6\n\t"
  186417. #else
  186418. "mul r5, r6\n\t"
  186419. #endif
  186420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186421. "lsrs r6, r5, #15\n\t"
  186422. #else
  186423. "lsr r6, r5, #15\n\t"
  186424. #endif
  186425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186426. "lsls r5, r5, #17\n\t"
  186427. #else
  186428. "lsl r5, r5, #17\n\t"
  186429. #endif
  186430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186431. "adds r3, r3, r5\n\t"
  186432. #else
  186433. "add r3, r3, r5\n\t"
  186434. #endif
  186435. #ifdef WOLFSSL_KEIL
  186436. "adcs r4, r4, r6\n\t"
  186437. #elif defined(__clang__)
  186438. "adcs r4, r6\n\t"
  186439. #else
  186440. "adc r4, r6\n\t"
  186441. #endif
  186442. #ifdef WOLFSSL_KEIL
  186443. "adcs r2, r2, %[r]\n\t"
  186444. #elif defined(__clang__)
  186445. "adcs r2, %[r]\n\t"
  186446. #else
  186447. "adc r2, %[r]\n\t"
  186448. #endif
  186449. "mov %[r], r8\n\t"
  186450. "str r3, [%[r], #64]\n\t"
  186451. "movs %[r], #0\n\t"
  186452. "movs %[a], #48\n\t"
  186453. "add %[a], %[a], r9\n\t"
  186454. "ldm %[a]!, {r5, r6}\n\t"
  186455. "mov r10, r5\n\t"
  186456. "mov r11, r6\n\t"
  186457. "ldm %[a]!, {r5, r6}\n\t"
  186458. "mov r12, r5\n\t"
  186459. "mov lr, r6\n\t"
  186460. "mov %[a], r9\n\t"
  186461. "# A[9] * A[8]\n\t"
  186462. "movs r3, #0\n\t"
  186463. "ldr %[a], [%[a], #36]\n\t"
  186464. "uxth r5, %[a]\n\t"
  186465. "uxth r6, r7\n\t"
  186466. #ifdef WOLFSSL_KEIL
  186467. "muls r6, r5, r6\n\t"
  186468. #elif defined(__clang__)
  186469. "muls r6, r5\n\t"
  186470. #else
  186471. "mul r6, r5\n\t"
  186472. #endif
  186473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186474. "adds r4, r4, r6\n\t"
  186475. #else
  186476. "add r4, r4, r6\n\t"
  186477. #endif
  186478. #ifdef WOLFSSL_KEIL
  186479. "adcs r2, r2, %[r]\n\t"
  186480. #elif defined(__clang__)
  186481. "adcs r2, %[r]\n\t"
  186482. #else
  186483. "adc r2, %[r]\n\t"
  186484. #endif
  186485. #ifdef WOLFSSL_KEIL
  186486. "adcs r3, r3, %[r]\n\t"
  186487. #elif defined(__clang__)
  186488. "adcs r3, %[r]\n\t"
  186489. #else
  186490. "adc r3, %[r]\n\t"
  186491. #endif
  186492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186493. "adds r4, r4, r6\n\t"
  186494. #else
  186495. "add r4, r4, r6\n\t"
  186496. #endif
  186497. #ifdef WOLFSSL_KEIL
  186498. "adcs r2, r2, %[r]\n\t"
  186499. #elif defined(__clang__)
  186500. "adcs r2, %[r]\n\t"
  186501. #else
  186502. "adc r2, %[r]\n\t"
  186503. #endif
  186504. #ifdef WOLFSSL_KEIL
  186505. "adcs r3, r3, %[r]\n\t"
  186506. #elif defined(__clang__)
  186507. "adcs r3, %[r]\n\t"
  186508. #else
  186509. "adc r3, %[r]\n\t"
  186510. #endif
  186511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186512. "lsrs r6, r7, #16\n\t"
  186513. #else
  186514. "lsr r6, r7, #16\n\t"
  186515. #endif
  186516. #ifdef WOLFSSL_KEIL
  186517. "muls r5, r6, r5\n\t"
  186518. #elif defined(__clang__)
  186519. "muls r5, r6\n\t"
  186520. #else
  186521. "mul r5, r6\n\t"
  186522. #endif
  186523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186524. "lsrs r6, r5, #16\n\t"
  186525. #else
  186526. "lsr r6, r5, #16\n\t"
  186527. #endif
  186528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186529. "lsls r5, r5, #16\n\t"
  186530. #else
  186531. "lsl r5, r5, #16\n\t"
  186532. #endif
  186533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186534. "adds r4, r4, r5\n\t"
  186535. #else
  186536. "add r4, r4, r5\n\t"
  186537. #endif
  186538. #ifdef WOLFSSL_KEIL
  186539. "adcs r2, r2, r6\n\t"
  186540. #elif defined(__clang__)
  186541. "adcs r2, r6\n\t"
  186542. #else
  186543. "adc r2, r6\n\t"
  186544. #endif
  186545. #ifdef WOLFSSL_KEIL
  186546. "adcs r3, r3, %[r]\n\t"
  186547. #elif defined(__clang__)
  186548. "adcs r3, %[r]\n\t"
  186549. #else
  186550. "adc r3, %[r]\n\t"
  186551. #endif
  186552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186553. "adds r4, r4, r5\n\t"
  186554. #else
  186555. "add r4, r4, r5\n\t"
  186556. #endif
  186557. #ifdef WOLFSSL_KEIL
  186558. "adcs r2, r2, r6\n\t"
  186559. #elif defined(__clang__)
  186560. "adcs r2, r6\n\t"
  186561. #else
  186562. "adc r2, r6\n\t"
  186563. #endif
  186564. #ifdef WOLFSSL_KEIL
  186565. "adcs r3, r3, %[r]\n\t"
  186566. #elif defined(__clang__)
  186567. "adcs r3, %[r]\n\t"
  186568. #else
  186569. "adc r3, %[r]\n\t"
  186570. #endif
  186571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186572. "lsrs r5, %[a], #16\n\t"
  186573. #else
  186574. "lsr r5, %[a], #16\n\t"
  186575. #endif
  186576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186577. "lsrs r6, r7, #16\n\t"
  186578. #else
  186579. "lsr r6, r7, #16\n\t"
  186580. #endif
  186581. #ifdef WOLFSSL_KEIL
  186582. "muls r6, r5, r6\n\t"
  186583. #elif defined(__clang__)
  186584. "muls r6, r5\n\t"
  186585. #else
  186586. "mul r6, r5\n\t"
  186587. #endif
  186588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186589. "adds r2, r2, r6\n\t"
  186590. #else
  186591. "add r2, r2, r6\n\t"
  186592. #endif
  186593. #ifdef WOLFSSL_KEIL
  186594. "adcs r3, r3, %[r]\n\t"
  186595. #elif defined(__clang__)
  186596. "adcs r3, %[r]\n\t"
  186597. #else
  186598. "adc r3, %[r]\n\t"
  186599. #endif
  186600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186601. "adds r2, r2, r6\n\t"
  186602. #else
  186603. "add r2, r2, r6\n\t"
  186604. #endif
  186605. #ifdef WOLFSSL_KEIL
  186606. "adcs r3, r3, %[r]\n\t"
  186607. #elif defined(__clang__)
  186608. "adcs r3, %[r]\n\t"
  186609. #else
  186610. "adc r3, %[r]\n\t"
  186611. #endif
  186612. "uxth r6, r7\n\t"
  186613. #ifdef WOLFSSL_KEIL
  186614. "muls r5, r6, r5\n\t"
  186615. #elif defined(__clang__)
  186616. "muls r5, r6\n\t"
  186617. #else
  186618. "mul r5, r6\n\t"
  186619. #endif
  186620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186621. "lsrs r6, r5, #16\n\t"
  186622. #else
  186623. "lsr r6, r5, #16\n\t"
  186624. #endif
  186625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186626. "lsls r5, r5, #16\n\t"
  186627. #else
  186628. "lsl r5, r5, #16\n\t"
  186629. #endif
  186630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186631. "adds r4, r4, r5\n\t"
  186632. #else
  186633. "add r4, r4, r5\n\t"
  186634. #endif
  186635. #ifdef WOLFSSL_KEIL
  186636. "adcs r2, r2, r6\n\t"
  186637. #elif defined(__clang__)
  186638. "adcs r2, r6\n\t"
  186639. #else
  186640. "adc r2, r6\n\t"
  186641. #endif
  186642. #ifdef WOLFSSL_KEIL
  186643. "adcs r3, r3, %[r]\n\t"
  186644. #elif defined(__clang__)
  186645. "adcs r3, %[r]\n\t"
  186646. #else
  186647. "adc r3, %[r]\n\t"
  186648. #endif
  186649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186650. "adds r4, r4, r5\n\t"
  186651. #else
  186652. "add r4, r4, r5\n\t"
  186653. #endif
  186654. #ifdef WOLFSSL_KEIL
  186655. "adcs r2, r2, r6\n\t"
  186656. #elif defined(__clang__)
  186657. "adcs r2, r6\n\t"
  186658. #else
  186659. "adc r2, r6\n\t"
  186660. #endif
  186661. #ifdef WOLFSSL_KEIL
  186662. "adcs r3, r3, %[r]\n\t"
  186663. #elif defined(__clang__)
  186664. "adcs r3, %[r]\n\t"
  186665. #else
  186666. "adc r3, %[r]\n\t"
  186667. #endif
  186668. "# A[10] * A[7]\n\t"
  186669. "mov %[a], r9\n\t"
  186670. "ldr r7, [%[a], #28]\n\t"
  186671. "ldr %[a], [%[a], #40]\n\t"
  186672. "uxth r5, %[a]\n\t"
  186673. "uxth r6, r7\n\t"
  186674. #ifdef WOLFSSL_KEIL
  186675. "muls r6, r5, r6\n\t"
  186676. #elif defined(__clang__)
  186677. "muls r6, r5\n\t"
  186678. #else
  186679. "mul r6, r5\n\t"
  186680. #endif
  186681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186682. "adds r4, r4, r6\n\t"
  186683. #else
  186684. "add r4, r4, r6\n\t"
  186685. #endif
  186686. #ifdef WOLFSSL_KEIL
  186687. "adcs r2, r2, %[r]\n\t"
  186688. #elif defined(__clang__)
  186689. "adcs r2, %[r]\n\t"
  186690. #else
  186691. "adc r2, %[r]\n\t"
  186692. #endif
  186693. #ifdef WOLFSSL_KEIL
  186694. "adcs r3, r3, %[r]\n\t"
  186695. #elif defined(__clang__)
  186696. "adcs r3, %[r]\n\t"
  186697. #else
  186698. "adc r3, %[r]\n\t"
  186699. #endif
  186700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186701. "adds r4, r4, r6\n\t"
  186702. #else
  186703. "add r4, r4, r6\n\t"
  186704. #endif
  186705. #ifdef WOLFSSL_KEIL
  186706. "adcs r2, r2, %[r]\n\t"
  186707. #elif defined(__clang__)
  186708. "adcs r2, %[r]\n\t"
  186709. #else
  186710. "adc r2, %[r]\n\t"
  186711. #endif
  186712. #ifdef WOLFSSL_KEIL
  186713. "adcs r3, r3, %[r]\n\t"
  186714. #elif defined(__clang__)
  186715. "adcs r3, %[r]\n\t"
  186716. #else
  186717. "adc r3, %[r]\n\t"
  186718. #endif
  186719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186720. "lsrs r6, r7, #16\n\t"
  186721. #else
  186722. "lsr r6, r7, #16\n\t"
  186723. #endif
  186724. #ifdef WOLFSSL_KEIL
  186725. "muls r5, r6, r5\n\t"
  186726. #elif defined(__clang__)
  186727. "muls r5, r6\n\t"
  186728. #else
  186729. "mul r5, r6\n\t"
  186730. #endif
  186731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186732. "lsrs r6, r5, #16\n\t"
  186733. #else
  186734. "lsr r6, r5, #16\n\t"
  186735. #endif
  186736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186737. "lsls r5, r5, #16\n\t"
  186738. #else
  186739. "lsl r5, r5, #16\n\t"
  186740. #endif
  186741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186742. "adds r4, r4, r5\n\t"
  186743. #else
  186744. "add r4, r4, r5\n\t"
  186745. #endif
  186746. #ifdef WOLFSSL_KEIL
  186747. "adcs r2, r2, r6\n\t"
  186748. #elif defined(__clang__)
  186749. "adcs r2, r6\n\t"
  186750. #else
  186751. "adc r2, r6\n\t"
  186752. #endif
  186753. #ifdef WOLFSSL_KEIL
  186754. "adcs r3, r3, %[r]\n\t"
  186755. #elif defined(__clang__)
  186756. "adcs r3, %[r]\n\t"
  186757. #else
  186758. "adc r3, %[r]\n\t"
  186759. #endif
  186760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186761. "adds r4, r4, r5\n\t"
  186762. #else
  186763. "add r4, r4, r5\n\t"
  186764. #endif
  186765. #ifdef WOLFSSL_KEIL
  186766. "adcs r2, r2, r6\n\t"
  186767. #elif defined(__clang__)
  186768. "adcs r2, r6\n\t"
  186769. #else
  186770. "adc r2, r6\n\t"
  186771. #endif
  186772. #ifdef WOLFSSL_KEIL
  186773. "adcs r3, r3, %[r]\n\t"
  186774. #elif defined(__clang__)
  186775. "adcs r3, %[r]\n\t"
  186776. #else
  186777. "adc r3, %[r]\n\t"
  186778. #endif
  186779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186780. "lsrs r5, %[a], #16\n\t"
  186781. #else
  186782. "lsr r5, %[a], #16\n\t"
  186783. #endif
  186784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186785. "lsrs r6, r7, #16\n\t"
  186786. #else
  186787. "lsr r6, r7, #16\n\t"
  186788. #endif
  186789. #ifdef WOLFSSL_KEIL
  186790. "muls r6, r5, r6\n\t"
  186791. #elif defined(__clang__)
  186792. "muls r6, r5\n\t"
  186793. #else
  186794. "mul r6, r5\n\t"
  186795. #endif
  186796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186797. "adds r2, r2, r6\n\t"
  186798. #else
  186799. "add r2, r2, r6\n\t"
  186800. #endif
  186801. #ifdef WOLFSSL_KEIL
  186802. "adcs r3, r3, %[r]\n\t"
  186803. #elif defined(__clang__)
  186804. "adcs r3, %[r]\n\t"
  186805. #else
  186806. "adc r3, %[r]\n\t"
  186807. #endif
  186808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186809. "adds r2, r2, r6\n\t"
  186810. #else
  186811. "add r2, r2, r6\n\t"
  186812. #endif
  186813. #ifdef WOLFSSL_KEIL
  186814. "adcs r3, r3, %[r]\n\t"
  186815. #elif defined(__clang__)
  186816. "adcs r3, %[r]\n\t"
  186817. #else
  186818. "adc r3, %[r]\n\t"
  186819. #endif
  186820. "uxth r6, r7\n\t"
  186821. #ifdef WOLFSSL_KEIL
  186822. "muls r5, r6, r5\n\t"
  186823. #elif defined(__clang__)
  186824. "muls r5, r6\n\t"
  186825. #else
  186826. "mul r5, r6\n\t"
  186827. #endif
  186828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186829. "lsrs r6, r5, #16\n\t"
  186830. #else
  186831. "lsr r6, r5, #16\n\t"
  186832. #endif
  186833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186834. "lsls r5, r5, #16\n\t"
  186835. #else
  186836. "lsl r5, r5, #16\n\t"
  186837. #endif
  186838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186839. "adds r4, r4, r5\n\t"
  186840. #else
  186841. "add r4, r4, r5\n\t"
  186842. #endif
  186843. #ifdef WOLFSSL_KEIL
  186844. "adcs r2, r2, r6\n\t"
  186845. #elif defined(__clang__)
  186846. "adcs r2, r6\n\t"
  186847. #else
  186848. "adc r2, r6\n\t"
  186849. #endif
  186850. #ifdef WOLFSSL_KEIL
  186851. "adcs r3, r3, %[r]\n\t"
  186852. #elif defined(__clang__)
  186853. "adcs r3, %[r]\n\t"
  186854. #else
  186855. "adc r3, %[r]\n\t"
  186856. #endif
  186857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186858. "adds r4, r4, r5\n\t"
  186859. #else
  186860. "add r4, r4, r5\n\t"
  186861. #endif
  186862. #ifdef WOLFSSL_KEIL
  186863. "adcs r2, r2, r6\n\t"
  186864. #elif defined(__clang__)
  186865. "adcs r2, r6\n\t"
  186866. #else
  186867. "adc r2, r6\n\t"
  186868. #endif
  186869. #ifdef WOLFSSL_KEIL
  186870. "adcs r3, r3, %[r]\n\t"
  186871. #elif defined(__clang__)
  186872. "adcs r3, %[r]\n\t"
  186873. #else
  186874. "adc r3, %[r]\n\t"
  186875. #endif
  186876. "# A[11] * A[6]\n\t"
  186877. "mov %[a], r9\n\t"
  186878. "ldr r7, [%[a], #24]\n\t"
  186879. "ldr %[a], [%[a], #44]\n\t"
  186880. "uxth r5, %[a]\n\t"
  186881. "uxth r6, r7\n\t"
  186882. #ifdef WOLFSSL_KEIL
  186883. "muls r6, r5, r6\n\t"
  186884. #elif defined(__clang__)
  186885. "muls r6, r5\n\t"
  186886. #else
  186887. "mul r6, r5\n\t"
  186888. #endif
  186889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186890. "adds r4, r4, r6\n\t"
  186891. #else
  186892. "add r4, r4, r6\n\t"
  186893. #endif
  186894. #ifdef WOLFSSL_KEIL
  186895. "adcs r2, r2, %[r]\n\t"
  186896. #elif defined(__clang__)
  186897. "adcs r2, %[r]\n\t"
  186898. #else
  186899. "adc r2, %[r]\n\t"
  186900. #endif
  186901. #ifdef WOLFSSL_KEIL
  186902. "adcs r3, r3, %[r]\n\t"
  186903. #elif defined(__clang__)
  186904. "adcs r3, %[r]\n\t"
  186905. #else
  186906. "adc r3, %[r]\n\t"
  186907. #endif
  186908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186909. "adds r4, r4, r6\n\t"
  186910. #else
  186911. "add r4, r4, r6\n\t"
  186912. #endif
  186913. #ifdef WOLFSSL_KEIL
  186914. "adcs r2, r2, %[r]\n\t"
  186915. #elif defined(__clang__)
  186916. "adcs r2, %[r]\n\t"
  186917. #else
  186918. "adc r2, %[r]\n\t"
  186919. #endif
  186920. #ifdef WOLFSSL_KEIL
  186921. "adcs r3, r3, %[r]\n\t"
  186922. #elif defined(__clang__)
  186923. "adcs r3, %[r]\n\t"
  186924. #else
  186925. "adc r3, %[r]\n\t"
  186926. #endif
  186927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186928. "lsrs r6, r7, #16\n\t"
  186929. #else
  186930. "lsr r6, r7, #16\n\t"
  186931. #endif
  186932. #ifdef WOLFSSL_KEIL
  186933. "muls r5, r6, r5\n\t"
  186934. #elif defined(__clang__)
  186935. "muls r5, r6\n\t"
  186936. #else
  186937. "mul r5, r6\n\t"
  186938. #endif
  186939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186940. "lsrs r6, r5, #16\n\t"
  186941. #else
  186942. "lsr r6, r5, #16\n\t"
  186943. #endif
  186944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186945. "lsls r5, r5, #16\n\t"
  186946. #else
  186947. "lsl r5, r5, #16\n\t"
  186948. #endif
  186949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186950. "adds r4, r4, r5\n\t"
  186951. #else
  186952. "add r4, r4, r5\n\t"
  186953. #endif
  186954. #ifdef WOLFSSL_KEIL
  186955. "adcs r2, r2, r6\n\t"
  186956. #elif defined(__clang__)
  186957. "adcs r2, r6\n\t"
  186958. #else
  186959. "adc r2, r6\n\t"
  186960. #endif
  186961. #ifdef WOLFSSL_KEIL
  186962. "adcs r3, r3, %[r]\n\t"
  186963. #elif defined(__clang__)
  186964. "adcs r3, %[r]\n\t"
  186965. #else
  186966. "adc r3, %[r]\n\t"
  186967. #endif
  186968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186969. "adds r4, r4, r5\n\t"
  186970. #else
  186971. "add r4, r4, r5\n\t"
  186972. #endif
  186973. #ifdef WOLFSSL_KEIL
  186974. "adcs r2, r2, r6\n\t"
  186975. #elif defined(__clang__)
  186976. "adcs r2, r6\n\t"
  186977. #else
  186978. "adc r2, r6\n\t"
  186979. #endif
  186980. #ifdef WOLFSSL_KEIL
  186981. "adcs r3, r3, %[r]\n\t"
  186982. #elif defined(__clang__)
  186983. "adcs r3, %[r]\n\t"
  186984. #else
  186985. "adc r3, %[r]\n\t"
  186986. #endif
  186987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186988. "lsrs r5, %[a], #16\n\t"
  186989. #else
  186990. "lsr r5, %[a], #16\n\t"
  186991. #endif
  186992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186993. "lsrs r6, r7, #16\n\t"
  186994. #else
  186995. "lsr r6, r7, #16\n\t"
  186996. #endif
  186997. #ifdef WOLFSSL_KEIL
  186998. "muls r6, r5, r6\n\t"
  186999. #elif defined(__clang__)
  187000. "muls r6, r5\n\t"
  187001. #else
  187002. "mul r6, r5\n\t"
  187003. #endif
  187004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187005. "adds r2, r2, r6\n\t"
  187006. #else
  187007. "add r2, r2, r6\n\t"
  187008. #endif
  187009. #ifdef WOLFSSL_KEIL
  187010. "adcs r3, r3, %[r]\n\t"
  187011. #elif defined(__clang__)
  187012. "adcs r3, %[r]\n\t"
  187013. #else
  187014. "adc r3, %[r]\n\t"
  187015. #endif
  187016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187017. "adds r2, r2, r6\n\t"
  187018. #else
  187019. "add r2, r2, r6\n\t"
  187020. #endif
  187021. #ifdef WOLFSSL_KEIL
  187022. "adcs r3, r3, %[r]\n\t"
  187023. #elif defined(__clang__)
  187024. "adcs r3, %[r]\n\t"
  187025. #else
  187026. "adc r3, %[r]\n\t"
  187027. #endif
  187028. "uxth r6, r7\n\t"
  187029. #ifdef WOLFSSL_KEIL
  187030. "muls r5, r6, r5\n\t"
  187031. #elif defined(__clang__)
  187032. "muls r5, r6\n\t"
  187033. #else
  187034. "mul r5, r6\n\t"
  187035. #endif
  187036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187037. "lsrs r6, r5, #16\n\t"
  187038. #else
  187039. "lsr r6, r5, #16\n\t"
  187040. #endif
  187041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187042. "lsls r5, r5, #16\n\t"
  187043. #else
  187044. "lsl r5, r5, #16\n\t"
  187045. #endif
  187046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187047. "adds r4, r4, r5\n\t"
  187048. #else
  187049. "add r4, r4, r5\n\t"
  187050. #endif
  187051. #ifdef WOLFSSL_KEIL
  187052. "adcs r2, r2, r6\n\t"
  187053. #elif defined(__clang__)
  187054. "adcs r2, r6\n\t"
  187055. #else
  187056. "adc r2, r6\n\t"
  187057. #endif
  187058. #ifdef WOLFSSL_KEIL
  187059. "adcs r3, r3, %[r]\n\t"
  187060. #elif defined(__clang__)
  187061. "adcs r3, %[r]\n\t"
  187062. #else
  187063. "adc r3, %[r]\n\t"
  187064. #endif
  187065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187066. "adds r4, r4, r5\n\t"
  187067. #else
  187068. "add r4, r4, r5\n\t"
  187069. #endif
  187070. #ifdef WOLFSSL_KEIL
  187071. "adcs r2, r2, r6\n\t"
  187072. #elif defined(__clang__)
  187073. "adcs r2, r6\n\t"
  187074. #else
  187075. "adc r2, r6\n\t"
  187076. #endif
  187077. #ifdef WOLFSSL_KEIL
  187078. "adcs r3, r3, %[r]\n\t"
  187079. #elif defined(__clang__)
  187080. "adcs r3, %[r]\n\t"
  187081. #else
  187082. "adc r3, %[r]\n\t"
  187083. #endif
  187084. "# A[12] * A[5]\n\t"
  187085. "mov %[a], r9\n\t"
  187086. "ldr r7, [%[a], #20]\n\t"
  187087. "mov %[a], r10\n\t"
  187088. "uxth r5, %[a]\n\t"
  187089. "uxth r6, r7\n\t"
  187090. #ifdef WOLFSSL_KEIL
  187091. "muls r6, r5, r6\n\t"
  187092. #elif defined(__clang__)
  187093. "muls r6, r5\n\t"
  187094. #else
  187095. "mul r6, r5\n\t"
  187096. #endif
  187097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187098. "adds r4, r4, r6\n\t"
  187099. #else
  187100. "add r4, r4, r6\n\t"
  187101. #endif
  187102. #ifdef WOLFSSL_KEIL
  187103. "adcs r2, r2, %[r]\n\t"
  187104. #elif defined(__clang__)
  187105. "adcs r2, %[r]\n\t"
  187106. #else
  187107. "adc r2, %[r]\n\t"
  187108. #endif
  187109. #ifdef WOLFSSL_KEIL
  187110. "adcs r3, r3, %[r]\n\t"
  187111. #elif defined(__clang__)
  187112. "adcs r3, %[r]\n\t"
  187113. #else
  187114. "adc r3, %[r]\n\t"
  187115. #endif
  187116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187117. "adds r4, r4, r6\n\t"
  187118. #else
  187119. "add r4, r4, r6\n\t"
  187120. #endif
  187121. #ifdef WOLFSSL_KEIL
  187122. "adcs r2, r2, %[r]\n\t"
  187123. #elif defined(__clang__)
  187124. "adcs r2, %[r]\n\t"
  187125. #else
  187126. "adc r2, %[r]\n\t"
  187127. #endif
  187128. #ifdef WOLFSSL_KEIL
  187129. "adcs r3, r3, %[r]\n\t"
  187130. #elif defined(__clang__)
  187131. "adcs r3, %[r]\n\t"
  187132. #else
  187133. "adc r3, %[r]\n\t"
  187134. #endif
  187135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187136. "lsrs r6, r7, #16\n\t"
  187137. #else
  187138. "lsr r6, r7, #16\n\t"
  187139. #endif
  187140. #ifdef WOLFSSL_KEIL
  187141. "muls r5, r6, r5\n\t"
  187142. #elif defined(__clang__)
  187143. "muls r5, r6\n\t"
  187144. #else
  187145. "mul r5, r6\n\t"
  187146. #endif
  187147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187148. "lsrs r6, r5, #16\n\t"
  187149. #else
  187150. "lsr r6, r5, #16\n\t"
  187151. #endif
  187152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187153. "lsls r5, r5, #16\n\t"
  187154. #else
  187155. "lsl r5, r5, #16\n\t"
  187156. #endif
  187157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187158. "adds r4, r4, r5\n\t"
  187159. #else
  187160. "add r4, r4, r5\n\t"
  187161. #endif
  187162. #ifdef WOLFSSL_KEIL
  187163. "adcs r2, r2, r6\n\t"
  187164. #elif defined(__clang__)
  187165. "adcs r2, r6\n\t"
  187166. #else
  187167. "adc r2, r6\n\t"
  187168. #endif
  187169. #ifdef WOLFSSL_KEIL
  187170. "adcs r3, r3, %[r]\n\t"
  187171. #elif defined(__clang__)
  187172. "adcs r3, %[r]\n\t"
  187173. #else
  187174. "adc r3, %[r]\n\t"
  187175. #endif
  187176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187177. "adds r4, r4, r5\n\t"
  187178. #else
  187179. "add r4, r4, r5\n\t"
  187180. #endif
  187181. #ifdef WOLFSSL_KEIL
  187182. "adcs r2, r2, r6\n\t"
  187183. #elif defined(__clang__)
  187184. "adcs r2, r6\n\t"
  187185. #else
  187186. "adc r2, r6\n\t"
  187187. #endif
  187188. #ifdef WOLFSSL_KEIL
  187189. "adcs r3, r3, %[r]\n\t"
  187190. #elif defined(__clang__)
  187191. "adcs r3, %[r]\n\t"
  187192. #else
  187193. "adc r3, %[r]\n\t"
  187194. #endif
  187195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187196. "lsrs r5, %[a], #16\n\t"
  187197. #else
  187198. "lsr r5, %[a], #16\n\t"
  187199. #endif
  187200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187201. "lsrs r6, r7, #16\n\t"
  187202. #else
  187203. "lsr r6, r7, #16\n\t"
  187204. #endif
  187205. #ifdef WOLFSSL_KEIL
  187206. "muls r6, r5, r6\n\t"
  187207. #elif defined(__clang__)
  187208. "muls r6, r5\n\t"
  187209. #else
  187210. "mul r6, r5\n\t"
  187211. #endif
  187212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187213. "adds r2, r2, r6\n\t"
  187214. #else
  187215. "add r2, r2, r6\n\t"
  187216. #endif
  187217. #ifdef WOLFSSL_KEIL
  187218. "adcs r3, r3, %[r]\n\t"
  187219. #elif defined(__clang__)
  187220. "adcs r3, %[r]\n\t"
  187221. #else
  187222. "adc r3, %[r]\n\t"
  187223. #endif
  187224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187225. "adds r2, r2, r6\n\t"
  187226. #else
  187227. "add r2, r2, r6\n\t"
  187228. #endif
  187229. #ifdef WOLFSSL_KEIL
  187230. "adcs r3, r3, %[r]\n\t"
  187231. #elif defined(__clang__)
  187232. "adcs r3, %[r]\n\t"
  187233. #else
  187234. "adc r3, %[r]\n\t"
  187235. #endif
  187236. "uxth r6, r7\n\t"
  187237. #ifdef WOLFSSL_KEIL
  187238. "muls r5, r6, r5\n\t"
  187239. #elif defined(__clang__)
  187240. "muls r5, r6\n\t"
  187241. #else
  187242. "mul r5, r6\n\t"
  187243. #endif
  187244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187245. "lsrs r6, r5, #16\n\t"
  187246. #else
  187247. "lsr r6, r5, #16\n\t"
  187248. #endif
  187249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187250. "lsls r5, r5, #16\n\t"
  187251. #else
  187252. "lsl r5, r5, #16\n\t"
  187253. #endif
  187254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187255. "adds r4, r4, r5\n\t"
  187256. #else
  187257. "add r4, r4, r5\n\t"
  187258. #endif
  187259. #ifdef WOLFSSL_KEIL
  187260. "adcs r2, r2, r6\n\t"
  187261. #elif defined(__clang__)
  187262. "adcs r2, r6\n\t"
  187263. #else
  187264. "adc r2, r6\n\t"
  187265. #endif
  187266. #ifdef WOLFSSL_KEIL
  187267. "adcs r3, r3, %[r]\n\t"
  187268. #elif defined(__clang__)
  187269. "adcs r3, %[r]\n\t"
  187270. #else
  187271. "adc r3, %[r]\n\t"
  187272. #endif
  187273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187274. "adds r4, r4, r5\n\t"
  187275. #else
  187276. "add r4, r4, r5\n\t"
  187277. #endif
  187278. #ifdef WOLFSSL_KEIL
  187279. "adcs r2, r2, r6\n\t"
  187280. #elif defined(__clang__)
  187281. "adcs r2, r6\n\t"
  187282. #else
  187283. "adc r2, r6\n\t"
  187284. #endif
  187285. #ifdef WOLFSSL_KEIL
  187286. "adcs r3, r3, %[r]\n\t"
  187287. #elif defined(__clang__)
  187288. "adcs r3, %[r]\n\t"
  187289. #else
  187290. "adc r3, %[r]\n\t"
  187291. #endif
  187292. "# A[13] * A[4]\n\t"
  187293. "mov %[a], r9\n\t"
  187294. "ldr r7, [%[a], #16]\n\t"
  187295. "mov %[a], r11\n\t"
  187296. "uxth r5, %[a]\n\t"
  187297. "uxth r6, r7\n\t"
  187298. #ifdef WOLFSSL_KEIL
  187299. "muls r6, r5, r6\n\t"
  187300. #elif defined(__clang__)
  187301. "muls r6, r5\n\t"
  187302. #else
  187303. "mul r6, r5\n\t"
  187304. #endif
  187305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187306. "adds r4, r4, r6\n\t"
  187307. #else
  187308. "add r4, r4, r6\n\t"
  187309. #endif
  187310. #ifdef WOLFSSL_KEIL
  187311. "adcs r2, r2, %[r]\n\t"
  187312. #elif defined(__clang__)
  187313. "adcs r2, %[r]\n\t"
  187314. #else
  187315. "adc r2, %[r]\n\t"
  187316. #endif
  187317. #ifdef WOLFSSL_KEIL
  187318. "adcs r3, r3, %[r]\n\t"
  187319. #elif defined(__clang__)
  187320. "adcs r3, %[r]\n\t"
  187321. #else
  187322. "adc r3, %[r]\n\t"
  187323. #endif
  187324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187325. "adds r4, r4, r6\n\t"
  187326. #else
  187327. "add r4, r4, r6\n\t"
  187328. #endif
  187329. #ifdef WOLFSSL_KEIL
  187330. "adcs r2, r2, %[r]\n\t"
  187331. #elif defined(__clang__)
  187332. "adcs r2, %[r]\n\t"
  187333. #else
  187334. "adc r2, %[r]\n\t"
  187335. #endif
  187336. #ifdef WOLFSSL_KEIL
  187337. "adcs r3, r3, %[r]\n\t"
  187338. #elif defined(__clang__)
  187339. "adcs r3, %[r]\n\t"
  187340. #else
  187341. "adc r3, %[r]\n\t"
  187342. #endif
  187343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187344. "lsrs r6, r7, #16\n\t"
  187345. #else
  187346. "lsr r6, r7, #16\n\t"
  187347. #endif
  187348. #ifdef WOLFSSL_KEIL
  187349. "muls r5, r6, r5\n\t"
  187350. #elif defined(__clang__)
  187351. "muls r5, r6\n\t"
  187352. #else
  187353. "mul r5, r6\n\t"
  187354. #endif
  187355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187356. "lsrs r6, r5, #16\n\t"
  187357. #else
  187358. "lsr r6, r5, #16\n\t"
  187359. #endif
  187360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187361. "lsls r5, r5, #16\n\t"
  187362. #else
  187363. "lsl r5, r5, #16\n\t"
  187364. #endif
  187365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187366. "adds r4, r4, r5\n\t"
  187367. #else
  187368. "add r4, r4, r5\n\t"
  187369. #endif
  187370. #ifdef WOLFSSL_KEIL
  187371. "adcs r2, r2, r6\n\t"
  187372. #elif defined(__clang__)
  187373. "adcs r2, r6\n\t"
  187374. #else
  187375. "adc r2, r6\n\t"
  187376. #endif
  187377. #ifdef WOLFSSL_KEIL
  187378. "adcs r3, r3, %[r]\n\t"
  187379. #elif defined(__clang__)
  187380. "adcs r3, %[r]\n\t"
  187381. #else
  187382. "adc r3, %[r]\n\t"
  187383. #endif
  187384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187385. "adds r4, r4, r5\n\t"
  187386. #else
  187387. "add r4, r4, r5\n\t"
  187388. #endif
  187389. #ifdef WOLFSSL_KEIL
  187390. "adcs r2, r2, r6\n\t"
  187391. #elif defined(__clang__)
  187392. "adcs r2, r6\n\t"
  187393. #else
  187394. "adc r2, r6\n\t"
  187395. #endif
  187396. #ifdef WOLFSSL_KEIL
  187397. "adcs r3, r3, %[r]\n\t"
  187398. #elif defined(__clang__)
  187399. "adcs r3, %[r]\n\t"
  187400. #else
  187401. "adc r3, %[r]\n\t"
  187402. #endif
  187403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187404. "lsrs r5, %[a], #16\n\t"
  187405. #else
  187406. "lsr r5, %[a], #16\n\t"
  187407. #endif
  187408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187409. "lsrs r6, r7, #16\n\t"
  187410. #else
  187411. "lsr r6, r7, #16\n\t"
  187412. #endif
  187413. #ifdef WOLFSSL_KEIL
  187414. "muls r6, r5, r6\n\t"
  187415. #elif defined(__clang__)
  187416. "muls r6, r5\n\t"
  187417. #else
  187418. "mul r6, r5\n\t"
  187419. #endif
  187420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187421. "adds r2, r2, r6\n\t"
  187422. #else
  187423. "add r2, r2, r6\n\t"
  187424. #endif
  187425. #ifdef WOLFSSL_KEIL
  187426. "adcs r3, r3, %[r]\n\t"
  187427. #elif defined(__clang__)
  187428. "adcs r3, %[r]\n\t"
  187429. #else
  187430. "adc r3, %[r]\n\t"
  187431. #endif
  187432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187433. "adds r2, r2, r6\n\t"
  187434. #else
  187435. "add r2, r2, r6\n\t"
  187436. #endif
  187437. #ifdef WOLFSSL_KEIL
  187438. "adcs r3, r3, %[r]\n\t"
  187439. #elif defined(__clang__)
  187440. "adcs r3, %[r]\n\t"
  187441. #else
  187442. "adc r3, %[r]\n\t"
  187443. #endif
  187444. "uxth r6, r7\n\t"
  187445. #ifdef WOLFSSL_KEIL
  187446. "muls r5, r6, r5\n\t"
  187447. #elif defined(__clang__)
  187448. "muls r5, r6\n\t"
  187449. #else
  187450. "mul r5, r6\n\t"
  187451. #endif
  187452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187453. "lsrs r6, r5, #16\n\t"
  187454. #else
  187455. "lsr r6, r5, #16\n\t"
  187456. #endif
  187457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187458. "lsls r5, r5, #16\n\t"
  187459. #else
  187460. "lsl r5, r5, #16\n\t"
  187461. #endif
  187462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187463. "adds r4, r4, r5\n\t"
  187464. #else
  187465. "add r4, r4, r5\n\t"
  187466. #endif
  187467. #ifdef WOLFSSL_KEIL
  187468. "adcs r2, r2, r6\n\t"
  187469. #elif defined(__clang__)
  187470. "adcs r2, r6\n\t"
  187471. #else
  187472. "adc r2, r6\n\t"
  187473. #endif
  187474. #ifdef WOLFSSL_KEIL
  187475. "adcs r3, r3, %[r]\n\t"
  187476. #elif defined(__clang__)
  187477. "adcs r3, %[r]\n\t"
  187478. #else
  187479. "adc r3, %[r]\n\t"
  187480. #endif
  187481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187482. "adds r4, r4, r5\n\t"
  187483. #else
  187484. "add r4, r4, r5\n\t"
  187485. #endif
  187486. #ifdef WOLFSSL_KEIL
  187487. "adcs r2, r2, r6\n\t"
  187488. #elif defined(__clang__)
  187489. "adcs r2, r6\n\t"
  187490. #else
  187491. "adc r2, r6\n\t"
  187492. #endif
  187493. #ifdef WOLFSSL_KEIL
  187494. "adcs r3, r3, %[r]\n\t"
  187495. #elif defined(__clang__)
  187496. "adcs r3, %[r]\n\t"
  187497. #else
  187498. "adc r3, %[r]\n\t"
  187499. #endif
  187500. "# A[14] * A[3]\n\t"
  187501. "mov %[a], r9\n\t"
  187502. "ldr r7, [%[a], #12]\n\t"
  187503. "mov %[a], r12\n\t"
  187504. "uxth r5, %[a]\n\t"
  187505. "uxth r6, r7\n\t"
  187506. #ifdef WOLFSSL_KEIL
  187507. "muls r6, r5, r6\n\t"
  187508. #elif defined(__clang__)
  187509. "muls r6, r5\n\t"
  187510. #else
  187511. "mul r6, r5\n\t"
  187512. #endif
  187513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187514. "adds r4, r4, r6\n\t"
  187515. #else
  187516. "add r4, r4, r6\n\t"
  187517. #endif
  187518. #ifdef WOLFSSL_KEIL
  187519. "adcs r2, r2, %[r]\n\t"
  187520. #elif defined(__clang__)
  187521. "adcs r2, %[r]\n\t"
  187522. #else
  187523. "adc r2, %[r]\n\t"
  187524. #endif
  187525. #ifdef WOLFSSL_KEIL
  187526. "adcs r3, r3, %[r]\n\t"
  187527. #elif defined(__clang__)
  187528. "adcs r3, %[r]\n\t"
  187529. #else
  187530. "adc r3, %[r]\n\t"
  187531. #endif
  187532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187533. "adds r4, r4, r6\n\t"
  187534. #else
  187535. "add r4, r4, r6\n\t"
  187536. #endif
  187537. #ifdef WOLFSSL_KEIL
  187538. "adcs r2, r2, %[r]\n\t"
  187539. #elif defined(__clang__)
  187540. "adcs r2, %[r]\n\t"
  187541. #else
  187542. "adc r2, %[r]\n\t"
  187543. #endif
  187544. #ifdef WOLFSSL_KEIL
  187545. "adcs r3, r3, %[r]\n\t"
  187546. #elif defined(__clang__)
  187547. "adcs r3, %[r]\n\t"
  187548. #else
  187549. "adc r3, %[r]\n\t"
  187550. #endif
  187551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187552. "lsrs r6, r7, #16\n\t"
  187553. #else
  187554. "lsr r6, r7, #16\n\t"
  187555. #endif
  187556. #ifdef WOLFSSL_KEIL
  187557. "muls r5, r6, r5\n\t"
  187558. #elif defined(__clang__)
  187559. "muls r5, r6\n\t"
  187560. #else
  187561. "mul r5, r6\n\t"
  187562. #endif
  187563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187564. "lsrs r6, r5, #16\n\t"
  187565. #else
  187566. "lsr r6, r5, #16\n\t"
  187567. #endif
  187568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187569. "lsls r5, r5, #16\n\t"
  187570. #else
  187571. "lsl r5, r5, #16\n\t"
  187572. #endif
  187573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187574. "adds r4, r4, r5\n\t"
  187575. #else
  187576. "add r4, r4, r5\n\t"
  187577. #endif
  187578. #ifdef WOLFSSL_KEIL
  187579. "adcs r2, r2, r6\n\t"
  187580. #elif defined(__clang__)
  187581. "adcs r2, r6\n\t"
  187582. #else
  187583. "adc r2, r6\n\t"
  187584. #endif
  187585. #ifdef WOLFSSL_KEIL
  187586. "adcs r3, r3, %[r]\n\t"
  187587. #elif defined(__clang__)
  187588. "adcs r3, %[r]\n\t"
  187589. #else
  187590. "adc r3, %[r]\n\t"
  187591. #endif
  187592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187593. "adds r4, r4, r5\n\t"
  187594. #else
  187595. "add r4, r4, r5\n\t"
  187596. #endif
  187597. #ifdef WOLFSSL_KEIL
  187598. "adcs r2, r2, r6\n\t"
  187599. #elif defined(__clang__)
  187600. "adcs r2, r6\n\t"
  187601. #else
  187602. "adc r2, r6\n\t"
  187603. #endif
  187604. #ifdef WOLFSSL_KEIL
  187605. "adcs r3, r3, %[r]\n\t"
  187606. #elif defined(__clang__)
  187607. "adcs r3, %[r]\n\t"
  187608. #else
  187609. "adc r3, %[r]\n\t"
  187610. #endif
  187611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187612. "lsrs r5, %[a], #16\n\t"
  187613. #else
  187614. "lsr r5, %[a], #16\n\t"
  187615. #endif
  187616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187617. "lsrs r6, r7, #16\n\t"
  187618. #else
  187619. "lsr r6, r7, #16\n\t"
  187620. #endif
  187621. #ifdef WOLFSSL_KEIL
  187622. "muls r6, r5, r6\n\t"
  187623. #elif defined(__clang__)
  187624. "muls r6, r5\n\t"
  187625. #else
  187626. "mul r6, r5\n\t"
  187627. #endif
  187628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187629. "adds r2, r2, r6\n\t"
  187630. #else
  187631. "add r2, r2, r6\n\t"
  187632. #endif
  187633. #ifdef WOLFSSL_KEIL
  187634. "adcs r3, r3, %[r]\n\t"
  187635. #elif defined(__clang__)
  187636. "adcs r3, %[r]\n\t"
  187637. #else
  187638. "adc r3, %[r]\n\t"
  187639. #endif
  187640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187641. "adds r2, r2, r6\n\t"
  187642. #else
  187643. "add r2, r2, r6\n\t"
  187644. #endif
  187645. #ifdef WOLFSSL_KEIL
  187646. "adcs r3, r3, %[r]\n\t"
  187647. #elif defined(__clang__)
  187648. "adcs r3, %[r]\n\t"
  187649. #else
  187650. "adc r3, %[r]\n\t"
  187651. #endif
  187652. "uxth r6, r7\n\t"
  187653. #ifdef WOLFSSL_KEIL
  187654. "muls r5, r6, r5\n\t"
  187655. #elif defined(__clang__)
  187656. "muls r5, r6\n\t"
  187657. #else
  187658. "mul r5, r6\n\t"
  187659. #endif
  187660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187661. "lsrs r6, r5, #16\n\t"
  187662. #else
  187663. "lsr r6, r5, #16\n\t"
  187664. #endif
  187665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187666. "lsls r5, r5, #16\n\t"
  187667. #else
  187668. "lsl r5, r5, #16\n\t"
  187669. #endif
  187670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187671. "adds r4, r4, r5\n\t"
  187672. #else
  187673. "add r4, r4, r5\n\t"
  187674. #endif
  187675. #ifdef WOLFSSL_KEIL
  187676. "adcs r2, r2, r6\n\t"
  187677. #elif defined(__clang__)
  187678. "adcs r2, r6\n\t"
  187679. #else
  187680. "adc r2, r6\n\t"
  187681. #endif
  187682. #ifdef WOLFSSL_KEIL
  187683. "adcs r3, r3, %[r]\n\t"
  187684. #elif defined(__clang__)
  187685. "adcs r3, %[r]\n\t"
  187686. #else
  187687. "adc r3, %[r]\n\t"
  187688. #endif
  187689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187690. "adds r4, r4, r5\n\t"
  187691. #else
  187692. "add r4, r4, r5\n\t"
  187693. #endif
  187694. #ifdef WOLFSSL_KEIL
  187695. "adcs r2, r2, r6\n\t"
  187696. #elif defined(__clang__)
  187697. "adcs r2, r6\n\t"
  187698. #else
  187699. "adc r2, r6\n\t"
  187700. #endif
  187701. #ifdef WOLFSSL_KEIL
  187702. "adcs r3, r3, %[r]\n\t"
  187703. #elif defined(__clang__)
  187704. "adcs r3, %[r]\n\t"
  187705. #else
  187706. "adc r3, %[r]\n\t"
  187707. #endif
  187708. "# A[15] * A[2]\n\t"
  187709. "mov %[a], r9\n\t"
  187710. "ldr r7, [%[a], #8]\n\t"
  187711. "mov %[a], lr\n\t"
  187712. "uxth r5, %[a]\n\t"
  187713. "uxth r6, r7\n\t"
  187714. #ifdef WOLFSSL_KEIL
  187715. "muls r6, r5, r6\n\t"
  187716. #elif defined(__clang__)
  187717. "muls r6, r5\n\t"
  187718. #else
  187719. "mul r6, r5\n\t"
  187720. #endif
  187721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187722. "adds r4, r4, r6\n\t"
  187723. #else
  187724. "add r4, r4, r6\n\t"
  187725. #endif
  187726. #ifdef WOLFSSL_KEIL
  187727. "adcs r2, r2, %[r]\n\t"
  187728. #elif defined(__clang__)
  187729. "adcs r2, %[r]\n\t"
  187730. #else
  187731. "adc r2, %[r]\n\t"
  187732. #endif
  187733. #ifdef WOLFSSL_KEIL
  187734. "adcs r3, r3, %[r]\n\t"
  187735. #elif defined(__clang__)
  187736. "adcs r3, %[r]\n\t"
  187737. #else
  187738. "adc r3, %[r]\n\t"
  187739. #endif
  187740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187741. "adds r4, r4, r6\n\t"
  187742. #else
  187743. "add r4, r4, r6\n\t"
  187744. #endif
  187745. #ifdef WOLFSSL_KEIL
  187746. "adcs r2, r2, %[r]\n\t"
  187747. #elif defined(__clang__)
  187748. "adcs r2, %[r]\n\t"
  187749. #else
  187750. "adc r2, %[r]\n\t"
  187751. #endif
  187752. #ifdef WOLFSSL_KEIL
  187753. "adcs r3, r3, %[r]\n\t"
  187754. #elif defined(__clang__)
  187755. "adcs r3, %[r]\n\t"
  187756. #else
  187757. "adc r3, %[r]\n\t"
  187758. #endif
  187759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187760. "lsrs r6, r7, #16\n\t"
  187761. #else
  187762. "lsr r6, r7, #16\n\t"
  187763. #endif
  187764. #ifdef WOLFSSL_KEIL
  187765. "muls r5, r6, r5\n\t"
  187766. #elif defined(__clang__)
  187767. "muls r5, r6\n\t"
  187768. #else
  187769. "mul r5, r6\n\t"
  187770. #endif
  187771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187772. "lsrs r6, r5, #16\n\t"
  187773. #else
  187774. "lsr r6, r5, #16\n\t"
  187775. #endif
  187776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187777. "lsls r5, r5, #16\n\t"
  187778. #else
  187779. "lsl r5, r5, #16\n\t"
  187780. #endif
  187781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187782. "adds r4, r4, r5\n\t"
  187783. #else
  187784. "add r4, r4, r5\n\t"
  187785. #endif
  187786. #ifdef WOLFSSL_KEIL
  187787. "adcs r2, r2, r6\n\t"
  187788. #elif defined(__clang__)
  187789. "adcs r2, r6\n\t"
  187790. #else
  187791. "adc r2, r6\n\t"
  187792. #endif
  187793. #ifdef WOLFSSL_KEIL
  187794. "adcs r3, r3, %[r]\n\t"
  187795. #elif defined(__clang__)
  187796. "adcs r3, %[r]\n\t"
  187797. #else
  187798. "adc r3, %[r]\n\t"
  187799. #endif
  187800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187801. "adds r4, r4, r5\n\t"
  187802. #else
  187803. "add r4, r4, r5\n\t"
  187804. #endif
  187805. #ifdef WOLFSSL_KEIL
  187806. "adcs r2, r2, r6\n\t"
  187807. #elif defined(__clang__)
  187808. "adcs r2, r6\n\t"
  187809. #else
  187810. "adc r2, r6\n\t"
  187811. #endif
  187812. #ifdef WOLFSSL_KEIL
  187813. "adcs r3, r3, %[r]\n\t"
  187814. #elif defined(__clang__)
  187815. "adcs r3, %[r]\n\t"
  187816. #else
  187817. "adc r3, %[r]\n\t"
  187818. #endif
  187819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187820. "lsrs r5, %[a], #16\n\t"
  187821. #else
  187822. "lsr r5, %[a], #16\n\t"
  187823. #endif
  187824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187825. "lsrs r6, r7, #16\n\t"
  187826. #else
  187827. "lsr r6, r7, #16\n\t"
  187828. #endif
  187829. #ifdef WOLFSSL_KEIL
  187830. "muls r6, r5, r6\n\t"
  187831. #elif defined(__clang__)
  187832. "muls r6, r5\n\t"
  187833. #else
  187834. "mul r6, r5\n\t"
  187835. #endif
  187836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187837. "adds r2, r2, r6\n\t"
  187838. #else
  187839. "add r2, r2, r6\n\t"
  187840. #endif
  187841. #ifdef WOLFSSL_KEIL
  187842. "adcs r3, r3, %[r]\n\t"
  187843. #elif defined(__clang__)
  187844. "adcs r3, %[r]\n\t"
  187845. #else
  187846. "adc r3, %[r]\n\t"
  187847. #endif
  187848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187849. "adds r2, r2, r6\n\t"
  187850. #else
  187851. "add r2, r2, r6\n\t"
  187852. #endif
  187853. #ifdef WOLFSSL_KEIL
  187854. "adcs r3, r3, %[r]\n\t"
  187855. #elif defined(__clang__)
  187856. "adcs r3, %[r]\n\t"
  187857. #else
  187858. "adc r3, %[r]\n\t"
  187859. #endif
  187860. "uxth r6, r7\n\t"
  187861. #ifdef WOLFSSL_KEIL
  187862. "muls r5, r6, r5\n\t"
  187863. #elif defined(__clang__)
  187864. "muls r5, r6\n\t"
  187865. #else
  187866. "mul r5, r6\n\t"
  187867. #endif
  187868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187869. "lsrs r6, r5, #16\n\t"
  187870. #else
  187871. "lsr r6, r5, #16\n\t"
  187872. #endif
  187873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187874. "lsls r5, r5, #16\n\t"
  187875. #else
  187876. "lsl r5, r5, #16\n\t"
  187877. #endif
  187878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187879. "adds r4, r4, r5\n\t"
  187880. #else
  187881. "add r4, r4, r5\n\t"
  187882. #endif
  187883. #ifdef WOLFSSL_KEIL
  187884. "adcs r2, r2, r6\n\t"
  187885. #elif defined(__clang__)
  187886. "adcs r2, r6\n\t"
  187887. #else
  187888. "adc r2, r6\n\t"
  187889. #endif
  187890. #ifdef WOLFSSL_KEIL
  187891. "adcs r3, r3, %[r]\n\t"
  187892. #elif defined(__clang__)
  187893. "adcs r3, %[r]\n\t"
  187894. #else
  187895. "adc r3, %[r]\n\t"
  187896. #endif
  187897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187898. "adds r4, r4, r5\n\t"
  187899. #else
  187900. "add r4, r4, r5\n\t"
  187901. #endif
  187902. #ifdef WOLFSSL_KEIL
  187903. "adcs r2, r2, r6\n\t"
  187904. #elif defined(__clang__)
  187905. "adcs r2, r6\n\t"
  187906. #else
  187907. "adc r2, r6\n\t"
  187908. #endif
  187909. #ifdef WOLFSSL_KEIL
  187910. "adcs r3, r3, %[r]\n\t"
  187911. #elif defined(__clang__)
  187912. "adcs r3, %[r]\n\t"
  187913. #else
  187914. "adc r3, %[r]\n\t"
  187915. #endif
  187916. "mov %[r], r8\n\t"
  187917. "str r4, [%[r], #68]\n\t"
  187918. "movs %[r], #0\n\t"
  187919. "# A[15] * A[3]\n\t"
  187920. "movs r4, #0\n\t"
  187921. "mov %[a], r9\n\t"
  187922. "ldr r7, [%[a], #12]\n\t"
  187923. "mov %[a], lr\n\t"
  187924. "uxth r5, %[a]\n\t"
  187925. "uxth r6, r7\n\t"
  187926. #ifdef WOLFSSL_KEIL
  187927. "muls r6, r5, r6\n\t"
  187928. #elif defined(__clang__)
  187929. "muls r6, r5\n\t"
  187930. #else
  187931. "mul r6, r5\n\t"
  187932. #endif
  187933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187934. "adds r2, r2, r6\n\t"
  187935. #else
  187936. "add r2, r2, r6\n\t"
  187937. #endif
  187938. #ifdef WOLFSSL_KEIL
  187939. "adcs r3, r3, %[r]\n\t"
  187940. #elif defined(__clang__)
  187941. "adcs r3, %[r]\n\t"
  187942. #else
  187943. "adc r3, %[r]\n\t"
  187944. #endif
  187945. #ifdef WOLFSSL_KEIL
  187946. "adcs r4, r4, %[r]\n\t"
  187947. #elif defined(__clang__)
  187948. "adcs r4, %[r]\n\t"
  187949. #else
  187950. "adc r4, %[r]\n\t"
  187951. #endif
  187952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187953. "adds r2, r2, r6\n\t"
  187954. #else
  187955. "add r2, r2, r6\n\t"
  187956. #endif
  187957. #ifdef WOLFSSL_KEIL
  187958. "adcs r3, r3, %[r]\n\t"
  187959. #elif defined(__clang__)
  187960. "adcs r3, %[r]\n\t"
  187961. #else
  187962. "adc r3, %[r]\n\t"
  187963. #endif
  187964. #ifdef WOLFSSL_KEIL
  187965. "adcs r4, r4, %[r]\n\t"
  187966. #elif defined(__clang__)
  187967. "adcs r4, %[r]\n\t"
  187968. #else
  187969. "adc r4, %[r]\n\t"
  187970. #endif
  187971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187972. "lsrs r6, r7, #16\n\t"
  187973. #else
  187974. "lsr r6, r7, #16\n\t"
  187975. #endif
  187976. #ifdef WOLFSSL_KEIL
  187977. "muls r5, r6, r5\n\t"
  187978. #elif defined(__clang__)
  187979. "muls r5, r6\n\t"
  187980. #else
  187981. "mul r5, r6\n\t"
  187982. #endif
  187983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187984. "lsrs r6, r5, #16\n\t"
  187985. #else
  187986. "lsr r6, r5, #16\n\t"
  187987. #endif
  187988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187989. "lsls r5, r5, #16\n\t"
  187990. #else
  187991. "lsl r5, r5, #16\n\t"
  187992. #endif
  187993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187994. "adds r2, r2, r5\n\t"
  187995. #else
  187996. "add r2, r2, r5\n\t"
  187997. #endif
  187998. #ifdef WOLFSSL_KEIL
  187999. "adcs r3, r3, r6\n\t"
  188000. #elif defined(__clang__)
  188001. "adcs r3, r6\n\t"
  188002. #else
  188003. "adc r3, r6\n\t"
  188004. #endif
  188005. #ifdef WOLFSSL_KEIL
  188006. "adcs r4, r4, %[r]\n\t"
  188007. #elif defined(__clang__)
  188008. "adcs r4, %[r]\n\t"
  188009. #else
  188010. "adc r4, %[r]\n\t"
  188011. #endif
  188012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188013. "adds r2, r2, r5\n\t"
  188014. #else
  188015. "add r2, r2, r5\n\t"
  188016. #endif
  188017. #ifdef WOLFSSL_KEIL
  188018. "adcs r3, r3, r6\n\t"
  188019. #elif defined(__clang__)
  188020. "adcs r3, r6\n\t"
  188021. #else
  188022. "adc r3, r6\n\t"
  188023. #endif
  188024. #ifdef WOLFSSL_KEIL
  188025. "adcs r4, r4, %[r]\n\t"
  188026. #elif defined(__clang__)
  188027. "adcs r4, %[r]\n\t"
  188028. #else
  188029. "adc r4, %[r]\n\t"
  188030. #endif
  188031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188032. "lsrs r5, %[a], #16\n\t"
  188033. #else
  188034. "lsr r5, %[a], #16\n\t"
  188035. #endif
  188036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188037. "lsrs r6, r7, #16\n\t"
  188038. #else
  188039. "lsr r6, r7, #16\n\t"
  188040. #endif
  188041. #ifdef WOLFSSL_KEIL
  188042. "muls r6, r5, r6\n\t"
  188043. #elif defined(__clang__)
  188044. "muls r6, r5\n\t"
  188045. #else
  188046. "mul r6, r5\n\t"
  188047. #endif
  188048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188049. "adds r3, r3, r6\n\t"
  188050. #else
  188051. "add r3, r3, r6\n\t"
  188052. #endif
  188053. #ifdef WOLFSSL_KEIL
  188054. "adcs r4, r4, %[r]\n\t"
  188055. #elif defined(__clang__)
  188056. "adcs r4, %[r]\n\t"
  188057. #else
  188058. "adc r4, %[r]\n\t"
  188059. #endif
  188060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188061. "adds r3, r3, r6\n\t"
  188062. #else
  188063. "add r3, r3, r6\n\t"
  188064. #endif
  188065. #ifdef WOLFSSL_KEIL
  188066. "adcs r4, r4, %[r]\n\t"
  188067. #elif defined(__clang__)
  188068. "adcs r4, %[r]\n\t"
  188069. #else
  188070. "adc r4, %[r]\n\t"
  188071. #endif
  188072. "uxth r6, r7\n\t"
  188073. #ifdef WOLFSSL_KEIL
  188074. "muls r5, r6, r5\n\t"
  188075. #elif defined(__clang__)
  188076. "muls r5, r6\n\t"
  188077. #else
  188078. "mul r5, r6\n\t"
  188079. #endif
  188080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188081. "lsrs r6, r5, #16\n\t"
  188082. #else
  188083. "lsr r6, r5, #16\n\t"
  188084. #endif
  188085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188086. "lsls r5, r5, #16\n\t"
  188087. #else
  188088. "lsl r5, r5, #16\n\t"
  188089. #endif
  188090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188091. "adds r2, r2, r5\n\t"
  188092. #else
  188093. "add r2, r2, r5\n\t"
  188094. #endif
  188095. #ifdef WOLFSSL_KEIL
  188096. "adcs r3, r3, r6\n\t"
  188097. #elif defined(__clang__)
  188098. "adcs r3, r6\n\t"
  188099. #else
  188100. "adc r3, r6\n\t"
  188101. #endif
  188102. #ifdef WOLFSSL_KEIL
  188103. "adcs r4, r4, %[r]\n\t"
  188104. #elif defined(__clang__)
  188105. "adcs r4, %[r]\n\t"
  188106. #else
  188107. "adc r4, %[r]\n\t"
  188108. #endif
  188109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188110. "adds r2, r2, r5\n\t"
  188111. #else
  188112. "add r2, r2, r5\n\t"
  188113. #endif
  188114. #ifdef WOLFSSL_KEIL
  188115. "adcs r3, r3, r6\n\t"
  188116. #elif defined(__clang__)
  188117. "adcs r3, r6\n\t"
  188118. #else
  188119. "adc r3, r6\n\t"
  188120. #endif
  188121. #ifdef WOLFSSL_KEIL
  188122. "adcs r4, r4, %[r]\n\t"
  188123. #elif defined(__clang__)
  188124. "adcs r4, %[r]\n\t"
  188125. #else
  188126. "adc r4, %[r]\n\t"
  188127. #endif
  188128. "# A[14] * A[4]\n\t"
  188129. "mov %[a], r9\n\t"
  188130. "ldr r7, [%[a], #16]\n\t"
  188131. "mov %[a], r12\n\t"
  188132. "uxth r5, %[a]\n\t"
  188133. "uxth r6, r7\n\t"
  188134. #ifdef WOLFSSL_KEIL
  188135. "muls r6, r5, r6\n\t"
  188136. #elif defined(__clang__)
  188137. "muls r6, r5\n\t"
  188138. #else
  188139. "mul r6, r5\n\t"
  188140. #endif
  188141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188142. "adds r2, r2, r6\n\t"
  188143. #else
  188144. "add r2, r2, r6\n\t"
  188145. #endif
  188146. #ifdef WOLFSSL_KEIL
  188147. "adcs r3, r3, %[r]\n\t"
  188148. #elif defined(__clang__)
  188149. "adcs r3, %[r]\n\t"
  188150. #else
  188151. "adc r3, %[r]\n\t"
  188152. #endif
  188153. #ifdef WOLFSSL_KEIL
  188154. "adcs r4, r4, %[r]\n\t"
  188155. #elif defined(__clang__)
  188156. "adcs r4, %[r]\n\t"
  188157. #else
  188158. "adc r4, %[r]\n\t"
  188159. #endif
  188160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188161. "adds r2, r2, r6\n\t"
  188162. #else
  188163. "add r2, r2, r6\n\t"
  188164. #endif
  188165. #ifdef WOLFSSL_KEIL
  188166. "adcs r3, r3, %[r]\n\t"
  188167. #elif defined(__clang__)
  188168. "adcs r3, %[r]\n\t"
  188169. #else
  188170. "adc r3, %[r]\n\t"
  188171. #endif
  188172. #ifdef WOLFSSL_KEIL
  188173. "adcs r4, r4, %[r]\n\t"
  188174. #elif defined(__clang__)
  188175. "adcs r4, %[r]\n\t"
  188176. #else
  188177. "adc r4, %[r]\n\t"
  188178. #endif
  188179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188180. "lsrs r6, r7, #16\n\t"
  188181. #else
  188182. "lsr r6, r7, #16\n\t"
  188183. #endif
  188184. #ifdef WOLFSSL_KEIL
  188185. "muls r5, r6, r5\n\t"
  188186. #elif defined(__clang__)
  188187. "muls r5, r6\n\t"
  188188. #else
  188189. "mul r5, r6\n\t"
  188190. #endif
  188191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188192. "lsrs r6, r5, #16\n\t"
  188193. #else
  188194. "lsr r6, r5, #16\n\t"
  188195. #endif
  188196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188197. "lsls r5, r5, #16\n\t"
  188198. #else
  188199. "lsl r5, r5, #16\n\t"
  188200. #endif
  188201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188202. "adds r2, r2, r5\n\t"
  188203. #else
  188204. "add r2, r2, r5\n\t"
  188205. #endif
  188206. #ifdef WOLFSSL_KEIL
  188207. "adcs r3, r3, r6\n\t"
  188208. #elif defined(__clang__)
  188209. "adcs r3, r6\n\t"
  188210. #else
  188211. "adc r3, r6\n\t"
  188212. #endif
  188213. #ifdef WOLFSSL_KEIL
  188214. "adcs r4, r4, %[r]\n\t"
  188215. #elif defined(__clang__)
  188216. "adcs r4, %[r]\n\t"
  188217. #else
  188218. "adc r4, %[r]\n\t"
  188219. #endif
  188220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188221. "adds r2, r2, r5\n\t"
  188222. #else
  188223. "add r2, r2, r5\n\t"
  188224. #endif
  188225. #ifdef WOLFSSL_KEIL
  188226. "adcs r3, r3, r6\n\t"
  188227. #elif defined(__clang__)
  188228. "adcs r3, r6\n\t"
  188229. #else
  188230. "adc r3, r6\n\t"
  188231. #endif
  188232. #ifdef WOLFSSL_KEIL
  188233. "adcs r4, r4, %[r]\n\t"
  188234. #elif defined(__clang__)
  188235. "adcs r4, %[r]\n\t"
  188236. #else
  188237. "adc r4, %[r]\n\t"
  188238. #endif
  188239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188240. "lsrs r5, %[a], #16\n\t"
  188241. #else
  188242. "lsr r5, %[a], #16\n\t"
  188243. #endif
  188244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188245. "lsrs r6, r7, #16\n\t"
  188246. #else
  188247. "lsr r6, r7, #16\n\t"
  188248. #endif
  188249. #ifdef WOLFSSL_KEIL
  188250. "muls r6, r5, r6\n\t"
  188251. #elif defined(__clang__)
  188252. "muls r6, r5\n\t"
  188253. #else
  188254. "mul r6, r5\n\t"
  188255. #endif
  188256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188257. "adds r3, r3, r6\n\t"
  188258. #else
  188259. "add r3, r3, r6\n\t"
  188260. #endif
  188261. #ifdef WOLFSSL_KEIL
  188262. "adcs r4, r4, %[r]\n\t"
  188263. #elif defined(__clang__)
  188264. "adcs r4, %[r]\n\t"
  188265. #else
  188266. "adc r4, %[r]\n\t"
  188267. #endif
  188268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188269. "adds r3, r3, r6\n\t"
  188270. #else
  188271. "add r3, r3, r6\n\t"
  188272. #endif
  188273. #ifdef WOLFSSL_KEIL
  188274. "adcs r4, r4, %[r]\n\t"
  188275. #elif defined(__clang__)
  188276. "adcs r4, %[r]\n\t"
  188277. #else
  188278. "adc r4, %[r]\n\t"
  188279. #endif
  188280. "uxth r6, r7\n\t"
  188281. #ifdef WOLFSSL_KEIL
  188282. "muls r5, r6, r5\n\t"
  188283. #elif defined(__clang__)
  188284. "muls r5, r6\n\t"
  188285. #else
  188286. "mul r5, r6\n\t"
  188287. #endif
  188288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188289. "lsrs r6, r5, #16\n\t"
  188290. #else
  188291. "lsr r6, r5, #16\n\t"
  188292. #endif
  188293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188294. "lsls r5, r5, #16\n\t"
  188295. #else
  188296. "lsl r5, r5, #16\n\t"
  188297. #endif
  188298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188299. "adds r2, r2, r5\n\t"
  188300. #else
  188301. "add r2, r2, r5\n\t"
  188302. #endif
  188303. #ifdef WOLFSSL_KEIL
  188304. "adcs r3, r3, r6\n\t"
  188305. #elif defined(__clang__)
  188306. "adcs r3, r6\n\t"
  188307. #else
  188308. "adc r3, r6\n\t"
  188309. #endif
  188310. #ifdef WOLFSSL_KEIL
  188311. "adcs r4, r4, %[r]\n\t"
  188312. #elif defined(__clang__)
  188313. "adcs r4, %[r]\n\t"
  188314. #else
  188315. "adc r4, %[r]\n\t"
  188316. #endif
  188317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188318. "adds r2, r2, r5\n\t"
  188319. #else
  188320. "add r2, r2, r5\n\t"
  188321. #endif
  188322. #ifdef WOLFSSL_KEIL
  188323. "adcs r3, r3, r6\n\t"
  188324. #elif defined(__clang__)
  188325. "adcs r3, r6\n\t"
  188326. #else
  188327. "adc r3, r6\n\t"
  188328. #endif
  188329. #ifdef WOLFSSL_KEIL
  188330. "adcs r4, r4, %[r]\n\t"
  188331. #elif defined(__clang__)
  188332. "adcs r4, %[r]\n\t"
  188333. #else
  188334. "adc r4, %[r]\n\t"
  188335. #endif
  188336. "# A[13] * A[5]\n\t"
  188337. "mov %[a], r9\n\t"
  188338. "ldr r7, [%[a], #20]\n\t"
  188339. "mov %[a], r11\n\t"
  188340. "uxth r5, %[a]\n\t"
  188341. "uxth r6, r7\n\t"
  188342. #ifdef WOLFSSL_KEIL
  188343. "muls r6, r5, r6\n\t"
  188344. #elif defined(__clang__)
  188345. "muls r6, r5\n\t"
  188346. #else
  188347. "mul r6, r5\n\t"
  188348. #endif
  188349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188350. "adds r2, r2, r6\n\t"
  188351. #else
  188352. "add r2, r2, r6\n\t"
  188353. #endif
  188354. #ifdef WOLFSSL_KEIL
  188355. "adcs r3, r3, %[r]\n\t"
  188356. #elif defined(__clang__)
  188357. "adcs r3, %[r]\n\t"
  188358. #else
  188359. "adc r3, %[r]\n\t"
  188360. #endif
  188361. #ifdef WOLFSSL_KEIL
  188362. "adcs r4, r4, %[r]\n\t"
  188363. #elif defined(__clang__)
  188364. "adcs r4, %[r]\n\t"
  188365. #else
  188366. "adc r4, %[r]\n\t"
  188367. #endif
  188368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188369. "adds r2, r2, r6\n\t"
  188370. #else
  188371. "add r2, r2, r6\n\t"
  188372. #endif
  188373. #ifdef WOLFSSL_KEIL
  188374. "adcs r3, r3, %[r]\n\t"
  188375. #elif defined(__clang__)
  188376. "adcs r3, %[r]\n\t"
  188377. #else
  188378. "adc r3, %[r]\n\t"
  188379. #endif
  188380. #ifdef WOLFSSL_KEIL
  188381. "adcs r4, r4, %[r]\n\t"
  188382. #elif defined(__clang__)
  188383. "adcs r4, %[r]\n\t"
  188384. #else
  188385. "adc r4, %[r]\n\t"
  188386. #endif
  188387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188388. "lsrs r6, r7, #16\n\t"
  188389. #else
  188390. "lsr r6, r7, #16\n\t"
  188391. #endif
  188392. #ifdef WOLFSSL_KEIL
  188393. "muls r5, r6, r5\n\t"
  188394. #elif defined(__clang__)
  188395. "muls r5, r6\n\t"
  188396. #else
  188397. "mul r5, r6\n\t"
  188398. #endif
  188399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188400. "lsrs r6, r5, #16\n\t"
  188401. #else
  188402. "lsr r6, r5, #16\n\t"
  188403. #endif
  188404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188405. "lsls r5, r5, #16\n\t"
  188406. #else
  188407. "lsl r5, r5, #16\n\t"
  188408. #endif
  188409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188410. "adds r2, r2, r5\n\t"
  188411. #else
  188412. "add r2, r2, r5\n\t"
  188413. #endif
  188414. #ifdef WOLFSSL_KEIL
  188415. "adcs r3, r3, r6\n\t"
  188416. #elif defined(__clang__)
  188417. "adcs r3, r6\n\t"
  188418. #else
  188419. "adc r3, r6\n\t"
  188420. #endif
  188421. #ifdef WOLFSSL_KEIL
  188422. "adcs r4, r4, %[r]\n\t"
  188423. #elif defined(__clang__)
  188424. "adcs r4, %[r]\n\t"
  188425. #else
  188426. "adc r4, %[r]\n\t"
  188427. #endif
  188428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188429. "adds r2, r2, r5\n\t"
  188430. #else
  188431. "add r2, r2, r5\n\t"
  188432. #endif
  188433. #ifdef WOLFSSL_KEIL
  188434. "adcs r3, r3, r6\n\t"
  188435. #elif defined(__clang__)
  188436. "adcs r3, r6\n\t"
  188437. #else
  188438. "adc r3, r6\n\t"
  188439. #endif
  188440. #ifdef WOLFSSL_KEIL
  188441. "adcs r4, r4, %[r]\n\t"
  188442. #elif defined(__clang__)
  188443. "adcs r4, %[r]\n\t"
  188444. #else
  188445. "adc r4, %[r]\n\t"
  188446. #endif
  188447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188448. "lsrs r5, %[a], #16\n\t"
  188449. #else
  188450. "lsr r5, %[a], #16\n\t"
  188451. #endif
  188452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188453. "lsrs r6, r7, #16\n\t"
  188454. #else
  188455. "lsr r6, r7, #16\n\t"
  188456. #endif
  188457. #ifdef WOLFSSL_KEIL
  188458. "muls r6, r5, r6\n\t"
  188459. #elif defined(__clang__)
  188460. "muls r6, r5\n\t"
  188461. #else
  188462. "mul r6, r5\n\t"
  188463. #endif
  188464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188465. "adds r3, r3, r6\n\t"
  188466. #else
  188467. "add r3, r3, r6\n\t"
  188468. #endif
  188469. #ifdef WOLFSSL_KEIL
  188470. "adcs r4, r4, %[r]\n\t"
  188471. #elif defined(__clang__)
  188472. "adcs r4, %[r]\n\t"
  188473. #else
  188474. "adc r4, %[r]\n\t"
  188475. #endif
  188476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188477. "adds r3, r3, r6\n\t"
  188478. #else
  188479. "add r3, r3, r6\n\t"
  188480. #endif
  188481. #ifdef WOLFSSL_KEIL
  188482. "adcs r4, r4, %[r]\n\t"
  188483. #elif defined(__clang__)
  188484. "adcs r4, %[r]\n\t"
  188485. #else
  188486. "adc r4, %[r]\n\t"
  188487. #endif
  188488. "uxth r6, r7\n\t"
  188489. #ifdef WOLFSSL_KEIL
  188490. "muls r5, r6, r5\n\t"
  188491. #elif defined(__clang__)
  188492. "muls r5, r6\n\t"
  188493. #else
  188494. "mul r5, r6\n\t"
  188495. #endif
  188496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188497. "lsrs r6, r5, #16\n\t"
  188498. #else
  188499. "lsr r6, r5, #16\n\t"
  188500. #endif
  188501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188502. "lsls r5, r5, #16\n\t"
  188503. #else
  188504. "lsl r5, r5, #16\n\t"
  188505. #endif
  188506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188507. "adds r2, r2, r5\n\t"
  188508. #else
  188509. "add r2, r2, r5\n\t"
  188510. #endif
  188511. #ifdef WOLFSSL_KEIL
  188512. "adcs r3, r3, r6\n\t"
  188513. #elif defined(__clang__)
  188514. "adcs r3, r6\n\t"
  188515. #else
  188516. "adc r3, r6\n\t"
  188517. #endif
  188518. #ifdef WOLFSSL_KEIL
  188519. "adcs r4, r4, %[r]\n\t"
  188520. #elif defined(__clang__)
  188521. "adcs r4, %[r]\n\t"
  188522. #else
  188523. "adc r4, %[r]\n\t"
  188524. #endif
  188525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188526. "adds r2, r2, r5\n\t"
  188527. #else
  188528. "add r2, r2, r5\n\t"
  188529. #endif
  188530. #ifdef WOLFSSL_KEIL
  188531. "adcs r3, r3, r6\n\t"
  188532. #elif defined(__clang__)
  188533. "adcs r3, r6\n\t"
  188534. #else
  188535. "adc r3, r6\n\t"
  188536. #endif
  188537. #ifdef WOLFSSL_KEIL
  188538. "adcs r4, r4, %[r]\n\t"
  188539. #elif defined(__clang__)
  188540. "adcs r4, %[r]\n\t"
  188541. #else
  188542. "adc r4, %[r]\n\t"
  188543. #endif
  188544. "# A[12] * A[6]\n\t"
  188545. "mov %[a], r9\n\t"
  188546. "ldr r7, [%[a], #24]\n\t"
  188547. "mov %[a], r10\n\t"
  188548. "uxth r5, %[a]\n\t"
  188549. "uxth r6, r7\n\t"
  188550. #ifdef WOLFSSL_KEIL
  188551. "muls r6, r5, r6\n\t"
  188552. #elif defined(__clang__)
  188553. "muls r6, r5\n\t"
  188554. #else
  188555. "mul r6, r5\n\t"
  188556. #endif
  188557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188558. "adds r2, r2, r6\n\t"
  188559. #else
  188560. "add r2, r2, r6\n\t"
  188561. #endif
  188562. #ifdef WOLFSSL_KEIL
  188563. "adcs r3, r3, %[r]\n\t"
  188564. #elif defined(__clang__)
  188565. "adcs r3, %[r]\n\t"
  188566. #else
  188567. "adc r3, %[r]\n\t"
  188568. #endif
  188569. #ifdef WOLFSSL_KEIL
  188570. "adcs r4, r4, %[r]\n\t"
  188571. #elif defined(__clang__)
  188572. "adcs r4, %[r]\n\t"
  188573. #else
  188574. "adc r4, %[r]\n\t"
  188575. #endif
  188576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188577. "adds r2, r2, r6\n\t"
  188578. #else
  188579. "add r2, r2, r6\n\t"
  188580. #endif
  188581. #ifdef WOLFSSL_KEIL
  188582. "adcs r3, r3, %[r]\n\t"
  188583. #elif defined(__clang__)
  188584. "adcs r3, %[r]\n\t"
  188585. #else
  188586. "adc r3, %[r]\n\t"
  188587. #endif
  188588. #ifdef WOLFSSL_KEIL
  188589. "adcs r4, r4, %[r]\n\t"
  188590. #elif defined(__clang__)
  188591. "adcs r4, %[r]\n\t"
  188592. #else
  188593. "adc r4, %[r]\n\t"
  188594. #endif
  188595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188596. "lsrs r6, r7, #16\n\t"
  188597. #else
  188598. "lsr r6, r7, #16\n\t"
  188599. #endif
  188600. #ifdef WOLFSSL_KEIL
  188601. "muls r5, r6, r5\n\t"
  188602. #elif defined(__clang__)
  188603. "muls r5, r6\n\t"
  188604. #else
  188605. "mul r5, r6\n\t"
  188606. #endif
  188607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188608. "lsrs r6, r5, #16\n\t"
  188609. #else
  188610. "lsr r6, r5, #16\n\t"
  188611. #endif
  188612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188613. "lsls r5, r5, #16\n\t"
  188614. #else
  188615. "lsl r5, r5, #16\n\t"
  188616. #endif
  188617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188618. "adds r2, r2, r5\n\t"
  188619. #else
  188620. "add r2, r2, r5\n\t"
  188621. #endif
  188622. #ifdef WOLFSSL_KEIL
  188623. "adcs r3, r3, r6\n\t"
  188624. #elif defined(__clang__)
  188625. "adcs r3, r6\n\t"
  188626. #else
  188627. "adc r3, r6\n\t"
  188628. #endif
  188629. #ifdef WOLFSSL_KEIL
  188630. "adcs r4, r4, %[r]\n\t"
  188631. #elif defined(__clang__)
  188632. "adcs r4, %[r]\n\t"
  188633. #else
  188634. "adc r4, %[r]\n\t"
  188635. #endif
  188636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188637. "adds r2, r2, r5\n\t"
  188638. #else
  188639. "add r2, r2, r5\n\t"
  188640. #endif
  188641. #ifdef WOLFSSL_KEIL
  188642. "adcs r3, r3, r6\n\t"
  188643. #elif defined(__clang__)
  188644. "adcs r3, r6\n\t"
  188645. #else
  188646. "adc r3, r6\n\t"
  188647. #endif
  188648. #ifdef WOLFSSL_KEIL
  188649. "adcs r4, r4, %[r]\n\t"
  188650. #elif defined(__clang__)
  188651. "adcs r4, %[r]\n\t"
  188652. #else
  188653. "adc r4, %[r]\n\t"
  188654. #endif
  188655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188656. "lsrs r5, %[a], #16\n\t"
  188657. #else
  188658. "lsr r5, %[a], #16\n\t"
  188659. #endif
  188660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188661. "lsrs r6, r7, #16\n\t"
  188662. #else
  188663. "lsr r6, r7, #16\n\t"
  188664. #endif
  188665. #ifdef WOLFSSL_KEIL
  188666. "muls r6, r5, r6\n\t"
  188667. #elif defined(__clang__)
  188668. "muls r6, r5\n\t"
  188669. #else
  188670. "mul r6, r5\n\t"
  188671. #endif
  188672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188673. "adds r3, r3, r6\n\t"
  188674. #else
  188675. "add r3, r3, r6\n\t"
  188676. #endif
  188677. #ifdef WOLFSSL_KEIL
  188678. "adcs r4, r4, %[r]\n\t"
  188679. #elif defined(__clang__)
  188680. "adcs r4, %[r]\n\t"
  188681. #else
  188682. "adc r4, %[r]\n\t"
  188683. #endif
  188684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188685. "adds r3, r3, r6\n\t"
  188686. #else
  188687. "add r3, r3, r6\n\t"
  188688. #endif
  188689. #ifdef WOLFSSL_KEIL
  188690. "adcs r4, r4, %[r]\n\t"
  188691. #elif defined(__clang__)
  188692. "adcs r4, %[r]\n\t"
  188693. #else
  188694. "adc r4, %[r]\n\t"
  188695. #endif
  188696. "uxth r6, r7\n\t"
  188697. #ifdef WOLFSSL_KEIL
  188698. "muls r5, r6, r5\n\t"
  188699. #elif defined(__clang__)
  188700. "muls r5, r6\n\t"
  188701. #else
  188702. "mul r5, r6\n\t"
  188703. #endif
  188704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188705. "lsrs r6, r5, #16\n\t"
  188706. #else
  188707. "lsr r6, r5, #16\n\t"
  188708. #endif
  188709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188710. "lsls r5, r5, #16\n\t"
  188711. #else
  188712. "lsl r5, r5, #16\n\t"
  188713. #endif
  188714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188715. "adds r2, r2, r5\n\t"
  188716. #else
  188717. "add r2, r2, r5\n\t"
  188718. #endif
  188719. #ifdef WOLFSSL_KEIL
  188720. "adcs r3, r3, r6\n\t"
  188721. #elif defined(__clang__)
  188722. "adcs r3, r6\n\t"
  188723. #else
  188724. "adc r3, r6\n\t"
  188725. #endif
  188726. #ifdef WOLFSSL_KEIL
  188727. "adcs r4, r4, %[r]\n\t"
  188728. #elif defined(__clang__)
  188729. "adcs r4, %[r]\n\t"
  188730. #else
  188731. "adc r4, %[r]\n\t"
  188732. #endif
  188733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188734. "adds r2, r2, r5\n\t"
  188735. #else
  188736. "add r2, r2, r5\n\t"
  188737. #endif
  188738. #ifdef WOLFSSL_KEIL
  188739. "adcs r3, r3, r6\n\t"
  188740. #elif defined(__clang__)
  188741. "adcs r3, r6\n\t"
  188742. #else
  188743. "adc r3, r6\n\t"
  188744. #endif
  188745. #ifdef WOLFSSL_KEIL
  188746. "adcs r4, r4, %[r]\n\t"
  188747. #elif defined(__clang__)
  188748. "adcs r4, %[r]\n\t"
  188749. #else
  188750. "adc r4, %[r]\n\t"
  188751. #endif
  188752. "# A[11] * A[7]\n\t"
  188753. "mov %[a], r9\n\t"
  188754. "ldr r7, [%[a], #28]\n\t"
  188755. "ldr %[a], [%[a], #44]\n\t"
  188756. "uxth r5, %[a]\n\t"
  188757. "uxth r6, r7\n\t"
  188758. #ifdef WOLFSSL_KEIL
  188759. "muls r6, r5, r6\n\t"
  188760. #elif defined(__clang__)
  188761. "muls r6, r5\n\t"
  188762. #else
  188763. "mul r6, r5\n\t"
  188764. #endif
  188765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188766. "adds r2, r2, r6\n\t"
  188767. #else
  188768. "add r2, r2, r6\n\t"
  188769. #endif
  188770. #ifdef WOLFSSL_KEIL
  188771. "adcs r3, r3, %[r]\n\t"
  188772. #elif defined(__clang__)
  188773. "adcs r3, %[r]\n\t"
  188774. #else
  188775. "adc r3, %[r]\n\t"
  188776. #endif
  188777. #ifdef WOLFSSL_KEIL
  188778. "adcs r4, r4, %[r]\n\t"
  188779. #elif defined(__clang__)
  188780. "adcs r4, %[r]\n\t"
  188781. #else
  188782. "adc r4, %[r]\n\t"
  188783. #endif
  188784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188785. "adds r2, r2, r6\n\t"
  188786. #else
  188787. "add r2, r2, r6\n\t"
  188788. #endif
  188789. #ifdef WOLFSSL_KEIL
  188790. "adcs r3, r3, %[r]\n\t"
  188791. #elif defined(__clang__)
  188792. "adcs r3, %[r]\n\t"
  188793. #else
  188794. "adc r3, %[r]\n\t"
  188795. #endif
  188796. #ifdef WOLFSSL_KEIL
  188797. "adcs r4, r4, %[r]\n\t"
  188798. #elif defined(__clang__)
  188799. "adcs r4, %[r]\n\t"
  188800. #else
  188801. "adc r4, %[r]\n\t"
  188802. #endif
  188803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188804. "lsrs r6, r7, #16\n\t"
  188805. #else
  188806. "lsr r6, r7, #16\n\t"
  188807. #endif
  188808. #ifdef WOLFSSL_KEIL
  188809. "muls r5, r6, r5\n\t"
  188810. #elif defined(__clang__)
  188811. "muls r5, r6\n\t"
  188812. #else
  188813. "mul r5, r6\n\t"
  188814. #endif
  188815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188816. "lsrs r6, r5, #16\n\t"
  188817. #else
  188818. "lsr r6, r5, #16\n\t"
  188819. #endif
  188820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188821. "lsls r5, r5, #16\n\t"
  188822. #else
  188823. "lsl r5, r5, #16\n\t"
  188824. #endif
  188825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188826. "adds r2, r2, r5\n\t"
  188827. #else
  188828. "add r2, r2, r5\n\t"
  188829. #endif
  188830. #ifdef WOLFSSL_KEIL
  188831. "adcs r3, r3, r6\n\t"
  188832. #elif defined(__clang__)
  188833. "adcs r3, r6\n\t"
  188834. #else
  188835. "adc r3, r6\n\t"
  188836. #endif
  188837. #ifdef WOLFSSL_KEIL
  188838. "adcs r4, r4, %[r]\n\t"
  188839. #elif defined(__clang__)
  188840. "adcs r4, %[r]\n\t"
  188841. #else
  188842. "adc r4, %[r]\n\t"
  188843. #endif
  188844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188845. "adds r2, r2, r5\n\t"
  188846. #else
  188847. "add r2, r2, r5\n\t"
  188848. #endif
  188849. #ifdef WOLFSSL_KEIL
  188850. "adcs r3, r3, r6\n\t"
  188851. #elif defined(__clang__)
  188852. "adcs r3, r6\n\t"
  188853. #else
  188854. "adc r3, r6\n\t"
  188855. #endif
  188856. #ifdef WOLFSSL_KEIL
  188857. "adcs r4, r4, %[r]\n\t"
  188858. #elif defined(__clang__)
  188859. "adcs r4, %[r]\n\t"
  188860. #else
  188861. "adc r4, %[r]\n\t"
  188862. #endif
  188863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188864. "lsrs r5, %[a], #16\n\t"
  188865. #else
  188866. "lsr r5, %[a], #16\n\t"
  188867. #endif
  188868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188869. "lsrs r6, r7, #16\n\t"
  188870. #else
  188871. "lsr r6, r7, #16\n\t"
  188872. #endif
  188873. #ifdef WOLFSSL_KEIL
  188874. "muls r6, r5, r6\n\t"
  188875. #elif defined(__clang__)
  188876. "muls r6, r5\n\t"
  188877. #else
  188878. "mul r6, r5\n\t"
  188879. #endif
  188880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188881. "adds r3, r3, r6\n\t"
  188882. #else
  188883. "add r3, r3, r6\n\t"
  188884. #endif
  188885. #ifdef WOLFSSL_KEIL
  188886. "adcs r4, r4, %[r]\n\t"
  188887. #elif defined(__clang__)
  188888. "adcs r4, %[r]\n\t"
  188889. #else
  188890. "adc r4, %[r]\n\t"
  188891. #endif
  188892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188893. "adds r3, r3, r6\n\t"
  188894. #else
  188895. "add r3, r3, r6\n\t"
  188896. #endif
  188897. #ifdef WOLFSSL_KEIL
  188898. "adcs r4, r4, %[r]\n\t"
  188899. #elif defined(__clang__)
  188900. "adcs r4, %[r]\n\t"
  188901. #else
  188902. "adc r4, %[r]\n\t"
  188903. #endif
  188904. "uxth r6, r7\n\t"
  188905. #ifdef WOLFSSL_KEIL
  188906. "muls r5, r6, r5\n\t"
  188907. #elif defined(__clang__)
  188908. "muls r5, r6\n\t"
  188909. #else
  188910. "mul r5, r6\n\t"
  188911. #endif
  188912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188913. "lsrs r6, r5, #16\n\t"
  188914. #else
  188915. "lsr r6, r5, #16\n\t"
  188916. #endif
  188917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188918. "lsls r5, r5, #16\n\t"
  188919. #else
  188920. "lsl r5, r5, #16\n\t"
  188921. #endif
  188922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188923. "adds r2, r2, r5\n\t"
  188924. #else
  188925. "add r2, r2, r5\n\t"
  188926. #endif
  188927. #ifdef WOLFSSL_KEIL
  188928. "adcs r3, r3, r6\n\t"
  188929. #elif defined(__clang__)
  188930. "adcs r3, r6\n\t"
  188931. #else
  188932. "adc r3, r6\n\t"
  188933. #endif
  188934. #ifdef WOLFSSL_KEIL
  188935. "adcs r4, r4, %[r]\n\t"
  188936. #elif defined(__clang__)
  188937. "adcs r4, %[r]\n\t"
  188938. #else
  188939. "adc r4, %[r]\n\t"
  188940. #endif
  188941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188942. "adds r2, r2, r5\n\t"
  188943. #else
  188944. "add r2, r2, r5\n\t"
  188945. #endif
  188946. #ifdef WOLFSSL_KEIL
  188947. "adcs r3, r3, r6\n\t"
  188948. #elif defined(__clang__)
  188949. "adcs r3, r6\n\t"
  188950. #else
  188951. "adc r3, r6\n\t"
  188952. #endif
  188953. #ifdef WOLFSSL_KEIL
  188954. "adcs r4, r4, %[r]\n\t"
  188955. #elif defined(__clang__)
  188956. "adcs r4, %[r]\n\t"
  188957. #else
  188958. "adc r4, %[r]\n\t"
  188959. #endif
  188960. "# A[10] * A[8]\n\t"
  188961. "mov %[a], r9\n\t"
  188962. "ldr r7, [%[a], #32]\n\t"
  188963. "ldr %[a], [%[a], #40]\n\t"
  188964. "uxth r5, %[a]\n\t"
  188965. "uxth r6, r7\n\t"
  188966. #ifdef WOLFSSL_KEIL
  188967. "muls r6, r5, r6\n\t"
  188968. #elif defined(__clang__)
  188969. "muls r6, r5\n\t"
  188970. #else
  188971. "mul r6, r5\n\t"
  188972. #endif
  188973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188974. "adds r2, r2, r6\n\t"
  188975. #else
  188976. "add r2, r2, r6\n\t"
  188977. #endif
  188978. #ifdef WOLFSSL_KEIL
  188979. "adcs r3, r3, %[r]\n\t"
  188980. #elif defined(__clang__)
  188981. "adcs r3, %[r]\n\t"
  188982. #else
  188983. "adc r3, %[r]\n\t"
  188984. #endif
  188985. #ifdef WOLFSSL_KEIL
  188986. "adcs r4, r4, %[r]\n\t"
  188987. #elif defined(__clang__)
  188988. "adcs r4, %[r]\n\t"
  188989. #else
  188990. "adc r4, %[r]\n\t"
  188991. #endif
  188992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188993. "adds r2, r2, r6\n\t"
  188994. #else
  188995. "add r2, r2, r6\n\t"
  188996. #endif
  188997. #ifdef WOLFSSL_KEIL
  188998. "adcs r3, r3, %[r]\n\t"
  188999. #elif defined(__clang__)
  189000. "adcs r3, %[r]\n\t"
  189001. #else
  189002. "adc r3, %[r]\n\t"
  189003. #endif
  189004. #ifdef WOLFSSL_KEIL
  189005. "adcs r4, r4, %[r]\n\t"
  189006. #elif defined(__clang__)
  189007. "adcs r4, %[r]\n\t"
  189008. #else
  189009. "adc r4, %[r]\n\t"
  189010. #endif
  189011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189012. "lsrs r6, r7, #16\n\t"
  189013. #else
  189014. "lsr r6, r7, #16\n\t"
  189015. #endif
  189016. #ifdef WOLFSSL_KEIL
  189017. "muls r5, r6, r5\n\t"
  189018. #elif defined(__clang__)
  189019. "muls r5, r6\n\t"
  189020. #else
  189021. "mul r5, r6\n\t"
  189022. #endif
  189023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189024. "lsrs r6, r5, #16\n\t"
  189025. #else
  189026. "lsr r6, r5, #16\n\t"
  189027. #endif
  189028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189029. "lsls r5, r5, #16\n\t"
  189030. #else
  189031. "lsl r5, r5, #16\n\t"
  189032. #endif
  189033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189034. "adds r2, r2, r5\n\t"
  189035. #else
  189036. "add r2, r2, r5\n\t"
  189037. #endif
  189038. #ifdef WOLFSSL_KEIL
  189039. "adcs r3, r3, r6\n\t"
  189040. #elif defined(__clang__)
  189041. "adcs r3, r6\n\t"
  189042. #else
  189043. "adc r3, r6\n\t"
  189044. #endif
  189045. #ifdef WOLFSSL_KEIL
  189046. "adcs r4, r4, %[r]\n\t"
  189047. #elif defined(__clang__)
  189048. "adcs r4, %[r]\n\t"
  189049. #else
  189050. "adc r4, %[r]\n\t"
  189051. #endif
  189052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189053. "adds r2, r2, r5\n\t"
  189054. #else
  189055. "add r2, r2, r5\n\t"
  189056. #endif
  189057. #ifdef WOLFSSL_KEIL
  189058. "adcs r3, r3, r6\n\t"
  189059. #elif defined(__clang__)
  189060. "adcs r3, r6\n\t"
  189061. #else
  189062. "adc r3, r6\n\t"
  189063. #endif
  189064. #ifdef WOLFSSL_KEIL
  189065. "adcs r4, r4, %[r]\n\t"
  189066. #elif defined(__clang__)
  189067. "adcs r4, %[r]\n\t"
  189068. #else
  189069. "adc r4, %[r]\n\t"
  189070. #endif
  189071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189072. "lsrs r5, %[a], #16\n\t"
  189073. #else
  189074. "lsr r5, %[a], #16\n\t"
  189075. #endif
  189076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189077. "lsrs r6, r7, #16\n\t"
  189078. #else
  189079. "lsr r6, r7, #16\n\t"
  189080. #endif
  189081. #ifdef WOLFSSL_KEIL
  189082. "muls r6, r5, r6\n\t"
  189083. #elif defined(__clang__)
  189084. "muls r6, r5\n\t"
  189085. #else
  189086. "mul r6, r5\n\t"
  189087. #endif
  189088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189089. "adds r3, r3, r6\n\t"
  189090. #else
  189091. "add r3, r3, r6\n\t"
  189092. #endif
  189093. #ifdef WOLFSSL_KEIL
  189094. "adcs r4, r4, %[r]\n\t"
  189095. #elif defined(__clang__)
  189096. "adcs r4, %[r]\n\t"
  189097. #else
  189098. "adc r4, %[r]\n\t"
  189099. #endif
  189100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189101. "adds r3, r3, r6\n\t"
  189102. #else
  189103. "add r3, r3, r6\n\t"
  189104. #endif
  189105. #ifdef WOLFSSL_KEIL
  189106. "adcs r4, r4, %[r]\n\t"
  189107. #elif defined(__clang__)
  189108. "adcs r4, %[r]\n\t"
  189109. #else
  189110. "adc r4, %[r]\n\t"
  189111. #endif
  189112. "uxth r6, r7\n\t"
  189113. #ifdef WOLFSSL_KEIL
  189114. "muls r5, r6, r5\n\t"
  189115. #elif defined(__clang__)
  189116. "muls r5, r6\n\t"
  189117. #else
  189118. "mul r5, r6\n\t"
  189119. #endif
  189120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189121. "lsrs r6, r5, #16\n\t"
  189122. #else
  189123. "lsr r6, r5, #16\n\t"
  189124. #endif
  189125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189126. "lsls r5, r5, #16\n\t"
  189127. #else
  189128. "lsl r5, r5, #16\n\t"
  189129. #endif
  189130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189131. "adds r2, r2, r5\n\t"
  189132. #else
  189133. "add r2, r2, r5\n\t"
  189134. #endif
  189135. #ifdef WOLFSSL_KEIL
  189136. "adcs r3, r3, r6\n\t"
  189137. #elif defined(__clang__)
  189138. "adcs r3, r6\n\t"
  189139. #else
  189140. "adc r3, r6\n\t"
  189141. #endif
  189142. #ifdef WOLFSSL_KEIL
  189143. "adcs r4, r4, %[r]\n\t"
  189144. #elif defined(__clang__)
  189145. "adcs r4, %[r]\n\t"
  189146. #else
  189147. "adc r4, %[r]\n\t"
  189148. #endif
  189149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189150. "adds r2, r2, r5\n\t"
  189151. #else
  189152. "add r2, r2, r5\n\t"
  189153. #endif
  189154. #ifdef WOLFSSL_KEIL
  189155. "adcs r3, r3, r6\n\t"
  189156. #elif defined(__clang__)
  189157. "adcs r3, r6\n\t"
  189158. #else
  189159. "adc r3, r6\n\t"
  189160. #endif
  189161. #ifdef WOLFSSL_KEIL
  189162. "adcs r4, r4, %[r]\n\t"
  189163. #elif defined(__clang__)
  189164. "adcs r4, %[r]\n\t"
  189165. #else
  189166. "adc r4, %[r]\n\t"
  189167. #endif
  189168. "# A[9] * A[9]\n\t"
  189169. "mov %[a], r9\n\t"
  189170. "ldr r7, [%[a], #36]\n\t"
  189171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189172. "lsrs r6, r7, #16\n\t"
  189173. #else
  189174. "lsr r6, r7, #16\n\t"
  189175. #endif
  189176. "uxth r5, r7\n\t"
  189177. #ifdef WOLFSSL_KEIL
  189178. "muls r5, r5, r5\n\t"
  189179. #elif defined(__clang__)
  189180. "muls r5, r5\n\t"
  189181. #else
  189182. "mul r5, r5\n\t"
  189183. #endif
  189184. #ifdef WOLFSSL_KEIL
  189185. "muls r6, r6, r6\n\t"
  189186. #elif defined(__clang__)
  189187. "muls r6, r6\n\t"
  189188. #else
  189189. "mul r6, r6\n\t"
  189190. #endif
  189191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189192. "adds r2, r2, r5\n\t"
  189193. #else
  189194. "add r2, r2, r5\n\t"
  189195. #endif
  189196. #ifdef WOLFSSL_KEIL
  189197. "adcs r3, r3, r6\n\t"
  189198. #elif defined(__clang__)
  189199. "adcs r3, r6\n\t"
  189200. #else
  189201. "adc r3, r6\n\t"
  189202. #endif
  189203. #ifdef WOLFSSL_KEIL
  189204. "adcs r4, r4, %[r]\n\t"
  189205. #elif defined(__clang__)
  189206. "adcs r4, %[r]\n\t"
  189207. #else
  189208. "adc r4, %[r]\n\t"
  189209. #endif
  189210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189211. "lsrs r6, r7, #16\n\t"
  189212. #else
  189213. "lsr r6, r7, #16\n\t"
  189214. #endif
  189215. "uxth r5, r7\n\t"
  189216. #ifdef WOLFSSL_KEIL
  189217. "muls r5, r6, r5\n\t"
  189218. #elif defined(__clang__)
  189219. "muls r5, r6\n\t"
  189220. #else
  189221. "mul r5, r6\n\t"
  189222. #endif
  189223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189224. "lsrs r6, r5, #15\n\t"
  189225. #else
  189226. "lsr r6, r5, #15\n\t"
  189227. #endif
  189228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189229. "lsls r5, r5, #17\n\t"
  189230. #else
  189231. "lsl r5, r5, #17\n\t"
  189232. #endif
  189233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189234. "adds r2, r2, r5\n\t"
  189235. #else
  189236. "add r2, r2, r5\n\t"
  189237. #endif
  189238. #ifdef WOLFSSL_KEIL
  189239. "adcs r3, r3, r6\n\t"
  189240. #elif defined(__clang__)
  189241. "adcs r3, r6\n\t"
  189242. #else
  189243. "adc r3, r6\n\t"
  189244. #endif
  189245. #ifdef WOLFSSL_KEIL
  189246. "adcs r4, r4, %[r]\n\t"
  189247. #elif defined(__clang__)
  189248. "adcs r4, %[r]\n\t"
  189249. #else
  189250. "adc r4, %[r]\n\t"
  189251. #endif
  189252. "mov %[r], r8\n\t"
  189253. "str r2, [%[r], #72]\n\t"
  189254. "movs %[r], #0\n\t"
  189255. "# A[10] * A[9]\n\t"
  189256. "movs r2, #0\n\t"
  189257. "ldr %[a], [%[a], #40]\n\t"
  189258. "uxth r5, %[a]\n\t"
  189259. "uxth r6, r7\n\t"
  189260. #ifdef WOLFSSL_KEIL
  189261. "muls r6, r5, r6\n\t"
  189262. #elif defined(__clang__)
  189263. "muls r6, r5\n\t"
  189264. #else
  189265. "mul r6, r5\n\t"
  189266. #endif
  189267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189268. "adds r3, r3, r6\n\t"
  189269. #else
  189270. "add r3, r3, r6\n\t"
  189271. #endif
  189272. #ifdef WOLFSSL_KEIL
  189273. "adcs r4, r4, %[r]\n\t"
  189274. #elif defined(__clang__)
  189275. "adcs r4, %[r]\n\t"
  189276. #else
  189277. "adc r4, %[r]\n\t"
  189278. #endif
  189279. #ifdef WOLFSSL_KEIL
  189280. "adcs r2, r2, %[r]\n\t"
  189281. #elif defined(__clang__)
  189282. "adcs r2, %[r]\n\t"
  189283. #else
  189284. "adc r2, %[r]\n\t"
  189285. #endif
  189286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189287. "adds r3, r3, r6\n\t"
  189288. #else
  189289. "add r3, r3, r6\n\t"
  189290. #endif
  189291. #ifdef WOLFSSL_KEIL
  189292. "adcs r4, r4, %[r]\n\t"
  189293. #elif defined(__clang__)
  189294. "adcs r4, %[r]\n\t"
  189295. #else
  189296. "adc r4, %[r]\n\t"
  189297. #endif
  189298. #ifdef WOLFSSL_KEIL
  189299. "adcs r2, r2, %[r]\n\t"
  189300. #elif defined(__clang__)
  189301. "adcs r2, %[r]\n\t"
  189302. #else
  189303. "adc r2, %[r]\n\t"
  189304. #endif
  189305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189306. "lsrs r6, r7, #16\n\t"
  189307. #else
  189308. "lsr r6, r7, #16\n\t"
  189309. #endif
  189310. #ifdef WOLFSSL_KEIL
  189311. "muls r5, r6, r5\n\t"
  189312. #elif defined(__clang__)
  189313. "muls r5, r6\n\t"
  189314. #else
  189315. "mul r5, r6\n\t"
  189316. #endif
  189317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189318. "lsrs r6, r5, #16\n\t"
  189319. #else
  189320. "lsr r6, r5, #16\n\t"
  189321. #endif
  189322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189323. "lsls r5, r5, #16\n\t"
  189324. #else
  189325. "lsl r5, r5, #16\n\t"
  189326. #endif
  189327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189328. "adds r3, r3, r5\n\t"
  189329. #else
  189330. "add r3, r3, r5\n\t"
  189331. #endif
  189332. #ifdef WOLFSSL_KEIL
  189333. "adcs r4, r4, r6\n\t"
  189334. #elif defined(__clang__)
  189335. "adcs r4, r6\n\t"
  189336. #else
  189337. "adc r4, r6\n\t"
  189338. #endif
  189339. #ifdef WOLFSSL_KEIL
  189340. "adcs r2, r2, %[r]\n\t"
  189341. #elif defined(__clang__)
  189342. "adcs r2, %[r]\n\t"
  189343. #else
  189344. "adc r2, %[r]\n\t"
  189345. #endif
  189346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189347. "adds r3, r3, r5\n\t"
  189348. #else
  189349. "add r3, r3, r5\n\t"
  189350. #endif
  189351. #ifdef WOLFSSL_KEIL
  189352. "adcs r4, r4, r6\n\t"
  189353. #elif defined(__clang__)
  189354. "adcs r4, r6\n\t"
  189355. #else
  189356. "adc r4, r6\n\t"
  189357. #endif
  189358. #ifdef WOLFSSL_KEIL
  189359. "adcs r2, r2, %[r]\n\t"
  189360. #elif defined(__clang__)
  189361. "adcs r2, %[r]\n\t"
  189362. #else
  189363. "adc r2, %[r]\n\t"
  189364. #endif
  189365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189366. "lsrs r5, %[a], #16\n\t"
  189367. #else
  189368. "lsr r5, %[a], #16\n\t"
  189369. #endif
  189370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189371. "lsrs r6, r7, #16\n\t"
  189372. #else
  189373. "lsr r6, r7, #16\n\t"
  189374. #endif
  189375. #ifdef WOLFSSL_KEIL
  189376. "muls r6, r5, r6\n\t"
  189377. #elif defined(__clang__)
  189378. "muls r6, r5\n\t"
  189379. #else
  189380. "mul r6, r5\n\t"
  189381. #endif
  189382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189383. "adds r4, r4, r6\n\t"
  189384. #else
  189385. "add r4, r4, r6\n\t"
  189386. #endif
  189387. #ifdef WOLFSSL_KEIL
  189388. "adcs r2, r2, %[r]\n\t"
  189389. #elif defined(__clang__)
  189390. "adcs r2, %[r]\n\t"
  189391. #else
  189392. "adc r2, %[r]\n\t"
  189393. #endif
  189394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189395. "adds r4, r4, r6\n\t"
  189396. #else
  189397. "add r4, r4, r6\n\t"
  189398. #endif
  189399. #ifdef WOLFSSL_KEIL
  189400. "adcs r2, r2, %[r]\n\t"
  189401. #elif defined(__clang__)
  189402. "adcs r2, %[r]\n\t"
  189403. #else
  189404. "adc r2, %[r]\n\t"
  189405. #endif
  189406. "uxth r6, r7\n\t"
  189407. #ifdef WOLFSSL_KEIL
  189408. "muls r5, r6, r5\n\t"
  189409. #elif defined(__clang__)
  189410. "muls r5, r6\n\t"
  189411. #else
  189412. "mul r5, r6\n\t"
  189413. #endif
  189414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189415. "lsrs r6, r5, #16\n\t"
  189416. #else
  189417. "lsr r6, r5, #16\n\t"
  189418. #endif
  189419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189420. "lsls r5, r5, #16\n\t"
  189421. #else
  189422. "lsl r5, r5, #16\n\t"
  189423. #endif
  189424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189425. "adds r3, r3, r5\n\t"
  189426. #else
  189427. "add r3, r3, r5\n\t"
  189428. #endif
  189429. #ifdef WOLFSSL_KEIL
  189430. "adcs r4, r4, r6\n\t"
  189431. #elif defined(__clang__)
  189432. "adcs r4, r6\n\t"
  189433. #else
  189434. "adc r4, r6\n\t"
  189435. #endif
  189436. #ifdef WOLFSSL_KEIL
  189437. "adcs r2, r2, %[r]\n\t"
  189438. #elif defined(__clang__)
  189439. "adcs r2, %[r]\n\t"
  189440. #else
  189441. "adc r2, %[r]\n\t"
  189442. #endif
  189443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189444. "adds r3, r3, r5\n\t"
  189445. #else
  189446. "add r3, r3, r5\n\t"
  189447. #endif
  189448. #ifdef WOLFSSL_KEIL
  189449. "adcs r4, r4, r6\n\t"
  189450. #elif defined(__clang__)
  189451. "adcs r4, r6\n\t"
  189452. #else
  189453. "adc r4, r6\n\t"
  189454. #endif
  189455. #ifdef WOLFSSL_KEIL
  189456. "adcs r2, r2, %[r]\n\t"
  189457. #elif defined(__clang__)
  189458. "adcs r2, %[r]\n\t"
  189459. #else
  189460. "adc r2, %[r]\n\t"
  189461. #endif
  189462. "# A[11] * A[8]\n\t"
  189463. "mov %[a], r9\n\t"
  189464. "ldr r7, [%[a], #32]\n\t"
  189465. "ldr %[a], [%[a], #44]\n\t"
  189466. "uxth r5, %[a]\n\t"
  189467. "uxth r6, r7\n\t"
  189468. #ifdef WOLFSSL_KEIL
  189469. "muls r6, r5, r6\n\t"
  189470. #elif defined(__clang__)
  189471. "muls r6, r5\n\t"
  189472. #else
  189473. "mul r6, r5\n\t"
  189474. #endif
  189475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189476. "adds r3, r3, r6\n\t"
  189477. #else
  189478. "add r3, r3, r6\n\t"
  189479. #endif
  189480. #ifdef WOLFSSL_KEIL
  189481. "adcs r4, r4, %[r]\n\t"
  189482. #elif defined(__clang__)
  189483. "adcs r4, %[r]\n\t"
  189484. #else
  189485. "adc r4, %[r]\n\t"
  189486. #endif
  189487. #ifdef WOLFSSL_KEIL
  189488. "adcs r2, r2, %[r]\n\t"
  189489. #elif defined(__clang__)
  189490. "adcs r2, %[r]\n\t"
  189491. #else
  189492. "adc r2, %[r]\n\t"
  189493. #endif
  189494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189495. "adds r3, r3, r6\n\t"
  189496. #else
  189497. "add r3, r3, r6\n\t"
  189498. #endif
  189499. #ifdef WOLFSSL_KEIL
  189500. "adcs r4, r4, %[r]\n\t"
  189501. #elif defined(__clang__)
  189502. "adcs r4, %[r]\n\t"
  189503. #else
  189504. "adc r4, %[r]\n\t"
  189505. #endif
  189506. #ifdef WOLFSSL_KEIL
  189507. "adcs r2, r2, %[r]\n\t"
  189508. #elif defined(__clang__)
  189509. "adcs r2, %[r]\n\t"
  189510. #else
  189511. "adc r2, %[r]\n\t"
  189512. #endif
  189513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189514. "lsrs r6, r7, #16\n\t"
  189515. #else
  189516. "lsr r6, r7, #16\n\t"
  189517. #endif
  189518. #ifdef WOLFSSL_KEIL
  189519. "muls r5, r6, r5\n\t"
  189520. #elif defined(__clang__)
  189521. "muls r5, r6\n\t"
  189522. #else
  189523. "mul r5, r6\n\t"
  189524. #endif
  189525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189526. "lsrs r6, r5, #16\n\t"
  189527. #else
  189528. "lsr r6, r5, #16\n\t"
  189529. #endif
  189530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189531. "lsls r5, r5, #16\n\t"
  189532. #else
  189533. "lsl r5, r5, #16\n\t"
  189534. #endif
  189535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189536. "adds r3, r3, r5\n\t"
  189537. #else
  189538. "add r3, r3, r5\n\t"
  189539. #endif
  189540. #ifdef WOLFSSL_KEIL
  189541. "adcs r4, r4, r6\n\t"
  189542. #elif defined(__clang__)
  189543. "adcs r4, r6\n\t"
  189544. #else
  189545. "adc r4, r6\n\t"
  189546. #endif
  189547. #ifdef WOLFSSL_KEIL
  189548. "adcs r2, r2, %[r]\n\t"
  189549. #elif defined(__clang__)
  189550. "adcs r2, %[r]\n\t"
  189551. #else
  189552. "adc r2, %[r]\n\t"
  189553. #endif
  189554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189555. "adds r3, r3, r5\n\t"
  189556. #else
  189557. "add r3, r3, r5\n\t"
  189558. #endif
  189559. #ifdef WOLFSSL_KEIL
  189560. "adcs r4, r4, r6\n\t"
  189561. #elif defined(__clang__)
  189562. "adcs r4, r6\n\t"
  189563. #else
  189564. "adc r4, r6\n\t"
  189565. #endif
  189566. #ifdef WOLFSSL_KEIL
  189567. "adcs r2, r2, %[r]\n\t"
  189568. #elif defined(__clang__)
  189569. "adcs r2, %[r]\n\t"
  189570. #else
  189571. "adc r2, %[r]\n\t"
  189572. #endif
  189573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189574. "lsrs r5, %[a], #16\n\t"
  189575. #else
  189576. "lsr r5, %[a], #16\n\t"
  189577. #endif
  189578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189579. "lsrs r6, r7, #16\n\t"
  189580. #else
  189581. "lsr r6, r7, #16\n\t"
  189582. #endif
  189583. #ifdef WOLFSSL_KEIL
  189584. "muls r6, r5, r6\n\t"
  189585. #elif defined(__clang__)
  189586. "muls r6, r5\n\t"
  189587. #else
  189588. "mul r6, r5\n\t"
  189589. #endif
  189590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189591. "adds r4, r4, r6\n\t"
  189592. #else
  189593. "add r4, r4, r6\n\t"
  189594. #endif
  189595. #ifdef WOLFSSL_KEIL
  189596. "adcs r2, r2, %[r]\n\t"
  189597. #elif defined(__clang__)
  189598. "adcs r2, %[r]\n\t"
  189599. #else
  189600. "adc r2, %[r]\n\t"
  189601. #endif
  189602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189603. "adds r4, r4, r6\n\t"
  189604. #else
  189605. "add r4, r4, r6\n\t"
  189606. #endif
  189607. #ifdef WOLFSSL_KEIL
  189608. "adcs r2, r2, %[r]\n\t"
  189609. #elif defined(__clang__)
  189610. "adcs r2, %[r]\n\t"
  189611. #else
  189612. "adc r2, %[r]\n\t"
  189613. #endif
  189614. "uxth r6, r7\n\t"
  189615. #ifdef WOLFSSL_KEIL
  189616. "muls r5, r6, r5\n\t"
  189617. #elif defined(__clang__)
  189618. "muls r5, r6\n\t"
  189619. #else
  189620. "mul r5, r6\n\t"
  189621. #endif
  189622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189623. "lsrs r6, r5, #16\n\t"
  189624. #else
  189625. "lsr r6, r5, #16\n\t"
  189626. #endif
  189627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189628. "lsls r5, r5, #16\n\t"
  189629. #else
  189630. "lsl r5, r5, #16\n\t"
  189631. #endif
  189632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189633. "adds r3, r3, r5\n\t"
  189634. #else
  189635. "add r3, r3, r5\n\t"
  189636. #endif
  189637. #ifdef WOLFSSL_KEIL
  189638. "adcs r4, r4, r6\n\t"
  189639. #elif defined(__clang__)
  189640. "adcs r4, r6\n\t"
  189641. #else
  189642. "adc r4, r6\n\t"
  189643. #endif
  189644. #ifdef WOLFSSL_KEIL
  189645. "adcs r2, r2, %[r]\n\t"
  189646. #elif defined(__clang__)
  189647. "adcs r2, %[r]\n\t"
  189648. #else
  189649. "adc r2, %[r]\n\t"
  189650. #endif
  189651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189652. "adds r3, r3, r5\n\t"
  189653. #else
  189654. "add r3, r3, r5\n\t"
  189655. #endif
  189656. #ifdef WOLFSSL_KEIL
  189657. "adcs r4, r4, r6\n\t"
  189658. #elif defined(__clang__)
  189659. "adcs r4, r6\n\t"
  189660. #else
  189661. "adc r4, r6\n\t"
  189662. #endif
  189663. #ifdef WOLFSSL_KEIL
  189664. "adcs r2, r2, %[r]\n\t"
  189665. #elif defined(__clang__)
  189666. "adcs r2, %[r]\n\t"
  189667. #else
  189668. "adc r2, %[r]\n\t"
  189669. #endif
  189670. "# A[12] * A[7]\n\t"
  189671. "mov %[a], r9\n\t"
  189672. "ldr r7, [%[a], #28]\n\t"
  189673. "mov %[a], r10\n\t"
  189674. "uxth r5, %[a]\n\t"
  189675. "uxth r6, r7\n\t"
  189676. #ifdef WOLFSSL_KEIL
  189677. "muls r6, r5, r6\n\t"
  189678. #elif defined(__clang__)
  189679. "muls r6, r5\n\t"
  189680. #else
  189681. "mul r6, r5\n\t"
  189682. #endif
  189683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189684. "adds r3, r3, r6\n\t"
  189685. #else
  189686. "add r3, r3, r6\n\t"
  189687. #endif
  189688. #ifdef WOLFSSL_KEIL
  189689. "adcs r4, r4, %[r]\n\t"
  189690. #elif defined(__clang__)
  189691. "adcs r4, %[r]\n\t"
  189692. #else
  189693. "adc r4, %[r]\n\t"
  189694. #endif
  189695. #ifdef WOLFSSL_KEIL
  189696. "adcs r2, r2, %[r]\n\t"
  189697. #elif defined(__clang__)
  189698. "adcs r2, %[r]\n\t"
  189699. #else
  189700. "adc r2, %[r]\n\t"
  189701. #endif
  189702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189703. "adds r3, r3, r6\n\t"
  189704. #else
  189705. "add r3, r3, r6\n\t"
  189706. #endif
  189707. #ifdef WOLFSSL_KEIL
  189708. "adcs r4, r4, %[r]\n\t"
  189709. #elif defined(__clang__)
  189710. "adcs r4, %[r]\n\t"
  189711. #else
  189712. "adc r4, %[r]\n\t"
  189713. #endif
  189714. #ifdef WOLFSSL_KEIL
  189715. "adcs r2, r2, %[r]\n\t"
  189716. #elif defined(__clang__)
  189717. "adcs r2, %[r]\n\t"
  189718. #else
  189719. "adc r2, %[r]\n\t"
  189720. #endif
  189721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189722. "lsrs r6, r7, #16\n\t"
  189723. #else
  189724. "lsr r6, r7, #16\n\t"
  189725. #endif
  189726. #ifdef WOLFSSL_KEIL
  189727. "muls r5, r6, r5\n\t"
  189728. #elif defined(__clang__)
  189729. "muls r5, r6\n\t"
  189730. #else
  189731. "mul r5, r6\n\t"
  189732. #endif
  189733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189734. "lsrs r6, r5, #16\n\t"
  189735. #else
  189736. "lsr r6, r5, #16\n\t"
  189737. #endif
  189738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189739. "lsls r5, r5, #16\n\t"
  189740. #else
  189741. "lsl r5, r5, #16\n\t"
  189742. #endif
  189743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189744. "adds r3, r3, r5\n\t"
  189745. #else
  189746. "add r3, r3, r5\n\t"
  189747. #endif
  189748. #ifdef WOLFSSL_KEIL
  189749. "adcs r4, r4, r6\n\t"
  189750. #elif defined(__clang__)
  189751. "adcs r4, r6\n\t"
  189752. #else
  189753. "adc r4, r6\n\t"
  189754. #endif
  189755. #ifdef WOLFSSL_KEIL
  189756. "adcs r2, r2, %[r]\n\t"
  189757. #elif defined(__clang__)
  189758. "adcs r2, %[r]\n\t"
  189759. #else
  189760. "adc r2, %[r]\n\t"
  189761. #endif
  189762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189763. "adds r3, r3, r5\n\t"
  189764. #else
  189765. "add r3, r3, r5\n\t"
  189766. #endif
  189767. #ifdef WOLFSSL_KEIL
  189768. "adcs r4, r4, r6\n\t"
  189769. #elif defined(__clang__)
  189770. "adcs r4, r6\n\t"
  189771. #else
  189772. "adc r4, r6\n\t"
  189773. #endif
  189774. #ifdef WOLFSSL_KEIL
  189775. "adcs r2, r2, %[r]\n\t"
  189776. #elif defined(__clang__)
  189777. "adcs r2, %[r]\n\t"
  189778. #else
  189779. "adc r2, %[r]\n\t"
  189780. #endif
  189781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189782. "lsrs r5, %[a], #16\n\t"
  189783. #else
  189784. "lsr r5, %[a], #16\n\t"
  189785. #endif
  189786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189787. "lsrs r6, r7, #16\n\t"
  189788. #else
  189789. "lsr r6, r7, #16\n\t"
  189790. #endif
  189791. #ifdef WOLFSSL_KEIL
  189792. "muls r6, r5, r6\n\t"
  189793. #elif defined(__clang__)
  189794. "muls r6, r5\n\t"
  189795. #else
  189796. "mul r6, r5\n\t"
  189797. #endif
  189798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189799. "adds r4, r4, r6\n\t"
  189800. #else
  189801. "add r4, r4, r6\n\t"
  189802. #endif
  189803. #ifdef WOLFSSL_KEIL
  189804. "adcs r2, r2, %[r]\n\t"
  189805. #elif defined(__clang__)
  189806. "adcs r2, %[r]\n\t"
  189807. #else
  189808. "adc r2, %[r]\n\t"
  189809. #endif
  189810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189811. "adds r4, r4, r6\n\t"
  189812. #else
  189813. "add r4, r4, r6\n\t"
  189814. #endif
  189815. #ifdef WOLFSSL_KEIL
  189816. "adcs r2, r2, %[r]\n\t"
  189817. #elif defined(__clang__)
  189818. "adcs r2, %[r]\n\t"
  189819. #else
  189820. "adc r2, %[r]\n\t"
  189821. #endif
  189822. "uxth r6, r7\n\t"
  189823. #ifdef WOLFSSL_KEIL
  189824. "muls r5, r6, r5\n\t"
  189825. #elif defined(__clang__)
  189826. "muls r5, r6\n\t"
  189827. #else
  189828. "mul r5, r6\n\t"
  189829. #endif
  189830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189831. "lsrs r6, r5, #16\n\t"
  189832. #else
  189833. "lsr r6, r5, #16\n\t"
  189834. #endif
  189835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189836. "lsls r5, r5, #16\n\t"
  189837. #else
  189838. "lsl r5, r5, #16\n\t"
  189839. #endif
  189840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189841. "adds r3, r3, r5\n\t"
  189842. #else
  189843. "add r3, r3, r5\n\t"
  189844. #endif
  189845. #ifdef WOLFSSL_KEIL
  189846. "adcs r4, r4, r6\n\t"
  189847. #elif defined(__clang__)
  189848. "adcs r4, r6\n\t"
  189849. #else
  189850. "adc r4, r6\n\t"
  189851. #endif
  189852. #ifdef WOLFSSL_KEIL
  189853. "adcs r2, r2, %[r]\n\t"
  189854. #elif defined(__clang__)
  189855. "adcs r2, %[r]\n\t"
  189856. #else
  189857. "adc r2, %[r]\n\t"
  189858. #endif
  189859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189860. "adds r3, r3, r5\n\t"
  189861. #else
  189862. "add r3, r3, r5\n\t"
  189863. #endif
  189864. #ifdef WOLFSSL_KEIL
  189865. "adcs r4, r4, r6\n\t"
  189866. #elif defined(__clang__)
  189867. "adcs r4, r6\n\t"
  189868. #else
  189869. "adc r4, r6\n\t"
  189870. #endif
  189871. #ifdef WOLFSSL_KEIL
  189872. "adcs r2, r2, %[r]\n\t"
  189873. #elif defined(__clang__)
  189874. "adcs r2, %[r]\n\t"
  189875. #else
  189876. "adc r2, %[r]\n\t"
  189877. #endif
  189878. "# A[13] * A[6]\n\t"
  189879. "mov %[a], r9\n\t"
  189880. "ldr r7, [%[a], #24]\n\t"
  189881. "mov %[a], r11\n\t"
  189882. "uxth r5, %[a]\n\t"
  189883. "uxth r6, r7\n\t"
  189884. #ifdef WOLFSSL_KEIL
  189885. "muls r6, r5, r6\n\t"
  189886. #elif defined(__clang__)
  189887. "muls r6, r5\n\t"
  189888. #else
  189889. "mul r6, r5\n\t"
  189890. #endif
  189891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189892. "adds r3, r3, r6\n\t"
  189893. #else
  189894. "add r3, r3, r6\n\t"
  189895. #endif
  189896. #ifdef WOLFSSL_KEIL
  189897. "adcs r4, r4, %[r]\n\t"
  189898. #elif defined(__clang__)
  189899. "adcs r4, %[r]\n\t"
  189900. #else
  189901. "adc r4, %[r]\n\t"
  189902. #endif
  189903. #ifdef WOLFSSL_KEIL
  189904. "adcs r2, r2, %[r]\n\t"
  189905. #elif defined(__clang__)
  189906. "adcs r2, %[r]\n\t"
  189907. #else
  189908. "adc r2, %[r]\n\t"
  189909. #endif
  189910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189911. "adds r3, r3, r6\n\t"
  189912. #else
  189913. "add r3, r3, r6\n\t"
  189914. #endif
  189915. #ifdef WOLFSSL_KEIL
  189916. "adcs r4, r4, %[r]\n\t"
  189917. #elif defined(__clang__)
  189918. "adcs r4, %[r]\n\t"
  189919. #else
  189920. "adc r4, %[r]\n\t"
  189921. #endif
  189922. #ifdef WOLFSSL_KEIL
  189923. "adcs r2, r2, %[r]\n\t"
  189924. #elif defined(__clang__)
  189925. "adcs r2, %[r]\n\t"
  189926. #else
  189927. "adc r2, %[r]\n\t"
  189928. #endif
  189929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189930. "lsrs r6, r7, #16\n\t"
  189931. #else
  189932. "lsr r6, r7, #16\n\t"
  189933. #endif
  189934. #ifdef WOLFSSL_KEIL
  189935. "muls r5, r6, r5\n\t"
  189936. #elif defined(__clang__)
  189937. "muls r5, r6\n\t"
  189938. #else
  189939. "mul r5, r6\n\t"
  189940. #endif
  189941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189942. "lsrs r6, r5, #16\n\t"
  189943. #else
  189944. "lsr r6, r5, #16\n\t"
  189945. #endif
  189946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189947. "lsls r5, r5, #16\n\t"
  189948. #else
  189949. "lsl r5, r5, #16\n\t"
  189950. #endif
  189951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189952. "adds r3, r3, r5\n\t"
  189953. #else
  189954. "add r3, r3, r5\n\t"
  189955. #endif
  189956. #ifdef WOLFSSL_KEIL
  189957. "adcs r4, r4, r6\n\t"
  189958. #elif defined(__clang__)
  189959. "adcs r4, r6\n\t"
  189960. #else
  189961. "adc r4, r6\n\t"
  189962. #endif
  189963. #ifdef WOLFSSL_KEIL
  189964. "adcs r2, r2, %[r]\n\t"
  189965. #elif defined(__clang__)
  189966. "adcs r2, %[r]\n\t"
  189967. #else
  189968. "adc r2, %[r]\n\t"
  189969. #endif
  189970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189971. "adds r3, r3, r5\n\t"
  189972. #else
  189973. "add r3, r3, r5\n\t"
  189974. #endif
  189975. #ifdef WOLFSSL_KEIL
  189976. "adcs r4, r4, r6\n\t"
  189977. #elif defined(__clang__)
  189978. "adcs r4, r6\n\t"
  189979. #else
  189980. "adc r4, r6\n\t"
  189981. #endif
  189982. #ifdef WOLFSSL_KEIL
  189983. "adcs r2, r2, %[r]\n\t"
  189984. #elif defined(__clang__)
  189985. "adcs r2, %[r]\n\t"
  189986. #else
  189987. "adc r2, %[r]\n\t"
  189988. #endif
  189989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189990. "lsrs r5, %[a], #16\n\t"
  189991. #else
  189992. "lsr r5, %[a], #16\n\t"
  189993. #endif
  189994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189995. "lsrs r6, r7, #16\n\t"
  189996. #else
  189997. "lsr r6, r7, #16\n\t"
  189998. #endif
  189999. #ifdef WOLFSSL_KEIL
  190000. "muls r6, r5, r6\n\t"
  190001. #elif defined(__clang__)
  190002. "muls r6, r5\n\t"
  190003. #else
  190004. "mul r6, r5\n\t"
  190005. #endif
  190006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190007. "adds r4, r4, r6\n\t"
  190008. #else
  190009. "add r4, r4, r6\n\t"
  190010. #endif
  190011. #ifdef WOLFSSL_KEIL
  190012. "adcs r2, r2, %[r]\n\t"
  190013. #elif defined(__clang__)
  190014. "adcs r2, %[r]\n\t"
  190015. #else
  190016. "adc r2, %[r]\n\t"
  190017. #endif
  190018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190019. "adds r4, r4, r6\n\t"
  190020. #else
  190021. "add r4, r4, r6\n\t"
  190022. #endif
  190023. #ifdef WOLFSSL_KEIL
  190024. "adcs r2, r2, %[r]\n\t"
  190025. #elif defined(__clang__)
  190026. "adcs r2, %[r]\n\t"
  190027. #else
  190028. "adc r2, %[r]\n\t"
  190029. #endif
  190030. "uxth r6, r7\n\t"
  190031. #ifdef WOLFSSL_KEIL
  190032. "muls r5, r6, r5\n\t"
  190033. #elif defined(__clang__)
  190034. "muls r5, r6\n\t"
  190035. #else
  190036. "mul r5, r6\n\t"
  190037. #endif
  190038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190039. "lsrs r6, r5, #16\n\t"
  190040. #else
  190041. "lsr r6, r5, #16\n\t"
  190042. #endif
  190043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190044. "lsls r5, r5, #16\n\t"
  190045. #else
  190046. "lsl r5, r5, #16\n\t"
  190047. #endif
  190048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190049. "adds r3, r3, r5\n\t"
  190050. #else
  190051. "add r3, r3, r5\n\t"
  190052. #endif
  190053. #ifdef WOLFSSL_KEIL
  190054. "adcs r4, r4, r6\n\t"
  190055. #elif defined(__clang__)
  190056. "adcs r4, r6\n\t"
  190057. #else
  190058. "adc r4, r6\n\t"
  190059. #endif
  190060. #ifdef WOLFSSL_KEIL
  190061. "adcs r2, r2, %[r]\n\t"
  190062. #elif defined(__clang__)
  190063. "adcs r2, %[r]\n\t"
  190064. #else
  190065. "adc r2, %[r]\n\t"
  190066. #endif
  190067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190068. "adds r3, r3, r5\n\t"
  190069. #else
  190070. "add r3, r3, r5\n\t"
  190071. #endif
  190072. #ifdef WOLFSSL_KEIL
  190073. "adcs r4, r4, r6\n\t"
  190074. #elif defined(__clang__)
  190075. "adcs r4, r6\n\t"
  190076. #else
  190077. "adc r4, r6\n\t"
  190078. #endif
  190079. #ifdef WOLFSSL_KEIL
  190080. "adcs r2, r2, %[r]\n\t"
  190081. #elif defined(__clang__)
  190082. "adcs r2, %[r]\n\t"
  190083. #else
  190084. "adc r2, %[r]\n\t"
  190085. #endif
  190086. "# A[14] * A[5]\n\t"
  190087. "mov %[a], r9\n\t"
  190088. "ldr r7, [%[a], #20]\n\t"
  190089. "mov %[a], r12\n\t"
  190090. "uxth r5, %[a]\n\t"
  190091. "uxth r6, r7\n\t"
  190092. #ifdef WOLFSSL_KEIL
  190093. "muls r6, r5, r6\n\t"
  190094. #elif defined(__clang__)
  190095. "muls r6, r5\n\t"
  190096. #else
  190097. "mul r6, r5\n\t"
  190098. #endif
  190099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190100. "adds r3, r3, r6\n\t"
  190101. #else
  190102. "add r3, r3, r6\n\t"
  190103. #endif
  190104. #ifdef WOLFSSL_KEIL
  190105. "adcs r4, r4, %[r]\n\t"
  190106. #elif defined(__clang__)
  190107. "adcs r4, %[r]\n\t"
  190108. #else
  190109. "adc r4, %[r]\n\t"
  190110. #endif
  190111. #ifdef WOLFSSL_KEIL
  190112. "adcs r2, r2, %[r]\n\t"
  190113. #elif defined(__clang__)
  190114. "adcs r2, %[r]\n\t"
  190115. #else
  190116. "adc r2, %[r]\n\t"
  190117. #endif
  190118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190119. "adds r3, r3, r6\n\t"
  190120. #else
  190121. "add r3, r3, r6\n\t"
  190122. #endif
  190123. #ifdef WOLFSSL_KEIL
  190124. "adcs r4, r4, %[r]\n\t"
  190125. #elif defined(__clang__)
  190126. "adcs r4, %[r]\n\t"
  190127. #else
  190128. "adc r4, %[r]\n\t"
  190129. #endif
  190130. #ifdef WOLFSSL_KEIL
  190131. "adcs r2, r2, %[r]\n\t"
  190132. #elif defined(__clang__)
  190133. "adcs r2, %[r]\n\t"
  190134. #else
  190135. "adc r2, %[r]\n\t"
  190136. #endif
  190137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190138. "lsrs r6, r7, #16\n\t"
  190139. #else
  190140. "lsr r6, r7, #16\n\t"
  190141. #endif
  190142. #ifdef WOLFSSL_KEIL
  190143. "muls r5, r6, r5\n\t"
  190144. #elif defined(__clang__)
  190145. "muls r5, r6\n\t"
  190146. #else
  190147. "mul r5, r6\n\t"
  190148. #endif
  190149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190150. "lsrs r6, r5, #16\n\t"
  190151. #else
  190152. "lsr r6, r5, #16\n\t"
  190153. #endif
  190154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190155. "lsls r5, r5, #16\n\t"
  190156. #else
  190157. "lsl r5, r5, #16\n\t"
  190158. #endif
  190159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190160. "adds r3, r3, r5\n\t"
  190161. #else
  190162. "add r3, r3, r5\n\t"
  190163. #endif
  190164. #ifdef WOLFSSL_KEIL
  190165. "adcs r4, r4, r6\n\t"
  190166. #elif defined(__clang__)
  190167. "adcs r4, r6\n\t"
  190168. #else
  190169. "adc r4, r6\n\t"
  190170. #endif
  190171. #ifdef WOLFSSL_KEIL
  190172. "adcs r2, r2, %[r]\n\t"
  190173. #elif defined(__clang__)
  190174. "adcs r2, %[r]\n\t"
  190175. #else
  190176. "adc r2, %[r]\n\t"
  190177. #endif
  190178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190179. "adds r3, r3, r5\n\t"
  190180. #else
  190181. "add r3, r3, r5\n\t"
  190182. #endif
  190183. #ifdef WOLFSSL_KEIL
  190184. "adcs r4, r4, r6\n\t"
  190185. #elif defined(__clang__)
  190186. "adcs r4, r6\n\t"
  190187. #else
  190188. "adc r4, r6\n\t"
  190189. #endif
  190190. #ifdef WOLFSSL_KEIL
  190191. "adcs r2, r2, %[r]\n\t"
  190192. #elif defined(__clang__)
  190193. "adcs r2, %[r]\n\t"
  190194. #else
  190195. "adc r2, %[r]\n\t"
  190196. #endif
  190197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190198. "lsrs r5, %[a], #16\n\t"
  190199. #else
  190200. "lsr r5, %[a], #16\n\t"
  190201. #endif
  190202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190203. "lsrs r6, r7, #16\n\t"
  190204. #else
  190205. "lsr r6, r7, #16\n\t"
  190206. #endif
  190207. #ifdef WOLFSSL_KEIL
  190208. "muls r6, r5, r6\n\t"
  190209. #elif defined(__clang__)
  190210. "muls r6, r5\n\t"
  190211. #else
  190212. "mul r6, r5\n\t"
  190213. #endif
  190214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190215. "adds r4, r4, r6\n\t"
  190216. #else
  190217. "add r4, r4, r6\n\t"
  190218. #endif
  190219. #ifdef WOLFSSL_KEIL
  190220. "adcs r2, r2, %[r]\n\t"
  190221. #elif defined(__clang__)
  190222. "adcs r2, %[r]\n\t"
  190223. #else
  190224. "adc r2, %[r]\n\t"
  190225. #endif
  190226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190227. "adds r4, r4, r6\n\t"
  190228. #else
  190229. "add r4, r4, r6\n\t"
  190230. #endif
  190231. #ifdef WOLFSSL_KEIL
  190232. "adcs r2, r2, %[r]\n\t"
  190233. #elif defined(__clang__)
  190234. "adcs r2, %[r]\n\t"
  190235. #else
  190236. "adc r2, %[r]\n\t"
  190237. #endif
  190238. "uxth r6, r7\n\t"
  190239. #ifdef WOLFSSL_KEIL
  190240. "muls r5, r6, r5\n\t"
  190241. #elif defined(__clang__)
  190242. "muls r5, r6\n\t"
  190243. #else
  190244. "mul r5, r6\n\t"
  190245. #endif
  190246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190247. "lsrs r6, r5, #16\n\t"
  190248. #else
  190249. "lsr r6, r5, #16\n\t"
  190250. #endif
  190251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190252. "lsls r5, r5, #16\n\t"
  190253. #else
  190254. "lsl r5, r5, #16\n\t"
  190255. #endif
  190256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190257. "adds r3, r3, r5\n\t"
  190258. #else
  190259. "add r3, r3, r5\n\t"
  190260. #endif
  190261. #ifdef WOLFSSL_KEIL
  190262. "adcs r4, r4, r6\n\t"
  190263. #elif defined(__clang__)
  190264. "adcs r4, r6\n\t"
  190265. #else
  190266. "adc r4, r6\n\t"
  190267. #endif
  190268. #ifdef WOLFSSL_KEIL
  190269. "adcs r2, r2, %[r]\n\t"
  190270. #elif defined(__clang__)
  190271. "adcs r2, %[r]\n\t"
  190272. #else
  190273. "adc r2, %[r]\n\t"
  190274. #endif
  190275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190276. "adds r3, r3, r5\n\t"
  190277. #else
  190278. "add r3, r3, r5\n\t"
  190279. #endif
  190280. #ifdef WOLFSSL_KEIL
  190281. "adcs r4, r4, r6\n\t"
  190282. #elif defined(__clang__)
  190283. "adcs r4, r6\n\t"
  190284. #else
  190285. "adc r4, r6\n\t"
  190286. #endif
  190287. #ifdef WOLFSSL_KEIL
  190288. "adcs r2, r2, %[r]\n\t"
  190289. #elif defined(__clang__)
  190290. "adcs r2, %[r]\n\t"
  190291. #else
  190292. "adc r2, %[r]\n\t"
  190293. #endif
  190294. "# A[15] * A[4]\n\t"
  190295. "mov %[a], r9\n\t"
  190296. "ldr r7, [%[a], #16]\n\t"
  190297. "mov %[a], lr\n\t"
  190298. "uxth r5, %[a]\n\t"
  190299. "uxth r6, r7\n\t"
  190300. #ifdef WOLFSSL_KEIL
  190301. "muls r6, r5, r6\n\t"
  190302. #elif defined(__clang__)
  190303. "muls r6, r5\n\t"
  190304. #else
  190305. "mul r6, r5\n\t"
  190306. #endif
  190307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190308. "adds r3, r3, r6\n\t"
  190309. #else
  190310. "add r3, r3, r6\n\t"
  190311. #endif
  190312. #ifdef WOLFSSL_KEIL
  190313. "adcs r4, r4, %[r]\n\t"
  190314. #elif defined(__clang__)
  190315. "adcs r4, %[r]\n\t"
  190316. #else
  190317. "adc r4, %[r]\n\t"
  190318. #endif
  190319. #ifdef WOLFSSL_KEIL
  190320. "adcs r2, r2, %[r]\n\t"
  190321. #elif defined(__clang__)
  190322. "adcs r2, %[r]\n\t"
  190323. #else
  190324. "adc r2, %[r]\n\t"
  190325. #endif
  190326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190327. "adds r3, r3, r6\n\t"
  190328. #else
  190329. "add r3, r3, r6\n\t"
  190330. #endif
  190331. #ifdef WOLFSSL_KEIL
  190332. "adcs r4, r4, %[r]\n\t"
  190333. #elif defined(__clang__)
  190334. "adcs r4, %[r]\n\t"
  190335. #else
  190336. "adc r4, %[r]\n\t"
  190337. #endif
  190338. #ifdef WOLFSSL_KEIL
  190339. "adcs r2, r2, %[r]\n\t"
  190340. #elif defined(__clang__)
  190341. "adcs r2, %[r]\n\t"
  190342. #else
  190343. "adc r2, %[r]\n\t"
  190344. #endif
  190345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190346. "lsrs r6, r7, #16\n\t"
  190347. #else
  190348. "lsr r6, r7, #16\n\t"
  190349. #endif
  190350. #ifdef WOLFSSL_KEIL
  190351. "muls r5, r6, r5\n\t"
  190352. #elif defined(__clang__)
  190353. "muls r5, r6\n\t"
  190354. #else
  190355. "mul r5, r6\n\t"
  190356. #endif
  190357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190358. "lsrs r6, r5, #16\n\t"
  190359. #else
  190360. "lsr r6, r5, #16\n\t"
  190361. #endif
  190362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190363. "lsls r5, r5, #16\n\t"
  190364. #else
  190365. "lsl r5, r5, #16\n\t"
  190366. #endif
  190367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190368. "adds r3, r3, r5\n\t"
  190369. #else
  190370. "add r3, r3, r5\n\t"
  190371. #endif
  190372. #ifdef WOLFSSL_KEIL
  190373. "adcs r4, r4, r6\n\t"
  190374. #elif defined(__clang__)
  190375. "adcs r4, r6\n\t"
  190376. #else
  190377. "adc r4, r6\n\t"
  190378. #endif
  190379. #ifdef WOLFSSL_KEIL
  190380. "adcs r2, r2, %[r]\n\t"
  190381. #elif defined(__clang__)
  190382. "adcs r2, %[r]\n\t"
  190383. #else
  190384. "adc r2, %[r]\n\t"
  190385. #endif
  190386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190387. "adds r3, r3, r5\n\t"
  190388. #else
  190389. "add r3, r3, r5\n\t"
  190390. #endif
  190391. #ifdef WOLFSSL_KEIL
  190392. "adcs r4, r4, r6\n\t"
  190393. #elif defined(__clang__)
  190394. "adcs r4, r6\n\t"
  190395. #else
  190396. "adc r4, r6\n\t"
  190397. #endif
  190398. #ifdef WOLFSSL_KEIL
  190399. "adcs r2, r2, %[r]\n\t"
  190400. #elif defined(__clang__)
  190401. "adcs r2, %[r]\n\t"
  190402. #else
  190403. "adc r2, %[r]\n\t"
  190404. #endif
  190405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190406. "lsrs r5, %[a], #16\n\t"
  190407. #else
  190408. "lsr r5, %[a], #16\n\t"
  190409. #endif
  190410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190411. "lsrs r6, r7, #16\n\t"
  190412. #else
  190413. "lsr r6, r7, #16\n\t"
  190414. #endif
  190415. #ifdef WOLFSSL_KEIL
  190416. "muls r6, r5, r6\n\t"
  190417. #elif defined(__clang__)
  190418. "muls r6, r5\n\t"
  190419. #else
  190420. "mul r6, r5\n\t"
  190421. #endif
  190422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190423. "adds r4, r4, r6\n\t"
  190424. #else
  190425. "add r4, r4, r6\n\t"
  190426. #endif
  190427. #ifdef WOLFSSL_KEIL
  190428. "adcs r2, r2, %[r]\n\t"
  190429. #elif defined(__clang__)
  190430. "adcs r2, %[r]\n\t"
  190431. #else
  190432. "adc r2, %[r]\n\t"
  190433. #endif
  190434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190435. "adds r4, r4, r6\n\t"
  190436. #else
  190437. "add r4, r4, r6\n\t"
  190438. #endif
  190439. #ifdef WOLFSSL_KEIL
  190440. "adcs r2, r2, %[r]\n\t"
  190441. #elif defined(__clang__)
  190442. "adcs r2, %[r]\n\t"
  190443. #else
  190444. "adc r2, %[r]\n\t"
  190445. #endif
  190446. "uxth r6, r7\n\t"
  190447. #ifdef WOLFSSL_KEIL
  190448. "muls r5, r6, r5\n\t"
  190449. #elif defined(__clang__)
  190450. "muls r5, r6\n\t"
  190451. #else
  190452. "mul r5, r6\n\t"
  190453. #endif
  190454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190455. "lsrs r6, r5, #16\n\t"
  190456. #else
  190457. "lsr r6, r5, #16\n\t"
  190458. #endif
  190459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190460. "lsls r5, r5, #16\n\t"
  190461. #else
  190462. "lsl r5, r5, #16\n\t"
  190463. #endif
  190464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190465. "adds r3, r3, r5\n\t"
  190466. #else
  190467. "add r3, r3, r5\n\t"
  190468. #endif
  190469. #ifdef WOLFSSL_KEIL
  190470. "adcs r4, r4, r6\n\t"
  190471. #elif defined(__clang__)
  190472. "adcs r4, r6\n\t"
  190473. #else
  190474. "adc r4, r6\n\t"
  190475. #endif
  190476. #ifdef WOLFSSL_KEIL
  190477. "adcs r2, r2, %[r]\n\t"
  190478. #elif defined(__clang__)
  190479. "adcs r2, %[r]\n\t"
  190480. #else
  190481. "adc r2, %[r]\n\t"
  190482. #endif
  190483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190484. "adds r3, r3, r5\n\t"
  190485. #else
  190486. "add r3, r3, r5\n\t"
  190487. #endif
  190488. #ifdef WOLFSSL_KEIL
  190489. "adcs r4, r4, r6\n\t"
  190490. #elif defined(__clang__)
  190491. "adcs r4, r6\n\t"
  190492. #else
  190493. "adc r4, r6\n\t"
  190494. #endif
  190495. #ifdef WOLFSSL_KEIL
  190496. "adcs r2, r2, %[r]\n\t"
  190497. #elif defined(__clang__)
  190498. "adcs r2, %[r]\n\t"
  190499. #else
  190500. "adc r2, %[r]\n\t"
  190501. #endif
  190502. "mov %[r], r8\n\t"
  190503. "str r3, [%[r], #76]\n\t"
  190504. "movs %[r], #0\n\t"
  190505. "# A[15] * A[5]\n\t"
  190506. "movs r3, #0\n\t"
  190507. "mov %[a], r9\n\t"
  190508. "ldr r7, [%[a], #20]\n\t"
  190509. "mov %[a], lr\n\t"
  190510. "uxth r5, %[a]\n\t"
  190511. "uxth r6, r7\n\t"
  190512. #ifdef WOLFSSL_KEIL
  190513. "muls r6, r5, r6\n\t"
  190514. #elif defined(__clang__)
  190515. "muls r6, r5\n\t"
  190516. #else
  190517. "mul r6, r5\n\t"
  190518. #endif
  190519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190520. "adds r4, r4, r6\n\t"
  190521. #else
  190522. "add r4, r4, r6\n\t"
  190523. #endif
  190524. #ifdef WOLFSSL_KEIL
  190525. "adcs r2, r2, %[r]\n\t"
  190526. #elif defined(__clang__)
  190527. "adcs r2, %[r]\n\t"
  190528. #else
  190529. "adc r2, %[r]\n\t"
  190530. #endif
  190531. #ifdef WOLFSSL_KEIL
  190532. "adcs r3, r3, %[r]\n\t"
  190533. #elif defined(__clang__)
  190534. "adcs r3, %[r]\n\t"
  190535. #else
  190536. "adc r3, %[r]\n\t"
  190537. #endif
  190538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190539. "adds r4, r4, r6\n\t"
  190540. #else
  190541. "add r4, r4, r6\n\t"
  190542. #endif
  190543. #ifdef WOLFSSL_KEIL
  190544. "adcs r2, r2, %[r]\n\t"
  190545. #elif defined(__clang__)
  190546. "adcs r2, %[r]\n\t"
  190547. #else
  190548. "adc r2, %[r]\n\t"
  190549. #endif
  190550. #ifdef WOLFSSL_KEIL
  190551. "adcs r3, r3, %[r]\n\t"
  190552. #elif defined(__clang__)
  190553. "adcs r3, %[r]\n\t"
  190554. #else
  190555. "adc r3, %[r]\n\t"
  190556. #endif
  190557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190558. "lsrs r6, r7, #16\n\t"
  190559. #else
  190560. "lsr r6, r7, #16\n\t"
  190561. #endif
  190562. #ifdef WOLFSSL_KEIL
  190563. "muls r5, r6, r5\n\t"
  190564. #elif defined(__clang__)
  190565. "muls r5, r6\n\t"
  190566. #else
  190567. "mul r5, r6\n\t"
  190568. #endif
  190569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190570. "lsrs r6, r5, #16\n\t"
  190571. #else
  190572. "lsr r6, r5, #16\n\t"
  190573. #endif
  190574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190575. "lsls r5, r5, #16\n\t"
  190576. #else
  190577. "lsl r5, r5, #16\n\t"
  190578. #endif
  190579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190580. "adds r4, r4, r5\n\t"
  190581. #else
  190582. "add r4, r4, r5\n\t"
  190583. #endif
  190584. #ifdef WOLFSSL_KEIL
  190585. "adcs r2, r2, r6\n\t"
  190586. #elif defined(__clang__)
  190587. "adcs r2, r6\n\t"
  190588. #else
  190589. "adc r2, r6\n\t"
  190590. #endif
  190591. #ifdef WOLFSSL_KEIL
  190592. "adcs r3, r3, %[r]\n\t"
  190593. #elif defined(__clang__)
  190594. "adcs r3, %[r]\n\t"
  190595. #else
  190596. "adc r3, %[r]\n\t"
  190597. #endif
  190598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190599. "adds r4, r4, r5\n\t"
  190600. #else
  190601. "add r4, r4, r5\n\t"
  190602. #endif
  190603. #ifdef WOLFSSL_KEIL
  190604. "adcs r2, r2, r6\n\t"
  190605. #elif defined(__clang__)
  190606. "adcs r2, r6\n\t"
  190607. #else
  190608. "adc r2, r6\n\t"
  190609. #endif
  190610. #ifdef WOLFSSL_KEIL
  190611. "adcs r3, r3, %[r]\n\t"
  190612. #elif defined(__clang__)
  190613. "adcs r3, %[r]\n\t"
  190614. #else
  190615. "adc r3, %[r]\n\t"
  190616. #endif
  190617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190618. "lsrs r5, %[a], #16\n\t"
  190619. #else
  190620. "lsr r5, %[a], #16\n\t"
  190621. #endif
  190622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190623. "lsrs r6, r7, #16\n\t"
  190624. #else
  190625. "lsr r6, r7, #16\n\t"
  190626. #endif
  190627. #ifdef WOLFSSL_KEIL
  190628. "muls r6, r5, r6\n\t"
  190629. #elif defined(__clang__)
  190630. "muls r6, r5\n\t"
  190631. #else
  190632. "mul r6, r5\n\t"
  190633. #endif
  190634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190635. "adds r2, r2, r6\n\t"
  190636. #else
  190637. "add r2, r2, r6\n\t"
  190638. #endif
  190639. #ifdef WOLFSSL_KEIL
  190640. "adcs r3, r3, %[r]\n\t"
  190641. #elif defined(__clang__)
  190642. "adcs r3, %[r]\n\t"
  190643. #else
  190644. "adc r3, %[r]\n\t"
  190645. #endif
  190646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190647. "adds r2, r2, r6\n\t"
  190648. #else
  190649. "add r2, r2, r6\n\t"
  190650. #endif
  190651. #ifdef WOLFSSL_KEIL
  190652. "adcs r3, r3, %[r]\n\t"
  190653. #elif defined(__clang__)
  190654. "adcs r3, %[r]\n\t"
  190655. #else
  190656. "adc r3, %[r]\n\t"
  190657. #endif
  190658. "uxth r6, r7\n\t"
  190659. #ifdef WOLFSSL_KEIL
  190660. "muls r5, r6, r5\n\t"
  190661. #elif defined(__clang__)
  190662. "muls r5, r6\n\t"
  190663. #else
  190664. "mul r5, r6\n\t"
  190665. #endif
  190666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190667. "lsrs r6, r5, #16\n\t"
  190668. #else
  190669. "lsr r6, r5, #16\n\t"
  190670. #endif
  190671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190672. "lsls r5, r5, #16\n\t"
  190673. #else
  190674. "lsl r5, r5, #16\n\t"
  190675. #endif
  190676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190677. "adds r4, r4, r5\n\t"
  190678. #else
  190679. "add r4, r4, r5\n\t"
  190680. #endif
  190681. #ifdef WOLFSSL_KEIL
  190682. "adcs r2, r2, r6\n\t"
  190683. #elif defined(__clang__)
  190684. "adcs r2, r6\n\t"
  190685. #else
  190686. "adc r2, r6\n\t"
  190687. #endif
  190688. #ifdef WOLFSSL_KEIL
  190689. "adcs r3, r3, %[r]\n\t"
  190690. #elif defined(__clang__)
  190691. "adcs r3, %[r]\n\t"
  190692. #else
  190693. "adc r3, %[r]\n\t"
  190694. #endif
  190695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190696. "adds r4, r4, r5\n\t"
  190697. #else
  190698. "add r4, r4, r5\n\t"
  190699. #endif
  190700. #ifdef WOLFSSL_KEIL
  190701. "adcs r2, r2, r6\n\t"
  190702. #elif defined(__clang__)
  190703. "adcs r2, r6\n\t"
  190704. #else
  190705. "adc r2, r6\n\t"
  190706. #endif
  190707. #ifdef WOLFSSL_KEIL
  190708. "adcs r3, r3, %[r]\n\t"
  190709. #elif defined(__clang__)
  190710. "adcs r3, %[r]\n\t"
  190711. #else
  190712. "adc r3, %[r]\n\t"
  190713. #endif
  190714. "# A[14] * A[6]\n\t"
  190715. "mov %[a], r9\n\t"
  190716. "ldr r7, [%[a], #24]\n\t"
  190717. "mov %[a], r12\n\t"
  190718. "uxth r5, %[a]\n\t"
  190719. "uxth r6, r7\n\t"
  190720. #ifdef WOLFSSL_KEIL
  190721. "muls r6, r5, r6\n\t"
  190722. #elif defined(__clang__)
  190723. "muls r6, r5\n\t"
  190724. #else
  190725. "mul r6, r5\n\t"
  190726. #endif
  190727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190728. "adds r4, r4, r6\n\t"
  190729. #else
  190730. "add r4, r4, r6\n\t"
  190731. #endif
  190732. #ifdef WOLFSSL_KEIL
  190733. "adcs r2, r2, %[r]\n\t"
  190734. #elif defined(__clang__)
  190735. "adcs r2, %[r]\n\t"
  190736. #else
  190737. "adc r2, %[r]\n\t"
  190738. #endif
  190739. #ifdef WOLFSSL_KEIL
  190740. "adcs r3, r3, %[r]\n\t"
  190741. #elif defined(__clang__)
  190742. "adcs r3, %[r]\n\t"
  190743. #else
  190744. "adc r3, %[r]\n\t"
  190745. #endif
  190746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190747. "adds r4, r4, r6\n\t"
  190748. #else
  190749. "add r4, r4, r6\n\t"
  190750. #endif
  190751. #ifdef WOLFSSL_KEIL
  190752. "adcs r2, r2, %[r]\n\t"
  190753. #elif defined(__clang__)
  190754. "adcs r2, %[r]\n\t"
  190755. #else
  190756. "adc r2, %[r]\n\t"
  190757. #endif
  190758. #ifdef WOLFSSL_KEIL
  190759. "adcs r3, r3, %[r]\n\t"
  190760. #elif defined(__clang__)
  190761. "adcs r3, %[r]\n\t"
  190762. #else
  190763. "adc r3, %[r]\n\t"
  190764. #endif
  190765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190766. "lsrs r6, r7, #16\n\t"
  190767. #else
  190768. "lsr r6, r7, #16\n\t"
  190769. #endif
  190770. #ifdef WOLFSSL_KEIL
  190771. "muls r5, r6, r5\n\t"
  190772. #elif defined(__clang__)
  190773. "muls r5, r6\n\t"
  190774. #else
  190775. "mul r5, r6\n\t"
  190776. #endif
  190777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190778. "lsrs r6, r5, #16\n\t"
  190779. #else
  190780. "lsr r6, r5, #16\n\t"
  190781. #endif
  190782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190783. "lsls r5, r5, #16\n\t"
  190784. #else
  190785. "lsl r5, r5, #16\n\t"
  190786. #endif
  190787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190788. "adds r4, r4, r5\n\t"
  190789. #else
  190790. "add r4, r4, r5\n\t"
  190791. #endif
  190792. #ifdef WOLFSSL_KEIL
  190793. "adcs r2, r2, r6\n\t"
  190794. #elif defined(__clang__)
  190795. "adcs r2, r6\n\t"
  190796. #else
  190797. "adc r2, r6\n\t"
  190798. #endif
  190799. #ifdef WOLFSSL_KEIL
  190800. "adcs r3, r3, %[r]\n\t"
  190801. #elif defined(__clang__)
  190802. "adcs r3, %[r]\n\t"
  190803. #else
  190804. "adc r3, %[r]\n\t"
  190805. #endif
  190806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190807. "adds r4, r4, r5\n\t"
  190808. #else
  190809. "add r4, r4, r5\n\t"
  190810. #endif
  190811. #ifdef WOLFSSL_KEIL
  190812. "adcs r2, r2, r6\n\t"
  190813. #elif defined(__clang__)
  190814. "adcs r2, r6\n\t"
  190815. #else
  190816. "adc r2, r6\n\t"
  190817. #endif
  190818. #ifdef WOLFSSL_KEIL
  190819. "adcs r3, r3, %[r]\n\t"
  190820. #elif defined(__clang__)
  190821. "adcs r3, %[r]\n\t"
  190822. #else
  190823. "adc r3, %[r]\n\t"
  190824. #endif
  190825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190826. "lsrs r5, %[a], #16\n\t"
  190827. #else
  190828. "lsr r5, %[a], #16\n\t"
  190829. #endif
  190830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190831. "lsrs r6, r7, #16\n\t"
  190832. #else
  190833. "lsr r6, r7, #16\n\t"
  190834. #endif
  190835. #ifdef WOLFSSL_KEIL
  190836. "muls r6, r5, r6\n\t"
  190837. #elif defined(__clang__)
  190838. "muls r6, r5\n\t"
  190839. #else
  190840. "mul r6, r5\n\t"
  190841. #endif
  190842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190843. "adds r2, r2, r6\n\t"
  190844. #else
  190845. "add r2, r2, r6\n\t"
  190846. #endif
  190847. #ifdef WOLFSSL_KEIL
  190848. "adcs r3, r3, %[r]\n\t"
  190849. #elif defined(__clang__)
  190850. "adcs r3, %[r]\n\t"
  190851. #else
  190852. "adc r3, %[r]\n\t"
  190853. #endif
  190854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190855. "adds r2, r2, r6\n\t"
  190856. #else
  190857. "add r2, r2, r6\n\t"
  190858. #endif
  190859. #ifdef WOLFSSL_KEIL
  190860. "adcs r3, r3, %[r]\n\t"
  190861. #elif defined(__clang__)
  190862. "adcs r3, %[r]\n\t"
  190863. #else
  190864. "adc r3, %[r]\n\t"
  190865. #endif
  190866. "uxth r6, r7\n\t"
  190867. #ifdef WOLFSSL_KEIL
  190868. "muls r5, r6, r5\n\t"
  190869. #elif defined(__clang__)
  190870. "muls r5, r6\n\t"
  190871. #else
  190872. "mul r5, r6\n\t"
  190873. #endif
  190874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190875. "lsrs r6, r5, #16\n\t"
  190876. #else
  190877. "lsr r6, r5, #16\n\t"
  190878. #endif
  190879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190880. "lsls r5, r5, #16\n\t"
  190881. #else
  190882. "lsl r5, r5, #16\n\t"
  190883. #endif
  190884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190885. "adds r4, r4, r5\n\t"
  190886. #else
  190887. "add r4, r4, r5\n\t"
  190888. #endif
  190889. #ifdef WOLFSSL_KEIL
  190890. "adcs r2, r2, r6\n\t"
  190891. #elif defined(__clang__)
  190892. "adcs r2, r6\n\t"
  190893. #else
  190894. "adc r2, r6\n\t"
  190895. #endif
  190896. #ifdef WOLFSSL_KEIL
  190897. "adcs r3, r3, %[r]\n\t"
  190898. #elif defined(__clang__)
  190899. "adcs r3, %[r]\n\t"
  190900. #else
  190901. "adc r3, %[r]\n\t"
  190902. #endif
  190903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190904. "adds r4, r4, r5\n\t"
  190905. #else
  190906. "add r4, r4, r5\n\t"
  190907. #endif
  190908. #ifdef WOLFSSL_KEIL
  190909. "adcs r2, r2, r6\n\t"
  190910. #elif defined(__clang__)
  190911. "adcs r2, r6\n\t"
  190912. #else
  190913. "adc r2, r6\n\t"
  190914. #endif
  190915. #ifdef WOLFSSL_KEIL
  190916. "adcs r3, r3, %[r]\n\t"
  190917. #elif defined(__clang__)
  190918. "adcs r3, %[r]\n\t"
  190919. #else
  190920. "adc r3, %[r]\n\t"
  190921. #endif
  190922. "# A[13] * A[7]\n\t"
  190923. "mov %[a], r9\n\t"
  190924. "ldr r7, [%[a], #28]\n\t"
  190925. "mov %[a], r11\n\t"
  190926. "uxth r5, %[a]\n\t"
  190927. "uxth r6, r7\n\t"
  190928. #ifdef WOLFSSL_KEIL
  190929. "muls r6, r5, r6\n\t"
  190930. #elif defined(__clang__)
  190931. "muls r6, r5\n\t"
  190932. #else
  190933. "mul r6, r5\n\t"
  190934. #endif
  190935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190936. "adds r4, r4, r6\n\t"
  190937. #else
  190938. "add r4, r4, r6\n\t"
  190939. #endif
  190940. #ifdef WOLFSSL_KEIL
  190941. "adcs r2, r2, %[r]\n\t"
  190942. #elif defined(__clang__)
  190943. "adcs r2, %[r]\n\t"
  190944. #else
  190945. "adc r2, %[r]\n\t"
  190946. #endif
  190947. #ifdef WOLFSSL_KEIL
  190948. "adcs r3, r3, %[r]\n\t"
  190949. #elif defined(__clang__)
  190950. "adcs r3, %[r]\n\t"
  190951. #else
  190952. "adc r3, %[r]\n\t"
  190953. #endif
  190954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190955. "adds r4, r4, r6\n\t"
  190956. #else
  190957. "add r4, r4, r6\n\t"
  190958. #endif
  190959. #ifdef WOLFSSL_KEIL
  190960. "adcs r2, r2, %[r]\n\t"
  190961. #elif defined(__clang__)
  190962. "adcs r2, %[r]\n\t"
  190963. #else
  190964. "adc r2, %[r]\n\t"
  190965. #endif
  190966. #ifdef WOLFSSL_KEIL
  190967. "adcs r3, r3, %[r]\n\t"
  190968. #elif defined(__clang__)
  190969. "adcs r3, %[r]\n\t"
  190970. #else
  190971. "adc r3, %[r]\n\t"
  190972. #endif
  190973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190974. "lsrs r6, r7, #16\n\t"
  190975. #else
  190976. "lsr r6, r7, #16\n\t"
  190977. #endif
  190978. #ifdef WOLFSSL_KEIL
  190979. "muls r5, r6, r5\n\t"
  190980. #elif defined(__clang__)
  190981. "muls r5, r6\n\t"
  190982. #else
  190983. "mul r5, r6\n\t"
  190984. #endif
  190985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190986. "lsrs r6, r5, #16\n\t"
  190987. #else
  190988. "lsr r6, r5, #16\n\t"
  190989. #endif
  190990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190991. "lsls r5, r5, #16\n\t"
  190992. #else
  190993. "lsl r5, r5, #16\n\t"
  190994. #endif
  190995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190996. "adds r4, r4, r5\n\t"
  190997. #else
  190998. "add r4, r4, r5\n\t"
  190999. #endif
  191000. #ifdef WOLFSSL_KEIL
  191001. "adcs r2, r2, r6\n\t"
  191002. #elif defined(__clang__)
  191003. "adcs r2, r6\n\t"
  191004. #else
  191005. "adc r2, r6\n\t"
  191006. #endif
  191007. #ifdef WOLFSSL_KEIL
  191008. "adcs r3, r3, %[r]\n\t"
  191009. #elif defined(__clang__)
  191010. "adcs r3, %[r]\n\t"
  191011. #else
  191012. "adc r3, %[r]\n\t"
  191013. #endif
  191014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191015. "adds r4, r4, r5\n\t"
  191016. #else
  191017. "add r4, r4, r5\n\t"
  191018. #endif
  191019. #ifdef WOLFSSL_KEIL
  191020. "adcs r2, r2, r6\n\t"
  191021. #elif defined(__clang__)
  191022. "adcs r2, r6\n\t"
  191023. #else
  191024. "adc r2, r6\n\t"
  191025. #endif
  191026. #ifdef WOLFSSL_KEIL
  191027. "adcs r3, r3, %[r]\n\t"
  191028. #elif defined(__clang__)
  191029. "adcs r3, %[r]\n\t"
  191030. #else
  191031. "adc r3, %[r]\n\t"
  191032. #endif
  191033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191034. "lsrs r5, %[a], #16\n\t"
  191035. #else
  191036. "lsr r5, %[a], #16\n\t"
  191037. #endif
  191038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191039. "lsrs r6, r7, #16\n\t"
  191040. #else
  191041. "lsr r6, r7, #16\n\t"
  191042. #endif
  191043. #ifdef WOLFSSL_KEIL
  191044. "muls r6, r5, r6\n\t"
  191045. #elif defined(__clang__)
  191046. "muls r6, r5\n\t"
  191047. #else
  191048. "mul r6, r5\n\t"
  191049. #endif
  191050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191051. "adds r2, r2, r6\n\t"
  191052. #else
  191053. "add r2, r2, r6\n\t"
  191054. #endif
  191055. #ifdef WOLFSSL_KEIL
  191056. "adcs r3, r3, %[r]\n\t"
  191057. #elif defined(__clang__)
  191058. "adcs r3, %[r]\n\t"
  191059. #else
  191060. "adc r3, %[r]\n\t"
  191061. #endif
  191062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191063. "adds r2, r2, r6\n\t"
  191064. #else
  191065. "add r2, r2, r6\n\t"
  191066. #endif
  191067. #ifdef WOLFSSL_KEIL
  191068. "adcs r3, r3, %[r]\n\t"
  191069. #elif defined(__clang__)
  191070. "adcs r3, %[r]\n\t"
  191071. #else
  191072. "adc r3, %[r]\n\t"
  191073. #endif
  191074. "uxth r6, r7\n\t"
  191075. #ifdef WOLFSSL_KEIL
  191076. "muls r5, r6, r5\n\t"
  191077. #elif defined(__clang__)
  191078. "muls r5, r6\n\t"
  191079. #else
  191080. "mul r5, r6\n\t"
  191081. #endif
  191082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191083. "lsrs r6, r5, #16\n\t"
  191084. #else
  191085. "lsr r6, r5, #16\n\t"
  191086. #endif
  191087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191088. "lsls r5, r5, #16\n\t"
  191089. #else
  191090. "lsl r5, r5, #16\n\t"
  191091. #endif
  191092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191093. "adds r4, r4, r5\n\t"
  191094. #else
  191095. "add r4, r4, r5\n\t"
  191096. #endif
  191097. #ifdef WOLFSSL_KEIL
  191098. "adcs r2, r2, r6\n\t"
  191099. #elif defined(__clang__)
  191100. "adcs r2, r6\n\t"
  191101. #else
  191102. "adc r2, r6\n\t"
  191103. #endif
  191104. #ifdef WOLFSSL_KEIL
  191105. "adcs r3, r3, %[r]\n\t"
  191106. #elif defined(__clang__)
  191107. "adcs r3, %[r]\n\t"
  191108. #else
  191109. "adc r3, %[r]\n\t"
  191110. #endif
  191111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191112. "adds r4, r4, r5\n\t"
  191113. #else
  191114. "add r4, r4, r5\n\t"
  191115. #endif
  191116. #ifdef WOLFSSL_KEIL
  191117. "adcs r2, r2, r6\n\t"
  191118. #elif defined(__clang__)
  191119. "adcs r2, r6\n\t"
  191120. #else
  191121. "adc r2, r6\n\t"
  191122. #endif
  191123. #ifdef WOLFSSL_KEIL
  191124. "adcs r3, r3, %[r]\n\t"
  191125. #elif defined(__clang__)
  191126. "adcs r3, %[r]\n\t"
  191127. #else
  191128. "adc r3, %[r]\n\t"
  191129. #endif
  191130. "# A[12] * A[8]\n\t"
  191131. "mov %[a], r9\n\t"
  191132. "ldr r7, [%[a], #32]\n\t"
  191133. "mov %[a], r10\n\t"
  191134. "uxth r5, %[a]\n\t"
  191135. "uxth r6, r7\n\t"
  191136. #ifdef WOLFSSL_KEIL
  191137. "muls r6, r5, r6\n\t"
  191138. #elif defined(__clang__)
  191139. "muls r6, r5\n\t"
  191140. #else
  191141. "mul r6, r5\n\t"
  191142. #endif
  191143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191144. "adds r4, r4, r6\n\t"
  191145. #else
  191146. "add r4, r4, r6\n\t"
  191147. #endif
  191148. #ifdef WOLFSSL_KEIL
  191149. "adcs r2, r2, %[r]\n\t"
  191150. #elif defined(__clang__)
  191151. "adcs r2, %[r]\n\t"
  191152. #else
  191153. "adc r2, %[r]\n\t"
  191154. #endif
  191155. #ifdef WOLFSSL_KEIL
  191156. "adcs r3, r3, %[r]\n\t"
  191157. #elif defined(__clang__)
  191158. "adcs r3, %[r]\n\t"
  191159. #else
  191160. "adc r3, %[r]\n\t"
  191161. #endif
  191162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191163. "adds r4, r4, r6\n\t"
  191164. #else
  191165. "add r4, r4, r6\n\t"
  191166. #endif
  191167. #ifdef WOLFSSL_KEIL
  191168. "adcs r2, r2, %[r]\n\t"
  191169. #elif defined(__clang__)
  191170. "adcs r2, %[r]\n\t"
  191171. #else
  191172. "adc r2, %[r]\n\t"
  191173. #endif
  191174. #ifdef WOLFSSL_KEIL
  191175. "adcs r3, r3, %[r]\n\t"
  191176. #elif defined(__clang__)
  191177. "adcs r3, %[r]\n\t"
  191178. #else
  191179. "adc r3, %[r]\n\t"
  191180. #endif
  191181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191182. "lsrs r6, r7, #16\n\t"
  191183. #else
  191184. "lsr r6, r7, #16\n\t"
  191185. #endif
  191186. #ifdef WOLFSSL_KEIL
  191187. "muls r5, r6, r5\n\t"
  191188. #elif defined(__clang__)
  191189. "muls r5, r6\n\t"
  191190. #else
  191191. "mul r5, r6\n\t"
  191192. #endif
  191193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191194. "lsrs r6, r5, #16\n\t"
  191195. #else
  191196. "lsr r6, r5, #16\n\t"
  191197. #endif
  191198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191199. "lsls r5, r5, #16\n\t"
  191200. #else
  191201. "lsl r5, r5, #16\n\t"
  191202. #endif
  191203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191204. "adds r4, r4, r5\n\t"
  191205. #else
  191206. "add r4, r4, r5\n\t"
  191207. #endif
  191208. #ifdef WOLFSSL_KEIL
  191209. "adcs r2, r2, r6\n\t"
  191210. #elif defined(__clang__)
  191211. "adcs r2, r6\n\t"
  191212. #else
  191213. "adc r2, r6\n\t"
  191214. #endif
  191215. #ifdef WOLFSSL_KEIL
  191216. "adcs r3, r3, %[r]\n\t"
  191217. #elif defined(__clang__)
  191218. "adcs r3, %[r]\n\t"
  191219. #else
  191220. "adc r3, %[r]\n\t"
  191221. #endif
  191222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191223. "adds r4, r4, r5\n\t"
  191224. #else
  191225. "add r4, r4, r5\n\t"
  191226. #endif
  191227. #ifdef WOLFSSL_KEIL
  191228. "adcs r2, r2, r6\n\t"
  191229. #elif defined(__clang__)
  191230. "adcs r2, r6\n\t"
  191231. #else
  191232. "adc r2, r6\n\t"
  191233. #endif
  191234. #ifdef WOLFSSL_KEIL
  191235. "adcs r3, r3, %[r]\n\t"
  191236. #elif defined(__clang__)
  191237. "adcs r3, %[r]\n\t"
  191238. #else
  191239. "adc r3, %[r]\n\t"
  191240. #endif
  191241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191242. "lsrs r5, %[a], #16\n\t"
  191243. #else
  191244. "lsr r5, %[a], #16\n\t"
  191245. #endif
  191246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191247. "lsrs r6, r7, #16\n\t"
  191248. #else
  191249. "lsr r6, r7, #16\n\t"
  191250. #endif
  191251. #ifdef WOLFSSL_KEIL
  191252. "muls r6, r5, r6\n\t"
  191253. #elif defined(__clang__)
  191254. "muls r6, r5\n\t"
  191255. #else
  191256. "mul r6, r5\n\t"
  191257. #endif
  191258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191259. "adds r2, r2, r6\n\t"
  191260. #else
  191261. "add r2, r2, r6\n\t"
  191262. #endif
  191263. #ifdef WOLFSSL_KEIL
  191264. "adcs r3, r3, %[r]\n\t"
  191265. #elif defined(__clang__)
  191266. "adcs r3, %[r]\n\t"
  191267. #else
  191268. "adc r3, %[r]\n\t"
  191269. #endif
  191270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191271. "adds r2, r2, r6\n\t"
  191272. #else
  191273. "add r2, r2, r6\n\t"
  191274. #endif
  191275. #ifdef WOLFSSL_KEIL
  191276. "adcs r3, r3, %[r]\n\t"
  191277. #elif defined(__clang__)
  191278. "adcs r3, %[r]\n\t"
  191279. #else
  191280. "adc r3, %[r]\n\t"
  191281. #endif
  191282. "uxth r6, r7\n\t"
  191283. #ifdef WOLFSSL_KEIL
  191284. "muls r5, r6, r5\n\t"
  191285. #elif defined(__clang__)
  191286. "muls r5, r6\n\t"
  191287. #else
  191288. "mul r5, r6\n\t"
  191289. #endif
  191290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191291. "lsrs r6, r5, #16\n\t"
  191292. #else
  191293. "lsr r6, r5, #16\n\t"
  191294. #endif
  191295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191296. "lsls r5, r5, #16\n\t"
  191297. #else
  191298. "lsl r5, r5, #16\n\t"
  191299. #endif
  191300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191301. "adds r4, r4, r5\n\t"
  191302. #else
  191303. "add r4, r4, r5\n\t"
  191304. #endif
  191305. #ifdef WOLFSSL_KEIL
  191306. "adcs r2, r2, r6\n\t"
  191307. #elif defined(__clang__)
  191308. "adcs r2, r6\n\t"
  191309. #else
  191310. "adc r2, r6\n\t"
  191311. #endif
  191312. #ifdef WOLFSSL_KEIL
  191313. "adcs r3, r3, %[r]\n\t"
  191314. #elif defined(__clang__)
  191315. "adcs r3, %[r]\n\t"
  191316. #else
  191317. "adc r3, %[r]\n\t"
  191318. #endif
  191319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191320. "adds r4, r4, r5\n\t"
  191321. #else
  191322. "add r4, r4, r5\n\t"
  191323. #endif
  191324. #ifdef WOLFSSL_KEIL
  191325. "adcs r2, r2, r6\n\t"
  191326. #elif defined(__clang__)
  191327. "adcs r2, r6\n\t"
  191328. #else
  191329. "adc r2, r6\n\t"
  191330. #endif
  191331. #ifdef WOLFSSL_KEIL
  191332. "adcs r3, r3, %[r]\n\t"
  191333. #elif defined(__clang__)
  191334. "adcs r3, %[r]\n\t"
  191335. #else
  191336. "adc r3, %[r]\n\t"
  191337. #endif
  191338. "# A[11] * A[9]\n\t"
  191339. "mov %[a], r9\n\t"
  191340. "ldr r7, [%[a], #36]\n\t"
  191341. "ldr %[a], [%[a], #44]\n\t"
  191342. "uxth r5, %[a]\n\t"
  191343. "uxth r6, r7\n\t"
  191344. #ifdef WOLFSSL_KEIL
  191345. "muls r6, r5, r6\n\t"
  191346. #elif defined(__clang__)
  191347. "muls r6, r5\n\t"
  191348. #else
  191349. "mul r6, r5\n\t"
  191350. #endif
  191351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191352. "adds r4, r4, r6\n\t"
  191353. #else
  191354. "add r4, r4, r6\n\t"
  191355. #endif
  191356. #ifdef WOLFSSL_KEIL
  191357. "adcs r2, r2, %[r]\n\t"
  191358. #elif defined(__clang__)
  191359. "adcs r2, %[r]\n\t"
  191360. #else
  191361. "adc r2, %[r]\n\t"
  191362. #endif
  191363. #ifdef WOLFSSL_KEIL
  191364. "adcs r3, r3, %[r]\n\t"
  191365. #elif defined(__clang__)
  191366. "adcs r3, %[r]\n\t"
  191367. #else
  191368. "adc r3, %[r]\n\t"
  191369. #endif
  191370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191371. "adds r4, r4, r6\n\t"
  191372. #else
  191373. "add r4, r4, r6\n\t"
  191374. #endif
  191375. #ifdef WOLFSSL_KEIL
  191376. "adcs r2, r2, %[r]\n\t"
  191377. #elif defined(__clang__)
  191378. "adcs r2, %[r]\n\t"
  191379. #else
  191380. "adc r2, %[r]\n\t"
  191381. #endif
  191382. #ifdef WOLFSSL_KEIL
  191383. "adcs r3, r3, %[r]\n\t"
  191384. #elif defined(__clang__)
  191385. "adcs r3, %[r]\n\t"
  191386. #else
  191387. "adc r3, %[r]\n\t"
  191388. #endif
  191389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191390. "lsrs r6, r7, #16\n\t"
  191391. #else
  191392. "lsr r6, r7, #16\n\t"
  191393. #endif
  191394. #ifdef WOLFSSL_KEIL
  191395. "muls r5, r6, r5\n\t"
  191396. #elif defined(__clang__)
  191397. "muls r5, r6\n\t"
  191398. #else
  191399. "mul r5, r6\n\t"
  191400. #endif
  191401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191402. "lsrs r6, r5, #16\n\t"
  191403. #else
  191404. "lsr r6, r5, #16\n\t"
  191405. #endif
  191406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191407. "lsls r5, r5, #16\n\t"
  191408. #else
  191409. "lsl r5, r5, #16\n\t"
  191410. #endif
  191411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191412. "adds r4, r4, r5\n\t"
  191413. #else
  191414. "add r4, r4, r5\n\t"
  191415. #endif
  191416. #ifdef WOLFSSL_KEIL
  191417. "adcs r2, r2, r6\n\t"
  191418. #elif defined(__clang__)
  191419. "adcs r2, r6\n\t"
  191420. #else
  191421. "adc r2, r6\n\t"
  191422. #endif
  191423. #ifdef WOLFSSL_KEIL
  191424. "adcs r3, r3, %[r]\n\t"
  191425. #elif defined(__clang__)
  191426. "adcs r3, %[r]\n\t"
  191427. #else
  191428. "adc r3, %[r]\n\t"
  191429. #endif
  191430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191431. "adds r4, r4, r5\n\t"
  191432. #else
  191433. "add r4, r4, r5\n\t"
  191434. #endif
  191435. #ifdef WOLFSSL_KEIL
  191436. "adcs r2, r2, r6\n\t"
  191437. #elif defined(__clang__)
  191438. "adcs r2, r6\n\t"
  191439. #else
  191440. "adc r2, r6\n\t"
  191441. #endif
  191442. #ifdef WOLFSSL_KEIL
  191443. "adcs r3, r3, %[r]\n\t"
  191444. #elif defined(__clang__)
  191445. "adcs r3, %[r]\n\t"
  191446. #else
  191447. "adc r3, %[r]\n\t"
  191448. #endif
  191449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191450. "lsrs r5, %[a], #16\n\t"
  191451. #else
  191452. "lsr r5, %[a], #16\n\t"
  191453. #endif
  191454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191455. "lsrs r6, r7, #16\n\t"
  191456. #else
  191457. "lsr r6, r7, #16\n\t"
  191458. #endif
  191459. #ifdef WOLFSSL_KEIL
  191460. "muls r6, r5, r6\n\t"
  191461. #elif defined(__clang__)
  191462. "muls r6, r5\n\t"
  191463. #else
  191464. "mul r6, r5\n\t"
  191465. #endif
  191466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191467. "adds r2, r2, r6\n\t"
  191468. #else
  191469. "add r2, r2, r6\n\t"
  191470. #endif
  191471. #ifdef WOLFSSL_KEIL
  191472. "adcs r3, r3, %[r]\n\t"
  191473. #elif defined(__clang__)
  191474. "adcs r3, %[r]\n\t"
  191475. #else
  191476. "adc r3, %[r]\n\t"
  191477. #endif
  191478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191479. "adds r2, r2, r6\n\t"
  191480. #else
  191481. "add r2, r2, r6\n\t"
  191482. #endif
  191483. #ifdef WOLFSSL_KEIL
  191484. "adcs r3, r3, %[r]\n\t"
  191485. #elif defined(__clang__)
  191486. "adcs r3, %[r]\n\t"
  191487. #else
  191488. "adc r3, %[r]\n\t"
  191489. #endif
  191490. "uxth r6, r7\n\t"
  191491. #ifdef WOLFSSL_KEIL
  191492. "muls r5, r6, r5\n\t"
  191493. #elif defined(__clang__)
  191494. "muls r5, r6\n\t"
  191495. #else
  191496. "mul r5, r6\n\t"
  191497. #endif
  191498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191499. "lsrs r6, r5, #16\n\t"
  191500. #else
  191501. "lsr r6, r5, #16\n\t"
  191502. #endif
  191503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191504. "lsls r5, r5, #16\n\t"
  191505. #else
  191506. "lsl r5, r5, #16\n\t"
  191507. #endif
  191508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191509. "adds r4, r4, r5\n\t"
  191510. #else
  191511. "add r4, r4, r5\n\t"
  191512. #endif
  191513. #ifdef WOLFSSL_KEIL
  191514. "adcs r2, r2, r6\n\t"
  191515. #elif defined(__clang__)
  191516. "adcs r2, r6\n\t"
  191517. #else
  191518. "adc r2, r6\n\t"
  191519. #endif
  191520. #ifdef WOLFSSL_KEIL
  191521. "adcs r3, r3, %[r]\n\t"
  191522. #elif defined(__clang__)
  191523. "adcs r3, %[r]\n\t"
  191524. #else
  191525. "adc r3, %[r]\n\t"
  191526. #endif
  191527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191528. "adds r4, r4, r5\n\t"
  191529. #else
  191530. "add r4, r4, r5\n\t"
  191531. #endif
  191532. #ifdef WOLFSSL_KEIL
  191533. "adcs r2, r2, r6\n\t"
  191534. #elif defined(__clang__)
  191535. "adcs r2, r6\n\t"
  191536. #else
  191537. "adc r2, r6\n\t"
  191538. #endif
  191539. #ifdef WOLFSSL_KEIL
  191540. "adcs r3, r3, %[r]\n\t"
  191541. #elif defined(__clang__)
  191542. "adcs r3, %[r]\n\t"
  191543. #else
  191544. "adc r3, %[r]\n\t"
  191545. #endif
  191546. "# A[10] * A[10]\n\t"
  191547. "mov %[a], r9\n\t"
  191548. "ldr r7, [%[a], #40]\n\t"
  191549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191550. "lsrs r6, r7, #16\n\t"
  191551. #else
  191552. "lsr r6, r7, #16\n\t"
  191553. #endif
  191554. "uxth r5, r7\n\t"
  191555. #ifdef WOLFSSL_KEIL
  191556. "muls r5, r5, r5\n\t"
  191557. #elif defined(__clang__)
  191558. "muls r5, r5\n\t"
  191559. #else
  191560. "mul r5, r5\n\t"
  191561. #endif
  191562. #ifdef WOLFSSL_KEIL
  191563. "muls r6, r6, r6\n\t"
  191564. #elif defined(__clang__)
  191565. "muls r6, r6\n\t"
  191566. #else
  191567. "mul r6, r6\n\t"
  191568. #endif
  191569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191570. "adds r4, r4, r5\n\t"
  191571. #else
  191572. "add r4, r4, r5\n\t"
  191573. #endif
  191574. #ifdef WOLFSSL_KEIL
  191575. "adcs r2, r2, r6\n\t"
  191576. #elif defined(__clang__)
  191577. "adcs r2, r6\n\t"
  191578. #else
  191579. "adc r2, r6\n\t"
  191580. #endif
  191581. #ifdef WOLFSSL_KEIL
  191582. "adcs r3, r3, %[r]\n\t"
  191583. #elif defined(__clang__)
  191584. "adcs r3, %[r]\n\t"
  191585. #else
  191586. "adc r3, %[r]\n\t"
  191587. #endif
  191588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191589. "lsrs r6, r7, #16\n\t"
  191590. #else
  191591. "lsr r6, r7, #16\n\t"
  191592. #endif
  191593. "uxth r5, r7\n\t"
  191594. #ifdef WOLFSSL_KEIL
  191595. "muls r5, r6, r5\n\t"
  191596. #elif defined(__clang__)
  191597. "muls r5, r6\n\t"
  191598. #else
  191599. "mul r5, r6\n\t"
  191600. #endif
  191601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191602. "lsrs r6, r5, #15\n\t"
  191603. #else
  191604. "lsr r6, r5, #15\n\t"
  191605. #endif
  191606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191607. "lsls r5, r5, #17\n\t"
  191608. #else
  191609. "lsl r5, r5, #17\n\t"
  191610. #endif
  191611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191612. "adds r4, r4, r5\n\t"
  191613. #else
  191614. "add r4, r4, r5\n\t"
  191615. #endif
  191616. #ifdef WOLFSSL_KEIL
  191617. "adcs r2, r2, r6\n\t"
  191618. #elif defined(__clang__)
  191619. "adcs r2, r6\n\t"
  191620. #else
  191621. "adc r2, r6\n\t"
  191622. #endif
  191623. #ifdef WOLFSSL_KEIL
  191624. "adcs r3, r3, %[r]\n\t"
  191625. #elif defined(__clang__)
  191626. "adcs r3, %[r]\n\t"
  191627. #else
  191628. "adc r3, %[r]\n\t"
  191629. #endif
  191630. "mov %[r], r8\n\t"
  191631. "str r4, [%[r], #80]\n\t"
  191632. "movs %[r], #0\n\t"
  191633. "# A[11] * A[10]\n\t"
  191634. "movs r4, #0\n\t"
  191635. "ldr %[a], [%[a], #44]\n\t"
  191636. "uxth r5, %[a]\n\t"
  191637. "uxth r6, r7\n\t"
  191638. #ifdef WOLFSSL_KEIL
  191639. "muls r6, r5, r6\n\t"
  191640. #elif defined(__clang__)
  191641. "muls r6, r5\n\t"
  191642. #else
  191643. "mul r6, r5\n\t"
  191644. #endif
  191645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191646. "adds r2, r2, r6\n\t"
  191647. #else
  191648. "add r2, r2, r6\n\t"
  191649. #endif
  191650. #ifdef WOLFSSL_KEIL
  191651. "adcs r3, r3, %[r]\n\t"
  191652. #elif defined(__clang__)
  191653. "adcs r3, %[r]\n\t"
  191654. #else
  191655. "adc r3, %[r]\n\t"
  191656. #endif
  191657. #ifdef WOLFSSL_KEIL
  191658. "adcs r4, r4, %[r]\n\t"
  191659. #elif defined(__clang__)
  191660. "adcs r4, %[r]\n\t"
  191661. #else
  191662. "adc r4, %[r]\n\t"
  191663. #endif
  191664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191665. "adds r2, r2, r6\n\t"
  191666. #else
  191667. "add r2, r2, r6\n\t"
  191668. #endif
  191669. #ifdef WOLFSSL_KEIL
  191670. "adcs r3, r3, %[r]\n\t"
  191671. #elif defined(__clang__)
  191672. "adcs r3, %[r]\n\t"
  191673. #else
  191674. "adc r3, %[r]\n\t"
  191675. #endif
  191676. #ifdef WOLFSSL_KEIL
  191677. "adcs r4, r4, %[r]\n\t"
  191678. #elif defined(__clang__)
  191679. "adcs r4, %[r]\n\t"
  191680. #else
  191681. "adc r4, %[r]\n\t"
  191682. #endif
  191683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191684. "lsrs r6, r7, #16\n\t"
  191685. #else
  191686. "lsr r6, r7, #16\n\t"
  191687. #endif
  191688. #ifdef WOLFSSL_KEIL
  191689. "muls r5, r6, r5\n\t"
  191690. #elif defined(__clang__)
  191691. "muls r5, r6\n\t"
  191692. #else
  191693. "mul r5, r6\n\t"
  191694. #endif
  191695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191696. "lsrs r6, r5, #16\n\t"
  191697. #else
  191698. "lsr r6, r5, #16\n\t"
  191699. #endif
  191700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191701. "lsls r5, r5, #16\n\t"
  191702. #else
  191703. "lsl r5, r5, #16\n\t"
  191704. #endif
  191705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191706. "adds r2, r2, r5\n\t"
  191707. #else
  191708. "add r2, r2, r5\n\t"
  191709. #endif
  191710. #ifdef WOLFSSL_KEIL
  191711. "adcs r3, r3, r6\n\t"
  191712. #elif defined(__clang__)
  191713. "adcs r3, r6\n\t"
  191714. #else
  191715. "adc r3, r6\n\t"
  191716. #endif
  191717. #ifdef WOLFSSL_KEIL
  191718. "adcs r4, r4, %[r]\n\t"
  191719. #elif defined(__clang__)
  191720. "adcs r4, %[r]\n\t"
  191721. #else
  191722. "adc r4, %[r]\n\t"
  191723. #endif
  191724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191725. "adds r2, r2, r5\n\t"
  191726. #else
  191727. "add r2, r2, r5\n\t"
  191728. #endif
  191729. #ifdef WOLFSSL_KEIL
  191730. "adcs r3, r3, r6\n\t"
  191731. #elif defined(__clang__)
  191732. "adcs r3, r6\n\t"
  191733. #else
  191734. "adc r3, r6\n\t"
  191735. #endif
  191736. #ifdef WOLFSSL_KEIL
  191737. "adcs r4, r4, %[r]\n\t"
  191738. #elif defined(__clang__)
  191739. "adcs r4, %[r]\n\t"
  191740. #else
  191741. "adc r4, %[r]\n\t"
  191742. #endif
  191743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191744. "lsrs r5, %[a], #16\n\t"
  191745. #else
  191746. "lsr r5, %[a], #16\n\t"
  191747. #endif
  191748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191749. "lsrs r6, r7, #16\n\t"
  191750. #else
  191751. "lsr r6, r7, #16\n\t"
  191752. #endif
  191753. #ifdef WOLFSSL_KEIL
  191754. "muls r6, r5, r6\n\t"
  191755. #elif defined(__clang__)
  191756. "muls r6, r5\n\t"
  191757. #else
  191758. "mul r6, r5\n\t"
  191759. #endif
  191760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191761. "adds r3, r3, r6\n\t"
  191762. #else
  191763. "add r3, r3, r6\n\t"
  191764. #endif
  191765. #ifdef WOLFSSL_KEIL
  191766. "adcs r4, r4, %[r]\n\t"
  191767. #elif defined(__clang__)
  191768. "adcs r4, %[r]\n\t"
  191769. #else
  191770. "adc r4, %[r]\n\t"
  191771. #endif
  191772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191773. "adds r3, r3, r6\n\t"
  191774. #else
  191775. "add r3, r3, r6\n\t"
  191776. #endif
  191777. #ifdef WOLFSSL_KEIL
  191778. "adcs r4, r4, %[r]\n\t"
  191779. #elif defined(__clang__)
  191780. "adcs r4, %[r]\n\t"
  191781. #else
  191782. "adc r4, %[r]\n\t"
  191783. #endif
  191784. "uxth r6, r7\n\t"
  191785. #ifdef WOLFSSL_KEIL
  191786. "muls r5, r6, r5\n\t"
  191787. #elif defined(__clang__)
  191788. "muls r5, r6\n\t"
  191789. #else
  191790. "mul r5, r6\n\t"
  191791. #endif
  191792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191793. "lsrs r6, r5, #16\n\t"
  191794. #else
  191795. "lsr r6, r5, #16\n\t"
  191796. #endif
  191797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191798. "lsls r5, r5, #16\n\t"
  191799. #else
  191800. "lsl r5, r5, #16\n\t"
  191801. #endif
  191802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191803. "adds r2, r2, r5\n\t"
  191804. #else
  191805. "add r2, r2, r5\n\t"
  191806. #endif
  191807. #ifdef WOLFSSL_KEIL
  191808. "adcs r3, r3, r6\n\t"
  191809. #elif defined(__clang__)
  191810. "adcs r3, r6\n\t"
  191811. #else
  191812. "adc r3, r6\n\t"
  191813. #endif
  191814. #ifdef WOLFSSL_KEIL
  191815. "adcs r4, r4, %[r]\n\t"
  191816. #elif defined(__clang__)
  191817. "adcs r4, %[r]\n\t"
  191818. #else
  191819. "adc r4, %[r]\n\t"
  191820. #endif
  191821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191822. "adds r2, r2, r5\n\t"
  191823. #else
  191824. "add r2, r2, r5\n\t"
  191825. #endif
  191826. #ifdef WOLFSSL_KEIL
  191827. "adcs r3, r3, r6\n\t"
  191828. #elif defined(__clang__)
  191829. "adcs r3, r6\n\t"
  191830. #else
  191831. "adc r3, r6\n\t"
  191832. #endif
  191833. #ifdef WOLFSSL_KEIL
  191834. "adcs r4, r4, %[r]\n\t"
  191835. #elif defined(__clang__)
  191836. "adcs r4, %[r]\n\t"
  191837. #else
  191838. "adc r4, %[r]\n\t"
  191839. #endif
  191840. "# A[12] * A[9]\n\t"
  191841. "mov %[a], r9\n\t"
  191842. "ldr r7, [%[a], #36]\n\t"
  191843. "mov %[a], r10\n\t"
  191844. "uxth r5, %[a]\n\t"
  191845. "uxth r6, r7\n\t"
  191846. #ifdef WOLFSSL_KEIL
  191847. "muls r6, r5, r6\n\t"
  191848. #elif defined(__clang__)
  191849. "muls r6, r5\n\t"
  191850. #else
  191851. "mul r6, r5\n\t"
  191852. #endif
  191853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191854. "adds r2, r2, r6\n\t"
  191855. #else
  191856. "add r2, r2, r6\n\t"
  191857. #endif
  191858. #ifdef WOLFSSL_KEIL
  191859. "adcs r3, r3, %[r]\n\t"
  191860. #elif defined(__clang__)
  191861. "adcs r3, %[r]\n\t"
  191862. #else
  191863. "adc r3, %[r]\n\t"
  191864. #endif
  191865. #ifdef WOLFSSL_KEIL
  191866. "adcs r4, r4, %[r]\n\t"
  191867. #elif defined(__clang__)
  191868. "adcs r4, %[r]\n\t"
  191869. #else
  191870. "adc r4, %[r]\n\t"
  191871. #endif
  191872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191873. "adds r2, r2, r6\n\t"
  191874. #else
  191875. "add r2, r2, r6\n\t"
  191876. #endif
  191877. #ifdef WOLFSSL_KEIL
  191878. "adcs r3, r3, %[r]\n\t"
  191879. #elif defined(__clang__)
  191880. "adcs r3, %[r]\n\t"
  191881. #else
  191882. "adc r3, %[r]\n\t"
  191883. #endif
  191884. #ifdef WOLFSSL_KEIL
  191885. "adcs r4, r4, %[r]\n\t"
  191886. #elif defined(__clang__)
  191887. "adcs r4, %[r]\n\t"
  191888. #else
  191889. "adc r4, %[r]\n\t"
  191890. #endif
  191891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191892. "lsrs r6, r7, #16\n\t"
  191893. #else
  191894. "lsr r6, r7, #16\n\t"
  191895. #endif
  191896. #ifdef WOLFSSL_KEIL
  191897. "muls r5, r6, r5\n\t"
  191898. #elif defined(__clang__)
  191899. "muls r5, r6\n\t"
  191900. #else
  191901. "mul r5, r6\n\t"
  191902. #endif
  191903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191904. "lsrs r6, r5, #16\n\t"
  191905. #else
  191906. "lsr r6, r5, #16\n\t"
  191907. #endif
  191908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191909. "lsls r5, r5, #16\n\t"
  191910. #else
  191911. "lsl r5, r5, #16\n\t"
  191912. #endif
  191913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191914. "adds r2, r2, r5\n\t"
  191915. #else
  191916. "add r2, r2, r5\n\t"
  191917. #endif
  191918. #ifdef WOLFSSL_KEIL
  191919. "adcs r3, r3, r6\n\t"
  191920. #elif defined(__clang__)
  191921. "adcs r3, r6\n\t"
  191922. #else
  191923. "adc r3, r6\n\t"
  191924. #endif
  191925. #ifdef WOLFSSL_KEIL
  191926. "adcs r4, r4, %[r]\n\t"
  191927. #elif defined(__clang__)
  191928. "adcs r4, %[r]\n\t"
  191929. #else
  191930. "adc r4, %[r]\n\t"
  191931. #endif
  191932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191933. "adds r2, r2, r5\n\t"
  191934. #else
  191935. "add r2, r2, r5\n\t"
  191936. #endif
  191937. #ifdef WOLFSSL_KEIL
  191938. "adcs r3, r3, r6\n\t"
  191939. #elif defined(__clang__)
  191940. "adcs r3, r6\n\t"
  191941. #else
  191942. "adc r3, r6\n\t"
  191943. #endif
  191944. #ifdef WOLFSSL_KEIL
  191945. "adcs r4, r4, %[r]\n\t"
  191946. #elif defined(__clang__)
  191947. "adcs r4, %[r]\n\t"
  191948. #else
  191949. "adc r4, %[r]\n\t"
  191950. #endif
  191951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191952. "lsrs r5, %[a], #16\n\t"
  191953. #else
  191954. "lsr r5, %[a], #16\n\t"
  191955. #endif
  191956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191957. "lsrs r6, r7, #16\n\t"
  191958. #else
  191959. "lsr r6, r7, #16\n\t"
  191960. #endif
  191961. #ifdef WOLFSSL_KEIL
  191962. "muls r6, r5, r6\n\t"
  191963. #elif defined(__clang__)
  191964. "muls r6, r5\n\t"
  191965. #else
  191966. "mul r6, r5\n\t"
  191967. #endif
  191968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191969. "adds r3, r3, r6\n\t"
  191970. #else
  191971. "add r3, r3, r6\n\t"
  191972. #endif
  191973. #ifdef WOLFSSL_KEIL
  191974. "adcs r4, r4, %[r]\n\t"
  191975. #elif defined(__clang__)
  191976. "adcs r4, %[r]\n\t"
  191977. #else
  191978. "adc r4, %[r]\n\t"
  191979. #endif
  191980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191981. "adds r3, r3, r6\n\t"
  191982. #else
  191983. "add r3, r3, r6\n\t"
  191984. #endif
  191985. #ifdef WOLFSSL_KEIL
  191986. "adcs r4, r4, %[r]\n\t"
  191987. #elif defined(__clang__)
  191988. "adcs r4, %[r]\n\t"
  191989. #else
  191990. "adc r4, %[r]\n\t"
  191991. #endif
  191992. "uxth r6, r7\n\t"
  191993. #ifdef WOLFSSL_KEIL
  191994. "muls r5, r6, r5\n\t"
  191995. #elif defined(__clang__)
  191996. "muls r5, r6\n\t"
  191997. #else
  191998. "mul r5, r6\n\t"
  191999. #endif
  192000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192001. "lsrs r6, r5, #16\n\t"
  192002. #else
  192003. "lsr r6, r5, #16\n\t"
  192004. #endif
  192005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192006. "lsls r5, r5, #16\n\t"
  192007. #else
  192008. "lsl r5, r5, #16\n\t"
  192009. #endif
  192010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192011. "adds r2, r2, r5\n\t"
  192012. #else
  192013. "add r2, r2, r5\n\t"
  192014. #endif
  192015. #ifdef WOLFSSL_KEIL
  192016. "adcs r3, r3, r6\n\t"
  192017. #elif defined(__clang__)
  192018. "adcs r3, r6\n\t"
  192019. #else
  192020. "adc r3, r6\n\t"
  192021. #endif
  192022. #ifdef WOLFSSL_KEIL
  192023. "adcs r4, r4, %[r]\n\t"
  192024. #elif defined(__clang__)
  192025. "adcs r4, %[r]\n\t"
  192026. #else
  192027. "adc r4, %[r]\n\t"
  192028. #endif
  192029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192030. "adds r2, r2, r5\n\t"
  192031. #else
  192032. "add r2, r2, r5\n\t"
  192033. #endif
  192034. #ifdef WOLFSSL_KEIL
  192035. "adcs r3, r3, r6\n\t"
  192036. #elif defined(__clang__)
  192037. "adcs r3, r6\n\t"
  192038. #else
  192039. "adc r3, r6\n\t"
  192040. #endif
  192041. #ifdef WOLFSSL_KEIL
  192042. "adcs r4, r4, %[r]\n\t"
  192043. #elif defined(__clang__)
  192044. "adcs r4, %[r]\n\t"
  192045. #else
  192046. "adc r4, %[r]\n\t"
  192047. #endif
  192048. "# A[13] * A[8]\n\t"
  192049. "mov %[a], r9\n\t"
  192050. "ldr r7, [%[a], #32]\n\t"
  192051. "mov %[a], r11\n\t"
  192052. "uxth r5, %[a]\n\t"
  192053. "uxth r6, r7\n\t"
  192054. #ifdef WOLFSSL_KEIL
  192055. "muls r6, r5, r6\n\t"
  192056. #elif defined(__clang__)
  192057. "muls r6, r5\n\t"
  192058. #else
  192059. "mul r6, r5\n\t"
  192060. #endif
  192061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192062. "adds r2, r2, r6\n\t"
  192063. #else
  192064. "add r2, r2, r6\n\t"
  192065. #endif
  192066. #ifdef WOLFSSL_KEIL
  192067. "adcs r3, r3, %[r]\n\t"
  192068. #elif defined(__clang__)
  192069. "adcs r3, %[r]\n\t"
  192070. #else
  192071. "adc r3, %[r]\n\t"
  192072. #endif
  192073. #ifdef WOLFSSL_KEIL
  192074. "adcs r4, r4, %[r]\n\t"
  192075. #elif defined(__clang__)
  192076. "adcs r4, %[r]\n\t"
  192077. #else
  192078. "adc r4, %[r]\n\t"
  192079. #endif
  192080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192081. "adds r2, r2, r6\n\t"
  192082. #else
  192083. "add r2, r2, r6\n\t"
  192084. #endif
  192085. #ifdef WOLFSSL_KEIL
  192086. "adcs r3, r3, %[r]\n\t"
  192087. #elif defined(__clang__)
  192088. "adcs r3, %[r]\n\t"
  192089. #else
  192090. "adc r3, %[r]\n\t"
  192091. #endif
  192092. #ifdef WOLFSSL_KEIL
  192093. "adcs r4, r4, %[r]\n\t"
  192094. #elif defined(__clang__)
  192095. "adcs r4, %[r]\n\t"
  192096. #else
  192097. "adc r4, %[r]\n\t"
  192098. #endif
  192099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192100. "lsrs r6, r7, #16\n\t"
  192101. #else
  192102. "lsr r6, r7, #16\n\t"
  192103. #endif
  192104. #ifdef WOLFSSL_KEIL
  192105. "muls r5, r6, r5\n\t"
  192106. #elif defined(__clang__)
  192107. "muls r5, r6\n\t"
  192108. #else
  192109. "mul r5, r6\n\t"
  192110. #endif
  192111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192112. "lsrs r6, r5, #16\n\t"
  192113. #else
  192114. "lsr r6, r5, #16\n\t"
  192115. #endif
  192116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192117. "lsls r5, r5, #16\n\t"
  192118. #else
  192119. "lsl r5, r5, #16\n\t"
  192120. #endif
  192121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192122. "adds r2, r2, r5\n\t"
  192123. #else
  192124. "add r2, r2, r5\n\t"
  192125. #endif
  192126. #ifdef WOLFSSL_KEIL
  192127. "adcs r3, r3, r6\n\t"
  192128. #elif defined(__clang__)
  192129. "adcs r3, r6\n\t"
  192130. #else
  192131. "adc r3, r6\n\t"
  192132. #endif
  192133. #ifdef WOLFSSL_KEIL
  192134. "adcs r4, r4, %[r]\n\t"
  192135. #elif defined(__clang__)
  192136. "adcs r4, %[r]\n\t"
  192137. #else
  192138. "adc r4, %[r]\n\t"
  192139. #endif
  192140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192141. "adds r2, r2, r5\n\t"
  192142. #else
  192143. "add r2, r2, r5\n\t"
  192144. #endif
  192145. #ifdef WOLFSSL_KEIL
  192146. "adcs r3, r3, r6\n\t"
  192147. #elif defined(__clang__)
  192148. "adcs r3, r6\n\t"
  192149. #else
  192150. "adc r3, r6\n\t"
  192151. #endif
  192152. #ifdef WOLFSSL_KEIL
  192153. "adcs r4, r4, %[r]\n\t"
  192154. #elif defined(__clang__)
  192155. "adcs r4, %[r]\n\t"
  192156. #else
  192157. "adc r4, %[r]\n\t"
  192158. #endif
  192159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192160. "lsrs r5, %[a], #16\n\t"
  192161. #else
  192162. "lsr r5, %[a], #16\n\t"
  192163. #endif
  192164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192165. "lsrs r6, r7, #16\n\t"
  192166. #else
  192167. "lsr r6, r7, #16\n\t"
  192168. #endif
  192169. #ifdef WOLFSSL_KEIL
  192170. "muls r6, r5, r6\n\t"
  192171. #elif defined(__clang__)
  192172. "muls r6, r5\n\t"
  192173. #else
  192174. "mul r6, r5\n\t"
  192175. #endif
  192176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192177. "adds r3, r3, r6\n\t"
  192178. #else
  192179. "add r3, r3, r6\n\t"
  192180. #endif
  192181. #ifdef WOLFSSL_KEIL
  192182. "adcs r4, r4, %[r]\n\t"
  192183. #elif defined(__clang__)
  192184. "adcs r4, %[r]\n\t"
  192185. #else
  192186. "adc r4, %[r]\n\t"
  192187. #endif
  192188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192189. "adds r3, r3, r6\n\t"
  192190. #else
  192191. "add r3, r3, r6\n\t"
  192192. #endif
  192193. #ifdef WOLFSSL_KEIL
  192194. "adcs r4, r4, %[r]\n\t"
  192195. #elif defined(__clang__)
  192196. "adcs r4, %[r]\n\t"
  192197. #else
  192198. "adc r4, %[r]\n\t"
  192199. #endif
  192200. "uxth r6, r7\n\t"
  192201. #ifdef WOLFSSL_KEIL
  192202. "muls r5, r6, r5\n\t"
  192203. #elif defined(__clang__)
  192204. "muls r5, r6\n\t"
  192205. #else
  192206. "mul r5, r6\n\t"
  192207. #endif
  192208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192209. "lsrs r6, r5, #16\n\t"
  192210. #else
  192211. "lsr r6, r5, #16\n\t"
  192212. #endif
  192213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192214. "lsls r5, r5, #16\n\t"
  192215. #else
  192216. "lsl r5, r5, #16\n\t"
  192217. #endif
  192218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192219. "adds r2, r2, r5\n\t"
  192220. #else
  192221. "add r2, r2, r5\n\t"
  192222. #endif
  192223. #ifdef WOLFSSL_KEIL
  192224. "adcs r3, r3, r6\n\t"
  192225. #elif defined(__clang__)
  192226. "adcs r3, r6\n\t"
  192227. #else
  192228. "adc r3, r6\n\t"
  192229. #endif
  192230. #ifdef WOLFSSL_KEIL
  192231. "adcs r4, r4, %[r]\n\t"
  192232. #elif defined(__clang__)
  192233. "adcs r4, %[r]\n\t"
  192234. #else
  192235. "adc r4, %[r]\n\t"
  192236. #endif
  192237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192238. "adds r2, r2, r5\n\t"
  192239. #else
  192240. "add r2, r2, r5\n\t"
  192241. #endif
  192242. #ifdef WOLFSSL_KEIL
  192243. "adcs r3, r3, r6\n\t"
  192244. #elif defined(__clang__)
  192245. "adcs r3, r6\n\t"
  192246. #else
  192247. "adc r3, r6\n\t"
  192248. #endif
  192249. #ifdef WOLFSSL_KEIL
  192250. "adcs r4, r4, %[r]\n\t"
  192251. #elif defined(__clang__)
  192252. "adcs r4, %[r]\n\t"
  192253. #else
  192254. "adc r4, %[r]\n\t"
  192255. #endif
  192256. "# A[14] * A[7]\n\t"
  192257. "mov %[a], r9\n\t"
  192258. "ldr r7, [%[a], #28]\n\t"
  192259. "mov %[a], r12\n\t"
  192260. "uxth r5, %[a]\n\t"
  192261. "uxth r6, r7\n\t"
  192262. #ifdef WOLFSSL_KEIL
  192263. "muls r6, r5, r6\n\t"
  192264. #elif defined(__clang__)
  192265. "muls r6, r5\n\t"
  192266. #else
  192267. "mul r6, r5\n\t"
  192268. #endif
  192269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192270. "adds r2, r2, r6\n\t"
  192271. #else
  192272. "add r2, r2, r6\n\t"
  192273. #endif
  192274. #ifdef WOLFSSL_KEIL
  192275. "adcs r3, r3, %[r]\n\t"
  192276. #elif defined(__clang__)
  192277. "adcs r3, %[r]\n\t"
  192278. #else
  192279. "adc r3, %[r]\n\t"
  192280. #endif
  192281. #ifdef WOLFSSL_KEIL
  192282. "adcs r4, r4, %[r]\n\t"
  192283. #elif defined(__clang__)
  192284. "adcs r4, %[r]\n\t"
  192285. #else
  192286. "adc r4, %[r]\n\t"
  192287. #endif
  192288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192289. "adds r2, r2, r6\n\t"
  192290. #else
  192291. "add r2, r2, r6\n\t"
  192292. #endif
  192293. #ifdef WOLFSSL_KEIL
  192294. "adcs r3, r3, %[r]\n\t"
  192295. #elif defined(__clang__)
  192296. "adcs r3, %[r]\n\t"
  192297. #else
  192298. "adc r3, %[r]\n\t"
  192299. #endif
  192300. #ifdef WOLFSSL_KEIL
  192301. "adcs r4, r4, %[r]\n\t"
  192302. #elif defined(__clang__)
  192303. "adcs r4, %[r]\n\t"
  192304. #else
  192305. "adc r4, %[r]\n\t"
  192306. #endif
  192307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192308. "lsrs r6, r7, #16\n\t"
  192309. #else
  192310. "lsr r6, r7, #16\n\t"
  192311. #endif
  192312. #ifdef WOLFSSL_KEIL
  192313. "muls r5, r6, r5\n\t"
  192314. #elif defined(__clang__)
  192315. "muls r5, r6\n\t"
  192316. #else
  192317. "mul r5, r6\n\t"
  192318. #endif
  192319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192320. "lsrs r6, r5, #16\n\t"
  192321. #else
  192322. "lsr r6, r5, #16\n\t"
  192323. #endif
  192324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192325. "lsls r5, r5, #16\n\t"
  192326. #else
  192327. "lsl r5, r5, #16\n\t"
  192328. #endif
  192329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192330. "adds r2, r2, r5\n\t"
  192331. #else
  192332. "add r2, r2, r5\n\t"
  192333. #endif
  192334. #ifdef WOLFSSL_KEIL
  192335. "adcs r3, r3, r6\n\t"
  192336. #elif defined(__clang__)
  192337. "adcs r3, r6\n\t"
  192338. #else
  192339. "adc r3, r6\n\t"
  192340. #endif
  192341. #ifdef WOLFSSL_KEIL
  192342. "adcs r4, r4, %[r]\n\t"
  192343. #elif defined(__clang__)
  192344. "adcs r4, %[r]\n\t"
  192345. #else
  192346. "adc r4, %[r]\n\t"
  192347. #endif
  192348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192349. "adds r2, r2, r5\n\t"
  192350. #else
  192351. "add r2, r2, r5\n\t"
  192352. #endif
  192353. #ifdef WOLFSSL_KEIL
  192354. "adcs r3, r3, r6\n\t"
  192355. #elif defined(__clang__)
  192356. "adcs r3, r6\n\t"
  192357. #else
  192358. "adc r3, r6\n\t"
  192359. #endif
  192360. #ifdef WOLFSSL_KEIL
  192361. "adcs r4, r4, %[r]\n\t"
  192362. #elif defined(__clang__)
  192363. "adcs r4, %[r]\n\t"
  192364. #else
  192365. "adc r4, %[r]\n\t"
  192366. #endif
  192367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192368. "lsrs r5, %[a], #16\n\t"
  192369. #else
  192370. "lsr r5, %[a], #16\n\t"
  192371. #endif
  192372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192373. "lsrs r6, r7, #16\n\t"
  192374. #else
  192375. "lsr r6, r7, #16\n\t"
  192376. #endif
  192377. #ifdef WOLFSSL_KEIL
  192378. "muls r6, r5, r6\n\t"
  192379. #elif defined(__clang__)
  192380. "muls r6, r5\n\t"
  192381. #else
  192382. "mul r6, r5\n\t"
  192383. #endif
  192384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192385. "adds r3, r3, r6\n\t"
  192386. #else
  192387. "add r3, r3, r6\n\t"
  192388. #endif
  192389. #ifdef WOLFSSL_KEIL
  192390. "adcs r4, r4, %[r]\n\t"
  192391. #elif defined(__clang__)
  192392. "adcs r4, %[r]\n\t"
  192393. #else
  192394. "adc r4, %[r]\n\t"
  192395. #endif
  192396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192397. "adds r3, r3, r6\n\t"
  192398. #else
  192399. "add r3, r3, r6\n\t"
  192400. #endif
  192401. #ifdef WOLFSSL_KEIL
  192402. "adcs r4, r4, %[r]\n\t"
  192403. #elif defined(__clang__)
  192404. "adcs r4, %[r]\n\t"
  192405. #else
  192406. "adc r4, %[r]\n\t"
  192407. #endif
  192408. "uxth r6, r7\n\t"
  192409. #ifdef WOLFSSL_KEIL
  192410. "muls r5, r6, r5\n\t"
  192411. #elif defined(__clang__)
  192412. "muls r5, r6\n\t"
  192413. #else
  192414. "mul r5, r6\n\t"
  192415. #endif
  192416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192417. "lsrs r6, r5, #16\n\t"
  192418. #else
  192419. "lsr r6, r5, #16\n\t"
  192420. #endif
  192421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192422. "lsls r5, r5, #16\n\t"
  192423. #else
  192424. "lsl r5, r5, #16\n\t"
  192425. #endif
  192426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192427. "adds r2, r2, r5\n\t"
  192428. #else
  192429. "add r2, r2, r5\n\t"
  192430. #endif
  192431. #ifdef WOLFSSL_KEIL
  192432. "adcs r3, r3, r6\n\t"
  192433. #elif defined(__clang__)
  192434. "adcs r3, r6\n\t"
  192435. #else
  192436. "adc r3, r6\n\t"
  192437. #endif
  192438. #ifdef WOLFSSL_KEIL
  192439. "adcs r4, r4, %[r]\n\t"
  192440. #elif defined(__clang__)
  192441. "adcs r4, %[r]\n\t"
  192442. #else
  192443. "adc r4, %[r]\n\t"
  192444. #endif
  192445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192446. "adds r2, r2, r5\n\t"
  192447. #else
  192448. "add r2, r2, r5\n\t"
  192449. #endif
  192450. #ifdef WOLFSSL_KEIL
  192451. "adcs r3, r3, r6\n\t"
  192452. #elif defined(__clang__)
  192453. "adcs r3, r6\n\t"
  192454. #else
  192455. "adc r3, r6\n\t"
  192456. #endif
  192457. #ifdef WOLFSSL_KEIL
  192458. "adcs r4, r4, %[r]\n\t"
  192459. #elif defined(__clang__)
  192460. "adcs r4, %[r]\n\t"
  192461. #else
  192462. "adc r4, %[r]\n\t"
  192463. #endif
  192464. "# A[15] * A[6]\n\t"
  192465. "mov %[a], r9\n\t"
  192466. "ldr r7, [%[a], #24]\n\t"
  192467. "mov %[a], lr\n\t"
  192468. "uxth r5, %[a]\n\t"
  192469. "uxth r6, r7\n\t"
  192470. #ifdef WOLFSSL_KEIL
  192471. "muls r6, r5, r6\n\t"
  192472. #elif defined(__clang__)
  192473. "muls r6, r5\n\t"
  192474. #else
  192475. "mul r6, r5\n\t"
  192476. #endif
  192477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192478. "adds r2, r2, r6\n\t"
  192479. #else
  192480. "add r2, r2, r6\n\t"
  192481. #endif
  192482. #ifdef WOLFSSL_KEIL
  192483. "adcs r3, r3, %[r]\n\t"
  192484. #elif defined(__clang__)
  192485. "adcs r3, %[r]\n\t"
  192486. #else
  192487. "adc r3, %[r]\n\t"
  192488. #endif
  192489. #ifdef WOLFSSL_KEIL
  192490. "adcs r4, r4, %[r]\n\t"
  192491. #elif defined(__clang__)
  192492. "adcs r4, %[r]\n\t"
  192493. #else
  192494. "adc r4, %[r]\n\t"
  192495. #endif
  192496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192497. "adds r2, r2, r6\n\t"
  192498. #else
  192499. "add r2, r2, r6\n\t"
  192500. #endif
  192501. #ifdef WOLFSSL_KEIL
  192502. "adcs r3, r3, %[r]\n\t"
  192503. #elif defined(__clang__)
  192504. "adcs r3, %[r]\n\t"
  192505. #else
  192506. "adc r3, %[r]\n\t"
  192507. #endif
  192508. #ifdef WOLFSSL_KEIL
  192509. "adcs r4, r4, %[r]\n\t"
  192510. #elif defined(__clang__)
  192511. "adcs r4, %[r]\n\t"
  192512. #else
  192513. "adc r4, %[r]\n\t"
  192514. #endif
  192515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192516. "lsrs r6, r7, #16\n\t"
  192517. #else
  192518. "lsr r6, r7, #16\n\t"
  192519. #endif
  192520. #ifdef WOLFSSL_KEIL
  192521. "muls r5, r6, r5\n\t"
  192522. #elif defined(__clang__)
  192523. "muls r5, r6\n\t"
  192524. #else
  192525. "mul r5, r6\n\t"
  192526. #endif
  192527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192528. "lsrs r6, r5, #16\n\t"
  192529. #else
  192530. "lsr r6, r5, #16\n\t"
  192531. #endif
  192532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192533. "lsls r5, r5, #16\n\t"
  192534. #else
  192535. "lsl r5, r5, #16\n\t"
  192536. #endif
  192537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192538. "adds r2, r2, r5\n\t"
  192539. #else
  192540. "add r2, r2, r5\n\t"
  192541. #endif
  192542. #ifdef WOLFSSL_KEIL
  192543. "adcs r3, r3, r6\n\t"
  192544. #elif defined(__clang__)
  192545. "adcs r3, r6\n\t"
  192546. #else
  192547. "adc r3, r6\n\t"
  192548. #endif
  192549. #ifdef WOLFSSL_KEIL
  192550. "adcs r4, r4, %[r]\n\t"
  192551. #elif defined(__clang__)
  192552. "adcs r4, %[r]\n\t"
  192553. #else
  192554. "adc r4, %[r]\n\t"
  192555. #endif
  192556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192557. "adds r2, r2, r5\n\t"
  192558. #else
  192559. "add r2, r2, r5\n\t"
  192560. #endif
  192561. #ifdef WOLFSSL_KEIL
  192562. "adcs r3, r3, r6\n\t"
  192563. #elif defined(__clang__)
  192564. "adcs r3, r6\n\t"
  192565. #else
  192566. "adc r3, r6\n\t"
  192567. #endif
  192568. #ifdef WOLFSSL_KEIL
  192569. "adcs r4, r4, %[r]\n\t"
  192570. #elif defined(__clang__)
  192571. "adcs r4, %[r]\n\t"
  192572. #else
  192573. "adc r4, %[r]\n\t"
  192574. #endif
  192575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192576. "lsrs r5, %[a], #16\n\t"
  192577. #else
  192578. "lsr r5, %[a], #16\n\t"
  192579. #endif
  192580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192581. "lsrs r6, r7, #16\n\t"
  192582. #else
  192583. "lsr r6, r7, #16\n\t"
  192584. #endif
  192585. #ifdef WOLFSSL_KEIL
  192586. "muls r6, r5, r6\n\t"
  192587. #elif defined(__clang__)
  192588. "muls r6, r5\n\t"
  192589. #else
  192590. "mul r6, r5\n\t"
  192591. #endif
  192592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192593. "adds r3, r3, r6\n\t"
  192594. #else
  192595. "add r3, r3, r6\n\t"
  192596. #endif
  192597. #ifdef WOLFSSL_KEIL
  192598. "adcs r4, r4, %[r]\n\t"
  192599. #elif defined(__clang__)
  192600. "adcs r4, %[r]\n\t"
  192601. #else
  192602. "adc r4, %[r]\n\t"
  192603. #endif
  192604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192605. "adds r3, r3, r6\n\t"
  192606. #else
  192607. "add r3, r3, r6\n\t"
  192608. #endif
  192609. #ifdef WOLFSSL_KEIL
  192610. "adcs r4, r4, %[r]\n\t"
  192611. #elif defined(__clang__)
  192612. "adcs r4, %[r]\n\t"
  192613. #else
  192614. "adc r4, %[r]\n\t"
  192615. #endif
  192616. "uxth r6, r7\n\t"
  192617. #ifdef WOLFSSL_KEIL
  192618. "muls r5, r6, r5\n\t"
  192619. #elif defined(__clang__)
  192620. "muls r5, r6\n\t"
  192621. #else
  192622. "mul r5, r6\n\t"
  192623. #endif
  192624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192625. "lsrs r6, r5, #16\n\t"
  192626. #else
  192627. "lsr r6, r5, #16\n\t"
  192628. #endif
  192629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192630. "lsls r5, r5, #16\n\t"
  192631. #else
  192632. "lsl r5, r5, #16\n\t"
  192633. #endif
  192634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192635. "adds r2, r2, r5\n\t"
  192636. #else
  192637. "add r2, r2, r5\n\t"
  192638. #endif
  192639. #ifdef WOLFSSL_KEIL
  192640. "adcs r3, r3, r6\n\t"
  192641. #elif defined(__clang__)
  192642. "adcs r3, r6\n\t"
  192643. #else
  192644. "adc r3, r6\n\t"
  192645. #endif
  192646. #ifdef WOLFSSL_KEIL
  192647. "adcs r4, r4, %[r]\n\t"
  192648. #elif defined(__clang__)
  192649. "adcs r4, %[r]\n\t"
  192650. #else
  192651. "adc r4, %[r]\n\t"
  192652. #endif
  192653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192654. "adds r2, r2, r5\n\t"
  192655. #else
  192656. "add r2, r2, r5\n\t"
  192657. #endif
  192658. #ifdef WOLFSSL_KEIL
  192659. "adcs r3, r3, r6\n\t"
  192660. #elif defined(__clang__)
  192661. "adcs r3, r6\n\t"
  192662. #else
  192663. "adc r3, r6\n\t"
  192664. #endif
  192665. #ifdef WOLFSSL_KEIL
  192666. "adcs r4, r4, %[r]\n\t"
  192667. #elif defined(__clang__)
  192668. "adcs r4, %[r]\n\t"
  192669. #else
  192670. "adc r4, %[r]\n\t"
  192671. #endif
  192672. "mov %[r], r8\n\t"
  192673. "str r2, [%[r], #84]\n\t"
  192674. "movs %[r], #0\n\t"
  192675. "# A[15] * A[7]\n\t"
  192676. "movs r2, #0\n\t"
  192677. "mov %[a], r9\n\t"
  192678. "ldr r7, [%[a], #28]\n\t"
  192679. "mov %[a], lr\n\t"
  192680. "uxth r5, %[a]\n\t"
  192681. "uxth r6, r7\n\t"
  192682. #ifdef WOLFSSL_KEIL
  192683. "muls r6, r5, r6\n\t"
  192684. #elif defined(__clang__)
  192685. "muls r6, r5\n\t"
  192686. #else
  192687. "mul r6, r5\n\t"
  192688. #endif
  192689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192690. "adds r3, r3, r6\n\t"
  192691. #else
  192692. "add r3, r3, r6\n\t"
  192693. #endif
  192694. #ifdef WOLFSSL_KEIL
  192695. "adcs r4, r4, %[r]\n\t"
  192696. #elif defined(__clang__)
  192697. "adcs r4, %[r]\n\t"
  192698. #else
  192699. "adc r4, %[r]\n\t"
  192700. #endif
  192701. #ifdef WOLFSSL_KEIL
  192702. "adcs r2, r2, %[r]\n\t"
  192703. #elif defined(__clang__)
  192704. "adcs r2, %[r]\n\t"
  192705. #else
  192706. "adc r2, %[r]\n\t"
  192707. #endif
  192708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192709. "adds r3, r3, r6\n\t"
  192710. #else
  192711. "add r3, r3, r6\n\t"
  192712. #endif
  192713. #ifdef WOLFSSL_KEIL
  192714. "adcs r4, r4, %[r]\n\t"
  192715. #elif defined(__clang__)
  192716. "adcs r4, %[r]\n\t"
  192717. #else
  192718. "adc r4, %[r]\n\t"
  192719. #endif
  192720. #ifdef WOLFSSL_KEIL
  192721. "adcs r2, r2, %[r]\n\t"
  192722. #elif defined(__clang__)
  192723. "adcs r2, %[r]\n\t"
  192724. #else
  192725. "adc r2, %[r]\n\t"
  192726. #endif
  192727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192728. "lsrs r6, r7, #16\n\t"
  192729. #else
  192730. "lsr r6, r7, #16\n\t"
  192731. #endif
  192732. #ifdef WOLFSSL_KEIL
  192733. "muls r5, r6, r5\n\t"
  192734. #elif defined(__clang__)
  192735. "muls r5, r6\n\t"
  192736. #else
  192737. "mul r5, r6\n\t"
  192738. #endif
  192739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192740. "lsrs r6, r5, #16\n\t"
  192741. #else
  192742. "lsr r6, r5, #16\n\t"
  192743. #endif
  192744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192745. "lsls r5, r5, #16\n\t"
  192746. #else
  192747. "lsl r5, r5, #16\n\t"
  192748. #endif
  192749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192750. "adds r3, r3, r5\n\t"
  192751. #else
  192752. "add r3, r3, r5\n\t"
  192753. #endif
  192754. #ifdef WOLFSSL_KEIL
  192755. "adcs r4, r4, r6\n\t"
  192756. #elif defined(__clang__)
  192757. "adcs r4, r6\n\t"
  192758. #else
  192759. "adc r4, r6\n\t"
  192760. #endif
  192761. #ifdef WOLFSSL_KEIL
  192762. "adcs r2, r2, %[r]\n\t"
  192763. #elif defined(__clang__)
  192764. "adcs r2, %[r]\n\t"
  192765. #else
  192766. "adc r2, %[r]\n\t"
  192767. #endif
  192768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192769. "adds r3, r3, r5\n\t"
  192770. #else
  192771. "add r3, r3, r5\n\t"
  192772. #endif
  192773. #ifdef WOLFSSL_KEIL
  192774. "adcs r4, r4, r6\n\t"
  192775. #elif defined(__clang__)
  192776. "adcs r4, r6\n\t"
  192777. #else
  192778. "adc r4, r6\n\t"
  192779. #endif
  192780. #ifdef WOLFSSL_KEIL
  192781. "adcs r2, r2, %[r]\n\t"
  192782. #elif defined(__clang__)
  192783. "adcs r2, %[r]\n\t"
  192784. #else
  192785. "adc r2, %[r]\n\t"
  192786. #endif
  192787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192788. "lsrs r5, %[a], #16\n\t"
  192789. #else
  192790. "lsr r5, %[a], #16\n\t"
  192791. #endif
  192792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192793. "lsrs r6, r7, #16\n\t"
  192794. #else
  192795. "lsr r6, r7, #16\n\t"
  192796. #endif
  192797. #ifdef WOLFSSL_KEIL
  192798. "muls r6, r5, r6\n\t"
  192799. #elif defined(__clang__)
  192800. "muls r6, r5\n\t"
  192801. #else
  192802. "mul r6, r5\n\t"
  192803. #endif
  192804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192805. "adds r4, r4, r6\n\t"
  192806. #else
  192807. "add r4, r4, r6\n\t"
  192808. #endif
  192809. #ifdef WOLFSSL_KEIL
  192810. "adcs r2, r2, %[r]\n\t"
  192811. #elif defined(__clang__)
  192812. "adcs r2, %[r]\n\t"
  192813. #else
  192814. "adc r2, %[r]\n\t"
  192815. #endif
  192816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192817. "adds r4, r4, r6\n\t"
  192818. #else
  192819. "add r4, r4, r6\n\t"
  192820. #endif
  192821. #ifdef WOLFSSL_KEIL
  192822. "adcs r2, r2, %[r]\n\t"
  192823. #elif defined(__clang__)
  192824. "adcs r2, %[r]\n\t"
  192825. #else
  192826. "adc r2, %[r]\n\t"
  192827. #endif
  192828. "uxth r6, r7\n\t"
  192829. #ifdef WOLFSSL_KEIL
  192830. "muls r5, r6, r5\n\t"
  192831. #elif defined(__clang__)
  192832. "muls r5, r6\n\t"
  192833. #else
  192834. "mul r5, r6\n\t"
  192835. #endif
  192836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192837. "lsrs r6, r5, #16\n\t"
  192838. #else
  192839. "lsr r6, r5, #16\n\t"
  192840. #endif
  192841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192842. "lsls r5, r5, #16\n\t"
  192843. #else
  192844. "lsl r5, r5, #16\n\t"
  192845. #endif
  192846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192847. "adds r3, r3, r5\n\t"
  192848. #else
  192849. "add r3, r3, r5\n\t"
  192850. #endif
  192851. #ifdef WOLFSSL_KEIL
  192852. "adcs r4, r4, r6\n\t"
  192853. #elif defined(__clang__)
  192854. "adcs r4, r6\n\t"
  192855. #else
  192856. "adc r4, r6\n\t"
  192857. #endif
  192858. #ifdef WOLFSSL_KEIL
  192859. "adcs r2, r2, %[r]\n\t"
  192860. #elif defined(__clang__)
  192861. "adcs r2, %[r]\n\t"
  192862. #else
  192863. "adc r2, %[r]\n\t"
  192864. #endif
  192865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192866. "adds r3, r3, r5\n\t"
  192867. #else
  192868. "add r3, r3, r5\n\t"
  192869. #endif
  192870. #ifdef WOLFSSL_KEIL
  192871. "adcs r4, r4, r6\n\t"
  192872. #elif defined(__clang__)
  192873. "adcs r4, r6\n\t"
  192874. #else
  192875. "adc r4, r6\n\t"
  192876. #endif
  192877. #ifdef WOLFSSL_KEIL
  192878. "adcs r2, r2, %[r]\n\t"
  192879. #elif defined(__clang__)
  192880. "adcs r2, %[r]\n\t"
  192881. #else
  192882. "adc r2, %[r]\n\t"
  192883. #endif
  192884. "# A[14] * A[8]\n\t"
  192885. "mov %[a], r9\n\t"
  192886. "ldr r7, [%[a], #32]\n\t"
  192887. "mov %[a], r12\n\t"
  192888. "uxth r5, %[a]\n\t"
  192889. "uxth r6, r7\n\t"
  192890. #ifdef WOLFSSL_KEIL
  192891. "muls r6, r5, r6\n\t"
  192892. #elif defined(__clang__)
  192893. "muls r6, r5\n\t"
  192894. #else
  192895. "mul r6, r5\n\t"
  192896. #endif
  192897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192898. "adds r3, r3, r6\n\t"
  192899. #else
  192900. "add r3, r3, r6\n\t"
  192901. #endif
  192902. #ifdef WOLFSSL_KEIL
  192903. "adcs r4, r4, %[r]\n\t"
  192904. #elif defined(__clang__)
  192905. "adcs r4, %[r]\n\t"
  192906. #else
  192907. "adc r4, %[r]\n\t"
  192908. #endif
  192909. #ifdef WOLFSSL_KEIL
  192910. "adcs r2, r2, %[r]\n\t"
  192911. #elif defined(__clang__)
  192912. "adcs r2, %[r]\n\t"
  192913. #else
  192914. "adc r2, %[r]\n\t"
  192915. #endif
  192916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192917. "adds r3, r3, r6\n\t"
  192918. #else
  192919. "add r3, r3, r6\n\t"
  192920. #endif
  192921. #ifdef WOLFSSL_KEIL
  192922. "adcs r4, r4, %[r]\n\t"
  192923. #elif defined(__clang__)
  192924. "adcs r4, %[r]\n\t"
  192925. #else
  192926. "adc r4, %[r]\n\t"
  192927. #endif
  192928. #ifdef WOLFSSL_KEIL
  192929. "adcs r2, r2, %[r]\n\t"
  192930. #elif defined(__clang__)
  192931. "adcs r2, %[r]\n\t"
  192932. #else
  192933. "adc r2, %[r]\n\t"
  192934. #endif
  192935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192936. "lsrs r6, r7, #16\n\t"
  192937. #else
  192938. "lsr r6, r7, #16\n\t"
  192939. #endif
  192940. #ifdef WOLFSSL_KEIL
  192941. "muls r5, r6, r5\n\t"
  192942. #elif defined(__clang__)
  192943. "muls r5, r6\n\t"
  192944. #else
  192945. "mul r5, r6\n\t"
  192946. #endif
  192947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192948. "lsrs r6, r5, #16\n\t"
  192949. #else
  192950. "lsr r6, r5, #16\n\t"
  192951. #endif
  192952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192953. "lsls r5, r5, #16\n\t"
  192954. #else
  192955. "lsl r5, r5, #16\n\t"
  192956. #endif
  192957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192958. "adds r3, r3, r5\n\t"
  192959. #else
  192960. "add r3, r3, r5\n\t"
  192961. #endif
  192962. #ifdef WOLFSSL_KEIL
  192963. "adcs r4, r4, r6\n\t"
  192964. #elif defined(__clang__)
  192965. "adcs r4, r6\n\t"
  192966. #else
  192967. "adc r4, r6\n\t"
  192968. #endif
  192969. #ifdef WOLFSSL_KEIL
  192970. "adcs r2, r2, %[r]\n\t"
  192971. #elif defined(__clang__)
  192972. "adcs r2, %[r]\n\t"
  192973. #else
  192974. "adc r2, %[r]\n\t"
  192975. #endif
  192976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192977. "adds r3, r3, r5\n\t"
  192978. #else
  192979. "add r3, r3, r5\n\t"
  192980. #endif
  192981. #ifdef WOLFSSL_KEIL
  192982. "adcs r4, r4, r6\n\t"
  192983. #elif defined(__clang__)
  192984. "adcs r4, r6\n\t"
  192985. #else
  192986. "adc r4, r6\n\t"
  192987. #endif
  192988. #ifdef WOLFSSL_KEIL
  192989. "adcs r2, r2, %[r]\n\t"
  192990. #elif defined(__clang__)
  192991. "adcs r2, %[r]\n\t"
  192992. #else
  192993. "adc r2, %[r]\n\t"
  192994. #endif
  192995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192996. "lsrs r5, %[a], #16\n\t"
  192997. #else
  192998. "lsr r5, %[a], #16\n\t"
  192999. #endif
  193000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193001. "lsrs r6, r7, #16\n\t"
  193002. #else
  193003. "lsr r6, r7, #16\n\t"
  193004. #endif
  193005. #ifdef WOLFSSL_KEIL
  193006. "muls r6, r5, r6\n\t"
  193007. #elif defined(__clang__)
  193008. "muls r6, r5\n\t"
  193009. #else
  193010. "mul r6, r5\n\t"
  193011. #endif
  193012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193013. "adds r4, r4, r6\n\t"
  193014. #else
  193015. "add r4, r4, r6\n\t"
  193016. #endif
  193017. #ifdef WOLFSSL_KEIL
  193018. "adcs r2, r2, %[r]\n\t"
  193019. #elif defined(__clang__)
  193020. "adcs r2, %[r]\n\t"
  193021. #else
  193022. "adc r2, %[r]\n\t"
  193023. #endif
  193024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193025. "adds r4, r4, r6\n\t"
  193026. #else
  193027. "add r4, r4, r6\n\t"
  193028. #endif
  193029. #ifdef WOLFSSL_KEIL
  193030. "adcs r2, r2, %[r]\n\t"
  193031. #elif defined(__clang__)
  193032. "adcs r2, %[r]\n\t"
  193033. #else
  193034. "adc r2, %[r]\n\t"
  193035. #endif
  193036. "uxth r6, r7\n\t"
  193037. #ifdef WOLFSSL_KEIL
  193038. "muls r5, r6, r5\n\t"
  193039. #elif defined(__clang__)
  193040. "muls r5, r6\n\t"
  193041. #else
  193042. "mul r5, r6\n\t"
  193043. #endif
  193044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193045. "lsrs r6, r5, #16\n\t"
  193046. #else
  193047. "lsr r6, r5, #16\n\t"
  193048. #endif
  193049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193050. "lsls r5, r5, #16\n\t"
  193051. #else
  193052. "lsl r5, r5, #16\n\t"
  193053. #endif
  193054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193055. "adds r3, r3, r5\n\t"
  193056. #else
  193057. "add r3, r3, r5\n\t"
  193058. #endif
  193059. #ifdef WOLFSSL_KEIL
  193060. "adcs r4, r4, r6\n\t"
  193061. #elif defined(__clang__)
  193062. "adcs r4, r6\n\t"
  193063. #else
  193064. "adc r4, r6\n\t"
  193065. #endif
  193066. #ifdef WOLFSSL_KEIL
  193067. "adcs r2, r2, %[r]\n\t"
  193068. #elif defined(__clang__)
  193069. "adcs r2, %[r]\n\t"
  193070. #else
  193071. "adc r2, %[r]\n\t"
  193072. #endif
  193073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193074. "adds r3, r3, r5\n\t"
  193075. #else
  193076. "add r3, r3, r5\n\t"
  193077. #endif
  193078. #ifdef WOLFSSL_KEIL
  193079. "adcs r4, r4, r6\n\t"
  193080. #elif defined(__clang__)
  193081. "adcs r4, r6\n\t"
  193082. #else
  193083. "adc r4, r6\n\t"
  193084. #endif
  193085. #ifdef WOLFSSL_KEIL
  193086. "adcs r2, r2, %[r]\n\t"
  193087. #elif defined(__clang__)
  193088. "adcs r2, %[r]\n\t"
  193089. #else
  193090. "adc r2, %[r]\n\t"
  193091. #endif
  193092. "# A[13] * A[9]\n\t"
  193093. "mov %[a], r9\n\t"
  193094. "ldr r7, [%[a], #36]\n\t"
  193095. "mov %[a], r11\n\t"
  193096. "uxth r5, %[a]\n\t"
  193097. "uxth r6, r7\n\t"
  193098. #ifdef WOLFSSL_KEIL
  193099. "muls r6, r5, r6\n\t"
  193100. #elif defined(__clang__)
  193101. "muls r6, r5\n\t"
  193102. #else
  193103. "mul r6, r5\n\t"
  193104. #endif
  193105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193106. "adds r3, r3, r6\n\t"
  193107. #else
  193108. "add r3, r3, r6\n\t"
  193109. #endif
  193110. #ifdef WOLFSSL_KEIL
  193111. "adcs r4, r4, %[r]\n\t"
  193112. #elif defined(__clang__)
  193113. "adcs r4, %[r]\n\t"
  193114. #else
  193115. "adc r4, %[r]\n\t"
  193116. #endif
  193117. #ifdef WOLFSSL_KEIL
  193118. "adcs r2, r2, %[r]\n\t"
  193119. #elif defined(__clang__)
  193120. "adcs r2, %[r]\n\t"
  193121. #else
  193122. "adc r2, %[r]\n\t"
  193123. #endif
  193124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193125. "adds r3, r3, r6\n\t"
  193126. #else
  193127. "add r3, r3, r6\n\t"
  193128. #endif
  193129. #ifdef WOLFSSL_KEIL
  193130. "adcs r4, r4, %[r]\n\t"
  193131. #elif defined(__clang__)
  193132. "adcs r4, %[r]\n\t"
  193133. #else
  193134. "adc r4, %[r]\n\t"
  193135. #endif
  193136. #ifdef WOLFSSL_KEIL
  193137. "adcs r2, r2, %[r]\n\t"
  193138. #elif defined(__clang__)
  193139. "adcs r2, %[r]\n\t"
  193140. #else
  193141. "adc r2, %[r]\n\t"
  193142. #endif
  193143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193144. "lsrs r6, r7, #16\n\t"
  193145. #else
  193146. "lsr r6, r7, #16\n\t"
  193147. #endif
  193148. #ifdef WOLFSSL_KEIL
  193149. "muls r5, r6, r5\n\t"
  193150. #elif defined(__clang__)
  193151. "muls r5, r6\n\t"
  193152. #else
  193153. "mul r5, r6\n\t"
  193154. #endif
  193155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193156. "lsrs r6, r5, #16\n\t"
  193157. #else
  193158. "lsr r6, r5, #16\n\t"
  193159. #endif
  193160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193161. "lsls r5, r5, #16\n\t"
  193162. #else
  193163. "lsl r5, r5, #16\n\t"
  193164. #endif
  193165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193166. "adds r3, r3, r5\n\t"
  193167. #else
  193168. "add r3, r3, r5\n\t"
  193169. #endif
  193170. #ifdef WOLFSSL_KEIL
  193171. "adcs r4, r4, r6\n\t"
  193172. #elif defined(__clang__)
  193173. "adcs r4, r6\n\t"
  193174. #else
  193175. "adc r4, r6\n\t"
  193176. #endif
  193177. #ifdef WOLFSSL_KEIL
  193178. "adcs r2, r2, %[r]\n\t"
  193179. #elif defined(__clang__)
  193180. "adcs r2, %[r]\n\t"
  193181. #else
  193182. "adc r2, %[r]\n\t"
  193183. #endif
  193184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193185. "adds r3, r3, r5\n\t"
  193186. #else
  193187. "add r3, r3, r5\n\t"
  193188. #endif
  193189. #ifdef WOLFSSL_KEIL
  193190. "adcs r4, r4, r6\n\t"
  193191. #elif defined(__clang__)
  193192. "adcs r4, r6\n\t"
  193193. #else
  193194. "adc r4, r6\n\t"
  193195. #endif
  193196. #ifdef WOLFSSL_KEIL
  193197. "adcs r2, r2, %[r]\n\t"
  193198. #elif defined(__clang__)
  193199. "adcs r2, %[r]\n\t"
  193200. #else
  193201. "adc r2, %[r]\n\t"
  193202. #endif
  193203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193204. "lsrs r5, %[a], #16\n\t"
  193205. #else
  193206. "lsr r5, %[a], #16\n\t"
  193207. #endif
  193208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193209. "lsrs r6, r7, #16\n\t"
  193210. #else
  193211. "lsr r6, r7, #16\n\t"
  193212. #endif
  193213. #ifdef WOLFSSL_KEIL
  193214. "muls r6, r5, r6\n\t"
  193215. #elif defined(__clang__)
  193216. "muls r6, r5\n\t"
  193217. #else
  193218. "mul r6, r5\n\t"
  193219. #endif
  193220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193221. "adds r4, r4, r6\n\t"
  193222. #else
  193223. "add r4, r4, r6\n\t"
  193224. #endif
  193225. #ifdef WOLFSSL_KEIL
  193226. "adcs r2, r2, %[r]\n\t"
  193227. #elif defined(__clang__)
  193228. "adcs r2, %[r]\n\t"
  193229. #else
  193230. "adc r2, %[r]\n\t"
  193231. #endif
  193232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193233. "adds r4, r4, r6\n\t"
  193234. #else
  193235. "add r4, r4, r6\n\t"
  193236. #endif
  193237. #ifdef WOLFSSL_KEIL
  193238. "adcs r2, r2, %[r]\n\t"
  193239. #elif defined(__clang__)
  193240. "adcs r2, %[r]\n\t"
  193241. #else
  193242. "adc r2, %[r]\n\t"
  193243. #endif
  193244. "uxth r6, r7\n\t"
  193245. #ifdef WOLFSSL_KEIL
  193246. "muls r5, r6, r5\n\t"
  193247. #elif defined(__clang__)
  193248. "muls r5, r6\n\t"
  193249. #else
  193250. "mul r5, r6\n\t"
  193251. #endif
  193252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193253. "lsrs r6, r5, #16\n\t"
  193254. #else
  193255. "lsr r6, r5, #16\n\t"
  193256. #endif
  193257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193258. "lsls r5, r5, #16\n\t"
  193259. #else
  193260. "lsl r5, r5, #16\n\t"
  193261. #endif
  193262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193263. "adds r3, r3, r5\n\t"
  193264. #else
  193265. "add r3, r3, r5\n\t"
  193266. #endif
  193267. #ifdef WOLFSSL_KEIL
  193268. "adcs r4, r4, r6\n\t"
  193269. #elif defined(__clang__)
  193270. "adcs r4, r6\n\t"
  193271. #else
  193272. "adc r4, r6\n\t"
  193273. #endif
  193274. #ifdef WOLFSSL_KEIL
  193275. "adcs r2, r2, %[r]\n\t"
  193276. #elif defined(__clang__)
  193277. "adcs r2, %[r]\n\t"
  193278. #else
  193279. "adc r2, %[r]\n\t"
  193280. #endif
  193281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193282. "adds r3, r3, r5\n\t"
  193283. #else
  193284. "add r3, r3, r5\n\t"
  193285. #endif
  193286. #ifdef WOLFSSL_KEIL
  193287. "adcs r4, r4, r6\n\t"
  193288. #elif defined(__clang__)
  193289. "adcs r4, r6\n\t"
  193290. #else
  193291. "adc r4, r6\n\t"
  193292. #endif
  193293. #ifdef WOLFSSL_KEIL
  193294. "adcs r2, r2, %[r]\n\t"
  193295. #elif defined(__clang__)
  193296. "adcs r2, %[r]\n\t"
  193297. #else
  193298. "adc r2, %[r]\n\t"
  193299. #endif
  193300. "# A[12] * A[10]\n\t"
  193301. "mov %[a], r9\n\t"
  193302. "ldr r7, [%[a], #40]\n\t"
  193303. "mov %[a], r10\n\t"
  193304. "uxth r5, %[a]\n\t"
  193305. "uxth r6, r7\n\t"
  193306. #ifdef WOLFSSL_KEIL
  193307. "muls r6, r5, r6\n\t"
  193308. #elif defined(__clang__)
  193309. "muls r6, r5\n\t"
  193310. #else
  193311. "mul r6, r5\n\t"
  193312. #endif
  193313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193314. "adds r3, r3, r6\n\t"
  193315. #else
  193316. "add r3, r3, r6\n\t"
  193317. #endif
  193318. #ifdef WOLFSSL_KEIL
  193319. "adcs r4, r4, %[r]\n\t"
  193320. #elif defined(__clang__)
  193321. "adcs r4, %[r]\n\t"
  193322. #else
  193323. "adc r4, %[r]\n\t"
  193324. #endif
  193325. #ifdef WOLFSSL_KEIL
  193326. "adcs r2, r2, %[r]\n\t"
  193327. #elif defined(__clang__)
  193328. "adcs r2, %[r]\n\t"
  193329. #else
  193330. "adc r2, %[r]\n\t"
  193331. #endif
  193332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193333. "adds r3, r3, r6\n\t"
  193334. #else
  193335. "add r3, r3, r6\n\t"
  193336. #endif
  193337. #ifdef WOLFSSL_KEIL
  193338. "adcs r4, r4, %[r]\n\t"
  193339. #elif defined(__clang__)
  193340. "adcs r4, %[r]\n\t"
  193341. #else
  193342. "adc r4, %[r]\n\t"
  193343. #endif
  193344. #ifdef WOLFSSL_KEIL
  193345. "adcs r2, r2, %[r]\n\t"
  193346. #elif defined(__clang__)
  193347. "adcs r2, %[r]\n\t"
  193348. #else
  193349. "adc r2, %[r]\n\t"
  193350. #endif
  193351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193352. "lsrs r6, r7, #16\n\t"
  193353. #else
  193354. "lsr r6, r7, #16\n\t"
  193355. #endif
  193356. #ifdef WOLFSSL_KEIL
  193357. "muls r5, r6, r5\n\t"
  193358. #elif defined(__clang__)
  193359. "muls r5, r6\n\t"
  193360. #else
  193361. "mul r5, r6\n\t"
  193362. #endif
  193363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193364. "lsrs r6, r5, #16\n\t"
  193365. #else
  193366. "lsr r6, r5, #16\n\t"
  193367. #endif
  193368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193369. "lsls r5, r5, #16\n\t"
  193370. #else
  193371. "lsl r5, r5, #16\n\t"
  193372. #endif
  193373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193374. "adds r3, r3, r5\n\t"
  193375. #else
  193376. "add r3, r3, r5\n\t"
  193377. #endif
  193378. #ifdef WOLFSSL_KEIL
  193379. "adcs r4, r4, r6\n\t"
  193380. #elif defined(__clang__)
  193381. "adcs r4, r6\n\t"
  193382. #else
  193383. "adc r4, r6\n\t"
  193384. #endif
  193385. #ifdef WOLFSSL_KEIL
  193386. "adcs r2, r2, %[r]\n\t"
  193387. #elif defined(__clang__)
  193388. "adcs r2, %[r]\n\t"
  193389. #else
  193390. "adc r2, %[r]\n\t"
  193391. #endif
  193392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193393. "adds r3, r3, r5\n\t"
  193394. #else
  193395. "add r3, r3, r5\n\t"
  193396. #endif
  193397. #ifdef WOLFSSL_KEIL
  193398. "adcs r4, r4, r6\n\t"
  193399. #elif defined(__clang__)
  193400. "adcs r4, r6\n\t"
  193401. #else
  193402. "adc r4, r6\n\t"
  193403. #endif
  193404. #ifdef WOLFSSL_KEIL
  193405. "adcs r2, r2, %[r]\n\t"
  193406. #elif defined(__clang__)
  193407. "adcs r2, %[r]\n\t"
  193408. #else
  193409. "adc r2, %[r]\n\t"
  193410. #endif
  193411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193412. "lsrs r5, %[a], #16\n\t"
  193413. #else
  193414. "lsr r5, %[a], #16\n\t"
  193415. #endif
  193416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193417. "lsrs r6, r7, #16\n\t"
  193418. #else
  193419. "lsr r6, r7, #16\n\t"
  193420. #endif
  193421. #ifdef WOLFSSL_KEIL
  193422. "muls r6, r5, r6\n\t"
  193423. #elif defined(__clang__)
  193424. "muls r6, r5\n\t"
  193425. #else
  193426. "mul r6, r5\n\t"
  193427. #endif
  193428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193429. "adds r4, r4, r6\n\t"
  193430. #else
  193431. "add r4, r4, r6\n\t"
  193432. #endif
  193433. #ifdef WOLFSSL_KEIL
  193434. "adcs r2, r2, %[r]\n\t"
  193435. #elif defined(__clang__)
  193436. "adcs r2, %[r]\n\t"
  193437. #else
  193438. "adc r2, %[r]\n\t"
  193439. #endif
  193440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193441. "adds r4, r4, r6\n\t"
  193442. #else
  193443. "add r4, r4, r6\n\t"
  193444. #endif
  193445. #ifdef WOLFSSL_KEIL
  193446. "adcs r2, r2, %[r]\n\t"
  193447. #elif defined(__clang__)
  193448. "adcs r2, %[r]\n\t"
  193449. #else
  193450. "adc r2, %[r]\n\t"
  193451. #endif
  193452. "uxth r6, r7\n\t"
  193453. #ifdef WOLFSSL_KEIL
  193454. "muls r5, r6, r5\n\t"
  193455. #elif defined(__clang__)
  193456. "muls r5, r6\n\t"
  193457. #else
  193458. "mul r5, r6\n\t"
  193459. #endif
  193460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193461. "lsrs r6, r5, #16\n\t"
  193462. #else
  193463. "lsr r6, r5, #16\n\t"
  193464. #endif
  193465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193466. "lsls r5, r5, #16\n\t"
  193467. #else
  193468. "lsl r5, r5, #16\n\t"
  193469. #endif
  193470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193471. "adds r3, r3, r5\n\t"
  193472. #else
  193473. "add r3, r3, r5\n\t"
  193474. #endif
  193475. #ifdef WOLFSSL_KEIL
  193476. "adcs r4, r4, r6\n\t"
  193477. #elif defined(__clang__)
  193478. "adcs r4, r6\n\t"
  193479. #else
  193480. "adc r4, r6\n\t"
  193481. #endif
  193482. #ifdef WOLFSSL_KEIL
  193483. "adcs r2, r2, %[r]\n\t"
  193484. #elif defined(__clang__)
  193485. "adcs r2, %[r]\n\t"
  193486. #else
  193487. "adc r2, %[r]\n\t"
  193488. #endif
  193489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193490. "adds r3, r3, r5\n\t"
  193491. #else
  193492. "add r3, r3, r5\n\t"
  193493. #endif
  193494. #ifdef WOLFSSL_KEIL
  193495. "adcs r4, r4, r6\n\t"
  193496. #elif defined(__clang__)
  193497. "adcs r4, r6\n\t"
  193498. #else
  193499. "adc r4, r6\n\t"
  193500. #endif
  193501. #ifdef WOLFSSL_KEIL
  193502. "adcs r2, r2, %[r]\n\t"
  193503. #elif defined(__clang__)
  193504. "adcs r2, %[r]\n\t"
  193505. #else
  193506. "adc r2, %[r]\n\t"
  193507. #endif
  193508. "# A[11] * A[11]\n\t"
  193509. "mov %[a], r9\n\t"
  193510. "ldr r7, [%[a], #44]\n\t"
  193511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193512. "lsrs r6, r7, #16\n\t"
  193513. #else
  193514. "lsr r6, r7, #16\n\t"
  193515. #endif
  193516. "uxth r5, r7\n\t"
  193517. #ifdef WOLFSSL_KEIL
  193518. "muls r5, r5, r5\n\t"
  193519. #elif defined(__clang__)
  193520. "muls r5, r5\n\t"
  193521. #else
  193522. "mul r5, r5\n\t"
  193523. #endif
  193524. #ifdef WOLFSSL_KEIL
  193525. "muls r6, r6, r6\n\t"
  193526. #elif defined(__clang__)
  193527. "muls r6, r6\n\t"
  193528. #else
  193529. "mul r6, r6\n\t"
  193530. #endif
  193531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193532. "adds r3, r3, r5\n\t"
  193533. #else
  193534. "add r3, r3, r5\n\t"
  193535. #endif
  193536. #ifdef WOLFSSL_KEIL
  193537. "adcs r4, r4, r6\n\t"
  193538. #elif defined(__clang__)
  193539. "adcs r4, r6\n\t"
  193540. #else
  193541. "adc r4, r6\n\t"
  193542. #endif
  193543. #ifdef WOLFSSL_KEIL
  193544. "adcs r2, r2, %[r]\n\t"
  193545. #elif defined(__clang__)
  193546. "adcs r2, %[r]\n\t"
  193547. #else
  193548. "adc r2, %[r]\n\t"
  193549. #endif
  193550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193551. "lsrs r6, r7, #16\n\t"
  193552. #else
  193553. "lsr r6, r7, #16\n\t"
  193554. #endif
  193555. "uxth r5, r7\n\t"
  193556. #ifdef WOLFSSL_KEIL
  193557. "muls r5, r6, r5\n\t"
  193558. #elif defined(__clang__)
  193559. "muls r5, r6\n\t"
  193560. #else
  193561. "mul r5, r6\n\t"
  193562. #endif
  193563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193564. "lsrs r6, r5, #15\n\t"
  193565. #else
  193566. "lsr r6, r5, #15\n\t"
  193567. #endif
  193568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193569. "lsls r5, r5, #17\n\t"
  193570. #else
  193571. "lsl r5, r5, #17\n\t"
  193572. #endif
  193573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193574. "adds r3, r3, r5\n\t"
  193575. #else
  193576. "add r3, r3, r5\n\t"
  193577. #endif
  193578. #ifdef WOLFSSL_KEIL
  193579. "adcs r4, r4, r6\n\t"
  193580. #elif defined(__clang__)
  193581. "adcs r4, r6\n\t"
  193582. #else
  193583. "adc r4, r6\n\t"
  193584. #endif
  193585. #ifdef WOLFSSL_KEIL
  193586. "adcs r2, r2, %[r]\n\t"
  193587. #elif defined(__clang__)
  193588. "adcs r2, %[r]\n\t"
  193589. #else
  193590. "adc r2, %[r]\n\t"
  193591. #endif
  193592. "mov %[r], r8\n\t"
  193593. "str r3, [%[r], #88]\n\t"
  193594. "movs %[r], #0\n\t"
  193595. "# A[12] * A[11]\n\t"
  193596. "movs r3, #0\n\t"
  193597. "mov %[a], r10\n\t"
  193598. "uxth r5, %[a]\n\t"
  193599. "uxth r6, r7\n\t"
  193600. #ifdef WOLFSSL_KEIL
  193601. "muls r6, r5, r6\n\t"
  193602. #elif defined(__clang__)
  193603. "muls r6, r5\n\t"
  193604. #else
  193605. "mul r6, r5\n\t"
  193606. #endif
  193607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193608. "adds r4, r4, r6\n\t"
  193609. #else
  193610. "add r4, r4, r6\n\t"
  193611. #endif
  193612. #ifdef WOLFSSL_KEIL
  193613. "adcs r2, r2, %[r]\n\t"
  193614. #elif defined(__clang__)
  193615. "adcs r2, %[r]\n\t"
  193616. #else
  193617. "adc r2, %[r]\n\t"
  193618. #endif
  193619. #ifdef WOLFSSL_KEIL
  193620. "adcs r3, r3, %[r]\n\t"
  193621. #elif defined(__clang__)
  193622. "adcs r3, %[r]\n\t"
  193623. #else
  193624. "adc r3, %[r]\n\t"
  193625. #endif
  193626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193627. "adds r4, r4, r6\n\t"
  193628. #else
  193629. "add r4, r4, r6\n\t"
  193630. #endif
  193631. #ifdef WOLFSSL_KEIL
  193632. "adcs r2, r2, %[r]\n\t"
  193633. #elif defined(__clang__)
  193634. "adcs r2, %[r]\n\t"
  193635. #else
  193636. "adc r2, %[r]\n\t"
  193637. #endif
  193638. #ifdef WOLFSSL_KEIL
  193639. "adcs r3, r3, %[r]\n\t"
  193640. #elif defined(__clang__)
  193641. "adcs r3, %[r]\n\t"
  193642. #else
  193643. "adc r3, %[r]\n\t"
  193644. #endif
  193645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193646. "lsrs r6, r7, #16\n\t"
  193647. #else
  193648. "lsr r6, r7, #16\n\t"
  193649. #endif
  193650. #ifdef WOLFSSL_KEIL
  193651. "muls r5, r6, r5\n\t"
  193652. #elif defined(__clang__)
  193653. "muls r5, r6\n\t"
  193654. #else
  193655. "mul r5, r6\n\t"
  193656. #endif
  193657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193658. "lsrs r6, r5, #16\n\t"
  193659. #else
  193660. "lsr r6, r5, #16\n\t"
  193661. #endif
  193662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193663. "lsls r5, r5, #16\n\t"
  193664. #else
  193665. "lsl r5, r5, #16\n\t"
  193666. #endif
  193667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193668. "adds r4, r4, r5\n\t"
  193669. #else
  193670. "add r4, r4, r5\n\t"
  193671. #endif
  193672. #ifdef WOLFSSL_KEIL
  193673. "adcs r2, r2, r6\n\t"
  193674. #elif defined(__clang__)
  193675. "adcs r2, r6\n\t"
  193676. #else
  193677. "adc r2, r6\n\t"
  193678. #endif
  193679. #ifdef WOLFSSL_KEIL
  193680. "adcs r3, r3, %[r]\n\t"
  193681. #elif defined(__clang__)
  193682. "adcs r3, %[r]\n\t"
  193683. #else
  193684. "adc r3, %[r]\n\t"
  193685. #endif
  193686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193687. "adds r4, r4, r5\n\t"
  193688. #else
  193689. "add r4, r4, r5\n\t"
  193690. #endif
  193691. #ifdef WOLFSSL_KEIL
  193692. "adcs r2, r2, r6\n\t"
  193693. #elif defined(__clang__)
  193694. "adcs r2, r6\n\t"
  193695. #else
  193696. "adc r2, r6\n\t"
  193697. #endif
  193698. #ifdef WOLFSSL_KEIL
  193699. "adcs r3, r3, %[r]\n\t"
  193700. #elif defined(__clang__)
  193701. "adcs r3, %[r]\n\t"
  193702. #else
  193703. "adc r3, %[r]\n\t"
  193704. #endif
  193705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193706. "lsrs r5, %[a], #16\n\t"
  193707. #else
  193708. "lsr r5, %[a], #16\n\t"
  193709. #endif
  193710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193711. "lsrs r6, r7, #16\n\t"
  193712. #else
  193713. "lsr r6, r7, #16\n\t"
  193714. #endif
  193715. #ifdef WOLFSSL_KEIL
  193716. "muls r6, r5, r6\n\t"
  193717. #elif defined(__clang__)
  193718. "muls r6, r5\n\t"
  193719. #else
  193720. "mul r6, r5\n\t"
  193721. #endif
  193722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193723. "adds r2, r2, r6\n\t"
  193724. #else
  193725. "add r2, r2, r6\n\t"
  193726. #endif
  193727. #ifdef WOLFSSL_KEIL
  193728. "adcs r3, r3, %[r]\n\t"
  193729. #elif defined(__clang__)
  193730. "adcs r3, %[r]\n\t"
  193731. #else
  193732. "adc r3, %[r]\n\t"
  193733. #endif
  193734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193735. "adds r2, r2, r6\n\t"
  193736. #else
  193737. "add r2, r2, r6\n\t"
  193738. #endif
  193739. #ifdef WOLFSSL_KEIL
  193740. "adcs r3, r3, %[r]\n\t"
  193741. #elif defined(__clang__)
  193742. "adcs r3, %[r]\n\t"
  193743. #else
  193744. "adc r3, %[r]\n\t"
  193745. #endif
  193746. "uxth r6, r7\n\t"
  193747. #ifdef WOLFSSL_KEIL
  193748. "muls r5, r6, r5\n\t"
  193749. #elif defined(__clang__)
  193750. "muls r5, r6\n\t"
  193751. #else
  193752. "mul r5, r6\n\t"
  193753. #endif
  193754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193755. "lsrs r6, r5, #16\n\t"
  193756. #else
  193757. "lsr r6, r5, #16\n\t"
  193758. #endif
  193759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193760. "lsls r5, r5, #16\n\t"
  193761. #else
  193762. "lsl r5, r5, #16\n\t"
  193763. #endif
  193764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193765. "adds r4, r4, r5\n\t"
  193766. #else
  193767. "add r4, r4, r5\n\t"
  193768. #endif
  193769. #ifdef WOLFSSL_KEIL
  193770. "adcs r2, r2, r6\n\t"
  193771. #elif defined(__clang__)
  193772. "adcs r2, r6\n\t"
  193773. #else
  193774. "adc r2, r6\n\t"
  193775. #endif
  193776. #ifdef WOLFSSL_KEIL
  193777. "adcs r3, r3, %[r]\n\t"
  193778. #elif defined(__clang__)
  193779. "adcs r3, %[r]\n\t"
  193780. #else
  193781. "adc r3, %[r]\n\t"
  193782. #endif
  193783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193784. "adds r4, r4, r5\n\t"
  193785. #else
  193786. "add r4, r4, r5\n\t"
  193787. #endif
  193788. #ifdef WOLFSSL_KEIL
  193789. "adcs r2, r2, r6\n\t"
  193790. #elif defined(__clang__)
  193791. "adcs r2, r6\n\t"
  193792. #else
  193793. "adc r2, r6\n\t"
  193794. #endif
  193795. #ifdef WOLFSSL_KEIL
  193796. "adcs r3, r3, %[r]\n\t"
  193797. #elif defined(__clang__)
  193798. "adcs r3, %[r]\n\t"
  193799. #else
  193800. "adc r3, %[r]\n\t"
  193801. #endif
  193802. "# A[13] * A[10]\n\t"
  193803. "mov %[a], r9\n\t"
  193804. "ldr r7, [%[a], #40]\n\t"
  193805. "mov %[a], r11\n\t"
  193806. "uxth r5, %[a]\n\t"
  193807. "uxth r6, r7\n\t"
  193808. #ifdef WOLFSSL_KEIL
  193809. "muls r6, r5, r6\n\t"
  193810. #elif defined(__clang__)
  193811. "muls r6, r5\n\t"
  193812. #else
  193813. "mul r6, r5\n\t"
  193814. #endif
  193815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193816. "adds r4, r4, r6\n\t"
  193817. #else
  193818. "add r4, r4, r6\n\t"
  193819. #endif
  193820. #ifdef WOLFSSL_KEIL
  193821. "adcs r2, r2, %[r]\n\t"
  193822. #elif defined(__clang__)
  193823. "adcs r2, %[r]\n\t"
  193824. #else
  193825. "adc r2, %[r]\n\t"
  193826. #endif
  193827. #ifdef WOLFSSL_KEIL
  193828. "adcs r3, r3, %[r]\n\t"
  193829. #elif defined(__clang__)
  193830. "adcs r3, %[r]\n\t"
  193831. #else
  193832. "adc r3, %[r]\n\t"
  193833. #endif
  193834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193835. "adds r4, r4, r6\n\t"
  193836. #else
  193837. "add r4, r4, r6\n\t"
  193838. #endif
  193839. #ifdef WOLFSSL_KEIL
  193840. "adcs r2, r2, %[r]\n\t"
  193841. #elif defined(__clang__)
  193842. "adcs r2, %[r]\n\t"
  193843. #else
  193844. "adc r2, %[r]\n\t"
  193845. #endif
  193846. #ifdef WOLFSSL_KEIL
  193847. "adcs r3, r3, %[r]\n\t"
  193848. #elif defined(__clang__)
  193849. "adcs r3, %[r]\n\t"
  193850. #else
  193851. "adc r3, %[r]\n\t"
  193852. #endif
  193853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193854. "lsrs r6, r7, #16\n\t"
  193855. #else
  193856. "lsr r6, r7, #16\n\t"
  193857. #endif
  193858. #ifdef WOLFSSL_KEIL
  193859. "muls r5, r6, r5\n\t"
  193860. #elif defined(__clang__)
  193861. "muls r5, r6\n\t"
  193862. #else
  193863. "mul r5, r6\n\t"
  193864. #endif
  193865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193866. "lsrs r6, r5, #16\n\t"
  193867. #else
  193868. "lsr r6, r5, #16\n\t"
  193869. #endif
  193870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193871. "lsls r5, r5, #16\n\t"
  193872. #else
  193873. "lsl r5, r5, #16\n\t"
  193874. #endif
  193875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193876. "adds r4, r4, r5\n\t"
  193877. #else
  193878. "add r4, r4, r5\n\t"
  193879. #endif
  193880. #ifdef WOLFSSL_KEIL
  193881. "adcs r2, r2, r6\n\t"
  193882. #elif defined(__clang__)
  193883. "adcs r2, r6\n\t"
  193884. #else
  193885. "adc r2, r6\n\t"
  193886. #endif
  193887. #ifdef WOLFSSL_KEIL
  193888. "adcs r3, r3, %[r]\n\t"
  193889. #elif defined(__clang__)
  193890. "adcs r3, %[r]\n\t"
  193891. #else
  193892. "adc r3, %[r]\n\t"
  193893. #endif
  193894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193895. "adds r4, r4, r5\n\t"
  193896. #else
  193897. "add r4, r4, r5\n\t"
  193898. #endif
  193899. #ifdef WOLFSSL_KEIL
  193900. "adcs r2, r2, r6\n\t"
  193901. #elif defined(__clang__)
  193902. "adcs r2, r6\n\t"
  193903. #else
  193904. "adc r2, r6\n\t"
  193905. #endif
  193906. #ifdef WOLFSSL_KEIL
  193907. "adcs r3, r3, %[r]\n\t"
  193908. #elif defined(__clang__)
  193909. "adcs r3, %[r]\n\t"
  193910. #else
  193911. "adc r3, %[r]\n\t"
  193912. #endif
  193913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193914. "lsrs r5, %[a], #16\n\t"
  193915. #else
  193916. "lsr r5, %[a], #16\n\t"
  193917. #endif
  193918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193919. "lsrs r6, r7, #16\n\t"
  193920. #else
  193921. "lsr r6, r7, #16\n\t"
  193922. #endif
  193923. #ifdef WOLFSSL_KEIL
  193924. "muls r6, r5, r6\n\t"
  193925. #elif defined(__clang__)
  193926. "muls r6, r5\n\t"
  193927. #else
  193928. "mul r6, r5\n\t"
  193929. #endif
  193930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193931. "adds r2, r2, r6\n\t"
  193932. #else
  193933. "add r2, r2, r6\n\t"
  193934. #endif
  193935. #ifdef WOLFSSL_KEIL
  193936. "adcs r3, r3, %[r]\n\t"
  193937. #elif defined(__clang__)
  193938. "adcs r3, %[r]\n\t"
  193939. #else
  193940. "adc r3, %[r]\n\t"
  193941. #endif
  193942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193943. "adds r2, r2, r6\n\t"
  193944. #else
  193945. "add r2, r2, r6\n\t"
  193946. #endif
  193947. #ifdef WOLFSSL_KEIL
  193948. "adcs r3, r3, %[r]\n\t"
  193949. #elif defined(__clang__)
  193950. "adcs r3, %[r]\n\t"
  193951. #else
  193952. "adc r3, %[r]\n\t"
  193953. #endif
  193954. "uxth r6, r7\n\t"
  193955. #ifdef WOLFSSL_KEIL
  193956. "muls r5, r6, r5\n\t"
  193957. #elif defined(__clang__)
  193958. "muls r5, r6\n\t"
  193959. #else
  193960. "mul r5, r6\n\t"
  193961. #endif
  193962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193963. "lsrs r6, r5, #16\n\t"
  193964. #else
  193965. "lsr r6, r5, #16\n\t"
  193966. #endif
  193967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193968. "lsls r5, r5, #16\n\t"
  193969. #else
  193970. "lsl r5, r5, #16\n\t"
  193971. #endif
  193972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193973. "adds r4, r4, r5\n\t"
  193974. #else
  193975. "add r4, r4, r5\n\t"
  193976. #endif
  193977. #ifdef WOLFSSL_KEIL
  193978. "adcs r2, r2, r6\n\t"
  193979. #elif defined(__clang__)
  193980. "adcs r2, r6\n\t"
  193981. #else
  193982. "adc r2, r6\n\t"
  193983. #endif
  193984. #ifdef WOLFSSL_KEIL
  193985. "adcs r3, r3, %[r]\n\t"
  193986. #elif defined(__clang__)
  193987. "adcs r3, %[r]\n\t"
  193988. #else
  193989. "adc r3, %[r]\n\t"
  193990. #endif
  193991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193992. "adds r4, r4, r5\n\t"
  193993. #else
  193994. "add r4, r4, r5\n\t"
  193995. #endif
  193996. #ifdef WOLFSSL_KEIL
  193997. "adcs r2, r2, r6\n\t"
  193998. #elif defined(__clang__)
  193999. "adcs r2, r6\n\t"
  194000. #else
  194001. "adc r2, r6\n\t"
  194002. #endif
  194003. #ifdef WOLFSSL_KEIL
  194004. "adcs r3, r3, %[r]\n\t"
  194005. #elif defined(__clang__)
  194006. "adcs r3, %[r]\n\t"
  194007. #else
  194008. "adc r3, %[r]\n\t"
  194009. #endif
  194010. "# A[14] * A[9]\n\t"
  194011. "mov %[a], r9\n\t"
  194012. "ldr r7, [%[a], #36]\n\t"
  194013. "mov %[a], r12\n\t"
  194014. "uxth r5, %[a]\n\t"
  194015. "uxth r6, r7\n\t"
  194016. #ifdef WOLFSSL_KEIL
  194017. "muls r6, r5, r6\n\t"
  194018. #elif defined(__clang__)
  194019. "muls r6, r5\n\t"
  194020. #else
  194021. "mul r6, r5\n\t"
  194022. #endif
  194023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194024. "adds r4, r4, r6\n\t"
  194025. #else
  194026. "add r4, r4, r6\n\t"
  194027. #endif
  194028. #ifdef WOLFSSL_KEIL
  194029. "adcs r2, r2, %[r]\n\t"
  194030. #elif defined(__clang__)
  194031. "adcs r2, %[r]\n\t"
  194032. #else
  194033. "adc r2, %[r]\n\t"
  194034. #endif
  194035. #ifdef WOLFSSL_KEIL
  194036. "adcs r3, r3, %[r]\n\t"
  194037. #elif defined(__clang__)
  194038. "adcs r3, %[r]\n\t"
  194039. #else
  194040. "adc r3, %[r]\n\t"
  194041. #endif
  194042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194043. "adds r4, r4, r6\n\t"
  194044. #else
  194045. "add r4, r4, r6\n\t"
  194046. #endif
  194047. #ifdef WOLFSSL_KEIL
  194048. "adcs r2, r2, %[r]\n\t"
  194049. #elif defined(__clang__)
  194050. "adcs r2, %[r]\n\t"
  194051. #else
  194052. "adc r2, %[r]\n\t"
  194053. #endif
  194054. #ifdef WOLFSSL_KEIL
  194055. "adcs r3, r3, %[r]\n\t"
  194056. #elif defined(__clang__)
  194057. "adcs r3, %[r]\n\t"
  194058. #else
  194059. "adc r3, %[r]\n\t"
  194060. #endif
  194061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194062. "lsrs r6, r7, #16\n\t"
  194063. #else
  194064. "lsr r6, r7, #16\n\t"
  194065. #endif
  194066. #ifdef WOLFSSL_KEIL
  194067. "muls r5, r6, r5\n\t"
  194068. #elif defined(__clang__)
  194069. "muls r5, r6\n\t"
  194070. #else
  194071. "mul r5, r6\n\t"
  194072. #endif
  194073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194074. "lsrs r6, r5, #16\n\t"
  194075. #else
  194076. "lsr r6, r5, #16\n\t"
  194077. #endif
  194078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194079. "lsls r5, r5, #16\n\t"
  194080. #else
  194081. "lsl r5, r5, #16\n\t"
  194082. #endif
  194083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194084. "adds r4, r4, r5\n\t"
  194085. #else
  194086. "add r4, r4, r5\n\t"
  194087. #endif
  194088. #ifdef WOLFSSL_KEIL
  194089. "adcs r2, r2, r6\n\t"
  194090. #elif defined(__clang__)
  194091. "adcs r2, r6\n\t"
  194092. #else
  194093. "adc r2, r6\n\t"
  194094. #endif
  194095. #ifdef WOLFSSL_KEIL
  194096. "adcs r3, r3, %[r]\n\t"
  194097. #elif defined(__clang__)
  194098. "adcs r3, %[r]\n\t"
  194099. #else
  194100. "adc r3, %[r]\n\t"
  194101. #endif
  194102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194103. "adds r4, r4, r5\n\t"
  194104. #else
  194105. "add r4, r4, r5\n\t"
  194106. #endif
  194107. #ifdef WOLFSSL_KEIL
  194108. "adcs r2, r2, r6\n\t"
  194109. #elif defined(__clang__)
  194110. "adcs r2, r6\n\t"
  194111. #else
  194112. "adc r2, r6\n\t"
  194113. #endif
  194114. #ifdef WOLFSSL_KEIL
  194115. "adcs r3, r3, %[r]\n\t"
  194116. #elif defined(__clang__)
  194117. "adcs r3, %[r]\n\t"
  194118. #else
  194119. "adc r3, %[r]\n\t"
  194120. #endif
  194121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194122. "lsrs r5, %[a], #16\n\t"
  194123. #else
  194124. "lsr r5, %[a], #16\n\t"
  194125. #endif
  194126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194127. "lsrs r6, r7, #16\n\t"
  194128. #else
  194129. "lsr r6, r7, #16\n\t"
  194130. #endif
  194131. #ifdef WOLFSSL_KEIL
  194132. "muls r6, r5, r6\n\t"
  194133. #elif defined(__clang__)
  194134. "muls r6, r5\n\t"
  194135. #else
  194136. "mul r6, r5\n\t"
  194137. #endif
  194138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194139. "adds r2, r2, r6\n\t"
  194140. #else
  194141. "add r2, r2, r6\n\t"
  194142. #endif
  194143. #ifdef WOLFSSL_KEIL
  194144. "adcs r3, r3, %[r]\n\t"
  194145. #elif defined(__clang__)
  194146. "adcs r3, %[r]\n\t"
  194147. #else
  194148. "adc r3, %[r]\n\t"
  194149. #endif
  194150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194151. "adds r2, r2, r6\n\t"
  194152. #else
  194153. "add r2, r2, r6\n\t"
  194154. #endif
  194155. #ifdef WOLFSSL_KEIL
  194156. "adcs r3, r3, %[r]\n\t"
  194157. #elif defined(__clang__)
  194158. "adcs r3, %[r]\n\t"
  194159. #else
  194160. "adc r3, %[r]\n\t"
  194161. #endif
  194162. "uxth r6, r7\n\t"
  194163. #ifdef WOLFSSL_KEIL
  194164. "muls r5, r6, r5\n\t"
  194165. #elif defined(__clang__)
  194166. "muls r5, r6\n\t"
  194167. #else
  194168. "mul r5, r6\n\t"
  194169. #endif
  194170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194171. "lsrs r6, r5, #16\n\t"
  194172. #else
  194173. "lsr r6, r5, #16\n\t"
  194174. #endif
  194175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194176. "lsls r5, r5, #16\n\t"
  194177. #else
  194178. "lsl r5, r5, #16\n\t"
  194179. #endif
  194180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194181. "adds r4, r4, r5\n\t"
  194182. #else
  194183. "add r4, r4, r5\n\t"
  194184. #endif
  194185. #ifdef WOLFSSL_KEIL
  194186. "adcs r2, r2, r6\n\t"
  194187. #elif defined(__clang__)
  194188. "adcs r2, r6\n\t"
  194189. #else
  194190. "adc r2, r6\n\t"
  194191. #endif
  194192. #ifdef WOLFSSL_KEIL
  194193. "adcs r3, r3, %[r]\n\t"
  194194. #elif defined(__clang__)
  194195. "adcs r3, %[r]\n\t"
  194196. #else
  194197. "adc r3, %[r]\n\t"
  194198. #endif
  194199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194200. "adds r4, r4, r5\n\t"
  194201. #else
  194202. "add r4, r4, r5\n\t"
  194203. #endif
  194204. #ifdef WOLFSSL_KEIL
  194205. "adcs r2, r2, r6\n\t"
  194206. #elif defined(__clang__)
  194207. "adcs r2, r6\n\t"
  194208. #else
  194209. "adc r2, r6\n\t"
  194210. #endif
  194211. #ifdef WOLFSSL_KEIL
  194212. "adcs r3, r3, %[r]\n\t"
  194213. #elif defined(__clang__)
  194214. "adcs r3, %[r]\n\t"
  194215. #else
  194216. "adc r3, %[r]\n\t"
  194217. #endif
  194218. "# A[15] * A[8]\n\t"
  194219. "mov %[a], r9\n\t"
  194220. "ldr r7, [%[a], #32]\n\t"
  194221. "mov %[a], lr\n\t"
  194222. "uxth r5, %[a]\n\t"
  194223. "uxth r6, r7\n\t"
  194224. #ifdef WOLFSSL_KEIL
  194225. "muls r6, r5, r6\n\t"
  194226. #elif defined(__clang__)
  194227. "muls r6, r5\n\t"
  194228. #else
  194229. "mul r6, r5\n\t"
  194230. #endif
  194231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194232. "adds r4, r4, r6\n\t"
  194233. #else
  194234. "add r4, r4, r6\n\t"
  194235. #endif
  194236. #ifdef WOLFSSL_KEIL
  194237. "adcs r2, r2, %[r]\n\t"
  194238. #elif defined(__clang__)
  194239. "adcs r2, %[r]\n\t"
  194240. #else
  194241. "adc r2, %[r]\n\t"
  194242. #endif
  194243. #ifdef WOLFSSL_KEIL
  194244. "adcs r3, r3, %[r]\n\t"
  194245. #elif defined(__clang__)
  194246. "adcs r3, %[r]\n\t"
  194247. #else
  194248. "adc r3, %[r]\n\t"
  194249. #endif
  194250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194251. "adds r4, r4, r6\n\t"
  194252. #else
  194253. "add r4, r4, r6\n\t"
  194254. #endif
  194255. #ifdef WOLFSSL_KEIL
  194256. "adcs r2, r2, %[r]\n\t"
  194257. #elif defined(__clang__)
  194258. "adcs r2, %[r]\n\t"
  194259. #else
  194260. "adc r2, %[r]\n\t"
  194261. #endif
  194262. #ifdef WOLFSSL_KEIL
  194263. "adcs r3, r3, %[r]\n\t"
  194264. #elif defined(__clang__)
  194265. "adcs r3, %[r]\n\t"
  194266. #else
  194267. "adc r3, %[r]\n\t"
  194268. #endif
  194269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194270. "lsrs r6, r7, #16\n\t"
  194271. #else
  194272. "lsr r6, r7, #16\n\t"
  194273. #endif
  194274. #ifdef WOLFSSL_KEIL
  194275. "muls r5, r6, r5\n\t"
  194276. #elif defined(__clang__)
  194277. "muls r5, r6\n\t"
  194278. #else
  194279. "mul r5, r6\n\t"
  194280. #endif
  194281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194282. "lsrs r6, r5, #16\n\t"
  194283. #else
  194284. "lsr r6, r5, #16\n\t"
  194285. #endif
  194286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194287. "lsls r5, r5, #16\n\t"
  194288. #else
  194289. "lsl r5, r5, #16\n\t"
  194290. #endif
  194291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194292. "adds r4, r4, r5\n\t"
  194293. #else
  194294. "add r4, r4, r5\n\t"
  194295. #endif
  194296. #ifdef WOLFSSL_KEIL
  194297. "adcs r2, r2, r6\n\t"
  194298. #elif defined(__clang__)
  194299. "adcs r2, r6\n\t"
  194300. #else
  194301. "adc r2, r6\n\t"
  194302. #endif
  194303. #ifdef WOLFSSL_KEIL
  194304. "adcs r3, r3, %[r]\n\t"
  194305. #elif defined(__clang__)
  194306. "adcs r3, %[r]\n\t"
  194307. #else
  194308. "adc r3, %[r]\n\t"
  194309. #endif
  194310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194311. "adds r4, r4, r5\n\t"
  194312. #else
  194313. "add r4, r4, r5\n\t"
  194314. #endif
  194315. #ifdef WOLFSSL_KEIL
  194316. "adcs r2, r2, r6\n\t"
  194317. #elif defined(__clang__)
  194318. "adcs r2, r6\n\t"
  194319. #else
  194320. "adc r2, r6\n\t"
  194321. #endif
  194322. #ifdef WOLFSSL_KEIL
  194323. "adcs r3, r3, %[r]\n\t"
  194324. #elif defined(__clang__)
  194325. "adcs r3, %[r]\n\t"
  194326. #else
  194327. "adc r3, %[r]\n\t"
  194328. #endif
  194329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194330. "lsrs r5, %[a], #16\n\t"
  194331. #else
  194332. "lsr r5, %[a], #16\n\t"
  194333. #endif
  194334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194335. "lsrs r6, r7, #16\n\t"
  194336. #else
  194337. "lsr r6, r7, #16\n\t"
  194338. #endif
  194339. #ifdef WOLFSSL_KEIL
  194340. "muls r6, r5, r6\n\t"
  194341. #elif defined(__clang__)
  194342. "muls r6, r5\n\t"
  194343. #else
  194344. "mul r6, r5\n\t"
  194345. #endif
  194346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194347. "adds r2, r2, r6\n\t"
  194348. #else
  194349. "add r2, r2, r6\n\t"
  194350. #endif
  194351. #ifdef WOLFSSL_KEIL
  194352. "adcs r3, r3, %[r]\n\t"
  194353. #elif defined(__clang__)
  194354. "adcs r3, %[r]\n\t"
  194355. #else
  194356. "adc r3, %[r]\n\t"
  194357. #endif
  194358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194359. "adds r2, r2, r6\n\t"
  194360. #else
  194361. "add r2, r2, r6\n\t"
  194362. #endif
  194363. #ifdef WOLFSSL_KEIL
  194364. "adcs r3, r3, %[r]\n\t"
  194365. #elif defined(__clang__)
  194366. "adcs r3, %[r]\n\t"
  194367. #else
  194368. "adc r3, %[r]\n\t"
  194369. #endif
  194370. "uxth r6, r7\n\t"
  194371. #ifdef WOLFSSL_KEIL
  194372. "muls r5, r6, r5\n\t"
  194373. #elif defined(__clang__)
  194374. "muls r5, r6\n\t"
  194375. #else
  194376. "mul r5, r6\n\t"
  194377. #endif
  194378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194379. "lsrs r6, r5, #16\n\t"
  194380. #else
  194381. "lsr r6, r5, #16\n\t"
  194382. #endif
  194383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194384. "lsls r5, r5, #16\n\t"
  194385. #else
  194386. "lsl r5, r5, #16\n\t"
  194387. #endif
  194388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194389. "adds r4, r4, r5\n\t"
  194390. #else
  194391. "add r4, r4, r5\n\t"
  194392. #endif
  194393. #ifdef WOLFSSL_KEIL
  194394. "adcs r2, r2, r6\n\t"
  194395. #elif defined(__clang__)
  194396. "adcs r2, r6\n\t"
  194397. #else
  194398. "adc r2, r6\n\t"
  194399. #endif
  194400. #ifdef WOLFSSL_KEIL
  194401. "adcs r3, r3, %[r]\n\t"
  194402. #elif defined(__clang__)
  194403. "adcs r3, %[r]\n\t"
  194404. #else
  194405. "adc r3, %[r]\n\t"
  194406. #endif
  194407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194408. "adds r4, r4, r5\n\t"
  194409. #else
  194410. "add r4, r4, r5\n\t"
  194411. #endif
  194412. #ifdef WOLFSSL_KEIL
  194413. "adcs r2, r2, r6\n\t"
  194414. #elif defined(__clang__)
  194415. "adcs r2, r6\n\t"
  194416. #else
  194417. "adc r2, r6\n\t"
  194418. #endif
  194419. #ifdef WOLFSSL_KEIL
  194420. "adcs r3, r3, %[r]\n\t"
  194421. #elif defined(__clang__)
  194422. "adcs r3, %[r]\n\t"
  194423. #else
  194424. "adc r3, %[r]\n\t"
  194425. #endif
  194426. "mov %[r], r8\n\t"
  194427. "str r4, [%[r], #92]\n\t"
  194428. "movs %[r], #0\n\t"
  194429. "# A[15] * A[9]\n\t"
  194430. "movs r4, #0\n\t"
  194431. "mov %[a], r9\n\t"
  194432. "ldr r7, [%[a], #36]\n\t"
  194433. "mov %[a], lr\n\t"
  194434. "uxth r5, %[a]\n\t"
  194435. "uxth r6, r7\n\t"
  194436. #ifdef WOLFSSL_KEIL
  194437. "muls r6, r5, r6\n\t"
  194438. #elif defined(__clang__)
  194439. "muls r6, r5\n\t"
  194440. #else
  194441. "mul r6, r5\n\t"
  194442. #endif
  194443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194444. "adds r2, r2, r6\n\t"
  194445. #else
  194446. "add r2, r2, r6\n\t"
  194447. #endif
  194448. #ifdef WOLFSSL_KEIL
  194449. "adcs r3, r3, %[r]\n\t"
  194450. #elif defined(__clang__)
  194451. "adcs r3, %[r]\n\t"
  194452. #else
  194453. "adc r3, %[r]\n\t"
  194454. #endif
  194455. #ifdef WOLFSSL_KEIL
  194456. "adcs r4, r4, %[r]\n\t"
  194457. #elif defined(__clang__)
  194458. "adcs r4, %[r]\n\t"
  194459. #else
  194460. "adc r4, %[r]\n\t"
  194461. #endif
  194462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194463. "adds r2, r2, r6\n\t"
  194464. #else
  194465. "add r2, r2, r6\n\t"
  194466. #endif
  194467. #ifdef WOLFSSL_KEIL
  194468. "adcs r3, r3, %[r]\n\t"
  194469. #elif defined(__clang__)
  194470. "adcs r3, %[r]\n\t"
  194471. #else
  194472. "adc r3, %[r]\n\t"
  194473. #endif
  194474. #ifdef WOLFSSL_KEIL
  194475. "adcs r4, r4, %[r]\n\t"
  194476. #elif defined(__clang__)
  194477. "adcs r4, %[r]\n\t"
  194478. #else
  194479. "adc r4, %[r]\n\t"
  194480. #endif
  194481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194482. "lsrs r6, r7, #16\n\t"
  194483. #else
  194484. "lsr r6, r7, #16\n\t"
  194485. #endif
  194486. #ifdef WOLFSSL_KEIL
  194487. "muls r5, r6, r5\n\t"
  194488. #elif defined(__clang__)
  194489. "muls r5, r6\n\t"
  194490. #else
  194491. "mul r5, r6\n\t"
  194492. #endif
  194493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194494. "lsrs r6, r5, #16\n\t"
  194495. #else
  194496. "lsr r6, r5, #16\n\t"
  194497. #endif
  194498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194499. "lsls r5, r5, #16\n\t"
  194500. #else
  194501. "lsl r5, r5, #16\n\t"
  194502. #endif
  194503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194504. "adds r2, r2, r5\n\t"
  194505. #else
  194506. "add r2, r2, r5\n\t"
  194507. #endif
  194508. #ifdef WOLFSSL_KEIL
  194509. "adcs r3, r3, r6\n\t"
  194510. #elif defined(__clang__)
  194511. "adcs r3, r6\n\t"
  194512. #else
  194513. "adc r3, r6\n\t"
  194514. #endif
  194515. #ifdef WOLFSSL_KEIL
  194516. "adcs r4, r4, %[r]\n\t"
  194517. #elif defined(__clang__)
  194518. "adcs r4, %[r]\n\t"
  194519. #else
  194520. "adc r4, %[r]\n\t"
  194521. #endif
  194522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194523. "adds r2, r2, r5\n\t"
  194524. #else
  194525. "add r2, r2, r5\n\t"
  194526. #endif
  194527. #ifdef WOLFSSL_KEIL
  194528. "adcs r3, r3, r6\n\t"
  194529. #elif defined(__clang__)
  194530. "adcs r3, r6\n\t"
  194531. #else
  194532. "adc r3, r6\n\t"
  194533. #endif
  194534. #ifdef WOLFSSL_KEIL
  194535. "adcs r4, r4, %[r]\n\t"
  194536. #elif defined(__clang__)
  194537. "adcs r4, %[r]\n\t"
  194538. #else
  194539. "adc r4, %[r]\n\t"
  194540. #endif
  194541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194542. "lsrs r5, %[a], #16\n\t"
  194543. #else
  194544. "lsr r5, %[a], #16\n\t"
  194545. #endif
  194546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194547. "lsrs r6, r7, #16\n\t"
  194548. #else
  194549. "lsr r6, r7, #16\n\t"
  194550. #endif
  194551. #ifdef WOLFSSL_KEIL
  194552. "muls r6, r5, r6\n\t"
  194553. #elif defined(__clang__)
  194554. "muls r6, r5\n\t"
  194555. #else
  194556. "mul r6, r5\n\t"
  194557. #endif
  194558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194559. "adds r3, r3, r6\n\t"
  194560. #else
  194561. "add r3, r3, r6\n\t"
  194562. #endif
  194563. #ifdef WOLFSSL_KEIL
  194564. "adcs r4, r4, %[r]\n\t"
  194565. #elif defined(__clang__)
  194566. "adcs r4, %[r]\n\t"
  194567. #else
  194568. "adc r4, %[r]\n\t"
  194569. #endif
  194570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194571. "adds r3, r3, r6\n\t"
  194572. #else
  194573. "add r3, r3, r6\n\t"
  194574. #endif
  194575. #ifdef WOLFSSL_KEIL
  194576. "adcs r4, r4, %[r]\n\t"
  194577. #elif defined(__clang__)
  194578. "adcs r4, %[r]\n\t"
  194579. #else
  194580. "adc r4, %[r]\n\t"
  194581. #endif
  194582. "uxth r6, r7\n\t"
  194583. #ifdef WOLFSSL_KEIL
  194584. "muls r5, r6, r5\n\t"
  194585. #elif defined(__clang__)
  194586. "muls r5, r6\n\t"
  194587. #else
  194588. "mul r5, r6\n\t"
  194589. #endif
  194590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194591. "lsrs r6, r5, #16\n\t"
  194592. #else
  194593. "lsr r6, r5, #16\n\t"
  194594. #endif
  194595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194596. "lsls r5, r5, #16\n\t"
  194597. #else
  194598. "lsl r5, r5, #16\n\t"
  194599. #endif
  194600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194601. "adds r2, r2, r5\n\t"
  194602. #else
  194603. "add r2, r2, r5\n\t"
  194604. #endif
  194605. #ifdef WOLFSSL_KEIL
  194606. "adcs r3, r3, r6\n\t"
  194607. #elif defined(__clang__)
  194608. "adcs r3, r6\n\t"
  194609. #else
  194610. "adc r3, r6\n\t"
  194611. #endif
  194612. #ifdef WOLFSSL_KEIL
  194613. "adcs r4, r4, %[r]\n\t"
  194614. #elif defined(__clang__)
  194615. "adcs r4, %[r]\n\t"
  194616. #else
  194617. "adc r4, %[r]\n\t"
  194618. #endif
  194619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194620. "adds r2, r2, r5\n\t"
  194621. #else
  194622. "add r2, r2, r5\n\t"
  194623. #endif
  194624. #ifdef WOLFSSL_KEIL
  194625. "adcs r3, r3, r6\n\t"
  194626. #elif defined(__clang__)
  194627. "adcs r3, r6\n\t"
  194628. #else
  194629. "adc r3, r6\n\t"
  194630. #endif
  194631. #ifdef WOLFSSL_KEIL
  194632. "adcs r4, r4, %[r]\n\t"
  194633. #elif defined(__clang__)
  194634. "adcs r4, %[r]\n\t"
  194635. #else
  194636. "adc r4, %[r]\n\t"
  194637. #endif
  194638. "# A[14] * A[10]\n\t"
  194639. "mov %[a], r9\n\t"
  194640. "ldr r7, [%[a], #40]\n\t"
  194641. "mov %[a], r12\n\t"
  194642. "uxth r5, %[a]\n\t"
  194643. "uxth r6, r7\n\t"
  194644. #ifdef WOLFSSL_KEIL
  194645. "muls r6, r5, r6\n\t"
  194646. #elif defined(__clang__)
  194647. "muls r6, r5\n\t"
  194648. #else
  194649. "mul r6, r5\n\t"
  194650. #endif
  194651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194652. "adds r2, r2, r6\n\t"
  194653. #else
  194654. "add r2, r2, r6\n\t"
  194655. #endif
  194656. #ifdef WOLFSSL_KEIL
  194657. "adcs r3, r3, %[r]\n\t"
  194658. #elif defined(__clang__)
  194659. "adcs r3, %[r]\n\t"
  194660. #else
  194661. "adc r3, %[r]\n\t"
  194662. #endif
  194663. #ifdef WOLFSSL_KEIL
  194664. "adcs r4, r4, %[r]\n\t"
  194665. #elif defined(__clang__)
  194666. "adcs r4, %[r]\n\t"
  194667. #else
  194668. "adc r4, %[r]\n\t"
  194669. #endif
  194670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194671. "adds r2, r2, r6\n\t"
  194672. #else
  194673. "add r2, r2, r6\n\t"
  194674. #endif
  194675. #ifdef WOLFSSL_KEIL
  194676. "adcs r3, r3, %[r]\n\t"
  194677. #elif defined(__clang__)
  194678. "adcs r3, %[r]\n\t"
  194679. #else
  194680. "adc r3, %[r]\n\t"
  194681. #endif
  194682. #ifdef WOLFSSL_KEIL
  194683. "adcs r4, r4, %[r]\n\t"
  194684. #elif defined(__clang__)
  194685. "adcs r4, %[r]\n\t"
  194686. #else
  194687. "adc r4, %[r]\n\t"
  194688. #endif
  194689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194690. "lsrs r6, r7, #16\n\t"
  194691. #else
  194692. "lsr r6, r7, #16\n\t"
  194693. #endif
  194694. #ifdef WOLFSSL_KEIL
  194695. "muls r5, r6, r5\n\t"
  194696. #elif defined(__clang__)
  194697. "muls r5, r6\n\t"
  194698. #else
  194699. "mul r5, r6\n\t"
  194700. #endif
  194701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194702. "lsrs r6, r5, #16\n\t"
  194703. #else
  194704. "lsr r6, r5, #16\n\t"
  194705. #endif
  194706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194707. "lsls r5, r5, #16\n\t"
  194708. #else
  194709. "lsl r5, r5, #16\n\t"
  194710. #endif
  194711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194712. "adds r2, r2, r5\n\t"
  194713. #else
  194714. "add r2, r2, r5\n\t"
  194715. #endif
  194716. #ifdef WOLFSSL_KEIL
  194717. "adcs r3, r3, r6\n\t"
  194718. #elif defined(__clang__)
  194719. "adcs r3, r6\n\t"
  194720. #else
  194721. "adc r3, r6\n\t"
  194722. #endif
  194723. #ifdef WOLFSSL_KEIL
  194724. "adcs r4, r4, %[r]\n\t"
  194725. #elif defined(__clang__)
  194726. "adcs r4, %[r]\n\t"
  194727. #else
  194728. "adc r4, %[r]\n\t"
  194729. #endif
  194730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194731. "adds r2, r2, r5\n\t"
  194732. #else
  194733. "add r2, r2, r5\n\t"
  194734. #endif
  194735. #ifdef WOLFSSL_KEIL
  194736. "adcs r3, r3, r6\n\t"
  194737. #elif defined(__clang__)
  194738. "adcs r3, r6\n\t"
  194739. #else
  194740. "adc r3, r6\n\t"
  194741. #endif
  194742. #ifdef WOLFSSL_KEIL
  194743. "adcs r4, r4, %[r]\n\t"
  194744. #elif defined(__clang__)
  194745. "adcs r4, %[r]\n\t"
  194746. #else
  194747. "adc r4, %[r]\n\t"
  194748. #endif
  194749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194750. "lsrs r5, %[a], #16\n\t"
  194751. #else
  194752. "lsr r5, %[a], #16\n\t"
  194753. #endif
  194754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194755. "lsrs r6, r7, #16\n\t"
  194756. #else
  194757. "lsr r6, r7, #16\n\t"
  194758. #endif
  194759. #ifdef WOLFSSL_KEIL
  194760. "muls r6, r5, r6\n\t"
  194761. #elif defined(__clang__)
  194762. "muls r6, r5\n\t"
  194763. #else
  194764. "mul r6, r5\n\t"
  194765. #endif
  194766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194767. "adds r3, r3, r6\n\t"
  194768. #else
  194769. "add r3, r3, r6\n\t"
  194770. #endif
  194771. #ifdef WOLFSSL_KEIL
  194772. "adcs r4, r4, %[r]\n\t"
  194773. #elif defined(__clang__)
  194774. "adcs r4, %[r]\n\t"
  194775. #else
  194776. "adc r4, %[r]\n\t"
  194777. #endif
  194778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194779. "adds r3, r3, r6\n\t"
  194780. #else
  194781. "add r3, r3, r6\n\t"
  194782. #endif
  194783. #ifdef WOLFSSL_KEIL
  194784. "adcs r4, r4, %[r]\n\t"
  194785. #elif defined(__clang__)
  194786. "adcs r4, %[r]\n\t"
  194787. #else
  194788. "adc r4, %[r]\n\t"
  194789. #endif
  194790. "uxth r6, r7\n\t"
  194791. #ifdef WOLFSSL_KEIL
  194792. "muls r5, r6, r5\n\t"
  194793. #elif defined(__clang__)
  194794. "muls r5, r6\n\t"
  194795. #else
  194796. "mul r5, r6\n\t"
  194797. #endif
  194798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194799. "lsrs r6, r5, #16\n\t"
  194800. #else
  194801. "lsr r6, r5, #16\n\t"
  194802. #endif
  194803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194804. "lsls r5, r5, #16\n\t"
  194805. #else
  194806. "lsl r5, r5, #16\n\t"
  194807. #endif
  194808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194809. "adds r2, r2, r5\n\t"
  194810. #else
  194811. "add r2, r2, r5\n\t"
  194812. #endif
  194813. #ifdef WOLFSSL_KEIL
  194814. "adcs r3, r3, r6\n\t"
  194815. #elif defined(__clang__)
  194816. "adcs r3, r6\n\t"
  194817. #else
  194818. "adc r3, r6\n\t"
  194819. #endif
  194820. #ifdef WOLFSSL_KEIL
  194821. "adcs r4, r4, %[r]\n\t"
  194822. #elif defined(__clang__)
  194823. "adcs r4, %[r]\n\t"
  194824. #else
  194825. "adc r4, %[r]\n\t"
  194826. #endif
  194827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194828. "adds r2, r2, r5\n\t"
  194829. #else
  194830. "add r2, r2, r5\n\t"
  194831. #endif
  194832. #ifdef WOLFSSL_KEIL
  194833. "adcs r3, r3, r6\n\t"
  194834. #elif defined(__clang__)
  194835. "adcs r3, r6\n\t"
  194836. #else
  194837. "adc r3, r6\n\t"
  194838. #endif
  194839. #ifdef WOLFSSL_KEIL
  194840. "adcs r4, r4, %[r]\n\t"
  194841. #elif defined(__clang__)
  194842. "adcs r4, %[r]\n\t"
  194843. #else
  194844. "adc r4, %[r]\n\t"
  194845. #endif
  194846. "# A[13] * A[11]\n\t"
  194847. "mov %[a], r9\n\t"
  194848. "ldr r7, [%[a], #44]\n\t"
  194849. "mov %[a], r11\n\t"
  194850. "uxth r5, %[a]\n\t"
  194851. "uxth r6, r7\n\t"
  194852. #ifdef WOLFSSL_KEIL
  194853. "muls r6, r5, r6\n\t"
  194854. #elif defined(__clang__)
  194855. "muls r6, r5\n\t"
  194856. #else
  194857. "mul r6, r5\n\t"
  194858. #endif
  194859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194860. "adds r2, r2, r6\n\t"
  194861. #else
  194862. "add r2, r2, r6\n\t"
  194863. #endif
  194864. #ifdef WOLFSSL_KEIL
  194865. "adcs r3, r3, %[r]\n\t"
  194866. #elif defined(__clang__)
  194867. "adcs r3, %[r]\n\t"
  194868. #else
  194869. "adc r3, %[r]\n\t"
  194870. #endif
  194871. #ifdef WOLFSSL_KEIL
  194872. "adcs r4, r4, %[r]\n\t"
  194873. #elif defined(__clang__)
  194874. "adcs r4, %[r]\n\t"
  194875. #else
  194876. "adc r4, %[r]\n\t"
  194877. #endif
  194878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194879. "adds r2, r2, r6\n\t"
  194880. #else
  194881. "add r2, r2, r6\n\t"
  194882. #endif
  194883. #ifdef WOLFSSL_KEIL
  194884. "adcs r3, r3, %[r]\n\t"
  194885. #elif defined(__clang__)
  194886. "adcs r3, %[r]\n\t"
  194887. #else
  194888. "adc r3, %[r]\n\t"
  194889. #endif
  194890. #ifdef WOLFSSL_KEIL
  194891. "adcs r4, r4, %[r]\n\t"
  194892. #elif defined(__clang__)
  194893. "adcs r4, %[r]\n\t"
  194894. #else
  194895. "adc r4, %[r]\n\t"
  194896. #endif
  194897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194898. "lsrs r6, r7, #16\n\t"
  194899. #else
  194900. "lsr r6, r7, #16\n\t"
  194901. #endif
  194902. #ifdef WOLFSSL_KEIL
  194903. "muls r5, r6, r5\n\t"
  194904. #elif defined(__clang__)
  194905. "muls r5, r6\n\t"
  194906. #else
  194907. "mul r5, r6\n\t"
  194908. #endif
  194909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194910. "lsrs r6, r5, #16\n\t"
  194911. #else
  194912. "lsr r6, r5, #16\n\t"
  194913. #endif
  194914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194915. "lsls r5, r5, #16\n\t"
  194916. #else
  194917. "lsl r5, r5, #16\n\t"
  194918. #endif
  194919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194920. "adds r2, r2, r5\n\t"
  194921. #else
  194922. "add r2, r2, r5\n\t"
  194923. #endif
  194924. #ifdef WOLFSSL_KEIL
  194925. "adcs r3, r3, r6\n\t"
  194926. #elif defined(__clang__)
  194927. "adcs r3, r6\n\t"
  194928. #else
  194929. "adc r3, r6\n\t"
  194930. #endif
  194931. #ifdef WOLFSSL_KEIL
  194932. "adcs r4, r4, %[r]\n\t"
  194933. #elif defined(__clang__)
  194934. "adcs r4, %[r]\n\t"
  194935. #else
  194936. "adc r4, %[r]\n\t"
  194937. #endif
  194938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194939. "adds r2, r2, r5\n\t"
  194940. #else
  194941. "add r2, r2, r5\n\t"
  194942. #endif
  194943. #ifdef WOLFSSL_KEIL
  194944. "adcs r3, r3, r6\n\t"
  194945. #elif defined(__clang__)
  194946. "adcs r3, r6\n\t"
  194947. #else
  194948. "adc r3, r6\n\t"
  194949. #endif
  194950. #ifdef WOLFSSL_KEIL
  194951. "adcs r4, r4, %[r]\n\t"
  194952. #elif defined(__clang__)
  194953. "adcs r4, %[r]\n\t"
  194954. #else
  194955. "adc r4, %[r]\n\t"
  194956. #endif
  194957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194958. "lsrs r5, %[a], #16\n\t"
  194959. #else
  194960. "lsr r5, %[a], #16\n\t"
  194961. #endif
  194962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194963. "lsrs r6, r7, #16\n\t"
  194964. #else
  194965. "lsr r6, r7, #16\n\t"
  194966. #endif
  194967. #ifdef WOLFSSL_KEIL
  194968. "muls r6, r5, r6\n\t"
  194969. #elif defined(__clang__)
  194970. "muls r6, r5\n\t"
  194971. #else
  194972. "mul r6, r5\n\t"
  194973. #endif
  194974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194975. "adds r3, r3, r6\n\t"
  194976. #else
  194977. "add r3, r3, r6\n\t"
  194978. #endif
  194979. #ifdef WOLFSSL_KEIL
  194980. "adcs r4, r4, %[r]\n\t"
  194981. #elif defined(__clang__)
  194982. "adcs r4, %[r]\n\t"
  194983. #else
  194984. "adc r4, %[r]\n\t"
  194985. #endif
  194986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194987. "adds r3, r3, r6\n\t"
  194988. #else
  194989. "add r3, r3, r6\n\t"
  194990. #endif
  194991. #ifdef WOLFSSL_KEIL
  194992. "adcs r4, r4, %[r]\n\t"
  194993. #elif defined(__clang__)
  194994. "adcs r4, %[r]\n\t"
  194995. #else
  194996. "adc r4, %[r]\n\t"
  194997. #endif
  194998. "uxth r6, r7\n\t"
  194999. #ifdef WOLFSSL_KEIL
  195000. "muls r5, r6, r5\n\t"
  195001. #elif defined(__clang__)
  195002. "muls r5, r6\n\t"
  195003. #else
  195004. "mul r5, r6\n\t"
  195005. #endif
  195006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195007. "lsrs r6, r5, #16\n\t"
  195008. #else
  195009. "lsr r6, r5, #16\n\t"
  195010. #endif
  195011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195012. "lsls r5, r5, #16\n\t"
  195013. #else
  195014. "lsl r5, r5, #16\n\t"
  195015. #endif
  195016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195017. "adds r2, r2, r5\n\t"
  195018. #else
  195019. "add r2, r2, r5\n\t"
  195020. #endif
  195021. #ifdef WOLFSSL_KEIL
  195022. "adcs r3, r3, r6\n\t"
  195023. #elif defined(__clang__)
  195024. "adcs r3, r6\n\t"
  195025. #else
  195026. "adc r3, r6\n\t"
  195027. #endif
  195028. #ifdef WOLFSSL_KEIL
  195029. "adcs r4, r4, %[r]\n\t"
  195030. #elif defined(__clang__)
  195031. "adcs r4, %[r]\n\t"
  195032. #else
  195033. "adc r4, %[r]\n\t"
  195034. #endif
  195035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195036. "adds r2, r2, r5\n\t"
  195037. #else
  195038. "add r2, r2, r5\n\t"
  195039. #endif
  195040. #ifdef WOLFSSL_KEIL
  195041. "adcs r3, r3, r6\n\t"
  195042. #elif defined(__clang__)
  195043. "adcs r3, r6\n\t"
  195044. #else
  195045. "adc r3, r6\n\t"
  195046. #endif
  195047. #ifdef WOLFSSL_KEIL
  195048. "adcs r4, r4, %[r]\n\t"
  195049. #elif defined(__clang__)
  195050. "adcs r4, %[r]\n\t"
  195051. #else
  195052. "adc r4, %[r]\n\t"
  195053. #endif
  195054. "# A[12] * A[12]\n\t"
  195055. "mov r7, r10\n\t"
  195056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195057. "lsrs r6, r7, #16\n\t"
  195058. #else
  195059. "lsr r6, r7, #16\n\t"
  195060. #endif
  195061. "uxth r5, r7\n\t"
  195062. #ifdef WOLFSSL_KEIL
  195063. "muls r5, r5, r5\n\t"
  195064. #elif defined(__clang__)
  195065. "muls r5, r5\n\t"
  195066. #else
  195067. "mul r5, r5\n\t"
  195068. #endif
  195069. #ifdef WOLFSSL_KEIL
  195070. "muls r6, r6, r6\n\t"
  195071. #elif defined(__clang__)
  195072. "muls r6, r6\n\t"
  195073. #else
  195074. "mul r6, r6\n\t"
  195075. #endif
  195076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195077. "adds r2, r2, r5\n\t"
  195078. #else
  195079. "add r2, r2, r5\n\t"
  195080. #endif
  195081. #ifdef WOLFSSL_KEIL
  195082. "adcs r3, r3, r6\n\t"
  195083. #elif defined(__clang__)
  195084. "adcs r3, r6\n\t"
  195085. #else
  195086. "adc r3, r6\n\t"
  195087. #endif
  195088. #ifdef WOLFSSL_KEIL
  195089. "adcs r4, r4, %[r]\n\t"
  195090. #elif defined(__clang__)
  195091. "adcs r4, %[r]\n\t"
  195092. #else
  195093. "adc r4, %[r]\n\t"
  195094. #endif
  195095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195096. "lsrs r6, r7, #16\n\t"
  195097. #else
  195098. "lsr r6, r7, #16\n\t"
  195099. #endif
  195100. "uxth r5, r7\n\t"
  195101. #ifdef WOLFSSL_KEIL
  195102. "muls r5, r6, r5\n\t"
  195103. #elif defined(__clang__)
  195104. "muls r5, r6\n\t"
  195105. #else
  195106. "mul r5, r6\n\t"
  195107. #endif
  195108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195109. "lsrs r6, r5, #15\n\t"
  195110. #else
  195111. "lsr r6, r5, #15\n\t"
  195112. #endif
  195113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195114. "lsls r5, r5, #17\n\t"
  195115. #else
  195116. "lsl r5, r5, #17\n\t"
  195117. #endif
  195118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195119. "adds r2, r2, r5\n\t"
  195120. #else
  195121. "add r2, r2, r5\n\t"
  195122. #endif
  195123. #ifdef WOLFSSL_KEIL
  195124. "adcs r3, r3, r6\n\t"
  195125. #elif defined(__clang__)
  195126. "adcs r3, r6\n\t"
  195127. #else
  195128. "adc r3, r6\n\t"
  195129. #endif
  195130. #ifdef WOLFSSL_KEIL
  195131. "adcs r4, r4, %[r]\n\t"
  195132. #elif defined(__clang__)
  195133. "adcs r4, %[r]\n\t"
  195134. #else
  195135. "adc r4, %[r]\n\t"
  195136. #endif
  195137. "mov %[r], r8\n\t"
  195138. "str r2, [%[r], #96]\n\t"
  195139. "movs %[r], #0\n\t"
  195140. "# A[13] * A[12]\n\t"
  195141. "movs r2, #0\n\t"
  195142. "mov %[a], r9\n\t"
  195143. "mov %[a], r11\n\t"
  195144. "uxth r5, %[a]\n\t"
  195145. "uxth r6, r7\n\t"
  195146. #ifdef WOLFSSL_KEIL
  195147. "muls r6, r5, r6\n\t"
  195148. #elif defined(__clang__)
  195149. "muls r6, r5\n\t"
  195150. #else
  195151. "mul r6, r5\n\t"
  195152. #endif
  195153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195154. "adds r3, r3, r6\n\t"
  195155. #else
  195156. "add r3, r3, r6\n\t"
  195157. #endif
  195158. #ifdef WOLFSSL_KEIL
  195159. "adcs r4, r4, %[r]\n\t"
  195160. #elif defined(__clang__)
  195161. "adcs r4, %[r]\n\t"
  195162. #else
  195163. "adc r4, %[r]\n\t"
  195164. #endif
  195165. #ifdef WOLFSSL_KEIL
  195166. "adcs r2, r2, %[r]\n\t"
  195167. #elif defined(__clang__)
  195168. "adcs r2, %[r]\n\t"
  195169. #else
  195170. "adc r2, %[r]\n\t"
  195171. #endif
  195172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195173. "adds r3, r3, r6\n\t"
  195174. #else
  195175. "add r3, r3, r6\n\t"
  195176. #endif
  195177. #ifdef WOLFSSL_KEIL
  195178. "adcs r4, r4, %[r]\n\t"
  195179. #elif defined(__clang__)
  195180. "adcs r4, %[r]\n\t"
  195181. #else
  195182. "adc r4, %[r]\n\t"
  195183. #endif
  195184. #ifdef WOLFSSL_KEIL
  195185. "adcs r2, r2, %[r]\n\t"
  195186. #elif defined(__clang__)
  195187. "adcs r2, %[r]\n\t"
  195188. #else
  195189. "adc r2, %[r]\n\t"
  195190. #endif
  195191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195192. "lsrs r6, r7, #16\n\t"
  195193. #else
  195194. "lsr r6, r7, #16\n\t"
  195195. #endif
  195196. #ifdef WOLFSSL_KEIL
  195197. "muls r5, r6, r5\n\t"
  195198. #elif defined(__clang__)
  195199. "muls r5, r6\n\t"
  195200. #else
  195201. "mul r5, r6\n\t"
  195202. #endif
  195203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195204. "lsrs r6, r5, #16\n\t"
  195205. #else
  195206. "lsr r6, r5, #16\n\t"
  195207. #endif
  195208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195209. "lsls r5, r5, #16\n\t"
  195210. #else
  195211. "lsl r5, r5, #16\n\t"
  195212. #endif
  195213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195214. "adds r3, r3, r5\n\t"
  195215. #else
  195216. "add r3, r3, r5\n\t"
  195217. #endif
  195218. #ifdef WOLFSSL_KEIL
  195219. "adcs r4, r4, r6\n\t"
  195220. #elif defined(__clang__)
  195221. "adcs r4, r6\n\t"
  195222. #else
  195223. "adc r4, r6\n\t"
  195224. #endif
  195225. #ifdef WOLFSSL_KEIL
  195226. "adcs r2, r2, %[r]\n\t"
  195227. #elif defined(__clang__)
  195228. "adcs r2, %[r]\n\t"
  195229. #else
  195230. "adc r2, %[r]\n\t"
  195231. #endif
  195232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195233. "adds r3, r3, r5\n\t"
  195234. #else
  195235. "add r3, r3, r5\n\t"
  195236. #endif
  195237. #ifdef WOLFSSL_KEIL
  195238. "adcs r4, r4, r6\n\t"
  195239. #elif defined(__clang__)
  195240. "adcs r4, r6\n\t"
  195241. #else
  195242. "adc r4, r6\n\t"
  195243. #endif
  195244. #ifdef WOLFSSL_KEIL
  195245. "adcs r2, r2, %[r]\n\t"
  195246. #elif defined(__clang__)
  195247. "adcs r2, %[r]\n\t"
  195248. #else
  195249. "adc r2, %[r]\n\t"
  195250. #endif
  195251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195252. "lsrs r5, %[a], #16\n\t"
  195253. #else
  195254. "lsr r5, %[a], #16\n\t"
  195255. #endif
  195256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195257. "lsrs r6, r7, #16\n\t"
  195258. #else
  195259. "lsr r6, r7, #16\n\t"
  195260. #endif
  195261. #ifdef WOLFSSL_KEIL
  195262. "muls r6, r5, r6\n\t"
  195263. #elif defined(__clang__)
  195264. "muls r6, r5\n\t"
  195265. #else
  195266. "mul r6, r5\n\t"
  195267. #endif
  195268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195269. "adds r4, r4, r6\n\t"
  195270. #else
  195271. "add r4, r4, r6\n\t"
  195272. #endif
  195273. #ifdef WOLFSSL_KEIL
  195274. "adcs r2, r2, %[r]\n\t"
  195275. #elif defined(__clang__)
  195276. "adcs r2, %[r]\n\t"
  195277. #else
  195278. "adc r2, %[r]\n\t"
  195279. #endif
  195280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195281. "adds r4, r4, r6\n\t"
  195282. #else
  195283. "add r4, r4, r6\n\t"
  195284. #endif
  195285. #ifdef WOLFSSL_KEIL
  195286. "adcs r2, r2, %[r]\n\t"
  195287. #elif defined(__clang__)
  195288. "adcs r2, %[r]\n\t"
  195289. #else
  195290. "adc r2, %[r]\n\t"
  195291. #endif
  195292. "uxth r6, r7\n\t"
  195293. #ifdef WOLFSSL_KEIL
  195294. "muls r5, r6, r5\n\t"
  195295. #elif defined(__clang__)
  195296. "muls r5, r6\n\t"
  195297. #else
  195298. "mul r5, r6\n\t"
  195299. #endif
  195300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195301. "lsrs r6, r5, #16\n\t"
  195302. #else
  195303. "lsr r6, r5, #16\n\t"
  195304. #endif
  195305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195306. "lsls r5, r5, #16\n\t"
  195307. #else
  195308. "lsl r5, r5, #16\n\t"
  195309. #endif
  195310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195311. "adds r3, r3, r5\n\t"
  195312. #else
  195313. "add r3, r3, r5\n\t"
  195314. #endif
  195315. #ifdef WOLFSSL_KEIL
  195316. "adcs r4, r4, r6\n\t"
  195317. #elif defined(__clang__)
  195318. "adcs r4, r6\n\t"
  195319. #else
  195320. "adc r4, r6\n\t"
  195321. #endif
  195322. #ifdef WOLFSSL_KEIL
  195323. "adcs r2, r2, %[r]\n\t"
  195324. #elif defined(__clang__)
  195325. "adcs r2, %[r]\n\t"
  195326. #else
  195327. "adc r2, %[r]\n\t"
  195328. #endif
  195329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195330. "adds r3, r3, r5\n\t"
  195331. #else
  195332. "add r3, r3, r5\n\t"
  195333. #endif
  195334. #ifdef WOLFSSL_KEIL
  195335. "adcs r4, r4, r6\n\t"
  195336. #elif defined(__clang__)
  195337. "adcs r4, r6\n\t"
  195338. #else
  195339. "adc r4, r6\n\t"
  195340. #endif
  195341. #ifdef WOLFSSL_KEIL
  195342. "adcs r2, r2, %[r]\n\t"
  195343. #elif defined(__clang__)
  195344. "adcs r2, %[r]\n\t"
  195345. #else
  195346. "adc r2, %[r]\n\t"
  195347. #endif
  195348. "# A[14] * A[11]\n\t"
  195349. "mov %[a], r9\n\t"
  195350. "ldr r7, [%[a], #44]\n\t"
  195351. "mov %[a], r12\n\t"
  195352. "uxth r5, %[a]\n\t"
  195353. "uxth r6, r7\n\t"
  195354. #ifdef WOLFSSL_KEIL
  195355. "muls r6, r5, r6\n\t"
  195356. #elif defined(__clang__)
  195357. "muls r6, r5\n\t"
  195358. #else
  195359. "mul r6, r5\n\t"
  195360. #endif
  195361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195362. "adds r3, r3, r6\n\t"
  195363. #else
  195364. "add r3, r3, r6\n\t"
  195365. #endif
  195366. #ifdef WOLFSSL_KEIL
  195367. "adcs r4, r4, %[r]\n\t"
  195368. #elif defined(__clang__)
  195369. "adcs r4, %[r]\n\t"
  195370. #else
  195371. "adc r4, %[r]\n\t"
  195372. #endif
  195373. #ifdef WOLFSSL_KEIL
  195374. "adcs r2, r2, %[r]\n\t"
  195375. #elif defined(__clang__)
  195376. "adcs r2, %[r]\n\t"
  195377. #else
  195378. "adc r2, %[r]\n\t"
  195379. #endif
  195380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195381. "adds r3, r3, r6\n\t"
  195382. #else
  195383. "add r3, r3, r6\n\t"
  195384. #endif
  195385. #ifdef WOLFSSL_KEIL
  195386. "adcs r4, r4, %[r]\n\t"
  195387. #elif defined(__clang__)
  195388. "adcs r4, %[r]\n\t"
  195389. #else
  195390. "adc r4, %[r]\n\t"
  195391. #endif
  195392. #ifdef WOLFSSL_KEIL
  195393. "adcs r2, r2, %[r]\n\t"
  195394. #elif defined(__clang__)
  195395. "adcs r2, %[r]\n\t"
  195396. #else
  195397. "adc r2, %[r]\n\t"
  195398. #endif
  195399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195400. "lsrs r6, r7, #16\n\t"
  195401. #else
  195402. "lsr r6, r7, #16\n\t"
  195403. #endif
  195404. #ifdef WOLFSSL_KEIL
  195405. "muls r5, r6, r5\n\t"
  195406. #elif defined(__clang__)
  195407. "muls r5, r6\n\t"
  195408. #else
  195409. "mul r5, r6\n\t"
  195410. #endif
  195411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195412. "lsrs r6, r5, #16\n\t"
  195413. #else
  195414. "lsr r6, r5, #16\n\t"
  195415. #endif
  195416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195417. "lsls r5, r5, #16\n\t"
  195418. #else
  195419. "lsl r5, r5, #16\n\t"
  195420. #endif
  195421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195422. "adds r3, r3, r5\n\t"
  195423. #else
  195424. "add r3, r3, r5\n\t"
  195425. #endif
  195426. #ifdef WOLFSSL_KEIL
  195427. "adcs r4, r4, r6\n\t"
  195428. #elif defined(__clang__)
  195429. "adcs r4, r6\n\t"
  195430. #else
  195431. "adc r4, r6\n\t"
  195432. #endif
  195433. #ifdef WOLFSSL_KEIL
  195434. "adcs r2, r2, %[r]\n\t"
  195435. #elif defined(__clang__)
  195436. "adcs r2, %[r]\n\t"
  195437. #else
  195438. "adc r2, %[r]\n\t"
  195439. #endif
  195440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195441. "adds r3, r3, r5\n\t"
  195442. #else
  195443. "add r3, r3, r5\n\t"
  195444. #endif
  195445. #ifdef WOLFSSL_KEIL
  195446. "adcs r4, r4, r6\n\t"
  195447. #elif defined(__clang__)
  195448. "adcs r4, r6\n\t"
  195449. #else
  195450. "adc r4, r6\n\t"
  195451. #endif
  195452. #ifdef WOLFSSL_KEIL
  195453. "adcs r2, r2, %[r]\n\t"
  195454. #elif defined(__clang__)
  195455. "adcs r2, %[r]\n\t"
  195456. #else
  195457. "adc r2, %[r]\n\t"
  195458. #endif
  195459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195460. "lsrs r5, %[a], #16\n\t"
  195461. #else
  195462. "lsr r5, %[a], #16\n\t"
  195463. #endif
  195464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195465. "lsrs r6, r7, #16\n\t"
  195466. #else
  195467. "lsr r6, r7, #16\n\t"
  195468. #endif
  195469. #ifdef WOLFSSL_KEIL
  195470. "muls r6, r5, r6\n\t"
  195471. #elif defined(__clang__)
  195472. "muls r6, r5\n\t"
  195473. #else
  195474. "mul r6, r5\n\t"
  195475. #endif
  195476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195477. "adds r4, r4, r6\n\t"
  195478. #else
  195479. "add r4, r4, r6\n\t"
  195480. #endif
  195481. #ifdef WOLFSSL_KEIL
  195482. "adcs r2, r2, %[r]\n\t"
  195483. #elif defined(__clang__)
  195484. "adcs r2, %[r]\n\t"
  195485. #else
  195486. "adc r2, %[r]\n\t"
  195487. #endif
  195488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195489. "adds r4, r4, r6\n\t"
  195490. #else
  195491. "add r4, r4, r6\n\t"
  195492. #endif
  195493. #ifdef WOLFSSL_KEIL
  195494. "adcs r2, r2, %[r]\n\t"
  195495. #elif defined(__clang__)
  195496. "adcs r2, %[r]\n\t"
  195497. #else
  195498. "adc r2, %[r]\n\t"
  195499. #endif
  195500. "uxth r6, r7\n\t"
  195501. #ifdef WOLFSSL_KEIL
  195502. "muls r5, r6, r5\n\t"
  195503. #elif defined(__clang__)
  195504. "muls r5, r6\n\t"
  195505. #else
  195506. "mul r5, r6\n\t"
  195507. #endif
  195508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195509. "lsrs r6, r5, #16\n\t"
  195510. #else
  195511. "lsr r6, r5, #16\n\t"
  195512. #endif
  195513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195514. "lsls r5, r5, #16\n\t"
  195515. #else
  195516. "lsl r5, r5, #16\n\t"
  195517. #endif
  195518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195519. "adds r3, r3, r5\n\t"
  195520. #else
  195521. "add r3, r3, r5\n\t"
  195522. #endif
  195523. #ifdef WOLFSSL_KEIL
  195524. "adcs r4, r4, r6\n\t"
  195525. #elif defined(__clang__)
  195526. "adcs r4, r6\n\t"
  195527. #else
  195528. "adc r4, r6\n\t"
  195529. #endif
  195530. #ifdef WOLFSSL_KEIL
  195531. "adcs r2, r2, %[r]\n\t"
  195532. #elif defined(__clang__)
  195533. "adcs r2, %[r]\n\t"
  195534. #else
  195535. "adc r2, %[r]\n\t"
  195536. #endif
  195537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195538. "adds r3, r3, r5\n\t"
  195539. #else
  195540. "add r3, r3, r5\n\t"
  195541. #endif
  195542. #ifdef WOLFSSL_KEIL
  195543. "adcs r4, r4, r6\n\t"
  195544. #elif defined(__clang__)
  195545. "adcs r4, r6\n\t"
  195546. #else
  195547. "adc r4, r6\n\t"
  195548. #endif
  195549. #ifdef WOLFSSL_KEIL
  195550. "adcs r2, r2, %[r]\n\t"
  195551. #elif defined(__clang__)
  195552. "adcs r2, %[r]\n\t"
  195553. #else
  195554. "adc r2, %[r]\n\t"
  195555. #endif
  195556. "# A[15] * A[10]\n\t"
  195557. "mov %[a], r9\n\t"
  195558. "ldr r7, [%[a], #40]\n\t"
  195559. "mov %[a], lr\n\t"
  195560. "uxth r5, %[a]\n\t"
  195561. "uxth r6, r7\n\t"
  195562. #ifdef WOLFSSL_KEIL
  195563. "muls r6, r5, r6\n\t"
  195564. #elif defined(__clang__)
  195565. "muls r6, r5\n\t"
  195566. #else
  195567. "mul r6, r5\n\t"
  195568. #endif
  195569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195570. "adds r3, r3, r6\n\t"
  195571. #else
  195572. "add r3, r3, r6\n\t"
  195573. #endif
  195574. #ifdef WOLFSSL_KEIL
  195575. "adcs r4, r4, %[r]\n\t"
  195576. #elif defined(__clang__)
  195577. "adcs r4, %[r]\n\t"
  195578. #else
  195579. "adc r4, %[r]\n\t"
  195580. #endif
  195581. #ifdef WOLFSSL_KEIL
  195582. "adcs r2, r2, %[r]\n\t"
  195583. #elif defined(__clang__)
  195584. "adcs r2, %[r]\n\t"
  195585. #else
  195586. "adc r2, %[r]\n\t"
  195587. #endif
  195588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195589. "adds r3, r3, r6\n\t"
  195590. #else
  195591. "add r3, r3, r6\n\t"
  195592. #endif
  195593. #ifdef WOLFSSL_KEIL
  195594. "adcs r4, r4, %[r]\n\t"
  195595. #elif defined(__clang__)
  195596. "adcs r4, %[r]\n\t"
  195597. #else
  195598. "adc r4, %[r]\n\t"
  195599. #endif
  195600. #ifdef WOLFSSL_KEIL
  195601. "adcs r2, r2, %[r]\n\t"
  195602. #elif defined(__clang__)
  195603. "adcs r2, %[r]\n\t"
  195604. #else
  195605. "adc r2, %[r]\n\t"
  195606. #endif
  195607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195608. "lsrs r6, r7, #16\n\t"
  195609. #else
  195610. "lsr r6, r7, #16\n\t"
  195611. #endif
  195612. #ifdef WOLFSSL_KEIL
  195613. "muls r5, r6, r5\n\t"
  195614. #elif defined(__clang__)
  195615. "muls r5, r6\n\t"
  195616. #else
  195617. "mul r5, r6\n\t"
  195618. #endif
  195619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195620. "lsrs r6, r5, #16\n\t"
  195621. #else
  195622. "lsr r6, r5, #16\n\t"
  195623. #endif
  195624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195625. "lsls r5, r5, #16\n\t"
  195626. #else
  195627. "lsl r5, r5, #16\n\t"
  195628. #endif
  195629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195630. "adds r3, r3, r5\n\t"
  195631. #else
  195632. "add r3, r3, r5\n\t"
  195633. #endif
  195634. #ifdef WOLFSSL_KEIL
  195635. "adcs r4, r4, r6\n\t"
  195636. #elif defined(__clang__)
  195637. "adcs r4, r6\n\t"
  195638. #else
  195639. "adc r4, r6\n\t"
  195640. #endif
  195641. #ifdef WOLFSSL_KEIL
  195642. "adcs r2, r2, %[r]\n\t"
  195643. #elif defined(__clang__)
  195644. "adcs r2, %[r]\n\t"
  195645. #else
  195646. "adc r2, %[r]\n\t"
  195647. #endif
  195648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195649. "adds r3, r3, r5\n\t"
  195650. #else
  195651. "add r3, r3, r5\n\t"
  195652. #endif
  195653. #ifdef WOLFSSL_KEIL
  195654. "adcs r4, r4, r6\n\t"
  195655. #elif defined(__clang__)
  195656. "adcs r4, r6\n\t"
  195657. #else
  195658. "adc r4, r6\n\t"
  195659. #endif
  195660. #ifdef WOLFSSL_KEIL
  195661. "adcs r2, r2, %[r]\n\t"
  195662. #elif defined(__clang__)
  195663. "adcs r2, %[r]\n\t"
  195664. #else
  195665. "adc r2, %[r]\n\t"
  195666. #endif
  195667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195668. "lsrs r5, %[a], #16\n\t"
  195669. #else
  195670. "lsr r5, %[a], #16\n\t"
  195671. #endif
  195672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195673. "lsrs r6, r7, #16\n\t"
  195674. #else
  195675. "lsr r6, r7, #16\n\t"
  195676. #endif
  195677. #ifdef WOLFSSL_KEIL
  195678. "muls r6, r5, r6\n\t"
  195679. #elif defined(__clang__)
  195680. "muls r6, r5\n\t"
  195681. #else
  195682. "mul r6, r5\n\t"
  195683. #endif
  195684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195685. "adds r4, r4, r6\n\t"
  195686. #else
  195687. "add r4, r4, r6\n\t"
  195688. #endif
  195689. #ifdef WOLFSSL_KEIL
  195690. "adcs r2, r2, %[r]\n\t"
  195691. #elif defined(__clang__)
  195692. "adcs r2, %[r]\n\t"
  195693. #else
  195694. "adc r2, %[r]\n\t"
  195695. #endif
  195696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195697. "adds r4, r4, r6\n\t"
  195698. #else
  195699. "add r4, r4, r6\n\t"
  195700. #endif
  195701. #ifdef WOLFSSL_KEIL
  195702. "adcs r2, r2, %[r]\n\t"
  195703. #elif defined(__clang__)
  195704. "adcs r2, %[r]\n\t"
  195705. #else
  195706. "adc r2, %[r]\n\t"
  195707. #endif
  195708. "uxth r6, r7\n\t"
  195709. #ifdef WOLFSSL_KEIL
  195710. "muls r5, r6, r5\n\t"
  195711. #elif defined(__clang__)
  195712. "muls r5, r6\n\t"
  195713. #else
  195714. "mul r5, r6\n\t"
  195715. #endif
  195716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195717. "lsrs r6, r5, #16\n\t"
  195718. #else
  195719. "lsr r6, r5, #16\n\t"
  195720. #endif
  195721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195722. "lsls r5, r5, #16\n\t"
  195723. #else
  195724. "lsl r5, r5, #16\n\t"
  195725. #endif
  195726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195727. "adds r3, r3, r5\n\t"
  195728. #else
  195729. "add r3, r3, r5\n\t"
  195730. #endif
  195731. #ifdef WOLFSSL_KEIL
  195732. "adcs r4, r4, r6\n\t"
  195733. #elif defined(__clang__)
  195734. "adcs r4, r6\n\t"
  195735. #else
  195736. "adc r4, r6\n\t"
  195737. #endif
  195738. #ifdef WOLFSSL_KEIL
  195739. "adcs r2, r2, %[r]\n\t"
  195740. #elif defined(__clang__)
  195741. "adcs r2, %[r]\n\t"
  195742. #else
  195743. "adc r2, %[r]\n\t"
  195744. #endif
  195745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195746. "adds r3, r3, r5\n\t"
  195747. #else
  195748. "add r3, r3, r5\n\t"
  195749. #endif
  195750. #ifdef WOLFSSL_KEIL
  195751. "adcs r4, r4, r6\n\t"
  195752. #elif defined(__clang__)
  195753. "adcs r4, r6\n\t"
  195754. #else
  195755. "adc r4, r6\n\t"
  195756. #endif
  195757. #ifdef WOLFSSL_KEIL
  195758. "adcs r2, r2, %[r]\n\t"
  195759. #elif defined(__clang__)
  195760. "adcs r2, %[r]\n\t"
  195761. #else
  195762. "adc r2, %[r]\n\t"
  195763. #endif
  195764. "mov %[r], r8\n\t"
  195765. "str r3, [%[r], #100]\n\t"
  195766. "movs %[r], #0\n\t"
  195767. "# A[15] * A[11]\n\t"
  195768. "movs r3, #0\n\t"
  195769. "mov %[a], r9\n\t"
  195770. "ldr r7, [%[a], #44]\n\t"
  195771. "mov %[a], lr\n\t"
  195772. "uxth r5, %[a]\n\t"
  195773. "uxth r6, r7\n\t"
  195774. #ifdef WOLFSSL_KEIL
  195775. "muls r6, r5, r6\n\t"
  195776. #elif defined(__clang__)
  195777. "muls r6, r5\n\t"
  195778. #else
  195779. "mul r6, r5\n\t"
  195780. #endif
  195781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195782. "adds r4, r4, r6\n\t"
  195783. #else
  195784. "add r4, r4, r6\n\t"
  195785. #endif
  195786. #ifdef WOLFSSL_KEIL
  195787. "adcs r2, r2, %[r]\n\t"
  195788. #elif defined(__clang__)
  195789. "adcs r2, %[r]\n\t"
  195790. #else
  195791. "adc r2, %[r]\n\t"
  195792. #endif
  195793. #ifdef WOLFSSL_KEIL
  195794. "adcs r3, r3, %[r]\n\t"
  195795. #elif defined(__clang__)
  195796. "adcs r3, %[r]\n\t"
  195797. #else
  195798. "adc r3, %[r]\n\t"
  195799. #endif
  195800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195801. "adds r4, r4, r6\n\t"
  195802. #else
  195803. "add r4, r4, r6\n\t"
  195804. #endif
  195805. #ifdef WOLFSSL_KEIL
  195806. "adcs r2, r2, %[r]\n\t"
  195807. #elif defined(__clang__)
  195808. "adcs r2, %[r]\n\t"
  195809. #else
  195810. "adc r2, %[r]\n\t"
  195811. #endif
  195812. #ifdef WOLFSSL_KEIL
  195813. "adcs r3, r3, %[r]\n\t"
  195814. #elif defined(__clang__)
  195815. "adcs r3, %[r]\n\t"
  195816. #else
  195817. "adc r3, %[r]\n\t"
  195818. #endif
  195819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195820. "lsrs r6, r7, #16\n\t"
  195821. #else
  195822. "lsr r6, r7, #16\n\t"
  195823. #endif
  195824. #ifdef WOLFSSL_KEIL
  195825. "muls r5, r6, r5\n\t"
  195826. #elif defined(__clang__)
  195827. "muls r5, r6\n\t"
  195828. #else
  195829. "mul r5, r6\n\t"
  195830. #endif
  195831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195832. "lsrs r6, r5, #16\n\t"
  195833. #else
  195834. "lsr r6, r5, #16\n\t"
  195835. #endif
  195836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195837. "lsls r5, r5, #16\n\t"
  195838. #else
  195839. "lsl r5, r5, #16\n\t"
  195840. #endif
  195841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195842. "adds r4, r4, r5\n\t"
  195843. #else
  195844. "add r4, r4, r5\n\t"
  195845. #endif
  195846. #ifdef WOLFSSL_KEIL
  195847. "adcs r2, r2, r6\n\t"
  195848. #elif defined(__clang__)
  195849. "adcs r2, r6\n\t"
  195850. #else
  195851. "adc r2, r6\n\t"
  195852. #endif
  195853. #ifdef WOLFSSL_KEIL
  195854. "adcs r3, r3, %[r]\n\t"
  195855. #elif defined(__clang__)
  195856. "adcs r3, %[r]\n\t"
  195857. #else
  195858. "adc r3, %[r]\n\t"
  195859. #endif
  195860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195861. "adds r4, r4, r5\n\t"
  195862. #else
  195863. "add r4, r4, r5\n\t"
  195864. #endif
  195865. #ifdef WOLFSSL_KEIL
  195866. "adcs r2, r2, r6\n\t"
  195867. #elif defined(__clang__)
  195868. "adcs r2, r6\n\t"
  195869. #else
  195870. "adc r2, r6\n\t"
  195871. #endif
  195872. #ifdef WOLFSSL_KEIL
  195873. "adcs r3, r3, %[r]\n\t"
  195874. #elif defined(__clang__)
  195875. "adcs r3, %[r]\n\t"
  195876. #else
  195877. "adc r3, %[r]\n\t"
  195878. #endif
  195879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195880. "lsrs r5, %[a], #16\n\t"
  195881. #else
  195882. "lsr r5, %[a], #16\n\t"
  195883. #endif
  195884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195885. "lsrs r6, r7, #16\n\t"
  195886. #else
  195887. "lsr r6, r7, #16\n\t"
  195888. #endif
  195889. #ifdef WOLFSSL_KEIL
  195890. "muls r6, r5, r6\n\t"
  195891. #elif defined(__clang__)
  195892. "muls r6, r5\n\t"
  195893. #else
  195894. "mul r6, r5\n\t"
  195895. #endif
  195896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195897. "adds r2, r2, r6\n\t"
  195898. #else
  195899. "add r2, r2, r6\n\t"
  195900. #endif
  195901. #ifdef WOLFSSL_KEIL
  195902. "adcs r3, r3, %[r]\n\t"
  195903. #elif defined(__clang__)
  195904. "adcs r3, %[r]\n\t"
  195905. #else
  195906. "adc r3, %[r]\n\t"
  195907. #endif
  195908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195909. "adds r2, r2, r6\n\t"
  195910. #else
  195911. "add r2, r2, r6\n\t"
  195912. #endif
  195913. #ifdef WOLFSSL_KEIL
  195914. "adcs r3, r3, %[r]\n\t"
  195915. #elif defined(__clang__)
  195916. "adcs r3, %[r]\n\t"
  195917. #else
  195918. "adc r3, %[r]\n\t"
  195919. #endif
  195920. "uxth r6, r7\n\t"
  195921. #ifdef WOLFSSL_KEIL
  195922. "muls r5, r6, r5\n\t"
  195923. #elif defined(__clang__)
  195924. "muls r5, r6\n\t"
  195925. #else
  195926. "mul r5, r6\n\t"
  195927. #endif
  195928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195929. "lsrs r6, r5, #16\n\t"
  195930. #else
  195931. "lsr r6, r5, #16\n\t"
  195932. #endif
  195933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195934. "lsls r5, r5, #16\n\t"
  195935. #else
  195936. "lsl r5, r5, #16\n\t"
  195937. #endif
  195938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195939. "adds r4, r4, r5\n\t"
  195940. #else
  195941. "add r4, r4, r5\n\t"
  195942. #endif
  195943. #ifdef WOLFSSL_KEIL
  195944. "adcs r2, r2, r6\n\t"
  195945. #elif defined(__clang__)
  195946. "adcs r2, r6\n\t"
  195947. #else
  195948. "adc r2, r6\n\t"
  195949. #endif
  195950. #ifdef WOLFSSL_KEIL
  195951. "adcs r3, r3, %[r]\n\t"
  195952. #elif defined(__clang__)
  195953. "adcs r3, %[r]\n\t"
  195954. #else
  195955. "adc r3, %[r]\n\t"
  195956. #endif
  195957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195958. "adds r4, r4, r5\n\t"
  195959. #else
  195960. "add r4, r4, r5\n\t"
  195961. #endif
  195962. #ifdef WOLFSSL_KEIL
  195963. "adcs r2, r2, r6\n\t"
  195964. #elif defined(__clang__)
  195965. "adcs r2, r6\n\t"
  195966. #else
  195967. "adc r2, r6\n\t"
  195968. #endif
  195969. #ifdef WOLFSSL_KEIL
  195970. "adcs r3, r3, %[r]\n\t"
  195971. #elif defined(__clang__)
  195972. "adcs r3, %[r]\n\t"
  195973. #else
  195974. "adc r3, %[r]\n\t"
  195975. #endif
  195976. "# A[14] * A[12]\n\t"
  195977. "mov %[a], r9\n\t"
  195978. "mov r7, r10\n\t"
  195979. "mov %[a], r12\n\t"
  195980. "uxth r5, %[a]\n\t"
  195981. "uxth r6, r7\n\t"
  195982. #ifdef WOLFSSL_KEIL
  195983. "muls r6, r5, r6\n\t"
  195984. #elif defined(__clang__)
  195985. "muls r6, r5\n\t"
  195986. #else
  195987. "mul r6, r5\n\t"
  195988. #endif
  195989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195990. "adds r4, r4, r6\n\t"
  195991. #else
  195992. "add r4, r4, r6\n\t"
  195993. #endif
  195994. #ifdef WOLFSSL_KEIL
  195995. "adcs r2, r2, %[r]\n\t"
  195996. #elif defined(__clang__)
  195997. "adcs r2, %[r]\n\t"
  195998. #else
  195999. "adc r2, %[r]\n\t"
  196000. #endif
  196001. #ifdef WOLFSSL_KEIL
  196002. "adcs r3, r3, %[r]\n\t"
  196003. #elif defined(__clang__)
  196004. "adcs r3, %[r]\n\t"
  196005. #else
  196006. "adc r3, %[r]\n\t"
  196007. #endif
  196008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196009. "adds r4, r4, r6\n\t"
  196010. #else
  196011. "add r4, r4, r6\n\t"
  196012. #endif
  196013. #ifdef WOLFSSL_KEIL
  196014. "adcs r2, r2, %[r]\n\t"
  196015. #elif defined(__clang__)
  196016. "adcs r2, %[r]\n\t"
  196017. #else
  196018. "adc r2, %[r]\n\t"
  196019. #endif
  196020. #ifdef WOLFSSL_KEIL
  196021. "adcs r3, r3, %[r]\n\t"
  196022. #elif defined(__clang__)
  196023. "adcs r3, %[r]\n\t"
  196024. #else
  196025. "adc r3, %[r]\n\t"
  196026. #endif
  196027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196028. "lsrs r6, r7, #16\n\t"
  196029. #else
  196030. "lsr r6, r7, #16\n\t"
  196031. #endif
  196032. #ifdef WOLFSSL_KEIL
  196033. "muls r5, r6, r5\n\t"
  196034. #elif defined(__clang__)
  196035. "muls r5, r6\n\t"
  196036. #else
  196037. "mul r5, r6\n\t"
  196038. #endif
  196039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196040. "lsrs r6, r5, #16\n\t"
  196041. #else
  196042. "lsr r6, r5, #16\n\t"
  196043. #endif
  196044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196045. "lsls r5, r5, #16\n\t"
  196046. #else
  196047. "lsl r5, r5, #16\n\t"
  196048. #endif
  196049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196050. "adds r4, r4, r5\n\t"
  196051. #else
  196052. "add r4, r4, r5\n\t"
  196053. #endif
  196054. #ifdef WOLFSSL_KEIL
  196055. "adcs r2, r2, r6\n\t"
  196056. #elif defined(__clang__)
  196057. "adcs r2, r6\n\t"
  196058. #else
  196059. "adc r2, r6\n\t"
  196060. #endif
  196061. #ifdef WOLFSSL_KEIL
  196062. "adcs r3, r3, %[r]\n\t"
  196063. #elif defined(__clang__)
  196064. "adcs r3, %[r]\n\t"
  196065. #else
  196066. "adc r3, %[r]\n\t"
  196067. #endif
  196068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196069. "adds r4, r4, r5\n\t"
  196070. #else
  196071. "add r4, r4, r5\n\t"
  196072. #endif
  196073. #ifdef WOLFSSL_KEIL
  196074. "adcs r2, r2, r6\n\t"
  196075. #elif defined(__clang__)
  196076. "adcs r2, r6\n\t"
  196077. #else
  196078. "adc r2, r6\n\t"
  196079. #endif
  196080. #ifdef WOLFSSL_KEIL
  196081. "adcs r3, r3, %[r]\n\t"
  196082. #elif defined(__clang__)
  196083. "adcs r3, %[r]\n\t"
  196084. #else
  196085. "adc r3, %[r]\n\t"
  196086. #endif
  196087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196088. "lsrs r5, %[a], #16\n\t"
  196089. #else
  196090. "lsr r5, %[a], #16\n\t"
  196091. #endif
  196092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196093. "lsrs r6, r7, #16\n\t"
  196094. #else
  196095. "lsr r6, r7, #16\n\t"
  196096. #endif
  196097. #ifdef WOLFSSL_KEIL
  196098. "muls r6, r5, r6\n\t"
  196099. #elif defined(__clang__)
  196100. "muls r6, r5\n\t"
  196101. #else
  196102. "mul r6, r5\n\t"
  196103. #endif
  196104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196105. "adds r2, r2, r6\n\t"
  196106. #else
  196107. "add r2, r2, r6\n\t"
  196108. #endif
  196109. #ifdef WOLFSSL_KEIL
  196110. "adcs r3, r3, %[r]\n\t"
  196111. #elif defined(__clang__)
  196112. "adcs r3, %[r]\n\t"
  196113. #else
  196114. "adc r3, %[r]\n\t"
  196115. #endif
  196116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196117. "adds r2, r2, r6\n\t"
  196118. #else
  196119. "add r2, r2, r6\n\t"
  196120. #endif
  196121. #ifdef WOLFSSL_KEIL
  196122. "adcs r3, r3, %[r]\n\t"
  196123. #elif defined(__clang__)
  196124. "adcs r3, %[r]\n\t"
  196125. #else
  196126. "adc r3, %[r]\n\t"
  196127. #endif
  196128. "uxth r6, r7\n\t"
  196129. #ifdef WOLFSSL_KEIL
  196130. "muls r5, r6, r5\n\t"
  196131. #elif defined(__clang__)
  196132. "muls r5, r6\n\t"
  196133. #else
  196134. "mul r5, r6\n\t"
  196135. #endif
  196136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196137. "lsrs r6, r5, #16\n\t"
  196138. #else
  196139. "lsr r6, r5, #16\n\t"
  196140. #endif
  196141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196142. "lsls r5, r5, #16\n\t"
  196143. #else
  196144. "lsl r5, r5, #16\n\t"
  196145. #endif
  196146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196147. "adds r4, r4, r5\n\t"
  196148. #else
  196149. "add r4, r4, r5\n\t"
  196150. #endif
  196151. #ifdef WOLFSSL_KEIL
  196152. "adcs r2, r2, r6\n\t"
  196153. #elif defined(__clang__)
  196154. "adcs r2, r6\n\t"
  196155. #else
  196156. "adc r2, r6\n\t"
  196157. #endif
  196158. #ifdef WOLFSSL_KEIL
  196159. "adcs r3, r3, %[r]\n\t"
  196160. #elif defined(__clang__)
  196161. "adcs r3, %[r]\n\t"
  196162. #else
  196163. "adc r3, %[r]\n\t"
  196164. #endif
  196165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196166. "adds r4, r4, r5\n\t"
  196167. #else
  196168. "add r4, r4, r5\n\t"
  196169. #endif
  196170. #ifdef WOLFSSL_KEIL
  196171. "adcs r2, r2, r6\n\t"
  196172. #elif defined(__clang__)
  196173. "adcs r2, r6\n\t"
  196174. #else
  196175. "adc r2, r6\n\t"
  196176. #endif
  196177. #ifdef WOLFSSL_KEIL
  196178. "adcs r3, r3, %[r]\n\t"
  196179. #elif defined(__clang__)
  196180. "adcs r3, %[r]\n\t"
  196181. #else
  196182. "adc r3, %[r]\n\t"
  196183. #endif
  196184. "# A[13] * A[13]\n\t"
  196185. "mov r7, r11\n\t"
  196186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196187. "lsrs r6, r7, #16\n\t"
  196188. #else
  196189. "lsr r6, r7, #16\n\t"
  196190. #endif
  196191. "uxth r5, r7\n\t"
  196192. #ifdef WOLFSSL_KEIL
  196193. "muls r5, r5, r5\n\t"
  196194. #elif defined(__clang__)
  196195. "muls r5, r5\n\t"
  196196. #else
  196197. "mul r5, r5\n\t"
  196198. #endif
  196199. #ifdef WOLFSSL_KEIL
  196200. "muls r6, r6, r6\n\t"
  196201. #elif defined(__clang__)
  196202. "muls r6, r6\n\t"
  196203. #else
  196204. "mul r6, r6\n\t"
  196205. #endif
  196206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196207. "adds r4, r4, r5\n\t"
  196208. #else
  196209. "add r4, r4, r5\n\t"
  196210. #endif
  196211. #ifdef WOLFSSL_KEIL
  196212. "adcs r2, r2, r6\n\t"
  196213. #elif defined(__clang__)
  196214. "adcs r2, r6\n\t"
  196215. #else
  196216. "adc r2, r6\n\t"
  196217. #endif
  196218. #ifdef WOLFSSL_KEIL
  196219. "adcs r3, r3, %[r]\n\t"
  196220. #elif defined(__clang__)
  196221. "adcs r3, %[r]\n\t"
  196222. #else
  196223. "adc r3, %[r]\n\t"
  196224. #endif
  196225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196226. "lsrs r6, r7, #16\n\t"
  196227. #else
  196228. "lsr r6, r7, #16\n\t"
  196229. #endif
  196230. "uxth r5, r7\n\t"
  196231. #ifdef WOLFSSL_KEIL
  196232. "muls r5, r6, r5\n\t"
  196233. #elif defined(__clang__)
  196234. "muls r5, r6\n\t"
  196235. #else
  196236. "mul r5, r6\n\t"
  196237. #endif
  196238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196239. "lsrs r6, r5, #15\n\t"
  196240. #else
  196241. "lsr r6, r5, #15\n\t"
  196242. #endif
  196243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196244. "lsls r5, r5, #17\n\t"
  196245. #else
  196246. "lsl r5, r5, #17\n\t"
  196247. #endif
  196248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196249. "adds r4, r4, r5\n\t"
  196250. #else
  196251. "add r4, r4, r5\n\t"
  196252. #endif
  196253. #ifdef WOLFSSL_KEIL
  196254. "adcs r2, r2, r6\n\t"
  196255. #elif defined(__clang__)
  196256. "adcs r2, r6\n\t"
  196257. #else
  196258. "adc r2, r6\n\t"
  196259. #endif
  196260. #ifdef WOLFSSL_KEIL
  196261. "adcs r3, r3, %[r]\n\t"
  196262. #elif defined(__clang__)
  196263. "adcs r3, %[r]\n\t"
  196264. #else
  196265. "adc r3, %[r]\n\t"
  196266. #endif
  196267. "mov %[r], r8\n\t"
  196268. "str r4, [%[r], #104]\n\t"
  196269. "movs %[r], #0\n\t"
  196270. "# A[14] * A[13]\n\t"
  196271. "movs r4, #0\n\t"
  196272. "mov %[a], r9\n\t"
  196273. "mov %[a], r12\n\t"
  196274. "uxth r5, %[a]\n\t"
  196275. "uxth r6, r7\n\t"
  196276. #ifdef WOLFSSL_KEIL
  196277. "muls r6, r5, r6\n\t"
  196278. #elif defined(__clang__)
  196279. "muls r6, r5\n\t"
  196280. #else
  196281. "mul r6, r5\n\t"
  196282. #endif
  196283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196284. "adds r2, r2, r6\n\t"
  196285. #else
  196286. "add r2, r2, r6\n\t"
  196287. #endif
  196288. #ifdef WOLFSSL_KEIL
  196289. "adcs r3, r3, %[r]\n\t"
  196290. #elif defined(__clang__)
  196291. "adcs r3, %[r]\n\t"
  196292. #else
  196293. "adc r3, %[r]\n\t"
  196294. #endif
  196295. #ifdef WOLFSSL_KEIL
  196296. "adcs r4, r4, %[r]\n\t"
  196297. #elif defined(__clang__)
  196298. "adcs r4, %[r]\n\t"
  196299. #else
  196300. "adc r4, %[r]\n\t"
  196301. #endif
  196302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196303. "adds r2, r2, r6\n\t"
  196304. #else
  196305. "add r2, r2, r6\n\t"
  196306. #endif
  196307. #ifdef WOLFSSL_KEIL
  196308. "adcs r3, r3, %[r]\n\t"
  196309. #elif defined(__clang__)
  196310. "adcs r3, %[r]\n\t"
  196311. #else
  196312. "adc r3, %[r]\n\t"
  196313. #endif
  196314. #ifdef WOLFSSL_KEIL
  196315. "adcs r4, r4, %[r]\n\t"
  196316. #elif defined(__clang__)
  196317. "adcs r4, %[r]\n\t"
  196318. #else
  196319. "adc r4, %[r]\n\t"
  196320. #endif
  196321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196322. "lsrs r6, r7, #16\n\t"
  196323. #else
  196324. "lsr r6, r7, #16\n\t"
  196325. #endif
  196326. #ifdef WOLFSSL_KEIL
  196327. "muls r5, r6, r5\n\t"
  196328. #elif defined(__clang__)
  196329. "muls r5, r6\n\t"
  196330. #else
  196331. "mul r5, r6\n\t"
  196332. #endif
  196333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196334. "lsrs r6, r5, #16\n\t"
  196335. #else
  196336. "lsr r6, r5, #16\n\t"
  196337. #endif
  196338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196339. "lsls r5, r5, #16\n\t"
  196340. #else
  196341. "lsl r5, r5, #16\n\t"
  196342. #endif
  196343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196344. "adds r2, r2, r5\n\t"
  196345. #else
  196346. "add r2, r2, r5\n\t"
  196347. #endif
  196348. #ifdef WOLFSSL_KEIL
  196349. "adcs r3, r3, r6\n\t"
  196350. #elif defined(__clang__)
  196351. "adcs r3, r6\n\t"
  196352. #else
  196353. "adc r3, r6\n\t"
  196354. #endif
  196355. #ifdef WOLFSSL_KEIL
  196356. "adcs r4, r4, %[r]\n\t"
  196357. #elif defined(__clang__)
  196358. "adcs r4, %[r]\n\t"
  196359. #else
  196360. "adc r4, %[r]\n\t"
  196361. #endif
  196362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196363. "adds r2, r2, r5\n\t"
  196364. #else
  196365. "add r2, r2, r5\n\t"
  196366. #endif
  196367. #ifdef WOLFSSL_KEIL
  196368. "adcs r3, r3, r6\n\t"
  196369. #elif defined(__clang__)
  196370. "adcs r3, r6\n\t"
  196371. #else
  196372. "adc r3, r6\n\t"
  196373. #endif
  196374. #ifdef WOLFSSL_KEIL
  196375. "adcs r4, r4, %[r]\n\t"
  196376. #elif defined(__clang__)
  196377. "adcs r4, %[r]\n\t"
  196378. #else
  196379. "adc r4, %[r]\n\t"
  196380. #endif
  196381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196382. "lsrs r5, %[a], #16\n\t"
  196383. #else
  196384. "lsr r5, %[a], #16\n\t"
  196385. #endif
  196386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196387. "lsrs r6, r7, #16\n\t"
  196388. #else
  196389. "lsr r6, r7, #16\n\t"
  196390. #endif
  196391. #ifdef WOLFSSL_KEIL
  196392. "muls r6, r5, r6\n\t"
  196393. #elif defined(__clang__)
  196394. "muls r6, r5\n\t"
  196395. #else
  196396. "mul r6, r5\n\t"
  196397. #endif
  196398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196399. "adds r3, r3, r6\n\t"
  196400. #else
  196401. "add r3, r3, r6\n\t"
  196402. #endif
  196403. #ifdef WOLFSSL_KEIL
  196404. "adcs r4, r4, %[r]\n\t"
  196405. #elif defined(__clang__)
  196406. "adcs r4, %[r]\n\t"
  196407. #else
  196408. "adc r4, %[r]\n\t"
  196409. #endif
  196410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196411. "adds r3, r3, r6\n\t"
  196412. #else
  196413. "add r3, r3, r6\n\t"
  196414. #endif
  196415. #ifdef WOLFSSL_KEIL
  196416. "adcs r4, r4, %[r]\n\t"
  196417. #elif defined(__clang__)
  196418. "adcs r4, %[r]\n\t"
  196419. #else
  196420. "adc r4, %[r]\n\t"
  196421. #endif
  196422. "uxth r6, r7\n\t"
  196423. #ifdef WOLFSSL_KEIL
  196424. "muls r5, r6, r5\n\t"
  196425. #elif defined(__clang__)
  196426. "muls r5, r6\n\t"
  196427. #else
  196428. "mul r5, r6\n\t"
  196429. #endif
  196430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196431. "lsrs r6, r5, #16\n\t"
  196432. #else
  196433. "lsr r6, r5, #16\n\t"
  196434. #endif
  196435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196436. "lsls r5, r5, #16\n\t"
  196437. #else
  196438. "lsl r5, r5, #16\n\t"
  196439. #endif
  196440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196441. "adds r2, r2, r5\n\t"
  196442. #else
  196443. "add r2, r2, r5\n\t"
  196444. #endif
  196445. #ifdef WOLFSSL_KEIL
  196446. "adcs r3, r3, r6\n\t"
  196447. #elif defined(__clang__)
  196448. "adcs r3, r6\n\t"
  196449. #else
  196450. "adc r3, r6\n\t"
  196451. #endif
  196452. #ifdef WOLFSSL_KEIL
  196453. "adcs r4, r4, %[r]\n\t"
  196454. #elif defined(__clang__)
  196455. "adcs r4, %[r]\n\t"
  196456. #else
  196457. "adc r4, %[r]\n\t"
  196458. #endif
  196459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196460. "adds r2, r2, r5\n\t"
  196461. #else
  196462. "add r2, r2, r5\n\t"
  196463. #endif
  196464. #ifdef WOLFSSL_KEIL
  196465. "adcs r3, r3, r6\n\t"
  196466. #elif defined(__clang__)
  196467. "adcs r3, r6\n\t"
  196468. #else
  196469. "adc r3, r6\n\t"
  196470. #endif
  196471. #ifdef WOLFSSL_KEIL
  196472. "adcs r4, r4, %[r]\n\t"
  196473. #elif defined(__clang__)
  196474. "adcs r4, %[r]\n\t"
  196475. #else
  196476. "adc r4, %[r]\n\t"
  196477. #endif
  196478. "# A[15] * A[12]\n\t"
  196479. "mov %[a], r9\n\t"
  196480. "mov r7, r10\n\t"
  196481. "mov %[a], lr\n\t"
  196482. "uxth r5, %[a]\n\t"
  196483. "uxth r6, r7\n\t"
  196484. #ifdef WOLFSSL_KEIL
  196485. "muls r6, r5, r6\n\t"
  196486. #elif defined(__clang__)
  196487. "muls r6, r5\n\t"
  196488. #else
  196489. "mul r6, r5\n\t"
  196490. #endif
  196491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196492. "adds r2, r2, r6\n\t"
  196493. #else
  196494. "add r2, r2, r6\n\t"
  196495. #endif
  196496. #ifdef WOLFSSL_KEIL
  196497. "adcs r3, r3, %[r]\n\t"
  196498. #elif defined(__clang__)
  196499. "adcs r3, %[r]\n\t"
  196500. #else
  196501. "adc r3, %[r]\n\t"
  196502. #endif
  196503. #ifdef WOLFSSL_KEIL
  196504. "adcs r4, r4, %[r]\n\t"
  196505. #elif defined(__clang__)
  196506. "adcs r4, %[r]\n\t"
  196507. #else
  196508. "adc r4, %[r]\n\t"
  196509. #endif
  196510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196511. "adds r2, r2, r6\n\t"
  196512. #else
  196513. "add r2, r2, r6\n\t"
  196514. #endif
  196515. #ifdef WOLFSSL_KEIL
  196516. "adcs r3, r3, %[r]\n\t"
  196517. #elif defined(__clang__)
  196518. "adcs r3, %[r]\n\t"
  196519. #else
  196520. "adc r3, %[r]\n\t"
  196521. #endif
  196522. #ifdef WOLFSSL_KEIL
  196523. "adcs r4, r4, %[r]\n\t"
  196524. #elif defined(__clang__)
  196525. "adcs r4, %[r]\n\t"
  196526. #else
  196527. "adc r4, %[r]\n\t"
  196528. #endif
  196529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196530. "lsrs r6, r7, #16\n\t"
  196531. #else
  196532. "lsr r6, r7, #16\n\t"
  196533. #endif
  196534. #ifdef WOLFSSL_KEIL
  196535. "muls r5, r6, r5\n\t"
  196536. #elif defined(__clang__)
  196537. "muls r5, r6\n\t"
  196538. #else
  196539. "mul r5, r6\n\t"
  196540. #endif
  196541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196542. "lsrs r6, r5, #16\n\t"
  196543. #else
  196544. "lsr r6, r5, #16\n\t"
  196545. #endif
  196546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196547. "lsls r5, r5, #16\n\t"
  196548. #else
  196549. "lsl r5, r5, #16\n\t"
  196550. #endif
  196551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196552. "adds r2, r2, r5\n\t"
  196553. #else
  196554. "add r2, r2, r5\n\t"
  196555. #endif
  196556. #ifdef WOLFSSL_KEIL
  196557. "adcs r3, r3, r6\n\t"
  196558. #elif defined(__clang__)
  196559. "adcs r3, r6\n\t"
  196560. #else
  196561. "adc r3, r6\n\t"
  196562. #endif
  196563. #ifdef WOLFSSL_KEIL
  196564. "adcs r4, r4, %[r]\n\t"
  196565. #elif defined(__clang__)
  196566. "adcs r4, %[r]\n\t"
  196567. #else
  196568. "adc r4, %[r]\n\t"
  196569. #endif
  196570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196571. "adds r2, r2, r5\n\t"
  196572. #else
  196573. "add r2, r2, r5\n\t"
  196574. #endif
  196575. #ifdef WOLFSSL_KEIL
  196576. "adcs r3, r3, r6\n\t"
  196577. #elif defined(__clang__)
  196578. "adcs r3, r6\n\t"
  196579. #else
  196580. "adc r3, r6\n\t"
  196581. #endif
  196582. #ifdef WOLFSSL_KEIL
  196583. "adcs r4, r4, %[r]\n\t"
  196584. #elif defined(__clang__)
  196585. "adcs r4, %[r]\n\t"
  196586. #else
  196587. "adc r4, %[r]\n\t"
  196588. #endif
  196589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196590. "lsrs r5, %[a], #16\n\t"
  196591. #else
  196592. "lsr r5, %[a], #16\n\t"
  196593. #endif
  196594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196595. "lsrs r6, r7, #16\n\t"
  196596. #else
  196597. "lsr r6, r7, #16\n\t"
  196598. #endif
  196599. #ifdef WOLFSSL_KEIL
  196600. "muls r6, r5, r6\n\t"
  196601. #elif defined(__clang__)
  196602. "muls r6, r5\n\t"
  196603. #else
  196604. "mul r6, r5\n\t"
  196605. #endif
  196606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196607. "adds r3, r3, r6\n\t"
  196608. #else
  196609. "add r3, r3, r6\n\t"
  196610. #endif
  196611. #ifdef WOLFSSL_KEIL
  196612. "adcs r4, r4, %[r]\n\t"
  196613. #elif defined(__clang__)
  196614. "adcs r4, %[r]\n\t"
  196615. #else
  196616. "adc r4, %[r]\n\t"
  196617. #endif
  196618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196619. "adds r3, r3, r6\n\t"
  196620. #else
  196621. "add r3, r3, r6\n\t"
  196622. #endif
  196623. #ifdef WOLFSSL_KEIL
  196624. "adcs r4, r4, %[r]\n\t"
  196625. #elif defined(__clang__)
  196626. "adcs r4, %[r]\n\t"
  196627. #else
  196628. "adc r4, %[r]\n\t"
  196629. #endif
  196630. "uxth r6, r7\n\t"
  196631. #ifdef WOLFSSL_KEIL
  196632. "muls r5, r6, r5\n\t"
  196633. #elif defined(__clang__)
  196634. "muls r5, r6\n\t"
  196635. #else
  196636. "mul r5, r6\n\t"
  196637. #endif
  196638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196639. "lsrs r6, r5, #16\n\t"
  196640. #else
  196641. "lsr r6, r5, #16\n\t"
  196642. #endif
  196643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196644. "lsls r5, r5, #16\n\t"
  196645. #else
  196646. "lsl r5, r5, #16\n\t"
  196647. #endif
  196648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196649. "adds r2, r2, r5\n\t"
  196650. #else
  196651. "add r2, r2, r5\n\t"
  196652. #endif
  196653. #ifdef WOLFSSL_KEIL
  196654. "adcs r3, r3, r6\n\t"
  196655. #elif defined(__clang__)
  196656. "adcs r3, r6\n\t"
  196657. #else
  196658. "adc r3, r6\n\t"
  196659. #endif
  196660. #ifdef WOLFSSL_KEIL
  196661. "adcs r4, r4, %[r]\n\t"
  196662. #elif defined(__clang__)
  196663. "adcs r4, %[r]\n\t"
  196664. #else
  196665. "adc r4, %[r]\n\t"
  196666. #endif
  196667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196668. "adds r2, r2, r5\n\t"
  196669. #else
  196670. "add r2, r2, r5\n\t"
  196671. #endif
  196672. #ifdef WOLFSSL_KEIL
  196673. "adcs r3, r3, r6\n\t"
  196674. #elif defined(__clang__)
  196675. "adcs r3, r6\n\t"
  196676. #else
  196677. "adc r3, r6\n\t"
  196678. #endif
  196679. #ifdef WOLFSSL_KEIL
  196680. "adcs r4, r4, %[r]\n\t"
  196681. #elif defined(__clang__)
  196682. "adcs r4, %[r]\n\t"
  196683. #else
  196684. "adc r4, %[r]\n\t"
  196685. #endif
  196686. "mov %[r], r8\n\t"
  196687. "str r2, [%[r], #108]\n\t"
  196688. "movs %[r], #0\n\t"
  196689. "# A[15] * A[13]\n\t"
  196690. "movs r2, #0\n\t"
  196691. "mov %[a], r9\n\t"
  196692. "mov r7, r11\n\t"
  196693. "mov %[a], lr\n\t"
  196694. "uxth r5, %[a]\n\t"
  196695. "uxth r6, r7\n\t"
  196696. #ifdef WOLFSSL_KEIL
  196697. "muls r6, r5, r6\n\t"
  196698. #elif defined(__clang__)
  196699. "muls r6, r5\n\t"
  196700. #else
  196701. "mul r6, r5\n\t"
  196702. #endif
  196703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196704. "adds r3, r3, r6\n\t"
  196705. #else
  196706. "add r3, r3, r6\n\t"
  196707. #endif
  196708. #ifdef WOLFSSL_KEIL
  196709. "adcs r4, r4, %[r]\n\t"
  196710. #elif defined(__clang__)
  196711. "adcs r4, %[r]\n\t"
  196712. #else
  196713. "adc r4, %[r]\n\t"
  196714. #endif
  196715. #ifdef WOLFSSL_KEIL
  196716. "adcs r2, r2, %[r]\n\t"
  196717. #elif defined(__clang__)
  196718. "adcs r2, %[r]\n\t"
  196719. #else
  196720. "adc r2, %[r]\n\t"
  196721. #endif
  196722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196723. "adds r3, r3, r6\n\t"
  196724. #else
  196725. "add r3, r3, r6\n\t"
  196726. #endif
  196727. #ifdef WOLFSSL_KEIL
  196728. "adcs r4, r4, %[r]\n\t"
  196729. #elif defined(__clang__)
  196730. "adcs r4, %[r]\n\t"
  196731. #else
  196732. "adc r4, %[r]\n\t"
  196733. #endif
  196734. #ifdef WOLFSSL_KEIL
  196735. "adcs r2, r2, %[r]\n\t"
  196736. #elif defined(__clang__)
  196737. "adcs r2, %[r]\n\t"
  196738. #else
  196739. "adc r2, %[r]\n\t"
  196740. #endif
  196741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196742. "lsrs r6, r7, #16\n\t"
  196743. #else
  196744. "lsr r6, r7, #16\n\t"
  196745. #endif
  196746. #ifdef WOLFSSL_KEIL
  196747. "muls r5, r6, r5\n\t"
  196748. #elif defined(__clang__)
  196749. "muls r5, r6\n\t"
  196750. #else
  196751. "mul r5, r6\n\t"
  196752. #endif
  196753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196754. "lsrs r6, r5, #16\n\t"
  196755. #else
  196756. "lsr r6, r5, #16\n\t"
  196757. #endif
  196758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196759. "lsls r5, r5, #16\n\t"
  196760. #else
  196761. "lsl r5, r5, #16\n\t"
  196762. #endif
  196763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196764. "adds r3, r3, r5\n\t"
  196765. #else
  196766. "add r3, r3, r5\n\t"
  196767. #endif
  196768. #ifdef WOLFSSL_KEIL
  196769. "adcs r4, r4, r6\n\t"
  196770. #elif defined(__clang__)
  196771. "adcs r4, r6\n\t"
  196772. #else
  196773. "adc r4, r6\n\t"
  196774. #endif
  196775. #ifdef WOLFSSL_KEIL
  196776. "adcs r2, r2, %[r]\n\t"
  196777. #elif defined(__clang__)
  196778. "adcs r2, %[r]\n\t"
  196779. #else
  196780. "adc r2, %[r]\n\t"
  196781. #endif
  196782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196783. "adds r3, r3, r5\n\t"
  196784. #else
  196785. "add r3, r3, r5\n\t"
  196786. #endif
  196787. #ifdef WOLFSSL_KEIL
  196788. "adcs r4, r4, r6\n\t"
  196789. #elif defined(__clang__)
  196790. "adcs r4, r6\n\t"
  196791. #else
  196792. "adc r4, r6\n\t"
  196793. #endif
  196794. #ifdef WOLFSSL_KEIL
  196795. "adcs r2, r2, %[r]\n\t"
  196796. #elif defined(__clang__)
  196797. "adcs r2, %[r]\n\t"
  196798. #else
  196799. "adc r2, %[r]\n\t"
  196800. #endif
  196801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196802. "lsrs r5, %[a], #16\n\t"
  196803. #else
  196804. "lsr r5, %[a], #16\n\t"
  196805. #endif
  196806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196807. "lsrs r6, r7, #16\n\t"
  196808. #else
  196809. "lsr r6, r7, #16\n\t"
  196810. #endif
  196811. #ifdef WOLFSSL_KEIL
  196812. "muls r6, r5, r6\n\t"
  196813. #elif defined(__clang__)
  196814. "muls r6, r5\n\t"
  196815. #else
  196816. "mul r6, r5\n\t"
  196817. #endif
  196818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196819. "adds r4, r4, r6\n\t"
  196820. #else
  196821. "add r4, r4, r6\n\t"
  196822. #endif
  196823. #ifdef WOLFSSL_KEIL
  196824. "adcs r2, r2, %[r]\n\t"
  196825. #elif defined(__clang__)
  196826. "adcs r2, %[r]\n\t"
  196827. #else
  196828. "adc r2, %[r]\n\t"
  196829. #endif
  196830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196831. "adds r4, r4, r6\n\t"
  196832. #else
  196833. "add r4, r4, r6\n\t"
  196834. #endif
  196835. #ifdef WOLFSSL_KEIL
  196836. "adcs r2, r2, %[r]\n\t"
  196837. #elif defined(__clang__)
  196838. "adcs r2, %[r]\n\t"
  196839. #else
  196840. "adc r2, %[r]\n\t"
  196841. #endif
  196842. "uxth r6, r7\n\t"
  196843. #ifdef WOLFSSL_KEIL
  196844. "muls r5, r6, r5\n\t"
  196845. #elif defined(__clang__)
  196846. "muls r5, r6\n\t"
  196847. #else
  196848. "mul r5, r6\n\t"
  196849. #endif
  196850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196851. "lsrs r6, r5, #16\n\t"
  196852. #else
  196853. "lsr r6, r5, #16\n\t"
  196854. #endif
  196855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196856. "lsls r5, r5, #16\n\t"
  196857. #else
  196858. "lsl r5, r5, #16\n\t"
  196859. #endif
  196860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196861. "adds r3, r3, r5\n\t"
  196862. #else
  196863. "add r3, r3, r5\n\t"
  196864. #endif
  196865. #ifdef WOLFSSL_KEIL
  196866. "adcs r4, r4, r6\n\t"
  196867. #elif defined(__clang__)
  196868. "adcs r4, r6\n\t"
  196869. #else
  196870. "adc r4, r6\n\t"
  196871. #endif
  196872. #ifdef WOLFSSL_KEIL
  196873. "adcs r2, r2, %[r]\n\t"
  196874. #elif defined(__clang__)
  196875. "adcs r2, %[r]\n\t"
  196876. #else
  196877. "adc r2, %[r]\n\t"
  196878. #endif
  196879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196880. "adds r3, r3, r5\n\t"
  196881. #else
  196882. "add r3, r3, r5\n\t"
  196883. #endif
  196884. #ifdef WOLFSSL_KEIL
  196885. "adcs r4, r4, r6\n\t"
  196886. #elif defined(__clang__)
  196887. "adcs r4, r6\n\t"
  196888. #else
  196889. "adc r4, r6\n\t"
  196890. #endif
  196891. #ifdef WOLFSSL_KEIL
  196892. "adcs r2, r2, %[r]\n\t"
  196893. #elif defined(__clang__)
  196894. "adcs r2, %[r]\n\t"
  196895. #else
  196896. "adc r2, %[r]\n\t"
  196897. #endif
  196898. "# A[14] * A[14]\n\t"
  196899. "mov r7, r12\n\t"
  196900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196901. "lsrs r6, r7, #16\n\t"
  196902. #else
  196903. "lsr r6, r7, #16\n\t"
  196904. #endif
  196905. "uxth r5, r7\n\t"
  196906. #ifdef WOLFSSL_KEIL
  196907. "muls r5, r5, r5\n\t"
  196908. #elif defined(__clang__)
  196909. "muls r5, r5\n\t"
  196910. #else
  196911. "mul r5, r5\n\t"
  196912. #endif
  196913. #ifdef WOLFSSL_KEIL
  196914. "muls r6, r6, r6\n\t"
  196915. #elif defined(__clang__)
  196916. "muls r6, r6\n\t"
  196917. #else
  196918. "mul r6, r6\n\t"
  196919. #endif
  196920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196921. "adds r3, r3, r5\n\t"
  196922. #else
  196923. "add r3, r3, r5\n\t"
  196924. #endif
  196925. #ifdef WOLFSSL_KEIL
  196926. "adcs r4, r4, r6\n\t"
  196927. #elif defined(__clang__)
  196928. "adcs r4, r6\n\t"
  196929. #else
  196930. "adc r4, r6\n\t"
  196931. #endif
  196932. #ifdef WOLFSSL_KEIL
  196933. "adcs r2, r2, %[r]\n\t"
  196934. #elif defined(__clang__)
  196935. "adcs r2, %[r]\n\t"
  196936. #else
  196937. "adc r2, %[r]\n\t"
  196938. #endif
  196939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196940. "lsrs r6, r7, #16\n\t"
  196941. #else
  196942. "lsr r6, r7, #16\n\t"
  196943. #endif
  196944. "uxth r5, r7\n\t"
  196945. #ifdef WOLFSSL_KEIL
  196946. "muls r5, r6, r5\n\t"
  196947. #elif defined(__clang__)
  196948. "muls r5, r6\n\t"
  196949. #else
  196950. "mul r5, r6\n\t"
  196951. #endif
  196952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196953. "lsrs r6, r5, #15\n\t"
  196954. #else
  196955. "lsr r6, r5, #15\n\t"
  196956. #endif
  196957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196958. "lsls r5, r5, #17\n\t"
  196959. #else
  196960. "lsl r5, r5, #17\n\t"
  196961. #endif
  196962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196963. "adds r3, r3, r5\n\t"
  196964. #else
  196965. "add r3, r3, r5\n\t"
  196966. #endif
  196967. #ifdef WOLFSSL_KEIL
  196968. "adcs r4, r4, r6\n\t"
  196969. #elif defined(__clang__)
  196970. "adcs r4, r6\n\t"
  196971. #else
  196972. "adc r4, r6\n\t"
  196973. #endif
  196974. #ifdef WOLFSSL_KEIL
  196975. "adcs r2, r2, %[r]\n\t"
  196976. #elif defined(__clang__)
  196977. "adcs r2, %[r]\n\t"
  196978. #else
  196979. "adc r2, %[r]\n\t"
  196980. #endif
  196981. "mov %[r], r8\n\t"
  196982. "str r3, [%[r], #112]\n\t"
  196983. "movs %[r], #0\n\t"
  196984. "# A[15] * A[14]\n\t"
  196985. "movs r3, #0\n\t"
  196986. "mov %[a], r9\n\t"
  196987. "mov %[a], lr\n\t"
  196988. "uxth r5, %[a]\n\t"
  196989. "uxth r6, r7\n\t"
  196990. #ifdef WOLFSSL_KEIL
  196991. "muls r6, r5, r6\n\t"
  196992. #elif defined(__clang__)
  196993. "muls r6, r5\n\t"
  196994. #else
  196995. "mul r6, r5\n\t"
  196996. #endif
  196997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196998. "adds r4, r4, r6\n\t"
  196999. #else
  197000. "add r4, r4, r6\n\t"
  197001. #endif
  197002. #ifdef WOLFSSL_KEIL
  197003. "adcs r2, r2, %[r]\n\t"
  197004. #elif defined(__clang__)
  197005. "adcs r2, %[r]\n\t"
  197006. #else
  197007. "adc r2, %[r]\n\t"
  197008. #endif
  197009. #ifdef WOLFSSL_KEIL
  197010. "adcs r3, r3, %[r]\n\t"
  197011. #elif defined(__clang__)
  197012. "adcs r3, %[r]\n\t"
  197013. #else
  197014. "adc r3, %[r]\n\t"
  197015. #endif
  197016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197017. "adds r4, r4, r6\n\t"
  197018. #else
  197019. "add r4, r4, r6\n\t"
  197020. #endif
  197021. #ifdef WOLFSSL_KEIL
  197022. "adcs r2, r2, %[r]\n\t"
  197023. #elif defined(__clang__)
  197024. "adcs r2, %[r]\n\t"
  197025. #else
  197026. "adc r2, %[r]\n\t"
  197027. #endif
  197028. #ifdef WOLFSSL_KEIL
  197029. "adcs r3, r3, %[r]\n\t"
  197030. #elif defined(__clang__)
  197031. "adcs r3, %[r]\n\t"
  197032. #else
  197033. "adc r3, %[r]\n\t"
  197034. #endif
  197035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197036. "lsrs r6, r7, #16\n\t"
  197037. #else
  197038. "lsr r6, r7, #16\n\t"
  197039. #endif
  197040. #ifdef WOLFSSL_KEIL
  197041. "muls r5, r6, r5\n\t"
  197042. #elif defined(__clang__)
  197043. "muls r5, r6\n\t"
  197044. #else
  197045. "mul r5, r6\n\t"
  197046. #endif
  197047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197048. "lsrs r6, r5, #16\n\t"
  197049. #else
  197050. "lsr r6, r5, #16\n\t"
  197051. #endif
  197052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197053. "lsls r5, r5, #16\n\t"
  197054. #else
  197055. "lsl r5, r5, #16\n\t"
  197056. #endif
  197057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197058. "adds r4, r4, r5\n\t"
  197059. #else
  197060. "add r4, r4, r5\n\t"
  197061. #endif
  197062. #ifdef WOLFSSL_KEIL
  197063. "adcs r2, r2, r6\n\t"
  197064. #elif defined(__clang__)
  197065. "adcs r2, r6\n\t"
  197066. #else
  197067. "adc r2, r6\n\t"
  197068. #endif
  197069. #ifdef WOLFSSL_KEIL
  197070. "adcs r3, r3, %[r]\n\t"
  197071. #elif defined(__clang__)
  197072. "adcs r3, %[r]\n\t"
  197073. #else
  197074. "adc r3, %[r]\n\t"
  197075. #endif
  197076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197077. "adds r4, r4, r5\n\t"
  197078. #else
  197079. "add r4, r4, r5\n\t"
  197080. #endif
  197081. #ifdef WOLFSSL_KEIL
  197082. "adcs r2, r2, r6\n\t"
  197083. #elif defined(__clang__)
  197084. "adcs r2, r6\n\t"
  197085. #else
  197086. "adc r2, r6\n\t"
  197087. #endif
  197088. #ifdef WOLFSSL_KEIL
  197089. "adcs r3, r3, %[r]\n\t"
  197090. #elif defined(__clang__)
  197091. "adcs r3, %[r]\n\t"
  197092. #else
  197093. "adc r3, %[r]\n\t"
  197094. #endif
  197095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197096. "lsrs r5, %[a], #16\n\t"
  197097. #else
  197098. "lsr r5, %[a], #16\n\t"
  197099. #endif
  197100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197101. "lsrs r6, r7, #16\n\t"
  197102. #else
  197103. "lsr r6, r7, #16\n\t"
  197104. #endif
  197105. #ifdef WOLFSSL_KEIL
  197106. "muls r6, r5, r6\n\t"
  197107. #elif defined(__clang__)
  197108. "muls r6, r5\n\t"
  197109. #else
  197110. "mul r6, r5\n\t"
  197111. #endif
  197112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197113. "adds r2, r2, r6\n\t"
  197114. #else
  197115. "add r2, r2, r6\n\t"
  197116. #endif
  197117. #ifdef WOLFSSL_KEIL
  197118. "adcs r3, r3, %[r]\n\t"
  197119. #elif defined(__clang__)
  197120. "adcs r3, %[r]\n\t"
  197121. #else
  197122. "adc r3, %[r]\n\t"
  197123. #endif
  197124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197125. "adds r2, r2, r6\n\t"
  197126. #else
  197127. "add r2, r2, r6\n\t"
  197128. #endif
  197129. #ifdef WOLFSSL_KEIL
  197130. "adcs r3, r3, %[r]\n\t"
  197131. #elif defined(__clang__)
  197132. "adcs r3, %[r]\n\t"
  197133. #else
  197134. "adc r3, %[r]\n\t"
  197135. #endif
  197136. "uxth r6, r7\n\t"
  197137. #ifdef WOLFSSL_KEIL
  197138. "muls r5, r6, r5\n\t"
  197139. #elif defined(__clang__)
  197140. "muls r5, r6\n\t"
  197141. #else
  197142. "mul r5, r6\n\t"
  197143. #endif
  197144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197145. "lsrs r6, r5, #16\n\t"
  197146. #else
  197147. "lsr r6, r5, #16\n\t"
  197148. #endif
  197149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197150. "lsls r5, r5, #16\n\t"
  197151. #else
  197152. "lsl r5, r5, #16\n\t"
  197153. #endif
  197154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197155. "adds r4, r4, r5\n\t"
  197156. #else
  197157. "add r4, r4, r5\n\t"
  197158. #endif
  197159. #ifdef WOLFSSL_KEIL
  197160. "adcs r2, r2, r6\n\t"
  197161. #elif defined(__clang__)
  197162. "adcs r2, r6\n\t"
  197163. #else
  197164. "adc r2, r6\n\t"
  197165. #endif
  197166. #ifdef WOLFSSL_KEIL
  197167. "adcs r3, r3, %[r]\n\t"
  197168. #elif defined(__clang__)
  197169. "adcs r3, %[r]\n\t"
  197170. #else
  197171. "adc r3, %[r]\n\t"
  197172. #endif
  197173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197174. "adds r4, r4, r5\n\t"
  197175. #else
  197176. "add r4, r4, r5\n\t"
  197177. #endif
  197178. #ifdef WOLFSSL_KEIL
  197179. "adcs r2, r2, r6\n\t"
  197180. #elif defined(__clang__)
  197181. "adcs r2, r6\n\t"
  197182. #else
  197183. "adc r2, r6\n\t"
  197184. #endif
  197185. #ifdef WOLFSSL_KEIL
  197186. "adcs r3, r3, %[r]\n\t"
  197187. #elif defined(__clang__)
  197188. "adcs r3, %[r]\n\t"
  197189. #else
  197190. "adc r3, %[r]\n\t"
  197191. #endif
  197192. "mov %[r], r8\n\t"
  197193. "str r4, [%[r], #116]\n\t"
  197194. "movs %[r], #0\n\t"
  197195. "# A[15] * A[15]\n\t"
  197196. "mov %[a], r9\n\t"
  197197. "mov r7, lr\n\t"
  197198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197199. "lsrs r6, r7, #16\n\t"
  197200. #else
  197201. "lsr r6, r7, #16\n\t"
  197202. #endif
  197203. "uxth r5, r7\n\t"
  197204. #ifdef WOLFSSL_KEIL
  197205. "muls r5, r5, r5\n\t"
  197206. #elif defined(__clang__)
  197207. "muls r5, r5\n\t"
  197208. #else
  197209. "mul r5, r5\n\t"
  197210. #endif
  197211. #ifdef WOLFSSL_KEIL
  197212. "muls r6, r6, r6\n\t"
  197213. #elif defined(__clang__)
  197214. "muls r6, r6\n\t"
  197215. #else
  197216. "mul r6, r6\n\t"
  197217. #endif
  197218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197219. "adds r2, r2, r5\n\t"
  197220. #else
  197221. "add r2, r2, r5\n\t"
  197222. #endif
  197223. #ifdef WOLFSSL_KEIL
  197224. "adcs r3, r3, r6\n\t"
  197225. #elif defined(__clang__)
  197226. "adcs r3, r6\n\t"
  197227. #else
  197228. "adc r3, r6\n\t"
  197229. #endif
  197230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197231. "lsrs r6, r7, #16\n\t"
  197232. #else
  197233. "lsr r6, r7, #16\n\t"
  197234. #endif
  197235. "uxth r5, r7\n\t"
  197236. #ifdef WOLFSSL_KEIL
  197237. "muls r5, r6, r5\n\t"
  197238. #elif defined(__clang__)
  197239. "muls r5, r6\n\t"
  197240. #else
  197241. "mul r5, r6\n\t"
  197242. #endif
  197243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197244. "lsrs r6, r5, #15\n\t"
  197245. #else
  197246. "lsr r6, r5, #15\n\t"
  197247. #endif
  197248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197249. "lsls r5, r5, #17\n\t"
  197250. #else
  197251. "lsl r5, r5, #17\n\t"
  197252. #endif
  197253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197254. "adds r2, r2, r5\n\t"
  197255. #else
  197256. "add r2, r2, r5\n\t"
  197257. #endif
  197258. #ifdef WOLFSSL_KEIL
  197259. "adcs r3, r3, r6\n\t"
  197260. #elif defined(__clang__)
  197261. "adcs r3, r6\n\t"
  197262. #else
  197263. "adc r3, r6\n\t"
  197264. #endif
  197265. "mov %[r], r8\n\t"
  197266. "str r2, [%[r], #120]\n\t"
  197267. "str r3, [%[r], #124]\n\t"
  197268. "pop {r2, r3, r4, r5}\n\t"
  197269. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  197270. "pop {r2, r3, r4, r5}\n\t"
  197271. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  197272. "pop {r2, r3, r4, r5}\n\t"
  197273. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  197274. "pop {r2, r3, r4, r5}\n\t"
  197275. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  197276. : [r] "+l" (r), [a] "+l" (a)
  197277. :
  197278. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  197279. );
  197280. }
  197281. #endif /* !WOLFSSL_SP_LARGE_CODE */
  197282. /* Add b to a into r. (r = a + b)
  197283. *
  197284. * r A single precision integer.
  197285. * a A single precision integer.
  197286. * b A single precision integer.
  197287. */
  197288. SP_NOINLINE static sp_digit sp_1024_add_16(sp_digit* r, const sp_digit* a,
  197289. const sp_digit* b)
  197290. {
  197291. __asm__ __volatile__ (
  197292. "ldm %[b]!, {r5, r6}\n\t"
  197293. "ldm %[a]!, {r3, r4}\n\t"
  197294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197295. "adds r3, r3, r5\n\t"
  197296. #else
  197297. "add r3, r3, r5\n\t"
  197298. #endif
  197299. #ifdef WOLFSSL_KEIL
  197300. "adcs r4, r4, r6\n\t"
  197301. #elif defined(__clang__)
  197302. "adcs r4, r6\n\t"
  197303. #else
  197304. "adc r4, r6\n\t"
  197305. #endif
  197306. "stm %[r]!, {r3, r4}\n\t"
  197307. "ldm %[b]!, {r5, r6}\n\t"
  197308. "ldm %[a]!, {r3, r4}\n\t"
  197309. #ifdef WOLFSSL_KEIL
  197310. "adcs r3, r3, r5\n\t"
  197311. #elif defined(__clang__)
  197312. "adcs r3, r5\n\t"
  197313. #else
  197314. "adc r3, r5\n\t"
  197315. #endif
  197316. #ifdef WOLFSSL_KEIL
  197317. "adcs r4, r4, r6\n\t"
  197318. #elif defined(__clang__)
  197319. "adcs r4, r6\n\t"
  197320. #else
  197321. "adc r4, r6\n\t"
  197322. #endif
  197323. "stm %[r]!, {r3, r4}\n\t"
  197324. "ldm %[b]!, {r5, r6}\n\t"
  197325. "ldm %[a]!, {r3, r4}\n\t"
  197326. #ifdef WOLFSSL_KEIL
  197327. "adcs r3, r3, r5\n\t"
  197328. #elif defined(__clang__)
  197329. "adcs r3, r5\n\t"
  197330. #else
  197331. "adc r3, r5\n\t"
  197332. #endif
  197333. #ifdef WOLFSSL_KEIL
  197334. "adcs r4, r4, r6\n\t"
  197335. #elif defined(__clang__)
  197336. "adcs r4, r6\n\t"
  197337. #else
  197338. "adc r4, r6\n\t"
  197339. #endif
  197340. "stm %[r]!, {r3, r4}\n\t"
  197341. "ldm %[b]!, {r5, r6}\n\t"
  197342. "ldm %[a]!, {r3, r4}\n\t"
  197343. #ifdef WOLFSSL_KEIL
  197344. "adcs r3, r3, r5\n\t"
  197345. #elif defined(__clang__)
  197346. "adcs r3, r5\n\t"
  197347. #else
  197348. "adc r3, r5\n\t"
  197349. #endif
  197350. #ifdef WOLFSSL_KEIL
  197351. "adcs r4, r4, r6\n\t"
  197352. #elif defined(__clang__)
  197353. "adcs r4, r6\n\t"
  197354. #else
  197355. "adc r4, r6\n\t"
  197356. #endif
  197357. "stm %[r]!, {r3, r4}\n\t"
  197358. "ldm %[b]!, {r5, r6}\n\t"
  197359. "ldm %[a]!, {r3, r4}\n\t"
  197360. #ifdef WOLFSSL_KEIL
  197361. "adcs r3, r3, r5\n\t"
  197362. #elif defined(__clang__)
  197363. "adcs r3, r5\n\t"
  197364. #else
  197365. "adc r3, r5\n\t"
  197366. #endif
  197367. #ifdef WOLFSSL_KEIL
  197368. "adcs r4, r4, r6\n\t"
  197369. #elif defined(__clang__)
  197370. "adcs r4, r6\n\t"
  197371. #else
  197372. "adc r4, r6\n\t"
  197373. #endif
  197374. "stm %[r]!, {r3, r4}\n\t"
  197375. "ldm %[b]!, {r5, r6}\n\t"
  197376. "ldm %[a]!, {r3, r4}\n\t"
  197377. #ifdef WOLFSSL_KEIL
  197378. "adcs r3, r3, r5\n\t"
  197379. #elif defined(__clang__)
  197380. "adcs r3, r5\n\t"
  197381. #else
  197382. "adc r3, r5\n\t"
  197383. #endif
  197384. #ifdef WOLFSSL_KEIL
  197385. "adcs r4, r4, r6\n\t"
  197386. #elif defined(__clang__)
  197387. "adcs r4, r6\n\t"
  197388. #else
  197389. "adc r4, r6\n\t"
  197390. #endif
  197391. "stm %[r]!, {r3, r4}\n\t"
  197392. "ldm %[b]!, {r5, r6}\n\t"
  197393. "ldm %[a]!, {r3, r4}\n\t"
  197394. #ifdef WOLFSSL_KEIL
  197395. "adcs r3, r3, r5\n\t"
  197396. #elif defined(__clang__)
  197397. "adcs r3, r5\n\t"
  197398. #else
  197399. "adc r3, r5\n\t"
  197400. #endif
  197401. #ifdef WOLFSSL_KEIL
  197402. "adcs r4, r4, r6\n\t"
  197403. #elif defined(__clang__)
  197404. "adcs r4, r6\n\t"
  197405. #else
  197406. "adc r4, r6\n\t"
  197407. #endif
  197408. "stm %[r]!, {r3, r4}\n\t"
  197409. "ldm %[b]!, {r5, r6}\n\t"
  197410. "ldm %[a]!, {r3, r4}\n\t"
  197411. #ifdef WOLFSSL_KEIL
  197412. "adcs r3, r3, r5\n\t"
  197413. #elif defined(__clang__)
  197414. "adcs r3, r5\n\t"
  197415. #else
  197416. "adc r3, r5\n\t"
  197417. #endif
  197418. #ifdef WOLFSSL_KEIL
  197419. "adcs r4, r4, r6\n\t"
  197420. #elif defined(__clang__)
  197421. "adcs r4, r6\n\t"
  197422. #else
  197423. "adc r4, r6\n\t"
  197424. #endif
  197425. "stm %[r]!, {r3, r4}\n\t"
  197426. "movs %[r], #0\n\t"
  197427. #ifdef WOLFSSL_KEIL
  197428. "adcs %[r], %[r], %[r]\n\t"
  197429. #elif defined(__clang__)
  197430. "adcs %[r], %[r]\n\t"
  197431. #else
  197432. "adc %[r], %[r]\n\t"
  197433. #endif
  197434. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  197435. :
  197436. : "memory", "r3", "r4", "r5", "r6"
  197437. );
  197438. return (uint32_t)(size_t)r;
  197439. }
  197440. /* Add b to a into r. (r = a + b)
  197441. *
  197442. * r A single precision integer.
  197443. * a A single precision integer.
  197444. * b A single precision integer.
  197445. */
  197446. SP_NOINLINE static sp_digit sp_1024_add_word_16(sp_digit* r, const sp_digit* a,
  197447. sp_digit b)
  197448. {
  197449. __asm__ __volatile__ (
  197450. "movs r5, #0\n\t"
  197451. "ldm %[a]!, {r3, r4}\n\t"
  197452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197453. "adds r3, r3, %[b]\n\t"
  197454. #else
  197455. "add r3, r3, %[b]\n\t"
  197456. #endif
  197457. #ifdef WOLFSSL_KEIL
  197458. "adcs r4, r4, r5\n\t"
  197459. #elif defined(__clang__)
  197460. "adcs r4, r5\n\t"
  197461. #else
  197462. "adc r4, r5\n\t"
  197463. #endif
  197464. "stm %[r]!, {r3, r4}\n\t"
  197465. "ldm %[a]!, {r3, r4}\n\t"
  197466. #ifdef WOLFSSL_KEIL
  197467. "adcs r3, r3, r5\n\t"
  197468. #elif defined(__clang__)
  197469. "adcs r3, r5\n\t"
  197470. #else
  197471. "adc r3, r5\n\t"
  197472. #endif
  197473. #ifdef WOLFSSL_KEIL
  197474. "adcs r4, r4, r5\n\t"
  197475. #elif defined(__clang__)
  197476. "adcs r4, r5\n\t"
  197477. #else
  197478. "adc r4, r5\n\t"
  197479. #endif
  197480. "stm %[r]!, {r3, r4}\n\t"
  197481. "ldm %[a]!, {r3, r4}\n\t"
  197482. #ifdef WOLFSSL_KEIL
  197483. "adcs r3, r3, r5\n\t"
  197484. #elif defined(__clang__)
  197485. "adcs r3, r5\n\t"
  197486. #else
  197487. "adc r3, r5\n\t"
  197488. #endif
  197489. #ifdef WOLFSSL_KEIL
  197490. "adcs r4, r4, r5\n\t"
  197491. #elif defined(__clang__)
  197492. "adcs r4, r5\n\t"
  197493. #else
  197494. "adc r4, r5\n\t"
  197495. #endif
  197496. "stm %[r]!, {r3, r4}\n\t"
  197497. "ldm %[a]!, {r3, r4}\n\t"
  197498. #ifdef WOLFSSL_KEIL
  197499. "adcs r3, r3, r5\n\t"
  197500. #elif defined(__clang__)
  197501. "adcs r3, r5\n\t"
  197502. #else
  197503. "adc r3, r5\n\t"
  197504. #endif
  197505. #ifdef WOLFSSL_KEIL
  197506. "adcs r4, r4, r5\n\t"
  197507. #elif defined(__clang__)
  197508. "adcs r4, r5\n\t"
  197509. #else
  197510. "adc r4, r5\n\t"
  197511. #endif
  197512. "stm %[r]!, {r3, r4}\n\t"
  197513. "ldm %[a]!, {r3, r4}\n\t"
  197514. #ifdef WOLFSSL_KEIL
  197515. "adcs r3, r3, r5\n\t"
  197516. #elif defined(__clang__)
  197517. "adcs r3, r5\n\t"
  197518. #else
  197519. "adc r3, r5\n\t"
  197520. #endif
  197521. #ifdef WOLFSSL_KEIL
  197522. "adcs r4, r4, r5\n\t"
  197523. #elif defined(__clang__)
  197524. "adcs r4, r5\n\t"
  197525. #else
  197526. "adc r4, r5\n\t"
  197527. #endif
  197528. "stm %[r]!, {r3, r4}\n\t"
  197529. "ldm %[a]!, {r3, r4}\n\t"
  197530. #ifdef WOLFSSL_KEIL
  197531. "adcs r3, r3, r5\n\t"
  197532. #elif defined(__clang__)
  197533. "adcs r3, r5\n\t"
  197534. #else
  197535. "adc r3, r5\n\t"
  197536. #endif
  197537. #ifdef WOLFSSL_KEIL
  197538. "adcs r4, r4, r5\n\t"
  197539. #elif defined(__clang__)
  197540. "adcs r4, r5\n\t"
  197541. #else
  197542. "adc r4, r5\n\t"
  197543. #endif
  197544. "stm %[r]!, {r3, r4}\n\t"
  197545. "ldm %[a]!, {r3, r4}\n\t"
  197546. #ifdef WOLFSSL_KEIL
  197547. "adcs r3, r3, r5\n\t"
  197548. #elif defined(__clang__)
  197549. "adcs r3, r5\n\t"
  197550. #else
  197551. "adc r3, r5\n\t"
  197552. #endif
  197553. #ifdef WOLFSSL_KEIL
  197554. "adcs r4, r4, r5\n\t"
  197555. #elif defined(__clang__)
  197556. "adcs r4, r5\n\t"
  197557. #else
  197558. "adc r4, r5\n\t"
  197559. #endif
  197560. "stm %[r]!, {r3, r4}\n\t"
  197561. "ldm %[a]!, {r3, r4}\n\t"
  197562. #ifdef WOLFSSL_KEIL
  197563. "adcs r3, r3, r5\n\t"
  197564. #elif defined(__clang__)
  197565. "adcs r3, r5\n\t"
  197566. #else
  197567. "adc r3, r5\n\t"
  197568. #endif
  197569. #ifdef WOLFSSL_KEIL
  197570. "adcs r4, r4, r5\n\t"
  197571. #elif defined(__clang__)
  197572. "adcs r4, r5\n\t"
  197573. #else
  197574. "adc r4, r5\n\t"
  197575. #endif
  197576. "stm %[r]!, {r3, r4}\n\t"
  197577. "movs %[r], #0\n\t"
  197578. #ifdef WOLFSSL_KEIL
  197579. "adcs %[r], %[r], %[r]\n\t"
  197580. #elif defined(__clang__)
  197581. "adcs %[r], %[r]\n\t"
  197582. #else
  197583. "adc %[r], %[r]\n\t"
  197584. #endif
  197585. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  197586. :
  197587. : "memory", "r3", "r4", "r5"
  197588. );
  197589. return (uint32_t)(size_t)r;
  197590. }
  197591. /* Sub b from a into a. (a -= b)
  197592. *
  197593. * a A single precision integer.
  197594. * b A single precision integer.
  197595. */
  197596. SP_NOINLINE static sp_digit sp_1024_sub_in_place_32(sp_digit* a,
  197597. const sp_digit* b)
  197598. {
  197599. __asm__ __volatile__ (
  197600. "ldm %[b]!, {r4, r5}\n\t"
  197601. "ldr r2, [%[a]]\n\t"
  197602. "ldr r3, [%[a], #4]\n\t"
  197603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197604. "subs r2, r2, r4\n\t"
  197605. #else
  197606. "sub r2, r2, r4\n\t"
  197607. #endif
  197608. #ifdef WOLFSSL_KEIL
  197609. "sbcs r3, r3, r5\n\t"
  197610. #elif defined(__clang__)
  197611. "sbcs r3, r5\n\t"
  197612. #else
  197613. "sbc r3, r5\n\t"
  197614. #endif
  197615. "stm %[a]!, {r2, r3}\n\t"
  197616. "ldm %[b]!, {r4, r5}\n\t"
  197617. "ldr r2, [%[a]]\n\t"
  197618. "ldr r3, [%[a], #4]\n\t"
  197619. #ifdef WOLFSSL_KEIL
  197620. "sbcs r2, r2, r4\n\t"
  197621. #elif defined(__clang__)
  197622. "sbcs r2, r4\n\t"
  197623. #else
  197624. "sbc r2, r4\n\t"
  197625. #endif
  197626. #ifdef WOLFSSL_KEIL
  197627. "sbcs r3, r3, r5\n\t"
  197628. #elif defined(__clang__)
  197629. "sbcs r3, r5\n\t"
  197630. #else
  197631. "sbc r3, r5\n\t"
  197632. #endif
  197633. "stm %[a]!, {r2, r3}\n\t"
  197634. "ldm %[b]!, {r4, r5}\n\t"
  197635. "ldr r2, [%[a]]\n\t"
  197636. "ldr r3, [%[a], #4]\n\t"
  197637. #ifdef WOLFSSL_KEIL
  197638. "sbcs r2, r2, r4\n\t"
  197639. #elif defined(__clang__)
  197640. "sbcs r2, r4\n\t"
  197641. #else
  197642. "sbc r2, r4\n\t"
  197643. #endif
  197644. #ifdef WOLFSSL_KEIL
  197645. "sbcs r3, r3, r5\n\t"
  197646. #elif defined(__clang__)
  197647. "sbcs r3, r5\n\t"
  197648. #else
  197649. "sbc r3, r5\n\t"
  197650. #endif
  197651. "stm %[a]!, {r2, r3}\n\t"
  197652. "ldm %[b]!, {r4, r5}\n\t"
  197653. "ldr r2, [%[a]]\n\t"
  197654. "ldr r3, [%[a], #4]\n\t"
  197655. #ifdef WOLFSSL_KEIL
  197656. "sbcs r2, r2, r4\n\t"
  197657. #elif defined(__clang__)
  197658. "sbcs r2, r4\n\t"
  197659. #else
  197660. "sbc r2, r4\n\t"
  197661. #endif
  197662. #ifdef WOLFSSL_KEIL
  197663. "sbcs r3, r3, r5\n\t"
  197664. #elif defined(__clang__)
  197665. "sbcs r3, r5\n\t"
  197666. #else
  197667. "sbc r3, r5\n\t"
  197668. #endif
  197669. "stm %[a]!, {r2, r3}\n\t"
  197670. "ldm %[b]!, {r4, r5}\n\t"
  197671. "ldr r2, [%[a]]\n\t"
  197672. "ldr r3, [%[a], #4]\n\t"
  197673. #ifdef WOLFSSL_KEIL
  197674. "sbcs r2, r2, r4\n\t"
  197675. #elif defined(__clang__)
  197676. "sbcs r2, r4\n\t"
  197677. #else
  197678. "sbc r2, r4\n\t"
  197679. #endif
  197680. #ifdef WOLFSSL_KEIL
  197681. "sbcs r3, r3, r5\n\t"
  197682. #elif defined(__clang__)
  197683. "sbcs r3, r5\n\t"
  197684. #else
  197685. "sbc r3, r5\n\t"
  197686. #endif
  197687. "stm %[a]!, {r2, r3}\n\t"
  197688. "ldm %[b]!, {r4, r5}\n\t"
  197689. "ldr r2, [%[a]]\n\t"
  197690. "ldr r3, [%[a], #4]\n\t"
  197691. #ifdef WOLFSSL_KEIL
  197692. "sbcs r2, r2, r4\n\t"
  197693. #elif defined(__clang__)
  197694. "sbcs r2, r4\n\t"
  197695. #else
  197696. "sbc r2, r4\n\t"
  197697. #endif
  197698. #ifdef WOLFSSL_KEIL
  197699. "sbcs r3, r3, r5\n\t"
  197700. #elif defined(__clang__)
  197701. "sbcs r3, r5\n\t"
  197702. #else
  197703. "sbc r3, r5\n\t"
  197704. #endif
  197705. "stm %[a]!, {r2, r3}\n\t"
  197706. "ldm %[b]!, {r4, r5}\n\t"
  197707. "ldr r2, [%[a]]\n\t"
  197708. "ldr r3, [%[a], #4]\n\t"
  197709. #ifdef WOLFSSL_KEIL
  197710. "sbcs r2, r2, r4\n\t"
  197711. #elif defined(__clang__)
  197712. "sbcs r2, r4\n\t"
  197713. #else
  197714. "sbc r2, r4\n\t"
  197715. #endif
  197716. #ifdef WOLFSSL_KEIL
  197717. "sbcs r3, r3, r5\n\t"
  197718. #elif defined(__clang__)
  197719. "sbcs r3, r5\n\t"
  197720. #else
  197721. "sbc r3, r5\n\t"
  197722. #endif
  197723. "stm %[a]!, {r2, r3}\n\t"
  197724. "ldm %[b]!, {r4, r5}\n\t"
  197725. "ldr r2, [%[a]]\n\t"
  197726. "ldr r3, [%[a], #4]\n\t"
  197727. #ifdef WOLFSSL_KEIL
  197728. "sbcs r2, r2, r4\n\t"
  197729. #elif defined(__clang__)
  197730. "sbcs r2, r4\n\t"
  197731. #else
  197732. "sbc r2, r4\n\t"
  197733. #endif
  197734. #ifdef WOLFSSL_KEIL
  197735. "sbcs r3, r3, r5\n\t"
  197736. #elif defined(__clang__)
  197737. "sbcs r3, r5\n\t"
  197738. #else
  197739. "sbc r3, r5\n\t"
  197740. #endif
  197741. "stm %[a]!, {r2, r3}\n\t"
  197742. "ldm %[b]!, {r4, r5}\n\t"
  197743. "ldr r2, [%[a]]\n\t"
  197744. "ldr r3, [%[a], #4]\n\t"
  197745. #ifdef WOLFSSL_KEIL
  197746. "sbcs r2, r2, r4\n\t"
  197747. #elif defined(__clang__)
  197748. "sbcs r2, r4\n\t"
  197749. #else
  197750. "sbc r2, r4\n\t"
  197751. #endif
  197752. #ifdef WOLFSSL_KEIL
  197753. "sbcs r3, r3, r5\n\t"
  197754. #elif defined(__clang__)
  197755. "sbcs r3, r5\n\t"
  197756. #else
  197757. "sbc r3, r5\n\t"
  197758. #endif
  197759. "stm %[a]!, {r2, r3}\n\t"
  197760. "ldm %[b]!, {r4, r5}\n\t"
  197761. "ldr r2, [%[a]]\n\t"
  197762. "ldr r3, [%[a], #4]\n\t"
  197763. #ifdef WOLFSSL_KEIL
  197764. "sbcs r2, r2, r4\n\t"
  197765. #elif defined(__clang__)
  197766. "sbcs r2, r4\n\t"
  197767. #else
  197768. "sbc r2, r4\n\t"
  197769. #endif
  197770. #ifdef WOLFSSL_KEIL
  197771. "sbcs r3, r3, r5\n\t"
  197772. #elif defined(__clang__)
  197773. "sbcs r3, r5\n\t"
  197774. #else
  197775. "sbc r3, r5\n\t"
  197776. #endif
  197777. "stm %[a]!, {r2, r3}\n\t"
  197778. "ldm %[b]!, {r4, r5}\n\t"
  197779. "ldr r2, [%[a]]\n\t"
  197780. "ldr r3, [%[a], #4]\n\t"
  197781. #ifdef WOLFSSL_KEIL
  197782. "sbcs r2, r2, r4\n\t"
  197783. #elif defined(__clang__)
  197784. "sbcs r2, r4\n\t"
  197785. #else
  197786. "sbc r2, r4\n\t"
  197787. #endif
  197788. #ifdef WOLFSSL_KEIL
  197789. "sbcs r3, r3, r5\n\t"
  197790. #elif defined(__clang__)
  197791. "sbcs r3, r5\n\t"
  197792. #else
  197793. "sbc r3, r5\n\t"
  197794. #endif
  197795. "stm %[a]!, {r2, r3}\n\t"
  197796. "ldm %[b]!, {r4, r5}\n\t"
  197797. "ldr r2, [%[a]]\n\t"
  197798. "ldr r3, [%[a], #4]\n\t"
  197799. #ifdef WOLFSSL_KEIL
  197800. "sbcs r2, r2, r4\n\t"
  197801. #elif defined(__clang__)
  197802. "sbcs r2, r4\n\t"
  197803. #else
  197804. "sbc r2, r4\n\t"
  197805. #endif
  197806. #ifdef WOLFSSL_KEIL
  197807. "sbcs r3, r3, r5\n\t"
  197808. #elif defined(__clang__)
  197809. "sbcs r3, r5\n\t"
  197810. #else
  197811. "sbc r3, r5\n\t"
  197812. #endif
  197813. "stm %[a]!, {r2, r3}\n\t"
  197814. "ldm %[b]!, {r4, r5}\n\t"
  197815. "ldr r2, [%[a]]\n\t"
  197816. "ldr r3, [%[a], #4]\n\t"
  197817. #ifdef WOLFSSL_KEIL
  197818. "sbcs r2, r2, r4\n\t"
  197819. #elif defined(__clang__)
  197820. "sbcs r2, r4\n\t"
  197821. #else
  197822. "sbc r2, r4\n\t"
  197823. #endif
  197824. #ifdef WOLFSSL_KEIL
  197825. "sbcs r3, r3, r5\n\t"
  197826. #elif defined(__clang__)
  197827. "sbcs r3, r5\n\t"
  197828. #else
  197829. "sbc r3, r5\n\t"
  197830. #endif
  197831. "stm %[a]!, {r2, r3}\n\t"
  197832. "ldm %[b]!, {r4, r5}\n\t"
  197833. "ldr r2, [%[a]]\n\t"
  197834. "ldr r3, [%[a], #4]\n\t"
  197835. #ifdef WOLFSSL_KEIL
  197836. "sbcs r2, r2, r4\n\t"
  197837. #elif defined(__clang__)
  197838. "sbcs r2, r4\n\t"
  197839. #else
  197840. "sbc r2, r4\n\t"
  197841. #endif
  197842. #ifdef WOLFSSL_KEIL
  197843. "sbcs r3, r3, r5\n\t"
  197844. #elif defined(__clang__)
  197845. "sbcs r3, r5\n\t"
  197846. #else
  197847. "sbc r3, r5\n\t"
  197848. #endif
  197849. "stm %[a]!, {r2, r3}\n\t"
  197850. "ldm %[b]!, {r4, r5}\n\t"
  197851. "ldr r2, [%[a]]\n\t"
  197852. "ldr r3, [%[a], #4]\n\t"
  197853. #ifdef WOLFSSL_KEIL
  197854. "sbcs r2, r2, r4\n\t"
  197855. #elif defined(__clang__)
  197856. "sbcs r2, r4\n\t"
  197857. #else
  197858. "sbc r2, r4\n\t"
  197859. #endif
  197860. #ifdef WOLFSSL_KEIL
  197861. "sbcs r3, r3, r5\n\t"
  197862. #elif defined(__clang__)
  197863. "sbcs r3, r5\n\t"
  197864. #else
  197865. "sbc r3, r5\n\t"
  197866. #endif
  197867. "stm %[a]!, {r2, r3}\n\t"
  197868. "ldm %[b]!, {r4, r5}\n\t"
  197869. "ldr r2, [%[a]]\n\t"
  197870. "ldr r3, [%[a], #4]\n\t"
  197871. #ifdef WOLFSSL_KEIL
  197872. "sbcs r2, r2, r4\n\t"
  197873. #elif defined(__clang__)
  197874. "sbcs r2, r4\n\t"
  197875. #else
  197876. "sbc r2, r4\n\t"
  197877. #endif
  197878. #ifdef WOLFSSL_KEIL
  197879. "sbcs r3, r3, r5\n\t"
  197880. #elif defined(__clang__)
  197881. "sbcs r3, r5\n\t"
  197882. #else
  197883. "sbc r3, r5\n\t"
  197884. #endif
  197885. "stm %[a]!, {r2, r3}\n\t"
  197886. #ifdef WOLFSSL_KEIL
  197887. "sbcs %[a], %[a], %[a]\n\t"
  197888. #elif defined(__clang__)
  197889. "sbcs %[a], %[a]\n\t"
  197890. #else
  197891. "sbc %[a], %[a]\n\t"
  197892. #endif
  197893. : [a] "+l" (a), [b] "+l" (b)
  197894. :
  197895. : "memory", "r2", "r3", "r4", "r5"
  197896. );
  197897. return (uint32_t)(size_t)a;
  197898. }
  197899. /* Add b to a into r. (r = a + b)
  197900. *
  197901. * r A single precision integer.
  197902. * a A single precision integer.
  197903. * b A single precision integer.
  197904. */
  197905. SP_NOINLINE static sp_digit sp_1024_add_32(sp_digit* r, const sp_digit* a,
  197906. const sp_digit* b)
  197907. {
  197908. __asm__ __volatile__ (
  197909. "ldm %[b]!, {r5, r6}\n\t"
  197910. "ldm %[a]!, {r3, r4}\n\t"
  197911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197912. "adds r3, r3, r5\n\t"
  197913. #else
  197914. "add r3, r3, r5\n\t"
  197915. #endif
  197916. #ifdef WOLFSSL_KEIL
  197917. "adcs r4, r4, r6\n\t"
  197918. #elif defined(__clang__)
  197919. "adcs r4, r6\n\t"
  197920. #else
  197921. "adc r4, r6\n\t"
  197922. #endif
  197923. "stm %[r]!, {r3, r4}\n\t"
  197924. "ldm %[b]!, {r5, r6}\n\t"
  197925. "ldm %[a]!, {r3, r4}\n\t"
  197926. #ifdef WOLFSSL_KEIL
  197927. "adcs r3, r3, r5\n\t"
  197928. #elif defined(__clang__)
  197929. "adcs r3, r5\n\t"
  197930. #else
  197931. "adc r3, r5\n\t"
  197932. #endif
  197933. #ifdef WOLFSSL_KEIL
  197934. "adcs r4, r4, r6\n\t"
  197935. #elif defined(__clang__)
  197936. "adcs r4, r6\n\t"
  197937. #else
  197938. "adc r4, r6\n\t"
  197939. #endif
  197940. "stm %[r]!, {r3, r4}\n\t"
  197941. "ldm %[b]!, {r5, r6}\n\t"
  197942. "ldm %[a]!, {r3, r4}\n\t"
  197943. #ifdef WOLFSSL_KEIL
  197944. "adcs r3, r3, r5\n\t"
  197945. #elif defined(__clang__)
  197946. "adcs r3, r5\n\t"
  197947. #else
  197948. "adc r3, r5\n\t"
  197949. #endif
  197950. #ifdef WOLFSSL_KEIL
  197951. "adcs r4, r4, r6\n\t"
  197952. #elif defined(__clang__)
  197953. "adcs r4, r6\n\t"
  197954. #else
  197955. "adc r4, r6\n\t"
  197956. #endif
  197957. "stm %[r]!, {r3, r4}\n\t"
  197958. "ldm %[b]!, {r5, r6}\n\t"
  197959. "ldm %[a]!, {r3, r4}\n\t"
  197960. #ifdef WOLFSSL_KEIL
  197961. "adcs r3, r3, r5\n\t"
  197962. #elif defined(__clang__)
  197963. "adcs r3, r5\n\t"
  197964. #else
  197965. "adc r3, r5\n\t"
  197966. #endif
  197967. #ifdef WOLFSSL_KEIL
  197968. "adcs r4, r4, r6\n\t"
  197969. #elif defined(__clang__)
  197970. "adcs r4, r6\n\t"
  197971. #else
  197972. "adc r4, r6\n\t"
  197973. #endif
  197974. "stm %[r]!, {r3, r4}\n\t"
  197975. "ldm %[b]!, {r5, r6}\n\t"
  197976. "ldm %[a]!, {r3, r4}\n\t"
  197977. #ifdef WOLFSSL_KEIL
  197978. "adcs r3, r3, r5\n\t"
  197979. #elif defined(__clang__)
  197980. "adcs r3, r5\n\t"
  197981. #else
  197982. "adc r3, r5\n\t"
  197983. #endif
  197984. #ifdef WOLFSSL_KEIL
  197985. "adcs r4, r4, r6\n\t"
  197986. #elif defined(__clang__)
  197987. "adcs r4, r6\n\t"
  197988. #else
  197989. "adc r4, r6\n\t"
  197990. #endif
  197991. "stm %[r]!, {r3, r4}\n\t"
  197992. "ldm %[b]!, {r5, r6}\n\t"
  197993. "ldm %[a]!, {r3, r4}\n\t"
  197994. #ifdef WOLFSSL_KEIL
  197995. "adcs r3, r3, r5\n\t"
  197996. #elif defined(__clang__)
  197997. "adcs r3, r5\n\t"
  197998. #else
  197999. "adc r3, r5\n\t"
  198000. #endif
  198001. #ifdef WOLFSSL_KEIL
  198002. "adcs r4, r4, r6\n\t"
  198003. #elif defined(__clang__)
  198004. "adcs r4, r6\n\t"
  198005. #else
  198006. "adc r4, r6\n\t"
  198007. #endif
  198008. "stm %[r]!, {r3, r4}\n\t"
  198009. "ldm %[b]!, {r5, r6}\n\t"
  198010. "ldm %[a]!, {r3, r4}\n\t"
  198011. #ifdef WOLFSSL_KEIL
  198012. "adcs r3, r3, r5\n\t"
  198013. #elif defined(__clang__)
  198014. "adcs r3, r5\n\t"
  198015. #else
  198016. "adc r3, r5\n\t"
  198017. #endif
  198018. #ifdef WOLFSSL_KEIL
  198019. "adcs r4, r4, r6\n\t"
  198020. #elif defined(__clang__)
  198021. "adcs r4, r6\n\t"
  198022. #else
  198023. "adc r4, r6\n\t"
  198024. #endif
  198025. "stm %[r]!, {r3, r4}\n\t"
  198026. "ldm %[b]!, {r5, r6}\n\t"
  198027. "ldm %[a]!, {r3, r4}\n\t"
  198028. #ifdef WOLFSSL_KEIL
  198029. "adcs r3, r3, r5\n\t"
  198030. #elif defined(__clang__)
  198031. "adcs r3, r5\n\t"
  198032. #else
  198033. "adc r3, r5\n\t"
  198034. #endif
  198035. #ifdef WOLFSSL_KEIL
  198036. "adcs r4, r4, r6\n\t"
  198037. #elif defined(__clang__)
  198038. "adcs r4, r6\n\t"
  198039. #else
  198040. "adc r4, r6\n\t"
  198041. #endif
  198042. "stm %[r]!, {r3, r4}\n\t"
  198043. "ldm %[b]!, {r5, r6}\n\t"
  198044. "ldm %[a]!, {r3, r4}\n\t"
  198045. #ifdef WOLFSSL_KEIL
  198046. "adcs r3, r3, r5\n\t"
  198047. #elif defined(__clang__)
  198048. "adcs r3, r5\n\t"
  198049. #else
  198050. "adc r3, r5\n\t"
  198051. #endif
  198052. #ifdef WOLFSSL_KEIL
  198053. "adcs r4, r4, r6\n\t"
  198054. #elif defined(__clang__)
  198055. "adcs r4, r6\n\t"
  198056. #else
  198057. "adc r4, r6\n\t"
  198058. #endif
  198059. "stm %[r]!, {r3, r4}\n\t"
  198060. "ldm %[b]!, {r5, r6}\n\t"
  198061. "ldm %[a]!, {r3, r4}\n\t"
  198062. #ifdef WOLFSSL_KEIL
  198063. "adcs r3, r3, r5\n\t"
  198064. #elif defined(__clang__)
  198065. "adcs r3, r5\n\t"
  198066. #else
  198067. "adc r3, r5\n\t"
  198068. #endif
  198069. #ifdef WOLFSSL_KEIL
  198070. "adcs r4, r4, r6\n\t"
  198071. #elif defined(__clang__)
  198072. "adcs r4, r6\n\t"
  198073. #else
  198074. "adc r4, r6\n\t"
  198075. #endif
  198076. "stm %[r]!, {r3, r4}\n\t"
  198077. "ldm %[b]!, {r5, r6}\n\t"
  198078. "ldm %[a]!, {r3, r4}\n\t"
  198079. #ifdef WOLFSSL_KEIL
  198080. "adcs r3, r3, r5\n\t"
  198081. #elif defined(__clang__)
  198082. "adcs r3, r5\n\t"
  198083. #else
  198084. "adc r3, r5\n\t"
  198085. #endif
  198086. #ifdef WOLFSSL_KEIL
  198087. "adcs r4, r4, r6\n\t"
  198088. #elif defined(__clang__)
  198089. "adcs r4, r6\n\t"
  198090. #else
  198091. "adc r4, r6\n\t"
  198092. #endif
  198093. "stm %[r]!, {r3, r4}\n\t"
  198094. "ldm %[b]!, {r5, r6}\n\t"
  198095. "ldm %[a]!, {r3, r4}\n\t"
  198096. #ifdef WOLFSSL_KEIL
  198097. "adcs r3, r3, r5\n\t"
  198098. #elif defined(__clang__)
  198099. "adcs r3, r5\n\t"
  198100. #else
  198101. "adc r3, r5\n\t"
  198102. #endif
  198103. #ifdef WOLFSSL_KEIL
  198104. "adcs r4, r4, r6\n\t"
  198105. #elif defined(__clang__)
  198106. "adcs r4, r6\n\t"
  198107. #else
  198108. "adc r4, r6\n\t"
  198109. #endif
  198110. "stm %[r]!, {r3, r4}\n\t"
  198111. "ldm %[b]!, {r5, r6}\n\t"
  198112. "ldm %[a]!, {r3, r4}\n\t"
  198113. #ifdef WOLFSSL_KEIL
  198114. "adcs r3, r3, r5\n\t"
  198115. #elif defined(__clang__)
  198116. "adcs r3, r5\n\t"
  198117. #else
  198118. "adc r3, r5\n\t"
  198119. #endif
  198120. #ifdef WOLFSSL_KEIL
  198121. "adcs r4, r4, r6\n\t"
  198122. #elif defined(__clang__)
  198123. "adcs r4, r6\n\t"
  198124. #else
  198125. "adc r4, r6\n\t"
  198126. #endif
  198127. "stm %[r]!, {r3, r4}\n\t"
  198128. "ldm %[b]!, {r5, r6}\n\t"
  198129. "ldm %[a]!, {r3, r4}\n\t"
  198130. #ifdef WOLFSSL_KEIL
  198131. "adcs r3, r3, r5\n\t"
  198132. #elif defined(__clang__)
  198133. "adcs r3, r5\n\t"
  198134. #else
  198135. "adc r3, r5\n\t"
  198136. #endif
  198137. #ifdef WOLFSSL_KEIL
  198138. "adcs r4, r4, r6\n\t"
  198139. #elif defined(__clang__)
  198140. "adcs r4, r6\n\t"
  198141. #else
  198142. "adc r4, r6\n\t"
  198143. #endif
  198144. "stm %[r]!, {r3, r4}\n\t"
  198145. "ldm %[b]!, {r5, r6}\n\t"
  198146. "ldm %[a]!, {r3, r4}\n\t"
  198147. #ifdef WOLFSSL_KEIL
  198148. "adcs r3, r3, r5\n\t"
  198149. #elif defined(__clang__)
  198150. "adcs r3, r5\n\t"
  198151. #else
  198152. "adc r3, r5\n\t"
  198153. #endif
  198154. #ifdef WOLFSSL_KEIL
  198155. "adcs r4, r4, r6\n\t"
  198156. #elif defined(__clang__)
  198157. "adcs r4, r6\n\t"
  198158. #else
  198159. "adc r4, r6\n\t"
  198160. #endif
  198161. "stm %[r]!, {r3, r4}\n\t"
  198162. "ldm %[b]!, {r5, r6}\n\t"
  198163. "ldm %[a]!, {r3, r4}\n\t"
  198164. #ifdef WOLFSSL_KEIL
  198165. "adcs r3, r3, r5\n\t"
  198166. #elif defined(__clang__)
  198167. "adcs r3, r5\n\t"
  198168. #else
  198169. "adc r3, r5\n\t"
  198170. #endif
  198171. #ifdef WOLFSSL_KEIL
  198172. "adcs r4, r4, r6\n\t"
  198173. #elif defined(__clang__)
  198174. "adcs r4, r6\n\t"
  198175. #else
  198176. "adc r4, r6\n\t"
  198177. #endif
  198178. "stm %[r]!, {r3, r4}\n\t"
  198179. "movs %[r], #0\n\t"
  198180. #ifdef WOLFSSL_KEIL
  198181. "adcs %[r], %[r], %[r]\n\t"
  198182. #elif defined(__clang__)
  198183. "adcs %[r], %[r]\n\t"
  198184. #else
  198185. "adc %[r], %[r]\n\t"
  198186. #endif
  198187. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  198188. :
  198189. : "memory", "r3", "r4", "r5", "r6"
  198190. );
  198191. return (uint32_t)(size_t)r;
  198192. }
  198193. /* AND m into each word of a and store in r.
  198194. *
  198195. * r A single precision integer.
  198196. * a A single precision integer.
  198197. * m Mask to AND against each digit.
  198198. */
  198199. static void sp_1024_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
  198200. {
  198201. #ifdef WOLFSSL_SP_SMALL
  198202. int i;
  198203. for (i=0; i<16; i++) {
  198204. r[i] = a[i] & m;
  198205. }
  198206. #else
  198207. int i;
  198208. for (i = 0; i < 16; i += 8) {
  198209. r[i+0] = a[i+0] & m;
  198210. r[i+1] = a[i+1] & m;
  198211. r[i+2] = a[i+2] & m;
  198212. r[i+3] = a[i+3] & m;
  198213. r[i+4] = a[i+4] & m;
  198214. r[i+5] = a[i+5] & m;
  198215. r[i+6] = a[i+6] & m;
  198216. r[i+7] = a[i+7] & m;
  198217. }
  198218. #endif
  198219. }
  198220. /* Multiply a and b into r. (r = a * b)
  198221. *
  198222. * r A single precision integer.
  198223. * a A single precision integer.
  198224. * b A single precision integer.
  198225. */
  198226. SP_NOINLINE static void sp_1024_mul_32(sp_digit* r, const sp_digit* a,
  198227. const sp_digit* b)
  198228. {
  198229. sp_digit* z0 = r;
  198230. sp_digit z1[32];
  198231. sp_digit a1[16];
  198232. sp_digit b1[16];
  198233. sp_digit* z2 = r + 32;
  198234. sp_digit u;
  198235. sp_digit ca;
  198236. sp_digit cb;
  198237. ca = sp_1024_add_16(a1, a, &a[16]);
  198238. cb = sp_1024_add_16(b1, b, &b[16]);
  198239. u = ca & cb;
  198240. sp_1024_mul_16(z2, &a[16], &b[16]);
  198241. sp_1024_mul_16(z0, a, b);
  198242. sp_1024_mul_16(z1, a1, b1);
  198243. u += sp_1024_sub_in_place_32(z1, z0);
  198244. u += sp_1024_sub_in_place_32(z1, z2);
  198245. sp_1024_mask_16(a1, a1, 0 - cb);
  198246. u += sp_1024_add_16(z1 + 16, z1 + 16, a1);
  198247. sp_1024_mask_16(b1, b1, 0 - ca);
  198248. u += sp_1024_add_16(z1 + 16, z1 + 16, b1);
  198249. u += sp_1024_add_32(r + 16, r + 16, z1);
  198250. (void)sp_1024_add_word_16(r + 48, r + 48, u);
  198251. }
  198252. /* Sub b from a into r. (r = a - b)
  198253. *
  198254. * r A single precision integer.
  198255. * a A single precision integer.
  198256. * b A single precision integer.
  198257. */
  198258. SP_NOINLINE static sp_digit sp_1024_sub_16(sp_digit* r, const sp_digit* a,
  198259. const sp_digit* b)
  198260. {
  198261. __asm__ __volatile__ (
  198262. "ldm %[b]!, {r5, r6}\n\t"
  198263. "ldm %[a]!, {r3, r4}\n\t"
  198264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198265. "subs r3, r3, r5\n\t"
  198266. #else
  198267. "sub r3, r3, r5\n\t"
  198268. #endif
  198269. #ifdef WOLFSSL_KEIL
  198270. "sbcs r4, r4, r6\n\t"
  198271. #elif defined(__clang__)
  198272. "sbcs r4, r6\n\t"
  198273. #else
  198274. "sbc r4, r6\n\t"
  198275. #endif
  198276. "stm %[r]!, {r3, r4}\n\t"
  198277. "ldm %[b]!, {r5, r6}\n\t"
  198278. "ldm %[a]!, {r3, r4}\n\t"
  198279. #ifdef WOLFSSL_KEIL
  198280. "sbcs r3, r3, r5\n\t"
  198281. #elif defined(__clang__)
  198282. "sbcs r3, r5\n\t"
  198283. #else
  198284. "sbc r3, r5\n\t"
  198285. #endif
  198286. #ifdef WOLFSSL_KEIL
  198287. "sbcs r4, r4, r6\n\t"
  198288. #elif defined(__clang__)
  198289. "sbcs r4, r6\n\t"
  198290. #else
  198291. "sbc r4, r6\n\t"
  198292. #endif
  198293. "stm %[r]!, {r3, r4}\n\t"
  198294. "ldm %[b]!, {r5, r6}\n\t"
  198295. "ldm %[a]!, {r3, r4}\n\t"
  198296. #ifdef WOLFSSL_KEIL
  198297. "sbcs r3, r3, r5\n\t"
  198298. #elif defined(__clang__)
  198299. "sbcs r3, r5\n\t"
  198300. #else
  198301. "sbc r3, r5\n\t"
  198302. #endif
  198303. #ifdef WOLFSSL_KEIL
  198304. "sbcs r4, r4, r6\n\t"
  198305. #elif defined(__clang__)
  198306. "sbcs r4, r6\n\t"
  198307. #else
  198308. "sbc r4, r6\n\t"
  198309. #endif
  198310. "stm %[r]!, {r3, r4}\n\t"
  198311. "ldm %[b]!, {r5, r6}\n\t"
  198312. "ldm %[a]!, {r3, r4}\n\t"
  198313. #ifdef WOLFSSL_KEIL
  198314. "sbcs r3, r3, r5\n\t"
  198315. #elif defined(__clang__)
  198316. "sbcs r3, r5\n\t"
  198317. #else
  198318. "sbc r3, r5\n\t"
  198319. #endif
  198320. #ifdef WOLFSSL_KEIL
  198321. "sbcs r4, r4, r6\n\t"
  198322. #elif defined(__clang__)
  198323. "sbcs r4, r6\n\t"
  198324. #else
  198325. "sbc r4, r6\n\t"
  198326. #endif
  198327. "stm %[r]!, {r3, r4}\n\t"
  198328. "ldm %[b]!, {r5, r6}\n\t"
  198329. "ldm %[a]!, {r3, r4}\n\t"
  198330. #ifdef WOLFSSL_KEIL
  198331. "sbcs r3, r3, r5\n\t"
  198332. #elif defined(__clang__)
  198333. "sbcs r3, r5\n\t"
  198334. #else
  198335. "sbc r3, r5\n\t"
  198336. #endif
  198337. #ifdef WOLFSSL_KEIL
  198338. "sbcs r4, r4, r6\n\t"
  198339. #elif defined(__clang__)
  198340. "sbcs r4, r6\n\t"
  198341. #else
  198342. "sbc r4, r6\n\t"
  198343. #endif
  198344. "stm %[r]!, {r3, r4}\n\t"
  198345. "ldm %[b]!, {r5, r6}\n\t"
  198346. "ldm %[a]!, {r3, r4}\n\t"
  198347. #ifdef WOLFSSL_KEIL
  198348. "sbcs r3, r3, r5\n\t"
  198349. #elif defined(__clang__)
  198350. "sbcs r3, r5\n\t"
  198351. #else
  198352. "sbc r3, r5\n\t"
  198353. #endif
  198354. #ifdef WOLFSSL_KEIL
  198355. "sbcs r4, r4, r6\n\t"
  198356. #elif defined(__clang__)
  198357. "sbcs r4, r6\n\t"
  198358. #else
  198359. "sbc r4, r6\n\t"
  198360. #endif
  198361. "stm %[r]!, {r3, r4}\n\t"
  198362. "ldm %[b]!, {r5, r6}\n\t"
  198363. "ldm %[a]!, {r3, r4}\n\t"
  198364. #ifdef WOLFSSL_KEIL
  198365. "sbcs r3, r3, r5\n\t"
  198366. #elif defined(__clang__)
  198367. "sbcs r3, r5\n\t"
  198368. #else
  198369. "sbc r3, r5\n\t"
  198370. #endif
  198371. #ifdef WOLFSSL_KEIL
  198372. "sbcs r4, r4, r6\n\t"
  198373. #elif defined(__clang__)
  198374. "sbcs r4, r6\n\t"
  198375. #else
  198376. "sbc r4, r6\n\t"
  198377. #endif
  198378. "stm %[r]!, {r3, r4}\n\t"
  198379. "ldm %[b]!, {r5, r6}\n\t"
  198380. "ldm %[a]!, {r3, r4}\n\t"
  198381. #ifdef WOLFSSL_KEIL
  198382. "sbcs r3, r3, r5\n\t"
  198383. #elif defined(__clang__)
  198384. "sbcs r3, r5\n\t"
  198385. #else
  198386. "sbc r3, r5\n\t"
  198387. #endif
  198388. #ifdef WOLFSSL_KEIL
  198389. "sbcs r4, r4, r6\n\t"
  198390. #elif defined(__clang__)
  198391. "sbcs r4, r6\n\t"
  198392. #else
  198393. "sbc r4, r6\n\t"
  198394. #endif
  198395. "stm %[r]!, {r3, r4}\n\t"
  198396. #ifdef WOLFSSL_KEIL
  198397. "sbcs %[r], %[r], %[r]\n\t"
  198398. #elif defined(__clang__)
  198399. "sbcs %[r], %[r]\n\t"
  198400. #else
  198401. "sbc %[r], %[r]\n\t"
  198402. #endif
  198403. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  198404. :
  198405. : "memory", "r3", "r4", "r5", "r6"
  198406. );
  198407. return (uint32_t)(size_t)r;
  198408. }
  198409. /* Square a and put result in r. (r = a * a)
  198410. *
  198411. * r A single precision integer.
  198412. * a A single precision integer.
  198413. */
  198414. SP_NOINLINE static void sp_1024_sqr_32(sp_digit* r, const sp_digit* a)
  198415. {
  198416. sp_digit* z0 = r;
  198417. sp_digit* z2 = r + 32;
  198418. sp_digit z1[32];
  198419. sp_digit* a1 = z1;
  198420. sp_digit* zero = z1 + 16;
  198421. sp_digit u;
  198422. sp_digit mask;
  198423. sp_digit* p1;
  198424. sp_digit* p2;
  198425. XMEMSET(zero, 0, sizeof(sp_digit) * 16);
  198426. mask = sp_1024_sub_16(a1, a, &a[16]);
  198427. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  198428. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  198429. (void)sp_1024_sub_16(a1, p1, p2);
  198430. sp_1024_sqr_16(z2, &a[16]);
  198431. sp_1024_sqr_16(z0, a);
  198432. sp_1024_sqr_16(z1, a1);
  198433. u = 0;
  198434. u -= sp_1024_sub_in_place_32(z1, z2);
  198435. u -= sp_1024_sub_in_place_32(z1, z0);
  198436. u += sp_1024_sub_in_place_32(r + 16, z1);
  198437. sp_1024_add_word_16(r + 48, r + 48, u);
  198438. }
  198439. #else
  198440. /* Multiply a and b into r. (r = a * b)
  198441. *
  198442. * r A single precision integer.
  198443. * a A single precision integer.
  198444. * b A single precision integer.
  198445. */
  198446. SP_NOINLINE static void sp_1024_mul_32(sp_digit* r, const sp_digit* a,
  198447. const sp_digit* b)
  198448. {
  198449. sp_digit t[32 * 2];
  198450. sp_digit* tmp = t;
  198451. __asm__ __volatile__ (
  198452. "movs r3, #0\n\t"
  198453. "movs r4, #0\n\t"
  198454. "mov r8, r3\n\t"
  198455. "mov r11, %[tmp]\n\t"
  198456. "mov r9, %[a]\n\t"
  198457. "mov r10, %[b]\n\t"
  198458. "movs r6, #0x80\n\t"
  198459. "add r6, r6, r9\n\t"
  198460. "mov r12, r6\n\t"
  198461. "\n"
  198462. "L_sp_1024_mul_32_words_%=:\n\t"
  198463. "movs %[tmp], #0\n\t"
  198464. "movs r5, #0\n\t"
  198465. "movs r6, #0x7c\n\t"
  198466. "mov %[a], r8\n\t"
  198467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198468. "subs %[a], %[a], r6\n\t"
  198469. #else
  198470. "sub %[a], %[a], r6\n\t"
  198471. #endif
  198472. #ifdef WOLFSSL_KEIL
  198473. "sbcs r6, r6, r6\n\t"
  198474. #elif defined(__clang__)
  198475. "sbcs r6, r6\n\t"
  198476. #else
  198477. "sbc r6, r6\n\t"
  198478. #endif
  198479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198480. "mvns r6, r6\n\t"
  198481. #else
  198482. "mvn r6, r6\n\t"
  198483. #endif
  198484. #ifdef WOLFSSL_KEIL
  198485. "ands %[a], %[a], r6\n\t"
  198486. #elif defined(__clang__)
  198487. "ands %[a], r6\n\t"
  198488. #else
  198489. "and %[a], r6\n\t"
  198490. #endif
  198491. "mov %[b], r8\n\t"
  198492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198493. "subs %[b], %[b], %[a]\n\t"
  198494. #else
  198495. "sub %[b], %[b], %[a]\n\t"
  198496. #endif
  198497. "add %[a], %[a], r9\n\t"
  198498. "add %[b], %[b], r10\n\t"
  198499. "\n"
  198500. "L_sp_1024_mul_32_mul_%=:\n\t"
  198501. "# Multiply Start\n\t"
  198502. "ldrh r6, [%[a]]\n\t"
  198503. "ldrh r7, [%[b]]\n\t"
  198504. #ifdef WOLFSSL_KEIL
  198505. "muls r7, r6, r7\n\t"
  198506. #elif defined(__clang__)
  198507. "muls r7, r6\n\t"
  198508. #else
  198509. "mul r7, r6\n\t"
  198510. #endif
  198511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198512. "adds r3, r3, r7\n\t"
  198513. #else
  198514. "add r3, r3, r7\n\t"
  198515. #endif
  198516. #ifdef WOLFSSL_KEIL
  198517. "adcs r4, r4, %[tmp]\n\t"
  198518. #elif defined(__clang__)
  198519. "adcs r4, %[tmp]\n\t"
  198520. #else
  198521. "adc r4, %[tmp]\n\t"
  198522. #endif
  198523. #ifdef WOLFSSL_KEIL
  198524. "adcs r5, r5, %[tmp]\n\t"
  198525. #elif defined(__clang__)
  198526. "adcs r5, %[tmp]\n\t"
  198527. #else
  198528. "adc r5, %[tmp]\n\t"
  198529. #endif
  198530. "ldr r7, [%[b]]\n\t"
  198531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198532. "lsrs r7, r7, #16\n\t"
  198533. #else
  198534. "lsr r7, r7, #16\n\t"
  198535. #endif
  198536. #ifdef WOLFSSL_KEIL
  198537. "muls r6, r7, r6\n\t"
  198538. #elif defined(__clang__)
  198539. "muls r6, r7\n\t"
  198540. #else
  198541. "mul r6, r7\n\t"
  198542. #endif
  198543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198544. "lsrs r7, r6, #16\n\t"
  198545. #else
  198546. "lsr r7, r6, #16\n\t"
  198547. #endif
  198548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198549. "lsls r6, r6, #16\n\t"
  198550. #else
  198551. "lsl r6, r6, #16\n\t"
  198552. #endif
  198553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198554. "adds r3, r3, r6\n\t"
  198555. #else
  198556. "add r3, r3, r6\n\t"
  198557. #endif
  198558. #ifdef WOLFSSL_KEIL
  198559. "adcs r4, r4, r7\n\t"
  198560. #elif defined(__clang__)
  198561. "adcs r4, r7\n\t"
  198562. #else
  198563. "adc r4, r7\n\t"
  198564. #endif
  198565. #ifdef WOLFSSL_KEIL
  198566. "adcs r5, r5, %[tmp]\n\t"
  198567. #elif defined(__clang__)
  198568. "adcs r5, %[tmp]\n\t"
  198569. #else
  198570. "adc r5, %[tmp]\n\t"
  198571. #endif
  198572. "ldr r6, [%[a]]\n\t"
  198573. "ldr r7, [%[b]]\n\t"
  198574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198575. "lsrs r6, r6, #16\n\t"
  198576. #else
  198577. "lsr r6, r6, #16\n\t"
  198578. #endif
  198579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198580. "lsrs r7, r7, #16\n\t"
  198581. #else
  198582. "lsr r7, r7, #16\n\t"
  198583. #endif
  198584. #ifdef WOLFSSL_KEIL
  198585. "muls r7, r6, r7\n\t"
  198586. #elif defined(__clang__)
  198587. "muls r7, r6\n\t"
  198588. #else
  198589. "mul r7, r6\n\t"
  198590. #endif
  198591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198592. "adds r4, r4, r7\n\t"
  198593. #else
  198594. "add r4, r4, r7\n\t"
  198595. #endif
  198596. #ifdef WOLFSSL_KEIL
  198597. "adcs r5, r5, %[tmp]\n\t"
  198598. #elif defined(__clang__)
  198599. "adcs r5, %[tmp]\n\t"
  198600. #else
  198601. "adc r5, %[tmp]\n\t"
  198602. #endif
  198603. "ldrh r7, [%[b]]\n\t"
  198604. #ifdef WOLFSSL_KEIL
  198605. "muls r6, r7, r6\n\t"
  198606. #elif defined(__clang__)
  198607. "muls r6, r7\n\t"
  198608. #else
  198609. "mul r6, r7\n\t"
  198610. #endif
  198611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198612. "lsrs r7, r6, #16\n\t"
  198613. #else
  198614. "lsr r7, r6, #16\n\t"
  198615. #endif
  198616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198617. "lsls r6, r6, #16\n\t"
  198618. #else
  198619. "lsl r6, r6, #16\n\t"
  198620. #endif
  198621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198622. "adds r3, r3, r6\n\t"
  198623. #else
  198624. "add r3, r3, r6\n\t"
  198625. #endif
  198626. #ifdef WOLFSSL_KEIL
  198627. "adcs r4, r4, r7\n\t"
  198628. #elif defined(__clang__)
  198629. "adcs r4, r7\n\t"
  198630. #else
  198631. "adc r4, r7\n\t"
  198632. #endif
  198633. #ifdef WOLFSSL_KEIL
  198634. "adcs r5, r5, %[tmp]\n\t"
  198635. #elif defined(__clang__)
  198636. "adcs r5, %[tmp]\n\t"
  198637. #else
  198638. "adc r5, %[tmp]\n\t"
  198639. #endif
  198640. "# Multiply Done\n\t"
  198641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198642. "adds %[a], %[a], #4\n\t"
  198643. #else
  198644. "add %[a], %[a], #4\n\t"
  198645. #endif
  198646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198647. "subs %[b], %[b], #4\n\t"
  198648. #else
  198649. "sub %[b], %[b], #4\n\t"
  198650. #endif
  198651. "cmp %[a], r12\n\t"
  198652. "beq L_sp_1024_mul_32_done_mul_%=\n\t"
  198653. "mov r6, r8\n\t"
  198654. "add r6, r6, r9\n\t"
  198655. "cmp %[a], r6\n\t"
  198656. "ble L_sp_1024_mul_32_mul_%=\n\t"
  198657. "\n"
  198658. "L_sp_1024_mul_32_done_mul_%=:\n\t"
  198659. "mov %[tmp], r11\n\t"
  198660. "mov r7, r8\n\t"
  198661. "str r3, [%[tmp], r7]\n\t"
  198662. "movs r3, r4\n\t"
  198663. "movs r4, r5\n\t"
  198664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198665. "adds r7, r7, #4\n\t"
  198666. #else
  198667. "add r7, r7, #4\n\t"
  198668. #endif
  198669. "mov r8, r7\n\t"
  198670. "movs r6, #0xf8\n\t"
  198671. "cmp r7, r6\n\t"
  198672. "ble L_sp_1024_mul_32_words_%=\n\t"
  198673. "str r3, [%[tmp], r7]\n\t"
  198674. "mov %[a], r9\n\t"
  198675. "mov %[b], r10\n\t"
  198676. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  198677. :
  198678. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  198679. );
  198680. XMEMCPY(r, t, sizeof(t));
  198681. }
  198682. /* Square a and put result in r. (r = a * a)
  198683. *
  198684. * r A single precision integer.
  198685. * a A single precision integer.
  198686. */
  198687. SP_NOINLINE static void sp_1024_sqr_32(sp_digit* r, const sp_digit* a)
  198688. {
  198689. __asm__ __volatile__ (
  198690. "movs r3, #0\n\t"
  198691. "movs r4, #0\n\t"
  198692. "movs r5, #0\n\t"
  198693. "mov r8, r3\n\t"
  198694. "mov r11, %[r]\n\t"
  198695. "movs r6, #0xff\n\t"
  198696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198697. "adds r6, r6, #1\n\t"
  198698. #else
  198699. "add r6, r6, #1\n\t"
  198700. #endif
  198701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198702. "negs r6, r6\n\t"
  198703. #else
  198704. "neg r6, r6\n\t"
  198705. #endif
  198706. "add sp, sp, r6\n\t"
  198707. "mov r10, sp\n\t"
  198708. "mov r9, %[a]\n\t"
  198709. "\n"
  198710. "L_sp_1024_sqr_32_words_%=:\n\t"
  198711. "movs %[r], #0\n\t"
  198712. "movs r6, #0x7c\n\t"
  198713. "mov %[a], r8\n\t"
  198714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198715. "subs %[a], %[a], r6\n\t"
  198716. #else
  198717. "sub %[a], %[a], r6\n\t"
  198718. #endif
  198719. #ifdef WOLFSSL_KEIL
  198720. "sbcs r6, r6, r6\n\t"
  198721. #elif defined(__clang__)
  198722. "sbcs r6, r6\n\t"
  198723. #else
  198724. "sbc r6, r6\n\t"
  198725. #endif
  198726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198727. "mvns r6, r6\n\t"
  198728. #else
  198729. "mvn r6, r6\n\t"
  198730. #endif
  198731. #ifdef WOLFSSL_KEIL
  198732. "ands %[a], %[a], r6\n\t"
  198733. #elif defined(__clang__)
  198734. "ands %[a], r6\n\t"
  198735. #else
  198736. "and %[a], r6\n\t"
  198737. #endif
  198738. "mov r2, r8\n\t"
  198739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198740. "subs r2, r2, %[a]\n\t"
  198741. #else
  198742. "sub r2, r2, %[a]\n\t"
  198743. #endif
  198744. "add %[a], %[a], r9\n\t"
  198745. "add r2, r2, r9\n\t"
  198746. "\n"
  198747. "L_sp_1024_sqr_32_mul_%=:\n\t"
  198748. "cmp r2, %[a]\n\t"
  198749. "beq L_sp_1024_sqr_32_sqr_%=\n\t"
  198750. "# Multiply * 2: Start\n\t"
  198751. "ldrh r6, [%[a]]\n\t"
  198752. "ldrh r7, [r2]\n\t"
  198753. #ifdef WOLFSSL_KEIL
  198754. "muls r7, r6, r7\n\t"
  198755. #elif defined(__clang__)
  198756. "muls r7, r6\n\t"
  198757. #else
  198758. "mul r7, r6\n\t"
  198759. #endif
  198760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198761. "adds r3, r3, r7\n\t"
  198762. #else
  198763. "add r3, r3, r7\n\t"
  198764. #endif
  198765. #ifdef WOLFSSL_KEIL
  198766. "adcs r4, r4, %[r]\n\t"
  198767. #elif defined(__clang__)
  198768. "adcs r4, %[r]\n\t"
  198769. #else
  198770. "adc r4, %[r]\n\t"
  198771. #endif
  198772. #ifdef WOLFSSL_KEIL
  198773. "adcs r5, r5, %[r]\n\t"
  198774. #elif defined(__clang__)
  198775. "adcs r5, %[r]\n\t"
  198776. #else
  198777. "adc r5, %[r]\n\t"
  198778. #endif
  198779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198780. "adds r3, r3, r7\n\t"
  198781. #else
  198782. "add r3, r3, r7\n\t"
  198783. #endif
  198784. #ifdef WOLFSSL_KEIL
  198785. "adcs r4, r4, %[r]\n\t"
  198786. #elif defined(__clang__)
  198787. "adcs r4, %[r]\n\t"
  198788. #else
  198789. "adc r4, %[r]\n\t"
  198790. #endif
  198791. #ifdef WOLFSSL_KEIL
  198792. "adcs r5, r5, %[r]\n\t"
  198793. #elif defined(__clang__)
  198794. "adcs r5, %[r]\n\t"
  198795. #else
  198796. "adc r5, %[r]\n\t"
  198797. #endif
  198798. "ldr r7, [r2]\n\t"
  198799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198800. "lsrs r7, r7, #16\n\t"
  198801. #else
  198802. "lsr r7, r7, #16\n\t"
  198803. #endif
  198804. #ifdef WOLFSSL_KEIL
  198805. "muls r6, r7, r6\n\t"
  198806. #elif defined(__clang__)
  198807. "muls r6, r7\n\t"
  198808. #else
  198809. "mul r6, r7\n\t"
  198810. #endif
  198811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198812. "lsrs r7, r6, #16\n\t"
  198813. #else
  198814. "lsr r7, r6, #16\n\t"
  198815. #endif
  198816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198817. "lsls r6, r6, #16\n\t"
  198818. #else
  198819. "lsl r6, r6, #16\n\t"
  198820. #endif
  198821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198822. "adds r3, r3, r6\n\t"
  198823. #else
  198824. "add r3, r3, r6\n\t"
  198825. #endif
  198826. #ifdef WOLFSSL_KEIL
  198827. "adcs r4, r4, r7\n\t"
  198828. #elif defined(__clang__)
  198829. "adcs r4, r7\n\t"
  198830. #else
  198831. "adc r4, r7\n\t"
  198832. #endif
  198833. #ifdef WOLFSSL_KEIL
  198834. "adcs r5, r5, %[r]\n\t"
  198835. #elif defined(__clang__)
  198836. "adcs r5, %[r]\n\t"
  198837. #else
  198838. "adc r5, %[r]\n\t"
  198839. #endif
  198840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198841. "adds r3, r3, r6\n\t"
  198842. #else
  198843. "add r3, r3, r6\n\t"
  198844. #endif
  198845. #ifdef WOLFSSL_KEIL
  198846. "adcs r4, r4, r7\n\t"
  198847. #elif defined(__clang__)
  198848. "adcs r4, r7\n\t"
  198849. #else
  198850. "adc r4, r7\n\t"
  198851. #endif
  198852. #ifdef WOLFSSL_KEIL
  198853. "adcs r5, r5, %[r]\n\t"
  198854. #elif defined(__clang__)
  198855. "adcs r5, %[r]\n\t"
  198856. #else
  198857. "adc r5, %[r]\n\t"
  198858. #endif
  198859. "ldr r6, [%[a]]\n\t"
  198860. "ldr r7, [r2]\n\t"
  198861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198862. "lsrs r6, r6, #16\n\t"
  198863. #else
  198864. "lsr r6, r6, #16\n\t"
  198865. #endif
  198866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198867. "lsrs r7, r7, #16\n\t"
  198868. #else
  198869. "lsr r7, r7, #16\n\t"
  198870. #endif
  198871. #ifdef WOLFSSL_KEIL
  198872. "muls r7, r6, r7\n\t"
  198873. #elif defined(__clang__)
  198874. "muls r7, r6\n\t"
  198875. #else
  198876. "mul r7, r6\n\t"
  198877. #endif
  198878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198879. "adds r4, r4, r7\n\t"
  198880. #else
  198881. "add r4, r4, r7\n\t"
  198882. #endif
  198883. #ifdef WOLFSSL_KEIL
  198884. "adcs r5, r5, %[r]\n\t"
  198885. #elif defined(__clang__)
  198886. "adcs r5, %[r]\n\t"
  198887. #else
  198888. "adc r5, %[r]\n\t"
  198889. #endif
  198890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198891. "adds r4, r4, r7\n\t"
  198892. #else
  198893. "add r4, r4, r7\n\t"
  198894. #endif
  198895. #ifdef WOLFSSL_KEIL
  198896. "adcs r5, r5, %[r]\n\t"
  198897. #elif defined(__clang__)
  198898. "adcs r5, %[r]\n\t"
  198899. #else
  198900. "adc r5, %[r]\n\t"
  198901. #endif
  198902. "ldrh r7, [r2]\n\t"
  198903. #ifdef WOLFSSL_KEIL
  198904. "muls r6, r7, r6\n\t"
  198905. #elif defined(__clang__)
  198906. "muls r6, r7\n\t"
  198907. #else
  198908. "mul r6, r7\n\t"
  198909. #endif
  198910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198911. "lsrs r7, r6, #16\n\t"
  198912. #else
  198913. "lsr r7, r6, #16\n\t"
  198914. #endif
  198915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198916. "lsls r6, r6, #16\n\t"
  198917. #else
  198918. "lsl r6, r6, #16\n\t"
  198919. #endif
  198920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198921. "adds r3, r3, r6\n\t"
  198922. #else
  198923. "add r3, r3, r6\n\t"
  198924. #endif
  198925. #ifdef WOLFSSL_KEIL
  198926. "adcs r4, r4, r7\n\t"
  198927. #elif defined(__clang__)
  198928. "adcs r4, r7\n\t"
  198929. #else
  198930. "adc r4, r7\n\t"
  198931. #endif
  198932. #ifdef WOLFSSL_KEIL
  198933. "adcs r5, r5, %[r]\n\t"
  198934. #elif defined(__clang__)
  198935. "adcs r5, %[r]\n\t"
  198936. #else
  198937. "adc r5, %[r]\n\t"
  198938. #endif
  198939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198940. "adds r3, r3, r6\n\t"
  198941. #else
  198942. "add r3, r3, r6\n\t"
  198943. #endif
  198944. #ifdef WOLFSSL_KEIL
  198945. "adcs r4, r4, r7\n\t"
  198946. #elif defined(__clang__)
  198947. "adcs r4, r7\n\t"
  198948. #else
  198949. "adc r4, r7\n\t"
  198950. #endif
  198951. #ifdef WOLFSSL_KEIL
  198952. "adcs r5, r5, %[r]\n\t"
  198953. #elif defined(__clang__)
  198954. "adcs r5, %[r]\n\t"
  198955. #else
  198956. "adc r5, %[r]\n\t"
  198957. #endif
  198958. "# Multiply * 2: Done\n\t"
  198959. "bal L_sp_1024_sqr_32_done_sqr_%=\n\t"
  198960. "\n"
  198961. "L_sp_1024_sqr_32_sqr_%=:\n\t"
  198962. "mov r12, r2\n\t"
  198963. "ldr r2, [%[a]]\n\t"
  198964. "# Square: Start\n\t"
  198965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198966. "lsrs r7, r2, #16\n\t"
  198967. #else
  198968. "lsr r7, r2, #16\n\t"
  198969. #endif
  198970. "uxth r6, r2\n\t"
  198971. #ifdef WOLFSSL_KEIL
  198972. "muls r6, r6, r6\n\t"
  198973. #elif defined(__clang__)
  198974. "muls r6, r6\n\t"
  198975. #else
  198976. "mul r6, r6\n\t"
  198977. #endif
  198978. #ifdef WOLFSSL_KEIL
  198979. "muls r7, r7, r7\n\t"
  198980. #elif defined(__clang__)
  198981. "muls r7, r7\n\t"
  198982. #else
  198983. "mul r7, r7\n\t"
  198984. #endif
  198985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198986. "adds r3, r3, r6\n\t"
  198987. #else
  198988. "add r3, r3, r6\n\t"
  198989. #endif
  198990. #ifdef WOLFSSL_KEIL
  198991. "adcs r4, r4, r7\n\t"
  198992. #elif defined(__clang__)
  198993. "adcs r4, r7\n\t"
  198994. #else
  198995. "adc r4, r7\n\t"
  198996. #endif
  198997. #ifdef WOLFSSL_KEIL
  198998. "adcs r5, r5, %[r]\n\t"
  198999. #elif defined(__clang__)
  199000. "adcs r5, %[r]\n\t"
  199001. #else
  199002. "adc r5, %[r]\n\t"
  199003. #endif
  199004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199005. "lsrs r7, r2, #16\n\t"
  199006. #else
  199007. "lsr r7, r2, #16\n\t"
  199008. #endif
  199009. "uxth r6, r2\n\t"
  199010. #ifdef WOLFSSL_KEIL
  199011. "muls r6, r7, r6\n\t"
  199012. #elif defined(__clang__)
  199013. "muls r6, r7\n\t"
  199014. #else
  199015. "mul r6, r7\n\t"
  199016. #endif
  199017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199018. "lsrs r7, r6, #15\n\t"
  199019. #else
  199020. "lsr r7, r6, #15\n\t"
  199021. #endif
  199022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199023. "lsls r6, r6, #17\n\t"
  199024. #else
  199025. "lsl r6, r6, #17\n\t"
  199026. #endif
  199027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199028. "adds r3, r3, r6\n\t"
  199029. #else
  199030. "add r3, r3, r6\n\t"
  199031. #endif
  199032. #ifdef WOLFSSL_KEIL
  199033. "adcs r4, r4, r7\n\t"
  199034. #elif defined(__clang__)
  199035. "adcs r4, r7\n\t"
  199036. #else
  199037. "adc r4, r7\n\t"
  199038. #endif
  199039. #ifdef WOLFSSL_KEIL
  199040. "adcs r5, r5, %[r]\n\t"
  199041. #elif defined(__clang__)
  199042. "adcs r5, %[r]\n\t"
  199043. #else
  199044. "adc r5, %[r]\n\t"
  199045. #endif
  199046. "# Square: Done\n\t"
  199047. "mov r2, r12\n\t"
  199048. "\n"
  199049. "L_sp_1024_sqr_32_done_sqr_%=:\n\t"
  199050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199051. "adds %[a], %[a], #4\n\t"
  199052. #else
  199053. "add %[a], %[a], #4\n\t"
  199054. #endif
  199055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199056. "subs r2, r2, #4\n\t"
  199057. #else
  199058. "sub r2, r2, #4\n\t"
  199059. #endif
  199060. "movs r6, #0x80\n\t"
  199061. "add r6, r6, r9\n\t"
  199062. "cmp %[a], r6\n\t"
  199063. "beq L_sp_1024_sqr_32_done_mul_%=\n\t"
  199064. "cmp %[a], r2\n\t"
  199065. "bgt L_sp_1024_sqr_32_done_mul_%=\n\t"
  199066. "mov r7, r8\n\t"
  199067. "add r7, r7, r9\n\t"
  199068. "cmp %[a], r7\n\t"
  199069. "ble L_sp_1024_sqr_32_mul_%=\n\t"
  199070. "\n"
  199071. "L_sp_1024_sqr_32_done_mul_%=:\n\t"
  199072. "mov %[r], r10\n\t"
  199073. "mov r7, r8\n\t"
  199074. "str r3, [%[r], r7]\n\t"
  199075. "movs r3, r4\n\t"
  199076. "movs r4, r5\n\t"
  199077. "movs r5, #0\n\t"
  199078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199079. "adds r7, r7, #4\n\t"
  199080. #else
  199081. "add r7, r7, #4\n\t"
  199082. #endif
  199083. "mov r8, r7\n\t"
  199084. "movs r6, #0xf8\n\t"
  199085. "cmp r7, r6\n\t"
  199086. "ble L_sp_1024_sqr_32_words_%=\n\t"
  199087. "mov %[a], r9\n\t"
  199088. "str r3, [%[r], r7]\n\t"
  199089. "mov %[r], r11\n\t"
  199090. "mov %[a], r10\n\t"
  199091. "movs r3, #0xfc\n\t"
  199092. "\n"
  199093. "L_sp_1024_sqr_32_store_%=:\n\t"
  199094. "ldr r6, [%[a], r3]\n\t"
  199095. "str r6, [%[r], r3]\n\t"
  199096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199097. "subs r3, r3, #4\n\t"
  199098. #else
  199099. "sub r3, r3, #4\n\t"
  199100. #endif
  199101. "bge L_sp_1024_sqr_32_store_%=\n\t"
  199102. "movs r6, #0xff\n\t"
  199103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199104. "adds r6, r6, #1\n\t"
  199105. #else
  199106. "add r6, r6, #1\n\t"
  199107. #endif
  199108. "add sp, sp, r6\n\t"
  199109. : [r] "+l" (r), [a] "+l" (a)
  199110. :
  199111. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  199112. );
  199113. }
  199114. #endif /* !WOLFSSL_SP_SMALL */
  199115. /* The modulus (prime) of the curve P1024. */
  199116. static const sp_digit p1024_mod[32] = {
  199117. 0xfea85feb,0x666d807a,0xac7ace87,0x80c5df10,0x89857db0,0xfce3e823,
  199118. 0x56971f1f,0x9f94d6af,0x1c3c09aa,0xa7cf3c52,0x31852a82,0xb6aff4a8,
  199119. 0x65681ce1,0x512ac5cd,0x326b4cd4,0xe26c6487,0xa666a6d0,0x356d27f4,
  199120. 0xf7c88a19,0xe791b39f,0x31a59cb0,0x228730d5,0xe2fc0f1b,0xf40aab27,
  199121. 0xb3e01a2e,0xbe9ae358,0x9cb48261,0x416c0ce1,0xdad0657a,0x65c61198,
  199122. 0x0a563fda,0x997abb1f
  199123. };
  199124. /* The Montgomery normalizer for modulus of the curve P1024. */
  199125. static const sp_digit p1024_norm_mod[32] = {
  199126. 0x0157a015,0x99927f85,0x53853178,0x7f3a20ef,0x767a824f,0x031c17dc,
  199127. 0xa968e0e0,0x606b2950,0xe3c3f655,0x5830c3ad,0xce7ad57d,0x49500b57,
  199128. 0x9a97e31e,0xaed53a32,0xcd94b32b,0x1d939b78,0x5999592f,0xca92d80b,
  199129. 0x083775e6,0x186e4c60,0xce5a634f,0xdd78cf2a,0x1d03f0e4,0x0bf554d8,
  199130. 0x4c1fe5d1,0x41651ca7,0x634b7d9e,0xbe93f31e,0x252f9a85,0x9a39ee67,
  199131. 0xf5a9c025,0x668544e0
  199132. };
  199133. /* The Montgomery multiplier for modulus of the curve P1024. */
  199134. static sp_digit p1024_mp_mod = 0x7c8f2f3d;
  199135. #if defined(WOLFSSL_SP_SMALL) || defined(HAVE_ECC_CHECK_KEY)
  199136. /* The order of the curve P1024. */
  199137. static const sp_digit p1024_order[32] = {
  199138. 0xbfaa17fb,0xd99b601e,0x2b1eb3a1,0x203177c4,0xe2615f6c,0xff38fa08,
  199139. 0xd5a5c7c7,0xa7e535ab,0x870f026a,0xa9f3cf14,0x0c614aa0,0x6dabfd2a,
  199140. 0x595a0738,0x144ab173,0xcc9ad335,0x389b1921,0x2999a9b4,0x4d5b49fd,
  199141. 0xfdf22286,0x39e46ce7,0x4c69672c,0xc8a1cc35,0xf8bf03c6,0xbd02aac9,
  199142. 0x2cf8068b,0x6fa6b8d6,0x672d2098,0x905b0338,0x36b4195e,0x99718466,
  199143. 0xc2958ff6,0x265eaec7
  199144. };
  199145. #endif
  199146. /* The base point of curve P1024. */
  199147. static const sp_point_1024 p1024_base = {
  199148. /* X ordinate */
  199149. {
  199150. 0xeae63895,0x880dc8ab,0x967e0979,0x80ec46c4,0xb63f73ec,0xee9163a5,
  199151. 0x80728d87,0xd5cfb4cc,0xba66910d,0xa7c1514d,0x7a60de74,0xa702c339,
  199152. 0x8b72f2e1,0x337c8654,0x5dd5bccb,0x9760af76,0x406ce890,0x718bd9e7,
  199153. 0xdb9dfa55,0x43d5f22c,0x30b09e10,0xab10db90,0xf6ce2308,0xb5edb6c0,
  199154. 0xb6ff7cbf,0x98b2f204,0x0aec69c6,0x2b1a2fd6,0x3ed9b52a,0x0a799005,
  199155. 0x332c29ad,0x53fc09ee,
  199156. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199157. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199158. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199159. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199160. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199161. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199162. (sp_digit)0, (sp_digit)0
  199163. },
  199164. /* Y ordinate */
  199165. {
  199166. 0x1bef16d7,0x75573fd7,0x6a67dcde,0xadb9b570,0xd5bb4636,0x80bdad5a,
  199167. 0xe9cb99a9,0x13515ad7,0xc5a4d5f2,0x492d979f,0x164aa989,0xac6f1e80,
  199168. 0xb7652fe0,0xcad696b5,0xad547c6c,0x70dae117,0xa9e032b9,0x416cff0c,
  199169. 0x9a140b2e,0x6b598ccf,0xf0de55f6,0xe7f7f5e5,0x654ec2b9,0xf5ea69f4,
  199170. 0x1e141178,0x3d778d82,0x02990696,0xd3e82016,0x3634a135,0xf9f1f053,
  199171. 0x3f6009f1,0x0a824906,
  199172. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199173. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199174. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199175. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199176. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199177. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199178. (sp_digit)0, (sp_digit)0
  199179. },
  199180. /* Z ordinate */
  199181. {
  199182. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  199183. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  199184. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  199185. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  199186. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  199187. 0x00000000,0x00000000,
  199188. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199189. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199190. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199191. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199192. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199193. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  199194. (sp_digit)0, (sp_digit)0
  199195. },
  199196. /* infinity */
  199197. 0
  199198. };
  199199. #ifdef WOLFSSL_SP_SMALL
  199200. /* Sub b from a into a. (a -= b)
  199201. *
  199202. * a A single precision integer.
  199203. * b A single precision integer.
  199204. */
  199205. SP_NOINLINE static sp_digit sp_1024_sub_in_place_32(sp_digit* a,
  199206. const sp_digit* b)
  199207. {
  199208. __asm__ __volatile__ (
  199209. "movs r7, %[a]\n\t"
  199210. "movs r2, #0\n\t"
  199211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199212. "adds r7, r7, #0x80\n\t"
  199213. #else
  199214. "add r7, r7, #0x80\n\t"
  199215. #endif
  199216. "\n"
  199217. "L_sp_1024_sub_in_place_32_words_%=:\n\t"
  199218. "movs r5, #0\n\t"
  199219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199220. "subs r5, r5, r2\n\t"
  199221. #else
  199222. "sub r5, r5, r2\n\t"
  199223. #endif
  199224. "ldr r3, [%[a]]\n\t"
  199225. "ldr r4, [%[a], #4]\n\t"
  199226. "ldr r5, [%[b]]\n\t"
  199227. "ldr r6, [%[b], #4]\n\t"
  199228. #ifdef WOLFSSL_KEIL
  199229. "sbcs r3, r3, r5\n\t"
  199230. #elif defined(__clang__)
  199231. "sbcs r3, r5\n\t"
  199232. #else
  199233. "sbc r3, r5\n\t"
  199234. #endif
  199235. #ifdef WOLFSSL_KEIL
  199236. "sbcs r4, r4, r6\n\t"
  199237. #elif defined(__clang__)
  199238. "sbcs r4, r6\n\t"
  199239. #else
  199240. "sbc r4, r6\n\t"
  199241. #endif
  199242. "str r3, [%[a]]\n\t"
  199243. "str r4, [%[a], #4]\n\t"
  199244. #ifdef WOLFSSL_KEIL
  199245. "sbcs r2, r2, r2\n\t"
  199246. #elif defined(__clang__)
  199247. "sbcs r2, r2\n\t"
  199248. #else
  199249. "sbc r2, r2\n\t"
  199250. #endif
  199251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199252. "adds %[a], %[a], #8\n\t"
  199253. #else
  199254. "add %[a], %[a], #8\n\t"
  199255. #endif
  199256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199257. "adds %[b], %[b], #8\n\t"
  199258. #else
  199259. "add %[b], %[b], #8\n\t"
  199260. #endif
  199261. "cmp %[a], r7\n\t"
  199262. "bne L_sp_1024_sub_in_place_32_words_%=\n\t"
  199263. "movs %[a], r2\n\t"
  199264. : [a] "+l" (a), [b] "+l" (b)
  199265. :
  199266. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  199267. );
  199268. return (uint32_t)(size_t)a;
  199269. }
  199270. #endif /* WOLFSSL_SP_SMALL */
  199271. /* Conditionally subtract b from a using the mask m.
  199272. * m is -1 to subtract and 0 when not copying.
  199273. *
  199274. * r A single precision number representing condition subtract result.
  199275. * a A single precision number to subtract from.
  199276. * b A single precision number to subtract.
  199277. * m Mask value to apply.
  199278. */
  199279. SP_NOINLINE static sp_digit sp_1024_cond_sub_32(sp_digit* r, const sp_digit* a,
  199280. const sp_digit* b, sp_digit m)
  199281. {
  199282. __asm__ __volatile__ (
  199283. "movs r4, #0\n\t"
  199284. "movs r5, #0x80\n\t"
  199285. "mov r8, r5\n\t"
  199286. "movs r7, #0\n\t"
  199287. "\n"
  199288. "L_sp_1024_cond_sub_32_words_%=:\n\t"
  199289. "ldr r6, [%[b], r7]\n\t"
  199290. #ifdef WOLFSSL_KEIL
  199291. "ands r6, r6, %[m]\n\t"
  199292. #elif defined(__clang__)
  199293. "ands r6, %[m]\n\t"
  199294. #else
  199295. "and r6, %[m]\n\t"
  199296. #endif
  199297. "movs r5, #0\n\t"
  199298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199299. "subs r5, r5, r4\n\t"
  199300. #else
  199301. "sub r5, r5, r4\n\t"
  199302. #endif
  199303. "ldr r5, [%[a], r7]\n\t"
  199304. #ifdef WOLFSSL_KEIL
  199305. "sbcs r5, r5, r6\n\t"
  199306. #elif defined(__clang__)
  199307. "sbcs r5, r6\n\t"
  199308. #else
  199309. "sbc r5, r6\n\t"
  199310. #endif
  199311. #ifdef WOLFSSL_KEIL
  199312. "sbcs r4, r4, r4\n\t"
  199313. #elif defined(__clang__)
  199314. "sbcs r4, r4\n\t"
  199315. #else
  199316. "sbc r4, r4\n\t"
  199317. #endif
  199318. "str r5, [%[r], r7]\n\t"
  199319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199320. "adds r7, r7, #4\n\t"
  199321. #else
  199322. "add r7, r7, #4\n\t"
  199323. #endif
  199324. "cmp r7, r8\n\t"
  199325. "blt L_sp_1024_cond_sub_32_words_%=\n\t"
  199326. "movs %[r], r4\n\t"
  199327. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  199328. :
  199329. : "memory", "r4", "r5", "r6", "r7", "r8"
  199330. );
  199331. return (uint32_t)(size_t)r;
  199332. }
  199333. #ifdef WOLFSSL_SP_SMALL
  199334. /* Add b to a into r. (r = a + b)
  199335. *
  199336. * r A single precision integer.
  199337. * a A single precision integer.
  199338. * b A single precision integer.
  199339. */
  199340. SP_NOINLINE static sp_digit sp_1024_add_32(sp_digit* r, const sp_digit* a,
  199341. const sp_digit* b)
  199342. {
  199343. __asm__ __volatile__ (
  199344. "movs r6, %[a]\n\t"
  199345. "movs r7, #0\n\t"
  199346. "movs r3, #0\n\t"
  199347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199348. "adds r6, r6, #0x80\n\t"
  199349. #else
  199350. "add r6, r6, #0x80\n\t"
  199351. #endif
  199352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199353. "subs r7, r7, #1\n\t"
  199354. #else
  199355. "sub r7, r7, #1\n\t"
  199356. #endif
  199357. "\n"
  199358. "L_sp_1024_add_32_word_%=:\n\t"
  199359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199360. "adds r3, r3, r7\n\t"
  199361. #else
  199362. "add r3, r3, r7\n\t"
  199363. #endif
  199364. "ldr r4, [%[a]]\n\t"
  199365. "ldr r5, [%[b]]\n\t"
  199366. #ifdef WOLFSSL_KEIL
  199367. "adcs r4, r4, r5\n\t"
  199368. #elif defined(__clang__)
  199369. "adcs r4, r5\n\t"
  199370. #else
  199371. "adc r4, r5\n\t"
  199372. #endif
  199373. "str r4, [%[r]]\n\t"
  199374. "movs r3, #0\n\t"
  199375. #ifdef WOLFSSL_KEIL
  199376. "adcs r3, r3, r3\n\t"
  199377. #elif defined(__clang__)
  199378. "adcs r3, r3\n\t"
  199379. #else
  199380. "adc r3, r3\n\t"
  199381. #endif
  199382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199383. "adds %[a], %[a], #4\n\t"
  199384. #else
  199385. "add %[a], %[a], #4\n\t"
  199386. #endif
  199387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199388. "adds %[b], %[b], #4\n\t"
  199389. #else
  199390. "add %[b], %[b], #4\n\t"
  199391. #endif
  199392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199393. "adds %[r], %[r], #4\n\t"
  199394. #else
  199395. "add %[r], %[r], #4\n\t"
  199396. #endif
  199397. "cmp %[a], r6\n\t"
  199398. "bne L_sp_1024_add_32_word_%=\n\t"
  199399. "movs %[r], r3\n\t"
  199400. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  199401. :
  199402. : "memory", "r3", "r4", "r5", "r6", "r7"
  199403. );
  199404. return (uint32_t)(size_t)r;
  199405. }
  199406. #endif /* WOLFSSL_SP_SMALL */
  199407. /* Mul a by digit b into r. (r = a * b)
  199408. *
  199409. * r A single precision integer.
  199410. * a A single precision integer.
  199411. * b A single precision digit.
  199412. */
  199413. SP_NOINLINE static void sp_1024_mul_d_32(sp_digit* r, const sp_digit* a,
  199414. sp_digit b)
  199415. {
  199416. __asm__ __volatile__ (
  199417. "movs r6, #0x80\n\t"
  199418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199419. "adds r6, r6, %[a]\n\t"
  199420. #else
  199421. "add r6, r6, %[a]\n\t"
  199422. #endif
  199423. "mov r8, %[r]\n\t"
  199424. "mov r9, r6\n\t"
  199425. "movs r3, #0\n\t"
  199426. "movs r4, #0\n\t"
  199427. "\n"
  199428. "L_sp_1024_mul_d_32_%=:\n\t"
  199429. "movs %[r], #0\n\t"
  199430. "movs r5, #0\n\t"
  199431. "# A[] * B\n\t"
  199432. "ldrh r6, [%[a]]\n\t"
  199433. "uxth r7, %[b]\n\t"
  199434. #ifdef WOLFSSL_KEIL
  199435. "muls r7, r6, r7\n\t"
  199436. #elif defined(__clang__)
  199437. "muls r7, r6\n\t"
  199438. #else
  199439. "mul r7, r6\n\t"
  199440. #endif
  199441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199442. "adds r3, r3, r7\n\t"
  199443. #else
  199444. "add r3, r3, r7\n\t"
  199445. #endif
  199446. #ifdef WOLFSSL_KEIL
  199447. "adcs r4, r4, %[r]\n\t"
  199448. #elif defined(__clang__)
  199449. "adcs r4, %[r]\n\t"
  199450. #else
  199451. "adc r4, %[r]\n\t"
  199452. #endif
  199453. #ifdef WOLFSSL_KEIL
  199454. "adcs r5, r5, %[r]\n\t"
  199455. #elif defined(__clang__)
  199456. "adcs r5, %[r]\n\t"
  199457. #else
  199458. "adc r5, %[r]\n\t"
  199459. #endif
  199460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199461. "lsrs r7, %[b], #16\n\t"
  199462. #else
  199463. "lsr r7, %[b], #16\n\t"
  199464. #endif
  199465. #ifdef WOLFSSL_KEIL
  199466. "muls r6, r7, r6\n\t"
  199467. #elif defined(__clang__)
  199468. "muls r6, r7\n\t"
  199469. #else
  199470. "mul r6, r7\n\t"
  199471. #endif
  199472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199473. "lsrs r7, r6, #16\n\t"
  199474. #else
  199475. "lsr r7, r6, #16\n\t"
  199476. #endif
  199477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199478. "lsls r6, r6, #16\n\t"
  199479. #else
  199480. "lsl r6, r6, #16\n\t"
  199481. #endif
  199482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199483. "adds r3, r3, r6\n\t"
  199484. #else
  199485. "add r3, r3, r6\n\t"
  199486. #endif
  199487. #ifdef WOLFSSL_KEIL
  199488. "adcs r4, r4, r7\n\t"
  199489. #elif defined(__clang__)
  199490. "adcs r4, r7\n\t"
  199491. #else
  199492. "adc r4, r7\n\t"
  199493. #endif
  199494. #ifdef WOLFSSL_KEIL
  199495. "adcs r5, r5, %[r]\n\t"
  199496. #elif defined(__clang__)
  199497. "adcs r5, %[r]\n\t"
  199498. #else
  199499. "adc r5, %[r]\n\t"
  199500. #endif
  199501. "ldr r6, [%[a]]\n\t"
  199502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199503. "lsrs r6, r6, #16\n\t"
  199504. #else
  199505. "lsr r6, r6, #16\n\t"
  199506. #endif
  199507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199508. "lsrs r7, %[b], #16\n\t"
  199509. #else
  199510. "lsr r7, %[b], #16\n\t"
  199511. #endif
  199512. #ifdef WOLFSSL_KEIL
  199513. "muls r7, r6, r7\n\t"
  199514. #elif defined(__clang__)
  199515. "muls r7, r6\n\t"
  199516. #else
  199517. "mul r7, r6\n\t"
  199518. #endif
  199519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199520. "adds r4, r4, r7\n\t"
  199521. #else
  199522. "add r4, r4, r7\n\t"
  199523. #endif
  199524. #ifdef WOLFSSL_KEIL
  199525. "adcs r5, r5, %[r]\n\t"
  199526. #elif defined(__clang__)
  199527. "adcs r5, %[r]\n\t"
  199528. #else
  199529. "adc r5, %[r]\n\t"
  199530. #endif
  199531. "uxth r7, %[b]\n\t"
  199532. #ifdef WOLFSSL_KEIL
  199533. "muls r6, r7, r6\n\t"
  199534. #elif defined(__clang__)
  199535. "muls r6, r7\n\t"
  199536. #else
  199537. "mul r6, r7\n\t"
  199538. #endif
  199539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199540. "lsrs r7, r6, #16\n\t"
  199541. #else
  199542. "lsr r7, r6, #16\n\t"
  199543. #endif
  199544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199545. "lsls r6, r6, #16\n\t"
  199546. #else
  199547. "lsl r6, r6, #16\n\t"
  199548. #endif
  199549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199550. "adds r3, r3, r6\n\t"
  199551. #else
  199552. "add r3, r3, r6\n\t"
  199553. #endif
  199554. #ifdef WOLFSSL_KEIL
  199555. "adcs r4, r4, r7\n\t"
  199556. #elif defined(__clang__)
  199557. "adcs r4, r7\n\t"
  199558. #else
  199559. "adc r4, r7\n\t"
  199560. #endif
  199561. #ifdef WOLFSSL_KEIL
  199562. "adcs r5, r5, %[r]\n\t"
  199563. #elif defined(__clang__)
  199564. "adcs r5, %[r]\n\t"
  199565. #else
  199566. "adc r5, %[r]\n\t"
  199567. #endif
  199568. "# A[] * B - Done\n\t"
  199569. "mov %[r], r8\n\t"
  199570. "str r3, [%[r]]\n\t"
  199571. "movs r3, r4\n\t"
  199572. "movs r4, r5\n\t"
  199573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199574. "adds %[r], %[r], #4\n\t"
  199575. #else
  199576. "add %[r], %[r], #4\n\t"
  199577. #endif
  199578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199579. "adds %[a], %[a], #4\n\t"
  199580. #else
  199581. "add %[a], %[a], #4\n\t"
  199582. #endif
  199583. "mov r8, %[r]\n\t"
  199584. "cmp %[a], r9\n\t"
  199585. "blt L_sp_1024_mul_d_32_%=\n\t"
  199586. "str r3, [%[r]]\n\t"
  199587. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  199588. :
  199589. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  199590. );
  199591. }
  199592. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  199593. *
  199594. * d1 The high order half of the number to divide.
  199595. * d0 The low order half of the number to divide.
  199596. * div The divisor.
  199597. * returns the result of the division.
  199598. *
  199599. * Note that this is an approximate div. It may give an answer 1 larger.
  199600. */
  199601. SP_NOINLINE static sp_digit div_1024_word_32(sp_digit d1, sp_digit d0,
  199602. sp_digit div)
  199603. {
  199604. __asm__ __volatile__ (
  199605. "movs r3, #0\n\t"
  199606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199607. "lsrs r5, %[div], #1\n\t"
  199608. #else
  199609. "lsr r5, %[div], #1\n\t"
  199610. #endif
  199611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199612. "adds r5, r5, #1\n\t"
  199613. #else
  199614. "add r5, r5, #1\n\t"
  199615. #endif
  199616. "mov r8, %[d0]\n\t"
  199617. "mov r9, %[d1]\n\t"
  199618. "# Do top 32\n\t"
  199619. "movs r6, r5\n\t"
  199620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199621. "subs r6, r6, %[d1]\n\t"
  199622. #else
  199623. "sub r6, r6, %[d1]\n\t"
  199624. #endif
  199625. #ifdef WOLFSSL_KEIL
  199626. "sbcs r6, r6, r6\n\t"
  199627. #elif defined(__clang__)
  199628. "sbcs r6, r6\n\t"
  199629. #else
  199630. "sbc r6, r6\n\t"
  199631. #endif
  199632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199633. "adds r3, r3, r3\n\t"
  199634. #else
  199635. "add r3, r3, r3\n\t"
  199636. #endif
  199637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199638. "subs r3, r3, r6\n\t"
  199639. #else
  199640. "sub r3, r3, r6\n\t"
  199641. #endif
  199642. #ifdef WOLFSSL_KEIL
  199643. "ands r6, r6, r5\n\t"
  199644. #elif defined(__clang__)
  199645. "ands r6, r5\n\t"
  199646. #else
  199647. "and r6, r5\n\t"
  199648. #endif
  199649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199650. "subs %[d1], %[d1], r6\n\t"
  199651. #else
  199652. "sub %[d1], %[d1], r6\n\t"
  199653. #endif
  199654. "movs r4, #29\n\t"
  199655. "\n"
  199656. "L_div_1024_word_32_loop_%=:\n\t"
  199657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199658. "lsls %[d0], %[d0], #1\n\t"
  199659. #else
  199660. "lsl %[d0], %[d0], #1\n\t"
  199661. #endif
  199662. #ifdef WOLFSSL_KEIL
  199663. "adcs %[d1], %[d1], %[d1]\n\t"
  199664. #elif defined(__clang__)
  199665. "adcs %[d1], %[d1]\n\t"
  199666. #else
  199667. "adc %[d1], %[d1]\n\t"
  199668. #endif
  199669. "movs r6, r5\n\t"
  199670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199671. "subs r6, r6, %[d1]\n\t"
  199672. #else
  199673. "sub r6, r6, %[d1]\n\t"
  199674. #endif
  199675. #ifdef WOLFSSL_KEIL
  199676. "sbcs r6, r6, r6\n\t"
  199677. #elif defined(__clang__)
  199678. "sbcs r6, r6\n\t"
  199679. #else
  199680. "sbc r6, r6\n\t"
  199681. #endif
  199682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199683. "adds r3, r3, r3\n\t"
  199684. #else
  199685. "add r3, r3, r3\n\t"
  199686. #endif
  199687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199688. "subs r3, r3, r6\n\t"
  199689. #else
  199690. "sub r3, r3, r6\n\t"
  199691. #endif
  199692. #ifdef WOLFSSL_KEIL
  199693. "ands r6, r6, r5\n\t"
  199694. #elif defined(__clang__)
  199695. "ands r6, r5\n\t"
  199696. #else
  199697. "and r6, r5\n\t"
  199698. #endif
  199699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199700. "subs %[d1], %[d1], r6\n\t"
  199701. #else
  199702. "sub %[d1], %[d1], r6\n\t"
  199703. #endif
  199704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199705. "subs r4, r4, #1\n\t"
  199706. #else
  199707. "sub r4, r4, #1\n\t"
  199708. #endif
  199709. "bpl L_div_1024_word_32_loop_%=\n\t"
  199710. "movs r7, #0\n\t"
  199711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199712. "adds r3, r3, r3\n\t"
  199713. #else
  199714. "add r3, r3, r3\n\t"
  199715. #endif
  199716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199717. "adds r3, r3, #1\n\t"
  199718. #else
  199719. "add r3, r3, #1\n\t"
  199720. #endif
  199721. "# r * div - Start\n\t"
  199722. "uxth %[d1], r3\n\t"
  199723. "uxth r4, %[div]\n\t"
  199724. #ifdef WOLFSSL_KEIL
  199725. "muls r4, %[d1], r4\n\t"
  199726. #elif defined(__clang__)
  199727. "muls r4, %[d1]\n\t"
  199728. #else
  199729. "mul r4, %[d1]\n\t"
  199730. #endif
  199731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199732. "lsrs r6, %[div], #16\n\t"
  199733. #else
  199734. "lsr r6, %[div], #16\n\t"
  199735. #endif
  199736. #ifdef WOLFSSL_KEIL
  199737. "muls %[d1], r6, %[d1]\n\t"
  199738. #elif defined(__clang__)
  199739. "muls %[d1], r6\n\t"
  199740. #else
  199741. "mul %[d1], r6\n\t"
  199742. #endif
  199743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199744. "lsrs r5, %[d1], #16\n\t"
  199745. #else
  199746. "lsr r5, %[d1], #16\n\t"
  199747. #endif
  199748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199749. "lsls %[d1], %[d1], #16\n\t"
  199750. #else
  199751. "lsl %[d1], %[d1], #16\n\t"
  199752. #endif
  199753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199754. "adds r4, r4, %[d1]\n\t"
  199755. #else
  199756. "add r4, r4, %[d1]\n\t"
  199757. #endif
  199758. #ifdef WOLFSSL_KEIL
  199759. "adcs r5, r5, r7\n\t"
  199760. #elif defined(__clang__)
  199761. "adcs r5, r7\n\t"
  199762. #else
  199763. "adc r5, r7\n\t"
  199764. #endif
  199765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199766. "lsrs %[d1], r3, #16\n\t"
  199767. #else
  199768. "lsr %[d1], r3, #16\n\t"
  199769. #endif
  199770. #ifdef WOLFSSL_KEIL
  199771. "muls r6, %[d1], r6\n\t"
  199772. #elif defined(__clang__)
  199773. "muls r6, %[d1]\n\t"
  199774. #else
  199775. "mul r6, %[d1]\n\t"
  199776. #endif
  199777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199778. "adds r5, r5, r6\n\t"
  199779. #else
  199780. "add r5, r5, r6\n\t"
  199781. #endif
  199782. "uxth r6, %[div]\n\t"
  199783. #ifdef WOLFSSL_KEIL
  199784. "muls %[d1], r6, %[d1]\n\t"
  199785. #elif defined(__clang__)
  199786. "muls %[d1], r6\n\t"
  199787. #else
  199788. "mul %[d1], r6\n\t"
  199789. #endif
  199790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199791. "lsrs r6, %[d1], #16\n\t"
  199792. #else
  199793. "lsr r6, %[d1], #16\n\t"
  199794. #endif
  199795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199796. "lsls %[d1], %[d1], #16\n\t"
  199797. #else
  199798. "lsl %[d1], %[d1], #16\n\t"
  199799. #endif
  199800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199801. "adds r4, r4, %[d1]\n\t"
  199802. #else
  199803. "add r4, r4, %[d1]\n\t"
  199804. #endif
  199805. #ifdef WOLFSSL_KEIL
  199806. "adcs r5, r5, r6\n\t"
  199807. #elif defined(__clang__)
  199808. "adcs r5, r6\n\t"
  199809. #else
  199810. "adc r5, r6\n\t"
  199811. #endif
  199812. "# r * div - Done\n\t"
  199813. "mov %[d1], r8\n\t"
  199814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199815. "subs %[d1], %[d1], r4\n\t"
  199816. #else
  199817. "sub %[d1], %[d1], r4\n\t"
  199818. #endif
  199819. "movs r4, %[d1]\n\t"
  199820. "mov %[d1], r9\n\t"
  199821. #ifdef WOLFSSL_KEIL
  199822. "sbcs %[d1], %[d1], r5\n\t"
  199823. #elif defined(__clang__)
  199824. "sbcs %[d1], r5\n\t"
  199825. #else
  199826. "sbc %[d1], r5\n\t"
  199827. #endif
  199828. "movs r5, %[d1]\n\t"
  199829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199830. "adds r3, r3, r5\n\t"
  199831. #else
  199832. "add r3, r3, r5\n\t"
  199833. #endif
  199834. "# r * div - Start\n\t"
  199835. "uxth %[d1], r3\n\t"
  199836. "uxth r4, %[div]\n\t"
  199837. #ifdef WOLFSSL_KEIL
  199838. "muls r4, %[d1], r4\n\t"
  199839. #elif defined(__clang__)
  199840. "muls r4, %[d1]\n\t"
  199841. #else
  199842. "mul r4, %[d1]\n\t"
  199843. #endif
  199844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199845. "lsrs r6, %[div], #16\n\t"
  199846. #else
  199847. "lsr r6, %[div], #16\n\t"
  199848. #endif
  199849. #ifdef WOLFSSL_KEIL
  199850. "muls %[d1], r6, %[d1]\n\t"
  199851. #elif defined(__clang__)
  199852. "muls %[d1], r6\n\t"
  199853. #else
  199854. "mul %[d1], r6\n\t"
  199855. #endif
  199856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199857. "lsrs r5, %[d1], #16\n\t"
  199858. #else
  199859. "lsr r5, %[d1], #16\n\t"
  199860. #endif
  199861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199862. "lsls %[d1], %[d1], #16\n\t"
  199863. #else
  199864. "lsl %[d1], %[d1], #16\n\t"
  199865. #endif
  199866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199867. "adds r4, r4, %[d1]\n\t"
  199868. #else
  199869. "add r4, r4, %[d1]\n\t"
  199870. #endif
  199871. #ifdef WOLFSSL_KEIL
  199872. "adcs r5, r5, r7\n\t"
  199873. #elif defined(__clang__)
  199874. "adcs r5, r7\n\t"
  199875. #else
  199876. "adc r5, r7\n\t"
  199877. #endif
  199878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199879. "lsrs %[d1], r3, #16\n\t"
  199880. #else
  199881. "lsr %[d1], r3, #16\n\t"
  199882. #endif
  199883. #ifdef WOLFSSL_KEIL
  199884. "muls r6, %[d1], r6\n\t"
  199885. #elif defined(__clang__)
  199886. "muls r6, %[d1]\n\t"
  199887. #else
  199888. "mul r6, %[d1]\n\t"
  199889. #endif
  199890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199891. "adds r5, r5, r6\n\t"
  199892. #else
  199893. "add r5, r5, r6\n\t"
  199894. #endif
  199895. "uxth r6, %[div]\n\t"
  199896. #ifdef WOLFSSL_KEIL
  199897. "muls %[d1], r6, %[d1]\n\t"
  199898. #elif defined(__clang__)
  199899. "muls %[d1], r6\n\t"
  199900. #else
  199901. "mul %[d1], r6\n\t"
  199902. #endif
  199903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199904. "lsrs r6, %[d1], #16\n\t"
  199905. #else
  199906. "lsr r6, %[d1], #16\n\t"
  199907. #endif
  199908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199909. "lsls %[d1], %[d1], #16\n\t"
  199910. #else
  199911. "lsl %[d1], %[d1], #16\n\t"
  199912. #endif
  199913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199914. "adds r4, r4, %[d1]\n\t"
  199915. #else
  199916. "add r4, r4, %[d1]\n\t"
  199917. #endif
  199918. #ifdef WOLFSSL_KEIL
  199919. "adcs r5, r5, r6\n\t"
  199920. #elif defined(__clang__)
  199921. "adcs r5, r6\n\t"
  199922. #else
  199923. "adc r5, r6\n\t"
  199924. #endif
  199925. "# r * div - Done\n\t"
  199926. "mov %[d1], r8\n\t"
  199927. "mov r6, r9\n\t"
  199928. #ifdef WOLFSSL_KEIL
  199929. "subs r4, %[d1], r4\n\t"
  199930. #else
  199931. #ifdef __clang__
  199932. "subs r4, %[d1], r4\n\t"
  199933. #else
  199934. "sub r4, %[d1], r4\n\t"
  199935. #endif
  199936. #endif
  199937. #ifdef WOLFSSL_KEIL
  199938. "sbcs r6, r6, r5\n\t"
  199939. #elif defined(__clang__)
  199940. "sbcs r6, r5\n\t"
  199941. #else
  199942. "sbc r6, r5\n\t"
  199943. #endif
  199944. "movs r5, r6\n\t"
  199945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199946. "adds r3, r3, r5\n\t"
  199947. #else
  199948. "add r3, r3, r5\n\t"
  199949. #endif
  199950. "# r * div - Start\n\t"
  199951. "uxth %[d1], r3\n\t"
  199952. "uxth r4, %[div]\n\t"
  199953. #ifdef WOLFSSL_KEIL
  199954. "muls r4, %[d1], r4\n\t"
  199955. #elif defined(__clang__)
  199956. "muls r4, %[d1]\n\t"
  199957. #else
  199958. "mul r4, %[d1]\n\t"
  199959. #endif
  199960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199961. "lsrs r6, %[div], #16\n\t"
  199962. #else
  199963. "lsr r6, %[div], #16\n\t"
  199964. #endif
  199965. #ifdef WOLFSSL_KEIL
  199966. "muls %[d1], r6, %[d1]\n\t"
  199967. #elif defined(__clang__)
  199968. "muls %[d1], r6\n\t"
  199969. #else
  199970. "mul %[d1], r6\n\t"
  199971. #endif
  199972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199973. "lsrs r5, %[d1], #16\n\t"
  199974. #else
  199975. "lsr r5, %[d1], #16\n\t"
  199976. #endif
  199977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199978. "lsls %[d1], %[d1], #16\n\t"
  199979. #else
  199980. "lsl %[d1], %[d1], #16\n\t"
  199981. #endif
  199982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199983. "adds r4, r4, %[d1]\n\t"
  199984. #else
  199985. "add r4, r4, %[d1]\n\t"
  199986. #endif
  199987. #ifdef WOLFSSL_KEIL
  199988. "adcs r5, r5, r7\n\t"
  199989. #elif defined(__clang__)
  199990. "adcs r5, r7\n\t"
  199991. #else
  199992. "adc r5, r7\n\t"
  199993. #endif
  199994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199995. "lsrs %[d1], r3, #16\n\t"
  199996. #else
  199997. "lsr %[d1], r3, #16\n\t"
  199998. #endif
  199999. #ifdef WOLFSSL_KEIL
  200000. "muls r6, %[d1], r6\n\t"
  200001. #elif defined(__clang__)
  200002. "muls r6, %[d1]\n\t"
  200003. #else
  200004. "mul r6, %[d1]\n\t"
  200005. #endif
  200006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200007. "adds r5, r5, r6\n\t"
  200008. #else
  200009. "add r5, r5, r6\n\t"
  200010. #endif
  200011. "uxth r6, %[div]\n\t"
  200012. #ifdef WOLFSSL_KEIL
  200013. "muls %[d1], r6, %[d1]\n\t"
  200014. #elif defined(__clang__)
  200015. "muls %[d1], r6\n\t"
  200016. #else
  200017. "mul %[d1], r6\n\t"
  200018. #endif
  200019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200020. "lsrs r6, %[d1], #16\n\t"
  200021. #else
  200022. "lsr r6, %[d1], #16\n\t"
  200023. #endif
  200024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200025. "lsls %[d1], %[d1], #16\n\t"
  200026. #else
  200027. "lsl %[d1], %[d1], #16\n\t"
  200028. #endif
  200029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200030. "adds r4, r4, %[d1]\n\t"
  200031. #else
  200032. "add r4, r4, %[d1]\n\t"
  200033. #endif
  200034. #ifdef WOLFSSL_KEIL
  200035. "adcs r5, r5, r6\n\t"
  200036. #elif defined(__clang__)
  200037. "adcs r5, r6\n\t"
  200038. #else
  200039. "adc r5, r6\n\t"
  200040. #endif
  200041. "# r * div - Done\n\t"
  200042. "mov %[d1], r8\n\t"
  200043. "mov r6, r9\n\t"
  200044. #ifdef WOLFSSL_KEIL
  200045. "subs r4, %[d1], r4\n\t"
  200046. #else
  200047. #ifdef __clang__
  200048. "subs r4, %[d1], r4\n\t"
  200049. #else
  200050. "sub r4, %[d1], r4\n\t"
  200051. #endif
  200052. #endif
  200053. #ifdef WOLFSSL_KEIL
  200054. "sbcs r6, r6, r5\n\t"
  200055. #elif defined(__clang__)
  200056. "sbcs r6, r5\n\t"
  200057. #else
  200058. "sbc r6, r5\n\t"
  200059. #endif
  200060. "movs r5, r6\n\t"
  200061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200062. "adds r3, r3, r5\n\t"
  200063. #else
  200064. "add r3, r3, r5\n\t"
  200065. #endif
  200066. "# r * div - Start\n\t"
  200067. "uxth %[d1], r3\n\t"
  200068. "uxth r4, %[div]\n\t"
  200069. #ifdef WOLFSSL_KEIL
  200070. "muls r4, %[d1], r4\n\t"
  200071. #elif defined(__clang__)
  200072. "muls r4, %[d1]\n\t"
  200073. #else
  200074. "mul r4, %[d1]\n\t"
  200075. #endif
  200076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200077. "lsrs r6, %[div], #16\n\t"
  200078. #else
  200079. "lsr r6, %[div], #16\n\t"
  200080. #endif
  200081. #ifdef WOLFSSL_KEIL
  200082. "muls %[d1], r6, %[d1]\n\t"
  200083. #elif defined(__clang__)
  200084. "muls %[d1], r6\n\t"
  200085. #else
  200086. "mul %[d1], r6\n\t"
  200087. #endif
  200088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200089. "lsrs r5, %[d1], #16\n\t"
  200090. #else
  200091. "lsr r5, %[d1], #16\n\t"
  200092. #endif
  200093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200094. "lsls %[d1], %[d1], #16\n\t"
  200095. #else
  200096. "lsl %[d1], %[d1], #16\n\t"
  200097. #endif
  200098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200099. "adds r4, r4, %[d1]\n\t"
  200100. #else
  200101. "add r4, r4, %[d1]\n\t"
  200102. #endif
  200103. #ifdef WOLFSSL_KEIL
  200104. "adcs r5, r5, r7\n\t"
  200105. #elif defined(__clang__)
  200106. "adcs r5, r7\n\t"
  200107. #else
  200108. "adc r5, r7\n\t"
  200109. #endif
  200110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200111. "lsrs %[d1], r3, #16\n\t"
  200112. #else
  200113. "lsr %[d1], r3, #16\n\t"
  200114. #endif
  200115. #ifdef WOLFSSL_KEIL
  200116. "muls r6, %[d1], r6\n\t"
  200117. #elif defined(__clang__)
  200118. "muls r6, %[d1]\n\t"
  200119. #else
  200120. "mul r6, %[d1]\n\t"
  200121. #endif
  200122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200123. "adds r5, r5, r6\n\t"
  200124. #else
  200125. "add r5, r5, r6\n\t"
  200126. #endif
  200127. "uxth r6, %[div]\n\t"
  200128. #ifdef WOLFSSL_KEIL
  200129. "muls %[d1], r6, %[d1]\n\t"
  200130. #elif defined(__clang__)
  200131. "muls %[d1], r6\n\t"
  200132. #else
  200133. "mul %[d1], r6\n\t"
  200134. #endif
  200135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200136. "lsrs r6, %[d1], #16\n\t"
  200137. #else
  200138. "lsr r6, %[d1], #16\n\t"
  200139. #endif
  200140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200141. "lsls %[d1], %[d1], #16\n\t"
  200142. #else
  200143. "lsl %[d1], %[d1], #16\n\t"
  200144. #endif
  200145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200146. "adds r4, r4, %[d1]\n\t"
  200147. #else
  200148. "add r4, r4, %[d1]\n\t"
  200149. #endif
  200150. #ifdef WOLFSSL_KEIL
  200151. "adcs r5, r5, r6\n\t"
  200152. #elif defined(__clang__)
  200153. "adcs r5, r6\n\t"
  200154. #else
  200155. "adc r5, r6\n\t"
  200156. #endif
  200157. "# r * div - Done\n\t"
  200158. "mov %[d1], r8\n\t"
  200159. "mov r6, r9\n\t"
  200160. #ifdef WOLFSSL_KEIL
  200161. "subs r4, %[d1], r4\n\t"
  200162. #else
  200163. #ifdef __clang__
  200164. "subs r4, %[d1], r4\n\t"
  200165. #else
  200166. "sub r4, %[d1], r4\n\t"
  200167. #endif
  200168. #endif
  200169. #ifdef WOLFSSL_KEIL
  200170. "sbcs r6, r6, r5\n\t"
  200171. #elif defined(__clang__)
  200172. "sbcs r6, r5\n\t"
  200173. #else
  200174. "sbc r6, r5\n\t"
  200175. #endif
  200176. "movs r5, r6\n\t"
  200177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200178. "adds r3, r3, r5\n\t"
  200179. #else
  200180. "add r3, r3, r5\n\t"
  200181. #endif
  200182. "movs r6, %[div]\n\t"
  200183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200184. "subs r6, r6, r4\n\t"
  200185. #else
  200186. "sub r6, r6, r4\n\t"
  200187. #endif
  200188. #ifdef WOLFSSL_KEIL
  200189. "sbcs r6, r6, r6\n\t"
  200190. #elif defined(__clang__)
  200191. "sbcs r6, r6\n\t"
  200192. #else
  200193. "sbc r6, r6\n\t"
  200194. #endif
  200195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200196. "subs r3, r3, r6\n\t"
  200197. #else
  200198. "sub r3, r3, r6\n\t"
  200199. #endif
  200200. "movs %[d1], r3\n\t"
  200201. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  200202. :
  200203. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  200204. );
  200205. return (uint32_t)(size_t)d1;
  200206. }
  200207. /* AND m into each word of a and store in r.
  200208. *
  200209. * r A single precision integer.
  200210. * a A single precision integer.
  200211. * m Mask to AND against each digit.
  200212. */
  200213. static void sp_1024_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  200214. {
  200215. #ifdef WOLFSSL_SP_SMALL
  200216. int i;
  200217. for (i=0; i<32; i++) {
  200218. r[i] = a[i] & m;
  200219. }
  200220. #else
  200221. int i;
  200222. for (i = 0; i < 32; i += 8) {
  200223. r[i+0] = a[i+0] & m;
  200224. r[i+1] = a[i+1] & m;
  200225. r[i+2] = a[i+2] & m;
  200226. r[i+3] = a[i+3] & m;
  200227. r[i+4] = a[i+4] & m;
  200228. r[i+5] = a[i+5] & m;
  200229. r[i+6] = a[i+6] & m;
  200230. r[i+7] = a[i+7] & m;
  200231. }
  200232. #endif
  200233. }
  200234. /* Compare a with b in constant time.
  200235. *
  200236. * a A single precision integer.
  200237. * b A single precision integer.
  200238. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  200239. * respectively.
  200240. */
  200241. SP_NOINLINE static sp_int32 sp_1024_cmp_32(const sp_digit* a, const sp_digit* b)
  200242. {
  200243. __asm__ __volatile__ (
  200244. "movs r2, #0\n\t"
  200245. "movs r3, #0\n\t"
  200246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200247. "mvns r3, r3\n\t"
  200248. #else
  200249. "mvn r3, r3\n\t"
  200250. #endif
  200251. "movs r6, #0x7c\n\t"
  200252. "\n"
  200253. "L_sp_1024_cmp_32_words_%=:\n\t"
  200254. "ldr r7, [%[a], r6]\n\t"
  200255. "ldr r5, [%[b], r6]\n\t"
  200256. #ifdef WOLFSSL_KEIL
  200257. "ands r7, r7, r3\n\t"
  200258. #elif defined(__clang__)
  200259. "ands r7, r3\n\t"
  200260. #else
  200261. "and r7, r3\n\t"
  200262. #endif
  200263. #ifdef WOLFSSL_KEIL
  200264. "ands r5, r5, r3\n\t"
  200265. #elif defined(__clang__)
  200266. "ands r5, r3\n\t"
  200267. #else
  200268. "and r5, r3\n\t"
  200269. #endif
  200270. "movs r4, r7\n\t"
  200271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200272. "subs r7, r7, r5\n\t"
  200273. #else
  200274. "sub r7, r7, r5\n\t"
  200275. #endif
  200276. #ifdef WOLFSSL_KEIL
  200277. "sbcs r7, r7, r7\n\t"
  200278. #elif defined(__clang__)
  200279. "sbcs r7, r7\n\t"
  200280. #else
  200281. "sbc r7, r7\n\t"
  200282. #endif
  200283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200284. "adds r2, r2, r7\n\t"
  200285. #else
  200286. "add r2, r2, r7\n\t"
  200287. #endif
  200288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200289. "mvns r7, r7\n\t"
  200290. #else
  200291. "mvn r7, r7\n\t"
  200292. #endif
  200293. #ifdef WOLFSSL_KEIL
  200294. "ands r3, r3, r7\n\t"
  200295. #elif defined(__clang__)
  200296. "ands r3, r7\n\t"
  200297. #else
  200298. "and r3, r7\n\t"
  200299. #endif
  200300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200301. "subs r5, r5, r4\n\t"
  200302. #else
  200303. "sub r5, r5, r4\n\t"
  200304. #endif
  200305. #ifdef WOLFSSL_KEIL
  200306. "sbcs r7, r7, r7\n\t"
  200307. #elif defined(__clang__)
  200308. "sbcs r7, r7\n\t"
  200309. #else
  200310. "sbc r7, r7\n\t"
  200311. #endif
  200312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200313. "subs r2, r2, r7\n\t"
  200314. #else
  200315. "sub r2, r2, r7\n\t"
  200316. #endif
  200317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200318. "mvns r7, r7\n\t"
  200319. #else
  200320. "mvn r7, r7\n\t"
  200321. #endif
  200322. #ifdef WOLFSSL_KEIL
  200323. "ands r3, r3, r7\n\t"
  200324. #elif defined(__clang__)
  200325. "ands r3, r7\n\t"
  200326. #else
  200327. "and r3, r7\n\t"
  200328. #endif
  200329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200330. "subs r6, r6, #4\n\t"
  200331. #else
  200332. "sub r6, r6, #4\n\t"
  200333. #endif
  200334. "bge L_sp_1024_cmp_32_words_%=\n\t"
  200335. "movs %[a], r2\n\t"
  200336. : [a] "+l" (a), [b] "+l" (b)
  200337. :
  200338. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  200339. );
  200340. return (uint32_t)(size_t)a;
  200341. }
  200342. /* Divide d in a and put remainder into r (m*d + r = a)
  200343. * m is not calculated as it is not needed at this time.
  200344. *
  200345. * a Number to be divided.
  200346. * d Number to divide with.
  200347. * m Multiplier result.
  200348. * r Remainder from the division.
  200349. * returns MP_OKAY indicating success.
  200350. */
  200351. static WC_INLINE int sp_1024_div_32(const sp_digit* a, const sp_digit* d,
  200352. sp_digit* m, sp_digit* r)
  200353. {
  200354. sp_digit t1[64], t2[33];
  200355. sp_digit div, r1;
  200356. int i;
  200357. (void)m;
  200358. div = d[31];
  200359. XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
  200360. r1 = sp_1024_cmp_32(&t1[32], d) >= 0;
  200361. sp_1024_cond_sub_32(&t1[32], &t1[32], d, (sp_digit)0 - r1);
  200362. for (i = 31; i >= 0; i--) {
  200363. volatile sp_digit mask = (sp_digit)0 - (t1[32 + i] == div);
  200364. sp_digit hi = t1[32 + i] + mask;
  200365. r1 = div_1024_word_32(hi, t1[32 + i - 1], div);
  200366. r1 |= mask;
  200367. sp_1024_mul_d_32(t2, d, r1);
  200368. t1[32 + i] += sp_1024_sub_in_place_32(&t1[i], t2);
  200369. t1[32 + i] -= t2[32];
  200370. sp_1024_mask_32(t2, d, t1[32 + i]);
  200371. t1[32 + i] += sp_1024_add_32(&t1[i], &t1[i], t2);
  200372. sp_1024_mask_32(t2, d, t1[32 + i]);
  200373. t1[32 + i] += sp_1024_add_32(&t1[i], &t1[i], t2);
  200374. }
  200375. r1 = sp_1024_cmp_32(t1, d) >= 0;
  200376. sp_1024_cond_sub_32(r, t1, d, (sp_digit)0 - r1);
  200377. return MP_OKAY;
  200378. }
  200379. /* Reduce a modulo m into r. (r = a mod m)
  200380. *
  200381. * r A single precision number that is the reduced result.
  200382. * a A single precision number that is to be reduced.
  200383. * m A single precision number that is the modulus to reduce with.
  200384. * returns MP_OKAY indicating success.
  200385. */
  200386. static WC_INLINE int sp_1024_mod_32(sp_digit* r, const sp_digit* a, const sp_digit* m)
  200387. {
  200388. int ret;
  200389. ret = sp_1024_div_32(a, m, NULL, r);
  200390. return ret;
  200391. }
  200392. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  200393. *
  200394. * r The resulting Montgomery form number.
  200395. * a The number to convert.
  200396. * m The modulus (prime).
  200397. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  200398. */
  200399. static int sp_1024_mod_mul_norm_32(sp_digit* r, const sp_digit* a,
  200400. const sp_digit* m)
  200401. {
  200402. sp_1024_mul_32(r, a, p1024_norm_mod);
  200403. return sp_1024_mod_32(r, r, m);
  200404. }
  200405. #ifdef WOLFCRYPT_HAVE_SAKKE
  200406. /* Create a new point.
  200407. *
  200408. * heap [in] Buffer to allocate dynamic memory from.
  200409. * sp [in] Data for point - only if not allocating.
  200410. * p [out] New point.
  200411. * returns MEMORY_E when dynamic memory allocation fails and 0 otherwise.
  200412. */
  200413. static int sp_1024_point_new_ex_32(void* heap, sp_point_1024* sp,
  200414. sp_point_1024** p)
  200415. {
  200416. int ret = MP_OKAY;
  200417. (void)heap;
  200418. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  200419. defined(WOLFSSL_SP_SMALL_STACK)
  200420. (void)sp;
  200421. *p = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap, DYNAMIC_TYPE_ECC);
  200422. #else
  200423. *p = sp;
  200424. #endif
  200425. if (*p == NULL) {
  200426. ret = MEMORY_E;
  200427. }
  200428. return ret;
  200429. }
  200430. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  200431. defined(WOLFSSL_SP_SMALL_STACK)
  200432. /* Allocate memory for point and return error. */
  200433. #define sp_1024_point_new_32(heap, sp, p) sp_1024_point_new_ex_32((heap), NULL, &(p))
  200434. #else
  200435. /* Set pointer to data and return no error. */
  200436. #define sp_1024_point_new_32(heap, sp, p) sp_1024_point_new_ex_32((heap), &(sp), &(p))
  200437. #endif
  200438. #endif /* WOLFCRYPT_HAVE_SAKKE */
  200439. #ifdef WOLFCRYPT_HAVE_SAKKE
  200440. /* Free the point.
  200441. *
  200442. * p [in,out] Point to free.
  200443. * clear [in] Indicates whether to zeroize point.
  200444. * heap [in] Buffer from which dynamic memory was allocate from.
  200445. */
  200446. static void sp_1024_point_free_32(sp_point_1024* p, int clear, void* heap)
  200447. {
  200448. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  200449. defined(WOLFSSL_SP_SMALL_STACK)
  200450. /* If valid pointer then clear point data if requested and free data. */
  200451. if (p != NULL) {
  200452. if (clear != 0) {
  200453. XMEMSET(p, 0, sizeof(*p));
  200454. }
  200455. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  200456. }
  200457. #else
  200458. /* Clear point data if requested. */
  200459. if ((p != NULL) && (clear != 0)) {
  200460. XMEMSET(p, 0, sizeof(*p));
  200461. }
  200462. #endif
  200463. (void)heap;
  200464. }
  200465. #endif /* WOLFCRYPT_HAVE_SAKKE */
  200466. /* Convert an mp_int to an array of sp_digit.
  200467. *
  200468. * r A single precision integer.
  200469. * size Maximum number of bytes to convert
  200470. * a A multi-precision integer.
  200471. */
  200472. static void sp_1024_from_mp(sp_digit* r, int size, const mp_int* a)
  200473. {
  200474. #if DIGIT_BIT == 32
  200475. int i;
  200476. sp_digit j = (sp_digit)0 - (sp_digit)a->used;
  200477. int o = 0;
  200478. for (i = 0; i < size; i++) {
  200479. sp_digit mask = (sp_digit)0 - (j >> 31);
  200480. r[i] = a->dp[o] & mask;
  200481. j++;
  200482. o += (int)(j >> 31);
  200483. }
  200484. #elif DIGIT_BIT > 32
  200485. unsigned int i;
  200486. int j = 0;
  200487. word32 s = 0;
  200488. r[0] = 0;
  200489. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  200490. r[j] |= ((sp_digit)a->dp[i] << s);
  200491. r[j] &= 0xffffffff;
  200492. s = 32U - s;
  200493. if (j + 1 >= size) {
  200494. break;
  200495. }
  200496. /* lint allow cast of mismatch word32 and mp_digit */
  200497. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  200498. while ((s + 32U) <= (word32)DIGIT_BIT) {
  200499. s += 32U;
  200500. r[j] &= 0xffffffff;
  200501. if (j + 1 >= size) {
  200502. break;
  200503. }
  200504. if (s < (word32)DIGIT_BIT) {
  200505. /* lint allow cast of mismatch word32 and mp_digit */
  200506. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  200507. }
  200508. else {
  200509. r[++j] = (sp_digit)0;
  200510. }
  200511. }
  200512. s = (word32)DIGIT_BIT - s;
  200513. }
  200514. for (j++; j < size; j++) {
  200515. r[j] = 0;
  200516. }
  200517. #else
  200518. unsigned int i;
  200519. int j = 0;
  200520. int s = 0;
  200521. r[0] = 0;
  200522. for (i = 0; i < (unsigned int)a->used && j < size; i++) {
  200523. r[j] |= ((sp_digit)a->dp[i]) << s;
  200524. if (s + DIGIT_BIT >= 32) {
  200525. r[j] &= 0xffffffff;
  200526. if (j + 1 >= size) {
  200527. break;
  200528. }
  200529. s = 32 - s;
  200530. if (s == DIGIT_BIT) {
  200531. r[++j] = 0;
  200532. s = 0;
  200533. }
  200534. else {
  200535. r[++j] = a->dp[i] >> s;
  200536. s = DIGIT_BIT - s;
  200537. }
  200538. }
  200539. else {
  200540. s += DIGIT_BIT;
  200541. }
  200542. }
  200543. for (j++; j < size; j++) {
  200544. r[j] = 0;
  200545. }
  200546. #endif
  200547. }
  200548. /* Convert a point of type ecc_point to type sp_point_1024.
  200549. *
  200550. * p Point of type sp_point_1024 (result).
  200551. * pm Point of type ecc_point.
  200552. */
  200553. static void sp_1024_point_from_ecc_point_32(sp_point_1024* p,
  200554. const ecc_point* pm)
  200555. {
  200556. XMEMSET(p->x, 0, sizeof(p->x));
  200557. XMEMSET(p->y, 0, sizeof(p->y));
  200558. XMEMSET(p->z, 0, sizeof(p->z));
  200559. sp_1024_from_mp(p->x, 32, pm->x);
  200560. sp_1024_from_mp(p->y, 32, pm->y);
  200561. sp_1024_from_mp(p->z, 32, pm->z);
  200562. p->infinity = 0;
  200563. }
  200564. /* Convert an array of sp_digit to an mp_int.
  200565. *
  200566. * a A single precision integer.
  200567. * r A multi-precision integer.
  200568. */
  200569. static int sp_1024_to_mp(const sp_digit* a, mp_int* r)
  200570. {
  200571. int err;
  200572. err = mp_grow(r, (1024 + DIGIT_BIT - 1) / DIGIT_BIT);
  200573. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  200574. #if DIGIT_BIT == 32
  200575. XMEMCPY(r->dp, a, sizeof(sp_digit) * 32);
  200576. r->used = 32;
  200577. mp_clamp(r);
  200578. #elif DIGIT_BIT < 32
  200579. int i;
  200580. int j = 0;
  200581. int s = 0;
  200582. r->dp[0] = 0;
  200583. for (i = 0; i < 32; i++) {
  200584. r->dp[j] |= (mp_digit)(a[i] << s);
  200585. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  200586. s = DIGIT_BIT - s;
  200587. r->dp[++j] = (mp_digit)(a[i] >> s);
  200588. while (s + DIGIT_BIT <= 32) {
  200589. s += DIGIT_BIT;
  200590. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  200591. if (s == SP_WORD_SIZE) {
  200592. r->dp[j] = 0;
  200593. }
  200594. else {
  200595. r->dp[j] = (mp_digit)(a[i] >> s);
  200596. }
  200597. }
  200598. s = 32 - s;
  200599. }
  200600. r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
  200601. mp_clamp(r);
  200602. #else
  200603. int i;
  200604. int j = 0;
  200605. int s = 0;
  200606. r->dp[0] = 0;
  200607. for (i = 0; i < 32; i++) {
  200608. r->dp[j] |= ((mp_digit)a[i]) << s;
  200609. if (s + 32 >= DIGIT_BIT) {
  200610. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  200611. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  200612. #endif
  200613. s = DIGIT_BIT - s;
  200614. r->dp[++j] = a[i] >> s;
  200615. s = 32 - s;
  200616. }
  200617. else {
  200618. s += 32;
  200619. }
  200620. }
  200621. r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
  200622. mp_clamp(r);
  200623. #endif
  200624. }
  200625. return err;
  200626. }
  200627. /* Convert a point of type sp_point_1024 to type ecc_point.
  200628. *
  200629. * p Point of type sp_point_1024.
  200630. * pm Point of type ecc_point (result).
  200631. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  200632. * MP_OKAY.
  200633. */
  200634. static int sp_1024_point_to_ecc_point_32(const sp_point_1024* p, ecc_point* pm)
  200635. {
  200636. int err;
  200637. err = sp_1024_to_mp(p->x, pm->x);
  200638. if (err == MP_OKAY) {
  200639. err = sp_1024_to_mp(p->y, pm->y);
  200640. }
  200641. if (err == MP_OKAY) {
  200642. err = sp_1024_to_mp(p->z, pm->z);
  200643. }
  200644. return err;
  200645. }
  200646. #define sp_1024_mont_reduce_order_32 sp_1024_mont_reduce_32
  200647. /* Reduce the number back to 1024 bits using Montgomery reduction.
  200648. *
  200649. * a A single precision number to reduce in place.
  200650. * m The single precision number representing the modulus.
  200651. * mp The digit representing the negative inverse of m mod 2^n.
  200652. */
  200653. SP_NOINLINE static void sp_1024_mont_reduce_32(sp_digit* a, const sp_digit* m,
  200654. sp_digit mp)
  200655. {
  200656. __asm__ __volatile__ (
  200657. "movs r7, #0\n\t"
  200658. "mov r8, %[mp]\n\t"
  200659. "mov r12, r7\n\t"
  200660. "mov lr, %[m]\n\t"
  200661. "mov r9, %[a]\n\t"
  200662. "mov r11, %[a]\n\t"
  200663. "movs r5, #0x7c\n\t"
  200664. "movs r6, #0x80\n\t"
  200665. "add r9, r9, r5\n\t"
  200666. "add r11, r11, r6\n\t"
  200667. "\n"
  200668. "L_sp_1024_mont_reduce_32_mod_%=:\n\t"
  200669. "movs r7, #0\n\t"
  200670. "movs r4, #0\n\t"
  200671. "# a[i] += m[0] * mu\n\t"
  200672. "ldm %[m]!, {%[mp]}\n\t"
  200673. "ldm %[a]!, {r3}\n\t"
  200674. "# mu = a[i] * mp\n\t"
  200675. "mov r5, r8\n\t"
  200676. #ifdef WOLFSSL_KEIL
  200677. "muls r5, r3, r5\n\t"
  200678. #elif defined(__clang__)
  200679. "muls r5, r3\n\t"
  200680. #else
  200681. "mul r5, r3\n\t"
  200682. #endif
  200683. "mov r10, r5\n\t"
  200684. "# Multiply m[0] and mu - Start\n\t"
  200685. "mov r5, r10\n\t"
  200686. "uxth r6, %[mp]\n\t"
  200687. "uxth r5, r5\n\t"
  200688. #ifdef WOLFSSL_KEIL
  200689. "muls r6, r5, r6\n\t"
  200690. #elif defined(__clang__)
  200691. "muls r6, r5\n\t"
  200692. #else
  200693. "mul r6, r5\n\t"
  200694. #endif
  200695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200696. "adds r3, r3, r6\n\t"
  200697. #else
  200698. "add r3, r3, r6\n\t"
  200699. #endif
  200700. #ifdef WOLFSSL_KEIL
  200701. "adcs r4, r4, r7\n\t"
  200702. #elif defined(__clang__)
  200703. "adcs r4, r7\n\t"
  200704. #else
  200705. "adc r4, r7\n\t"
  200706. #endif
  200707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200708. "lsrs r6, %[mp], #16\n\t"
  200709. #else
  200710. "lsr r6, %[mp], #16\n\t"
  200711. #endif
  200712. #ifdef WOLFSSL_KEIL
  200713. "muls r5, r6, r5\n\t"
  200714. #elif defined(__clang__)
  200715. "muls r5, r6\n\t"
  200716. #else
  200717. "mul r5, r6\n\t"
  200718. #endif
  200719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200720. "lsrs r6, r5, #16\n\t"
  200721. #else
  200722. "lsr r6, r5, #16\n\t"
  200723. #endif
  200724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200725. "lsls r5, r5, #16\n\t"
  200726. #else
  200727. "lsl r5, r5, #16\n\t"
  200728. #endif
  200729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200730. "adds r3, r3, r5\n\t"
  200731. #else
  200732. "add r3, r3, r5\n\t"
  200733. #endif
  200734. #ifdef WOLFSSL_KEIL
  200735. "adcs r4, r4, r6\n\t"
  200736. #elif defined(__clang__)
  200737. "adcs r4, r6\n\t"
  200738. #else
  200739. "adc r4, r6\n\t"
  200740. #endif
  200741. "mov r5, r10\n\t"
  200742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200743. "lsrs r6, %[mp], #16\n\t"
  200744. #else
  200745. "lsr r6, %[mp], #16\n\t"
  200746. #endif
  200747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200748. "lsrs r5, r5, #16\n\t"
  200749. #else
  200750. "lsr r5, r5, #16\n\t"
  200751. #endif
  200752. #ifdef WOLFSSL_KEIL
  200753. "muls r6, r5, r6\n\t"
  200754. #elif defined(__clang__)
  200755. "muls r6, r5\n\t"
  200756. #else
  200757. "mul r6, r5\n\t"
  200758. #endif
  200759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200760. "adds r4, r4, r6\n\t"
  200761. #else
  200762. "add r4, r4, r6\n\t"
  200763. #endif
  200764. "uxth r6, %[mp]\n\t"
  200765. #ifdef WOLFSSL_KEIL
  200766. "muls r5, r6, r5\n\t"
  200767. #elif defined(__clang__)
  200768. "muls r5, r6\n\t"
  200769. #else
  200770. "mul r5, r6\n\t"
  200771. #endif
  200772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200773. "lsrs r6, r5, #16\n\t"
  200774. #else
  200775. "lsr r6, r5, #16\n\t"
  200776. #endif
  200777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200778. "lsls r5, r5, #16\n\t"
  200779. #else
  200780. "lsl r5, r5, #16\n\t"
  200781. #endif
  200782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200783. "adds r3, r3, r5\n\t"
  200784. #else
  200785. "add r3, r3, r5\n\t"
  200786. #endif
  200787. #ifdef WOLFSSL_KEIL
  200788. "adcs r4, r4, r6\n\t"
  200789. #elif defined(__clang__)
  200790. "adcs r4, r6\n\t"
  200791. #else
  200792. "adc r4, r6\n\t"
  200793. #endif
  200794. "# Multiply m[0] and mu - Done\n\t"
  200795. "\n"
  200796. "L_sp_1024_mont_reduce_32_word_%=:\n\t"
  200797. "# a[i+j] += m[j] * mu\n\t"
  200798. "ldr r3, [%[a]]\n\t"
  200799. "ldm %[m]!, {%[mp]}\n\t"
  200800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200801. "adds r3, r3, r4\n\t"
  200802. #else
  200803. "add r3, r3, r4\n\t"
  200804. #endif
  200805. "movs r4, #0\n\t"
  200806. #ifdef WOLFSSL_KEIL
  200807. "adcs r4, r4, r7\n\t"
  200808. #elif defined(__clang__)
  200809. "adcs r4, r7\n\t"
  200810. #else
  200811. "adc r4, r7\n\t"
  200812. #endif
  200813. "# Multiply m[j] and mu - Start\n\t"
  200814. "mov r5, r10\n\t"
  200815. "uxth r6, %[mp]\n\t"
  200816. "uxth r5, r5\n\t"
  200817. #ifdef WOLFSSL_KEIL
  200818. "muls r6, r5, r6\n\t"
  200819. #elif defined(__clang__)
  200820. "muls r6, r5\n\t"
  200821. #else
  200822. "mul r6, r5\n\t"
  200823. #endif
  200824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200825. "adds r3, r3, r6\n\t"
  200826. #else
  200827. "add r3, r3, r6\n\t"
  200828. #endif
  200829. #ifdef WOLFSSL_KEIL
  200830. "adcs r4, r4, r7\n\t"
  200831. #elif defined(__clang__)
  200832. "adcs r4, r7\n\t"
  200833. #else
  200834. "adc r4, r7\n\t"
  200835. #endif
  200836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200837. "lsrs r6, %[mp], #16\n\t"
  200838. #else
  200839. "lsr r6, %[mp], #16\n\t"
  200840. #endif
  200841. #ifdef WOLFSSL_KEIL
  200842. "muls r5, r6, r5\n\t"
  200843. #elif defined(__clang__)
  200844. "muls r5, r6\n\t"
  200845. #else
  200846. "mul r5, r6\n\t"
  200847. #endif
  200848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200849. "lsrs r6, r5, #16\n\t"
  200850. #else
  200851. "lsr r6, r5, #16\n\t"
  200852. #endif
  200853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200854. "lsls r5, r5, #16\n\t"
  200855. #else
  200856. "lsl r5, r5, #16\n\t"
  200857. #endif
  200858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200859. "adds r3, r3, r5\n\t"
  200860. #else
  200861. "add r3, r3, r5\n\t"
  200862. #endif
  200863. #ifdef WOLFSSL_KEIL
  200864. "adcs r4, r4, r6\n\t"
  200865. #elif defined(__clang__)
  200866. "adcs r4, r6\n\t"
  200867. #else
  200868. "adc r4, r6\n\t"
  200869. #endif
  200870. "mov r5, r10\n\t"
  200871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200872. "lsrs r6, %[mp], #16\n\t"
  200873. #else
  200874. "lsr r6, %[mp], #16\n\t"
  200875. #endif
  200876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200877. "lsrs r5, r5, #16\n\t"
  200878. #else
  200879. "lsr r5, r5, #16\n\t"
  200880. #endif
  200881. #ifdef WOLFSSL_KEIL
  200882. "muls r6, r5, r6\n\t"
  200883. #elif defined(__clang__)
  200884. "muls r6, r5\n\t"
  200885. #else
  200886. "mul r6, r5\n\t"
  200887. #endif
  200888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200889. "adds r4, r4, r6\n\t"
  200890. #else
  200891. "add r4, r4, r6\n\t"
  200892. #endif
  200893. "uxth r6, %[mp]\n\t"
  200894. #ifdef WOLFSSL_KEIL
  200895. "muls r5, r6, r5\n\t"
  200896. #elif defined(__clang__)
  200897. "muls r5, r6\n\t"
  200898. #else
  200899. "mul r5, r6\n\t"
  200900. #endif
  200901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200902. "lsrs r6, r5, #16\n\t"
  200903. #else
  200904. "lsr r6, r5, #16\n\t"
  200905. #endif
  200906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200907. "lsls r5, r5, #16\n\t"
  200908. #else
  200909. "lsl r5, r5, #16\n\t"
  200910. #endif
  200911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200912. "adds r3, r3, r5\n\t"
  200913. #else
  200914. "add r3, r3, r5\n\t"
  200915. #endif
  200916. #ifdef WOLFSSL_KEIL
  200917. "adcs r4, r4, r6\n\t"
  200918. #elif defined(__clang__)
  200919. "adcs r4, r6\n\t"
  200920. #else
  200921. "adc r4, r6\n\t"
  200922. #endif
  200923. "# Multiply m[j] and mu - Done\n\t"
  200924. "stm %[a]!, {r3}\n\t"
  200925. "cmp %[a], r9\n\t"
  200926. "blt L_sp_1024_mont_reduce_32_word_%=\n\t"
  200927. "# a[i+31] += m[31] * mu\n\t"
  200928. "ldr %[mp], [%[m]]\n\t"
  200929. "mov r3, r12\n\t"
  200930. "# Multiply m[31] and mu - Start\n\t"
  200931. "mov r5, r10\n\t"
  200932. "uxth r6, %[mp]\n\t"
  200933. "uxth r5, r5\n\t"
  200934. #ifdef WOLFSSL_KEIL
  200935. "muls r6, r5, r6\n\t"
  200936. #elif defined(__clang__)
  200937. "muls r6, r5\n\t"
  200938. #else
  200939. "mul r6, r5\n\t"
  200940. #endif
  200941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200942. "adds r4, r4, r6\n\t"
  200943. #else
  200944. "add r4, r4, r6\n\t"
  200945. #endif
  200946. #ifdef WOLFSSL_KEIL
  200947. "adcs r3, r3, r7\n\t"
  200948. #elif defined(__clang__)
  200949. "adcs r3, r7\n\t"
  200950. #else
  200951. "adc r3, r7\n\t"
  200952. #endif
  200953. #ifdef WOLFSSL_KEIL
  200954. "adcs r7, r7, r7\n\t"
  200955. #elif defined(__clang__)
  200956. "adcs r7, r7\n\t"
  200957. #else
  200958. "adc r7, r7\n\t"
  200959. #endif
  200960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200961. "lsrs r6, %[mp], #16\n\t"
  200962. #else
  200963. "lsr r6, %[mp], #16\n\t"
  200964. #endif
  200965. #ifdef WOLFSSL_KEIL
  200966. "muls r5, r6, r5\n\t"
  200967. #elif defined(__clang__)
  200968. "muls r5, r6\n\t"
  200969. #else
  200970. "mul r5, r6\n\t"
  200971. #endif
  200972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200973. "lsrs r6, r5, #16\n\t"
  200974. #else
  200975. "lsr r6, r5, #16\n\t"
  200976. #endif
  200977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200978. "lsls r5, r5, #16\n\t"
  200979. #else
  200980. "lsl r5, r5, #16\n\t"
  200981. #endif
  200982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200983. "adds r4, r4, r5\n\t"
  200984. #else
  200985. "add r4, r4, r5\n\t"
  200986. #endif
  200987. #ifdef WOLFSSL_KEIL
  200988. "adcs r3, r3, r6\n\t"
  200989. #elif defined(__clang__)
  200990. "adcs r3, r6\n\t"
  200991. #else
  200992. "adc r3, r6\n\t"
  200993. #endif
  200994. #ifdef WOLFSSL_KEIL
  200995. "adcs r7, r7, r7\n\t"
  200996. #elif defined(__clang__)
  200997. "adcs r7, r7\n\t"
  200998. #else
  200999. "adc r7, r7\n\t"
  201000. #endif
  201001. "mov r5, r10\n\t"
  201002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201003. "lsrs r6, %[mp], #16\n\t"
  201004. #else
  201005. "lsr r6, %[mp], #16\n\t"
  201006. #endif
  201007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201008. "lsrs r5, r5, #16\n\t"
  201009. #else
  201010. "lsr r5, r5, #16\n\t"
  201011. #endif
  201012. #ifdef WOLFSSL_KEIL
  201013. "muls r6, r5, r6\n\t"
  201014. #elif defined(__clang__)
  201015. "muls r6, r5\n\t"
  201016. #else
  201017. "mul r6, r5\n\t"
  201018. #endif
  201019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201020. "adds r3, r3, r6\n\t"
  201021. #else
  201022. "add r3, r3, r6\n\t"
  201023. #endif
  201024. #ifdef WOLFSSL_KEIL
  201025. "adcs r7, r7, r7\n\t"
  201026. #elif defined(__clang__)
  201027. "adcs r7, r7\n\t"
  201028. #else
  201029. "adc r7, r7\n\t"
  201030. #endif
  201031. "uxth r6, %[mp]\n\t"
  201032. #ifdef WOLFSSL_KEIL
  201033. "muls r5, r6, r5\n\t"
  201034. #elif defined(__clang__)
  201035. "muls r5, r6\n\t"
  201036. #else
  201037. "mul r5, r6\n\t"
  201038. #endif
  201039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201040. "lsrs r6, r5, #16\n\t"
  201041. #else
  201042. "lsr r6, r5, #16\n\t"
  201043. #endif
  201044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201045. "lsls r5, r5, #16\n\t"
  201046. #else
  201047. "lsl r5, r5, #16\n\t"
  201048. #endif
  201049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201050. "adds r4, r4, r5\n\t"
  201051. #else
  201052. "add r4, r4, r5\n\t"
  201053. #endif
  201054. #ifdef WOLFSSL_KEIL
  201055. "adcs r3, r3, r6\n\t"
  201056. #elif defined(__clang__)
  201057. "adcs r3, r6\n\t"
  201058. #else
  201059. "adc r3, r6\n\t"
  201060. #endif
  201061. #ifdef WOLFSSL_KEIL
  201062. "adcs r7, r7, r7\n\t"
  201063. #elif defined(__clang__)
  201064. "adcs r7, r7\n\t"
  201065. #else
  201066. "adc r7, r7\n\t"
  201067. #endif
  201068. "# Multiply m[31] and mu - Done\n\t"
  201069. "ldr r5, [%[a]]\n\t"
  201070. "ldr r6, [%[a], #4]\n\t"
  201071. "movs %[mp], #0\n\t"
  201072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201073. "adds r5, r5, r4\n\t"
  201074. #else
  201075. "add r5, r5, r4\n\t"
  201076. #endif
  201077. #ifdef WOLFSSL_KEIL
  201078. "adcs r6, r6, r3\n\t"
  201079. #elif defined(__clang__)
  201080. "adcs r6, r3\n\t"
  201081. #else
  201082. "adc r6, r3\n\t"
  201083. #endif
  201084. #ifdef WOLFSSL_KEIL
  201085. "adcs r7, r7, %[mp]\n\t"
  201086. #elif defined(__clang__)
  201087. "adcs r7, %[mp]\n\t"
  201088. #else
  201089. "adc r7, %[mp]\n\t"
  201090. #endif
  201091. "stm %[a]!, {r5, r6}\n\t"
  201092. "# i += 1\n\t"
  201093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201094. "subs %[a], %[a], #4\n\t"
  201095. #else
  201096. "sub %[a], %[a], #4\n\t"
  201097. #endif
  201098. "movs r3, #0x7c\n\t"
  201099. "mov r9, %[a]\n\t"
  201100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201101. "subs %[a], %[a], r3\n\t"
  201102. #else
  201103. "sub %[a], %[a], r3\n\t"
  201104. #endif
  201105. "mov r12, r7\n\t"
  201106. "mov %[m], lr\n\t"
  201107. "cmp r11, %[a]\n\t"
  201108. "bgt L_sp_1024_mont_reduce_32_mod_%=\n\t"
  201109. "ldr r5, [%[m], #124]\n\t"
  201110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201111. "negs r7, r7\n\t"
  201112. #else
  201113. "neg r7, r7\n\t"
  201114. #endif
  201115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201116. "subs r5, r5, r6\n\t"
  201117. #else
  201118. "sub r5, r5, r6\n\t"
  201119. #endif
  201120. #ifdef WOLFSSL_KEIL
  201121. "sbcs r5, r5, r5\n\t"
  201122. #elif defined(__clang__)
  201123. "sbcs r5, r5\n\t"
  201124. #else
  201125. "sbc r5, r5\n\t"
  201126. #endif
  201127. #ifdef WOLFSSL_KEIL
  201128. "orrs r7, r7, r5\n\t"
  201129. #elif defined(__clang__)
  201130. "orrs r7, r5\n\t"
  201131. #else
  201132. "orr r7, r5\n\t"
  201133. #endif
  201134. "# Subtract masked modulus\n\t"
  201135. "movs r4, #0x80\n\t"
  201136. "movs %[mp], #0\n\t"
  201137. "movs r3, #0\n\t"
  201138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201139. "subs %[a], %[a], r4\n\t"
  201140. #else
  201141. "sub %[a], %[a], r4\n\t"
  201142. #endif
  201143. #ifndef WOLFSSL_SP_LARGE_CODE
  201144. "\n"
  201145. "L_sp_1024_mont_reduce_32_sub_mask_%=:\n\t"
  201146. "ldm %[m]!, {r6}\n\t"
  201147. "movs r5, #0\n\t"
  201148. #ifdef WOLFSSL_KEIL
  201149. "ands r6, r6, r7\n\t"
  201150. #elif defined(__clang__)
  201151. "ands r6, r7\n\t"
  201152. #else
  201153. "and r6, r7\n\t"
  201154. #endif
  201155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201156. "subs r5, r5, %[mp]\n\t"
  201157. #else
  201158. "sub r5, r5, %[mp]\n\t"
  201159. #endif
  201160. "ldr r5, [%[a], r4]\n\t"
  201161. #ifdef WOLFSSL_KEIL
  201162. "sbcs r5, r5, r6\n\t"
  201163. #elif defined(__clang__)
  201164. "sbcs r5, r6\n\t"
  201165. #else
  201166. "sbc r5, r6\n\t"
  201167. #endif
  201168. #ifdef WOLFSSL_KEIL
  201169. "sbcs %[mp], %[mp], %[mp]\n\t"
  201170. #elif defined(__clang__)
  201171. "sbcs %[mp], %[mp]\n\t"
  201172. #else
  201173. "sbc %[mp], %[mp]\n\t"
  201174. #endif
  201175. "stm %[a]!, {r5}\n\t"
  201176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201177. "adds r3, r3, #4\n\t"
  201178. #else
  201179. "add r3, r3, #4\n\t"
  201180. #endif
  201181. "cmp r3, r4\n\t"
  201182. "blt L_sp_1024_mont_reduce_32_sub_mask_%=\n\t"
  201183. #else /* WOLFSSL_SP_LARGE_CODE */
  201184. "ldm %[m]!, {r6}\n\t"
  201185. #ifdef WOLFSSL_KEIL
  201186. "ands r6, r6, r7\n\t"
  201187. #elif defined(__clang__)
  201188. "ands r6, r7\n\t"
  201189. #else
  201190. "and r6, r7\n\t"
  201191. #endif
  201192. "ldr r5, [%[a], r4]\n\t"
  201193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201194. "subs r5, r5, r6\n\t"
  201195. #else
  201196. "sub r5, r5, r6\n\t"
  201197. #endif
  201198. "stm %[a]!, {r5}\n\t"
  201199. "ldm %[m]!, {r6}\n\t"
  201200. #ifdef WOLFSSL_KEIL
  201201. "ands r6, r6, r7\n\t"
  201202. #elif defined(__clang__)
  201203. "ands r6, r7\n\t"
  201204. #else
  201205. "and r6, r7\n\t"
  201206. #endif
  201207. "ldr r5, [%[a], r4]\n\t"
  201208. #ifdef WOLFSSL_KEIL
  201209. "sbcs r5, r5, r6\n\t"
  201210. #elif defined(__clang__)
  201211. "sbcs r5, r6\n\t"
  201212. #else
  201213. "sbc r5, r6\n\t"
  201214. #endif
  201215. "stm %[a]!, {r5}\n\t"
  201216. "ldm %[m]!, {r6}\n\t"
  201217. #ifdef WOLFSSL_KEIL
  201218. "ands r6, r6, r7\n\t"
  201219. #elif defined(__clang__)
  201220. "ands r6, r7\n\t"
  201221. #else
  201222. "and r6, r7\n\t"
  201223. #endif
  201224. "ldr r5, [%[a], r4]\n\t"
  201225. #ifdef WOLFSSL_KEIL
  201226. "sbcs r5, r5, r6\n\t"
  201227. #elif defined(__clang__)
  201228. "sbcs r5, r6\n\t"
  201229. #else
  201230. "sbc r5, r6\n\t"
  201231. #endif
  201232. "stm %[a]!, {r5}\n\t"
  201233. "ldm %[m]!, {r6}\n\t"
  201234. #ifdef WOLFSSL_KEIL
  201235. "ands r6, r6, r7\n\t"
  201236. #elif defined(__clang__)
  201237. "ands r6, r7\n\t"
  201238. #else
  201239. "and r6, r7\n\t"
  201240. #endif
  201241. "ldr r5, [%[a], r4]\n\t"
  201242. #ifdef WOLFSSL_KEIL
  201243. "sbcs r5, r5, r6\n\t"
  201244. #elif defined(__clang__)
  201245. "sbcs r5, r6\n\t"
  201246. #else
  201247. "sbc r5, r6\n\t"
  201248. #endif
  201249. "stm %[a]!, {r5}\n\t"
  201250. "ldm %[m]!, {r6}\n\t"
  201251. #ifdef WOLFSSL_KEIL
  201252. "ands r6, r6, r7\n\t"
  201253. #elif defined(__clang__)
  201254. "ands r6, r7\n\t"
  201255. #else
  201256. "and r6, r7\n\t"
  201257. #endif
  201258. "ldr r5, [%[a], r4]\n\t"
  201259. #ifdef WOLFSSL_KEIL
  201260. "sbcs r5, r5, r6\n\t"
  201261. #elif defined(__clang__)
  201262. "sbcs r5, r6\n\t"
  201263. #else
  201264. "sbc r5, r6\n\t"
  201265. #endif
  201266. "stm %[a]!, {r5}\n\t"
  201267. "ldm %[m]!, {r6}\n\t"
  201268. #ifdef WOLFSSL_KEIL
  201269. "ands r6, r6, r7\n\t"
  201270. #elif defined(__clang__)
  201271. "ands r6, r7\n\t"
  201272. #else
  201273. "and r6, r7\n\t"
  201274. #endif
  201275. "ldr r5, [%[a], r4]\n\t"
  201276. #ifdef WOLFSSL_KEIL
  201277. "sbcs r5, r5, r6\n\t"
  201278. #elif defined(__clang__)
  201279. "sbcs r5, r6\n\t"
  201280. #else
  201281. "sbc r5, r6\n\t"
  201282. #endif
  201283. "stm %[a]!, {r5}\n\t"
  201284. "ldm %[m]!, {r6}\n\t"
  201285. #ifdef WOLFSSL_KEIL
  201286. "ands r6, r6, r7\n\t"
  201287. #elif defined(__clang__)
  201288. "ands r6, r7\n\t"
  201289. #else
  201290. "and r6, r7\n\t"
  201291. #endif
  201292. "ldr r5, [%[a], r4]\n\t"
  201293. #ifdef WOLFSSL_KEIL
  201294. "sbcs r5, r5, r6\n\t"
  201295. #elif defined(__clang__)
  201296. "sbcs r5, r6\n\t"
  201297. #else
  201298. "sbc r5, r6\n\t"
  201299. #endif
  201300. "stm %[a]!, {r5}\n\t"
  201301. "ldm %[m]!, {r6}\n\t"
  201302. #ifdef WOLFSSL_KEIL
  201303. "ands r6, r6, r7\n\t"
  201304. #elif defined(__clang__)
  201305. "ands r6, r7\n\t"
  201306. #else
  201307. "and r6, r7\n\t"
  201308. #endif
  201309. "ldr r5, [%[a], r4]\n\t"
  201310. #ifdef WOLFSSL_KEIL
  201311. "sbcs r5, r5, r6\n\t"
  201312. #elif defined(__clang__)
  201313. "sbcs r5, r6\n\t"
  201314. #else
  201315. "sbc r5, r6\n\t"
  201316. #endif
  201317. "stm %[a]!, {r5}\n\t"
  201318. "ldm %[m]!, {r6}\n\t"
  201319. #ifdef WOLFSSL_KEIL
  201320. "ands r6, r6, r7\n\t"
  201321. #elif defined(__clang__)
  201322. "ands r6, r7\n\t"
  201323. #else
  201324. "and r6, r7\n\t"
  201325. #endif
  201326. "ldr r5, [%[a], r4]\n\t"
  201327. #ifdef WOLFSSL_KEIL
  201328. "sbcs r5, r5, r6\n\t"
  201329. #elif defined(__clang__)
  201330. "sbcs r5, r6\n\t"
  201331. #else
  201332. "sbc r5, r6\n\t"
  201333. #endif
  201334. "stm %[a]!, {r5}\n\t"
  201335. "ldm %[m]!, {r6}\n\t"
  201336. #ifdef WOLFSSL_KEIL
  201337. "ands r6, r6, r7\n\t"
  201338. #elif defined(__clang__)
  201339. "ands r6, r7\n\t"
  201340. #else
  201341. "and r6, r7\n\t"
  201342. #endif
  201343. "ldr r5, [%[a], r4]\n\t"
  201344. #ifdef WOLFSSL_KEIL
  201345. "sbcs r5, r5, r6\n\t"
  201346. #elif defined(__clang__)
  201347. "sbcs r5, r6\n\t"
  201348. #else
  201349. "sbc r5, r6\n\t"
  201350. #endif
  201351. "stm %[a]!, {r5}\n\t"
  201352. "ldm %[m]!, {r6}\n\t"
  201353. #ifdef WOLFSSL_KEIL
  201354. "ands r6, r6, r7\n\t"
  201355. #elif defined(__clang__)
  201356. "ands r6, r7\n\t"
  201357. #else
  201358. "and r6, r7\n\t"
  201359. #endif
  201360. "ldr r5, [%[a], r4]\n\t"
  201361. #ifdef WOLFSSL_KEIL
  201362. "sbcs r5, r5, r6\n\t"
  201363. #elif defined(__clang__)
  201364. "sbcs r5, r6\n\t"
  201365. #else
  201366. "sbc r5, r6\n\t"
  201367. #endif
  201368. "stm %[a]!, {r5}\n\t"
  201369. "ldm %[m]!, {r6}\n\t"
  201370. #ifdef WOLFSSL_KEIL
  201371. "ands r6, r6, r7\n\t"
  201372. #elif defined(__clang__)
  201373. "ands r6, r7\n\t"
  201374. #else
  201375. "and r6, r7\n\t"
  201376. #endif
  201377. "ldr r5, [%[a], r4]\n\t"
  201378. #ifdef WOLFSSL_KEIL
  201379. "sbcs r5, r5, r6\n\t"
  201380. #elif defined(__clang__)
  201381. "sbcs r5, r6\n\t"
  201382. #else
  201383. "sbc r5, r6\n\t"
  201384. #endif
  201385. "stm %[a]!, {r5}\n\t"
  201386. "ldm %[m]!, {r6}\n\t"
  201387. #ifdef WOLFSSL_KEIL
  201388. "ands r6, r6, r7\n\t"
  201389. #elif defined(__clang__)
  201390. "ands r6, r7\n\t"
  201391. #else
  201392. "and r6, r7\n\t"
  201393. #endif
  201394. "ldr r5, [%[a], r4]\n\t"
  201395. #ifdef WOLFSSL_KEIL
  201396. "sbcs r5, r5, r6\n\t"
  201397. #elif defined(__clang__)
  201398. "sbcs r5, r6\n\t"
  201399. #else
  201400. "sbc r5, r6\n\t"
  201401. #endif
  201402. "stm %[a]!, {r5}\n\t"
  201403. "ldm %[m]!, {r6}\n\t"
  201404. #ifdef WOLFSSL_KEIL
  201405. "ands r6, r6, r7\n\t"
  201406. #elif defined(__clang__)
  201407. "ands r6, r7\n\t"
  201408. #else
  201409. "and r6, r7\n\t"
  201410. #endif
  201411. "ldr r5, [%[a], r4]\n\t"
  201412. #ifdef WOLFSSL_KEIL
  201413. "sbcs r5, r5, r6\n\t"
  201414. #elif defined(__clang__)
  201415. "sbcs r5, r6\n\t"
  201416. #else
  201417. "sbc r5, r6\n\t"
  201418. #endif
  201419. "stm %[a]!, {r5}\n\t"
  201420. "ldm %[m]!, {r6}\n\t"
  201421. #ifdef WOLFSSL_KEIL
  201422. "ands r6, r6, r7\n\t"
  201423. #elif defined(__clang__)
  201424. "ands r6, r7\n\t"
  201425. #else
  201426. "and r6, r7\n\t"
  201427. #endif
  201428. "ldr r5, [%[a], r4]\n\t"
  201429. #ifdef WOLFSSL_KEIL
  201430. "sbcs r5, r5, r6\n\t"
  201431. #elif defined(__clang__)
  201432. "sbcs r5, r6\n\t"
  201433. #else
  201434. "sbc r5, r6\n\t"
  201435. #endif
  201436. "stm %[a]!, {r5}\n\t"
  201437. "ldm %[m]!, {r6}\n\t"
  201438. #ifdef WOLFSSL_KEIL
  201439. "ands r6, r6, r7\n\t"
  201440. #elif defined(__clang__)
  201441. "ands r6, r7\n\t"
  201442. #else
  201443. "and r6, r7\n\t"
  201444. #endif
  201445. "ldr r5, [%[a], r4]\n\t"
  201446. #ifdef WOLFSSL_KEIL
  201447. "sbcs r5, r5, r6\n\t"
  201448. #elif defined(__clang__)
  201449. "sbcs r5, r6\n\t"
  201450. #else
  201451. "sbc r5, r6\n\t"
  201452. #endif
  201453. "stm %[a]!, {r5}\n\t"
  201454. "ldm %[m]!, {r6}\n\t"
  201455. #ifdef WOLFSSL_KEIL
  201456. "ands r6, r6, r7\n\t"
  201457. #elif defined(__clang__)
  201458. "ands r6, r7\n\t"
  201459. #else
  201460. "and r6, r7\n\t"
  201461. #endif
  201462. "ldr r5, [%[a], r4]\n\t"
  201463. #ifdef WOLFSSL_KEIL
  201464. "sbcs r5, r5, r6\n\t"
  201465. #elif defined(__clang__)
  201466. "sbcs r5, r6\n\t"
  201467. #else
  201468. "sbc r5, r6\n\t"
  201469. #endif
  201470. "stm %[a]!, {r5}\n\t"
  201471. "ldm %[m]!, {r6}\n\t"
  201472. #ifdef WOLFSSL_KEIL
  201473. "ands r6, r6, r7\n\t"
  201474. #elif defined(__clang__)
  201475. "ands r6, r7\n\t"
  201476. #else
  201477. "and r6, r7\n\t"
  201478. #endif
  201479. "ldr r5, [%[a], r4]\n\t"
  201480. #ifdef WOLFSSL_KEIL
  201481. "sbcs r5, r5, r6\n\t"
  201482. #elif defined(__clang__)
  201483. "sbcs r5, r6\n\t"
  201484. #else
  201485. "sbc r5, r6\n\t"
  201486. #endif
  201487. "stm %[a]!, {r5}\n\t"
  201488. "ldm %[m]!, {r6}\n\t"
  201489. #ifdef WOLFSSL_KEIL
  201490. "ands r6, r6, r7\n\t"
  201491. #elif defined(__clang__)
  201492. "ands r6, r7\n\t"
  201493. #else
  201494. "and r6, r7\n\t"
  201495. #endif
  201496. "ldr r5, [%[a], r4]\n\t"
  201497. #ifdef WOLFSSL_KEIL
  201498. "sbcs r5, r5, r6\n\t"
  201499. #elif defined(__clang__)
  201500. "sbcs r5, r6\n\t"
  201501. #else
  201502. "sbc r5, r6\n\t"
  201503. #endif
  201504. "stm %[a]!, {r5}\n\t"
  201505. "ldm %[m]!, {r6}\n\t"
  201506. #ifdef WOLFSSL_KEIL
  201507. "ands r6, r6, r7\n\t"
  201508. #elif defined(__clang__)
  201509. "ands r6, r7\n\t"
  201510. #else
  201511. "and r6, r7\n\t"
  201512. #endif
  201513. "ldr r5, [%[a], r4]\n\t"
  201514. #ifdef WOLFSSL_KEIL
  201515. "sbcs r5, r5, r6\n\t"
  201516. #elif defined(__clang__)
  201517. "sbcs r5, r6\n\t"
  201518. #else
  201519. "sbc r5, r6\n\t"
  201520. #endif
  201521. "stm %[a]!, {r5}\n\t"
  201522. "ldm %[m]!, {r6}\n\t"
  201523. #ifdef WOLFSSL_KEIL
  201524. "ands r6, r6, r7\n\t"
  201525. #elif defined(__clang__)
  201526. "ands r6, r7\n\t"
  201527. #else
  201528. "and r6, r7\n\t"
  201529. #endif
  201530. "ldr r5, [%[a], r4]\n\t"
  201531. #ifdef WOLFSSL_KEIL
  201532. "sbcs r5, r5, r6\n\t"
  201533. #elif defined(__clang__)
  201534. "sbcs r5, r6\n\t"
  201535. #else
  201536. "sbc r5, r6\n\t"
  201537. #endif
  201538. "stm %[a]!, {r5}\n\t"
  201539. "ldm %[m]!, {r6}\n\t"
  201540. #ifdef WOLFSSL_KEIL
  201541. "ands r6, r6, r7\n\t"
  201542. #elif defined(__clang__)
  201543. "ands r6, r7\n\t"
  201544. #else
  201545. "and r6, r7\n\t"
  201546. #endif
  201547. "ldr r5, [%[a], r4]\n\t"
  201548. #ifdef WOLFSSL_KEIL
  201549. "sbcs r5, r5, r6\n\t"
  201550. #elif defined(__clang__)
  201551. "sbcs r5, r6\n\t"
  201552. #else
  201553. "sbc r5, r6\n\t"
  201554. #endif
  201555. "stm %[a]!, {r5}\n\t"
  201556. "ldm %[m]!, {r6}\n\t"
  201557. #ifdef WOLFSSL_KEIL
  201558. "ands r6, r6, r7\n\t"
  201559. #elif defined(__clang__)
  201560. "ands r6, r7\n\t"
  201561. #else
  201562. "and r6, r7\n\t"
  201563. #endif
  201564. "ldr r5, [%[a], r4]\n\t"
  201565. #ifdef WOLFSSL_KEIL
  201566. "sbcs r5, r5, r6\n\t"
  201567. #elif defined(__clang__)
  201568. "sbcs r5, r6\n\t"
  201569. #else
  201570. "sbc r5, r6\n\t"
  201571. #endif
  201572. "stm %[a]!, {r5}\n\t"
  201573. "ldm %[m]!, {r6}\n\t"
  201574. #ifdef WOLFSSL_KEIL
  201575. "ands r6, r6, r7\n\t"
  201576. #elif defined(__clang__)
  201577. "ands r6, r7\n\t"
  201578. #else
  201579. "and r6, r7\n\t"
  201580. #endif
  201581. "ldr r5, [%[a], r4]\n\t"
  201582. #ifdef WOLFSSL_KEIL
  201583. "sbcs r5, r5, r6\n\t"
  201584. #elif defined(__clang__)
  201585. "sbcs r5, r6\n\t"
  201586. #else
  201587. "sbc r5, r6\n\t"
  201588. #endif
  201589. "stm %[a]!, {r5}\n\t"
  201590. "ldm %[m]!, {r6}\n\t"
  201591. #ifdef WOLFSSL_KEIL
  201592. "ands r6, r6, r7\n\t"
  201593. #elif defined(__clang__)
  201594. "ands r6, r7\n\t"
  201595. #else
  201596. "and r6, r7\n\t"
  201597. #endif
  201598. "ldr r5, [%[a], r4]\n\t"
  201599. #ifdef WOLFSSL_KEIL
  201600. "sbcs r5, r5, r6\n\t"
  201601. #elif defined(__clang__)
  201602. "sbcs r5, r6\n\t"
  201603. #else
  201604. "sbc r5, r6\n\t"
  201605. #endif
  201606. "stm %[a]!, {r5}\n\t"
  201607. "ldm %[m]!, {r6}\n\t"
  201608. #ifdef WOLFSSL_KEIL
  201609. "ands r6, r6, r7\n\t"
  201610. #elif defined(__clang__)
  201611. "ands r6, r7\n\t"
  201612. #else
  201613. "and r6, r7\n\t"
  201614. #endif
  201615. "ldr r5, [%[a], r4]\n\t"
  201616. #ifdef WOLFSSL_KEIL
  201617. "sbcs r5, r5, r6\n\t"
  201618. #elif defined(__clang__)
  201619. "sbcs r5, r6\n\t"
  201620. #else
  201621. "sbc r5, r6\n\t"
  201622. #endif
  201623. "stm %[a]!, {r5}\n\t"
  201624. "ldm %[m]!, {r6}\n\t"
  201625. #ifdef WOLFSSL_KEIL
  201626. "ands r6, r6, r7\n\t"
  201627. #elif defined(__clang__)
  201628. "ands r6, r7\n\t"
  201629. #else
  201630. "and r6, r7\n\t"
  201631. #endif
  201632. "ldr r5, [%[a], r4]\n\t"
  201633. #ifdef WOLFSSL_KEIL
  201634. "sbcs r5, r5, r6\n\t"
  201635. #elif defined(__clang__)
  201636. "sbcs r5, r6\n\t"
  201637. #else
  201638. "sbc r5, r6\n\t"
  201639. #endif
  201640. "stm %[a]!, {r5}\n\t"
  201641. "ldm %[m]!, {r6}\n\t"
  201642. #ifdef WOLFSSL_KEIL
  201643. "ands r6, r6, r7\n\t"
  201644. #elif defined(__clang__)
  201645. "ands r6, r7\n\t"
  201646. #else
  201647. "and r6, r7\n\t"
  201648. #endif
  201649. "ldr r5, [%[a], r4]\n\t"
  201650. #ifdef WOLFSSL_KEIL
  201651. "sbcs r5, r5, r6\n\t"
  201652. #elif defined(__clang__)
  201653. "sbcs r5, r6\n\t"
  201654. #else
  201655. "sbc r5, r6\n\t"
  201656. #endif
  201657. "stm %[a]!, {r5}\n\t"
  201658. "ldm %[m]!, {r6}\n\t"
  201659. #ifdef WOLFSSL_KEIL
  201660. "ands r6, r6, r7\n\t"
  201661. #elif defined(__clang__)
  201662. "ands r6, r7\n\t"
  201663. #else
  201664. "and r6, r7\n\t"
  201665. #endif
  201666. "ldr r5, [%[a], r4]\n\t"
  201667. #ifdef WOLFSSL_KEIL
  201668. "sbcs r5, r5, r6\n\t"
  201669. #elif defined(__clang__)
  201670. "sbcs r5, r6\n\t"
  201671. #else
  201672. "sbc r5, r6\n\t"
  201673. #endif
  201674. "stm %[a]!, {r5}\n\t"
  201675. "ldm %[m]!, {r6}\n\t"
  201676. #ifdef WOLFSSL_KEIL
  201677. "ands r6, r6, r7\n\t"
  201678. #elif defined(__clang__)
  201679. "ands r6, r7\n\t"
  201680. #else
  201681. "and r6, r7\n\t"
  201682. #endif
  201683. "ldr r5, [%[a], r4]\n\t"
  201684. #ifdef WOLFSSL_KEIL
  201685. "sbcs r5, r5, r6\n\t"
  201686. #elif defined(__clang__)
  201687. "sbcs r5, r6\n\t"
  201688. #else
  201689. "sbc r5, r6\n\t"
  201690. #endif
  201691. "stm %[a]!, {r5}\n\t"
  201692. "ldm %[m]!, {r6}\n\t"
  201693. #ifdef WOLFSSL_KEIL
  201694. "ands r6, r6, r7\n\t"
  201695. #elif defined(__clang__)
  201696. "ands r6, r7\n\t"
  201697. #else
  201698. "and r6, r7\n\t"
  201699. #endif
  201700. "ldr r5, [%[a], r4]\n\t"
  201701. #ifdef WOLFSSL_KEIL
  201702. "sbcs r5, r5, r6\n\t"
  201703. #elif defined(__clang__)
  201704. "sbcs r5, r6\n\t"
  201705. #else
  201706. "sbc r5, r6\n\t"
  201707. #endif
  201708. "stm %[a]!, {r5}\n\t"
  201709. "ldm %[m]!, {r6}\n\t"
  201710. #ifdef WOLFSSL_KEIL
  201711. "ands r6, r6, r7\n\t"
  201712. #elif defined(__clang__)
  201713. "ands r6, r7\n\t"
  201714. #else
  201715. "and r6, r7\n\t"
  201716. #endif
  201717. "ldr r5, [%[a], r4]\n\t"
  201718. #ifdef WOLFSSL_KEIL
  201719. "sbcs r5, r5, r6\n\t"
  201720. #elif defined(__clang__)
  201721. "sbcs r5, r6\n\t"
  201722. #else
  201723. "sbc r5, r6\n\t"
  201724. #endif
  201725. "stm %[a]!, {r5}\n\t"
  201726. #endif /* WOLFSSL_SP_LARGE_CODE */
  201727. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  201728. :
  201729. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  201730. );
  201731. }
  201732. /* Multiply two Montgomery form numbers mod the modulus (prime).
  201733. * (r = a * b mod m)
  201734. *
  201735. * r Result of multiplication.
  201736. * a First number to multiply in Montgomery form.
  201737. * b Second number to multiply in Montgomery form.
  201738. * m Modulus (prime).
  201739. * mp Montgomery multiplier.
  201740. */
  201741. SP_NOINLINE static void sp_1024_mont_mul_32(sp_digit* r, const sp_digit* a,
  201742. const sp_digit* b, const sp_digit* m, sp_digit mp)
  201743. {
  201744. sp_1024_mul_32(r, a, b);
  201745. sp_1024_mont_reduce_32(r, m, mp);
  201746. }
  201747. /* Square the Montgomery form number. (r = a * a mod m)
  201748. *
  201749. * r Result of squaring.
  201750. * a Number to square in Montgomery form.
  201751. * m Modulus (prime).
  201752. * mp Montgomery multiplier.
  201753. */
  201754. SP_NOINLINE static void sp_1024_mont_sqr_32(sp_digit* r, const sp_digit* a,
  201755. const sp_digit* m, sp_digit mp)
  201756. {
  201757. sp_1024_sqr_32(r, a);
  201758. sp_1024_mont_reduce_32(r, m, mp);
  201759. }
  201760. /* Mod-2 for the P1024 curve. */
  201761. static const uint8_t p1024_mod_minus_2[] = {
  201762. 6,0x06, 7,0x0f, 7,0x0b, 6,0x0c, 7,0x1e, 9,0x09, 7,0x0c, 7,0x1f,
  201763. 6,0x16, 6,0x06, 7,0x0e, 8,0x10, 6,0x03, 8,0x11, 6,0x0d, 7,0x14,
  201764. 9,0x12, 6,0x0f, 7,0x04, 9,0x0d, 6,0x00, 7,0x13, 6,0x01, 6,0x07,
  201765. 8,0x0d, 8,0x00, 6,0x06, 9,0x17, 6,0x14, 6,0x15, 6,0x11, 6,0x0b,
  201766. 9,0x0c, 6,0x1e, 13,0x14, 7,0x0e, 6,0x1d, 12,0x0a, 6,0x0b, 8,0x07,
  201767. 6,0x18, 6,0x0f, 6,0x10, 8,0x1c, 7,0x16, 7,0x02, 6,0x01, 6,0x13,
  201768. 10,0x15, 7,0x06, 8,0x14, 6,0x0c, 6,0x19, 7,0x10, 6,0x19, 6,0x19,
  201769. 9,0x16, 7,0x19, 6,0x1f, 6,0x17, 6,0x12, 8,0x02, 6,0x01, 6,0x04,
  201770. 6,0x15, 7,0x16, 6,0x04, 6,0x1f, 6,0x09, 7,0x06, 7,0x13, 7,0x09,
  201771. 6,0x0d, 10,0x18, 6,0x06, 6,0x11, 6,0x04, 6,0x01, 6,0x13, 8,0x06,
  201772. 6,0x0d, 8,0x13, 7,0x08, 6,0x08, 6,0x05, 7,0x0c, 7,0x0e, 7,0x15,
  201773. 6,0x05, 7,0x14, 10,0x19, 6,0x10, 6,0x16, 6,0x15, 7,0x1f, 6,0x14,
  201774. 6,0x0a, 10,0x11, 6,0x01, 7,0x05, 7,0x08, 8,0x0a, 7,0x1e, 7,0x1c,
  201775. 6,0x1c, 7,0x09, 10,0x18, 7,0x1c, 10,0x06, 6,0x0a, 6,0x07, 6,0x19,
  201776. 7,0x06, 6,0x0d, 7,0x0f, 7,0x0b, 7,0x05, 6,0x11, 6,0x1c, 7,0x1f,
  201777. 6,0x1e, 7,0x18, 6,0x1e, 6,0x00, 6,0x03, 6,0x02, 7,0x10, 6,0x0b,
  201778. 6,0x1b, 7,0x10, 6,0x00, 8,0x11, 7,0x1b, 6,0x18, 6,0x01, 7,0x0c,
  201779. 7,0x1d, 7,0x13, 6,0x08, 7,0x1b, 8,0x13, 7,0x16, 13,0x1d, 7,0x1f,
  201780. 6,0x0a, 6,0x01, 7,0x1f, 6,0x14, 1,0x01
  201781. };
  201782. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  201783. * P1024 curve. (r = 1 / a mod m)
  201784. *
  201785. * r Inverse result.
  201786. * a Number to invert.
  201787. * td Temporary data.
  201788. */
  201789. static void sp_1024_mont_inv_32(sp_digit* r, const sp_digit* a,
  201790. sp_digit* td)
  201791. {
  201792. sp_digit* t = &td[32 * 2 * 32];
  201793. int i;
  201794. int j;
  201795. sp_digit* table[32];
  201796. for (i = 0; i < 32; i++) {
  201797. table[i] = &td[2 * 32 * i];
  201798. }
  201799. XMEMCPY(table[0], a, sizeof(sp_digit) * 32);
  201800. for (i = 1; i < 6; i++) {
  201801. sp_1024_mont_sqr_32(table[0], table[0], p1024_mod, p1024_mp_mod);
  201802. }
  201803. for (i = 1; i < 32; i++) {
  201804. sp_1024_mont_mul_32(table[i], table[i-1], a, p1024_mod, p1024_mp_mod);
  201805. }
  201806. XMEMCPY(t, table[p1024_mod_minus_2[1]], sizeof(sp_digit) * 32);
  201807. for (i = 2; i < (int)sizeof(p1024_mod_minus_2) - 2; i += 2) {
  201808. for (j = 0; j < p1024_mod_minus_2[i]; j++) {
  201809. sp_1024_mont_sqr_32(t, t, p1024_mod, p1024_mp_mod);
  201810. }
  201811. sp_1024_mont_mul_32(t, t, table[p1024_mod_minus_2[i+1]], p1024_mod,
  201812. p1024_mp_mod);
  201813. }
  201814. sp_1024_mont_sqr_32(t, t, p1024_mod, p1024_mp_mod);
  201815. sp_1024_mont_mul_32(r, t, a, p1024_mod, p1024_mp_mod);
  201816. }
  201817. /* Normalize the values in each word to 32.
  201818. *
  201819. * a Array of sp_digit to normalize.
  201820. */
  201821. #define sp_1024_norm_32(a)
  201822. /* Map the Montgomery form projective coordinate point to an affine point.
  201823. *
  201824. * r Resulting affine coordinate point.
  201825. * p Montgomery form projective coordinate point.
  201826. * t Temporary ordinate data.
  201827. */
  201828. static void sp_1024_map_32(sp_point_1024* r, const sp_point_1024* p,
  201829. sp_digit* t)
  201830. {
  201831. sp_digit* t1 = t;
  201832. sp_digit* t2 = t + 2*32;
  201833. sp_int32 n;
  201834. sp_1024_mont_inv_32(t1, p->z, t + 2*32);
  201835. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  201836. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  201837. /* x /= z^2 */
  201838. sp_1024_mont_mul_32(r->x, p->x, t2, p1024_mod, p1024_mp_mod);
  201839. XMEMSET(r->x + 32, 0, sizeof(sp_digit) * 32U);
  201840. sp_1024_mont_reduce_32(r->x, p1024_mod, p1024_mp_mod);
  201841. /* Reduce x to less than modulus */
  201842. n = sp_1024_cmp_32(r->x, p1024_mod);
  201843. sp_1024_cond_sub_32(r->x, r->x, p1024_mod, ~(n >> 31));
  201844. sp_1024_norm_32(r->x);
  201845. /* y /= z^3 */
  201846. sp_1024_mont_mul_32(r->y, p->y, t1, p1024_mod, p1024_mp_mod);
  201847. XMEMSET(r->y + 32, 0, sizeof(sp_digit) * 32U);
  201848. sp_1024_mont_reduce_32(r->y, p1024_mod, p1024_mp_mod);
  201849. /* Reduce y to less than modulus */
  201850. n = sp_1024_cmp_32(r->y, p1024_mod);
  201851. sp_1024_cond_sub_32(r->y, r->y, p1024_mod, ~(n >> 31));
  201852. sp_1024_norm_32(r->y);
  201853. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  201854. r->z[0] = 1;
  201855. }
  201856. /* Add two Montgomery form numbers (r = a + b % m).
  201857. *
  201858. * r Result of addition.
  201859. * a First number to add in Montgomery form.
  201860. * b Second number to add in Montgomery form.
  201861. * m Modulus (prime).
  201862. */
  201863. SP_NOINLINE static void sp_1024_mont_add_32(sp_digit* r, const sp_digit* a,
  201864. const sp_digit* b, const sp_digit* m)
  201865. {
  201866. __asm__ __volatile__ (
  201867. "ldr r4, [%[a]]\n\t"
  201868. "ldr r5, [%[a], #4]\n\t"
  201869. "ldr r6, [%[b]]\n\t"
  201870. "ldr r7, [%[b], #4]\n\t"
  201871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201872. "adds r4, r4, r6\n\t"
  201873. #else
  201874. "add r4, r4, r6\n\t"
  201875. #endif
  201876. #ifdef WOLFSSL_KEIL
  201877. "adcs r5, r5, r7\n\t"
  201878. #elif defined(__clang__)
  201879. "adcs r5, r7\n\t"
  201880. #else
  201881. "adc r5, r7\n\t"
  201882. #endif
  201883. "str r4, [%[r]]\n\t"
  201884. "str r5, [%[r], #4]\n\t"
  201885. "ldr r4, [%[a], #8]\n\t"
  201886. "ldr r5, [%[a], #12]\n\t"
  201887. "ldr r6, [%[b], #8]\n\t"
  201888. "ldr r7, [%[b], #12]\n\t"
  201889. #ifdef WOLFSSL_KEIL
  201890. "adcs r4, r4, r6\n\t"
  201891. #elif defined(__clang__)
  201892. "adcs r4, r6\n\t"
  201893. #else
  201894. "adc r4, r6\n\t"
  201895. #endif
  201896. #ifdef WOLFSSL_KEIL
  201897. "adcs r5, r5, r7\n\t"
  201898. #elif defined(__clang__)
  201899. "adcs r5, r7\n\t"
  201900. #else
  201901. "adc r5, r7\n\t"
  201902. #endif
  201903. "str r4, [%[r], #8]\n\t"
  201904. "str r5, [%[r], #12]\n\t"
  201905. "ldr r4, [%[a], #16]\n\t"
  201906. "ldr r5, [%[a], #20]\n\t"
  201907. "ldr r6, [%[b], #16]\n\t"
  201908. "ldr r7, [%[b], #20]\n\t"
  201909. #ifdef WOLFSSL_KEIL
  201910. "adcs r4, r4, r6\n\t"
  201911. #elif defined(__clang__)
  201912. "adcs r4, r6\n\t"
  201913. #else
  201914. "adc r4, r6\n\t"
  201915. #endif
  201916. #ifdef WOLFSSL_KEIL
  201917. "adcs r5, r5, r7\n\t"
  201918. #elif defined(__clang__)
  201919. "adcs r5, r7\n\t"
  201920. #else
  201921. "adc r5, r7\n\t"
  201922. #endif
  201923. "str r4, [%[r], #16]\n\t"
  201924. "str r5, [%[r], #20]\n\t"
  201925. "ldr r4, [%[a], #24]\n\t"
  201926. "ldr r5, [%[a], #28]\n\t"
  201927. "ldr r6, [%[b], #24]\n\t"
  201928. "ldr r7, [%[b], #28]\n\t"
  201929. #ifdef WOLFSSL_KEIL
  201930. "adcs r4, r4, r6\n\t"
  201931. #elif defined(__clang__)
  201932. "adcs r4, r6\n\t"
  201933. #else
  201934. "adc r4, r6\n\t"
  201935. #endif
  201936. #ifdef WOLFSSL_KEIL
  201937. "adcs r5, r5, r7\n\t"
  201938. #elif defined(__clang__)
  201939. "adcs r5, r7\n\t"
  201940. #else
  201941. "adc r5, r7\n\t"
  201942. #endif
  201943. "str r4, [%[r], #24]\n\t"
  201944. "str r5, [%[r], #28]\n\t"
  201945. "ldr r4, [%[a], #32]\n\t"
  201946. "ldr r5, [%[a], #36]\n\t"
  201947. "ldr r6, [%[b], #32]\n\t"
  201948. "ldr r7, [%[b], #36]\n\t"
  201949. #ifdef WOLFSSL_KEIL
  201950. "adcs r4, r4, r6\n\t"
  201951. #elif defined(__clang__)
  201952. "adcs r4, r6\n\t"
  201953. #else
  201954. "adc r4, r6\n\t"
  201955. #endif
  201956. #ifdef WOLFSSL_KEIL
  201957. "adcs r5, r5, r7\n\t"
  201958. #elif defined(__clang__)
  201959. "adcs r5, r7\n\t"
  201960. #else
  201961. "adc r5, r7\n\t"
  201962. #endif
  201963. "str r4, [%[r], #32]\n\t"
  201964. "str r5, [%[r], #36]\n\t"
  201965. "ldr r4, [%[a], #40]\n\t"
  201966. "ldr r5, [%[a], #44]\n\t"
  201967. "ldr r6, [%[b], #40]\n\t"
  201968. "ldr r7, [%[b], #44]\n\t"
  201969. #ifdef WOLFSSL_KEIL
  201970. "adcs r4, r4, r6\n\t"
  201971. #elif defined(__clang__)
  201972. "adcs r4, r6\n\t"
  201973. #else
  201974. "adc r4, r6\n\t"
  201975. #endif
  201976. #ifdef WOLFSSL_KEIL
  201977. "adcs r5, r5, r7\n\t"
  201978. #elif defined(__clang__)
  201979. "adcs r5, r7\n\t"
  201980. #else
  201981. "adc r5, r7\n\t"
  201982. #endif
  201983. "str r4, [%[r], #40]\n\t"
  201984. "str r5, [%[r], #44]\n\t"
  201985. "ldr r4, [%[a], #48]\n\t"
  201986. "ldr r5, [%[a], #52]\n\t"
  201987. "ldr r6, [%[b], #48]\n\t"
  201988. "ldr r7, [%[b], #52]\n\t"
  201989. #ifdef WOLFSSL_KEIL
  201990. "adcs r4, r4, r6\n\t"
  201991. #elif defined(__clang__)
  201992. "adcs r4, r6\n\t"
  201993. #else
  201994. "adc r4, r6\n\t"
  201995. #endif
  201996. #ifdef WOLFSSL_KEIL
  201997. "adcs r5, r5, r7\n\t"
  201998. #elif defined(__clang__)
  201999. "adcs r5, r7\n\t"
  202000. #else
  202001. "adc r5, r7\n\t"
  202002. #endif
  202003. "str r4, [%[r], #48]\n\t"
  202004. "str r5, [%[r], #52]\n\t"
  202005. "ldr r4, [%[a], #56]\n\t"
  202006. "ldr r5, [%[a], #60]\n\t"
  202007. "ldr r6, [%[b], #56]\n\t"
  202008. "ldr r7, [%[b], #60]\n\t"
  202009. #ifdef WOLFSSL_KEIL
  202010. "adcs r4, r4, r6\n\t"
  202011. #elif defined(__clang__)
  202012. "adcs r4, r6\n\t"
  202013. #else
  202014. "adc r4, r6\n\t"
  202015. #endif
  202016. #ifdef WOLFSSL_KEIL
  202017. "adcs r5, r5, r7\n\t"
  202018. #elif defined(__clang__)
  202019. "adcs r5, r7\n\t"
  202020. #else
  202021. "adc r5, r7\n\t"
  202022. #endif
  202023. "str r4, [%[r], #56]\n\t"
  202024. "str r5, [%[r], #60]\n\t"
  202025. "ldr r4, [%[a], #64]\n\t"
  202026. "ldr r5, [%[a], #68]\n\t"
  202027. "ldr r6, [%[b], #64]\n\t"
  202028. "ldr r7, [%[b], #68]\n\t"
  202029. #ifdef WOLFSSL_KEIL
  202030. "adcs r4, r4, r6\n\t"
  202031. #elif defined(__clang__)
  202032. "adcs r4, r6\n\t"
  202033. #else
  202034. "adc r4, r6\n\t"
  202035. #endif
  202036. #ifdef WOLFSSL_KEIL
  202037. "adcs r5, r5, r7\n\t"
  202038. #elif defined(__clang__)
  202039. "adcs r5, r7\n\t"
  202040. #else
  202041. "adc r5, r7\n\t"
  202042. #endif
  202043. "str r4, [%[r], #64]\n\t"
  202044. "str r5, [%[r], #68]\n\t"
  202045. "ldr r4, [%[a], #72]\n\t"
  202046. "ldr r5, [%[a], #76]\n\t"
  202047. "ldr r6, [%[b], #72]\n\t"
  202048. "ldr r7, [%[b], #76]\n\t"
  202049. #ifdef WOLFSSL_KEIL
  202050. "adcs r4, r4, r6\n\t"
  202051. #elif defined(__clang__)
  202052. "adcs r4, r6\n\t"
  202053. #else
  202054. "adc r4, r6\n\t"
  202055. #endif
  202056. #ifdef WOLFSSL_KEIL
  202057. "adcs r5, r5, r7\n\t"
  202058. #elif defined(__clang__)
  202059. "adcs r5, r7\n\t"
  202060. #else
  202061. "adc r5, r7\n\t"
  202062. #endif
  202063. "str r4, [%[r], #72]\n\t"
  202064. "str r5, [%[r], #76]\n\t"
  202065. "ldr r4, [%[a], #80]\n\t"
  202066. "ldr r5, [%[a], #84]\n\t"
  202067. "ldr r6, [%[b], #80]\n\t"
  202068. "ldr r7, [%[b], #84]\n\t"
  202069. #ifdef WOLFSSL_KEIL
  202070. "adcs r4, r4, r6\n\t"
  202071. #elif defined(__clang__)
  202072. "adcs r4, r6\n\t"
  202073. #else
  202074. "adc r4, r6\n\t"
  202075. #endif
  202076. #ifdef WOLFSSL_KEIL
  202077. "adcs r5, r5, r7\n\t"
  202078. #elif defined(__clang__)
  202079. "adcs r5, r7\n\t"
  202080. #else
  202081. "adc r5, r7\n\t"
  202082. #endif
  202083. "str r4, [%[r], #80]\n\t"
  202084. "str r5, [%[r], #84]\n\t"
  202085. "ldr r4, [%[a], #88]\n\t"
  202086. "ldr r5, [%[a], #92]\n\t"
  202087. "ldr r6, [%[b], #88]\n\t"
  202088. "ldr r7, [%[b], #92]\n\t"
  202089. #ifdef WOLFSSL_KEIL
  202090. "adcs r4, r4, r6\n\t"
  202091. #elif defined(__clang__)
  202092. "adcs r4, r6\n\t"
  202093. #else
  202094. "adc r4, r6\n\t"
  202095. #endif
  202096. #ifdef WOLFSSL_KEIL
  202097. "adcs r5, r5, r7\n\t"
  202098. #elif defined(__clang__)
  202099. "adcs r5, r7\n\t"
  202100. #else
  202101. "adc r5, r7\n\t"
  202102. #endif
  202103. "str r4, [%[r], #88]\n\t"
  202104. "str r5, [%[r], #92]\n\t"
  202105. "ldr r4, [%[a], #96]\n\t"
  202106. "ldr r5, [%[a], #100]\n\t"
  202107. "ldr r6, [%[b], #96]\n\t"
  202108. "ldr r7, [%[b], #100]\n\t"
  202109. #ifdef WOLFSSL_KEIL
  202110. "adcs r4, r4, r6\n\t"
  202111. #elif defined(__clang__)
  202112. "adcs r4, r6\n\t"
  202113. #else
  202114. "adc r4, r6\n\t"
  202115. #endif
  202116. #ifdef WOLFSSL_KEIL
  202117. "adcs r5, r5, r7\n\t"
  202118. #elif defined(__clang__)
  202119. "adcs r5, r7\n\t"
  202120. #else
  202121. "adc r5, r7\n\t"
  202122. #endif
  202123. "str r4, [%[r], #96]\n\t"
  202124. "str r5, [%[r], #100]\n\t"
  202125. "ldr r4, [%[a], #104]\n\t"
  202126. "ldr r5, [%[a], #108]\n\t"
  202127. "ldr r6, [%[b], #104]\n\t"
  202128. "ldr r7, [%[b], #108]\n\t"
  202129. #ifdef WOLFSSL_KEIL
  202130. "adcs r4, r4, r6\n\t"
  202131. #elif defined(__clang__)
  202132. "adcs r4, r6\n\t"
  202133. #else
  202134. "adc r4, r6\n\t"
  202135. #endif
  202136. #ifdef WOLFSSL_KEIL
  202137. "adcs r5, r5, r7\n\t"
  202138. #elif defined(__clang__)
  202139. "adcs r5, r7\n\t"
  202140. #else
  202141. "adc r5, r7\n\t"
  202142. #endif
  202143. "str r4, [%[r], #104]\n\t"
  202144. "str r5, [%[r], #108]\n\t"
  202145. "ldr r4, [%[a], #112]\n\t"
  202146. "ldr r5, [%[a], #116]\n\t"
  202147. "ldr r6, [%[b], #112]\n\t"
  202148. "ldr r7, [%[b], #116]\n\t"
  202149. #ifdef WOLFSSL_KEIL
  202150. "adcs r4, r4, r6\n\t"
  202151. #elif defined(__clang__)
  202152. "adcs r4, r6\n\t"
  202153. #else
  202154. "adc r4, r6\n\t"
  202155. #endif
  202156. #ifdef WOLFSSL_KEIL
  202157. "adcs r5, r5, r7\n\t"
  202158. #elif defined(__clang__)
  202159. "adcs r5, r7\n\t"
  202160. #else
  202161. "adc r5, r7\n\t"
  202162. #endif
  202163. "str r4, [%[r], #112]\n\t"
  202164. "str r5, [%[r], #116]\n\t"
  202165. "ldr r4, [%[a], #120]\n\t"
  202166. "ldr r5, [%[a], #124]\n\t"
  202167. "ldr r6, [%[b], #120]\n\t"
  202168. "ldr r7, [%[b], #124]\n\t"
  202169. #ifdef WOLFSSL_KEIL
  202170. "adcs r4, r4, r6\n\t"
  202171. #elif defined(__clang__)
  202172. "adcs r4, r6\n\t"
  202173. #else
  202174. "adc r4, r6\n\t"
  202175. #endif
  202176. #ifdef WOLFSSL_KEIL
  202177. "adcs r5, r5, r7\n\t"
  202178. #elif defined(__clang__)
  202179. "adcs r5, r7\n\t"
  202180. #else
  202181. "adc r5, r7\n\t"
  202182. #endif
  202183. "str r4, [%[r], #120]\n\t"
  202184. "str r5, [%[r], #124]\n\t"
  202185. "movs %[b], #0\n\t"
  202186. "ldr r7, [%[m], #124]\n\t"
  202187. #ifdef WOLFSSL_KEIL
  202188. "adcs %[b], %[b], %[b]\n\t"
  202189. #elif defined(__clang__)
  202190. "adcs %[b], %[b]\n\t"
  202191. #else
  202192. "adc %[b], %[b]\n\t"
  202193. #endif
  202194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  202195. "subs r7, r7, r5\n\t"
  202196. #else
  202197. "sub r7, r7, r5\n\t"
  202198. #endif
  202199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  202200. "negs %[b], %[b]\n\t"
  202201. #else
  202202. "neg %[b], %[b]\n\t"
  202203. #endif
  202204. #ifdef WOLFSSL_KEIL
  202205. "sbcs r7, r7, r7\n\t"
  202206. #elif defined(__clang__)
  202207. "sbcs r7, r7\n\t"
  202208. #else
  202209. "sbc r7, r7\n\t"
  202210. #endif
  202211. #ifdef WOLFSSL_KEIL
  202212. "orrs %[b], %[b], r7\n\t"
  202213. #elif defined(__clang__)
  202214. "orrs %[b], r7\n\t"
  202215. #else
  202216. "orr %[b], r7\n\t"
  202217. #endif
  202218. "ldr r4, [%[r]]\n\t"
  202219. "ldr r5, [%[r], #4]\n\t"
  202220. "ldr r6, [%[m]]\n\t"
  202221. "ldr r7, [%[m], #4]\n\t"
  202222. #ifdef WOLFSSL_KEIL
  202223. "ands r6, r6, %[b]\n\t"
  202224. #elif defined(__clang__)
  202225. "ands r6, %[b]\n\t"
  202226. #else
  202227. "and r6, %[b]\n\t"
  202228. #endif
  202229. #ifdef WOLFSSL_KEIL
  202230. "ands r7, r7, %[b]\n\t"
  202231. #elif defined(__clang__)
  202232. "ands r7, %[b]\n\t"
  202233. #else
  202234. "and r7, %[b]\n\t"
  202235. #endif
  202236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  202237. "subs r4, r4, r6\n\t"
  202238. #else
  202239. "sub r4, r4, r6\n\t"
  202240. #endif
  202241. #ifdef WOLFSSL_KEIL
  202242. "sbcs r5, r5, r7\n\t"
  202243. #elif defined(__clang__)
  202244. "sbcs r5, r7\n\t"
  202245. #else
  202246. "sbc r5, r7\n\t"
  202247. #endif
  202248. "str r4, [%[r]]\n\t"
  202249. "str r5, [%[r], #4]\n\t"
  202250. "ldr r4, [%[r], #8]\n\t"
  202251. "ldr r5, [%[r], #12]\n\t"
  202252. "ldr r6, [%[m], #8]\n\t"
  202253. "ldr r7, [%[m], #12]\n\t"
  202254. #ifdef WOLFSSL_KEIL
  202255. "ands r6, r6, %[b]\n\t"
  202256. #elif defined(__clang__)
  202257. "ands r6, %[b]\n\t"
  202258. #else
  202259. "and r6, %[b]\n\t"
  202260. #endif
  202261. #ifdef WOLFSSL_KEIL
  202262. "ands r7, r7, %[b]\n\t"
  202263. #elif defined(__clang__)
  202264. "ands r7, %[b]\n\t"
  202265. #else
  202266. "and r7, %[b]\n\t"
  202267. #endif
  202268. #ifdef WOLFSSL_KEIL
  202269. "sbcs r4, r4, r6\n\t"
  202270. #elif defined(__clang__)
  202271. "sbcs r4, r6\n\t"
  202272. #else
  202273. "sbc r4, r6\n\t"
  202274. #endif
  202275. #ifdef WOLFSSL_KEIL
  202276. "sbcs r5, r5, r7\n\t"
  202277. #elif defined(__clang__)
  202278. "sbcs r5, r7\n\t"
  202279. #else
  202280. "sbc r5, r7\n\t"
  202281. #endif
  202282. "str r4, [%[r], #8]\n\t"
  202283. "str r5, [%[r], #12]\n\t"
  202284. "ldr r4, [%[r], #16]\n\t"
  202285. "ldr r5, [%[r], #20]\n\t"
  202286. "ldr r6, [%[m], #16]\n\t"
  202287. "ldr r7, [%[m], #20]\n\t"
  202288. #ifdef WOLFSSL_KEIL
  202289. "ands r6, r6, %[b]\n\t"
  202290. #elif defined(__clang__)
  202291. "ands r6, %[b]\n\t"
  202292. #else
  202293. "and r6, %[b]\n\t"
  202294. #endif
  202295. #ifdef WOLFSSL_KEIL
  202296. "ands r7, r7, %[b]\n\t"
  202297. #elif defined(__clang__)
  202298. "ands r7, %[b]\n\t"
  202299. #else
  202300. "and r7, %[b]\n\t"
  202301. #endif
  202302. #ifdef WOLFSSL_KEIL
  202303. "sbcs r4, r4, r6\n\t"
  202304. #elif defined(__clang__)
  202305. "sbcs r4, r6\n\t"
  202306. #else
  202307. "sbc r4, r6\n\t"
  202308. #endif
  202309. #ifdef WOLFSSL_KEIL
  202310. "sbcs r5, r5, r7\n\t"
  202311. #elif defined(__clang__)
  202312. "sbcs r5, r7\n\t"
  202313. #else
  202314. "sbc r5, r7\n\t"
  202315. #endif
  202316. "str r4, [%[r], #16]\n\t"
  202317. "str r5, [%[r], #20]\n\t"
  202318. "ldr r4, [%[r], #24]\n\t"
  202319. "ldr r5, [%[r], #28]\n\t"
  202320. "ldr r6, [%[m], #24]\n\t"
  202321. "ldr r7, [%[m], #28]\n\t"
  202322. #ifdef WOLFSSL_KEIL
  202323. "ands r6, r6, %[b]\n\t"
  202324. #elif defined(__clang__)
  202325. "ands r6, %[b]\n\t"
  202326. #else
  202327. "and r6, %[b]\n\t"
  202328. #endif
  202329. #ifdef WOLFSSL_KEIL
  202330. "ands r7, r7, %[b]\n\t"
  202331. #elif defined(__clang__)
  202332. "ands r7, %[b]\n\t"
  202333. #else
  202334. "and r7, %[b]\n\t"
  202335. #endif
  202336. #ifdef WOLFSSL_KEIL
  202337. "sbcs r4, r4, r6\n\t"
  202338. #elif defined(__clang__)
  202339. "sbcs r4, r6\n\t"
  202340. #else
  202341. "sbc r4, r6\n\t"
  202342. #endif
  202343. #ifdef WOLFSSL_KEIL
  202344. "sbcs r5, r5, r7\n\t"
  202345. #elif defined(__clang__)
  202346. "sbcs r5, r7\n\t"
  202347. #else
  202348. "sbc r5, r7\n\t"
  202349. #endif
  202350. "str r4, [%[r], #24]\n\t"
  202351. "str r5, [%[r], #28]\n\t"
  202352. "ldr r4, [%[r], #32]\n\t"
  202353. "ldr r5, [%[r], #36]\n\t"
  202354. "ldr r6, [%[m], #32]\n\t"
  202355. "ldr r7, [%[m], #36]\n\t"
  202356. #ifdef WOLFSSL_KEIL
  202357. "ands r6, r6, %[b]\n\t"
  202358. #elif defined(__clang__)
  202359. "ands r6, %[b]\n\t"
  202360. #else
  202361. "and r6, %[b]\n\t"
  202362. #endif
  202363. #ifdef WOLFSSL_KEIL
  202364. "ands r7, r7, %[b]\n\t"
  202365. #elif defined(__clang__)
  202366. "ands r7, %[b]\n\t"
  202367. #else
  202368. "and r7, %[b]\n\t"
  202369. #endif
  202370. #ifdef WOLFSSL_KEIL
  202371. "sbcs r4, r4, r6\n\t"
  202372. #elif defined(__clang__)
  202373. "sbcs r4, r6\n\t"
  202374. #else
  202375. "sbc r4, r6\n\t"
  202376. #endif
  202377. #ifdef WOLFSSL_KEIL
  202378. "sbcs r5, r5, r7\n\t"
  202379. #elif defined(__clang__)
  202380. "sbcs r5, r7\n\t"
  202381. #else
  202382. "sbc r5, r7\n\t"
  202383. #endif
  202384. "str r4, [%[r], #32]\n\t"
  202385. "str r5, [%[r], #36]\n\t"
  202386. "ldr r4, [%[r], #40]\n\t"
  202387. "ldr r5, [%[r], #44]\n\t"
  202388. "ldr r6, [%[m], #40]\n\t"
  202389. "ldr r7, [%[m], #44]\n\t"
  202390. #ifdef WOLFSSL_KEIL
  202391. "ands r6, r6, %[b]\n\t"
  202392. #elif defined(__clang__)
  202393. "ands r6, %[b]\n\t"
  202394. #else
  202395. "and r6, %[b]\n\t"
  202396. #endif
  202397. #ifdef WOLFSSL_KEIL
  202398. "ands r7, r7, %[b]\n\t"
  202399. #elif defined(__clang__)
  202400. "ands r7, %[b]\n\t"
  202401. #else
  202402. "and r7, %[b]\n\t"
  202403. #endif
  202404. #ifdef WOLFSSL_KEIL
  202405. "sbcs r4, r4, r6\n\t"
  202406. #elif defined(__clang__)
  202407. "sbcs r4, r6\n\t"
  202408. #else
  202409. "sbc r4, r6\n\t"
  202410. #endif
  202411. #ifdef WOLFSSL_KEIL
  202412. "sbcs r5, r5, r7\n\t"
  202413. #elif defined(__clang__)
  202414. "sbcs r5, r7\n\t"
  202415. #else
  202416. "sbc r5, r7\n\t"
  202417. #endif
  202418. "str r4, [%[r], #40]\n\t"
  202419. "str r5, [%[r], #44]\n\t"
  202420. "ldr r4, [%[r], #48]\n\t"
  202421. "ldr r5, [%[r], #52]\n\t"
  202422. "ldr r6, [%[m], #48]\n\t"
  202423. "ldr r7, [%[m], #52]\n\t"
  202424. #ifdef WOLFSSL_KEIL
  202425. "ands r6, r6, %[b]\n\t"
  202426. #elif defined(__clang__)
  202427. "ands r6, %[b]\n\t"
  202428. #else
  202429. "and r6, %[b]\n\t"
  202430. #endif
  202431. #ifdef WOLFSSL_KEIL
  202432. "ands r7, r7, %[b]\n\t"
  202433. #elif defined(__clang__)
  202434. "ands r7, %[b]\n\t"
  202435. #else
  202436. "and r7, %[b]\n\t"
  202437. #endif
  202438. #ifdef WOLFSSL_KEIL
  202439. "sbcs r4, r4, r6\n\t"
  202440. #elif defined(__clang__)
  202441. "sbcs r4, r6\n\t"
  202442. #else
  202443. "sbc r4, r6\n\t"
  202444. #endif
  202445. #ifdef WOLFSSL_KEIL
  202446. "sbcs r5, r5, r7\n\t"
  202447. #elif defined(__clang__)
  202448. "sbcs r5, r7\n\t"
  202449. #else
  202450. "sbc r5, r7\n\t"
  202451. #endif
  202452. "str r4, [%[r], #48]\n\t"
  202453. "str r5, [%[r], #52]\n\t"
  202454. "ldr r4, [%[r], #56]\n\t"
  202455. "ldr r5, [%[r], #60]\n\t"
  202456. "ldr r6, [%[m], #56]\n\t"
  202457. "ldr r7, [%[m], #60]\n\t"
  202458. #ifdef WOLFSSL_KEIL
  202459. "ands r6, r6, %[b]\n\t"
  202460. #elif defined(__clang__)
  202461. "ands r6, %[b]\n\t"
  202462. #else
  202463. "and r6, %[b]\n\t"
  202464. #endif
  202465. #ifdef WOLFSSL_KEIL
  202466. "ands r7, r7, %[b]\n\t"
  202467. #elif defined(__clang__)
  202468. "ands r7, %[b]\n\t"
  202469. #else
  202470. "and r7, %[b]\n\t"
  202471. #endif
  202472. #ifdef WOLFSSL_KEIL
  202473. "sbcs r4, r4, r6\n\t"
  202474. #elif defined(__clang__)
  202475. "sbcs r4, r6\n\t"
  202476. #else
  202477. "sbc r4, r6\n\t"
  202478. #endif
  202479. #ifdef WOLFSSL_KEIL
  202480. "sbcs r5, r5, r7\n\t"
  202481. #elif defined(__clang__)
  202482. "sbcs r5, r7\n\t"
  202483. #else
  202484. "sbc r5, r7\n\t"
  202485. #endif
  202486. "str r4, [%[r], #56]\n\t"
  202487. "str r5, [%[r], #60]\n\t"
  202488. "ldr r4, [%[r], #64]\n\t"
  202489. "ldr r5, [%[r], #68]\n\t"
  202490. "ldr r6, [%[m], #64]\n\t"
  202491. "ldr r7, [%[m], #68]\n\t"
  202492. #ifdef WOLFSSL_KEIL
  202493. "ands r6, r6, %[b]\n\t"
  202494. #elif defined(__clang__)
  202495. "ands r6, %[b]\n\t"
  202496. #else
  202497. "and r6, %[b]\n\t"
  202498. #endif
  202499. #ifdef WOLFSSL_KEIL
  202500. "ands r7, r7, %[b]\n\t"
  202501. #elif defined(__clang__)
  202502. "ands r7, %[b]\n\t"
  202503. #else
  202504. "and r7, %[b]\n\t"
  202505. #endif
  202506. #ifdef WOLFSSL_KEIL
  202507. "sbcs r4, r4, r6\n\t"
  202508. #elif defined(__clang__)
  202509. "sbcs r4, r6\n\t"
  202510. #else
  202511. "sbc r4, r6\n\t"
  202512. #endif
  202513. #ifdef WOLFSSL_KEIL
  202514. "sbcs r5, r5, r7\n\t"
  202515. #elif defined(__clang__)
  202516. "sbcs r5, r7\n\t"
  202517. #else
  202518. "sbc r5, r7\n\t"
  202519. #endif
  202520. "str r4, [%[r], #64]\n\t"
  202521. "str r5, [%[r], #68]\n\t"
  202522. "ldr r4, [%[r], #72]\n\t"
  202523. "ldr r5, [%[r], #76]\n\t"
  202524. "ldr r6, [%[m], #72]\n\t"
  202525. "ldr r7, [%[m], #76]\n\t"
  202526. #ifdef WOLFSSL_KEIL
  202527. "ands r6, r6, %[b]\n\t"
  202528. #elif defined(__clang__)
  202529. "ands r6, %[b]\n\t"
  202530. #else
  202531. "and r6, %[b]\n\t"
  202532. #endif
  202533. #ifdef WOLFSSL_KEIL
  202534. "ands r7, r7, %[b]\n\t"
  202535. #elif defined(__clang__)
  202536. "ands r7, %[b]\n\t"
  202537. #else
  202538. "and r7, %[b]\n\t"
  202539. #endif
  202540. #ifdef WOLFSSL_KEIL
  202541. "sbcs r4, r4, r6\n\t"
  202542. #elif defined(__clang__)
  202543. "sbcs r4, r6\n\t"
  202544. #else
  202545. "sbc r4, r6\n\t"
  202546. #endif
  202547. #ifdef WOLFSSL_KEIL
  202548. "sbcs r5, r5, r7\n\t"
  202549. #elif defined(__clang__)
  202550. "sbcs r5, r7\n\t"
  202551. #else
  202552. "sbc r5, r7\n\t"
  202553. #endif
  202554. "str r4, [%[r], #72]\n\t"
  202555. "str r5, [%[r], #76]\n\t"
  202556. "ldr r4, [%[r], #80]\n\t"
  202557. "ldr r5, [%[r], #84]\n\t"
  202558. "ldr r6, [%[m], #80]\n\t"
  202559. "ldr r7, [%[m], #84]\n\t"
  202560. #ifdef WOLFSSL_KEIL
  202561. "ands r6, r6, %[b]\n\t"
  202562. #elif defined(__clang__)
  202563. "ands r6, %[b]\n\t"
  202564. #else
  202565. "and r6, %[b]\n\t"
  202566. #endif
  202567. #ifdef WOLFSSL_KEIL
  202568. "ands r7, r7, %[b]\n\t"
  202569. #elif defined(__clang__)
  202570. "ands r7, %[b]\n\t"
  202571. #else
  202572. "and r7, %[b]\n\t"
  202573. #endif
  202574. #ifdef WOLFSSL_KEIL
  202575. "sbcs r4, r4, r6\n\t"
  202576. #elif defined(__clang__)
  202577. "sbcs r4, r6\n\t"
  202578. #else
  202579. "sbc r4, r6\n\t"
  202580. #endif
  202581. #ifdef WOLFSSL_KEIL
  202582. "sbcs r5, r5, r7\n\t"
  202583. #elif defined(__clang__)
  202584. "sbcs r5, r7\n\t"
  202585. #else
  202586. "sbc r5, r7\n\t"
  202587. #endif
  202588. "str r4, [%[r], #80]\n\t"
  202589. "str r5, [%[r], #84]\n\t"
  202590. "ldr r4, [%[r], #88]\n\t"
  202591. "ldr r5, [%[r], #92]\n\t"
  202592. "ldr r6, [%[m], #88]\n\t"
  202593. "ldr r7, [%[m], #92]\n\t"
  202594. #ifdef WOLFSSL_KEIL
  202595. "ands r6, r6, %[b]\n\t"
  202596. #elif defined(__clang__)
  202597. "ands r6, %[b]\n\t"
  202598. #else
  202599. "and r6, %[b]\n\t"
  202600. #endif
  202601. #ifdef WOLFSSL_KEIL
  202602. "ands r7, r7, %[b]\n\t"
  202603. #elif defined(__clang__)
  202604. "ands r7, %[b]\n\t"
  202605. #else
  202606. "and r7, %[b]\n\t"
  202607. #endif
  202608. #ifdef WOLFSSL_KEIL
  202609. "sbcs r4, r4, r6\n\t"
  202610. #elif defined(__clang__)
  202611. "sbcs r4, r6\n\t"
  202612. #else
  202613. "sbc r4, r6\n\t"
  202614. #endif
  202615. #ifdef WOLFSSL_KEIL
  202616. "sbcs r5, r5, r7\n\t"
  202617. #elif defined(__clang__)
  202618. "sbcs r5, r7\n\t"
  202619. #else
  202620. "sbc r5, r7\n\t"
  202621. #endif
  202622. "str r4, [%[r], #88]\n\t"
  202623. "str r5, [%[r], #92]\n\t"
  202624. "ldr r4, [%[r], #96]\n\t"
  202625. "ldr r5, [%[r], #100]\n\t"
  202626. "ldr r6, [%[m], #96]\n\t"
  202627. "ldr r7, [%[m], #100]\n\t"
  202628. #ifdef WOLFSSL_KEIL
  202629. "ands r6, r6, %[b]\n\t"
  202630. #elif defined(__clang__)
  202631. "ands r6, %[b]\n\t"
  202632. #else
  202633. "and r6, %[b]\n\t"
  202634. #endif
  202635. #ifdef WOLFSSL_KEIL
  202636. "ands r7, r7, %[b]\n\t"
  202637. #elif defined(__clang__)
  202638. "ands r7, %[b]\n\t"
  202639. #else
  202640. "and r7, %[b]\n\t"
  202641. #endif
  202642. #ifdef WOLFSSL_KEIL
  202643. "sbcs r4, r4, r6\n\t"
  202644. #elif defined(__clang__)
  202645. "sbcs r4, r6\n\t"
  202646. #else
  202647. "sbc r4, r6\n\t"
  202648. #endif
  202649. #ifdef WOLFSSL_KEIL
  202650. "sbcs r5, r5, r7\n\t"
  202651. #elif defined(__clang__)
  202652. "sbcs r5, r7\n\t"
  202653. #else
  202654. "sbc r5, r7\n\t"
  202655. #endif
  202656. "str r4, [%[r], #96]\n\t"
  202657. "str r5, [%[r], #100]\n\t"
  202658. "ldr r4, [%[r], #104]\n\t"
  202659. "ldr r5, [%[r], #108]\n\t"
  202660. "ldr r6, [%[m], #104]\n\t"
  202661. "ldr r7, [%[m], #108]\n\t"
  202662. #ifdef WOLFSSL_KEIL
  202663. "ands r6, r6, %[b]\n\t"
  202664. #elif defined(__clang__)
  202665. "ands r6, %[b]\n\t"
  202666. #else
  202667. "and r6, %[b]\n\t"
  202668. #endif
  202669. #ifdef WOLFSSL_KEIL
  202670. "ands r7, r7, %[b]\n\t"
  202671. #elif defined(__clang__)
  202672. "ands r7, %[b]\n\t"
  202673. #else
  202674. "and r7, %[b]\n\t"
  202675. #endif
  202676. #ifdef WOLFSSL_KEIL
  202677. "sbcs r4, r4, r6\n\t"
  202678. #elif defined(__clang__)
  202679. "sbcs r4, r6\n\t"
  202680. #else
  202681. "sbc r4, r6\n\t"
  202682. #endif
  202683. #ifdef WOLFSSL_KEIL
  202684. "sbcs r5, r5, r7\n\t"
  202685. #elif defined(__clang__)
  202686. "sbcs r5, r7\n\t"
  202687. #else
  202688. "sbc r5, r7\n\t"
  202689. #endif
  202690. "str r4, [%[r], #104]\n\t"
  202691. "str r5, [%[r], #108]\n\t"
  202692. "ldr r4, [%[r], #112]\n\t"
  202693. "ldr r5, [%[r], #116]\n\t"
  202694. "ldr r6, [%[m], #112]\n\t"
  202695. "ldr r7, [%[m], #116]\n\t"
  202696. #ifdef WOLFSSL_KEIL
  202697. "ands r6, r6, %[b]\n\t"
  202698. #elif defined(__clang__)
  202699. "ands r6, %[b]\n\t"
  202700. #else
  202701. "and r6, %[b]\n\t"
  202702. #endif
  202703. #ifdef WOLFSSL_KEIL
  202704. "ands r7, r7, %[b]\n\t"
  202705. #elif defined(__clang__)
  202706. "ands r7, %[b]\n\t"
  202707. #else
  202708. "and r7, %[b]\n\t"
  202709. #endif
  202710. #ifdef WOLFSSL_KEIL
  202711. "sbcs r4, r4, r6\n\t"
  202712. #elif defined(__clang__)
  202713. "sbcs r4, r6\n\t"
  202714. #else
  202715. "sbc r4, r6\n\t"
  202716. #endif
  202717. #ifdef WOLFSSL_KEIL
  202718. "sbcs r5, r5, r7\n\t"
  202719. #elif defined(__clang__)
  202720. "sbcs r5, r7\n\t"
  202721. #else
  202722. "sbc r5, r7\n\t"
  202723. #endif
  202724. "str r4, [%[r], #112]\n\t"
  202725. "str r5, [%[r], #116]\n\t"
  202726. "ldr r4, [%[r], #120]\n\t"
  202727. "ldr r5, [%[r], #124]\n\t"
  202728. "ldr r6, [%[m], #120]\n\t"
  202729. "ldr r7, [%[m], #124]\n\t"
  202730. #ifdef WOLFSSL_KEIL
  202731. "ands r6, r6, %[b]\n\t"
  202732. #elif defined(__clang__)
  202733. "ands r6, %[b]\n\t"
  202734. #else
  202735. "and r6, %[b]\n\t"
  202736. #endif
  202737. #ifdef WOLFSSL_KEIL
  202738. "ands r7, r7, %[b]\n\t"
  202739. #elif defined(__clang__)
  202740. "ands r7, %[b]\n\t"
  202741. #else
  202742. "and r7, %[b]\n\t"
  202743. #endif
  202744. #ifdef WOLFSSL_KEIL
  202745. "sbcs r4, r4, r6\n\t"
  202746. #elif defined(__clang__)
  202747. "sbcs r4, r6\n\t"
  202748. #else
  202749. "sbc r4, r6\n\t"
  202750. #endif
  202751. #ifdef WOLFSSL_KEIL
  202752. "sbcs r5, r5, r7\n\t"
  202753. #elif defined(__clang__)
  202754. "sbcs r5, r7\n\t"
  202755. #else
  202756. "sbc r5, r7\n\t"
  202757. #endif
  202758. "str r4, [%[r], #120]\n\t"
  202759. "str r5, [%[r], #124]\n\t"
  202760. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  202761. :
  202762. : "memory", "r4", "r5", "r6", "r7"
  202763. );
  202764. }
  202765. /* Double a Montgomery form number (r = a + a % m).
  202766. *
  202767. * r Result of doubling.
  202768. * a Number to double in Montgomery form.
  202769. * m Modulus (prime).
  202770. */
  202771. SP_NOINLINE static void sp_1024_mont_dbl_32(sp_digit* r, const sp_digit* a,
  202772. const sp_digit* m)
  202773. {
  202774. __asm__ __volatile__ (
  202775. "ldr r4, [%[a]]\n\t"
  202776. "ldr r5, [%[a], #4]\n\t"
  202777. "ldr r6, [%[a], #8]\n\t"
  202778. "ldr r7, [%[a], #12]\n\t"
  202779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  202780. "adds r4, r4, r4\n\t"
  202781. #else
  202782. "add r4, r4, r4\n\t"
  202783. #endif
  202784. #ifdef WOLFSSL_KEIL
  202785. "adcs r5, r5, r5\n\t"
  202786. #elif defined(__clang__)
  202787. "adcs r5, r5\n\t"
  202788. #else
  202789. "adc r5, r5\n\t"
  202790. #endif
  202791. #ifdef WOLFSSL_KEIL
  202792. "adcs r6, r6, r6\n\t"
  202793. #elif defined(__clang__)
  202794. "adcs r6, r6\n\t"
  202795. #else
  202796. "adc r6, r6\n\t"
  202797. #endif
  202798. #ifdef WOLFSSL_KEIL
  202799. "adcs r7, r7, r7\n\t"
  202800. #elif defined(__clang__)
  202801. "adcs r7, r7\n\t"
  202802. #else
  202803. "adc r7, r7\n\t"
  202804. #endif
  202805. "str r4, [%[r]]\n\t"
  202806. "str r5, [%[r], #4]\n\t"
  202807. "str r6, [%[r], #8]\n\t"
  202808. "str r7, [%[r], #12]\n\t"
  202809. "ldr r4, [%[a], #16]\n\t"
  202810. "ldr r5, [%[a], #20]\n\t"
  202811. "ldr r6, [%[a], #24]\n\t"
  202812. "ldr r7, [%[a], #28]\n\t"
  202813. #ifdef WOLFSSL_KEIL
  202814. "adcs r4, r4, r4\n\t"
  202815. #elif defined(__clang__)
  202816. "adcs r4, r4\n\t"
  202817. #else
  202818. "adc r4, r4\n\t"
  202819. #endif
  202820. #ifdef WOLFSSL_KEIL
  202821. "adcs r5, r5, r5\n\t"
  202822. #elif defined(__clang__)
  202823. "adcs r5, r5\n\t"
  202824. #else
  202825. "adc r5, r5\n\t"
  202826. #endif
  202827. #ifdef WOLFSSL_KEIL
  202828. "adcs r6, r6, r6\n\t"
  202829. #elif defined(__clang__)
  202830. "adcs r6, r6\n\t"
  202831. #else
  202832. "adc r6, r6\n\t"
  202833. #endif
  202834. #ifdef WOLFSSL_KEIL
  202835. "adcs r7, r7, r7\n\t"
  202836. #elif defined(__clang__)
  202837. "adcs r7, r7\n\t"
  202838. #else
  202839. "adc r7, r7\n\t"
  202840. #endif
  202841. "str r4, [%[r], #16]\n\t"
  202842. "str r5, [%[r], #20]\n\t"
  202843. "str r6, [%[r], #24]\n\t"
  202844. "str r7, [%[r], #28]\n\t"
  202845. "ldr r4, [%[a], #32]\n\t"
  202846. "ldr r5, [%[a], #36]\n\t"
  202847. "ldr r6, [%[a], #40]\n\t"
  202848. "ldr r7, [%[a], #44]\n\t"
  202849. #ifdef WOLFSSL_KEIL
  202850. "adcs r4, r4, r4\n\t"
  202851. #elif defined(__clang__)
  202852. "adcs r4, r4\n\t"
  202853. #else
  202854. "adc r4, r4\n\t"
  202855. #endif
  202856. #ifdef WOLFSSL_KEIL
  202857. "adcs r5, r5, r5\n\t"
  202858. #elif defined(__clang__)
  202859. "adcs r5, r5\n\t"
  202860. #else
  202861. "adc r5, r5\n\t"
  202862. #endif
  202863. #ifdef WOLFSSL_KEIL
  202864. "adcs r6, r6, r6\n\t"
  202865. #elif defined(__clang__)
  202866. "adcs r6, r6\n\t"
  202867. #else
  202868. "adc r6, r6\n\t"
  202869. #endif
  202870. #ifdef WOLFSSL_KEIL
  202871. "adcs r7, r7, r7\n\t"
  202872. #elif defined(__clang__)
  202873. "adcs r7, r7\n\t"
  202874. #else
  202875. "adc r7, r7\n\t"
  202876. #endif
  202877. "str r4, [%[r], #32]\n\t"
  202878. "str r5, [%[r], #36]\n\t"
  202879. "str r6, [%[r], #40]\n\t"
  202880. "str r7, [%[r], #44]\n\t"
  202881. "ldr r4, [%[a], #48]\n\t"
  202882. "ldr r5, [%[a], #52]\n\t"
  202883. "ldr r6, [%[a], #56]\n\t"
  202884. "ldr r7, [%[a], #60]\n\t"
  202885. #ifdef WOLFSSL_KEIL
  202886. "adcs r4, r4, r4\n\t"
  202887. #elif defined(__clang__)
  202888. "adcs r4, r4\n\t"
  202889. #else
  202890. "adc r4, r4\n\t"
  202891. #endif
  202892. #ifdef WOLFSSL_KEIL
  202893. "adcs r5, r5, r5\n\t"
  202894. #elif defined(__clang__)
  202895. "adcs r5, r5\n\t"
  202896. #else
  202897. "adc r5, r5\n\t"
  202898. #endif
  202899. #ifdef WOLFSSL_KEIL
  202900. "adcs r6, r6, r6\n\t"
  202901. #elif defined(__clang__)
  202902. "adcs r6, r6\n\t"
  202903. #else
  202904. "adc r6, r6\n\t"
  202905. #endif
  202906. #ifdef WOLFSSL_KEIL
  202907. "adcs r7, r7, r7\n\t"
  202908. #elif defined(__clang__)
  202909. "adcs r7, r7\n\t"
  202910. #else
  202911. "adc r7, r7\n\t"
  202912. #endif
  202913. "str r4, [%[r], #48]\n\t"
  202914. "str r5, [%[r], #52]\n\t"
  202915. "str r6, [%[r], #56]\n\t"
  202916. "str r7, [%[r], #60]\n\t"
  202917. "ldr r4, [%[a], #64]\n\t"
  202918. "ldr r5, [%[a], #68]\n\t"
  202919. "ldr r6, [%[a], #72]\n\t"
  202920. "ldr r7, [%[a], #76]\n\t"
  202921. #ifdef WOLFSSL_KEIL
  202922. "adcs r4, r4, r4\n\t"
  202923. #elif defined(__clang__)
  202924. "adcs r4, r4\n\t"
  202925. #else
  202926. "adc r4, r4\n\t"
  202927. #endif
  202928. #ifdef WOLFSSL_KEIL
  202929. "adcs r5, r5, r5\n\t"
  202930. #elif defined(__clang__)
  202931. "adcs r5, r5\n\t"
  202932. #else
  202933. "adc r5, r5\n\t"
  202934. #endif
  202935. #ifdef WOLFSSL_KEIL
  202936. "adcs r6, r6, r6\n\t"
  202937. #elif defined(__clang__)
  202938. "adcs r6, r6\n\t"
  202939. #else
  202940. "adc r6, r6\n\t"
  202941. #endif
  202942. #ifdef WOLFSSL_KEIL
  202943. "adcs r7, r7, r7\n\t"
  202944. #elif defined(__clang__)
  202945. "adcs r7, r7\n\t"
  202946. #else
  202947. "adc r7, r7\n\t"
  202948. #endif
  202949. "str r4, [%[r], #64]\n\t"
  202950. "str r5, [%[r], #68]\n\t"
  202951. "str r6, [%[r], #72]\n\t"
  202952. "str r7, [%[r], #76]\n\t"
  202953. "ldr r4, [%[a], #80]\n\t"
  202954. "ldr r5, [%[a], #84]\n\t"
  202955. "ldr r6, [%[a], #88]\n\t"
  202956. "ldr r7, [%[a], #92]\n\t"
  202957. #ifdef WOLFSSL_KEIL
  202958. "adcs r4, r4, r4\n\t"
  202959. #elif defined(__clang__)
  202960. "adcs r4, r4\n\t"
  202961. #else
  202962. "adc r4, r4\n\t"
  202963. #endif
  202964. #ifdef WOLFSSL_KEIL
  202965. "adcs r5, r5, r5\n\t"
  202966. #elif defined(__clang__)
  202967. "adcs r5, r5\n\t"
  202968. #else
  202969. "adc r5, r5\n\t"
  202970. #endif
  202971. #ifdef WOLFSSL_KEIL
  202972. "adcs r6, r6, r6\n\t"
  202973. #elif defined(__clang__)
  202974. "adcs r6, r6\n\t"
  202975. #else
  202976. "adc r6, r6\n\t"
  202977. #endif
  202978. #ifdef WOLFSSL_KEIL
  202979. "adcs r7, r7, r7\n\t"
  202980. #elif defined(__clang__)
  202981. "adcs r7, r7\n\t"
  202982. #else
  202983. "adc r7, r7\n\t"
  202984. #endif
  202985. "str r4, [%[r], #80]\n\t"
  202986. "str r5, [%[r], #84]\n\t"
  202987. "str r6, [%[r], #88]\n\t"
  202988. "str r7, [%[r], #92]\n\t"
  202989. "ldr r4, [%[a], #96]\n\t"
  202990. "ldr r5, [%[a], #100]\n\t"
  202991. "ldr r6, [%[a], #104]\n\t"
  202992. "ldr r7, [%[a], #108]\n\t"
  202993. #ifdef WOLFSSL_KEIL
  202994. "adcs r4, r4, r4\n\t"
  202995. #elif defined(__clang__)
  202996. "adcs r4, r4\n\t"
  202997. #else
  202998. "adc r4, r4\n\t"
  202999. #endif
  203000. #ifdef WOLFSSL_KEIL
  203001. "adcs r5, r5, r5\n\t"
  203002. #elif defined(__clang__)
  203003. "adcs r5, r5\n\t"
  203004. #else
  203005. "adc r5, r5\n\t"
  203006. #endif
  203007. #ifdef WOLFSSL_KEIL
  203008. "adcs r6, r6, r6\n\t"
  203009. #elif defined(__clang__)
  203010. "adcs r6, r6\n\t"
  203011. #else
  203012. "adc r6, r6\n\t"
  203013. #endif
  203014. #ifdef WOLFSSL_KEIL
  203015. "adcs r7, r7, r7\n\t"
  203016. #elif defined(__clang__)
  203017. "adcs r7, r7\n\t"
  203018. #else
  203019. "adc r7, r7\n\t"
  203020. #endif
  203021. "str r4, [%[r], #96]\n\t"
  203022. "str r5, [%[r], #100]\n\t"
  203023. "str r6, [%[r], #104]\n\t"
  203024. "str r7, [%[r], #108]\n\t"
  203025. "ldr r4, [%[a], #112]\n\t"
  203026. "ldr r5, [%[a], #116]\n\t"
  203027. "ldr r6, [%[a], #120]\n\t"
  203028. "ldr r7, [%[a], #124]\n\t"
  203029. #ifdef WOLFSSL_KEIL
  203030. "adcs r4, r4, r4\n\t"
  203031. #elif defined(__clang__)
  203032. "adcs r4, r4\n\t"
  203033. #else
  203034. "adc r4, r4\n\t"
  203035. #endif
  203036. #ifdef WOLFSSL_KEIL
  203037. "adcs r5, r5, r5\n\t"
  203038. #elif defined(__clang__)
  203039. "adcs r5, r5\n\t"
  203040. #else
  203041. "adc r5, r5\n\t"
  203042. #endif
  203043. #ifdef WOLFSSL_KEIL
  203044. "adcs r6, r6, r6\n\t"
  203045. #elif defined(__clang__)
  203046. "adcs r6, r6\n\t"
  203047. #else
  203048. "adc r6, r6\n\t"
  203049. #endif
  203050. #ifdef WOLFSSL_KEIL
  203051. "adcs r7, r7, r7\n\t"
  203052. #elif defined(__clang__)
  203053. "adcs r7, r7\n\t"
  203054. #else
  203055. "adc r7, r7\n\t"
  203056. #endif
  203057. "str r4, [%[r], #112]\n\t"
  203058. "str r5, [%[r], #116]\n\t"
  203059. "str r6, [%[r], #120]\n\t"
  203060. "str r7, [%[r], #124]\n\t"
  203061. "movs r3, #0\n\t"
  203062. "ldr r4, [%[m], #124]\n\t"
  203063. #ifdef WOLFSSL_KEIL
  203064. "adcs r3, r3, r3\n\t"
  203065. #elif defined(__clang__)
  203066. "adcs r3, r3\n\t"
  203067. #else
  203068. "adc r3, r3\n\t"
  203069. #endif
  203070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  203071. "subs r4, r4, r7\n\t"
  203072. #else
  203073. "sub r4, r4, r7\n\t"
  203074. #endif
  203075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  203076. "negs r3, r3\n\t"
  203077. #else
  203078. "neg r3, r3\n\t"
  203079. #endif
  203080. #ifdef WOLFSSL_KEIL
  203081. "sbcs r4, r4, r4\n\t"
  203082. #elif defined(__clang__)
  203083. "sbcs r4, r4\n\t"
  203084. #else
  203085. "sbc r4, r4\n\t"
  203086. #endif
  203087. #ifdef WOLFSSL_KEIL
  203088. "orrs r3, r3, r4\n\t"
  203089. #elif defined(__clang__)
  203090. "orrs r3, r4\n\t"
  203091. #else
  203092. "orr r3, r4\n\t"
  203093. #endif
  203094. "ldr r4, [%[r]]\n\t"
  203095. "ldr r5, [%[r], #4]\n\t"
  203096. "ldr r6, [%[m]]\n\t"
  203097. "ldr r7, [%[m], #4]\n\t"
  203098. #ifdef WOLFSSL_KEIL
  203099. "ands r6, r6, r3\n\t"
  203100. #elif defined(__clang__)
  203101. "ands r6, r3\n\t"
  203102. #else
  203103. "and r6, r3\n\t"
  203104. #endif
  203105. #ifdef WOLFSSL_KEIL
  203106. "ands r7, r7, r3\n\t"
  203107. #elif defined(__clang__)
  203108. "ands r7, r3\n\t"
  203109. #else
  203110. "and r7, r3\n\t"
  203111. #endif
  203112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  203113. "subs r4, r4, r6\n\t"
  203114. #else
  203115. "sub r4, r4, r6\n\t"
  203116. #endif
  203117. #ifdef WOLFSSL_KEIL
  203118. "sbcs r5, r5, r7\n\t"
  203119. #elif defined(__clang__)
  203120. "sbcs r5, r7\n\t"
  203121. #else
  203122. "sbc r5, r7\n\t"
  203123. #endif
  203124. "str r4, [%[r]]\n\t"
  203125. "str r5, [%[r], #4]\n\t"
  203126. "ldr r4, [%[r], #8]\n\t"
  203127. "ldr r5, [%[r], #12]\n\t"
  203128. "ldr r6, [%[m], #8]\n\t"
  203129. "ldr r7, [%[m], #12]\n\t"
  203130. #ifdef WOLFSSL_KEIL
  203131. "ands r6, r6, r3\n\t"
  203132. #elif defined(__clang__)
  203133. "ands r6, r3\n\t"
  203134. #else
  203135. "and r6, r3\n\t"
  203136. #endif
  203137. #ifdef WOLFSSL_KEIL
  203138. "ands r7, r7, r3\n\t"
  203139. #elif defined(__clang__)
  203140. "ands r7, r3\n\t"
  203141. #else
  203142. "and r7, r3\n\t"
  203143. #endif
  203144. #ifdef WOLFSSL_KEIL
  203145. "sbcs r4, r4, r6\n\t"
  203146. #elif defined(__clang__)
  203147. "sbcs r4, r6\n\t"
  203148. #else
  203149. "sbc r4, r6\n\t"
  203150. #endif
  203151. #ifdef WOLFSSL_KEIL
  203152. "sbcs r5, r5, r7\n\t"
  203153. #elif defined(__clang__)
  203154. "sbcs r5, r7\n\t"
  203155. #else
  203156. "sbc r5, r7\n\t"
  203157. #endif
  203158. "str r4, [%[r], #8]\n\t"
  203159. "str r5, [%[r], #12]\n\t"
  203160. "ldr r4, [%[r], #16]\n\t"
  203161. "ldr r5, [%[r], #20]\n\t"
  203162. "ldr r6, [%[m], #16]\n\t"
  203163. "ldr r7, [%[m], #20]\n\t"
  203164. #ifdef WOLFSSL_KEIL
  203165. "ands r6, r6, r3\n\t"
  203166. #elif defined(__clang__)
  203167. "ands r6, r3\n\t"
  203168. #else
  203169. "and r6, r3\n\t"
  203170. #endif
  203171. #ifdef WOLFSSL_KEIL
  203172. "ands r7, r7, r3\n\t"
  203173. #elif defined(__clang__)
  203174. "ands r7, r3\n\t"
  203175. #else
  203176. "and r7, r3\n\t"
  203177. #endif
  203178. #ifdef WOLFSSL_KEIL
  203179. "sbcs r4, r4, r6\n\t"
  203180. #elif defined(__clang__)
  203181. "sbcs r4, r6\n\t"
  203182. #else
  203183. "sbc r4, r6\n\t"
  203184. #endif
  203185. #ifdef WOLFSSL_KEIL
  203186. "sbcs r5, r5, r7\n\t"
  203187. #elif defined(__clang__)
  203188. "sbcs r5, r7\n\t"
  203189. #else
  203190. "sbc r5, r7\n\t"
  203191. #endif
  203192. "str r4, [%[r], #16]\n\t"
  203193. "str r5, [%[r], #20]\n\t"
  203194. "ldr r4, [%[r], #24]\n\t"
  203195. "ldr r5, [%[r], #28]\n\t"
  203196. "ldr r6, [%[m], #24]\n\t"
  203197. "ldr r7, [%[m], #28]\n\t"
  203198. #ifdef WOLFSSL_KEIL
  203199. "ands r6, r6, r3\n\t"
  203200. #elif defined(__clang__)
  203201. "ands r6, r3\n\t"
  203202. #else
  203203. "and r6, r3\n\t"
  203204. #endif
  203205. #ifdef WOLFSSL_KEIL
  203206. "ands r7, r7, r3\n\t"
  203207. #elif defined(__clang__)
  203208. "ands r7, r3\n\t"
  203209. #else
  203210. "and r7, r3\n\t"
  203211. #endif
  203212. #ifdef WOLFSSL_KEIL
  203213. "sbcs r4, r4, r6\n\t"
  203214. #elif defined(__clang__)
  203215. "sbcs r4, r6\n\t"
  203216. #else
  203217. "sbc r4, r6\n\t"
  203218. #endif
  203219. #ifdef WOLFSSL_KEIL
  203220. "sbcs r5, r5, r7\n\t"
  203221. #elif defined(__clang__)
  203222. "sbcs r5, r7\n\t"
  203223. #else
  203224. "sbc r5, r7\n\t"
  203225. #endif
  203226. "str r4, [%[r], #24]\n\t"
  203227. "str r5, [%[r], #28]\n\t"
  203228. "ldr r4, [%[r], #32]\n\t"
  203229. "ldr r5, [%[r], #36]\n\t"
  203230. "ldr r6, [%[m], #32]\n\t"
  203231. "ldr r7, [%[m], #36]\n\t"
  203232. #ifdef WOLFSSL_KEIL
  203233. "ands r6, r6, r3\n\t"
  203234. #elif defined(__clang__)
  203235. "ands r6, r3\n\t"
  203236. #else
  203237. "and r6, r3\n\t"
  203238. #endif
  203239. #ifdef WOLFSSL_KEIL
  203240. "ands r7, r7, r3\n\t"
  203241. #elif defined(__clang__)
  203242. "ands r7, r3\n\t"
  203243. #else
  203244. "and r7, r3\n\t"
  203245. #endif
  203246. #ifdef WOLFSSL_KEIL
  203247. "sbcs r4, r4, r6\n\t"
  203248. #elif defined(__clang__)
  203249. "sbcs r4, r6\n\t"
  203250. #else
  203251. "sbc r4, r6\n\t"
  203252. #endif
  203253. #ifdef WOLFSSL_KEIL
  203254. "sbcs r5, r5, r7\n\t"
  203255. #elif defined(__clang__)
  203256. "sbcs r5, r7\n\t"
  203257. #else
  203258. "sbc r5, r7\n\t"
  203259. #endif
  203260. "str r4, [%[r], #32]\n\t"
  203261. "str r5, [%[r], #36]\n\t"
  203262. "ldr r4, [%[r], #40]\n\t"
  203263. "ldr r5, [%[r], #44]\n\t"
  203264. "ldr r6, [%[m], #40]\n\t"
  203265. "ldr r7, [%[m], #44]\n\t"
  203266. #ifdef WOLFSSL_KEIL
  203267. "ands r6, r6, r3\n\t"
  203268. #elif defined(__clang__)
  203269. "ands r6, r3\n\t"
  203270. #else
  203271. "and r6, r3\n\t"
  203272. #endif
  203273. #ifdef WOLFSSL_KEIL
  203274. "ands r7, r7, r3\n\t"
  203275. #elif defined(__clang__)
  203276. "ands r7, r3\n\t"
  203277. #else
  203278. "and r7, r3\n\t"
  203279. #endif
  203280. #ifdef WOLFSSL_KEIL
  203281. "sbcs r4, r4, r6\n\t"
  203282. #elif defined(__clang__)
  203283. "sbcs r4, r6\n\t"
  203284. #else
  203285. "sbc r4, r6\n\t"
  203286. #endif
  203287. #ifdef WOLFSSL_KEIL
  203288. "sbcs r5, r5, r7\n\t"
  203289. #elif defined(__clang__)
  203290. "sbcs r5, r7\n\t"
  203291. #else
  203292. "sbc r5, r7\n\t"
  203293. #endif
  203294. "str r4, [%[r], #40]\n\t"
  203295. "str r5, [%[r], #44]\n\t"
  203296. "ldr r4, [%[r], #48]\n\t"
  203297. "ldr r5, [%[r], #52]\n\t"
  203298. "ldr r6, [%[m], #48]\n\t"
  203299. "ldr r7, [%[m], #52]\n\t"
  203300. #ifdef WOLFSSL_KEIL
  203301. "ands r6, r6, r3\n\t"
  203302. #elif defined(__clang__)
  203303. "ands r6, r3\n\t"
  203304. #else
  203305. "and r6, r3\n\t"
  203306. #endif
  203307. #ifdef WOLFSSL_KEIL
  203308. "ands r7, r7, r3\n\t"
  203309. #elif defined(__clang__)
  203310. "ands r7, r3\n\t"
  203311. #else
  203312. "and r7, r3\n\t"
  203313. #endif
  203314. #ifdef WOLFSSL_KEIL
  203315. "sbcs r4, r4, r6\n\t"
  203316. #elif defined(__clang__)
  203317. "sbcs r4, r6\n\t"
  203318. #else
  203319. "sbc r4, r6\n\t"
  203320. #endif
  203321. #ifdef WOLFSSL_KEIL
  203322. "sbcs r5, r5, r7\n\t"
  203323. #elif defined(__clang__)
  203324. "sbcs r5, r7\n\t"
  203325. #else
  203326. "sbc r5, r7\n\t"
  203327. #endif
  203328. "str r4, [%[r], #48]\n\t"
  203329. "str r5, [%[r], #52]\n\t"
  203330. "ldr r4, [%[r], #56]\n\t"
  203331. "ldr r5, [%[r], #60]\n\t"
  203332. "ldr r6, [%[m], #56]\n\t"
  203333. "ldr r7, [%[m], #60]\n\t"
  203334. #ifdef WOLFSSL_KEIL
  203335. "ands r6, r6, r3\n\t"
  203336. #elif defined(__clang__)
  203337. "ands r6, r3\n\t"
  203338. #else
  203339. "and r6, r3\n\t"
  203340. #endif
  203341. #ifdef WOLFSSL_KEIL
  203342. "ands r7, r7, r3\n\t"
  203343. #elif defined(__clang__)
  203344. "ands r7, r3\n\t"
  203345. #else
  203346. "and r7, r3\n\t"
  203347. #endif
  203348. #ifdef WOLFSSL_KEIL
  203349. "sbcs r4, r4, r6\n\t"
  203350. #elif defined(__clang__)
  203351. "sbcs r4, r6\n\t"
  203352. #else
  203353. "sbc r4, r6\n\t"
  203354. #endif
  203355. #ifdef WOLFSSL_KEIL
  203356. "sbcs r5, r5, r7\n\t"
  203357. #elif defined(__clang__)
  203358. "sbcs r5, r7\n\t"
  203359. #else
  203360. "sbc r5, r7\n\t"
  203361. #endif
  203362. "str r4, [%[r], #56]\n\t"
  203363. "str r5, [%[r], #60]\n\t"
  203364. "ldr r4, [%[r], #64]\n\t"
  203365. "ldr r5, [%[r], #68]\n\t"
  203366. "ldr r6, [%[m], #64]\n\t"
  203367. "ldr r7, [%[m], #68]\n\t"
  203368. #ifdef WOLFSSL_KEIL
  203369. "ands r6, r6, r3\n\t"
  203370. #elif defined(__clang__)
  203371. "ands r6, r3\n\t"
  203372. #else
  203373. "and r6, r3\n\t"
  203374. #endif
  203375. #ifdef WOLFSSL_KEIL
  203376. "ands r7, r7, r3\n\t"
  203377. #elif defined(__clang__)
  203378. "ands r7, r3\n\t"
  203379. #else
  203380. "and r7, r3\n\t"
  203381. #endif
  203382. #ifdef WOLFSSL_KEIL
  203383. "sbcs r4, r4, r6\n\t"
  203384. #elif defined(__clang__)
  203385. "sbcs r4, r6\n\t"
  203386. #else
  203387. "sbc r4, r6\n\t"
  203388. #endif
  203389. #ifdef WOLFSSL_KEIL
  203390. "sbcs r5, r5, r7\n\t"
  203391. #elif defined(__clang__)
  203392. "sbcs r5, r7\n\t"
  203393. #else
  203394. "sbc r5, r7\n\t"
  203395. #endif
  203396. "str r4, [%[r], #64]\n\t"
  203397. "str r5, [%[r], #68]\n\t"
  203398. "ldr r4, [%[r], #72]\n\t"
  203399. "ldr r5, [%[r], #76]\n\t"
  203400. "ldr r6, [%[m], #72]\n\t"
  203401. "ldr r7, [%[m], #76]\n\t"
  203402. #ifdef WOLFSSL_KEIL
  203403. "ands r6, r6, r3\n\t"
  203404. #elif defined(__clang__)
  203405. "ands r6, r3\n\t"
  203406. #else
  203407. "and r6, r3\n\t"
  203408. #endif
  203409. #ifdef WOLFSSL_KEIL
  203410. "ands r7, r7, r3\n\t"
  203411. #elif defined(__clang__)
  203412. "ands r7, r3\n\t"
  203413. #else
  203414. "and r7, r3\n\t"
  203415. #endif
  203416. #ifdef WOLFSSL_KEIL
  203417. "sbcs r4, r4, r6\n\t"
  203418. #elif defined(__clang__)
  203419. "sbcs r4, r6\n\t"
  203420. #else
  203421. "sbc r4, r6\n\t"
  203422. #endif
  203423. #ifdef WOLFSSL_KEIL
  203424. "sbcs r5, r5, r7\n\t"
  203425. #elif defined(__clang__)
  203426. "sbcs r5, r7\n\t"
  203427. #else
  203428. "sbc r5, r7\n\t"
  203429. #endif
  203430. "str r4, [%[r], #72]\n\t"
  203431. "str r5, [%[r], #76]\n\t"
  203432. "ldr r4, [%[r], #80]\n\t"
  203433. "ldr r5, [%[r], #84]\n\t"
  203434. "ldr r6, [%[m], #80]\n\t"
  203435. "ldr r7, [%[m], #84]\n\t"
  203436. #ifdef WOLFSSL_KEIL
  203437. "ands r6, r6, r3\n\t"
  203438. #elif defined(__clang__)
  203439. "ands r6, r3\n\t"
  203440. #else
  203441. "and r6, r3\n\t"
  203442. #endif
  203443. #ifdef WOLFSSL_KEIL
  203444. "ands r7, r7, r3\n\t"
  203445. #elif defined(__clang__)
  203446. "ands r7, r3\n\t"
  203447. #else
  203448. "and r7, r3\n\t"
  203449. #endif
  203450. #ifdef WOLFSSL_KEIL
  203451. "sbcs r4, r4, r6\n\t"
  203452. #elif defined(__clang__)
  203453. "sbcs r4, r6\n\t"
  203454. #else
  203455. "sbc r4, r6\n\t"
  203456. #endif
  203457. #ifdef WOLFSSL_KEIL
  203458. "sbcs r5, r5, r7\n\t"
  203459. #elif defined(__clang__)
  203460. "sbcs r5, r7\n\t"
  203461. #else
  203462. "sbc r5, r7\n\t"
  203463. #endif
  203464. "str r4, [%[r], #80]\n\t"
  203465. "str r5, [%[r], #84]\n\t"
  203466. "ldr r4, [%[r], #88]\n\t"
  203467. "ldr r5, [%[r], #92]\n\t"
  203468. "ldr r6, [%[m], #88]\n\t"
  203469. "ldr r7, [%[m], #92]\n\t"
  203470. #ifdef WOLFSSL_KEIL
  203471. "ands r6, r6, r3\n\t"
  203472. #elif defined(__clang__)
  203473. "ands r6, r3\n\t"
  203474. #else
  203475. "and r6, r3\n\t"
  203476. #endif
  203477. #ifdef WOLFSSL_KEIL
  203478. "ands r7, r7, r3\n\t"
  203479. #elif defined(__clang__)
  203480. "ands r7, r3\n\t"
  203481. #else
  203482. "and r7, r3\n\t"
  203483. #endif
  203484. #ifdef WOLFSSL_KEIL
  203485. "sbcs r4, r4, r6\n\t"
  203486. #elif defined(__clang__)
  203487. "sbcs r4, r6\n\t"
  203488. #else
  203489. "sbc r4, r6\n\t"
  203490. #endif
  203491. #ifdef WOLFSSL_KEIL
  203492. "sbcs r5, r5, r7\n\t"
  203493. #elif defined(__clang__)
  203494. "sbcs r5, r7\n\t"
  203495. #else
  203496. "sbc r5, r7\n\t"
  203497. #endif
  203498. "str r4, [%[r], #88]\n\t"
  203499. "str r5, [%[r], #92]\n\t"
  203500. "ldr r4, [%[r], #96]\n\t"
  203501. "ldr r5, [%[r], #100]\n\t"
  203502. "ldr r6, [%[m], #96]\n\t"
  203503. "ldr r7, [%[m], #100]\n\t"
  203504. #ifdef WOLFSSL_KEIL
  203505. "ands r6, r6, r3\n\t"
  203506. #elif defined(__clang__)
  203507. "ands r6, r3\n\t"
  203508. #else
  203509. "and r6, r3\n\t"
  203510. #endif
  203511. #ifdef WOLFSSL_KEIL
  203512. "ands r7, r7, r3\n\t"
  203513. #elif defined(__clang__)
  203514. "ands r7, r3\n\t"
  203515. #else
  203516. "and r7, r3\n\t"
  203517. #endif
  203518. #ifdef WOLFSSL_KEIL
  203519. "sbcs r4, r4, r6\n\t"
  203520. #elif defined(__clang__)
  203521. "sbcs r4, r6\n\t"
  203522. #else
  203523. "sbc r4, r6\n\t"
  203524. #endif
  203525. #ifdef WOLFSSL_KEIL
  203526. "sbcs r5, r5, r7\n\t"
  203527. #elif defined(__clang__)
  203528. "sbcs r5, r7\n\t"
  203529. #else
  203530. "sbc r5, r7\n\t"
  203531. #endif
  203532. "str r4, [%[r], #96]\n\t"
  203533. "str r5, [%[r], #100]\n\t"
  203534. "ldr r4, [%[r], #104]\n\t"
  203535. "ldr r5, [%[r], #108]\n\t"
  203536. "ldr r6, [%[m], #104]\n\t"
  203537. "ldr r7, [%[m], #108]\n\t"
  203538. #ifdef WOLFSSL_KEIL
  203539. "ands r6, r6, r3\n\t"
  203540. #elif defined(__clang__)
  203541. "ands r6, r3\n\t"
  203542. #else
  203543. "and r6, r3\n\t"
  203544. #endif
  203545. #ifdef WOLFSSL_KEIL
  203546. "ands r7, r7, r3\n\t"
  203547. #elif defined(__clang__)
  203548. "ands r7, r3\n\t"
  203549. #else
  203550. "and r7, r3\n\t"
  203551. #endif
  203552. #ifdef WOLFSSL_KEIL
  203553. "sbcs r4, r4, r6\n\t"
  203554. #elif defined(__clang__)
  203555. "sbcs r4, r6\n\t"
  203556. #else
  203557. "sbc r4, r6\n\t"
  203558. #endif
  203559. #ifdef WOLFSSL_KEIL
  203560. "sbcs r5, r5, r7\n\t"
  203561. #elif defined(__clang__)
  203562. "sbcs r5, r7\n\t"
  203563. #else
  203564. "sbc r5, r7\n\t"
  203565. #endif
  203566. "str r4, [%[r], #104]\n\t"
  203567. "str r5, [%[r], #108]\n\t"
  203568. "ldr r4, [%[r], #112]\n\t"
  203569. "ldr r5, [%[r], #116]\n\t"
  203570. "ldr r6, [%[m], #112]\n\t"
  203571. "ldr r7, [%[m], #116]\n\t"
  203572. #ifdef WOLFSSL_KEIL
  203573. "ands r6, r6, r3\n\t"
  203574. #elif defined(__clang__)
  203575. "ands r6, r3\n\t"
  203576. #else
  203577. "and r6, r3\n\t"
  203578. #endif
  203579. #ifdef WOLFSSL_KEIL
  203580. "ands r7, r7, r3\n\t"
  203581. #elif defined(__clang__)
  203582. "ands r7, r3\n\t"
  203583. #else
  203584. "and r7, r3\n\t"
  203585. #endif
  203586. #ifdef WOLFSSL_KEIL
  203587. "sbcs r4, r4, r6\n\t"
  203588. #elif defined(__clang__)
  203589. "sbcs r4, r6\n\t"
  203590. #else
  203591. "sbc r4, r6\n\t"
  203592. #endif
  203593. #ifdef WOLFSSL_KEIL
  203594. "sbcs r5, r5, r7\n\t"
  203595. #elif defined(__clang__)
  203596. "sbcs r5, r7\n\t"
  203597. #else
  203598. "sbc r5, r7\n\t"
  203599. #endif
  203600. "str r4, [%[r], #112]\n\t"
  203601. "str r5, [%[r], #116]\n\t"
  203602. "ldr r4, [%[r], #120]\n\t"
  203603. "ldr r5, [%[r], #124]\n\t"
  203604. "ldr r6, [%[m], #120]\n\t"
  203605. "ldr r7, [%[m], #124]\n\t"
  203606. #ifdef WOLFSSL_KEIL
  203607. "ands r6, r6, r3\n\t"
  203608. #elif defined(__clang__)
  203609. "ands r6, r3\n\t"
  203610. #else
  203611. "and r6, r3\n\t"
  203612. #endif
  203613. #ifdef WOLFSSL_KEIL
  203614. "ands r7, r7, r3\n\t"
  203615. #elif defined(__clang__)
  203616. "ands r7, r3\n\t"
  203617. #else
  203618. "and r7, r3\n\t"
  203619. #endif
  203620. #ifdef WOLFSSL_KEIL
  203621. "sbcs r4, r4, r6\n\t"
  203622. #elif defined(__clang__)
  203623. "sbcs r4, r6\n\t"
  203624. #else
  203625. "sbc r4, r6\n\t"
  203626. #endif
  203627. #ifdef WOLFSSL_KEIL
  203628. "sbcs r5, r5, r7\n\t"
  203629. #elif defined(__clang__)
  203630. "sbcs r5, r7\n\t"
  203631. #else
  203632. "sbc r5, r7\n\t"
  203633. #endif
  203634. "str r4, [%[r], #120]\n\t"
  203635. "str r5, [%[r], #124]\n\t"
  203636. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  203637. :
  203638. : "memory", "r3", "r4", "r5", "r6", "r7"
  203639. );
  203640. }
  203641. /* Triple a Montgomery form number (r = a + a + a % m).
  203642. *
  203643. * r Result of Tripling.
  203644. * a Number to triple in Montgomery form.
  203645. * m Modulus (prime).
  203646. */
  203647. SP_NOINLINE static void sp_1024_mont_tpl_32(sp_digit* r, const sp_digit* a,
  203648. const sp_digit* m)
  203649. {
  203650. __asm__ __volatile__ (
  203651. "ldr r4, [%[a]]\n\t"
  203652. "ldr r5, [%[a], #4]\n\t"
  203653. "ldr r6, [%[a], #8]\n\t"
  203654. "ldr r7, [%[a], #12]\n\t"
  203655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  203656. "adds r4, r4, r4\n\t"
  203657. #else
  203658. "add r4, r4, r4\n\t"
  203659. #endif
  203660. #ifdef WOLFSSL_KEIL
  203661. "adcs r5, r5, r5\n\t"
  203662. #elif defined(__clang__)
  203663. "adcs r5, r5\n\t"
  203664. #else
  203665. "adc r5, r5\n\t"
  203666. #endif
  203667. #ifdef WOLFSSL_KEIL
  203668. "adcs r6, r6, r6\n\t"
  203669. #elif defined(__clang__)
  203670. "adcs r6, r6\n\t"
  203671. #else
  203672. "adc r6, r6\n\t"
  203673. #endif
  203674. #ifdef WOLFSSL_KEIL
  203675. "adcs r7, r7, r7\n\t"
  203676. #elif defined(__clang__)
  203677. "adcs r7, r7\n\t"
  203678. #else
  203679. "adc r7, r7\n\t"
  203680. #endif
  203681. "str r4, [%[r]]\n\t"
  203682. "str r5, [%[r], #4]\n\t"
  203683. "str r6, [%[r], #8]\n\t"
  203684. "str r7, [%[r], #12]\n\t"
  203685. "ldr r4, [%[a], #16]\n\t"
  203686. "ldr r5, [%[a], #20]\n\t"
  203687. "ldr r6, [%[a], #24]\n\t"
  203688. "ldr r7, [%[a], #28]\n\t"
  203689. #ifdef WOLFSSL_KEIL
  203690. "adcs r4, r4, r4\n\t"
  203691. #elif defined(__clang__)
  203692. "adcs r4, r4\n\t"
  203693. #else
  203694. "adc r4, r4\n\t"
  203695. #endif
  203696. #ifdef WOLFSSL_KEIL
  203697. "adcs r5, r5, r5\n\t"
  203698. #elif defined(__clang__)
  203699. "adcs r5, r5\n\t"
  203700. #else
  203701. "adc r5, r5\n\t"
  203702. #endif
  203703. #ifdef WOLFSSL_KEIL
  203704. "adcs r6, r6, r6\n\t"
  203705. #elif defined(__clang__)
  203706. "adcs r6, r6\n\t"
  203707. #else
  203708. "adc r6, r6\n\t"
  203709. #endif
  203710. #ifdef WOLFSSL_KEIL
  203711. "adcs r7, r7, r7\n\t"
  203712. #elif defined(__clang__)
  203713. "adcs r7, r7\n\t"
  203714. #else
  203715. "adc r7, r7\n\t"
  203716. #endif
  203717. "str r4, [%[r], #16]\n\t"
  203718. "str r5, [%[r], #20]\n\t"
  203719. "str r6, [%[r], #24]\n\t"
  203720. "str r7, [%[r], #28]\n\t"
  203721. "ldr r4, [%[a], #32]\n\t"
  203722. "ldr r5, [%[a], #36]\n\t"
  203723. "ldr r6, [%[a], #40]\n\t"
  203724. "ldr r7, [%[a], #44]\n\t"
  203725. #ifdef WOLFSSL_KEIL
  203726. "adcs r4, r4, r4\n\t"
  203727. #elif defined(__clang__)
  203728. "adcs r4, r4\n\t"
  203729. #else
  203730. "adc r4, r4\n\t"
  203731. #endif
  203732. #ifdef WOLFSSL_KEIL
  203733. "adcs r5, r5, r5\n\t"
  203734. #elif defined(__clang__)
  203735. "adcs r5, r5\n\t"
  203736. #else
  203737. "adc r5, r5\n\t"
  203738. #endif
  203739. #ifdef WOLFSSL_KEIL
  203740. "adcs r6, r6, r6\n\t"
  203741. #elif defined(__clang__)
  203742. "adcs r6, r6\n\t"
  203743. #else
  203744. "adc r6, r6\n\t"
  203745. #endif
  203746. #ifdef WOLFSSL_KEIL
  203747. "adcs r7, r7, r7\n\t"
  203748. #elif defined(__clang__)
  203749. "adcs r7, r7\n\t"
  203750. #else
  203751. "adc r7, r7\n\t"
  203752. #endif
  203753. "str r4, [%[r], #32]\n\t"
  203754. "str r5, [%[r], #36]\n\t"
  203755. "str r6, [%[r], #40]\n\t"
  203756. "str r7, [%[r], #44]\n\t"
  203757. "ldr r4, [%[a], #48]\n\t"
  203758. "ldr r5, [%[a], #52]\n\t"
  203759. "ldr r6, [%[a], #56]\n\t"
  203760. "ldr r7, [%[a], #60]\n\t"
  203761. #ifdef WOLFSSL_KEIL
  203762. "adcs r4, r4, r4\n\t"
  203763. #elif defined(__clang__)
  203764. "adcs r4, r4\n\t"
  203765. #else
  203766. "adc r4, r4\n\t"
  203767. #endif
  203768. #ifdef WOLFSSL_KEIL
  203769. "adcs r5, r5, r5\n\t"
  203770. #elif defined(__clang__)
  203771. "adcs r5, r5\n\t"
  203772. #else
  203773. "adc r5, r5\n\t"
  203774. #endif
  203775. #ifdef WOLFSSL_KEIL
  203776. "adcs r6, r6, r6\n\t"
  203777. #elif defined(__clang__)
  203778. "adcs r6, r6\n\t"
  203779. #else
  203780. "adc r6, r6\n\t"
  203781. #endif
  203782. #ifdef WOLFSSL_KEIL
  203783. "adcs r7, r7, r7\n\t"
  203784. #elif defined(__clang__)
  203785. "adcs r7, r7\n\t"
  203786. #else
  203787. "adc r7, r7\n\t"
  203788. #endif
  203789. "str r4, [%[r], #48]\n\t"
  203790. "str r5, [%[r], #52]\n\t"
  203791. "str r6, [%[r], #56]\n\t"
  203792. "str r7, [%[r], #60]\n\t"
  203793. "ldr r4, [%[a], #64]\n\t"
  203794. "ldr r5, [%[a], #68]\n\t"
  203795. "ldr r6, [%[a], #72]\n\t"
  203796. "ldr r7, [%[a], #76]\n\t"
  203797. #ifdef WOLFSSL_KEIL
  203798. "adcs r4, r4, r4\n\t"
  203799. #elif defined(__clang__)
  203800. "adcs r4, r4\n\t"
  203801. #else
  203802. "adc r4, r4\n\t"
  203803. #endif
  203804. #ifdef WOLFSSL_KEIL
  203805. "adcs r5, r5, r5\n\t"
  203806. #elif defined(__clang__)
  203807. "adcs r5, r5\n\t"
  203808. #else
  203809. "adc r5, r5\n\t"
  203810. #endif
  203811. #ifdef WOLFSSL_KEIL
  203812. "adcs r6, r6, r6\n\t"
  203813. #elif defined(__clang__)
  203814. "adcs r6, r6\n\t"
  203815. #else
  203816. "adc r6, r6\n\t"
  203817. #endif
  203818. #ifdef WOLFSSL_KEIL
  203819. "adcs r7, r7, r7\n\t"
  203820. #elif defined(__clang__)
  203821. "adcs r7, r7\n\t"
  203822. #else
  203823. "adc r7, r7\n\t"
  203824. #endif
  203825. "str r4, [%[r], #64]\n\t"
  203826. "str r5, [%[r], #68]\n\t"
  203827. "str r6, [%[r], #72]\n\t"
  203828. "str r7, [%[r], #76]\n\t"
  203829. "ldr r4, [%[a], #80]\n\t"
  203830. "ldr r5, [%[a], #84]\n\t"
  203831. "ldr r6, [%[a], #88]\n\t"
  203832. "ldr r7, [%[a], #92]\n\t"
  203833. #ifdef WOLFSSL_KEIL
  203834. "adcs r4, r4, r4\n\t"
  203835. #elif defined(__clang__)
  203836. "adcs r4, r4\n\t"
  203837. #else
  203838. "adc r4, r4\n\t"
  203839. #endif
  203840. #ifdef WOLFSSL_KEIL
  203841. "adcs r5, r5, r5\n\t"
  203842. #elif defined(__clang__)
  203843. "adcs r5, r5\n\t"
  203844. #else
  203845. "adc r5, r5\n\t"
  203846. #endif
  203847. #ifdef WOLFSSL_KEIL
  203848. "adcs r6, r6, r6\n\t"
  203849. #elif defined(__clang__)
  203850. "adcs r6, r6\n\t"
  203851. #else
  203852. "adc r6, r6\n\t"
  203853. #endif
  203854. #ifdef WOLFSSL_KEIL
  203855. "adcs r7, r7, r7\n\t"
  203856. #elif defined(__clang__)
  203857. "adcs r7, r7\n\t"
  203858. #else
  203859. "adc r7, r7\n\t"
  203860. #endif
  203861. "str r4, [%[r], #80]\n\t"
  203862. "str r5, [%[r], #84]\n\t"
  203863. "str r6, [%[r], #88]\n\t"
  203864. "str r7, [%[r], #92]\n\t"
  203865. "ldr r4, [%[a], #96]\n\t"
  203866. "ldr r5, [%[a], #100]\n\t"
  203867. "ldr r6, [%[a], #104]\n\t"
  203868. "ldr r7, [%[a], #108]\n\t"
  203869. #ifdef WOLFSSL_KEIL
  203870. "adcs r4, r4, r4\n\t"
  203871. #elif defined(__clang__)
  203872. "adcs r4, r4\n\t"
  203873. #else
  203874. "adc r4, r4\n\t"
  203875. #endif
  203876. #ifdef WOLFSSL_KEIL
  203877. "adcs r5, r5, r5\n\t"
  203878. #elif defined(__clang__)
  203879. "adcs r5, r5\n\t"
  203880. #else
  203881. "adc r5, r5\n\t"
  203882. #endif
  203883. #ifdef WOLFSSL_KEIL
  203884. "adcs r6, r6, r6\n\t"
  203885. #elif defined(__clang__)
  203886. "adcs r6, r6\n\t"
  203887. #else
  203888. "adc r6, r6\n\t"
  203889. #endif
  203890. #ifdef WOLFSSL_KEIL
  203891. "adcs r7, r7, r7\n\t"
  203892. #elif defined(__clang__)
  203893. "adcs r7, r7\n\t"
  203894. #else
  203895. "adc r7, r7\n\t"
  203896. #endif
  203897. "str r4, [%[r], #96]\n\t"
  203898. "str r5, [%[r], #100]\n\t"
  203899. "str r6, [%[r], #104]\n\t"
  203900. "str r7, [%[r], #108]\n\t"
  203901. "ldr r4, [%[a], #112]\n\t"
  203902. "ldr r5, [%[a], #116]\n\t"
  203903. "ldr r6, [%[a], #120]\n\t"
  203904. "ldr r7, [%[a], #124]\n\t"
  203905. #ifdef WOLFSSL_KEIL
  203906. "adcs r4, r4, r4\n\t"
  203907. #elif defined(__clang__)
  203908. "adcs r4, r4\n\t"
  203909. #else
  203910. "adc r4, r4\n\t"
  203911. #endif
  203912. #ifdef WOLFSSL_KEIL
  203913. "adcs r5, r5, r5\n\t"
  203914. #elif defined(__clang__)
  203915. "adcs r5, r5\n\t"
  203916. #else
  203917. "adc r5, r5\n\t"
  203918. #endif
  203919. #ifdef WOLFSSL_KEIL
  203920. "adcs r6, r6, r6\n\t"
  203921. #elif defined(__clang__)
  203922. "adcs r6, r6\n\t"
  203923. #else
  203924. "adc r6, r6\n\t"
  203925. #endif
  203926. #ifdef WOLFSSL_KEIL
  203927. "adcs r7, r7, r7\n\t"
  203928. #elif defined(__clang__)
  203929. "adcs r7, r7\n\t"
  203930. #else
  203931. "adc r7, r7\n\t"
  203932. #endif
  203933. "str r4, [%[r], #112]\n\t"
  203934. "str r5, [%[r], #116]\n\t"
  203935. "str r6, [%[r], #120]\n\t"
  203936. "str r7, [%[r], #124]\n\t"
  203937. "movs r3, #0\n\t"
  203938. "ldr r4, [%[m], #124]\n\t"
  203939. #ifdef WOLFSSL_KEIL
  203940. "adcs r3, r3, r3\n\t"
  203941. #elif defined(__clang__)
  203942. "adcs r3, r3\n\t"
  203943. #else
  203944. "adc r3, r3\n\t"
  203945. #endif
  203946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  203947. "subs r4, r4, r7\n\t"
  203948. #else
  203949. "sub r4, r4, r7\n\t"
  203950. #endif
  203951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  203952. "negs r3, r3\n\t"
  203953. #else
  203954. "neg r3, r3\n\t"
  203955. #endif
  203956. #ifdef WOLFSSL_KEIL
  203957. "sbcs r4, r4, r4\n\t"
  203958. #elif defined(__clang__)
  203959. "sbcs r4, r4\n\t"
  203960. #else
  203961. "sbc r4, r4\n\t"
  203962. #endif
  203963. #ifdef WOLFSSL_KEIL
  203964. "orrs r3, r3, r4\n\t"
  203965. #elif defined(__clang__)
  203966. "orrs r3, r4\n\t"
  203967. #else
  203968. "orr r3, r4\n\t"
  203969. #endif
  203970. "ldr r4, [%[r]]\n\t"
  203971. "ldr r5, [%[r], #4]\n\t"
  203972. "ldr r6, [%[m]]\n\t"
  203973. "ldr r7, [%[m], #4]\n\t"
  203974. #ifdef WOLFSSL_KEIL
  203975. "ands r6, r6, r3\n\t"
  203976. #elif defined(__clang__)
  203977. "ands r6, r3\n\t"
  203978. #else
  203979. "and r6, r3\n\t"
  203980. #endif
  203981. #ifdef WOLFSSL_KEIL
  203982. "ands r7, r7, r3\n\t"
  203983. #elif defined(__clang__)
  203984. "ands r7, r3\n\t"
  203985. #else
  203986. "and r7, r3\n\t"
  203987. #endif
  203988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  203989. "subs r4, r4, r6\n\t"
  203990. #else
  203991. "sub r4, r4, r6\n\t"
  203992. #endif
  203993. #ifdef WOLFSSL_KEIL
  203994. "sbcs r5, r5, r7\n\t"
  203995. #elif defined(__clang__)
  203996. "sbcs r5, r7\n\t"
  203997. #else
  203998. "sbc r5, r7\n\t"
  203999. #endif
  204000. "str r4, [%[r]]\n\t"
  204001. "str r5, [%[r], #4]\n\t"
  204002. "ldr r4, [%[r], #8]\n\t"
  204003. "ldr r5, [%[r], #12]\n\t"
  204004. "ldr r6, [%[m], #8]\n\t"
  204005. "ldr r7, [%[m], #12]\n\t"
  204006. #ifdef WOLFSSL_KEIL
  204007. "ands r6, r6, r3\n\t"
  204008. #elif defined(__clang__)
  204009. "ands r6, r3\n\t"
  204010. #else
  204011. "and r6, r3\n\t"
  204012. #endif
  204013. #ifdef WOLFSSL_KEIL
  204014. "ands r7, r7, r3\n\t"
  204015. #elif defined(__clang__)
  204016. "ands r7, r3\n\t"
  204017. #else
  204018. "and r7, r3\n\t"
  204019. #endif
  204020. #ifdef WOLFSSL_KEIL
  204021. "sbcs r4, r4, r6\n\t"
  204022. #elif defined(__clang__)
  204023. "sbcs r4, r6\n\t"
  204024. #else
  204025. "sbc r4, r6\n\t"
  204026. #endif
  204027. #ifdef WOLFSSL_KEIL
  204028. "sbcs r5, r5, r7\n\t"
  204029. #elif defined(__clang__)
  204030. "sbcs r5, r7\n\t"
  204031. #else
  204032. "sbc r5, r7\n\t"
  204033. #endif
  204034. "str r4, [%[r], #8]\n\t"
  204035. "str r5, [%[r], #12]\n\t"
  204036. "ldr r4, [%[r], #16]\n\t"
  204037. "ldr r5, [%[r], #20]\n\t"
  204038. "ldr r6, [%[m], #16]\n\t"
  204039. "ldr r7, [%[m], #20]\n\t"
  204040. #ifdef WOLFSSL_KEIL
  204041. "ands r6, r6, r3\n\t"
  204042. #elif defined(__clang__)
  204043. "ands r6, r3\n\t"
  204044. #else
  204045. "and r6, r3\n\t"
  204046. #endif
  204047. #ifdef WOLFSSL_KEIL
  204048. "ands r7, r7, r3\n\t"
  204049. #elif defined(__clang__)
  204050. "ands r7, r3\n\t"
  204051. #else
  204052. "and r7, r3\n\t"
  204053. #endif
  204054. #ifdef WOLFSSL_KEIL
  204055. "sbcs r4, r4, r6\n\t"
  204056. #elif defined(__clang__)
  204057. "sbcs r4, r6\n\t"
  204058. #else
  204059. "sbc r4, r6\n\t"
  204060. #endif
  204061. #ifdef WOLFSSL_KEIL
  204062. "sbcs r5, r5, r7\n\t"
  204063. #elif defined(__clang__)
  204064. "sbcs r5, r7\n\t"
  204065. #else
  204066. "sbc r5, r7\n\t"
  204067. #endif
  204068. "str r4, [%[r], #16]\n\t"
  204069. "str r5, [%[r], #20]\n\t"
  204070. "ldr r4, [%[r], #24]\n\t"
  204071. "ldr r5, [%[r], #28]\n\t"
  204072. "ldr r6, [%[m], #24]\n\t"
  204073. "ldr r7, [%[m], #28]\n\t"
  204074. #ifdef WOLFSSL_KEIL
  204075. "ands r6, r6, r3\n\t"
  204076. #elif defined(__clang__)
  204077. "ands r6, r3\n\t"
  204078. #else
  204079. "and r6, r3\n\t"
  204080. #endif
  204081. #ifdef WOLFSSL_KEIL
  204082. "ands r7, r7, r3\n\t"
  204083. #elif defined(__clang__)
  204084. "ands r7, r3\n\t"
  204085. #else
  204086. "and r7, r3\n\t"
  204087. #endif
  204088. #ifdef WOLFSSL_KEIL
  204089. "sbcs r4, r4, r6\n\t"
  204090. #elif defined(__clang__)
  204091. "sbcs r4, r6\n\t"
  204092. #else
  204093. "sbc r4, r6\n\t"
  204094. #endif
  204095. #ifdef WOLFSSL_KEIL
  204096. "sbcs r5, r5, r7\n\t"
  204097. #elif defined(__clang__)
  204098. "sbcs r5, r7\n\t"
  204099. #else
  204100. "sbc r5, r7\n\t"
  204101. #endif
  204102. "str r4, [%[r], #24]\n\t"
  204103. "str r5, [%[r], #28]\n\t"
  204104. "ldr r4, [%[r], #32]\n\t"
  204105. "ldr r5, [%[r], #36]\n\t"
  204106. "ldr r6, [%[m], #32]\n\t"
  204107. "ldr r7, [%[m], #36]\n\t"
  204108. #ifdef WOLFSSL_KEIL
  204109. "ands r6, r6, r3\n\t"
  204110. #elif defined(__clang__)
  204111. "ands r6, r3\n\t"
  204112. #else
  204113. "and r6, r3\n\t"
  204114. #endif
  204115. #ifdef WOLFSSL_KEIL
  204116. "ands r7, r7, r3\n\t"
  204117. #elif defined(__clang__)
  204118. "ands r7, r3\n\t"
  204119. #else
  204120. "and r7, r3\n\t"
  204121. #endif
  204122. #ifdef WOLFSSL_KEIL
  204123. "sbcs r4, r4, r6\n\t"
  204124. #elif defined(__clang__)
  204125. "sbcs r4, r6\n\t"
  204126. #else
  204127. "sbc r4, r6\n\t"
  204128. #endif
  204129. #ifdef WOLFSSL_KEIL
  204130. "sbcs r5, r5, r7\n\t"
  204131. #elif defined(__clang__)
  204132. "sbcs r5, r7\n\t"
  204133. #else
  204134. "sbc r5, r7\n\t"
  204135. #endif
  204136. "str r4, [%[r], #32]\n\t"
  204137. "str r5, [%[r], #36]\n\t"
  204138. "ldr r4, [%[r], #40]\n\t"
  204139. "ldr r5, [%[r], #44]\n\t"
  204140. "ldr r6, [%[m], #40]\n\t"
  204141. "ldr r7, [%[m], #44]\n\t"
  204142. #ifdef WOLFSSL_KEIL
  204143. "ands r6, r6, r3\n\t"
  204144. #elif defined(__clang__)
  204145. "ands r6, r3\n\t"
  204146. #else
  204147. "and r6, r3\n\t"
  204148. #endif
  204149. #ifdef WOLFSSL_KEIL
  204150. "ands r7, r7, r3\n\t"
  204151. #elif defined(__clang__)
  204152. "ands r7, r3\n\t"
  204153. #else
  204154. "and r7, r3\n\t"
  204155. #endif
  204156. #ifdef WOLFSSL_KEIL
  204157. "sbcs r4, r4, r6\n\t"
  204158. #elif defined(__clang__)
  204159. "sbcs r4, r6\n\t"
  204160. #else
  204161. "sbc r4, r6\n\t"
  204162. #endif
  204163. #ifdef WOLFSSL_KEIL
  204164. "sbcs r5, r5, r7\n\t"
  204165. #elif defined(__clang__)
  204166. "sbcs r5, r7\n\t"
  204167. #else
  204168. "sbc r5, r7\n\t"
  204169. #endif
  204170. "str r4, [%[r], #40]\n\t"
  204171. "str r5, [%[r], #44]\n\t"
  204172. "ldr r4, [%[r], #48]\n\t"
  204173. "ldr r5, [%[r], #52]\n\t"
  204174. "ldr r6, [%[m], #48]\n\t"
  204175. "ldr r7, [%[m], #52]\n\t"
  204176. #ifdef WOLFSSL_KEIL
  204177. "ands r6, r6, r3\n\t"
  204178. #elif defined(__clang__)
  204179. "ands r6, r3\n\t"
  204180. #else
  204181. "and r6, r3\n\t"
  204182. #endif
  204183. #ifdef WOLFSSL_KEIL
  204184. "ands r7, r7, r3\n\t"
  204185. #elif defined(__clang__)
  204186. "ands r7, r3\n\t"
  204187. #else
  204188. "and r7, r3\n\t"
  204189. #endif
  204190. #ifdef WOLFSSL_KEIL
  204191. "sbcs r4, r4, r6\n\t"
  204192. #elif defined(__clang__)
  204193. "sbcs r4, r6\n\t"
  204194. #else
  204195. "sbc r4, r6\n\t"
  204196. #endif
  204197. #ifdef WOLFSSL_KEIL
  204198. "sbcs r5, r5, r7\n\t"
  204199. #elif defined(__clang__)
  204200. "sbcs r5, r7\n\t"
  204201. #else
  204202. "sbc r5, r7\n\t"
  204203. #endif
  204204. "str r4, [%[r], #48]\n\t"
  204205. "str r5, [%[r], #52]\n\t"
  204206. "ldr r4, [%[r], #56]\n\t"
  204207. "ldr r5, [%[r], #60]\n\t"
  204208. "ldr r6, [%[m], #56]\n\t"
  204209. "ldr r7, [%[m], #60]\n\t"
  204210. #ifdef WOLFSSL_KEIL
  204211. "ands r6, r6, r3\n\t"
  204212. #elif defined(__clang__)
  204213. "ands r6, r3\n\t"
  204214. #else
  204215. "and r6, r3\n\t"
  204216. #endif
  204217. #ifdef WOLFSSL_KEIL
  204218. "ands r7, r7, r3\n\t"
  204219. #elif defined(__clang__)
  204220. "ands r7, r3\n\t"
  204221. #else
  204222. "and r7, r3\n\t"
  204223. #endif
  204224. #ifdef WOLFSSL_KEIL
  204225. "sbcs r4, r4, r6\n\t"
  204226. #elif defined(__clang__)
  204227. "sbcs r4, r6\n\t"
  204228. #else
  204229. "sbc r4, r6\n\t"
  204230. #endif
  204231. #ifdef WOLFSSL_KEIL
  204232. "sbcs r5, r5, r7\n\t"
  204233. #elif defined(__clang__)
  204234. "sbcs r5, r7\n\t"
  204235. #else
  204236. "sbc r5, r7\n\t"
  204237. #endif
  204238. "str r4, [%[r], #56]\n\t"
  204239. "str r5, [%[r], #60]\n\t"
  204240. "ldr r4, [%[r], #64]\n\t"
  204241. "ldr r5, [%[r], #68]\n\t"
  204242. "ldr r6, [%[m], #64]\n\t"
  204243. "ldr r7, [%[m], #68]\n\t"
  204244. #ifdef WOLFSSL_KEIL
  204245. "ands r6, r6, r3\n\t"
  204246. #elif defined(__clang__)
  204247. "ands r6, r3\n\t"
  204248. #else
  204249. "and r6, r3\n\t"
  204250. #endif
  204251. #ifdef WOLFSSL_KEIL
  204252. "ands r7, r7, r3\n\t"
  204253. #elif defined(__clang__)
  204254. "ands r7, r3\n\t"
  204255. #else
  204256. "and r7, r3\n\t"
  204257. #endif
  204258. #ifdef WOLFSSL_KEIL
  204259. "sbcs r4, r4, r6\n\t"
  204260. #elif defined(__clang__)
  204261. "sbcs r4, r6\n\t"
  204262. #else
  204263. "sbc r4, r6\n\t"
  204264. #endif
  204265. #ifdef WOLFSSL_KEIL
  204266. "sbcs r5, r5, r7\n\t"
  204267. #elif defined(__clang__)
  204268. "sbcs r5, r7\n\t"
  204269. #else
  204270. "sbc r5, r7\n\t"
  204271. #endif
  204272. "str r4, [%[r], #64]\n\t"
  204273. "str r5, [%[r], #68]\n\t"
  204274. "ldr r4, [%[r], #72]\n\t"
  204275. "ldr r5, [%[r], #76]\n\t"
  204276. "ldr r6, [%[m], #72]\n\t"
  204277. "ldr r7, [%[m], #76]\n\t"
  204278. #ifdef WOLFSSL_KEIL
  204279. "ands r6, r6, r3\n\t"
  204280. #elif defined(__clang__)
  204281. "ands r6, r3\n\t"
  204282. #else
  204283. "and r6, r3\n\t"
  204284. #endif
  204285. #ifdef WOLFSSL_KEIL
  204286. "ands r7, r7, r3\n\t"
  204287. #elif defined(__clang__)
  204288. "ands r7, r3\n\t"
  204289. #else
  204290. "and r7, r3\n\t"
  204291. #endif
  204292. #ifdef WOLFSSL_KEIL
  204293. "sbcs r4, r4, r6\n\t"
  204294. #elif defined(__clang__)
  204295. "sbcs r4, r6\n\t"
  204296. #else
  204297. "sbc r4, r6\n\t"
  204298. #endif
  204299. #ifdef WOLFSSL_KEIL
  204300. "sbcs r5, r5, r7\n\t"
  204301. #elif defined(__clang__)
  204302. "sbcs r5, r7\n\t"
  204303. #else
  204304. "sbc r5, r7\n\t"
  204305. #endif
  204306. "str r4, [%[r], #72]\n\t"
  204307. "str r5, [%[r], #76]\n\t"
  204308. "ldr r4, [%[r], #80]\n\t"
  204309. "ldr r5, [%[r], #84]\n\t"
  204310. "ldr r6, [%[m], #80]\n\t"
  204311. "ldr r7, [%[m], #84]\n\t"
  204312. #ifdef WOLFSSL_KEIL
  204313. "ands r6, r6, r3\n\t"
  204314. #elif defined(__clang__)
  204315. "ands r6, r3\n\t"
  204316. #else
  204317. "and r6, r3\n\t"
  204318. #endif
  204319. #ifdef WOLFSSL_KEIL
  204320. "ands r7, r7, r3\n\t"
  204321. #elif defined(__clang__)
  204322. "ands r7, r3\n\t"
  204323. #else
  204324. "and r7, r3\n\t"
  204325. #endif
  204326. #ifdef WOLFSSL_KEIL
  204327. "sbcs r4, r4, r6\n\t"
  204328. #elif defined(__clang__)
  204329. "sbcs r4, r6\n\t"
  204330. #else
  204331. "sbc r4, r6\n\t"
  204332. #endif
  204333. #ifdef WOLFSSL_KEIL
  204334. "sbcs r5, r5, r7\n\t"
  204335. #elif defined(__clang__)
  204336. "sbcs r5, r7\n\t"
  204337. #else
  204338. "sbc r5, r7\n\t"
  204339. #endif
  204340. "str r4, [%[r], #80]\n\t"
  204341. "str r5, [%[r], #84]\n\t"
  204342. "ldr r4, [%[r], #88]\n\t"
  204343. "ldr r5, [%[r], #92]\n\t"
  204344. "ldr r6, [%[m], #88]\n\t"
  204345. "ldr r7, [%[m], #92]\n\t"
  204346. #ifdef WOLFSSL_KEIL
  204347. "ands r6, r6, r3\n\t"
  204348. #elif defined(__clang__)
  204349. "ands r6, r3\n\t"
  204350. #else
  204351. "and r6, r3\n\t"
  204352. #endif
  204353. #ifdef WOLFSSL_KEIL
  204354. "ands r7, r7, r3\n\t"
  204355. #elif defined(__clang__)
  204356. "ands r7, r3\n\t"
  204357. #else
  204358. "and r7, r3\n\t"
  204359. #endif
  204360. #ifdef WOLFSSL_KEIL
  204361. "sbcs r4, r4, r6\n\t"
  204362. #elif defined(__clang__)
  204363. "sbcs r4, r6\n\t"
  204364. #else
  204365. "sbc r4, r6\n\t"
  204366. #endif
  204367. #ifdef WOLFSSL_KEIL
  204368. "sbcs r5, r5, r7\n\t"
  204369. #elif defined(__clang__)
  204370. "sbcs r5, r7\n\t"
  204371. #else
  204372. "sbc r5, r7\n\t"
  204373. #endif
  204374. "str r4, [%[r], #88]\n\t"
  204375. "str r5, [%[r], #92]\n\t"
  204376. "ldr r4, [%[r], #96]\n\t"
  204377. "ldr r5, [%[r], #100]\n\t"
  204378. "ldr r6, [%[m], #96]\n\t"
  204379. "ldr r7, [%[m], #100]\n\t"
  204380. #ifdef WOLFSSL_KEIL
  204381. "ands r6, r6, r3\n\t"
  204382. #elif defined(__clang__)
  204383. "ands r6, r3\n\t"
  204384. #else
  204385. "and r6, r3\n\t"
  204386. #endif
  204387. #ifdef WOLFSSL_KEIL
  204388. "ands r7, r7, r3\n\t"
  204389. #elif defined(__clang__)
  204390. "ands r7, r3\n\t"
  204391. #else
  204392. "and r7, r3\n\t"
  204393. #endif
  204394. #ifdef WOLFSSL_KEIL
  204395. "sbcs r4, r4, r6\n\t"
  204396. #elif defined(__clang__)
  204397. "sbcs r4, r6\n\t"
  204398. #else
  204399. "sbc r4, r6\n\t"
  204400. #endif
  204401. #ifdef WOLFSSL_KEIL
  204402. "sbcs r5, r5, r7\n\t"
  204403. #elif defined(__clang__)
  204404. "sbcs r5, r7\n\t"
  204405. #else
  204406. "sbc r5, r7\n\t"
  204407. #endif
  204408. "str r4, [%[r], #96]\n\t"
  204409. "str r5, [%[r], #100]\n\t"
  204410. "ldr r4, [%[r], #104]\n\t"
  204411. "ldr r5, [%[r], #108]\n\t"
  204412. "ldr r6, [%[m], #104]\n\t"
  204413. "ldr r7, [%[m], #108]\n\t"
  204414. #ifdef WOLFSSL_KEIL
  204415. "ands r6, r6, r3\n\t"
  204416. #elif defined(__clang__)
  204417. "ands r6, r3\n\t"
  204418. #else
  204419. "and r6, r3\n\t"
  204420. #endif
  204421. #ifdef WOLFSSL_KEIL
  204422. "ands r7, r7, r3\n\t"
  204423. #elif defined(__clang__)
  204424. "ands r7, r3\n\t"
  204425. #else
  204426. "and r7, r3\n\t"
  204427. #endif
  204428. #ifdef WOLFSSL_KEIL
  204429. "sbcs r4, r4, r6\n\t"
  204430. #elif defined(__clang__)
  204431. "sbcs r4, r6\n\t"
  204432. #else
  204433. "sbc r4, r6\n\t"
  204434. #endif
  204435. #ifdef WOLFSSL_KEIL
  204436. "sbcs r5, r5, r7\n\t"
  204437. #elif defined(__clang__)
  204438. "sbcs r5, r7\n\t"
  204439. #else
  204440. "sbc r5, r7\n\t"
  204441. #endif
  204442. "str r4, [%[r], #104]\n\t"
  204443. "str r5, [%[r], #108]\n\t"
  204444. "ldr r4, [%[r], #112]\n\t"
  204445. "ldr r5, [%[r], #116]\n\t"
  204446. "ldr r6, [%[m], #112]\n\t"
  204447. "ldr r7, [%[m], #116]\n\t"
  204448. #ifdef WOLFSSL_KEIL
  204449. "ands r6, r6, r3\n\t"
  204450. #elif defined(__clang__)
  204451. "ands r6, r3\n\t"
  204452. #else
  204453. "and r6, r3\n\t"
  204454. #endif
  204455. #ifdef WOLFSSL_KEIL
  204456. "ands r7, r7, r3\n\t"
  204457. #elif defined(__clang__)
  204458. "ands r7, r3\n\t"
  204459. #else
  204460. "and r7, r3\n\t"
  204461. #endif
  204462. #ifdef WOLFSSL_KEIL
  204463. "sbcs r4, r4, r6\n\t"
  204464. #elif defined(__clang__)
  204465. "sbcs r4, r6\n\t"
  204466. #else
  204467. "sbc r4, r6\n\t"
  204468. #endif
  204469. #ifdef WOLFSSL_KEIL
  204470. "sbcs r5, r5, r7\n\t"
  204471. #elif defined(__clang__)
  204472. "sbcs r5, r7\n\t"
  204473. #else
  204474. "sbc r5, r7\n\t"
  204475. #endif
  204476. "str r4, [%[r], #112]\n\t"
  204477. "str r5, [%[r], #116]\n\t"
  204478. "ldr r4, [%[r], #120]\n\t"
  204479. "ldr r5, [%[r], #124]\n\t"
  204480. "ldr r6, [%[m], #120]\n\t"
  204481. "ldr r7, [%[m], #124]\n\t"
  204482. #ifdef WOLFSSL_KEIL
  204483. "ands r6, r6, r3\n\t"
  204484. #elif defined(__clang__)
  204485. "ands r6, r3\n\t"
  204486. #else
  204487. "and r6, r3\n\t"
  204488. #endif
  204489. #ifdef WOLFSSL_KEIL
  204490. "ands r7, r7, r3\n\t"
  204491. #elif defined(__clang__)
  204492. "ands r7, r3\n\t"
  204493. #else
  204494. "and r7, r3\n\t"
  204495. #endif
  204496. #ifdef WOLFSSL_KEIL
  204497. "sbcs r4, r4, r6\n\t"
  204498. #elif defined(__clang__)
  204499. "sbcs r4, r6\n\t"
  204500. #else
  204501. "sbc r4, r6\n\t"
  204502. #endif
  204503. #ifdef WOLFSSL_KEIL
  204504. "sbcs r5, r5, r7\n\t"
  204505. #elif defined(__clang__)
  204506. "sbcs r5, r7\n\t"
  204507. #else
  204508. "sbc r5, r7\n\t"
  204509. #endif
  204510. "str r4, [%[r], #120]\n\t"
  204511. "str r5, [%[r], #124]\n\t"
  204512. "ldr r4, [%[a]]\n\t"
  204513. "ldr r5, [%[a], #4]\n\t"
  204514. "ldr r6, [%[r]]\n\t"
  204515. "ldr r7, [%[r], #4]\n\t"
  204516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  204517. "adds r6, r6, r4\n\t"
  204518. #else
  204519. "add r6, r6, r4\n\t"
  204520. #endif
  204521. #ifdef WOLFSSL_KEIL
  204522. "adcs r7, r7, r5\n\t"
  204523. #elif defined(__clang__)
  204524. "adcs r7, r5\n\t"
  204525. #else
  204526. "adc r7, r5\n\t"
  204527. #endif
  204528. "str r6, [%[r]]\n\t"
  204529. "str r7, [%[r], #4]\n\t"
  204530. "ldr r4, [%[a], #8]\n\t"
  204531. "ldr r5, [%[a], #12]\n\t"
  204532. "ldr r6, [%[r], #8]\n\t"
  204533. "ldr r7, [%[r], #12]\n\t"
  204534. #ifdef WOLFSSL_KEIL
  204535. "adcs r6, r6, r4\n\t"
  204536. #elif defined(__clang__)
  204537. "adcs r6, r4\n\t"
  204538. #else
  204539. "adc r6, r4\n\t"
  204540. #endif
  204541. #ifdef WOLFSSL_KEIL
  204542. "adcs r7, r7, r5\n\t"
  204543. #elif defined(__clang__)
  204544. "adcs r7, r5\n\t"
  204545. #else
  204546. "adc r7, r5\n\t"
  204547. #endif
  204548. "str r6, [%[r], #8]\n\t"
  204549. "str r7, [%[r], #12]\n\t"
  204550. "ldr r4, [%[a], #16]\n\t"
  204551. "ldr r5, [%[a], #20]\n\t"
  204552. "ldr r6, [%[r], #16]\n\t"
  204553. "ldr r7, [%[r], #20]\n\t"
  204554. #ifdef WOLFSSL_KEIL
  204555. "adcs r6, r6, r4\n\t"
  204556. #elif defined(__clang__)
  204557. "adcs r6, r4\n\t"
  204558. #else
  204559. "adc r6, r4\n\t"
  204560. #endif
  204561. #ifdef WOLFSSL_KEIL
  204562. "adcs r7, r7, r5\n\t"
  204563. #elif defined(__clang__)
  204564. "adcs r7, r5\n\t"
  204565. #else
  204566. "adc r7, r5\n\t"
  204567. #endif
  204568. "str r6, [%[r], #16]\n\t"
  204569. "str r7, [%[r], #20]\n\t"
  204570. "ldr r4, [%[a], #24]\n\t"
  204571. "ldr r5, [%[a], #28]\n\t"
  204572. "ldr r6, [%[r], #24]\n\t"
  204573. "ldr r7, [%[r], #28]\n\t"
  204574. #ifdef WOLFSSL_KEIL
  204575. "adcs r6, r6, r4\n\t"
  204576. #elif defined(__clang__)
  204577. "adcs r6, r4\n\t"
  204578. #else
  204579. "adc r6, r4\n\t"
  204580. #endif
  204581. #ifdef WOLFSSL_KEIL
  204582. "adcs r7, r7, r5\n\t"
  204583. #elif defined(__clang__)
  204584. "adcs r7, r5\n\t"
  204585. #else
  204586. "adc r7, r5\n\t"
  204587. #endif
  204588. "str r6, [%[r], #24]\n\t"
  204589. "str r7, [%[r], #28]\n\t"
  204590. "ldr r4, [%[a], #32]\n\t"
  204591. "ldr r5, [%[a], #36]\n\t"
  204592. "ldr r6, [%[r], #32]\n\t"
  204593. "ldr r7, [%[r], #36]\n\t"
  204594. #ifdef WOLFSSL_KEIL
  204595. "adcs r6, r6, r4\n\t"
  204596. #elif defined(__clang__)
  204597. "adcs r6, r4\n\t"
  204598. #else
  204599. "adc r6, r4\n\t"
  204600. #endif
  204601. #ifdef WOLFSSL_KEIL
  204602. "adcs r7, r7, r5\n\t"
  204603. #elif defined(__clang__)
  204604. "adcs r7, r5\n\t"
  204605. #else
  204606. "adc r7, r5\n\t"
  204607. #endif
  204608. "str r6, [%[r], #32]\n\t"
  204609. "str r7, [%[r], #36]\n\t"
  204610. "ldr r4, [%[a], #40]\n\t"
  204611. "ldr r5, [%[a], #44]\n\t"
  204612. "ldr r6, [%[r], #40]\n\t"
  204613. "ldr r7, [%[r], #44]\n\t"
  204614. #ifdef WOLFSSL_KEIL
  204615. "adcs r6, r6, r4\n\t"
  204616. #elif defined(__clang__)
  204617. "adcs r6, r4\n\t"
  204618. #else
  204619. "adc r6, r4\n\t"
  204620. #endif
  204621. #ifdef WOLFSSL_KEIL
  204622. "adcs r7, r7, r5\n\t"
  204623. #elif defined(__clang__)
  204624. "adcs r7, r5\n\t"
  204625. #else
  204626. "adc r7, r5\n\t"
  204627. #endif
  204628. "str r6, [%[r], #40]\n\t"
  204629. "str r7, [%[r], #44]\n\t"
  204630. "ldr r4, [%[a], #48]\n\t"
  204631. "ldr r5, [%[a], #52]\n\t"
  204632. "ldr r6, [%[r], #48]\n\t"
  204633. "ldr r7, [%[r], #52]\n\t"
  204634. #ifdef WOLFSSL_KEIL
  204635. "adcs r6, r6, r4\n\t"
  204636. #elif defined(__clang__)
  204637. "adcs r6, r4\n\t"
  204638. #else
  204639. "adc r6, r4\n\t"
  204640. #endif
  204641. #ifdef WOLFSSL_KEIL
  204642. "adcs r7, r7, r5\n\t"
  204643. #elif defined(__clang__)
  204644. "adcs r7, r5\n\t"
  204645. #else
  204646. "adc r7, r5\n\t"
  204647. #endif
  204648. "str r6, [%[r], #48]\n\t"
  204649. "str r7, [%[r], #52]\n\t"
  204650. "ldr r4, [%[a], #56]\n\t"
  204651. "ldr r5, [%[a], #60]\n\t"
  204652. "ldr r6, [%[r], #56]\n\t"
  204653. "ldr r7, [%[r], #60]\n\t"
  204654. #ifdef WOLFSSL_KEIL
  204655. "adcs r6, r6, r4\n\t"
  204656. #elif defined(__clang__)
  204657. "adcs r6, r4\n\t"
  204658. #else
  204659. "adc r6, r4\n\t"
  204660. #endif
  204661. #ifdef WOLFSSL_KEIL
  204662. "adcs r7, r7, r5\n\t"
  204663. #elif defined(__clang__)
  204664. "adcs r7, r5\n\t"
  204665. #else
  204666. "adc r7, r5\n\t"
  204667. #endif
  204668. "str r6, [%[r], #56]\n\t"
  204669. "str r7, [%[r], #60]\n\t"
  204670. "ldr r4, [%[a], #64]\n\t"
  204671. "ldr r5, [%[a], #68]\n\t"
  204672. "ldr r6, [%[r], #64]\n\t"
  204673. "ldr r7, [%[r], #68]\n\t"
  204674. #ifdef WOLFSSL_KEIL
  204675. "adcs r6, r6, r4\n\t"
  204676. #elif defined(__clang__)
  204677. "adcs r6, r4\n\t"
  204678. #else
  204679. "adc r6, r4\n\t"
  204680. #endif
  204681. #ifdef WOLFSSL_KEIL
  204682. "adcs r7, r7, r5\n\t"
  204683. #elif defined(__clang__)
  204684. "adcs r7, r5\n\t"
  204685. #else
  204686. "adc r7, r5\n\t"
  204687. #endif
  204688. "str r6, [%[r], #64]\n\t"
  204689. "str r7, [%[r], #68]\n\t"
  204690. "ldr r4, [%[a], #72]\n\t"
  204691. "ldr r5, [%[a], #76]\n\t"
  204692. "ldr r6, [%[r], #72]\n\t"
  204693. "ldr r7, [%[r], #76]\n\t"
  204694. #ifdef WOLFSSL_KEIL
  204695. "adcs r6, r6, r4\n\t"
  204696. #elif defined(__clang__)
  204697. "adcs r6, r4\n\t"
  204698. #else
  204699. "adc r6, r4\n\t"
  204700. #endif
  204701. #ifdef WOLFSSL_KEIL
  204702. "adcs r7, r7, r5\n\t"
  204703. #elif defined(__clang__)
  204704. "adcs r7, r5\n\t"
  204705. #else
  204706. "adc r7, r5\n\t"
  204707. #endif
  204708. "str r6, [%[r], #72]\n\t"
  204709. "str r7, [%[r], #76]\n\t"
  204710. "ldr r4, [%[a], #80]\n\t"
  204711. "ldr r5, [%[a], #84]\n\t"
  204712. "ldr r6, [%[r], #80]\n\t"
  204713. "ldr r7, [%[r], #84]\n\t"
  204714. #ifdef WOLFSSL_KEIL
  204715. "adcs r6, r6, r4\n\t"
  204716. #elif defined(__clang__)
  204717. "adcs r6, r4\n\t"
  204718. #else
  204719. "adc r6, r4\n\t"
  204720. #endif
  204721. #ifdef WOLFSSL_KEIL
  204722. "adcs r7, r7, r5\n\t"
  204723. #elif defined(__clang__)
  204724. "adcs r7, r5\n\t"
  204725. #else
  204726. "adc r7, r5\n\t"
  204727. #endif
  204728. "str r6, [%[r], #80]\n\t"
  204729. "str r7, [%[r], #84]\n\t"
  204730. "ldr r4, [%[a], #88]\n\t"
  204731. "ldr r5, [%[a], #92]\n\t"
  204732. "ldr r6, [%[r], #88]\n\t"
  204733. "ldr r7, [%[r], #92]\n\t"
  204734. #ifdef WOLFSSL_KEIL
  204735. "adcs r6, r6, r4\n\t"
  204736. #elif defined(__clang__)
  204737. "adcs r6, r4\n\t"
  204738. #else
  204739. "adc r6, r4\n\t"
  204740. #endif
  204741. #ifdef WOLFSSL_KEIL
  204742. "adcs r7, r7, r5\n\t"
  204743. #elif defined(__clang__)
  204744. "adcs r7, r5\n\t"
  204745. #else
  204746. "adc r7, r5\n\t"
  204747. #endif
  204748. "str r6, [%[r], #88]\n\t"
  204749. "str r7, [%[r], #92]\n\t"
  204750. "ldr r4, [%[a], #96]\n\t"
  204751. "ldr r5, [%[a], #100]\n\t"
  204752. "ldr r6, [%[r], #96]\n\t"
  204753. "ldr r7, [%[r], #100]\n\t"
  204754. #ifdef WOLFSSL_KEIL
  204755. "adcs r6, r6, r4\n\t"
  204756. #elif defined(__clang__)
  204757. "adcs r6, r4\n\t"
  204758. #else
  204759. "adc r6, r4\n\t"
  204760. #endif
  204761. #ifdef WOLFSSL_KEIL
  204762. "adcs r7, r7, r5\n\t"
  204763. #elif defined(__clang__)
  204764. "adcs r7, r5\n\t"
  204765. #else
  204766. "adc r7, r5\n\t"
  204767. #endif
  204768. "str r6, [%[r], #96]\n\t"
  204769. "str r7, [%[r], #100]\n\t"
  204770. "ldr r4, [%[a], #104]\n\t"
  204771. "ldr r5, [%[a], #108]\n\t"
  204772. "ldr r6, [%[r], #104]\n\t"
  204773. "ldr r7, [%[r], #108]\n\t"
  204774. #ifdef WOLFSSL_KEIL
  204775. "adcs r6, r6, r4\n\t"
  204776. #elif defined(__clang__)
  204777. "adcs r6, r4\n\t"
  204778. #else
  204779. "adc r6, r4\n\t"
  204780. #endif
  204781. #ifdef WOLFSSL_KEIL
  204782. "adcs r7, r7, r5\n\t"
  204783. #elif defined(__clang__)
  204784. "adcs r7, r5\n\t"
  204785. #else
  204786. "adc r7, r5\n\t"
  204787. #endif
  204788. "str r6, [%[r], #104]\n\t"
  204789. "str r7, [%[r], #108]\n\t"
  204790. "ldr r4, [%[a], #112]\n\t"
  204791. "ldr r5, [%[a], #116]\n\t"
  204792. "ldr r6, [%[r], #112]\n\t"
  204793. "ldr r7, [%[r], #116]\n\t"
  204794. #ifdef WOLFSSL_KEIL
  204795. "adcs r6, r6, r4\n\t"
  204796. #elif defined(__clang__)
  204797. "adcs r6, r4\n\t"
  204798. #else
  204799. "adc r6, r4\n\t"
  204800. #endif
  204801. #ifdef WOLFSSL_KEIL
  204802. "adcs r7, r7, r5\n\t"
  204803. #elif defined(__clang__)
  204804. "adcs r7, r5\n\t"
  204805. #else
  204806. "adc r7, r5\n\t"
  204807. #endif
  204808. "str r6, [%[r], #112]\n\t"
  204809. "str r7, [%[r], #116]\n\t"
  204810. "ldr r4, [%[a], #120]\n\t"
  204811. "ldr r5, [%[a], #124]\n\t"
  204812. "ldr r6, [%[r], #120]\n\t"
  204813. "ldr r7, [%[r], #124]\n\t"
  204814. #ifdef WOLFSSL_KEIL
  204815. "adcs r6, r6, r4\n\t"
  204816. #elif defined(__clang__)
  204817. "adcs r6, r4\n\t"
  204818. #else
  204819. "adc r6, r4\n\t"
  204820. #endif
  204821. #ifdef WOLFSSL_KEIL
  204822. "adcs r7, r7, r5\n\t"
  204823. #elif defined(__clang__)
  204824. "adcs r7, r5\n\t"
  204825. #else
  204826. "adc r7, r5\n\t"
  204827. #endif
  204828. "str r6, [%[r], #120]\n\t"
  204829. "str r7, [%[r], #124]\n\t"
  204830. "movs r3, #0\n\t"
  204831. "ldr r5, [%[m], #124]\n\t"
  204832. #ifdef WOLFSSL_KEIL
  204833. "adcs r3, r3, r3\n\t"
  204834. #elif defined(__clang__)
  204835. "adcs r3, r3\n\t"
  204836. #else
  204837. "adc r3, r3\n\t"
  204838. #endif
  204839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  204840. "subs r5, r5, r7\n\t"
  204841. #else
  204842. "sub r5, r5, r7\n\t"
  204843. #endif
  204844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  204845. "negs r3, r3\n\t"
  204846. #else
  204847. "neg r3, r3\n\t"
  204848. #endif
  204849. #ifdef WOLFSSL_KEIL
  204850. "sbcs r5, r5, r5\n\t"
  204851. #elif defined(__clang__)
  204852. "sbcs r5, r5\n\t"
  204853. #else
  204854. "sbc r5, r5\n\t"
  204855. #endif
  204856. #ifdef WOLFSSL_KEIL
  204857. "orrs r3, r3, r5\n\t"
  204858. #elif defined(__clang__)
  204859. "orrs r3, r5\n\t"
  204860. #else
  204861. "orr r3, r5\n\t"
  204862. #endif
  204863. "ldr r6, [%[r]]\n\t"
  204864. "ldr r7, [%[r], #4]\n\t"
  204865. "ldr r4, [%[m]]\n\t"
  204866. "ldr r5, [%[m], #4]\n\t"
  204867. #ifdef WOLFSSL_KEIL
  204868. "ands r4, r4, r3\n\t"
  204869. #elif defined(__clang__)
  204870. "ands r4, r3\n\t"
  204871. #else
  204872. "and r4, r3\n\t"
  204873. #endif
  204874. #ifdef WOLFSSL_KEIL
  204875. "ands r5, r5, r3\n\t"
  204876. #elif defined(__clang__)
  204877. "ands r5, r3\n\t"
  204878. #else
  204879. "and r5, r3\n\t"
  204880. #endif
  204881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  204882. "subs r6, r6, r4\n\t"
  204883. #else
  204884. "sub r6, r6, r4\n\t"
  204885. #endif
  204886. #ifdef WOLFSSL_KEIL
  204887. "sbcs r7, r7, r5\n\t"
  204888. #elif defined(__clang__)
  204889. "sbcs r7, r5\n\t"
  204890. #else
  204891. "sbc r7, r5\n\t"
  204892. #endif
  204893. "str r6, [%[r]]\n\t"
  204894. "str r7, [%[r], #4]\n\t"
  204895. "ldr r6, [%[r], #8]\n\t"
  204896. "ldr r7, [%[r], #12]\n\t"
  204897. "ldr r4, [%[m], #8]\n\t"
  204898. "ldr r5, [%[m], #12]\n\t"
  204899. #ifdef WOLFSSL_KEIL
  204900. "ands r4, r4, r3\n\t"
  204901. #elif defined(__clang__)
  204902. "ands r4, r3\n\t"
  204903. #else
  204904. "and r4, r3\n\t"
  204905. #endif
  204906. #ifdef WOLFSSL_KEIL
  204907. "ands r5, r5, r3\n\t"
  204908. #elif defined(__clang__)
  204909. "ands r5, r3\n\t"
  204910. #else
  204911. "and r5, r3\n\t"
  204912. #endif
  204913. #ifdef WOLFSSL_KEIL
  204914. "sbcs r6, r6, r4\n\t"
  204915. #elif defined(__clang__)
  204916. "sbcs r6, r4\n\t"
  204917. #else
  204918. "sbc r6, r4\n\t"
  204919. #endif
  204920. #ifdef WOLFSSL_KEIL
  204921. "sbcs r7, r7, r5\n\t"
  204922. #elif defined(__clang__)
  204923. "sbcs r7, r5\n\t"
  204924. #else
  204925. "sbc r7, r5\n\t"
  204926. #endif
  204927. "str r6, [%[r], #8]\n\t"
  204928. "str r7, [%[r], #12]\n\t"
  204929. "ldr r6, [%[r], #16]\n\t"
  204930. "ldr r7, [%[r], #20]\n\t"
  204931. "ldr r4, [%[m], #16]\n\t"
  204932. "ldr r5, [%[m], #20]\n\t"
  204933. #ifdef WOLFSSL_KEIL
  204934. "ands r4, r4, r3\n\t"
  204935. #elif defined(__clang__)
  204936. "ands r4, r3\n\t"
  204937. #else
  204938. "and r4, r3\n\t"
  204939. #endif
  204940. #ifdef WOLFSSL_KEIL
  204941. "ands r5, r5, r3\n\t"
  204942. #elif defined(__clang__)
  204943. "ands r5, r3\n\t"
  204944. #else
  204945. "and r5, r3\n\t"
  204946. #endif
  204947. #ifdef WOLFSSL_KEIL
  204948. "sbcs r6, r6, r4\n\t"
  204949. #elif defined(__clang__)
  204950. "sbcs r6, r4\n\t"
  204951. #else
  204952. "sbc r6, r4\n\t"
  204953. #endif
  204954. #ifdef WOLFSSL_KEIL
  204955. "sbcs r7, r7, r5\n\t"
  204956. #elif defined(__clang__)
  204957. "sbcs r7, r5\n\t"
  204958. #else
  204959. "sbc r7, r5\n\t"
  204960. #endif
  204961. "str r6, [%[r], #16]\n\t"
  204962. "str r7, [%[r], #20]\n\t"
  204963. "ldr r6, [%[r], #24]\n\t"
  204964. "ldr r7, [%[r], #28]\n\t"
  204965. "ldr r4, [%[m], #24]\n\t"
  204966. "ldr r5, [%[m], #28]\n\t"
  204967. #ifdef WOLFSSL_KEIL
  204968. "ands r4, r4, r3\n\t"
  204969. #elif defined(__clang__)
  204970. "ands r4, r3\n\t"
  204971. #else
  204972. "and r4, r3\n\t"
  204973. #endif
  204974. #ifdef WOLFSSL_KEIL
  204975. "ands r5, r5, r3\n\t"
  204976. #elif defined(__clang__)
  204977. "ands r5, r3\n\t"
  204978. #else
  204979. "and r5, r3\n\t"
  204980. #endif
  204981. #ifdef WOLFSSL_KEIL
  204982. "sbcs r6, r6, r4\n\t"
  204983. #elif defined(__clang__)
  204984. "sbcs r6, r4\n\t"
  204985. #else
  204986. "sbc r6, r4\n\t"
  204987. #endif
  204988. #ifdef WOLFSSL_KEIL
  204989. "sbcs r7, r7, r5\n\t"
  204990. #elif defined(__clang__)
  204991. "sbcs r7, r5\n\t"
  204992. #else
  204993. "sbc r7, r5\n\t"
  204994. #endif
  204995. "str r6, [%[r], #24]\n\t"
  204996. "str r7, [%[r], #28]\n\t"
  204997. "ldr r6, [%[r], #32]\n\t"
  204998. "ldr r7, [%[r], #36]\n\t"
  204999. "ldr r4, [%[m], #32]\n\t"
  205000. "ldr r5, [%[m], #36]\n\t"
  205001. #ifdef WOLFSSL_KEIL
  205002. "ands r4, r4, r3\n\t"
  205003. #elif defined(__clang__)
  205004. "ands r4, r3\n\t"
  205005. #else
  205006. "and r4, r3\n\t"
  205007. #endif
  205008. #ifdef WOLFSSL_KEIL
  205009. "ands r5, r5, r3\n\t"
  205010. #elif defined(__clang__)
  205011. "ands r5, r3\n\t"
  205012. #else
  205013. "and r5, r3\n\t"
  205014. #endif
  205015. #ifdef WOLFSSL_KEIL
  205016. "sbcs r6, r6, r4\n\t"
  205017. #elif defined(__clang__)
  205018. "sbcs r6, r4\n\t"
  205019. #else
  205020. "sbc r6, r4\n\t"
  205021. #endif
  205022. #ifdef WOLFSSL_KEIL
  205023. "sbcs r7, r7, r5\n\t"
  205024. #elif defined(__clang__)
  205025. "sbcs r7, r5\n\t"
  205026. #else
  205027. "sbc r7, r5\n\t"
  205028. #endif
  205029. "str r6, [%[r], #32]\n\t"
  205030. "str r7, [%[r], #36]\n\t"
  205031. "ldr r6, [%[r], #40]\n\t"
  205032. "ldr r7, [%[r], #44]\n\t"
  205033. "ldr r4, [%[m], #40]\n\t"
  205034. "ldr r5, [%[m], #44]\n\t"
  205035. #ifdef WOLFSSL_KEIL
  205036. "ands r4, r4, r3\n\t"
  205037. #elif defined(__clang__)
  205038. "ands r4, r3\n\t"
  205039. #else
  205040. "and r4, r3\n\t"
  205041. #endif
  205042. #ifdef WOLFSSL_KEIL
  205043. "ands r5, r5, r3\n\t"
  205044. #elif defined(__clang__)
  205045. "ands r5, r3\n\t"
  205046. #else
  205047. "and r5, r3\n\t"
  205048. #endif
  205049. #ifdef WOLFSSL_KEIL
  205050. "sbcs r6, r6, r4\n\t"
  205051. #elif defined(__clang__)
  205052. "sbcs r6, r4\n\t"
  205053. #else
  205054. "sbc r6, r4\n\t"
  205055. #endif
  205056. #ifdef WOLFSSL_KEIL
  205057. "sbcs r7, r7, r5\n\t"
  205058. #elif defined(__clang__)
  205059. "sbcs r7, r5\n\t"
  205060. #else
  205061. "sbc r7, r5\n\t"
  205062. #endif
  205063. "str r6, [%[r], #40]\n\t"
  205064. "str r7, [%[r], #44]\n\t"
  205065. "ldr r6, [%[r], #48]\n\t"
  205066. "ldr r7, [%[r], #52]\n\t"
  205067. "ldr r4, [%[m], #48]\n\t"
  205068. "ldr r5, [%[m], #52]\n\t"
  205069. #ifdef WOLFSSL_KEIL
  205070. "ands r4, r4, r3\n\t"
  205071. #elif defined(__clang__)
  205072. "ands r4, r3\n\t"
  205073. #else
  205074. "and r4, r3\n\t"
  205075. #endif
  205076. #ifdef WOLFSSL_KEIL
  205077. "ands r5, r5, r3\n\t"
  205078. #elif defined(__clang__)
  205079. "ands r5, r3\n\t"
  205080. #else
  205081. "and r5, r3\n\t"
  205082. #endif
  205083. #ifdef WOLFSSL_KEIL
  205084. "sbcs r6, r6, r4\n\t"
  205085. #elif defined(__clang__)
  205086. "sbcs r6, r4\n\t"
  205087. #else
  205088. "sbc r6, r4\n\t"
  205089. #endif
  205090. #ifdef WOLFSSL_KEIL
  205091. "sbcs r7, r7, r5\n\t"
  205092. #elif defined(__clang__)
  205093. "sbcs r7, r5\n\t"
  205094. #else
  205095. "sbc r7, r5\n\t"
  205096. #endif
  205097. "str r6, [%[r], #48]\n\t"
  205098. "str r7, [%[r], #52]\n\t"
  205099. "ldr r6, [%[r], #56]\n\t"
  205100. "ldr r7, [%[r], #60]\n\t"
  205101. "ldr r4, [%[m], #56]\n\t"
  205102. "ldr r5, [%[m], #60]\n\t"
  205103. #ifdef WOLFSSL_KEIL
  205104. "ands r4, r4, r3\n\t"
  205105. #elif defined(__clang__)
  205106. "ands r4, r3\n\t"
  205107. #else
  205108. "and r4, r3\n\t"
  205109. #endif
  205110. #ifdef WOLFSSL_KEIL
  205111. "ands r5, r5, r3\n\t"
  205112. #elif defined(__clang__)
  205113. "ands r5, r3\n\t"
  205114. #else
  205115. "and r5, r3\n\t"
  205116. #endif
  205117. #ifdef WOLFSSL_KEIL
  205118. "sbcs r6, r6, r4\n\t"
  205119. #elif defined(__clang__)
  205120. "sbcs r6, r4\n\t"
  205121. #else
  205122. "sbc r6, r4\n\t"
  205123. #endif
  205124. #ifdef WOLFSSL_KEIL
  205125. "sbcs r7, r7, r5\n\t"
  205126. #elif defined(__clang__)
  205127. "sbcs r7, r5\n\t"
  205128. #else
  205129. "sbc r7, r5\n\t"
  205130. #endif
  205131. "str r6, [%[r], #56]\n\t"
  205132. "str r7, [%[r], #60]\n\t"
  205133. "ldr r6, [%[r], #64]\n\t"
  205134. "ldr r7, [%[r], #68]\n\t"
  205135. "ldr r4, [%[m], #64]\n\t"
  205136. "ldr r5, [%[m], #68]\n\t"
  205137. #ifdef WOLFSSL_KEIL
  205138. "ands r4, r4, r3\n\t"
  205139. #elif defined(__clang__)
  205140. "ands r4, r3\n\t"
  205141. #else
  205142. "and r4, r3\n\t"
  205143. #endif
  205144. #ifdef WOLFSSL_KEIL
  205145. "ands r5, r5, r3\n\t"
  205146. #elif defined(__clang__)
  205147. "ands r5, r3\n\t"
  205148. #else
  205149. "and r5, r3\n\t"
  205150. #endif
  205151. #ifdef WOLFSSL_KEIL
  205152. "sbcs r6, r6, r4\n\t"
  205153. #elif defined(__clang__)
  205154. "sbcs r6, r4\n\t"
  205155. #else
  205156. "sbc r6, r4\n\t"
  205157. #endif
  205158. #ifdef WOLFSSL_KEIL
  205159. "sbcs r7, r7, r5\n\t"
  205160. #elif defined(__clang__)
  205161. "sbcs r7, r5\n\t"
  205162. #else
  205163. "sbc r7, r5\n\t"
  205164. #endif
  205165. "str r6, [%[r], #64]\n\t"
  205166. "str r7, [%[r], #68]\n\t"
  205167. "ldr r6, [%[r], #72]\n\t"
  205168. "ldr r7, [%[r], #76]\n\t"
  205169. "ldr r4, [%[m], #72]\n\t"
  205170. "ldr r5, [%[m], #76]\n\t"
  205171. #ifdef WOLFSSL_KEIL
  205172. "ands r4, r4, r3\n\t"
  205173. #elif defined(__clang__)
  205174. "ands r4, r3\n\t"
  205175. #else
  205176. "and r4, r3\n\t"
  205177. #endif
  205178. #ifdef WOLFSSL_KEIL
  205179. "ands r5, r5, r3\n\t"
  205180. #elif defined(__clang__)
  205181. "ands r5, r3\n\t"
  205182. #else
  205183. "and r5, r3\n\t"
  205184. #endif
  205185. #ifdef WOLFSSL_KEIL
  205186. "sbcs r6, r6, r4\n\t"
  205187. #elif defined(__clang__)
  205188. "sbcs r6, r4\n\t"
  205189. #else
  205190. "sbc r6, r4\n\t"
  205191. #endif
  205192. #ifdef WOLFSSL_KEIL
  205193. "sbcs r7, r7, r5\n\t"
  205194. #elif defined(__clang__)
  205195. "sbcs r7, r5\n\t"
  205196. #else
  205197. "sbc r7, r5\n\t"
  205198. #endif
  205199. "str r6, [%[r], #72]\n\t"
  205200. "str r7, [%[r], #76]\n\t"
  205201. "ldr r6, [%[r], #80]\n\t"
  205202. "ldr r7, [%[r], #84]\n\t"
  205203. "ldr r4, [%[m], #80]\n\t"
  205204. "ldr r5, [%[m], #84]\n\t"
  205205. #ifdef WOLFSSL_KEIL
  205206. "ands r4, r4, r3\n\t"
  205207. #elif defined(__clang__)
  205208. "ands r4, r3\n\t"
  205209. #else
  205210. "and r4, r3\n\t"
  205211. #endif
  205212. #ifdef WOLFSSL_KEIL
  205213. "ands r5, r5, r3\n\t"
  205214. #elif defined(__clang__)
  205215. "ands r5, r3\n\t"
  205216. #else
  205217. "and r5, r3\n\t"
  205218. #endif
  205219. #ifdef WOLFSSL_KEIL
  205220. "sbcs r6, r6, r4\n\t"
  205221. #elif defined(__clang__)
  205222. "sbcs r6, r4\n\t"
  205223. #else
  205224. "sbc r6, r4\n\t"
  205225. #endif
  205226. #ifdef WOLFSSL_KEIL
  205227. "sbcs r7, r7, r5\n\t"
  205228. #elif defined(__clang__)
  205229. "sbcs r7, r5\n\t"
  205230. #else
  205231. "sbc r7, r5\n\t"
  205232. #endif
  205233. "str r6, [%[r], #80]\n\t"
  205234. "str r7, [%[r], #84]\n\t"
  205235. "ldr r6, [%[r], #88]\n\t"
  205236. "ldr r7, [%[r], #92]\n\t"
  205237. "ldr r4, [%[m], #88]\n\t"
  205238. "ldr r5, [%[m], #92]\n\t"
  205239. #ifdef WOLFSSL_KEIL
  205240. "ands r4, r4, r3\n\t"
  205241. #elif defined(__clang__)
  205242. "ands r4, r3\n\t"
  205243. #else
  205244. "and r4, r3\n\t"
  205245. #endif
  205246. #ifdef WOLFSSL_KEIL
  205247. "ands r5, r5, r3\n\t"
  205248. #elif defined(__clang__)
  205249. "ands r5, r3\n\t"
  205250. #else
  205251. "and r5, r3\n\t"
  205252. #endif
  205253. #ifdef WOLFSSL_KEIL
  205254. "sbcs r6, r6, r4\n\t"
  205255. #elif defined(__clang__)
  205256. "sbcs r6, r4\n\t"
  205257. #else
  205258. "sbc r6, r4\n\t"
  205259. #endif
  205260. #ifdef WOLFSSL_KEIL
  205261. "sbcs r7, r7, r5\n\t"
  205262. #elif defined(__clang__)
  205263. "sbcs r7, r5\n\t"
  205264. #else
  205265. "sbc r7, r5\n\t"
  205266. #endif
  205267. "str r6, [%[r], #88]\n\t"
  205268. "str r7, [%[r], #92]\n\t"
  205269. "ldr r6, [%[r], #96]\n\t"
  205270. "ldr r7, [%[r], #100]\n\t"
  205271. "ldr r4, [%[m], #96]\n\t"
  205272. "ldr r5, [%[m], #100]\n\t"
  205273. #ifdef WOLFSSL_KEIL
  205274. "ands r4, r4, r3\n\t"
  205275. #elif defined(__clang__)
  205276. "ands r4, r3\n\t"
  205277. #else
  205278. "and r4, r3\n\t"
  205279. #endif
  205280. #ifdef WOLFSSL_KEIL
  205281. "ands r5, r5, r3\n\t"
  205282. #elif defined(__clang__)
  205283. "ands r5, r3\n\t"
  205284. #else
  205285. "and r5, r3\n\t"
  205286. #endif
  205287. #ifdef WOLFSSL_KEIL
  205288. "sbcs r6, r6, r4\n\t"
  205289. #elif defined(__clang__)
  205290. "sbcs r6, r4\n\t"
  205291. #else
  205292. "sbc r6, r4\n\t"
  205293. #endif
  205294. #ifdef WOLFSSL_KEIL
  205295. "sbcs r7, r7, r5\n\t"
  205296. #elif defined(__clang__)
  205297. "sbcs r7, r5\n\t"
  205298. #else
  205299. "sbc r7, r5\n\t"
  205300. #endif
  205301. "str r6, [%[r], #96]\n\t"
  205302. "str r7, [%[r], #100]\n\t"
  205303. "ldr r6, [%[r], #104]\n\t"
  205304. "ldr r7, [%[r], #108]\n\t"
  205305. "ldr r4, [%[m], #104]\n\t"
  205306. "ldr r5, [%[m], #108]\n\t"
  205307. #ifdef WOLFSSL_KEIL
  205308. "ands r4, r4, r3\n\t"
  205309. #elif defined(__clang__)
  205310. "ands r4, r3\n\t"
  205311. #else
  205312. "and r4, r3\n\t"
  205313. #endif
  205314. #ifdef WOLFSSL_KEIL
  205315. "ands r5, r5, r3\n\t"
  205316. #elif defined(__clang__)
  205317. "ands r5, r3\n\t"
  205318. #else
  205319. "and r5, r3\n\t"
  205320. #endif
  205321. #ifdef WOLFSSL_KEIL
  205322. "sbcs r6, r6, r4\n\t"
  205323. #elif defined(__clang__)
  205324. "sbcs r6, r4\n\t"
  205325. #else
  205326. "sbc r6, r4\n\t"
  205327. #endif
  205328. #ifdef WOLFSSL_KEIL
  205329. "sbcs r7, r7, r5\n\t"
  205330. #elif defined(__clang__)
  205331. "sbcs r7, r5\n\t"
  205332. #else
  205333. "sbc r7, r5\n\t"
  205334. #endif
  205335. "str r6, [%[r], #104]\n\t"
  205336. "str r7, [%[r], #108]\n\t"
  205337. "ldr r6, [%[r], #112]\n\t"
  205338. "ldr r7, [%[r], #116]\n\t"
  205339. "ldr r4, [%[m], #112]\n\t"
  205340. "ldr r5, [%[m], #116]\n\t"
  205341. #ifdef WOLFSSL_KEIL
  205342. "ands r4, r4, r3\n\t"
  205343. #elif defined(__clang__)
  205344. "ands r4, r3\n\t"
  205345. #else
  205346. "and r4, r3\n\t"
  205347. #endif
  205348. #ifdef WOLFSSL_KEIL
  205349. "ands r5, r5, r3\n\t"
  205350. #elif defined(__clang__)
  205351. "ands r5, r3\n\t"
  205352. #else
  205353. "and r5, r3\n\t"
  205354. #endif
  205355. #ifdef WOLFSSL_KEIL
  205356. "sbcs r6, r6, r4\n\t"
  205357. #elif defined(__clang__)
  205358. "sbcs r6, r4\n\t"
  205359. #else
  205360. "sbc r6, r4\n\t"
  205361. #endif
  205362. #ifdef WOLFSSL_KEIL
  205363. "sbcs r7, r7, r5\n\t"
  205364. #elif defined(__clang__)
  205365. "sbcs r7, r5\n\t"
  205366. #else
  205367. "sbc r7, r5\n\t"
  205368. #endif
  205369. "str r6, [%[r], #112]\n\t"
  205370. "str r7, [%[r], #116]\n\t"
  205371. "ldr r6, [%[r], #120]\n\t"
  205372. "ldr r7, [%[r], #124]\n\t"
  205373. "ldr r4, [%[m], #120]\n\t"
  205374. "ldr r5, [%[m], #124]\n\t"
  205375. #ifdef WOLFSSL_KEIL
  205376. "ands r4, r4, r3\n\t"
  205377. #elif defined(__clang__)
  205378. "ands r4, r3\n\t"
  205379. #else
  205380. "and r4, r3\n\t"
  205381. #endif
  205382. #ifdef WOLFSSL_KEIL
  205383. "ands r5, r5, r3\n\t"
  205384. #elif defined(__clang__)
  205385. "ands r5, r3\n\t"
  205386. #else
  205387. "and r5, r3\n\t"
  205388. #endif
  205389. #ifdef WOLFSSL_KEIL
  205390. "sbcs r6, r6, r4\n\t"
  205391. #elif defined(__clang__)
  205392. "sbcs r6, r4\n\t"
  205393. #else
  205394. "sbc r6, r4\n\t"
  205395. #endif
  205396. #ifdef WOLFSSL_KEIL
  205397. "sbcs r7, r7, r5\n\t"
  205398. #elif defined(__clang__)
  205399. "sbcs r7, r5\n\t"
  205400. #else
  205401. "sbc r7, r5\n\t"
  205402. #endif
  205403. "str r6, [%[r], #120]\n\t"
  205404. "str r7, [%[r], #124]\n\t"
  205405. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  205406. :
  205407. : "memory", "r3", "r4", "r5", "r6", "r7"
  205408. );
  205409. }
  205410. /* Subtract two Montgomery form numbers (r = a - b % m).
  205411. *
  205412. * r Result of subtration.
  205413. * a Number to subtract from in Montgomery form.
  205414. * b Number to subtract with in Montgomery form.
  205415. * m Modulus (prime).
  205416. */
  205417. SP_NOINLINE static void sp_1024_mont_sub_32(sp_digit* r, const sp_digit* a,
  205418. const sp_digit* b, const sp_digit* m)
  205419. {
  205420. __asm__ __volatile__ (
  205421. "ldr r4, [%[a]]\n\t"
  205422. "ldr r5, [%[a], #4]\n\t"
  205423. "ldr r6, [%[b]]\n\t"
  205424. "ldr r7, [%[b], #4]\n\t"
  205425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  205426. "subs r4, r4, r6\n\t"
  205427. #else
  205428. "sub r4, r4, r6\n\t"
  205429. #endif
  205430. #ifdef WOLFSSL_KEIL
  205431. "sbcs r5, r5, r7\n\t"
  205432. #elif defined(__clang__)
  205433. "sbcs r5, r7\n\t"
  205434. #else
  205435. "sbc r5, r7\n\t"
  205436. #endif
  205437. "str r4, [%[r]]\n\t"
  205438. "str r5, [%[r], #4]\n\t"
  205439. "ldr r4, [%[a], #8]\n\t"
  205440. "ldr r5, [%[a], #12]\n\t"
  205441. "ldr r6, [%[b], #8]\n\t"
  205442. "ldr r7, [%[b], #12]\n\t"
  205443. #ifdef WOLFSSL_KEIL
  205444. "sbcs r4, r4, r6\n\t"
  205445. #elif defined(__clang__)
  205446. "sbcs r4, r6\n\t"
  205447. #else
  205448. "sbc r4, r6\n\t"
  205449. #endif
  205450. #ifdef WOLFSSL_KEIL
  205451. "sbcs r5, r5, r7\n\t"
  205452. #elif defined(__clang__)
  205453. "sbcs r5, r7\n\t"
  205454. #else
  205455. "sbc r5, r7\n\t"
  205456. #endif
  205457. "str r4, [%[r], #8]\n\t"
  205458. "str r5, [%[r], #12]\n\t"
  205459. "ldr r4, [%[a], #16]\n\t"
  205460. "ldr r5, [%[a], #20]\n\t"
  205461. "ldr r6, [%[b], #16]\n\t"
  205462. "ldr r7, [%[b], #20]\n\t"
  205463. #ifdef WOLFSSL_KEIL
  205464. "sbcs r4, r4, r6\n\t"
  205465. #elif defined(__clang__)
  205466. "sbcs r4, r6\n\t"
  205467. #else
  205468. "sbc r4, r6\n\t"
  205469. #endif
  205470. #ifdef WOLFSSL_KEIL
  205471. "sbcs r5, r5, r7\n\t"
  205472. #elif defined(__clang__)
  205473. "sbcs r5, r7\n\t"
  205474. #else
  205475. "sbc r5, r7\n\t"
  205476. #endif
  205477. "str r4, [%[r], #16]\n\t"
  205478. "str r5, [%[r], #20]\n\t"
  205479. "ldr r4, [%[a], #24]\n\t"
  205480. "ldr r5, [%[a], #28]\n\t"
  205481. "ldr r6, [%[b], #24]\n\t"
  205482. "ldr r7, [%[b], #28]\n\t"
  205483. #ifdef WOLFSSL_KEIL
  205484. "sbcs r4, r4, r6\n\t"
  205485. #elif defined(__clang__)
  205486. "sbcs r4, r6\n\t"
  205487. #else
  205488. "sbc r4, r6\n\t"
  205489. #endif
  205490. #ifdef WOLFSSL_KEIL
  205491. "sbcs r5, r5, r7\n\t"
  205492. #elif defined(__clang__)
  205493. "sbcs r5, r7\n\t"
  205494. #else
  205495. "sbc r5, r7\n\t"
  205496. #endif
  205497. "str r4, [%[r], #24]\n\t"
  205498. "str r5, [%[r], #28]\n\t"
  205499. "ldr r4, [%[a], #32]\n\t"
  205500. "ldr r5, [%[a], #36]\n\t"
  205501. "ldr r6, [%[b], #32]\n\t"
  205502. "ldr r7, [%[b], #36]\n\t"
  205503. #ifdef WOLFSSL_KEIL
  205504. "sbcs r4, r4, r6\n\t"
  205505. #elif defined(__clang__)
  205506. "sbcs r4, r6\n\t"
  205507. #else
  205508. "sbc r4, r6\n\t"
  205509. #endif
  205510. #ifdef WOLFSSL_KEIL
  205511. "sbcs r5, r5, r7\n\t"
  205512. #elif defined(__clang__)
  205513. "sbcs r5, r7\n\t"
  205514. #else
  205515. "sbc r5, r7\n\t"
  205516. #endif
  205517. "str r4, [%[r], #32]\n\t"
  205518. "str r5, [%[r], #36]\n\t"
  205519. "ldr r4, [%[a], #40]\n\t"
  205520. "ldr r5, [%[a], #44]\n\t"
  205521. "ldr r6, [%[b], #40]\n\t"
  205522. "ldr r7, [%[b], #44]\n\t"
  205523. #ifdef WOLFSSL_KEIL
  205524. "sbcs r4, r4, r6\n\t"
  205525. #elif defined(__clang__)
  205526. "sbcs r4, r6\n\t"
  205527. #else
  205528. "sbc r4, r6\n\t"
  205529. #endif
  205530. #ifdef WOLFSSL_KEIL
  205531. "sbcs r5, r5, r7\n\t"
  205532. #elif defined(__clang__)
  205533. "sbcs r5, r7\n\t"
  205534. #else
  205535. "sbc r5, r7\n\t"
  205536. #endif
  205537. "str r4, [%[r], #40]\n\t"
  205538. "str r5, [%[r], #44]\n\t"
  205539. "ldr r4, [%[a], #48]\n\t"
  205540. "ldr r5, [%[a], #52]\n\t"
  205541. "ldr r6, [%[b], #48]\n\t"
  205542. "ldr r7, [%[b], #52]\n\t"
  205543. #ifdef WOLFSSL_KEIL
  205544. "sbcs r4, r4, r6\n\t"
  205545. #elif defined(__clang__)
  205546. "sbcs r4, r6\n\t"
  205547. #else
  205548. "sbc r4, r6\n\t"
  205549. #endif
  205550. #ifdef WOLFSSL_KEIL
  205551. "sbcs r5, r5, r7\n\t"
  205552. #elif defined(__clang__)
  205553. "sbcs r5, r7\n\t"
  205554. #else
  205555. "sbc r5, r7\n\t"
  205556. #endif
  205557. "str r4, [%[r], #48]\n\t"
  205558. "str r5, [%[r], #52]\n\t"
  205559. "ldr r4, [%[a], #56]\n\t"
  205560. "ldr r5, [%[a], #60]\n\t"
  205561. "ldr r6, [%[b], #56]\n\t"
  205562. "ldr r7, [%[b], #60]\n\t"
  205563. #ifdef WOLFSSL_KEIL
  205564. "sbcs r4, r4, r6\n\t"
  205565. #elif defined(__clang__)
  205566. "sbcs r4, r6\n\t"
  205567. #else
  205568. "sbc r4, r6\n\t"
  205569. #endif
  205570. #ifdef WOLFSSL_KEIL
  205571. "sbcs r5, r5, r7\n\t"
  205572. #elif defined(__clang__)
  205573. "sbcs r5, r7\n\t"
  205574. #else
  205575. "sbc r5, r7\n\t"
  205576. #endif
  205577. "str r4, [%[r], #56]\n\t"
  205578. "str r5, [%[r], #60]\n\t"
  205579. "ldr r4, [%[a], #64]\n\t"
  205580. "ldr r5, [%[a], #68]\n\t"
  205581. "ldr r6, [%[b], #64]\n\t"
  205582. "ldr r7, [%[b], #68]\n\t"
  205583. #ifdef WOLFSSL_KEIL
  205584. "sbcs r4, r4, r6\n\t"
  205585. #elif defined(__clang__)
  205586. "sbcs r4, r6\n\t"
  205587. #else
  205588. "sbc r4, r6\n\t"
  205589. #endif
  205590. #ifdef WOLFSSL_KEIL
  205591. "sbcs r5, r5, r7\n\t"
  205592. #elif defined(__clang__)
  205593. "sbcs r5, r7\n\t"
  205594. #else
  205595. "sbc r5, r7\n\t"
  205596. #endif
  205597. "str r4, [%[r], #64]\n\t"
  205598. "str r5, [%[r], #68]\n\t"
  205599. "ldr r4, [%[a], #72]\n\t"
  205600. "ldr r5, [%[a], #76]\n\t"
  205601. "ldr r6, [%[b], #72]\n\t"
  205602. "ldr r7, [%[b], #76]\n\t"
  205603. #ifdef WOLFSSL_KEIL
  205604. "sbcs r4, r4, r6\n\t"
  205605. #elif defined(__clang__)
  205606. "sbcs r4, r6\n\t"
  205607. #else
  205608. "sbc r4, r6\n\t"
  205609. #endif
  205610. #ifdef WOLFSSL_KEIL
  205611. "sbcs r5, r5, r7\n\t"
  205612. #elif defined(__clang__)
  205613. "sbcs r5, r7\n\t"
  205614. #else
  205615. "sbc r5, r7\n\t"
  205616. #endif
  205617. "str r4, [%[r], #72]\n\t"
  205618. "str r5, [%[r], #76]\n\t"
  205619. "ldr r4, [%[a], #80]\n\t"
  205620. "ldr r5, [%[a], #84]\n\t"
  205621. "ldr r6, [%[b], #80]\n\t"
  205622. "ldr r7, [%[b], #84]\n\t"
  205623. #ifdef WOLFSSL_KEIL
  205624. "sbcs r4, r4, r6\n\t"
  205625. #elif defined(__clang__)
  205626. "sbcs r4, r6\n\t"
  205627. #else
  205628. "sbc r4, r6\n\t"
  205629. #endif
  205630. #ifdef WOLFSSL_KEIL
  205631. "sbcs r5, r5, r7\n\t"
  205632. #elif defined(__clang__)
  205633. "sbcs r5, r7\n\t"
  205634. #else
  205635. "sbc r5, r7\n\t"
  205636. #endif
  205637. "str r4, [%[r], #80]\n\t"
  205638. "str r5, [%[r], #84]\n\t"
  205639. "ldr r4, [%[a], #88]\n\t"
  205640. "ldr r5, [%[a], #92]\n\t"
  205641. "ldr r6, [%[b], #88]\n\t"
  205642. "ldr r7, [%[b], #92]\n\t"
  205643. #ifdef WOLFSSL_KEIL
  205644. "sbcs r4, r4, r6\n\t"
  205645. #elif defined(__clang__)
  205646. "sbcs r4, r6\n\t"
  205647. #else
  205648. "sbc r4, r6\n\t"
  205649. #endif
  205650. #ifdef WOLFSSL_KEIL
  205651. "sbcs r5, r5, r7\n\t"
  205652. #elif defined(__clang__)
  205653. "sbcs r5, r7\n\t"
  205654. #else
  205655. "sbc r5, r7\n\t"
  205656. #endif
  205657. "str r4, [%[r], #88]\n\t"
  205658. "str r5, [%[r], #92]\n\t"
  205659. "ldr r4, [%[a], #96]\n\t"
  205660. "ldr r5, [%[a], #100]\n\t"
  205661. "ldr r6, [%[b], #96]\n\t"
  205662. "ldr r7, [%[b], #100]\n\t"
  205663. #ifdef WOLFSSL_KEIL
  205664. "sbcs r4, r4, r6\n\t"
  205665. #elif defined(__clang__)
  205666. "sbcs r4, r6\n\t"
  205667. #else
  205668. "sbc r4, r6\n\t"
  205669. #endif
  205670. #ifdef WOLFSSL_KEIL
  205671. "sbcs r5, r5, r7\n\t"
  205672. #elif defined(__clang__)
  205673. "sbcs r5, r7\n\t"
  205674. #else
  205675. "sbc r5, r7\n\t"
  205676. #endif
  205677. "str r4, [%[r], #96]\n\t"
  205678. "str r5, [%[r], #100]\n\t"
  205679. "ldr r4, [%[a], #104]\n\t"
  205680. "ldr r5, [%[a], #108]\n\t"
  205681. "ldr r6, [%[b], #104]\n\t"
  205682. "ldr r7, [%[b], #108]\n\t"
  205683. #ifdef WOLFSSL_KEIL
  205684. "sbcs r4, r4, r6\n\t"
  205685. #elif defined(__clang__)
  205686. "sbcs r4, r6\n\t"
  205687. #else
  205688. "sbc r4, r6\n\t"
  205689. #endif
  205690. #ifdef WOLFSSL_KEIL
  205691. "sbcs r5, r5, r7\n\t"
  205692. #elif defined(__clang__)
  205693. "sbcs r5, r7\n\t"
  205694. #else
  205695. "sbc r5, r7\n\t"
  205696. #endif
  205697. "str r4, [%[r], #104]\n\t"
  205698. "str r5, [%[r], #108]\n\t"
  205699. "ldr r4, [%[a], #112]\n\t"
  205700. "ldr r5, [%[a], #116]\n\t"
  205701. "ldr r6, [%[b], #112]\n\t"
  205702. "ldr r7, [%[b], #116]\n\t"
  205703. #ifdef WOLFSSL_KEIL
  205704. "sbcs r4, r4, r6\n\t"
  205705. #elif defined(__clang__)
  205706. "sbcs r4, r6\n\t"
  205707. #else
  205708. "sbc r4, r6\n\t"
  205709. #endif
  205710. #ifdef WOLFSSL_KEIL
  205711. "sbcs r5, r5, r7\n\t"
  205712. #elif defined(__clang__)
  205713. "sbcs r5, r7\n\t"
  205714. #else
  205715. "sbc r5, r7\n\t"
  205716. #endif
  205717. "str r4, [%[r], #112]\n\t"
  205718. "str r5, [%[r], #116]\n\t"
  205719. "ldr r4, [%[a], #120]\n\t"
  205720. "ldr r5, [%[a], #124]\n\t"
  205721. "ldr r6, [%[b], #120]\n\t"
  205722. "ldr r7, [%[b], #124]\n\t"
  205723. #ifdef WOLFSSL_KEIL
  205724. "sbcs r4, r4, r6\n\t"
  205725. #elif defined(__clang__)
  205726. "sbcs r4, r6\n\t"
  205727. #else
  205728. "sbc r4, r6\n\t"
  205729. #endif
  205730. #ifdef WOLFSSL_KEIL
  205731. "sbcs r5, r5, r7\n\t"
  205732. #elif defined(__clang__)
  205733. "sbcs r5, r7\n\t"
  205734. #else
  205735. "sbc r5, r7\n\t"
  205736. #endif
  205737. "str r4, [%[r], #120]\n\t"
  205738. "str r5, [%[r], #124]\n\t"
  205739. #ifdef WOLFSSL_KEIL
  205740. "sbcs %[b], %[b], %[b]\n\t"
  205741. #elif defined(__clang__)
  205742. "sbcs %[b], %[b]\n\t"
  205743. #else
  205744. "sbc %[b], %[b]\n\t"
  205745. #endif
  205746. "ldr r4, [%[r]]\n\t"
  205747. "ldr r5, [%[r], #4]\n\t"
  205748. "ldr r6, [%[m]]\n\t"
  205749. "ldr r7, [%[m], #4]\n\t"
  205750. #ifdef WOLFSSL_KEIL
  205751. "ands r6, r6, %[b]\n\t"
  205752. #elif defined(__clang__)
  205753. "ands r6, %[b]\n\t"
  205754. #else
  205755. "and r6, %[b]\n\t"
  205756. #endif
  205757. #ifdef WOLFSSL_KEIL
  205758. "ands r7, r7, %[b]\n\t"
  205759. #elif defined(__clang__)
  205760. "ands r7, %[b]\n\t"
  205761. #else
  205762. "and r7, %[b]\n\t"
  205763. #endif
  205764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  205765. "adds r4, r4, r6\n\t"
  205766. #else
  205767. "add r4, r4, r6\n\t"
  205768. #endif
  205769. #ifdef WOLFSSL_KEIL
  205770. "adcs r5, r5, r7\n\t"
  205771. #elif defined(__clang__)
  205772. "adcs r5, r7\n\t"
  205773. #else
  205774. "adc r5, r7\n\t"
  205775. #endif
  205776. "str r4, [%[r]]\n\t"
  205777. "str r5, [%[r], #4]\n\t"
  205778. "ldr r4, [%[r], #8]\n\t"
  205779. "ldr r5, [%[r], #12]\n\t"
  205780. "ldr r6, [%[m], #8]\n\t"
  205781. "ldr r7, [%[m], #12]\n\t"
  205782. #ifdef WOLFSSL_KEIL
  205783. "ands r6, r6, %[b]\n\t"
  205784. #elif defined(__clang__)
  205785. "ands r6, %[b]\n\t"
  205786. #else
  205787. "and r6, %[b]\n\t"
  205788. #endif
  205789. #ifdef WOLFSSL_KEIL
  205790. "ands r7, r7, %[b]\n\t"
  205791. #elif defined(__clang__)
  205792. "ands r7, %[b]\n\t"
  205793. #else
  205794. "and r7, %[b]\n\t"
  205795. #endif
  205796. #ifdef WOLFSSL_KEIL
  205797. "adcs r4, r4, r6\n\t"
  205798. #elif defined(__clang__)
  205799. "adcs r4, r6\n\t"
  205800. #else
  205801. "adc r4, r6\n\t"
  205802. #endif
  205803. #ifdef WOLFSSL_KEIL
  205804. "adcs r5, r5, r7\n\t"
  205805. #elif defined(__clang__)
  205806. "adcs r5, r7\n\t"
  205807. #else
  205808. "adc r5, r7\n\t"
  205809. #endif
  205810. "str r4, [%[r], #8]\n\t"
  205811. "str r5, [%[r], #12]\n\t"
  205812. "ldr r4, [%[r], #16]\n\t"
  205813. "ldr r5, [%[r], #20]\n\t"
  205814. "ldr r6, [%[m], #16]\n\t"
  205815. "ldr r7, [%[m], #20]\n\t"
  205816. #ifdef WOLFSSL_KEIL
  205817. "ands r6, r6, %[b]\n\t"
  205818. #elif defined(__clang__)
  205819. "ands r6, %[b]\n\t"
  205820. #else
  205821. "and r6, %[b]\n\t"
  205822. #endif
  205823. #ifdef WOLFSSL_KEIL
  205824. "ands r7, r7, %[b]\n\t"
  205825. #elif defined(__clang__)
  205826. "ands r7, %[b]\n\t"
  205827. #else
  205828. "and r7, %[b]\n\t"
  205829. #endif
  205830. #ifdef WOLFSSL_KEIL
  205831. "adcs r4, r4, r6\n\t"
  205832. #elif defined(__clang__)
  205833. "adcs r4, r6\n\t"
  205834. #else
  205835. "adc r4, r6\n\t"
  205836. #endif
  205837. #ifdef WOLFSSL_KEIL
  205838. "adcs r5, r5, r7\n\t"
  205839. #elif defined(__clang__)
  205840. "adcs r5, r7\n\t"
  205841. #else
  205842. "adc r5, r7\n\t"
  205843. #endif
  205844. "str r4, [%[r], #16]\n\t"
  205845. "str r5, [%[r], #20]\n\t"
  205846. "ldr r4, [%[r], #24]\n\t"
  205847. "ldr r5, [%[r], #28]\n\t"
  205848. "ldr r6, [%[m], #24]\n\t"
  205849. "ldr r7, [%[m], #28]\n\t"
  205850. #ifdef WOLFSSL_KEIL
  205851. "ands r6, r6, %[b]\n\t"
  205852. #elif defined(__clang__)
  205853. "ands r6, %[b]\n\t"
  205854. #else
  205855. "and r6, %[b]\n\t"
  205856. #endif
  205857. #ifdef WOLFSSL_KEIL
  205858. "ands r7, r7, %[b]\n\t"
  205859. #elif defined(__clang__)
  205860. "ands r7, %[b]\n\t"
  205861. #else
  205862. "and r7, %[b]\n\t"
  205863. #endif
  205864. #ifdef WOLFSSL_KEIL
  205865. "adcs r4, r4, r6\n\t"
  205866. #elif defined(__clang__)
  205867. "adcs r4, r6\n\t"
  205868. #else
  205869. "adc r4, r6\n\t"
  205870. #endif
  205871. #ifdef WOLFSSL_KEIL
  205872. "adcs r5, r5, r7\n\t"
  205873. #elif defined(__clang__)
  205874. "adcs r5, r7\n\t"
  205875. #else
  205876. "adc r5, r7\n\t"
  205877. #endif
  205878. "str r4, [%[r], #24]\n\t"
  205879. "str r5, [%[r], #28]\n\t"
  205880. "ldr r4, [%[r], #32]\n\t"
  205881. "ldr r5, [%[r], #36]\n\t"
  205882. "ldr r6, [%[m], #32]\n\t"
  205883. "ldr r7, [%[m], #36]\n\t"
  205884. #ifdef WOLFSSL_KEIL
  205885. "ands r6, r6, %[b]\n\t"
  205886. #elif defined(__clang__)
  205887. "ands r6, %[b]\n\t"
  205888. #else
  205889. "and r6, %[b]\n\t"
  205890. #endif
  205891. #ifdef WOLFSSL_KEIL
  205892. "ands r7, r7, %[b]\n\t"
  205893. #elif defined(__clang__)
  205894. "ands r7, %[b]\n\t"
  205895. #else
  205896. "and r7, %[b]\n\t"
  205897. #endif
  205898. #ifdef WOLFSSL_KEIL
  205899. "adcs r4, r4, r6\n\t"
  205900. #elif defined(__clang__)
  205901. "adcs r4, r6\n\t"
  205902. #else
  205903. "adc r4, r6\n\t"
  205904. #endif
  205905. #ifdef WOLFSSL_KEIL
  205906. "adcs r5, r5, r7\n\t"
  205907. #elif defined(__clang__)
  205908. "adcs r5, r7\n\t"
  205909. #else
  205910. "adc r5, r7\n\t"
  205911. #endif
  205912. "str r4, [%[r], #32]\n\t"
  205913. "str r5, [%[r], #36]\n\t"
  205914. "ldr r4, [%[r], #40]\n\t"
  205915. "ldr r5, [%[r], #44]\n\t"
  205916. "ldr r6, [%[m], #40]\n\t"
  205917. "ldr r7, [%[m], #44]\n\t"
  205918. #ifdef WOLFSSL_KEIL
  205919. "ands r6, r6, %[b]\n\t"
  205920. #elif defined(__clang__)
  205921. "ands r6, %[b]\n\t"
  205922. #else
  205923. "and r6, %[b]\n\t"
  205924. #endif
  205925. #ifdef WOLFSSL_KEIL
  205926. "ands r7, r7, %[b]\n\t"
  205927. #elif defined(__clang__)
  205928. "ands r7, %[b]\n\t"
  205929. #else
  205930. "and r7, %[b]\n\t"
  205931. #endif
  205932. #ifdef WOLFSSL_KEIL
  205933. "adcs r4, r4, r6\n\t"
  205934. #elif defined(__clang__)
  205935. "adcs r4, r6\n\t"
  205936. #else
  205937. "adc r4, r6\n\t"
  205938. #endif
  205939. #ifdef WOLFSSL_KEIL
  205940. "adcs r5, r5, r7\n\t"
  205941. #elif defined(__clang__)
  205942. "adcs r5, r7\n\t"
  205943. #else
  205944. "adc r5, r7\n\t"
  205945. #endif
  205946. "str r4, [%[r], #40]\n\t"
  205947. "str r5, [%[r], #44]\n\t"
  205948. "ldr r4, [%[r], #48]\n\t"
  205949. "ldr r5, [%[r], #52]\n\t"
  205950. "ldr r6, [%[m], #48]\n\t"
  205951. "ldr r7, [%[m], #52]\n\t"
  205952. #ifdef WOLFSSL_KEIL
  205953. "ands r6, r6, %[b]\n\t"
  205954. #elif defined(__clang__)
  205955. "ands r6, %[b]\n\t"
  205956. #else
  205957. "and r6, %[b]\n\t"
  205958. #endif
  205959. #ifdef WOLFSSL_KEIL
  205960. "ands r7, r7, %[b]\n\t"
  205961. #elif defined(__clang__)
  205962. "ands r7, %[b]\n\t"
  205963. #else
  205964. "and r7, %[b]\n\t"
  205965. #endif
  205966. #ifdef WOLFSSL_KEIL
  205967. "adcs r4, r4, r6\n\t"
  205968. #elif defined(__clang__)
  205969. "adcs r4, r6\n\t"
  205970. #else
  205971. "adc r4, r6\n\t"
  205972. #endif
  205973. #ifdef WOLFSSL_KEIL
  205974. "adcs r5, r5, r7\n\t"
  205975. #elif defined(__clang__)
  205976. "adcs r5, r7\n\t"
  205977. #else
  205978. "adc r5, r7\n\t"
  205979. #endif
  205980. "str r4, [%[r], #48]\n\t"
  205981. "str r5, [%[r], #52]\n\t"
  205982. "ldr r4, [%[r], #56]\n\t"
  205983. "ldr r5, [%[r], #60]\n\t"
  205984. "ldr r6, [%[m], #56]\n\t"
  205985. "ldr r7, [%[m], #60]\n\t"
  205986. #ifdef WOLFSSL_KEIL
  205987. "ands r6, r6, %[b]\n\t"
  205988. #elif defined(__clang__)
  205989. "ands r6, %[b]\n\t"
  205990. #else
  205991. "and r6, %[b]\n\t"
  205992. #endif
  205993. #ifdef WOLFSSL_KEIL
  205994. "ands r7, r7, %[b]\n\t"
  205995. #elif defined(__clang__)
  205996. "ands r7, %[b]\n\t"
  205997. #else
  205998. "and r7, %[b]\n\t"
  205999. #endif
  206000. #ifdef WOLFSSL_KEIL
  206001. "adcs r4, r4, r6\n\t"
  206002. #elif defined(__clang__)
  206003. "adcs r4, r6\n\t"
  206004. #else
  206005. "adc r4, r6\n\t"
  206006. #endif
  206007. #ifdef WOLFSSL_KEIL
  206008. "adcs r5, r5, r7\n\t"
  206009. #elif defined(__clang__)
  206010. "adcs r5, r7\n\t"
  206011. #else
  206012. "adc r5, r7\n\t"
  206013. #endif
  206014. "str r4, [%[r], #56]\n\t"
  206015. "str r5, [%[r], #60]\n\t"
  206016. "ldr r4, [%[r], #64]\n\t"
  206017. "ldr r5, [%[r], #68]\n\t"
  206018. "ldr r6, [%[m], #64]\n\t"
  206019. "ldr r7, [%[m], #68]\n\t"
  206020. #ifdef WOLFSSL_KEIL
  206021. "ands r6, r6, %[b]\n\t"
  206022. #elif defined(__clang__)
  206023. "ands r6, %[b]\n\t"
  206024. #else
  206025. "and r6, %[b]\n\t"
  206026. #endif
  206027. #ifdef WOLFSSL_KEIL
  206028. "ands r7, r7, %[b]\n\t"
  206029. #elif defined(__clang__)
  206030. "ands r7, %[b]\n\t"
  206031. #else
  206032. "and r7, %[b]\n\t"
  206033. #endif
  206034. #ifdef WOLFSSL_KEIL
  206035. "adcs r4, r4, r6\n\t"
  206036. #elif defined(__clang__)
  206037. "adcs r4, r6\n\t"
  206038. #else
  206039. "adc r4, r6\n\t"
  206040. #endif
  206041. #ifdef WOLFSSL_KEIL
  206042. "adcs r5, r5, r7\n\t"
  206043. #elif defined(__clang__)
  206044. "adcs r5, r7\n\t"
  206045. #else
  206046. "adc r5, r7\n\t"
  206047. #endif
  206048. "str r4, [%[r], #64]\n\t"
  206049. "str r5, [%[r], #68]\n\t"
  206050. "ldr r4, [%[r], #72]\n\t"
  206051. "ldr r5, [%[r], #76]\n\t"
  206052. "ldr r6, [%[m], #72]\n\t"
  206053. "ldr r7, [%[m], #76]\n\t"
  206054. #ifdef WOLFSSL_KEIL
  206055. "ands r6, r6, %[b]\n\t"
  206056. #elif defined(__clang__)
  206057. "ands r6, %[b]\n\t"
  206058. #else
  206059. "and r6, %[b]\n\t"
  206060. #endif
  206061. #ifdef WOLFSSL_KEIL
  206062. "ands r7, r7, %[b]\n\t"
  206063. #elif defined(__clang__)
  206064. "ands r7, %[b]\n\t"
  206065. #else
  206066. "and r7, %[b]\n\t"
  206067. #endif
  206068. #ifdef WOLFSSL_KEIL
  206069. "adcs r4, r4, r6\n\t"
  206070. #elif defined(__clang__)
  206071. "adcs r4, r6\n\t"
  206072. #else
  206073. "adc r4, r6\n\t"
  206074. #endif
  206075. #ifdef WOLFSSL_KEIL
  206076. "adcs r5, r5, r7\n\t"
  206077. #elif defined(__clang__)
  206078. "adcs r5, r7\n\t"
  206079. #else
  206080. "adc r5, r7\n\t"
  206081. #endif
  206082. "str r4, [%[r], #72]\n\t"
  206083. "str r5, [%[r], #76]\n\t"
  206084. "ldr r4, [%[r], #80]\n\t"
  206085. "ldr r5, [%[r], #84]\n\t"
  206086. "ldr r6, [%[m], #80]\n\t"
  206087. "ldr r7, [%[m], #84]\n\t"
  206088. #ifdef WOLFSSL_KEIL
  206089. "ands r6, r6, %[b]\n\t"
  206090. #elif defined(__clang__)
  206091. "ands r6, %[b]\n\t"
  206092. #else
  206093. "and r6, %[b]\n\t"
  206094. #endif
  206095. #ifdef WOLFSSL_KEIL
  206096. "ands r7, r7, %[b]\n\t"
  206097. #elif defined(__clang__)
  206098. "ands r7, %[b]\n\t"
  206099. #else
  206100. "and r7, %[b]\n\t"
  206101. #endif
  206102. #ifdef WOLFSSL_KEIL
  206103. "adcs r4, r4, r6\n\t"
  206104. #elif defined(__clang__)
  206105. "adcs r4, r6\n\t"
  206106. #else
  206107. "adc r4, r6\n\t"
  206108. #endif
  206109. #ifdef WOLFSSL_KEIL
  206110. "adcs r5, r5, r7\n\t"
  206111. #elif defined(__clang__)
  206112. "adcs r5, r7\n\t"
  206113. #else
  206114. "adc r5, r7\n\t"
  206115. #endif
  206116. "str r4, [%[r], #80]\n\t"
  206117. "str r5, [%[r], #84]\n\t"
  206118. "ldr r4, [%[r], #88]\n\t"
  206119. "ldr r5, [%[r], #92]\n\t"
  206120. "ldr r6, [%[m], #88]\n\t"
  206121. "ldr r7, [%[m], #92]\n\t"
  206122. #ifdef WOLFSSL_KEIL
  206123. "ands r6, r6, %[b]\n\t"
  206124. #elif defined(__clang__)
  206125. "ands r6, %[b]\n\t"
  206126. #else
  206127. "and r6, %[b]\n\t"
  206128. #endif
  206129. #ifdef WOLFSSL_KEIL
  206130. "ands r7, r7, %[b]\n\t"
  206131. #elif defined(__clang__)
  206132. "ands r7, %[b]\n\t"
  206133. #else
  206134. "and r7, %[b]\n\t"
  206135. #endif
  206136. #ifdef WOLFSSL_KEIL
  206137. "adcs r4, r4, r6\n\t"
  206138. #elif defined(__clang__)
  206139. "adcs r4, r6\n\t"
  206140. #else
  206141. "adc r4, r6\n\t"
  206142. #endif
  206143. #ifdef WOLFSSL_KEIL
  206144. "adcs r5, r5, r7\n\t"
  206145. #elif defined(__clang__)
  206146. "adcs r5, r7\n\t"
  206147. #else
  206148. "adc r5, r7\n\t"
  206149. #endif
  206150. "str r4, [%[r], #88]\n\t"
  206151. "str r5, [%[r], #92]\n\t"
  206152. "ldr r4, [%[r], #96]\n\t"
  206153. "ldr r5, [%[r], #100]\n\t"
  206154. "ldr r6, [%[m], #96]\n\t"
  206155. "ldr r7, [%[m], #100]\n\t"
  206156. #ifdef WOLFSSL_KEIL
  206157. "ands r6, r6, %[b]\n\t"
  206158. #elif defined(__clang__)
  206159. "ands r6, %[b]\n\t"
  206160. #else
  206161. "and r6, %[b]\n\t"
  206162. #endif
  206163. #ifdef WOLFSSL_KEIL
  206164. "ands r7, r7, %[b]\n\t"
  206165. #elif defined(__clang__)
  206166. "ands r7, %[b]\n\t"
  206167. #else
  206168. "and r7, %[b]\n\t"
  206169. #endif
  206170. #ifdef WOLFSSL_KEIL
  206171. "adcs r4, r4, r6\n\t"
  206172. #elif defined(__clang__)
  206173. "adcs r4, r6\n\t"
  206174. #else
  206175. "adc r4, r6\n\t"
  206176. #endif
  206177. #ifdef WOLFSSL_KEIL
  206178. "adcs r5, r5, r7\n\t"
  206179. #elif defined(__clang__)
  206180. "adcs r5, r7\n\t"
  206181. #else
  206182. "adc r5, r7\n\t"
  206183. #endif
  206184. "str r4, [%[r], #96]\n\t"
  206185. "str r5, [%[r], #100]\n\t"
  206186. "ldr r4, [%[r], #104]\n\t"
  206187. "ldr r5, [%[r], #108]\n\t"
  206188. "ldr r6, [%[m], #104]\n\t"
  206189. "ldr r7, [%[m], #108]\n\t"
  206190. #ifdef WOLFSSL_KEIL
  206191. "ands r6, r6, %[b]\n\t"
  206192. #elif defined(__clang__)
  206193. "ands r6, %[b]\n\t"
  206194. #else
  206195. "and r6, %[b]\n\t"
  206196. #endif
  206197. #ifdef WOLFSSL_KEIL
  206198. "ands r7, r7, %[b]\n\t"
  206199. #elif defined(__clang__)
  206200. "ands r7, %[b]\n\t"
  206201. #else
  206202. "and r7, %[b]\n\t"
  206203. #endif
  206204. #ifdef WOLFSSL_KEIL
  206205. "adcs r4, r4, r6\n\t"
  206206. #elif defined(__clang__)
  206207. "adcs r4, r6\n\t"
  206208. #else
  206209. "adc r4, r6\n\t"
  206210. #endif
  206211. #ifdef WOLFSSL_KEIL
  206212. "adcs r5, r5, r7\n\t"
  206213. #elif defined(__clang__)
  206214. "adcs r5, r7\n\t"
  206215. #else
  206216. "adc r5, r7\n\t"
  206217. #endif
  206218. "str r4, [%[r], #104]\n\t"
  206219. "str r5, [%[r], #108]\n\t"
  206220. "ldr r4, [%[r], #112]\n\t"
  206221. "ldr r5, [%[r], #116]\n\t"
  206222. "ldr r6, [%[m], #112]\n\t"
  206223. "ldr r7, [%[m], #116]\n\t"
  206224. #ifdef WOLFSSL_KEIL
  206225. "ands r6, r6, %[b]\n\t"
  206226. #elif defined(__clang__)
  206227. "ands r6, %[b]\n\t"
  206228. #else
  206229. "and r6, %[b]\n\t"
  206230. #endif
  206231. #ifdef WOLFSSL_KEIL
  206232. "ands r7, r7, %[b]\n\t"
  206233. #elif defined(__clang__)
  206234. "ands r7, %[b]\n\t"
  206235. #else
  206236. "and r7, %[b]\n\t"
  206237. #endif
  206238. #ifdef WOLFSSL_KEIL
  206239. "adcs r4, r4, r6\n\t"
  206240. #elif defined(__clang__)
  206241. "adcs r4, r6\n\t"
  206242. #else
  206243. "adc r4, r6\n\t"
  206244. #endif
  206245. #ifdef WOLFSSL_KEIL
  206246. "adcs r5, r5, r7\n\t"
  206247. #elif defined(__clang__)
  206248. "adcs r5, r7\n\t"
  206249. #else
  206250. "adc r5, r7\n\t"
  206251. #endif
  206252. "str r4, [%[r], #112]\n\t"
  206253. "str r5, [%[r], #116]\n\t"
  206254. "ldr r4, [%[r], #120]\n\t"
  206255. "ldr r5, [%[r], #124]\n\t"
  206256. "ldr r6, [%[m], #120]\n\t"
  206257. "ldr r7, [%[m], #124]\n\t"
  206258. #ifdef WOLFSSL_KEIL
  206259. "ands r6, r6, %[b]\n\t"
  206260. #elif defined(__clang__)
  206261. "ands r6, %[b]\n\t"
  206262. #else
  206263. "and r6, %[b]\n\t"
  206264. #endif
  206265. #ifdef WOLFSSL_KEIL
  206266. "ands r7, r7, %[b]\n\t"
  206267. #elif defined(__clang__)
  206268. "ands r7, %[b]\n\t"
  206269. #else
  206270. "and r7, %[b]\n\t"
  206271. #endif
  206272. #ifdef WOLFSSL_KEIL
  206273. "adcs r4, r4, r6\n\t"
  206274. #elif defined(__clang__)
  206275. "adcs r4, r6\n\t"
  206276. #else
  206277. "adc r4, r6\n\t"
  206278. #endif
  206279. #ifdef WOLFSSL_KEIL
  206280. "adcs r5, r5, r7\n\t"
  206281. #elif defined(__clang__)
  206282. "adcs r5, r7\n\t"
  206283. #else
  206284. "adc r5, r7\n\t"
  206285. #endif
  206286. "str r4, [%[r], #120]\n\t"
  206287. "str r5, [%[r], #124]\n\t"
  206288. "movs r6, #0\n\t"
  206289. #ifdef WOLFSSL_KEIL
  206290. "adcs %[b], %[b], r6\n\t"
  206291. #elif defined(__clang__)
  206292. "adcs %[b], r6\n\t"
  206293. #else
  206294. "adc %[b], r6\n\t"
  206295. #endif
  206296. "ldr r4, [%[r]]\n\t"
  206297. "ldr r5, [%[r], #4]\n\t"
  206298. "ldr r6, [%[m]]\n\t"
  206299. "ldr r7, [%[m], #4]\n\t"
  206300. #ifdef WOLFSSL_KEIL
  206301. "ands r6, r6, %[b]\n\t"
  206302. #elif defined(__clang__)
  206303. "ands r6, %[b]\n\t"
  206304. #else
  206305. "and r6, %[b]\n\t"
  206306. #endif
  206307. #ifdef WOLFSSL_KEIL
  206308. "ands r7, r7, %[b]\n\t"
  206309. #elif defined(__clang__)
  206310. "ands r7, %[b]\n\t"
  206311. #else
  206312. "and r7, %[b]\n\t"
  206313. #endif
  206314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206315. "adds r4, r4, r6\n\t"
  206316. #else
  206317. "add r4, r4, r6\n\t"
  206318. #endif
  206319. #ifdef WOLFSSL_KEIL
  206320. "adcs r5, r5, r7\n\t"
  206321. #elif defined(__clang__)
  206322. "adcs r5, r7\n\t"
  206323. #else
  206324. "adc r5, r7\n\t"
  206325. #endif
  206326. "str r4, [%[r]]\n\t"
  206327. "str r5, [%[r], #4]\n\t"
  206328. "ldr r4, [%[r], #8]\n\t"
  206329. "ldr r5, [%[r], #12]\n\t"
  206330. "ldr r6, [%[m], #8]\n\t"
  206331. "ldr r7, [%[m], #12]\n\t"
  206332. #ifdef WOLFSSL_KEIL
  206333. "ands r6, r6, %[b]\n\t"
  206334. #elif defined(__clang__)
  206335. "ands r6, %[b]\n\t"
  206336. #else
  206337. "and r6, %[b]\n\t"
  206338. #endif
  206339. #ifdef WOLFSSL_KEIL
  206340. "ands r7, r7, %[b]\n\t"
  206341. #elif defined(__clang__)
  206342. "ands r7, %[b]\n\t"
  206343. #else
  206344. "and r7, %[b]\n\t"
  206345. #endif
  206346. #ifdef WOLFSSL_KEIL
  206347. "adcs r4, r4, r6\n\t"
  206348. #elif defined(__clang__)
  206349. "adcs r4, r6\n\t"
  206350. #else
  206351. "adc r4, r6\n\t"
  206352. #endif
  206353. #ifdef WOLFSSL_KEIL
  206354. "adcs r5, r5, r7\n\t"
  206355. #elif defined(__clang__)
  206356. "adcs r5, r7\n\t"
  206357. #else
  206358. "adc r5, r7\n\t"
  206359. #endif
  206360. "str r4, [%[r], #8]\n\t"
  206361. "str r5, [%[r], #12]\n\t"
  206362. "ldr r4, [%[r], #16]\n\t"
  206363. "ldr r5, [%[r], #20]\n\t"
  206364. "ldr r6, [%[m], #16]\n\t"
  206365. "ldr r7, [%[m], #20]\n\t"
  206366. #ifdef WOLFSSL_KEIL
  206367. "ands r6, r6, %[b]\n\t"
  206368. #elif defined(__clang__)
  206369. "ands r6, %[b]\n\t"
  206370. #else
  206371. "and r6, %[b]\n\t"
  206372. #endif
  206373. #ifdef WOLFSSL_KEIL
  206374. "ands r7, r7, %[b]\n\t"
  206375. #elif defined(__clang__)
  206376. "ands r7, %[b]\n\t"
  206377. #else
  206378. "and r7, %[b]\n\t"
  206379. #endif
  206380. #ifdef WOLFSSL_KEIL
  206381. "adcs r4, r4, r6\n\t"
  206382. #elif defined(__clang__)
  206383. "adcs r4, r6\n\t"
  206384. #else
  206385. "adc r4, r6\n\t"
  206386. #endif
  206387. #ifdef WOLFSSL_KEIL
  206388. "adcs r5, r5, r7\n\t"
  206389. #elif defined(__clang__)
  206390. "adcs r5, r7\n\t"
  206391. #else
  206392. "adc r5, r7\n\t"
  206393. #endif
  206394. "str r4, [%[r], #16]\n\t"
  206395. "str r5, [%[r], #20]\n\t"
  206396. "ldr r4, [%[r], #24]\n\t"
  206397. "ldr r5, [%[r], #28]\n\t"
  206398. "ldr r6, [%[m], #24]\n\t"
  206399. "ldr r7, [%[m], #28]\n\t"
  206400. #ifdef WOLFSSL_KEIL
  206401. "ands r6, r6, %[b]\n\t"
  206402. #elif defined(__clang__)
  206403. "ands r6, %[b]\n\t"
  206404. #else
  206405. "and r6, %[b]\n\t"
  206406. #endif
  206407. #ifdef WOLFSSL_KEIL
  206408. "ands r7, r7, %[b]\n\t"
  206409. #elif defined(__clang__)
  206410. "ands r7, %[b]\n\t"
  206411. #else
  206412. "and r7, %[b]\n\t"
  206413. #endif
  206414. #ifdef WOLFSSL_KEIL
  206415. "adcs r4, r4, r6\n\t"
  206416. #elif defined(__clang__)
  206417. "adcs r4, r6\n\t"
  206418. #else
  206419. "adc r4, r6\n\t"
  206420. #endif
  206421. #ifdef WOLFSSL_KEIL
  206422. "adcs r5, r5, r7\n\t"
  206423. #elif defined(__clang__)
  206424. "adcs r5, r7\n\t"
  206425. #else
  206426. "adc r5, r7\n\t"
  206427. #endif
  206428. "str r4, [%[r], #24]\n\t"
  206429. "str r5, [%[r], #28]\n\t"
  206430. "ldr r4, [%[r], #32]\n\t"
  206431. "ldr r5, [%[r], #36]\n\t"
  206432. "ldr r6, [%[m], #32]\n\t"
  206433. "ldr r7, [%[m], #36]\n\t"
  206434. #ifdef WOLFSSL_KEIL
  206435. "ands r6, r6, %[b]\n\t"
  206436. #elif defined(__clang__)
  206437. "ands r6, %[b]\n\t"
  206438. #else
  206439. "and r6, %[b]\n\t"
  206440. #endif
  206441. #ifdef WOLFSSL_KEIL
  206442. "ands r7, r7, %[b]\n\t"
  206443. #elif defined(__clang__)
  206444. "ands r7, %[b]\n\t"
  206445. #else
  206446. "and r7, %[b]\n\t"
  206447. #endif
  206448. #ifdef WOLFSSL_KEIL
  206449. "adcs r4, r4, r6\n\t"
  206450. #elif defined(__clang__)
  206451. "adcs r4, r6\n\t"
  206452. #else
  206453. "adc r4, r6\n\t"
  206454. #endif
  206455. #ifdef WOLFSSL_KEIL
  206456. "adcs r5, r5, r7\n\t"
  206457. #elif defined(__clang__)
  206458. "adcs r5, r7\n\t"
  206459. #else
  206460. "adc r5, r7\n\t"
  206461. #endif
  206462. "str r4, [%[r], #32]\n\t"
  206463. "str r5, [%[r], #36]\n\t"
  206464. "ldr r4, [%[r], #40]\n\t"
  206465. "ldr r5, [%[r], #44]\n\t"
  206466. "ldr r6, [%[m], #40]\n\t"
  206467. "ldr r7, [%[m], #44]\n\t"
  206468. #ifdef WOLFSSL_KEIL
  206469. "ands r6, r6, %[b]\n\t"
  206470. #elif defined(__clang__)
  206471. "ands r6, %[b]\n\t"
  206472. #else
  206473. "and r6, %[b]\n\t"
  206474. #endif
  206475. #ifdef WOLFSSL_KEIL
  206476. "ands r7, r7, %[b]\n\t"
  206477. #elif defined(__clang__)
  206478. "ands r7, %[b]\n\t"
  206479. #else
  206480. "and r7, %[b]\n\t"
  206481. #endif
  206482. #ifdef WOLFSSL_KEIL
  206483. "adcs r4, r4, r6\n\t"
  206484. #elif defined(__clang__)
  206485. "adcs r4, r6\n\t"
  206486. #else
  206487. "adc r4, r6\n\t"
  206488. #endif
  206489. #ifdef WOLFSSL_KEIL
  206490. "adcs r5, r5, r7\n\t"
  206491. #elif defined(__clang__)
  206492. "adcs r5, r7\n\t"
  206493. #else
  206494. "adc r5, r7\n\t"
  206495. #endif
  206496. "str r4, [%[r], #40]\n\t"
  206497. "str r5, [%[r], #44]\n\t"
  206498. "ldr r4, [%[r], #48]\n\t"
  206499. "ldr r5, [%[r], #52]\n\t"
  206500. "ldr r6, [%[m], #48]\n\t"
  206501. "ldr r7, [%[m], #52]\n\t"
  206502. #ifdef WOLFSSL_KEIL
  206503. "ands r6, r6, %[b]\n\t"
  206504. #elif defined(__clang__)
  206505. "ands r6, %[b]\n\t"
  206506. #else
  206507. "and r6, %[b]\n\t"
  206508. #endif
  206509. #ifdef WOLFSSL_KEIL
  206510. "ands r7, r7, %[b]\n\t"
  206511. #elif defined(__clang__)
  206512. "ands r7, %[b]\n\t"
  206513. #else
  206514. "and r7, %[b]\n\t"
  206515. #endif
  206516. #ifdef WOLFSSL_KEIL
  206517. "adcs r4, r4, r6\n\t"
  206518. #elif defined(__clang__)
  206519. "adcs r4, r6\n\t"
  206520. #else
  206521. "adc r4, r6\n\t"
  206522. #endif
  206523. #ifdef WOLFSSL_KEIL
  206524. "adcs r5, r5, r7\n\t"
  206525. #elif defined(__clang__)
  206526. "adcs r5, r7\n\t"
  206527. #else
  206528. "adc r5, r7\n\t"
  206529. #endif
  206530. "str r4, [%[r], #48]\n\t"
  206531. "str r5, [%[r], #52]\n\t"
  206532. "ldr r4, [%[r], #56]\n\t"
  206533. "ldr r5, [%[r], #60]\n\t"
  206534. "ldr r6, [%[m], #56]\n\t"
  206535. "ldr r7, [%[m], #60]\n\t"
  206536. #ifdef WOLFSSL_KEIL
  206537. "ands r6, r6, %[b]\n\t"
  206538. #elif defined(__clang__)
  206539. "ands r6, %[b]\n\t"
  206540. #else
  206541. "and r6, %[b]\n\t"
  206542. #endif
  206543. #ifdef WOLFSSL_KEIL
  206544. "ands r7, r7, %[b]\n\t"
  206545. #elif defined(__clang__)
  206546. "ands r7, %[b]\n\t"
  206547. #else
  206548. "and r7, %[b]\n\t"
  206549. #endif
  206550. #ifdef WOLFSSL_KEIL
  206551. "adcs r4, r4, r6\n\t"
  206552. #elif defined(__clang__)
  206553. "adcs r4, r6\n\t"
  206554. #else
  206555. "adc r4, r6\n\t"
  206556. #endif
  206557. #ifdef WOLFSSL_KEIL
  206558. "adcs r5, r5, r7\n\t"
  206559. #elif defined(__clang__)
  206560. "adcs r5, r7\n\t"
  206561. #else
  206562. "adc r5, r7\n\t"
  206563. #endif
  206564. "str r4, [%[r], #56]\n\t"
  206565. "str r5, [%[r], #60]\n\t"
  206566. "ldr r4, [%[r], #64]\n\t"
  206567. "ldr r5, [%[r], #68]\n\t"
  206568. "ldr r6, [%[m], #64]\n\t"
  206569. "ldr r7, [%[m], #68]\n\t"
  206570. #ifdef WOLFSSL_KEIL
  206571. "ands r6, r6, %[b]\n\t"
  206572. #elif defined(__clang__)
  206573. "ands r6, %[b]\n\t"
  206574. #else
  206575. "and r6, %[b]\n\t"
  206576. #endif
  206577. #ifdef WOLFSSL_KEIL
  206578. "ands r7, r7, %[b]\n\t"
  206579. #elif defined(__clang__)
  206580. "ands r7, %[b]\n\t"
  206581. #else
  206582. "and r7, %[b]\n\t"
  206583. #endif
  206584. #ifdef WOLFSSL_KEIL
  206585. "adcs r4, r4, r6\n\t"
  206586. #elif defined(__clang__)
  206587. "adcs r4, r6\n\t"
  206588. #else
  206589. "adc r4, r6\n\t"
  206590. #endif
  206591. #ifdef WOLFSSL_KEIL
  206592. "adcs r5, r5, r7\n\t"
  206593. #elif defined(__clang__)
  206594. "adcs r5, r7\n\t"
  206595. #else
  206596. "adc r5, r7\n\t"
  206597. #endif
  206598. "str r4, [%[r], #64]\n\t"
  206599. "str r5, [%[r], #68]\n\t"
  206600. "ldr r4, [%[r], #72]\n\t"
  206601. "ldr r5, [%[r], #76]\n\t"
  206602. "ldr r6, [%[m], #72]\n\t"
  206603. "ldr r7, [%[m], #76]\n\t"
  206604. #ifdef WOLFSSL_KEIL
  206605. "ands r6, r6, %[b]\n\t"
  206606. #elif defined(__clang__)
  206607. "ands r6, %[b]\n\t"
  206608. #else
  206609. "and r6, %[b]\n\t"
  206610. #endif
  206611. #ifdef WOLFSSL_KEIL
  206612. "ands r7, r7, %[b]\n\t"
  206613. #elif defined(__clang__)
  206614. "ands r7, %[b]\n\t"
  206615. #else
  206616. "and r7, %[b]\n\t"
  206617. #endif
  206618. #ifdef WOLFSSL_KEIL
  206619. "adcs r4, r4, r6\n\t"
  206620. #elif defined(__clang__)
  206621. "adcs r4, r6\n\t"
  206622. #else
  206623. "adc r4, r6\n\t"
  206624. #endif
  206625. #ifdef WOLFSSL_KEIL
  206626. "adcs r5, r5, r7\n\t"
  206627. #elif defined(__clang__)
  206628. "adcs r5, r7\n\t"
  206629. #else
  206630. "adc r5, r7\n\t"
  206631. #endif
  206632. "str r4, [%[r], #72]\n\t"
  206633. "str r5, [%[r], #76]\n\t"
  206634. "ldr r4, [%[r], #80]\n\t"
  206635. "ldr r5, [%[r], #84]\n\t"
  206636. "ldr r6, [%[m], #80]\n\t"
  206637. "ldr r7, [%[m], #84]\n\t"
  206638. #ifdef WOLFSSL_KEIL
  206639. "ands r6, r6, %[b]\n\t"
  206640. #elif defined(__clang__)
  206641. "ands r6, %[b]\n\t"
  206642. #else
  206643. "and r6, %[b]\n\t"
  206644. #endif
  206645. #ifdef WOLFSSL_KEIL
  206646. "ands r7, r7, %[b]\n\t"
  206647. #elif defined(__clang__)
  206648. "ands r7, %[b]\n\t"
  206649. #else
  206650. "and r7, %[b]\n\t"
  206651. #endif
  206652. #ifdef WOLFSSL_KEIL
  206653. "adcs r4, r4, r6\n\t"
  206654. #elif defined(__clang__)
  206655. "adcs r4, r6\n\t"
  206656. #else
  206657. "adc r4, r6\n\t"
  206658. #endif
  206659. #ifdef WOLFSSL_KEIL
  206660. "adcs r5, r5, r7\n\t"
  206661. #elif defined(__clang__)
  206662. "adcs r5, r7\n\t"
  206663. #else
  206664. "adc r5, r7\n\t"
  206665. #endif
  206666. "str r4, [%[r], #80]\n\t"
  206667. "str r5, [%[r], #84]\n\t"
  206668. "ldr r4, [%[r], #88]\n\t"
  206669. "ldr r5, [%[r], #92]\n\t"
  206670. "ldr r6, [%[m], #88]\n\t"
  206671. "ldr r7, [%[m], #92]\n\t"
  206672. #ifdef WOLFSSL_KEIL
  206673. "ands r6, r6, %[b]\n\t"
  206674. #elif defined(__clang__)
  206675. "ands r6, %[b]\n\t"
  206676. #else
  206677. "and r6, %[b]\n\t"
  206678. #endif
  206679. #ifdef WOLFSSL_KEIL
  206680. "ands r7, r7, %[b]\n\t"
  206681. #elif defined(__clang__)
  206682. "ands r7, %[b]\n\t"
  206683. #else
  206684. "and r7, %[b]\n\t"
  206685. #endif
  206686. #ifdef WOLFSSL_KEIL
  206687. "adcs r4, r4, r6\n\t"
  206688. #elif defined(__clang__)
  206689. "adcs r4, r6\n\t"
  206690. #else
  206691. "adc r4, r6\n\t"
  206692. #endif
  206693. #ifdef WOLFSSL_KEIL
  206694. "adcs r5, r5, r7\n\t"
  206695. #elif defined(__clang__)
  206696. "adcs r5, r7\n\t"
  206697. #else
  206698. "adc r5, r7\n\t"
  206699. #endif
  206700. "str r4, [%[r], #88]\n\t"
  206701. "str r5, [%[r], #92]\n\t"
  206702. "ldr r4, [%[r], #96]\n\t"
  206703. "ldr r5, [%[r], #100]\n\t"
  206704. "ldr r6, [%[m], #96]\n\t"
  206705. "ldr r7, [%[m], #100]\n\t"
  206706. #ifdef WOLFSSL_KEIL
  206707. "ands r6, r6, %[b]\n\t"
  206708. #elif defined(__clang__)
  206709. "ands r6, %[b]\n\t"
  206710. #else
  206711. "and r6, %[b]\n\t"
  206712. #endif
  206713. #ifdef WOLFSSL_KEIL
  206714. "ands r7, r7, %[b]\n\t"
  206715. #elif defined(__clang__)
  206716. "ands r7, %[b]\n\t"
  206717. #else
  206718. "and r7, %[b]\n\t"
  206719. #endif
  206720. #ifdef WOLFSSL_KEIL
  206721. "adcs r4, r4, r6\n\t"
  206722. #elif defined(__clang__)
  206723. "adcs r4, r6\n\t"
  206724. #else
  206725. "adc r4, r6\n\t"
  206726. #endif
  206727. #ifdef WOLFSSL_KEIL
  206728. "adcs r5, r5, r7\n\t"
  206729. #elif defined(__clang__)
  206730. "adcs r5, r7\n\t"
  206731. #else
  206732. "adc r5, r7\n\t"
  206733. #endif
  206734. "str r4, [%[r], #96]\n\t"
  206735. "str r5, [%[r], #100]\n\t"
  206736. "ldr r4, [%[r], #104]\n\t"
  206737. "ldr r5, [%[r], #108]\n\t"
  206738. "ldr r6, [%[m], #104]\n\t"
  206739. "ldr r7, [%[m], #108]\n\t"
  206740. #ifdef WOLFSSL_KEIL
  206741. "ands r6, r6, %[b]\n\t"
  206742. #elif defined(__clang__)
  206743. "ands r6, %[b]\n\t"
  206744. #else
  206745. "and r6, %[b]\n\t"
  206746. #endif
  206747. #ifdef WOLFSSL_KEIL
  206748. "ands r7, r7, %[b]\n\t"
  206749. #elif defined(__clang__)
  206750. "ands r7, %[b]\n\t"
  206751. #else
  206752. "and r7, %[b]\n\t"
  206753. #endif
  206754. #ifdef WOLFSSL_KEIL
  206755. "adcs r4, r4, r6\n\t"
  206756. #elif defined(__clang__)
  206757. "adcs r4, r6\n\t"
  206758. #else
  206759. "adc r4, r6\n\t"
  206760. #endif
  206761. #ifdef WOLFSSL_KEIL
  206762. "adcs r5, r5, r7\n\t"
  206763. #elif defined(__clang__)
  206764. "adcs r5, r7\n\t"
  206765. #else
  206766. "adc r5, r7\n\t"
  206767. #endif
  206768. "str r4, [%[r], #104]\n\t"
  206769. "str r5, [%[r], #108]\n\t"
  206770. "ldr r4, [%[r], #112]\n\t"
  206771. "ldr r5, [%[r], #116]\n\t"
  206772. "ldr r6, [%[m], #112]\n\t"
  206773. "ldr r7, [%[m], #116]\n\t"
  206774. #ifdef WOLFSSL_KEIL
  206775. "ands r6, r6, %[b]\n\t"
  206776. #elif defined(__clang__)
  206777. "ands r6, %[b]\n\t"
  206778. #else
  206779. "and r6, %[b]\n\t"
  206780. #endif
  206781. #ifdef WOLFSSL_KEIL
  206782. "ands r7, r7, %[b]\n\t"
  206783. #elif defined(__clang__)
  206784. "ands r7, %[b]\n\t"
  206785. #else
  206786. "and r7, %[b]\n\t"
  206787. #endif
  206788. #ifdef WOLFSSL_KEIL
  206789. "adcs r4, r4, r6\n\t"
  206790. #elif defined(__clang__)
  206791. "adcs r4, r6\n\t"
  206792. #else
  206793. "adc r4, r6\n\t"
  206794. #endif
  206795. #ifdef WOLFSSL_KEIL
  206796. "adcs r5, r5, r7\n\t"
  206797. #elif defined(__clang__)
  206798. "adcs r5, r7\n\t"
  206799. #else
  206800. "adc r5, r7\n\t"
  206801. #endif
  206802. "str r4, [%[r], #112]\n\t"
  206803. "str r5, [%[r], #116]\n\t"
  206804. "ldr r4, [%[r], #120]\n\t"
  206805. "ldr r5, [%[r], #124]\n\t"
  206806. "ldr r6, [%[m], #120]\n\t"
  206807. "ldr r7, [%[m], #124]\n\t"
  206808. #ifdef WOLFSSL_KEIL
  206809. "ands r6, r6, %[b]\n\t"
  206810. #elif defined(__clang__)
  206811. "ands r6, %[b]\n\t"
  206812. #else
  206813. "and r6, %[b]\n\t"
  206814. #endif
  206815. #ifdef WOLFSSL_KEIL
  206816. "ands r7, r7, %[b]\n\t"
  206817. #elif defined(__clang__)
  206818. "ands r7, %[b]\n\t"
  206819. #else
  206820. "and r7, %[b]\n\t"
  206821. #endif
  206822. #ifdef WOLFSSL_KEIL
  206823. "adcs r4, r4, r6\n\t"
  206824. #elif defined(__clang__)
  206825. "adcs r4, r6\n\t"
  206826. #else
  206827. "adc r4, r6\n\t"
  206828. #endif
  206829. #ifdef WOLFSSL_KEIL
  206830. "adcs r5, r5, r7\n\t"
  206831. #elif defined(__clang__)
  206832. "adcs r5, r7\n\t"
  206833. #else
  206834. "adc r5, r7\n\t"
  206835. #endif
  206836. "str r4, [%[r], #120]\n\t"
  206837. "str r5, [%[r], #124]\n\t"
  206838. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  206839. :
  206840. : "memory", "r4", "r5", "r6", "r7"
  206841. );
  206842. }
  206843. /* Conditionally add a and b using the mask m.
  206844. * m is -1 to add and 0 when not.
  206845. *
  206846. * r A single precision number representing conditional add result.
  206847. * a A single precision number to add with.
  206848. * b A single precision number to add.
  206849. * m Mask value to apply.
  206850. */
  206851. SP_NOINLINE static sp_digit sp_1024_cond_add_32(sp_digit* r, const sp_digit* a,
  206852. const sp_digit* b, sp_digit m)
  206853. {
  206854. __asm__ __volatile__ (
  206855. "movs r4, #0\n\t"
  206856. "movs r5, #0x80\n\t"
  206857. "mov r8, r5\n\t"
  206858. "movs r7, #0\n\t"
  206859. "\n"
  206860. "L_sp_1024_cond_add_32_words_%=:\n\t"
  206861. "ldr r6, [%[b], r7]\n\t"
  206862. #ifdef WOLFSSL_KEIL
  206863. "ands r6, r6, %[m]\n\t"
  206864. #elif defined(__clang__)
  206865. "ands r6, %[m]\n\t"
  206866. #else
  206867. "and r6, %[m]\n\t"
  206868. #endif
  206869. "movs r5, #0\n\t"
  206870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206871. "subs r5, r5, #1\n\t"
  206872. #else
  206873. "sub r5, r5, #1\n\t"
  206874. #endif
  206875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206876. "adds r5, r5, r4\n\t"
  206877. #else
  206878. "add r5, r5, r4\n\t"
  206879. #endif
  206880. "ldr r5, [%[a], r7]\n\t"
  206881. #ifdef WOLFSSL_KEIL
  206882. "adcs r5, r5, r6\n\t"
  206883. #elif defined(__clang__)
  206884. "adcs r5, r6\n\t"
  206885. #else
  206886. "adc r5, r6\n\t"
  206887. #endif
  206888. "movs r4, #0\n\t"
  206889. #ifdef WOLFSSL_KEIL
  206890. "adcs r4, r4, r4\n\t"
  206891. #elif defined(__clang__)
  206892. "adcs r4, r4\n\t"
  206893. #else
  206894. "adc r4, r4\n\t"
  206895. #endif
  206896. "str r5, [%[r], r7]\n\t"
  206897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206898. "adds r7, r7, #4\n\t"
  206899. #else
  206900. "add r7, r7, #4\n\t"
  206901. #endif
  206902. "cmp r7, r8\n\t"
  206903. "blt L_sp_1024_cond_add_32_words_%=\n\t"
  206904. "movs %[r], r4\n\t"
  206905. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  206906. :
  206907. : "memory", "r4", "r5", "r6", "r7", "r8"
  206908. );
  206909. return (uint32_t)(size_t)r;
  206910. }
  206911. /* Right shift a by 1 bit into r. (r = a >> 1)
  206912. *
  206913. * r A single precision integer.
  206914. * a A single precision integer.
  206915. */
  206916. static void sp_1024_rshift1_32(sp_digit* r, const sp_digit* a)
  206917. {
  206918. __asm__ __volatile__ (
  206919. "ldr r2, [%[a]]\n\t"
  206920. "ldr r3, [%[a], #4]\n\t"
  206921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206922. "lsrs r2, r2, #1\n\t"
  206923. #else
  206924. "lsr r2, r2, #1\n\t"
  206925. #endif
  206926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206927. "lsls r5, r3, #31\n\t"
  206928. #else
  206929. "lsl r5, r3, #31\n\t"
  206930. #endif
  206931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206932. "lsrs r3, r3, #1\n\t"
  206933. #else
  206934. "lsr r3, r3, #1\n\t"
  206935. #endif
  206936. #ifdef WOLFSSL_KEIL
  206937. "orrs r2, r2, r5\n\t"
  206938. #elif defined(__clang__)
  206939. "orrs r2, r5\n\t"
  206940. #else
  206941. "orr r2, r5\n\t"
  206942. #endif
  206943. "ldr r4, [%[a], #8]\n\t"
  206944. "str r2, [%[r]]\n\t"
  206945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206946. "lsls r5, r4, #31\n\t"
  206947. #else
  206948. "lsl r5, r4, #31\n\t"
  206949. #endif
  206950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206951. "lsrs r4, r4, #1\n\t"
  206952. #else
  206953. "lsr r4, r4, #1\n\t"
  206954. #endif
  206955. #ifdef WOLFSSL_KEIL
  206956. "orrs r3, r3, r5\n\t"
  206957. #elif defined(__clang__)
  206958. "orrs r3, r5\n\t"
  206959. #else
  206960. "orr r3, r5\n\t"
  206961. #endif
  206962. "ldr r2, [%[a], #12]\n\t"
  206963. "str r3, [%[r], #4]\n\t"
  206964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206965. "lsls r5, r2, #31\n\t"
  206966. #else
  206967. "lsl r5, r2, #31\n\t"
  206968. #endif
  206969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206970. "lsrs r2, r2, #1\n\t"
  206971. #else
  206972. "lsr r2, r2, #1\n\t"
  206973. #endif
  206974. #ifdef WOLFSSL_KEIL
  206975. "orrs r4, r4, r5\n\t"
  206976. #elif defined(__clang__)
  206977. "orrs r4, r5\n\t"
  206978. #else
  206979. "orr r4, r5\n\t"
  206980. #endif
  206981. "ldr r3, [%[a], #16]\n\t"
  206982. "str r4, [%[r], #8]\n\t"
  206983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206984. "lsls r5, r3, #31\n\t"
  206985. #else
  206986. "lsl r5, r3, #31\n\t"
  206987. #endif
  206988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206989. "lsrs r3, r3, #1\n\t"
  206990. #else
  206991. "lsr r3, r3, #1\n\t"
  206992. #endif
  206993. #ifdef WOLFSSL_KEIL
  206994. "orrs r2, r2, r5\n\t"
  206995. #elif defined(__clang__)
  206996. "orrs r2, r5\n\t"
  206997. #else
  206998. "orr r2, r5\n\t"
  206999. #endif
  207000. "ldr r4, [%[a], #20]\n\t"
  207001. "str r2, [%[r], #12]\n\t"
  207002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207003. "lsls r5, r4, #31\n\t"
  207004. #else
  207005. "lsl r5, r4, #31\n\t"
  207006. #endif
  207007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207008. "lsrs r4, r4, #1\n\t"
  207009. #else
  207010. "lsr r4, r4, #1\n\t"
  207011. #endif
  207012. #ifdef WOLFSSL_KEIL
  207013. "orrs r3, r3, r5\n\t"
  207014. #elif defined(__clang__)
  207015. "orrs r3, r5\n\t"
  207016. #else
  207017. "orr r3, r5\n\t"
  207018. #endif
  207019. "ldr r2, [%[a], #24]\n\t"
  207020. "str r3, [%[r], #16]\n\t"
  207021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207022. "lsls r5, r2, #31\n\t"
  207023. #else
  207024. "lsl r5, r2, #31\n\t"
  207025. #endif
  207026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207027. "lsrs r2, r2, #1\n\t"
  207028. #else
  207029. "lsr r2, r2, #1\n\t"
  207030. #endif
  207031. #ifdef WOLFSSL_KEIL
  207032. "orrs r4, r4, r5\n\t"
  207033. #elif defined(__clang__)
  207034. "orrs r4, r5\n\t"
  207035. #else
  207036. "orr r4, r5\n\t"
  207037. #endif
  207038. "ldr r3, [%[a], #28]\n\t"
  207039. "str r4, [%[r], #20]\n\t"
  207040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207041. "lsls r5, r3, #31\n\t"
  207042. #else
  207043. "lsl r5, r3, #31\n\t"
  207044. #endif
  207045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207046. "lsrs r3, r3, #1\n\t"
  207047. #else
  207048. "lsr r3, r3, #1\n\t"
  207049. #endif
  207050. #ifdef WOLFSSL_KEIL
  207051. "orrs r2, r2, r5\n\t"
  207052. #elif defined(__clang__)
  207053. "orrs r2, r5\n\t"
  207054. #else
  207055. "orr r2, r5\n\t"
  207056. #endif
  207057. "ldr r4, [%[a], #32]\n\t"
  207058. "str r2, [%[r], #24]\n\t"
  207059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207060. "lsls r5, r4, #31\n\t"
  207061. #else
  207062. "lsl r5, r4, #31\n\t"
  207063. #endif
  207064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207065. "lsrs r4, r4, #1\n\t"
  207066. #else
  207067. "lsr r4, r4, #1\n\t"
  207068. #endif
  207069. #ifdef WOLFSSL_KEIL
  207070. "orrs r3, r3, r5\n\t"
  207071. #elif defined(__clang__)
  207072. "orrs r3, r5\n\t"
  207073. #else
  207074. "orr r3, r5\n\t"
  207075. #endif
  207076. "ldr r2, [%[a], #36]\n\t"
  207077. "str r3, [%[r], #28]\n\t"
  207078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207079. "lsls r5, r2, #31\n\t"
  207080. #else
  207081. "lsl r5, r2, #31\n\t"
  207082. #endif
  207083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207084. "lsrs r2, r2, #1\n\t"
  207085. #else
  207086. "lsr r2, r2, #1\n\t"
  207087. #endif
  207088. #ifdef WOLFSSL_KEIL
  207089. "orrs r4, r4, r5\n\t"
  207090. #elif defined(__clang__)
  207091. "orrs r4, r5\n\t"
  207092. #else
  207093. "orr r4, r5\n\t"
  207094. #endif
  207095. "ldr r3, [%[a], #40]\n\t"
  207096. "str r4, [%[r], #32]\n\t"
  207097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207098. "lsls r5, r3, #31\n\t"
  207099. #else
  207100. "lsl r5, r3, #31\n\t"
  207101. #endif
  207102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207103. "lsrs r3, r3, #1\n\t"
  207104. #else
  207105. "lsr r3, r3, #1\n\t"
  207106. #endif
  207107. #ifdef WOLFSSL_KEIL
  207108. "orrs r2, r2, r5\n\t"
  207109. #elif defined(__clang__)
  207110. "orrs r2, r5\n\t"
  207111. #else
  207112. "orr r2, r5\n\t"
  207113. #endif
  207114. "ldr r4, [%[a], #44]\n\t"
  207115. "str r2, [%[r], #36]\n\t"
  207116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207117. "lsls r5, r4, #31\n\t"
  207118. #else
  207119. "lsl r5, r4, #31\n\t"
  207120. #endif
  207121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207122. "lsrs r4, r4, #1\n\t"
  207123. #else
  207124. "lsr r4, r4, #1\n\t"
  207125. #endif
  207126. #ifdef WOLFSSL_KEIL
  207127. "orrs r3, r3, r5\n\t"
  207128. #elif defined(__clang__)
  207129. "orrs r3, r5\n\t"
  207130. #else
  207131. "orr r3, r5\n\t"
  207132. #endif
  207133. "ldr r2, [%[a], #48]\n\t"
  207134. "str r3, [%[r], #40]\n\t"
  207135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207136. "lsls r5, r2, #31\n\t"
  207137. #else
  207138. "lsl r5, r2, #31\n\t"
  207139. #endif
  207140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207141. "lsrs r2, r2, #1\n\t"
  207142. #else
  207143. "lsr r2, r2, #1\n\t"
  207144. #endif
  207145. #ifdef WOLFSSL_KEIL
  207146. "orrs r4, r4, r5\n\t"
  207147. #elif defined(__clang__)
  207148. "orrs r4, r5\n\t"
  207149. #else
  207150. "orr r4, r5\n\t"
  207151. #endif
  207152. "ldr r3, [%[a], #52]\n\t"
  207153. "str r4, [%[r], #44]\n\t"
  207154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207155. "lsls r5, r3, #31\n\t"
  207156. #else
  207157. "lsl r5, r3, #31\n\t"
  207158. #endif
  207159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207160. "lsrs r3, r3, #1\n\t"
  207161. #else
  207162. "lsr r3, r3, #1\n\t"
  207163. #endif
  207164. #ifdef WOLFSSL_KEIL
  207165. "orrs r2, r2, r5\n\t"
  207166. #elif defined(__clang__)
  207167. "orrs r2, r5\n\t"
  207168. #else
  207169. "orr r2, r5\n\t"
  207170. #endif
  207171. "ldr r4, [%[a], #56]\n\t"
  207172. "str r2, [%[r], #48]\n\t"
  207173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207174. "lsls r5, r4, #31\n\t"
  207175. #else
  207176. "lsl r5, r4, #31\n\t"
  207177. #endif
  207178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207179. "lsrs r4, r4, #1\n\t"
  207180. #else
  207181. "lsr r4, r4, #1\n\t"
  207182. #endif
  207183. #ifdef WOLFSSL_KEIL
  207184. "orrs r3, r3, r5\n\t"
  207185. #elif defined(__clang__)
  207186. "orrs r3, r5\n\t"
  207187. #else
  207188. "orr r3, r5\n\t"
  207189. #endif
  207190. "ldr r2, [%[a], #60]\n\t"
  207191. "str r3, [%[r], #52]\n\t"
  207192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207193. "lsls r5, r2, #31\n\t"
  207194. #else
  207195. "lsl r5, r2, #31\n\t"
  207196. #endif
  207197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207198. "lsrs r2, r2, #1\n\t"
  207199. #else
  207200. "lsr r2, r2, #1\n\t"
  207201. #endif
  207202. #ifdef WOLFSSL_KEIL
  207203. "orrs r4, r4, r5\n\t"
  207204. #elif defined(__clang__)
  207205. "orrs r4, r5\n\t"
  207206. #else
  207207. "orr r4, r5\n\t"
  207208. #endif
  207209. "ldr r3, [%[a], #64]\n\t"
  207210. "str r4, [%[r], #56]\n\t"
  207211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207212. "lsls r5, r3, #31\n\t"
  207213. #else
  207214. "lsl r5, r3, #31\n\t"
  207215. #endif
  207216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207217. "lsrs r3, r3, #1\n\t"
  207218. #else
  207219. "lsr r3, r3, #1\n\t"
  207220. #endif
  207221. #ifdef WOLFSSL_KEIL
  207222. "orrs r2, r2, r5\n\t"
  207223. #elif defined(__clang__)
  207224. "orrs r2, r5\n\t"
  207225. #else
  207226. "orr r2, r5\n\t"
  207227. #endif
  207228. "ldr r4, [%[a], #68]\n\t"
  207229. "str r2, [%[r], #60]\n\t"
  207230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207231. "lsls r5, r4, #31\n\t"
  207232. #else
  207233. "lsl r5, r4, #31\n\t"
  207234. #endif
  207235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207236. "lsrs r4, r4, #1\n\t"
  207237. #else
  207238. "lsr r4, r4, #1\n\t"
  207239. #endif
  207240. #ifdef WOLFSSL_KEIL
  207241. "orrs r3, r3, r5\n\t"
  207242. #elif defined(__clang__)
  207243. "orrs r3, r5\n\t"
  207244. #else
  207245. "orr r3, r5\n\t"
  207246. #endif
  207247. "ldr r2, [%[a], #72]\n\t"
  207248. "str r3, [%[r], #64]\n\t"
  207249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207250. "lsls r5, r2, #31\n\t"
  207251. #else
  207252. "lsl r5, r2, #31\n\t"
  207253. #endif
  207254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207255. "lsrs r2, r2, #1\n\t"
  207256. #else
  207257. "lsr r2, r2, #1\n\t"
  207258. #endif
  207259. #ifdef WOLFSSL_KEIL
  207260. "orrs r4, r4, r5\n\t"
  207261. #elif defined(__clang__)
  207262. "orrs r4, r5\n\t"
  207263. #else
  207264. "orr r4, r5\n\t"
  207265. #endif
  207266. "ldr r3, [%[a], #76]\n\t"
  207267. "str r4, [%[r], #68]\n\t"
  207268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207269. "lsls r5, r3, #31\n\t"
  207270. #else
  207271. "lsl r5, r3, #31\n\t"
  207272. #endif
  207273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207274. "lsrs r3, r3, #1\n\t"
  207275. #else
  207276. "lsr r3, r3, #1\n\t"
  207277. #endif
  207278. #ifdef WOLFSSL_KEIL
  207279. "orrs r2, r2, r5\n\t"
  207280. #elif defined(__clang__)
  207281. "orrs r2, r5\n\t"
  207282. #else
  207283. "orr r2, r5\n\t"
  207284. #endif
  207285. "ldr r4, [%[a], #80]\n\t"
  207286. "str r2, [%[r], #72]\n\t"
  207287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207288. "lsls r5, r4, #31\n\t"
  207289. #else
  207290. "lsl r5, r4, #31\n\t"
  207291. #endif
  207292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207293. "lsrs r4, r4, #1\n\t"
  207294. #else
  207295. "lsr r4, r4, #1\n\t"
  207296. #endif
  207297. #ifdef WOLFSSL_KEIL
  207298. "orrs r3, r3, r5\n\t"
  207299. #elif defined(__clang__)
  207300. "orrs r3, r5\n\t"
  207301. #else
  207302. "orr r3, r5\n\t"
  207303. #endif
  207304. "ldr r2, [%[a], #84]\n\t"
  207305. "str r3, [%[r], #76]\n\t"
  207306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207307. "lsls r5, r2, #31\n\t"
  207308. #else
  207309. "lsl r5, r2, #31\n\t"
  207310. #endif
  207311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207312. "lsrs r2, r2, #1\n\t"
  207313. #else
  207314. "lsr r2, r2, #1\n\t"
  207315. #endif
  207316. #ifdef WOLFSSL_KEIL
  207317. "orrs r4, r4, r5\n\t"
  207318. #elif defined(__clang__)
  207319. "orrs r4, r5\n\t"
  207320. #else
  207321. "orr r4, r5\n\t"
  207322. #endif
  207323. "ldr r3, [%[a], #88]\n\t"
  207324. "str r4, [%[r], #80]\n\t"
  207325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207326. "lsls r5, r3, #31\n\t"
  207327. #else
  207328. "lsl r5, r3, #31\n\t"
  207329. #endif
  207330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207331. "lsrs r3, r3, #1\n\t"
  207332. #else
  207333. "lsr r3, r3, #1\n\t"
  207334. #endif
  207335. #ifdef WOLFSSL_KEIL
  207336. "orrs r2, r2, r5\n\t"
  207337. #elif defined(__clang__)
  207338. "orrs r2, r5\n\t"
  207339. #else
  207340. "orr r2, r5\n\t"
  207341. #endif
  207342. "ldr r4, [%[a], #92]\n\t"
  207343. "str r2, [%[r], #84]\n\t"
  207344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207345. "lsls r5, r4, #31\n\t"
  207346. #else
  207347. "lsl r5, r4, #31\n\t"
  207348. #endif
  207349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207350. "lsrs r4, r4, #1\n\t"
  207351. #else
  207352. "lsr r4, r4, #1\n\t"
  207353. #endif
  207354. #ifdef WOLFSSL_KEIL
  207355. "orrs r3, r3, r5\n\t"
  207356. #elif defined(__clang__)
  207357. "orrs r3, r5\n\t"
  207358. #else
  207359. "orr r3, r5\n\t"
  207360. #endif
  207361. "ldr r2, [%[a], #96]\n\t"
  207362. "str r3, [%[r], #88]\n\t"
  207363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207364. "lsls r5, r2, #31\n\t"
  207365. #else
  207366. "lsl r5, r2, #31\n\t"
  207367. #endif
  207368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207369. "lsrs r2, r2, #1\n\t"
  207370. #else
  207371. "lsr r2, r2, #1\n\t"
  207372. #endif
  207373. #ifdef WOLFSSL_KEIL
  207374. "orrs r4, r4, r5\n\t"
  207375. #elif defined(__clang__)
  207376. "orrs r4, r5\n\t"
  207377. #else
  207378. "orr r4, r5\n\t"
  207379. #endif
  207380. "ldr r3, [%[a], #100]\n\t"
  207381. "str r4, [%[r], #92]\n\t"
  207382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207383. "lsls r5, r3, #31\n\t"
  207384. #else
  207385. "lsl r5, r3, #31\n\t"
  207386. #endif
  207387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207388. "lsrs r3, r3, #1\n\t"
  207389. #else
  207390. "lsr r3, r3, #1\n\t"
  207391. #endif
  207392. #ifdef WOLFSSL_KEIL
  207393. "orrs r2, r2, r5\n\t"
  207394. #elif defined(__clang__)
  207395. "orrs r2, r5\n\t"
  207396. #else
  207397. "orr r2, r5\n\t"
  207398. #endif
  207399. "ldr r4, [%[a], #104]\n\t"
  207400. "str r2, [%[r], #96]\n\t"
  207401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207402. "lsls r5, r4, #31\n\t"
  207403. #else
  207404. "lsl r5, r4, #31\n\t"
  207405. #endif
  207406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207407. "lsrs r4, r4, #1\n\t"
  207408. #else
  207409. "lsr r4, r4, #1\n\t"
  207410. #endif
  207411. #ifdef WOLFSSL_KEIL
  207412. "orrs r3, r3, r5\n\t"
  207413. #elif defined(__clang__)
  207414. "orrs r3, r5\n\t"
  207415. #else
  207416. "orr r3, r5\n\t"
  207417. #endif
  207418. "ldr r2, [%[a], #108]\n\t"
  207419. "str r3, [%[r], #100]\n\t"
  207420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207421. "lsls r5, r2, #31\n\t"
  207422. #else
  207423. "lsl r5, r2, #31\n\t"
  207424. #endif
  207425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207426. "lsrs r2, r2, #1\n\t"
  207427. #else
  207428. "lsr r2, r2, #1\n\t"
  207429. #endif
  207430. #ifdef WOLFSSL_KEIL
  207431. "orrs r4, r4, r5\n\t"
  207432. #elif defined(__clang__)
  207433. "orrs r4, r5\n\t"
  207434. #else
  207435. "orr r4, r5\n\t"
  207436. #endif
  207437. "ldr r3, [%[a], #112]\n\t"
  207438. "str r4, [%[r], #104]\n\t"
  207439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207440. "lsls r5, r3, #31\n\t"
  207441. #else
  207442. "lsl r5, r3, #31\n\t"
  207443. #endif
  207444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207445. "lsrs r3, r3, #1\n\t"
  207446. #else
  207447. "lsr r3, r3, #1\n\t"
  207448. #endif
  207449. #ifdef WOLFSSL_KEIL
  207450. "orrs r2, r2, r5\n\t"
  207451. #elif defined(__clang__)
  207452. "orrs r2, r5\n\t"
  207453. #else
  207454. "orr r2, r5\n\t"
  207455. #endif
  207456. "ldr r4, [%[a], #116]\n\t"
  207457. "str r2, [%[r], #108]\n\t"
  207458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207459. "lsls r5, r4, #31\n\t"
  207460. #else
  207461. "lsl r5, r4, #31\n\t"
  207462. #endif
  207463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207464. "lsrs r4, r4, #1\n\t"
  207465. #else
  207466. "lsr r4, r4, #1\n\t"
  207467. #endif
  207468. #ifdef WOLFSSL_KEIL
  207469. "orrs r3, r3, r5\n\t"
  207470. #elif defined(__clang__)
  207471. "orrs r3, r5\n\t"
  207472. #else
  207473. "orr r3, r5\n\t"
  207474. #endif
  207475. "ldr r2, [%[a], #120]\n\t"
  207476. "str r3, [%[r], #112]\n\t"
  207477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207478. "lsls r5, r2, #31\n\t"
  207479. #else
  207480. "lsl r5, r2, #31\n\t"
  207481. #endif
  207482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207483. "lsrs r2, r2, #1\n\t"
  207484. #else
  207485. "lsr r2, r2, #1\n\t"
  207486. #endif
  207487. #ifdef WOLFSSL_KEIL
  207488. "orrs r4, r4, r5\n\t"
  207489. #elif defined(__clang__)
  207490. "orrs r4, r5\n\t"
  207491. #else
  207492. "orr r4, r5\n\t"
  207493. #endif
  207494. "ldr r3, [%[a], #124]\n\t"
  207495. "str r4, [%[r], #116]\n\t"
  207496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207497. "lsls r5, r3, #31\n\t"
  207498. #else
  207499. "lsl r5, r3, #31\n\t"
  207500. #endif
  207501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207502. "lsrs r3, r3, #1\n\t"
  207503. #else
  207504. "lsr r3, r3, #1\n\t"
  207505. #endif
  207506. #ifdef WOLFSSL_KEIL
  207507. "orrs r2, r2, r5\n\t"
  207508. #elif defined(__clang__)
  207509. "orrs r2, r5\n\t"
  207510. #else
  207511. "orr r2, r5\n\t"
  207512. #endif
  207513. "str r2, [%[r], #120]\n\t"
  207514. "str r3, [%[r], #124]\n\t"
  207515. : [r] "+l" (r), [a] "+l" (a)
  207516. :
  207517. : "memory", "r2", "r3", "r4", "r5"
  207518. );
  207519. }
  207520. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  207521. *
  207522. * r Result of division by 2.
  207523. * a Number to divide.
  207524. * m Modulus (prime).
  207525. */
  207526. SP_NOINLINE static void sp_1024_mont_div2_32(sp_digit* r, const sp_digit* a,
  207527. const sp_digit* m)
  207528. {
  207529. sp_digit o;
  207530. o = sp_1024_cond_add_32(r, a, m, 0 - (a[0] & 1));
  207531. sp_1024_rshift1_32(r, r);
  207532. r[31] |= o << 31;
  207533. }
  207534. /* Double the Montgomery form projective point p.
  207535. *
  207536. * r Result of doubling point.
  207537. * p Point to double.
  207538. * t Temporary ordinate data.
  207539. */
  207540. static void sp_1024_proj_point_dbl_32(sp_point_1024* r, const sp_point_1024* p,
  207541. sp_digit* t)
  207542. {
  207543. sp_digit* t1 = t;
  207544. sp_digit* t2 = t + 2*32;
  207545. sp_digit* x;
  207546. sp_digit* y;
  207547. sp_digit* z;
  207548. x = r->x;
  207549. y = r->y;
  207550. z = r->z;
  207551. /* Put infinity into result. */
  207552. if (r != p) {
  207553. r->infinity = p->infinity;
  207554. }
  207555. /* T1 = Z * Z */
  207556. sp_1024_mont_sqr_32(t1, p->z, p1024_mod, p1024_mp_mod);
  207557. /* Z = Y * Z */
  207558. sp_1024_mont_mul_32(z, p->y, p->z, p1024_mod, p1024_mp_mod);
  207559. /* Z = 2Z */
  207560. sp_1024_mont_dbl_32(z, z, p1024_mod);
  207561. /* T2 = X - T1 */
  207562. sp_1024_mont_sub_32(t2, p->x, t1, p1024_mod);
  207563. /* T1 = X + T1 */
  207564. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  207565. /* T2 = T1 * T2 */
  207566. sp_1024_mont_mul_32(t2, t1, t2, p1024_mod, p1024_mp_mod);
  207567. /* T1 = 3T2 */
  207568. sp_1024_mont_tpl_32(t1, t2, p1024_mod);
  207569. /* Y = 2Y */
  207570. sp_1024_mont_dbl_32(y, p->y, p1024_mod);
  207571. /* Y = Y * Y */
  207572. sp_1024_mont_sqr_32(y, y, p1024_mod, p1024_mp_mod);
  207573. /* T2 = Y * Y */
  207574. sp_1024_mont_sqr_32(t2, y, p1024_mod, p1024_mp_mod);
  207575. /* T2 = T2/2 */
  207576. sp_1024_mont_div2_32(t2, t2, p1024_mod);
  207577. /* Y = Y * X */
  207578. sp_1024_mont_mul_32(y, y, p->x, p1024_mod, p1024_mp_mod);
  207579. /* X = T1 * T1 */
  207580. sp_1024_mont_sqr_32(x, t1, p1024_mod, p1024_mp_mod);
  207581. /* X = X - Y */
  207582. sp_1024_mont_sub_32(x, x, y, p1024_mod);
  207583. /* X = X - Y */
  207584. sp_1024_mont_sub_32(x, x, y, p1024_mod);
  207585. /* Y = Y - X */
  207586. sp_1024_mont_sub_32(y, y, x, p1024_mod);
  207587. /* Y = Y * T1 */
  207588. sp_1024_mont_mul_32(y, y, t1, p1024_mod, p1024_mp_mod);
  207589. /* Y = Y - T2 */
  207590. sp_1024_mont_sub_32(y, y, t2, p1024_mod);
  207591. }
  207592. #ifdef WOLFSSL_SP_NONBLOCK
  207593. typedef struct sp_1024_proj_point_dbl_32_ctx {
  207594. int state;
  207595. sp_digit* t1;
  207596. sp_digit* t2;
  207597. sp_digit* x;
  207598. sp_digit* y;
  207599. sp_digit* z;
  207600. } sp_1024_proj_point_dbl_32_ctx;
  207601. /* Double the Montgomery form projective point p.
  207602. *
  207603. * r Result of doubling point.
  207604. * p Point to double.
  207605. * t Temporary ordinate data.
  207606. */
  207607. static int sp_1024_proj_point_dbl_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r,
  207608. const sp_point_1024* p, sp_digit* t)
  207609. {
  207610. int err = FP_WOULDBLOCK;
  207611. sp_1024_proj_point_dbl_32_ctx* ctx = (sp_1024_proj_point_dbl_32_ctx*)sp_ctx->data;
  207612. typedef char ctx_size_test[sizeof(sp_1024_proj_point_dbl_32_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  207613. (void)sizeof(ctx_size_test);
  207614. switch (ctx->state) {
  207615. case 0:
  207616. ctx->t1 = t;
  207617. ctx->t2 = t + 2*32;
  207618. ctx->x = r->x;
  207619. ctx->y = r->y;
  207620. ctx->z = r->z;
  207621. /* Put infinity into result. */
  207622. if (r != p) {
  207623. r->infinity = p->infinity;
  207624. }
  207625. ctx->state = 1;
  207626. break;
  207627. case 1:
  207628. /* T1 = Z * Z */
  207629. sp_1024_mont_sqr_32(ctx->t1, p->z, p1024_mod, p1024_mp_mod);
  207630. ctx->state = 2;
  207631. break;
  207632. case 2:
  207633. /* Z = Y * Z */
  207634. sp_1024_mont_mul_32(ctx->z, p->y, p->z, p1024_mod, p1024_mp_mod);
  207635. ctx->state = 3;
  207636. break;
  207637. case 3:
  207638. /* Z = 2Z */
  207639. sp_1024_mont_dbl_32(ctx->z, ctx->z, p1024_mod);
  207640. ctx->state = 4;
  207641. break;
  207642. case 4:
  207643. /* T2 = X - T1 */
  207644. sp_1024_mont_sub_32(ctx->t2, p->x, ctx->t1, p1024_mod);
  207645. ctx->state = 5;
  207646. break;
  207647. case 5:
  207648. /* T1 = X + T1 */
  207649. sp_1024_mont_add_32(ctx->t1, p->x, ctx->t1, p1024_mod);
  207650. ctx->state = 6;
  207651. break;
  207652. case 6:
  207653. /* T2 = T1 * T2 */
  207654. sp_1024_mont_mul_32(ctx->t2, ctx->t1, ctx->t2, p1024_mod, p1024_mp_mod);
  207655. ctx->state = 7;
  207656. break;
  207657. case 7:
  207658. /* T1 = 3T2 */
  207659. sp_1024_mont_tpl_32(ctx->t1, ctx->t2, p1024_mod);
  207660. ctx->state = 8;
  207661. break;
  207662. case 8:
  207663. /* Y = 2Y */
  207664. sp_1024_mont_dbl_32(ctx->y, p->y, p1024_mod);
  207665. ctx->state = 9;
  207666. break;
  207667. case 9:
  207668. /* Y = Y * Y */
  207669. sp_1024_mont_sqr_32(ctx->y, ctx->y, p1024_mod, p1024_mp_mod);
  207670. ctx->state = 10;
  207671. break;
  207672. case 10:
  207673. /* T2 = Y * Y */
  207674. sp_1024_mont_sqr_32(ctx->t2, ctx->y, p1024_mod, p1024_mp_mod);
  207675. ctx->state = 11;
  207676. break;
  207677. case 11:
  207678. /* T2 = T2/2 */
  207679. sp_1024_mont_div2_32(ctx->t2, ctx->t2, p1024_mod);
  207680. ctx->state = 12;
  207681. break;
  207682. case 12:
  207683. /* Y = Y * X */
  207684. sp_1024_mont_mul_32(ctx->y, ctx->y, p->x, p1024_mod, p1024_mp_mod);
  207685. ctx->state = 13;
  207686. break;
  207687. case 13:
  207688. /* X = T1 * T1 */
  207689. sp_1024_mont_sqr_32(ctx->x, ctx->t1, p1024_mod, p1024_mp_mod);
  207690. ctx->state = 14;
  207691. break;
  207692. case 14:
  207693. /* X = X - Y */
  207694. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->y, p1024_mod);
  207695. ctx->state = 15;
  207696. break;
  207697. case 15:
  207698. /* X = X - Y */
  207699. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->y, p1024_mod);
  207700. ctx->state = 16;
  207701. break;
  207702. case 16:
  207703. /* Y = Y - X */
  207704. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->x, p1024_mod);
  207705. ctx->state = 17;
  207706. break;
  207707. case 17:
  207708. /* Y = Y * T1 */
  207709. sp_1024_mont_mul_32(ctx->y, ctx->y, ctx->t1, p1024_mod, p1024_mp_mod);
  207710. ctx->state = 18;
  207711. break;
  207712. case 18:
  207713. /* Y = Y - T2 */
  207714. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->t2, p1024_mod);
  207715. ctx->state = 19;
  207716. /* fall-through */
  207717. case 19:
  207718. err = MP_OKAY;
  207719. break;
  207720. }
  207721. if (err == MP_OKAY && ctx->state != 19) {
  207722. err = FP_WOULDBLOCK;
  207723. }
  207724. return err;
  207725. }
  207726. #endif /* WOLFSSL_SP_NONBLOCK */
  207727. /* Compare two numbers to determine if they are equal.
  207728. * Constant time implementation.
  207729. *
  207730. * a First number to compare.
  207731. * b Second number to compare.
  207732. * returns 1 when equal and 0 otherwise.
  207733. */
  207734. static int sp_1024_cmp_equal_32(const sp_digit* a, const sp_digit* b)
  207735. {
  207736. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  207737. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  207738. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  207739. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11]) |
  207740. (a[12] ^ b[12]) | (a[13] ^ b[13]) | (a[14] ^ b[14]) |
  207741. (a[15] ^ b[15]) | (a[16] ^ b[16]) | (a[17] ^ b[17]) |
  207742. (a[18] ^ b[18]) | (a[19] ^ b[19]) | (a[20] ^ b[20]) |
  207743. (a[21] ^ b[21]) | (a[22] ^ b[22]) | (a[23] ^ b[23]) |
  207744. (a[24] ^ b[24]) | (a[25] ^ b[25]) | (a[26] ^ b[26]) |
  207745. (a[27] ^ b[27]) | (a[28] ^ b[28]) | (a[29] ^ b[29]) |
  207746. (a[30] ^ b[30]) | (a[31] ^ b[31])) == 0;
  207747. }
  207748. /* Returns 1 if the number of zero.
  207749. * Implementation is constant time.
  207750. *
  207751. * a Number to check.
  207752. * returns 1 if the number is zero and 0 otherwise.
  207753. */
  207754. static int sp_1024_iszero_32(const sp_digit* a)
  207755. {
  207756. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  207757. a[8] | a[9] | a[10] | a[11] | a[12] | a[13] | a[14] | a[15] |
  207758. a[16] | a[17] | a[18] | a[19] | a[20] | a[21] | a[22] | a[23] |
  207759. a[24] | a[25] | a[26] | a[27] | a[28] | a[29] | a[30] | a[31]) == 0;
  207760. }
  207761. /* Add two Montgomery form projective points.
  207762. *
  207763. * r Result of addition.
  207764. * p First point to add.
  207765. * q Second point to add.
  207766. * t Temporary ordinate data.
  207767. */
  207768. static void sp_1024_proj_point_add_32(sp_point_1024* r,
  207769. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  207770. {
  207771. sp_digit* t6 = t;
  207772. sp_digit* t1 = t + 2*32;
  207773. sp_digit* t2 = t + 4*32;
  207774. sp_digit* t3 = t + 6*32;
  207775. sp_digit* t4 = t + 8*32;
  207776. sp_digit* t5 = t + 10*32;
  207777. /* U1 = X1*Z2^2 */
  207778. sp_1024_mont_sqr_32(t1, q->z, p1024_mod, p1024_mp_mod);
  207779. sp_1024_mont_mul_32(t3, t1, q->z, p1024_mod, p1024_mp_mod);
  207780. sp_1024_mont_mul_32(t1, t1, p->x, p1024_mod, p1024_mp_mod);
  207781. /* U2 = X2*Z1^2 */
  207782. sp_1024_mont_sqr_32(t2, p->z, p1024_mod, p1024_mp_mod);
  207783. sp_1024_mont_mul_32(t4, t2, p->z, p1024_mod, p1024_mp_mod);
  207784. sp_1024_mont_mul_32(t2, t2, q->x, p1024_mod, p1024_mp_mod);
  207785. /* S1 = Y1*Z2^3 */
  207786. sp_1024_mont_mul_32(t3, t3, p->y, p1024_mod, p1024_mp_mod);
  207787. /* S2 = Y2*Z1^3 */
  207788. sp_1024_mont_mul_32(t4, t4, q->y, p1024_mod, p1024_mp_mod);
  207789. /* Check double */
  207790. if ((~p->infinity) & (~q->infinity) &
  207791. sp_1024_cmp_equal_32(t2, t1) &
  207792. sp_1024_cmp_equal_32(t4, t3)) {
  207793. sp_1024_proj_point_dbl_32(r, p, t);
  207794. }
  207795. else {
  207796. sp_digit* x = t6;
  207797. sp_digit* y = t1;
  207798. sp_digit* z = t2;
  207799. /* H = U2 - U1 */
  207800. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  207801. /* R = S2 - S1 */
  207802. sp_1024_mont_sub_32(t4, t4, t3, p1024_mod);
  207803. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  207804. sp_1024_mont_sqr_32(t5, t2, p1024_mod, p1024_mp_mod);
  207805. sp_1024_mont_mul_32(y, t1, t5, p1024_mod, p1024_mp_mod);
  207806. sp_1024_mont_mul_32(t5, t5, t2, p1024_mod, p1024_mp_mod);
  207807. /* Z3 = H*Z1*Z2 */
  207808. sp_1024_mont_mul_32(z, p->z, t2, p1024_mod, p1024_mp_mod);
  207809. sp_1024_mont_mul_32(z, z, q->z, p1024_mod, p1024_mp_mod);
  207810. sp_1024_mont_sqr_32(x, t4, p1024_mod, p1024_mp_mod);
  207811. sp_1024_mont_sub_32(x, x, t5, p1024_mod);
  207812. sp_1024_mont_mul_32(t5, t5, t3, p1024_mod, p1024_mp_mod);
  207813. sp_1024_mont_dbl_32(t3, y, p1024_mod);
  207814. sp_1024_mont_sub_32(x, x, t3, p1024_mod);
  207815. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  207816. sp_1024_mont_sub_32(y, y, x, p1024_mod);
  207817. sp_1024_mont_mul_32(y, y, t4, p1024_mod, p1024_mp_mod);
  207818. sp_1024_mont_sub_32(y, y, t5, p1024_mod);
  207819. {
  207820. int i;
  207821. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  207822. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  207823. sp_digit maskt = ~(maskp | maskq);
  207824. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  207825. for (i = 0; i < 32; i++) {
  207826. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  207827. (x[i] & maskt);
  207828. }
  207829. for (i = 0; i < 32; i++) {
  207830. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  207831. (y[i] & maskt);
  207832. }
  207833. for (i = 0; i < 32; i++) {
  207834. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  207835. (z[i] & maskt);
  207836. }
  207837. r->z[0] |= inf;
  207838. r->infinity = (word32)inf;
  207839. }
  207840. }
  207841. }
  207842. #ifdef WOLFSSL_SP_NONBLOCK
  207843. typedef struct sp_1024_proj_point_add_32_ctx {
  207844. int state;
  207845. sp_1024_proj_point_dbl_32_ctx dbl_ctx;
  207846. const sp_point_1024* ap[2];
  207847. sp_point_1024* rp[2];
  207848. sp_digit* t1;
  207849. sp_digit* t2;
  207850. sp_digit* t3;
  207851. sp_digit* t4;
  207852. sp_digit* t5;
  207853. sp_digit* t6;
  207854. sp_digit* x;
  207855. sp_digit* y;
  207856. sp_digit* z;
  207857. } sp_1024_proj_point_add_32_ctx;
  207858. /* Add two Montgomery form projective points.
  207859. *
  207860. * r Result of addition.
  207861. * p First point to add.
  207862. * q Second point to add.
  207863. * t Temporary ordinate data.
  207864. */
  207865. static int sp_1024_proj_point_add_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r,
  207866. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  207867. {
  207868. int err = FP_WOULDBLOCK;
  207869. sp_1024_proj_point_add_32_ctx* ctx = (sp_1024_proj_point_add_32_ctx*)sp_ctx->data;
  207870. /* Ensure only the first point is the same as the result. */
  207871. if (q == r) {
  207872. const sp_point_1024* a = p;
  207873. p = q;
  207874. q = a;
  207875. }
  207876. typedef char ctx_size_test[sizeof(sp_1024_proj_point_add_32_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  207877. (void)sizeof(ctx_size_test);
  207878. switch (ctx->state) {
  207879. case 0: /* INIT */
  207880. ctx->t6 = t;
  207881. ctx->t1 = t + 2*32;
  207882. ctx->t2 = t + 4*32;
  207883. ctx->t3 = t + 6*32;
  207884. ctx->t4 = t + 8*32;
  207885. ctx->t5 = t + 10*32;
  207886. ctx->x = ctx->t6;
  207887. ctx->y = ctx->t1;
  207888. ctx->z = ctx->t2;
  207889. ctx->state = 1;
  207890. break;
  207891. case 1:
  207892. /* U1 = X1*Z2^2 */
  207893. sp_1024_mont_sqr_32(ctx->t1, q->z, p1024_mod, p1024_mp_mod);
  207894. ctx->state = 2;
  207895. break;
  207896. case 2:
  207897. sp_1024_mont_mul_32(ctx->t3, ctx->t1, q->z, p1024_mod, p1024_mp_mod);
  207898. ctx->state = 3;
  207899. break;
  207900. case 3:
  207901. sp_1024_mont_mul_32(ctx->t1, ctx->t1, p->x, p1024_mod, p1024_mp_mod);
  207902. ctx->state = 4;
  207903. break;
  207904. case 4:
  207905. /* U2 = X2*Z1^2 */
  207906. sp_1024_mont_sqr_32(ctx->t2, p->z, p1024_mod, p1024_mp_mod);
  207907. ctx->state = 5;
  207908. break;
  207909. case 5:
  207910. sp_1024_mont_mul_32(ctx->t4, ctx->t2, p->z, p1024_mod, p1024_mp_mod);
  207911. ctx->state = 6;
  207912. break;
  207913. case 6:
  207914. sp_1024_mont_mul_32(ctx->t2, ctx->t2, q->x, p1024_mod, p1024_mp_mod);
  207915. ctx->state = 7;
  207916. break;
  207917. case 7:
  207918. /* S1 = Y1*Z2^3 */
  207919. sp_1024_mont_mul_32(ctx->t3, ctx->t3, p->y, p1024_mod, p1024_mp_mod);
  207920. ctx->state = 8;
  207921. break;
  207922. case 8:
  207923. /* S2 = Y2*Z1^3 */
  207924. sp_1024_mont_mul_32(ctx->t4, ctx->t4, q->y, p1024_mod, p1024_mp_mod);
  207925. ctx->state = 9;
  207926. break;
  207927. case 9:
  207928. /* Check double */
  207929. if ((~p->infinity) & (~q->infinity) &
  207930. sp_1024_cmp_equal_32(ctx->t2, ctx->t1) &
  207931. sp_1024_cmp_equal_32(ctx->t4, ctx->t3)) {
  207932. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  207933. sp_1024_proj_point_dbl_32(r, p, t);
  207934. ctx->state = 25;
  207935. }
  207936. else {
  207937. ctx->state = 10;
  207938. }
  207939. break;
  207940. case 10:
  207941. /* H = U2 - U1 */
  207942. sp_1024_mont_sub_32(ctx->t2, ctx->t2, ctx->t1, p1024_mod);
  207943. ctx->state = 11;
  207944. break;
  207945. case 11:
  207946. /* R = S2 - S1 */
  207947. sp_1024_mont_sub_32(ctx->t4, ctx->t4, ctx->t3, p1024_mod);
  207948. ctx->state = 12;
  207949. break;
  207950. case 12:
  207951. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  207952. sp_1024_mont_sqr_32(ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
  207953. ctx->state = 13;
  207954. break;
  207955. case 13:
  207956. sp_1024_mont_mul_32(ctx->y, ctx->t1, ctx->t5, p1024_mod, p1024_mp_mod);
  207957. ctx->state = 14;
  207958. break;
  207959. case 14:
  207960. sp_1024_mont_mul_32(ctx->t5, ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
  207961. ctx->state = 15;
  207962. break;
  207963. case 15:
  207964. /* Z3 = H*Z1*Z2 */
  207965. sp_1024_mont_mul_32(ctx->z, p->z, ctx->t2, p1024_mod, p1024_mp_mod);
  207966. ctx->state = 16;
  207967. break;
  207968. case 16:
  207969. sp_1024_mont_mul_32(ctx->z, ctx->z, q->z, p1024_mod, p1024_mp_mod);
  207970. ctx->state = 17;
  207971. break;
  207972. case 17:
  207973. sp_1024_mont_sqr_32(ctx->x, ctx->t4, p1024_mod, p1024_mp_mod);
  207974. ctx->state = 18;
  207975. break;
  207976. case 18:
  207977. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->t5, p1024_mod);
  207978. ctx->state = 19;
  207979. break;
  207980. case 19:
  207981. sp_1024_mont_mul_32(ctx->t5, ctx->t5, ctx->t3, p1024_mod, p1024_mp_mod);
  207982. ctx->state = 20;
  207983. break;
  207984. case 20:
  207985. sp_1024_mont_dbl_32(ctx->t3, ctx->y, p1024_mod);
  207986. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->t3, p1024_mod);
  207987. ctx->state = 21;
  207988. break;
  207989. case 21:
  207990. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  207991. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->x, p1024_mod);
  207992. ctx->state = 22;
  207993. break;
  207994. case 22:
  207995. sp_1024_mont_mul_32(ctx->y, ctx->y, ctx->t4, p1024_mod, p1024_mp_mod);
  207996. ctx->state = 23;
  207997. break;
  207998. case 23:
  207999. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->t5, p1024_mod);
  208000. ctx->state = 24;
  208001. break;
  208002. case 24:
  208003. {
  208004. {
  208005. int i;
  208006. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  208007. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  208008. sp_digit maskt = ~(maskp | maskq);
  208009. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  208010. for (i = 0; i < 32; i++) {
  208011. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  208012. (ctx->x[i] & maskt);
  208013. }
  208014. for (i = 0; i < 32; i++) {
  208015. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  208016. (ctx->y[i] & maskt);
  208017. }
  208018. for (i = 0; i < 32; i++) {
  208019. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  208020. (ctx->z[i] & maskt);
  208021. }
  208022. r->z[0] |= inf;
  208023. r->infinity = (word32)inf;
  208024. }
  208025. ctx->state = 25;
  208026. break;
  208027. }
  208028. case 25:
  208029. err = MP_OKAY;
  208030. break;
  208031. }
  208032. if (err == MP_OKAY && ctx->state != 25) {
  208033. err = FP_WOULDBLOCK;
  208034. }
  208035. return err;
  208036. }
  208037. #endif /* WOLFSSL_SP_NONBLOCK */
  208038. /* Multiply the point by the scalar and return the result.
  208039. * If map is true then convert result to affine coordinates.
  208040. *
  208041. * Fast implementation that generates a pre-computation table.
  208042. * 4 bits of window (no sliding!).
  208043. * Uses add and double for calculating table.
  208044. * 1024 doubles.
  208045. * 268 adds.
  208046. *
  208047. * r Resulting point.
  208048. * g Point to multiply.
  208049. * k Scalar to multiply by.
  208050. * map Indicates whether to convert result to affine.
  208051. * ct Constant time required.
  208052. * heap Heap to use for allocation.
  208053. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  208054. */
  208055. static int sp_1024_ecc_mulmod_fast_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
  208056. int map, int ct, void* heap)
  208057. {
  208058. #ifdef WOLFSSL_SP_SMALL_STACK
  208059. sp_point_1024* t = NULL;
  208060. sp_digit* tmp = NULL;
  208061. #else
  208062. sp_point_1024 t[16 + 1];
  208063. sp_digit tmp[2 * 32 * 37];
  208064. #endif
  208065. sp_point_1024* rt = NULL;
  208066. sp_digit n;
  208067. int i;
  208068. int c;
  208069. int y;
  208070. int err = MP_OKAY;
  208071. /* Constant time used for cache attack resistance implementation. */
  208072. (void)ct;
  208073. (void)heap;
  208074. #ifdef WOLFSSL_SP_SMALL_STACK
  208075. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * (16 + 1),
  208076. heap, DYNAMIC_TYPE_ECC);
  208077. if (t == NULL)
  208078. err = MEMORY_E;
  208079. if (err == MP_OKAY) {
  208080. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 37, heap,
  208081. DYNAMIC_TYPE_ECC);
  208082. if (tmp == NULL)
  208083. err = MEMORY_E;
  208084. }
  208085. #endif
  208086. if (err == MP_OKAY) {
  208087. rt = t + 16;
  208088. /* t[0] = {0, 0, 1} * norm */
  208089. XMEMSET(&t[0], 0, sizeof(t[0]));
  208090. t[0].infinity = 1;
  208091. /* t[1] = {g->x, g->y, g->z} * norm */
  208092. (void)sp_1024_mod_mul_norm_32(t[1].x, g->x, p1024_mod);
  208093. (void)sp_1024_mod_mul_norm_32(t[1].y, g->y, p1024_mod);
  208094. (void)sp_1024_mod_mul_norm_32(t[1].z, g->z, p1024_mod);
  208095. t[1].infinity = 0;
  208096. sp_1024_proj_point_dbl_32(&t[ 2], &t[ 1], tmp);
  208097. t[ 2].infinity = 0;
  208098. sp_1024_proj_point_add_32(&t[ 3], &t[ 2], &t[ 1], tmp);
  208099. t[ 3].infinity = 0;
  208100. sp_1024_proj_point_dbl_32(&t[ 4], &t[ 2], tmp);
  208101. t[ 4].infinity = 0;
  208102. sp_1024_proj_point_add_32(&t[ 5], &t[ 3], &t[ 2], tmp);
  208103. t[ 5].infinity = 0;
  208104. sp_1024_proj_point_dbl_32(&t[ 6], &t[ 3], tmp);
  208105. t[ 6].infinity = 0;
  208106. sp_1024_proj_point_add_32(&t[ 7], &t[ 4], &t[ 3], tmp);
  208107. t[ 7].infinity = 0;
  208108. sp_1024_proj_point_dbl_32(&t[ 8], &t[ 4], tmp);
  208109. t[ 8].infinity = 0;
  208110. sp_1024_proj_point_add_32(&t[ 9], &t[ 5], &t[ 4], tmp);
  208111. t[ 9].infinity = 0;
  208112. sp_1024_proj_point_dbl_32(&t[10], &t[ 5], tmp);
  208113. t[10].infinity = 0;
  208114. sp_1024_proj_point_add_32(&t[11], &t[ 6], &t[ 5], tmp);
  208115. t[11].infinity = 0;
  208116. sp_1024_proj_point_dbl_32(&t[12], &t[ 6], tmp);
  208117. t[12].infinity = 0;
  208118. sp_1024_proj_point_add_32(&t[13], &t[ 7], &t[ 6], tmp);
  208119. t[13].infinity = 0;
  208120. sp_1024_proj_point_dbl_32(&t[14], &t[ 7], tmp);
  208121. t[14].infinity = 0;
  208122. sp_1024_proj_point_add_32(&t[15], &t[ 8], &t[ 7], tmp);
  208123. t[15].infinity = 0;
  208124. i = 30;
  208125. n = k[i+1] << 0;
  208126. c = 28;
  208127. y = (int)(n >> 28);
  208128. XMEMCPY(rt, &t[y], sizeof(sp_point_1024));
  208129. n <<= 4;
  208130. for (; i>=0 || c>=4; ) {
  208131. if (c < 4) {
  208132. n |= k[i--];
  208133. c += 32;
  208134. }
  208135. y = (n >> 28) & 0xf;
  208136. n <<= 4;
  208137. c -= 4;
  208138. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  208139. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  208140. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  208141. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  208142. sp_1024_proj_point_add_32(rt, rt, &t[y], tmp);
  208143. }
  208144. if (map != 0) {
  208145. sp_1024_map_32(r, rt, tmp);
  208146. }
  208147. else {
  208148. XMEMCPY(r, rt, sizeof(sp_point_1024));
  208149. }
  208150. }
  208151. #ifdef WOLFSSL_SP_SMALL_STACK
  208152. if (tmp != NULL)
  208153. #endif
  208154. {
  208155. ForceZero(tmp, sizeof(sp_digit) * 2 * 32 * 37);
  208156. #ifdef WOLFSSL_SP_SMALL_STACK
  208157. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  208158. #endif
  208159. }
  208160. #ifdef WOLFSSL_SP_SMALL_STACK
  208161. if (t != NULL)
  208162. #endif
  208163. {
  208164. ForceZero(t, sizeof(sp_point_1024) * 17);
  208165. #ifdef WOLFSSL_SP_SMALL_STACK
  208166. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  208167. #endif
  208168. }
  208169. return err;
  208170. }
  208171. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  208172. /* Double the Montgomery form projective point p a number of times.
  208173. *
  208174. * r Result of repeated doubling of point.
  208175. * p Point to double.
  208176. * n Number of times to double
  208177. * t Temporary ordinate data.
  208178. */
  208179. static void sp_1024_proj_point_dbl_n_32(sp_point_1024* p, int i,
  208180. sp_digit* t)
  208181. {
  208182. sp_digit* w = t;
  208183. sp_digit* a = t + 2*32;
  208184. sp_digit* b = t + 4*32;
  208185. sp_digit* t1 = t + 6*32;
  208186. sp_digit* t2 = t + 8*32;
  208187. sp_digit* x;
  208188. sp_digit* y;
  208189. sp_digit* z;
  208190. volatile int n = i;
  208191. x = p->x;
  208192. y = p->y;
  208193. z = p->z;
  208194. /* Y = 2*Y */
  208195. sp_1024_mont_dbl_32(y, y, p1024_mod);
  208196. /* W = Z^4 */
  208197. sp_1024_mont_sqr_32(w, z, p1024_mod, p1024_mp_mod);
  208198. sp_1024_mont_sqr_32(w, w, p1024_mod, p1024_mp_mod);
  208199. #ifndef WOLFSSL_SP_SMALL
  208200. while (--n > 0)
  208201. #else
  208202. while (--n >= 0)
  208203. #endif
  208204. {
  208205. /* A = 3*(X^2 - W) */
  208206. sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod);
  208207. sp_1024_mont_sub_32(t1, t1, w, p1024_mod);
  208208. sp_1024_mont_tpl_32(a, t1, p1024_mod);
  208209. /* B = X*Y^2 */
  208210. sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod);
  208211. sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod);
  208212. /* X = A^2 - 2B */
  208213. sp_1024_mont_sqr_32(x, a, p1024_mod, p1024_mp_mod);
  208214. sp_1024_mont_dbl_32(t2, b, p1024_mod);
  208215. sp_1024_mont_sub_32(x, x, t2, p1024_mod);
  208216. /* B = 2.(B - X) */
  208217. sp_1024_mont_sub_32(t2, b, x, p1024_mod);
  208218. sp_1024_mont_dbl_32(b, t2, p1024_mod);
  208219. /* Z = Z*Y */
  208220. sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod);
  208221. /* t1 = Y^4 */
  208222. sp_1024_mont_sqr_32(t1, t1, p1024_mod, p1024_mp_mod);
  208223. #ifdef WOLFSSL_SP_SMALL
  208224. if (n != 0)
  208225. #endif
  208226. {
  208227. /* W = W*Y^4 */
  208228. sp_1024_mont_mul_32(w, w, t1, p1024_mod, p1024_mp_mod);
  208229. }
  208230. /* y = 2*A*(B - X) - Y^4 */
  208231. sp_1024_mont_mul_32(y, b, a, p1024_mod, p1024_mp_mod);
  208232. sp_1024_mont_sub_32(y, y, t1, p1024_mod);
  208233. }
  208234. #ifndef WOLFSSL_SP_SMALL
  208235. /* A = 3*(X^2 - W) */
  208236. sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod);
  208237. sp_1024_mont_sub_32(t1, t1, w, p1024_mod);
  208238. sp_1024_mont_tpl_32(a, t1, p1024_mod);
  208239. /* B = X*Y^2 */
  208240. sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod);
  208241. sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod);
  208242. /* X = A^2 - 2B */
  208243. sp_1024_mont_sqr_32(x, a, p1024_mod, p1024_mp_mod);
  208244. sp_1024_mont_dbl_32(t2, b, p1024_mod);
  208245. sp_1024_mont_sub_32(x, x, t2, p1024_mod);
  208246. /* B = 2.(B - X) */
  208247. sp_1024_mont_sub_32(t2, b, x, p1024_mod);
  208248. sp_1024_mont_dbl_32(b, t2, p1024_mod);
  208249. /* Z = Z*Y */
  208250. sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod);
  208251. /* t1 = Y^4 */
  208252. sp_1024_mont_sqr_32(t1, t1, p1024_mod, p1024_mp_mod);
  208253. /* y = 2*A*(B - X) - Y^4 */
  208254. sp_1024_mont_mul_32(y, b, a, p1024_mod, p1024_mp_mod);
  208255. sp_1024_mont_sub_32(y, y, t1, p1024_mod);
  208256. #endif /* WOLFSSL_SP_SMALL */
  208257. /* Y = Y/2 */
  208258. sp_1024_mont_div2_32(y, y, p1024_mod);
  208259. }
  208260. /* Convert the projective point to affine.
  208261. * Ordinates are in Montgomery form.
  208262. *
  208263. * a Point to convert.
  208264. * t Temporary data.
  208265. */
  208266. static void sp_1024_proj_to_affine_32(sp_point_1024* a, sp_digit* t)
  208267. {
  208268. sp_digit* t1 = t;
  208269. sp_digit* t2 = t + 2 * 32;
  208270. sp_digit* tmp = t + 4 * 32;
  208271. sp_1024_mont_inv_32(t1, a->z, tmp);
  208272. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  208273. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  208274. sp_1024_mont_mul_32(a->x, a->x, t2, p1024_mod, p1024_mp_mod);
  208275. sp_1024_mont_mul_32(a->y, a->y, t1, p1024_mod, p1024_mp_mod);
  208276. XMEMCPY(a->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208277. }
  208278. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  208279. /* A table entry for pre-computed points. */
  208280. typedef struct sp_table_entry_1024 {
  208281. sp_digit x[32];
  208282. sp_digit y[32];
  208283. } sp_table_entry_1024;
  208284. #ifdef FP_ECC
  208285. #endif /* FP_ECC */
  208286. /* Add two Montgomery form projective points. The second point has a q value of
  208287. * one.
  208288. * Only the first point can be the same pointer as the result point.
  208289. *
  208290. * r Result of addition.
  208291. * p First point to add.
  208292. * q Second point to add.
  208293. * t Temporary ordinate data.
  208294. */
  208295. static void sp_1024_proj_point_add_qz1_32(sp_point_1024* r,
  208296. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  208297. {
  208298. sp_digit* t2 = t;
  208299. sp_digit* t3 = t + 2*32;
  208300. sp_digit* t6 = t + 4*32;
  208301. sp_digit* t1 = t + 6*32;
  208302. sp_digit* t4 = t + 8*32;
  208303. sp_digit* t5 = t + 10*32;
  208304. /* Calculate values to subtract from P->x and P->y. */
  208305. /* U2 = X2*Z1^2 */
  208306. sp_1024_mont_sqr_32(t2, p->z, p1024_mod, p1024_mp_mod);
  208307. sp_1024_mont_mul_32(t4, t2, p->z, p1024_mod, p1024_mp_mod);
  208308. sp_1024_mont_mul_32(t2, t2, q->x, p1024_mod, p1024_mp_mod);
  208309. /* S2 = Y2*Z1^3 */
  208310. sp_1024_mont_mul_32(t4, t4, q->y, p1024_mod, p1024_mp_mod);
  208311. if ((~p->infinity) & (~q->infinity) &
  208312. sp_1024_cmp_equal_32(p->x, t2) &
  208313. sp_1024_cmp_equal_32(p->y, t4)) {
  208314. sp_1024_proj_point_dbl_32(r, p, t);
  208315. }
  208316. else {
  208317. sp_digit* x = t2;
  208318. sp_digit* y = t3;
  208319. sp_digit* z = t6;
  208320. /* H = U2 - X1 */
  208321. sp_1024_mont_sub_32(t2, t2, p->x, p1024_mod);
  208322. /* R = S2 - Y1 */
  208323. sp_1024_mont_sub_32(t4, t4, p->y, p1024_mod);
  208324. /* Z3 = H*Z1 */
  208325. sp_1024_mont_mul_32(z, p->z, t2, p1024_mod, p1024_mp_mod);
  208326. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  208327. sp_1024_mont_sqr_32(t1, t2, p1024_mod, p1024_mp_mod);
  208328. sp_1024_mont_mul_32(t3, p->x, t1, p1024_mod, p1024_mp_mod);
  208329. sp_1024_mont_mul_32(t1, t1, t2, p1024_mod, p1024_mp_mod);
  208330. sp_1024_mont_sqr_32(t2, t4, p1024_mod, p1024_mp_mod);
  208331. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  208332. sp_1024_mont_dbl_32(t5, t3, p1024_mod);
  208333. sp_1024_mont_sub_32(x, t2, t5, p1024_mod);
  208334. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  208335. sp_1024_mont_sub_32(t3, t3, x, p1024_mod);
  208336. sp_1024_mont_mul_32(t3, t3, t4, p1024_mod, p1024_mp_mod);
  208337. sp_1024_mont_mul_32(t1, t1, p->y, p1024_mod, p1024_mp_mod);
  208338. sp_1024_mont_sub_32(y, t3, t1, p1024_mod);
  208339. {
  208340. int i;
  208341. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  208342. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  208343. sp_digit maskt = ~(maskp | maskq);
  208344. sp_digit inf = (sp_digit)(p->infinity & q->infinity);
  208345. for (i = 0; i < 32; i++) {
  208346. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  208347. (x[i] & maskt);
  208348. }
  208349. for (i = 0; i < 32; i++) {
  208350. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  208351. (y[i] & maskt);
  208352. }
  208353. for (i = 0; i < 32; i++) {
  208354. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  208355. (z[i] & maskt);
  208356. }
  208357. r->z[0] |= inf;
  208358. r->infinity = (word32)inf;
  208359. }
  208360. }
  208361. }
  208362. #ifdef WOLFSSL_SP_SMALL
  208363. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  208364. /* Generate the pre-computed table of points for the base point.
  208365. *
  208366. * width = 4
  208367. * 16 entries
  208368. * 256 bits between
  208369. *
  208370. * a The base point.
  208371. * table Place to store generated point data.
  208372. * tmp Temporary data.
  208373. * heap Heap to use for allocation.
  208374. */
  208375. static int sp_1024_gen_stripe_table_32(const sp_point_1024* a,
  208376. sp_table_entry_1024* table, sp_digit* tmp, void* heap)
  208377. {
  208378. #ifdef WOLFSSL_SP_SMALL_STACK
  208379. sp_point_1024* t = NULL;
  208380. #else
  208381. sp_point_1024 t[3];
  208382. #endif
  208383. sp_point_1024* s1 = NULL;
  208384. sp_point_1024* s2 = NULL;
  208385. int i;
  208386. int j;
  208387. int err = MP_OKAY;
  208388. (void)heap;
  208389. #ifdef WOLFSSL_SP_SMALL_STACK
  208390. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 3, heap,
  208391. DYNAMIC_TYPE_ECC);
  208392. if (t == NULL)
  208393. err = MEMORY_E;
  208394. #endif
  208395. if (err == MP_OKAY) {
  208396. s1 = t + 1;
  208397. s2 = t + 2;
  208398. err = sp_1024_mod_mul_norm_32(t->x, a->x, p1024_mod);
  208399. }
  208400. if (err == MP_OKAY) {
  208401. err = sp_1024_mod_mul_norm_32(t->y, a->y, p1024_mod);
  208402. }
  208403. if (err == MP_OKAY) {
  208404. err = sp_1024_mod_mul_norm_32(t->z, a->z, p1024_mod);
  208405. }
  208406. if (err == MP_OKAY) {
  208407. t->infinity = 0;
  208408. sp_1024_proj_to_affine_32(t, tmp);
  208409. XMEMCPY(s1->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208410. s1->infinity = 0;
  208411. XMEMCPY(s2->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208412. s2->infinity = 0;
  208413. /* table[0] = {0, 0, infinity} */
  208414. XMEMSET(&table[0], 0, sizeof(sp_table_entry_1024));
  208415. /* table[1] = Affine version of 'a' in Montgomery form */
  208416. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  208417. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  208418. for (i=1; i<4; i++) {
  208419. sp_1024_proj_point_dbl_n_32(t, 256, tmp);
  208420. sp_1024_proj_to_affine_32(t, tmp);
  208421. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  208422. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  208423. }
  208424. for (i=1; i<4; i++) {
  208425. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  208426. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  208427. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  208428. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  208429. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  208430. sp_1024_proj_point_add_qz1_32(t, s1, s2, tmp);
  208431. sp_1024_proj_to_affine_32(t, tmp);
  208432. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  208433. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  208434. }
  208435. }
  208436. }
  208437. #ifdef WOLFSSL_SP_SMALL_STACK
  208438. if (t != NULL)
  208439. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  208440. #endif
  208441. return err;
  208442. }
  208443. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  208444. /* Multiply the point by the scalar and return the result.
  208445. * If map is true then convert result to affine coordinates.
  208446. *
  208447. * Stripe implementation.
  208448. * Pre-generated: 2^0, 2^256, ...
  208449. * Pre-generated: products of all combinations of above.
  208450. * 4 doubles and adds (with qz=1)
  208451. *
  208452. * r Resulting point.
  208453. * k Scalar to multiply by.
  208454. * table Pre-computed table.
  208455. * map Indicates whether to convert result to affine.
  208456. * ct Constant time required.
  208457. * heap Heap to use for allocation.
  208458. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  208459. */
  208460. static int sp_1024_ecc_mulmod_stripe_32(sp_point_1024* r, const sp_point_1024* g,
  208461. const sp_table_entry_1024* table, const sp_digit* k, int map,
  208462. int ct, void* heap)
  208463. {
  208464. #ifdef WOLFSSL_SP_SMALL_STACK
  208465. sp_point_1024* rt = NULL;
  208466. sp_digit* t = NULL;
  208467. #else
  208468. sp_point_1024 rt[2];
  208469. sp_digit t[2 * 32 * 37];
  208470. #endif
  208471. sp_point_1024* p = NULL;
  208472. int i;
  208473. int j;
  208474. int y;
  208475. int x;
  208476. int err = MP_OKAY;
  208477. (void)g;
  208478. /* Constant time used for cache attack resistance implementation. */
  208479. (void)ct;
  208480. (void)heap;
  208481. #ifdef WOLFSSL_SP_SMALL_STACK
  208482. rt = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  208483. DYNAMIC_TYPE_ECC);
  208484. if (rt == NULL)
  208485. err = MEMORY_E;
  208486. if (err == MP_OKAY) {
  208487. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 37, heap,
  208488. DYNAMIC_TYPE_ECC);
  208489. if (t == NULL)
  208490. err = MEMORY_E;
  208491. }
  208492. #endif
  208493. if (err == MP_OKAY) {
  208494. p = rt + 1;
  208495. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208496. XMEMCPY(rt->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208497. y = 0;
  208498. x = 255;
  208499. for (j=0; j<4; j++) {
  208500. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  208501. x += 256;
  208502. }
  208503. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  208504. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  208505. rt->infinity = !y;
  208506. for (i=254; i>=0; i--) {
  208507. y = 0;
  208508. x = i;
  208509. for (j=0; j<4; j++) {
  208510. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  208511. x += 256;
  208512. }
  208513. sp_1024_proj_point_dbl_32(rt, rt, t);
  208514. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  208515. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  208516. p->infinity = !y;
  208517. sp_1024_proj_point_add_qz1_32(rt, rt, p, t);
  208518. }
  208519. if (map != 0) {
  208520. sp_1024_map_32(r, rt, t);
  208521. }
  208522. else {
  208523. XMEMCPY(r, rt, sizeof(sp_point_1024));
  208524. }
  208525. }
  208526. #ifdef WOLFSSL_SP_SMALL_STACK
  208527. if (t != NULL)
  208528. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  208529. if (rt != NULL)
  208530. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  208531. #endif
  208532. return err;
  208533. }
  208534. #ifdef FP_ECC
  208535. #ifndef FP_ENTRIES
  208536. #define FP_ENTRIES 16
  208537. #endif
  208538. /* Cache entry - holds precomputation tables for a point. */
  208539. typedef struct sp_cache_1024_t {
  208540. /* X ordinate of point that table was generated from. */
  208541. sp_digit x[32];
  208542. /* Y ordinate of point that table was generated from. */
  208543. sp_digit y[32];
  208544. /* Precomputation table for point. */
  208545. sp_table_entry_1024 table[16];
  208546. /* Count of entries in table. */
  208547. uint32_t cnt;
  208548. /* Point and table set in entry. */
  208549. int set;
  208550. } sp_cache_1024_t;
  208551. /* Cache of tables. */
  208552. static THREAD_LS_T sp_cache_1024_t sp_cache_1024[FP_ENTRIES];
  208553. /* Index of last entry in cache. */
  208554. static THREAD_LS_T int sp_cache_1024_last = -1;
  208555. /* Cache has been initialized. */
  208556. static THREAD_LS_T int sp_cache_1024_inited = 0;
  208557. #ifndef HAVE_THREAD_LS
  208558. static volatile int initCacheMutex_1024 = 0;
  208559. static wolfSSL_Mutex sp_cache_1024_lock;
  208560. #endif
  208561. /* Get the cache entry for the point.
  208562. *
  208563. * g [in] Point scalar multiplying.
  208564. * cache [out] Cache table to use.
  208565. */
  208566. static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache)
  208567. {
  208568. int i;
  208569. int j;
  208570. uint32_t least;
  208571. if (sp_cache_1024_inited == 0) {
  208572. for (i=0; i<FP_ENTRIES; i++) {
  208573. sp_cache_1024[i].set = 0;
  208574. }
  208575. sp_cache_1024_inited = 1;
  208576. }
  208577. /* Compare point with those in cache. */
  208578. for (i=0; i<FP_ENTRIES; i++) {
  208579. if (!sp_cache_1024[i].set)
  208580. continue;
  208581. if (sp_1024_cmp_equal_32(g->x, sp_cache_1024[i].x) &
  208582. sp_1024_cmp_equal_32(g->y, sp_cache_1024[i].y)) {
  208583. sp_cache_1024[i].cnt++;
  208584. break;
  208585. }
  208586. }
  208587. /* No match. */
  208588. if (i == FP_ENTRIES) {
  208589. /* Find empty entry. */
  208590. i = (sp_cache_1024_last + 1) % FP_ENTRIES;
  208591. for (; i != sp_cache_1024_last; i=(i+1)%FP_ENTRIES) {
  208592. if (!sp_cache_1024[i].set) {
  208593. break;
  208594. }
  208595. }
  208596. /* Evict least used. */
  208597. if (i == sp_cache_1024_last) {
  208598. least = sp_cache_1024[0].cnt;
  208599. for (j=1; j<FP_ENTRIES; j++) {
  208600. if (sp_cache_1024[j].cnt < least) {
  208601. i = j;
  208602. least = sp_cache_1024[i].cnt;
  208603. }
  208604. }
  208605. }
  208606. XMEMCPY(sp_cache_1024[i].x, g->x, sizeof(sp_cache_1024[i].x));
  208607. XMEMCPY(sp_cache_1024[i].y, g->y, sizeof(sp_cache_1024[i].y));
  208608. sp_cache_1024[i].set = 1;
  208609. sp_cache_1024[i].cnt = 1;
  208610. }
  208611. *cache = &sp_cache_1024[i];
  208612. sp_cache_1024_last = i;
  208613. }
  208614. #endif /* FP_ECC */
  208615. /* Multiply the base point of P1024 by the scalar and return the result.
  208616. * If map is true then convert result to affine coordinates.
  208617. *
  208618. * r Resulting point.
  208619. * g Point to multiply.
  208620. * k Scalar to multiply by.
  208621. * map Indicates whether to convert result to affine.
  208622. * ct Constant time required.
  208623. * heap Heap to use for allocation.
  208624. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  208625. */
  208626. static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g,
  208627. const sp_digit* k, int map, int ct, void* heap)
  208628. {
  208629. #ifndef FP_ECC
  208630. return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  208631. #else
  208632. #ifdef WOLFSSL_SP_SMALL_STACK
  208633. sp_digit* tmp;
  208634. #else
  208635. sp_digit tmp[2 * 32 * 38];
  208636. #endif
  208637. sp_cache_1024_t* cache;
  208638. int err = MP_OKAY;
  208639. #ifdef WOLFSSL_SP_SMALL_STACK
  208640. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 38, heap, DYNAMIC_TYPE_ECC);
  208641. if (tmp == NULL) {
  208642. err = MEMORY_E;
  208643. }
  208644. #endif
  208645. #ifndef HAVE_THREAD_LS
  208646. if (err == MP_OKAY) {
  208647. if (initCacheMutex_1024 == 0) {
  208648. wc_InitMutex(&sp_cache_1024_lock);
  208649. initCacheMutex_1024 = 1;
  208650. }
  208651. if (wc_LockMutex(&sp_cache_1024_lock) != 0) {
  208652. err = BAD_MUTEX_E;
  208653. }
  208654. }
  208655. #endif /* HAVE_THREAD_LS */
  208656. if (err == MP_OKAY) {
  208657. sp_ecc_get_cache_1024(g, &cache);
  208658. if (cache->cnt == 2)
  208659. sp_1024_gen_stripe_table_32(g, cache->table, tmp, heap);
  208660. #ifndef HAVE_THREAD_LS
  208661. wc_UnLockMutex(&sp_cache_1024_lock);
  208662. #endif /* HAVE_THREAD_LS */
  208663. if (cache->cnt < 2) {
  208664. err = sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  208665. }
  208666. else {
  208667. err = sp_1024_ecc_mulmod_stripe_32(r, g, cache->table, k,
  208668. map, ct, heap);
  208669. }
  208670. }
  208671. #ifdef WOLFSSL_SP_SMALL_STACK
  208672. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  208673. #endif
  208674. return err;
  208675. #endif
  208676. }
  208677. #else
  208678. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  208679. /* Generate the pre-computed table of points for the base point.
  208680. *
  208681. * width = 8
  208682. * 256 entries
  208683. * 128 bits between
  208684. *
  208685. * a The base point.
  208686. * table Place to store generated point data.
  208687. * tmp Temporary data.
  208688. * heap Heap to use for allocation.
  208689. */
  208690. static int sp_1024_gen_stripe_table_32(const sp_point_1024* a,
  208691. sp_table_entry_1024* table, sp_digit* tmp, void* heap)
  208692. {
  208693. #ifdef WOLFSSL_SP_SMALL_STACK
  208694. sp_point_1024* t = NULL;
  208695. #else
  208696. sp_point_1024 t[3];
  208697. #endif
  208698. sp_point_1024* s1 = NULL;
  208699. sp_point_1024* s2 = NULL;
  208700. int i;
  208701. int j;
  208702. int err = MP_OKAY;
  208703. (void)heap;
  208704. #ifdef WOLFSSL_SP_SMALL_STACK
  208705. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 3, heap,
  208706. DYNAMIC_TYPE_ECC);
  208707. if (t == NULL)
  208708. err = MEMORY_E;
  208709. #endif
  208710. if (err == MP_OKAY) {
  208711. s1 = t + 1;
  208712. s2 = t + 2;
  208713. err = sp_1024_mod_mul_norm_32(t->x, a->x, p1024_mod);
  208714. }
  208715. if (err == MP_OKAY) {
  208716. err = sp_1024_mod_mul_norm_32(t->y, a->y, p1024_mod);
  208717. }
  208718. if (err == MP_OKAY) {
  208719. err = sp_1024_mod_mul_norm_32(t->z, a->z, p1024_mod);
  208720. }
  208721. if (err == MP_OKAY) {
  208722. t->infinity = 0;
  208723. sp_1024_proj_to_affine_32(t, tmp);
  208724. XMEMCPY(s1->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208725. s1->infinity = 0;
  208726. XMEMCPY(s2->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208727. s2->infinity = 0;
  208728. /* table[0] = {0, 0, infinity} */
  208729. XMEMSET(&table[0], 0, sizeof(sp_table_entry_1024));
  208730. /* table[1] = Affine version of 'a' in Montgomery form */
  208731. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  208732. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  208733. for (i=1; i<8; i++) {
  208734. sp_1024_proj_point_dbl_n_32(t, 128, tmp);
  208735. sp_1024_proj_to_affine_32(t, tmp);
  208736. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  208737. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  208738. }
  208739. for (i=1; i<8; i++) {
  208740. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  208741. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  208742. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  208743. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  208744. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  208745. sp_1024_proj_point_add_qz1_32(t, s1, s2, tmp);
  208746. sp_1024_proj_to_affine_32(t, tmp);
  208747. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  208748. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  208749. }
  208750. }
  208751. }
  208752. #ifdef WOLFSSL_SP_SMALL_STACK
  208753. if (t != NULL)
  208754. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  208755. #endif
  208756. return err;
  208757. }
  208758. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  208759. /* Multiply the point by the scalar and return the result.
  208760. * If map is true then convert result to affine coordinates.
  208761. *
  208762. * Stripe implementation.
  208763. * Pre-generated: 2^0, 2^128, ...
  208764. * Pre-generated: products of all combinations of above.
  208765. * 8 doubles and adds (with qz=1)
  208766. *
  208767. * r Resulting point.
  208768. * k Scalar to multiply by.
  208769. * table Pre-computed table.
  208770. * map Indicates whether to convert result to affine.
  208771. * ct Constant time required.
  208772. * heap Heap to use for allocation.
  208773. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  208774. */
  208775. static int sp_1024_ecc_mulmod_stripe_32(sp_point_1024* r, const sp_point_1024* g,
  208776. const sp_table_entry_1024* table, const sp_digit* k, int map,
  208777. int ct, void* heap)
  208778. {
  208779. #ifdef WOLFSSL_SP_SMALL_STACK
  208780. sp_point_1024* rt = NULL;
  208781. sp_digit* t = NULL;
  208782. #else
  208783. sp_point_1024 rt[2];
  208784. sp_digit t[2 * 32 * 37];
  208785. #endif
  208786. sp_point_1024* p = NULL;
  208787. int i;
  208788. int j;
  208789. int y;
  208790. int x;
  208791. int err = MP_OKAY;
  208792. (void)g;
  208793. /* Constant time used for cache attack resistance implementation. */
  208794. (void)ct;
  208795. (void)heap;
  208796. #ifdef WOLFSSL_SP_SMALL_STACK
  208797. rt = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  208798. DYNAMIC_TYPE_ECC);
  208799. if (rt == NULL)
  208800. err = MEMORY_E;
  208801. if (err == MP_OKAY) {
  208802. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 37, heap,
  208803. DYNAMIC_TYPE_ECC);
  208804. if (t == NULL)
  208805. err = MEMORY_E;
  208806. }
  208807. #endif
  208808. if (err == MP_OKAY) {
  208809. p = rt + 1;
  208810. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208811. XMEMCPY(rt->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208812. y = 0;
  208813. x = 127;
  208814. for (j=0; j<8; j++) {
  208815. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  208816. x += 128;
  208817. }
  208818. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  208819. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  208820. rt->infinity = !y;
  208821. for (i=126; i>=0; i--) {
  208822. y = 0;
  208823. x = i;
  208824. for (j=0; j<8; j++) {
  208825. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  208826. x += 128;
  208827. }
  208828. sp_1024_proj_point_dbl_32(rt, rt, t);
  208829. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  208830. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  208831. p->infinity = !y;
  208832. sp_1024_proj_point_add_qz1_32(rt, rt, p, t);
  208833. }
  208834. if (map != 0) {
  208835. sp_1024_map_32(r, rt, t);
  208836. }
  208837. else {
  208838. XMEMCPY(r, rt, sizeof(sp_point_1024));
  208839. }
  208840. }
  208841. #ifdef WOLFSSL_SP_SMALL_STACK
  208842. if (t != NULL)
  208843. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  208844. if (rt != NULL)
  208845. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  208846. #endif
  208847. return err;
  208848. }
  208849. #ifdef FP_ECC
  208850. #ifndef FP_ENTRIES
  208851. #define FP_ENTRIES 16
  208852. #endif
  208853. /* Cache entry - holds precomputation tables for a point. */
  208854. typedef struct sp_cache_1024_t {
  208855. /* X ordinate of point that table was generated from. */
  208856. sp_digit x[32];
  208857. /* Y ordinate of point that table was generated from. */
  208858. sp_digit y[32];
  208859. /* Precomputation table for point. */
  208860. sp_table_entry_1024 table[256];
  208861. /* Count of entries in table. */
  208862. uint32_t cnt;
  208863. /* Point and table set in entry. */
  208864. int set;
  208865. } sp_cache_1024_t;
  208866. /* Cache of tables. */
  208867. static THREAD_LS_T sp_cache_1024_t sp_cache_1024[FP_ENTRIES];
  208868. /* Index of last entry in cache. */
  208869. static THREAD_LS_T int sp_cache_1024_last = -1;
  208870. /* Cache has been initialized. */
  208871. static THREAD_LS_T int sp_cache_1024_inited = 0;
  208872. #ifndef HAVE_THREAD_LS
  208873. static volatile int initCacheMutex_1024 = 0;
  208874. static wolfSSL_Mutex sp_cache_1024_lock;
  208875. #endif
  208876. /* Get the cache entry for the point.
  208877. *
  208878. * g [in] Point scalar multiplying.
  208879. * cache [out] Cache table to use.
  208880. */
  208881. static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache)
  208882. {
  208883. int i;
  208884. int j;
  208885. uint32_t least;
  208886. if (sp_cache_1024_inited == 0) {
  208887. for (i=0; i<FP_ENTRIES; i++) {
  208888. sp_cache_1024[i].set = 0;
  208889. }
  208890. sp_cache_1024_inited = 1;
  208891. }
  208892. /* Compare point with those in cache. */
  208893. for (i=0; i<FP_ENTRIES; i++) {
  208894. if (!sp_cache_1024[i].set)
  208895. continue;
  208896. if (sp_1024_cmp_equal_32(g->x, sp_cache_1024[i].x) &
  208897. sp_1024_cmp_equal_32(g->y, sp_cache_1024[i].y)) {
  208898. sp_cache_1024[i].cnt++;
  208899. break;
  208900. }
  208901. }
  208902. /* No match. */
  208903. if (i == FP_ENTRIES) {
  208904. /* Find empty entry. */
  208905. i = (sp_cache_1024_last + 1) % FP_ENTRIES;
  208906. for (; i != sp_cache_1024_last; i=(i+1)%FP_ENTRIES) {
  208907. if (!sp_cache_1024[i].set) {
  208908. break;
  208909. }
  208910. }
  208911. /* Evict least used. */
  208912. if (i == sp_cache_1024_last) {
  208913. least = sp_cache_1024[0].cnt;
  208914. for (j=1; j<FP_ENTRIES; j++) {
  208915. if (sp_cache_1024[j].cnt < least) {
  208916. i = j;
  208917. least = sp_cache_1024[i].cnt;
  208918. }
  208919. }
  208920. }
  208921. XMEMCPY(sp_cache_1024[i].x, g->x, sizeof(sp_cache_1024[i].x));
  208922. XMEMCPY(sp_cache_1024[i].y, g->y, sizeof(sp_cache_1024[i].y));
  208923. sp_cache_1024[i].set = 1;
  208924. sp_cache_1024[i].cnt = 1;
  208925. }
  208926. *cache = &sp_cache_1024[i];
  208927. sp_cache_1024_last = i;
  208928. }
  208929. #endif /* FP_ECC */
  208930. /* Multiply the base point of P1024 by the scalar and return the result.
  208931. * If map is true then convert result to affine coordinates.
  208932. *
  208933. * r Resulting point.
  208934. * g Point to multiply.
  208935. * k Scalar to multiply by.
  208936. * map Indicates whether to convert result to affine.
  208937. * ct Constant time required.
  208938. * heap Heap to use for allocation.
  208939. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  208940. */
  208941. static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g,
  208942. const sp_digit* k, int map, int ct, void* heap)
  208943. {
  208944. #ifndef FP_ECC
  208945. return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  208946. #else
  208947. #ifdef WOLFSSL_SP_SMALL_STACK
  208948. sp_digit* tmp;
  208949. #else
  208950. sp_digit tmp[2 * 32 * 38];
  208951. #endif
  208952. sp_cache_1024_t* cache;
  208953. int err = MP_OKAY;
  208954. #ifdef WOLFSSL_SP_SMALL_STACK
  208955. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 38, heap, DYNAMIC_TYPE_ECC);
  208956. if (tmp == NULL) {
  208957. err = MEMORY_E;
  208958. }
  208959. #endif
  208960. #ifndef HAVE_THREAD_LS
  208961. if (err == MP_OKAY) {
  208962. if (initCacheMutex_1024 == 0) {
  208963. wc_InitMutex(&sp_cache_1024_lock);
  208964. initCacheMutex_1024 = 1;
  208965. }
  208966. if (wc_LockMutex(&sp_cache_1024_lock) != 0) {
  208967. err = BAD_MUTEX_E;
  208968. }
  208969. }
  208970. #endif /* HAVE_THREAD_LS */
  208971. if (err == MP_OKAY) {
  208972. sp_ecc_get_cache_1024(g, &cache);
  208973. if (cache->cnt == 2)
  208974. sp_1024_gen_stripe_table_32(g, cache->table, tmp, heap);
  208975. #ifndef HAVE_THREAD_LS
  208976. wc_UnLockMutex(&sp_cache_1024_lock);
  208977. #endif /* HAVE_THREAD_LS */
  208978. if (cache->cnt < 2) {
  208979. err = sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  208980. }
  208981. else {
  208982. err = sp_1024_ecc_mulmod_stripe_32(r, g, cache->table, k,
  208983. map, ct, heap);
  208984. }
  208985. }
  208986. #ifdef WOLFSSL_SP_SMALL_STACK
  208987. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  208988. #endif
  208989. return err;
  208990. #endif
  208991. }
  208992. #endif /* WOLFSSL_SP_SMALL */
  208993. /* Multiply the point by the scalar and return the result.
  208994. * If map is true then convert result to affine coordinates.
  208995. *
  208996. * km Scalar to multiply by.
  208997. * p Point to multiply.
  208998. * r Resulting point.
  208999. * map Indicates whether to convert result to affine.
  209000. * heap Heap to use for allocation.
  209001. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  209002. */
  209003. int sp_ecc_mulmod_1024(const mp_int* km, const ecc_point* gm, ecc_point* r,
  209004. int map, void* heap)
  209005. {
  209006. #ifdef WOLFSSL_SP_SMALL_STACK
  209007. sp_point_1024* point = NULL;
  209008. sp_digit* k = NULL;
  209009. #else
  209010. sp_point_1024 point[1];
  209011. sp_digit k[32];
  209012. #endif
  209013. int err = MP_OKAY;
  209014. #ifdef WOLFSSL_SP_SMALL_STACK
  209015. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  209016. DYNAMIC_TYPE_ECC);
  209017. if (point == NULL)
  209018. err = MEMORY_E;
  209019. if (err == MP_OKAY) {
  209020. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  209021. DYNAMIC_TYPE_ECC);
  209022. if (k == NULL)
  209023. err = MEMORY_E;
  209024. }
  209025. #endif
  209026. if (err == MP_OKAY) {
  209027. sp_1024_from_mp(k, 32, km);
  209028. sp_1024_point_from_ecc_point_32(point, gm);
  209029. err = sp_1024_ecc_mulmod_32(point, point, k, map, 1, heap);
  209030. }
  209031. if (err == MP_OKAY) {
  209032. err = sp_1024_point_to_ecc_point_32(point, r);
  209033. }
  209034. #ifdef WOLFSSL_SP_SMALL_STACK
  209035. if (k != NULL)
  209036. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  209037. if (point != NULL)
  209038. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  209039. #endif
  209040. return err;
  209041. }
  209042. #ifdef WOLFSSL_SP_SMALL
  209043. /* Striping precomputation table.
  209044. * 4 points combined into a table of 16 points.
  209045. * Distance of 256 between points.
  209046. */
  209047. static const sp_table_entry_1024 p1024_table[16] = {
  209048. /* 0 */
  209049. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209050. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209051. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  209052. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209053. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209054. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  209055. /* 1 */
  209056. { { 0xe0162bc2,0xbf9c7ec6,0x10a89289,0xddecc6e3,0x9e499d81,0x5d599df0,
  209057. 0x6d358218,0x9a96ea28,0x70c5f8db,0x01aec7d3,0x8cf5d066,0xe72e4995,
  209058. 0x3e91d7f8,0xc2e7297d,0xda9f2f5a,0x8621db92,0x5a5679ed,0x4b26c867,
  209059. 0x2c56aac1,0x233385df,0xc6a13f99,0xb88e74d4,0xffa8ec11,0x1214b173,
  209060. 0x1f3f9fef,0xa0386a27,0xc0e7b44e,0xbd9b1b4e,0xeecd3496,0xafe528dc,
  209061. 0x1c49f80b,0x8dfff96a },
  209062. { 0xc03c0c83,0xb4a4753a,0xabcdcd75,0x68e69d18,0xf775b649,0xe3839b88,
  209063. 0xbf58f352,0x803f949a,0xbd0bc15c,0x5f702679,0x8ff298c2,0x85bf5d16,
  209064. 0xc6c7976e,0x3f6ebd98,0x45e3e1b4,0x20618af4,0x54e64093,0x67d5598e,
  209065. 0x504fed9e,0xb047283b,0x70d87517,0x450cabfd,0x3f5addbe,0x47d628bf,
  209066. 0x78cb4cca,0x0037ef30,0x6b1c4908,0x4e148d3c,0x4fcfd837,0xe256d329,
  209067. 0xde3c01f3,0x2aa1207b } },
  209068. /* 2 */
  209069. { { 0x755c2a27,0xcf3e0bb2,0x59585c44,0xd38e42f9,0x19285e60,0x46b13e0f,
  209070. 0x76273d0f,0xc3ecd0c0,0x193c569a,0x7800f085,0x4351818a,0xf04e74ab,
  209071. 0x8496363b,0x9258aa38,0xb8c894fe,0x8456617c,0x2af969a0,0x8bc62aaa,
  209072. 0x5a4668d9,0x66c2280b,0xa992f4fa,0xbc9df58e,0x3f401e99,0x5db0b7d9,
  209073. 0xc4c38c0e,0xe0614fe1,0x2ccdf6b3,0xd531151c,0xe143b618,0x1c7575ec,
  209074. 0xdf9398a4,0x40247985 },
  209075. { 0x8f055746,0xfba25178,0x0ab1e6e0,0xc5ba0040,0xac292697,0xe1b194fb,
  209076. 0x5b4f4740,0x77152119,0x9bb7ba54,0x250091d0,0xb9a139a4,0x7a674861,
  209077. 0xf353aa7e,0xba8413b3,0x2443ceee,0xafe77192,0x3847bbd0,0x14468d36,
  209078. 0x3da4942d,0x61f79ff6,0xd425b456,0x1563a1c1,0x75ff4630,0x3c270fcd,
  209079. 0xeb2802c9,0x42072090,0xc85c7004,0x68f0cdcb,0xfa032e74,0xca4372fb,
  209080. 0xc8b79d80,0x1a6fd1e6 } },
  209081. /* 3 */
  209082. { { 0x8d5116a3,0x967a901a,0xb2f5f47f,0x0b844394,0x60ebaf3b,0xe39ad452,
  209083. 0x60ccfc0c,0x1e1be617,0xcc3f53f2,0xac07e3d2,0x1ed11bb6,0xdd838e0e,
  209084. 0x1c15b0c2,0x45475307,0x920fe5b8,0x70dd4748,0xe471896d,0x1a20be2d,
  209085. 0x59276c7c,0x3c3fad8a,0xc886ee07,0x026a1cc3,0x6e831ac4,0x9fdb6f37,
  209086. 0xac501d65,0x26a35d1a,0x40da8574,0x0ae98905,0xabd734e5,0x65dde0a4,
  209087. 0x15614750,0x29b7d4dc },
  209088. { 0xcbf4e20b,0x44b3c2cb,0x58cc44c5,0x1c3f548f,0x5b0cac1f,0x39809b54,
  209089. 0x00f80621,0x0c0f02b5,0x066905e0,0xe612b890,0x8350188c,0x8f158ed7,
  209090. 0x3f5576b2,0xc01dc458,0xa45492e0,0x29803272,0x0ff92443,0x77a5623a,
  209091. 0x29d0dc41,0xd12a2b00,0x2780e87a,0xb4125459,0x0d53f272,0x1ebcf903,
  209092. 0x24301e8d,0xbae6ea40,0xa37d0798,0x1e5f3f2f,0x22b4126c,0x9342c310,
  209093. 0x5382497e,0x5d092802 } },
  209094. /* 4 */
  209095. { { 0x4b59213a,0xf5b495d0,0x8d70200e,0xca672039,0x2b6771c1,0x4bcb09a6,
  209096. 0x2b9eb0cb,0x26adeed4,0x8cdba212,0xeb544754,0xf08890d1,0x0e1abfcd,
  209097. 0x698e46b4,0x52509963,0x82e9c138,0xe1bff0b0,0x51099a71,0xa189e4cd,
  209098. 0xc9b91cc7,0x2360c9bc,0x137ec4be,0x9bd4d7dc,0xd1519f6e,0xd0356521,
  209099. 0xcf832503,0xbf5f6d78,0x8deea2b4,0xe4301031,0xef4c319c,0xc3132494,
  209100. 0x0f1fa7d7,0x2ab3bd47 },
  209101. { 0x922c9fbb,0x5753b680,0x0f16c6d1,0x869e7dc8,0xbac16efc,0x83445135,
  209102. 0x846d1d9b,0x4326a3b4,0xb2d62c21,0xb517fee3,0x0b292ad5,0x6905afa2,
  209103. 0x2cadac13,0x2a57131a,0xebdbca8d,0xcd904d8f,0x3f365fb2,0xdfeda86f,
  209104. 0xdc7eaa1c,0x7097b208,0xa45e77c0,0x89a35a84,0xcf5d118e,0x417a062c,
  209105. 0x1f6e99e8,0x3c0c04a8,0xba7a087d,0xc44704b0,0x3ea22ad2,0x6f8a27d1,
  209106. 0x4c27d229,0x93a4b416 } },
  209107. /* 5 */
  209108. { { 0x1f1efb7a,0xd4271bc1,0x33fccc0d,0xae4e68e6,0xb11f50a8,0x9d9bc8f1,
  209109. 0xaf076089,0x5430398f,0x443d0e03,0x45e242fb,0xf6e3d4c1,0x73ec2519,
  209110. 0xba9bad09,0xab70f790,0xf9add10f,0xde612ad5,0x14e942b4,0xb837e54e,
  209111. 0xddb8b68a,0x175a56d3,0x1ac2a408,0xe85b233c,0xf0c80f94,0xf8ff6c30,
  209112. 0x898db4f9,0x4b7f3fb7,0x45a7dcdd,0xa2c6044f,0xfe3d3895,0xf3abb2f6,
  209113. 0x32ee7763,0x342ce0d7 },
  209114. { 0xcf491b1f,0xeb261394,0x1909e395,0xdcaaeed7,0x9fe4dbea,0xdcc4055a,
  209115. 0x493d604d,0x17a6611d,0x1ce5ebef,0xba445a3a,0xe3989cb5,0xe82e2858,
  209116. 0x83f58406,0xb96f4282,0xa156cf55,0x99877b99,0x4e166a0e,0xaf906a66,
  209117. 0xb2976d13,0xcea1d353,0x36c61a01,0xefc16f27,0xb0f55d86,0xdb04c433,
  209118. 0x8eb34c01,0x3cb4b269,0x2ae60280,0x38d07f78,0x43be3ec5,0x43ac3bcb,
  209119. 0xe156fd20,0x455f4af3 } },
  209120. /* 6 */
  209121. { { 0x95532833,0x2e6fe0a6,0xd626d067,0xabca228e,0x649e73bd,0x22aef3d9,
  209122. 0xf03c4c0c,0x2083a87a,0x35169b45,0xe954e75d,0x74506a89,0x577509ee,
  209123. 0x2aeacf90,0x49cb276e,0xfa409f91,0x08275d77,0xf0bbd6b9,0x61eb6f3d,
  209124. 0xe4132704,0x948202cb,0xb1c498b1,0x35f3fc21,0x361fee59,0x76c68ba8,
  209125. 0x50e051f3,0xa18cbbd9,0x318e7042,0x2384a879,0x80dd1e8b,0x292abead,
  209126. 0x5c37c334,0x65713c29 },
  209127. { 0xceb77b9a,0xdccca8e9,0x23b69469,0x2f97e727,0xa01d6b28,0xc76abee6,
  209128. 0x5abecdfe,0x3925203d,0x29290d70,0x89448082,0xb0314438,0xf9931424,
  209129. 0x7cd447c3,0x04209df1,0xc855c827,0x7c6f2059,0x56c0e069,0xd97d7862,
  209130. 0x412d94c4,0x5a9db6fe,0x994c41dd,0x19a64591,0xc89e21a3,0x12348aa1,
  209131. 0xc6a03f0e,0xd6904b50,0xa616feac,0x55c15156,0x7cc7693b,0x4e36d1b5,
  209132. 0x3bae3c38,0x6b0e996c } },
  209133. /* 7 */
  209134. { { 0xcceced00,0x32789fab,0xe5b7aa66,0x3237e71a,0x2ddebcdf,0x87b2e269,
  209135. 0xb61dad8f,0xb7245120,0xd35f803c,0xe11e5e48,0x98e50f0d,0xfb4df5d7,
  209136. 0xbcd2ab92,0x60ee68b4,0x1ce3363d,0x98ab2f5c,0x7cd42647,0x15ba39da,
  209137. 0x83f4fb3f,0x1a6572eb,0xe56f08db,0x0f77de88,0x172562c2,0x1743761e,
  209138. 0x8a58f0f4,0xbe349ff8,0x84d1d6e2,0xe04da71b,0x9e9ff3b4,0x368f0342,
  209139. 0x678223f8,0x4022a205 },
  209140. { 0x83847375,0x527bbd05,0x3f451af0,0x3ae56b62,0x4b2c7f18,0x6198f24d,
  209141. 0x4525b98d,0xee323f5b,0x0e0884b5,0xa9d8d39a,0xfb12c776,0xd005d7f6,
  209142. 0x708bc154,0xd71c483e,0x742541bc,0x8ca6fd28,0xf8397ddb,0x0af3dccd,
  209143. 0x3eccf243,0xb80d3125,0x58d81b8d,0xc743a108,0x71391f68,0x3f48eb21,
  209144. 0x33bb657f,0x493aff88,0x07e47e31,0x1d15ed66,0xe08279f6,0x10159b11,
  209145. 0x24a6a956,0x312179cb } },
  209146. /* 8 */
  209147. { { 0xfb99cfe6,0x950323d3,0xc9334178,0x7b09bc26,0x7cbdfb6f,0x64111e41,
  209148. 0x89a75760,0x91141744,0x10919cb0,0x4c633df9,0x396bfd2f,0x715fc7c7,
  209149. 0x8cab62db,0x8ca19512,0x4db81aac,0x30672473,0xb4c4c54a,0xe67a246b,
  209150. 0xbf229646,0xd77ea0fa,0xfa5b5d70,0x5bed15f1,0xc2f192f3,0xa5686da5,
  209151. 0x7f6690ad,0xdecac72a,0xcaa50b7d,0x0c4af2a2,0x6049ad2f,0xf44631c1,
  209152. 0x04ecf056,0x325d2796 },
  209153. { 0x4848c144,0xee11fb55,0xb6a7af32,0x4e062925,0x369e0f9a,0x125b68e1,
  209154. 0xca53b21e,0xad9bdae6,0x2e98ea1b,0xf50d605c,0x9f2fa395,0xbdb9e153,
  209155. 0xe91532f5,0x4570e32d,0x46a250d7,0x810698ae,0xad9d9145,0x7fd9546c,
  209156. 0x11e97a5e,0xabf67721,0x249f82e9,0xca29f7d5,0x9851df63,0xa9c539a9,
  209157. 0x71d0e3e5,0xfd84d54b,0x041d2b56,0xd1e0459c,0xfd80096a,0xceb3eb6e,
  209158. 0xe32a79d3,0x19d48546 } },
  209159. /* 9 */
  209160. { { 0xb540f5e5,0xfe19ee8f,0x04e68d17,0x86d2a52f,0xadbdc871,0xd2320db0,
  209161. 0xd03a7fc8,0xa83ad5a8,0x08bcb916,0x54bf83c7,0x2e51e840,0x092133ea,
  209162. 0xcb52dddf,0xbce38424,0x31063583,0xd5c7be40,0x458e3176,0xc1ebb9df,
  209163. 0xbc4dabbf,0xafb19639,0xc05725a8,0x36350fe4,0x84e1cd24,0xac4a0634,
  209164. 0xc145b8de,0xadf73154,0xb3483237,0x0aa6dd9e,0xcbff2720,0xa3345c3d,
  209165. 0xb4e453b0,0x1b3ace6c },
  209166. { 0x90a8bdc5,0x0343e5e9,0x6306a089,0xa203bf9d,0x8e48520e,0x98489a35,
  209167. 0xde7d1d06,0xbd17debe,0x5f795d3f,0x8fafa6d7,0x387b0a3f,0xa4ceb630,
  209168. 0xffddeafa,0xe0166b32,0x7e764e02,0xa2fe2054,0xe871f304,0x55ab9824,
  209169. 0x952ec45e,0xa2bd36bb,0xa90d20ca,0x7b4c1484,0x75bcfb53,0x5319f387,
  209170. 0x6982c4e5,0x34238a4a,0xa102921d,0xa2bb61c7,0xdb3ab17e,0x1e061b64,
  209171. 0x192f0a14,0x538ec33e } },
  209172. /* 10 */
  209173. { { 0x576374c2,0xe53c7785,0x84727040,0xe60526d1,0x228ca044,0x8a066dc8,
  209174. 0xf1ce1313,0x1fe1c1b2,0xcdeb0c5d,0x2aeec832,0x9cbf826f,0xa7596699,
  209175. 0xde77a589,0xcd188e81,0x118d1254,0xe5ce0fe0,0x0790b86a,0xa142a984,
  209176. 0x39ac28ce,0xe28f043f,0x87de5804,0x4eef8290,0xf639a8c5,0x83c31b32,
  209177. 0x5887794f,0xd70454a7,0x18b1b391,0xca635d50,0x31d9c795,0xcefea076,
  209178. 0xb6f8aa25,0x13cbee76 },
  209179. { 0x8d3f34f3,0x79cabe0f,0xa3617fe3,0xbda9c31c,0xdd9426a1,0xb26dee23,
  209180. 0xf29c9104,0xe9dd9627,0xe2c6cd3b,0x033eb169,0xfcba2196,0x8a73f492,
  209181. 0xb858c83c,0x92e37e0b,0x23b3fbb7,0xe4f2aca6,0x64be00a2,0x8101fb1e,
  209182. 0x948f6448,0x91a7826a,0x907260e7,0x414067b4,0xe30bb835,0xf774aa50,
  209183. 0xc999c06e,0xf922ca80,0x0ba08511,0x6b8635b9,0x25fa04f0,0xbf936b5c,
  209184. 0xe02e8967,0x4e0a1ada } },
  209185. /* 11 */
  209186. { { 0x8ba29c4d,0x00ca6670,0x22988094,0xc08240ce,0x16dda752,0x21c5ca67,
  209187. 0xabbbfa34,0x689c0e45,0x3ed28b72,0x1d7545fd,0xd7c56ab4,0x5f221198,
  209188. 0x38759d65,0x4b3d8f74,0x8fe50b89,0x93490dfb,0xe80eba16,0xb641f5d7,
  209189. 0x79acb537,0x7b0da5eb,0x0c1d5e5e,0xab6b1497,0xa5da429a,0x2338e68d,
  209190. 0x2f6d2f25,0xe010c437,0x6530f3a7,0x226f16d2,0xcbef08bc,0xefb0f7b6,
  209191. 0x9f99c999,0x733e30d9 },
  209192. { 0xa42a38f9,0xecfe1582,0x4730b500,0xaec2d58e,0xde976b2c,0x2ee2f2a7,
  209193. 0xa969c1bb,0xf0539db5,0xfcecdb4a,0x31954168,0xe7a8e902,0xf2f7348a,
  209194. 0x3121541f,0x1d58d7cc,0x2202ae52,0x5d25b75c,0xf40835a7,0xdea9965a,
  209195. 0x529b4e46,0x3feb6a41,0xbd27ad9b,0x5c97fb6f,0x261f900b,0xd87554c0,
  209196. 0x04d5b19e,0xb43031d9,0xcb219b9c,0x33d5e9b8,0x3ee00bcf,0x7a43d492,
  209197. 0xb79a5c0c,0x56facb39 } },
  209198. /* 12 */
  209199. { { 0x7c834915,0x667eaed6,0xbc5eb64d,0x9f77aa6a,0x25d62011,0x729ebcb6,
  209200. 0x699fd9c2,0x0aee24f2,0x2b8d4f6c,0xe1eb5874,0x14c976d6,0x7f12710c,
  209201. 0xf6d9ea65,0x91390335,0x06b50064,0x668b7049,0x0876ee4f,0x65969a0e,
  209202. 0x2f9d9360,0xf901bf3f,0xb499e3ce,0xfb1a8651,0xf2dbcaaa,0x80b953fb,
  209203. 0x973b06b6,0x312cc566,0x3af36c64,0x3534d9c3,0x10ffd815,0xe4463a52,
  209204. 0xf18c2b91,0x57ea2b4b },
  209205. { 0x8aa0f2f2,0x00f5e162,0x0e46bcaa,0x8c7e75c5,0xa4a2c42d,0x97ab479a,
  209206. 0x14baa202,0xb4f308ea,0x6943cc2e,0xa901bd14,0xeed58804,0xbb125fee,
  209207. 0x9d180f7c,0x6502c8f9,0x1580c61c,0xe5353919,0x27101ee3,0x7e278069,
  209208. 0xfaa72717,0x7a0a40a1,0x4c75b153,0x32edce02,0x538f1c22,0xda23660b,
  209209. 0xbe307d2e,0x4d511e98,0x9baee0b4,0x24276e40,0x7ff1f307,0xa78c3927,
  209210. 0xea7935c9,0x60480b46 } },
  209211. /* 13 */
  209212. { { 0x3872ece3,0x31087d66,0x955b70f8,0x5f29be7d,0x9cf95bb8,0xb50b4fc7,
  209213. 0xdbffa621,0xbae3b58d,0xe022ba5d,0x0e61d280,0x4181449c,0x78ae5117,
  209214. 0xcf555485,0x0b132840,0xb8ce0b0e,0x800ed1b6,0x78d5de3d,0x35dffdd5,
  209215. 0x69a56b47,0xf7e42374,0x8d910ae7,0xd5e32369,0x6313c7c7,0xb6ff52a0,
  209216. 0xa92de9e5,0x5a2fe20d,0xd12110bb,0x41b347d3,0x40c16f23,0xc5905edb,
  209217. 0x9a8f88cc,0x0774a0d3 },
  209218. { 0xe3b6c106,0x3ae181ab,0x8de150b7,0x4ebe163f,0x6f354836,0xcf75b82f,
  209219. 0x3ac7ac16,0xaa0d2063,0x291722af,0x5c680668,0x11545553,0x73941e61,
  209220. 0xbf5de3f7,0x17127e38,0x1afb41da,0x32cfdf03,0x87bc8663,0xc6893c91,
  209221. 0xa62c9c99,0x75046744,0x962c1947,0x96866e2d,0x378cdf4c,0x489ec8df,
  209222. 0x3407fa32,0x3a60709b,0x551290d1,0xd37d2159,0xbab92273,0x9623d303,
  209223. 0x2432014b,0x08151954 } },
  209224. /* 14 */
  209225. { { 0xb05f2b26,0x569044f3,0x80b9f76c,0xb35a294a,0x4290f6ae,0x8839fe28,
  209226. 0x026a5877,0x761cfb23,0x2e5ff9c3,0x768926b6,0x0b11c576,0xbae6cd20,
  209227. 0x72a03efe,0xdc857756,0xe1bad63a,0x0cae074a,0xd709d99c,0x3fe491a1,
  209228. 0x6501d9c1,0x76c5ded6,0xc32aeff7,0x1da6eca1,0xc57683e8,0x50849d55,
  209229. 0xdf98d847,0x9e392e9c,0x64d9a564,0xfad7982f,0xa37b98b2,0xf7c3bdb7,
  209230. 0xf0860497,0x1fe09f94 },
  209231. { 0x7648cc63,0x49a7eaae,0x67cfa714,0x13ea2511,0x653f4559,0xfc8b923c,
  209232. 0x81a16e86,0xd957619b,0x3c864674,0x0c7e804b,0x1616599a,0xfc88134a,
  209233. 0x0a652328,0x366ea969,0x4bc9029e,0x41532960,0xae2aad2b,0xef9e1994,
  209234. 0x7f10bef5,0x9e2a8c52,0xc67bf860,0x73dcb586,0x844cc25d,0xf61a43fa,
  209235. 0x74eb3653,0xd74e7eea,0xdd240f02,0xf3356706,0xfd83bcb4,0xeec7694c,
  209236. 0xdb62526a,0x4de95786 } },
  209237. /* 15 */
  209238. { { 0x3deac2f7,0x4867d315,0xb61d9a8e,0xa084778a,0x0ab7b2d5,0xf3b76f96,
  209239. 0xcfdf4f79,0x00b30056,0x31ab8f4b,0xd0701e15,0x9c779d01,0x07f948d5,
  209240. 0x82675371,0x7c994ebc,0x48bad4c0,0x1104d4ee,0xbfc9d058,0x798ce0b5,
  209241. 0x309fa80b,0xc7ca898d,0xacb33eaf,0x0244f225,0x5b2f3175,0xd51e8dfc,
  209242. 0xa4d7be34,0x3e49ba6b,0xbda02b43,0x1760f4c7,0x4435275a,0x37e36a7e,
  209243. 0xe636980c,0x1c94418b },
  209244. { 0x09dc1414,0x43a21313,0x43c93537,0x060765fc,0xdf5f79ce,0x6ff3207a,
  209245. 0x85d4cfca,0x6f18b1fa,0x63e995ab,0xf5c4272e,0xa82b3002,0x121a09e4,
  209246. 0x97147f16,0x82b65d1b,0x20a7fe26,0x4993c20c,0xe6716726,0x99c9cb98,
  209247. 0xfeb440a0,0x5a02d673,0x251b4bc5,0x3f3fa9e1,0xa05338ea,0x75dbc474,
  209248. 0x7b09f6cb,0x3cb4044b,0x80434609,0x6767da18,0x098ceac2,0x97851422,
  209249. 0xb55235ba,0x611bfbb2 } },
  209250. };
  209251. /* Multiply the base point of P1024 by the scalar and return the result.
  209252. * If map is true then convert result to affine coordinates.
  209253. *
  209254. * Stripe implementation.
  209255. * Pre-generated: 2^0, 2^256, ...
  209256. * Pre-generated: products of all combinations of above.
  209257. * 4 doubles and adds (with qz=1)
  209258. *
  209259. * r Resulting point.
  209260. * k Scalar to multiply by.
  209261. * map Indicates whether to convert result to affine.
  209262. * ct Constant time required.
  209263. * heap Heap to use for allocation.
  209264. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  209265. */
  209266. static int sp_1024_ecc_mulmod_base_32(sp_point_1024* r, const sp_digit* k,
  209267. int map, int ct, void* heap)
  209268. {
  209269. return sp_1024_ecc_mulmod_stripe_32(r, &p1024_base, p1024_table,
  209270. k, map, ct, heap);
  209271. }
  209272. #else
  209273. /* Striping precomputation table.
  209274. * 8 points combined into a table of 256 points.
  209275. * Distance of 128 between points.
  209276. */
  209277. static const sp_table_entry_1024 p1024_table[256] = {
  209278. /* 0 */
  209279. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209280. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209281. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  209282. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209283. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209284. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  209285. /* 1 */
  209286. { { 0xe0162bc2,0xbf9c7ec6,0x10a89289,0xddecc6e3,0x9e499d81,0x5d599df0,
  209287. 0x6d358218,0x9a96ea28,0x70c5f8db,0x01aec7d3,0x8cf5d066,0xe72e4995,
  209288. 0x3e91d7f8,0xc2e7297d,0xda9f2f5a,0x8621db92,0x5a5679ed,0x4b26c867,
  209289. 0x2c56aac1,0x233385df,0xc6a13f99,0xb88e74d4,0xffa8ec11,0x1214b173,
  209290. 0x1f3f9fef,0xa0386a27,0xc0e7b44e,0xbd9b1b4e,0xeecd3496,0xafe528dc,
  209291. 0x1c49f80b,0x8dfff96a },
  209292. { 0xc03c0c83,0xb4a4753a,0xabcdcd75,0x68e69d18,0xf775b649,0xe3839b88,
  209293. 0xbf58f352,0x803f949a,0xbd0bc15c,0x5f702679,0x8ff298c2,0x85bf5d16,
  209294. 0xc6c7976e,0x3f6ebd98,0x45e3e1b4,0x20618af4,0x54e64093,0x67d5598e,
  209295. 0x504fed9e,0xb047283b,0x70d87517,0x450cabfd,0x3f5addbe,0x47d628bf,
  209296. 0x78cb4cca,0x0037ef30,0x6b1c4908,0x4e148d3c,0x4fcfd837,0xe256d329,
  209297. 0xde3c01f3,0x2aa1207b } },
  209298. /* 2 */
  209299. { { 0x01900955,0xa95b6dae,0xceb4656d,0xa5dc9cc1,0xe72fe95b,0x50c78907,
  209300. 0xa040c334,0xa1ae5447,0x7952ea6e,0x91191370,0x6d097305,0x54ff7343,
  209301. 0xbda4d10f,0xa4db0074,0x91644070,0xfd5306f1,0x8b24522c,0x14b9fe73,
  209302. 0x7849f762,0x1468dad6,0xb0dcd2e4,0x87b29a18,0x5e1ad492,0xadd7f1a1,
  209303. 0xdbba2a1a,0x9ac63a81,0x81223379,0x01379c5b,0xb0e53bc8,0xf402b2f0,
  209304. 0x0bf13b61,0x8c3eb27f },
  209305. { 0xe513696f,0x9a4ad3e1,0x18c81ffa,0x0350ba5c,0x3c033d13,0x1e2fc136,
  209306. 0x17a531bc,0x53da6e71,0x1aed610d,0x42ec6490,0xe99ff567,0xd33e8df7,
  209307. 0x3deed12a,0xe4aad73e,0x180f4deb,0xd983b465,0x502f30b4,0x99365269,
  209308. 0xa8918d7f,0x7e2799ab,0x700fc79a,0x0ffe84b6,0x40bfd8c2,0x7b4400d6,
  209309. 0x5d2641bd,0xc3a21d21,0xc32621cb,0x79839442,0xb1401e83,0xace6500b,
  209310. 0x251c4310,0x7bf4163e } },
  209311. /* 3 */
  209312. { { 0xe3fd589e,0x1c174f88,0xdf974a03,0xdb501790,0x3e70549f,0xd09623e3,
  209313. 0x15924f34,0x8d091eff,0xf9b65ac5,0xeef79cad,0x3f69c2cf,0xd2cc4262,
  209314. 0x52cd82bc,0x817d9032,0xa5f1dddd,0xacf4f4d9,0x5011b6bd,0xd0612635,
  209315. 0x2ed140c9,0x9f74490d,0x4db686d2,0x64092e8c,0x776b0fcc,0x225eef16,
  209316. 0xdf16aeb6,0x0e8c01e9,0x84bbd82a,0x62836741,0x8956e337,0x757574e2,
  209317. 0x705a7f07,0x9871edc6 },
  209318. { 0x776535f7,0xbd0b76d5,0x2635b3b8,0x5214d602,0x9d216f64,0xc0c25ad9,
  209319. 0x5515bf75,0xfd4df3a7,0x5e9f1675,0x24a625bc,0x406873e7,0x3c35efb7,
  209320. 0xbb2e5c4a,0xef5c9a33,0x806b198a,0xa971b35e,0xa3c690ed,0x9f5c0ca5,
  209321. 0x8e1e2341,0xa8d5dd89,0x955ad9e4,0x4cecbcce,0x248d3416,0x2ecf4407,
  209322. 0x45c0af6e,0x1abb3811,0x1c780fff,0x3f4bee82,0xc272ed57,0xd14df768,
  209323. 0x371637ad,0x397ed10a } },
  209324. /* 4 */
  209325. { { 0x755c2a27,0xcf3e0bb2,0x59585c44,0xd38e42f9,0x19285e60,0x46b13e0f,
  209326. 0x76273d0f,0xc3ecd0c0,0x193c569a,0x7800f085,0x4351818a,0xf04e74ab,
  209327. 0x8496363b,0x9258aa38,0xb8c894fe,0x8456617c,0x2af969a0,0x8bc62aaa,
  209328. 0x5a4668d9,0x66c2280b,0xa992f4fa,0xbc9df58e,0x3f401e99,0x5db0b7d9,
  209329. 0xc4c38c0e,0xe0614fe1,0x2ccdf6b3,0xd531151c,0xe143b618,0x1c7575ec,
  209330. 0xdf9398a4,0x40247985 },
  209331. { 0x8f055746,0xfba25178,0x0ab1e6e0,0xc5ba0040,0xac292697,0xe1b194fb,
  209332. 0x5b4f4740,0x77152119,0x9bb7ba54,0x250091d0,0xb9a139a4,0x7a674861,
  209333. 0xf353aa7e,0xba8413b3,0x2443ceee,0xafe77192,0x3847bbd0,0x14468d36,
  209334. 0x3da4942d,0x61f79ff6,0xd425b456,0x1563a1c1,0x75ff4630,0x3c270fcd,
  209335. 0xeb2802c9,0x42072090,0xc85c7004,0x68f0cdcb,0xfa032e74,0xca4372fb,
  209336. 0xc8b79d80,0x1a6fd1e6 } },
  209337. /* 5 */
  209338. { { 0x8d5116a3,0x967a901a,0xb2f5f47f,0x0b844394,0x60ebaf3b,0xe39ad452,
  209339. 0x60ccfc0c,0x1e1be617,0xcc3f53f2,0xac07e3d2,0x1ed11bb6,0xdd838e0e,
  209340. 0x1c15b0c2,0x45475307,0x920fe5b8,0x70dd4748,0xe471896d,0x1a20be2d,
  209341. 0x59276c7c,0x3c3fad8a,0xc886ee07,0x026a1cc3,0x6e831ac4,0x9fdb6f37,
  209342. 0xac501d65,0x26a35d1a,0x40da8574,0x0ae98905,0xabd734e5,0x65dde0a4,
  209343. 0x15614750,0x29b7d4dc },
  209344. { 0xcbf4e20b,0x44b3c2cb,0x58cc44c5,0x1c3f548f,0x5b0cac1f,0x39809b54,
  209345. 0x00f80621,0x0c0f02b5,0x066905e0,0xe612b890,0x8350188c,0x8f158ed7,
  209346. 0x3f5576b2,0xc01dc458,0xa45492e0,0x29803272,0x0ff92443,0x77a5623a,
  209347. 0x29d0dc41,0xd12a2b00,0x2780e87a,0xb4125459,0x0d53f272,0x1ebcf903,
  209348. 0x24301e8d,0xbae6ea40,0xa37d0798,0x1e5f3f2f,0x22b4126c,0x9342c310,
  209349. 0x5382497e,0x5d092802 } },
  209350. /* 6 */
  209351. { { 0xff2f780d,0x583a2b7e,0xd7d76b1d,0x34d26820,0x86f74aec,0xe3c32847,
  209352. 0x10823feb,0x0fd42212,0xfb5e7bf4,0x227e417e,0xa568f8cd,0x510d49b6,
  209353. 0x1781bbec,0x53bce7d6,0x2f3718b7,0x9cfe3f22,0xd9de6c1f,0x7f44e89f,
  209354. 0x3fac9b55,0xf1cc553f,0xe6f300bc,0x9d2d0846,0x9f0ae6b1,0x976c82a2,
  209355. 0x24b8bbe0,0xe63dbf5e,0x973a5aa7,0x4cac7f45,0x84dd33c7,0xc6eb6237,
  209356. 0x142fee5d,0x0a26e434 },
  209357. { 0xacaa9a08,0x8081339f,0x5246ece1,0x40f31105,0x61393747,0x892c8170,
  209358. 0x242f02e1,0x8d8d4103,0x3b5de98a,0x482bfd20,0x5abbe952,0x89ef946b,
  209359. 0x37698249,0xb8d218b9,0x66617c7a,0xd5268e89,0x8b7d2b91,0x962e7551,
  209360. 0xfe8d67c3,0x2c5c7973,0x2b017c51,0x42e3150a,0xc1a29469,0x6f4e5ebc,
  209361. 0x531c7083,0xa39910ce,0xb77b9e50,0xaf4f6eb4,0xda120ad0,0x68cbb175,
  209362. 0xb92636ec,0x19497c61 } },
  209363. /* 7 */
  209364. { { 0x417659a8,0x6920b0c6,0x92cb28ff,0xc77ab9c7,0xb687797f,0x55b67180,
  209365. 0xe7759363,0x4caf58c1,0x5561b186,0x5155bdb6,0x780f4946,0x2e64e355,
  209366. 0x229a8b20,0xeb0ac9b7,0x2571bd60,0x88594d78,0xe3fa78f9,0x5dcc0939,
  209367. 0x2ac2d379,0x7b8b4830,0xb90f1444,0x505fbf60,0x3ce4b3c1,0xac610e81,
  209368. 0xd59b5c18,0x39a4f27a,0x7cea0222,0x5fa33973,0x8dff1c7b,0xe578730b,
  209369. 0x517bf7a6,0x96b91b8b },
  209370. { 0x9aac087c,0xc1a991f4,0x6cfdb28d,0xce62f74e,0x5f7600d6,0x08d6ff9a,
  209371. 0xf917f9c9,0xd781cd04,0x3de52dbf,0x7796f5f6,0x2ed72180,0xe7db64e0,
  209372. 0x6fa4137d,0x0f0876f6,0x3ca1f716,0x3271ee64,0x7c4ab8a3,0xcb9b2058,
  209373. 0x39481047,0xcba17107,0x598c5c37,0xdf9a190d,0x6f20e125,0x0cb6e72a,
  209374. 0xf4f2902d,0xa3142204,0x7ce2dcfb,0x42d28cb9,0xa3d3c351,0xdf261b8a,
  209375. 0xcffc249d,0x73f3d315 } },
  209376. /* 8 */
  209377. { { 0xe6fd3673,0x5d86855b,0x9d214b7b,0x309b70af,0xdcc46cd3,0x8d332f90,
  209378. 0x595510de,0xe553c015,0x38c1251c,0x5746a096,0x85cc1bc9,0xcd7cea5b,
  209379. 0x002eba8f,0x4ffa1468,0x22fcd77c,0x10a3cb70,0xc4ea05e3,0xb6999dfb,
  209380. 0x4efa756e,0x3375a0d0,0xdced5fd8,0x4d90279e,0x251fd56e,0x48192403,
  209381. 0x82a4c5f1,0xe87633a4,0x1b34105b,0x3170d130,0x7247e578,0x93998b0f,
  209382. 0x436ba1fa,0x88934f64 },
  209383. { 0x4713eabc,0xf09f43b0,0xaccdc517,0x4ca7dd91,0xef13ca7c,0x27daa63b,
  209384. 0x2588184b,0x8b2e5a7a,0xd95dc269,0x0a8cb612,0xe1f2f14c,0x346975a2,
  209385. 0xe172935c,0x1f29b8ed,0xd40bc1e3,0xc3cbfd6e,0x132623da,0xd3f46b3f,
  209386. 0xfb0b7681,0xc115be6d,0x56da4344,0x5e31c345,0xa8e43d98,0xa7c63f18,
  209387. 0x4bddb4ea,0x55cb2083,0x4a54f58c,0xb16a0c38,0x46fd69d9,0x74eacca2,
  209388. 0x153548e1,0x0d1898bb } },
  209389. /* 9 */
  209390. { { 0xe35ef043,0x4ea73461,0x3496b564,0x107b67d9,0xd0f83a3c,0xd62c173b,
  209391. 0x51d29c35,0xfad4b038,0x71b1c1a4,0x3f42882a,0x54b43b9e,0x5d2bcf66,
  209392. 0x2abdf543,0xc77b15aa,0xdabe3dc1,0x5cb38a80,0xa481673b,0x15fda0ae,
  209393. 0xe7b90ebe,0x86996b4d,0x2bc8f3d8,0x84f87e25,0x37c4e424,0xaded03d6,
  209394. 0xd7a7afd8,0xe5ede666,0xa1ccb93a,0x80dd95a2,0x46fba391,0xa55cfd25,
  209395. 0x46f82e60,0x2bdab1dc },
  209396. { 0xfa6fed61,0x7a4de22b,0xcc8dd94e,0xca458aa5,0x071222f5,0x3e372df1,
  209397. 0xe5aff377,0x06a4b44f,0x4a738e6d,0xbc2d0ba7,0x5f31f136,0x1a470e1d,
  209398. 0xe102a911,0x77ff933a,0x310c7885,0x8b380a50,0x783fc5ac,0x9f3c0228,
  209399. 0x44725d06,0xec668925,0x5ac84221,0x878f0e16,0xcfda6e8a,0x9a3af1af,
  209400. 0x78cd2aba,0x0183ed37,0x826d0eae,0x32cdbd60,0xcbee6415,0xb3234661,
  209401. 0xb9c10120,0x353eb892 } },
  209402. /* 10 */
  209403. { { 0x10b5521e,0xc8fdcad6,0x52e702f0,0x1a11b440,0x8ffda49c,0x6302680d,
  209404. 0xcbf36bad,0xcdb9654a,0x4c10a2d7,0x7b58ce11,0xe630e7e0,0x1e5d1f7d,
  209405. 0x6760a813,0x8cbe3d7d,0x6480d77f,0xeb35866b,0x7f036219,0x58728cf3,
  209406. 0x42a8a757,0xdd5865ed,0x906a2870,0x283f1f1d,0xa51f906b,0x79e23fa4,
  209407. 0x543b20a8,0xf2ac6e83,0xb81e7754,0x4f0b6379,0x840016ee,0x57fbc0d4,
  209408. 0xe621b67d,0x8da20771 },
  209409. { 0xecce65ec,0x3c855004,0xb748185e,0x76d10d1f,0x78797ad2,0x64be7bca,
  209410. 0x77e54aad,0x43444db0,0xbe0df0ff,0x17b6b0c9,0x055086a4,0x8fc4256c,
  209411. 0xfd74d5a3,0xf952c43b,0x01c4edb8,0x501e005a,0x4a57e328,0xd5172dfc,
  209412. 0x535d6ee3,0xdb40ce4e,0x0c650918,0xbaef1e5c,0x857561fc,0xe85145e7,
  209413. 0x34a224c6,0xe468536a,0x0ec0e0a2,0x69a8e227,0x242b03fc,0xb3f52247,
  209414. 0xc3bebd5f,0x862f55e2 } },
  209415. /* 11 */
  209416. { { 0x226049fe,0x2d6a390f,0xdcbbc9fb,0xcc92a578,0x97634fb7,0xa52feca4,
  209417. 0x3dea5893,0x2b340cb6,0x2a49e916,0xa39f338a,0x949e41f3,0x26b2df3d,
  209418. 0x065a7e40,0xc71c7cdb,0x468281a2,0x4a9b84a0,0x731eeeca,0x63eeb503,
  209419. 0x76cbb725,0xe6d09134,0xb94a678c,0x0cf979a9,0x808fd9f1,0xb44d8c3b,
  209420. 0xe0afc5b9,0xe60da613,0x3ea5be69,0x52dce7de,0xdc1ee74f,0x3a5d6864,
  209421. 0x3bc80790,0x71ab2891 },
  209422. { 0x3b5b60ad,0xcf618fc4,0x4a0c3184,0x0afb5e30,0xbc403302,0xd22381cc,
  209423. 0xdb1c0c66,0x33cf8953,0xa6112a8d,0x9c994e4d,0xd1967a86,0xd7aae2c3,
  209424. 0x5b7acd29,0xc28d5493,0x6c9a57fb,0x8075bd13,0x9c8427f9,0xc9c0373e,
  209425. 0x193225f5,0x2cbca18d,0x442c018c,0x73777d13,0xfbb3a727,0xebe5ed47,
  209426. 0x1962dc18,0x70437d49,0x2dc08806,0xf39c1e09,0x15fff35c,0x03e9c6f7,
  209427. 0x5e360a65,0x8d087bb6 } },
  209428. /* 12 */
  209429. { { 0x3fdc1844,0xbe212302,0x105eac56,0x6eca27ef,0xf168a348,0x2183a606,
  209430. 0xe1d7a4cb,0x295f807d,0x7ef5d43e,0x7246a632,0xc77025c7,0xae143205,
  209431. 0xf3484e3e,0x4bdfc7ca,0xdf52c075,0xec939895,0xd7a9cac0,0x82e655f6,
  209432. 0x8baeddb0,0x985dfe20,0x527de731,0x79c817e4,0x313de1ea,0x30ce0fbc,
  209433. 0xcc4f6cbb,0x9df95b89,0xf5bb20cd,0xf2aedf1e,0x1a8cfb01,0xfc1e0a89,
  209434. 0x63edb7ec,0x225ed34a },
  209435. { 0xbabb1a85,0x3e13154d,0x1e6a565a,0xd3d8dae7,0xab4b100f,0xd3217d56,
  209436. 0xebc78e1a,0xd44d934e,0x48e73d37,0x0215321b,0x201e43cb,0xbbc90bfa,
  209437. 0x27500905,0x3c23f1d0,0xc86691a1,0x2a2e5000,0x6065841c,0x08b2bad2,
  209438. 0x30026b60,0x15d41caf,0x5276ce61,0x1712c2f4,0x15932ffb,0x01c4c3e7,
  209439. 0x6a74caf2,0x7894e13d,0x0c0537a4,0x02d6f5df,0xc2b1c97e,0xa8fb7602,
  209440. 0xd0887c7b,0x612b60e5 } },
  209441. /* 13 */
  209442. { { 0xba245d6b,0xefd495cf,0xa2ce3ff6,0x5cf0cbb7,0xdff5feee,0x24da2ac0,
  209443. 0xcf28c6a3,0x90c914f8,0x4308a56b,0x72fdb50d,0x13d72034,0x03dbf779,
  209444. 0x822ac9e9,0xcfa5ec91,0x3aea3e81,0x0dde73c8,0x66289139,0x545ba962,
  209445. 0xca6acbd3,0xa52f648b,0x98a0683a,0xff6f276e,0xa378ed52,0x2536d3ac,
  209446. 0x885ac1d9,0x353c2c54,0x00bc84a7,0xcaff52da,0x37684167,0x3971f81c,
  209447. 0xd2d7986e,0x0f7334e1 },
  209448. { 0x6596067e,0xafbb5c83,0x38c19806,0x33e54e19,0x39cb0dcc,0x8285d967,
  209449. 0x424035f9,0x2b53f43d,0xdfef9095,0x38c531f8,0xdb0f571a,0x90fbe8e4,
  209450. 0xa39ca787,0x9a0c1ed2,0x606f2620,0x2fecc1d6,0x72b7cb4a,0x9dc890b1,
  209451. 0xccbb7868,0xc33ca6fb,0xfe73ee49,0xd1b11082,0xfcb66c48,0x590b7d17,
  209452. 0x86e14573,0x9356b0a6,0x053ead85,0x75d682c4,0xc54d30fb,0xb2ae55fa,
  209453. 0xf8aee949,0x67636a72 } },
  209454. /* 14 */
  209455. { { 0xb91d6bea,0x638063bc,0x923ecb96,0xae263a2e,0xc627aca6,0x9d7b0992,
  209456. 0x77af9e7e,0xc6ed001a,0x24aafebb,0x9214accf,0x78055a90,0xa3564b96,
  209457. 0xe027499d,0x00999b1c,0xe46a06a5,0xe413a4e1,0x2e51efe7,0xa05d13f6,
  209458. 0x9ba843be,0x35e87d34,0x3183159e,0x0a633825,0x54601923,0x6023e8ba,
  209459. 0xb7fd1cf2,0x9b107721,0xfdf2fd53,0x46b5542b,0x1c18af38,0xb314f4f8,
  209460. 0x60ac8965,0x086f9876 },
  209461. { 0x8cbb9850,0x76701954,0xa20d2c8c,0x6210b730,0x5335670c,0x4084d057,
  209462. 0x0324baea,0x3ecdc595,0xc76ee9b4,0x607fc5f2,0x440ffa64,0xf393d00f,
  209463. 0x2dc1463c,0xe0111796,0x9c7725e7,0xf00b8251,0x5bd1d186,0x35e60736,
  209464. 0x2cf72aac,0xf3d8554c,0xefa3497d,0xb4dd0fde,0xf646ad11,0xd712268c,
  209465. 0x9f7b8ead,0x07c20afb,0xfc06dfe5,0x630969d4,0x7245549a,0x76b7df1c,
  209466. 0xe61ae810,0x681f9403 } },
  209467. /* 15 */
  209468. { { 0xc9a0623b,0x7cad5163,0x67fab8d4,0xdbf82957,0x81af7c7c,0x2ccab0ec,
  209469. 0xe966d5c2,0x469e38c8,0xf0d4e41c,0x34430d52,0xa52b359c,0x426075a2,
  209470. 0x33bd0127,0x242dd3e3,0x9fed2341,0xcda3f635,0xd7d52ffa,0x4df33730,
  209471. 0x7640c3ef,0x5fff56f0,0x1bbde57c,0x4783c21c,0xeb8bb336,0xd8784a2a,
  209472. 0xead08405,0x1ec7c533,0xf9b62bd4,0x4b7f1423,0x7075d4af,0x5543145c,
  209473. 0xba60590a,0x0c9de94a },
  209474. { 0x95d5682b,0x8ed72735,0x2ec276ed,0x711c4283,0x8b36a0d2,0xd1f4aed5,
  209475. 0x8498a88f,0x62ab40c4,0x4480f451,0x58c8fc62,0xb79cffe2,0x8bc8ca4b,
  209476. 0x701a359d,0x90ab583c,0x3fd5d15d,0xaee31a73,0xc912333c,0x02a5597b,
  209477. 0xb6c3e3c2,0x1019cae4,0x29938088,0xe513042c,0xf47c8199,0x0e00283d,
  209478. 0xf2a00e92,0x90d68e58,0xa775ae3b,0x69e2df41,0x871c30b2,0xb8d2eca5,
  209479. 0xbb1de396,0x733dca0e } },
  209480. /* 16 */
  209481. { { 0x4b59213a,0xf5b495d0,0x8d70200e,0xca672039,0x2b6771c1,0x4bcb09a6,
  209482. 0x2b9eb0cb,0x26adeed4,0x8cdba212,0xeb544754,0xf08890d1,0x0e1abfcd,
  209483. 0x698e46b4,0x52509963,0x82e9c138,0xe1bff0b0,0x51099a71,0xa189e4cd,
  209484. 0xc9b91cc7,0x2360c9bc,0x137ec4be,0x9bd4d7dc,0xd1519f6e,0xd0356521,
  209485. 0xcf832503,0xbf5f6d78,0x8deea2b4,0xe4301031,0xef4c319c,0xc3132494,
  209486. 0x0f1fa7d7,0x2ab3bd47 },
  209487. { 0x922c9fbb,0x5753b680,0x0f16c6d1,0x869e7dc8,0xbac16efc,0x83445135,
  209488. 0x846d1d9b,0x4326a3b4,0xb2d62c21,0xb517fee3,0x0b292ad5,0x6905afa2,
  209489. 0x2cadac13,0x2a57131a,0xebdbca8d,0xcd904d8f,0x3f365fb2,0xdfeda86f,
  209490. 0xdc7eaa1c,0x7097b208,0xa45e77c0,0x89a35a84,0xcf5d118e,0x417a062c,
  209491. 0x1f6e99e8,0x3c0c04a8,0xba7a087d,0xc44704b0,0x3ea22ad2,0x6f8a27d1,
  209492. 0x4c27d229,0x93a4b416 } },
  209493. /* 17 */
  209494. { { 0x1f1efb7a,0xd4271bc1,0x33fccc0d,0xae4e68e6,0xb11f50a8,0x9d9bc8f1,
  209495. 0xaf076089,0x5430398f,0x443d0e03,0x45e242fb,0xf6e3d4c1,0x73ec2519,
  209496. 0xba9bad09,0xab70f790,0xf9add10f,0xde612ad5,0x14e942b4,0xb837e54e,
  209497. 0xddb8b68a,0x175a56d3,0x1ac2a408,0xe85b233c,0xf0c80f94,0xf8ff6c30,
  209498. 0x898db4f9,0x4b7f3fb7,0x45a7dcdd,0xa2c6044f,0xfe3d3895,0xf3abb2f6,
  209499. 0x32ee7763,0x342ce0d7 },
  209500. { 0xcf491b1f,0xeb261394,0x1909e395,0xdcaaeed7,0x9fe4dbea,0xdcc4055a,
  209501. 0x493d604d,0x17a6611d,0x1ce5ebef,0xba445a3a,0xe3989cb5,0xe82e2858,
  209502. 0x83f58406,0xb96f4282,0xa156cf55,0x99877b99,0x4e166a0e,0xaf906a66,
  209503. 0xb2976d13,0xcea1d353,0x36c61a01,0xefc16f27,0xb0f55d86,0xdb04c433,
  209504. 0x8eb34c01,0x3cb4b269,0x2ae60280,0x38d07f78,0x43be3ec5,0x43ac3bcb,
  209505. 0xe156fd20,0x455f4af3 } },
  209506. /* 18 */
  209507. { { 0x754ec21c,0xc057f262,0xe3a1ba38,0x3eacd4c9,0x116c1fe9,0x3a0210d1,
  209508. 0xeacc8ab6,0xe4ea4e94,0xea6f32ca,0x31c00c9a,0x86b975ce,0x5cb6239d,
  209509. 0xa14ea1e9,0x654d5d8c,0x5067fc8b,0x230d31f4,0x6355fecb,0x48bb90cb,
  209510. 0xdc172e8e,0x78f81ece,0xcb006737,0x288380a8,0xe162d012,0x19b02e01,
  209511. 0xc5af145c,0x0e087a06,0xb72dc354,0xf04dc8b7,0x8de3c066,0xf70ef214,
  209512. 0x13009fb7,0x4f148243 },
  209513. { 0x6e2055e2,0x5e004fce,0x86c32067,0x89e247ea,0x5f9daaa2,0x4ebcbd95,
  209514. 0xceb7f63b,0xd15f212f,0x863784a0,0x5ecc5c1f,0x75760251,0x53b3800b,
  209515. 0x8a6a2954,0xeb9301c3,0xa13cdd19,0x0f16ba18,0x887c2d24,0x8313d251,
  209516. 0x9a9413f6,0xf9923585,0xfe3fd7c5,0x423405e6,0x16e0ee05,0x678aeb34,
  209517. 0x3fadaab0,0x1f3be7bb,0x82884471,0x7901fa2c,0x4d662ff6,0xc950db30,
  209518. 0x3c01170b,0x74d5d2d4 } },
  209519. /* 19 */
  209520. { { 0x2b5bfe11,0xa3002dc0,0x52d321e7,0x0733410d,0x9679ba89,0x15920f65,
  209521. 0x685b236e,0x0e248c14,0x346f6040,0x8cfab594,0x40c717f0,0x9f57afb7,
  209522. 0x66044576,0x0dbab28c,0x9cdc3247,0x0fa09968,0xc230ed05,0x41e02ae2,
  209523. 0xe45bef74,0x0d961554,0xce4d7b6f,0x9688a982,0x5e62d22e,0xfadefac7,
  209524. 0xbd2cba28,0xaf1512a6,0xbe7c749f,0x78868e62,0xae9f5a6b,0x88048d81,
  209525. 0xc5857a29,0x6b1a5442 },
  209526. { 0x43242066,0x9f5ab9ad,0x2ccca2ae,0x0afef1b5,0x988edc4e,0xb1b43ec7,
  209527. 0x0341b0d5,0x0d0c00f1,0xb50aab37,0x4d68b8f7,0xf3a64a99,0x9a8e4e6f,
  209528. 0x7f1a684e,0x198338fb,0x351a0f5c,0x8bc0e748,0xdac44515,0x2cacf2cd,
  209529. 0x5e9ff76b,0xc14d3999,0x16393055,0x54a01b3f,0x888d8376,0x6ac3eea5,
  209530. 0x723277b1,0xb84d9a9a,0xe11dbbbf,0x99132691,0xabb67178,0x597717ae,
  209531. 0x8bb14ac8,0x4c213526 } },
  209532. /* 20 */
  209533. { { 0x95532833,0x2e6fe0a6,0xd626d067,0xabca228e,0x649e73bd,0x22aef3d9,
  209534. 0xf03c4c0c,0x2083a87a,0x35169b45,0xe954e75d,0x74506a89,0x577509ee,
  209535. 0x2aeacf90,0x49cb276e,0xfa409f91,0x08275d77,0xf0bbd6b9,0x61eb6f3d,
  209536. 0xe4132704,0x948202cb,0xb1c498b1,0x35f3fc21,0x361fee59,0x76c68ba8,
  209537. 0x50e051f3,0xa18cbbd9,0x318e7042,0x2384a879,0x80dd1e8b,0x292abead,
  209538. 0x5c37c334,0x65713c29 },
  209539. { 0xceb77b9a,0xdccca8e9,0x23b69469,0x2f97e727,0xa01d6b28,0xc76abee6,
  209540. 0x5abecdfe,0x3925203d,0x29290d70,0x89448082,0xb0314438,0xf9931424,
  209541. 0x7cd447c3,0x04209df1,0xc855c827,0x7c6f2059,0x56c0e069,0xd97d7862,
  209542. 0x412d94c4,0x5a9db6fe,0x994c41dd,0x19a64591,0xc89e21a3,0x12348aa1,
  209543. 0xc6a03f0e,0xd6904b50,0xa616feac,0x55c15156,0x7cc7693b,0x4e36d1b5,
  209544. 0x3bae3c38,0x6b0e996c } },
  209545. /* 21 */
  209546. { { 0xcceced00,0x32789fab,0xe5b7aa66,0x3237e71a,0x2ddebcdf,0x87b2e269,
  209547. 0xb61dad8f,0xb7245120,0xd35f803c,0xe11e5e48,0x98e50f0d,0xfb4df5d7,
  209548. 0xbcd2ab92,0x60ee68b4,0x1ce3363d,0x98ab2f5c,0x7cd42647,0x15ba39da,
  209549. 0x83f4fb3f,0x1a6572eb,0xe56f08db,0x0f77de88,0x172562c2,0x1743761e,
  209550. 0x8a58f0f4,0xbe349ff8,0x84d1d6e2,0xe04da71b,0x9e9ff3b4,0x368f0342,
  209551. 0x678223f8,0x4022a205 },
  209552. { 0x83847375,0x527bbd05,0x3f451af0,0x3ae56b62,0x4b2c7f18,0x6198f24d,
  209553. 0x4525b98d,0xee323f5b,0x0e0884b5,0xa9d8d39a,0xfb12c776,0xd005d7f6,
  209554. 0x708bc154,0xd71c483e,0x742541bc,0x8ca6fd28,0xf8397ddb,0x0af3dccd,
  209555. 0x3eccf243,0xb80d3125,0x58d81b8d,0xc743a108,0x71391f68,0x3f48eb21,
  209556. 0x33bb657f,0x493aff88,0x07e47e31,0x1d15ed66,0xe08279f6,0x10159b11,
  209557. 0x24a6a956,0x312179cb } },
  209558. /* 22 */
  209559. { { 0x07615ac2,0xa94cc3ca,0x121ad581,0x85865e64,0xa7986b79,0xae47616f,
  209560. 0x9d5e0f1d,0x395a40eb,0x3d9457ea,0xa9143264,0xfa2865d9,0x8de6d6a3,
  209561. 0x1014ae8c,0x0771db96,0x976a87cb,0x77a7cce6,0x143a0f60,0xa7de42e1,
  209562. 0xd993d934,0xe203cc09,0x98ec4c3d,0x92018693,0x3a25df4b,0xd77546d8,
  209563. 0x62b02d6b,0x0ad9eb47,0xd05a7189,0xfaaaf208,0x431221bb,0x5238181f,
  209564. 0x733511ea,0x417d6c78 },
  209565. { 0x0e91e9a8,0x3cbd81b7,0xc370d6b3,0x73340418,0x8eaa2373,0x825db10a,
  209566. 0x6c7d6756,0x8f2b09e4,0x94c33ded,0xe288ee9b,0x1695e3fb,0xcd8426bb,
  209567. 0xdce9e888,0xa6176c86,0x6165e362,0x3f4c8922,0x6063fb09,0x514e411f,
  209568. 0xc8f9e04c,0x6907ac20,0xdfd2ad61,0xcef7469c,0x8452199a,0xba30bae4,
  209569. 0x12ac3462,0x30681293,0xc92d482d,0x011be873,0xe8330995,0xff4cbf89,
  209570. 0xd1470a0a,0x02189d52 } },
  209571. /* 23 */
  209572. { { 0x92599c69,0x73e419dd,0x7fec32ca,0x5b94221b,0x09bbfbfd,0xb2bf9bd2,
  209573. 0x63ed895b,0x61ea97a4,0x3f486f79,0x6609146b,0xfd141a39,0xbd1c7a05,
  209574. 0x83d64135,0xc79ec8cf,0x9883507b,0x7f8fd42f,0x17b3d027,0xafcb53b7,
  209575. 0x67ca5a21,0x86658dcd,0xcd149786,0xa6a6c0ac,0x34b95067,0x16f3d70e,
  209576. 0xdf44958c,0x371208e3,0xec280212,0xd2dd64e6,0x30782c71,0x33b2c4ab,
  209577. 0x521176fa,0x7bbf8abd },
  209578. { 0xa78b981a,0xbe9e4aaf,0x304ec828,0x788b4e36,0x3959dea3,0x0c45cf39,
  209579. 0x240b39c7,0x70a9bdd3,0x28383b7d,0x499cd7dd,0x307a1026,0x30690b2e,
  209580. 0xee92f1b3,0x2262d598,0xb4725a48,0xc62d77de,0x7bc3aa0e,0xa16f25bc,
  209581. 0xd15ef7fa,0x62dd8b65,0x0b96d68f,0xd979221d,0xa00f1906,0xb92885c3,
  209582. 0xeb74c740,0xfa476b9b,0xc7576222,0x217ddbb5,0x5788504f,0xc2782c30,
  209583. 0xf812716b,0x860d096c } },
  209584. /* 24 */
  209585. { { 0x4d79bbf9,0xfebc337d,0x69f74f80,0x5d53eab8,0x33104d53,0xff36a095,
  209586. 0x196f8b97,0x2ab820da,0x75ce6909,0x961d3d1f,0x04683754,0xb197ec04,
  209587. 0x93a6cb9b,0xa68ce1bf,0xc5f021a3,0x503456ff,0x8940ffdb,0xb50a2db1,
  209588. 0xef004209,0x77c50f8f,0x04965875,0xd635d177,0x8bb8770a,0x725766d9,
  209589. 0xa078e53e,0x8e19b028,0xf9fc8378,0x364d4cca,0xf0dd39a0,0x1a3df411,
  209590. 0x03adf920,0x7e80e442 },
  209591. { 0x539a1ddf,0x4b5f8a57,0xee486562,0xd248e7ae,0x816021e1,0x1c7b491d,
  209592. 0xfd36d2c4,0x2e7b871b,0x0aec00d9,0xda38b504,0x6193f1b3,0xf2827612,
  209593. 0xfb1f78d6,0x69c3fe86,0xe827ac33,0x56c8b786,0x3487c8f7,0x1687f6c7,
  209594. 0x19dee5bc,0xab8f2217,0xff399418,0x04e8473f,0xa9027c80,0xf384c014,
  209595. 0xaa1d2e28,0x9967be9a,0xe065eef1,0x869686d3,0xc7bd837c,0x737c6b08,
  209596. 0x9e8bd863,0x5dcab5d1 } },
  209597. /* 25 */
  209598. { { 0x9a7d772b,0x0784283a,0xe540959b,0x6b49e525,0x86414ab5,0x546bb008,
  209599. 0x9d74b2a9,0xd4448162,0x203b0b1b,0x267890ad,0xc8d3f86b,0x1e7a82bc,
  209600. 0xd85a83c7,0x1352bfb5,0xfad07ccf,0xf29f16e3,0x41e0c43f,0xc02a63b8,
  209601. 0x6b379fef,0x904f22c5,0xb1244f26,0x19d8a653,0x3a28bdea,0x6635b6df,
  209602. 0xf6d455ce,0x18b68851,0x9cff3735,0x74ac2818,0x8b2cbdab,0xad40f9df,
  209603. 0xadc9d498,0x08cc2d9e },
  209604. { 0xc170c84b,0x2e6a6866,0x5a49a484,0xbb989e8b,0xd04c8992,0x7b0e00e0,
  209605. 0x61b3a423,0x55ad3478,0xb0d01899,0x3c952450,0xe3100cb3,0xe3922155,
  209606. 0xf03276d0,0x19265b6e,0x76d42b53,0x0fe8595a,0xfc6353b6,0x0a96dee0,
  209607. 0x246f893e,0x761e0dc8,0xf0a74cba,0x4ec902be,0x3fdfad9b,0x61008684,
  209608. 0x4fdb6975,0x5d6a60e4,0x7ef7590a,0x3f53aac8,0x12870a37,0xd29e6be0,
  209609. 0x55aa55b0,0x991fadc1 } },
  209610. /* 26 */
  209611. { { 0xb4844ffe,0x82bc4b0f,0x60f8b871,0x73922714,0x4ce3f1f3,0x8ac000e2,
  209612. 0x163519ec,0xf0d548b4,0x88288b5f,0x7aaf842b,0x2bdc9a70,0x9e8b0c4c,
  209613. 0x4ba5fd67,0xa06d5152,0xf93cdec3,0xd0b1afa0,0xdf89f8f0,0x280955ba,
  209614. 0xeea32c92,0x86cbe92d,0x3fe05be4,0x0cae3f99,0xfa6919aa,0xf2607095,
  209615. 0x6e0f1b8b,0x0f54741e,0x30ecf988,0x2aed1f74,0x734991d7,0x9296f76b,
  209616. 0x259f0fe9,0x66cf8d28 },
  209617. { 0x226f5868,0x9b01905b,0x16909e9e,0xc102e88c,0x4a37eb54,0x2bd08916,
  209618. 0xc9816323,0xf72253e8,0x86bac53c,0x37f84e9d,0xafeaaaf7,0x2e352454,
  209619. 0x2ca0046e,0x67c86f77,0x6663372e,0x86bce50e,0xb6950a04,0xf6a3a960,
  209620. 0xfc1aba93,0x61f994d7,0xc1326e6e,0x1957c12b,0x2e56b005,0x9b658fe4,
  209621. 0x8592740c,0x9cd297fc,0x177f26a5,0x7654ce9b,0xa79d2ebb,0xaaa699db,
  209622. 0x0ecb6448,0x5fca0c5a } },
  209623. /* 27 */
  209624. { { 0x569a6663,0xe26e25f3,0xe6aa4ca7,0x09597ee7,0x8d18b80c,0x25a4cda6,
  209625. 0x22926730,0x450602b5,0x07387209,0x9af5f650,0x26733a53,0xfeeedb34,
  209626. 0x86572951,0x0f5ce768,0x8398ae9a,0x872a360b,0x2b30f6c3,0x60347a80,
  209627. 0x1a162158,0xd2113b23,0xee6c6dec,0x6fd9cf92,0x5cbcf9e6,0x85f0a5a8,
  209628. 0x2ba3fe84,0xd7a5a6e4,0x51ecd727,0xaafe6720,0xa2081a10,0xe09c6bb2,
  209629. 0xb973b0b4,0x657acbf0 },
  209630. { 0xc274c8d4,0x3130466f,0x30a994d1,0x42765176,0x7079435f,0x217258ca,
  209631. 0xeb897a06,0x44850406,0x561ee130,0xf38dfeee,0xaa1778bb,0x11f4facf,
  209632. 0xb9abb9e9,0x765c6617,0xd8f10932,0xb135499b,0xa73b9159,0xc0eb6337,
  209633. 0x6f7e8b6a,0xf2c1ccf1,0x187def53,0x5b32c03a,0x830b9c62,0x89ad1d49,
  209634. 0x2f10e538,0x1735eae3,0x9d5f55bc,0xb1cbd9c2,0xe539db0d,0x42428c47,
  209635. 0xc852b3bb,0x3d2da412 } },
  209636. /* 28 */
  209637. { { 0x871f2865,0x97702b6e,0x142920d6,0x56cb639f,0x45b58611,0x328522a0,
  209638. 0xf3b13812,0xf3943ad1,0x712206e8,0xe6c2200a,0xa34d59ea,0xc2890e5a,
  209639. 0xf6b7f759,0xab52fd40,0x180bf567,0xf522c8de,0xaccee396,0x181e97b2,
  209640. 0xc4ea5cbb,0xe0375819,0xab51d3ef,0x0d9985e8,0xbcb50fd8,0xe26c96ca,
  209641. 0x97e1c80d,0xfb9d6b13,0xf796357d,0x582b1814,0x07f4c7fb,0x89a78221,
  209642. 0xc0357e61,0x02aeef2d },
  209643. { 0x2c7ec9be,0x2ba7926f,0x7258b201,0x292f307e,0xc6fa6b4a,0x74e62a10,
  209644. 0xe2bcc5ab,0x80c08549,0x7bb8c073,0xb4160db8,0x329f194d,0xd5ef0529,
  209645. 0x6dda4a9c,0x0eb8da14,0x15ea23d1,0x0b5d43d2,0xfc34bfae,0x6cebef02,
  209646. 0x848757a7,0xacd364d0,0x2d34cca3,0xc1401368,0x1d2d95e2,0x09ca6742,
  209647. 0x786eaa28,0xc3fd1d6e,0xa2965fec,0x9eb1136d,0xc0779203,0x48871baa,
  209648. 0x4b15aeb0,0x6b446c01 } },
  209649. /* 29 */
  209650. { { 0x25e8fe80,0xc819eb2e,0x98238a17,0x2b5f7906,0x81e41849,0xd6f1e996,
  209651. 0x98ea6d45,0x58ad8ad6,0xbfd02e40,0x5bae5ad4,0xa812416d,0x016dc327,
  209652. 0xa3347ca1,0x8b31a985,0x82a65391,0x0b4da610,0xb48c35fb,0x1cb91b2d,
  209653. 0xd2aaf8c4,0x9e96817c,0xcdfdcdc0,0x1a630483,0x12b69254,0x70559361,
  209654. 0xf8a2a097,0x5fdcd712,0x35cc5281,0x59ab623a,0x932b6095,0x30c8ebe0,
  209655. 0xb08e052f,0x8613424b },
  209656. { 0xb2231d8a,0x28902063,0xd9a61667,0xb0f62329,0x071a9f27,0xaafa0fe7,
  209657. 0x603f047e,0x6bcd8960,0xfd92a1c3,0x118cca76,0x71d483b6,0x3414e62b,
  209658. 0xba705262,0xa123ccdd,0xfd9b5c5a,0x1a576437,0x4c8d0fa3,0xa5301bc2,
  209659. 0x102427cd,0x96f0ad44,0xd3aa6c02,0x0e6fb5e0,0x072a3996,0xcd8c4880,
  209660. 0x840d3fad,0x4dafca12,0xde91d541,0x29f4ca3d,0x8441734d,0x0037c598,
  209661. 0x9ccfe57c,0x86333a99 } },
  209662. /* 30 */
  209663. { { 0xecf53b40,0xd213a751,0x2f78a542,0xcff2c6f2,0xf13ae56d,0x0f59f0e2,
  209664. 0x0e61748e,0x91f8ccbf,0xd72c4145,0x0aadecb9,0x4c9cdcb7,0x6b2ed852,
  209665. 0x1eaffc70,0x8e00b72c,0xaa728102,0x89b24285,0xb679cafa,0xaa7ea7e0,
  209666. 0x4f0a6f6f,0x5d2b8c26,0x0e804397,0x7ed7b173,0xc8573049,0x5a93eb45,
  209667. 0x0986e93e,0xc92bf5d4,0x6a20c0af,0x526b5a9c,0xb99dc3af,0x0adf47c9,
  209668. 0xba202cc9,0x12b25fe2 },
  209669. { 0x33eea395,0x09b8d78a,0xf633fc5c,0xc7a93618,0x270eceef,0x7e821629,
  209670. 0xc628ed0c,0x524779b8,0xa1d68939,0x91db5ca1,0x586edc90,0x8626e18e,
  209671. 0xfeb3f3bf,0xfe023e8b,0x0250171c,0x6279fde1,0x55e172de,0xe52ec7dc,
  209672. 0xc6d4ca45,0x445e8695,0xbdbc10f1,0x42de3878,0x6fc3835e,0x2b114de8,
  209673. 0x7e10b652,0x9faba456,0x390e78fe,0x4111d82a,0xaedf0aca,0x576b61c2,
  209674. 0x74accb74,0x216279a9 } },
  209675. /* 31 */
  209676. { { 0x4047f747,0xc14cdabf,0xc1315a1e,0x03ca233d,0x40e5d0a7,0x59e7cbd3,
  209677. 0xbb413869,0x1fd0c4e9,0x0f01fbd8,0x189d08b1,0xa76b823d,0x50449c42,
  209678. 0x398b00a1,0x81c224a1,0x8e8179e4,0x08084e4f,0x698e41e9,0xfd8af994,
  209679. 0x5610bf2e,0x1e30e37c,0xa7d2790f,0x4e6a043f,0xb3195388,0x9d96e60c,
  209680. 0x03799dfd,0xe75f986d,0xf8ff902f,0x3b4a8f11,0x7588416e,0xfa945378,
  209681. 0x9827535e,0x20683e3f },
  209682. { 0xd0378878,0xcb582e26,0xa7945787,0x9e214c23,0x8f6688b3,0x13d000bf,
  209683. 0x40515270,0x7548d4f5,0x40111f5d,0x7113c15d,0xa8bff902,0x3bf5a526,
  209684. 0x9b4945cc,0xbda6b010,0xbc2f3a05,0x83dcc74e,0x43efdfa1,0x2aef6284,
  209685. 0x565c5bf4,0xd2e60ee9,0x592f243a,0x4f0fa10d,0x1bc3bf51,0x6ae58b32,
  209686. 0x60576a74,0x813b0868,0x4d73081a,0x0bc023f8,0x32dcee59,0x9fd03aa0,
  209687. 0x27d6c795,0x5e416bf5 } },
  209688. /* 32 */
  209689. { { 0x026cc23c,0x24313760,0xb5b29058,0xf819aaee,0xc5d2ee17,0xa92272f8,
  209690. 0xee5cc402,0x8048e7cb,0x77def07d,0xdbc7d6ee,0xf6af821e,0x61d69244,
  209691. 0x996cbb89,0x5f7966ed,0x96a155a4,0xf81b17ea,0x03f3ed56,0xb2d9ef70,
  209692. 0xe882a5b2,0x5e6e5906,0xae947180,0x86fa1072,0x658c76f4,0x34d9fc51,
  209693. 0xcb035aa0,0x9f603dc0,0x75be6481,0xb7b39feb,0xcf04a9ef,0xca87554a,
  209694. 0x87b4fde3,0x4ff682ec },
  209695. { 0xd0a10ad5,0x3125627f,0x968e6f45,0x7fd45c72,0x806a1163,0x2981bd6b,
  209696. 0xde5033e3,0xb92de1cd,0xbf4f8988,0x3b44b45e,0xdae7e1dc,0xca1b9896,
  209697. 0x0778d878,0x52166e5a,0xa5116847,0x82d472be,0xf2895445,0xfbdd382a,
  209698. 0x5d6ec4c9,0x22ed1602,0xb6552b02,0x3614eb1c,0xa1e6210f,0x63c5df73,
  209699. 0x021a74a7,0xe9160285,0xc65cbd4d,0xa44ca400,0x0f15e299,0x48cb187e,
  209700. 0x3402507c,0x51eb818e } },
  209701. /* 33 */
  209702. { { 0xb92100ab,0x1fc1d178,0x9605b839,0xdf2e3d60,0xb71e59d0,0x12a7c255,
  209703. 0x14fcbe04,0x3f8b6675,0x59fd06af,0x0e8a3935,0x12020d07,0x56326502,
  209704. 0x528e7be5,0x6696fcd1,0x0c7b7654,0x6588514b,0x5912a5b5,0x0cd80f8c,
  209705. 0xf324cb7f,0x8bafef04,0xc6da3d75,0x6b53eecf,0x31d1df2f,0xedef48d8,
  209706. 0x73812b6d,0xf336b965,0xee626031,0xc82eae4a,0xd244f09b,0x300abd32,
  209707. 0x31d9647f,0x8b0af955 },
  209708. { 0x2e603544,0xb770180a,0x221acd9e,0x2b573ac3,0x62407032,0x3a17f665,
  209709. 0xb89abc3d,0xad3e74ad,0xd793225a,0x8a3d2e3a,0xef02564b,0x457bba04,
  209710. 0xfc2dd2b5,0x8875652f,0xe67143e8,0xd2905d15,0x02e48d70,0x6d884b42,
  209711. 0xc7636a57,0x06f99219,0x35e378df,0xa8dc3421,0x10c64a02,0x95c1d73d,
  209712. 0xcc157a66,0xcd6a4ece,0x8e24a354,0xbadcc1c8,0x9839329d,0x8024f1b2,
  209713. 0x4da48ad0,0x5363e549 } },
  209714. /* 34 */
  209715. { { 0xe23fc641,0x1f5523b7,0x86667063,0xfe54e72f,0x8e009d2f,0x294a15f5,
  209716. 0x8c57f5e1,0xf203997f,0xb16d64dc,0xa229724c,0x4baa2ffb,0x697be4fd,
  209717. 0x0a6e8ed6,0x3f507e46,0x78508536,0x0afe3a5d,0x95408208,0xeeef6cdd,
  209718. 0xf2c4237c,0x701fd889,0x5c385253,0x496d883a,0x72a212f1,0xe25c67ed,
  209719. 0x1ff78fcd,0x4b416783,0xc16f4146,0xe9967004,0xc45b0697,0xfa45c3a1,
  209720. 0x3fbd30c3,0x63334018 },
  209721. { 0xa2fbbbce,0x39c9a0cc,0xaa0cb744,0x876f6e5c,0x3438ece3,0x9ce6010e,
  209722. 0x13802d82,0x0aad148e,0x9cd45a1b,0x9c3e5c60,0x7bcfc1e0,0x875cb859,
  209723. 0xd8584dd0,0xb19ff790,0xd81c2a2b,0x2598b81e,0x02be07e3,0x118bdf2f,
  209724. 0xb9765ce9,0x074fc8ee,0xb24f95ae,0x125e9d88,0x0c98f09d,0x3bb12cdc,
  209725. 0xa0b74b27,0x4a6aee07,0xc08077ce,0x4723d2f9,0xbea8026f,0x959447d6,
  209726. 0x16280b73,0x93a7075c } },
  209727. /* 35 */
  209728. { { 0x715b27f9,0x26bbefe2,0x2a280923,0xa935a5e2,0xfd58a26a,0x5ddf23af,
  209729. 0x7c138694,0x54c83e16,0x892a2153,0x44799bc9,0x9b8d09f5,0x4e6e4710,
  209730. 0xd588ea68,0xc63af616,0x883ab1b6,0x5e896706,0x3d209336,0x3c1393a0,
  209731. 0x92c23dda,0xd02f2921,0xdcf6ea43,0xab70cb7a,0x791559e1,0x12434ea8,
  209732. 0x6d70ff0b,0x040680db,0x2832ba45,0x1a10fe52,0xe5f0cb8f,0xd69f9c08,
  209733. 0x44b141fd,0x1a7422ac },
  209734. { 0x9f40b675,0xc3a9dd2e,0xfcc71f39,0x2a7c6603,0x1948e342,0x18939a61,
  209735. 0xed0ab484,0x8f3b6158,0xee31ca6b,0xa3aa7d97,0xf7a8db63,0xbc1e865e,
  209736. 0x2c7c62e4,0x315f8c09,0x9f5c6d0f,0xa260788f,0x4b6f3ec5,0xb1833129,
  209737. 0x36b4d849,0x73adbcd6,0xbc699a9b,0x66e14890,0x2a1175e7,0xbf3790d8,
  209738. 0xfc53ca4f,0x7f43605a,0x87ff6091,0x577f6c47,0x600c82b6,0x827c7552,
  209739. 0x9d25599c,0x0944d630 } },
  209740. /* 36 */
  209741. { { 0xe6ab9620,0xcfdeb63e,0x786cd808,0xdff4fa6d,0x456320b3,0x145edd82,
  209742. 0xc4943915,0x2ae5f862,0xb73b3f87,0x9508e813,0xe52f97a9,0x3bd805f3,
  209743. 0xc9829b62,0xf71b5c28,0x86e0cefc,0xb394c70e,0x23bdb36e,0x534fb1a9,
  209744. 0xdbe27e5a,0xd64f5862,0x83ab6169,0xbae23df3,0x27c828cb,0xdd6df1b1,
  209745. 0x3a307a8a,0x1901899f,0x811ddf66,0x36cc8659,0x79943b77,0xa3cb7774,
  209746. 0x6fd86576,0x7d89f383 },
  209747. { 0xc9f92b2b,0xf8564242,0xc46e32bd,0x700c6a75,0x7f99a5c5,0x93e768b7,
  209748. 0x03149568,0xb6efe858,0xc2ce6709,0xbbfe8a19,0xee6ec493,0x721a3b1b,
  209749. 0xc371c28d,0x26eeeea9,0x15177e1d,0xd798115e,0xb068a5a5,0xd7bf3bce,
  209750. 0x46d2b4b2,0xdf8da220,0x59be9dfc,0x3df0995b,0x77640b79,0xc96897bc,
  209751. 0x5a2bd3c5,0xce0cf4c2,0x89afe744,0x16f45d6e,0x3a8509bb,0xb53f3acb,
  209752. 0x63f2a6e6,0x449af81f } },
  209753. /* 37 */
  209754. { { 0xa16d9377,0xc2fcf132,0x7e1a2f9e,0x9ab377b3,0x86d19ae5,0x72e1a12e,
  209755. 0xd013bbb1,0xd2b12e66,0xcb5f66ba,0x0972e055,0x399eab50,0xd11de1c0,
  209756. 0xc65f5ec2,0xc1f314fd,0x8a9ff593,0xfc311841,0xe05246e6,0xdf73c1ec,
  209757. 0x1625056d,0xc28d1363,0x6fb25e19,0x30a9dbd7,0x845cd2d7,0x049ed244,
  209758. 0xd36e852d,0xc779b83f,0xf68c8a83,0x85a35fc7,0xc95e8033,0x299bf1e1,
  209759. 0x20891af5,0x0e8617c3 },
  209760. { 0x67c81b5c,0x53720602,0xe737873c,0x2fa89dcd,0xa8144fd0,0x2a7430b0,
  209761. 0x26208c83,0x3006c5a7,0xd8ea40f5,0x4e066660,0x896413a4,0x9dd025f9,
  209762. 0x46b9149f,0xbdf380cc,0x0a125cc2,0x80156619,0x52793c37,0x04d6a3b7,
  209763. 0x6b7a62f2,0xb6001374,0x585d5978,0xa9cfe268,0x8395fe66,0xdcad0cb8,
  209764. 0x46b261f6,0xbab468fc,0x9d9d9218,0xca0ef5ef,0x5e452402,0xc507d4a8,
  209765. 0x326cf687,0x6f4404f1 } },
  209766. /* 38 */
  209767. { { 0x4febd3ff,0xa3e1920b,0xfdfd2bba,0xca6234d8,0xe19a9829,0xb7d1af2a,
  209768. 0xc6f5bc20,0x23de1610,0xdaa39ca9,0xe204dbf3,0x6d8c70ab,0x2a2de9b8,
  209769. 0x7c9d370b,0x272e0c37,0xe565510e,0x80914c06,0x57cbb6b0,0xb611e7a8,
  209770. 0xd8266a6e,0x076fc6ef,0x3095801c,0xdfac34ee,0xb9e24063,0x69ff40a2,
  209771. 0x787aa5c5,0xa7ba31a9,0x33c70cd2,0x0e4d1fdf,0x6895f074,0x903e3132,
  209772. 0x7fb671e2,0x905771f8 },
  209773. { 0xa4062bee,0x5199ba0d,0x94d7d9f9,0x18e7238c,0x1e0922c0,0xf53f29bc,
  209774. 0xb12d855f,0xde9b2a81,0x6d68ca29,0x649f3eed,0xc50c097f,0x64adfc34,
  209775. 0x9db398a0,0x81964ab9,0x7a587224,0x00d59c47,0x74c5903a,0x09fea396,
  209776. 0x15043dd0,0x6aafd8ee,0x5f1ecc20,0xc5721a6e,0x0db9b7b4,0xb6d6a483,
  209777. 0x66c8d52a,0x06ffc617,0xacc82a27,0x3de241d6,0x27f2f7a8,0x0605f052,
  209778. 0x6404decc,0x6a22953b } },
  209779. /* 39 */
  209780. { { 0x74fce389,0x92452d8f,0x2afa5564,0x059634c0,0xf0ed7825,0x9377ccbb,
  209781. 0x37718e0d,0x89f4045b,0x9fa69a4d,0x11074e7d,0x7295b0ba,0x5d70bb07,
  209782. 0xf107ede6,0xb22d54ad,0xa1a29c7b,0x5c39a3d8,0xd795e3ab,0x37236c02,
  209783. 0x2b589951,0xf7282d00,0x5790bee2,0x5e2265be,0xa8e65ea2,0x91e0ea11,
  209784. 0x6001cebd,0x0e71a708,0x2c1c5402,0x16900f5a,0x357f6981,0xc3b2d5c0,
  209785. 0x619e3427,0x528c9ea0 },
  209786. { 0x5f26c577,0x1edc86b4,0x9438bd45,0xf8074708,0x792582a7,0x2dfe1013,
  209787. 0xde1e569f,0xe08eaca0,0x9a55a356,0x5f952efa,0xe4976216,0xa4d80b53,
  209788. 0xcd5d71f2,0xd2b65855,0x66cea3f0,0x246704bf,0x492323ca,0x193f641f,
  209789. 0x9adb1325,0xa681855c,0x2d19d652,0x86d522ce,0x5b82ed7b,0x53609f10,
  209790. 0x8e150d29,0x3b0f0094,0x0b13e891,0x23ad8bfb,0xf794b449,0xcbb1556c,
  209791. 0x738bcf57,0x200f9093 } },
  209792. /* 40 */
  209793. { { 0x8388387f,0xf9b22fc5,0x28e883c5,0xcf26f170,0xd1b7973c,0x447cab90,
  209794. 0xf6ec9171,0x8d5d4ea2,0xc30cdbc0,0x2e16f498,0x48623c2b,0xdc92910c,
  209795. 0x30dbc545,0xeb1491b0,0x14de21b0,0x631deb2e,0x2fe830f4,0x04a21066,
  209796. 0x379c1f3f,0xa4c6979c,0xfb06a795,0x8a732b68,0x1619dfa9,0x3a44327a,
  209797. 0x8dbe2c9b,0x91a307d3,0x03989fea,0x939bc8d2,0x0f4a331f,0x3daabaf2,
  209798. 0xdd0f55dc,0x5c307e98 },
  209799. { 0x35b233da,0xbbc4e0c4,0x22f6f985,0xe3d29085,0xa8b02468,0x99dd2d21,
  209800. 0xa96916e7,0x978f40e9,0x614bcced,0x0327d86c,0xb290762c,0x95e95502,
  209801. 0xa879f2ed,0x0ffd2197,0x50e0bd33,0xc4365137,0x0827c4c4,0x26c3148a,
  209802. 0x3fcfc0b2,0xc79812a8,0x31928589,0xc3d8d17e,0x8830f42d,0x8b572cfe,
  209803. 0x4b07f83f,0x7cd9ff92,0x0a51148f,0x331ca950,0x4c59f9ac,0xd0c53968,
  209804. 0xc1434785,0x1df16dfa } },
  209805. /* 41 */
  209806. { { 0x68bcacc3,0xcc7bb4ac,0x430f58cf,0x06ded34f,0xd461855a,0xc59f9f4f,
  209807. 0x45c9f0bc,0xf5491994,0x4375c892,0xdc5f7ec6,0x3c85983a,0x1b8708f1,
  209808. 0x82fcd087,0xb32a5cc4,0x2d6b4c0f,0xefdcdc35,0x8ac6fb2d,0x4bb24f04,
  209809. 0x33906471,0x5982d4f5,0xb83a3ac4,0x162eb52f,0x2337a223,0x7130df28,
  209810. 0xcbc3dbd3,0xdce7b802,0x2467ac0e,0x8b395959,0x1b56717e,0x21d3d2e8,
  209811. 0x46512617,0x729a7f50 },
  209812. { 0x8420f90a,0x874ed1aa,0x0fe4c855,0x6368e19e,0xb0be74af,0xb62d4aaa,
  209813. 0x8ca60ca9,0x76fcc480,0x7645a867,0xf310b5a5,0xddb1b24c,0x131bac9b,
  209814. 0x2dea5b44,0xef77d71d,0x72fcc64e,0x4706d210,0x673d77f0,0x29b92691,
  209815. 0xe89e0663,0x22e00bf3,0x74077d40,0x472d0cd3,0x829232e2,0x3e21040d,
  209816. 0x38dc8533,0x2f916dfb,0x14b8f667,0x48bbb59b,0xd44be19d,0x19de9f4a,
  209817. 0x232d9d5c,0x7f6d3649 } },
  209818. /* 42 */
  209819. { { 0x6e794819,0x3bd064de,0xf82ebda1,0x5a6b694e,0xb91e2804,0x1f017fe0,
  209820. 0x07a43cd2,0x190d31f3,0x630433e9,0x6c26f226,0x0abfdcb4,0xba488aa7,
  209821. 0xa46411c0,0x418d9085,0xbffb5880,0x1b934fe6,0xe200f849,0x75d1e237,
  209822. 0xa55413db,0xdf04d63f,0xe23b3f77,0xe216ed75,0x0f91bd30,0xa05866cb,
  209823. 0x7729c509,0x84c395d9,0x452ab2d7,0xec97e188,0x0093d686,0x8cb7c1f9,
  209824. 0x628f086c,0x2d032395 },
  209825. { 0x4a44b4c5,0xa81c9407,0xcc702c98,0xb9846879,0xceb0dc97,0xcb502287,
  209826. 0x6e3aa321,0x30301126,0xe4c256c2,0xc0ac8763,0xe55b4845,0x65034d20,
  209827. 0xf240f35b,0xaa96a040,0x7cf7eedc,0x046d26d3,0x3b810656,0x62a5a8e1,
  209828. 0x83d70c2b,0x86044b97,0x59e4da8f,0x2fbaff88,0x5457f5d1,0x929d901a,
  209829. 0xb531b757,0xd29e1eb2,0x9e4e9739,0x214dabdc,0x4eaa9bd9,0x5bd724fc,
  209830. 0x1ef9bb9b,0x734c12b3 } },
  209831. /* 43 */
  209832. { { 0x92f9b086,0x98fe3c2e,0xb3fd4544,0x4641b93e,0x5c02c65c,0x47ce208b,
  209833. 0xc4f03242,0x8a52dca1,0x679d29f6,0xb5ec17d9,0x9406f5f4,0x11d2fed0,
  209834. 0x0d9ba811,0x260f63dc,0x15472a3f,0xde2b056f,0x007290e6,0x1b170d9f,
  209835. 0xb6b5c8f9,0xa2e23e8d,0xcf34c3ee,0x345a2839,0x1b973ee2,0x9bdc5461,
  209836. 0xbb24d1c5,0x65bda6c2,0x3c6141a1,0x97d52ba3,0x9d2eb201,0x47bb1612,
  209837. 0x21fbe49f,0x7c558a87 },
  209838. { 0x3f350fec,0xb9485a52,0x6a38d4c0,0x016678c5,0x0d5aa64d,0x8ef346a2,
  209839. 0xd96da2e4,0xb85daa02,0x4f647b3c,0x845ec4ea,0x0d5e946c,0xc0d1a6ca,
  209840. 0x4fa9f4ab,0x41d8d1c1,0x9c8b1303,0x43972cc5,0x434ffbfb,0x67e1f48d,
  209841. 0x819d2318,0x350ce93a,0x6ddef23f,0x49f53090,0x200cf12c,0x3c2e6cf9,
  209842. 0x640432fc,0x42691cc1,0x72496b52,0xbfff74b4,0x020a97be,0x44527c9f,
  209843. 0x7b3c4348,0x34cd7dca } },
  209844. /* 44 */
  209845. { { 0x59e7fe87,0xf031761a,0x0047cd72,0xb1eae31a,0xfae30f62,0x27902e68,
  209846. 0xb71db143,0xa666f48d,0x0e0038f4,0x75ee6678,0x02bdd76d,0x3b45ac67,
  209847. 0xa0d6cd5c,0x0d2fb828,0x9d8c5b11,0x27ce7f1d,0x120b5e96,0x141fe0e4,
  209848. 0xb9267c37,0x95a1b984,0xd60312cd,0x5206e589,0xda549356,0x1867342e,
  209849. 0x070c74ac,0x374520b9,0x9557b0b3,0x2703cbb5,0xa6ed8c14,0xf621f59c,
  209850. 0xabf7b887,0x7ceb1cc2 },
  209851. { 0xdb7fd65b,0x0647a5bb,0x36c9457c,0xd8d45cc0,0x9e12718a,0xc6da99db,
  209852. 0xe93a7fb1,0xed1dbbf4,0xbd1566a1,0x4512c95c,0xdbc0c919,0x4861ba00,
  209853. 0x9e7f5269,0x3c6cc298,0x0941aaae,0x67196150,0xc8c538e3,0xbfcf5d0f,
  209854. 0xa25a551f,0xad6e9929,0x17ca0f26,0x90710985,0xfa89ef7e,0x743b78ea,
  209855. 0x71ab4549,0x39d5ea31,0xe6d1c36d,0x7442f3f3,0x059d568d,0x25a683e0,
  209856. 0x227ced5c,0x1f629a99 } },
  209857. /* 45 */
  209858. { { 0xe45a1c3e,0x8925ddac,0x41f7545f,0x72d29365,0x37e7f828,0x45622fcb,
  209859. 0x3e4c79d2,0x88234513,0x9c2645d6,0x5dffaf84,0x994802b9,0x3078f4dd,
  209860. 0x9d339fa0,0x566927f0,0x9fd91dcc,0x9a500a1e,0x0ab0abd7,0xce008180,
  209861. 0x8194e5df,0xd97135a3,0x98adf088,0x9e876307,0x9a45a2a7,0x3baf01b8,
  209862. 0x788b4399,0x6fed6154,0xe77a997d,0x980e5722,0x2a378eed,0xaac90ffa,
  209863. 0x8bd805a2,0x4a75fda2 },
  209864. { 0x55e74cbc,0xd09a8fbb,0xfab18f25,0x737738ce,0x9764ec3a,0x0fc23ad6,
  209865. 0xe7e0ad31,0xc5a7d35b,0xe481cc9b,0xe75e068e,0x3d4aec34,0xf0c2ea99,
  209866. 0x0d4a63c4,0xf1324fe8,0x99b0592c,0x5dbb7c16,0xa7e0f46b,0x442d674d,
  209867. 0xa300faea,0x5a5d66c7,0x3333ac83,0xe83dc821,0x8c408496,0x70ef812e,
  209868. 0x99ef5fc1,0x96e1dcb6,0x1734e862,0x6e2b771b,0x583507d8,0x04629cdc,
  209869. 0x23d8179a,0x5819f9ae } },
  209870. /* 46 */
  209871. { { 0x6aa78811,0xd9969121,0x2103e7c3,0xf64ee8f4,0x22b9e698,0xddf01070,
  209872. 0x4f582cde,0xe6001f9e,0x2ecfac1a,0x24a608af,0x06393009,0x6ef4c784,
  209873. 0xebf72911,0x5262eae6,0x8c4ee5a0,0xddbd0af5,0xecd87bc7,0x875aff90,
  209874. 0x6f24f114,0x2fddb34c,0xe865f172,0x48104281,0x886c1b9a,0x95692426,
  209875. 0x9ef4231f,0x6f5f3208,0xd0a7e82e,0xaf587acf,0x9ac395c8,0xd6571917,
  209876. 0x1364a750,0x7459603c },
  209877. { 0xf41ae519,0x1c2475bf,0x4af8f251,0x34401fb1,0xaefb2c3d,0x70ddfcd2,
  209878. 0x51cdaf08,0x9b2d385b,0x8208bb19,0x8531c256,0x4c33f3f6,0x16c89df6,
  209879. 0x24571769,0xc23cfa99,0x86d010ba,0x2339b51e,0x22638313,0x08db0e8d,
  209880. 0x00fedeb7,0xf769e179,0xa3687ef1,0x3fd96dcb,0x91476475,0xcd046b23,
  209881. 0x0c45c8dd,0xf3ff2064,0xb8343d78,0xefd167bd,0x4b77ee90,0x493ccb6d,
  209882. 0xb3cf7b45,0x33025513 } },
  209883. /* 47 */
  209884. { { 0x35eaaca1,0x36f00469,0x89119102,0x0c384b75,0xe6d2954c,0xcb375665,
  209885. 0xb1e9d6d7,0xcb9199b9,0xc29c2757,0x75852349,0xb8e738d0,0x89cbd1ba,
  209886. 0x5923a427,0x9b8dbe90,0x18fe1889,0xa237793e,0xa742e083,0xa4271757,
  209887. 0x4eebd613,0x8c4979d2,0xd4f2cf77,0x40325054,0x958705de,0xa3b8a091,
  209888. 0x33d999ba,0x1b191bd9,0x3b0fee1e,0xbafefba4,0x3facdf14,0xb3bad184,
  209889. 0x4387561c,0x9328adb0 },
  209890. { 0xf906b872,0xabe84e80,0x78262665,0x705523a0,0x3398ccf7,0xd89c6a7e,
  209891. 0xf55b5323,0x2fab551d,0x0554dea8,0xa0578eca,0x375589cd,0xef26523d,
  209892. 0x864ad750,0xd8fd6242,0x178fe1fe,0x93f27fc5,0x9df87422,0x7b3e6f30,
  209893. 0x3750d054,0x2862e49e,0x5dc038a1,0x7d90c6b2,0x84db682b,0xc1a1ae22,
  209894. 0x9881930a,0x47f3dab7,0xbaf3e0a4,0x30e6bd52,0xf62d25c5,0x0680025b,
  209895. 0xadd0d5e7,0x0aa1f3cf } },
  209896. /* 48 */
  209897. { { 0x22a10453,0xa9822190,0x2a03a10b,0xdd1eb91c,0x96646f3b,0xafbb5d95,
  209898. 0xf38b6fc6,0xa58de344,0xb8cfca1d,0xce47c3e5,0x0f70da04,0xfcd8e16d,
  209899. 0xda262ed6,0xac44349b,0xc56e2f8e,0x9320d87b,0x19138e58,0x9ce3ea08,
  209900. 0xa2b236c0,0xa5862dff,0x8e7efb0d,0x6b0f9a5c,0x16ac78eb,0x4b53432b,
  209901. 0x709b51af,0x6ff43105,0x8f519628,0x08e236f8,0xeed403ad,0x1f93f176,
  209902. 0x9636545e,0x559337e0 },
  209903. { 0xd8fd807a,0x30ddf738,0xab131222,0xf4e0ec9d,0x625afbc3,0x14a2f4db,
  209904. 0x9f12f895,0xd5b70604,0xac3044fd,0xb46f3c23,0xf540148f,0x1b232d1f,
  209905. 0x39b4e554,0x61b458f5,0x0dd70b75,0xf694b24a,0x289581d9,0x0fc64299,
  209906. 0xee5fe22d,0xc05d49be,0x6a18bf63,0x7af3447f,0x7f1929d6,0xe96a1dc2,
  209907. 0xc1551e8c,0x6afe6028,0x2b5d4fa2,0x27dacaf3,0x545c2cb4,0x4a1631bc,
  209908. 0xb0c914d3,0x930070f9 } },
  209909. /* 49 */
  209910. { { 0x69a9bc05,0xd2f32c5e,0x589c4b73,0x0a5c19c6,0x94665f9c,0x095c9e5e,
  209911. 0xbcfb4c39,0x8ab0f293,0x1ddb7c31,0xb9070877,0x66b38048,0x894e9658,
  209912. 0x606bd9bd,0xf19a90cf,0xb6fd2d69,0xcc1d58df,0x461d8a69,0x886dcc4e,
  209913. 0xf9ce4831,0xc455c277,0x765f8a82,0x749a5996,0xc3badc8d,0x2ffc668c,
  209914. 0x9112cdab,0x38018396,0xb243c7cb,0xa98795c3,0x010a2224,0x8775f310,
  209915. 0x587b5e14,0x043a2141 },
  209916. { 0x3a873752,0x7bbe9dbc,0x2f442fee,0xee1493f4,0xc18c2181,0x981ca2c8,
  209917. 0xe29769e7,0x00ce3090,0xde768c5f,0xb4626ac8,0x34d7677e,0x33e9ce46,
  209918. 0xe0fa94e6,0xf89c2cad,0x41f5b5bf,0x04f5cc11,0x2228c12c,0x2565f736,
  209919. 0x0c05cce5,0xf1bf706a,0xbe487c4f,0x5d07ffff,0xa499f1a4,0x3ec43c09,
  209920. 0x98d94800,0x4f4e79bb,0x073f12f8,0x8a335a16,0x0f970d6d,0x4bb5eaf7,
  209921. 0xf24d0ae8,0x18d0747b } },
  209922. /* 50 */
  209923. { { 0x84601faf,0x58d3c77c,0xaf1c1f72,0xc9465be2,0xd116d806,0xff626798,
  209924. 0xd5b0d93c,0x3996c0c6,0x5ec6723a,0x2fa1ad75,0x03ba5349,0x966a8144,
  209925. 0x2ac34d8a,0xdc4c9422,0xed675865,0xddf471de,0x953d528f,0xd8aca597,
  209926. 0x24ebf67d,0xb2e463b5,0x7e25b4d3,0x25824871,0x43159daa,0x23c5adba,
  209927. 0x83357540,0x5458f9c6,0xf938b1a6,0xcf685da7,0xcefed231,0x981a4fda,
  209928. 0x08bb5e59,0x711093ed },
  209929. { 0x401f161a,0x12aa3fc6,0x974c5e87,0xf7358560,0x17b5df82,0x4aa252fb,
  209930. 0xa48e6299,0xb0b82b07,0x29dd847d,0x00234157,0x4529c5a6,0xf1e54d00,
  209931. 0x6d98f538,0xcc1c539e,0x28d3abcb,0x36162b53,0x2a84f0cd,0x75a37938,
  209932. 0x4dee7484,0xf717a81b,0x4c23bf1b,0x16cf35fb,0x787e8b3e,0x7fd1c29f,
  209933. 0x59b79ab0,0xb7da7e68,0x85f6c60b,0x072100a0,0xe7ed48b5,0x31840159,
  209934. 0x4d9c97d4,0x17898bda } },
  209935. /* 51 */
  209936. { { 0xae1b8cf8,0xcd8483d8,0xe9a28856,0x323d4b42,0x204a4bc2,0x7633584f,
  209937. 0xca7a69fa,0x4e0b2228,0xf757bab2,0x8afbda8b,0x6cc5f9ca,0x85b24088,
  209938. 0xd41a95c3,0x47fb4813,0xc2aabe6b,0x3f1bc53c,0x1ad1599d,0xf22cda3f,
  209939. 0xc31ea9b1,0x1b2ec081,0x01614ac1,0x048f304b,0xc6afa7ab,0xce31cee9,
  209940. 0x4140dc3d,0x55af7633,0xdce8abba,0x84b7ab37,0xc7cf3efe,0x50de7648,
  209941. 0x15356ab2,0x73a88dcf },
  209942. { 0x06e83b39,0x3f868288,0x9f44037d,0x477a4413,0x17dbc841,0xf9058b0f,
  209943. 0x54d17549,0x2db64f4f,0xf2307ffe,0xa23cea6a,0x4f126261,0x393efd55,
  209944. 0x10f37f26,0x2f4e658a,0xf4ee1e35,0xa4437ce3,0xa93cde8b,0x64ef42a7,
  209945. 0x939aa901,0x1debc9f4,0x3d7b5cd4,0x44223d6a,0xf88a3acc,0x789a6a11,
  209946. 0x2c608a2d,0x56fb9df8,0xbbf56c06,0xe79db8e3,0x668fa300,0x73c56af2,
  209947. 0xae396a1e,0x52f32b17 } },
  209948. /* 52 */
  209949. { { 0xe714f71a,0x56f524c1,0x9add8519,0xc1be1262,0x65cadbe3,0xad9189d8,
  209950. 0x5a0fb649,0xd88bf5c8,0x21d192d9,0x9efa6a92,0x6f724b6f,0xe3fe8389,
  209951. 0xb250119c,0xec3fae24,0x2ae0d3c0,0x4b6af9f6,0xd619624d,0x8fceba0b,
  209952. 0x2fdb6e3a,0x7dc3092b,0x3263cd29,0xc91da376,0xf95c43bd,0x30c0761e,
  209953. 0xcdeb44d9,0x89136400,0x43c0d31d,0xfd7dce84,0x9871899f,0x78fec3b1,
  209954. 0xefdf58c1,0x79e14d28 },
  209955. { 0x9bb40c55,0xe3822235,0x0ed07a42,0x0a27202d,0x4838c1f4,0x48e6c1a9,
  209956. 0xd864a78e,0x2b5f24a7,0x0c6c55c9,0x7e7f140a,0xce12d508,0xe62c104a,
  209957. 0xc11b1e10,0x9b0a1a7e,0xafbb3dd5,0xfd8a275f,0x9a3b6b30,0xdff354fe,
  209958. 0x46602a01,0x5a105d9e,0x93bb65f7,0x3d371b4d,0x0f82fdeb,0xda5cbf0b,
  209959. 0xde468545,0x4601229b,0xc73d517e,0x505e10b9,0x672ff492,0x77cfa541,
  209960. 0x99566ce2,0x0d8ec28a } },
  209961. /* 53 */
  209962. { { 0xcbeee995,0x014cf73e,0xd491e80c,0xb2eb88bc,0xd9aba5d4,0x615a6cad,
  209963. 0x9304c84d,0x2f7d4633,0x8ab03c9a,0xba0501d2,0x91babb94,0xc8f723de,
  209964. 0x50405772,0xc885f977,0xc7fcb094,0xb5e1d2b3,0xdf96c71a,0x61ee7995,
  209965. 0x3464499e,0xb8c8daab,0x5f607932,0xdb425ddd,0xb1243587,0x70251ca1,
  209966. 0x9fc74340,0x26d7d3be,0xc902ac89,0x8c179310,0x4559a74f,0x72522c15,
  209967. 0xc3734afc,0x86001e27 },
  209968. { 0xe7693947,0x13b00ba5,0x012c062b,0x6478641e,0xe85490a8,0xe1a438e0,
  209969. 0xd9574d5e,0x5173dbbf,0x9bd3ba61,0x9532eb8c,0x5f3ea075,0x1f41bcb8,
  209970. 0x8cbb92b9,0xac1cc247,0x1ef901b4,0x0f34648e,0xd2b3b2ee,0xdd929d1e,
  209971. 0xc3d75bfc,0x470f1eab,0x139cf4d2,0x5cdbc6f7,0xf0424953,0xcd86454d,
  209972. 0x47fcb383,0x1e079812,0x17df930c,0xb9f209b4,0x114ebc00,0x4225fc31,
  209973. 0x347946c1,0x020591cb } },
  209974. /* 54 */
  209975. { { 0x275e0af4,0xe3003721,0xe78a4a4b,0x721141ef,0xd1757485,0x666cfcf6,
  209976. 0x168e659e,0x5fa1d737,0x0e2842ee,0x263e3e54,0x948bd5f6,0xadecc3d4,
  209977. 0x246b104a,0x019de03d,0xf343d818,0xf8a9e903,0x5b0c0d31,0xcb57ba4a,
  209978. 0x51e2765f,0x8246c506,0x6519bf67,0x80c5751f,0xf2119a01,0x5f05c200,
  209979. 0x7821d4f4,0x7e6487b8,0x261c3a06,0x262f94aa,0x72146052,0x56cfe489,
  209980. 0xa1df05ef,0x5119985f },
  209981. { 0xb18586c0,0x5819497d,0xc6eeaa62,0x004415d6,0x97cda28b,0x7c6a46b6,
  209982. 0x7c194594,0x9a149b28,0x4ed3a506,0xb56369fa,0x43c94cb4,0x7092aa66,
  209983. 0xa9e9eee2,0x55bce73a,0x77893509,0x34bb2870,0x06eb5326,0x8af95fb0,
  209984. 0x9638f485,0x87cd0323,0x5ba75bf8,0x29376268,0x9d42d581,0xf32d6f3d,
  209985. 0x65c6d64d,0xa4cad574,0xb2cded41,0x985f50fb,0x9006a067,0xcf34ce0e,
  209986. 0x58a57f9a,0x59eaf265 } },
  209987. /* 55 */
  209988. { { 0x6ec3876f,0x7b407efb,0xf0f48648,0x780c6123,0xbf893039,0x2abb56ff,
  209989. 0x45a91ab0,0x9592eaa0,0x78811b82,0xce5b84d7,0x1f9f3fc9,0x86a71a34,
  209990. 0xf0e7e13b,0xc17fdd86,0x655a0880,0x88ed8297,0x81d5e666,0x75d6dc74,
  209991. 0x1d171797,0xeffc9df6,0xe3f79e1f,0x36ad4c8d,0x2046192e,0xdb15317d,
  209992. 0x274fda62,0x78c9fa7a,0x82dd9914,0x04ec924f,0x3a64971c,0x059d1e38,
  209993. 0x2620bbfb,0x3b4450ea },
  209994. { 0xc776dcdb,0x3db7a955,0x81c8ba47,0x35c4a57c,0x505760fb,0xae285003,
  209995. 0xb3aec353,0xe3e80691,0x47117be5,0x380335be,0x056ccf61,0xe1c47e3a,
  209996. 0x33977916,0x253cfdeb,0xf5cb7ee1,0x3decdfba,0x7cf4b704,0xf3c9794f,
  209997. 0x9ff81462,0x2401680c,0xbe3daa9f,0x4e440e11,0x69f91d8a,0xc5d04377,
  209998. 0xcb5e9c5d,0x4106c7a8,0x33b7d24d,0x191909a1,0x3764b4a2,0xe893c838,
  209999. 0xc429b614,0x4a7fe30c } },
  210000. /* 56 */
  210001. { { 0x2455c7c5,0xe78f3a70,0x70157754,0x5b7636e8,0x7623262c,0xf32c4524,
  210002. 0x1bc780c7,0x2c98b11e,0x915ed877,0xd48eaeac,0x199265f4,0xbb04d3c0,
  210003. 0xcfa5200f,0x6b52b19b,0x93ea3fe8,0xc46a0981,0xba758059,0xd82c733d,
  210004. 0x1896aacc,0xd324bbd6,0xce8ecd51,0xac09a2fc,0x02fc44b3,0x529918fd,
  210005. 0xaaa1784b,0xf0c45e4a,0xfe22085c,0x35626340,0xc50c7d61,0x53cbb676,
  210006. 0x65126b23,0x83fa1ea3 },
  210007. { 0x10ccc646,0x60ac86da,0x7b0451e9,0x2ce0637f,0x8a088610,0xbbbcf630,
  210008. 0x20349982,0x23c19019,0xfc0bcda0,0x707fc39c,0x1bd4fd7d,0x7f4d1f15,
  210009. 0x44713bbb,0xd6a64e74,0xc5ac9e60,0x57bdc676,0x37b61169,0x456c5303,
  210010. 0xdcf40a1d,0xd3451396,0x4997d2c7,0xf3edec25,0xc2c4a739,0x534ae9a4,
  210011. 0x6a6ad2e2,0x1401397e,0x23e95f81,0x20769d4d,0xde98fabf,0xcee007c6,
  210012. 0x931c51e0,0x61409779 } },
  210013. /* 57 */
  210014. { { 0x15156623,0x3ddb32db,0xab7a67c2,0x68137fbc,0x6f19e3c2,0x26011f50,
  210015. 0x89924c61,0x34218b02,0xc6804c1c,0x492a0b0f,0xafaae6a7,0xd65be706,
  210016. 0x0d01be61,0x3b13d23e,0xf87f4c69,0x44545b47,0x04dc1aa3,0xd42236e2,
  210017. 0x3c5161ec,0x6135261d,0xbd88bc07,0x1eb46a63,0x1599d720,0x78c6d836,
  210018. 0x69baf0f3,0xf6955fe1,0x17072820,0x467eebd6,0x3e3a340a,0x2f1b8a2a,
  210019. 0x2d0b5f88,0x636dac76 },
  210020. { 0xb4c80af3,0x94280db9,0x4e3892ab,0x9a189cd1,0xd1477ddc,0x26e702e0,
  210021. 0x68f9f14f,0xe91aee38,0x80baa0b2,0x2864f63a,0x8b714a29,0xacd81f73,
  210022. 0xc5fe7cb6,0x30e1b870,0xb10837fd,0x883ea1c3,0x6b20489f,0x2da27953,
  210023. 0x58a2da5f,0x3aeb2a68,0x03a8fa14,0xe2330bf2,0xdc70b1c4,0xb5c488b5,
  210024. 0x299678f4,0x0a78c4d9,0x25df675c,0x233bd098,0x7b67d368,0x37b5c076,
  210025. 0x4d0bef3f,0x2f6dbdfe } },
  210026. /* 58 */
  210027. { { 0x2e4da7c7,0x2f8472fd,0xae677932,0x708cfc91,0x3dc268e2,0x364af08a,
  210028. 0x799a2424,0x0f10dfe0,0x71d58bff,0xef912d58,0x988962e6,0x6bf35dfc,
  210029. 0x5f47ea0a,0x28b96fa9,0xaad308c1,0x734a79ea,0x9f437bba,0x95730337,
  210030. 0x6cf54f75,0x002cbd8e,0xe7632eec,0x47606dcf,0x53193104,0x404b5ecb,
  210031. 0x0acf729d,0x0ae0897c,0x3bddf1de,0x89628b86,0xf87d7448,0xeced154e,
  210032. 0x458d5d4e,0x5cb6e197 },
  210033. { 0x008c75ed,0x98cef197,0xf6eeaaf8,0x7cf49d3e,0x1875e96d,0x1d6f9e02,
  210034. 0xdd9b0d8a,0xfcec2cfe,0xb9576daa,0x38a61cfe,0x36a7dbb8,0x10003f39,
  210035. 0x23b814f4,0xb37c3868,0xb80e3153,0x9fb66dcb,0x059847a8,0x9e7e2eba,
  210036. 0x35a72770,0xa4ec63fd,0xfc9e0ed0,0x311f3d91,0xd515baa4,0x3c1dc094,
  210037. 0xa08cd4e3,0x75a06ebc,0x2ed5eeaa,0xab617238,0xe1f52c1f,0x2e82bbb0,
  210038. 0x5175d6e5,0x2149d630 } },
  210039. /* 59 */
  210040. { { 0x5f9311f6,0xee1a8e6f,0xbabc1f85,0xc97e3c9f,0xb494209a,0x4fa7c52e,
  210041. 0x19774fe1,0x04c2f51c,0x8555844f,0x5cefd122,0xb5873ab3,0xb53862a3,
  210042. 0xcbed19fc,0x768efdd6,0xee58469a,0xcdc12479,0x3d80c09c,0x11237e31,
  210043. 0xc044c28c,0xdd74a290,0xbd47e287,0x9ee6517a,0xad0ffeef,0xc2421228,
  210044. 0x818d281f,0x4273088f,0x43ec0de1,0xebc744bc,0xb415bd73,0x5b26eccf,
  210045. 0xcb07c26c,0x14e2f350 },
  210046. { 0x4216946b,0x548d2a10,0x7a4bd92d,0x6e801f07,0x43695160,0x5996d0a3,
  210047. 0x63a197c9,0x0f1b5c2f,0x061f77c9,0x79da3c4f,0x93ff7b22,0x1c1cd634,
  210048. 0xa234123f,0x5e61b650,0xf284033c,0x826b34c5,0xc2f34214,0x718b90e8,
  210049. 0xae806ec5,0xa5f35620,0xe324a9b4,0xa2fae345,0x8b53cb51,0x8c0bb95e,
  210050. 0xf9965778,0xc94f6ac2,0x6b9def32,0x07ec607d,0xd0ed8f27,0x63bf1dba,
  210051. 0xdcb61e4f,0x58537e02 } },
  210052. /* 60 */
  210053. { { 0x64f80ba2,0x1f64b064,0x0559a45b,0xe8e055e7,0xf1f4b634,0xc3262b34,
  210054. 0xde8c8482,0xef4f7d5f,0xc30c780a,0x9d55dea0,0xcfa1e693,0x1740afb9,
  210055. 0x7460c34b,0x2cfe6a66,0x1187c1ee,0xf6695941,0x5f974d94,0x1382f277,
  210056. 0x004549eb,0x1ca0ace4,0xbabded02,0xf8244b3f,0x4e3653ea,0xc36f4d06,
  210057. 0xc55c5f83,0xeab9f0dc,0xacebce90,0xd93b9cef,0x19061425,0x16658e72,
  210058. 0x82d7970d,0x4857835f },
  210059. { 0xd2576210,0xdcd525bc,0xd51b5443,0x9f378aa7,0x1bd83994,0xfe97bf17,
  210060. 0xf38ac621,0x930d0f63,0x818408cc,0xaf8f2c17,0x260f53f6,0x2692c87e,
  210061. 0xdb0a75e4,0x0ee45407,0xffdb1b37,0x0ec47ae5,0x7aa6a44b,0x769129dc,
  210062. 0x2e40b75d,0xb6f932b2,0x95ef3b77,0xe06764d0,0x68bc63e8,0x28fd47f5,
  210063. 0x9c0014c0,0xd1810494,0xd7995d8e,0x90e2d3fd,0x6c2a85af,0xeb39a05d,
  210064. 0xa21f3128,0x6c0277bd } },
  210065. /* 61 */
  210066. { { 0xb509e7ef,0xe41b7086,0x3d7f9f91,0x8842ec7b,0x5526b88b,0xcd285f94,
  210067. 0x051dd0ab,0x6e44e064,0x774f1ceb,0x90198c10,0x123e661b,0x6ecabe98,
  210068. 0x32f647d9,0x44811136,0x26c52aee,0x1dd82b45,0x939dc9d5,0xd650907f,
  210069. 0xfcd455bf,0xbd5eeef2,0x8d2e5d7c,0x7815a4dd,0x88bc9f2a,0x5ad4ec92,
  210070. 0x57a3b322,0xc6f10d0b,0x20b9cbdb,0xe8d0c1e7,0x9b774ee8,0x5a0b071a,
  210071. 0xf22fcf8f,0x3067bc9a },
  210072. { 0xb7ca9326,0xe0e589f2,0xb1224f63,0x17a106fd,0x747a57bd,0xb2354521,
  210073. 0x62b0882e,0x2614982d,0x4391ffcf,0x7f3af544,0xa84e440d,0x1aaa337b,
  210074. 0x941bb071,0x28ea37b0,0x2e4a7f54,0xa957dcb4,0x1a6ad5fb,0xe7ab662c,
  210075. 0xf7c36a20,0xd135e381,0x9baa0b6b,0x42e7980c,0x94e4671f,0x4237030c,
  210076. 0x8b0922e3,0x24cc63ff,0x445a589f,0xd10d5279,0xa870ff6c,0xbb99d316,
  210077. 0xa996c195,0x390c83ca } },
  210078. /* 62 */
  210079. { { 0xffc4a73f,0x50d3fa82,0x3bd53303,0x2665d635,0x264bb77d,0x80a06f8a,
  210080. 0x22d73d84,0x81c04a6e,0x0323b8aa,0x2409cff5,0x8c4c4d5a,0x31dce217,
  210081. 0x0c0f9c19,0x374aa80e,0x00186bb8,0x0b25a387,0xaaf1487f,0xd0b77a10,
  210082. 0xab498de1,0x15f39ad5,0x1aa0c116,0x92e32da6,0x96e25ce8,0x228e3dbd,
  210083. 0x5e8646d1,0xb57c88dc,0x267b1c68,0x672b1164,0x600bdec5,0x5d0d807f,
  210084. 0x223e573a,0x3ea4007d },
  210085. { 0xa595d0a3,0xd76debd0,0xaff0b3b4,0xa6bd76cb,0x9b1bdb97,0xbf2c154f,
  210086. 0x4c714c71,0x62b19ab4,0x221af663,0xc9bf33b9,0x8c941ef6,0x23d87c49,
  210087. 0xd79f0f6d,0x255804c3,0x2a7acbc1,0x6f1a1005,0x550528af,0x5dab79d9,
  210088. 0xc8d16213,0xfd77a6f0,0xde5e1029,0x40508b6d,0xf95da12b,0xd95ac0f2,
  210089. 0x758a8ba1,0x8860af71,0x7160c8fb,0x0b194c83,0xce004d34,0xa40e6c80,
  210090. 0x6b14aaa0,0x09f82a17 } },
  210091. /* 63 */
  210092. { { 0xc21366dc,0x60abe588,0xaf75daf9,0x729c0a4f,0xacb93ed4,0x70501fd9,
  210093. 0x87a16d70,0xb97e744e,0x98e7361b,0xa42e0a7a,0x28b54cf3,0x1acdaff2,
  210094. 0xb7bd9078,0xf087ccbb,0x663250e7,0xda6f3983,0xbaf07c09,0x66d693ee,
  210095. 0x8cbaf157,0x79baf4c3,0xdfca99d0,0x5a984e07,0xf26d8dab,0xab4d3247,
  210096. 0x7eba36f9,0x4d0be701,0x0e8dd216,0x37bb9e65,0x531c4f03,0x72aa4e24,
  210097. 0xb753d85a,0x77d1e984 },
  210098. { 0xd8e62367,0xd9373239,0xb9820cf1,0x3361848b,0x5a9c97c4,0x00c7e344,
  210099. 0x14f960fc,0x9a0ec9ae,0x740474b5,0xcf41f0cf,0xece065d5,0xa5eede8f,
  210100. 0x9e808610,0xb1de5a4e,0xae0cf75d,0x17c44ae4,0x6b148d0b,0x2fa56323,
  210101. 0xd29ff2dc,0x64fa740f,0x88cb212e,0xc605eb8a,0x6a863016,0xf2c771ad,
  210102. 0x607b4c17,0x6d6112e7,0x40d49785,0xfe90ec07,0xe256e0e5,0x599be18b,
  210103. 0xca54adb0,0x4e6eabec } },
  210104. /* 64 */
  210105. { { 0xfb99cfe6,0x950323d3,0xc9334178,0x7b09bc26,0x7cbdfb6f,0x64111e41,
  210106. 0x89a75760,0x91141744,0x10919cb0,0x4c633df9,0x396bfd2f,0x715fc7c7,
  210107. 0x8cab62db,0x8ca19512,0x4db81aac,0x30672473,0xb4c4c54a,0xe67a246b,
  210108. 0xbf229646,0xd77ea0fa,0xfa5b5d70,0x5bed15f1,0xc2f192f3,0xa5686da5,
  210109. 0x7f6690ad,0xdecac72a,0xcaa50b7d,0x0c4af2a2,0x6049ad2f,0xf44631c1,
  210110. 0x04ecf056,0x325d2796 },
  210111. { 0x4848c144,0xee11fb55,0xb6a7af32,0x4e062925,0x369e0f9a,0x125b68e1,
  210112. 0xca53b21e,0xad9bdae6,0x2e98ea1b,0xf50d605c,0x9f2fa395,0xbdb9e153,
  210113. 0xe91532f5,0x4570e32d,0x46a250d7,0x810698ae,0xad9d9145,0x7fd9546c,
  210114. 0x11e97a5e,0xabf67721,0x249f82e9,0xca29f7d5,0x9851df63,0xa9c539a9,
  210115. 0x71d0e3e5,0xfd84d54b,0x041d2b56,0xd1e0459c,0xfd80096a,0xceb3eb6e,
  210116. 0xe32a79d3,0x19d48546 } },
  210117. /* 65 */
  210118. { { 0xb540f5e5,0xfe19ee8f,0x04e68d17,0x86d2a52f,0xadbdc871,0xd2320db0,
  210119. 0xd03a7fc8,0xa83ad5a8,0x08bcb916,0x54bf83c7,0x2e51e840,0x092133ea,
  210120. 0xcb52dddf,0xbce38424,0x31063583,0xd5c7be40,0x458e3176,0xc1ebb9df,
  210121. 0xbc4dabbf,0xafb19639,0xc05725a8,0x36350fe4,0x84e1cd24,0xac4a0634,
  210122. 0xc145b8de,0xadf73154,0xb3483237,0x0aa6dd9e,0xcbff2720,0xa3345c3d,
  210123. 0xb4e453b0,0x1b3ace6c },
  210124. { 0x90a8bdc5,0x0343e5e9,0x6306a089,0xa203bf9d,0x8e48520e,0x98489a35,
  210125. 0xde7d1d06,0xbd17debe,0x5f795d3f,0x8fafa6d7,0x387b0a3f,0xa4ceb630,
  210126. 0xffddeafa,0xe0166b32,0x7e764e02,0xa2fe2054,0xe871f304,0x55ab9824,
  210127. 0x952ec45e,0xa2bd36bb,0xa90d20ca,0x7b4c1484,0x75bcfb53,0x5319f387,
  210128. 0x6982c4e5,0x34238a4a,0xa102921d,0xa2bb61c7,0xdb3ab17e,0x1e061b64,
  210129. 0x192f0a14,0x538ec33e } },
  210130. /* 66 */
  210131. { { 0xa19b56cf,0x193496fe,0x7bb99acd,0x663d77f4,0x57d0a881,0x8f04afa8,
  210132. 0x082835fd,0xcced3da2,0x5d82cec7,0x7e21faed,0xf8009c85,0x6e175b99,
  210133. 0x2d05a307,0xd9c6e31b,0x81487d82,0x96948d4a,0xd46f6655,0x86ebd3f2,
  210134. 0x773ccc49,0x86851aa8,0x8b1640a6,0x3e220f22,0x41a20b75,0x9f06e3a8,
  210135. 0x90ac0a6f,0x2cfffe5e,0x8ebeb3fb,0xf5a9b1da,0x6e08e2c9,0x2587d997,
  210136. 0x03e9f401,0x6fd60298 },
  210137. { 0x8eb7516a,0x54709f8d,0xbdc598ab,0x83058a74,0x87e801ce,0xd234dd98,
  210138. 0xd17b8a96,0xfd0f9d90,0x6e90f6ab,0xaa1e549f,0x5a7ed55b,0x2496ff80,
  210139. 0x6c254c19,0x0d9f657a,0xb8962575,0x3cdea49c,0x2dff27de,0xb685a3f0,
  210140. 0xdb8bc04b,0x3c50e7fd,0x987236b0,0x904ff0ff,0xbb0d5055,0x494298fd,
  210141. 0xe14be8d0,0x34b3386d,0x7c3d30d6,0x7ad34e9c,0xe159fdd9,0x1f2b32bd,
  210142. 0xc761e5c0,0x84cfa23c } },
  210143. /* 67 */
  210144. { { 0x8b99b964,0x13bc11eb,0x58e2fc47,0x8e280c0a,0xd4c9a54b,0x870fbc49,
  210145. 0xbf6e20fa,0x37a334a2,0xd7c88cfa,0xee583d0d,0xef4af1da,0x05e029a8,
  210146. 0x0c2ef8a6,0x6d55e234,0x209e9b62,0x61b6fdfe,0xbb8e080f,0x3b1dad26,
  210147. 0x9392fc1a,0x5adbc162,0x0aae3f4e,0x02ac0fe6,0xc2bf4d5b,0x8d99801a,
  210148. 0xc282fed2,0x2333f93f,0xb52db33f,0x16dcb10c,0xc55752e7,0x09f90f84,
  210149. 0xc84a0d8e,0x287d4c51 },
  210150. { 0x0e9867da,0x5fa58201,0x1a874cda,0x614589b3,0xfbdee22e,0x005e27c5,
  210151. 0xe612bda8,0xe357fef5,0x2d3635f9,0x4e0dbedf,0x6f125a86,0x62be70e4,
  210152. 0x0d94a2e5,0xa09b9884,0x28b5e5d1,0x7eb99a15,0x751028b5,0x21b9416e,
  210153. 0xe06d2cc4,0x1b137fd7,0xfea09845,0x6fa1f517,0xffcecbd7,0x3ba1e966,
  210154. 0x832f453e,0xd4c89a4a,0xeca68fa1,0x07b1e2af,0x4bd395a3,0xd0fb4453,
  210155. 0xd8ef9e13,0x0132a3dc } },
  210156. /* 68 */
  210157. { { 0x576374c2,0xe53c7785,0x84727040,0xe60526d1,0x228ca044,0x8a066dc8,
  210158. 0xf1ce1313,0x1fe1c1b2,0xcdeb0c5d,0x2aeec832,0x9cbf826f,0xa7596699,
  210159. 0xde77a589,0xcd188e81,0x118d1254,0xe5ce0fe0,0x0790b86a,0xa142a984,
  210160. 0x39ac28ce,0xe28f043f,0x87de5804,0x4eef8290,0xf639a8c5,0x83c31b32,
  210161. 0x5887794f,0xd70454a7,0x18b1b391,0xca635d50,0x31d9c795,0xcefea076,
  210162. 0xb6f8aa25,0x13cbee76 },
  210163. { 0x8d3f34f3,0x79cabe0f,0xa3617fe3,0xbda9c31c,0xdd9426a1,0xb26dee23,
  210164. 0xf29c9104,0xe9dd9627,0xe2c6cd3b,0x033eb169,0xfcba2196,0x8a73f492,
  210165. 0xb858c83c,0x92e37e0b,0x23b3fbb7,0xe4f2aca6,0x64be00a2,0x8101fb1e,
  210166. 0x948f6448,0x91a7826a,0x907260e7,0x414067b4,0xe30bb835,0xf774aa50,
  210167. 0xc999c06e,0xf922ca80,0x0ba08511,0x6b8635b9,0x25fa04f0,0xbf936b5c,
  210168. 0xe02e8967,0x4e0a1ada } },
  210169. /* 69 */
  210170. { { 0x8ba29c4d,0x00ca6670,0x22988094,0xc08240ce,0x16dda752,0x21c5ca67,
  210171. 0xabbbfa34,0x689c0e45,0x3ed28b72,0x1d7545fd,0xd7c56ab4,0x5f221198,
  210172. 0x38759d65,0x4b3d8f74,0x8fe50b89,0x93490dfb,0xe80eba16,0xb641f5d7,
  210173. 0x79acb537,0x7b0da5eb,0x0c1d5e5e,0xab6b1497,0xa5da429a,0x2338e68d,
  210174. 0x2f6d2f25,0xe010c437,0x6530f3a7,0x226f16d2,0xcbef08bc,0xefb0f7b6,
  210175. 0x9f99c999,0x733e30d9 },
  210176. { 0xa42a38f9,0xecfe1582,0x4730b500,0xaec2d58e,0xde976b2c,0x2ee2f2a7,
  210177. 0xa969c1bb,0xf0539db5,0xfcecdb4a,0x31954168,0xe7a8e902,0xf2f7348a,
  210178. 0x3121541f,0x1d58d7cc,0x2202ae52,0x5d25b75c,0xf40835a7,0xdea9965a,
  210179. 0x529b4e46,0x3feb6a41,0xbd27ad9b,0x5c97fb6f,0x261f900b,0xd87554c0,
  210180. 0x04d5b19e,0xb43031d9,0xcb219b9c,0x33d5e9b8,0x3ee00bcf,0x7a43d492,
  210181. 0xb79a5c0c,0x56facb39 } },
  210182. /* 70 */
  210183. { { 0xa3018bfa,0x019165a2,0x9ffad984,0x100c6b24,0x55341a9b,0xbbf1b1f6,
  210184. 0x25dc4cc9,0xe6bd1d97,0x2bfffe60,0x52850ed5,0x7e5509ab,0x24e992cc,
  210185. 0x4ceb59f1,0xff6c502e,0x1aa7d148,0x2f0b3573,0xe7e3aa46,0xe90c1ddd,
  210186. 0xd1142880,0xbaec9f45,0x65be5dd5,0x475cfd26,0x1febce13,0x83abb14e,
  210187. 0x80942d30,0x6aba4829,0x297e82c8,0x1e1b235d,0x50d8218d,0xb771cdbe,
  210188. 0xd94d6cbb,0x88599266 },
  210189. { 0x155ccaf2,0x08847290,0x7c5b773e,0x8679ebc7,0xb2dd08ed,0xa88b2dd1,
  210190. 0x87d475db,0x960a180e,0x6694d02a,0x80fdb6b7,0x3f3f9e96,0x3e8758c9,
  210191. 0x4ad836c4,0xbda3f6fa,0x32fb387d,0x9400c581,0x2550200f,0x25a78542,
  210192. 0x776ecf18,0x2a97c351,0x566db59a,0x03ebf46e,0x26545eda,0x4743a280,
  210193. 0xcf74ab44,0xed169d84,0x88cb3f69,0xbaab931d,0xd8257196,0x70ae932c,
  210194. 0xa0c09719,0x797224a6 } },
  210195. /* 71 */
  210196. { { 0x441f3567,0x632923f8,0x2e24bf1d,0xc11c3168,0xb7671fff,0x4b97726b,
  210197. 0x7a5e1a22,0x601746a7,0x3addb417,0x53dddea0,0x7f59b846,0x57867a3c,
  210198. 0x56cd7ff7,0xb012a987,0xf19ba9a8,0x1bd5fec9,0xf8306748,0x750379a2,
  210199. 0xab8c05d1,0x7763445d,0x7903f42a,0x5d7f441b,0xa903e46d,0xc011674d,
  210200. 0xadd126c1,0x1b1d3c4d,0x61455b40,0xa2752aac,0x555c356e,0x4da42a68,
  210201. 0xd820852c,0x3ff09c15 },
  210202. { 0xf9cb7784,0x4c0a1bce,0x2422f305,0xaec539bc,0x0c414aa7,0x5f40f9fd,
  210203. 0xffd42bc4,0xd3aa316c,0x2f358e15,0x42f5a4c3,0xd6e27682,0x00bdcd9e,
  210204. 0xf8a5ecee,0x069f789f,0x05e14f5d,0x8078018e,0x8b40c741,0x2bb3e493,
  210205. 0x7917f72d,0x5dbc8c1d,0xcc57150c,0xe0eea664,0xc3fa8920,0xa25ecc5a,
  210206. 0x1c797164,0x3c21b0f5,0x634ad16b,0x8f09a2f2,0x58391d9a,0x8e730fc5,
  210207. 0x4fdfae4c,0x47ef1805 } },
  210208. /* 72 */
  210209. { { 0x3da285e4,0x9965f3d1,0x3a01e3f4,0xba7d4dba,0x61214ad0,0x4738413a,
  210210. 0x22397549,0xd3b7d535,0x5a730b92,0xa53dbdcf,0x332d165d,0x3130d92b,
  210211. 0x82f97ef4,0x44a28541,0x44dce1b6,0xbf62221c,0x7e2a0ec9,0xbba13858,
  210212. 0xcbfad998,0x33f32c8d,0xb5fed44b,0x409e5f3f,0xc66217bb,0x5c328c65,
  210213. 0xfcdf71a9,0xb00db69f,0xb8920788,0xa23c2a21,0x3ae6464b,0xf8ab28e6,
  210214. 0xb8de0861,0x1a6b6e9c },
  210215. { 0x06af77aa,0xaf6ec2b6,0xa887f065,0x2e60f5cd,0x9f498c56,0x87d21400,
  210216. 0xfcbaaf4b,0xdb595b59,0x271ab855,0x0fb592a1,0xd4349b0c,0xa0ce10e5,
  210217. 0x887d8c9c,0x9d6187d8,0x154bd6db,0x03ee95f9,0x5d06c999,0x8fe53213,
  210218. 0xfb6a64d0,0xf4a7bc30,0x66a4cb60,0x3d22af0d,0x5d37367c,0x16952cef,
  210219. 0x997d8e55,0x6f0ea734,0x731732d0,0xb447c70f,0xa9cb3942,0x00ab3034,
  210220. 0x28510fd0,0x79dd0180 } },
  210221. /* 73 */
  210222. { { 0x3ac7424e,0x04e0033a,0x60fda4d0,0xdb06b688,0xbcb772fb,0x236a9766,
  210223. 0xf297cda4,0x294a8e2b,0xdb013c6e,0x4b0aab85,0x8723a3ad,0x3d2aec98,
  210224. 0x13c84a6b,0x0cae32cd,0x70ec169e,0x21888f5e,0x42a88262,0x739633bd,
  210225. 0x7b60d9b8,0x68ac792e,0x10769fe1,0x89f2b722,0xd24bed34,0x8f3fcfe6,
  210226. 0xa3eb24aa,0xd35efb88,0x484c706b,0xddecfa3f,0x929ece0d,0x7cc119a9,
  210227. 0x8d405436,0x87e5ad45 },
  210228. { 0x7d1000a7,0xba99aa9d,0xae823833,0x8b94affc,0xdfb83dc5,0xc8229628,
  210229. 0x845a418d,0x2f59fe11,0x5d417054,0xa8b970f8,0x72b71581,0x8918c265,
  210230. 0xc0d1dd17,0xe4ef477d,0x3afad7c0,0xb50b4cf3,0x01870a5b,0x21baea79,
  210231. 0xbb3a2868,0xc77087f9,0x124a59cd,0x7857531e,0x57f43239,0xed74c26f,
  210232. 0x0164c94a,0xd5f5ae25,0xf094bf74,0x6608b7e2,0xfdceea32,0xf4cdb5ba,
  210233. 0x990cc045,0x0b712519 } },
  210234. /* 74 */
  210235. { { 0x88d5c64d,0x5a290ca1,0xa7492534,0x0596d749,0x2a00e925,0xa04b0d3d,
  210236. 0xcaf7b66b,0x082cd02c,0xecdded83,0x912b50c2,0xff31646e,0x813ce9de,
  210237. 0xc75fff95,0x62ae70c7,0x7e2a4615,0x6f6852e0,0x03804fd1,0x320fd7d0,
  210238. 0x8218e8d9,0xb1a2a4dd,0xafc645d7,0x4918a6fb,0xe8d9fdbe,0xfb080fa1,
  210239. 0x4470b6ee,0x33d4d08a,0x6d974ef7,0xd2ba2077,0x69dae5d2,0x8ecb95a7,
  210240. 0x7d69596d,0x7a3f423a },
  210241. { 0x9a929387,0x362d2ca6,0xcb1c1fff,0xabdb7581,0x7e51b6cb,0xd892ec9f,
  210242. 0x3a4e131f,0xee8d8632,0x5bd87561,0x4680e3f1,0xd4e7e732,0xe3a597e1,
  210243. 0x5581fefe,0x3cc72b7c,0xca8cae0b,0xf3e77f8a,0x5e2fd4af,0xfcc7d7dc,
  210244. 0x21355b79,0xdd3a4552,0xa2c07177,0x546b24f2,0x0689621f,0x415b532d,
  210245. 0x3f78163e,0x2be9af51,0x33d7ed21,0x27d63b9b,0x96802943,0xab019ef2,
  210246. 0x1623faf4,0x2da5fc55 } },
  210247. /* 75 */
  210248. { { 0xc8a5c600,0x62429cf3,0x3fe33e7c,0xa7a80c22,0x0a57ddcb,0x9ffda740,
  210249. 0x925b0c74,0xd1ae156d,0x6b100eb0,0x097a43f9,0xef943c81,0x169e945c,
  210250. 0x1128cf24,0xa1f734e5,0x419f0133,0x04387c4a,0x01044024,0xc007868b,
  210251. 0x90359cf2,0xe5416abf,0x478d54e3,0xf9c76fee,0x42a2173e,0x66219da6,
  210252. 0x9fe30141,0x61e03156,0x93ef247e,0xa0ff5ce3,0x072b6592,0x811792ba,
  210253. 0x70c854d3,0x855f0219 },
  210254. { 0x847314c4,0x61fbfb6c,0xeb45b96a,0x97906155,0x6ba2afac,0x7102e146,
  210255. 0xab949781,0xed51f975,0xc110c4fe,0x9d2f5b17,0xaff57667,0x7ac8ce70,
  210256. 0x6eb244e7,0xe7366a21,0x551c65c7,0xdd1bbcec,0xe1a859de,0xb525060a,
  210257. 0x8ba7d2e7,0x7a048174,0xab8ea8c4,0xe1a2c541,0x6fdff078,0x6e7824c3,
  210258. 0x14874b04,0x79b49fc7,0x06b1f733,0x22ae337f,0x6f8fe6cf,0x1c352192,
  210259. 0x525d0797,0x292236cf } },
  210260. /* 76 */
  210261. { { 0x7d8b29dc,0xcdb8d80a,0x08ea648a,0xd17a2024,0xae92be91,0x7db12c5e,
  210262. 0xfda72fbc,0x1f347d18,0x9e760c6f,0x11374b40,0xd8e38d91,0x7361e8f1,
  210263. 0x739ac1f4,0x7714be9d,0xb4df5c4e,0xc1f9701c,0x6f72cae1,0xd9138ed8,
  210264. 0x6ad180c4,0x1c7fe1f7,0x9e2dbf9c,0xf8c185be,0x7c70c44d,0x835db269,
  210265. 0xb0d15b5f,0xf997cfea,0x61e6545e,0x5101445a,0x25184e5e,0x16b06884,
  210266. 0x7521e7aa,0x7cfac359 },
  210267. { 0x3c0bc53a,0x81182167,0x7e751367,0x84b5ede3,0xa3657a18,0x3ca255fd,
  210268. 0xba1fdd98,0x096abbf4,0xc5da77d8,0x9ce8369f,0xaab342c5,0xf27b9ae7,
  210269. 0x972059f1,0x06c91bd6,0x914ecfe9,0xee0dab30,0x93f53f12,0xbb647fbb,
  210270. 0xffa57e0e,0x30c38a7a,0x9f2ad607,0x517d06ef,0xbb99dcc9,0x49728d87,
  210271. 0x446080a1,0xb0034af1,0x12b9c17d,0xcc810c3f,0x772a22a0,0x7225f14f,
  210272. 0x1ddf82bd,0x6ce3dc7f } },
  210273. /* 77 */
  210274. { { 0xa4397830,0xc07cd835,0xf4733306,0x4dd9290c,0x29989e8c,0xdd35d3a8,
  210275. 0x563d8152,0x79902559,0xe87de61b,0xf278d911,0x1024e35c,0x9c7340c7,
  210276. 0x4a0d0e59,0x2d444461,0xf32626a1,0x63e7608f,0xc4c9baa9,0x627a37e9,
  210277. 0x76fffd25,0x0c56dc51,0xcef2a1cd,0xcb6defc8,0xefc559d9,0xcbcc0d56,
  210278. 0x041cb692,0xe45f3fc5,0xe5161e09,0xcd05c239,0x5c3b559c,0x2a731ee9,
  210279. 0xa3d0a16d,0x85151122 },
  210280. { 0x86ff19e2,0x782d0335,0x1da28603,0xc2c60daa,0x557c7eed,0xb2e78cfe,
  210281. 0x1bc4e8b0,0xa8f6f984,0x3df35c67,0xcc1f9b4b,0x4764462a,0x96e13603,
  210282. 0x7c7ae0b0,0xbf910b97,0x51435956,0x27c7f305,0xf631eae5,0xc14db15c,
  210283. 0x7e69b34c,0xa51d6142,0x5fc12ff2,0xdec82851,0xfb887162,0xfcceae13,
  210284. 0xde1488bd,0xda332ac1,0x2ee3e74c,0xa20374e2,0xf0ae069c,0x597ea1a1,
  210285. 0x77bdec04,0x8b1159f2 } },
  210286. /* 78 */
  210287. { { 0x2f961d30,0x4af71a44,0x7ac7248f,0xbdf968a8,0xb1a906cd,0xd32df87c,
  210288. 0x04abf925,0x00c10e26,0xb9f04d4c,0xb8711759,0x939705da,0x00d54e60,
  210289. 0xc9f80849,0xf7587433,0x6a7a2375,0x2e9abade,0x94ac17ac,0x5676d478,
  210290. 0xc202d99c,0x4ca0525b,0xabfae73d,0x95b8bcad,0x3405991b,0x2371ed38,
  210291. 0x458a99c3,0x2b69e47a,0x2b78c866,0x7cac0b18,0xe0232c7c,0x6ceaa79b,
  210292. 0x588f7459,0x0bd86433 },
  210293. { 0x7e734189,0xdea1a8b4,0xcfe5fa17,0x52c5ac88,0x11437664,0x444a4d4e,
  210294. 0xaf9e9750,0xc2522308,0xd30c6b3b,0x78b1d0c3,0x4c6df477,0x2edae5f0,
  210295. 0x2ee88dd7,0x53131d9a,0xacc93e34,0xc4e380ee,0xa8db0e8e,0xd499b1ac,
  210296. 0x7f5d49d7,0x77348c16,0x1556ccd7,0xc9663257,0x2611d13d,0x65ce0e8c,
  210297. 0xb5a2fdcc,0x2c95fe66,0x8658faa1,0x26698832,0x31c32c98,0xda87d1f4,
  210298. 0xfcd91907,0x46650598 } },
  210299. /* 79 */
  210300. { { 0x6b4a5efa,0x4c6c13cc,0x1d07b265,0xc481989b,0x8bdc69c0,0x10b966ce,
  210301. 0x2c2531d4,0xf54cfaa2,0xcad0a100,0xcb5f1808,0xee5da449,0xbeb52538,
  210302. 0xbedd83cc,0xa6240085,0xd6255c78,0xe792dacf,0x2062058f,0x88371906,
  210303. 0xed1658c1,0x96615e83,0x7d28d542,0x4b549b27,0x83b75df3,0xeaf127db,
  210304. 0x17fbb942,0x4f60df6d,0xf6f7c930,0xd08631db,0x6018789f,0x17c38f98,
  210305. 0xb9a9280c,0x0c43574a },
  210306. { 0x1d20cad0,0x76eb324c,0x8c61108a,0x90decb09,0x6f06d36d,0xa6e9d39c,
  210307. 0xbc0da197,0x6cd978ba,0x507ac5ce,0x5948b1c0,0xc5497eb5,0x2bd47164,
  210308. 0x4d5914e3,0x2a9c4c0f,0xa759f03c,0x772c5046,0x69ac847e,0xe7d7328a,
  210309. 0x3048b330,0xa8d57d0c,0x40f7bace,0xe60034e0,0xa85f1790,0x823d9193,
  210310. 0x5c859736,0xa6e9b66c,0x679e1022,0x22ca2c7a,0x09023fa4,0x00e7a19c,
  210311. 0x2726d5b9,0x324999f1 } },
  210312. /* 80 */
  210313. { { 0x7c834915,0x667eaed6,0xbc5eb64d,0x9f77aa6a,0x25d62011,0x729ebcb6,
  210314. 0x699fd9c2,0x0aee24f2,0x2b8d4f6c,0xe1eb5874,0x14c976d6,0x7f12710c,
  210315. 0xf6d9ea65,0x91390335,0x06b50064,0x668b7049,0x0876ee4f,0x65969a0e,
  210316. 0x2f9d9360,0xf901bf3f,0xb499e3ce,0xfb1a8651,0xf2dbcaaa,0x80b953fb,
  210317. 0x973b06b6,0x312cc566,0x3af36c64,0x3534d9c3,0x10ffd815,0xe4463a52,
  210318. 0xf18c2b91,0x57ea2b4b },
  210319. { 0x8aa0f2f2,0x00f5e162,0x0e46bcaa,0x8c7e75c5,0xa4a2c42d,0x97ab479a,
  210320. 0x14baa202,0xb4f308ea,0x6943cc2e,0xa901bd14,0xeed58804,0xbb125fee,
  210321. 0x9d180f7c,0x6502c8f9,0x1580c61c,0xe5353919,0x27101ee3,0x7e278069,
  210322. 0xfaa72717,0x7a0a40a1,0x4c75b153,0x32edce02,0x538f1c22,0xda23660b,
  210323. 0xbe307d2e,0x4d511e98,0x9baee0b4,0x24276e40,0x7ff1f307,0xa78c3927,
  210324. 0xea7935c9,0x60480b46 } },
  210325. /* 81 */
  210326. { { 0x3872ece3,0x31087d66,0x955b70f8,0x5f29be7d,0x9cf95bb8,0xb50b4fc7,
  210327. 0xdbffa621,0xbae3b58d,0xe022ba5d,0x0e61d280,0x4181449c,0x78ae5117,
  210328. 0xcf555485,0x0b132840,0xb8ce0b0e,0x800ed1b6,0x78d5de3d,0x35dffdd5,
  210329. 0x69a56b47,0xf7e42374,0x8d910ae7,0xd5e32369,0x6313c7c7,0xb6ff52a0,
  210330. 0xa92de9e5,0x5a2fe20d,0xd12110bb,0x41b347d3,0x40c16f23,0xc5905edb,
  210331. 0x9a8f88cc,0x0774a0d3 },
  210332. { 0xe3b6c106,0x3ae181ab,0x8de150b7,0x4ebe163f,0x6f354836,0xcf75b82f,
  210333. 0x3ac7ac16,0xaa0d2063,0x291722af,0x5c680668,0x11545553,0x73941e61,
  210334. 0xbf5de3f7,0x17127e38,0x1afb41da,0x32cfdf03,0x87bc8663,0xc6893c91,
  210335. 0xa62c9c99,0x75046744,0x962c1947,0x96866e2d,0x378cdf4c,0x489ec8df,
  210336. 0x3407fa32,0x3a60709b,0x551290d1,0xd37d2159,0xbab92273,0x9623d303,
  210337. 0x2432014b,0x08151954 } },
  210338. /* 82 */
  210339. { { 0xfb7b2108,0xf9236d89,0xad75f9aa,0x3ecc83cc,0xb4e1da11,0xf7c72b15,
  210340. 0x0315c362,0x552aeaef,0xf272fe3f,0x11e140ed,0x87843ee8,0x99d79bf6,
  210341. 0x1d9bb25b,0xce6b54fd,0x5b1bad74,0xb20b0e21,0x5b84c90d,0x54a0214f,
  210342. 0xfca6cec9,0x459bbf52,0x9e4df76f,0xe363c48d,0xd64cf17e,0x3045f84e,
  210343. 0xf62ada48,0x8402a167,0x6a74ca01,0x2c9e1bf3,0xf691c42d,0xe8cf9d41,
  210344. 0xc2c4b874,0x5abf2178 },
  210345. { 0xf3b3bccd,0x4777966b,0xbe3e0caa,0x0047e0f0,0x8c7d5043,0xcb8383b3,
  210346. 0x946fd5fc,0xe77e3baf,0xe9ec0e87,0x79baa785,0xc8a18d25,0xd83c557c,
  210347. 0x25befcfe,0x9b96e5af,0x98c71b61,0x4f05d15e,0x77e62da1,0x081f991a,
  210348. 0xcbaa3821,0x1c6ec781,0xe54d9bfb,0x7522f65d,0x44ed1430,0xf5d05573,
  210349. 0x95cafdda,0x3035b31f,0x6378f5bf,0x47e67f43,0x5270b9d9,0x029f7cad,
  210350. 0x4d916a48,0x15ad1587 } },
  210351. /* 83 */
  210352. { { 0xaa588ae4,0x00de2ece,0xa371a232,0x552ebc58,0x71230444,0xd00ea934,
  210353. 0xe4b1832d,0xafbfa67d,0xb689e843,0x29216341,0x61f4e2e8,0x1f96bbbd,
  210354. 0x04c29dc5,0x95420684,0x42317fd1,0xc7fe3827,0x63483162,0xe0a0aec6,
  210355. 0x0700184f,0xfc2b94d1,0xfe1fbd85,0x07219973,0xfb074352,0x648b6ab1,
  210356. 0xc46e5392,0x23bbdaad,0x00fa56ff,0x0db8dd1f,0x866725f6,0x104815eb,
  210357. 0x52e81963,0x3f9c4cca },
  210358. { 0x32ce637e,0xff36b297,0xf5d25cdd,0x81a15f2d,0x8b02ad97,0x1a1d052d,
  210359. 0xcfbab3e9,0x2e5f3bbc,0x614eeb75,0x60d2cbd7,0xcd5a793a,0xd4491843,
  210360. 0xcdba2144,0x2242cf75,0x88b99766,0xa20705e7,0xec77e132,0x64e12cc0,
  210361. 0xb61a9b05,0xb1c14df6,0x74825b5a,0x8fd97f04,0x3da31223,0x95604821,
  210362. 0x4d30c70d,0xde486727,0x1c12ee69,0xbcab8f15,0x668d893d,0x5dc638b4,
  210363. 0x223f574b,0x6479dad6 } },
  210364. /* 84 */
  210365. { { 0xb05f2b26,0x569044f3,0x80b9f76c,0xb35a294a,0x4290f6ae,0x8839fe28,
  210366. 0x026a5877,0x761cfb23,0x2e5ff9c3,0x768926b6,0x0b11c576,0xbae6cd20,
  210367. 0x72a03efe,0xdc857756,0xe1bad63a,0x0cae074a,0xd709d99c,0x3fe491a1,
  210368. 0x6501d9c1,0x76c5ded6,0xc32aeff7,0x1da6eca1,0xc57683e8,0x50849d55,
  210369. 0xdf98d847,0x9e392e9c,0x64d9a564,0xfad7982f,0xa37b98b2,0xf7c3bdb7,
  210370. 0xf0860497,0x1fe09f94 },
  210371. { 0x7648cc63,0x49a7eaae,0x67cfa714,0x13ea2511,0x653f4559,0xfc8b923c,
  210372. 0x81a16e86,0xd957619b,0x3c864674,0x0c7e804b,0x1616599a,0xfc88134a,
  210373. 0x0a652328,0x366ea969,0x4bc9029e,0x41532960,0xae2aad2b,0xef9e1994,
  210374. 0x7f10bef5,0x9e2a8c52,0xc67bf860,0x73dcb586,0x844cc25d,0xf61a43fa,
  210375. 0x74eb3653,0xd74e7eea,0xdd240f02,0xf3356706,0xfd83bcb4,0xeec7694c,
  210376. 0xdb62526a,0x4de95786 } },
  210377. /* 85 */
  210378. { { 0x3deac2f7,0x4867d315,0xb61d9a8e,0xa084778a,0x0ab7b2d5,0xf3b76f96,
  210379. 0xcfdf4f79,0x00b30056,0x31ab8f4b,0xd0701e15,0x9c779d01,0x07f948d5,
  210380. 0x82675371,0x7c994ebc,0x48bad4c0,0x1104d4ee,0xbfc9d058,0x798ce0b5,
  210381. 0x309fa80b,0xc7ca898d,0xacb33eaf,0x0244f225,0x5b2f3175,0xd51e8dfc,
  210382. 0xa4d7be34,0x3e49ba6b,0xbda02b43,0x1760f4c7,0x4435275a,0x37e36a7e,
  210383. 0xe636980c,0x1c94418b },
  210384. { 0x09dc1414,0x43a21313,0x43c93537,0x060765fc,0xdf5f79ce,0x6ff3207a,
  210385. 0x85d4cfca,0x6f18b1fa,0x63e995ab,0xf5c4272e,0xa82b3002,0x121a09e4,
  210386. 0x97147f16,0x82b65d1b,0x20a7fe26,0x4993c20c,0xe6716726,0x99c9cb98,
  210387. 0xfeb440a0,0x5a02d673,0x251b4bc5,0x3f3fa9e1,0xa05338ea,0x75dbc474,
  210388. 0x7b09f6cb,0x3cb4044b,0x80434609,0x6767da18,0x098ceac2,0x97851422,
  210389. 0xb55235ba,0x611bfbb2 } },
  210390. /* 86 */
  210391. { { 0xf00ad2a1,0xbdbaa55e,0x14a290d7,0x29efa85e,0xe92b1694,0x3b4a4768,
  210392. 0x11ec8130,0x67111bcd,0x88bd27b2,0x0e425702,0xd9a03c06,0xf28cf2a3,
  210393. 0xf318884a,0xbb7c8d2d,0xe3aaeb20,0xe2ea1462,0x43b85d77,0x33535804,
  210394. 0x554ee9bd,0x81ee4482,0xe6aa198f,0xeb2eee9e,0xc26c5944,0x7a5aa804,
  210395. 0x82ab167c,0xa0ef2da5,0x02fe21a5,0x5a2ab476,0x3370298e,0x169cb3b8,
  210396. 0x0eb3aa8d,0x86e6c544 },
  210397. { 0x0b793d9b,0xede03321,0x1ddb5ece,0xf79fade1,0x68930b64,0xf73fda92,
  210398. 0xfe4fd1b2,0x06aad97d,0x92a4dc88,0x073a5b1d,0xbc976d75,0x8af8cbd8,
  210399. 0x63ce26c0,0x60b4abb1,0xdcb1fb06,0x9c8300a9,0xda95b3d3,0x335a594c,
  210400. 0xb37eac87,0x1f97d7d4,0x20eefaab,0xa3d2eba2,0xf3e828c8,0x3258c906,
  210401. 0x85ab7781,0xc832616f,0x8c28b617,0x72597192,0x3233b82d,0xcd7196bc,
  210402. 0x19fa126d,0x83867eb9 } },
  210403. /* 87 */
  210404. { { 0x22474edb,0x774fe73e,0x1a84e1ae,0x2a766394,0x9c6dd6e3,0x270329ad,
  210405. 0x14f8bf5d,0x00c4a415,0xd2267b90,0x3ce2ea37,0x11d24fae,0x12753015,
  210406. 0x263a1b78,0x7c14d854,0x1ae0b206,0x20c8401b,0x081f49fc,0xf32a011b,
  210407. 0x959c6df8,0x1e8123fb,0x800e1d06,0xa328dc7c,0x24259a9a,0x5876a378,
  210408. 0xb7ef6c37,0x23ada8b5,0xa93d4c9f,0x023f6b6e,0xffb6389f,0x89f5414d,
  210409. 0xe628b39e,0x4b26bba2 },
  210410. { 0x5d318454,0xd30b1cb4,0xd7436cb6,0x123b749f,0x568a7461,0x3110c726,
  210411. 0x1c84fd1e,0xc85de123,0x08403d55,0xa5f8d6e6,0x9b1fabf8,0x395b6e13,
  210412. 0x3cfedce0,0xfe6d68c3,0x94b91110,0x1d90381f,0x2dcc6eb7,0xf0a8ea81,
  210413. 0x7e90ca2b,0x59e80413,0xc8a25c5a,0xbeb5fc07,0x5d84663c,0x009c253a,
  210414. 0x910b6a7c,0x00b15073,0x4108f8d5,0x8607da4c,0xcb901e65,0x02c3d9c3,
  210415. 0x2c9615c6,0x4d697bc5 } },
  210416. /* 88 */
  210417. { { 0xefa8fb40,0xe0db1ef0,0x5ba3989c,0x29021c5b,0x809d19df,0xa8d6fb15,
  210418. 0x4c1219e1,0x6b787b73,0x14ef05e2,0x6417e168,0x8f9796e2,0x449342db,
  210419. 0xbf84421b,0x2f878a5e,0xe94a4536,0xe71916d7,0xae119693,0x9818bba3,
  210420. 0x5768804e,0xec674be9,0xf8424f8a,0x0a26074c,0x466ce6ab,0xdbc93b9d,
  210421. 0xc920078b,0xb3f15a98,0x3870f1a3,0x9d10fd0d,0xe4e785a7,0xa61241d9,
  210422. 0xe6c8cd80,0x76ca87a1 },
  210423. { 0xe02e48b7,0x4357fb56,0xcc09e9c6,0xfbd14b13,0x24069cf0,0xdb5f2435,
  210424. 0x2c3b01a9,0xf878165c,0xe6956dad,0xe549e7c4,0xbbd60b68,0xf2fe9538,
  210425. 0x059dc653,0x952f856b,0xb377fe9b,0xd3f60225,0xbfe908c4,0x6a0c7328,
  210426. 0xbc8f5f2d,0xce6aa2d3,0x24425050,0xf7213443,0x3d3b3ce5,0x17e1266a,
  210427. 0xc1677512,0x75b5e43f,0x37fb894a,0x15927062,0x2be3e375,0x15260753,
  210428. 0x6da3b7be,0x27e7f2c6 } },
  210429. /* 89 */
  210430. { { 0xe6a15883,0x638f65ad,0x66afdb33,0xd4a7e68c,0xd3f12de5,0x6207b6ab,
  210431. 0x37b87810,0x1c6ff950,0x64acf6d3,0xc0d44cb2,0xf2be78c2,0x163ac601,
  210432. 0x1636980e,0x1c63cc5a,0x95c9349b,0x3e92cfe8,0x41ec7220,0x7738e0d8,
  210433. 0x2d5fa961,0x6169d764,0xc3e028e9,0x2aa776c1,0xb16d5409,0x93dc5646,
  210434. 0x706df4d9,0xa0b27fb5,0xce9c6b97,0x9e991170,0x53c85f40,0xea8e42be,
  210435. 0x83246528,0x02e96437 },
  210436. { 0xae78ea1f,0x91540add,0x7b670e96,0x51a1b74d,0xf7006826,0xf9936441,
  210437. 0x7d7520c7,0x8f97d6ea,0x69ce12e1,0x0faa6a02,0x79208342,0x2590aca8,
  210438. 0x75614436,0x7a483863,0xf381408f,0x07c6149e,0xd7853406,0x733bf584,
  210439. 0x9abbb6f7,0x8761b010,0xf528a09a,0xe4eb249f,0x2e00ae3c,0x08781ed8,
  210440. 0x2178effa,0x864c1b25,0x9d513a7e,0xcc1e62a2,0x1919062f,0xedb8b94e,
  210441. 0x4f16527d,0x739f53da } },
  210442. /* 90 */
  210443. { { 0x924adc5f,0x7a5f4a88,0xa818f56d,0x95646c16,0x7795f954,0x0ec49129,
  210444. 0xd19c5400,0x2b48753d,0x205912b4,0x16fa236b,0xe87a4946,0x6b3d65f3,
  210445. 0x045fd066,0xa7174a01,0x12a5e140,0xb6350313,0xa96b8623,0xa79c4b44,
  210446. 0x9ab003d5,0x7a339d65,0x3826f31a,0xc72f30c6,0x6f7090cd,0xb4e7390c,
  210447. 0x906ebe24,0x59ac6c36,0xbba4505a,0x39a7f06d,0xc58c413a,0x839991e1,
  210448. 0xa20e0e84,0x020c23ff },
  210449. { 0xafc74661,0x120e4ada,0x277fc065,0x37bbcf63,0xb6dce799,0x41049cf6,
  210450. 0x7b161ba1,0x5b8d6b53,0xa9610fb2,0x22218431,0xdfdde769,0xde9ec9d1,
  210451. 0x42d80630,0xd32bfa4d,0x6244df4b,0x3885702a,0x45592dfb,0xcdedd1ed,
  210452. 0xfb4e01b8,0x0e1df45b,0x86e215b0,0x8f4bded2,0x6a937e6a,0x80935487,
  210453. 0x8130f723,0x415278ba,0x38a821f8,0xc6dc4692,0xfd8b4f8a,0x2207b119,
  210454. 0xf9269cef,0x76e7bf53 } },
  210455. /* 91 */
  210456. { { 0x27ebd187,0x5f128428,0xb65aadbb,0x8d3320ab,0x72258695,0xb042765a,
  210457. 0x8f0986ab,0xda3f33f9,0xaebff503,0x411807a7,0x825f71a5,0x25c776ca,
  210458. 0xff7df24b,0xc0de7bed,0x165f1fb4,0xda8b0f42,0x731f3ae3,0x5f3ff737,
  210459. 0x193e0a52,0x4cd1d7e7,0xb6b3ba46,0x8df84aa3,0xaa1f3782,0xba84b897,
  210460. 0xe7733ac7,0x6e7960cc,0x50981a21,0x4d46d6ab,0x7cbb80ed,0x1ec12c25,
  210461. 0x2b96ef09,0x79e7ad27 },
  210462. { 0x8f30caae,0x3cd970dc,0x0a6ebef4,0x85cabcf1,0xc714616d,0x63c1863e,
  210463. 0x519e3a98,0x1c50db0b,0x64cb13d6,0xf39b8963,0x22547b69,0xdf67d81f,
  210464. 0xd67db0cc,0x7157abb9,0x889491b7,0xccca25ba,0x7a27e0dc,0xf689207c,
  210465. 0x0fd43281,0x34ae8fbe,0x5720ec09,0xa5d91f73,0xcdfd7bed,0xb2f61909,
  210466. 0x4a039e32,0x1ec10232,0xdb0d8fdc,0xd3c3d65e,0x4fe5005d,0x32c916c8,
  210467. 0x4c0bea94,0x7f8c37ac } },
  210468. /* 92 */
  210469. { { 0x43ac05e5,0x33ec1e54,0xcd8d3825,0xda4a4da4,0x88bf9e2b,0x86d88c0b,
  210470. 0xb53811dc,0x34d71dd0,0xa3c3aba4,0x655040d2,0xb61611be,0x2bc40949,
  210471. 0x279a4fa0,0x1c2d426e,0x3b065ac3,0x535a5aa2,0xc52ea890,0xdaa8a32f,
  210472. 0x9fddad22,0x5a5deca7,0x2ab3b26f,0x911f05fd,0xf37cd81e,0x5dace7db,
  210473. 0x90d16b8c,0x0e0e44e7,0xe4f5894e,0x15e68aed,0xfc92a74f,0xafe04999,
  210474. 0x970e7c2f,0x1d7703aa },
  210475. { 0x3f0062a9,0xa8a4c81d,0xd96a20ba,0xe31eb2b8,0x864bd101,0x66dd98df,
  210476. 0x4413b614,0xba05f592,0xe9a555f8,0x51a67a0d,0x2e4b52d1,0xacc2f097,
  210477. 0x7184ab23,0xab5daaec,0x7c7f691b,0xce08b43e,0x76c427f4,0x520e530b,
  210478. 0xe423ebdc,0x7d352069,0x34df14ce,0x6b5e39e8,0x446305ac,0x3dcbf295,
  210479. 0xfe34cdc1,0x682cb2e1,0x111f5afb,0xd4ac45d1,0x47f296f9,0xc5ef63cd,
  210480. 0x93c20871,0x0a2c40ec } },
  210481. /* 93 */
  210482. { { 0xaf5747db,0x09bc384f,0xc06ab86b,0x3bad6086,0x9e7c1547,0xa406882e,
  210483. 0x55977abf,0x2d5326d1,0xda81deb0,0x063a9a05,0x524b6111,0x9a86e4a7,
  210484. 0x4ab2eb90,0x1402f87a,0xd5c600ba,0x7d0721d4,0xf289fdbf,0x1a2fd9a9,
  210485. 0xecde6f07,0xf5dce66d,0xdab9fa73,0x62171277,0x6c474bab,0x6d2dc49f,
  210486. 0x76eed033,0xdc017e1f,0x4da825d3,0xb97175c0,0x54b05e43,0x6c297e3d,
  210487. 0x56c9c87e,0x2efb4546 },
  210488. { 0x8b21c064,0xa4712b00,0x4a70629e,0xd186fe42,0x9b74f0af,0x6435b340,
  210489. 0x7ec9e629,0x6965aa43,0xc4c60d08,0xdda14673,0xbf3057aa,0x0b656670,
  210490. 0x3ce86f60,0x7f05e840,0x04401a16,0xc05073a9,0x294e607e,0x16b1e638,
  210491. 0x69cf7046,0x20783252,0xe8ce7d3a,0x2941141b,0x7577053d,0xd38ad8d3,
  210492. 0xcaa6630d,0xdba68fb3,0xe9504350,0xecbeaff1,0x1d2d760b,0x9f5166d5,
  210493. 0x462891e4,0x337532ce } },
  210494. /* 94 */
  210495. { { 0x3a00bb9b,0x3f111853,0x45f66685,0x2d2ffbae,0xd4aee24d,0x9ae11a85,
  210496. 0x0341856e,0x18ba1e1b,0x2731349f,0xa9ac8178,0x545715b5,0xc13dfd4a,
  210497. 0x5daad2ea,0xa5f7423c,0x535b76a7,0x30a483b9,0xff873e9b,0x92e9ada4,
  210498. 0x723a1055,0x15662d84,0x8edac4e0,0xb935497b,0x39d8fa70,0x61b6441a,
  210499. 0x40d1589f,0x1541d756,0xf0a05f0a,0x62994237,0x6bb28908,0xfd8b0034,
  210500. 0xd4cd32bf,0x192a2b5d },
  210501. { 0x365ced07,0x63576628,0x05de1d1f,0x029f32fb,0xbf40a7aa,0x6d17b9bc,
  210502. 0x9bb50a47,0x1b1b2a08,0x795a6278,0x9389abbb,0xb34fc19b,0x52cff60f,
  210503. 0x387d8739,0xf3ab9492,0x6920ccd6,0xa8f053e6,0x63a9b4f0,0x3ef2dd4b,
  210504. 0x51e82129,0x9ab0ede1,0x0838bfa1,0xafba0c0b,0x9ffc11be,0x2bd5a7ac,
  210505. 0x95cc0878,0x058bfd95,0xf8c2f0c6,0x686d48a3,0x1d9b31ba,0xc33abaaf,
  210506. 0x3bc0c268,0x632e2289 } },
  210507. /* 95 */
  210508. { { 0x15a1ccca,0x1c851d20,0x7e522bc3,0x4efe290c,0x18eab053,0x0b741d55,
  210509. 0xbc85e217,0xae656197,0x01cf8b29,0xae13141e,0x66948478,0x2e2cb593,
  210510. 0xc31bd8ae,0xeb57bb0f,0xc264e788,0xdecef5d6,0x9cb96d86,0x6fa856cc,
  210511. 0x279183da,0x2db16813,0x383d796a,0xf03f3820,0x1d0c6fed,0x58a456ff,
  210512. 0x8a6abd9b,0x25589805,0x83f96f19,0x339f52c5,0xda7e9ea7,0xcf6ded8f,
  210513. 0x5d1ccd45,0x68c3d9c1 },
  210514. { 0xe6b392b7,0x67e26265,0x775d9509,0xcec1d9bf,0xd76514f7,0xe16abcd4,
  210515. 0x0de72e1c,0xd86f59b2,0x1adfb033,0xa66e43cd,0x05e457cc,0xdb344340,
  210516. 0x5681daa2,0xb67a7916,0xf0114731,0xc32e7bab,0xd3b1e961,0x066fe16e,
  210517. 0xf63d26e6,0x924e298e,0x541add6d,0x9bea0dd8,0x9982f971,0xef9500df,
  210518. 0xc5f076ac,0x5c876e63,0xb23d396b,0x55e12ae5,0x2ec6747a,0x09efbb36,
  210519. 0x233286a5,0x8f2055ee } },
  210520. /* 96 */
  210521. { { 0xb82c1af0,0x4a4ab9e3,0xf2cae264,0xfc65e9e7,0x60187d46,0x4feaac0a,
  210522. 0xe393b363,0x27d3f335,0x819bacce,0x9c9f7c00,0xb8aa6611,0x3f7418b5,
  210523. 0x372aae95,0xffa94557,0x8db38589,0x937d7804,0x6f1fbc1c,0xd10c86df,
  210524. 0xa2f0a0ce,0x48aebd89,0x367439eb,0xae5d5fa2,0x3f17d2d8,0x103a6a0b,
  210525. 0x411d9894,0xf233f68a,0x218b67a2,0x7fece8b3,0x2319bf06,0x0422540f,
  210526. 0x340d322e,0x1292c8c9 },
  210527. { 0x0386463d,0xf5eb5587,0x0371d97f,0xd4bbc2b2,0x0b819c5a,0x1b364571,
  210528. 0xcf04ad41,0x0cbb42d6,0x66939ec1,0x5d819c76,0xa01847e7,0x8745ac13,
  210529. 0x1c7232e4,0x4f704b02,0xacb05780,0x2c9e58a0,0xb561e295,0x9523b8b3,
  210530. 0x79f9ba35,0x3384df00,0x1eaa9628,0x78231fc2,0x8aea2b90,0xa2eac54f,
  210531. 0x30d1c263,0x8075ed77,0xfb339000,0xacb44ed5,0xf011293a,0x92546ac2,
  210532. 0xeb821764,0x7c78762b } },
  210533. /* 97 */
  210534. { { 0x067902b6,0xb8f7d6fb,0xd1735980,0xb2823a43,0x59741ddd,0x062cfb12,
  210535. 0x4033f95c,0x6e391b07,0x68589b8c,0x3831d0a3,0x522290f2,0xe3474d49,
  210536. 0x222e1f3a,0x4dab14d6,0x53f08d39,0x8f00fcde,0x707f28f5,0x559917ae,
  210537. 0x068e607c,0x166aa0ba,0xd7e1f824,0x602713e7,0x4d6a328f,0x7c255540,
  210538. 0x9890cd2a,0x0d2e3264,0xeca0b20a,0xf2207944,0x52f4e09c,0x5c98dc07,
  210539. 0xd84de81d,0x69403504 },
  210540. { 0xe5407206,0xf8b7b366,0x0d88fa8c,0x1ecf54cf,0xf7272e6f,0x6fefe548,
  210541. 0x81ab4468,0xd6531372,0x4e474408,0x52cb5f0e,0x6490737f,0x9e426b3a,
  210542. 0x4980d071,0x2576c19b,0x0f272caf,0x91f34628,0x468f31c9,0x78e60a4f,
  210543. 0x90844d89,0x8776a329,0xb951582b,0x8a55700c,0x14b1adbf,0xab1af365,
  210544. 0xfbd343ef,0x22ebff92,0xb7d81f34,0x32f9fb01,0xba6b30e1,0xad850e06,
  210545. 0xbc5f9546,0x6da9e027 } },
  210546. /* 98 */
  210547. { { 0x5c9490ce,0x21eee4c2,0x0df68381,0xa96ec4a3,0xa4a9368e,0xe6c607e0,
  210548. 0x4bc262f3,0xd8b0492a,0x460c34ff,0x0846a210,0x28df33cd,0xf7ff7a64,
  210549. 0x21827612,0x10c55044,0x149bcd01,0x9d25fce9,0xcfc613dc,0x725611cd,
  210550. 0x97f51ce5,0x159f7e88,0x4e8c08b5,0x3fa3bf31,0x75e7538f,0xea156115,
  210551. 0x91c84020,0xd1e0a951,0xcf02ad0a,0x0d2268ba,0x058b8e5f,0xa04c6ac4,
  210552. 0xb3515912,0x773b40b9 },
  210553. { 0x3631cfd2,0x00ff2cdc,0x807737bc,0x14c4c2d3,0x338a5270,0xd600616a,
  210554. 0xb32cabde,0xd0e3306d,0xa70b17ca,0x336738ea,0x79f353ee,0xf2f4aa8d,
  210555. 0x576f3ad3,0x712f6ad9,0x89b2bce0,0xe4279852,0xda92ca30,0x05d8f94d,
  210556. 0xd8492dd9,0x9891d475,0x4d15e4bd,0x3e06a5ca,0x254eabbd,0x4725d4eb,
  210557. 0xc0ed513c,0x31394ace,0xbbfaae6c,0x7e0f9859,0x833fd137,0xdc125546,
  210558. 0xc56c4f75,0x12b46385 } },
  210559. /* 99 */
  210560. { { 0x932951de,0x810dbebd,0x5aa69c94,0x96959d42,0xecb2f08d,0x5fc49c04,
  210561. 0x2250b82c,0xac74f0cc,0x3aec4e1d,0x96a439a5,0x90499acd,0xc33cab9a,
  210562. 0x54d9b3af,0x2fccde66,0x3863ae8b,0xf4af285c,0x46febf88,0x2373373e,
  210563. 0x3c9ab7ed,0x751d672c,0xfe12020c,0xc1c51130,0x52f3e56e,0xad82402f,
  210564. 0xa4a64a81,0x3489ab7a,0xd9f163f2,0x0a1fb661,0x0e553317,0x17c69be1,
  210565. 0x7d88d417,0x61c1935e },
  210566. { 0x3492ae43,0x2e722d9b,0x0538f05a,0x1ef89d95,0x200aab63,0xae77e588,
  210567. 0xeba4b117,0x2872c120,0x3a461cb8,0x5c2432c8,0xcb938f26,0x315b3434,
  210568. 0x8c4c7dc0,0x05bf2ac5,0x596b378d,0xd2e501dd,0xcb890c30,0xa8506c9f,
  210569. 0x7c361f0c,0x3d0af461,0x5a35cbae,0x21f7b718,0xf3fc0138,0xbd1035f1,
  210570. 0x8b248edf,0x74628af5,0x48c9cae0,0x8d6421d0,0x2ca18773,0x75e3da39,
  210571. 0x71d3db94,0x27ad0df2 } },
  210572. /* 100 */
  210573. { { 0x305b5aed,0x9e3bda79,0x5998d6a7,0x2c67d4a4,0x0f7eb700,0xc855e1d3,
  210574. 0x147d1c44,0xc18a7e9e,0xc89540ed,0x3ea99618,0x7e6bfd20,0xa53be20a,
  210575. 0xecc14437,0xc9487e64,0x34ef85c6,0x72979207,0xd5e1ebd5,0xfa0d4e71,
  210576. 0x4d48d6b6,0xfda2b1e6,0x66e200d4,0x782a1e05,0x5a5366a1,0x2a3c70da,
  210577. 0x1a473738,0xfe3fbd2b,0x7fe020e8,0xd7ef8c06,0xeacfb665,0xec686fde,
  210578. 0x6dd1542f,0x5d9b5e27 },
  210579. { 0xcb3e472e,0x3637c5a5,0x30a1405e,0x2153d927,0xb4498558,0x009992e5,
  210580. 0xf39a0851,0x18f00ccd,0xb5c6c560,0x26237c11,0x1343540e,0x418ed408,
  210581. 0x7e7f3184,0xfef7cbf0,0xbf48576b,0xecd92366,0xbc94c91a,0x1b75be1a,
  210582. 0x4a162276,0x8e1778de,0xc5c6bcb8,0xc52e57d3,0x5ab71858,0x5cc382c7,
  210583. 0x3f6e39f9,0xe12c2c28,0xd62735fc,0x4c7e0ef2,0x835a5996,0xe071deb1,
  210584. 0xcbb8c766,0x24f891cd } },
  210585. /* 101 */
  210586. { { 0x6778c1e2,0x24ef60bf,0x00d5be5c,0xff49c03d,0x2f01a09f,0xec11986e,
  210587. 0xae096e58,0x59a728a4,0x7077984c,0xaabbcedb,0x870ca5a5,0xfb473bd2,
  210588. 0x4de30e3d,0x8c928c61,0x4f67abca,0x3fae7f9a,0xec21a9cf,0x83c2b2eb,
  210589. 0x9cd9b5de,0xafa70d62,0xc60b18df,0xadeaea59,0x4049b54c,0xd5fef7be,
  210590. 0x6dd310e3,0xfceebc76,0x8f6321cc,0x7748efe3,0x18ee8af5,0xfe9c32b1,
  210591. 0xd42df612,0x863ac3cf },
  210592. { 0xb85a2fe2,0x0a36fca7,0xee429dc6,0xf3e70d08,0x141c3944,0x8c9ba209,
  210593. 0x67272a0a,0x306a8106,0xf968bd06,0xe69a1555,0x153c603d,0xb86f7e47,
  210594. 0xef56e4fa,0x9706614a,0x98780b4c,0xc0dc36b8,0x3a1d3263,0x43657fe2,
  210595. 0x435522c9,0x01f97a86,0xedfef679,0xd91897f6,0x6daa17a0,0xebbe31d4,
  210596. 0x85accfbd,0x6f179100,0x8f9fc1de,0xe0da6e32,0xe1e7142c,0x1c9d53db,
  210597. 0x8b86725a,0x3e3f1b1e } },
  210598. /* 102 */
  210599. { { 0x7b7fbf05,0xb7ea15c0,0x1f1a3882,0x992f11b6,0xd1dcd1bc,0xc9ddd95a,
  210600. 0xad0f7e8b,0x31f5b7fa,0xfca7ab79,0x2936e5eb,0x19a55be6,0x30f417dc,
  210601. 0x43cde554,0x1f6f4e43,0x82f044bf,0x971f5e65,0x4288c408,0x73c3b8e4,
  210602. 0xb807f575,0x61aac59f,0x818b58f0,0xa64ee2dd,0x97a3b0d3,0x6f7a0a60,
  210603. 0x0394b058,0x8b85ecc8,0xbfb3517d,0x9a059474,0xa79c3f06,0x89ad5977,
  210604. 0x700a8025,0x81208ed8 },
  210605. { 0x14c4ce37,0x10935099,0xa1aa48a6,0xf34bb843,0x580d58e8,0x86007024,
  210606. 0xb375b8ba,0x6db42c49,0xed3bde83,0xac365524,0x649233b6,0x5521e1b4,
  210607. 0x64dd946f,0xbc7cc5d5,0xbfb5b6ae,0x9c14b035,0x0146c1a3,0x7f22ba18,
  210608. 0x872214f5,0x0b62fbbc,0xb4921764,0x3acfd7f7,0xcb4d6df1,0x5ff10da1,
  210609. 0x62600a91,0x660e2620,0x81d9167f,0x7ac7da9d,0xb6e7a199,0x6e8e260c,
  210610. 0x80deb3c2,0x44383fb8 } },
  210611. /* 103 */
  210612. { { 0xe44f9af6,0xe107f01d,0x8cb1fa1c,0x36381a4d,0xfb7dd493,0xe65be3ec,
  210613. 0x26a8839f,0xd0b8435a,0x3ec789d8,0xee60f915,0x2bcc5e1f,0xe25fea50,
  210614. 0x7e44a81c,0x0477c0c5,0x230ba5b8,0x349e9f83,0xde180dd9,0xdd42f32f,
  210615. 0x64a3d11c,0x8b039eaf,0xbeb7083a,0x80ef884e,0xf12742cb,0x288e60c4,
  210616. 0x720a0262,0x44156cc5,0x7253b77f,0xcd547de6,0xa6013a59,0x9829a6ec,
  210617. 0x0d548445,0x8aee708f },
  210618. { 0x32c54409,0x18f22d9c,0x75ebaac4,0xa9ebfa46,0x86284981,0x90e2e928,
  210619. 0x6b3a8e0c,0xd0201f6f,0xbd77641e,0xc973016c,0x70170575,0xf926f2f0,
  210620. 0xfec0ce01,0x4984048f,0xf319d304,0xbf696211,0xc91a88c4,0x74b5c844,
  210621. 0xe0030a82,0x4c40fbce,0xe4f6d521,0xbed67525,0x29d67d1e,0xaf7e47cc,
  210622. 0xc21d3536,0xfa307db8,0xbbb29405,0x56b6c46a,0x033e805f,0xf059a7e3,
  210623. 0x6096a5a0,0x970f61fe } },
  210624. /* 104 */
  210625. { { 0x1bec8e4a,0x1bc53d23,0x35a6034c,0x8809ac14,0x509e464d,0x4ee081da,
  210626. 0x8a488235,0x496ae1fd,0x325864b6,0xa1ae9863,0x74cd069f,0xbaca13e9,
  210627. 0xb1d8a6b4,0x3738cc58,0xe76b9da4,0x5fa71f58,0xc7eb16fb,0xc919be88,
  210628. 0xad4e429d,0xf5c8f13f,0x2499f9ed,0x4583b671,0xa10d8bd7,0xbce20115,
  210629. 0x5790bb7e,0xf66d7605,0x482b78dd,0x9316aede,0x75f855fa,0xe0d8fb2d,
  210630. 0x5a7dcca7,0x404b5b94 },
  210631. { 0x517a15c7,0xf9ee682a,0xef880202,0xaae4cfbc,0x5106a354,0xcee2c139,
  210632. 0x170febe7,0x5de60192,0x73d0c54b,0x589e39fd,0x8c9092b7,0x195c7135,
  210633. 0x0a7bfe5f,0xcb7ed53f,0xf61cc979,0x2bd9242a,0x5395f7d9,0x8d2ef16c,
  210634. 0x70b32f09,0x0d4ac1ca,0x52d185c1,0xa587526d,0x942d6195,0x2932b04a,
  210635. 0xa500b0ac,0xfe25a979,0x562fd230,0x5fa1f4ae,0x20da253c,0x60f55af2,
  210636. 0x83146002,0x7faa11b5 } },
  210637. /* 105 */
  210638. { { 0x6e402149,0xb0ba4f0c,0x963cc119,0x3584cc1d,0xa6527476,0x7740dc1a,
  210639. 0xc95715f2,0x3f77ff75,0x3f89fb0e,0xb2f234ad,0xef9be3ff,0x55159032,
  210640. 0x04237e82,0xfc9fb21d,0xa153ed93,0xeb2eff38,0x10041d13,0x89d53ae0,
  210641. 0x7f1bd828,0xcf2e545b,0x43953ea5,0xdd4a27ce,0xd85e75c8,0x00d2e5d4,
  210642. 0x241be1c3,0xeb93ed62,0x0242032d,0x1e53f25f,0xc3a4e701,0xb9957636,
  210643. 0xed98febf,0x14b63a52 },
  210644. { 0x71c43336,0x7610b553,0x23a4824b,0x19dfd4a6,0x0286051b,0x7b97a2e0,
  210645. 0x8f5f1edb,0x86abbb9c,0x9b67daad,0x67a57d77,0xcd5ffafb,0x8ace506d,
  210646. 0x89ac3c63,0x85da9f95,0x75a3d150,0x081cbaa8,0xe9346ed2,0x03353d8f,
  210647. 0xa1f9a02d,0xb2ab61f1,0x3a659c71,0xb0cb0937,0x4f5df8a1,0xb7e0e30b,
  210648. 0xeb7d5a1d,0x77c4c741,0x728e5cf0,0x8f046c9c,0xf7c171ac,0x32dd0bc7,
  210649. 0x836d2655,0x02485873 } },
  210650. /* 106 */
  210651. { { 0x75a4cd8d,0xcd40dd23,0x97bcba78,0x132ca433,0x258d61f5,0x30c5cd84,
  210652. 0xda1e8e68,0x0a7ec059,0x1d65d40a,0x07a8f171,0xf4350d76,0x869e655e,
  210653. 0x5983ae42,0xb98ce6f0,0x9d8bebd0,0x7b61391d,0xb1ba5d49,0x3a529e25,
  210654. 0x1f6b2cf6,0x46f732e9,0x3fa3b629,0xbd66ec6a,0xc3ef0ed2,0x397950ec,
  210655. 0x5f08b476,0xee9008cb,0x965a0e2e,0xfd6be425,0x1177bc87,0x78ed513c,
  210656. 0xfe512dae,0x6798cedf },
  210657. { 0x1b97c5c6,0x49e3f8fd,0x78c3b33f,0x39fbab3e,0x40f595ba,0x44274412,
  210658. 0x5d7d4376,0x174225b9,0x79c44777,0x880b3fcc,0x3296b245,0xdc3aca83,
  210659. 0x1734e184,0x55913df7,0x9c934472,0xa4db23d3,0xd1420a11,0xcebb3733,
  210660. 0xf3608bdc,0xb9d20cf9,0x30cfe13f,0xa618acf6,0x5f30874c,0x75f06b31,
  210661. 0x9f0005a5,0x506efe7f,0x01bfc9db,0x8aaea78c,0xf78e7c41,0xf9179255,
  210662. 0x52e96395,0x3ea7aed2 } },
  210663. /* 107 */
  210664. { { 0x5b06ae25,0x98617e04,0xcb5750ef,0xbcac148d,0x604c2ba2,0x91ea2f0e,
  210665. 0x76b78975,0x00c19f6b,0x651da181,0x79b9b6d0,0xc945705b,0xf3225beb,
  210666. 0x5c005bf1,0x30b435f3,0xbc24d86d,0x440b4482,0xd6373777,0x2b8f0996,
  210667. 0x1c44b4dc,0x65fd6c56,0x30906999,0xe9405ee6,0x08aa1ec1,0x19ff0924,
  210668. 0x3d2f2895,0xeef3246a,0xbc746797,0x016c3765,0xd0705f7e,0x62d2569f,
  210669. 0x05250044,0x6a8ad39c },
  210670. { 0x46be7282,0xe45f020d,0x21380f12,0x9405afed,0xd5da6ad0,0x4cdca5bd,
  210671. 0x7f8be61e,0xc2d6f184,0x596b8178,0x20132953,0x7a8df954,0x8d3b1e7b,
  210672. 0x39572b4d,0x757c61bb,0x80cc3b56,0xd749b57b,0x37b3ffec,0x9590ff93,
  210673. 0x145dc94d,0x39bbb653,0x2335e573,0x70c1c606,0xf763feba,0x9c2e72d7,
  210674. 0xcc61b732,0x4768e424,0xaa73f2ca,0x777d2fa6,0xc5cb58cd,0xdee4dbaa,
  210675. 0x9cfae1aa,0x1a181179 } },
  210676. /* 108 */
  210677. { { 0x77575ed0,0x6f6ff62f,0x7d1da99b,0x18f14fa9,0x69efd7f6,0x2e72aefb,
  210678. 0xddc28633,0xc45ab4cb,0x586c5834,0xb0e20d48,0x39775dd8,0xd397011a,
  210679. 0xf4134498,0x0130c808,0xf5115ed8,0x2d408eba,0x0260ded9,0xc506a05c,
  210680. 0x19cab911,0x9e5b7362,0xe8693a86,0x4cf508c6,0xcc773617,0x4e71245f,
  210681. 0x95d89ca3,0x2f71aa1f,0x607bbc98,0x4bba7c6a,0x212b7fd2,0xf3a515e7,
  210682. 0x9230f5a8,0x7d2ddc75 },
  210683. { 0x4ed2cae8,0x3d05816d,0xb9c00377,0x4cf6bc7d,0x646b08d4,0xc23e98e6,
  210684. 0x4b9c0180,0xf9ee6c61,0xef9179c1,0xe11c9a13,0x8ed9688a,0xa5b6147e,
  210685. 0xd06670a7,0x7afeb648,0x17685275,0xd670333c,0x75f9e8f2,0xa89dd969,
  210686. 0x37a68ade,0xbb57228d,0x454cb186,0x21a05d5e,0x063dd550,0x4810158f,
  210687. 0x4cb6caf3,0x92dd4f08,0x7854abe7,0x70c4d852,0x6e729d76,0x845969dc,
  210688. 0xb1bf40ba,0x5a52f87a } },
  210689. /* 109 */
  210690. { { 0x09ecacbd,0xed019e91,0x7b89bdea,0x6544023d,0x5707371e,0x7cc51f0b,
  210691. 0x16c8e217,0x14832b04,0x81259ab5,0xb1aa6682,0x23e361d4,0x6e100f92,
  210692. 0xe3a95c2a,0xe593eee9,0x16c10e26,0x699b6bbd,0x9473a13f,0xad487873,
  210693. 0xb274987c,0xf1c14dc5,0x2559e2e9,0x57dc0075,0xc3d47ad2,0x8449849d,
  210694. 0xdd527793,0x83df278a,0xeefd5b99,0x770e3ec8,0x76bd02a0,0x2ae58446,
  210695. 0x3e705ffe,0x17f02764 },
  210696. { 0x29abea1f,0xdda4010d,0x2407ac4c,0x636b9695,0x0433218b,0x96a60129,
  210697. 0x163d534a,0xf221fc3b,0xccc20565,0x05ba15be,0x96285577,0x1238e54d,
  210698. 0x878804d3,0x1b144257,0xa89a9fe4,0x96fbf304,0x4be642b1,0xc8a7f06c,
  210699. 0x6e2b085e,0xdd1a20e8,0xff4a591d,0x8f7f27c2,0xa4a343b8,0xc17b0753,
  210700. 0xbb173d4d,0x684b1e88,0x3dc07bbe,0x3accea44,0x4c441d77,0xdb15c88d,
  210701. 0x53e5957e,0x0ef0309a } },
  210702. /* 110 */
  210703. { { 0xfa8e5b60,0x4fc25721,0x691c0bb2,0x646938ad,0x0b0a2248,0xe46d4b76,
  210704. 0x7de16877,0x863f9ac2,0x2721c630,0x503bb6ef,0x0b67fb02,0xf8c199df,
  210705. 0xe07abd39,0x78c1ed72,0xb32f0dda,0xcf9deb7b,0x6c3c89f3,0xaff726f0,
  210706. 0x1972225a,0xb7008b2d,0x4f145f5c,0x8f5a6117,0x457c4f37,0x4e0e6f8c,
  210707. 0x1c453c64,0x8bbdaa44,0xa6e92c80,0x57be326d,0x5d773561,0xa9bc3fd9,
  210708. 0xbb37b72a,0x3d3b6cc6 },
  210709. { 0x9722c880,0x6e6f12cc,0x286b6889,0x3a1b6ae7,0xad2fafec,0xba1cc09b,
  210710. 0x43bb8bef,0xad64ad7a,0x97c3f4c3,0xa5af6a00,0xc353a91b,0x2afcb0d9,
  210711. 0x69ccbf6b,0xca13fcab,0xf2abc190,0x699a1391,0x23a247e5,0x2dbd5542,
  210712. 0x95488d9a,0xe206180f,0x1244cc3c,0xba9e7bff,0x87d3a365,0x29297abe,
  210713. 0xfa4ca5e2,0x4054fa38,0x67be1b6c,0xb390623d,0x78f41a44,0x1fa67c57,
  210714. 0xc7b544e7,0x2e946e43 } },
  210715. /* 111 */
  210716. { { 0xc60934ae,0x2980fddf,0x164206d1,0x2c3e7eff,0x416ed75a,0xf75e7f96,
  210717. 0x5cd0b2dc,0xfac60cf3,0x1faad87b,0xddc4bece,0x9849e5dd,0x753fa87c,
  210718. 0x2c1bf1ae,0xc5d516a3,0x14732b4b,0x565dbea8,0xce48696b,0x007ebe3a,
  210719. 0xcdb97694,0x40ca74d6,0x65e4e7be,0x3f5cd270,0x3aac4ebc,0x74847c01,
  210720. 0x43d6c3a1,0x6762e034,0x467a076a,0x690d8c95,0x1eda677d,0x768d78d6,
  210721. 0x0181d8c2,0x0997ce55 },
  210722. { 0x965a0b81,0x9297746c,0xe5e12dfa,0x48b58be6,0x715f437f,0x5573b3c4,
  210723. 0xb565c459,0xe425e907,0x1582797c,0x4f43f512,0x8ea5474f,0xe5dafa6f,
  210724. 0x13de04ac,0x2aeb8fbe,0xe8a07c83,0xed7f95f0,0x662c09fe,0x3e012a6e,
  210725. 0xc742cf17,0xbf96e9b8,0xe28a1c45,0x8ea5759a,0x5cf4e2f3,0x475941b4,
  210726. 0xf901a019,0x7dd3c02d,0x70916b2e,0xe7a4deea,0x2fa9b988,0x50b272b5,
  210727. 0xd0917fe6,0x96f9f09f } },
  210728. /* 112 */
  210729. { { 0x2c310a96,0x78e8aac4,0xf7a2a734,0x32a98303,0x23962207,0xc46ca83d,
  210730. 0xd9541280,0xad131e6e,0x2cabe911,0x5791fc5e,0x841b6c68,0x50cb77eb,
  210731. 0x3d3c8878,0xaff93dea,0xf1007bce,0x06541f1d,0x55cdf1fd,0x4ee729c2,
  210732. 0x323e3972,0xe0f71317,0xad4d08c1,0xa2de7a41,0xa35e22bf,0xa9912abf,
  210733. 0x89b03325,0xa050122b,0x06514d4e,0x8b9e51f4,0x79d3e0ab,0x423c7aad,
  210734. 0x40b8fea5,0x71998e26 },
  210735. { 0xceb6ed78,0x40140fcd,0x18534516,0x653cf377,0xe8d60dcc,0x0450b65a,
  210736. 0x9dac55f8,0xce6c1a76,0xae05686c,0x8a96a92d,0x12712562,0x2fe44762,
  210737. 0xa4f39425,0x747bcb50,0xfc531fc2,0xf0ec6ff2,0x10fe9ff0,0xc97c3447,
  210738. 0x9c792cff,0xfb488783,0x026fb019,0x552c5248,0xd804c290,0x4001a29c,
  210739. 0x35c8ca73,0x742b5ad8,0x6ee5dfa0,0xc3781f17,0x3dfa4ab1,0xca6b85f0,
  210740. 0x0b0d32ac,0x8389941a } },
  210741. /* 113 */
  210742. { { 0xde067dff,0xc0f062a2,0xbcb80162,0xd4f32690,0x0707a2bd,0x98cd990d,
  210743. 0xfae4a391,0x5afc63b8,0xb32ad814,0x684f1b7b,0xf199dfb1,0xb0a2dce2,
  210744. 0x48f25848,0x2260e17f,0xc2d5e862,0x7393db00,0x338cf171,0x9e88f854,
  210745. 0x02acf522,0x00679429,0x6835af3d,0x19157cb8,0xb8a2614c,0x2faa6f92,
  210746. 0x134ec46c,0x04ff95f5,0xfb7a8135,0xcf00626e,0xb37a4704,0x454b3d05,
  210747. 0x2694ec25,0x1fbfda31 },
  210748. { 0xc8f69c77,0xfdebb657,0xa3df88fa,0x92a8278b,0xc1fb78b4,0x463b5571,
  210749. 0x11c71a33,0xd2066a1a,0x089958b0,0x10c88143,0xcf9d67a6,0xb975c7e0,
  210750. 0x73037b8f,0xdaa5d208,0x40bf5861,0x5ee5005d,0x7dba69a9,0x300e6ce7,
  210751. 0xc962cc74,0x893c3cb3,0x4cf84055,0x0ac98629,0x225c9d70,0x0a7ef63a,
  210752. 0xb91e47e8,0xfe184869,0x8c2f84be,0x1b9d7deb,0xc0e278bf,0x67788915,
  210753. 0xc426f19e,0x4f9488ca } },
  210754. /* 114 */
  210755. { { 0xdd51b8ce,0x610dfcd4,0x36230e80,0x08579278,0x36599562,0xedc7ff1c,
  210756. 0xe2cae877,0x905ead4b,0xe7967608,0xa1c325d9,0xbd38926c,0x3e39eddd,
  210757. 0x5f6f0a4e,0xda92c868,0xf47a0fa4,0xe16f800a,0xe5f60aab,0x50b4db5b,
  210758. 0x983853d3,0x3665412f,0x9b79789c,0x64b62250,0x4e0e72b2,0xea560058,
  210759. 0xe555c2bb,0xabbd4901,0x17292e11,0x378419a7,0xe174218f,0x6e0b5aaa,
  210760. 0x8f796b92,0x688e0684 },
  210761. { 0x313b8f64,0xcdfef641,0x942c7462,0xaef11b7b,0x5c0d8abd,0x067cfb77,
  210762. 0xaf4041a9,0x608ea5f0,0x6935210f,0x23d5bd82,0x27917a08,0x5ab904fc,
  210763. 0x45d22d21,0x85dbb1fe,0x4d36159f,0xc3d5e509,0x1d39b8f2,0xaebb528e,
  210764. 0xf44acef0,0xdd5ca828,0x20c57a54,0x24209adf,0x78f95f44,0x5742b433,
  210765. 0xa9337d37,0xd11fa7d9,0xc64cfdb7,0xd66a0c09,0x9bb817ec,0x56e55b8f,
  210766. 0xe4c41265,0x1723c7e3 } },
  210767. /* 115 */
  210768. { { 0xdc8b43f3,0x9a6486d8,0x26409e68,0xfc3e0e61,0xd9b46003,0x1889c437,
  210769. 0x6284ec7b,0x3a850335,0x6a9dbaea,0x5a3665c4,0xe978933c,0x7bf6941d,
  210770. 0x69341490,0x1ed5a510,0x8cb8002d,0x664a7b7a,0x60ed0a59,0x603f76e4,
  210771. 0x1f4ebf27,0xc3e06ba3,0xf2c38a7f,0x296ced41,0xcf1db08a,0x2ac18f79,
  210772. 0xcde7a3b6,0xc919e882,0xdbf68b06,0x15e77d29,0x4e947cb5,0x21978baa,
  210773. 0x7630993a,0x84bf542b },
  210774. { 0xe364f21e,0xc1decda9,0x012e557e,0x0d6cf345,0x588f90e1,0xba246848,
  210775. 0xe3b104b8,0x9f6dda4b,0xe3aef57a,0x6bf7a346,0xe8327ea9,0x210299fe,
  210776. 0xda95e6c7,0xaa99f487,0xd2cdf645,0x24ff813e,0x8bd414b8,0xd1dbb2d2,
  210777. 0xcafa1a61,0x065101af,0x9cdebda4,0x7d9f4b9a,0xe41039e4,0xaf41b395,
  210778. 0xc50adf42,0xe3e9e6ba,0x341e9e49,0x4f2133ae,0xcb157f23,0x4968c0f3,
  210779. 0xda068153,0x383f827b } },
  210780. /* 116 */
  210781. { { 0x6583ff4c,0x2ec46a21,0x4ad709e7,0x4e645a29,0xc04ca12a,0xdc66e9cf,
  210782. 0x9160a7e5,0x82f128f4,0x569c762e,0xbfb227b1,0xc2edb8e7,0xf80c7963,
  210783. 0x49a0f688,0xa7dafe06,0x2d14b8cc,0xb7e41754,0x86de40be,0x3a0c5c53,
  210784. 0x1db79331,0xf0d05286,0xfbfe071b,0xb902ce69,0x210e9903,0x61e46956,
  210785. 0xf703ebb8,0xfaef874e,0xdd5f78b6,0xf668947e,0x5af5ea3a,0x6fe86547,
  210786. 0x43f94625,0x3b121f15 },
  210787. { 0x659275e9,0x5b26e847,0x6d0fce50,0x47581cfd,0x8aa3f1ef,0x55f5cbfd,
  210788. 0xe484e60e,0x1e7be315,0xfe9698e4,0xd8f1a20f,0x7ab04784,0x25d46da9,
  210789. 0x834cdb3e,0xa526db75,0x8d08a009,0x1fd408d9,0x5b5ca816,0xfc004b20,
  210790. 0x65e4bbe8,0x5b3e3bb3,0x759bb6ef,0xf50cc125,0xc2fac737,0xf05fa817,
  210791. 0xd273951a,0x9ee102d2,0xfecb3367,0x2a8e540b,0x2a6a515f,0x673446fb,
  210792. 0x37290c83,0x5505e1d1 } },
  210793. /* 117 */
  210794. { { 0xd15e68a6,0x0c3014a1,0x64dd35e5,0x6f9f0b26,0x03ad67f9,0x18c3742d,
  210795. 0xd2c14484,0x74818c0e,0x0d41a3cb,0xc5181169,0xc49f3e9e,0x65c8c83f,
  210796. 0x2c279386,0x9b260c61,0xced04e9c,0xf6086fae,0xfd7c4758,0xa7b2cceb,
  210797. 0x90297fd8,0x4b3c3133,0x09701ac8,0xca8264e8,0x508b3762,0x9f976a87,
  210798. 0x983a8dfe,0x5d582714,0xd9d598e9,0x350d2669,0x0f6fd348,0x85cb89cb,
  210799. 0xa574317c,0x617d80d4 },
  210800. { 0x70022b67,0x4cef267e,0x3768b94a,0x80536bb5,0xd2784462,0x3153a566,
  210801. 0x38243919,0x49054d44,0x5df78c4a,0x8d11e172,0xd5a1e35a,0x9b252a71,
  210802. 0x8171e31d,0x07866c80,0x1b38a00e,0x0a8501db,0xce770236,0x2ed932b8,
  210803. 0x8edaf7d0,0xa2d77609,0xb93006e9,0x3aee5dab,0xbbfeb036,0xfaffc8c4,
  210804. 0x4e21b38b,0x077b9678,0xdca8e069,0x491fc59f,0x0e938471,0x3f624f55,
  210805. 0x7cd1780b,0x5156f508 } },
  210806. /* 118 */
  210807. { { 0x0206e8d0,0x58234e22,0x7f15af32,0xf5f6f5d4,0xd638950f,0xafab7289,
  210808. 0x7d4495f4,0x66ec4d09,0x68da80a9,0xad890c5d,0x64f8a36b,0xe4aa0920,
  210809. 0x0f4d5c5f,0x799e257e,0x24495e31,0x44c677ae,0xa5b8e352,0x720387b3,
  210810. 0x75a287b9,0x703790f4,0xc3c1f2f7,0x54895cc5,0x41a7fa41,0xb8680f9b,
  210811. 0xb00b008b,0xfcd47458,0xba6473cb,0x149cc838,0xac9be19a,0x78ed5f7a,
  210812. 0xb33765ba,0x5254599c },
  210813. { 0xa21b54c4,0x08739679,0xb6497d9d,0x029ece2a,0xc8488640,0xf14f1a92,
  210814. 0xe9fa79d9,0xae48dcff,0x46c208db,0x14b911c2,0xdae3f69e,0x5ab0fbf2,
  210815. 0xd1edb838,0x180ac87e,0x188586bb,0x146fd718,0x5467cbd0,0x210eb654,
  210816. 0x1667cfee,0xaa239408,0xb73d1a60,0xdb125c1a,0x881c1cbe,0xde685300,
  210817. 0x37c30232,0xfe34c713,0x6f3c8d18,0xc6c6070e,0xb4af4e83,0x07e365ba,
  210818. 0xdcf82b45,0x22f0a7ed } },
  210819. /* 119 */
  210820. { { 0xea7f1b7f,0xe262791f,0xdcff09d4,0x9c3d8c5d,0x39c7dc58,0x86c2a9c3,
  210821. 0x4276e8c0,0x4dad4017,0xe9fe1d56,0x0a918f59,0x2aa810c9,0xb8d79670,
  210822. 0x4aa5cdc4,0xeb7a8836,0xe7afa72e,0xfc4c23bb,0x4ac86908,0x4dbb5c9e,
  210823. 0x6a0c7e6f,0x37e39013,0x49c218d2,0x855d7001,0x94b324a2,0xe475bc67,
  210824. 0x6287a071,0xc98a8dc6,0x5fb4323c,0x395a299b,0x0c0389e9,0xe186c3ee,
  210825. 0x16734c46,0x79f81e6f },
  210826. { 0x364f3c4e,0x83f2c1f3,0x1367e14b,0x536b2ac5,0x5933e43d,0x44a6dcfc,
  210827. 0x10d961fe,0x34e59475,0x7e3f2aae,0x08234ece,0xbdea7f25,0xcb92e00a,
  210828. 0xa791a124,0x1efba4f0,0x1192d53a,0xc2086fd2,0xb51c8af6,0xfec0d0fc,
  210829. 0xdc0f1b5f,0x48d1b2ca,0x812dbe19,0xb07a388f,0xdedbdd45,0x40873a6a,
  210830. 0xd702589a,0xbc2a1268,0x17e27b64,0xbbf6e3a8,0x6d386e85,0x73ee5663,
  210831. 0x9de7c000,0x442ecd37 } },
  210832. /* 120 */
  210833. { { 0x8a2f90a6,0xb4cd1ae6,0x6f5ad0cc,0xf277d41d,0x401d4b8e,0x6a3828c4,
  210834. 0xd8376631,0xe817a134,0xf5e1124b,0x142b758d,0xfd6b95e4,0x25fbc69d,
  210835. 0xd74a9e3e,0xa30c9f5f,0xd89663ce,0x5ac0f163,0x0ce6386d,0x32a9eef7,
  210836. 0xd8ed5544,0x7a690ea5,0x9889427a,0x5de23ff0,0xeaaced58,0x75ad36a5,
  210837. 0xd3e18465,0x3514a6c1,0x7f093910,0x3d9162c3,0xe33d56e8,0x5c10add9,
  210838. 0x06aa691e,0x85176b73 },
  210839. { 0x28a21e38,0xa32110fa,0x5773d538,0x97b6379d,0x2d020dc4,0xd3697bbf,
  210840. 0x961833cd,0x59177593,0xe5fa8516,0x6d7045fa,0x786ab5d2,0x3390f29a,
  210841. 0xdc4f5b70,0xac0bda30,0xdcc615c6,0xcca0240a,0xc5146d91,0x8e1f1702,
  210842. 0xa72cef87,0xceb472d0,0x0b669ba1,0x84840708,0x7e61aa0a,0x79b08f9d,
  210843. 0x4669560b,0x388160be,0x948eb71e,0x23935c2d,0x9431590c,0xd7fd83c0,
  210844. 0x6e5768b3,0x8ab154bb } },
  210845. /* 121 */
  210846. { { 0x353c4a96,0x28686003,0x905cd835,0x4e5c60e8,0x8f66f8cc,0xbd591364,
  210847. 0x9faccf9e,0xb6b80b98,0xe32639e5,0xbc1c1fae,0x278aadeb,0x2f6396d2,
  210848. 0x1898202d,0x00a796d0,0x3a474835,0x18ab548f,0xb31b0e3e,0xacd056c3,
  210849. 0x0164512d,0x15ba68dd,0x4b03f3bc,0x203836d9,0xd8f206c5,0xd64eca6b,
  210850. 0x9f1779b6,0x931a361e,0x52ab34a8,0xd82690fc,0x92922e22,0x342bb8e0,
  210851. 0xe00b02a9,0x1bfcdd84 },
  210852. { 0x75a365d9,0x310b9a43,0x08d8fb03,0xd4ade15e,0xd742df83,0x9c9753d7,
  210853. 0xde318742,0xcf7309d4,0x3360ace0,0x1228e212,0xf7669643,0x1043d238,
  210854. 0xf90f5a53,0xfc2adbed,0x7b5f9397,0x41d64cb7,0xc446d010,0x5200b30a,
  210855. 0x231720fe,0xc3c8642d,0xb9aa2075,0xfcc0122d,0x041eae47,0x856e3b12,
  210856. 0x68c876a4,0x45864455,0x233606b1,0x1a1c7842,0x227757bf,0x9b766d1f,
  210857. 0xf7b9d4f1,0x25b78a3b } },
  210858. /* 122 */
  210859. { { 0x156707ce,0x90835718,0x4314f90a,0x9bdc2398,0x8be57dbd,0x017c885a,
  210860. 0xad63a4b8,0xd4bba225,0x15aacffd,0x5ce71b86,0x72954722,0x5f266475,
  210861. 0x4f0ad3dd,0x0a80f1f7,0xfc352ed7,0x010538a3,0x4203c6ca,0xf8a64045,
  210862. 0x330c73b4,0x2b2c7a88,0x02dcac1b,0xb3433ee6,0xed2b17c7,0x2e0499cf,
  210863. 0xbd6329c7,0x9f8681a4,0x36fadc37,0x38979946,0x92b7895b,0xdc5650c8,
  210864. 0x65a51cf0,0x70ab9570 },
  210865. { 0x7b585d93,0x46778ec4,0xa633fe4e,0xca6d3610,0x4ea0311a,0x21da154e,
  210866. 0xbd64002f,0xaf22190b,0xd91cb7a9,0x9e633ac7,0xee6837d7,0xed13c31f,
  210867. 0x1616ee8a,0xda4a07d7,0x3afcd616,0xd78a2732,0xba14d694,0xc06696e5,
  210868. 0x4df58420,0x733754d7,0x2778e3c9,0xe85e504e,0x55b5a5c2,0x3055aa0c,
  210869. 0x8a3acb5c,0x313df538,0x2a088eda,0x5896acb5,0x84c85dde,0xfc8842a0,
  210870. 0x51dde6be,0x5fec9f79 } },
  210871. /* 123 */
  210872. { { 0xfe519f99,0x5ebc2c7c,0xe5410353,0xe396bd80,0x8a3988f3,0xaded9402,
  210873. 0xd601bda1,0x1c03b735,0x14ce64ac,0xfd302036,0x01240290,0x5837ebe9,
  210874. 0xa554097d,0xcaaea1a3,0xb0b88139,0xdce73d25,0xecb090b9,0x35ed412b,
  210875. 0xd63dab3c,0x99029ff7,0x062db071,0x555437d9,0x42a4c11d,0x277d2f56,
  210876. 0x24fc9109,0x477fa645,0x2799254d,0x7b12e9b7,0xd84c618c,0x7ad2ae22,
  210877. 0xce8ed195,0x0a8d5663 },
  210878. { 0x0a21fde1,0x43ac5163,0x6903d849,0xcfcf5dd6,0x5fdd6281,0x6d2499ee,
  210879. 0x77a49a34,0x4dedc6f0,0x2875c06f,0x46bda2c0,0x347b8046,0xd0e0e0f6,
  210880. 0x5e67836f,0x1058169b,0xde8a8042,0xc961912a,0xa93b3d32,0xdf3fea0a,
  210881. 0x0c576bc5,0x9f138edb,0xd8d37e47,0x7971ad6e,0xcce5e7cb,0xeab85739,
  210882. 0x1d202b40,0x88a4b434,0xe3a1fd26,0x5d842557,0xb3a86f91,0x872fabd5,
  210883. 0x6aa4629f,0x95b93493 } },
  210884. /* 124 */
  210885. { { 0x99f951de,0x9998a701,0xf058db45,0x8fade596,0xf3d03dd3,0x4d479c1e,
  210886. 0x33b141d3,0x6e928d5d,0xacfe8a40,0x9a465800,0xc1cefa3d,0xd108ad2f,
  210887. 0xe013726e,0x64b96921,0x8e83bb9f,0xb9b6a6b6,0x1242e544,0x29f1e6dc,
  210888. 0x2f65966b,0xd3f8f676,0x5e105b41,0xa34dd096,0x16011e1c,0xd4e9139a,
  210889. 0x2515541b,0xeea4dc68,0xc822166d,0x6f8030ac,0x31d16124,0xbdc7ae1d,
  210890. 0x621afa7d,0x2e25ef51 },
  210891. { 0xdd8e7357,0x2533cf8f,0xeaceddb8,0x333ba218,0x0784d2ac,0x68e3e31d,
  210892. 0xf2804ae2,0x1c927f36,0x77e7ad7e,0x01433d22,0x587f78a0,0x0b401cf0,
  210893. 0xaa0027ae,0x9dfcf036,0x1d9a46b5,0xc9e46c8b,0x1f288d32,0xaa6de486,
  210894. 0x1b8a043d,0xdd56da2f,0xf2d0bb56,0x346230e5,0x19defb56,0x19f0b6e4,
  210895. 0x21d2c874,0x55ec37cd,0xb70e45b3,0x3dbf0397,0xac7ce852,0xf0862a8d,
  210896. 0xe141f3d6,0x87979ea7 } },
  210897. /* 125 */
  210898. { { 0x7f1c747f,0x9b7e7b3f,0xc6e63369,0x151a4c1d,0xb372dba0,0x4273ff70,
  210899. 0xd3ee54fe,0xca6d2234,0xd33cae0f,0x12fc8e0c,0x5dd6f10c,0x27328538,
  210900. 0xf01a9cf9,0xc86f3fbd,0xe36cae91,0x5322677f,0x2fefea44,0x39a70033,
  210901. 0xce8af217,0x2c9ca328,0xf6a731f4,0xc0256776,0x66a96813,0xc687b3df,
  210902. 0x8db2eda8,0x194aab12,0xeec4febd,0xde30dc5a,0x979241b2,0xc052236a,
  210903. 0xc23d4c16,0x3ec98802 },
  210904. { 0x4072f74d,0x0f9e760c,0xab594059,0xe78eb0de,0xc9b009c2,0xdb3dea40,
  210905. 0x38b59ae5,0x47e875f0,0x2b4daa06,0xf40eb436,0x090f3788,0x9a6a4f92,
  210906. 0xedbfaf8b,0xefebe9af,0x9867e256,0xf87f96a5,0x75ab6aeb,0x1e6fed23,
  210907. 0x3fdb13cb,0x17f2782a,0x70fa2621,0x5102c71e,0xfd4c0dbe,0x5d2b06ec,
  210908. 0x30347297,0x537cc268,0x2b67e780,0x8dbf5e2b,0xba25da32,0x2f633f3a,
  210909. 0xefaec914,0x3e9315e8 } },
  210910. /* 126 */
  210911. { { 0x239a9ea9,0x9255cfa5,0x0be33a62,0x20f3c690,0x9cb642bd,0x759eeb4b,
  210912. 0x00bae718,0x3316c546,0xf3410f84,0x874a76d5,0x90f129b6,0x123b502e,
  210913. 0x12851f1c,0xadc8f9a8,0x1b62408c,0xf57b764a,0x1a80777b,0x116ec01f,
  210914. 0x1f0ddc5c,0x746ecef2,0xe5a6a5a7,0x3c49d47c,0x06e955ba,0x1e15dbe7,
  210915. 0xb45d79b0,0x629c0c79,0x778d1087,0x11278308,0x8c6a22d7,0x22585dc7,
  210916. 0x0a682791,0x2ed02a0d },
  210917. { 0x4daa2682,0x53043416,0x01359625,0x0e26d32b,0xbd867097,0x449c834a,
  210918. 0xee77ae2e,0x11a19d2b,0x3af6c169,0x39bd529a,0x5cd61054,0x36cca5c0,
  210919. 0xdc6c0fe1,0x6370a59b,0xb93d5135,0xca420d27,0x554c451a,0xd8730d45,
  210920. 0x96cdebf2,0xebd258c9,0xa50f9a05,0x0cb1b990,0x7b0f0151,0x69a8c97a,
  210921. 0x11d217e1,0x2cc36d34,0x752f75e8,0xf117688a,0xa09b2a61,0x1db01394,
  210922. 0xa9efd7dd,0x14627844 } },
  210923. /* 127 */
  210924. { { 0x232803cf,0x6bca3aed,0x9a96ff34,0xc1e4398b,0x74ab788b,0xcaf6757f,
  210925. 0x7e68c04d,0xc3a53e00,0x5cb7cd20,0x5f969c19,0xdc068bca,0xf28b65a6,
  210926. 0x1d863032,0xe3ca01d3,0x87808e14,0x9b733b81,0xefe618be,0xb5d704d9,
  210927. 0xb01b946d,0x276f3542,0xfbedddbf,0xe057e19e,0x903275ce,0x7d182f2b,
  210928. 0x880f7bc6,0x3cdc5f77,0x78476c14,0xd6f03d3f,0xa9ba5072,0x035f5557,
  210929. 0xb4029628,0x7acb57b6 },
  210930. { 0x44e6b07c,0xd2413569,0xe1c7345d,0x451c4cc9,0xe273b9fb,0x407444d8,
  210931. 0xb88e34fc,0xfe496079,0xf152776d,0x77d184cf,0xc742299c,0x6d1033b9,
  210932. 0x77bf2897,0x29a0a684,0xee8f0420,0x59ffdf10,0x44bb56d6,0x4e17146c,
  210933. 0xfb9ae855,0x831d06c2,0xd93e7cd5,0xb2cb82db,0x3c96b607,0x83381c46,
  210934. 0x7549e2a8,0x06aed251,0x774a21d4,0xef97891c,0x8675fbdd,0xae9807c7,
  210935. 0x6363516c,0x6a5a05b9 } },
  210936. /* 128 */
  210937. { { 0x6a8f4f33,0x92e71ea6,0x4dea8f4a,0xf2fc6fc6,0xfee88461,0xd356252c,
  210938. 0x08954d08,0x59b0a83e,0x468ab766,0x5bd68c23,0x900f8d04,0x40281357,
  210939. 0x52b867ae,0x181c19c0,0x18764c41,0x986a5169,0x13575d24,0xcb01dfae,
  210940. 0x593677b7,0x17269ae5,0x46dc9b19,0xf6d17025,0xc40097c8,0x8de68499,
  210941. 0x259c407b,0x76df0032,0x17d29d8b,0x4091aad9,0x4a7ab5f6,0xa7f46d21,
  210942. 0x70ece48c,0x688054b4 },
  210943. { 0x51a5b86c,0xf0d168aa,0x95777247,0x2437e4d8,0xf1720329,0xae844076,
  210944. 0x9647a54e,0x0a7ac87d,0x0405622c,0x1e597a4b,0xf0a79f2f,0xedefe5c6,
  210945. 0x4d55156d,0xaf3ef0c2,0xef047cf6,0x917fb04e,0x54b62137,0x3792799f,
  210946. 0x314be0b8,0x875ea32f,0x0c466b0c,0xe157c65b,0x7e218978,0xd28c90ce,
  210947. 0xcde587af,0xb90fc3ba,0x8b877bed,0xdd32d71c,0xca8e10cd,0x3b432200,
  210948. 0xd94f6e53,0x0021f419 } },
  210949. /* 129 */
  210950. { { 0x43519d26,0x2191122c,0x40a51845,0xbdafac1d,0x548bb89f,0xcc6f71e9,
  210951. 0x16844bf9,0x9ef3375c,0x178e8d55,0xe7789f79,0x1f8be1c5,0x04f599b6,
  210952. 0x2cbbde40,0x8088c99a,0x893206c9,0x8939a260,0xfcd30851,0xa1ae4bff,
  210953. 0xe08feafe,0x664cb3fe,0xff14aabc,0x61f38099,0x2a841ef9,0x0d8394cc,
  210954. 0x17f01db6,0x75fad8ad,0x6debb773,0x6fc34576,0xa4252512,0x1e716b05,
  210955. 0x29e1ed9f,0x79855880 },
  210956. { 0x95106473,0xa2cb3aaa,0x5a61da04,0x95fafa41,0x539563c0,0xfd3c9362,
  210957. 0x95312b87,0xbaa48091,0xbf885c76,0x6c7e7582,0x230c78d5,0x70f6dab6,
  210958. 0x7747440d,0x8ce3051c,0xffdb6186,0x6dbebd14,0x190e4096,0xb0e041fa,
  210959. 0x6ee62e2a,0xba10c466,0x74f333d6,0x93d57e2a,0xfe7b9b66,0x006aadc4,
  210960. 0x06d2837d,0xfaf72f6c,0x910741ea,0x318cc5e6,0x65692477,0x9c502609,
  210961. 0x1d0fb08d,0x95d823c3 } },
  210962. /* 130 */
  210963. { { 0x140528a5,0x6aeebd86,0x53979bc8,0xf268c2ba,0x4ec144ab,0xb1bc9b8a,
  210964. 0x82a7d7ed,0x1efabb0d,0x4e0118d8,0xf12c70d1,0xa1c1558e,0x31607168,
  210965. 0xe4b7e73e,0x33e428b7,0x83aec9dd,0x63176637,0xe12ac35c,0x5172ffbe,
  210966. 0xbc17b2a4,0x37df0bfb,0x741f812a,0x4212f870,0xe2888f9c,0x3dcecbdb,
  210967. 0x756ca55d,0xa9dc15aa,0xb9028e41,0xf31918ec,0x6aeadb03,0x7ede0285,
  210968. 0x78654f54,0x0e2708d5 },
  210969. { 0xcde20f88,0x2270cc53,0x5f5b1039,0x9338272c,0x5dcb1dbf,0x5042e19e,
  210970. 0xb72d74c1,0x4b3de219,0x2aaaaa55,0x16c49a8b,0xbba86ba6,0x008443e5,
  210971. 0x20cf1695,0xee6bcd72,0xa89abd11,0x59ffac6b,0xf115639d,0x2831217b,
  210972. 0xf34cba52,0xe4d28af2,0x0727a906,0xf27f03e7,0x69017766,0x6842c79f,
  210973. 0x7a81123e,0xcb3469bd,0xa42973b8,0x48c0f346,0x23990dbd,0xfc5784a6,
  210974. 0xfb299678,0x0d3dab3b } },
  210975. /* 131 */
  210976. { { 0xce29c3cc,0x8f8376e6,0xf016cbc6,0xcb0507ec,0x5e394ce1,0xdebff996,
  210977. 0x73c50d41,0x24fc526f,0x2d16ce3d,0x4edd5a54,0x91c13141,0xbb37bdd9,
  210978. 0xe33a8606,0xe3442ef2,0xc0629da8,0x2ae90337,0x592ab331,0x57faec64,
  210979. 0xd82b857b,0x1a938997,0xa3373176,0xad6c8cb9,0x9086751f,0x82595de2,
  210980. 0x18c17196,0xa81e97fb,0xbf697357,0xe4f48a13,0x5cb89f69,0xa1387c2e,
  210981. 0x5874b426,0x530b4eeb },
  210982. { 0xbab7b5ae,0xe9f275a1,0x03a57bf4,0xbb69dc4d,0xa45c505b,0xc974dc4a,
  210983. 0x416ac402,0x726369f3,0xaed985dc,0x735e4e78,0xcdd446a1,0x0548d879,
  210984. 0x9e16b02a,0x84ceb069,0x789b11a6,0xf73f6fa4,0xb2a4e784,0x6aa0c41f,
  210985. 0x93a9b697,0xb1f76902,0xf03a8ab2,0x814cce00,0x844d66c1,0x64cb255b,
  210986. 0x30952201,0xb794e7d6,0x3da32271,0xe052d4e4,0x08b6a4d9,0x5278b2e7,
  210987. 0x80c6577f,0x90942552 } },
  210988. /* 132 */
  210989. { { 0x0d5b4c2f,0xd269a14d,0x5c8a649c,0x2b8fc59b,0xb0e37d4a,0x95becb3a,
  210990. 0x9111037e,0xfda1a768,0x94e35322,0x5810e05a,0xa178fafc,0xa24dcc12,
  210991. 0x8e3dce62,0x5c2c63b2,0x9452c444,0x995c3f17,0x42d45161,0x35330ec3,
  210992. 0xb4ef8129,0xa025a60a,0x8bae9c13,0x85493252,0xe2e3caf8,0x25d1a606,
  210993. 0x3649bf47,0xd44091ab,0x704ec5f1,0xc7d0afbf,0xbd8b3333,0x27bd1d62,
  210994. 0xcfe616f5,0x50570111 },
  210995. { 0xf534356b,0xd0084ace,0x4b4b0fbc,0x9df1de05,0xcee04dc1,0x021afe05,
  210996. 0x361b78e1,0x64bde688,0xef78d38b,0xa324fcc7,0xeb0a5e4e,0xfeb372ce,
  210997. 0x65811996,0xef04fcb3,0x5eb0ab4e,0x7dce5d50,0x238c586e,0x1e29b588,
  210998. 0xbcd80037,0xde5e3197,0x4806b9cf,0x8bf5e451,0xd18e67ab,0x4330968b,
  210999. 0xf9f63fad,0x26a7d04e,0xb5c18bb4,0xa1c7f123,0x25dce22c,0x485b8482,
  211000. 0xd540e79f,0x8ff0b36f } },
  211001. /* 133 */
  211002. { { 0x3ff42cff,0x99f2e2f4,0x1c35317c,0xa3c19f9d,0xaba1b545,0xdb749392,
  211003. 0x4afa9a32,0x84232b05,0xd7dcd436,0x0b855d46,0x45cf9915,0x8ac35e20,
  211004. 0xf001a218,0xd7cf22c7,0xed408305,0x057d35ae,0x553ccfcd,0x25a4a519,
  211005. 0x93e2b939,0x5e565793,0x3422ec27,0xa20332b0,0x3ac53958,0x9b09005e,
  211006. 0x79e9b163,0x628051a3,0xfc6618d6,0xb4a0dc09,0x6748e7af,0x9e0e857f,
  211007. 0xc577d63e,0x71b28eee },
  211008. { 0x99726bf8,0x4942b0cd,0x1c208f3c,0x1290a3b9,0xb0598eaa,0xfd7290e7,
  211009. 0xa25a9128,0xc6a7791f,0xc037d7da,0x2d33db24,0x70e2837b,0xc21efeb0,
  211010. 0xe3dae2a0,0xbf70d96e,0x85076027,0x43ed8191,0x4d4ad7e3,0x4aeb0aa8,
  211011. 0xe8c5b74c,0xbc75101f,0xad26ebdd,0xdbfb2a6e,0x6b78aa4e,0xba812068,
  211012. 0xe1159848,0xc94aa8f2,0x3eba5c4e,0x0d10d9db,0x6318295a,0xce7fec47,
  211013. 0x330d925a,0x7294711a } },
  211014. /* 134 */
  211015. { { 0x32bbd495,0xfce45904,0xbe54973f,0x330f4dd1,0x5d9c3f4e,0x006bee1d,
  211016. 0x59ba7204,0x40ee6078,0x42c2c768,0xc194fd3f,0xe9fe88be,0xa0e76b12,
  211017. 0xec2b0210,0x17cddddb,0x00811ec7,0x689d436b,0x284be9e4,0xa6a6ba37,
  211018. 0x007d4114,0xabc395b2,0x0f11e744,0xf8cdf9f3,0xe9396402,0xc5febec8,
  211019. 0xeeb46285,0x8a751743,0xc6e0d137,0x99bf8782,0xbeb292e3,0x3965e170,
  211020. 0x5801fd5f,0x001c39d8 },
  211021. { 0xda4a0912,0xf4805cb9,0x4410bca4,0xd27cb76a,0xec71d65b,0xef3dcb8e,
  211022. 0x4816849a,0x780fbb2b,0xa8b24635,0xef6a7026,0x12c44e68,0x15625c88,
  211023. 0x4d7a74a8,0x624c232c,0x4b1631e4,0x81a77037,0xdb917c2e,0x04e4f7f1,
  211024. 0x1f61ed95,0x1d0465fd,0xcbde6e3d,0xb1048049,0xd7131fcf,0x637ce0c1,
  211025. 0x8ada4715,0x22e4dbc2,0xace99726,0xf7530c5c,0xee287450,0xa0160dcc,
  211026. 0xbb91af13,0x9132e670 } },
  211027. /* 135 */
  211028. { { 0x7996099d,0x8057efe2,0xa06e608c,0xb72344db,0xd0958588,0xeb4a8740,
  211029. 0x79e5aee9,0xe53daf06,0x908a2fad,0xc9560a9a,0x107e706a,0x7f4be131,
  211030. 0x2830246a,0x6d5f3d9b,0x27cca3e6,0xa5f8e8da,0x4c28f292,0xeb51dca6,
  211031. 0xf31dfd78,0x4cfa310e,0x2ca073e5,0x92e0c7c2,0xa40da683,0x102f1694,
  211032. 0x750d38fc,0x16bb07cc,0xbadae035,0x703e83e2,0xb4d3c9dd,0xea93c066,
  211033. 0x79940ed1,0x7d0b03e5 },
  211034. { 0x4dd94c63,0x5fe7ea30,0x738b0b3a,0x57ef01c5,0xa14e6b4b,0x9534a78c,
  211035. 0xa5353276,0x07622cde,0x7c22d006,0xaf696a07,0x7d46b209,0x733c1886,
  211036. 0x626c2b4a,0x9654ccbb,0xa84f3c4c,0xa098d3a1,0x2d734b74,0x3596f9ed,
  211037. 0x5d551c90,0xdfd3021a,0x1ec5123f,0xe2ba7d2f,0xb2c1aa39,0xf9726925,
  211038. 0xf8eb2927,0xd2e75d0e,0x19192a6f,0xfaba712e,0x9b83e50e,0xa606b43a,
  211039. 0xdab5de60,0x31b1782f } },
  211040. /* 136 */
  211041. { { 0x4034db92,0x878dba45,0x8f34dc4d,0xa3977901,0xdf754c33,0x8d004f2e,
  211042. 0xcd563a88,0xeaa5954a,0xbb5ffad1,0xa29d6c89,0xb0d8bdb8,0xa8adf655,
  211043. 0x8cdbdb47,0xf7fb842d,0x80d3205b,0xb72e3a03,0x7cac7ca9,0xc335b0b2,
  211044. 0xd8a5475d,0xffc60bcb,0xeba4d25f,0x736f7719,0x0c50fca6,0x3d901c38,
  211045. 0x80c01900,0x1fdacf7b,0x5681f84d,0x75cf658f,0x5cefbbc1,0x57a7e634,
  211046. 0x3e07ed1f,0x6fc0fbe5 },
  211047. { 0xb81b0e5f,0x496d116b,0x2ac853b8,0xd82dd2a5,0x327387f0,0x357e22d4,
  211048. 0xba912c59,0x3e332a84,0x49d5dcc1,0x8b71c643,0x438d85d3,0x0c982ee9,
  211049. 0xbf7fcd4e,0x90b9553c,0x38fed5e3,0x2cb39bbc,0x5ac42903,0xa2c67c9c,
  211050. 0xbf07da55,0xebf21217,0xa0b9e4ee,0x55ac05ad,0x8ee9e0c6,0x10bb12c2,
  211051. 0x48bb6e3f,0x5cf3aee5,0x8b046e91,0x4ae7269c,0xaa0e553f,0xcb266012,
  211052. 0xa94c8fc8,0x701935a1 } },
  211053. /* 137 */
  211054. { { 0xa4626dea,0xde58d41d,0x15b9039f,0x25ef66ca,0x3164e65b,0x99a810a4,
  211055. 0x748cfccf,0x9fe6daad,0x2f142fa9,0x7ab9a6bd,0x5d471796,0xa4cba168,
  211056. 0x6bc3a39b,0x12d30b36,0x8bf45076,0x1f46a5dc,0x1421ac0e,0xb868e529,
  211057. 0x59bba1c4,0x7a686206,0xda698b90,0x2b4b552e,0xe5453707,0x5039dcd4,
  211058. 0x9e90165f,0x42a07a9e,0xd7d45dfc,0xa838fff3,0x3b5ceb30,0x41991e5a,
  211059. 0x969ca600,0x6c961ec8 },
  211060. { 0xc4e7eb46,0x703bdc1b,0x596c7b48,0xd6bac557,0x66afd74d,0x4f9917cd,
  211061. 0x656ce6f3,0x56355105,0x32497175,0x3d1fb50c,0x63effb2d,0xfda6783e,
  211062. 0xeefaa2bd,0xbd79f1f3,0x17af9ef7,0xa4efbe54,0x5a55b7a4,0x6cef6462,
  211063. 0x1a713304,0x116f3238,0xb95625a3,0xdb2a2a7f,0x0b027e96,0x6a0aa43a,
  211064. 0x4832b3bc,0x458fe5d2,0x5adfaac0,0x523418df,0xc49e7f9a,0xc05a89cb,
  211065. 0x69e24b53,0x830883d8 } },
  211066. /* 138 */
  211067. { { 0x02557389,0x959b1c62,0xadefc0bc,0x5fe5ce97,0x8330f383,0x893bbe7f,
  211068. 0x16cfb81e,0x27e0c6af,0xd04428fd,0x6f64e65b,0xb79e6182,0x53de9245,
  211069. 0x487e11ca,0x08a313c1,0x445bce93,0x65cec3b9,0xd67ed49e,0x33bc0314,
  211070. 0x30782352,0x69f36b24,0x93ad31d2,0xd78e5daf,0xc780890c,0xf2682b70,
  211071. 0x9e45efe9,0x7015c34f,0xe6cbafea,0x135d4ba4,0x7e3fcc6c,0x43a378a4,
  211072. 0x96638f8c,0x2376f97f },
  211073. { 0xae575b99,0x0a6e1ec0,0x81b970dc,0x7e14cb4f,0xd3a73947,0xf00a3824,
  211074. 0xfb235a9d,0x0b4b9c81,0x5bf62944,0x8d15115f,0x1e165d7a,0xcfd35b43,
  211075. 0xb2ee3e3b,0x5d12fea2,0xf5182e7b,0x629984a6,0xc365d08e,0x4e43e2f3,
  211076. 0x30f36e72,0x99327091,0xfd345401,0x698b4a00,0xbaf96dce,0x23c4fd0e,
  211077. 0x23675554,0xa60ba0ae,0xb0325784,0x51bdac2d,0x215464a1,0x8ab4190a,
  211078. 0x6bf10296,0x8c461661 } },
  211079. /* 139 */
  211080. { { 0x2d1f36a5,0xeffca258,0x894c5f2d,0x0eded2b2,0x43ced84f,0x35a5cdb8,
  211081. 0xdb0e3b9b,0x290f8982,0x0719a112,0xcce0eaf0,0x39a362d6,0xd0e657e4,
  211082. 0x62697e47,0x5516a55d,0x8e636514,0x269e1f77,0xd50269bc,0x5e3dedcb,
  211083. 0x441c57c5,0xecec2300,0xc705578d,0xdb83f31c,0x1e489eab,0x1bdefb73,
  211084. 0x395fcdb4,0x20b678cf,0xff9db001,0x908cf91c,0x55f52cc8,0xcbebc6f4,
  211085. 0xb4c61162,0x155ea622 },
  211086. { 0x876fa42e,0x94be2f1f,0x7fadeee7,0xab5e8749,0x38c865af,0x692e70f5,
  211087. 0xdf8059b0,0x16e99b84,0x8b5a7ac9,0x0ceb606e,0x2d463d2b,0xced23357,
  211088. 0x2a9a09a0,0x2d0f2623,0x3861fbdf,0x2529998c,0xc1be310b,0x711888a7,
  211089. 0x0d8aade3,0x9b1229c5,0x3b13533d,0xdbcf9b78,0xff029708,0x3ca746f8,
  211090. 0xda83ef88,0xa5a013a1,0x4ab28444,0x8e904d18,0xbcbd4aba,0x2fe84b3d,
  211091. 0x259058c3,0x8f570f24 } },
  211092. /* 140 */
  211093. { { 0x2ca9c508,0xdeb66c8a,0x69d6b780,0x2dc5bec2,0x88ead600,0x16d61266,
  211094. 0x49d72614,0x61841b97,0xce472e6f,0x41e40e6c,0x1fa7a876,0xada24264,
  211095. 0xcc3997a0,0x45b9fd33,0x7c15dcf4,0xb25e8fa9,0x12e9629d,0x0124ceb2,
  211096. 0x7db3d956,0x3a8c72c6,0x7c1a7844,0x8e2ded2b,0x6dd027ff,0x94ab09c6,
  211097. 0x7e7a2bc6,0xf89a057d,0xcf70c763,0xad8bf226,0xc8a26212,0x4cb268e7,
  211098. 0xb2c44c1d,0x3d171e87 },
  211099. { 0x8ce49820,0x382ac16e,0xc0c44dc9,0x24ee45e2,0x73e858c4,0x0ec67912,
  211100. 0x46327cf9,0x918cb25c,0xc6159c1f,0x43e3876b,0x37545cb3,0xb6b6e0e0,
  211101. 0x5d12347e,0x64b839ab,0xa300d541,0x72e09274,0x881c1169,0x26ab28e6,
  211102. 0xeb75a843,0x4a580fff,0x359120df,0x0a5802ca,0x3209f4a3,0x7fee82d0,
  211103. 0x8e6a9380,0xb518016b,0xc2ee11ca,0xb99c6c70,0xab9d4ec7,0x16105af1,
  211104. 0x34cd9004,0x234e98f8 } },
  211105. /* 141 */
  211106. { { 0x14db9cda,0xff435208,0x96adec90,0x99cfdc47,0xaf458b6d,0x843aaa6f,
  211107. 0x743eaa31,0x3f1f7415,0x61735d81,0x915e192e,0x0ac595d5,0x3441a22d,
  211108. 0xc044bc8d,0x704bbf67,0xbe23a236,0x2f960471,0x15d1d557,0xcc326388,
  211109. 0x76b1dd94,0x9410230b,0x0c1c8a67,0xf2e5439f,0x833c910d,0x56b141ac,
  211110. 0x865b84df,0x467c999f,0x21f02b7b,0x1b0251fa,0x96216950,0xde5b5260,
  211111. 0xce3a1e93,0x6a2130e3 },
  211112. { 0x4b3ca1a7,0xd21b67a0,0x00c0ce80,0xaf42ed53,0x932cf07a,0x22ccd368,
  211113. 0x5c25c35a,0x36523a81,0x8dd04d06,0xecdd3958,0xb2f93a3b,0x73da3502,
  211114. 0xd5e5b530,0x4c5e0c3c,0x13268777,0xef9f5486,0x1e742292,0xed87fefc,
  211115. 0xa24e5ede,0x6d9ac29e,0x33849f1a,0x08abc9f0,0x40f23905,0xb09b2292,
  211116. 0x7f934353,0x6791072c,0xe6aeb550,0x102a6381,0x96feb870,0x3ee07409,
  211117. 0x9c4d2830,0x34f06faa } },
  211118. /* 142 */
  211119. { { 0x2348f005,0x869dc79f,0xdf4920b1,0x9b5c5d71,0x6dee64a4,0xfd1b57ca,
  211120. 0xe82a4fb4,0x21b7f734,0xb9578366,0x637cb834,0x7d287d96,0xc934101b,
  211121. 0x0392ecab,0x1590f8ac,0x7f75f4e3,0x280dc373,0x6a61ac62,0x8b36f50f,
  211122. 0xa65568da,0x74f58304,0xd930870a,0x80d792a9,0xfc8895cc,0x6d17b192,
  211123. 0x4914939f,0x498392fa,0xd41d5b9e,0xaf36027d,0x5caa82b5,0x452d79e2,
  211124. 0xf4115d1a,0x764d47b1 },
  211125. { 0xa2ee8b9c,0x5df22303,0x85dfcd48,0x1b9f72d3,0x10813a37,0x6b42b983,
  211126. 0x3de741f5,0xe28c523b,0xf303bb5b,0x0857625a,0xac9bf9af,0x926f299a,
  211127. 0x0d445b34,0x21beac08,0xd6ba2c0e,0x6a523a02,0x7fce2864,0xe302a1b1,
  211128. 0xe300c1ea,0x4516a235,0x7b4a9311,0x4543736a,0xc0cc89f7,0xd3c0b9e8,
  211129. 0x40ed88de,0x0481904f,0x3cb7fc70,0x4f269b56,0x321b9738,0x09a1d53a,
  211130. 0x230a3810,0x1c0dd9c3 } },
  211131. /* 143 */
  211132. { { 0xc46a7d9a,0xffaa1f67,0xbedf91cc,0x64743334,0x47a42f2e,0x45833a74,
  211133. 0x241ffaa9,0x67980051,0x335efe6b,0x70979a84,0xf08b2403,0x5f0613f5,
  211134. 0x64f211dc,0x6bb22fcd,0xa0572cfc,0xe1b8b2a3,0x7950a14a,0x19e0eb41,
  211135. 0x3eb6cd4c,0xe634bb29,0x470a25ff,0x31a04b25,0xa3d15a0a,0xa41f7ac9,
  211136. 0xbf2fede9,0xefed85ec,0x81b94a00,0x1f581f5f,0x9ef4a15c,0xaa3996b0,
  211137. 0xb06041bc,0x52d8be39 },
  211138. { 0xfd631a2f,0xbd1536f6,0xb351a8dc,0x91fae7f0,0x9b126212,0xd1a590c7,
  211139. 0x2bd0f435,0x52d4875f,0x92b0ea70,0x9aedb6d3,0xb83ab89e,0x0bd0abdc,
  211140. 0x89fe192c,0x827a1062,0x102a0bda,0x6566a960,0xce036814,0xda083037,
  211141. 0x58639405,0x30bed79f,0xdbca8df9,0x972019b6,0xefdaa3f5,0x89201286,
  211142. 0x5236b892,0xb337b996,0x28fc2e73,0x11d3e38e,0x880e8da3,0x70787f41,
  211143. 0xdae4a45d,0x6cff6367 } },
  211144. /* 144 */
  211145. { { 0xf89a8bb4,0xbd3d0433,0x93b98f71,0x42144c33,0x03470a2d,0x82b616c8,
  211146. 0xe5da089e,0x98fcc757,0x7bf5fda6,0x542354ef,0x9ebd34cc,0x1885c253,
  211147. 0xbec5dd0d,0x2e20b285,0x782a1bca,0xe71bbbe1,0x9b854ef0,0x959ded30,
  211148. 0x8997fa6a,0x17249979,0xd81f3c45,0x50cf8fa8,0x60c11152,0xa9a3b517,
  211149. 0xecf845ea,0xc9b0ef7d,0xb9fed11b,0xc9339e23,0x28256080,0xc93e9c5c,
  211150. 0x613ec1e7,0x1d2c8217 },
  211151. { 0x987cfc93,0x7381347d,0xf187f810,0x047603bb,0x1250ca31,0x3fa6bc9d,
  211152. 0xbb055bf3,0x480091e0,0x3a3af87c,0xbdf95f1a,0x140540ab,0xe2687770,
  211153. 0xd7fe045b,0x998df730,0xb723bc2d,0xb398135f,0x15ebec46,0xac230f8c,
  211154. 0x5f5561c0,0xe08e1830,0xda60a47f,0x7c0fbf4c,0xe16d4bfc,0x06e95c24,
  211155. 0x74617e92,0x74163495,0x4ae0c20e,0x39719869,0x2131e2b6,0xfe269312,
  211156. 0x0a537722,0x25486e36 } },
  211157. /* 145 */
  211158. { { 0x53572806,0x618795ca,0x656968e1,0xb2c89449,0x3fb323ae,0x149c2c97,
  211159. 0x409bc7d6,0xfb15de26,0xc79121b3,0xa90cda72,0x204cabbb,0x6d2fa14e,
  211160. 0x91604125,0xcbcda6f7,0xb435f947,0x25086261,0xc282eb10,0xdb686c38,
  211161. 0xf1a791cb,0x51016d62,0x61a2266c,0x6b1c7ed1,0x271d74a6,0x26780666,
  211162. 0x824287a4,0xb5ffeda1,0xbbe4f0f3,0xcbe503ff,0xb9482a74,0xd7f7f0be,
  211163. 0x088493f1,0x751b2358 },
  211164. { 0xe9c9be68,0xd597b9d6,0x67d10c6c,0x1794b5c4,0x7762b2f4,0xa88cdc3d,
  211165. 0xa1b44e11,0x6d94a63a,0xaaa8eca8,0xfb0bbbb9,0xc963d87f,0xf4b0f2d0,
  211166. 0x5dc7075d,0xb753062c,0x49933989,0xfed726ac,0x57f9ccde,0x5da60638,
  211167. 0x75f8c766,0x221c392a,0x5dc672ca,0xcd264d95,0xb66ecc8d,0x7004ff22,
  211168. 0x18a458ba,0xfb1aa9ae,0x8babd653,0xea9644df,0x2ba0de7c,0xa9378e80,
  211169. 0xca2c6c75,0x144cc12d } },
  211170. /* 146 */
  211171. { { 0x2989aa3a,0x593a0a1d,0x59e6e64d,0xd83f2283,0xd32e732e,0xe938b0cb,
  211172. 0x3c3cb249,0xf4c464c5,0xf89ea6ac,0x9750a5f8,0x346cfc32,0x467e5bbf,
  211173. 0x37b2b809,0xc9bfab9d,0x3b339c6d,0xf8eb7453,0x3b766dee,0x3fe01fbe,
  211174. 0xef6aea27,0xb3154254,0x7be61b10,0x555c3df2,0xdd818488,0x70fb6d81,
  211175. 0xbbe714f9,0xda1af3a4,0x9d18f693,0x575f2017,0x2465b839,0xdc08fc6b,
  211176. 0x6b84a951,0x874ecf33 },
  211177. { 0xbbb3f6be,0x624af83e,0x08bb423d,0xf578fbb9,0xd7873527,0x5623b0ba,
  211178. 0xa62e0442,0xc3659bd8,0xfe236f79,0x2903b167,0xe53f26a6,0x55a430c6,
  211179. 0x3ad712cf,0x222547ae,0x76eb272b,0xb73890d7,0x3d628df9,0x95b4f70b,
  211180. 0x53eae4ac,0x9f0e13b0,0xe7f2174e,0x5b4f5138,0x98dbae17,0x75482cf9,
  211181. 0x44518480,0x2b69bbde,0xcafef15c,0x4f279652,0xb6bcaf19,0xa0a3ef2b,
  211182. 0xce4c634f,0x31fb8581 } },
  211183. /* 147 */
  211184. { { 0x615cd607,0x398306d1,0xaa32c3a6,0x680c9faa,0x7779131d,0xe87a705b,
  211185. 0x36708b00,0x1031013a,0x9445297f,0x814fa0e1,0xa6a79b56,0x70c5583a,
  211186. 0x4b16bed4,0x03039cbf,0xaaaaf8d3,0x18a7ca8d,0x5cdb68a5,0xf33159e7,
  211187. 0xd23814fa,0xdea0e738,0x8d0f4f9f,0xeb352718,0xdcdff032,0xb0b76609,
  211188. 0x3d48338b,0x65ba8ea9,0x55dd507a,0x18044d82,0x4a4a50b4,0x844a223e,
  211189. 0x18e19e54,0x98323000 },
  211190. { 0x57f3d5a6,0x28a21027,0x6e8cadcd,0xffce5648,0x02551f3b,0x9590381b,
  211191. 0x935ebdf1,0xb26cc64f,0xc083aa6e,0x60611291,0x88e4cf41,0xcd988a66,
  211192. 0xdd53b1b5,0x581c3f73,0x77fc621d,0x78c804a9,0xfadca2fa,0x31874330,
  211193. 0xc83ccf02,0xf7008da4,0xa79a4707,0xc4122a1d,0x4a915eb5,0x9a8e0d3f,
  211194. 0xd0123660,0xa2de157d,0x65ead2a0,0x45ef43b2,0x188db285,0xd0a22ade,
  211195. 0x922e0caa,0x8abbe39e } },
  211196. /* 148 */
  211197. { { 0x3a2d2f01,0xb4446905,0x5dc6685c,0xd27c3193,0x1d74a027,0x6a908bbf,
  211198. 0x5b50ec1d,0x01da350f,0x3f3c2e26,0x1d3dd45e,0xb836ee92,0xf66e11d0,
  211199. 0x474b979c,0x7e03908f,0x98b87834,0x19e7c5b9,0xbd3d1de9,0xa741d3fe,
  211200. 0x1ef6059b,0x63c68e8d,0x3674e247,0x9b9ff939,0x3e7e67f6,0x1d7d53e7,
  211201. 0xaee9e248,0x698dc326,0xb3bd984c,0x52f23eda,0x6f8fe8a7,0xf95e31b0,
  211202. 0xc3d0ba95,0x0f15b4d0 },
  211203. { 0x790a8d85,0x8f2f6635,0xe2595af1,0x51bffbae,0x24b51287,0xd15b7ec6,
  211204. 0x3234715d,0x7639b6ab,0x2bc5441d,0x0cdd5299,0xf6d05833,0x54800ea4,
  211205. 0xf6d6e360,0x21efd752,0x19290613,0xc0b7ffe5,0xeea898cd,0xb68a5825,
  211206. 0x22982266,0xecedba92,0xbbd06bb2,0x678a91b0,0x4bb6b0cb,0xb2436dc0,
  211207. 0xcaf8ea98,0xcf7a99e7,0x71aa05bb,0xb92d0e6e,0xf5993eb1,0xbf8d0471,
  211208. 0x20385ddb,0x515db378 } },
  211209. /* 149 */
  211210. { { 0x6f5bef22,0xee43eaaa,0x20348712,0x952d2698,0x7a3af6c6,0x1e4c484e,
  211211. 0x9a8c9403,0x18d434c6,0x5001899a,0x63e5d741,0xfe8ea40c,0x5238dbbc,
  211212. 0x96798721,0xca6cc8d2,0x04acbde8,0x73db6aee,0xb7f993ce,0xbf69328d,
  211213. 0xad45e334,0xa3f79bbf,0x7c1f1630,0x8c51ec93,0x9b00a6de,0x4907325f,
  211214. 0x12d82bc3,0x49e6acb4,0x0ec59fc9,0x5901b36d,0x9cf34e3b,0xcb09b710,
  211215. 0x1abf4c02,0x2de0487e },
  211216. { 0x8dd9d484,0x18b722f3,0x7c77bacc,0x83349393,0x93d92b8a,0x58dbb8f1,
  211217. 0x8e3fac25,0x80d78d50,0x745f4a7d,0xf0500981,0x877cc29d,0xd072bfed,
  211218. 0xc30a89f8,0x67abf8f2,0x9a0820d7,0x92c567ea,0x8a3a5738,0x425ab12e,
  211219. 0xf055521b,0xc162faeb,0xb94ea5e9,0xee1c4f26,0x3d71e546,0x1e414994,
  211220. 0x43e8be1d,0x258183b8,0xef9eae0b,0x44917c82,0x73874a30,0x6813a457,
  211221. 0xcc42f86e,0x6f6ac071 } },
  211222. /* 150 */
  211223. { { 0x4dd6e3b1,0xd38822ad,0xad620869,0xfc78e1cc,0x2cacde80,0xe7843845,
  211224. 0xa8469fe3,0x121cc14a,0xe67e8ef2,0x8e8f3da7,0x4d347448,0xdb83d16e,
  211225. 0x798631f4,0x3ba1dd98,0x0a4c4c17,0xdfab5977,0x3edc701f,0x1f0a1306,
  211226. 0x6cd8ff28,0x4649d601,0xbcc55bc9,0x2267230b,0x5760412a,0x02a19c60,
  211227. 0x328faef6,0xc719d5f1,0xf67eaad9,0x27cb969e,0x719bafb5,0xf342530e,
  211228. 0xff5a82cb,0x6e2c24cc },
  211229. { 0xadaf8793,0x6313024b,0x035c948e,0x944bccf1,0x953500bf,0xe9a066b7,
  211230. 0x1d116765,0x7991a946,0x9fd93c78,0x95addb2e,0xe92e5495,0x05d2c037,
  211231. 0x9f03e5cf,0xcb145b18,0x95aa1f72,0x81ae48ca,0x135a6e4f,0x203f2702,
  211232. 0x49b2a7d5,0x2bcef5a2,0x02d7f2a3,0x0687a900,0x6c6745b0,0x2f7d3228,
  211233. 0x86507305,0x3da8a875,0x2e8dc58f,0xbe38b884,0xdbf11185,0x6b48bf34,
  211234. 0x97c08f91,0x5af7fd0d } },
  211235. /* 151 */
  211236. { { 0xf4a224a5,0x55f9b950,0xcc50273a,0x41904574,0x643f1fd5,0x34f81330,
  211237. 0x0e50f783,0x996801bb,0x89581712,0x866d7403,0xa4091d36,0xdb9a405d,
  211238. 0x16a46fe7,0xf1e379df,0x83bf9168,0x8d04a93f,0x32b20bca,0xae4c8335,
  211239. 0xf72a1c10,0x99d334b1,0xd8195db4,0x8fbc9977,0xfba14b5d,0xcaeb3dff,
  211240. 0x76daf476,0x60fef022,0xdb5b72f4,0x4b948dfe,0xb6dfb062,0x5185c925,
  211241. 0x9609d4ae,0x27a9c381 },
  211242. { 0xf12a93af,0x73c37346,0x5536634d,0x028b707c,0x498193d1,0x8efa58d5,
  211243. 0xef21b69d,0x4f83a5cc,0xa788a0e2,0x05cbb0a3,0x65b13c98,0x01031781,
  211244. 0x2b73784c,0xfea20e58,0xe50361f2,0xdf9713a0,0xd0cc22d9,0x31449a0f,
  211245. 0x7c5e2e1b,0x183752e7,0xb67044cf,0x6e44d6bd,0x733e177a,0x012dde95,
  211246. 0x08ee2c23,0x68b49669,0x1f5f1949,0xd9bb0541,0x6acd886f,0x95182c71,
  211247. 0xfbde9244,0x1c690694 } },
  211248. /* 152 */
  211249. { { 0x3a880026,0x5db67d17,0x125d95f2,0x89c4f0a0,0x3f6cb7a4,0x29050551,
  211250. 0x5cbbdca5,0x3eb231d1,0x972bcbd3,0xf8cffc99,0xad55a03a,0xcb4ef4d4,
  211251. 0x22867c2f,0x944d47ca,0x0ead1aa5,0x96d88548,0xcbc8b045,0x76a57cf8,
  211252. 0x005e55a0,0xdfe5844b,0x1d18a097,0x5e9e7e19,0x52923c74,0x957a26e8,
  211253. 0x7f5db339,0xd0867b79,0x63bed0c8,0x2553408e,0x689ad23c,0x1596e5d5,
  211254. 0xa504c339,0x7b8c13d6 },
  211255. { 0x52fb6901,0x2fc43aad,0x16ca253b,0x1c0313f9,0x515aadc6,0x1475830a,
  211256. 0x7f577dc2,0xc93d1926,0xf723c0dd,0x26e52e8e,0x3eb9f6da,0x2f1e0eb8,
  211257. 0xf180376d,0x9979de82,0xb0834939,0x43e28ecb,0xa39c38e7,0x9a2d51dc,
  211258. 0xa8e3f6b5,0x6e6063a9,0x4b9b3270,0x4cf1da3a,0xd2f8915d,0x6e5348a2,
  211259. 0x50507912,0x5e75e3e0,0x20d383fa,0xaeffce57,0x8fd2fb29,0x1d6d53cc,
  211260. 0x696f4cd0,0x0e3c3ef6 } },
  211261. /* 153 */
  211262. { { 0x21ee1d83,0x3bc337c1,0x787b7788,0x97e08f6d,0x138fa4ce,0xbf709fcc,
  211263. 0xa0348e58,0xbaf77647,0xa55e672d,0x04f8babc,0x7d5ec5dd,0x0ed2919d,
  211264. 0x33e99218,0x8ce64bff,0x24b059af,0xac09fc57,0xdc5e32ba,0x506831f9,
  211265. 0x465af6a9,0x26a22677,0xc97f1ff8,0x3c5efe66,0xbc6087fd,0x1515e0d6,
  211266. 0xaa8edc6b,0xb1a39c5e,0x0e79ed29,0x3dd816bb,0xbc3788b8,0x6cc13769,
  211267. 0xc092a51c,0x463098e3 },
  211268. { 0xc8bd0fa7,0x3a6408c7,0xce6bde49,0xd1764311,0x283ef7be,0xe315e108,
  211269. 0x99b5d938,0x8213cc77,0x45a49a6b,0xaf7f1581,0xe529e4d1,0xd00fdb0f,
  211270. 0xce66c9d6,0x55d38f77,0x1bd4b952,0xb4f7ccc0,0xaf71f986,0x8d975b49,
  211271. 0xcd64d00a,0x12b59fcb,0xa5a3bad7,0x1860e504,0x2b5c89f1,0x6d976044,
  211272. 0x7a3e231f,0xfed0c659,0x178cba92,0x58114c33,0x6698e11e,0xe2e74c06,
  211273. 0xa348b85a,0x7f8fd093 } },
  211274. /* 154 */
  211275. { { 0xc19428af,0xf24592ca,0x3a308665,0x192a1c81,0xe30bbd7f,0x42589812,
  211276. 0x836c6bb9,0x10db0723,0x598e4987,0x9c7a41e9,0x6ead6f4b,0x8aff179e,
  211277. 0x75862c44,0x70f8f9b9,0x6f21983e,0x6b3b0237,0x98e65152,0x25d83e9b,
  211278. 0xd751218a,0x3b2d26a8,0x9d6f1da6,0x9508281a,0xa5a81f74,0x8df78d05,
  211279. 0xe4687471,0xd79ee559,0x6787d8cc,0x2060ca57,0xa8476c95,0x427a84ff,
  211280. 0xe6435131,0x87b64c51 },
  211281. { 0x4b30d3c4,0x87f46f65,0x23b4ef14,0xcdec4c5c,0x63ca4d68,0xb3b74766,
  211282. 0xcf3fb56d,0x1df34269,0x0fd7d46a,0xd4f139c4,0x6a69a8bd,0xa3b7c7c7,
  211283. 0xcbadd7d2,0xee56b4c9,0xac942334,0xb28ff342,0x786f1da3,0x0046fdfa,
  211284. 0xb700c82e,0xce5d149c,0x50966597,0xca30ef81,0xfcff4bdd,0x44a20609,
  211285. 0x44925268,0x0f2f65e7,0xd4021f38,0xe5b6552c,0x042dbbd0,0x77ea9c2a,
  211286. 0xd9c062f5,0x8c95267c } },
  211287. /* 155 */
  211288. { { 0x5fc1abb1,0x6655032e,0x12fe4743,0x2215af54,0x29f05ef5,0xfd657560,
  211289. 0xdc191be9,0xb0e73325,0xc08639b0,0x7ab3c65e,0x1c3e6673,0x67507f51,
  211290. 0xc8615555,0x638befc3,0x42f0c4ad,0x5d0188cf,0xd896186d,0x843a301c,
  211291. 0xb2c6741e,0x045603f7,0xfa3cd1d0,0xf7545c0c,0x4a40672e,0xf612affd,
  211292. 0x45b9e8dd,0x56197c9f,0x87922d74,0xb453237d,0x4b2d59bf,0xbf132e3a,
  211293. 0xb84a6a16,0x8afa1b73 },
  211294. { 0xe793ac70,0x6b3596ea,0xeef6dd10,0x4c94ef8e,0x70422e40,0x926b4fa2,
  211295. 0xe9e5d763,0xc8c71dce,0xf512aadf,0x352fcb70,0xa883975f,0x1b7ba138,
  211296. 0x058c3b13,0x57991390,0x97740fd1,0x9692092a,0x160b0697,0x19ad945b,
  211297. 0x10837ab2,0xbc634388,0xf174bb71,0x76ee11c4,0xab1b80eb,0x6111bfc1,
  211298. 0x70ec458a,0xbc82bac8,0x312d3325,0xeee60127,0xb240adc8,0xb4118b1a,
  211299. 0x2b5a093c,0x67211191 } },
  211300. /* 156 */
  211301. { { 0xf55cf9bf,0x91e99306,0xa46b96d9,0x9b045308,0x9e7a65df,0xae3c1e1d,
  211302. 0xc731bcbb,0x453cb151,0xa4d58a61,0x14be5227,0x97c74cc2,0x39dac922,
  211303. 0x822e00d6,0x4d0f7a45,0xc62b03df,0xafeb1d51,0xbaa18b2d,0xbb1dc3a4,
  211304. 0xdf2b74f0,0x7f3c7178,0x896b6a33,0xfcd328a6,0x1dce055f,0xe95ed454,
  211305. 0x6a4e2b87,0x97fbc76b,0xfa59dce9,0xe5ec67f1,0xcc0367c1,0x052368ac,
  211306. 0x54e4a3fe,0x7c863916 },
  211307. { 0xca7388cf,0x55e94b5e,0xc0335d38,0x17cc0a60,0x616f85ba,0x9b69b78b,
  211308. 0x10122980,0x705d02ef,0x1cfd0a79,0x565a6e80,0x7d1ee352,0xeb74a96d,
  211309. 0x427b9dad,0x5c8832ed,0xe6d5330f,0x96ea8528,0x18d24ee8,0x30d8862b,
  211310. 0x9ff939f7,0x9cd38ed5,0x01060252,0x690fc9a2,0x2303b3ff,0xc62d88b8,
  211311. 0xdd52b469,0xfc42d7a4,0x8cad2d93,0x06f8dfa2,0x60920438,0x50236090,
  211312. 0xfce855ad,0x32582758 } },
  211313. /* 157 */
  211314. { { 0x359e8c60,0xeb20e45f,0x364ca186,0xc71bb8a5,0xdff8e110,0x02b15071,
  211315. 0x4c93e578,0x074e91d3,0xb829d0d8,0xc0326e00,0x626a83fa,0x3c192258,
  211316. 0xfb29a09e,0x387a64d5,0xe5ac5c82,0xcaaa3d34,0xada2da29,0x8ed685e5,
  211317. 0xeb29650e,0x92720267,0x763802f3,0xf7184b19,0xdf6b1aea,0x23f5dd0e,
  211318. 0x25e6125d,0xbe1fa347,0x0c872a1a,0xd6287f9d,0xac57c3af,0x49aa93d2,
  211319. 0x5bda7656,0x1a4e6a71 },
  211320. { 0x554d1267,0x1a126ede,0x1cd02b48,0x37f94533,0xce31fb1d,0xd70af04c,
  211321. 0x097dc012,0xcf410b0b,0x36c7b6c5,0x930e1d17,0xc6891085,0x902fee41,
  211322. 0x79fb638f,0x349ba4a7,0xacd6f8df,0xa16c5821,0x2e076ace,0xfb3b83c1,
  211323. 0xe501d14d,0x6b8d033b,0x20f2d2da,0x0593d452,0x99df1880,0x3752526d,
  211324. 0x9feb33a6,0xca32351c,0x1f6ef456,0xd91343bc,0x35b9dc8a,0xc74857db,
  211325. 0x85b4e832,0x856a7c93 } },
  211326. /* 158 */
  211327. { { 0x0d0a5583,0xa007d002,0xeda4658a,0x2f1301dd,0x34d939be,0x91c07964,
  211328. 0xa70c0836,0xa0cb6780,0xbe81e540,0xc0b4df95,0x5d4ac8b8,0x6cbbcd34,
  211329. 0x54756239,0x57c52ed0,0x1805ceb6,0xcac2dca4,0x79344255,0x915ee6ab,
  211330. 0x24c9a2a6,0x366def31,0x8c12c674,0xbd3b962f,0x7dbb7c3b,0xaab64f1b,
  211331. 0xe22bb95b,0x3c0e4553,0xc4c63b74,0x2408feba,0x2a4da631,0x3ca77312,
  211332. 0xc636da40,0x62889084 },
  211333. { 0x8cb8d208,0xa457fd53,0x543f06d4,0x7a8f8009,0xf2eff2ab,0xb66de154,
  211334. 0xf72517e7,0xfddb28eb,0xf9389d2c,0x0149fe66,0xd85b88ce,0x79e8773f,
  211335. 0x0ba543f7,0x452e090b,0xb0b03fc0,0xdeb9b5cf,0x6c5ed77b,0x3113448a,
  211336. 0x8ffc0372,0x3609f3cf,0x5c1b4c4a,0x2bc9c46d,0x8fa59be9,0xe66f3bf3,
  211337. 0xcdb02691,0x1396bf5f,0x009f88f9,0xf1ec59d4,0x2ad9dfe3,0xc2903456,
  211338. 0x5ada4d58,0x79d8122c } },
  211339. /* 159 */
  211340. { { 0xaa529507,0x14d4e4ce,0x74655d00,0x056a0814,0x4f0fc474,0xc0d30a38,
  211341. 0x3443cb8e,0x8a8203ea,0x97f1728d,0x33c62fb0,0xb520ef52,0x8a38dcfd,
  211342. 0x7cac9d3e,0xa0f90d5d,0x873cea50,0x28a7b0bf,0x6c6c41cb,0xd115ae3a,
  211343. 0xa13812c1,0xa35171da,0x624d507e,0x25d4bba5,0x7e98f42f,0x91dad289,
  211344. 0x96a41371,0xffd6b1e9,0xb69e5b77,0xd46c2125,0x20c4f707,0xc7d2b424,
  211345. 0x8142557a,0x2ab3af95 },
  211346. { 0x6a5372a6,0x86ca074c,0x56292ba7,0x728fb83e,0x77741cf5,0x745596dc,
  211347. 0x520ef49d,0x70b4cea1,0x61e46472,0x1472fe34,0x3fb8ac5d,0xf4d6bd66,
  211348. 0xc10bc071,0x46e52cc9,0x371a3461,0x28794efe,0x276fe877,0xa4850718,
  211349. 0x9bef5ab4,0xedad5773,0x3f15c815,0x24c2d9ff,0x8f8395c3,0x188950e5,
  211350. 0x80b6a855,0xbae40996,0x8a8803e1,0x4f53e22c,0x039d25ee,0xaf233f61,
  211351. 0x250409ca,0x07db2c35 } },
  211352. /* 160 */
  211353. { { 0x037d4703,0xc7f3b8db,0xc5f488b9,0xe83708df,0x8471d402,0x1fba830f,
  211354. 0x5a2faae9,0xa55ee8d2,0x5404fc1e,0xc2e5bf10,0xaa2d5651,0x647d5027,
  211355. 0x7ebaf5f9,0x37a53c0c,0x95b30abf,0x7adf0bb2,0xd64c93ba,0x5a62e1fe,
  211356. 0xe2ef4a78,0x7ffc18c0,0x4d2cd04f,0x139dd9d9,0x5ea0af02,0x253fbab7,
  211357. 0x0fef9acf,0x7c8100ea,0xc8615aa7,0x74c5384d,0x9fe52069,0xcb28682d,
  211358. 0xcf7dd759,0x08b6ca8f },
  211359. { 0x036c3b5a,0xe04e5bea,0x7f9f2b4b,0x38726102,0x29797c0f,0xa9fca570,
  211360. 0x82879ea3,0x1656180b,0x607f0ddf,0x153389bb,0x67b0e087,0x99a1223c,
  211361. 0x9d897fc7,0x0d1808ec,0x916edf19,0x9470711a,0x07217118,0xf8f52f2b,
  211362. 0xd18888b6,0x5d8b29ff,0x4cc6f900,0xef1e22c5,0xeb24877f,0xc4036165,
  211363. 0x35479525,0xfda95233,0x6861468a,0xd622a421,0x74faba08,0x5d043b07,
  211364. 0x0d31a7d2,0x2c337b02 } },
  211365. /* 161 */
  211366. { { 0xea22fa65,0x7b2305bc,0xd159f63a,0xbe183ef4,0x3f35923f,0x3473d87d,
  211367. 0xc11d7753,0xb27fb306,0x2a054cff,0x702e7e6b,0xaf185619,0x3ce9f97c,
  211368. 0x4e7d51c5,0x83550243,0xf356ac5b,0xa63e3d82,0xd7645131,0x867b7caa,
  211369. 0xa671fc9d,0xee85e6af,0x2b07cd77,0x3b985ede,0xffda5193,0x07d598b0,
  211370. 0xa942dc36,0xb10eca39,0x506218a9,0x17f3dcee,0x06b7d5ca,0x3d94e8d1,
  211371. 0xed8831c9,0x509b2634 },
  211372. { 0x48caed54,0xb1b9414e,0xcbf51e97,0x77a78c6c,0x4de9b258,0xa4688c8d,
  211373. 0x91ee3d78,0x0024137c,0xe30ee64c,0xa68f9234,0x88190d78,0x573255bc,
  211374. 0xba80690b,0x41e8e05f,0xec354f4c,0x50038d84,0xdfa52816,0xb18f02d6,
  211375. 0xccb63fda,0xc47f9007,0xe98ae455,0x29d480fb,0x5d0e319d,0x4ac45d22,
  211376. 0x026db719,0xd06f3575,0x2c3587b9,0x733b9e20,0x2c317727,0x22483992,
  211377. 0x54bb8752,0x1592d5a7 } },
  211378. /* 162 */
  211379. { { 0xcf7453f0,0x5778d9a2,0xed83c1f0,0xaffb899a,0xe0a82ba7,0xae6506d3,
  211380. 0xea3d5081,0x32c84e1a,0x810aa38b,0x9ad528c0,0xbd37d041,0xb1fdb020,
  211381. 0xd06ce41f,0x78d6cbe1,0x2e74b7f6,0xd287f0f0,0xc43bb022,0xf5cd2575,
  211382. 0xf81a71b3,0x6d28f2f3,0xc633e7f4,0xe65bb1f5,0xc4fc580e,0x32e5fc1c,
  211383. 0xbb7b07a5,0xcd55539f,0xc3caaf3a,0xb5a94471,0x4cc22d2d,0xb958bdf4,
  211384. 0x77a2777c,0x1614bdbd },
  211385. { 0xed0ab04d,0x4c1f0230,0x6e2082ea,0xae347b00,0xc42c5b5f,0x9f10bc63,
  211386. 0xde019935,0xb0539e6f,0x65dd0825,0xd89bd4e7,0xbbceda16,0x92260fef,
  211387. 0xe62aca32,0x8aaa755c,0x5ec82c5f,0xed762fa9,0x18650768,0x99e64c01,
  211388. 0xc92e348c,0x57dd6245,0x31ea6d68,0x0db88a77,0x07b44736,0xef0012ab,
  211389. 0x171d70fe,0xb9356b94,0x03f891b0,0xe68b0628,0xb79c20a2,0x3a54a53a,
  211390. 0xb00b0728,0x489656c7 } },
  211391. /* 163 */
  211392. { { 0x71353c25,0xe43649ba,0x13f67e24,0x517f27a1,0x1c1eb9e3,0x10bd333a,
  211393. 0x78e29bf9,0x94e1c05c,0x4743f15d,0x84fe7d97,0x90da2df0,0x9c874908,
  211394. 0x53673be1,0x82403fa7,0x1baea1b1,0x7ebf5db4,0x24180ead,0xcfe0ae35,
  211395. 0xc2f50c3f,0x1d15873f,0x70661cd9,0x16851ad6,0xa51e8c2c,0x802968d9,
  211396. 0xe0161099,0xe7d1a9cd,0xa8a7ea56,0x2b153c89,0x06e3c498,0x6d41b789,
  211397. 0xd6769dcb,0x082bb2e9 },
  211398. { 0xc4d6615f,0x6180ef46,0x01b9829c,0xfc629dc1,0x0fb264ca,0xde222ec0,
  211399. 0x10ecc2c4,0xc5457e06,0x1eea2c4d,0x95ce599f,0x8f9c5b2c,0x0433fa72,
  211400. 0xcd6310f9,0xee035462,0xce2e2253,0x84c57c3b,0x96d87e44,0x6c8ec31a,
  211401. 0xa452c5a7,0x30bfe393,0xa047b235,0xc592b140,0xc018545e,0x7bd8be18,
  211402. 0x5c178c46,0x794e0107,0x2e23005b,0x48471946,0x622a54f3,0x2665e237,
  211403. 0x901c9042,0x36451a46 } },
  211404. /* 164 */
  211405. { { 0x19893e71,0x17802d18,0x539a2082,0xa1765d8b,0x2302ecfc,0xfc6aea01,
  211406. 0x365bf59d,0x8d4cf51b,0x0d232a80,0x87741d72,0x18e80427,0xac343eb3,
  211407. 0xe74739ec,0x553ecb2f,0x1a8b07ca,0xaeca79a8,0x56f4ab3a,0x089ff322,
  211408. 0x3fa1d1f7,0x5e95d729,0xf62a9a16,0x260569ae,0xaa08ddc2,0x5e776232,
  211409. 0x1b7bb54a,0x93fabec3,0x743d56e7,0x48a20956,0xeb0ebeff,0x749cdb12,
  211410. 0x69b8fcf1,0x705307a4 },
  211411. { 0xe488310b,0x7a8e4c04,0x5325cd7b,0x12726e32,0x4983efac,0x5d0fd8b0,
  211412. 0x02ddb913,0x796e552c,0x77b9685c,0x0eeca3f7,0xb15f24a3,0x9b766e89,
  211413. 0x48efc979,0x7c2736d6,0xa8021c6c,0x3d619685,0xa0b2f1ea,0xfe33e278,
  211414. 0xb676d6b0,0x95c69879,0x1af4e0be,0xa0747319,0x36c4ee55,0xa2fab5f1,
  211415. 0x59e5f3b9,0x6938b8ff,0x39cafe6e,0x1e114da4,0x6a6ad120,0xc9595ec3,
  211416. 0x57e62aec,0x80f79bd0 } },
  211417. /* 165 */
  211418. { { 0x60af09b3,0x3cef42a7,0x933dfe14,0x3c016ebd,0xed85eaa8,0x720cf1e0,
  211419. 0xceaa3bc9,0xd4f5e99f,0xb7106f97,0x7216b9d2,0xc9668ad2,0x65f34c36,
  211420. 0x5b0c651f,0xa8fb82bc,0xf2fda4de,0x20f42f1c,0xd21f659e,0xeb31ab2c,
  211421. 0xa13d1618,0xb7a776c7,0x38662be5,0xec441022,0xcad08e0b,0xc825da70,
  211422. 0x022c0180,0x99299079,0x2aef9ffd,0x7623bda0,0xf5c58b50,0xde84f4f3,
  211423. 0xd824ff19,0x5f5a5da4 },
  211424. { 0x7e8311dc,0x5737257e,0x466cf136,0xdef94f51,0xb05ca21a,0xa73e1645,
  211425. 0x02e4ab37,0x38ea9b3c,0x8579165b,0x7760eac9,0xc24b01a4,0xdffdd047,
  211426. 0x3fb95584,0x188d4fd1,0x25548bda,0xfaac38b8,0x59e9dcac,0x1a79a6f0,
  211427. 0x09a2700f,0x983f720f,0xfb8a7e48,0x8cbba554,0x47a1fad5,0x38a19968,
  211428. 0x5abd6b5e,0x11856547,0xf3716ec2,0x75113d31,0x4212907b,0x1391e781,
  211429. 0x0dc15889,0x5319c801 } },
  211430. /* 166 */
  211431. { { 0x6b61c3af,0x2320136e,0x07b4bb68,0x1d40f2de,0x380c97f0,0x651dee7f,
  211432. 0x6a8c313a,0xa978ba70,0x2011ca10,0x22c587d6,0xab1f445b,0x48bba218,
  211433. 0xe50444e6,0x8c5eaf07,0x442fccf9,0x5549f02a,0x3d80493d,0x2564746f,
  211434. 0x79c04591,0x42d24f61,0xabdc8887,0x1600fa18,0xded38f8f,0x5cb8600a,
  211435. 0x923aeb46,0xa4bf9b90,0x1e1c578a,0xd63fee35,0xebb9ea14,0xf3c9c5ac,
  211436. 0xf11a4ff0,0x3d13314d },
  211437. { 0xb4513d1e,0xe5cc662d,0xd55952bd,0xde78a8c5,0xe7f86d0a,0xe8a37a3f,
  211438. 0x7a04f0c5,0xca2d12a4,0x2e25d06c,0x4c6696e4,0xb2136071,0x52614698,
  211439. 0x89f6e1cb,0xf4d2701b,0x80efd95e,0xaafd6177,0xc5bb6907,0xe6d73ac4,
  211440. 0x420db35a,0x49e874ac,0xf2751fa0,0x11631de4,0xa1fa2edd,0xb29f7336,
  211441. 0xb7fd794d,0x4c406864,0xe22f92a6,0x73cb21d3,0x2043cc76,0xeae904e6,
  211442. 0xb322c6ad,0x67f28a9f } },
  211443. /* 167 */
  211444. { { 0xca148ab5,0x7c17b258,0xb3c60051,0xb9a1976f,0xc8f28df9,0xea260698,
  211445. 0xe8d45017,0x87b2cc74,0x0578a422,0x37257329,0x17bec732,0x81d5ee25,
  211446. 0x1d48bbc4,0xd7411fcf,0x487f5cfe,0x46217e6b,0x41eb8e1b,0xcb007ac5,
  211447. 0xe05a00c8,0xc41c57a6,0xd2f9fa99,0x1f954d2b,0x40941cad,0x370bd5db,
  211448. 0x3829509d,0xe487879c,0x5ceca5ee,0x4c137552,0xfd3efb9e,0xe8ef7fa4,
  211449. 0x1bd1bdb2,0x5ff09174 },
  211450. { 0x579c6632,0x791912a4,0xb8a20815,0xbb19a44f,0x535639d3,0xf4f97b84,
  211451. 0xbc3c9bce,0xe57e2bcb,0xf19e6410,0x122b3f2b,0x1357d9ad,0x1f0189da,
  211452. 0x79e5ff66,0x675573bb,0xef2f3c4c,0x444e5c98,0x04d10731,0xd6f61e20,
  211453. 0xac75d635,0x0dfa366f,0x2c854f23,0x9fc47c86,0x0ad0850b,0xc04ae43e,
  211454. 0x2f720c32,0x5ce94f64,0xa753bc9d,0x67efae65,0xb0373a63,0xc27d30d3,
  211455. 0x29721646,0x6681013a } },
  211456. /* 168 */
  211457. { { 0xe84509df,0x1385d913,0xcf339376,0xe978bedd,0x3423a148,0x2df425d3,
  211458. 0xee8cb579,0x43fa0ae3,0x31c4553c,0xf015369d,0xdfbf1d48,0x05cf08bb,
  211459. 0x9444244a,0xadff4be6,0xa35dda33,0x01635f81,0xe76fab7c,0x085c8949,
  211460. 0x16737783,0x4bd7fcde,0xa254f8d2,0xfd8cb52c,0x413ec985,0x62168a66,
  211461. 0x7a9026cc,0xf2db9741,0x50e1e1b7,0x3962ee56,0xd3beffde,0xbee0a346,
  211462. 0x0bdfab1f,0x3b35b72f },
  211463. { 0x535c3749,0xbff8de9f,0x8add9c48,0x23c1f20f,0xc8f8f663,0xa975b37b,
  211464. 0xe8f3ae49,0x2529e475,0x1d5e2628,0xc32f10d5,0x67862f1d,0x5ac0d297,
  211465. 0x854cbe36,0x13c79338,0x4b67e462,0x48f004ef,0xe5d10ee1,0xfa37a150,
  211466. 0xd28288a0,0x4974778d,0xcfb73f4d,0x96830a66,0x07804952,0x9f444013,
  211467. 0x9760b694,0x8233c709,0x25b75c99,0x8340cca5,0xc771f99c,0x3f62e40b,
  211468. 0xcd95c685,0x47d0a1eb } },
  211469. /* 169 */
  211470. { { 0x652811f1,0x266f4fff,0x62ef3002,0xeaacaa93,0x50cba0ca,0x6c387a55,
  211471. 0x007f5467,0xa350142a,0x202f2673,0xc7fd102a,0x33dc6e65,0x5daee570,
  211472. 0x064a63d9,0x60682ec3,0x462b251e,0x46cf0bb0,0x5da936e7,0x0e030ca5,
  211473. 0x434265b5,0xc87a60f2,0x69b4e8f5,0x9637b2bb,0x7ad7770a,0x601fb58c,
  211474. 0xed3a15a6,0x1f2147f6,0x2995e961,0x05b47d5e,0x83213a16,0xcb0ca9b3,
  211475. 0x4995a85c,0x8f4b614a },
  211476. { 0x4b4eb3c1,0x5aa8ec19,0x20323a70,0x8c549ac4,0x4f6cc6aa,0x00d49322,
  211477. 0x45f9a5a3,0x0e53b9bb,0x0897abbb,0xe46ef110,0xd7acd7d0,0xfe873e57,
  211478. 0x0f7cb588,0x7cfccfe5,0xc85557d1,0x0ea53d65,0x7288f2e2,0xfdd9eb44,
  211479. 0xc0eb68a8,0xab2dedfa,0x08603a0c,0x58221470,0x00feb06c,0x69464689,
  211480. 0x25e5caac,0x804cf5bf,0x9fc91ae9,0xd8559858,0x73c45eae,0xed9378b1,
  211481. 0x524c9801,0x8f942d02 } },
  211482. /* 170 */
  211483. { { 0x8e845808,0x1f1ec302,0xb77abfc5,0xc302bffa,0xf8d97dc7,0x26afd4b9,
  211484. 0x3aac594b,0x3d3a83c4,0x674d94dc,0xe3b74bd1,0xcaa5911c,0x4464b737,
  211485. 0x871c2cd2,0x62925773,0x3b4440fe,0x419f2485,0xe052ad7d,0xdda6a0f3,
  211486. 0x846c86c0,0x645280d6,0xf8324f42,0xa25689fa,0x07cf117a,0xc74ad1e8,
  211487. 0x8ddc9db7,0x5626dea0,0x966fc85d,0x52620373,0xf3b1eb53,0xe0ad57c3,
  211488. 0x949c1acb,0x38300252 },
  211489. { 0x5e744723,0xa0ef5a40,0x1ae08481,0xdb5bcf75,0xfec1f76f,0xabfad8cc,
  211490. 0xfab37fc6,0xfba5d831,0xc8fedb78,0xbe39e248,0xad93f310,0xa5cfad5f,
  211491. 0x913d5c24,0x747fdb1e,0x4518b7f5,0x052a47c9,0x7cfb4327,0x9e208d6c,
  211492. 0x70e538be,0xb135cb9c,0x5bb17916,0x36352759,0x5b3106c7,0xa2c07880,
  211493. 0xc209bb06,0xd2d42a06,0xd3c504ad,0xb525b471,0x822ce034,0xc9f4b368,
  211494. 0xeb4185a5,0x15f18796 } },
  211495. /* 171 */
  211496. { { 0x0aee4684,0x094dea06,0x7cdbdbc8,0x42b21f06,0xb1931319,0xa439e149,
  211497. 0x81a7dba6,0xea4bdd41,0x3c2ae80f,0xc6213706,0x12823dc2,0xb58b0967,
  211498. 0x832611b1,0x7443d515,0x13c20384,0x2e16f831,0x2bd992d2,0x0ce204d6,
  211499. 0xf419388b,0x499dbcd6,0x1d3778c7,0x492ded1d,0xc5ddae73,0x9d5bd74f,
  211500. 0x994b6259,0xd4813d52,0x0e86ca68,0x191d9cf6,0xf3e9c2ac,0x562179ea,
  211501. 0x9fee1238,0x6146f1f3 },
  211502. { 0x078e2aa6,0xbd06d33e,0x9dee9265,0x693af7f7,0xdaa40e84,0xd56e0f81,
  211503. 0x9b9a407e,0x05fbbb88,0xede99519,0xdcf44adc,0x092dba39,0x7f71f8d3,
  211504. 0x4231774b,0x675b5da5,0xa5f605eb,0x7456a251,0x87a39a9e,0x9031d4af,
  211505. 0x05b474bd,0xdb430006,0xb665aa91,0xbda5dbf2,0x6631eeb4,0x5d1a3df5,
  211506. 0x62377c58,0x028149ef,0x685d0bff,0x2e1af4e9,0x82a465de,0xe0ea0875,
  211507. 0x06bd0050,0x95543f9e } },
  211508. /* 172 */
  211509. { { 0x85d7c6ef,0xf7cbc6f4,0x63b1bc24,0xcad8084d,0xbf8cba62,0xdf90ce88,
  211510. 0xb455c192,0x98e4b686,0x774fc6ed,0x6146b8d5,0x7ae20077,0x70e2389e,
  211511. 0x61c22529,0x5241c479,0x3884e5f5,0x7d221510,0x17e28273,0xd6d20ce2,
  211512. 0x4f2674f8,0xe3119f51,0x70c011db,0x85459055,0xfcfb760e,0xdfab75d9,
  211513. 0x9e8c2a19,0x9546362a,0x4a7d4b27,0x4b6d3f8a,0xee5d698c,0xa5c87104,
  211514. 0x2ba296ff,0x6db43478 },
  211515. { 0x5c3f0d95,0x06486493,0x4e748895,0x8917db82,0x6b2f3e44,0xf73fdf62,
  211516. 0x2b7f574b,0xc60edc54,0xaf732723,0xbe1c09a2,0x7cad114c,0x7d34669d,
  211517. 0x321aaff9,0x9646600a,0xed0cd61c,0xb94e2bba,0xdec4750e,0x866e1a41,
  211518. 0xb1a89f58,0xa1be990d,0xf2759693,0xc39e4d6c,0xc0e0dddf,0x11cfb780,
  211519. 0xd99c8a41,0xf0afcd7f,0x6e1c3050,0xcebffadb,0x96d2c6e4,0x4f3981b0,
  211520. 0x2ae27a94,0x07a791e7 } },
  211521. /* 173 */
  211522. { { 0x1e9f0300,0xe70e9047,0xbccdf904,0xe0253ad9,0xff053078,0x51c0289d,
  211523. 0xae893462,0xf1ef092e,0xa4846845,0x2c90a91a,0xf1dad4b4,0x1946eda0,
  211524. 0x33df67b2,0xf07650f3,0x0b15a014,0xc6e988db,0xb542f0f9,0x72e0c66e,
  211525. 0xe0c0378f,0x5d4b6311,0xae86950d,0x548badaa,0xb35f1c8f,0x6801638d,
  211526. 0x944d1ad4,0x129e3216,0x40471d32,0x9951bac8,0x85e94dde,0x03cc29f3,
  211527. 0x4543ecac,0x6d6acc2e },
  211528. { 0x57b2d299,0xeb999e95,0xe3d721cd,0x3a2bcd9b,0xbb4cb444,0x2e60384f,
  211529. 0xdc060faa,0xae177709,0x8c987cde,0x74f0e6d3,0x1076fbed,0x9a237cf8,
  211530. 0x7983fbff,0x69af1513,0x323f9584,0x6c3f7a1d,0x6db64398,0x3e21cacf,
  211531. 0x96703d92,0x7cd8134f,0xb8393f76,0x0755898f,0x2e825222,0x1b5b28bc,
  211532. 0x7924aa7c,0xb78799c1,0x81427a8a,0x1db378f2,0xff289492,0xd5a451b1,
  211533. 0x3d3c46ee,0x79d18212 } },
  211534. /* 174 */
  211535. { { 0x109d5589,0x1a3edff9,0x029b4499,0xded52eb4,0xb4b54adf,0x13eb9d30,
  211536. 0xa27bff67,0x4f9214c1,0x67f0f460,0x4c817ee7,0xc3a50e28,0xbadf8d83,
  211537. 0x94026237,0xc5dc03c9,0x966647c1,0x5f29581b,0x8a0687f3,0x10b6a089,
  211538. 0x31634517,0xae787cec,0x62e75188,0x2001dba5,0x45e2c3fb,0x55d4e1a7,
  211539. 0xb67d3395,0xbfcacdeb,0xbc6842ee,0xa1a0af9c,0x3e88580b,0x50590a2b,
  211540. 0xa784cdc8,0x73104491 },
  211541. { 0x2648d676,0x44ca2cdf,0x4f1b12b1,0x9a85eca5,0x2980e1eb,0x1b9dac94,
  211542. 0x1ac8aa89,0xf30d3709,0xc719e195,0x73072ab7,0x2f703797,0xba518c82,
  211543. 0xac0067f6,0xac090e14,0x8dcd2927,0x0e6cfc70,0x21e7da63,0x4f5889e2,
  211544. 0x8371c7c6,0xb4aaa40b,0x8f7878c9,0x1f9dabe2,0xd84caf3f,0xf78aed6b,
  211545. 0x9e0e1d92,0x3c39dd07,0x122424dc,0x680be5fb,0x0bdc0099,0xf41b214d,
  211546. 0x5180c54f,0x6a8f8fc9 } },
  211547. /* 175 */
  211548. { { 0x53235132,0x62a1ed63,0x59dba88b,0x1db233f1,0x291efdd8,0x85625452,
  211549. 0xb25111ae,0xc7505297,0x1d701bd8,0xb5921af9,0x9774f45d,0xb4d05d72,
  211550. 0xf18e73ff,0x6e3d4c5e,0x899b3038,0x897d985f,0xc89b1558,0x8a9c30fb,
  211551. 0x4d13181c,0x3c92d1a3,0x2223320e,0x292e86ba,0x01ceed02,0xcf2454c2,
  211552. 0x583f309f,0x27a45f74,0xad0fd1a3,0x75a6102c,0xcb9c7538,0xdb4f45d2,
  211553. 0xdb283fd7,0x4752d8c1 },
  211554. { 0xd5dff4d5,0x514d6cea,0x45a827f4,0x74cd5fdb,0x4fc7135e,0x1070a60c,
  211555. 0x1be5778e,0xdec0bb78,0x58dc6b08,0x271e12cd,0x54bc2496,0xb765089b,
  211556. 0x619098ac,0x6ddf2c63,0x67528832,0xfd6ebac6,0xc2508af1,0xeaa2d025,
  211557. 0x4dcfc1f0,0x13c2cda8,0x45510be0,0x1c7836a8,0x1a886801,0x3904688d,
  211558. 0xafaf2545,0x643132aa,0x2830a88d,0x49685577,0x8744b470,0x569491ca,
  211559. 0x75fb8552,0x3a6518f3 } },
  211560. /* 176 */
  211561. { { 0x224042a0,0xaaa8ed50,0x2452f1e6,0x6cb4e3b0,0x768211d8,0xedca5f4c,
  211562. 0xef4d5d3f,0x4e0fe3f9,0x522d46e5,0x33a8e2a4,0xf1446775,0x5998e21f,
  211563. 0xf592d01b,0x1496c50e,0x83a67739,0x69104c2f,0x472bbf00,0x28670bcb,
  211564. 0x503177bd,0x8ea883b2,0x7d2712a2,0xc5d8bc05,0xb439c994,0x41ef9317,
  211565. 0xdcda1aff,0x9801d3a8,0x7038f6fb,0xd686eeb5,0xfbfbf820,0xe80c5cd0,
  211566. 0xedc25817,0x540ac363 },
  211567. { 0xfe7f43df,0xa71969a9,0x2c1b9e4c,0xe6653808,0x859c2917,0xad9677d8,
  211568. 0x96aa4404,0xbaca9545,0xff1297da,0x0e9d855f,0x22aea7de,0x1f61897b,
  211569. 0x36f13f8e,0x96edccfd,0x16e200df,0x627d3070,0xc98988a4,0x729f0736,
  211570. 0x97f231d2,0x95e25e60,0xf6048752,0xaf7f221b,0x4019b299,0xd6682609,
  211571. 0x26b4b1d9,0x1d99de09,0x1acdd7a3,0xec47cf66,0x6ebe15e9,0x4de9f2b3,
  211572. 0xfa16974f,0x17db32ec } },
  211573. /* 177 */
  211574. { { 0x6cf40599,0x75ef6919,0x00c020ea,0x7ea10dfb,0xfcaaf679,0x3da5ae7b,
  211575. 0x88ddd678,0x0d663ca3,0x255bcfcd,0x5a21f8fe,0xe344bc7e,0xe9c3f538,
  211576. 0x548e0632,0x35f62b1d,0x43c6e64d,0x654f2425,0x26993627,0xc755a7a6,
  211577. 0xb0f41324,0xa3b7c5f7,0x3a2180f3,0x05697f79,0x1e81675b,0x6cf85fb1,
  211578. 0xe53428f5,0x6d3cdb35,0x52d28b02,0xe3aa1591,0xf7a3fb78,0xa8470255,
  211579. 0xa194445d,0x460bd01b },
  211580. { 0xc24d8077,0xbc34dc23,0x4c720d2c,0x82f4b580,0x6f5d1ffe,0xa29da911,
  211581. 0x92783ce2,0x578af520,0xb5904af3,0xe29f51ab,0xf7aa1190,0x46c570d7,
  211582. 0x571bddf0,0x4a522fba,0xae89bb51,0xbf4e2a06,0x59f3444d,0x799b35cc,
  211583. 0x26cc2557,0xc3028367,0xafcec177,0x94a4e985,0x7c36cbd0,0xadaf7dcb,
  211584. 0x75d39077,0xed31b787,0x2d3e24bc,0x52d6904f,0x1f95421b,0xc5ca2669,
  211585. 0x1734878d,0x7d342c3c } },
  211586. /* 178 */
  211587. { { 0x11fd127f,0xe5cf2c0a,0x119e4c5e,0x66d36bb8,0x6ef56ac3,0x621ab252,
  211588. 0xe5430675,0x30cfeaee,0xac3e9619,0x2ede27d2,0xf8fce671,0x6413513a,
  211589. 0x075f4c3d,0x6159c61b,0x59069d98,0xd447efe9,0xea76aea9,0xaf8d6f68,
  211590. 0x0f5bd164,0xac5dc61b,0x1e88bb98,0xdbab446e,0x1ba92320,0x618b8b16,
  211591. 0x78989865,0xa0eafb3c,0xc08b7e82,0x0c7abcc2,0x20d160bb,0x10f09b6e,
  211592. 0x8e4c63a7,0x5be0afa6 },
  211593. { 0x1bbbf49c,0x82ab6d38,0x8c0703fe,0x3e09ce49,0xe10f4263,0xeca58b5d,
  211594. 0xda5a4532,0xd9cc6581,0xf618f7b7,0x07e18876,0x250f7fe7,0x0419a5e3,
  211595. 0xde6b86be,0xbb1a9e90,0x37359169,0x584a7deb,0x5149db2c,0x38eb3489,
  211596. 0xb0ebabb8,0x14546a33,0xc2f88a92,0x0067f0b0,0x0a2db019,0xbde0dfe7,
  211597. 0xc63e6f3e,0xba51b06c,0xe9206fad,0xa19127b9,0xfe80dc0a,0xe4eb5e87,
  211598. 0xd4de30ae,0x1e6fccf5 } },
  211599. /* 179 */
  211600. { { 0xaa8ac924,0xb57dff66,0xc298b3e8,0x06e9ad31,0x65fb080c,0xd140e329,
  211601. 0x1d95c93f,0x7dab211d,0x8a180caa,0x6d68d842,0xa20ded69,0x1a929408,
  211602. 0x38df461f,0xa8151753,0x60eae932,0xff5604ae,0x7dae4c0b,0x901b9e49,
  211603. 0xde262e89,0x4573a97f,0xf1084983,0xed69d9a4,0x64724f1d,0x8ffa022f,
  211604. 0xea85a15f,0xd5f1c2e4,0x01453794,0x4c626ce9,0xbf0907dd,0x80440cd6,
  211605. 0x5ddaa837,0x4522d461 },
  211606. { 0xebfbe7c5,0x8895f079,0x84ef3446,0x30ea1ded,0xd4a1ab96,0x716a9eb6,
  211607. 0x50a30c68,0x1a4a5d22,0x0043bbaa,0x5a16631c,0x5010e5f5,0xbd107502,
  211608. 0x3d8c0556,0xbffe3e9d,0x07772419,0x31b30b18,0x84b82297,0x90ff7ef0,
  211609. 0xf21a18c3,0x00c37d75,0x565bb8f8,0x18d0a635,0x45e3bceb,0xbac1da2a,
  211610. 0x23f0b08d,0x1c38e90c,0x5fbc5ac5,0xf1ba1aa2,0xdda71fc6,0x09d5256b,
  211611. 0x6d7e40ba,0x346501a9 } },
  211612. /* 180 */
  211613. { { 0xcc2b0f1d,0x86be448c,0xac4c3703,0xe3eb45c9,0x9fc96bbf,0x5387f65d,
  211614. 0x5ae27fda,0xcef3c4e9,0x1bc18089,0xa008f776,0x22ca18a1,0xf374a084,
  211615. 0x53b73371,0xee882842,0x7cc09354,0xcb6fc6d8,0x61496d6b,0x8489ec1b,
  211616. 0x49e325c4,0xa92c29b9,0x7bdec166,0x15c6ca52,0xdcea2813,0x95444eee,
  211617. 0x3a21154f,0x34683eb3,0xd39061cf,0x8fb26f98,0x06c940bb,0xc3b08aa8,
  211618. 0xe554c96d,0x7c1d42cf },
  211619. { 0xdc110aa7,0x766e703f,0xf362e378,0xab7b79d7,0x5aadca3c,0xd259c75d,
  211620. 0x60be3373,0x2a6eca79,0x06c4e8ff,0xf4744a4b,0xf3b705bf,0xb2842cce,
  211621. 0xae304b53,0x1a3af5aa,0x1b2d31b8,0x7bbfa201,0x4bee88d9,0xc4ba6eba,
  211622. 0x565cb839,0x2d3565ce,0xdaf7ece8,0x24808696,0xe6959745,0x2c7ccce7,
  211623. 0xe94f9837,0xefd6eb3c,0x3811a326,0x0a33b4cf,0xfffa93a6,0x14203f43,
  211624. 0x73c31d90,0x031e9828 } },
  211625. /* 181 */
  211626. { { 0x765a17ff,0x4fefecfc,0xd1290a65,0xa09f3888,0x938da038,0xbf265c46,
  211627. 0xa169ad46,0x4bb6145d,0x23a62fe8,0x33cf8214,0xabc860a5,0x562df571,
  211628. 0x815c38c4,0xbf2a90fa,0x17eda875,0x45ba1d6e,0x946fa5e1,0x799d881a,
  211629. 0xb90f5a3b,0x6c1be784,0xb10ff52a,0x0910a37c,0xa4f4fd36,0xc38c1fe4,
  211630. 0x8e2d3ba0,0xc3180fc5,0xb17a6187,0x3e2ff050,0x943a35c2,0x3a00059b,
  211631. 0xa28cc51c,0x494d3645 },
  211632. { 0x4ba021f8,0x398426b6,0x796deb6c,0xd14c9083,0x7e36c762,0x6d2e5395,
  211633. 0x751cf216,0x8f556eca,0x19b24a19,0xdaca1e00,0x4b20c2ae,0x47887da4,
  211634. 0xff41a733,0x93ed4ccd,0x5c7c0cd7,0x8d717c44,0x91bf7009,0xcc48634a,
  211635. 0x3b59bbaf,0xa1f146f9,0xe5624f15,0xdd38bb39,0x303f8443,0x96d41aad,
  211636. 0x4bf104fc,0x6b670f03,0x29706582,0x0503f9ed,0xb34200f5,0x768e1f47,
  211637. 0xbbd4c6f3,0x3cfdcc5e } },
  211638. /* 182 */
  211639. { { 0xb523e13d,0x536c2a86,0x2920d0a0,0x1014a458,0xe7571296,0x3d52b478,
  211640. 0x7eb51bea,0x05746066,0x87b0e919,0x709f7861,0x686888e8,0x028aed88,
  211641. 0xd94afcd4,0x79a809d7,0xe2129af3,0x50c6032f,0x983c4082,0x75e4be72,
  211642. 0x7ab3be8e,0x98331bbb,0xb618c728,0xd31a032c,0x3f59c4a4,0x36dd85a1,
  211643. 0xed4f61e2,0xdbece345,0x1e571715,0xba7aaccd,0x64a1ebd7,0x138c58da,
  211644. 0x3d1aeea1,0x89296d0f },
  211645. { 0xcca82c97,0xb165288f,0x1427e8dc,0x26c6c12d,0x4c3edda9,0x66a94f07,
  211646. 0xeaa01ebe,0x94600e1e,0x30f5e86d,0x14abce7c,0xcb456a31,0x741d7020,
  211647. 0x279f42c2,0xab05aa13,0xd4238468,0x70b60faf,0x318d39e6,0xa18efec1,
  211648. 0x8920b318,0xeb07f1ac,0xd8399e03,0x01e3cba8,0x3c81a301,0x65f8932e,
  211649. 0xccc667d8,0xae8bca7d,0xa268607c,0xcee1ae79,0xcac0a12c,0x3182e64c,
  211650. 0x2b1a4c54,0x9233a2f7 } },
  211651. /* 183 */
  211652. { { 0x0acbee17,0x717e8df6,0x5c24fcdc,0x0f0959c2,0xe54ffcb0,0x46f09887,
  211653. 0xd285116b,0xb993deca,0xbba1fa51,0x0bfaa4f8,0xd0f2183e,0x9c9249ef,
  211654. 0x96847779,0xf93cb358,0x2322d421,0x284bfb7f,0xd42af009,0x40cc709a,
  211655. 0x9bb1d615,0xc69f2274,0x717c3c6a,0x76f50b3a,0xbb9c5eeb,0x8b21e985,
  211656. 0xa4783b5f,0x58fb19ae,0x52e1c3e7,0x04c86b9b,0xf2971ac8,0xaca59092,
  211657. 0x21ed8291,0x2bb26a69 },
  211658. { 0x15f81416,0x98a34435,0xaaff5bb4,0x086e72e7,0x0317261c,0x3d1f64de,
  211659. 0x5c0a1cfe,0x31c0786c,0xb3683401,0x542ea4d8,0x1a39b4cd,0x2f77273a,
  211660. 0xcbef27f1,0x14fe7ee1,0x16bb27dc,0xee7fc09e,0x410e5dc7,0xc0dccc17,
  211661. 0x1943b3dd,0xa3466742,0x3f31c1b7,0x92934b60,0xc22c1070,0x0186ded9,
  211662. 0x799f966b,0xa37ee8ba,0x249b0893,0x0f3bfcb4,0x2e92d4de,0xbae61447,
  211663. 0xe196eb08,0x937cb3f8 } },
  211664. /* 184 */
  211665. { { 0x16fbfdce,0x57c0e77c,0xc98d4cc0,0xea034cc9,0x42572d20,0xe7606d72,
  211666. 0x0019a83c,0x9861b55c,0xf1597162,0x80ba2803,0x05a0fd7b,0x0f4141dd,
  211667. 0x4b0daaa2,0x8865913b,0xaa3848ec,0xe6685746,0x3e0485d2,0x16d15a5a,
  211668. 0x3b6905dd,0x81c0c774,0x818af2ba,0xcec31b7d,0xd2b74b78,0x80d8f194,
  211669. 0x543e2f28,0xca659db2,0x9fb07c1c,0x31b83a7d,0x1f1048c0,0x86537fdc,
  211670. 0x78586a11,0x4d57bb07 },
  211671. { 0x53b396b6,0xbc4b768a,0x93b51dac,0xbc8b24c4,0xa30ae1b3,0x33e511eb,
  211672. 0x945147c5,0x893bbd95,0x179fe3ce,0x6cc86031,0x3f920bd4,0x34b0a167,
  211673. 0x6b256160,0xb32912eb,0x9d168d83,0xbc69a2a4,0xef0dd128,0xb4949e7a,
  211674. 0x872699e1,0x2613419a,0xbf21376b,0x06c58477,0xa4f97147,0xe55b1909,
  211675. 0x7b9b745f,0x63d6eb75,0x08df3c85,0xb5365b29,0x55fcfae3,0x0e257e43,
  211676. 0x979f2aa8,0x1067c118 } },
  211677. /* 185 */
  211678. { { 0x32bf8883,0xc8455084,0x6fd06667,0x4755286a,0x77c2335d,0xd70b0f8f,
  211679. 0x2f4a2c94,0x678e60da,0xd118acf5,0xa468d8ac,0xbf5b90d9,0xce93830b,
  211680. 0xed4e9104,0xea4b1c74,0x27776ea4,0xac67316d,0x361bab12,0xb98ad75c,
  211681. 0x99122451,0xc323d482,0x530a43ae,0x26440220,0x3292d5a5,0x3a44532e,
  211682. 0x5fecf1bc,0xdb48694b,0xc667b8b8,0xe4e0516e,0xa4306ade,0xb3aa595f,
  211683. 0xf34e9725,0x7e4f7091 },
  211684. { 0xb7f70919,0x3f3816e9,0x16b003f5,0x765216ed,0x778c99e5,0x46c6cff4,
  211685. 0x30a51810,0xe6a5abe8,0x45e728db,0xef6f49e6,0xcaccefd6,0x6fdd73ea,
  211686. 0x8c37f3f7,0xec394e6f,0xb6407fc3,0x73320802,0x96625cbd,0x988e8f7a,
  211687. 0x7cabfb00,0x83292363,0x407f359a,0x258ba9df,0xccbfae50,0xff01aee5,
  211688. 0xfe251813,0xfbeaeace,0x83f1cba1,0x9c69f161,0x9eadcdb5,0x512c58ad,
  211689. 0x6ccce8bd,0x2ae49cd4 } },
  211690. /* 186 */
  211691. { { 0xc40849f2,0x1239b0e3,0xa441098c,0x5136a4cd,0xe547f649,0x61535a99,
  211692. 0x7a9bbac6,0x92e4bdc4,0x53547af6,0x195a1646,0x8b47a74a,0x85ecb319,
  211693. 0x9de6a2b2,0x278553fc,0x0e2ba52d,0x471c038a,0x35bcba93,0x12ba1b88,
  211694. 0x6f31eca2,0xd4bf50da,0x802b32c6,0xd146e3f6,0x3c64c8c4,0x0c9c0131,
  211695. 0xeed21297,0xad30f12d,0x9c68530f,0x9b75bffb,0x8918de51,0x23c0ad3e,
  211696. 0xa73771b7,0x180e9d52 },
  211697. { 0x29ab77b0,0xc316542f,0xf7aee628,0xdd411d9c,0x353c2f40,0x044c0685,
  211698. 0x4b0ae4cf,0x638dc7e4,0x95fc266f,0xa0924185,0xfd2feb7d,0x639da671,
  211699. 0x5ea39798,0x56858ed5,0x58f3832a,0x7a694f31,0xd316d831,0xa94233c6,
  211700. 0x30a35a7b,0x2fcacb26,0xf1ff713b,0xfef8f7dd,0x59eee2f3,0x8b9b4525,
  211701. 0x156d064a,0xd1b4f91b,0x2f5cfcfc,0x177866c2,0x3777eb41,0x12bc2566,
  211702. 0xd8ab85b4,0x21ca6f3c } },
  211703. /* 187 */
  211704. { { 0xa3e66635,0x0e162b13,0x2a9f76af,0x1ef20a2b,0x46db3356,0xab473a30,
  211705. 0x7802bb8d,0x0840bd77,0xa699b44c,0x5b6baf5e,0x1b2207f1,0xc6e11900,
  211706. 0x790b0105,0xe5de16a9,0xdb67f004,0x22b12f15,0x8a025d25,0x185fad45,
  211707. 0xdf0a1142,0xbccf6953,0xf45034c0,0x4c42129b,0x1c277bff,0x0f740400,
  211708. 0x280a9e18,0x6e440b4c,0x842aa2b4,0x767de8f5,0x05e8d94f,0x3de20ab8,
  211709. 0x20227635,0x5aff5859 },
  211710. { 0xa8458e40,0x805acd20,0x149732bd,0x5a5557d8,0x5f1ca72d,0xc7074131,
  211711. 0x952b5323,0x7f2e269c,0x6494fadf,0x5c592556,0x1a7d2666,0x153b7acd,
  211712. 0x86fe2865,0xa6df063d,0x57d53b6b,0x1e91db13,0xe93ead01,0x9195bb89,
  211713. 0x2963bfe6,0x3d71e1af,0x88278886,0xfab2b9c2,0x3b859b6f,0x77836692,
  211714. 0xf7029dd1,0x6e695174,0x7b984561,0xc7987876,0x5907d849,0x64fb4f1d,
  211715. 0x88d8a977,0x3eab7e1c } },
  211716. /* 188 */
  211717. { { 0x52e5718b,0xc73a94b6,0xf4cee1e9,0xe3aefa54,0x553eedea,0x654e9e63,
  211718. 0x5f3aca1a,0xf2541e1b,0x0d083316,0xd7129489,0xfb7f950e,0x7965af63,
  211719. 0xc74e3e4a,0xd8fc9e0d,0xeaf79ebc,0xb4ee48d2,0x8b7787e6,0xa458a86a,
  211720. 0xf7cceaf0,0xd8c7621f,0xdf67980d,0x8228eeff,0xf9106727,0x210d4742,
  211721. 0xb07e3629,0x91f63501,0x7971e29d,0x441761c6,0x03a3b8a5,0xc0ccc65f,
  211722. 0x38e09544,0x3491da4f },
  211723. { 0xcb062eae,0x6706d046,0x5d08776d,0xee7db735,0x292315d2,0x80de8052,
  211724. 0xc402bbdb,0x40785662,0x26ed3337,0x5f93525c,0x7d568ed3,0x6cea14d6,
  211725. 0x66888b1e,0x916a1189,0x5dc71675,0x0fbd5205,0xe4575df2,0x833d1077,
  211726. 0xec092335,0x4e93100a,0x6cd85389,0x2f9e1d01,0x43226368,0xeebd3725,
  211727. 0x1ba4cfd7,0x401d172b,0x574c5838,0x377dab9d,0x80d517de,0xaeaa6958,
  211728. 0x6ad15a18,0x0c843dfd } },
  211729. /* 189 */
  211730. { { 0xc9373300,0x455811ff,0x99fdc300,0x1c39332a,0x353cb655,0xe19bb81c,
  211731. 0x96a83d27,0x774b924a,0xb2ee3f1a,0xcbfc8fcb,0x010d56c7,0xaf278ec4,
  211732. 0xe0abaf79,0x6fde682f,0x7339aebf,0x7566d072,0x71205db6,0xbd35ad5d,
  211733. 0x7051c9d0,0xb5bbe694,0xd3a3067c,0x577db480,0x572d7530,0x2c70ff54,
  211734. 0xe06d853d,0xe8615aec,0x05abfb5d,0x71999ccb,0xea0a8ed7,0xeeefc96b,
  211735. 0x35f6df69,0x2dcc469d },
  211736. { 0xc65f0e77,0xcca6cd06,0xbd71b14a,0xddcc7980,0x3c93cc00,0xb6221f8b,
  211737. 0xae8cbf57,0xddfcd5b3,0x76f8e63f,0xbc92973f,0x06e132b7,0xe9848a34,
  211738. 0xd51ec9e2,0x4cc59a03,0x3a33081a,0x9c9d32bb,0x80e8466b,0x00121052,
  211739. 0x1bbe7295,0xc2b0032a,0x24938448,0xdbfc6572,0xb6bba0ff,0xe972a0ce,
  211740. 0xc0a94802,0xf60c0a4f,0x599d8bc7,0xf62c41cc,0x312da0b8,0x820c96ee,
  211741. 0xcdbdf9fc,0x5a1a65db } },
  211742. /* 190 */
  211743. { { 0x42485684,0xbfba691a,0x29c470c9,0x613116b9,0xe62a0519,0xb4b01971,
  211744. 0x5ff499da,0xf3245aa6,0xa5238eff,0xc2ef87f4,0xcc9d5515,0xc16dc6ba,
  211745. 0x2dbdacac,0x5a7f227e,0xa9bbaecb,0x8dedaac4,0x2e7c9885,0xff308a6d,
  211746. 0xe6895593,0x4c6f2fc2,0x177e0611,0x3655f285,0x300b1bee,0xa63e8d06,
  211747. 0x13c17b54,0xbed0ce79,0xc4974262,0xca4abe35,0xbc4e4037,0xf4b44a17,
  211748. 0xefe5fbd9,0x5ae95099 },
  211749. { 0x804f7455,0x122e5ee7,0x22066682,0x341a4997,0x7795e333,0x97d24c31,
  211750. 0xe48efced,0x12f4123c,0x19fbc21c,0xe8738d92,0x0663a3ae,0xbb3bdc61,
  211751. 0x8593a6db,0x3603d8c2,0xe3c1ac75,0x926227f2,0x5eaae519,0xfea92ac0,
  211752. 0xfd6812ac,0x5b596f0b,0xfc2a82dc,0x3ce7e844,0x63522b27,0x3840481a,
  211753. 0x52867895,0x836088b1,0x26588688,0x21ffb7cc,0x2f4a7cac,0x0ca33161,
  211754. 0xa3edd298,0x4110667e } },
  211755. /* 191 */
  211756. { { 0xc2d04b63,0x81830357,0xf4929a18,0x3fc5a34d,0x22d195df,0xc73bf6da,
  211757. 0xcb432473,0x14df2f89,0xe997f138,0x345afe5c,0x8b9604f4,0xd8e3f5f9,
  211758. 0x50c10ae5,0xad7942e9,0xeed25ff3,0xcefd5447,0x0e73c0cc,0xbf68e51e,
  211759. 0xab54fa4c,0x5b1ad591,0x12b61c8c,0x8bbc1105,0xb5abf760,0xbb932913,
  211760. 0x01e79649,0xdb1231be,0x040ccbe7,0xd0a83e91,0x90a96db9,0x3dde426f,
  211761. 0x34df11ea,0x1cceb645 },
  211762. { 0x0c6d0f55,0x2d210c4f,0x9c673c9d,0x6cadf61b,0xa9ce3fbb,0xdd7f9919,
  211763. 0x93b063e4,0x135f494c,0x145a93be,0x580bdb3c,0x0f52ef7c,0x4d872332,
  211764. 0x8814bb6a,0x74d876e8,0xc7a97dee,0x4f6f723a,0x3e3cd833,0x7de2b8f0,
  211765. 0xae720270,0x6162f082,0xddfa486e,0xe88ec2d4,0x8d3a17c6,0xd965c859,
  211766. 0x3980171a,0x62e59e54,0xbbef6b22,0x0ab6285d,0x4d48b203,0x3cf45195,
  211767. 0x4ea25ea3,0x1f175233 } },
  211768. /* 192 */
  211769. { { 0x3467ea91,0x808a765b,0xfd2d9c45,0x3f4632ee,0x9cf2bc6f,0x7b75dc6d,
  211770. 0x359813ae,0xefc8d240,0xe44cbd8d,0x23ecb209,0x21525622,0x59ba10e3,
  211771. 0x3f1ee19a,0xfa14d934,0xfb0c48f7,0xdf97c21b,0xea30d437,0xc4e62890,
  211772. 0x651475c2,0xb286e2a4,0x126672a5,0x291f01e4,0x31aab3b8,0x9c6fda5c,
  211773. 0xe17d22ec,0xb7277a5a,0x914f0bad,0xbd88ed83,0x6a2392e1,0xd0b05d1b,
  211774. 0x65893c2b,0x4cb8af90 },
  211775. { 0xbb4b1953,0xa2b02057,0xf597f6ee,0x4ce08b44,0x5e6412c8,0x854f5d9b,
  211776. 0xb3cd4919,0x1913262d,0x6e42bb5d,0x902762e4,0xd78e7f60,0x8355c8e6,
  211777. 0x38b6c16c,0x8efaa824,0xe550f618,0xd0173790,0xe57d778e,0x118af462,
  211778. 0x715b4714,0xa16ad5e8,0x41dea4f9,0x900596c3,0x280ca610,0x2a957c32,
  211779. 0x374c65a1,0x2faee800,0x50080414,0xdb105127,0xff080fa1,0x8c1db931,
  211780. 0xd79878fc,0x486a5c25 } },
  211781. /* 193 */
  211782. { { 0x941b4f36,0x0521e213,0xf803b4f9,0xbaacfb14,0x52a54ba8,0xfdf1e22e,
  211783. 0x8fe4796c,0xacfabbba,0x58dbacb6,0xae0788db,0xc19dfa51,0xdf98d736,
  211784. 0x35a716ee,0x155c286a,0x9c86461b,0xbe7d4676,0x63a64a5e,0x50b6380f,
  211785. 0x9f609262,0x14b41914,0xa2dfc5b3,0x0919a7d0,0xcef466ac,0xc454da55,
  211786. 0x6986aaec,0x93fa4a24,0x71a49ced,0x5090b171,0xc1fa75ad,0x602f1d6c,
  211787. 0x78e4c054,0x5d269f89 },
  211788. { 0x14920419,0x3a74030c,0x90968739,0x0845d868,0xeeb70fa6,0x81b994c4,
  211789. 0xd9fc5bcb,0xabcaa06d,0xf58f8f2d,0x06539427,0xb1dc52aa,0x35c85f67,
  211790. 0x2c911baa,0x5a7d8d72,0xaec2d834,0x4041005c,0x7a8e5347,0xb5868a44,
  211791. 0x8de512c3,0x04ee180b,0x211168eb,0x4daa66e5,0x2317cd8a,0xc0bd5dab,
  211792. 0x61164df6,0xa1d4185d,0x1dbad7c9,0xacedca26,0x09b02683,0x0fe4b5ac,
  211793. 0x26d9550f,0x8ac9995a } },
  211794. /* 194 */
  211795. { { 0x2640a39d,0xb2c8dc9b,0xede0c9f9,0x21ff0b38,0xa1ecba0a,0x74f469bd,
  211796. 0x080d0417,0x8a902ccd,0xf4994604,0xe956fa32,0x9776ab15,0x348f85cf,
  211797. 0x0066f492,0xc21fc6ee,0xfeeef367,0x35b1ebfe,0x4613e5ed,0x7804581c,
  211798. 0xea6ba071,0xcbdfe8e6,0x950d73ed,0xddfcaa32,0x1da48889,0xc9747936,
  211799. 0xdbaffbd1,0xce867c8c,0x1cbaeae7,0xd267431f,0x897912c8,0x68255045,
  211800. 0xd7ea1e4d,0x0c7c1ddc },
  211801. { 0x1ce963a7,0x53aa30cc,0xc4c5fade,0x7352f64c,0x2828afbf,0x2b9aa2f8,
  211802. 0xca212107,0x64273c56,0x85a576dc,0xaadd7654,0x90b5c77c,0x6196ac3e,
  211803. 0xd1aaf39b,0x20d43e9f,0xcd05cbc4,0xfc392062,0x4c0ff2fd,0x14163872,
  211804. 0x2ae821e6,0xcf32b8d8,0x3fa7a3f0,0x5f58f943,0xf644ca92,0xaebf1d2d,
  211805. 0x1918a75f,0x0c061563,0x6b876118,0x7989b5ed,0xad412441,0xbf342445,
  211806. 0x1df633ab,0x24ffc9ae } },
  211807. /* 195 */
  211808. { { 0x93c7cb2b,0x89fcdc05,0x590053fb,0xc1243b95,0x6182343c,0x601debcf,
  211809. 0x66c18a63,0x364546ef,0xec913287,0xa5290701,0xf9788c31,0xc35b8026,
  211810. 0x92d1f7d7,0x852b862a,0x0aa79728,0x1809cb05,0xa3cb2005,0x897d467c,
  211811. 0x9ef5b946,0xf20c77c0,0xf2241984,0xc3372c42,0xf35bb206,0xda053e0d,
  211812. 0xa9c140b5,0xbc26c6d0,0xcb56fb33,0x61cfcc0c,0x299b3968,0x1c3cf9ef,
  211813. 0x40621ba4,0x89e4d3d1 },
  211814. { 0xa45a9be3,0xd35e80e7,0x07356fbd,0xc4daa578,0xb967bc2f,0x0186d62e,
  211815. 0x47cd16e3,0xa702679e,0x5f30ce9b,0xca2f1c02,0x1f864f50,0xf1205b46,
  211816. 0x85061d66,0x7fd6d797,0x8a08809e,0x47edc4f6,0x9a4d3ae2,0x5dac0449,
  211817. 0x6d1f9da8,0xf844664a,0xd7a83a71,0x9f30ce84,0xeaac33f1,0xe9382bac,
  211818. 0x948622ab,0x1f033831,0xf7681eb2,0xb037a4ba,0x99a1b5c7,0xd156a908,
  211819. 0xe6f1d0fb,0x675d3e6f } },
  211820. /* 196 */
  211821. { { 0x707193e5,0xd9767ffd,0x810358e5,0xe478aa91,0x328d8ef7,0x5634f9ff,
  211822. 0x6dbbd9a7,0x913a0ee8,0x7e215686,0x379b2968,0x89d9da38,0x903f410a,
  211823. 0x1b1334d2,0xd9f8d7b9,0xbd82efb5,0x9fe74229,0x3803c778,0xdb568b62,
  211824. 0xd3d25344,0x93e9a350,0x724497e8,0x559c35b0,0xa169e23b,0xc472d436,
  211825. 0xcc5b4c69,0x09864632,0x83c7f531,0x9f6d759d,0x1e497888,0xa91cf1db,
  211826. 0x60af1a4b,0x5f7f92fe },
  211827. { 0x0545167e,0xf18a1cc6,0xaffa88e0,0x55ee2e02,0x432a7bcf,0x24cdff51,
  211828. 0xa7510866,0x7382da42,0x40511af7,0xe894c11f,0x2aaf1423,0xaa4e4e31,
  211829. 0xf63dd2ae,0x8c3d36f0,0xd7660635,0xfc5c9550,0x37ea7eab,0x01253731,
  211830. 0x39b950f6,0x2a5cd598,0x40e63442,0x95a0f601,0xf2ac7045,0x905e238e,
  211831. 0x446b0f73,0x44bacc0e,0xc448578a,0x4cd4206e,0xa5bd7803,0x367b1aaa,
  211832. 0x0a2b458d,0x25beced9 } },
  211833. /* 197 */
  211834. { { 0x0c33a8fb,0x079a7382,0x0f25dc1d,0xcfbf6cd1,0xc6d482b6,0x4ffc73f8,
  211835. 0x07bf844a,0x3e51f18c,0x599162f0,0xa7651236,0x14013811,0xac59a74e,
  211836. 0xe55018a0,0x957a6865,0xe3ca09b1,0xe1ec51bd,0xa960253f,0xbc0c7eb3,
  211837. 0x7de03f84,0xe83bfd14,0x52fbdb09,0xc0540ed1,0xcea15ec1,0x6ba52edd,
  211838. 0x4b261307,0xf3d30ed5,0xe8397206,0x9bd7bae8,0x096373aa,0xf20d8692,
  211839. 0xc3b0bf63,0x0a616a4b },
  211840. { 0x6e1339c9,0x2075f3ed,0xbf8b00a6,0x7afaa072,0xbccd9b47,0xdfafec82,
  211841. 0x00ca54c7,0x4713158f,0x38bc31ae,0x449102f1,0x310dfc8a,0xaf98f158,
  211842. 0x59e954d4,0xc9ef2075,0xc527a0c4,0xe8021af9,0x7a192023,0x6e801277,
  211843. 0x7fb02377,0x635f538c,0xe8c9e951,0x5df1974f,0x15cc9097,0x0287faed,
  211844. 0xf7a5115c,0xfa0728f0,0x0fac623d,0x90dbfbe6,0x0311ba09,0xa8d40fd4,
  211845. 0x07c6464c,0x876d154e } },
  211846. /* 198 */
  211847. { { 0xc2d3ea8a,0xd3a4d6d2,0xa842600e,0x36be681b,0xe4070672,0xc53f100d,
  211848. 0x6a7d7a7b,0xe3e5b6fe,0x5d5e1a83,0x6e6994f9,0x76097c2a,0x07cacd22,
  211849. 0xa6791011,0x12d98dba,0x102e0e24,0xddfc4461,0xd493272a,0x4815dbc2,
  211850. 0xa9436696,0x7e38e64b,0x32b2bf90,0x4960eb1a,0xd928e28b,0xda457525,
  211851. 0x2a077c9e,0x72f75b39,0x7fd61d00,0x27760cbb,0x0f4b1456,0xaf235d1b,
  211852. 0xe76d1700,0x3040c23b },
  211853. { 0x4efa9a70,0xb10dc55b,0x53e86610,0xd4de414f,0x09f8a27f,0x3d95c113,
  211854. 0x06661d3c,0x505109a5,0x60eb513e,0xcaa2994a,0x1e7d338b,0x3ee41537,
  211855. 0x4651e71f,0x4fd145fc,0xcbc313b4,0x51bbf838,0x1eb92150,0xb039e078,
  211856. 0x14bf5ac7,0xe8696b44,0x8be0d48c,0x2d667188,0xdd8f2b6f,0xbe93b2f5,
  211857. 0xeb8a7f8a,0xc1dfd1e7,0x90f751c5,0x862b3dd9,0xa32a74be,0x1eb1ad58,
  211858. 0x1ebbc9a2,0x5486d79a } },
  211859. /* 199 */
  211860. { { 0xa1359e13,0xcb2e34ff,0x28196051,0x202d8dbf,0x23564b5e,0xe95e023d,
  211861. 0x42f6ac12,0xfb1340b6,0xb653725d,0x543ba852,0x8d2466ad,0x81aedcd6,
  211862. 0x547c728b,0xbf780224,0x9569fb65,0x559f8a11,0xdfb22ec9,0x505b7a62,
  211863. 0x9eed5e52,0x07107540,0x299f6f11,0x9c899288,0x3db6f8c7,0xa7d69261,
  211864. 0xb3ca79a9,0x30eb7fb3,0xfb2160b0,0xcab99bb8,0xd28b409a,0xd2012568,
  211865. 0x5ac45f8b,0x380f1b0f },
  211866. { 0xe6a0068f,0xc0b99e6b,0xc8a73753,0x4b67cf2a,0xb2faeb7c,0xa6c9a548,
  211867. 0x340260c3,0x7f417f99,0xcc0f739e,0x8ee56855,0x780949da,0xf08b510f,
  211868. 0x8d5c6eff,0xb1770fc2,0xfd96a7bb,0xb4f5abee,0xf2665a2a,0xa07b1136,
  211869. 0xb601dcf9,0x2fb380a4,0x162becc6,0xcc803614,0xee6b83b3,0x3498fb96,
  211870. 0xa8c17eeb,0xea9b0fd6,0xa177efc2,0x5834b5ba,0x5b110b3e,0x929044f5,
  211871. 0xebd7285e,0x4abedded } },
  211872. /* 200 */
  211873. { { 0x700ef376,0x3355e1b9,0x66cdabff,0xd56e5d9a,0x47e87646,0xb3dc2575,
  211874. 0x00f79369,0x28f44b8a,0xa0c52e29,0x08c32b1e,0x3729b392,0x5a78de12,
  211875. 0xb26d239d,0x4184519a,0xe0ce4a6b,0x23f6b4b7,0xacb2a9f9,0x235f6f8a,
  211876. 0xe2064a59,0xbb8bc454,0x1bf3062e,0x37efd034,0x94dff6f9,0x6bac683b,
  211877. 0x8aa7fa06,0xc3364b1e,0xce0b3745,0x0616772a,0xd1e3fb0f,0x46f08d08,
  211878. 0x18e132d3,0x6a20abb3 },
  211879. { 0x6a85cbc7,0xea831016,0x934f9aa7,0xd0990946,0xe778f1b3,0xc2211088,
  211880. 0x2247b799,0x7ea4ff8f,0x454484ce,0xb3171d71,0x4f98c364,0x29403949,
  211881. 0x97df1458,0x5da911f3,0x09439116,0xa6b58093,0x174238bc,0x75f9509a,
  211882. 0x8209758d,0xfeb51821,0xa47925d0,0xae0c6021,0xaf8a315e,0x0e946694,
  211883. 0x6bad04b7,0xae7af8a3,0xf072447d,0x44c15e7f,0xa5456ffe,0x5184668a,
  211884. 0xbf36b977,0x45e353a7 } },
  211885. /* 201 */
  211886. { { 0x93092f71,0x76056764,0xf5b92d71,0xeb66b6c2,0xe2c8b6c5,0x9db3149b,
  211887. 0x20c0363e,0xf62f583a,0x03cd7097,0x688acd33,0xebb916ac,0x85d0c0f8,
  211888. 0x84c19b0e,0x1bf7462c,0x7c4a6ad1,0xc76ed5f9,0xd119f369,0xec8b88ba,
  211889. 0xebe50b83,0x59b8371b,0x866706a6,0x0cc69508,0xf8373d2c,0x531c75a3,
  211890. 0x2a5a02fb,0x4e1cd3a3,0xda39a1d0,0xe8274778,0x75da333e,0xedfc5bbb,
  211891. 0xca79bd36,0x15941f24 },
  211892. { 0xa77dd512,0x42e8c0f8,0x1dc365f6,0xa91b59a7,0x08753862,0xe80d14cd,
  211893. 0xd272faca,0x1624230d,0x4027cb5a,0xeea3ec16,0xc1ef9f03,0xc1700b59,
  211894. 0x0da3148d,0xd411c127,0xc4181af1,0x801ee448,0x9e3a900b,0xedf28559,
  211895. 0x0d09affd,0x5d67b0bd,0x8b370024,0xd839df96,0xe6f836b8,0x3b6307e0,
  211896. 0xbd3201c9,0x5382e588,0x7a1d02bb,0x636d8a6b,0x968641e9,0x70b7db76,
  211897. 0x118fad03,0x6d17c34a } },
  211898. /* 202 */
  211899. { { 0xc181c99b,0xcf608841,0xc87bdcaf,0xb65dc901,0x3720dabe,0xb460b447,
  211900. 0x5377515b,0x4c79c396,0x0a96c277,0xd447f22e,0x2ac0f440,0x0d952130,
  211901. 0xc90583ad,0x8330b26b,0x928904a0,0xe25e977a,0x85c50b18,0x1deaffd9,
  211902. 0xa5ad5f6a,0xcf4dbcb7,0xc8a37ed5,0xcbcd0019,0x1e9850b6,0x7846dd90,
  211903. 0xb0b8e605,0x1ac8194a,0x34132f90,0xb9728571,0xf56ee28b,0x4ce9f149,
  211904. 0x3e9e1d4e,0x1ab9b5a4 },
  211905. { 0x314fa7a3,0x206dab92,0x478ff963,0xcc4af0f0,0x904d9fdb,0x4cce1713,
  211906. 0x12c045fe,0xac20a2eb,0xfd8f6d7d,0x44fc5478,0xca7b6ffa,0x886e72c5,
  211907. 0x6fd6f758,0x7fa4529b,0x92a820d5,0x4df1d1b1,0x2789f149,0x3d812f9f,
  211908. 0xaabb53d2,0x9842f083,0x2a03ab32,0x2648539b,0xb1512502,0x631ce090,
  211909. 0x731f6bd5,0xe1294d15,0x9436e634,0xb229361d,0x3ca966af,0x8c4281c4,
  211910. 0xc21ab3ed,0x24b34956 } },
  211911. /* 203 */
  211912. { { 0x659824e2,0x49bdcb86,0x4e13e74c,0x6dc4ce48,0x6bbe1eea,0xa4c01a26,
  211913. 0x1e3ec457,0x47b2b8e7,0x2f5a8e4b,0x7e8b15e0,0xe333530d,0xe81eb6e6,
  211914. 0x17a45202,0xacba369e,0xd70e4c9f,0x81241431,0x3e12beb8,0xc190af4b,
  211915. 0x11f486fd,0x53270523,0x29fb2bce,0x9f6c41e1,0xb70f6c08,0xbe6287eb,
  211916. 0x3feb4477,0x1479850a,0x9bcf18bb,0xfcfdfb11,0xda80d040,0x925c292f,
  211917. 0x7e3c5bf9,0x212d65e5 },
  211918. { 0xca15cf08,0x23adb386,0x81e172eb,0x4dfa4ac4,0x4d42d0c0,0x9d1dbf93,
  211919. 0x74404dc7,0xd9cf6073,0xe932bfcd,0x60508441,0x1c682a98,0x9ae910ca,
  211920. 0x41ac1cc0,0x9528fc18,0xdbbed630,0xe6a120ae,0x30ccf250,0x94e0e1ec,
  211921. 0xe58bbf2f,0xfe84ba54,0x9faa4415,0xc66d0b4f,0xecee7ce5,0x0c58f1e7,
  211922. 0x6fa6873a,0x7a1d43eb,0x399f1348,0x96c6c5a0,0xe6727ab7,0xe6ef9aaa,
  211923. 0x9a5c2447,0x66afa554 } },
  211924. /* 204 */
  211925. { { 0xc980e91d,0xda5aaba8,0x6ac98efa,0xa93cf509,0x8da32662,0xb0990e0a,
  211926. 0x0081453e,0x01d21530,0x3d71de84,0x2bb0d33e,0x3e19a012,0x465f6d80,
  211927. 0x78a838e7,0x5902ff4c,0x1931348c,0x74e2afb7,0x9cfb057b,0xa4932757,
  211928. 0x3ad03f8f,0x761ea642,0x58ffa40a,0xb7d4c245,0x77a87e30,0xb5e9c0d9,
  211929. 0xc9c84d26,0xd1c5edba,0x3d1963a0,0xeca8839a,0xebf6bf0d,0xbc6f2f35,
  211930. 0x0d58abdf,0x01ef0631 },
  211931. { 0x3ecdcbb0,0x2bf90316,0x27c1c955,0x19e2d728,0x9575c930,0x9e527030,
  211932. 0x96983930,0x0dc1c5a9,0x7cd082df,0xef9f80ff,0xdf97e051,0xcd915075,
  211933. 0x9cc61b55,0xf286fffe,0x80f24cc4,0x352db38f,0x36523ae3,0xed9b99ec,
  211934. 0x10b104a9,0x109a8ca8,0x305203ad,0xc2700fe7,0x769400f5,0x2a2ee24e,
  211935. 0xee0c452c,0xd595d399,0xf7f02a41,0x0ab75d6a,0x0db730b7,0x34108099,
  211936. 0x5e8d1202,0x0e4f5ffd } },
  211937. /* 205 */
  211938. { { 0x0ff14c38,0xbd1c6444,0xaece11f2,0x9a5b59fa,0x22af6330,0xaa4605a7,
  211939. 0x82af24ee,0xddc9f65a,0xeb9a1159,0xf4ee4bfe,0x74e84eaf,0x2463d076,
  211940. 0x0e0baace,0x88cbe1e0,0xd5fabdcb,0x7ca568ea,0xc57eb99d,0xbd80d524,
  211941. 0xe9be9873,0x9c46572c,0x7300b85e,0x918a1dcd,0x40f54176,0x49221312,
  211942. 0xb5b14236,0xf7e324ff,0x2434f16a,0x40dda501,0xa133d97c,0x08833421,
  211943. 0x0876f020,0x33d41161 },
  211944. { 0x9878e5ec,0x7531a36b,0x46918232,0x5de3e321,0xd0a30464,0xd15f9a33,
  211945. 0xaa173659,0x734c1b87,0xf925d4fe,0xac2094a2,0xc262b0f4,0x43c965a1,
  211946. 0x447d5cbc,0x759c903e,0x05239300,0x92af215e,0x1f593f34,0xfffb6d5f,
  211947. 0xc3cddb5f,0x65943b4b,0xbfdd5408,0x9d03a29c,0x198d76c0,0x8f7cda6b,
  211948. 0xc0f27b59,0xc0790a22,0x8cb58ccf,0xba557a84,0x76c54fdc,0x5922052d,
  211949. 0x47b6b466,0x2d3de7aa } },
  211950. /* 206 */
  211951. { { 0x65add3b7,0xaade7462,0xabf24c2a,0xe5888f35,0xe1a57d93,0xd41549ca,
  211952. 0x2c76f7bf,0x0e22e18e,0xbe3202b3,0x67f288ea,0x1d1d0f0a,0xb79a66ba,
  211953. 0x2881ad18,0x0e0ab749,0xc7adb0e9,0x7d424086,0x2842132f,0x870c32c5,
  211954. 0x58f9a09e,0x858477f1,0xec025589,0x422a9372,0xa5098777,0xbe428c5c,
  211955. 0x57660058,0x45b79564,0x957f37cf,0x6c7fc631,0xd6316289,0x8b7023dd,
  211956. 0x5b1c12a6,0x47003bb6 },
  211957. { 0xc91c1c96,0xd99401c1,0x27a12970,0xaa5dcdf9,0xc3c29107,0x3ab92e17,
  211958. 0xa3fe4710,0x26fce8f7,0x4ee998ee,0xb0d09d5e,0x8e3a41f8,0xafa62204,
  211959. 0xa26ca506,0xb1c012a5,0x99b57252,0x2c6f734c,0x512f7fe1,0x1093d79f,
  211960. 0xacee19a6,0x2f30906e,0x056d1ea6,0x6bff8381,0xeff35f21,0x61c75856,
  211961. 0xc1ad2224,0x6e07e978,0x6b20fde8,0x2cca6ca1,0x633fe81b,0xab4d6d2d,
  211962. 0xb06a2ce6,0x73dff504 } },
  211963. /* 207 */
  211964. { { 0xd8e20fb8,0x8b615805,0x82b533f0,0x7c6873e4,0x56a854ca,0x5205f001,
  211965. 0xcb369211,0x87fec6ac,0xc7f092b7,0x1fa3c0ec,0xe845fe4c,0x5b36647e,
  211966. 0xf8b1f112,0xd4781e85,0x8b0f1a6f,0xc6526839,0xdcb8eb92,0xceeb8c6c,
  211967. 0x8e5f6d52,0x133f0ead,0xc8d934dc,0x31883e23,0x428ac45a,0x214ed5bd,
  211968. 0xdbbfca85,0xf77ca492,0x07e5ae13,0xdf4113fe,0x72ab05fb,0x63e4a0d2,
  211969. 0x7148f535,0x7544d0b7 },
  211970. { 0x80797ace,0x4fe8d134,0xaf86d97e,0x216d6aa0,0xef5a68fc,0xdbf0a688,
  211971. 0x9f9b2684,0x18b26f45,0x8999d2fc,0x52fefcfa,0x62423955,0xd5af8d82,
  211972. 0xf63a3780,0x8f123469,0xdcd4feaf,0x2933454f,0xa73b5d09,0xba8018b7,
  211973. 0xe5552c18,0x9af1f276,0xff26bb1c,0xc5d4773d,0x06dd4f44,0x9ef49410,
  211974. 0x5f39ba49,0xad8f12f9,0xf66ca4f2,0x5767f6dc,0x7922f59a,0xba8773f1,
  211975. 0xc1e42d49,0x220081ea } },
  211976. /* 208 */
  211977. { { 0xba37a0ba,0x3043d573,0xdd176df6,0x05a431bc,0xc42070f7,0x03322cfc,
  211978. 0x67c2d109,0x5cabd30e,0xcbf8bcfa,0x362c95de,0x7787b10b,0xd767d277,
  211979. 0x6ec05e64,0x612c915e,0xce69c30e,0x9e669631,0x682e2635,0x27c9dd8f,
  211980. 0x95ffcc38,0x79021f12,0x8a2adca2,0x06a8ee79,0x4b5d500a,0x8e00e784,
  211981. 0x8d80d6c5,0x87746fc7,0x915f10cc,0x246053be,0x219f6fd8,0x844e328b,
  211982. 0x11bd3733,0x620541ac },
  211983. { 0x509e5a29,0x0f7fd382,0xb432531e,0x8748d7d0,0xcd3883b9,0x8f749354,
  211984. 0x8bfbb17a,0xc6b8ac74,0x05f2d2c5,0xa4616a66,0x1bcb1b83,0xb3d96625,
  211985. 0x2fee265a,0xcf753104,0xdb225058,0xc70d73fb,0xf0c2d556,0x1211d434,
  211986. 0x54b259b3,0x862061d8,0xc42b3f7d,0xffe4606d,0xe86a4949,0x4c5c8585,
  211987. 0x160eedac,0x04ddcc8b,0x568e2420,0x1804ce67,0x42141656,0x91f3855a,
  211988. 0xf932be97,0x7f378198 } },
  211989. /* 209 */
  211990. { { 0xdfa6639a,0x9a374bda,0x02ab7391,0x0cbd48d4,0x47031e2d,0x5c5ef236,
  211991. 0xd0599d1f,0xb49ee2bc,0xe0d38443,0xd285eb60,0x269392e8,0xdbbea92f,
  211992. 0xb8bc538f,0x91455fbf,0xe469b768,0xae259ff1,0x41de5682,0xc1cecb1f,
  211993. 0x9952d1ae,0xc876f071,0xe7bf7446,0x1ce25181,0x282ad2f1,0xcb93ad86,
  211994. 0x6ba4ef67,0x8fa3cd31,0xe507aa3e,0xfce68a04,0xa61bb608,0xced74170,
  211995. 0xf6ac10d0,0x6de716b3 },
  211996. { 0x172d6dc5,0xd4e58d04,0x6397c65c,0xbed2cde6,0x0c9eb4e8,0x7ae77e18,
  211997. 0x75fa2edb,0x56275468,0xa91e6738,0x4b30324e,0x235c8b2e,0x6023a856,
  211998. 0xa8f92887,0x9df6d6c2,0xf6f5e8b5,0xec2c185f,0x3ad5748a,0x7892e12b,
  211999. 0xd54aefbc,0x7aebb4f2,0xee868821,0x14915448,0xb1d9bd5b,0xa26c5f71,
  212000. 0x2ff00df7,0xe5ccd166,0xb95b1dee,0xebc99f17,0x3fe1f774,0x90983616,
  212001. 0xbb3d25b0,0x51f90830 } },
  212002. /* 210 */
  212003. { { 0xf2922461,0x49376fa1,0x1650d0d1,0xdbb1b1c3,0x0dd8608d,0x92b91c33,
  212004. 0x36b89906,0x3e612c4b,0xdf560052,0xe1977b0b,0x636a2545,0xf8afff70,
  212005. 0x11723d8e,0xcda7d278,0x81bde7ba,0x0b0bc4bb,0xed2a578e,0x3cb080b2,
  212006. 0x171b2e02,0x5bda0d0d,0x941bb9ae,0xf6df38cf,0xc14a65c5,0x85dd81db,
  212007. 0xc19dd98e,0x7f98c82d,0x52206f93,0xc613747f,0x5f5bbe78,0x9e13a2c2,
  212008. 0x0aa34be7,0x5eed218e },
  212009. { 0x01d4dc0b,0xe1565754,0xf566bb07,0xa1ae5f27,0xb82225d5,0xe985ebeb,
  212010. 0x1189ec6b,0x5f3ad21c,0xecce4d9d,0x17da518c,0xd6b65b59,0xc84a2d3e,
  212011. 0x8ffa771c,0x7f988175,0x2ac69a7a,0x50d6ae12,0xc6e6846d,0xcb7f30b1,
  212012. 0x5bd0bb13,0x8c023a60,0xd73f2407,0x9a10fecd,0xe5f0a996,0x8c5158cc,
  212013. 0xbd8f5806,0xd26bf615,0x915a46e1,0xaf32ea87,0x0287d308,0xeaf74e81,
  212014. 0xa6264254,0x8c14ba06 } },
  212015. /* 211 */
  212016. { { 0xb17ee201,0x0c877895,0x88e57a77,0xc05aa471,0x97822456,0x19c3e763,
  212017. 0xc9c3ba1d,0x0be6f8c0,0xb4389ebe,0xfe85f4ff,0x0ce7fbb6,0x538bccce,
  212018. 0x65266c64,0x876eab2a,0xcf9a3842,0x5c9ac690,0xccc8f981,0x9f5cf3b1,
  212019. 0x9cf687de,0xfa17be6a,0x83835c15,0xfcfc10fc,0x150ef2eb,0x086b0fdb,
  212020. 0x884a52e6,0x9f97ecd9,0xb0cd1eb8,0x416e6fa2,0x3ecc03ba,0xe2bd1599,
  212021. 0xeabb165e,0x645c0a5d },
  212022. { 0x50aa7e31,0xd94c4205,0x2f851da5,0xaec8df0c,0x3c726e6a,0x99646909,
  212023. 0x2619bf9a,0x72dbdc36,0xe253fbd5,0x1b4260e0,0x8c709e06,0x97c259fb,
  212024. 0xcddaec5b,0xfabf7cbb,0xe4b703e9,0xb4d5e8b1,0x0734efdd,0x1b06e56e,
  212025. 0x1f55f8a5,0x02d4a4f9,0x3f565c8d,0x7f8608ba,0x816d1d94,0x822f47d2,
  212026. 0x5ce7b136,0x0cc36156,0x31d04242,0xe46ee5ef,0x683567f6,0xb2a65f70,
  212027. 0xd2fa6c91,0x27e9ff40 } },
  212028. /* 212 */
  212029. { { 0xd7e952e7,0x75251893,0xc735bf18,0x15b30583,0x96fe0491,0x732b5992,
  212030. 0x806d2fca,0x27451858,0x1b885ed9,0x71ab76a0,0x6d9f55ec,0xbdce9d97,
  212031. 0x48f2ba9c,0x3da60b20,0x592b132b,0x6977c086,0x099051d7,0xb6dca9cb,
  212032. 0xd188ae25,0xd9c2ab23,0xe20aaf3d,0x9f469f3f,0x5aad74d0,0xdbd1f7cf,
  212033. 0x22a9eb3b,0x3d5efe5c,0x137010c4,0x8c5edfa2,0x57870260,0xada2217b,
  212034. 0x3dac9776,0x4feee567 },
  212035. { 0xb5d3d780,0x30e18d52,0x07166744,0x4dadb5d3,0x5a742156,0x320d386e,
  212036. 0x8d6bbb86,0x5d8c290e,0x2d263dd1,0x981a4323,0x98984636,0x33d0e7ca,
  212037. 0xa519acb1,0x5138784d,0xdddc81ff,0x832e3fab,0x3199a43a,0xfc278594,
  212038. 0x32743163,0x5b4cabcf,0x74f94fa7,0x9fa010bd,0x5694a627,0xc28a743d,
  212039. 0xcb657a24,0xc1d2a888,0xe86a25ea,0x7eef2503,0x04c561ff,0xed11a5d3,
  212040. 0x9c9ede0e,0x4fe818e7 } },
  212041. /* 213 */
  212042. { { 0x7fc1c7ff,0x00252c9d,0x9fa89ad1,0xa9bd419d,0x4064e9cc,0xc93a124a,
  212043. 0x43942ecc,0x384cbcb8,0x8749695b,0x004c21fd,0x421165bf,0x69c81d9f,
  212044. 0xdde01102,0xe2325628,0x5a9b004d,0xec937457,0xf6dcfc21,0xfb3346bf,
  212045. 0x4d372c7d,0xac4da64b,0xf20494e2,0xcecb7ad3,0xe867c150,0x562c41b5,
  212046. 0xc2b723d8,0x299395ce,0x7ee53231,0xc91adfc5,0xf10b6597,0xe06f1161,
  212047. 0xb74d3ffc,0x81915529 },
  212048. { 0x6ed9d4ee,0x8ec12431,0x689aff01,0x3dffa154,0x2a89a3f4,0x4aba349f,
  212049. 0xd467efb2,0x2db1e8e2,0x039102e2,0x18dea354,0xe52f082b,0x422ab853,
  212050. 0xed36dd47,0x7130a2c1,0x0295d1ee,0xca60e86d,0x7c7f5ad3,0xe6ac6808,
  212051. 0xde864658,0x0f83cecf,0x461d1265,0x72e66c21,0xbd385099,0xfeef4150,
  212052. 0xa6632289,0x0f183f3a,0x792dc795,0x275454be,0x11367702,0x2744c11b,
  212053. 0xe8ea6ef3,0x7d06bcc7 } },
  212054. /* 214 */
  212055. { { 0x7090212f,0x89285942,0x5521e844,0x691b7d4c,0xbe2dbb92,0x4c038422,
  212056. 0xbd81f880,0x317721ed,0xac89bc36,0xc136cbee,0x7b8f004d,0x4f71b60b,
  212057. 0x4e218ab8,0x269132d0,0xe6cc814d,0xb0e2496e,0x75fadc15,0x0b2ce317,
  212058. 0x66d223c5,0x82e3c084,0x4c612f8b,0x9721caa6,0xa4b65355,0x59a751eb,
  212059. 0xc7d3d9d1,0x3433aad5,0xe80d4246,0x1e61b9d2,0xfc673caa,0x149f655f,
  212060. 0xd0f9cb92,0x48b52b99 },
  212061. { 0xefdc05be,0xa3915399,0x13e095e9,0xde70db18,0xcddb3fda,0x447862e9,
  212062. 0x1a009451,0xa2b03162,0x23920ea3,0x4b27980c,0xa23b8feb,0xac5394f1,
  212063. 0x3e5616d4,0x163f7256,0xb714219a,0xaa0ff93f,0x93d62474,0xd26f96d2,
  212064. 0x7dcfe276,0xdd212ea8,0x47038d15,0xab27bf2f,0xf418168e,0xe58c8325,
  212065. 0xb32a989a,0xe3704222,0xbfc9f13b,0xa3694390,0x0d0684ad,0xf16e2606,
  212066. 0x9d8c76ec,0x17c0de87 } },
  212067. /* 215 */
  212068. { { 0xdcc01958,0xbca5f453,0x1ce88393,0x7d945954,0x561f5b6d,0x5e6350a1,
  212069. 0x7e2d36bc,0x291c3c86,0xa5ac3a6c,0xf6c7ed84,0xd98006cd,0x7913c40b,
  212070. 0x5671ec3b,0xf78bb087,0xb43e89a9,0x1c928f6e,0xae1ea1ed,0xfdf28df3,
  212071. 0xb924b2b5,0x62bba5b1,0x1a116e05,0x491d2705,0x167ed3e3,0x08ec02b7,
  212072. 0x5bc0b046,0xe291cf7b,0x8c5d7f59,0x30e50169,0xf5c799b7,0x0c7c350d,
  212073. 0x0ac6e1d7,0x6862b9e2 },
  212074. { 0x9ffa1f64,0x56c6f4e7,0xa1e24349,0xfed6a91a,0xcdb75232,0xe9a0ee0c,
  212075. 0x0322d607,0xbfc90b37,0x462fef87,0x29480ad2,0xc2bfcf34,0xfc214969,
  212076. 0xa539e38f,0x6e5211e0,0x12a5149c,0x2a59ec26,0xd706b532,0x195fe212,
  212077. 0xe99c8429,0xf77fb108,0x5dc80482,0x74ceaea3,0xbd92d298,0xa5a6030b,
  212078. 0xaaea15ee,0xad42dca5,0x4987109c,0xd6ac3bc7,0x290af649,0xc64e1c40,
  212079. 0x51f8de6c,0x5093fa2d } },
  212080. /* 216 */
  212081. { { 0x4c2d553b,0xc4cf3280,0x3b966c29,0xdc1abe22,0x2296914a,0x556a549c,
  212082. 0x999976c9,0xd8c9f8b5,0x776e83f3,0xc22c57bd,0x7c85ec57,0x4f2942ab,
  212083. 0x6e2c61f5,0xef3407e5,0xf213db48,0xf005e8ca,0xf32698c7,0x470c853d,
  212084. 0xcac0a54b,0xe6f488d7,0x60b7501e,0xb6bd6bed,0x714a4bd9,0xf0103106,
  212085. 0x6e098894,0x5285bc3b,0xf5f92a00,0xec06741a,0xef7ef24a,0x32f16426,
  212086. 0x6c77a438,0x12f9c44d },
  212087. { 0x83313a1c,0x1951e964,0x33c58b37,0x98edd3da,0xc7ac4044,0x4edbbf52,
  212088. 0x0dcb5ee8,0x866ca6f7,0x6dd422f8,0xec0ae8f5,0x0661ec2e,0x1077bc54,
  212089. 0xd422523c,0x6d39913a,0x58e7cb3e,0xd105e1e8,0xc979bb45,0x47c9397f,
  212090. 0x0997b592,0x3221d4a9,0xe8952fe7,0x0ef628a3,0x4e946241,0xd08d5827,
  212091. 0x59780f40,0x64cbed0f,0x08e110ec,0x13d7c227,0x7679b1a3,0xd186d866,
  212092. 0x26ae1d18,0x02f75e4e } },
  212093. /* 217 */
  212094. { { 0x47f307d7,0x1b637ebf,0xd0141477,0x6b644a6a,0x2e05a80c,0x82a33d65,
  212095. 0xfed07b31,0xc8f1a0f3,0x3696e597,0xc09ee7f9,0xc7ffc01e,0xcdaa7ec3,
  212096. 0xf8f373b9,0x549f88fe,0xc3bb8989,0xc88d1961,0xdfcaa7b7,0xd92a4fe9,
  212097. 0x3ae4ab20,0x12ff9ee2,0xf5ecb1a5,0xf5aea641,0xe32fb47d,0xe769237f,
  212098. 0x25d085c0,0x96a5c420,0x26c755a2,0xdc912558,0x9bce9723,0x580b985f,
  212099. 0x63961941,0x72b1b566 },
  212100. { 0x790e5558,0x9d708a08,0x0689af80,0x98536041,0x42313b5f,0xe85e7b8a,
  212101. 0x55a49d1a,0xe6ba1292,0xac371b0b,0x5e76c4b0,0x938e6e19,0x58504f39,
  212102. 0x60ae9a21,0x8dd41422,0x968485ce,0xd8b04e9b,0x887efe43,0xf94c4ba5,
  212103. 0xf11c5e73,0x11268e67,0xcf6b99c4,0x92623e28,0x7a0a9662,0xf2d0aaa8,
  212104. 0x4ca02ed3,0xb266772a,0x2d63b551,0x68ee8e4e,0x2e78b5b5,0xcdebb299,
  212105. 0xe17225ad,0x5df19216 } },
  212106. /* 218 */
  212107. { { 0x8df2e7e3,0x20027e1e,0xd8da07de,0xb183cc68,0x4b4ae694,0xce35ba69,
  212108. 0x3ca62e88,0x896d97df,0x52efed2c,0x3de4713b,0x26bd084f,0xd006c40e,
  212109. 0xfc81923b,0x1e9b71bb,0x1aacc6b0,0x9991c7b6,0x8f656840,0x650c9364,
  212110. 0x87f47524,0x138561d1,0xbffd3ca2,0x610f2b11,0xfa191418,0x96915faf,
  212111. 0x955e5309,0x8f1236de,0xa1872d79,0x613cbeea,0x66a2a48b,0x7f7b44ea,
  212112. 0xe0a89c32,0x452265c2 },
  212113. { 0x25430010,0x4ad5ec79,0xebd090c0,0xcac786ff,0x20a9d3f5,0xa5f9f4ff,
  212114. 0xa3edc65f,0xfcbf4112,0x0cf3eb11,0x8824839c,0x8aa5b700,0xb8dd6d4e,
  212115. 0xb7568ab8,0xe2271dfd,0xb744560e,0xe43ec373,0x1cf75296,0x78eaf926,
  212116. 0x3fa96d9b,0x1809ae0e,0xdc25dfd5,0x0b312d2d,0x6bab7711,0x6b8f78b4,
  212117. 0xb5ecf1e4,0x069efc8d,0x609fecaa,0xc1952bae,0x5f4dbde1,0x43e302ed,
  212118. 0x1e078555,0x14b02bf9 } },
  212119. /* 219 */
  212120. { { 0xb87e5b57,0x2c71c768,0xf531a557,0x0bcc78f7,0xf7597dc8,0x4ff93f8b,
  212121. 0x139e175f,0xb28e026d,0xcb94ca6c,0x6b83b727,0x0079f7fc,0x2eafe3b2,
  212122. 0xcf3bd170,0x2aca54de,0x6af0dc6c,0x17c4133c,0xccf5e35e,0xbea1e665,
  212123. 0x345505c6,0xa6691a48,0xe6100b89,0x2633abd0,0xc17d0388,0x966c6706,
  212124. 0x1a0cf90c,0x7aefffbe,0xd0add64c,0x4d847be7,0xaea2aa46,0xd49bcdfb,
  212125. 0x2cc7d0a5,0x85e07e74 },
  212126. { 0x0bc25bca,0x23aae0a6,0xe44f64ec,0x6e8e55f1,0xb607b773,0xe1e696d8,
  212127. 0xd3005909,0xaa90a746,0x2cbc4990,0x072b1ccd,0xc68e2f5d,0x0d0fe6c6,
  212128. 0x53e28ec9,0x920ec5f0,0xf0040cc1,0x79b21fb4,0xfcc4a2c7,0xa7375bd3,
  212129. 0xe1bac7dd,0xf5f5def9,0x35c0f8d3,0xdc315d79,0x2cacd318,0x7117c170,
  212130. 0xe926f71c,0x6f2823c4,0xed02f39a,0x38db58bb,0x7db69323,0xe5b49231,
  212131. 0x8d49f430,0x0964039f } },
  212132. /* 220 */
  212133. { { 0x56999eba,0x21774f16,0xb1de6305,0x3d8ee287,0xde0b2669,0xd81af726,
  212134. 0x3f8942a1,0x37446939,0xea03e13c,0xbcf6b615,0x94e273cf,0xd30c0c35,
  212135. 0xc6725c56,0x4fd33a56,0xa8be97a2,0xa57534ad,0x7c22a251,0x799242a6,
  212136. 0x9d0c5c49,0x4e51bdb5,0xc6a42768,0xd7cd76cc,0xd426bf59,0x914097ac,
  212137. 0x66e9beb2,0x59404a2c,0x5c96e3e9,0x4738fe98,0xaad666d0,0xbcbb3e0e,
  212138. 0x63bc5e56,0x626b0fd2 },
  212139. { 0xe1a1ec42,0x47217dba,0xab5acc50,0xaa6ae7db,0x865331d1,0xb7e1ab1e,
  212140. 0x3d30126f,0xb8453070,0xdee61851,0x280649e0,0xea689544,0x8806f4a3,
  212141. 0xcb56f632,0x4bbe43ad,0xbcaff94f,0x036b9bda,0xbd0637be,0x0d941e65,
  212142. 0x686f3abb,0x82179d44,0xaad6afd6,0x1486912c,0xff7e1534,0x9a3b891e,
  212143. 0xeb86fd96,0x88c426ce,0x117928c3,0xb56e6a81,0x96399e00,0x933e7135,
  212144. 0xa17b6ac1,0x09bbddd9 } },
  212145. /* 221 */
  212146. { { 0xe4fd3673,0x75e39c1d,0xa65c8e07,0xf880d9d1,0x7289c7fe,0x4725c1dc,
  212147. 0x3529d200,0x5b6735ee,0x3c747af3,0xc1f8f2ed,0x912efdf5,0x5cf3998f,
  212148. 0x49859c39,0xed722618,0x0e69795d,0x23793a2f,0x86b1d2a7,0x8a6ab8d6,
  212149. 0x22a882e4,0x00c815de,0xf9db8d7e,0xbe77d6fc,0x02267547,0x0886fb32,
  212150. 0x49c10edc,0xb62687d4,0x7c83ed4c,0x9f1c3e17,0x5af366ea,0xe6d5d7f0,
  212151. 0xd1efad24,0x2eaa01b8 },
  212152. { 0x1f357c74,0x5e47fb70,0xa9e3b794,0x93085c4a,0x6e85a905,0x4f098733,
  212153. 0xbe0244c9,0xf53808ff,0xa3b5660d,0x91dddf93,0xf3b95ed6,0x8b76377b,
  212154. 0xbb3920d4,0x91b911b7,0x86a13cf3,0x7ccf08bf,0xea018e58,0x53ed8f97,
  212155. 0x78c55194,0xb1ea4343,0xe0d2d5a6,0x8e6adde9,0x9b96259a,0xfc2b248f,
  212156. 0xeef17ddd,0x96ebceae,0x557f9c85,0xf694b443,0x07d5bba8,0x48cd150f,
  212157. 0xb4c1986b,0x02d31de9 } },
  212158. /* 222 */
  212159. { { 0xde79499d,0xa6bb9e1e,0xfd0fc2ad,0xf6ca8ff8,0x1a7d9356,0xbec0f8e8,
  212160. 0xe8f06327,0xbc3d1c9f,0x3b300beb,0x805c7217,0x413c181b,0x00420a08,
  212161. 0xf0ca9d01,0x9e9a167e,0x1aeeddd6,0x076c909d,0x8e3a8a72,0x64a1997f,
  212162. 0xa77b429e,0x3ce7f7a7,0x5c94d3e9,0xaac0fbf4,0xe6d48407,0xf37694a7,
  212163. 0xa91921e7,0xf56679e2,0xee1dbbd6,0xf23fe0f3,0xcbf9fa99,0xc7917566,
  212164. 0xe0f4d765,0x965860f2 },
  212165. { 0x7fa5f79c,0xe734702b,0x5af2d26d,0x930bd426,0x6c73e0ce,0x45bd8b98,
  212166. 0x4ee44a2d,0x7dbe7bed,0x956c8a1a,0xc129e024,0x77cdf80e,0x6fdc05ac,
  212167. 0x589ca59b,0x70a6ba2b,0x999825af,0xfc484021,0x7a23f0b6,0x1d284b54,
  212168. 0x28a0a8af,0xb1da10a4,0x2b2af6d8,0xb1eb1b31,0x33935ee3,0xf051443a,
  212169. 0x8effa6ec,0x7a07eb26,0xd662654c,0x16ee4086,0x4549ee4c,0x7a7bc501,
  212170. 0x1fa98a52,0x65081032 } },
  212171. /* 223 */
  212172. { { 0xb67ed9b2,0x49f0e460,0xc36d93d2,0x0cda0fd0,0x88c75e1c,0xbb5963e9,
  212173. 0x614bc0c9,0x757bbe93,0x9a768605,0x9a9b8801,0x48edc544,0xa8b7e2af,
  212174. 0xb51a5985,0x9e77ed9e,0xebbf024c,0xdd025274,0x1545c636,0x598b6288,
  212175. 0x4800dba0,0x39bdaed0,0x81e2a23a,0x7fc20139,0x550cb4f2,0xdc66fd5c,
  212176. 0xb52068c7,0xad27032f,0x8169fa15,0xc9a0bcae,0x3a7ca8a2,0x60606f21,
  212177. 0x9862652f,0x98295046 },
  212178. { 0x2e11c128,0x3e374600,0x0e6dca7e,0x80dfae5d,0xd9552264,0xe44016e2,
  212179. 0x880b7143,0xf65f88f2,0x526b881c,0xca3d28d4,0xdfb86afe,0xf9c59dd1,
  212180. 0x4c74f958,0x548860c2,0x9cb69f4f,0xd06ea43c,0x7334ecec,0x5343c9ae,
  212181. 0x35329713,0x5cc2ccd6,0x5f3a6c0c,0xa95ff403,0xb372653b,0x2e01a1cc,
  212182. 0xa250523d,0x31510fdf,0xa6227eb2,0xeee538e2,0xca23cd10,0xeadfc8a0,
  212183. 0x3e78f54b,0x4b7e6e1b } },
  212184. /* 224 */
  212185. { { 0xdb5f928b,0x79c9076f,0xb7347cec,0xe6250bb6,0xac00ec41,0x54b67798,
  212186. 0x9d9619c7,0x900d20ba,0x59e4343f,0xed42c0d0,0x451935d7,0x3df39e85,
  212187. 0x64f701ce,0x26391182,0xe1f87aac,0xce8f2554,0x65f91aaa,0xfddd6789,
  212188. 0xa324539f,0x96cd163f,0x4bace995,0x5c815f2c,0xa94f9ea5,0xd78c8c2a,
  212189. 0xef24e455,0x7ab2aff4,0x1cddc26a,0xf0ed6409,0x00ca2822,0x954a420b,
  212190. 0xd3297658,0x0611c4c5 },
  212191. { 0xa9e81829,0xf192001c,0x08a282cc,0xded33320,0x8f9ded9b,0x0bfd7de1,
  212192. 0xb7889003,0x6793ac0d,0x3577a5dd,0xbb00d91d,0x802d3c2b,0xe17a23a7,
  212193. 0xfb549014,0xff95f88c,0xc71b6e07,0x7cd1bf4b,0x23588c8b,0x2e3b24a0,
  212194. 0xa4112076,0x9b5335b8,0xc4056d30,0x2481c05e,0xe916a1b5,0x55c7410c,
  212195. 0x850179f4,0xbbe03271,0xb3cd1208,0x15e6c177,0x90cbfe50,0x509a24c0,
  212196. 0x1c108566,0x82079529 } },
  212197. /* 225 */
  212198. { { 0x1c7d353e,0x5d2d3cff,0x7de0ce3b,0xd5e7eccd,0x6ca87635,0xb4b1075f,
  212199. 0x25f9ad3e,0xda8404e0,0x205cb5ae,0x6b963e89,0x09f221a1,0x9e5ee0d8,
  212200. 0xea41aca4,0xd64c85d9,0x34442a34,0x6a46c4e9,0x3cf655a4,0xac6ff97e,
  212201. 0xe5417d7c,0x76565c1e,0xeebf9c4c,0x681009a9,0x88da6388,0x95b61d39,
  212202. 0xf6b472c6,0x6402b46a,0x0b7f1171,0x1fde5165,0xbe0c05e3,0x94f8f273,
  212203. 0xa88344a7,0x7487b036 },
  212204. { 0x9c3e2370,0xa860e575,0xf8048719,0x19d58193,0xa6e2f9aa,0x3a0dbf3c,
  212205. 0x6144719b,0xb6c7e959,0xdeffec21,0xa9049c74,0x3f50cebf,0x8ba064b2,
  212206. 0x49a1de15,0xb12822c0,0xb1d527f2,0xb654b7d9,0x0ffd0430,0xc470859d,
  212207. 0x4f05446b,0x37c74a67,0xa3add995,0xe553251b,0xe33533b5,0x4a3ed6cb,
  212208. 0x27e419ce,0x2f2f44d0,0xa5d1b979,0x2d84ee82,0xdb6fa69f,0xcc76b123,
  212209. 0x21fa3bdd,0x834f85c5 } },
  212210. /* 226 */
  212211. { { 0x2ce9b31a,0x329347c1,0xfe3fb3b7,0x1d88522a,0x52ff90fd,0x4bcefb4d,
  212212. 0x2b1a081d,0x53b17386,0x2a411f08,0x538c11ba,0x141b603a,0x7895b93c,
  212213. 0xb10bd741,0x2993b9aa,0x09912986,0xccbbd046,0xeea0aba5,0x669fafb0,
  212214. 0x35661897,0xd4844622,0x367ffa54,0x4a63b89c,0x1c3478da,0xcbad5d1d,
  212215. 0xaa6034f7,0xc5339227,0xe61b1391,0x0e6d705f,0xf74ff515,0xdd14b660,
  212216. 0x5332b54c,0x639d8b0a },
  212217. { 0x162217cd,0xfa423162,0x811c28e6,0x2e0e4a2a,0x21766dc0,0x68d9ce18,
  212218. 0x046a06ef,0x51263739,0xdde92101,0x44eea231,0x114298d3,0x0607c8f2,
  212219. 0x63d957e9,0x27f272ba,0xa5e8cae1,0xe7ce80cc,0x24f7a63f,0x5816ebe2,
  212220. 0x89673e34,0x4dece5a7,0x536babd4,0x13756a22,0xe3bf77af,0x644d61ae,
  212221. 0x2bcf98bc,0x60b2bf6e,0x29fa962c,0x3b0b59f3,0xabb50023,0xb0769a1a,
  212222. 0x0c75402c,0x40903136 } },
  212223. /* 227 */
  212224. { { 0x1670433f,0x84d2873a,0x25493dfc,0xc9394df6,0x80fcf89e,0xeb05a19a,
  212225. 0xdb297616,0xe39e4310,0xd9e63046,0x50742dc9,0x1de9ca9e,0xf31ad8c8,
  212226. 0xfb7b1d0d,0x86aabf94,0x1b3c82d1,0x36cda27a,0x39702d84,0xfb1a2ef4,
  212227. 0x46081299,0x280bfddc,0xd2396238,0xe4b2b48d,0x7b3c9353,0x2db2c2f3,
  212228. 0x12fb8a69,0xd5b5b317,0x08180474,0xf9b87a3b,0x1e952578,0xd8590986,
  212229. 0xf37a2bc8,0x80668eed },
  212230. { 0xb39a0249,0xe2edcd35,0xb2f8aeae,0xaf230cd4,0x7223df05,0x295b15e4,
  212231. 0xe0e937f4,0xbb66982a,0x8cbc9162,0x019d2b72,0xcf49dca1,0x5c512ae9,
  212232. 0x630f07b4,0x11b491a7,0xa03874e9,0x48d4f34c,0x44cb7433,0xc1fd0ea6,
  212233. 0xf95b30c3,0x13f79ae1,0xed8b60ac,0x40362d4d,0x61ead81c,0x9e8314ff,
  212234. 0x498c3d28,0xed600dd4,0xc2521702,0x5fcb1c19,0x3a9c1f33,0x592329fc,
  212235. 0x1bde6ce9,0x04677548 } },
  212236. /* 228 */
  212237. { { 0x39233c96,0xee3de56e,0x80737eaf,0x868c409c,0x201abc68,0xacae11bd,
  212238. 0x2b486205,0x0f2cea9b,0x6f19056c,0xe32387e1,0xa5dc2a41,0xea75365a,
  212239. 0x12b4be86,0x76c29acc,0x8d63294d,0xa01fcab7,0x0cab9f24,0x81dbe88b,
  212240. 0xf414c054,0x76646e5b,0xcb96b7aa,0xfe111893,0x7664e097,0xb649f5b1,
  212241. 0x53fcf5a9,0xa196422e,0x0b7ff634,0x5978c9bd,0x3c229895,0xb5feb38e,
  212242. 0x0833c456,0x038a49fb },
  212243. { 0x13e93257,0x35e3818c,0xa612741b,0x14cebc9d,0x7caac06b,0x4f6e9249,
  212244. 0x3daa1116,0x82278e33,0x4de2034a,0xe7cc565e,0x0a1ba630,0xbb7dc95f,
  212245. 0x66956fbd,0x81dd9f23,0xbb132dd6,0xc63e6319,0xfc241337,0x6e22b022,
  212246. 0x7e8beb1c,0x23848193,0xd8c938ac,0x83b1994d,0xa6bb5644,0xb54cfaca,
  212247. 0x06f91807,0x1a7cd44e,0xa8f8d9f3,0x1dd439bb,0x7f74a8e6,0x660c2a78,
  212248. 0x121b5660,0x4bb76e22 } },
  212249. /* 229 */
  212250. { { 0xe6354817,0x7a151e8a,0xf038b438,0x33d494ea,0x85958986,0x4c86c688,
  212251. 0x1dcbac12,0x72153827,0xc0edad06,0xf487af8c,0xe500e5d6,0xad33051f,
  212252. 0xd6e47f55,0x0a711b1b,0x8c746ad5,0xa68709a7,0x6402f35e,0x27f17262,
  212253. 0xfb30c130,0xc6d08efa,0xc06c7497,0x9ef1c041,0xdcc3e2da,0xd0c74ece,
  212254. 0x092e1073,0x30c5f96e,0x2aa12b74,0x0f1393cf,0x2107eb02,0x24584016,
  212255. 0x7b76f98b,0x8843d25f },
  212256. { 0xedb2a83e,0x4e1501dc,0x2bb8d724,0xbcfe8fb0,0xd925df62,0x09020659,
  212257. 0x42ab6fc3,0x3c715dcf,0xa0f09dfd,0x73c05055,0xe3590aea,0x126745d8,
  212258. 0x76ff749e,0x5382f4d8,0xa920c663,0xfc69feef,0x9fd711ca,0xde160211,
  212259. 0x9075c4d5,0x4219c3bd,0x3ded6bf2,0x3800cbd1,0x6263a116,0x8c7ea0eb,
  212260. 0x7d264c37,0x35bd7958,0x7159c98c,0x56e22e45,0xfa7373b5,0x71bf2a2d,
  212261. 0x8935c949,0x0503f939 } },
  212262. /* 230 */
  212263. { { 0x71dad4f6,0x65addc66,0x024bea1b,0x238e4889,0xf605d3dd,0xfb76c8e2,
  212264. 0xb0d96b89,0x13d5f5de,0x6601b2cb,0xe0b5ba35,0x83e3d254,0xe37d491d,
  212265. 0x240c8ea7,0xe8860423,0xe91c99ba,0x374182f3,0xa87ad919,0x26c2caf9,
  212266. 0xf574f295,0x4b13040a,0x944000a3,0x5b9bced1,0x06df42e7,0x4ccc57be,
  212267. 0x4bd1089d,0x22e8ec50,0xdddbb500,0x0c53177a,0x9ecfeadb,0x690d31d2,
  212268. 0x176668f9,0x735778fe },
  212269. { 0x843c1137,0x0f86ee3e,0x3f0b73cd,0x3c1c42fa,0x8ab20e3a,0x0e75679d,
  212270. 0x16242fae,0x6f95f1f4,0x39b092e4,0x7b88e11c,0x4c236ac0,0x1629403e,
  212271. 0x2dac02e6,0x66105f41,0x862e0632,0x74dc28a7,0xf3b23c8d,0x2118ffb2,
  212272. 0x0745ffbf,0x1182417c,0x4c05711e,0x49b55a04,0xcefbe4de,0x2c665b74,
  212273. 0x97bf7107,0x1cc4c01d,0xc54f0676,0xb2ca06da,0x7450d0f8,0xfc599daa,
  212274. 0x1a3182a1,0x52e637a6 } },
  212275. /* 231 */
  212276. { { 0x6bebc6db,0x481700f1,0xf9503d92,0x4a6b45db,0x5d153919,0xc715cd3c,
  212277. 0xe5ad2abc,0x942a1c05,0xab7b466f,0x36a82433,0xba13918b,0xba413bed,
  212278. 0x90f4e6ce,0x698a5624,0xf3f1f3ca,0xbb720da6,0x63471ab3,0x2116d41d,
  212279. 0x303d3609,0xe00d2227,0x463ba69e,0x7fd4cc00,0x62845fd1,0xac609e4d,
  212280. 0x80adc9c7,0x63603b2c,0x45fafbca,0xbf16fc9a,0xc4bc94ab,0x41007f7f,
  212281. 0xa74b1698,0x7c916b4f },
  212282. { 0x78bac2d4,0xc1026f91,0x2601a875,0x8a2e8098,0x0073d640,0xad2f276e,
  212283. 0xfcc1fb88,0x443610c4,0xca6b291f,0x5727b822,0x88ec60fc,0x0645532c,
  212284. 0xed9ad48b,0x51e48899,0xf543f103,0x841b48b5,0xd591ceeb,0xa6ccb1be,
  212285. 0x9dcf5a8b,0xfc4adf0f,0xb347ddb4,0x3a7ca020,0xcb44c521,0xaa1accc2,
  212286. 0x0527c0c4,0x773b6828,0x7023cf50,0xaa374c10,0x6b74c926,0x733d1000,
  212287. 0x77a8d07c,0x1ff3916f } },
  212288. /* 232 */
  212289. { { 0xf997939d,0xaa218fe4,0x791583b3,0x3d4dfbbb,0x87f7560b,0xb3a7b5da,
  212290. 0x5da92c98,0xa9c02801,0x46666f4a,0xe1eb4aad,0x14ce9dd7,0x2eb17a51,
  212291. 0xef8f3076,0xf46a66a4,0x810e546e,0x900b45c6,0x4baf04dd,0xf7af2258,
  212292. 0x5c84d42f,0x3cc1c872,0x8e4c83de,0x3093f225,0x170d88b2,0x62fade41,
  212293. 0xac076e44,0xe19612e4,0x32dd141b,0xf48d7346,0x925e34da,0xc1b1f759,
  212294. 0x072b90c9,0x19ed1a56 },
  212295. { 0x6c735473,0x9cf7fcde,0x6003bc3e,0xaab88e67,0xfb199bb8,0x12187cbc,
  212296. 0x9accccbd,0xbb730441,0xb0f65459,0x214aff3c,0x6f926282,0x6aec81a3,
  212297. 0x9f9d20b8,0xaa82cb32,0x5773cc90,0x82f3f90f,0xf62257e1,0x4af60e6b,
  212298. 0xbd4762df,0xf18b44bf,0xdb970753,0x3948b129,0x7c22c18e,0xc6e920e9,
  212299. 0x57be97ad,0x393d6208,0x46b637f9,0xe8d7382c,0xf1fed1d5,0xf6625ccb,
  212300. 0x68681599,0x6f31e0f9 } },
  212301. /* 233 */
  212302. { { 0x82b8f204,0xc45afe55,0xd358b54a,0xac0441b6,0xacd5f5ed,0x7213e7bf,
  212303. 0x139bcd93,0x1914c70b,0x96dbcbb0,0x714b4581,0x1ed35d21,0xe9297d35,
  212304. 0x6a3e1f20,0x8f640837,0x2f3cd705,0x150a8a9d,0xdcdd9f6d,0xfb36e801,
  212305. 0x5cf56d82,0x5a54eb65,0x92aa5a21,0x7610500c,0x3b089f03,0xd10d0ae2,
  212306. 0xc42b66e8,0x491b2079,0x0eee8d48,0x4af1ae3d,0x41556f45,0x137e4c28,
  212307. 0x63d8a7e6,0x875e3308 },
  212308. { 0xaf6c0acc,0xdc80fddc,0xbb1e7c08,0xd5ad1e66,0x828585ad,0xdc717ae1,
  212309. 0x275c7da6,0xbdc54340,0xd26b9e15,0xf4b4c852,0x6a05fa50,0x5f0a1fbf,
  212310. 0x817bcb32,0xc6f81e47,0x70ff2e1d,0x2cbd4328,0x67c7f7fc,0x8a249016,
  212311. 0xb585a6c4,0xd045acb7,0x4666c057,0x2e972ad4,0xe6d7d63d,0xc74d87cf,
  212312. 0x0e274144,0xf7067d87,0x8b2584ae,0xb2ca157a,0x75f0fdeb,0x495c5bfb,
  212313. 0xf386e009,0x5abb0581 } },
  212314. /* 234 */
  212315. { { 0xf0c97f57,0x8be62d2b,0x962f28c7,0x0fe04871,0x47b50abb,0xc548a467,
  212316. 0x44fa09ed,0xf6b26e03,0xab05a96e,0xfd44c6e3,0x70e6ae82,0xedb0032c,
  212317. 0xd7e4899d,0x28bd402b,0x9b7c11c2,0x43f2e963,0xce913716,0x0ec3fc0e,
  212318. 0x02fd0f8c,0x769b8bc9,0x7cabc3ac,0x9d9cb3aa,0x06924cc9,0xe88a8892,
  212319. 0x42609014,0xa51461aa,0x962e79e0,0xc7f4aa8b,0x8b1b3e80,0x4ef0210a,
  212320. 0x1bfee4bc,0x70544680 },
  212321. { 0x121901c1,0xfab3d713,0xfead54aa,0xe90a2627,0xbc08ba23,0x64f6d285,
  212322. 0x36ec227e,0x8d993015,0x06c191ab,0x99a16ab9,0xf649ce2c,0x86b1cf5b,
  212323. 0x66be3a80,0x59206759,0xccba2cf0,0x18836279,0xeff53486,0x2c157b87,
  212324. 0x4b223af2,0xbfac9896,0x0aae7a57,0xcd0fd4f0,0x63218a80,0xdaddb940,
  212325. 0xdf88f14e,0x3844bb79,0xb71ed9fd,0xc1b3e3d4,0xd6205036,0x6c634a13,
  212326. 0xb8680a6b,0x6f56aecf } },
  212327. /* 235 */
  212328. { { 0xd9205c5d,0xb01dc803,0x67123929,0x68955f7d,0x9d9b6565,0x3debbffd,
  212329. 0xd3b1acfe,0xb844395e,0x6094eeff,0x04328b21,0x22991feb,0x6631ffa8,
  212330. 0x190dd075,0x0dde66e6,0xe8577c05,0x75b03c55,0x91722407,0x6c91ce5f,
  212331. 0x8ebb3a3f,0x9a288a40,0x058a1396,0x1d376f8a,0x9a6e0676,0xf3a59457,
  212332. 0x7b71d288,0x103029c5,0xb44c30c0,0x0843f428,0x730e0b9c,0xd8e6aff8,
  212333. 0x4ed644ad,0x7b6be811 },
  212334. { 0x3d3aa54e,0x3ec38e4a,0xd83d509a,0x10233943,0x243955e2,0xf84aa621,
  212335. 0xf51d3d44,0x29104717,0x7eca4e37,0x62d2442c,0x85fa55de,0x8c5a523d,
  212336. 0x851da1b5,0xc6f5ccda,0x20001468,0x044bcaa8,0xe01702e0,0xf7501e68,
  212337. 0xe6a0acec,0xf0819359,0xac0ef0b2,0x33dda6ad,0xfd964f01,0x97aeedc8,
  212338. 0x530b90d8,0x48dacd0e,0xb84122eb,0x4c5fad6f,0xd700a1de,0x2284ec1e,
  212339. 0xdbca5474,0x86f9a835 } },
  212340. /* 236 */
  212341. { { 0x450cc69f,0x0e1d9055,0xc9edf98f,0x50eb14bc,0xee7eba01,0x1bb94e77,
  212342. 0x998f8e53,0x5f7a6737,0x1b16eef0,0x588384e3,0xd85c5e15,0xbb928723,
  212343. 0xcbd952aa,0xfe51e345,0x7e241674,0xc5d0ee28,0x100182f0,0xfdc146ef,
  212344. 0xe7f5be2c,0x0f739e92,0xb656bd3e,0x501ab3af,0x5168e289,0xb1552dde,
  212345. 0xb8ee104a,0x940dfe31,0xc4304475,0x42923603,0xc460a913,0x9306f114,
  212346. 0x03b51f86,0x5bfa9faf },
  212347. { 0x107b258e,0x2a23f52c,0xd66341dc,0x989e82bb,0x823cff1a,0x54a3ced8,
  212348. 0x719b491f,0xf45b7794,0x2433dfb8,0x898c2218,0xc49250ee,0x0f9dd91c,
  212349. 0x4fa17655,0x50c2a2ae,0x2c327f45,0xf7aa1ce4,0x583b1e41,0x13a15ad6,
  212350. 0xa1bfad9e,0x9aa0d5a5,0x8e1fbdcd,0x9b1caa28,0x915f7f87,0xaf9283b6,
  212351. 0x87e81a1e,0xc10e4e0c,0x1080d296,0x04fdca56,0x12755bd8,0x6acc9616,
  212352. 0x828feeda,0x1b1266aa } },
  212353. /* 237 */
  212354. { { 0x774ee49c,0x4ebc0a00,0xcb6237d7,0x776f6852,0x5df938a3,0xfc0544ac,
  212355. 0xb6fbfbbd,0xc3388ec8,0x745f2eae,0x84ac8bcd,0xb1ece937,0xa9c56609,
  212356. 0x7de8fa13,0x656fb6ac,0xa532b871,0x5f8ded74,0xaa889f09,0xab0d428b,
  212357. 0x10b7aec2,0x43b27f28,0xfeecb34c,0x26426e1e,0x9e89c2db,0x44431b6b,
  212358. 0x39211090,0xaac4bc5d,0x4fd81058,0x926f7368,0x471ef60e,0x452fa691,
  212359. 0x218d7a23,0x33517fdb },
  212360. { 0x593c4a36,0xa9c33f46,0x36b1a9ee,0xac69d718,0x4277beec,0x55a20c1d,
  212361. 0x7e4f179c,0x3e8ca24e,0xd46d88a2,0x57373369,0x730702f8,0x71ceb1cc,
  212362. 0x35eed574,0x8b184d97,0x0704cec2,0x7f4517a2,0xd7062a53,0x7f129d18,
  212363. 0xb1d77e1c,0x07a4571b,0x8350d8b2,0x774ac309,0x61fab8ef,0x27b2919f,
  212364. 0xb5dd801b,0xa7c4cc13,0x1434591f,0xe7e6255b,0x5a3592b3,0x349937b8,
  212365. 0x30c77549,0x31fac63d } },
  212366. /* 238 */
  212367. { { 0x04913fb6,0x2ee8cf1b,0x1769a6b3,0x7e401350,0x783e61f0,0x790ebb71,
  212368. 0xe27f2ffe,0x1e5107f9,0xedaf89bf,0x124ba67f,0xe58de68d,0x189200e1,
  212369. 0x6df5abee,0x962732a3,0xacbeb4aa,0x72cc37cf,0xe93c5a76,0xb0c5fa96,
  212370. 0xde63393b,0x4c2a317c,0x830b2d6c,0x97f65e67,0x1be5b96a,0x4afc3504,
  212371. 0x730ce66d,0x0bf40a60,0x9340d84f,0x96a1ba79,0x07626b08,0x3ee18254,
  212372. 0x7ab0cbf5,0x01db35db },
  212373. { 0xac0efee2,0x6e0fbc2d,0xd71dbb45,0x8406ebcd,0x19b69abe,0xe72bde3e,
  212374. 0x37e01822,0x49cb7e61,0x11458b4c,0xcbb8c01c,0x687c5d63,0x420b4847,
  212375. 0x454c6776,0x1847dfa1,0xd1839d18,0xbede911d,0x278df046,0x1b9dc9c9,
  212376. 0x881a336c,0x294bd62b,0x93e77adc,0x7f096879,0x43ce3ba7,0x7ac90665,
  212377. 0x7764eefc,0x148695fd,0x9ac465cf,0xe0c20f0b,0xa6e2cdb1,0x636e8d28,
  212378. 0xd755341d,0x7b6ba98c } },
  212379. /* 239 */
  212380. { { 0xc1881ab4,0xcb1d9e03,0xb3168c88,0x19c25d55,0x282364ce,0xa82d3d47,
  212381. 0xf161aa24,0x95994390,0xe1ebb2c9,0x7838bc00,0xbdec7a75,0x8fd5dfcc,
  212382. 0x4ff7220a,0x4dd203c2,0x0efeff48,0x5ec173b3,0x16428b35,0x99f1d2b3,
  212383. 0x056e813f,0xc06bd9e5,0xc0b319f1,0x929172ba,0xfd223b15,0x6ae0e384,
  212384. 0x98d091ed,0xbd01059e,0xa654648e,0x6b3168e4,0x3375e798,0x2211447f,
  212385. 0x71eb4508,0x47e81019 },
  212386. { 0xbc8c290d,0x7045d45a,0x810fb33a,0xa33d1355,0x46fbbf2f,0x2baf0092,
  212387. 0x385c7cd9,0xacff3f1b,0xe161985c,0xc5b150ec,0x2a888748,0xc6ee0a7f,
  212388. 0x5e88dcc8,0x9d888c8e,0xccb86443,0x4dd735f2,0x3c40f6f2,0xcc1e13b7,
  212389. 0xf3fed691,0xfc3a25ff,0x257ee5c7,0x4cb43b17,0xf32db135,0xaa654f93,
  212390. 0x02dff2d3,0x44f58d0a,0xa8ca6394,0x78e3f188,0xf3e86697,0x39646cce,
  212391. 0xe0dce87b,0x785b1902 } },
  212392. /* 240 */
  212393. { { 0xa92f9a20,0xfcce2361,0x9d64540e,0xb7bdca87,0x1d00d7c5,0xd4739a85,
  212394. 0x2e97c926,0x067ac8dc,0x78da6a8b,0x2aea3ffe,0x63c51b69,0x6828bf54,
  212395. 0x7155141a,0x76f1c479,0x3977d810,0xf4bcbef6,0x541bce7a,0x75bc4949,
  212396. 0xd17041a5,0xe01f4066,0x87755eaf,0xd282d5bd,0x59e7ae80,0x6e2107dd,
  212397. 0x382ab36f,0xaa56e166,0xb9d1d634,0x65ee8ef6,0xce4ed844,0x99a2160a,
  212398. 0xb7712c27,0x6557c367 },
  212399. { 0xd75b6e52,0x561b0268,0x118d0e89,0xb0813640,0x6a2eb1ae,0xcff53330,
  212400. 0x6d090894,0x4e462226,0xb5fc1d48,0xbb351227,0x57a3062d,0x9365ea07,
  212401. 0xd66e2dc5,0x4caca37b,0xb9095887,0x220d7d23,0x8c4473bf,0x9c0fd393,
  212402. 0x6787da4f,0xadff370a,0xd057f4b8,0xef0aebcc,0x1173f33a,0x205e744c,
  212403. 0x925a26b4,0xb8d1f0a5,0x722fbbfd,0xa9364f49,0x8227d284,0xc891ae77,
  212404. 0xa0e08ab4,0x15c40d04 } },
  212405. /* 241 */
  212406. { { 0x2a0e18d1,0x9baf169a,0x4c0327c2,0x9971c017,0x7bc262ce,0xd81a323f,
  212407. 0x818ff379,0x2099db8d,0x4cd3c330,0x663f663d,0x011a0553,0xef5325c3,
  212408. 0xf980a470,0x9cd70bdc,0x1c9ed070,0xe64452d1,0xac676e13,0xafbf43f4,
  212409. 0xae85c2a5,0x97bec0a6,0x470490c4,0x2faae550,0x491e6ba9,0x0ab97a87,
  212410. 0xaafa9914,0x4055f537,0x36726557,0xfc95adbb,0xd119d6bf,0x646343b9,
  212411. 0x9d341e37,0x788e94a0 },
  212412. { 0x9c53461a,0x053a6fe5,0x08e3b6ed,0x75ec897e,0x0768d939,0xa8f5d2f3,
  212413. 0xcc213d4f,0x9bd6bff6,0x05b0147c,0x590c7b41,0x7c7b8169,0x20a3628b,
  212414. 0x5bce78e9,0xc66a086e,0x4dec1d8f,0x3dd4d282,0xc19dcce9,0x890acf44,
  212415. 0xd8435a7e,0x6632d875,0xea6381b2,0x590167c1,0xf0dcc128,0xb2259797,
  212416. 0x46f8d463,0x91a612b4,0xc15efa39,0x42185d78,0x119f6788,0xdf55ec37,
  212417. 0x780dea93,0x91b19cc6 } },
  212418. /* 242 */
  212419. { { 0xcb5d8b80,0xebf2709d,0xfc35660e,0x03b96182,0x055ef969,0xb873d991,
  212420. 0xe47c4342,0xd1ea4b4d,0xd54f8867,0xcc4b9244,0xfd8d77ef,0x93b1a2ca,
  212421. 0xe8c1f563,0x068d24e7,0x49973056,0x5f5fabb6,0x0542374f,0x83248c50,
  212422. 0x3f38e913,0xc36de2b5,0x7bb680be,0xed07e8eb,0xd8f313b5,0x964813d7,
  212423. 0xafd2d392,0x7bb6a069,0x0848a31a,0xc06d848e,0xe4f0c325,0x6867fb2f,
  212424. 0x067343af,0x3c2ba834 },
  212425. { 0x9d3ad63b,0xab62d775,0x59e0eb1f,0x3f9cab97,0x3885e117,0x70332a63,
  212426. 0xe20b2f9e,0xf22cafce,0x49eca947,0xb529ba7e,0x6228d88d,0x24954216,
  212427. 0x39239561,0x80ea23ec,0xd4370644,0x1b8907e7,0x563e4e44,0x4b7fa455,
  212428. 0xb2a4b0fa,0xcca9829e,0x48060792,0xd0a720a4,0x246991ce,0x8ccdda0c,
  212429. 0x348d086b,0x37a2325b,0xf60aee13,0x566ed509,0x147f253f,0x3d30e091,
  212430. 0xc1073bd8,0x1fa627a5 } },
  212431. /* 243 */
  212432. { { 0x42478fd4,0xa11222a2,0x670b2000,0xacf4c6f1,0x8359c6de,0xf71bb04f,
  212433. 0x7b93cdbc,0x618e2829,0x230db60b,0x96e1bae3,0x965b3b29,0xf17fd3b4,
  212434. 0xbc7055dd,0xa58639c6,0x4b817d7f,0xc3ea92ed,0xd23b08a4,0x9082b2a6,
  212435. 0xdc17010e,0x8471228a,0x20e89d97,0x753b9e46,0x03ff77c9,0xcf7e4f97,
  212436. 0x2bbe60e5,0x6c3f8245,0xb80e017d,0x9e432cbc,0xc0a45edb,0x150a5acd,
  212437. 0x4798743e,0x67b8bd05 },
  212438. { 0xf4797cf7,0xe66079b4,0xd03fde02,0xe31c998a,0x54caaef1,0x5aa3763a,
  212439. 0xf7649711,0x64d9a1fe,0xaf29b1a7,0x7ce0dc73,0xfb66ca93,0x6661b083,
  212440. 0x32fb6a78,0xbf4d74fe,0xdf00a561,0x25f6ef09,0x831d1159,0x2bc4383f,
  212441. 0x536bde37,0x6d5cc10c,0x882cc65b,0xd4945f9f,0x451a99b8,0x81f48f13,
  212442. 0x6bac11a4,0x140161cd,0xf18a4a0a,0x9d94d4ed,0xa467a824,0x65363165,
  212443. 0xa4c9aedf,0x74297aa9 } },
  212444. /* 244 */
  212445. { { 0xe21124ba,0xc49758a4,0xa87ffbd2,0x99bd8198,0x3d6638a8,0x45fbcdd1,
  212446. 0x15f7bf76,0x94645ff8,0xc4e6d57e,0x5fa6736f,0x92e61db9,0x1eae6475,
  212447. 0xcbdf944a,0x79575c0c,0x25b31d74,0xa3d13047,0x4cab5ae6,0x7881df22,
  212448. 0x1a2887f2,0x8dbfd299,0xa26ac459,0x23d07590,0xd8661d4a,0x2e589852,
  212449. 0x8a0140f7,0x37b5c13b,0x3fb3782a,0x0f94199e,0x1bc14e90,0x722aa059,
  212450. 0xd55bbb12,0x89aab7ba },
  212451. { 0xd656bdc7,0x8b345a96,0xe176cd3b,0x43bdc8af,0x32d64c43,0xd69518b6,
  212452. 0x79b82b41,0xfcf364a7,0xffb0cf82,0x907b344e,0x5101287b,0xf3d0c83c,
  212453. 0x34cd90ef,0xe9f26a59,0x07082b5c,0xe5f5aaf2,0xece7c165,0x4eb72c75,
  212454. 0xbe986cd6,0xe9590a81,0xff1536aa,0xfeef498f,0xa8263d5e,0x04560243,
  212455. 0x54ae872b,0x940be14f,0xe3207686,0xbee7bcc9,0xc1bc4d7a,0xd496a27d,
  212456. 0x5940ab46,0x002dc297 } },
  212457. /* 245 */
  212458. { { 0xb69d60c3,0xee533937,0xfe972755,0x260be552,0xc0c725a6,0xb11fb78d,
  212459. 0xcab2e7c2,0x6982c27e,0xee2322cb,0x4bceedd9,0x122704f7,0x952b19ed,
  212460. 0x854a6165,0x2df4c285,0x7b192485,0xba40b5bf,0x0119f52a,0xfcbca950,
  212461. 0xe5add86f,0x7467d1cb,0xd9d0f2c1,0x9bf536fb,0xb8d4ebc9,0x3c296e34,
  212462. 0x05a81317,0x0495f8f4,0x73335f76,0x8c59e8d6,0xe0542122,0x0b53d324,
  212463. 0x3c3bda73,0x4d564535 },
  212464. { 0x7e5c0877,0x7322f800,0x0ca9a764,0x481b43e6,0xa2c12716,0x231f4f4b,
  212465. 0xed3136c2,0x09596857,0x38db30de,0xae826322,0x99908ebc,0x652fad40,
  212466. 0xaf0d231e,0x0b8d1814,0x09cbc349,0x2680c54b,0x4bf3bf8e,0xfd4562f3,
  212467. 0x092b595f,0x2985090b,0x5e15fc34,0xe6f39ca4,0xbc378168,0x70175191,
  212468. 0x845a4a87,0x906944b3,0x82a1541a,0xacc6d74a,0xb155c8b4,0xadc9bab3,
  212469. 0x77306c62,0x1f2f89ce } },
  212470. /* 246 */
  212471. { { 0x9affefdf,0x8253ef41,0x4cf9256b,0x05d7ece5,0xb444e483,0x377002f2,
  212472. 0xcba5471f,0xb189755f,0xd5cbe015,0xc88483cb,0x6a0b8429,0x254f7c69,
  212473. 0x61f3f61d,0x18850bd4,0x0a247157,0x7ba21089,0xd92eeb0d,0x35abbc2e,
  212474. 0x965dec89,0xfb56cabe,0xbc55684a,0x9da23724,0x6a7a7492,0xd8ba396f,
  212475. 0x2ef4ba46,0xfcb90db7,0x9909b27a,0xdd234fe0,0x76f4366e,0xbdf3c164,
  212476. 0x17e50d47,0x09c8097f },
  212477. { 0x60050c07,0x6a04b140,0x43a8e37e,0xc29e8318,0xbb55e41f,0xcb9429b2,
  212478. 0x2ce60e3a,0xed2fea5a,0xdb9d82f4,0xdc7b1ff3,0x687d37fa,0x48ebecc3,
  212479. 0xecb07539,0x79153e32,0x57075692,0x6a60054f,0x800759ba,0x3871cd0c,
  212480. 0x30922df1,0x17a7386f,0x83357b7c,0x4e9fc59e,0x39415186,0x1d26b3a9,
  212481. 0xd34db889,0x912a0222,0x59fcdb71,0x6672fcf4,0x44ff3036,0x5a3f268d,
  212482. 0x6911e16c,0x6f113ed3 } },
  212483. /* 247 */
  212484. { { 0x1836f1c9,0x52a9df59,0x4232307d,0xfa6519f5,0x5ded285a,0x8406c701,
  212485. 0xaf627f75,0x0a1545ca,0xace0417d,0xae1111ee,0xa6113443,0xfb28bdf6,
  212486. 0x52dbcbcb,0xde9ef0ab,0x7813e658,0xe9dc181b,0x99127225,0x0b1dabdb,
  212487. 0x22814c59,0x5f0598e3,0xd934ee7e,0x5c3b966e,0xb99ba4bf,0x4eb84eda,
  212488. 0x3c1b55e7,0xb2919a34,0x94aa860f,0xa9addb49,0xf6811ff6,0x1b7220df,
  212489. 0xd1a183e2,0x6636a23b },
  212490. { 0x20587283,0xdf5d5a2d,0xef07fc5d,0x0b3822c9,0x0ef6de38,0x1786bd55,
  212491. 0x25d1671d,0x163cf907,0x1cdb1def,0x74bf971f,0x0842fc4a,0x5749e830,
  212492. 0x27f854f7,0x0e2edbc7,0xbce24acb,0xbb27bbda,0x05bed08d,0xc1b19cec,
  212493. 0xf7c904bc,0xaada123e,0xd89982db,0x02429f1b,0x65f6e632,0x49d3616e,
  212494. 0xee59fd32,0xa3789fa8,0xfe9f29f5,0x160ba3ba,0xaf5378a0,0x0f2d3b61,
  212495. 0x73c2a6f8,0x7aeecc76 } },
  212496. /* 248 */
  212497. { { 0xdc43b0db,0xf3a4757c,0x98119cad,0x3d8a4e85,0x4616c156,0xf8095bf6,
  212498. 0x4f533e97,0x3e2a07bc,0x39cfc5ad,0xa9824367,0xcd68052c,0x18a6ba3a,
  212499. 0x8a1cec66,0xbd60e590,0x02b1b695,0xae3841a5,0x190a195b,0x986dff12,
  212500. 0xad31fd9b,0x2df2beac,0xcc728f7b,0x7d893224,0x0cf0a992,0xc38ea738,
  212501. 0x586a44ea,0xa8439a80,0x1615f03c,0xede7f7f0,0x27a1f885,0x48249908,
  212502. 0xb78a7645,0x28ec4006 },
  212503. { 0xa2fe0009,0xe1820c2e,0xf13874e9,0xe11ba5d2,0xc524db52,0x97522454,
  212504. 0x7fede529,0x4d477426,0x9b2500d4,0x01d3419a,0x1869244b,0xce08a492,
  212505. 0xdd1be1b9,0xba169023,0x32a301e0,0x242c3e54,0x70906788,0x9b56f7ba,
  212506. 0xc74a8cc4,0xf0ad2a09,0xd76f9439,0x99cd1841,0x621fb60e,0xeddafe0b,
  212507. 0xbc397634,0x056bee54,0xff7f0a84,0x4653f860,0x2011c0af,0x6bd4876f,
  212508. 0x0c9525c3,0x134f4cc7 } },
  212509. /* 249 */
  212510. { { 0xe938dff4,0x9621a3ec,0x486a79a3,0x7d101a7b,0xde950537,0xf2c4ef97,
  212511. 0xe65d87db,0xf3184099,0x373b8cfa,0xb89c7ffb,0xe842916e,0x68baa505,
  212512. 0x4ebea764,0xa790fd09,0xe592892b,0x679df6d4,0xfcfed741,0x2023331c,
  212513. 0x9880ff21,0x0bf4efd2,0xd0344501,0x7ca78ddd,0x342858c8,0x2cb09ecb,
  212514. 0x2575487a,0x9e5eb6dc,0xebcb0491,0x50675a15,0x7381d471,0x09d2e74f,
  212515. 0x83d3d6f4,0x6ea37829 },
  212516. { 0x4e5cc40a,0xc65c094b,0x1af37dfb,0x7a2e3f6a,0xf9026e44,0xef677e9d,
  212517. 0x93880f53,0xb7878c95,0x7f644aa9,0x4aa30b07,0x2f208c3c,0xa0c51683,
  212518. 0x658d663b,0x7c0277ae,0xae1d9130,0xef0b3c38,0x695c3ea4,0x302f37a7,
  212519. 0x6a0c5e0d,0xe004c1c5,0x20cbcf9f,0x9fd495c4,0x568a0e7c,0x706d5b9d,
  212520. 0x59286454,0x8b225dff,0x8d9a709c,0x527d4465,0x87c08d68,0x47c558da,
  212521. 0xbb4ef07d,0x606ee6e6 } },
  212522. /* 250 */
  212523. { { 0x57c621f6,0x02d99fc7,0x7fe83d48,0x292e40c1,0x9ef199b0,0x1bdfc7a1,
  212524. 0xe62c7666,0x78a04102,0xe6738753,0x16cda370,0x1e3a65af,0xbc81974d,
  212525. 0xf78fe209,0x19742048,0xbf5981c6,0xc83a058a,0x9c89702d,0xf26b2434,
  212526. 0x9d1a678a,0x988b2f1e,0xff29ae29,0x472bf9b0,0x1d7cf5ec,0xa143e398,
  212527. 0xb268ddd8,0x9c9d7e45,0x5fc4ff76,0x166cda55,0xa4aa7673,0x6044cdf0,
  212528. 0xe9148707,0x49dba6f7 },
  212529. { 0xa758e37a,0x20e47fb2,0x2d8eaf66,0xaf6b31d7,0x6f9c2210,0x352ad5f9,
  212530. 0x90efc32b,0x0093f727,0x41e4b264,0x435c99dc,0x05b15795,0xbfa878e0,
  212531. 0x0e673575,0x99c520a4,0x87eea759,0xca682594,0xf12a348b,0x029f7b81,
  212532. 0x2aa2ce35,0xa547cc18,0xead5e2c5,0xa11d874b,0x55682cdf,0x9af0349b,
  212533. 0x8bbe8e66,0xf86ebfea,0xf55394ab,0x3dab8782,0xebc8eb8f,0x458bf797,
  212534. 0x9b7de78c,0x4890a7a4 } },
  212535. /* 251 */
  212536. { { 0x8da995f6,0xd7299689,0xec6156ef,0xd39eaae7,0x356a82d5,0x6959040c,
  212537. 0xc135bcfe,0xb2046b21,0x0f595c78,0xea720b64,0xe7c5fb40,0x02824efa,
  212538. 0x0edb3bfc,0x97d8fd4c,0x79f24ebe,0x12f02905,0x187ea6b9,0x16fc47cf,
  212539. 0x789d5c23,0xc219fd27,0x89263ecc,0x233a6b6c,0x8b6d30a6,0x823634b2,
  212540. 0xc9b33680,0xca352e25,0x40c77456,0x9388d6ca,0x3c92065b,0xf8e55b0b,
  212541. 0x02439a76,0x5c17474b },
  212542. { 0x8aaccab5,0xd888e7c2,0xaaced05b,0x18027836,0xccec0f65,0x185b877d,
  212543. 0x125c2882,0x93cadc1c,0x67fdc54c,0x45df540a,0xc2788a33,0x4f3c86e2,
  212544. 0xe3a0fa2c,0x3e874469,0x273983cf,0xc59daa47,0x4a96d8a5,0x3063c48b,
  212545. 0xc2e58915,0xc38d2bcf,0x84e428c3,0x90e78b87,0xf0c4fd53,0x900a292c,
  212546. 0x941e6005,0xb7f92db7,0x6ca53a1c,0x95679241,0xb1ab0fa7,0x35f6f31d,
  212547. 0x7b58408c,0x5d675eb4 } },
  212548. /* 252 */
  212549. { { 0x870c6025,0xaeee1a77,0x91a2dfca,0xfc4a23b7,0x386b64c4,0x7b0e60c4,
  212550. 0xe5ae72b1,0xd5d5b17d,0x9eefa212,0x6dfc88ac,0xd4038b96,0x4feaefbe,
  212551. 0x8e2d2ecc,0x099ac356,0x012af207,0x548ea612,0x89c31218,0x4ffed9db,
  212552. 0xe0e67331,0x1c1e91c4,0xaf8300e0,0x009bb64f,0x6773c3be,0x8780501c,
  212553. 0xc08219fa,0xe0cd6ede,0xf81b06ff,0x7c055e07,0xe080b36f,0x82b63f9c,
  212554. 0x0a9feca3,0x02fccbaf },
  212555. { 0xb47cac61,0x9991d4d1,0xab86e12c,0x2e9d1687,0x2b94f042,0x8c6855ec,
  212556. 0x48e648e5,0xca400519,0xef89ac57,0x9ba91fb2,0x1be792cd,0x4f419206,
  212557. 0xbd0f1e15,0x82d221cb,0xfc444019,0x062eb13b,0x99790fdc,0xf3a97c32,
  212558. 0x6067a64b,0x4e796d94,0x6d23775a,0xc46dd300,0xed7f0f23,0x8672c4d5,
  212559. 0x3b4f63d7,0x821851dc,0xd26273f2,0x50a3ae0c,0xeac60f6f,0x800e58fc,
  212560. 0x13845545,0x56f1e456 } },
  212561. /* 253 */
  212562. { { 0x32c24f3b,0x01ccb3f6,0x06d817e6,0x99eb1c7f,0x6aa26776,0x8dc640bb,
  212563. 0x0845d5e0,0x7838affe,0xf81a79a8,0xf34fecb1,0x3e6819b0,0x6a2e282d,
  212564. 0x8237a4b8,0xc4b977ce,0x87636439,0x0f46b3db,0x97970497,0xa465f540,
  212565. 0x8791be43,0xd7e08762,0x34198ec6,0x00220b6c,0x093d94bb,0x57b38637,
  212566. 0x29d690b2,0x84012e16,0x20aad1a4,0x02ec9db5,0x85dc34e3,0xafee2fc6,
  212567. 0x25500cf8,0x911d1936 },
  212568. { 0xf5e5af5b,0x13b1bd58,0x7b6a22a7,0xa7ca263b,0xf3af2adc,0xab6bec4d,
  212569. 0xa04420bd,0x16651e59,0x4ba36c11,0x3b448b3b,0xff424310,0x3c62bfcd,
  212570. 0xf1a96cbb,0xde15c4a5,0xe4d1f980,0xbe0ad8a1,0x36673a3a,0x812bd14e,
  212571. 0x9212acdd,0x40303af6,0x576095ce,0x8f6dab9c,0x107f5ca5,0x7df1882a,
  212572. 0x8896a3b0,0xb903e63c,0xd863b3f0,0xf5048544,0xc09887de,0x5e5019b9,
  212573. 0xa0f53865,0x2be744fe } },
  212574. /* 254 */
  212575. { { 0x5b50f324,0x054cd05f,0x1ea3c7a2,0xb9b1eb24,0x7ff8e6b7,0x4a858a5c,
  212576. 0xec040882,0xd83902fe,0xd0cba9bd,0x72b26494,0xb29c9e1e,0xd0176f90,
  212577. 0xcebadb81,0x05d4eb02,0x372b8bfc,0x874405b1,0x79ead190,0x5c412881,
  212578. 0xec2b48cd,0xd44a3dd3,0x3f4d5033,0x84499a77,0x564c3a09,0xb37b38cd,
  212579. 0xf42e803b,0x80e99497,0xb8f518b2,0xc07b47a0,0x3568fde4,0xc710e3c5,
  212580. 0xcead0e7a,0x735f542f },
  212581. { 0x38380039,0xcaa9a171,0xf74d19c8,0xadfafe17,0xccbc1a8b,0x92d4393e,
  212582. 0xfe029705,0x3c5dbf39,0x930e9b36,0x4552b5ab,0x2afd494a,0x7ee63032,
  212583. 0x3f02ac43,0x826a9ad7,0x99356298,0x98c53562,0x7342bb39,0x0c869f87,
  212584. 0xe4f9b79a,0xd7510020,0xd34789a9,0x6361d1a4,0xcfa85637,0xf0ded5ba,
  212585. 0x88ac07e4,0x407ee73f,0x09ef1cbd,0xfac7d03f,0x4d475bad,0x25d697cb,
  212586. 0x14bd399e,0x1e984c9d } },
  212587. /* 255 */
  212588. { { 0x4850c817,0xc76d0561,0x3489812d,0xb08a5b19,0x5e58cbbe,0x7273d154,
  212589. 0x4be61e5a,0x8900b5fa,0xd7aeb8e1,0xaa088691,0xd35a3d4b,0xe66666af,
  212590. 0x57ec7d3d,0x38a2c199,0x668d6f5c,0xa0648e8f,0x7adc1746,0x1f9fc92c,
  212591. 0x843065c3,0x23a116c0,0x61e6ae69,0x36370a20,0x2aa47e73,0x626c3736,
  212592. 0xdeff6d84,0x540c25f2,0xcdbed2d4,0x9804824c,0x039a9492,0x4b5bfce0,
  212593. 0x76942e01,0x6c474a56 },
  212594. { 0x7d88e3a1,0x3aeb9a41,0xc484742a,0x105d3c88,0x3fe61131,0xe59de8d1,
  212595. 0x1a869e8b,0x148f5b6b,0xaa75d90a,0x7a8abc59,0x62146013,0x2f0c9bc7,
  212596. 0xc3824cd9,0x43faa747,0x6a5d0b92,0x81763a18,0x9bcbaebc,0xbbc341bc,
  212597. 0xf745d1dd,0xe1813160,0xb75ce5f4,0xa53ce52d,0xd50de4c2,0x15eae66c,
  212598. 0x75d7656d,0x5ed8996c,0xc4ca552a,0xe4ff5711,0x3c5305b4,0x215e985a,
  212599. 0xfa1ba2ce,0x6b258954 } },
  212600. };
  212601. /* Multiply the base point of P1024 by the scalar and return the result.
  212602. * If map is true then convert result to affine coordinates.
  212603. *
  212604. * Stripe implementation.
  212605. * Pre-generated: 2^0, 2^128, ...
  212606. * Pre-generated: products of all combinations of above.
  212607. * 8 doubles and adds (with qz=1)
  212608. *
  212609. * r Resulting point.
  212610. * k Scalar to multiply by.
  212611. * map Indicates whether to convert result to affine.
  212612. * ct Constant time required.
  212613. * heap Heap to use for allocation.
  212614. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  212615. */
  212616. static int sp_1024_ecc_mulmod_base_32(sp_point_1024* r, const sp_digit* k,
  212617. int map, int ct, void* heap)
  212618. {
  212619. return sp_1024_ecc_mulmod_stripe_32(r, &p1024_base, p1024_table,
  212620. k, map, ct, heap);
  212621. }
  212622. #endif
  212623. /* Multiply the base point of P1024 by the scalar and return the result.
  212624. * If map is true then convert result to affine coordinates.
  212625. *
  212626. * km Scalar to multiply by.
  212627. * r Resulting point.
  212628. * map Indicates whether to convert result to affine.
  212629. * heap Heap to use for allocation.
  212630. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  212631. */
  212632. int sp_ecc_mulmod_base_1024(const mp_int* km, ecc_point* r, int map, void* heap)
  212633. {
  212634. #ifdef WOLFSSL_SP_SMALL_STACK
  212635. sp_point_1024* point = NULL;
  212636. sp_digit* k = NULL;
  212637. #else
  212638. sp_point_1024 point[1];
  212639. sp_digit k[32];
  212640. #endif
  212641. int err = MP_OKAY;
  212642. #ifdef WOLFSSL_SP_SMALL_STACK
  212643. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  212644. DYNAMIC_TYPE_ECC);
  212645. if (point == NULL)
  212646. err = MEMORY_E;
  212647. if (err == MP_OKAY) {
  212648. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  212649. DYNAMIC_TYPE_ECC);
  212650. if (k == NULL)
  212651. err = MEMORY_E;
  212652. }
  212653. #endif
  212654. if (err == MP_OKAY) {
  212655. sp_1024_from_mp(k, 32, km);
  212656. err = sp_1024_ecc_mulmod_base_32(point, k, map, 1, heap);
  212657. }
  212658. if (err == MP_OKAY) {
  212659. err = sp_1024_point_to_ecc_point_32(point, r);
  212660. }
  212661. #ifdef WOLFSSL_SP_SMALL_STACK
  212662. if (k != NULL)
  212663. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  212664. if (point != NULL)
  212665. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  212666. #endif
  212667. return err;
  212668. }
  212669. /* Multiply the base point of P1024 by the scalar, add point a and return
  212670. * the result. If map is true then convert result to affine coordinates.
  212671. *
  212672. * km Scalar to multiply by.
  212673. * am Point to add to scalar multiply result.
  212674. * inMont Point to add is in montgomery form.
  212675. * r Resulting point.
  212676. * map Indicates whether to convert result to affine.
  212677. * heap Heap to use for allocation.
  212678. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  212679. */
  212680. int sp_ecc_mulmod_base_add_1024(const mp_int* km, const ecc_point* am,
  212681. int inMont, ecc_point* r, int map, void* heap)
  212682. {
  212683. #ifdef WOLFSSL_SP_SMALL_STACK
  212684. sp_point_1024* point = NULL;
  212685. sp_digit* k = NULL;
  212686. #else
  212687. sp_point_1024 point[2];
  212688. sp_digit k[32 + 32 * 2 * 37];
  212689. #endif
  212690. sp_point_1024* addP = NULL;
  212691. sp_digit* tmp = NULL;
  212692. int err = MP_OKAY;
  212693. #ifdef WOLFSSL_SP_SMALL_STACK
  212694. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  212695. DYNAMIC_TYPE_ECC);
  212696. if (point == NULL)
  212697. err = MEMORY_E;
  212698. if (err == MP_OKAY) {
  212699. k = (sp_digit*)XMALLOC(
  212700. sizeof(sp_digit) * (32 + 32 * 2 * 37),
  212701. heap, DYNAMIC_TYPE_ECC);
  212702. if (k == NULL)
  212703. err = MEMORY_E;
  212704. }
  212705. #endif
  212706. if (err == MP_OKAY) {
  212707. addP = point + 1;
  212708. tmp = k + 32;
  212709. sp_1024_from_mp(k, 32, km);
  212710. sp_1024_point_from_ecc_point_32(addP, am);
  212711. }
  212712. if ((err == MP_OKAY) && (!inMont)) {
  212713. err = sp_1024_mod_mul_norm_32(addP->x, addP->x, p1024_mod);
  212714. }
  212715. if ((err == MP_OKAY) && (!inMont)) {
  212716. err = sp_1024_mod_mul_norm_32(addP->y, addP->y, p1024_mod);
  212717. }
  212718. if ((err == MP_OKAY) && (!inMont)) {
  212719. err = sp_1024_mod_mul_norm_32(addP->z, addP->z, p1024_mod);
  212720. }
  212721. if (err == MP_OKAY) {
  212722. err = sp_1024_ecc_mulmod_base_32(point, k, 0, 0, heap);
  212723. }
  212724. if (err == MP_OKAY) {
  212725. sp_1024_proj_point_add_32(point, point, addP, tmp);
  212726. if (map) {
  212727. sp_1024_map_32(point, point, tmp);
  212728. }
  212729. err = sp_1024_point_to_ecc_point_32(point, r);
  212730. }
  212731. #ifdef WOLFSSL_SP_SMALL_STACK
  212732. if (k != NULL)
  212733. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  212734. if (point)
  212735. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  212736. #endif
  212737. return err;
  212738. }
  212739. #ifndef WOLFSSL_SP_SMALL
  212740. /* Generate a pre-computation table for the point.
  212741. *
  212742. * gm Point to generate table for.
  212743. * table Buffer to hold pre-computed points table.
  212744. * len Length of table.
  212745. * heap Heap to use for allocation.
  212746. * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
  212747. * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
  212748. */
  212749. int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
  212750. void* heap)
  212751. {
  212752. #ifdef WOLFSSL_SP_SMALL_STACK
  212753. sp_point_1024* point = NULL;
  212754. sp_digit* t = NULL;
  212755. #else
  212756. sp_point_1024 point[1];
  212757. sp_digit t[38 * 2 * 32];
  212758. #endif
  212759. int err = MP_OKAY;
  212760. if ((gm == NULL) || (len == NULL)) {
  212761. err = BAD_FUNC_ARG;
  212762. }
  212763. if ((err == MP_OKAY) && (table == NULL)) {
  212764. *len = sizeof(sp_table_entry_1024) * 256;
  212765. err = LENGTH_ONLY_E;
  212766. }
  212767. if ((err == MP_OKAY) && (*len < (int)(sizeof(sp_table_entry_1024) * 256))) {
  212768. err = BUFFER_E;
  212769. }
  212770. #ifdef WOLFSSL_SP_SMALL_STACK
  212771. if (err == MP_OKAY) {
  212772. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  212773. DYNAMIC_TYPE_ECC);
  212774. if (point == NULL)
  212775. err = MEMORY_E;
  212776. }
  212777. if (err == MP_OKAY) {
  212778. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 38 * 2 * 32, heap,
  212779. DYNAMIC_TYPE_ECC);
  212780. if (t == NULL)
  212781. err = MEMORY_E;
  212782. }
  212783. #endif
  212784. if (err == MP_OKAY) {
  212785. sp_1024_point_from_ecc_point_32(point, gm);
  212786. err = sp_1024_gen_stripe_table_32(point,
  212787. (sp_table_entry_1024*)table, t, heap);
  212788. }
  212789. if (err == 0) {
  212790. *len = sizeof(sp_table_entry_1024) * 256;
  212791. }
  212792. #ifdef WOLFSSL_SP_SMALL_STACK
  212793. if (t != NULL)
  212794. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  212795. if (point != NULL)
  212796. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  212797. #endif
  212798. return err;
  212799. }
  212800. #else
  212801. /* Generate a pre-computation table for the point.
  212802. *
  212803. * gm Point to generate table for.
  212804. * table Buffer to hold pre-computed points table.
  212805. * len Length of table.
  212806. * heap Heap to use for allocation.
  212807. * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
  212808. * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
  212809. */
  212810. int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
  212811. void* heap)
  212812. {
  212813. int err = 0;
  212814. if ((gm == NULL) || (len == NULL)) {
  212815. err = BAD_FUNC_ARG;
  212816. }
  212817. if ((err == 0) && (table == NULL)) {
  212818. *len = 0;
  212819. err = LENGTH_ONLY_E;
  212820. }
  212821. if ((err == 0) && (*len != 0)) {
  212822. err = BUFFER_E;
  212823. }
  212824. if (err == 0) {
  212825. *len = 0;
  212826. }
  212827. (void)heap;
  212828. return err;
  212829. }
  212830. #endif
  212831. /* Multiply the point by the scalar and return the result.
  212832. * If map is true then convert result to affine coordinates.
  212833. *
  212834. * km Scalar to multiply by.
  212835. * gm Point to multiply.
  212836. * table Pre-computed points.
  212837. * r Resulting point.
  212838. * map Indicates whether to convert result to affine.
  212839. * heap Heap to use for allocation.
  212840. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  212841. */
  212842. int sp_ecc_mulmod_table_1024(const mp_int* km, const ecc_point* gm, byte* table,
  212843. ecc_point* r, int map, void* heap)
  212844. {
  212845. #ifdef WOLFSSL_SP_SMALL_STACK
  212846. sp_point_1024* point = NULL;
  212847. sp_digit* k = NULL;
  212848. #else
  212849. sp_point_1024 point[1];
  212850. sp_digit k[32];
  212851. #endif
  212852. int err = MP_OKAY;
  212853. #ifdef WOLFSSL_SP_SMALL_STACK
  212854. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  212855. DYNAMIC_TYPE_ECC);
  212856. if (point == NULL) {
  212857. err = MEMORY_E;
  212858. }
  212859. if (err == MP_OKAY) {
  212860. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap, DYNAMIC_TYPE_ECC);
  212861. if (k == NULL)
  212862. err = MEMORY_E;
  212863. }
  212864. #endif
  212865. if (err == MP_OKAY) {
  212866. sp_1024_from_mp(k, 32, km);
  212867. sp_1024_point_from_ecc_point_32(point, gm);
  212868. #ifndef WOLFSSL_SP_SMALL
  212869. err = sp_1024_ecc_mulmod_stripe_32(point, point,
  212870. (const sp_table_entry_1024*)table, k, map, 0, heap);
  212871. #else
  212872. (void)table;
  212873. err = sp_1024_ecc_mulmod_32(point, point, k, map, 0, heap);
  212874. #endif
  212875. }
  212876. if (err == MP_OKAY) {
  212877. err = sp_1024_point_to_ecc_point_32(point, r);
  212878. }
  212879. #ifdef WOLFSSL_SP_SMALL_STACK
  212880. if (k != NULL)
  212881. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  212882. if (point != NULL)
  212883. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  212884. #endif
  212885. return err;
  212886. }
  212887. /* Multiply p* in projective coordinates by q*.
  212888. *
  212889. * r.x = p.x - (p.y * q.y)
  212890. * r.y = (p.x * q.y) + p.y
  212891. *
  212892. * px [in,out] A single precision integer - X ordinate of number to multiply.
  212893. * py [in,out] A single precision integer - Y ordinate of number to multiply.
  212894. * q [in] A single precision integer - multiplier.
  212895. * t [in] Two single precision integers - temps.
  212896. */
  212897. static void sp_1024_proj_mul_qx1_32(sp_digit* px, sp_digit* py,
  212898. const sp_digit* q, sp_digit* t)
  212899. {
  212900. sp_digit* t1 = t;
  212901. sp_digit* t2 = t + 2 * 32;
  212902. /* t1 = p.x * q.y */
  212903. sp_1024_mont_mul_32(t1, px, q, p1024_mod, p1024_mp_mod);
  212904. /* t2 = p.y * q.y */
  212905. sp_1024_mont_mul_32(t2, py, q, p1024_mod, p1024_mp_mod);
  212906. /* r.x = p.x - (p.y * q.y) */
  212907. sp_1024_mont_sub_32(px, px, t2, p1024_mod);
  212908. /* r.y = (p.x * q.y) + p.y */
  212909. sp_1024_mont_add_32(py, t1, py, p1024_mod);
  212910. }
  212911. /* Square p* in projective coordinates.
  212912. *
  212913. * px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2
  212914. * py' = 2 * p.x * p.y
  212915. *
  212916. * px [in,out] A single precision integer - X ordinate of number to square.
  212917. * py [in,out] A single precision integer - Y ordinate of number to square.
  212918. * t [in] Two single precision integers - temps.
  212919. */
  212920. static void sp_1024_proj_sqr_32(sp_digit* px, sp_digit* py, sp_digit* t)
  212921. {
  212922. sp_digit* t1 = t;
  212923. sp_digit* t2 = t + 2 * 32;
  212924. /* t1 = p.x + p.y */
  212925. sp_1024_mont_add_32(t1, px, py, p1024_mod);
  212926. /* t2 = p.x - p.y */
  212927. sp_1024_mont_sub_32(t2, px, py, p1024_mod);
  212928. /* r.y = p.x * p.y */
  212929. sp_1024_mont_mul_32(py, px, py, p1024_mod, p1024_mp_mod);
  212930. /* r.x = (p.x + p.y) * (p.x - p.y) */
  212931. sp_1024_mont_mul_32(px, t1, t2, p1024_mod, p1024_mp_mod);
  212932. /* r.y = (p.x * p.y) * 2 */
  212933. sp_1024_mont_dbl_32(py, py, p1024_mod);
  212934. }
  212935. #ifdef WOLFSSL_SP_SMALL
  212936. /* Perform the modular exponentiation in Fp* for SAKKE.
  212937. *
  212938. * Simple square and multiply when expontent bit is one algorithm.
  212939. * Square and multiply performed in Fp*.
  212940. *
  212941. * base [in] Base. MP integer.
  212942. * exp [in] Exponent. MP integer.
  212943. * res [out] Result. MP integer.
  212944. * returns 0 on success and MEMORY_E if memory allocation fails.
  212945. */
  212946. int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
  212947. {
  212948. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  212949. defined(WOLFSSL_SP_SMALL_STACK)
  212950. sp_digit* td;
  212951. sp_digit* t;
  212952. sp_digit* tx;
  212953. sp_digit* ty;
  212954. sp_digit* b;
  212955. sp_digit* e;
  212956. #else
  212957. sp_digit t[36 * 2 * 32];
  212958. sp_digit tx[2 * 32];
  212959. sp_digit ty[2 * 32];
  212960. sp_digit b[2 * 32];
  212961. sp_digit e[2 * 32];
  212962. #endif
  212963. sp_digit* r;
  212964. int err = MP_OKAY;
  212965. int bits;
  212966. int i;
  212967. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  212968. defined(WOLFSSL_SP_SMALL_STACK)
  212969. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 40 * 32 * 2, NULL,
  212970. DYNAMIC_TYPE_TMP_BUFFER);
  212971. if (td == NULL) {
  212972. err = MEMORY_E;
  212973. }
  212974. #endif
  212975. if (err == MP_OKAY) {
  212976. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  212977. defined(WOLFSSL_SP_SMALL_STACK)
  212978. t = td;
  212979. tx = td + 36 * 32 * 2;
  212980. ty = td + 37 * 32 * 2;
  212981. b = td + 38 * 32 * 2;
  212982. e = td + 39 * 32 * 2;
  212983. #endif
  212984. r = ty;
  212985. bits = mp_count_bits(exp);
  212986. sp_1024_from_mp(b, 32, base);
  212987. sp_1024_from_mp(e, 32, exp);
  212988. XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 32);
  212989. sp_1024_mul_32(b, b, p1024_norm_mod);
  212990. err = sp_1024_mod_32(b, b, p1024_mod);
  212991. }
  212992. if (err == MP_OKAY) {
  212993. XMEMCPY(ty, b, sizeof(sp_digit) * 32);
  212994. for (i = bits - 2; i >= 0; i--) {
  212995. sp_1024_proj_sqr_32(tx, ty, t);
  212996. if ((e[i / 32] >> (i % 32)) & 1) {
  212997. sp_1024_proj_mul_qx1_32(tx, ty, b, t);
  212998. }
  212999. }
  213000. }
  213001. if (err == MP_OKAY) {
  213002. sp_1024_mont_inv_32(tx, tx, t);
  213003. XMEMSET(tx + 32, 0, sizeof(sp_digit) * 32);
  213004. sp_1024_mont_reduce_32(tx, p1024_mod, p1024_mp_mod);
  213005. XMEMSET(ty + 32, 0, sizeof(sp_digit) * 32);
  213006. sp_1024_mont_reduce_32(ty, p1024_mod, p1024_mp_mod);
  213007. sp_1024_mul_32(r, tx, ty);
  213008. err = sp_1024_mod_32(r, r, p1024_mod);
  213009. }
  213010. if (err == MP_OKAY) {
  213011. err = sp_1024_to_mp(r, res);
  213012. }
  213013. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  213014. defined(WOLFSSL_SP_SMALL_STACK)
  213015. if (td != NULL) {
  213016. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  213017. }
  213018. #endif
  213019. return err;
  213020. }
  213021. #else
  213022. /* Pre-computed table for exponentiating g.
  213023. * Striping: 8 points at a distance of (128 combined for
  213024. * a total of 256 points.
  213025. */
  213026. static const sp_digit sp_1024_g_table[256][32] = {
  213027. { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  213028. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  213029. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  213030. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  213031. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  213032. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  213033. 0x00000000, 0x00000000 },
  213034. { 0x335c1685, 0x170a46d2, 0xe1007a58, 0xeac9e971, 0x43ca4a73,
  213035. 0x40e8f3df, 0x82642475, 0x2646f815, 0xb36576d1, 0x3af49bb4,
  213036. 0x72bf1afb, 0xd89e2d14, 0x2fd151e6, 0x27be882c, 0x8f88717c,
  213037. 0xaddedc85, 0x16ac6c6f, 0xd6d859bf, 0x2d8eae58, 0x0e741a1b,
  213038. 0x61c1f30d, 0x6faf7a00, 0x9b67e096, 0x66dbd09a, 0x7d3b4f7d,
  213039. 0x21f11c06, 0xc727c98e, 0x6152ba02, 0xe86cb221, 0xafd58891,
  213040. 0x6bd3baf4, 0x59e93c6a },
  213041. { 0x71dd4594, 0xe54dd36f, 0x00aef1e6, 0xbbc9cc9f, 0xa19f6530,
  213042. 0x9ea5a44e, 0x3f520928, 0x8588aa99, 0x8f5c1418, 0x9753794c,
  213043. 0xc11399fa, 0x118bd792, 0xf5cb6ab5, 0xb9bd3afd, 0x2ecb9652,
  213044. 0x813d1cb2, 0x40389813, 0xfd456267, 0x4ac8431c, 0x51f7119b,
  213045. 0x0a180eb6, 0xdd9f6a91, 0x9f7bfa2e, 0x13946d17, 0x50a9d0d9,
  213046. 0x16f18631, 0x6f8373d3, 0x5f19c20d, 0x9b6a52b9, 0xbe85ac6a,
  213047. 0x74f62e03, 0x63ef187b },
  213048. { 0x016f45e7, 0x7c376b7f, 0x2bec82f8, 0x1c1bdb57, 0xce429b60,
  213049. 0x7392f741, 0xc7afd81d, 0x6fdbf0a2, 0x7241098b, 0xbda41b1f,
  213050. 0xbb60f8cf, 0x5b407474, 0xb330bc4d, 0x933e0d41, 0x733fa3be,
  213051. 0xae182830, 0x0f5c6cd1, 0xa0ed299b, 0x3f9860c8, 0x7ff3354e,
  213052. 0x15559c41, 0xb1360986, 0x129f85cb, 0xab0cb63c, 0x47685fbe,
  213053. 0x682ecc49, 0xeb199633, 0x505e8ec2, 0xddac2cda, 0x90dcc794,
  213054. 0xf192da23, 0x4fe6791c },
  213055. { 0x05e8733c, 0x94a423d5, 0x1d5717c1, 0xcc845e65, 0xe961b322,
  213056. 0x237c7e88, 0xdb4181cc, 0x0c4471c6, 0x713bd721, 0x00c875e2,
  213057. 0xb2c17b09, 0x9dfde9ed, 0xe88ceaf6, 0x430a6de5, 0x7b81cea6,
  213058. 0xaaa7a61a, 0x233f98d5, 0xea52d026, 0x60689a9a, 0xb55efdd0,
  213059. 0x5cac4aab, 0x30cfa7ce, 0x8e950761, 0xfa4db114, 0x4e9a1e52,
  213060. 0x309570c4, 0x1a040170, 0x18c21f61, 0xbe78d9d2, 0x555d1ffe,
  213061. 0x561db297, 0x04482a18 },
  213062. { 0x73d486d8, 0xe7758ac2, 0x61cdc1e7, 0x8169f946, 0x2188ab4f,
  213063. 0x723c99fc, 0xf3373630, 0xa0e54f02, 0xbd8c2260, 0x560bee25,
  213064. 0x4531bc60, 0x28fc307c, 0x7e44feb5, 0xd6f21f1a, 0x57128d37,
  213065. 0xc8e4499c, 0xd7b2ea45, 0x963b053e, 0x32a3d222, 0x40c27a04,
  213066. 0x35459668, 0x5b51854d, 0xd73557e9, 0x66e1a49f, 0x8692077a,
  213067. 0x0d267fd9, 0xe7342702, 0xfa1350d3, 0x68ccdb44, 0x1a9c3f25,
  213068. 0xdedbf89f, 0x833a0ff8 },
  213069. { 0xab376b76, 0xa8c419c7, 0x27d0f0cc, 0x3b7294f3, 0xa90c514d,
  213070. 0xe56bb9e2, 0xa62575a6, 0x931ba51e, 0x098c0a88, 0x56fee07b,
  213071. 0xb4c16a2a, 0x04be5aee, 0xe6eb260b, 0xe513350b, 0xa1d5c270,
  213072. 0x339edad6, 0xe9dbadd1, 0xf366ed59, 0x2dd06ec0, 0x4213be88,
  213073. 0xcb1187db, 0x22d639c8, 0xd8a1058a, 0x1fec95e1, 0xa2b744f1,
  213074. 0x03f73ea6, 0xf4f05c0c, 0x741fd51a, 0x85f811a0, 0x2e2df95a,
  213075. 0xeb24965f, 0x692b3ce3 },
  213076. { 0xd2a127b4, 0x0ce6cb72, 0x8f92816f, 0x66a46ea5, 0x47a37616,
  213077. 0x43ecf463, 0xe0ab96ee, 0x163d9a01, 0xb2edbe8c, 0xc8145c6d,
  213078. 0x4de4e665, 0x2f426cae, 0x74e252f9, 0x174d0b40, 0x7d2af831,
  213079. 0x54c240d7, 0x3d652936, 0x581fa397, 0xa09d4695, 0x05b9491c,
  213080. 0x5452643c, 0x8c4e8533, 0xd4128327, 0x32d64331, 0x70361f25,
  213081. 0x64479038, 0x89ef09f2, 0x774191b1, 0x81de5fe0, 0xc0cf0aaf,
  213082. 0xf40042d6, 0x333e430a },
  213083. { 0xcf26d3b7, 0x5df04de4, 0xb53f79be, 0x57a77306, 0x1808b664,
  213084. 0xa4013c5f, 0x85037360, 0xef291ea4, 0x0b061037, 0x1ffc9d7d,
  213085. 0x65c913bb, 0xd9d04dd9, 0xf13b8587, 0x948a37af, 0xfe3ee755,
  213086. 0xb5443483, 0x04631386, 0x3fc21e74, 0xcddeb58c, 0xb3a104e5,
  213087. 0x6572cd52, 0x94fe1862, 0x15aaa408, 0xeb9a71a1, 0x459ea462,
  213088. 0x8adc6fe5, 0x4aeb02a3, 0xbb18d175, 0x2f7791d1, 0xae127636,
  213089. 0xd6bbd708, 0x10e8b31d },
  213090. { 0x3ed9f1af, 0xb87f03e5, 0x56676166, 0x03ad2477, 0x74ce15b8,
  213091. 0x38dcd630, 0x26b1e85b, 0x1877e2b0, 0x1af99c15, 0xb1654d17,
  213092. 0x9382547a, 0x9782e9e4, 0x26d55ef5, 0x6dc7fc7c, 0x2fbeb54c,
  213093. 0x9038f95d, 0x036c0357, 0xfe590dfe, 0x4fdc3f7f, 0xcfcb6eae,
  213094. 0xf35e1a88, 0xcb1fbc54, 0xda0a5568, 0x3c8e1db2, 0x5b6f5557,
  213095. 0x9a87393f, 0xe7ac0a06, 0x38646b32, 0x2a8495ab, 0xfd261c83,
  213096. 0x0cdcc4bc, 0x6485524c },
  213097. { 0xc4a6ff2a, 0x1abfb3e2, 0x35a6428a, 0x2aa03fba, 0x89aff742,
  213098. 0x884227f0, 0xba5dbd93, 0x2337883a, 0xd2a182cb, 0x38186ae9,
  213099. 0x49a01f05, 0xb9f0764d, 0x917b1e7a, 0x92411feb, 0x570cbb5b,
  213100. 0x700b1903, 0xb914be7c, 0x5d5181d5, 0x1981182d, 0x135c4437,
  213101. 0x574b9997, 0x32758d24, 0x632d28b2, 0xa650a8f5, 0xfa383f09,
  213102. 0x24078bac, 0x00a33d80, 0x6546a60c, 0x2df8b449, 0xa4061c7a,
  213103. 0xf234563c, 0x1f76f3f2 },
  213104. { 0x44c436b0, 0x9aa2c143, 0x1f69c87a, 0x79070556, 0x5f6db2df,
  213105. 0x35f3117b, 0xed56ba82, 0x85761f41, 0x7d0afa48, 0xf831464f,
  213106. 0x3adce71e, 0xa99f2915, 0x116b7488, 0xb27bf693, 0x9bb9443a,
  213107. 0xa98a5a8c, 0x2ee5fde8, 0x7f878026, 0x1812acb7, 0x3a6f93dd,
  213108. 0xdc84bc92, 0xaf92a4cc, 0xf1d4995a, 0x3c2562af, 0x04ed899d,
  213109. 0xfd9fc33c, 0x4ed2a538, 0xc028ca94, 0x049ea726, 0xd0f367bb,
  213110. 0x3d108e05, 0x04924ffb },
  213111. { 0xc673562f, 0x06548e3d, 0xe2eae48c, 0xd3b33025, 0x5e1c6977,
  213112. 0xe61fd32b, 0x6ebe557b, 0x424e2064, 0x41d6e18e, 0x767391c0,
  213113. 0x14d7e95b, 0x4b8ebb8e, 0x20991b8c, 0x4ae8b7d4, 0xe01290d3,
  213114. 0xf8a0df66, 0x925e5f4e, 0xc97e24a3, 0x1508272a, 0x79a7b2cb,
  213115. 0x25072661, 0xb40b072e, 0x9062fa49, 0xdad9e182, 0xf3c53bce,
  213116. 0x8780a784, 0x9f142799, 0x58a82b76, 0xc1468426, 0x08cd849c,
  213117. 0xc380ae35, 0x4dfce809 },
  213118. { 0xd527b780, 0x45069cb2, 0x977930dd, 0xd52da015, 0xe27d0263,
  213119. 0x10cc600b, 0xbb2d1b2b, 0x34102c26, 0x554adf3c, 0x4c652623,
  213120. 0x45f0ff47, 0xd6891382, 0xca916e7c, 0x83fa8cc5, 0xd15c8d8a,
  213121. 0x1e10f139, 0x81dc56b3, 0xf173dc2e, 0x5c4ed9ba, 0x7fcecb04,
  213122. 0x47d01228, 0x307fd7d8, 0x9f3a532f, 0x24a57153, 0xe2153c22,
  213123. 0x59e9e81d, 0xe428a408, 0xc562595d, 0x9339bd23, 0xdc7daff8,
  213124. 0xb8a06802, 0x0d075908 },
  213125. { 0xde085f2a, 0x870af2a7, 0xbe99b2e5, 0x88fcd24f, 0x59ca413b,
  213126. 0x88c0d261, 0x8559f851, 0x1f02a2e4, 0xf622da0d, 0x83b96021,
  213127. 0x6dca3615, 0x5c05c2f5, 0x7910c682, 0x0148cf1c, 0x272695be,
  213128. 0x392f2896, 0xa8d64ef6, 0x883d0bb5, 0x1cfcbc52, 0xef0d2244,
  213129. 0x526117e5, 0xf5dafcec, 0xf04928e9, 0xb68612b9, 0x393f2e2a,
  213130. 0x283f744d, 0x700c1151, 0xfbeed7ed, 0xa4360dfe, 0xf2cde215,
  213131. 0x2f08535a, 0x24fa961c },
  213132. { 0x616df7f6, 0x0767db3f, 0xfbd90326, 0x643057d8, 0x6e82d544,
  213133. 0x174daa90, 0x689643db, 0x2284f345, 0xcc89a060, 0x18b191df,
  213134. 0xd6c27d12, 0xbab46af4, 0xc9895145, 0x5a57f486, 0xcc942f9e,
  213135. 0xc03214e9, 0x41950158, 0x273e1c8f, 0x39ad43ab, 0x8ceb759f,
  213136. 0xe50ee173, 0x5e1b8b7f, 0x8f4d7d4e, 0xf635b1fc, 0x755603f3,
  213137. 0x8eff77e3, 0x7752fa60, 0x201f61d1, 0x4a6fb6e1, 0x94d7a03d,
  213138. 0xfc4f0114, 0x371cc23d },
  213139. { 0xda90c351, 0x289b115d, 0x364d9c06, 0x6d196ebf, 0xf650b31b,
  213140. 0x77a89202, 0x6f57642f, 0xcc28c164, 0x08100127, 0xdc4f7e36,
  213141. 0xdc4c807b, 0x8836cd08, 0xe00240f2, 0x1280f156, 0x99cb3953,
  213142. 0x3f9a6d78, 0x3a802038, 0x40a494d3, 0xe87d3474, 0x45697e91,
  213143. 0x26dde24a, 0x70d97d07, 0x7640c30e, 0x06f6a58d, 0x5ba6e6c6,
  213144. 0x03c2c0e8, 0xf1bc13e8, 0x330f6a7a, 0xc9f4d78f, 0x3e602e4f,
  213145. 0x0c80fb7f, 0x92b6bca0 },
  213146. { 0x5f00822e, 0x2e3d5c83, 0xb8b16f12, 0x0e825712, 0x92b0a330,
  213147. 0x81c329c4, 0xa7cc1954, 0x6b4e32ad, 0x1bb1413f, 0x0bee9cee,
  213148. 0x4a92ca27, 0xedfb7baa, 0xea3b9153, 0xcd472afa, 0x00f0c0f9,
  213149. 0xe8f09e7e, 0x5cdebb70, 0xa4e1d872, 0x4a9b63b6, 0xfe2bae08,
  213150. 0x3fd58f65, 0xf40141b8, 0xa3b62759, 0xd7ec5eda, 0x790e3088,
  213151. 0x9aaf6e67, 0x1f277e31, 0x215ad830, 0xcf33871c, 0xe7db4b98,
  213152. 0x4f02f89d, 0x71ff62c9 },
  213153. { 0x2a4a84d9, 0xaa4c7102, 0x5ebc71e6, 0xe2ee4acd, 0xf1cd6578,
  213154. 0x3b11a8a5, 0xfff120a5, 0x83f5ef9f, 0x09e65033, 0xa4c598e1,
  213155. 0xca044180, 0xe1e9f990, 0xf59828c1, 0x8b832d46, 0x33af536b,
  213156. 0x753f28a0, 0xb6d4f68a, 0x92edc4b1, 0x72ccd1f0, 0xedde692a,
  213157. 0xd2226432, 0xd3aa0f7d, 0xa3d2661c, 0x38dbb63e, 0xfdc37dda,
  213158. 0xf1e19fc6, 0x84ef6b4c, 0x6c18b350, 0xdf1bba69, 0xe6a83fe9,
  213159. 0x5f958273, 0x40fd47e7 },
  213160. { 0x267140a4, 0x5b88b746, 0xeab6f2fb, 0x6dbbfc1e, 0x69862548,
  213161. 0xdd9ec88e, 0x2eb6efc2, 0x69beeba1, 0x8ac8ff88, 0xcfc2214a,
  213162. 0xb5a21950, 0x95d5c96e, 0x4171fb69, 0x93389c05, 0x1b468337,
  213163. 0x2d85d452, 0x4113425c, 0x14d68a08, 0xec6c2174, 0xe52c0139,
  213164. 0xf730084d, 0x20cf0b97, 0x1f578aa3, 0x1ac16a26, 0xf9b6ae43,
  213165. 0x18b9fab3, 0xd854a695, 0x68d82111, 0xdffbe286, 0x0b334d98,
  213166. 0xe639338c, 0x5b1c1157 },
  213167. { 0x72b6bb8f, 0x90edaab1, 0x02fc92c2, 0x8dc64ed2, 0xfe694c73,
  213168. 0xf42ba3c5, 0xcb54dce4, 0x316dc65f, 0x632420dc, 0xcb2d66a3,
  213169. 0x056dcf94, 0x16e706e7, 0xa4f32c9d, 0x2809c764, 0xea6edca8,
  213170. 0xab18d830, 0x81c65f57, 0x4fd1ace6, 0x7da12c10, 0x1f91651c,
  213171. 0xc7791a48, 0x0ac3bd66, 0x785e67a3, 0xb6ad1cf4, 0xda0fd591,
  213172. 0xe4d3fc44, 0x6e1c6344, 0xce164801, 0x33e50ab3, 0x84de9cb8,
  213173. 0xa756eef4, 0x963ab83a },
  213174. { 0xdf4ea5a3, 0x944b47d8, 0x5cfe45fe, 0x96568815, 0x8a3c3564,
  213175. 0xd16e7d58, 0xe7c99e15, 0x84e55b3e, 0xf55071bc, 0x3fee204d,
  213176. 0x04057dce, 0x71006f29, 0xbba75570, 0xfe8c390d, 0x3319adac,
  213177. 0x3645bcb6, 0x7c20bfd8, 0x8189e8b0, 0x7d7d9578, 0x8e550969,
  213178. 0xb99f4e3b, 0x037d1321, 0xa60cfb6a, 0x011b2521, 0x837382da,
  213179. 0x66594aaa, 0x83c1dc07, 0xc89b91fd, 0x076b9884, 0x6b82b899,
  213180. 0xbe45c558, 0x443480fc },
  213181. { 0x9114221a, 0xf8ffffb4, 0x3e857a7a, 0x4aec4f2e, 0x0fa54787,
  213182. 0x42e2d0e4, 0xd6f96152, 0xef3e6b31, 0xfbfe9b77, 0xb2296537,
  213183. 0xfb43a86a, 0xc2a9d0f2, 0x24572ac6, 0x241284ed, 0xe721ba7b,
  213184. 0xa3868917, 0xc117a78d, 0xdbef7c00, 0xd31605ac, 0x38149071,
  213185. 0x065a8ee9, 0xc2dada9e, 0xc442be82, 0xd5b138d8, 0xf6d72b58,
  213186. 0x9b6c224b, 0x8eb03e6d, 0xb9d355cf, 0xa1700371, 0xab6d1eb0,
  213187. 0xcffaa7eb, 0x97118a88 },
  213188. { 0xcdecb5d8, 0xbf9c59a2, 0xa93a6866, 0x8083c81b, 0x04774fbf,
  213189. 0x24e0dd81, 0xa02070b4, 0xe779a3ca, 0x0fbfb781, 0x9d352fbb,
  213190. 0x3ef2a1c4, 0xa8b0d820, 0x14b3e501, 0xb858637b, 0x8a882ff2,
  213191. 0x5ba70a49, 0x3b06efa5, 0xa2730083, 0x102fee2a, 0xa42c02f4,
  213192. 0x8a0223a5, 0xe4e76299, 0x85c3fc72, 0xdba2ba26, 0xfe52eae7,
  213193. 0x554fe763, 0x270f45f6, 0x30b5405a, 0xa573387c, 0xd56a177a,
  213194. 0x4b71fa82, 0x17c0778d },
  213195. { 0x2735e37b, 0x0e6dff1d, 0x656ec572, 0xc9884e56, 0x9ebba978,
  213196. 0xa2f5ac9d, 0xba09f3c4, 0x40fa4518, 0xf5b04377, 0x8c3fa177,
  213197. 0x967a2eca, 0xa1a1decd, 0x0528bd40, 0x768bca70, 0x18691c4a,
  213198. 0xf224952b, 0xe86d5fd5, 0x16e12c45, 0x37859a6a, 0x7a0d9157,
  213199. 0xa0ffce0e, 0x723f4309, 0xa96cc9a3, 0x5a8db79b, 0x1ad23a38,
  213200. 0x6dd12ae0, 0xe2bf5d84, 0x9ffec3a1, 0xa452ed66, 0xd6ce84e1,
  213201. 0x571fe4c6, 0x1219d5c8 },
  213202. { 0x262969eb, 0x43eaa67f, 0x2f03e773, 0x3a3ab39d, 0x57bb0909,
  213203. 0xe6127e51, 0x8d150274, 0x0f82b0ed, 0xe580bdbd, 0xffffcad8,
  213204. 0xa9743e6b, 0x51d3d075, 0x8bac11d6, 0x1484bdb1, 0xeb24c388,
  213205. 0x95cd9990, 0x7fac67c6, 0x216a61d0, 0xa04e6b87, 0x4308f762,
  213206. 0xcba57cc8, 0x2865dd61, 0xd234a07a, 0x3c296b0d, 0x3a0793f9,
  213207. 0x76f92839, 0x0be29ece, 0x70b57e1f, 0x7e626f42, 0x1314a82f,
  213208. 0xd657f230, 0x2c8d7ab2 },
  213209. { 0x0825e4d6, 0x67cf5892, 0x6ef83b44, 0xdf51eaa5, 0x1310108d,
  213210. 0x63e665d8, 0x8dd0963f, 0x229f89f5, 0x9df6436a, 0x8c4b14dd,
  213211. 0xd45ebba7, 0x99dae469, 0x5a4df381, 0x118aab77, 0x29e37feb,
  213212. 0xda8978bd, 0xaca2d7ef, 0x69ced5aa, 0xc67d6a8a, 0x6c98d05d,
  213213. 0x77f84a34, 0x7474bf0d, 0xed8cd59a, 0xd4428b2e, 0xd1d398fb,
  213214. 0xb0fd1cd5, 0x94a20b11, 0x596013db, 0x1b404c44, 0x96eb705a,
  213215. 0x4b09d958, 0x2299d277 },
  213216. { 0xc64397e6, 0x5b9cd58d, 0xbf6dd31e, 0xac198f1e, 0x3e9f1db2,
  213217. 0x5866d8e1, 0x8fcdc68c, 0x405ae287, 0xe53c01fd, 0xa4b280cd,
  213218. 0x411db5f6, 0xdc963f2d, 0xbec4f8a0, 0xed5d5189, 0x916ee98b,
  213219. 0x336fd13d, 0x042df48e, 0x6925b1b3, 0xace0074e, 0x0cf56291,
  213220. 0x25317e95, 0xe8d38b48, 0x821c446b, 0xc7ad1d2b, 0xf0b65934,
  213221. 0x71c44135, 0x52ca0d50, 0x971b736f, 0x27b46c26, 0xaf9ffa57,
  213222. 0x1936618e, 0x21ac6779 },
  213223. { 0x2d7fbcd2, 0xab420e3f, 0x97bdfc18, 0x12722473, 0x4df5d4b4,
  213224. 0x492033f8, 0x3807b7d3, 0x6fcd4236, 0xb33c3625, 0xdfc19b09,
  213225. 0xa0f22814, 0x13d6f375, 0x037c19b8, 0x70978a59, 0x0ff27b9c,
  213226. 0x4f398997, 0x615a4389, 0xfc0e1a45, 0x3e602f74, 0xffa3496a,
  213227. 0xb261ca1c, 0xc3f1c431, 0xee0164cd, 0x612211db, 0xe7f7be9f,
  213228. 0x30463ee4, 0x92c2e1bb, 0x015f7e78, 0x24483a56, 0x663d88d6,
  213229. 0x0e62d9d8, 0x0e8ec1e7 },
  213230. { 0x8a0878dd, 0xa88ccc29, 0x6640071a, 0x99ac175d, 0xa5173617,
  213231. 0x90344820, 0xdd58a315, 0x316d023e, 0x88d221a1, 0x30785bd4,
  213232. 0x959c48e3, 0xb74b3de7, 0x4c67a771, 0x42ee0382, 0xe0b91453,
  213233. 0x59ef6cdd, 0x9b237e91, 0x7830ae28, 0x495d8325, 0xe1847a4c,
  213234. 0xd0773666, 0x67b1217e, 0xa294a325, 0x58192c86, 0x864d8326,
  213235. 0x76aa0f56, 0xf4b13e5b, 0xe2a2bd12, 0x1b6b73fd, 0xd850c1c0,
  213236. 0x5d103635, 0x653a795f },
  213237. { 0x50dcb199, 0xcfe28985, 0x7fa02b60, 0xb35b8e5e, 0xc97603d0,
  213238. 0xbca7d7c3, 0x27f131b5, 0xb0e5288d, 0xe2b12d52, 0x3aa704de,
  213239. 0x1db725c7, 0xe206b1d8, 0xc5d1b113, 0x0b12839a, 0xdb45d763,
  213240. 0x14f970cb, 0xb2125e8e, 0xc997f93e, 0xee7daa26, 0xbd75739c,
  213241. 0x1fef20e9, 0x46ecbd3f, 0x7c6a42b1, 0xf994a114, 0x27fb0fd1,
  213242. 0xd289eb4f, 0x9a40da4b, 0x11186d31, 0xfb9d7976, 0x083f65a5,
  213243. 0xd444675e, 0x30dfc47b },
  213244. { 0x9eaadfe8, 0xbcfc5ae2, 0xb4d4e812, 0x25027e54, 0x8b533561,
  213245. 0xab0702df, 0x56a6a214, 0xa2b9c204, 0x3059068e, 0xb1a3df7a,
  213246. 0x9883110f, 0xa3514b21, 0xc4b78e1c, 0xb7be2336, 0x3e2f6984,
  213247. 0x17073ce6, 0x2ddf7ac6, 0x86e114a6, 0x07d7c3c8, 0x276192bf,
  213248. 0xeb1ae289, 0x5da69e0b, 0x25184939, 0x983af175, 0x407a3aa0,
  213249. 0x9ac52a4d, 0xae0fe218, 0x1535c7da, 0x397f2501, 0xe16fe872,
  213250. 0x54c212cf, 0x572a591f },
  213251. { 0x09a5553a, 0x49668419, 0x327733bc, 0x3f054318, 0x3eefd690,
  213252. 0xf9ceb4b2, 0xf22126d4, 0xbd3cbf9b, 0x2fed9578, 0x6d9671c0,
  213253. 0xca0306d8, 0xbba597ce, 0x3d674fe5, 0xb705ed61, 0x67f33f76,
  213254. 0xf1d3622b, 0x11cb8c31, 0x15bcf3c6, 0xe53d1aa9, 0xa38467dc,
  213255. 0xf908ab43, 0x902fe929, 0x8d15767a, 0x6e3e499d, 0x90afd07b,
  213256. 0x8142db5c, 0x6c8b190e, 0x120c6fbc, 0x24919a4e, 0x80c86553,
  213257. 0xd8c82c3c, 0x65c2cbe1 },
  213258. { 0xa660bb63, 0x684cda20, 0x86e86245, 0x27dc3b0a, 0x6ba0eed7,
  213259. 0x76472cf6, 0x679dd158, 0x79c162e5, 0x08452d44, 0xb6884277,
  213260. 0x413f579e, 0x829bc6b3, 0x95011770, 0x92ea15ec, 0x47738183,
  213261. 0x5e34e300, 0x73e1d2f1, 0x8c3ca349, 0x229bd3de, 0xa5c4f1dc,
  213262. 0x94ef7ed3, 0x783eff1b, 0xdfae7a1a, 0x46db738d, 0x1a099852,
  213263. 0x4353d72e, 0xa0dcf4ab, 0x2533ad58, 0x0e7888b9, 0xd8055016,
  213264. 0x3ba77f66, 0x831440d5 },
  213265. { 0xf611b2da, 0xf43e2e32, 0xd0fa46ac, 0x5d066e29, 0x820b3c0d,
  213266. 0xe897f3e8, 0x1d3e44f0, 0xc45c28e6, 0xdfd27a66, 0x929d7f66,
  213267. 0x101e8517, 0x735b860a, 0x3de078dd, 0xea3fce98, 0x638ce11a,
  213268. 0xc9977db5, 0x48536b3b, 0x0488382f, 0x64cadfc6, 0x7e0c7a3c,
  213269. 0x82147b71, 0x3cd17f7f, 0x1b411e3e, 0xe95663cc, 0x985fb46d,
  213270. 0x5739ac8f, 0xbcf119ca, 0x385399cd, 0xe15a2815, 0x4a985a70,
  213271. 0x6d5f4566, 0x504c3a8a },
  213272. { 0xb8fa53c7, 0x00b55283, 0x509474e3, 0x985cff38, 0x437ce25f,
  213273. 0x234d241c, 0xe5a129ed, 0x29832430, 0xaabcc674, 0x6ad38956,
  213274. 0x7ee81ee1, 0xa2dc001d, 0x670b2702, 0x4c23c6b6, 0xa6e8a3bb,
  213275. 0xb35e567e, 0xa69673ea, 0xbc70b3ce, 0xe6e28eac, 0x85a7a9c3,
  213276. 0x5537b7da, 0x2ae684de, 0x6de937dc, 0x5ecac3e5, 0xf8430422,
  213277. 0xbf2ea6c9, 0x77fdc520, 0x38caf7d0, 0x69f56add, 0xc27af0b1,
  213278. 0xc71d21d2, 0x496e4699 },
  213279. { 0x9fa93467, 0xba14fc82, 0x0eb2a614, 0xc2e37684, 0x4833e09b,
  213280. 0x659bcfaf, 0x3686bdcc, 0xbc859752, 0x81f3216a, 0x40bfd080,
  213281. 0x17c081b8, 0xc463bda6, 0xbb04793b, 0xbd01fa86, 0x2cd640c5,
  213282. 0x5a21ece6, 0x2203d5c4, 0x97bf6a54, 0x951167b7, 0xceb40edc,
  213283. 0x765ba268, 0xd67aacaf, 0xaeab51f9, 0x8ba0d9e9, 0xb0d6863a,
  213284. 0xc14b215e, 0xe5f06952, 0x354cdcdb, 0xcb3744b5, 0x4f2b5ccf,
  213285. 0x13037fe8, 0x13389173 },
  213286. { 0x45003cd1, 0xee680640, 0x44ae2ac6, 0xfdac17bc, 0xde8e5314,
  213287. 0x4bcd419f, 0xc7cea95c, 0x81e34eb9, 0x38f37e01, 0xbb57762d,
  213288. 0x260990c8, 0xecc4cfb0, 0x50a34a7b, 0x0bc493f9, 0x543304ef,
  213289. 0x68074172, 0x6bc8aa2a, 0xaec0fcb2, 0x3b45fea5, 0x9e7a9b46,
  213290. 0x55fbdbac, 0x4bb2952e, 0x0485dff4, 0x50f0c0a6, 0x4dea4796,
  213291. 0x02c5104d, 0x695e3a02, 0xd2cefa09, 0x6da1f345, 0x4c8102b4,
  213292. 0xf3833fbd, 0x422eb573 },
  213293. { 0xa6ad3f47, 0xac592eb6, 0x9714ba0e, 0xb0861f6d, 0x07281459,
  213294. 0x57c1e919, 0x64ea5803, 0xcf7c94e2, 0x54b12723, 0x725376ac,
  213295. 0xdafb736a, 0xf2a6ba41, 0xcba03cdc, 0xc89e8920, 0x5b0fd3ad,
  213296. 0xf2e20cb4, 0xd66059fe, 0x26ea5a54, 0x889df8bc, 0xee63fa8b,
  213297. 0x66a3f2bf, 0x40f1c7e1, 0x747312e1, 0x09febc9c, 0x727999ff,
  213298. 0x7d19b9c2, 0xb7fd2b05, 0xa9fbbb4c, 0xa0da2dc6, 0xcfba27d7,
  213299. 0x2c252582, 0x368541cf },
  213300. { 0x22799d37, 0x510d3c9e, 0xacfa333a, 0x1b677de5, 0x080f795b,
  213301. 0x4e6ae18f, 0xafc8dfc2, 0x69b53c2a, 0x0e842dc2, 0x797541b6,
  213302. 0xac067fe8, 0xd5a6f2af, 0xbd07d877, 0xd0208a03, 0x654be2f2,
  213303. 0x34b473f0, 0xf515e23e, 0xe67c102a, 0x2ac1af48, 0xb00dbf9d,
  213304. 0xb6a13d00, 0xe264fa41, 0x97e94c11, 0x1669786a, 0x86a586f4,
  213305. 0x09d8cf2d, 0xc7f927e9, 0x073bf869, 0x2241a566, 0xb8977880,
  213306. 0x22261334, 0x59a5bf59 },
  213307. { 0x81347191, 0xe9d1c91e, 0xeb969972, 0x186c1abc, 0xa9d46a7f,
  213308. 0x07888767, 0xdaa7d397, 0xda93cfcc, 0xd91b9aa0, 0x08bee9f1,
  213309. 0xf8dd3c6c, 0x8267fd78, 0x94228100, 0xf93860d0, 0xdadb47fb,
  213310. 0x6a6a71aa, 0xa6156f8a, 0x9caa06b7, 0x39848bc9, 0xaa1b05e0,
  213311. 0x2aaa9135, 0x36ddc237, 0xb13f3bd1, 0x77e7e079, 0x4acc5f4d,
  213312. 0x8d0b5cbe, 0x984cfd36, 0x04da45f8, 0xd3d3e0f8, 0xf14ef618,
  213313. 0x43eb799c, 0x467564c1 },
  213314. { 0xb6fff5d7, 0x8d725904, 0x92dc4752, 0x037f33af, 0x6d20b8aa,
  213315. 0x9095d575, 0x43baec39, 0x32235fc1, 0x68a2b9b0, 0xa2feb4af,
  213316. 0x94d35c61, 0x61c50318, 0xea877486, 0xac92b6a2, 0x011bc6f3,
  213317. 0x8eb48b15, 0xc79edcb2, 0xa28fe128, 0xa5d2a006, 0x9f71bc0c,
  213318. 0x2f15b850, 0xf3167732, 0x7a036218, 0xfe8d728c, 0x4f81e09e,
  213319. 0x068f39cb, 0x7b7c50d9, 0x1773f016, 0xed6a1e03, 0x0d0f7adb,
  213320. 0x4ee984d5, 0x8a0dee16 },
  213321. { 0x47366e6f, 0x504991bf, 0xe86c3005, 0xb8084d9f, 0xa40cce36,
  213322. 0x14c4c751, 0x3f1961e2, 0xbbb46aa6, 0x40445e43, 0x56a785f9,
  213323. 0xc91e215f, 0xdb8d1b57, 0xc7ee808d, 0x6a8e453e, 0xbbaa1e8c,
  213324. 0xc0367ef8, 0xe3e18109, 0x310d91f1, 0x7e20a2c3, 0xf97cfd0e,
  213325. 0x554cc277, 0xf1e80c84, 0x7b628403, 0xe89bbc1d, 0x3fe0a17c,
  213326. 0x7778a966, 0xc1f00073, 0x9e9db19f, 0xb6f6bed2, 0x2ce7fe7d,
  213327. 0xee97ce23, 0x7b04b5d2 },
  213328. { 0x82c5faf8, 0x5b546bc7, 0x8eb81097, 0x1a734c5e, 0xe77851e0,
  213329. 0x3d566861, 0xe956d51f, 0x833a1013, 0xc3c3c37c, 0xc7351731,
  213330. 0xe0c148ec, 0x607738fb, 0xe1bbef41, 0x2ec6f0bb, 0xcfa51857,
  213331. 0x0aa2ac6e, 0x66e3adf0, 0x072902d7, 0xc622d6e3, 0xcd4d5089,
  213332. 0xa6dd802f, 0x3ae21b23, 0x33886372, 0xe5465a55, 0xa8d81822,
  213333. 0xd85119a0, 0x3786977a, 0x4f14d032, 0x9c7b272c, 0x515b081c,
  213334. 0xc99be31c, 0x1c6a95a4 },
  213335. { 0xc2821363, 0xa6b14ad5, 0x4d17de1c, 0x829c1823, 0xccade848,
  213336. 0xaef5d2c4, 0x82489e27, 0xf412ab39, 0xf081d927, 0x92c9c098,
  213337. 0x75cbad1f, 0x6f87bdf4, 0x1a1d9fb1, 0xf4aadab8, 0xb75f3b76,
  213338. 0x475a7923, 0xdbbba8fe, 0x99dd0ad6, 0x4b70ab45, 0x836f6164,
  213339. 0x34bd9af1, 0x2a464881, 0xba9abda3, 0x5c91226e, 0xe65625fb,
  213340. 0x4cec8709, 0x0818e4be, 0xd4b3919e, 0x14f6879c, 0xa5c09c84,
  213341. 0x30a864c9, 0x72708a02 },
  213342. { 0xf34a466c, 0x4f33c0b1, 0x7f9d45ba, 0xa1bae09c, 0x0e28785c,
  213343. 0xd70f0fee, 0x90880881, 0x824c7146, 0xbb043da3, 0xe2416c2a,
  213344. 0xcec6f432, 0x733da713, 0xc9793e1c, 0x2b590649, 0xb35c9365,
  213345. 0xdb62d5b0, 0x3e5c1b2a, 0x355eb6e2, 0xbb16b515, 0xcfe8b5ce,
  213346. 0xf709691c, 0x9e081869, 0x61a85bd5, 0xc865f9fb, 0xfae103f7,
  213347. 0xf169d3cc, 0x73467e9d, 0x9525c473, 0x43695113, 0x7db55c0b,
  213348. 0x73265d21, 0x7491c74c },
  213349. { 0x80d2b94d, 0x312ed5bf, 0xba4b260b, 0x1b8ac633, 0xd62219a1,
  213350. 0xac86c58c, 0xaeb82c8e, 0x317ccf6b, 0x59ef9ced, 0x2dfb29ee,
  213351. 0xe42bcd5a, 0xdaa7d898, 0x5974b201, 0x93e295c8, 0xd9fc5adc,
  213352. 0x69e75784, 0x012aa3ba, 0xd6c4709f, 0xc85d3cb9, 0x1fda9f37,
  213353. 0xd3dd4abd, 0xe5487e25, 0x0b3ba22e, 0x00fd4b01, 0xc6e8dcbb,
  213354. 0xcb591493, 0xbce68664, 0xb7329fab, 0x68906b76, 0x6829d1c2,
  213355. 0x74176841, 0x8bcfd3e5 },
  213356. { 0xd3c8c314, 0x06882734, 0x11870833, 0x95f0b2f1, 0xc068ba16,
  213357. 0xb937f7c3, 0x77924787, 0x5365e0d8, 0x1f992227, 0x15527e5e,
  213358. 0x27dffd4f, 0x0a069648, 0x2f586389, 0xd58b3df2, 0x6af20ead,
  213359. 0x83446b89, 0x50746257, 0x09d7970b, 0x4022a691, 0xd9e8d206,
  213360. 0x671ec379, 0xd1e5f8af, 0x057fe91e, 0x6f542509, 0x52890418,
  213361. 0xf14dda81, 0x1db932ad, 0xbd78010e, 0x905a9378, 0x3e18d1e4,
  213362. 0xbd37ab49, 0x53cadcf7 },
  213363. { 0x5e53d0ff, 0x1bb5edf7, 0x888abf67, 0xd886606c, 0x12206d15,
  213364. 0x6491b0f8, 0xe22b6a33, 0xb3018345, 0xb173b317, 0xaba6794b,
  213365. 0x7dc9e595, 0x8c1e5867, 0x239624d1, 0x4e106482, 0xda55dd53,
  213366. 0x61752e59, 0x9e42879c, 0x018b4eab, 0x491f2bed, 0xcaf6784b,
  213367. 0x1e79429e, 0x3dcdb9d2, 0x10f26224, 0x36941485, 0xa650ec5c,
  213368. 0x106f190a, 0xb69a9760, 0x7542a5ae, 0xc32d1046, 0x69bd75e9,
  213369. 0xbf8c62b1, 0x90849964 },
  213370. { 0x5a93c661, 0xb1390cf6, 0x9db5f056, 0x18486264, 0xa51a1788,
  213371. 0x92a93a9d, 0x6772de9a, 0x1b0cbb8f, 0x7c71487c, 0x6e67febd,
  213372. 0x4e62423e, 0xf9b4382d, 0xbb5a42f8, 0x96fda50e, 0x6089a4f2,
  213373. 0xc921b337, 0x875ec516, 0x49d32d7b, 0xc410124b, 0xbd86d2ca,
  213374. 0xc421fb7a, 0xf6862209, 0xf6b7de33, 0x3e1949ab, 0xe93c9268,
  213375. 0xcdee18f0, 0x08dc4cc0, 0xd4edbd5e, 0x73580d22, 0xc2b75be4,
  213376. 0x468cd7e8, 0x3d7f6ffa },
  213377. { 0xdffbd5d1, 0xea7b290c, 0x970338df, 0x9d759da6, 0x90feedc9,
  213378. 0x56680b08, 0x42dce68e, 0xbc690af5, 0xb2ae4d82, 0x8519df2b,
  213379. 0x7f195b60, 0x5612467f, 0xd83c21f4, 0x659a342c, 0x55651633,
  213380. 0x55771bf5, 0x548ba562, 0x5fc68935, 0x9492f23a, 0xb5419203,
  213381. 0x9c9c6017, 0x567528e3, 0x511e6019, 0x3f064ed4, 0x1d16a555,
  213382. 0x303f9eb9, 0x2254abee, 0x3e18c4fd, 0xfd434e7c, 0x40994d6f,
  213383. 0x6dde74e6, 0x8fb12d3f },
  213384. { 0x293cb7a4, 0x6c6381a2, 0xb87b7e4d, 0x453e09f0, 0x078ac3ef,
  213385. 0x4f212823, 0x578cae91, 0xe89ffad0, 0x716ba4dd, 0x4a2b696a,
  213386. 0xf6f580a0, 0x14681a14, 0x4c2f1307, 0x1358f97b, 0x2932fb89,
  213387. 0x87896996, 0x268a5af7, 0x29dd850a, 0xfe239f83, 0xaf771f6d,
  213388. 0x4f47499d, 0x5f20fd2e, 0x867ca0e9, 0x9b643e77, 0x375981ec,
  213389. 0xe7858ecd, 0x19ab1c97, 0xbe946a59, 0x06ff3453, 0x4f9303a2,
  213390. 0x75d237b1, 0x3fcc6731 },
  213391. { 0xdf21f920, 0x509debd5, 0xc1401b90, 0xfaf70e1f, 0x95a64aaf,
  213392. 0x2429cbfd, 0x2c37a122, 0xf2120855, 0x7deb926b, 0x1d4c93f4,
  213393. 0x9fb3f1dc, 0x12f3e4c0, 0x5b51bc46, 0x56085a59, 0xf10fdbd2,
  213394. 0x2a2f5d62, 0xdf0cb3c2, 0x60dd62cf, 0x6b0f254b, 0x154424a3,
  213395. 0x564612b7, 0xc3a5a05d, 0xa1f5249c, 0xbebe30cf, 0x7e62a188,
  213396. 0x24ec6903, 0xaf429939, 0x75f0fbac, 0xb3fa8685, 0xd41345dc,
  213397. 0xc7151c34, 0x645146fd },
  213398. { 0xba1924f9, 0xecec633a, 0x006326e1, 0xbba6f136, 0x7e50fc17,
  213399. 0x203757ac, 0xef3d8e00, 0xca531919, 0x51dc5a74, 0x9545a6aa,
  213400. 0xd31412b8, 0x6e21d58f, 0x7bb1d000, 0x01bc3005, 0x6ed1a9c3,
  213401. 0xf1789c69, 0x9858fa48, 0x7af2d35f, 0x8197be85, 0x434d09b9,
  213402. 0x29aa265d, 0x1dc07755, 0xc058fa80, 0xcad03be7, 0x54ba14ce,
  213403. 0x92d70a9f, 0x6c050a74, 0x6dc78505, 0x4d005dda, 0x2a7ca4a9,
  213404. 0xabfb9f2e, 0x448d3d72 },
  213405. { 0x29b33989, 0xdc56f145, 0xa9ae815a, 0x868351bc, 0x4b074414,
  213406. 0xb3f45613, 0x3cd9f33b, 0x955ce42a, 0x5ff6e4a3, 0x13ade4ec,
  213407. 0xa50eaa91, 0xd3aac715, 0x5666efdf, 0x0c61ec99, 0xf6a4470a,
  213408. 0x108a28b8, 0xe54844c9, 0x402ef584, 0xd0e2f337, 0xb825b162,
  213409. 0xb46f7cbc, 0x3dcd131f, 0x96f2fd89, 0x208178ec, 0x25928c78,
  213410. 0x4d8c5d67, 0x9963c459, 0x285a33df, 0xd92a309f, 0x72497175,
  213411. 0xcb7019a5, 0x76881479 },
  213412. { 0x91767eed, 0xba43a114, 0x92bf65db, 0x5e11b9ad, 0x03a5e21a,
  213413. 0xe8a22ce0, 0x2a335415, 0x63604421, 0x4a9ead62, 0xc2c563b4,
  213414. 0xa0b2aee5, 0x4bc06264, 0x8bf2e1d7, 0x75b8d575, 0xd08a265d,
  213415. 0x1cff0ee7, 0xb0b712a7, 0x17914e1d, 0x4b18692d, 0xc35925d0,
  213416. 0x56cce815, 0xde253f4c, 0x9fff0e3a, 0xa479241c, 0xddabed19,
  213417. 0x50b9d06e, 0x59fae506, 0x67135260, 0x532ce180, 0xf37600fb,
  213418. 0x5e5a8626, 0x670eb01c },
  213419. { 0x73cdbb43, 0xdf73c0af, 0x7f2431ad, 0xcf08ecc5, 0x2a1a3845,
  213420. 0x91780541, 0x9224ddf1, 0x69a104f2, 0xbeac7eff, 0x4352f38d,
  213421. 0x7c2d1322, 0xfc3b3b4e, 0xb5e4b476, 0xa69e9430, 0x975a46f0,
  213422. 0x7d932340, 0x5d64eece, 0x8093899e, 0xdb2345e9, 0x7b821250,
  213423. 0x7f4b796b, 0x23552932, 0x4bb90b1f, 0x2ee9cc15, 0x9112f7d6,
  213424. 0x1fa9c8f5, 0x1cbaae32, 0x2d0f2f98, 0x0075166a, 0xb77f0366,
  213425. 0x635dff27, 0x504852e7 },
  213426. { 0xa2f392fa, 0x2f0f3ce5, 0xec6c9078, 0x326c076a, 0x84baaaf6,
  213427. 0xad01de92, 0xcbe8e993, 0xb01b16d3, 0x2d950908, 0x71305c24,
  213428. 0x3853af38, 0xc66fd617, 0xd3c429a0, 0x7735140e, 0x1fabf027,
  213429. 0x8a31b12a, 0x058b3177, 0xa0530002, 0xa9c7deb9, 0xabffd9fc,
  213430. 0xe8667d30, 0xd05ef69b, 0xe9a9e13f, 0x2f3a7308, 0xb91eae9c,
  213431. 0x3f4c9a19, 0x618ce6c4, 0x50d0cee7, 0x5240f8b0, 0xfb24dc40,
  213432. 0xf7e90cc4, 0x992fe151 },
  213433. { 0x38f197aa, 0x4454db31, 0x87872f98, 0xa4ded69d, 0x44f0a828,
  213434. 0x97b427b0, 0xa31e48c6, 0x9821e1ae, 0xdd98efec, 0xe38cb09f,
  213435. 0x480cb3ae, 0x20b84fa8, 0x47475573, 0xba5bb4a8, 0xcd50e96b,
  213436. 0xa9be080a, 0xef103550, 0xc4451e9c, 0xc441325c, 0x626ee75f,
  213437. 0x38a5e33d, 0x6eea5e98, 0xa2b0abd2, 0x7321beb9, 0x9b6082a9,
  213438. 0xca92e484, 0x992bcc2a, 0x1dc8168a, 0x9c8eb9fb, 0x134ecf4b,
  213439. 0x4c5b71e0, 0x5a68bfa8 },
  213440. { 0xff0a2bfb, 0xb4ff3b45, 0x5502f8b0, 0xd105fff9, 0x5b1c0c26,
  213441. 0x14de5885, 0x0d3b9d04, 0xed16865b, 0x026d3917, 0x2f5a2453,
  213442. 0xf4db3c0e, 0x6a22f493, 0xe2418f2e, 0x4871548a, 0x509bef61,
  213443. 0x6ab363a8, 0xb8cbbbec, 0x91ca1e3a, 0x4011a396, 0x71e0dc98,
  213444. 0x0d5ca577, 0xff982e0a, 0x81897bc1, 0xeb40b045, 0x085ad5e7,
  213445. 0x4bc24a46, 0xa6337b7c, 0xd15c8fa0, 0xbef1628f, 0x56ce6ef7,
  213446. 0x9f5ef439, 0x78acfdf9 },
  213447. { 0xf8520189, 0x45bf7f15, 0xc77f61c4, 0x954202a0, 0xdfa22e1b,
  213448. 0x39edc6b9, 0x1f4a3487, 0xd2d60267, 0x4814cc52, 0xcd933929,
  213449. 0x05e9f123, 0xde76a124, 0xae36b6f7, 0xe2306ea0, 0xb83a58e0,
  213450. 0x53815218, 0xa041231a, 0x9862bb76, 0xbf31be71, 0xe8da253c,
  213451. 0x37de861f, 0x2dfc5332, 0x90ae4890, 0xf25c93f6, 0x8baa6ed2,
  213452. 0x66bcb8f0, 0x908b4a29, 0x6f10ae0f, 0xb061c949, 0x8cb4b48c,
  213453. 0xd075a366, 0x0ad92d73 },
  213454. { 0xc2ca548a, 0xbfb95fed, 0x80cd89ab, 0x4778c620, 0x3466c280,
  213455. 0xbe99154b, 0xd4be8902, 0xea3be093, 0x13e681ed, 0x847b7995,
  213456. 0x02f40161, 0xf22a8f4b, 0x4aeb7fe8, 0x3ef2cb4d, 0xb3aed5f6,
  213457. 0x9adc5151, 0x98c31163, 0xec1ccfd1, 0xa3d7d88f, 0xdc2ac17b,
  213458. 0x46421097, 0x08fa64d3, 0x94b90bcf, 0x5ebf80b7, 0x0b50a9eb,
  213459. 0x1b78b4ba, 0x279aa66b, 0x1a4fe934, 0x075b3ced, 0x8ef4dcaf,
  213460. 0x70a6e9ae, 0x95bbd8a0 },
  213461. { 0xe614bbd0, 0x59f92495, 0xb823e363, 0x7567a887, 0xfc1bd6a7,
  213462. 0xe247c9ec, 0x8e835c42, 0x2bfaaf47, 0xaade066a, 0x314ef4e0,
  213463. 0x5c16d336, 0x072baa63, 0xe2f0e389, 0xfa429c71, 0xbd07d90f,
  213464. 0xcac1e5d0, 0x514f5c04, 0x69ff35ea, 0xc0554ec1, 0x893053fc,
  213465. 0x2a35947f, 0xab1d86b7, 0x2aebe487, 0xe29fb060, 0xdfb9cf21,
  213466. 0xa0a10d6d, 0xf20dfcf5, 0xad147059, 0xb8867a2a, 0x480dc66f,
  213467. 0xc125a919, 0x375a884f },
  213468. { 0x1217f7ea, 0x178cbe2e, 0x875c6dab, 0x1a161e2a, 0x1bdb1a54,
  213469. 0xf7707ec0, 0xe4fd73ca, 0x678864a0, 0xd13a0d86, 0xbaebc664,
  213470. 0xc8d30668, 0x40325f99, 0x2f1c5950, 0xb93ed9c9, 0x541e0667,
  213471. 0xfdf36763, 0xb91a6763, 0xfd97fbb0, 0x6079c9a0, 0x26aa69ea,
  213472. 0x1eaa8c47, 0xc7303c80, 0xafa63c55, 0xdec75c81, 0x4fd12adb,
  213473. 0x01cdcde2, 0x1968838a, 0x9fe0dda7, 0x38415379, 0x66bb093b,
  213474. 0x08cb84ec, 0x268d818b },
  213475. { 0x41580555, 0x73dae358, 0x473d103b, 0x4fc32e67, 0xbeccc1ab,
  213476. 0x240c1013, 0xb24ee9de, 0xda4099f2, 0x9fa8e066, 0x37b0cb5b,
  213477. 0x6438d7ee, 0xb5ae04e4, 0x2b720140, 0x7f7d3164, 0x339e4a78,
  213478. 0x86ef4edb, 0x3a7d8375, 0xa5e77eed, 0xbd707c2e, 0x883fad37,
  213479. 0x0f979189, 0x816b633a, 0x2e7a208e, 0xe24c028a, 0x4435516a,
  213480. 0x1171fe3c, 0x4f5f2bf5, 0x3eb93b33, 0x01b53a56, 0x8419ed4b,
  213481. 0x056ca44b, 0x8b02735c },
  213482. { 0xe1019195, 0xb89bb464, 0xf3fc28c1, 0x1de4c026, 0x2bfc3b21,
  213483. 0xac120e6e, 0x91bdf92f, 0xec71bc5a, 0x0d995bc9, 0x485d7ab4,
  213484. 0xe6491ffe, 0x97c6768e, 0xafbce265, 0xd9552d19, 0x8e1b76c2,
  213485. 0xbae6c7fe, 0xd7e3ad1b, 0x167d8281, 0x5e989734, 0x3e149af9,
  213486. 0x8a0c8182, 0xd1f0024c, 0xc3006c0d, 0xf571ffdb, 0x58773d4c,
  213487. 0xb32ecf7e, 0xfd3540d8, 0x5822a782, 0x04365042, 0x5ab45c3f,
  213488. 0x4b4d85fe, 0x400e3aa0 },
  213489. { 0x5e46e4a2, 0x47321649, 0x24136074, 0x37a2ed64, 0xc60ec77d,
  213490. 0x659223b1, 0xe5e0ac2e, 0x5e13aac3, 0xc5107ab7, 0xda17c41b,
  213491. 0x73c253db, 0x65b22ec9, 0xa5012296, 0xff3867b8, 0x0621a99b,
  213492. 0xfed660d5, 0xc89fc3f5, 0xa3c28506, 0xf16451a7, 0x3ed350b9,
  213493. 0x67cb586f, 0x27c3e032, 0x967185b1, 0xc807c779, 0x4a13009b,
  213494. 0x09c157d4, 0xadaf1f4d, 0x362f7647, 0xf3a6a198, 0x4a42b9ac,
  213495. 0x8da6e039, 0x131c3da2 },
  213496. { 0xa7da83ba, 0x4a785ff1, 0xd04f4436, 0xf415b425, 0xec03f812,
  213497. 0x7c0899bd, 0x80f5f4a2, 0xc58d411a, 0xfda251b9, 0x3d32d610,
  213498. 0xcd3b2f32, 0x99bb4504, 0xf4c2083c, 0x198c444b, 0x730e83fd,
  213499. 0x60c261af, 0xcb02db90, 0x060ca4df, 0x9df1e7c8, 0x0ff7838b,
  213500. 0xc4c690c9, 0x6b79cf97, 0x5d75f154, 0x131514d7, 0x1cb0e8ff,
  213501. 0xa7c074f1, 0xb2c17615, 0xb920aac1, 0x44aa0ff0, 0xde8098ad,
  213502. 0x34545ce9, 0x71d1a46a },
  213503. { 0xfa1b382e, 0x76178f76, 0x772dda0d, 0xa0d8ecc3, 0xc5d4d130,
  213504. 0xaa5aab2a, 0x8d72622c, 0x27d38ba4, 0xca3bed06, 0xc5410db6,
  213505. 0x793ceccf, 0xf637a588, 0x6e65e3d7, 0x1f65dafd, 0x60a45641,
  213506. 0xc3b44a85, 0x4f78540b, 0x0f47b3a8, 0x5e4d60f6, 0x824fdadd,
  213507. 0x17d3b6d5, 0xd8ccf90c, 0x325fc13a, 0x008eabdf, 0x3648fab9,
  213508. 0x3e90d716, 0x24c52d4b, 0x3964ff3a, 0x533d0acb, 0xb95cc416,
  213509. 0x1167f521, 0x6cd2699f },
  213510. { 0x12f4f3ac, 0x2d8c0b3b, 0x99d1bdfb, 0xb03dcfe2, 0x30f37326,
  213511. 0x540034f8, 0x7c5a8c82, 0x22dd6893, 0xcd8f1442, 0xeb7093d0,
  213512. 0x585742f2, 0x892795a7, 0x087adadd, 0xe15f282c, 0x16ab7b5e,
  213513. 0x7bbdc749, 0xa58acbb4, 0xd30fe40b, 0xe2bac39b, 0x0de417eb,
  213514. 0xc61a04bc, 0x4b4b19a6, 0xf2735569, 0x9338c34d, 0x30ab196f,
  213515. 0xe8f03742, 0x6c88c965, 0xfa2efcb8, 0xc7eeb826, 0x19eee274,
  213516. 0xda345dc2, 0x327c063f },
  213517. { 0x5b47cd53, 0xab399eff, 0x1943aefe, 0xbbe9869d, 0x1402a866,
  213518. 0xe64ecc7b, 0xb1c25a16, 0xc3e7c2aa, 0x022de271, 0xc4216b79,
  213519. 0x366d6a5f, 0xe58dfcc8, 0xda813336, 0xd159509e, 0x130bfb7c,
  213520. 0x370400f2, 0x93b48780, 0x1be4e059, 0x39f3cd22, 0x0623a1fe,
  213521. 0xeecb4f87, 0x72aa22b2, 0x6c27b83b, 0x1af4c496, 0xda5fa5bf,
  213522. 0x7a42a94b, 0x48b01af2, 0x9afba822, 0x3670112c, 0xeb6b9d2a,
  213523. 0xc0df6856, 0x020f19d1 },
  213524. { 0xa4dbba20, 0x37051a86, 0xdb1de5c5, 0xb618ebc6, 0xe6525840,
  213525. 0x9a780a19, 0xd2bccc4d, 0x9440302d, 0x10285a24, 0xe9ff023d,
  213526. 0x3a486268, 0x3b937ee3, 0x4cd61147, 0xe37ee2f2, 0xa3d057cf,
  213527. 0x79fbbfd3, 0xccddefce, 0x5fba16d3, 0x5b231727, 0x916058ec,
  213528. 0x720c3adb, 0x47699ebe, 0x8b4f6bba, 0x26274386, 0xf18a0770,
  213529. 0x54b0092a, 0xacca1160, 0x99d090eb, 0x0c888f60, 0xf757e1ff,
  213530. 0xb0050544, 0x79e72720 },
  213531. { 0x2820a239, 0x632acf25, 0xaae6b310, 0xb1a3974e, 0x48c0a1df,
  213532. 0xd61fd6ba, 0x5a3ee7aa, 0xd2453c39, 0xb980446d, 0x548455a0,
  213533. 0xde16676f, 0x9f29d97b, 0x789375a1, 0xf252ca0c, 0x7743a985,
  213534. 0xe961af3e, 0x66cdbd8d, 0x70c79c56, 0xcbc538f9, 0x14a3854e,
  213535. 0xa126851c, 0x58daa73a, 0x2a9f558c, 0xe9b5bb45, 0xfbd15e05,
  213536. 0x37af7f83, 0x38a1939d, 0xa4487927, 0x9511a056, 0xe428b2b5,
  213537. 0x7015846d, 0x001d3ce3 },
  213538. { 0xe145b1d7, 0xd6be36b9, 0x009c5664, 0xf3e3938a, 0xe7c0f6db,
  213539. 0x2e562e7d, 0xc343f539, 0x951044e6, 0xd90897b1, 0xa5ab62b8,
  213540. 0x512f797c, 0xb1a1f70b, 0x750f28e4, 0x91cdd754, 0xffb8165d,
  213541. 0xb4c80e2f, 0x594d02b3, 0x65ed39c7, 0x56833edc, 0xcc12a49d,
  213542. 0xf3693a18, 0xe73694bc, 0xfcd2c404, 0x34cc134a, 0x11d40194,
  213543. 0x071bd5fc, 0xfc585e46, 0x05759047, 0x790b7a04, 0xb3280360,
  213544. 0x40afc684, 0x4bb8c6fc },
  213545. { 0xfd0f8796, 0x3120e2dd, 0xb133c9de, 0x6968a40d, 0xa9369c6e,
  213546. 0xfea366c0, 0x6007273b, 0x37e5b6d6, 0x8cb81439, 0x39e4ecf0,
  213547. 0x9febc005, 0x487fe9cd, 0x0199b53c, 0xeb8af444, 0x293519eb,
  213548. 0x2f124e3b, 0xc82c9c16, 0x860c218a, 0x709dc590, 0xacd1d6f2,
  213549. 0x36d50529, 0x5696d545, 0x59120bfc, 0xc03f5df9, 0x10ffa690,
  213550. 0x99a3e88d, 0x6c432827, 0xd4f9cfa5, 0x9a135d89, 0x2e8fea9e,
  213551. 0xb6a77e78, 0x3699a881 },
  213552. { 0x1eb1c64d, 0x5bca3372, 0xf1d28154, 0xe9cf3a2d, 0x6537106f,
  213553. 0xb7e2e9b3, 0x4f7cbf4d, 0x06c17151, 0x2058b37f, 0xcbde416e,
  213554. 0x8834e9c5, 0x82c53a7e, 0xe9ac3a75, 0x94dbdfe2, 0xc5e67c02,
  213555. 0x795ec6cb, 0x1426a80d, 0x8c23c25f, 0x6a8d4f9f, 0xee2cd20d,
  213556. 0xd3b7c235, 0x838daa54, 0x3d7a4d52, 0xb9e08ec0, 0x781cb473,
  213557. 0xca9475e9, 0x5ec31caa, 0x7271f39e, 0x82535187, 0x1df08e9f,
  213558. 0x208aff8b, 0x4f3a4b03 },
  213559. { 0x1ed095f8, 0x0f7b8107, 0xda226d4e, 0x23e37fa6, 0xafb36d1d,
  213560. 0x8b0f9852, 0x07d8e311, 0xb114634e, 0xe3e0f16e, 0xb9634a97,
  213561. 0x421eec37, 0x2454bb9c, 0xd72b21c1, 0xb4ecd5db, 0x6df20d7c,
  213562. 0xf9603868, 0xdf86e0a2, 0x9f5359fd, 0x5ac488aa, 0xc43d54fa,
  213563. 0xd1049df4, 0x56d714ab, 0xb020607a, 0x13152b3e, 0x7a02325e,
  213564. 0x49be1c18, 0x52ae84db, 0x44f24f4a, 0x0b5a7b80, 0x9e525c03,
  213565. 0xa6d179fd, 0x6d874446 },
  213566. { 0xbe9a42f5, 0xd29d07aa, 0x3781ccc8, 0x1fd5316c, 0x9dc69ea1,
  213567. 0x71a75a6d, 0x88fee91a, 0x4e19e0df, 0xf8d44f12, 0x99c2b4dc,
  213568. 0x31ae94e4, 0x05f6df92, 0xcf28ccc2, 0x27fba876, 0xf57f7ceb,
  213569. 0x6e1a0f01, 0xf3fd3b74, 0xe03f1f34, 0x42c1d213, 0xa0edc4a7,
  213570. 0x7deb8580, 0x5caac270, 0xaf0848bc, 0x0f5d791f, 0x07ac759d,
  213571. 0x17f514ad, 0x904fc531, 0x95a39734, 0x7bb70f3d, 0x95a4aca9,
  213572. 0xff9c5609, 0x3cf384c9 },
  213573. { 0xce1fc9e3, 0x700506ba, 0x676b0399, 0x49721742, 0xe72bf7b3,
  213574. 0x2b4a1b8d, 0x79b209f7, 0xca8602a8, 0xce26a8e1, 0x90580b90,
  213575. 0xfe24f39a, 0x1ef339b7, 0x629362e1, 0xb6c5d991, 0x577b24f4,
  213576. 0x51174e1a, 0x05e451e9, 0xf380fcb5, 0x148321bd, 0xf4d97afb,
  213577. 0x747e5d2a, 0x099806bb, 0xbe99a608, 0x85525d65, 0xd455e820,
  213578. 0x264828d9, 0xd8560a65, 0x8c8c5405, 0x71030770, 0x3c67e73c,
  213579. 0xee73df26, 0x2b248850 },
  213580. { 0x8541159f, 0x2173cde6, 0x4fb410b2, 0x78224c18, 0x1f2ca1c7,
  213581. 0x07a28619, 0xa8b23e40, 0x52c207d6, 0xa6b2344a, 0x071a0210,
  213582. 0xb5ed2945, 0xdb0e587c, 0x810fcc6c, 0x6c56b8ef, 0x62d843b9,
  213583. 0x1248c58f, 0x74c66975, 0x4b90363d, 0xe66c66f6, 0x6348f7f2,
  213584. 0xc126bcbe, 0xb2f9d441, 0x73ce49e8, 0xac07f2a3, 0xe81b0df0,
  213585. 0x52486758, 0x1d4621d1, 0xa108b54d, 0x74414a1c, 0x17261ece,
  213586. 0x6a3ac215, 0x938b3bcc },
  213587. { 0xe4ded340, 0xa9e4a16b, 0x80e88036, 0x8e65fb2a, 0xdcd73acb,
  213588. 0x97089606, 0xaaa657a9, 0x1c3a0434, 0x49101b06, 0xf304fc58,
  213589. 0xda0bb64c, 0xe60fb61a, 0xf5542df5, 0x818c2aec, 0x56f76d5f,
  213590. 0x74020576, 0x92533d97, 0xb566b790, 0x74d6eb5f, 0xae4655e5,
  213591. 0xa55b44b7, 0x60f7a1b5, 0x93747ea5, 0x7970179b, 0xf2dace56,
  213592. 0x8ae7e0e8, 0x84e83c06, 0x98474607, 0x15307341, 0x24e8c9ed,
  213593. 0xd9e89d6b, 0x6cff58a5 },
  213594. { 0x03e51f68, 0x508c01b0, 0x1d2fe7d6, 0xe1d1f225, 0x09bd8805,
  213595. 0xf7998d0b, 0x03e415b7, 0x255e907a, 0x607d9798, 0xd148467d,
  213596. 0x9b453896, 0x055c3b1e, 0x809f50f4, 0x35001013, 0xd0233fdc,
  213597. 0xfbbb2fa6, 0xff1820b8, 0x0b680b0a, 0x38d317e0, 0xb1d404dc,
  213598. 0xccc8c7df, 0x133d5444, 0x6ec13f84, 0x7fa847e6, 0x046e2e48,
  213599. 0xc33f83d8, 0x4863b3ac, 0x3c627fc5, 0xeb936af7, 0x5f67f8aa,
  213600. 0x31b79327, 0x5fe4ac8f },
  213601. { 0x8b6f401e, 0x581aa4bf, 0xad5c7ed4, 0x05db12a3, 0x6fb07b4a,
  213602. 0x7b018726, 0x9c22bcd4, 0xfdd11f04, 0x69371c95, 0x5454a7d4,
  213603. 0x99a46eaf, 0x066c55fb, 0x7fef96d0, 0x18637c7c, 0x6b83e95c,
  213604. 0xbafc1d34, 0x00bb42dc, 0x55c38593, 0x34e7e712, 0xdd8dec2b,
  213605. 0xb184cee8, 0x69c9cfb0, 0x49a27864, 0x8dcc0c42, 0x2010f2e7,
  213606. 0x290d95f2, 0x6977a420, 0x86e254c9, 0xeb2abdad, 0x20931c89,
  213607. 0x121c0548, 0x81377164 },
  213608. { 0x9c5a8edf, 0x6266b25e, 0x1078a7ad, 0x6e1388c2, 0x4876eedf,
  213609. 0x5f02737d, 0x62744617, 0x242fa7f9, 0xb385382a, 0x3e2cfbd9,
  213610. 0x02f71bef, 0xbadad7b1, 0x677d0a92, 0x562abcfa, 0x51fdff34,
  213611. 0x573ebd17, 0x7c250c78, 0xd7f65852, 0xc47ca896, 0xe0cf16ee,
  213612. 0x67622c9e, 0x8ccd79b0, 0xf8f2c075, 0x31fc5882, 0xa6008515,
  213613. 0x9232b37e, 0x82e8c5ba, 0x4d7bb361, 0xd2f146fe, 0xbf24735c,
  213614. 0x9cd2db98, 0x79c280ee },
  213615. { 0xf2b48122, 0xbdcc8203, 0xb04ac48e, 0xa8c04916, 0x9fc4885e,
  213616. 0xacf064dc, 0x82c1001c, 0xab838997, 0x676de250, 0x7339e721,
  213617. 0x8e1ab820, 0x17aa5aea, 0x6bc14b2e, 0x24d28ca0, 0x816b6230,
  213618. 0x570c5bb7, 0xcee6b606, 0x6c51235c, 0x183eae42, 0x1b2bf89f,
  213619. 0x9c66274b, 0x3e3af3c6, 0xb51e38bc, 0xe0b04426, 0x73e40e3b,
  213620. 0x26dbc58e, 0xb5be5be4, 0x3f9dd578, 0x52c8f408, 0x9fd9f791,
  213621. 0xa9e3ff4f, 0x758073a4 },
  213622. { 0x8691ca22, 0x7d27b057, 0x13a2a1b6, 0xf206bfd6, 0xac795413,
  213623. 0xe84bd385, 0x75536607, 0xc5d18a2a, 0xc8a0e24c, 0x2e166de7,
  213624. 0x3c474dbd, 0x56d5750c, 0x1366843a, 0xdef444c1, 0xcf4b8432,
  213625. 0x14646e53, 0xa9fd9783, 0x4bc0d030, 0x297ee203, 0xbda4c824,
  213626. 0xfd7be6c7, 0x3d0b10bf, 0x08c7f3ff, 0x2d216476, 0xb4fd4c45,
  213627. 0x06e52599, 0x49e9e104, 0xfbab9fa1, 0x8661d32d, 0x9342a7fa,
  213628. 0xfaf66aa8, 0x3f3e3458 },
  213629. { 0x951597aa, 0x51ec35af, 0x49df64eb, 0xb677d4ac, 0x9bf4eff5,
  213630. 0x0276cd9c, 0x515a2935, 0x423eca49, 0xfd9bb9c3, 0x8a696553,
  213631. 0xede1f09c, 0xf99ee9df, 0x199e5f98, 0xb8fa2956, 0x35292c32,
  213632. 0xb7638758, 0xfc40e81b, 0x8734eddc, 0x65457d95, 0xd82d5e9f,
  213633. 0x30c78d2b, 0xc8ee323e, 0xc1433d67, 0xe77b2e4c, 0x3c8314ae,
  213634. 0x56d9f807, 0x2a0e2f63, 0x441eede2, 0x6c48295e, 0x1e9e17ed,
  213635. 0x34c294ef, 0x640d20c4 },
  213636. { 0x3284d513, 0x4e9a0b8e, 0xf315053a, 0x074c3545, 0x45acd52a,
  213637. 0xb36e7407, 0x1de50db7, 0xd80bdcfc, 0x2549fc46, 0x8d9d47dc,
  213638. 0x303f07a8, 0x29b6ef13, 0x6d4ad4c2, 0x4e461aca, 0xfc9f1b73,
  213639. 0xca8e351d, 0x57460e65, 0x8bc4094d, 0x0f32d367, 0xb6302b33,
  213640. 0x285742e8, 0x69a074b6, 0x876c29c3, 0xdfe52b11, 0x912bd17a,
  213641. 0xf39e4609, 0x349aa639, 0x8ee40d66, 0xc72e05c1, 0xb968902a,
  213642. 0xc0d92816, 0x0f9c1ca8 },
  213643. { 0x67433df3, 0x1ebbaab3, 0x15d3628c, 0xb6aa5347, 0x97f0c5cc,
  213644. 0x13a320d8, 0x65e408f9, 0x72c918cb, 0xd5373451, 0x4b638854,
  213645. 0x0b4dca09, 0x731399a3, 0x0a3b1326, 0xcf256730, 0x6608b388,
  213646. 0x5ea60dfa, 0x7b290dfd, 0x58ad74b0, 0xd7694f9b, 0x83202789,
  213647. 0xb6630fb1, 0x48593db8, 0xc65e3eaf, 0x3db47f70, 0x3e7263f8,
  213648. 0x63949c91, 0xe6e6ff33, 0x9b9acec6, 0x098a8240, 0x34bd9ba7,
  213649. 0x45d36ec5, 0x7e31c12f },
  213650. { 0x0dfd2dd7, 0xbe281d68, 0x24ab61d8, 0x1efacb00, 0x94431f97,
  213651. 0xb9c3005f, 0x959cb3bc, 0x660c8dfa, 0xcffbb406, 0xfdd5fc30,
  213652. 0x7969a10d, 0x7a4631be, 0xde13fd1b, 0x336e309e, 0xfc947076,
  213653. 0x76b3bfad, 0xdcc72223, 0xfa91925d, 0x156c4ee1, 0x741f0d73,
  213654. 0x0e2b3747, 0x4f64ee41, 0xefc4d93c, 0x86be92d3, 0xfc4fbb2e,
  213655. 0xc53b7e03, 0x337ca1bb, 0xac196cf5, 0x7e23ba60, 0x4de41a30,
  213656. 0x326d5357, 0x1a219c45 },
  213657. { 0xaa4db0bc, 0xfdcf7ef8, 0x7b6c9963, 0x2e231806, 0x3d8a192f,
  213658. 0xc2639067, 0xffdc7771, 0xc0cec2e2, 0xa2fc0edb, 0x997c8e35,
  213659. 0x82cc6043, 0x78e10ec1, 0x2b0c8120, 0xfd0de2cb, 0x69e57f8e,
  213660. 0x4d6c457f, 0x5b53f1c3, 0x953e69b2, 0xc4f89cb8, 0x422a330a,
  213661. 0x95566be6, 0x92ff2329, 0x437442d1, 0x73cd502d, 0xbea69403,
  213662. 0xf04ce590, 0xf8030662, 0x6ac1537e, 0xb6d0bf93, 0xe02bcf77,
  213663. 0xbc90192f, 0x17aaa999 },
  213664. { 0x8e55db2e, 0x0d3d5643, 0x3b946851, 0x835dee43, 0x5b88462f,
  213665. 0x1a1440e5, 0xea17e27c, 0xa6ff3b35, 0xdd95f7a9, 0x23f99c36,
  213666. 0xbdd672cf, 0x7217fdd9, 0xdd2045c0, 0xf400ac1e, 0x4ff06b25,
  213667. 0x94b55c87, 0x0e4a49be, 0x0a44a0e5, 0xb43b6813, 0xe8925e91,
  213668. 0x214f96c5, 0x78bedde1, 0x0f97fa97, 0x0f456a4c, 0xa5bfd267,
  213669. 0xa28fd86b, 0xbe7608ef, 0x3b4b2d8f, 0x226474bc, 0xfbd5ff8c,
  213670. 0xa5f3b24a, 0x6b282af0 },
  213671. { 0x6341a595, 0x78fc025f, 0xa445e28c, 0x591c38d6, 0xeb446842,
  213672. 0x72bd6e3d, 0x75547833, 0x3f9466d3, 0x083e16c4, 0x911414d3,
  213673. 0x95a7acb4, 0x145d9466, 0x8fd2fb64, 0x102ddf09, 0x0bfd87b1,
  213674. 0x2a2b2d2d, 0x59455088, 0x69e9be5c, 0xa80245de, 0xee378bf4,
  213675. 0xb2306b0e, 0x80b0bd68, 0xc2be9f3d, 0x76a545c6, 0x4802c245,
  213676. 0x429d167b, 0x2b412dfb, 0x13e64427, 0xee8d9762, 0xb664f529,
  213677. 0x54706ebf, 0x6d4f5d23 },
  213678. { 0x00ba9f88, 0x35c8f2b6, 0x7bb6d0bf, 0xfdc807e0, 0xb3b81e5b,
  213679. 0x0a126d42, 0xa7ac781e, 0x335ce6ce, 0xf37dcba6, 0x3e308e6f,
  213680. 0x63c96487, 0x028dca62, 0x8818434d, 0x72eba57e, 0x79b78a26,
  213681. 0xa9e3d59f, 0x2f07aea3, 0xd2f0a7dd, 0x24d05f74, 0xe0fe4678,
  213682. 0x0116deb6, 0xb2085170, 0x58f37580, 0x9c2a5e92, 0x74070bb3,
  213683. 0xe78bd7a5, 0xb9977d90, 0x551fc872, 0x40db81b4, 0x6eda93c4,
  213684. 0xd65d34ad, 0x4aaf0b4f },
  213685. { 0x3514c7af, 0x9bef2506, 0xbc181ead, 0xb09e7dad, 0x8fa3ec58,
  213686. 0xef3cae87, 0x173b8685, 0xd8dbfab5, 0x921d32dd, 0xb2490fc0,
  213687. 0x8bd9c466, 0x4eef386b, 0xa061dbdb, 0xc1cdd52f, 0x25bc04db,
  213688. 0x64de989a, 0x85728636, 0x06f9836b, 0x8be44aa0, 0x11a5a804,
  213689. 0x097018c7, 0x16dede4e, 0xb2c11fb1, 0x72aec577, 0xa721ecd9,
  213690. 0x144dade1, 0xd6ebf3a9, 0xf99c526b, 0x1c2e14d7, 0xa1d4165b,
  213691. 0x82bc6337, 0x8b2cbd39 },
  213692. { 0x8a52e991, 0x28ec1bf2, 0xcf9d42ec, 0x0ba202f6, 0xc634ea45,
  213693. 0x8307d130, 0xc5762b9c, 0x3fc257b3, 0x487c2a2d, 0xbd3298d1,
  213694. 0xa319488a, 0xca14f1a7, 0x06ba06d2, 0xc70ca93b, 0xee405e89,
  213695. 0x9aa3f4b3, 0x35deeae7, 0xcc64eeb3, 0x03bf1d4c, 0xd155f578,
  213696. 0x45616bfd, 0x041ec0b5, 0x086e33f6, 0x23df80e6, 0xf0243cf5,
  213697. 0x399a79c8, 0x874ccd58, 0x86c2824e, 0x8fc5c831, 0x220eeaec,
  213698. 0x7dbe3670, 0x57e28304 },
  213699. { 0xfbcdf666, 0x6e60b698, 0x8bebb1d2, 0xbdd06a99, 0x80498436,
  213700. 0x4044adba, 0x522bc88d, 0xd76bf75e, 0x28423b20, 0x655c4b9b,
  213701. 0x53398a72, 0x65c0f492, 0x0ca37601, 0x76d4f2b7, 0x2030fa5a,
  213702. 0x46989925, 0xb6054705, 0x96b37e87, 0x53de1b2f, 0xef96f731,
  213703. 0xad54ef05, 0x5ecbbc8c, 0xa93617b0, 0xeb289d0a, 0x7cba217d,
  213704. 0x3ac0fbd5, 0x19d4a2d7, 0xd0d3cb56, 0xc91d6063, 0xe8bee9d4,
  213705. 0x696ffda6, 0x4f12e037 },
  213706. { 0x15f1a610, 0x4ccfa422, 0x3786519a, 0x804a5c55, 0x73838134,
  213707. 0x1246a454, 0x4b284e2a, 0xfa15b484, 0x146d1320, 0x36464c65,
  213708. 0x70a8a0fa, 0xfb6ba88c, 0x93c4804e, 0x74e7cee7, 0xb95ae16a,
  213709. 0x8c34d22c, 0xf9c1d4dd, 0x9d9ed89f, 0x32025371, 0x61a0866d,
  213710. 0x9bd6444a, 0x45b232b2, 0xf277bab1, 0xf888e92c, 0xa9448b02,
  213711. 0x73e69c6e, 0x5b521ecb, 0x1a496ea9, 0x5858afb2, 0xa8f78ea7,
  213712. 0xb1266f91, 0x83d2333e },
  213713. { 0x67b478d7, 0x1c633288, 0x50a2fc9c, 0xa1ee1ae1, 0x18d2241b,
  213714. 0x05b6ab30, 0x893cd696, 0x69f1f288, 0xa8117a87, 0x159d6660,
  213715. 0x70e73d77, 0xe8120119, 0x93f55f0a, 0x528fef00, 0xd854dfb2,
  213716. 0xb3978db8, 0xf45d9fbb, 0xd6b43ef6, 0xd5bee397, 0x17de4bfe,
  213717. 0x6bf76dad, 0xa01e0f59, 0x3d40754c, 0x28b2280e, 0xf8e86ef3,
  213718. 0x8edb6122, 0xb7d1e586, 0x8226b6af, 0x2f40a55b, 0x46353215,
  213719. 0xc5a31621, 0x7362f13e },
  213720. { 0x73c0c430, 0x792eb27c, 0xa51c3657, 0x8cc0a65f, 0xd2194f1b,
  213721. 0x50a5cece, 0x814b4947, 0x18945688, 0x4b6fbbf4, 0xbbf0a81a,
  213722. 0xf0aa8608, 0x376f4f58, 0x3987795e, 0xd9361d68, 0xe3a8d0d5,
  213723. 0xb6510cd8, 0xb6c1a455, 0x63e2fdbf, 0xaec891f9, 0x2c91154e,
  213724. 0xff568f64, 0x0eb1e715, 0x2f2b399e, 0xe7af9cd7, 0x89f0bf0b,
  213725. 0x1fc39bac, 0x90983695, 0xf0861d92, 0xda0a20a8, 0xd9b16f02,
  213726. 0xa38c0ead, 0x2f10693f },
  213727. { 0x0c06ded2, 0x07a6ce91, 0x2fd9087b, 0xf974842f, 0xa9f635a6,
  213728. 0xe468bfd6, 0x1ed60626, 0x04b61891, 0x369ee548, 0x1fb2f89f,
  213729. 0xdc96a201, 0x9cbd1113, 0x10d633ac, 0x6759acfe, 0x8faa629e,
  213730. 0x64ba66fc, 0x47f38283, 0xa686ae49, 0xd59cda99, 0x828c3a05,
  213731. 0x08ea2f6e, 0x7c7afb14, 0xaf3953c8, 0x2551c8e4, 0x9daa9e4f,
  213732. 0x5b53d279, 0xad6f1940, 0x1eff68d4, 0x96437cdb, 0x2775dbdd,
  213733. 0x4fe7a043, 0x985f83e4 },
  213734. { 0xeaf45294, 0x89603c16, 0xc24b5751, 0x70131160, 0x39d6b52d,
  213735. 0x4c112018, 0xed943340, 0x7079cf02, 0x74f41b68, 0x0c5b028b,
  213736. 0x9c8ac1e1, 0x3dc3f076, 0xf8b24f0e, 0x5ac5eea3, 0xe34c5c22,
  213737. 0xee6684ba, 0x9abc452a, 0xa5259e63, 0xe9df45cc, 0xb07d2cd1,
  213738. 0x1a443cfa, 0x07019c93, 0x92c003b3, 0x68fddaa9, 0x0d8cbc2e,
  213739. 0x2d9f179c, 0x1e781ca7, 0xbbf15a6f, 0x50dcc799, 0x54d779d5,
  213740. 0x0fe962f1, 0x0c88e540 },
  213741. { 0xe8f44357, 0x84f71a6a, 0x3a3cab6a, 0xf75b4bf6, 0x5aebc680,
  213742. 0x334c9d9e, 0x8a753ef2, 0xcecaf084, 0x075e3c8e, 0xe28014c1,
  213743. 0xf74f8d3a, 0xbb9d5a38, 0xb80e32ae, 0x75988464, 0xf2bc3792,
  213744. 0x7b328e6f, 0xeed0e197, 0xebbb1faf, 0x5a33065a, 0x674eac95,
  213745. 0x922dbce8, 0x8c19fd8f, 0x987b907a, 0x8c17ae85, 0x3b3a2cd7,
  213746. 0x89f33627, 0xfa87772f, 0xebaea019, 0x3a25ced6, 0x4e5de499,
  213747. 0xaf110715, 0x8e2560b8 },
  213748. { 0x3141aba6, 0x56d3746c, 0xbab2cf9e, 0x45a1079f, 0x9cdd27c7,
  213749. 0xb6382831, 0x9dfd950e, 0x22237632, 0x3a9408ff, 0x1e0b15cd,
  213750. 0xb1160118, 0x49a80200, 0xa383bba7, 0x2719db5d, 0x651046d5,
  213751. 0x6078340a, 0x97523b1f, 0x8929d4de, 0x8e0a28ab, 0x4040345c,
  213752. 0x0adf09c7, 0x61275ac2, 0x2331d611, 0xb41ab265, 0x5391ca50,
  213753. 0x230cc77c, 0x8f922315, 0x88be0c92, 0x92fd9a29, 0xfef3d92b,
  213754. 0x8324f2e5, 0x59005f22 },
  213755. { 0x3c4c1c74, 0x6bb1750c, 0xe966fb79, 0xbe73aac0, 0x66c5973f,
  213756. 0x85a75d92, 0x3a8656b6, 0x8c97f932, 0x50446cde, 0x2b7043b1,
  213757. 0x3ff3897f, 0x548916f7, 0xb18b72b2, 0x913dd01c, 0x488c0de6,
  213758. 0xd0a751f1, 0x8558ca58, 0x19175714, 0x44a663da, 0x97714301,
  213759. 0xb0e08618, 0x2df190ac, 0xf39ead9c, 0x0080fc0c, 0x17382da1,
  213760. 0x0085ac6e, 0x3262a338, 0xe9791851, 0xb43bae8d, 0xe4495936,
  213761. 0xd783df6e, 0x57a78e26 },
  213762. { 0x40dbddd8, 0x161b346f, 0x9410c3ac, 0x2b49a927, 0x1886cf3b,
  213763. 0x8c542783, 0x33b93deb, 0x72df3232, 0x40df579d, 0x9c8d59f5,
  213764. 0xc20ef500, 0xe5d7a67d, 0x67f08643, 0xc46b3918, 0xad96adc3,
  213765. 0xecfa2445, 0x0c4544d0, 0x658f589b, 0xe08417d7, 0xe6ec9301,
  213766. 0xc454e288, 0x6ca5ef6a, 0xac0f462d, 0x4191048f, 0x08d8a036,
  213767. 0x852407d8, 0xf6d35b7e, 0xb4c533a7, 0x8f6ada87, 0x3251e412,
  213768. 0x81c472e8, 0x1ca370c5 },
  213769. { 0xa801b68a, 0x94bd5171, 0xfd1998b3, 0x7312879c, 0x41163202,
  213770. 0x4905aabf, 0xf5b01fdb, 0xb5fe87f4, 0x9cda128b, 0x78de523a,
  213771. 0xc7bd31f7, 0x0bf161a1, 0x23904c35, 0xb5decfd0, 0xe188f12d,
  213772. 0x224b2882, 0xf99dae74, 0x0dd2801d, 0x08cd1cd2, 0xcad467b5,
  213773. 0xc0867e39, 0x6c311c3d, 0x2b425072, 0x71a11720, 0x2efd9003,
  213774. 0x83bf464e, 0x1dbd3b03, 0x53d0448a, 0xe6265baa, 0x32db52f4,
  213775. 0x4c33ac79, 0x2584b34c },
  213776. { 0x2aeec688, 0x3cb86389, 0x45fbe523, 0xa5e740ba, 0xfd60b5f8,
  213777. 0x422e71f7, 0x4874913d, 0x455d185c, 0xfa17d80d, 0x04c2bb36,
  213778. 0xac054524, 0x3f271854, 0xa8b9a657, 0x76dd3045, 0x62ee7cc8,
  213779. 0x2e42c3e1, 0x4df6c7d0, 0x00266706, 0xdc7cb488, 0x5927dd51,
  213780. 0x187897e0, 0x6b3faabe, 0xf2d5737c, 0xfe6ad22e, 0xff51a9ff,
  213781. 0xafb60269, 0x69807baa, 0xe1c83545, 0x951ca49a, 0xacddb6ff,
  213782. 0x3f9ab085, 0x7e811374 },
  213783. { 0x830a88b1, 0xad722a8b, 0xce1117e1, 0x91918ea8, 0x0409b47d,
  213784. 0x3e02d0b8, 0x6c46d1d3, 0xb53812d3, 0xe589669c, 0x2fd09db0,
  213785. 0x15b0cd5e, 0x9845cd06, 0x2386c453, 0x0c1c155a, 0xf5ff43cb,
  213786. 0xda774de5, 0xe391c0cd, 0xbb076b98, 0x5004f286, 0x97d71eff,
  213787. 0xaeec0bfe, 0x23e0b46c, 0x32a1ad94, 0xe4538667, 0x396da422,
  213788. 0xfe0c9f81, 0x63db2bfe, 0x6376c1a2, 0xba56fa91, 0x001c7918,
  213789. 0xdf8485a6, 0x436b8c64 },
  213790. { 0x8ab764bc, 0x88117e9d, 0xa077df84, 0xdfa61e94, 0x0c18eebd,
  213791. 0x5a7765d3, 0xfc9451dc, 0x548916af, 0x071a347a, 0x01a52e33,
  213792. 0xb23b41df, 0x633b95de, 0x43c8c286, 0xdd7d68c9, 0x18d97068,
  213793. 0xe4f9d41e, 0x8c92799d, 0x79908b90, 0xd47394a3, 0xe614148e,
  213794. 0xcd51e53f, 0xe5018517, 0x0243dcb6, 0x5060075e, 0x17954405,
  213795. 0xe5dcde62, 0x537da5ff, 0x6f7c90e1, 0x0768cb66, 0x1df7aae4,
  213796. 0x6dbe95e1, 0x5266ca9e },
  213797. { 0x1386b3db, 0x84ddee6d, 0x7c38e540, 0xf9e4af5a, 0xeb04f49d,
  213798. 0xb3418440, 0xfde5a4fd, 0x2138a1e8, 0x30257cfc, 0x3e6e6924,
  213799. 0x19fd70c1, 0x3519c6e3, 0x86c31ff0, 0x8f34e174, 0x940ce1e8,
  213800. 0xf1e298fd, 0x14960d7c, 0x6fb8cb1d, 0x2b2f3bff, 0x207c1347,
  213801. 0x146ef8ff, 0x899a20b4, 0x7bd3e220, 0x7dec362b, 0x626bea27,
  213802. 0xa975044e, 0x4fb4cb67, 0x0f32b449, 0x1fc6703a, 0xc17a0920,
  213803. 0x9cd84a2b, 0x41f325b9 },
  213804. { 0xce2843a4, 0x312ed513, 0x00728afc, 0xe748498e, 0x4d864ce5,
  213805. 0xa8ef2822, 0xa620083b, 0x34064704, 0x4bed338d, 0x5905e1d9,
  213806. 0x063e7b38, 0x2a578cb5, 0x289e7bb9, 0x98276d96, 0xf17b7341,
  213807. 0xdfe2dc47, 0x1dac8944, 0x5923521f, 0x23400aa7, 0x3db6d28d,
  213808. 0xa761ba43, 0xc647705e, 0x9bfd07dd, 0x8947ba6d, 0x242ca8fd,
  213809. 0x00f2e3ac, 0xeb8c3468, 0x49ef4670, 0xd9aa18fd, 0x7db3d37b,
  213810. 0xe58cea9e, 0x56b30fb6 },
  213811. { 0xcd80a428, 0x07ecdcaa, 0x8732c891, 0x7af922dc, 0x3ada441f,
  213812. 0x20d88798, 0x924b008a, 0x3bed9a44, 0xb2e81c3a, 0x2123533c,
  213813. 0x65f807d3, 0xc34e4075, 0x1f2faecb, 0x0bfaefa5, 0xade8a88d,
  213814. 0x78b634a5, 0x94392a91, 0xc4e0b7f8, 0x90bb1cd8, 0x30922377,
  213815. 0xf87204ae, 0xdea9b4fa, 0x85d3cd83, 0x3edf81f5, 0xc6523a79,
  213816. 0x58f88c51, 0x17c0d969, 0xe472fb8b, 0xdccf7f07, 0x899081e5,
  213817. 0x58bdd146, 0x1353cc57 },
  213818. { 0x39bf6e18, 0x28a56497, 0x649b89c7, 0x59e8b5a2, 0xdce8b8e7,
  213819. 0x8d9434a0, 0x2047040c, 0xd935bf51, 0x6a7b8e82, 0x2ab3a164,
  213820. 0x27f81294, 0xf1583ed6, 0x72d67297, 0x8416a7e0, 0xcd39e42b,
  213821. 0x49685d86, 0x958ddbad, 0x8a797fc7, 0x155ce6de, 0xa558f928,
  213822. 0xf8a36235, 0x75f4e570, 0x52877ae5, 0xbc69cfc0, 0xa6b16ebd,
  213823. 0x8f4193a9, 0xbb1cc1f1, 0x8d1df43c, 0x5a21e789, 0x723a830e,
  213824. 0xf451df58, 0x3ec2185d },
  213825. { 0x1f0bc2d7, 0xb9d4c7d7, 0x6e51d412, 0x6982c6cc, 0xa09f80f6,
  213826. 0x92e02d93, 0x047ae09c, 0xb7dd2d25, 0x37f351f9, 0x3503149f,
  213827. 0xc77850be, 0x69d49ce1, 0x12f0d2c8, 0x60242acb, 0x7bc28b9d,
  213828. 0xba188c56, 0x06bc0550, 0x8e406121, 0x8d7d4329, 0xb0d84b1f,
  213829. 0xd38951e0, 0xb4a67ae7, 0x8bc97607, 0xb527c57b, 0x5497aa72,
  213830. 0xbc93c5f3, 0x39bdd666, 0x5f1de8cc, 0xe9d447a3, 0x3087dc5c,
  213831. 0xa211abe5, 0x89b356b6 },
  213832. { 0xdfdcc837, 0xed6db0af, 0xa871b7a9, 0x0fb80baa, 0x1c1d4b72,
  213833. 0x413abfc9, 0xadac9e5c, 0xf5b56bf7, 0x8b8657a3, 0x5664a2da,
  213834. 0x0e41d94e, 0x11b04f72, 0x37433658, 0x63e11d26, 0xf426daea,
  213835. 0xee628ece, 0xcb162dc2, 0x011619c9, 0x87648643, 0x9cf5817f,
  213836. 0x5584bc86, 0xe1bb9702, 0x00bf7928, 0x2cc27cef, 0xdc60eee5,
  213837. 0x4ef3a80e, 0x87adc2f9, 0x7e1202be, 0x8a0d4f52, 0x656f18e0,
  213838. 0x57c5d126, 0x39c4f10d },
  213839. { 0xe88aecd3, 0xb3a9b68c, 0xa518aa9d, 0x555b0918, 0x4bd4ee54,
  213840. 0xedc1cdad, 0x02068d84, 0x79b68b67, 0x811ac72d, 0x7dac80d0,
  213841. 0xa81a0a78, 0x6d1e6d35, 0x3bd16283, 0xc841e9ea, 0x894c4444,
  213842. 0xa7bc1775, 0xf1aa1202, 0xf2b63725, 0xc7d4c556, 0xbec7767e,
  213843. 0xd46ff51b, 0x2817ebb3, 0x73f7e339, 0xfde5be8d, 0x5aed24c4,
  213844. 0x44c6c977, 0xb6e579cf, 0x0b9a1707, 0x9069fbcc, 0xcff16478,
  213845. 0x49152b00, 0x414b542d },
  213846. { 0x606e173b, 0x33c31e58, 0x90e6713a, 0x5b7f4e1b, 0xdebb20af,
  213847. 0x425fb512, 0x05120e70, 0xc788c617, 0x9013e4ec, 0x3ef05602,
  213848. 0x81c6e6d7, 0x9f9d35ac, 0x9450690a, 0xe131e88f, 0x44af082e,
  213849. 0x708f9b32, 0x1ba2aea9, 0xb2e4d66c, 0x740db29c, 0xaf1f4a6e,
  213850. 0xd1843007, 0x74ab9248, 0xed556a6c, 0x13338ef8, 0x270d17a6,
  213851. 0xf48e623e, 0x9608f5bf, 0x3c7362fa, 0x444e8515, 0x43977874,
  213852. 0xe00b8b2a, 0x52678d6a },
  213853. { 0xdf36aeb4, 0x5dff1c59, 0xa92bc0ab, 0x52d6653c, 0x927a5f81,
  213854. 0x0e03f496, 0x2dfd491f, 0x8509d414, 0xa571f89b, 0x258c2c52,
  213855. 0x93334485, 0x2bd61804, 0x3f7d9e09, 0x1a33e94f, 0x2c1bf906,
  213856. 0xfab418d3, 0x5aa5695c, 0xf39c490e, 0xf6d2d7ff, 0x0e41196e,
  213857. 0x0f7948a9, 0x3ecd4075, 0xd3053b4f, 0x4b58f9b2, 0x5d9974c9,
  213858. 0xb8ee842a, 0xbf22f682, 0x23a59c1d, 0xc8efcea6, 0x045ac614,
  213859. 0xc10ceedd, 0x7040ba5b },
  213860. { 0x515a1a96, 0x2c364f81, 0x184327e0, 0x31a63503, 0x1ad93d4f,
  213861. 0x0a096650, 0x273b6173, 0x9d7694f1, 0xd2cda9d2, 0x8886d876,
  213862. 0x2814c177, 0x1e01a742, 0x8667696b, 0x3492276b, 0x5b25f006,
  213863. 0x2fd4f0c6, 0xfb294c4a, 0x6527349f, 0xde1d336f, 0xc1fe0d8a,
  213864. 0xe7e3860e, 0xaf9a23e8, 0xb774c31e, 0x97d2b721, 0x4365784a,
  213865. 0xfac3e582, 0x70f4eaa3, 0xff2dff4e, 0xfe873248, 0x3d281e1a,
  213866. 0x0bd1c9c1, 0x9043a6d6 },
  213867. { 0x766c7937, 0x1511a0fe, 0xabbc3be3, 0x1b2ded5c, 0xe00888ac,
  213868. 0x2ac160cc, 0x616200f3, 0x928754bd, 0x34a2ea06, 0xb801c83d,
  213869. 0x9cbe106f, 0x8ad7a03a, 0xcedfcd94, 0x996b0822, 0xe4069880,
  213870. 0xc3c3463a, 0xf597f663, 0xfb12ea4d, 0x40c92af9, 0x2c8d3834,
  213871. 0x4e8da154, 0x79bc85c6, 0xdb4e801a, 0x95771fa2, 0x1e3579b2,
  213872. 0x7bd2c138, 0xffaad078, 0xe45c75df, 0xb73eac46, 0xb0760a3c,
  213873. 0x3a125f35, 0x26362b48 },
  213874. { 0xeefc3e89, 0x25c68d28, 0x69e9ee71, 0x2d0ee877, 0xaf5e4b75,
  213875. 0x8b07bb86, 0xcb86b333, 0xdb709072, 0xff552bac, 0xfd3d20ea,
  213876. 0x4c0da1e9, 0xa5eeb2b1, 0x44f97145, 0x391f688a, 0x1e06d485,
  213877. 0x21fbd310, 0xbea9cd49, 0x45e4f2a5, 0xa7bf21da, 0x7b60d464,
  213878. 0x054d5471, 0x193f88c8, 0xbee0f2e9, 0x5ace53d1, 0xc1439273,
  213879. 0x92c26563, 0x96c6b5ee, 0x9c86e0b2, 0x09ff59ba, 0x452fe231,
  213880. 0x555c935e, 0x2e952b20 },
  213881. { 0xd75f886e, 0x2a846bca, 0xd43dfc58, 0xe68a5dbe, 0x007b1b86,
  213882. 0x103e45b6, 0x355ff2b5, 0x580e2ec9, 0xa263ecc9, 0xbc702f26,
  213883. 0x181e5e33, 0x2835b386, 0x6c122076, 0x025113ec, 0x7fbd856d,
  213884. 0xa5c26e3a, 0x9d6ebcb1, 0x8ef83fb3, 0xa44d2fa8, 0x7aaa53f2,
  213885. 0x53b1fa97, 0x7c14ef33, 0x17559a30, 0xff604a11, 0xb09377e0,
  213886. 0x2bcd96b0, 0xdb2f0273, 0xa5c14896, 0xeb53ef06, 0x1c0a84c9,
  213887. 0x30378e4b, 0x1236d017 },
  213888. { 0xc084373b, 0xd7481c8f, 0x646097ae, 0x29ae4768, 0x613bc34b,
  213889. 0x1300dfa0, 0x934bc2b0, 0x3712714c, 0x0e2be7e2, 0x86524629,
  213890. 0xed010800, 0x554fbb9f, 0x42314576, 0xf0ec0b38, 0x330a3282,
  213891. 0x65baf594, 0x706ef817, 0x3bdde1a8, 0xba7530e9, 0x7d2c727d,
  213892. 0x74cc95cb, 0xbb0c5d66, 0x2438906d, 0xb3fcd365, 0xd14658f3,
  213893. 0x19881941, 0x6c97f0e9, 0xe616f555, 0x4b9ec7ea, 0x353c2d85,
  213894. 0x620cb56e, 0x02a48014 },
  213895. { 0x506ccd38, 0x11d6d23d, 0x9059baa6, 0x229a1c54, 0x69d011c5,
  213896. 0x717c9c27, 0xd828937d, 0xe87e1b46, 0x83835083, 0xf5d63bbb,
  213897. 0xaadac258, 0xf0a7b427, 0x9f154d1f, 0x99ab26bd, 0x8ec955fd,
  213898. 0xdec0ffbf, 0x49fcb880, 0xee957c67, 0x1e0114de, 0x32395dee,
  213899. 0x369f46c7, 0x192a64b7, 0x91eb2599, 0x43044660, 0xa2e8c3da,
  213900. 0xbe2da887, 0xc3556d18, 0xa44e2c25, 0xb55f75f3, 0x31390414,
  213901. 0x8f217fe0, 0x1d8bde6f },
  213902. { 0xa2028924, 0x03cd39f8, 0xb06ecb9f, 0x6e54f19c, 0xd6f05846,
  213903. 0x862bbcb7, 0x5a060776, 0xdbe06716, 0xb10fec10, 0x9397c97a,
  213904. 0x6f1bb65c, 0xf4213826, 0xa672ba38, 0x414deccb, 0xf88b05e6,
  213905. 0x594d4d43, 0xac94d4d1, 0x7993f57a, 0xbfb17638, 0x74fc2a6a,
  213906. 0xb6fc655a, 0xd8196b5b, 0xee8d2139, 0xdc375c84, 0x360d3a26,
  213907. 0xb9b00a02, 0xdeb93b87, 0xb36ed35c, 0xcc83209e, 0xf565b28b,
  213908. 0xc61013c1, 0x349c6943 },
  213909. { 0x4de6c88a, 0xd1b39444, 0x4700207e, 0xd5c2c471, 0x21c2b780,
  213910. 0xb6f458a2, 0x0850993e, 0x749f7564, 0xbaef0c18, 0x400ba579,
  213911. 0x737c70f0, 0x2d742938, 0x21467ebf, 0xc5a8e2ec, 0x5337f453,
  213912. 0x243a666e, 0xed0bd50a, 0xc991f1c7, 0xf4bd1f91, 0x3a7f3e90,
  213913. 0x5f0e129b, 0x96089e8a, 0x07389635, 0xd0d3a177, 0x27182ac9,
  213914. 0x9cf842d5, 0x0817c5c2, 0x21195299, 0x87255769, 0xa32f327e,
  213915. 0x89c2d8fa, 0x056587ab },
  213916. { 0x1ce4733d, 0x008562ed, 0x98e51444, 0x5faff7cb, 0xa9ab46b9,
  213917. 0x5f03021f, 0xb61a8c13, 0x89494c5e, 0x36b35976, 0x57c95036,
  213918. 0x2ac2d2f6, 0x6be84c8f, 0x9bd2703e, 0x0e5b34d8, 0x7e872abb,
  213919. 0xc4ad918f, 0xc4052ee1, 0xc2a89e9f, 0x3190b51e, 0xc2caee3f,
  213920. 0x6fff254f, 0x58fd1437, 0x883e0972, 0x6f3c0d68, 0x0fb15438,
  213921. 0x63d0a0e9, 0xf6caae00, 0xc438764b, 0x3f1d0f6c, 0x815f1565,
  213922. 0xb86cdbde, 0x1b87f2ed },
  213923. { 0x2b0b15b1, 0x35792bbb, 0xce6ba779, 0xa3e4b5a7, 0xdd8f3779,
  213924. 0xfbacffd9, 0xc298d1ef, 0x005450bd, 0xc47031c6, 0x0e3f5556,
  213925. 0x95d68066, 0x0770f07a, 0x2d1052c2, 0xce3e84e0, 0x7aa8cc54,
  213926. 0xb050791e, 0xba3223a3, 0x4d621e73, 0x39632990, 0x87b9b94d,
  213927. 0x7eb8056d, 0x8df9cb47, 0xedfca0cc, 0xe2430de8, 0x9712a0ca,
  213928. 0x374bf416, 0x88848a99, 0xbe3f3c77, 0xc4a3e59e, 0xb22b87b1,
  213929. 0x3e95bc23, 0x8e0227c4 },
  213930. { 0x3210964d, 0x000e22a8, 0xff056eeb, 0xdccd5df5, 0xdaf1ead7,
  213931. 0x02173a1f, 0x67cdcae3, 0xd02833e0, 0x8bdcc90c, 0x1cc574cb,
  213932. 0x3224b4f5, 0x86eca714, 0xbb3f8298, 0xd00e603a, 0x0c1a8deb,
  213933. 0xb98ece1b, 0x378c261d, 0x228a46e4, 0xa6165e5d, 0xc6f9dd0d,
  213934. 0x4b7ef0e2, 0xb3ae3899, 0xbda9f306, 0x3a3c16b3, 0x38a084db,
  213935. 0x5e9a26d3, 0x5394e950, 0x528e5993, 0x4ea206bc, 0x848ecb11,
  213936. 0x40545d6e, 0x14b15ab5 },
  213937. { 0x664c59a2, 0x0f6d86c9, 0x60fd7aa5, 0x3dfe2be1, 0x9072cb8e,
  213938. 0x33f9b569, 0x8176a7e0, 0x5f2325d9, 0x4587080b, 0x79a0d4e7,
  213939. 0x0d5d4e05, 0xa4ee0def, 0xc87b28e1, 0xc0ad9ffa, 0x3f09b4ee,
  213940. 0xd6f18d2f, 0x292e9d87, 0xcc896ae7, 0x6094763c, 0xca88953d,
  213941. 0x18fbf9fa, 0xdbee97a8, 0x4b63d701, 0xdf20e0e9, 0x47ea722f,
  213942. 0xcbba6e30, 0x612b571f, 0xce57e1ca, 0x009a55f5, 0x1e16ac76,
  213943. 0xc4389e2e, 0x742bbed8 },
  213944. { 0xc1dc2c73, 0x23ea86dc, 0xc1643abf, 0x4bbbfd5b, 0x24d8ca1f,
  213945. 0x07f8fa1f, 0x8cb5cac7, 0xde68a6e0, 0x54e66a7d, 0x7d54c64b,
  213946. 0xa9b7ad78, 0x789dba22, 0xe364ab94, 0x4d88d540, 0x1f72e011,
  213947. 0xc8c2e02d, 0x46e2a278, 0x4c826057, 0x4b187c7d, 0xe6c35bb3,
  213948. 0xeb8fe0c9, 0xed8b3dfe, 0x7d11e415, 0xb6bc34e8, 0xb865c7f9,
  213949. 0xb3908bbf, 0xe1ecc17c, 0x717d1ce6, 0xf7cdd69b, 0x151e3308,
  213950. 0xb5c94124, 0x97bd5a14 },
  213951. { 0x81e82861, 0xe01c62fe, 0xdd42c40e, 0x703d4b6d, 0xe65e91e5,
  213952. 0x7e52e55b, 0x5abbbfdd, 0xb8b49374, 0xc72a45f4, 0xb4f15f52,
  213953. 0x550f29d8, 0xce8435a8, 0x582de75f, 0x9df76b9b, 0xa20c8b96,
  213954. 0x52e84c5f, 0x0a8a0af4, 0xaf77d2d1, 0xca6013c3, 0x0389bbd8,
  213955. 0x26f8305f, 0xb0d9b9ba, 0x0cec8b9a, 0xf053e848, 0xffabda18,
  213956. 0x4d63367a, 0xa6424c2a, 0x50f53be4, 0x864fba2e, 0xf892c58c,
  213957. 0x48cc5469, 0x317c6d31 },
  213958. { 0x2cb7d42b, 0x0c3525b0, 0x310facae, 0x55240bc9, 0xff20408f,
  213959. 0x8d5d2022, 0xe0c10ea0, 0x6b01402f, 0x718eb23d, 0x7fbef68a,
  213960. 0x41252a19, 0xa0146b5a, 0x110e0d6e, 0x59afce48, 0x022de181,
  213961. 0xe9a1d27f, 0xdc3f49da, 0x6db96d16, 0xefbe4008, 0xfc1ae3f5,
  213962. 0xeccbc11c, 0xf9d70641, 0x525f8636, 0x49022279, 0xc2763c30,
  213963. 0x3769796a, 0x1d90630b, 0x9cc3483c, 0xee3d3f17, 0x451651f0,
  213964. 0x9da0b8fd, 0x6ae59739 },
  213965. { 0xbff4d2ee, 0x57b13bc7, 0x30b173d8, 0x20754229, 0x0794936c,
  213966. 0xb6254bd5, 0x5efd55be, 0x1d5f232a, 0x4e0c3389, 0xc06f4a85,
  213967. 0x8e61f944, 0xcf2c5b59, 0xfd5f87b7, 0xc564861f, 0x5a2afa4c,
  213968. 0xee261fb1, 0x2d97a774, 0xb0ff7226, 0xd6cf007a, 0x1a89ae22,
  213969. 0xd346f214, 0x28880534, 0x97b6497e, 0x8fe73bff, 0xfa2afffc,
  213970. 0x8a8595b2, 0xf151a726, 0x9ef9cf3e, 0xe744b82b, 0xa84ee5f1,
  213971. 0xbc63fe72, 0x6649048d },
  213972. { 0x1e8b760d, 0x91b7bb78, 0x25aadaa0, 0xd47b0bd8, 0xfab5226f,
  213973. 0x81493d9f, 0xbffc148e, 0x4a6dd226, 0xa29be3db, 0x5a032f8a,
  213974. 0x34b0ab0b, 0x318dbc70, 0x7d654868, 0xdcccbfb5, 0x9c581e46,
  213975. 0x8506ab37, 0x2830ece2, 0x09136a6e, 0xcf6c80c7, 0x48b79356,
  213976. 0xef6b1e86, 0xfa176377, 0x83f0f1c9, 0x2c9c1cc1, 0x16abeddd,
  213977. 0x96f0526d, 0xa93b0de4, 0x3e0e98e2, 0x0f13873a, 0x6f2d7ada,
  213978. 0xf3fa49ec, 0x4eb93b5c },
  213979. { 0xe11fae32, 0xbd89f7e5, 0xc4023f51, 0xd13d74f5, 0x491c3f6f,
  213980. 0x1b0014df, 0x555279b7, 0x1d849a57, 0x05ba0068, 0xbb9e8897,
  213981. 0xc13ca2ca, 0x82222419, 0xfd33676f, 0xafbbb685, 0x75878a2a,
  213982. 0x931c3f52, 0xef3d5173, 0x12aeefef, 0xbd8a6878, 0x189a5cc8,
  213983. 0xd99f0c16, 0x82cffdb3, 0xa19d48b6, 0xbf565406, 0xe9c6c4e0,
  213984. 0x5605e223, 0x86804172, 0x53e781de, 0xc7001cc8, 0xcdf5c90b,
  213985. 0x7c043f68, 0x2b582d93 },
  213986. { 0x81abc2ae, 0xa1165c82, 0xe2b69eca, 0xa73380f5, 0x07fff66f,
  213987. 0xc097b3d2, 0x54776506, 0x5d603826, 0xb57fa21c, 0xdcbac9f3,
  213988. 0xc98dbdd5, 0x78750db4, 0xd9eff32a, 0x85e21103, 0x2f11c41c,
  213989. 0xceed172c, 0x9e348c09, 0xa8e39264, 0x831eddfb, 0x71cb936b,
  213990. 0xf50864a3, 0x915c3d06, 0xe93acfcd, 0xfe8e33cd, 0xb3f2f7aa,
  213991. 0x4bee10d7, 0xeb7cee9a, 0xc1d8eb48, 0xfa574afd, 0x4fa49ce3,
  213992. 0x862db4c0, 0x78615109 },
  213993. { 0x7ae72c21, 0x3fe3f480, 0xfd0f0da5, 0x631aa144, 0xf8c3a454,
  213994. 0xc76ee1e8, 0x51b4f1ab, 0x379ae094, 0xd7cdbb24, 0x2a3a4397,
  213995. 0x82bd5fcd, 0x7a14cffe, 0xf427ef5a, 0xbbe4ed12, 0x284d3ccf,
  213996. 0x9b0a43ee, 0x8eec6e1e, 0x57b78b93, 0x67b8e87b, 0x18d404e4,
  213997. 0x34374c20, 0x0c8adc05, 0x5428deb5, 0x64373605, 0xc3afa2cf,
  213998. 0xb4d80ec0, 0x3aa956f9, 0x6d51f93c, 0x84161c68, 0x9f9a28ab,
  213999. 0x6bc9c025, 0x540b6bb7 },
  214000. { 0x321d315d, 0x04e1734c, 0xd86e05d0, 0x4ef56612, 0xbba8cd81,
  214001. 0xeafae145, 0xacdc789a, 0x1fb07a49, 0x5877570f, 0x6a21e9ad,
  214002. 0xb9bc53de, 0x2e4a837e, 0x1d6298eb, 0x436db293, 0xea362f45,
  214003. 0x43afbc78, 0xaabf6585, 0x2a973d97, 0x0c924d60, 0xdce7dabe,
  214004. 0x7cadf0e9, 0xf69d98f0, 0x75020538, 0xe0b505a1, 0x4461cd29,
  214005. 0x3db7d1a3, 0x5e20e818, 0xe1c28776, 0x52dd50f6, 0x2ca25867,
  214006. 0x92e0388c, 0x897cab14 },
  214007. { 0x0d8bab8a, 0x59ed3813, 0xa438200a, 0xc11d364c, 0x40581415,
  214008. 0x0687bf2c, 0x7ac89674, 0x86ad0d3a, 0xb97411a0, 0x44928105,
  214009. 0xf383371c, 0x74984b11, 0x0d1a831e, 0x70d2ed84, 0x6c912fe0,
  214010. 0xd883628b, 0x14fa88d2, 0x44f8f7fb, 0xcf0ac93e, 0x564f2a4d,
  214011. 0xa6c24fa6, 0x82f629aa, 0xbf6cd949, 0xab906ba3, 0x20a5182d,
  214012. 0x2c822e67, 0x30eb93a5, 0x2ff47dac, 0xfff673aa, 0xdc62c4a4,
  214013. 0x476b0ec5, 0x64b00763 },
  214014. { 0xb3c9a404, 0x1e3f533e, 0xb7ef9952, 0xb1db7f73, 0x6c253693,
  214015. 0xc7f13e29, 0x0738eed4, 0x7ce7f4c4, 0xce26cad0, 0xccfd3b33,
  214016. 0x01ec5cf1, 0xd8784935, 0xdc084e01, 0x3f8fc09d, 0xc39b5acf,
  214017. 0x217cab32, 0x9ef5551c, 0x42daf0bb, 0xe1217a95, 0xfbc76f56,
  214018. 0xc237002a, 0x80178b12, 0xb070a293, 0x0b52c39f, 0x576ca964,
  214019. 0xe3925153, 0x19d68e36, 0x25559424, 0x09e50e84, 0x291fb82c,
  214020. 0x6618ed8c, 0x7dd22ea6 },
  214021. { 0x49cbb3bf, 0x7ffe844b, 0x5562fb25, 0xde0cc704, 0x9f5a845a,
  214022. 0x1e6ee537, 0xe51277fc, 0x956d7f26, 0x30635718, 0x2c75d4b9,
  214023. 0x96957f34, 0x39a14892, 0x82e5742b, 0x8cf4eb32, 0x83247b72,
  214024. 0x6b0d3ddd, 0x201a4237, 0x67a9f633, 0x1414a485, 0x416403c1,
  214025. 0xb6f6a916, 0x60afd447, 0xdac6f790, 0x95f94930, 0xbd3b9d82,
  214026. 0x685ff94b, 0x51cadf0f, 0x5c8f98fc, 0xb13b7489, 0x9559c88a,
  214027. 0x5f18fcc8, 0x31377c66 },
  214028. { 0x7dcfb35f, 0x35c5de09, 0x01cc36f8, 0x2dccca9f, 0x7576cb63,
  214029. 0x7e93e85d, 0xf7b4b375, 0x0c2dd48a, 0xb09a19b5, 0x9d95cd4f,
  214030. 0x71bfe607, 0x752ed159, 0x2596dad2, 0x439880cf, 0x69e90a6f,
  214031. 0xe52efb53, 0x03d3e60a, 0x44097663, 0xa95070e0, 0xfcf364fa,
  214032. 0x05624dd2, 0xd8f993b6, 0x00d5e467, 0xb35a9824, 0x0c8f4524,
  214033. 0xe289d024, 0x648a0179, 0xef45423c, 0x587edabd, 0x3a5fd695,
  214034. 0xa11e5271, 0x3dacc50c },
  214035. { 0x6499ae4c, 0xcb3e4f94, 0x7053c527, 0xa46dcbe1, 0xbe782e8a,
  214036. 0x807f5ce9, 0xd8481e45, 0xb6c64d28, 0xaa286fd0, 0xf35e4518,
  214037. 0xdf1cdb49, 0xf7b7b9ba, 0xaec23eaf, 0xf3fb6210, 0xb9bfd2fb,
  214038. 0x0a9ba385, 0x8807f3a0, 0xe51a0d53, 0xb17b2842, 0x7ab24404,
  214039. 0xf9dd9f0a, 0x6fd57687, 0xf3e9df64, 0xcd1efdb4, 0x60df194d,
  214040. 0x5dd2df7a, 0xe069df05, 0xbed3f2c3, 0x23248a31, 0x469b7561,
  214041. 0x694744f7, 0x866949e1 },
  214042. { 0x3f4ab07a, 0x3a9a0da5, 0xf54a6fbf, 0x2cd6f333, 0xb23cf290,
  214043. 0x0c92e921, 0x848e3d58, 0xc9581c3e, 0xd3b218ab, 0x93af1fbd,
  214044. 0x066cb4d7, 0x38598ea1, 0x990c03a0, 0x5001394e, 0x7d0877b5,
  214045. 0x3b664b1e, 0xd74c7091, 0xd79db1bb, 0x4e2d5dd0, 0x852d4435,
  214046. 0x3329db82, 0x0d2b841b, 0x7b96d480, 0xfa844eb0, 0xc295dc46,
  214047. 0x37a50569, 0x94f7ec4e, 0xc2d38373, 0x5b083177, 0xdc3884ff,
  214048. 0x8b1fa598, 0x574352b8 },
  214049. { 0x0d5d7ce9, 0xed2193f7, 0x0b487eaf, 0x3c19fd26, 0x7be65fd0,
  214050. 0x7c44ab59, 0x78270d56, 0xdd9da860, 0xbaa70198, 0x8a84ec00,
  214051. 0x285985df, 0x2ec27e49, 0xde2028d8, 0x996ccaf0, 0x61c2201d,
  214052. 0x4e7648c7, 0x091c19eb, 0xa96335bc, 0xf0d6782b, 0x253a3a69,
  214053. 0xd2946493, 0x3f204340, 0x099f6873, 0x444521a1, 0x6996011a,
  214054. 0x5fcbcc09, 0xf853a94e, 0x3884d5d8, 0xd3b6a3a1, 0x2418c624,
  214055. 0x06ae3c4f, 0x3e431af2 },
  214056. { 0x83d381f1, 0xf967d939, 0xd0c033c3, 0x36501aae, 0x54410768,
  214057. 0xbf3af4d0, 0x5093a6d3, 0xa86d1598, 0xd92f2900, 0x43ae0741,
  214058. 0x36f0b755, 0xfeb2afa6, 0xaa456d6f, 0xd090a6a3, 0xaefdb646,
  214059. 0x336a4fda, 0x1a942f7d, 0xfd1bfe44, 0x851ee41e, 0x7fc2a3ed,
  214060. 0x11e935c5, 0x4f1c9686, 0x53bbb343, 0xcd577666, 0xad896c2a,
  214061. 0xf26931ba, 0x86bbfa41, 0x8a0fbbd1, 0xa203cef1, 0x1c3d7d82,
  214062. 0xe2664d35, 0x6dad3f15 },
  214063. { 0x12ec35a1, 0xd1940b7d, 0xe7dfb128, 0x6219c5b6, 0xf13321d5,
  214064. 0x2cc278c6, 0x33c58eb6, 0x5e76904a, 0xd9903c43, 0x15090f55,
  214065. 0xc3d96a19, 0x061bc926, 0x8c0acba7, 0x974a9f03, 0x7198b21b,
  214066. 0x7a414021, 0xf8958c6f, 0xb069599d, 0xbebd0129, 0x517f2f1d,
  214067. 0xdf3a8dc3, 0x1109a613, 0x672375c5, 0x08e58448, 0x9383d2d3,
  214068. 0x56590ba4, 0x0bff837c, 0xfc3ee7c6, 0x27d2d55f, 0xc87a5390,
  214069. 0x5f517a3f, 0x2438e9d4 },
  214070. { 0x8815af3c, 0xc4a45308, 0xf3c9bed5, 0xe55f1a32, 0x97b65ddf,
  214071. 0xaef1cdc9, 0x12e51eb5, 0x61c61d94, 0xe63f2490, 0xbd0dac54,
  214072. 0xd0b3e231, 0x6f14429c, 0xf1da6010, 0xf737c3c2, 0x6bbc4fb1,
  214073. 0x7150e04b, 0x1be281cb, 0x205b4c89, 0xd7701f5b, 0xf1b4633c,
  214074. 0x2a513490, 0x8b33ef46, 0x68f1f7f2, 0xddb47c73, 0xbd416b67,
  214075. 0xf4ada511, 0xff795bb3, 0x9d2a97cd, 0x96200e67, 0x00a8b7b2,
  214076. 0xafe30e01, 0x13f39011 },
  214077. { 0x7bd0c827, 0x3dd296ef, 0x4a29ff46, 0x506110f3, 0x1c9a515a,
  214078. 0xf8793068, 0x268bca77, 0xde8d8045, 0x998045df, 0xcbb83024,
  214079. 0x68c0e584, 0x3f90d710, 0x263b6062, 0x2a838ca8, 0x535c5d0b,
  214080. 0x293bb5e7, 0x56415110, 0xceea99d5, 0x1bbda005, 0xfe311ad0,
  214081. 0xa4d8d018, 0x2497e0bf, 0x1cf2b866, 0x33dd77a0, 0xd8c4ba8b,
  214082. 0xbc075b73, 0x722b7bc9, 0x298466d4, 0xcbda1b0b, 0x17a7ce24,
  214083. 0x680703b6, 0x458d4b6b },
  214084. { 0x4d54d8b2, 0x8a26a20e, 0x4d320a0d, 0x05a5696e, 0xf994f700,
  214085. 0x698b5858, 0x2f6549a8, 0x7a4adc3c, 0x3694d00d, 0x1812e819,
  214086. 0x730402bd, 0x46b9b000, 0xa1b36410, 0xe10a1449, 0x99230220,
  214087. 0xeae95ea5, 0x1b4820c3, 0x3efc2e9b, 0x85c9eb8a, 0xfe5b5cb5,
  214088. 0x97847064, 0x21ae0319, 0x8f27d49f, 0x68ef0b70, 0x2f72556b,
  214089. 0x3259ef18, 0x624db01a, 0x00ae0457, 0x5668f95c, 0x628e3b06,
  214090. 0xb6fbbf91, 0x5f13f5fa },
  214091. { 0x3a9b0dc6, 0x7c6ed9ae, 0x6f883ec8, 0xaea1bde9, 0xea8b3677,
  214092. 0xea66bf88, 0x9a66e3ab, 0xdefa6abc, 0x68217ffd, 0xc4d3317b,
  214093. 0x290df05c, 0xf741c8f2, 0x7d11674e, 0x1f0fdf17, 0xc35989ca,
  214094. 0xfdf0ece7, 0x6b9c482d, 0x0eed92df, 0x55bf1ca7, 0x73713e66,
  214095. 0x25cec99c, 0x90acb290, 0xe803e69c, 0x37c9e3a2, 0x17713a1a,
  214096. 0x7c0a3c53, 0x6f5a174d, 0x350dc565, 0x05f802f6, 0x11625a44,
  214097. 0xa37ba4a2, 0x2196495d },
  214098. { 0x13142680, 0x00cb2fd3, 0x65d14cf4, 0xab9e91d7, 0xdfe2669e,
  214099. 0xc6a0ceab, 0x0ae22bc5, 0xbeefce58, 0xcb6ec250, 0x3c2b7986,
  214100. 0xd738f1ff, 0x84adb1a2, 0x516ec8ec, 0x9709bc28, 0x8e8f7db5,
  214101. 0xf3693129, 0x95b197f9, 0xc48efc6b, 0x9aaaa404, 0x9ff10952,
  214102. 0x144154b0, 0x2c3c8cbd, 0x427f3435, 0x33ef7bc3, 0xd21897c1,
  214103. 0x04a17940, 0x6ce548a0, 0x5aa0c47d, 0x3d56fa62, 0x2971cea7,
  214104. 0x04475f08, 0x93ad0eb0 },
  214105. { 0x988a9963, 0x7a0b6967, 0x6515e8dd, 0x61e477f7, 0x3b6b50f2,
  214106. 0x6274e386, 0xd33922de, 0x63a9b8d5, 0x687a5b3d, 0x3c38d3fb,
  214107. 0x1302e323, 0x18f6f09c, 0xe02fcccf, 0x254c05c3, 0x26e662f7,
  214108. 0xc04ed0b7, 0x143fe079, 0x1d5646b8, 0xc9016c8c, 0xef8a9448,
  214109. 0xf823d797, 0xe5674c4b, 0xbccde451, 0x0586f72f, 0x4417eade,
  214110. 0xc5fc88d5, 0x576e588d, 0x2b952209, 0x5844d1f9, 0x4408dd42,
  214111. 0xea41c034, 0x73f8c3f0 },
  214112. { 0x5df763dd, 0x89534fc8, 0x3ac71836, 0x3b1427f3, 0x6e8f15a0,
  214113. 0x0db5be17, 0xcb20888e, 0x1d390944, 0x857caea6, 0x7804c9ad,
  214114. 0x519f7bf3, 0xaa584428, 0x293aa8cf, 0x626eecf1, 0xea36a015,
  214115. 0x749e0d98, 0x3321edcd, 0xefff6dae, 0x28b791cc, 0x963deea6,
  214116. 0x2d16e361, 0xa14e0552, 0xb15ae206, 0xa2e058fc, 0xfca325e4,
  214117. 0x0f268745, 0x21341a8a, 0x7cf9d407, 0x7caa51b8, 0xdfed25d9,
  214118. 0xadbedd75, 0x0108ae39 },
  214119. { 0xa9e88f63, 0x54d178f3, 0xab0c7325, 0xaa05b11e, 0xe261d8a6,
  214120. 0x773a53e6, 0x8d0b91c8, 0x24db7dae, 0xe9bb004d, 0xde10b073,
  214121. 0x54e3090b, 0xfc8befe7, 0x0cc69c89, 0x16af0599, 0x9d59511a,
  214122. 0xddc83803, 0x46c5dafc, 0xc3f65b99, 0x1ee0a599, 0xfbbe4be8,
  214123. 0xfb3a9b17, 0x88891e36, 0x445dad00, 0x0c9aad75, 0xd5097e1f,
  214124. 0xdffc46ab, 0xac85a4e1, 0x8848089b, 0xa0c45233, 0x348bb42f,
  214125. 0xeb13c1df, 0x807c06d8 },
  214126. { 0x98ee0ef6, 0x00a969ec, 0x8bb7b7af, 0xba9d5483, 0xa02f8fdb,
  214127. 0x24484c92, 0x8b70557c, 0x7bdb201a, 0x60ad1af2, 0xe59343e4,
  214128. 0x998c95fb, 0x53a9a942, 0xda861d3b, 0x974db3de, 0xed399c0e,
  214129. 0xce1525c9, 0xf72109bd, 0x89b56881, 0x998211a4, 0x08ff7d15,
  214130. 0xef0f275a, 0x5df76b3a, 0xfa2f358b, 0x93f180f7, 0xc39b0634,
  214131. 0xaac4ffcf, 0x17583b53, 0x2692c626, 0xb55399fc, 0xb2fdfa36,
  214132. 0x99607a61, 0x16424c6c },
  214133. { 0xdd2744a9, 0x5dd65c55, 0xfe3af418, 0x2544c1c2, 0xefe8b089,
  214134. 0x32c82e99, 0xa9df691a, 0x30b7ab25, 0x9be99674, 0x98384550,
  214135. 0xcaf2d122, 0xbcecd258, 0xbcc77272, 0x88ae4098, 0x4b8efa0c,
  214136. 0xd4396141, 0xed64d12c, 0x44ff67b9, 0x2e7f3404, 0xa9e655e4,
  214137. 0x45b0e9eb, 0x3d16fc45, 0xf03ded28, 0x474a3e14, 0xacccb85c,
  214138. 0xa3c9adff, 0x7253a51b, 0x3dfe6bc1, 0xfb5831b1, 0xdddaf4b9,
  214139. 0xa4f4478a, 0x5544e602 },
  214140. { 0xbaa80b4f, 0x897c5313, 0x63bdc8ef, 0x0122716f, 0x7b42c5a8,
  214141. 0xae2742db, 0x0883308c, 0xe9d9e1e9, 0x2d341ab1, 0x352c8c3f,
  214142. 0xed945870, 0x163d0500, 0xc290d9d8, 0x8349dd73, 0x1f6c7d29,
  214143. 0x2053c5e0, 0xcb42033c, 0x83107446, 0x09d09af1, 0x76c88bd2,
  214144. 0xb2794681, 0xd0f70e6e, 0x19b1b540, 0x720b59de, 0x22994b43,
  214145. 0x80b7ecdc, 0x2dec53cf, 0xc1a4cdce, 0x1ed60f42, 0xdd7d3edd,
  214146. 0xe241d261, 0x5735995c },
  214147. { 0xa0237056, 0xdc4ba3fb, 0x33ab3388, 0x6856c164, 0x271ec612,
  214148. 0xc01eebbd, 0xe3031bec, 0xabdeb033, 0x6118a1f5, 0x4eee4419,
  214149. 0x5b600f33, 0xec497421, 0x08868773, 0x1b7185cf, 0x7c1b7dfd,
  214150. 0x7b0c46cd, 0x4a4c5e89, 0xd143b2da, 0xbb1ff94d, 0xdb9a5984,
  214151. 0xc9cf3465, 0xac3904e4, 0xeace64c9, 0xf8729bc0, 0x768ad99a,
  214152. 0x5cc22821, 0x8a9540c2, 0xbbd3b081, 0x049a6917, 0xe468ed5f,
  214153. 0x3ec45ef0, 0x885486df },
  214154. { 0x4bdff464, 0x6a942c93, 0x25a7b451, 0x3db2719f, 0x325be324,
  214155. 0xccb0070b, 0x19fe3339, 0x2055a31b, 0x241ee8ff, 0xaca69ae8,
  214156. 0x55ef8def, 0x7607dd08, 0x1a1b73c6, 0x9e24960f, 0x71d36810,
  214157. 0xbcb0e8a2, 0x6885e6b9, 0x29e11aa2, 0x185eae19, 0x98b5d0ab,
  214158. 0x0f81f91c, 0x1a0b96e4, 0x994fc503, 0x4d0e8bcf, 0xf119d6e0,
  214159. 0x33d81697, 0xaaa4ce0c, 0x29083287, 0xc91ff9d7, 0xc5dd4d3e,
  214160. 0xd4ab962d, 0x31cecfe8 },
  214161. { 0xfc8b21e8, 0x437bfd9a, 0xb19436df, 0xe5dd32b3, 0x921c36a0,
  214162. 0xfe5902d4, 0xa3d0fa90, 0x8e9de84d, 0x5bb523bd, 0x9663e6ad,
  214163. 0xaecd6975, 0x9800a23f, 0xb4fbb59c, 0x1009c0d9, 0xc9d20ff1,
  214164. 0x839aa7bd, 0xecd6fa3d, 0xf502f66d, 0xc5516ca9, 0x480ed4fb,
  214165. 0x6c742ac4, 0x65ffa5f6, 0xff3252f8, 0x2b7c7945, 0x75d9cb3d,
  214166. 0x72fefc05, 0xd6d6f1d2, 0x11b0863b, 0x9a6a4ec3, 0x5d8f3cf0,
  214167. 0xda2547b3, 0x6961b46a },
  214168. { 0xcb35e2ac, 0xd07b587e, 0x57af14d9, 0x1ed5546b, 0xdb28a04c,
  214169. 0xeca17a5b, 0x709d54f0, 0xa1f91d44, 0x9c6f400e, 0xa6e719fd,
  214170. 0xfb8ce190, 0x4e4b88ed, 0x246e3fd2, 0xf9781edd, 0xb655af5d,
  214171. 0xd67120e6, 0x93413ca7, 0xda782d1d, 0x9707fa21, 0x697e20a2,
  214172. 0x54e84123, 0x1eb51f32, 0x36051f9f, 0x2e254d9e, 0x73ce5be9,
  214173. 0xddaec42b, 0xcd3f794f, 0x89a9a32e, 0x0781aad9, 0x1964e22f,
  214174. 0x53755212, 0x6a63a90c },
  214175. { 0x3d7acbbb, 0x76554e00, 0xb74f6108, 0x2c01668a, 0x388c519b,
  214176. 0xe4a29672, 0x3eb94d4f, 0x01667714, 0x0cd6d2f6, 0x086a3cdf,
  214177. 0x7b370f7f, 0xf8658021, 0x5a4d3e7c, 0x658880c1, 0x5ba3f4a1,
  214178. 0xd6ed5816, 0x5ca471dd, 0xabcc7813, 0xe844a576, 0x809bf074,
  214179. 0x6ea502ea, 0xa53a81b3, 0x0e021ed3, 0xc20b9307, 0x8617f165,
  214180. 0x8c27f892, 0x8235cd0b, 0xa5476446, 0x82552961, 0xffc89ffd,
  214181. 0xd151d90e, 0x51ed4a22 },
  214182. { 0x449701b4, 0x37d6963a, 0xbb27caf2, 0xea8d91a3, 0xb572965f,
  214183. 0x3ef9be15, 0xdb50bf7d, 0x75a7a055, 0xce643b9b, 0xfd67480e,
  214184. 0x6ceb5d5e, 0xf2a60d2d, 0x5ed7c897, 0x68fc320c, 0x28ce685f,
  214185. 0x41c53cf6, 0x7106615e, 0x0e29711f, 0x23500ecc, 0x7a872138,
  214186. 0x6c29fe48, 0xaf0a9260, 0xe1ef9712, 0x93df3f2a, 0xd2d169bf,
  214187. 0x0d5f6fb1, 0x74a9793c, 0xeb7afe26, 0xe9f49256, 0x4173d94a,
  214188. 0x2b8b5ce5, 0x2d6951bc },
  214189. { 0x904e222e, 0xdd007d9f, 0x86f4e109, 0x333f248f, 0x8f429eee,
  214190. 0xd4994e8b, 0xcfc77518, 0x29573415, 0x0b0f42f1, 0x6e7fea3a,
  214191. 0xc2743519, 0xc795cb7d, 0x711e71a0, 0x820a8f66, 0x2b874f55,
  214192. 0x83d95d9c, 0xe70e1627, 0xd4b64d78, 0x8b92a742, 0x924353f5,
  214193. 0x447b5e6d, 0x322048b1, 0xbcf931a0, 0x0bad730c, 0xa7af2268,
  214194. 0x75c4d089, 0xb83b93f9, 0x464904c1, 0x165b3aee, 0xa24eba02,
  214195. 0xe08cc5f0, 0x65c48e78 },
  214196. { 0xde222c22, 0x1a1c73ce, 0xfcea23b4, 0x5683d8cd, 0xb2143b06,
  214197. 0x0301cb14, 0x59fcec77, 0x284adf8f, 0x31204cef, 0xfb1c581c,
  214198. 0x94735107, 0xf54d3eee, 0x4d3188c0, 0xdbf67f0b, 0x10f18d12,
  214199. 0x76a3f2d1, 0x07d3e013, 0x3809fa28, 0x25e7ece0, 0xf06f0a46,
  214200. 0xb2895d2e, 0xd82867ed, 0x08b0553a, 0xe106f489, 0xef245445,
  214201. 0xe2280fa6, 0xa8d9a3cb, 0x402d5785, 0xd438ba2d, 0xf63dd9ff,
  214202. 0x7a6b226f, 0x36b5cd2c },
  214203. { 0x545679a7, 0x87ff4e20, 0x4520c750, 0x64d80b41, 0x9b459cd8,
  214204. 0x90a357fa, 0xc85af1a3, 0xa19eaf39, 0x8d935a5e, 0x0d475d79,
  214205. 0x781a678a, 0x74501983, 0x0cc2e810, 0x74839779, 0x2f412244,
  214206. 0xc6a21d11, 0x36a51a37, 0x8d0e85f9, 0xeaa74df8, 0xff50151e,
  214207. 0x93cf99c4, 0x14e182a7, 0x376a9ab6, 0x45593df1, 0x522389ff,
  214208. 0x18f73caf, 0xf7445e8a, 0xd27cc960, 0x39a51dc8, 0x0692f4c5,
  214209. 0xdb39bfd8, 0x08d7c144 },
  214210. { 0x3ecca773, 0x809c0d96, 0xd48c2156, 0x87ea9192, 0xdb6bd641,
  214211. 0xf0eccd74, 0x2a678cdf, 0x77312374, 0xd1587b7e, 0x7a966d8b,
  214212. 0x6130a4c6, 0xf3c1a101, 0x5fce17bd, 0x7cc6e838, 0xa8de7aa4,
  214213. 0x95e95bb8, 0x898308e3, 0x3fe1e8b5, 0xe347694a, 0x0197243e,
  214214. 0xbb0cd2bf, 0xf3fe9c42, 0x0f9b2b49, 0xb5905264, 0xc7367d1f,
  214215. 0x4c385e8b, 0xb5ee147b, 0x1d3050ae, 0x04004ad9, 0x8e2c3879,
  214216. 0xbab70202, 0x5f2aa8ee },
  214217. { 0x1266524b, 0xe208d464, 0xd0a19f66, 0xb7bf3880, 0xda106ebf,
  214218. 0xa5aa685e, 0xe642dd46, 0x0a69e8d3, 0xc682e4d6, 0xef349c61,
  214219. 0x0fcb534c, 0x26f6ee3b, 0x05eb67b8, 0x7daba127, 0x18be05f6,
  214220. 0x2babb27e, 0x8e2d85d1, 0x959afcba, 0xe2d9d386, 0xedcf2d1a,
  214221. 0x1ea6f06e, 0x59dc52e6, 0x866e5ae8, 0xc28278b4, 0x02bcd3c7,
  214222. 0xd9ff0340, 0x784be82f, 0xe884ac76, 0x83c9f224, 0xa3164980,
  214223. 0xb46ff949, 0x62501a98 },
  214224. { 0xad264086, 0x563f7d9a, 0xa5e0e4bd, 0xca6a33db, 0x8c8d3d67,
  214225. 0xe8253002, 0x46e64b19, 0xa288dac8, 0x20aa4536, 0xfa3c9197,
  214226. 0xed553eac, 0x8130c9b0, 0x2ea8abd3, 0x622806e0, 0xceccfe77,
  214227. 0x52fbf54d, 0x4f0d1b70, 0xbd9a8e31, 0xd59b1741, 0x519d2133,
  214228. 0x9a6fea8a, 0xfd74101c, 0xb5c4eb10, 0xd1acf7a0, 0x91f9da5e,
  214229. 0x78499b73, 0xc0dea586, 0xabaa4c49, 0xa1f3531a, 0xcc9c5f73,
  214230. 0xfd3fc665, 0x497b15fe },
  214231. { 0xf45568e9, 0x8a56cbaa, 0xc7192a6f, 0xf491a0fe, 0x9ab2539a,
  214232. 0xdbb03dd3, 0x4ac37da9, 0xc86522f8, 0x02a0f5b4, 0x8c8cdba2,
  214233. 0xa29c539f, 0x8109fc75, 0xca90f02e, 0x9cd06d31, 0x3e216dbf,
  214234. 0x8f31f044, 0xba3ebd91, 0x99aa68ac, 0x42c007f4, 0x2a80d0d2,
  214235. 0x86a9b7ce, 0xdd8dffbf, 0xd6308edc, 0x405d3e84, 0x068012ca,
  214236. 0xdafa33fe, 0xedea1071, 0xc2eebd13, 0x2ff637e6, 0xb7ae7e5c,
  214237. 0x9e514cb7, 0x18d46a6c },
  214238. { 0xa78b7802, 0x868cbb22, 0x497cbaf4, 0x0745ddb2, 0x42ae8add,
  214239. 0xc4eb2f3e, 0xb4ceb4e4, 0xac0abcda, 0xa325fd40, 0x2e0d8325,
  214240. 0x13ac7345, 0x6cfe0571, 0xb14171b9, 0x7407a788, 0x6da7a52b,
  214241. 0x70eb0603, 0xd85176ac, 0xab0b36f9, 0x7c2954f3, 0x14109d29,
  214242. 0xdcd705ad, 0x370de9c8, 0x7bb5e751, 0x3f0db5cd, 0xa06e708c,
  214243. 0x45f93d41, 0x7e93050d, 0x10d54f8a, 0x5a38fef9, 0x69e6f8e4,
  214244. 0xd3f62e40, 0x55044601 },
  214245. { 0x06cb9cc9, 0xd1c5c910, 0x41d00014, 0x542074d7, 0x11236fb8,
  214246. 0x7cd8663e, 0x29ad5f82, 0x39721ffe, 0x2951fc83, 0x1d21fbfa,
  214247. 0x400d144f, 0x1cde06e7, 0x91792e6b, 0x9042596b, 0x29ad5166,
  214248. 0x3365c8e5, 0x9aeefe98, 0xe2220e85, 0x70c2aee3, 0xbcb53189,
  214249. 0x9ff100bc, 0x477ca3db, 0xf532973f, 0x27074176, 0x9a2bd01b,
  214250. 0xa12118ac, 0x3dd79f93, 0xf3425209, 0xc6f5d7db, 0x563a8ff7,
  214251. 0xd7b0ec4f, 0x0da313fc },
  214252. { 0x15aa2557, 0x37125a8c, 0x00893e9c, 0xca21d70c, 0x67b8a823,
  214253. 0x48713994, 0x7cb0042a, 0x0d3e9a74, 0xc9e2ce18, 0x2d2bf4ff,
  214254. 0x049aeac2, 0xd5531a0d, 0xf03d0660, 0x4d29a616, 0x1f1b7f00,
  214255. 0x473d50d6, 0xca3de50c, 0x3af0ecbb, 0x09c28f27, 0xe2959bea,
  214256. 0xf8704664, 0x6d7c2ea0, 0x731083ef, 0xadfae4e1, 0x941c2554,
  214257. 0x50940c26, 0xa1162d03, 0x44167410, 0x1e82290e, 0x620230d8,
  214258. 0xdb414acc, 0x63630be8 },
  214259. { 0x8a7d2e41, 0xbf8d5222, 0xeb62f879, 0x49e75823, 0x6c402d89,
  214260. 0x1b4d33dd, 0xde2c59ad, 0x883e04d6, 0x49b9dc38, 0xbf3f38f4,
  214261. 0xb4b70c4c, 0x9d997d18, 0x13cea045, 0x1f69b20c, 0x58e2606d,
  214262. 0xca3d7025, 0x261d1b79, 0x3d4fd977, 0x5a1436fa, 0x56aeafa8,
  214263. 0xbb443c07, 0x369b3e98, 0xe558f6be, 0xfce5186c, 0xf8ac8f89,
  214264. 0xeb0cd478, 0xd5e5aa72, 0x68074f37, 0x68544eb0, 0x295845c0,
  214265. 0xf16688ed, 0x306a9871 },
  214266. { 0x634ec136, 0xbc451e9d, 0x0e6f658f, 0x1edf27ca, 0xc0db4120,
  214267. 0xa9be0152, 0xc5bfee67, 0x87b6ef20, 0x9a2d6023, 0x35283238,
  214268. 0xc7afb899, 0x60e564d8, 0x0ac9c2de, 0x4af22bc0, 0x82a9d22b,
  214269. 0x28e6f631, 0xf532701b, 0xc075c701, 0x82075f91, 0xf6d418f8,
  214270. 0x1beaa511, 0xf9fa628d, 0x6e72a13d, 0x551e7a17, 0x77f4c01c,
  214271. 0x9306215b, 0x93c9d588, 0x71aba731, 0x58e57cd4, 0x6443ebe0,
  214272. 0xe8103e37, 0x2833ac41 },
  214273. { 0x8da5ec5c, 0x7e564b86, 0x1c08db24, 0xac3d9da8, 0x8c57a728,
  214274. 0x9d7c1f0b, 0x9d343dc2, 0x3512afe7, 0xfdc60339, 0xb438e4cf,
  214275. 0xdcfa1941, 0x7d5a2700, 0x27320449, 0xd5f323f8, 0x1393c6e6,
  214276. 0x1b87a58e, 0x04baa431, 0xecb68bd1, 0x4722b4d7, 0xc09c1c5a,
  214277. 0x206b5faa, 0xf42faa97, 0x9976327e, 0xe1dcbcd6, 0x087787d9,
  214278. 0x655ba9e4, 0xde5c0191, 0xbd59c757, 0x0bcf3538, 0x673020ed,
  214279. 0xa49d6303, 0x120cd454 },
  214280. { 0xcab0f9ee, 0xebfdb8f4, 0x2cce58ee, 0xbc003ef0, 0x5a8d0665,
  214281. 0x9b6a6841, 0x9b957774, 0x642ed3a6, 0x4721ab5c, 0x3de487f0,
  214282. 0x21a4f0d3, 0xef2ff380, 0x29dbddcd, 0xbd16f558, 0x0e93dff2,
  214283. 0x2ef05b4b, 0x0bc9aec1, 0xde1faa12, 0xd467fa92, 0x66dae2c2,
  214284. 0x5eb33e34, 0x758daf64, 0x8f0103cb, 0xa67ad9f6, 0x9be02430,
  214285. 0x151f693a, 0xeb4054bc, 0xd5698496, 0x7019336e, 0x8ef1677e,
  214286. 0x7fdeea3e, 0x021cfd16 },
  214287. { 0xdf5c36f3, 0x5c73715f, 0xd64ad254, 0x703bde37, 0xf2cf7713,
  214288. 0x55368d10, 0x0f3993c8, 0x1e5ec7b7, 0x304ae4ca, 0xfdb16776,
  214289. 0x3d3bb18b, 0x0d8f717e, 0x66343d5a, 0x5267073f, 0x156008b5,
  214290. 0xfaeb52ef, 0x224a470f, 0xb97ad5f9, 0xed2ab51a, 0xaf86e391,
  214291. 0x9974302c, 0xdc0c7e57, 0xfd0ae28a, 0xc88fa817, 0xbf8ed59c,
  214292. 0x807c22df, 0xeb128bb6, 0x5dedc231, 0xa20595a3, 0x71edcd9c,
  214293. 0xc73cf78e, 0x07265b46 },
  214294. { 0xbd66232f, 0x73dd99f0, 0xc4027716, 0xc59aaf89, 0x5b860fc4,
  214295. 0xaf826dfa, 0x7a943f3b, 0x239ea8aa, 0x523c428d, 0x0e0e1b1a,
  214296. 0x6973b95a, 0x55ea0e3a, 0x2557753b, 0xea399caa, 0x06957b1f,
  214297. 0xf8adf72f, 0x3bd34302, 0x0389f341, 0xf8a43a97, 0x333f27d0,
  214298. 0xadaf796f, 0xcd9c0c08, 0x49c12aa2, 0x6dcca49b, 0x7a0ac6e9,
  214299. 0xdd88deee, 0x0644080e, 0x8f47575d, 0x0cc2f4bd, 0x6e9d667d,
  214300. 0x31d1496c, 0x36c5754b },
  214301. { 0xf323d84b, 0x9120046e, 0x7e789c4f, 0xa6991122, 0x921b8055,
  214302. 0x4b0eaf4e, 0x8079974e, 0x6339844a, 0x740f8c79, 0xc905466a,
  214303. 0xcd6def49, 0x1c18d0f7, 0x4b23e4ba, 0x5297da6b, 0xc41800c5,
  214304. 0x1c09dff3, 0x37ef6777, 0x6c49075b, 0x50513ded, 0xa94c3a40,
  214305. 0x6b0b1705, 0x3d6742e9, 0xc48af5ae, 0xc0784494, 0xc95822de,
  214306. 0x40c01532, 0xc164d94f, 0xa2ddade5, 0xa2975eb5, 0xfc8a8ac9,
  214307. 0x1946944e, 0x06fbf861 },
  214308. { 0x3f45aa97, 0x2d65338e, 0x1d040feb, 0xd83b58c8, 0x0fdef8b9,
  214309. 0x05fef59b, 0xe4d7417c, 0x7beb071a, 0xb30a1a23, 0x982b61f5,
  214310. 0xfb65bd03, 0x4c5f2a2a, 0x5cbf6bf3, 0xe40abc9d, 0xf06612a5,
  214311. 0x422c326d, 0x9571ae28, 0xc921e69d, 0x23d3434e, 0x7c88b10b,
  214312. 0x9da07933, 0x96d2e957, 0x3619cf4d, 0x833d46a1, 0xd95eefa1,
  214313. 0xd9d19653, 0xa03e8f0e, 0x2a7d8411, 0x04bb5ab1, 0x5e642953,
  214314. 0x1f0fa9ea, 0x5e9ca0fd },
  214315. { 0x197c5dc4, 0x5bd54571, 0xe78a95a2, 0xe2da40bf, 0xffdb0eb2,
  214316. 0x65fb9efc, 0x0d17467c, 0xe952dc2c, 0xc758c6a3, 0xc1fc9c7b,
  214317. 0xd4034a9a, 0xfc79562c, 0x61f64b56, 0x26e36fbe, 0x1e84728b,
  214318. 0x6adc4b9e, 0xa8f9ac8a, 0x7f165fd3, 0x03e3e013, 0x7bc93a45,
  214319. 0x656478e3, 0xeacc5513, 0x064ddc77, 0xd3391717, 0x76936914,
  214320. 0x75b318dc, 0x362424a6, 0x69b1f1c7, 0x49955f34, 0x8cc2045b,
  214321. 0xc6836af8, 0x940622b3 },
  214322. { 0x0d997973, 0x4710ccb7, 0xd3f8f115, 0x3b29625d, 0x5b97abd5,
  214323. 0x8cf0c4d5, 0x673e14a5, 0xc6321e0a, 0x3d262246, 0x0541af9d,
  214324. 0x6fc83b11, 0xde6d8754, 0xf01652a4, 0x47e97da8, 0xad9802b6,
  214325. 0x0f82b3a6, 0xae9c44b2, 0x69aa4075, 0xced2bf77, 0xaf3f5de2,
  214326. 0x497a40da, 0x1ef1ea8a, 0x3c23ba9c, 0x2e0f8608, 0xf190a2c8,
  214327. 0xd8a998a4, 0xcfde3368, 0xe2b49c8c, 0xbde6bd71, 0xb9f49824,
  214328. 0x785bedb6, 0x80bb1664 },
  214329. { 0xfd145cb5, 0x05e575fe, 0xac5e6883, 0x155ee561, 0x8793b273,
  214330. 0x461e70cf, 0x133b2338, 0x9f1553de, 0xa2a7ba07, 0x2fb9e0c3,
  214331. 0x3e7086fa, 0xc3bfd6a8, 0x8bb4cb93, 0xb6ba8500, 0x76f82dbd,
  214332. 0x0b66d789, 0x54eb49ff, 0x7d5a6ff6, 0x1f20b322, 0xcd65d237,
  214333. 0x54e29cdc, 0x79ea49c2, 0xcb118ff9, 0x64975963, 0xcc58000b,
  214334. 0x969598dd, 0x110c779c, 0x95107918, 0x63b85a35, 0xedfc1548,
  214335. 0x41212350, 0x077ba5ea },
  214336. { 0xcdd86f61, 0x0b3a38d3, 0x0502a0ab, 0x43121445, 0x806d0272,
  214337. 0x1912edc5, 0x8a32f10f, 0x01dc1f98, 0x0e80c760, 0xbb1d31d1,
  214338. 0xf464e8b3, 0xd46ec7e5, 0x9abf49ee, 0xd569af36, 0x2cdade77,
  214339. 0x9d286ea7, 0x45ad5920, 0x2be7020d, 0x6299ae7f, 0xabe5236e,
  214340. 0xd3f55c07, 0xc93179bd, 0x52350e80, 0x8138995a, 0xaff07586,
  214341. 0x0901265c, 0xf4739653, 0x5b3c81b2, 0x9bc77d21, 0xbaf7581d,
  214342. 0x4591a2e2, 0x6b2006df },
  214343. { 0x965b1bc1, 0xb2fe50a8, 0x962bb4fd, 0x931f536a, 0x000e7f99,
  214344. 0xd5718d33, 0x53d5125e, 0x84728f25, 0xd2125caf, 0x4f8a6184,
  214345. 0x357f679e, 0x54f1a701, 0x1531c05a, 0x70a9f40c, 0x6fa8b775,
  214346. 0x10d0cb97, 0x9dc12ce9, 0xb476f41e, 0x2755f894, 0x5c8d7a75,
  214347. 0x625741a4, 0xd6c12e10, 0xc917b16c, 0x262a6fb8, 0x38d6b0a0,
  214348. 0x24d116e6, 0x32c38e83, 0x849540c0, 0x66868afc, 0x855b911c,
  214349. 0xbd26b550, 0x53217ea6 },
  214350. { 0x259f52b4, 0xfc840473, 0xe621146c, 0x968da9cb, 0xcacbd26e,
  214351. 0x964eb85e, 0xe4a54344, 0xab7daa2d, 0x381a4ff7, 0x6dc3b848,
  214352. 0x41c815ef, 0xa07a96b3, 0xc3d4b1e1, 0xc4fae9e8, 0x42ce9ea8,
  214353. 0x0f938d1e, 0x35cc052f, 0xa727dacc, 0xe9a06f07, 0xc81e01c9,
  214354. 0x4a6d65a1, 0xa9e08dcb, 0x6044a9a6, 0xf8e2d173, 0xf2bd295b,
  214355. 0x99893dd0, 0xf9781b12, 0xa08d3379, 0x61830ac2, 0x64bd6001,
  214356. 0xd9adbeef, 0x0386931e },
  214357. { 0xd09885a5, 0xd0d7abb3, 0xe355bb07, 0xed9d2b67, 0x536ebaed,
  214358. 0x3bc238cf, 0x699ce4d6, 0x61ca2e78, 0x111594cd, 0x354ff447,
  214359. 0x03316ad2, 0x55cbe709, 0x49fff5c4, 0x418679fd, 0x0f9c6c40,
  214360. 0x75bacd75, 0x2972721a, 0x677edc88, 0xe5ef502f, 0x82596887,
  214361. 0xbf320e0e, 0x459e9367, 0x8bbdccb2, 0x81ce36ef, 0xb766863d,
  214362. 0x1ba097fc, 0xd58c6db8, 0xcd3a21d6, 0xb4a8748b, 0x0e4967cd,
  214363. 0x15041c20, 0x2caaf749 },
  214364. { 0x6ed20424, 0x44f98006, 0x22471545, 0xb3e4ea23, 0x781a8c86,
  214365. 0x268ed1a5, 0x7ae5b70b, 0x48d0ab75, 0x356d3982, 0x6ca8b320,
  214366. 0x2df31fa4, 0x9ce8e681, 0xd925dcf2, 0xb909d232, 0xf56723de,
  214367. 0x302c8f78, 0xabac96f9, 0x11725d69, 0x57d1a170, 0x656a47ca,
  214368. 0xc18a2be7, 0x6bb5d511, 0xad50d9d9, 0xb56e45f1, 0x70b05518,
  214369. 0x36e886e2, 0x09d8ff91, 0xc7c71f3d, 0x9350361e, 0x65a1bbe2,
  214370. 0x45fe3bd8, 0x86d7f532 },
  214371. { 0xb0bf719a, 0x99f16eb6, 0x8bc3d913, 0xb6975098, 0x26cd01b4,
  214372. 0xfae50e52, 0x90898d1c, 0xd3e3ac54, 0x887ec666, 0x4da3b9db,
  214373. 0xfbea45b8, 0x58300644, 0x8355b058, 0x369f3bd9, 0x579bcc13,
  214374. 0x0fb239a8, 0x6e2bd811, 0x4f5b4539, 0x24198fd2, 0x007f3baf,
  214375. 0x8837d51d, 0x68a676db, 0xeae75b16, 0x68eeea62, 0x3db6083c,
  214376. 0x5ffe5f94, 0x7d836c5a, 0x52c94d0f, 0xcbc1ff85, 0x5a4c3c6f,
  214377. 0x86c0b4dd, 0x682a55e3 },
  214378. { 0x587495aa, 0xc8f235a4, 0x34c7245d, 0x2276026c, 0xb75a46e3,
  214379. 0xd6ae0cc5, 0xecc3e5e7, 0x890d3965, 0x14296629, 0x1b13342f,
  214380. 0x8a877227, 0xc89927e6, 0x2324a68b, 0x1543f27e, 0x49cdc21a,
  214381. 0x6c447684, 0x1452d0ac, 0x9bc7fd4f, 0xff4b045c, 0x2cc30a31,
  214382. 0x852f7611, 0x415d46a0, 0xc6fdd7a6, 0xad737052, 0x7b4c7c91,
  214383. 0xdcecc3ab, 0x7688d70c, 0xd2cdf01b, 0xe40d3905, 0x054f2542,
  214384. 0xfefe4dcd, 0x02227fa6 },
  214385. { 0xb751948b, 0x1805efd9, 0xfdfd225d, 0x8efeed46, 0x4f2c8b22,
  214386. 0xcb128e09, 0x96f7c5e5, 0x9d1090bf, 0xb4cbeca0, 0x0959d044,
  214387. 0x8e08cb04, 0x21c955f9, 0x68fa4fce, 0xbc1f279d, 0x0710ae9a,
  214388. 0xb021e14e, 0x881167f4, 0x64d16e9f, 0xbbc9f1a5, 0xf5a5c22e,
  214389. 0xe3420eea, 0x5f3716df, 0xd5c4e843, 0x971eb915, 0x28ffba81,
  214390. 0x64fc55fc, 0x7dd37578, 0x3427e54d, 0x15ebc7d0, 0x446e6a62,
  214391. 0x29269778, 0x547e249a },
  214392. { 0xa1ffda27, 0x4706868a, 0x7955cf50, 0xb4e6cdcc, 0x0a63f3d8,
  214393. 0xf65151e1, 0x9de5e70a, 0x5b4127ea, 0xf9342823, 0x3d2c09ba,
  214394. 0xaa2f7d51, 0x18c99d83, 0xddeec025, 0xa0c5bb1d, 0x03dcf1ce,
  214395. 0x7ffddf84, 0x616fdeda, 0xe57e4d29, 0x7932a1f0, 0xd2456569,
  214396. 0x3191d4e3, 0x7475e0e8, 0xc220218b, 0x3479bea1, 0x8bcb2505,
  214397. 0xfceb5c90, 0x3c6132e6, 0x1c685cea, 0xbfe6c1eb, 0xc42dc745,
  214398. 0xd2b08eea, 0x45a41cc0 },
  214399. { 0x4dbbf0e1, 0x3ea9b2c7, 0xa17cf70e, 0x41ff962f, 0x5eeb4c66,
  214400. 0xdc1ea758, 0xa9beb17e, 0x4f5412d2, 0xa285741a, 0x2c9e4f52,
  214401. 0x984fd11f, 0x93df7da4, 0x0df3184e, 0xb2afbddc, 0x2421e375,
  214402. 0x96323d25, 0x49df781e, 0xc87be1e4, 0x3d589bea, 0x145601ed,
  214403. 0x28fff6dd, 0x0f0bd9bd, 0x8a0f298c, 0x2d3259d4, 0xd88e6944,
  214404. 0x362d7a77, 0xb6ac2af6, 0xa84c06b6, 0xd087da02, 0xba850ac9,
  214405. 0x42ee40c8, 0x128763c9 },
  214406. { 0xacbac178, 0x29a80f07, 0x34b08f6e, 0x7cc20044, 0x70feded2,
  214407. 0xe9631d14, 0x86615767, 0xb2115da3, 0xcb088548, 0x7c75f5c4,
  214408. 0x9a2e8e03, 0x5b29d213, 0x8b881752, 0xfe9fda66, 0xc1de7ebc,
  214409. 0x3f1d8d88, 0x03218123, 0xb476565e, 0xb1c995f3, 0x07365561,
  214410. 0xb13eb71b, 0x2160cb18, 0x99b3a0eb, 0x7e8da513, 0xb20fcd74,
  214411. 0x5e8ca1f9, 0xb4126d72, 0x6a7e0067, 0x68bb637f, 0x1e8204b7,
  214412. 0xfc4f74d2, 0x75e96bcc },
  214413. { 0x0d19716e, 0x189d1fdc, 0x7c384525, 0xdf585058, 0xea987d2a,
  214414. 0x64a846d1, 0x6c07150f, 0x12b6bf83, 0x4d6fd5b7, 0x91d85d46,
  214415. 0x4f53f55f, 0xa9788836, 0x81509129, 0x60083bd8, 0xea876f48,
  214416. 0xa7672683, 0xc15b2489, 0xe80b2e7a, 0x42d1d992, 0x985ef8d2,
  214417. 0xcf3de492, 0x9c57b029, 0xb1487627, 0xfe02f83c, 0x8ae5b687,
  214418. 0xaeba4fe4, 0x5d6b8196, 0x8a86f09b, 0xa16e523d, 0xd88f566b,
  214419. 0xba268949, 0x309a6e9a },
  214420. { 0xbdfbe97a, 0xef27ee50, 0xb8c50c4d, 0x1a5fe70f, 0x7fe09f5c,
  214421. 0xcc7beb01, 0xbed36cc5, 0x8fa15a85, 0x7550ed3a, 0xc0c3acdb,
  214422. 0xeb908681, 0xc581ef87, 0xc49d5ccb, 0xa15b3362, 0x1fa264e8,
  214423. 0x0fbb1714, 0x8e1eee88, 0x267f8d8f, 0x21c2b63d, 0xd31ccfd6,
  214424. 0x53be7efd, 0x924dbe7d, 0xdb2a358a, 0xd42e877f, 0x75d68ac1,
  214425. 0xcf9673c7, 0x714fea55, 0xe35978fd, 0x5769b202, 0xeeb36653,
  214426. 0xd7593789, 0x0458258a },
  214427. { 0xa042dbdf, 0x5df71a74, 0x5779dfa2, 0x2d405857, 0x0d2e6657,
  214428. 0x0e66cba7, 0xca2e892e, 0x285d6745, 0x0f0e6b5f, 0xf56a8def,
  214429. 0xa30767c3, 0xe0ee851d, 0x43346b9c, 0x98c05658, 0xd6b3c742,
  214430. 0xb35fce26, 0x39777e00, 0xc0895bff, 0xe7b6d886, 0x83c8f6a6,
  214431. 0x4f02904b, 0xbee14843, 0x2e84ec34, 0x7f74915b, 0x96d10991,
  214432. 0xbaaf663c, 0xe41facc0, 0x004b8757, 0x6f86c029, 0xa2b880e5,
  214433. 0x95b77358, 0x53f4a3e0 },
  214434. { 0x89fc48e7, 0x11bb08ce, 0xafab5aeb, 0xba60c577, 0xa0c1cb5a,
  214435. 0xf06bcbf8, 0x79757cb6, 0x7d2efaea, 0x76319160, 0xe26d90b1,
  214436. 0x2b77b7a9, 0x42aa1ab6, 0x285df2bf, 0x38eec0cd, 0xf3a8f7f0,
  214437. 0xd35947f5, 0xfc1cb5b5, 0x97c8dc0e, 0xc45845cf, 0xfeb8cca0,
  214438. 0x249e26f2, 0x16e8d989, 0x483ed89a, 0x7c264e6d, 0x51d91073,
  214439. 0x13a3f145, 0x305e99f0, 0x8501562e, 0x6908d563, 0xaaf98d74,
  214440. 0xd723d236, 0x0a99e653 },
  214441. { 0xabbc0559, 0x23536f46, 0x9aa1a160, 0xc163067b, 0x0c1681b5,
  214442. 0x229fd229, 0x1378e907, 0x61254be1, 0xab793a2d, 0xc60ff57a,
  214443. 0x466552db, 0xa6f2df8b, 0x8c170a36, 0x9ad31893, 0x29b74d9a,
  214444. 0xc5cd9abe, 0xf7848523, 0xcf747273, 0x0d0e3063, 0xc126a93a,
  214445. 0x4248e3d8, 0xfe2021e3, 0x8323ddfa, 0xd97343ee, 0x332639e7,
  214446. 0x9f768775, 0x75325548, 0x9650fc31, 0x3eebf7ea, 0xb595dbd1,
  214447. 0x010fcbc0, 0x3a95cb45 },
  214448. { 0x39d7ff2e, 0x954e68cb, 0xc1d5c48f, 0x8dd1cb4b, 0x7169438a,
  214449. 0x02a92c77, 0x91cad8ce, 0x7965c0b0, 0x32cd08d2, 0x0c5798ab,
  214450. 0xa6902bda, 0x1a5bc3c3, 0x5186d218, 0x545d0925, 0xd27e64db,
  214451. 0xf0077cdb, 0x8cd092da, 0x0157caa4, 0x24532ab3, 0x2a2fa3a0,
  214452. 0x41ccaba3, 0xa5fb639b, 0x4744aee6, 0x01702dc1, 0xcdba93da,
  214453. 0x485bb436, 0x329784f1, 0x93597f66, 0xdad672c3, 0x5d713c1d,
  214454. 0x030b7245, 0x366d222e },
  214455. { 0x573ea5b2, 0xd50b4875, 0xa90da44d, 0x0fce401b, 0x7a1a0310,
  214456. 0x7b53fa65, 0xcf114460, 0x722a80a5, 0xa538bf49, 0x0b8ebf05,
  214457. 0xd32acd21, 0xae141147, 0x7b5ad07d, 0x6692712c, 0x3f48ca07,
  214458. 0x6dc5fee7, 0x2b8a78d8, 0x98ed1499, 0xdd2f1759, 0x4e8b3145,
  214459. 0x5f971b8e, 0x43408de1, 0xadf1b368, 0x055ea6dd, 0xe5932b7e,
  214460. 0x4bb76e73, 0xd30893fd, 0x44287153, 0x0661bfda, 0x173dccd2,
  214461. 0x79defd25, 0x9072ba99 },
  214462. { 0x9620ea39, 0x474de4dd, 0xc831cee8, 0xfbf1649f, 0xcd3a9c43,
  214463. 0x0b0e8bb1, 0x3f3df1d5, 0x6a38286f, 0x8f0ec9b3, 0x4ed072b3,
  214464. 0x729c09e3, 0xa6e4c987, 0x8ad12242, 0xea3e8ac6, 0xfbdfa5ba,
  214465. 0x6ae0e22b, 0xb0a0f592, 0x56171ecf, 0x6b871f8d, 0x33b2886d,
  214466. 0x35e11bda, 0x6b19bea9, 0x7f0f153f, 0x4d815a40, 0x7d6c02ee,
  214467. 0x7e608d97, 0xb6a88f46, 0x7e8f23d9, 0x439d1654, 0x26ac9652,
  214468. 0x35546c29, 0x8d92c6bd },
  214469. { 0xabeb0ff7, 0xb3e0d7ce, 0x3e0e42f8, 0xfbe35254, 0xde808499,
  214470. 0x57d1b226, 0x1cd44bc3, 0x9ece2e1f, 0x435cfee1, 0x1245adbc,
  214471. 0xf93f581c, 0x874ee840, 0xbda0b947, 0x916a779c, 0xfa57ae0a,
  214472. 0xabcc815a, 0xf0a621b0, 0x97adec2d, 0x81f90bdc, 0xbe6a502b,
  214473. 0x53bde63d, 0x54bf9de1, 0x78884c25, 0xa88fdabf, 0xcbbb5470,
  214474. 0x30aa52b1, 0x29053ef5, 0xf805396c, 0x8dd827ea, 0x8d43d898,
  214475. 0x5c1ae5c0, 0x4e4bec17 },
  214476. { 0xfcc09676, 0xbf8483a2, 0x19ea9a94, 0x457c4a3f, 0xd702a5dd,
  214477. 0xa6852ef3, 0x843fe7d8, 0xe7915fd2, 0x16e35158, 0x644bba98,
  214478. 0x9ed746f0, 0x8d1b95d0, 0xb90af0b5, 0x47704581, 0xd4fd135e,
  214479. 0x0bd4bc6b, 0xb4e833a5, 0xa6dce067, 0xff56a9a1, 0x2c0e8f30,
  214480. 0xec2c63fe, 0xa9c80800, 0x98f508a8, 0x449c20a5, 0x3292813a,
  214481. 0x02b94cb3, 0xec7e81a2, 0x647e3d28, 0xb4877677, 0x72e67d1a,
  214482. 0x6f9ded24, 0x7a4aa3f5 },
  214483. { 0xe27a0045, 0x559ef1ba, 0xb242cb50, 0xdc812d4f, 0x39cf8d24,
  214484. 0x23a478e4, 0x9b3f9c54, 0x97544fc5, 0xaffa1fcf, 0x5ac68132,
  214485. 0x34a2c83b, 0x74f8fee0, 0xcd3f4bb7, 0x96cc640f, 0xb0512ea6,
  214486. 0x775dce9d, 0xcdce381e, 0x67dca19d, 0xa9d3fe55, 0xc1eeb3f3,
  214487. 0x1a19274f, 0x38e0bf42, 0x28d69b12, 0x15992fb4, 0x9fd09df8,
  214488. 0x48fcebde, 0xb41ab5df, 0xdc9dfa4f, 0xc0a269c5, 0x0cbd7dc8,
  214489. 0xf7f0ade1, 0x60282a7b },
  214490. { 0xdceea2e7, 0x7c07e538, 0x3c42061d, 0x38a322c8, 0x4f1f6516,
  214491. 0x676828f9, 0xc7776a10, 0xf21b69fb, 0xb5e6b405, 0xc63a3417,
  214492. 0x91a7b642, 0x4c99f258, 0x2cad1440, 0x38692ca8, 0x00869bcd,
  214493. 0xf1e82ffe, 0x16fe466a, 0xc30b714e, 0x19019138, 0x5fb742f9,
  214494. 0x0fa516ae, 0xe90166d0, 0xd8c73a43, 0x5550f7ac, 0xfbc5c372,
  214495. 0x2d6a407d, 0x68cc39ed, 0xe47a7539, 0x4a5fbe70, 0x3fd286d9,
  214496. 0x23c6b942, 0x5f4ae9c7 },
  214497. { 0x53f4d561, 0xd96a2dda, 0x16da1992, 0x286d45d0, 0xfdd4b051,
  214498. 0x449a01fb, 0x9f2195ea, 0x25488a0d, 0xa37661b3, 0xc4151b0a,
  214499. 0xf9e5ee02, 0xb98c471e, 0xa8658817, 0xa4bca86e, 0x7a68fc0a,
  214500. 0xbbcadb87, 0x6b7366a9, 0x88b34649, 0x15661c2d, 0x32ee98d4,
  214501. 0xc901420c, 0xf5b3b4c6, 0x2f2752af, 0xa2352735, 0x510e4d9c,
  214502. 0x2f64ce73, 0xaca4aa80, 0x939a7f26, 0x401aa503, 0x9cd3e291,
  214503. 0xdc46afd2, 0x92a01423 },
  214504. { 0x1c2f7dbd, 0xe9f24be1, 0xb7d527fa, 0xda8c900f, 0x8648f128,
  214505. 0x963e25bb, 0x48141941, 0x9ab713e2, 0x7a6756fb, 0xe87f7d01,
  214506. 0x058d90bd, 0x274dd85e, 0x82566abd, 0x823fee7a, 0x74240195,
  214507. 0x9f6230d7, 0xacb5e46e, 0x04579f2c, 0x16a4c87e, 0x2a226263,
  214508. 0xd99b0857, 0x9ca19a43, 0xe488789e, 0x86dc2ba3, 0x9406c3bd,
  214509. 0xf960b5b9, 0x8960957e, 0x6f2c428b, 0x161c515b, 0x90748706,
  214510. 0xaa88cb9b, 0x0fc8fe1e },
  214511. { 0xfeb90f2d, 0x68ae1bed, 0xa48b1559, 0xf393bb3c, 0xf64e9635,
  214512. 0x2be62f9c, 0xf8be75c2, 0x354c2410, 0x5e6f7529, 0xbd7ea703,
  214513. 0x162cab31, 0xc264868e, 0xc860f3ff, 0xb1391e70, 0x1d89837e,
  214514. 0xdf367c75, 0x2bf32941, 0xe150b6b4, 0x78c1318f, 0x95e8f46e,
  214515. 0xa2c4b160, 0x2b3f1dab, 0x701afbf3, 0xc6ccf5ce, 0x5e8874c5,
  214516. 0x3ad27530, 0x5dc6dcbe, 0x39285e51, 0xd99892dd, 0x3c954d86,
  214517. 0xdfd3789f, 0x2d0ba862 },
  214518. { 0xb472e1af, 0xeacd8ee8, 0xb76abbcc, 0xeb354eae, 0xd0d93fbd,
  214519. 0x9b520bf8, 0xfe6fc706, 0xfccd60d7, 0xa4ee2f39, 0xa9353dde,
  214520. 0x9a81e51e, 0x5eb0925e, 0xd1366777, 0xee334da1, 0xd5354d69,
  214521. 0xc1d28c9f, 0x92a5ed54, 0xb9771755, 0xb7f70d81, 0x5d3e367f,
  214522. 0xa933ae7a, 0x7be7eeca, 0xe23cfbb7, 0x264cf1f9, 0x89497681,
  214523. 0x0d129f4a, 0x09b6235b, 0x705375a4, 0x48a376da, 0xccf64c75,
  214524. 0x4d41dbfc, 0x963c8712 },
  214525. { 0xde36a814, 0xbae290cb, 0x733b12b5, 0x9bdb0195, 0xf77fe0e1,
  214526. 0x0ebad867, 0x29720cea, 0x0a7d19fd, 0x9029ec72, 0x434d7651,
  214527. 0xbb51911e, 0x856aff17, 0xd80a7f60, 0xd0a25d9a, 0xf848c106,
  214528. 0xffca86af, 0x43ad749c, 0x53e8bdf9, 0xe3e696bb, 0xfb9e0284,
  214529. 0xeeee4215, 0x3eb6630a, 0x2ecf3c63, 0x9d8fbb9e, 0x4e00c0c0,
  214530. 0x71da4ffa, 0x5d57beac, 0xb296be59, 0xa8cec7ef, 0x1751fbad,
  214531. 0xff55d7bd, 0x2d03eb3c },
  214532. { 0x04f2ec1d, 0xeb16925f, 0x0d147ee2, 0xa878f276, 0xaad9d9e0,
  214533. 0x442df604, 0x3f71035b, 0x891df44b, 0x8cb95d5b, 0xc28272b3,
  214534. 0x5ee8ed23, 0x6f14efb5, 0x13b0f3e3, 0xf3c4460f, 0x6bd7335e,
  214535. 0x889f9bd7, 0xf755ba6e, 0x889ee771, 0xed219b6c, 0x626984fe,
  214536. 0xec2ee411, 0x2d44c737, 0x63efcd37, 0xb94385a2, 0x6637826b,
  214537. 0xd909321b, 0x3ee6b7a7, 0xc24f8a79, 0xa7cf61b7, 0xa3ca8d24,
  214538. 0xc54bacd9, 0x842e40c1 },
  214539. { 0xa661d843, 0x5a268ed6, 0x4f5b30cd, 0x02328cca, 0x1311e177,
  214540. 0x16e6fed1, 0xc6695967, 0x690decb4, 0x57b2e280, 0xbdac5bf6,
  214541. 0x1efe42d0, 0x827f82ca, 0xca5fca2f, 0xc554ec0a, 0xdde45506,
  214542. 0xac5276c1, 0xe3077513, 0xb7f4cb08, 0xcc8797cc, 0x8caf6d9a,
  214543. 0x0d9332d2, 0xd5964814, 0x285a409f, 0xcc6ae297, 0x6223d093,
  214544. 0x7773c2a5, 0x5128fc09, 0x2d5266ac, 0xbc31fe6c, 0xa596b7cb,
  214545. 0xcac91328, 0x0e63319a },
  214546. { 0xf0360ac2, 0xb5cd2fad, 0x285e605a, 0x86b660de, 0xe25b9b14,
  214547. 0x82c6cf10, 0xaa9ac554, 0x9d5fa38d, 0x526c070e, 0x3dfcf1b8,
  214548. 0x3fccc52d, 0x0379a96b, 0x0bfcc7f5, 0xe3659c29, 0x69d3e6a1,
  214549. 0x5b1a3db5, 0x9b7b42d5, 0xb41528b5, 0x9c22a006, 0x934defa4,
  214550. 0x9b4ce3b6, 0x90f38018, 0xb3abaf32, 0xb073bc04, 0xff8389e2,
  214551. 0x27a5a222, 0xffa5a35b, 0x0b7a9d51, 0x28e1a7c2, 0x4939ecef,
  214552. 0x1872705a, 0x88839da2 },
  214553. { 0x701ce29a, 0x56b66c30, 0x58981d50, 0x3acaf126, 0x105f9f21,
  214554. 0xd4dafc0c, 0x373e3d13, 0xfee571e6, 0xfa2ee3ca, 0xe7269c86,
  214555. 0xdd20385a, 0xf5cca64a, 0x3000e9ac, 0x217f2757, 0x0e7273ef,
  214556. 0xc934db47, 0x355b6776, 0x4294f4f7, 0x6fc05180, 0x1faa36b9,
  214557. 0xb052190b, 0x8f88b1db, 0xe9eaef52, 0x35791b90, 0xdb681b90,
  214558. 0xf37fb2eb, 0x4415c369, 0x39d0a51d, 0x1d2e21c9, 0xfc59cca7,
  214559. 0xa1f50c26, 0x64128cfe },
  214560. { 0xe8f5b0b5, 0xf03678a2, 0xd340f059, 0x5c7e249c, 0x93ca7cec,
  214561. 0x41440441, 0xbc83af98, 0x075ca346, 0xfaa8bbb0, 0xf39f0033,
  214562. 0xf38230f7, 0x3d18f0ed, 0xd448f345, 0x78dff00c, 0xd51aa475,
  214563. 0x849228c0, 0x30c928d1, 0xdd4e2708, 0x8f12cfd3, 0xc66ba686,
  214564. 0x88b3a206, 0x091049db, 0x016dae01, 0xd865d059, 0xe253e37d,
  214565. 0x4599e905, 0x7ce9871b, 0x322cf0c2, 0x174a132e, 0x014f54da,
  214566. 0xbdabcbda, 0x93634a09 },
  214567. { 0xa9a2e304, 0x62826b27, 0xc1a4c124, 0xc57e1866, 0x22381710,
  214568. 0x913ab832, 0xa9847cfe, 0x7e9b6b85, 0x2b5f46fd, 0x29655cf1,
  214569. 0x8038e66d, 0x7295572b, 0x6fa95eab, 0xe4cba601, 0xb9deda81,
  214570. 0xbbc11071, 0x3f1cf61e, 0x97f0009a, 0x373e0cfb, 0x5372777b,
  214571. 0xd139d63b, 0x302f909c, 0x4f87d78e, 0x1ed672da, 0xb4048763,
  214572. 0x362077a3, 0x9dcc22b2, 0xc408c32d, 0x26deeee7, 0x4b4c5bf2,
  214573. 0xbc06357e, 0x266cb467 },
  214574. { 0xb56363e8, 0x6faa4154, 0x3c1aa4db, 0x4b4fd078, 0x2b9e6597,
  214575. 0x14358dde, 0xfa004b84, 0x5b34ae3e, 0xf19911a6, 0xcf44b2ec,
  214576. 0xa536bf78, 0x55caa833, 0x8870dc95, 0x606e1eb9, 0x09f3511d,
  214577. 0xe3c3287d, 0x9d5cf364, 0x68b2f4eb, 0x63ab8c9e, 0xc154e892,
  214578. 0xc36ab611, 0x1548828e, 0xa1b7d120, 0x0932bfcb, 0x5315b8d7,
  214579. 0x7ee7b5bc, 0xf7473ac1, 0x782fd0d1, 0x3c8f2af3, 0xbcb029a8,
  214580. 0x52454ee1, 0x4b1d5a1b },
  214581. { 0x63d52c0c, 0x12fe5174, 0x188c099d, 0x3735525e, 0x360e3956,
  214582. 0x5c621563, 0xacfa5a43, 0x88b3f1ca, 0x797e8107, 0x90123a0a,
  214583. 0xb15e080a, 0xba31f6b5, 0xfca3dada, 0xd7de5e12, 0x0df511c8,
  214584. 0x3287361b, 0x65757d4e, 0x7cc800d4, 0x5207ec91, 0x10810f3d,
  214585. 0x30eea0e3, 0x0d4e56f1, 0x3ea5a2ec, 0xbbf7ee13, 0xbe6abbd0,
  214586. 0x6fc07762, 0x120bf619, 0xc831fdce, 0xb622d42a, 0xe07439fa,
  214587. 0x508e4b27, 0x8186b93f },
  214588. { 0x09312867, 0xc619d154, 0xbfaf7db4, 0x7e042c05, 0x1f5f5dda,
  214589. 0xc1cf1668, 0xa4fc3d82, 0x50aa5057, 0xce68b8fe, 0xed30ed65,
  214590. 0xbeb4d644, 0xecb01c0b, 0x831c0497, 0x7b5dc444, 0x9b7d9b1c,
  214591. 0x351e6a00, 0xd9477c91, 0x4bb863b9, 0x05d4110a, 0xaba65891,
  214592. 0x43580b7a, 0x30086cf4, 0x90be357e, 0xb139c076, 0x27b5214e,
  214593. 0x12bfff1a, 0x22c3ab57, 0x79cfc6d7, 0xf34a9bfa, 0x4743de57,
  214594. 0xc9ee2b2a, 0x0bf97e97 },
  214595. { 0xdda19e96, 0x96ec4ec8, 0x6c306e8b, 0x54ce18ea, 0x65f6918a,
  214596. 0x7e83612b, 0x0d9a0d99, 0x1ac6f68b, 0x62fdcc09, 0x98a697a4,
  214597. 0x95bc3e13, 0x65ce25f1, 0xb3939730, 0x1896ecda, 0x32f12806,
  214598. 0x9eb81a0f, 0x1d2dc7df, 0xd3d7416e, 0xad473599, 0xe22c7976,
  214599. 0x9f5ef439, 0x3de37a9a, 0x9e69d94e, 0x6b7ac0ab, 0x0a9d0bc8,
  214600. 0xe6bfa9e0, 0x5676f120, 0x576a870d, 0xfeaac23f, 0x3bd91bb4,
  214601. 0x3e40aabb, 0x8fe5482c },
  214602. { 0xce9a4d1e, 0x85ae67c2, 0x4f1d2038, 0x4c3eb803, 0x25d06192,
  214603. 0x5c6c8f3a, 0x308fb41c, 0x803de0ad, 0xe71c294e, 0x9961f5bc,
  214604. 0xf02eb0da, 0xdc62078d, 0xb64ae8b6, 0xc87ef515, 0x50b4d18f,
  214605. 0x69679f1e, 0x52199f43, 0xc5c009a1, 0x0f640a5f, 0xa7d484be,
  214606. 0x23dab566, 0x4c918bb1, 0x64275d2c, 0xa67c114c, 0xcad2ded6,
  214607. 0x95a913b9, 0x6b4b5c8d, 0x189ed18b, 0xb42d3bf6, 0x4aeb6206,
  214608. 0xbbc8bc3f, 0x3928c669 },
  214609. { 0xdacb4b64, 0xde4bea4a, 0xf26179a1, 0x03f62a44, 0x7a9112a4,
  214610. 0xf3aac94e, 0xd36f331e, 0x90448fbd, 0x407b85c4, 0x426042bc,
  214611. 0x2121b77b, 0x5ad8a596, 0x67cee984, 0x31674a4f, 0x4e3b2f0d,
  214612. 0x7fae8bbe, 0xa7c930eb, 0x681df6dd, 0xc259d0d4, 0xadeefa98,
  214613. 0xbea1c1fd, 0x1b14d9e6, 0x21d405d1, 0x3baadc8b, 0x73892754,
  214614. 0xf01dff93, 0xf071cde4, 0x81c35b3e, 0x9150d0d9, 0x1704d2e1,
  214615. 0x355134f6, 0x6ccc888f },
  214616. { 0x7ad7504c, 0xf8d36f0e, 0xf7959ddd, 0xbca3265f, 0xfede67aa,
  214617. 0x0dcd1ede, 0xbaebf32f, 0x1276f4ce, 0x014edcfc, 0x6825a6e6,
  214618. 0x99ad8eb7, 0x0b8c1a82, 0x09b8ce1e, 0x312024a9, 0x9cbd351a,
  214619. 0xcb8fd98b, 0xfab1e8be, 0xa4841378, 0x3973cacf, 0x17ed0f5d,
  214620. 0x259d5254, 0xa17e1484, 0x74b91393, 0x53d5b843, 0x1aca3ce9,
  214621. 0x8f792b21, 0xc8c0f815, 0x035ff110, 0xad4ed7bd, 0x6afa6357,
  214622. 0xb26faef9, 0x2f151980 },
  214623. { 0x29d2d439, 0x0c8631da, 0xbc039955, 0x121fbbc2, 0x6c05b75b,
  214624. 0x3e5a9792, 0xb6ce47ec, 0x6d6cf4c0, 0x9d88c658, 0xbaaa1767,
  214625. 0xf3355a17, 0x031db9e7, 0x0aef5a85, 0x8381e3d8, 0x15a31bdf,
  214626. 0xc71db290, 0x9498fd7d, 0x638f6b74, 0x13beeef6, 0x44edf3f9,
  214627. 0xf4ab67b3, 0xe6173271, 0xfd22df11, 0x3a202c70, 0x205c4e92,
  214628. 0xf7be0389, 0xa8eb9920, 0x1c219085, 0xbeb54aaa, 0x6c805ce8,
  214629. 0x0ac58d65, 0x354b05b7 },
  214630. { 0x7a9170e9, 0x7171e236, 0x4cad50cd, 0x01eec42d, 0x3cddccfb,
  214631. 0xffbe824f, 0xa66cae1a, 0xa73e8ce3, 0x965c7d01, 0xb7138a7f,
  214632. 0x5c3d971e, 0x00058e3f, 0x2ff0a72b, 0x52591ac3, 0xbbbce76f,
  214633. 0xa32fb5bc, 0xa9f81a18, 0xf3241ab8, 0xeca68630, 0xf31d3332,
  214634. 0x4482f13b, 0x847af9fc, 0xa4681be2, 0x6196e217, 0xe55efcf9,
  214635. 0x9938f932, 0x70acc705, 0x3e7dacb8, 0xcf09fac2, 0xd41be893,
  214636. 0xae3523a1, 0x48dc55c4 },
  214637. { 0xa5092193, 0x8e623826, 0x6898970c, 0xe46ec362, 0x25c9eb41,
  214638. 0x2f1356af, 0x83c7d245, 0x41780640, 0x97d00e38, 0x982def67,
  214639. 0xa512151c, 0x382eb6e7, 0x8af58869, 0x154e1077, 0x8a51cf02,
  214640. 0x18707075, 0x71313c58, 0xcdeba9f7, 0xba155904, 0x5d67b973,
  214641. 0x1d0d7b3a, 0x851c9f4b, 0x8b8af2cd, 0x19f29d71, 0x986b8d62,
  214642. 0xcb94ccff, 0xb93b9c33, 0x8725e24b, 0x66e38c68, 0x405ce4c5,
  214643. 0x0b6dc021, 0x5f6a8edd },
  214644. { 0x8f9a8690, 0x83704ca5, 0x2f76a407, 0x3f369766, 0x69201028,
  214645. 0xfbc12d8c, 0xbce3a4cf, 0x4cd58f16, 0x04aab26d, 0x7804664a,
  214646. 0x4ea457a8, 0x005cfbba, 0xb8a59794, 0x537951b3, 0x4fe1f739,
  214647. 0x4ca2b9e4, 0xdf325797, 0xe4428acd, 0x0ea243db, 0x648da342,
  214648. 0xf43ce01e, 0xcce6562b, 0xf27db490, 0x840f0421, 0x8bfb7cf0,
  214649. 0x156ccb70, 0x5a8797d3, 0x9b33480d, 0x9eb814bb, 0x2e12e07a,
  214650. 0xca7f87ac, 0x1ca65072 },
  214651. { 0x2b9d25a0, 0xfbb321cf, 0x40a746db, 0x66affdca, 0x59e368b5,
  214652. 0xc1c1530e, 0x7d80068f, 0x56ed1ea4, 0x5647dd68, 0x9b74d8fe,
  214653. 0x89b78da8, 0x1d96b507, 0x8bbe3391, 0x39b75243, 0x0d858c5f,
  214654. 0xef8d443e, 0x9646aa34, 0x4dd2db49, 0xe667543c, 0x7fad3bd1,
  214655. 0x68980985, 0xd0d710c0, 0x49facaba, 0x9f7aff32, 0x14f9a192,
  214656. 0x055dec1c, 0x1fb307a1, 0xaca66399, 0x35ffff64, 0xac44fd91,
  214657. 0xcbad3cee, 0x462cafb6 },
  214658. { 0xde3237dd, 0x1660a647, 0x82b87404, 0x95f735cc, 0xddfa55f8,
  214659. 0xf7879f59, 0x726b914a, 0x15ef043e, 0x1c93e298, 0x1875393d,
  214660. 0x6ef18331, 0xa1a2be74, 0x25a9a12b, 0x4e7e8dfc, 0xa9c3917f,
  214661. 0xdfefc97d, 0x0a2ebe41, 0xbc875d03, 0xa732d1cc, 0x0f75d235,
  214662. 0xd9baa6d3, 0x06fee7fe, 0x65f48576, 0xaa784fab, 0x513f83c0,
  214663. 0x23155e22, 0x3e8f9d13, 0xd2fb7718, 0xb546eafd, 0x2a291503,
  214664. 0x6cd93608, 0x1293c98c },
  214665. { 0x49d53b77, 0x72781251, 0x96eafac7, 0xa6ab403d, 0x4a36b711,
  214666. 0xb7d7c7db, 0x87e771c1, 0x8238c708, 0x33b37522, 0x495f6abf,
  214667. 0x8c87530d, 0xb0b0289c, 0xe77b111a, 0xca83cb86, 0xa1bd189e,
  214668. 0xbe1c0fb8, 0x1ae9d7c7, 0x58cfb2fb, 0x4940c3e8, 0xd05c23c5,
  214669. 0x74ad9107, 0x16e79e41, 0x064e7142, 0xa0a47f05, 0xfdfd614f,
  214670. 0xc6929cd4, 0x3946988b, 0xedb2584c, 0xe46f8fb1, 0x73e4b5f3,
  214671. 0x68ea94ba, 0x53b79aa1 },
  214672. { 0x44bbb6a1, 0x216fafce, 0x67821728, 0xd3a5bba0, 0xa9dd939a,
  214673. 0xef1e4b30, 0xf19efafe, 0x022eaf3d, 0x7b4ec014, 0xfed5abce,
  214674. 0x512c6738, 0x64968ee6, 0x29fe89a2, 0x23119869, 0x47397c05,
  214675. 0x0d539d8d, 0x234596c4, 0x6400bc54, 0x5346611d, 0xb9287f58,
  214676. 0xc9d5da0f, 0x04099903, 0xc83af2a8, 0xe5ef4997, 0x328151e1,
  214677. 0xc89dc01b, 0x58401104, 0x150fb4a9, 0xf3872c9d, 0x40a6f7d5,
  214678. 0x56c2e833, 0x8290d6d1 },
  214679. { 0xd8546946, 0xf84637c6, 0x69ec57fa, 0xda134a39, 0xd789007e,
  214680. 0xd42359a4, 0x0dc7b809, 0xb42557fe, 0x2d6784a9, 0xe62ae52d,
  214681. 0x0bcadb5f, 0xa2714ca6, 0x33aafca5, 0xcc208de6, 0xed967811,
  214682. 0x2380ed5c, 0xdb321660, 0x6e6b55e9, 0xa675235a, 0x1bead02c,
  214683. 0xb33fa0e1, 0x51cc6ef9, 0xf06a2a08, 0xfd223e26, 0xec47b3cf,
  214684. 0x00f332e1, 0xa0aa984e, 0x459f297b, 0xee952e14, 0x6fa1d969,
  214685. 0x304fabb0, 0x506ef1ab },
  214686. { 0x35bff163, 0x11b4eb27, 0xea9fa984, 0x7130b96f, 0x9deb27ce,
  214687. 0x66aceb3f, 0x9dd1c3d5, 0xa2daf1a5, 0xa73075aa, 0xf5090a7e,
  214688. 0xe3071b58, 0x36a6af39, 0xdf73ad9c, 0xa28d633d, 0xbdc89a16,
  214689. 0xdd354cac, 0xd4dcbc3c, 0xdfea3423, 0x379d92d1, 0x6eec74d2,
  214690. 0x8eed6765, 0xe14a456f, 0xfa8feb1f, 0xfabe7743, 0xb98fcbc7,
  214691. 0x1404ccf8, 0xf71a706e, 0x6ccd2fbf, 0x4d85c678, 0xdaaf3fdb,
  214692. 0x15200344, 0x415b7dbf },
  214693. { 0x7d8377a7, 0x97010586, 0xcb803272, 0x068a3d68, 0xf03a4c32,
  214694. 0xfd67d289, 0x93c8f290, 0x4bc7095d, 0xe9e5a2b8, 0x712fa13c,
  214695. 0x0feb9f3b, 0xfc6ac6c6, 0x6e0e54c2, 0x0cda36d9, 0x86320a01,
  214696. 0x45499751, 0x97f00f11, 0xf9318c91, 0xe6936508, 0x01dc4c3f,
  214697. 0x85f068aa, 0x769a2ef9, 0xa2b5511c, 0x3522cef0, 0xb4122e05,
  214698. 0x006965ed, 0xc175d43f, 0xfce0fafc, 0xec831d59, 0x525dc9bd,
  214699. 0xaf58879d, 0x1ec314f1 },
  214700. { 0x2c8310c2, 0x0663feef, 0x457e3f74, 0xaa7e14da, 0xe5346887,
  214701. 0x392b10fc, 0x637ec2c5, 0xcde4a38f, 0xb542f8df, 0x50773320,
  214702. 0xf7de1711, 0x341302f9, 0xae4b9bc6, 0x018b1c63, 0xdd2f9e6f,
  214703. 0xf001c46e, 0x26eccfa0, 0xd3bb0a97, 0x7746e0c7, 0xa931b99d,
  214704. 0xf5875aec, 0xe0c8b6f7, 0x96939c82, 0xbb32f17c, 0x3de5a664,
  214705. 0x765135d2, 0x52abfa6b, 0x71936cb4, 0x2dc105de, 0xad5cc08f,
  214706. 0x7fff5788, 0x17e91d12 },
  214707. { 0xb7e051ca, 0xbe92ced3, 0x19c776d4, 0xc644d4fd, 0x0086784b,
  214708. 0xc8ab4b52, 0xce9d6b31, 0x3ea66227, 0xd289e9c7, 0x395249a3,
  214709. 0xd12a19ee, 0x54509e65, 0x8c365aec, 0xa7bd4692, 0x77963e0e,
  214710. 0x354997e4, 0xb599732d, 0x0d765957, 0x91d4a3b6, 0x99584aeb,
  214711. 0x1deb3e28, 0x6e653ea4, 0x572571df, 0xca7c98ed, 0xb18ae1f9,
  214712. 0xf301a38f, 0x63f7b97e, 0x1629f7c2, 0xafc4a0d5, 0xdf242282,
  214713. 0x3ddd0c01, 0x118f3b4b },
  214714. { 0x7ad4762b, 0x74a0a0a8, 0x8c58d175, 0x1aef84da, 0x4cf76d86,
  214715. 0x16ff4960, 0x7e60d98b, 0xc0be8786, 0x3ecc1dba, 0x83637ffb,
  214716. 0x5dd6147a, 0xc244a609, 0x5b0846e5, 0xa3e17834, 0xe77a4c05,
  214717. 0x735eb686, 0xdf758695, 0x5bc18b4f, 0x1bdfe52f, 0x15618d0b,
  214718. 0x00715ba1, 0x878ecc0d, 0xc2dd617f, 0x1dbdbd1a, 0x21b61710,
  214719. 0x21d2b631, 0x44f593c2, 0x22ce8a79, 0x44f17024, 0x3b9b536a,
  214720. 0x8d03e727, 0x01d0a67c },
  214721. { 0x1e46533c, 0x7b964236, 0xfb88c2ae, 0xe9477990, 0xa42c4a18,
  214722. 0x019b5d16, 0xd83c7a45, 0x7135e81d, 0x4cb663e3, 0x74a69bdd,
  214723. 0xe76c0d63, 0x7b67ecdb, 0x11e68da6, 0x03d54521, 0xd2e8650a,
  214724. 0x596cceb5, 0x2af03b37, 0xcd572dfd, 0xfabd5952, 0x52364ba1,
  214725. 0xb4ed8569, 0x7f47d456, 0xc950d5d4, 0x5ad8b572, 0x486e2f84,
  214726. 0xcadd2dfa, 0xc56bb044, 0xdd527b43, 0x997c08e6, 0xc9adba24,
  214727. 0x7da6320f, 0x1b625b06 },
  214728. { 0x4fd8446d, 0x44dfaa7b, 0xaf6febeb, 0xc01b2f01, 0xfe8838b5,
  214729. 0xbf444388, 0xbba9758b, 0xf33c434f, 0x87156bc9, 0x2b971cba,
  214730. 0x1f49098b, 0x6b245e5c, 0x2b41c5dd, 0x87dcb534, 0x34d852d7,
  214731. 0xdb1f80c6, 0x2433da34, 0x6d6e3258, 0x3f7df0c2, 0xf6682065,
  214732. 0x360cb365, 0xc4ca567c, 0x9826656a, 0x321faac2, 0xbf069768,
  214733. 0x13f5ca6f, 0xa7076639, 0x15397921, 0x8400736e, 0xbdf14328,
  214734. 0x19fc948d, 0x333eca96 },
  214735. { 0xac775d81, 0x23337948, 0xd41dbbca, 0x38c2518f, 0xbcfce948,
  214736. 0x623c7a4f, 0x54703fe7, 0xaad36236, 0x13fb3b5b, 0x2b3a13a4,
  214737. 0x7f5c01f0, 0x5db3565a, 0x52359661, 0xd72408dc, 0x1d616e91,
  214738. 0x5a17f8e5, 0xcb25b999, 0x90c16eeb, 0x3393743e, 0xf35e8cf1,
  214739. 0xe54b64a7, 0x987da74a, 0x65cd449d, 0x557b322a, 0x37e7b15d,
  214740. 0x765082a5, 0xf2cd134f, 0x4d25c742, 0x4ccf0746, 0xae9d9c07,
  214741. 0x8728d135, 0x72fc2110 },
  214742. { 0xf96004c8, 0xa906b203, 0x458055ff, 0xd83f95cf, 0x55f35909,
  214743. 0xd77d5867, 0xe550c8ee, 0x4a9ea6fb, 0x55a06081, 0x91c8cca9,
  214744. 0xbce82062, 0x4a1fee78, 0x9a3df85e, 0xeb9ade06, 0x7d3de666,
  214745. 0xfbbdcf0c, 0x5d336d51, 0x228a391b, 0x5c2ffc3c, 0x760f8d28,
  214746. 0x2f7b165b, 0x1ee48de3, 0x56177040, 0x03803d84, 0x9deff9a0,
  214747. 0xe573f648, 0xa17e35a4, 0xe1a2738e, 0x8840a6c6, 0x238ef17c,
  214748. 0xb11ed92d, 0x480946f8 },
  214749. { 0xfd71f119, 0x84c747a8, 0x53eb3695, 0x19e65c5e, 0x6298587a,
  214750. 0x0e2f6786, 0xab18d6f4, 0x48a48899, 0xc630b8c0, 0xa1a99024,
  214751. 0x2caaf892, 0x84975096, 0xe20fd624, 0xc8869aba, 0x6c2b7dd4,
  214752. 0x3b72b04d, 0x0992f7d0, 0xe2775eb6, 0x7d06e684, 0x0089c06e,
  214753. 0xe4bbd007, 0xcb3b4361, 0x4ba846e4, 0xa1ae666b, 0x46464d9e,
  214754. 0xc01c2eb2, 0xc1f8539f, 0xf86f2be6, 0xcf68afc7, 0x16e8e8ae,
  214755. 0xc7386902, 0x8dab61fd },
  214756. { 0xd54d1d45, 0x42a5c903, 0xff4f9ba2, 0xacd4297e, 0x34d478b4,
  214757. 0x2d88b520, 0x08c4621a, 0x35b2ba2b, 0x34865402, 0xd3d239bb,
  214758. 0x911f32e6, 0x1de76aed, 0x3f06fdc2, 0x877f8bcf, 0x9ec51502,
  214759. 0x802714c1, 0xa590700d, 0xa10444eb, 0x31dcc957, 0x8694229f,
  214760. 0xb8169fed, 0x5ece77ab, 0x2caf080e, 0x55be8a15, 0xcbd7cef1,
  214761. 0x3eb21b14, 0x67b97ee1, 0x9def7ad1, 0x118f690c, 0xe03ca879,
  214762. 0xf99b29e7, 0x6f77e62d },
  214763. { 0xe40bbf59, 0xa271bded, 0x6401aad6, 0x177ba453, 0x73541cd1,
  214764. 0x1755e035, 0x4b71b02f, 0x3465b466, 0xa813359f, 0x22eb7113,
  214765. 0x6f38eac7, 0x9792a8fd, 0xff3bf3b5, 0x11aa012f, 0xf85c3fbf,
  214766. 0x99aafabf, 0x06c0cc42, 0x91e0a2ef, 0x773b7b3a, 0x314d5d57,
  214767. 0xd669840a, 0xae5e2e76, 0x2e5a8be6, 0x86136073, 0xc1cf5580,
  214768. 0xee6d7578, 0x68bed102, 0x2344e00f, 0x8184f0eb, 0x799d7886,
  214769. 0xc3d2cf80, 0x63819c91 },
  214770. { 0x7884b073, 0xca5392e1, 0xeb1267ea, 0x9ec3a1fc, 0x907038a7,
  214771. 0x3d07f5f0, 0xe4c47b70, 0xcb2ac07c, 0x1bf96b91, 0xf96664ee,
  214772. 0x2aea4fbf, 0xebf57589, 0xfade6500, 0x5aabf391, 0x171d1204,
  214773. 0xc5b3376f, 0xa0d3d81a, 0x1ff60c51, 0x976a844b, 0x10b2cfe7,
  214774. 0xbda6125a, 0xe131cc9a, 0x4ebd453e, 0xe0fc16d3, 0x504b6bc1,
  214775. 0xc0d0319a, 0x0a2f8cab, 0xe43a0be7, 0x55e49b47, 0xc80afeec,
  214776. 0x8265d7ee, 0x67d48d12 },
  214777. { 0xea2d56d6, 0x068d59a7, 0x27480a63, 0xd71abd0e, 0xae7366cd,
  214778. 0x6bd11db0, 0x07204ebc, 0xfbb639ca, 0xf77e6293, 0x89a242e7,
  214779. 0x75ba8c3d, 0xdee7ca2b, 0x64a2f9a8, 0x472ddc3d, 0x7561a010,
  214780. 0x84229df4, 0xc5b649d4, 0x95f62c85, 0x4dc927cd, 0xfdd56b1b,
  214781. 0x5ee60596, 0xfe8bb120, 0xabf29401, 0x3efcaa50, 0x10d1c184,
  214782. 0xd4900d0f, 0x28b01df5, 0x2cf113a9, 0x1f0e43f5, 0xa3d7ebc3,
  214783. 0xe8384dc7, 0x27950e38 },
  214784. { 0xe1d0fa79, 0xeab21ff0, 0x048b5de9, 0x4b9fd033, 0x2fe374cb,
  214785. 0x4c934689, 0x4eb21f6b, 0xbb4827fa, 0xa925e7e7, 0x46716f79,
  214786. 0x7dd4c531, 0x1442bf36, 0xd2e96ddf, 0x2073954c, 0x8502aa89,
  214787. 0x4e0141ae, 0x8eef6cc9, 0x8ee00e1a, 0x5880cdaf, 0x55ce8491,
  214788. 0x69628046, 0xff3aba5c, 0x5d15dfbf, 0x335cc4f8, 0x9f684f25,
  214789. 0xa7f0440c, 0xbb1e5bd8, 0xae80453f, 0xff2225ab, 0xa1c99813,
  214790. 0x79b25d71, 0x54ff7884 },
  214791. { 0xde40b068, 0x27c6ee30, 0xe6f3a51e, 0x9226465b, 0xfa3b21f6,
  214792. 0xe24a4604, 0xc0418115, 0x50a5a5ad, 0x8df90d2b, 0xe3285441,
  214793. 0xdcb0c00f, 0xbb74e58f, 0x4a2c08e3, 0xc68f1b3b, 0x0ccd9ec9,
  214794. 0x339df081, 0xb786ea9f, 0x915362dc, 0xc955aead, 0x28945e31,
  214795. 0x8b6a6c6b, 0xd6a2c01d, 0x3678a427, 0x069e82dc, 0x28c9302c,
  214796. 0x17875500, 0x9fa101e6, 0x8acda965, 0xee30b286, 0x4e4e4573,
  214797. 0x3f1830fe, 0x8adbad85 },
  214798. { 0x0969d524, 0x060ae11f, 0xf39bcc79, 0xf42fdaf7, 0x7cc1fcc2,
  214799. 0x3cec6766, 0xe2336d4f, 0x456b9cf2, 0x8e1c0f7f, 0x6aa1f5de,
  214800. 0x0984fb0e, 0xcdbc2ad2, 0x1b464b28, 0x4090cfa6, 0x1243f3ef,
  214801. 0x40d86f30, 0xcd5e87e7, 0x95b16ccc, 0x3026cd41, 0x403f168c,
  214802. 0x816c0730, 0xdbe386cb, 0x58407a1d, 0x14eb86f3, 0x1717e1af,
  214803. 0xf588b4f8, 0x66cbc96c, 0xb75c41a6, 0x027e71c1, 0xf342c1aa,
  214804. 0xc0945e5f, 0x73930036 },
  214805. { 0x22cdaf42, 0x954f757d, 0xf4181aab, 0x788b591d, 0xf5514f25,
  214806. 0x8b986819, 0xf18fd5bc, 0x69642e08, 0x022ceb91, 0x92b305d1,
  214807. 0x6a4f6985, 0x1715903e, 0x61179cae, 0x4bd7d69d, 0xd29c01aa,
  214808. 0xdacdfd5d, 0xd91108cc, 0x705ddd5a, 0x64ac8f15, 0x434ac7b1,
  214809. 0xb524632f, 0x61a514e1, 0x731fc447, 0x45b9e61b, 0xe0961b31,
  214810. 0xcf561348, 0x73eaf223, 0x9c28a967, 0xaa7c99d3, 0x5bd10182,
  214811. 0xe42965e2, 0x8bc6ec4a },
  214812. { 0xe7f2a32b, 0xd096e5c0, 0x09388a30, 0xff54800c, 0x401e360c,
  214813. 0x06fe437c, 0xbb6054a6, 0x6655fc9c, 0x8457aa6e, 0x510e1860,
  214814. 0x2b29b2b7, 0xa0acfca2, 0x51b7da61, 0x732483e3, 0x6be6c8ca,
  214815. 0xe31471ee, 0x8b65c9a1, 0xe565431c, 0x48d65cbb, 0xfc9ac3b9,
  214816. 0xae9b2aa8, 0xd308fc21, 0xaa60aa6a, 0xd6a7df0d, 0x982fc0d4,
  214817. 0x2844d96a, 0x5847a4d7, 0xab012c2c, 0xdceb8955, 0x2b3c8f71,
  214818. 0xbe9c7e15, 0x8e85437d },
  214819. };
  214820. /* Perform the modular exponentiation in Fp* for SAKKE.
  214821. *
  214822. * Base is fixed to be the g parameter - a precomputed table is used.
  214823. *
  214824. * Striping: 128 points at a distance of 8 combined.
  214825. * Total of 256 points in table.
  214826. * Square and multiply performed in Fp*.
  214827. *
  214828. * base [in] Base. MP integer.
  214829. * exp [in] Exponent. MP integer.
  214830. * res [out] Result. MP integer.
  214831. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  214832. * and MEMORY_E if memory allocation fails.
  214833. */
  214834. int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
  214835. {
  214836. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  214837. defined(WOLFSSL_SP_SMALL_STACK)
  214838. sp_digit* td;
  214839. sp_digit* t;
  214840. sp_digit* tx;
  214841. sp_digit* ty;
  214842. #else
  214843. sp_digit t[36 * 2 * 32];
  214844. sp_digit tx[2 * 32];
  214845. sp_digit ty[2 * 32];
  214846. #endif
  214847. sp_digit* r = NULL;
  214848. unsigned char e[128];
  214849. int err = MP_OKAY;
  214850. int i;
  214851. int y;
  214852. (void)base;
  214853. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  214854. defined(WOLFSSL_SP_SMALL_STACK)
  214855. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 38 * 32 * 2, NULL,
  214856. DYNAMIC_TYPE_TMP_BUFFER);
  214857. if (td == NULL) {
  214858. err = MEMORY_E;
  214859. }
  214860. #endif
  214861. if (err == MP_OKAY) {
  214862. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  214863. defined(WOLFSSL_SP_SMALL_STACK)
  214864. t = td;
  214865. tx = td + 36 * 32 * 2;
  214866. ty = td + 37 * 32 * 2;
  214867. #endif
  214868. r = ty;
  214869. (void)mp_to_unsigned_bin_len(exp, e, 128);
  214870. XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 32);
  214871. y = e[112] >> 7;
  214872. y |= (e[96] >> 7) << 1;
  214873. y |= (e[80] >> 7) << 2;
  214874. y |= (e[64] >> 7) << 3;
  214875. y |= (e[48] >> 7) << 4;
  214876. y |= (e[32] >> 7) << 5;
  214877. y |= (e[16] >> 7) << 6;
  214878. y |= (e[0] >> 7) << 7;
  214879. XMEMCPY(ty, sp_1024_g_table[y], sizeof(sp_digit) * 32);
  214880. for (i = 126; i >= 0; i--) {
  214881. y = (e[127 - (i / 8)] >> (i & 0x7)) & 1;
  214882. y |= ((e[111 - (i / 8)] >> (i & 0x7)) & 1) << 1;
  214883. y |= ((e[95 - (i / 8)] >> (i & 0x7)) & 1) << 2;
  214884. y |= ((e[79 - (i / 8)] >> (i & 0x7)) & 1) << 3;
  214885. y |= ((e[63 - (i / 8)] >> (i & 0x7)) & 1) << 4;
  214886. y |= ((e[47 - (i / 8)] >> (i & 0x7)) & 1) << 5;
  214887. y |= ((e[31 - (i / 8)] >> (i & 0x7)) & 1) << 6;
  214888. y |= ((e[15 - (i / 8)] >> (i & 0x7)) & 1) << 7;
  214889. sp_1024_proj_sqr_32(tx, ty, t);
  214890. sp_1024_proj_mul_qx1_32(tx, ty, sp_1024_g_table[y], t);
  214891. }
  214892. }
  214893. if (err == MP_OKAY) {
  214894. sp_1024_mont_inv_32(tx, tx, t);
  214895. sp_1024_mont_mul_32(r, tx, ty, p1024_mod, p1024_mp_mod);
  214896. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  214897. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  214898. err = sp_1024_to_mp(r, res);
  214899. }
  214900. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  214901. defined(WOLFSSL_SP_SMALL_STACK)
  214902. if (td != NULL) {
  214903. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  214904. }
  214905. #endif
  214906. return err;
  214907. }
  214908. #endif /* WOLFSSL_SP_SMALL */
  214909. /* Multiply p* by q* in projective coordinates.
  214910. *
  214911. * p.x' = (p.x * q.x) - (p.y * q.y)
  214912. * p.y' = (p.x * q.y) + (p.y * q.x)
  214913. * But applying Karatsuba:
  214914. * v0 = p.x * q.x
  214915. * v1 = p.y * q.y
  214916. * p.x' = v0 - v1
  214917. * p.y' = (px + py) * (qx + qy) - v0 - v1
  214918. *
  214919. * px [in,out] A single precision integer - X ordinate of number to multiply.
  214920. * py [in,out] A single precision integer - Y ordinate of number to multiply.
  214921. * qx [in] A single precision integer - X ordinate of number of
  214922. * multiplier.
  214923. * qy [in] A single precision integer - Y ordinate of number of
  214924. * multiplier.
  214925. * t [in] Two single precision integers - temps.
  214926. */
  214927. static void sp_1024_proj_mul_32(sp_digit* px, sp_digit* py,
  214928. const sp_digit* qx, const sp_digit* qy, sp_digit* t)
  214929. {
  214930. sp_digit* t1 = t;
  214931. sp_digit* t2 = t + 2 * 32;
  214932. /* t1 = px + py */
  214933. sp_1024_mont_add_32(t1, px, py, p1024_mod);
  214934. /* t2 = qx + qy */
  214935. sp_1024_mont_add_32(t2, qx, qy, p1024_mod);
  214936. /* t2 = (px + py) * (qx + qy) */
  214937. sp_1024_mont_mul_32(t2, t1, t2, p1024_mod, p1024_mp_mod);
  214938. /* t1 = py * qy */
  214939. sp_1024_mont_mul_32(t1, py, qy, p1024_mod, p1024_mp_mod);
  214940. /* t2 = (px + py) * (qx + qy) - (py * qy) */
  214941. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  214942. /* px = px * qx */
  214943. sp_1024_mont_mul_32(px, px, qx, p1024_mod, p1024_mp_mod);
  214944. /* py = (px + py) * (qx + qy) - (py * qy) - (px * qx) */
  214945. sp_1024_mont_sub_32(py, t2, px, p1024_mod);
  214946. /* px = (px * qx) - (py * qy)*/
  214947. sp_1024_mont_sub_32(px, px, t1, p1024_mod);
  214948. }
  214949. #ifndef WOLFSSL_SP_SMALL
  214950. /*
  214951. * Convert point from projective to affine but keep in Montgomery form.
  214952. *
  214953. * p [in,out] Point to convert.
  214954. * t [in] Temporary numbers: 2.
  214955. */
  214956. static void sp_1024_mont_map_32(sp_point_1024* p, sp_digit* t)
  214957. {
  214958. sp_digit* t1 = t;
  214959. sp_digit* t2 = t + 2 * 32;
  214960. sp_1024_mont_inv_32(t1, p->z, t2);
  214961. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  214962. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  214963. sp_1024_mont_mul_32(p->x, p->x, t2, p1024_mod, p1024_mp_mod);
  214964. sp_1024_mont_mul_32(p->y, p->y, t1, p1024_mod, p1024_mp_mod);
  214965. XMEMCPY(p->z, p1024_norm_mod, sizeof(sp_digit) * 32);
  214966. }
  214967. #endif /* WOLFSSL_SP_SMALL */
  214968. /*
  214969. * Calculate gradient of line through P, P and [-2]P, accumulate line and
  214970. * double P.
  214971. *
  214972. * Calculations:
  214973. * l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
  214974. * r.x = l * (p.x + q.x * p.z^2) - 2 * p.y^2
  214975. * r.y = 2 * p.y * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
  214976. * v* = v*^2 * r*
  214977. * p'.x = l^2 - 8 * p.y^2 * p.x
  214978. * p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4
  214979. * p'.z = 2 * p.y * p.z
  214980. *
  214981. * @param [in,out] vx X-ordinate of projective value in F*.
  214982. * @param [in,out] vy Y-ordinate of projective value in F*.
  214983. * @param [in,out] p ECC point - point on E(F_p^2) to double.
  214984. * @param [in] q ECC point - second point on E(F_P^2).
  214985. * @param [in] t SP temporaries (6 used).
  214986. */
  214987. static void sp_1024_accumulate_line_dbl_32(sp_digit* vx, sp_digit* vy,
  214988. sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  214989. {
  214990. sp_digit* t1 = t + 0 * 32;
  214991. sp_digit* pz2 = t + 2 * 32;
  214992. sp_digit* rx = t + 4 * 32;
  214993. sp_digit* ry = t + 6 * 32;
  214994. sp_digit* l = t + 8 * 32;
  214995. sp_digit* ty = t + 10 * 32;
  214996. /* v = v^2 */
  214997. sp_1024_proj_sqr_32(vx, vy, t);
  214998. /* pz2 = p.z^2 */
  214999. sp_1024_mont_sqr_32(pz2, p->z, p1024_mod, p1024_mp_mod);
  215000. /* t1 = p.x + p.z^2 */
  215001. sp_1024_mont_add_32(ty, p->x, pz2, p1024_mod);
  215002. /* l = p.x - p.z^2 */
  215003. sp_1024_mont_sub_32(l, p->x, pz2, p1024_mod);
  215004. /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
  215005. sp_1024_mont_mul_32(t1, l, ty, p1024_mod, p1024_mp_mod);
  215006. /* l = 3 * (p.x^2 - p.z^4) */
  215007. sp_1024_mont_tpl_32(l, t1, p1024_mod);
  215008. /* t1 = q.x * p.z^2 */
  215009. sp_1024_mont_mul_32(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
  215010. /* t1 = p.x + q.x * p.z^2 */
  215011. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  215012. /* r.x = l * (p.x + q.x * p.z^2) */
  215013. sp_1024_mont_mul_32(rx, l, t1, p1024_mod, p1024_mp_mod);
  215014. /* r.y = 2 * p.y */
  215015. sp_1024_mont_dbl_32(ry, p->y, p1024_mod);
  215016. /* ty = 4 * p.y ^ 2 */
  215017. sp_1024_mont_sqr_32(ty, ry, p1024_mod, p1024_mp_mod);
  215018. /* t1 = 2 * p.y ^ 2 */
  215019. sp_1024_mont_div2_32(t1, ty, p1024_mod);
  215020. /* r.x -= 2 * (p.y ^ 2) */
  215021. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  215022. /* p'.z = p.y * 2 * p.z */
  215023. sp_1024_mont_mul_32(p->z, p->z, ry, p1024_mod, p1024_mp_mod);
  215024. /* r.y = p'.z * p.z^2 */
  215025. sp_1024_mont_mul_32(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
  215026. /* r.y = p'.z * p.z^2 * q.y */
  215027. sp_1024_mont_mul_32(ry, t1, q->y, p1024_mod, p1024_mp_mod);
  215028. /* v = v^2 * r */
  215029. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  215030. /* Double point using previously calculated values
  215031. * l = 3 * (p.x - p.z^2).(p.x + p.z^2)
  215032. * ty = 4 * p.y^2
  215033. * p'.z = 2 * p.y * p.z
  215034. */
  215035. /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */
  215036. sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod);
  215037. /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */
  215038. sp_1024_mont_div2_32(t1, t1, p1024_mod);
  215039. /* p'.y = 4 * p.y^2 * p.x */
  215040. sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
  215041. /* p'.x = l^2 */
  215042. sp_1024_mont_sqr_32(p->x, l, p1024_mod, p1024_mp_mod);
  215043. /* p'.x = l^2 - 4 * p.y^2 * p.x */
  215044. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  215045. /* p'.x = l^2 - 8 * p.y^2 * p.x */
  215046. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  215047. /* p'.y = 4 * p.y^2 * p.x - p.x' */
  215048. sp_1024_mont_sub_32(ty, p->y, p->x, p1024_mod);
  215049. /* p'.y = (4 * p.y^2 * p.x - p'.x) * l */
  215050. sp_1024_mont_mul_32(p->y, ty, l, p1024_mod, p1024_mp_mod);
  215051. /* p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4 */
  215052. sp_1024_mont_sub_32(p->y, p->y, t1, p1024_mod);
  215053. }
  215054. #ifdef WOLFSSL_SP_SMALL
  215055. /*
  215056. * Calculate gradient of line through C, P and -C-P, accumulate line and
  215057. * add P to C.
  215058. *
  215059. * Calculations:
  215060. * r.x = (q.x + p.x) * c.y - (q.x * c.z^2 + c.x) * p.y * c.z
  215061. * r.y = (c.x - p.x * c.z^2) * q.y * c.z
  215062. * v* = v* * r*
  215063. * r = p.y * c.z^3 - c.y
  215064. * c'.x = r^2 + h^3 - 2 * c.x * h^2
  215065. * c'.y = r * (c'.x - c.x * h^2) - c.y * h^3
  215066. * c'.z = (c.x - p.x * c.z^2) * c.z
  215067. *
  215068. * @param [in,out] vx X-ordinate of projective value in F*.
  215069. * @param [in,out] vy Y-ordinate of projective value in F*.
  215070. * @param [in,out] c ECC point - current point on E(F_p^2) to be added
  215071. * to.
  215072. * @param [in] p ECC point - point on E(F_p^2) to add.
  215073. * @param [in] q ECC point - second point on E(F_P^2).
  215074. * @param [in] qx_px SP that is a constant value across adds.
  215075. * @param [in] t SP temporaries (6 used).
  215076. */
  215077. static void sp_1024_accumulate_line_add_one_32(sp_digit* vx, sp_digit* vy,
  215078. sp_point_1024* c, sp_point_1024* p, sp_point_1024* q, sp_digit* qx_px,
  215079. sp_digit* t)
  215080. {
  215081. sp_digit* t1 = t;
  215082. sp_digit* t2 = t + 2 * 32;
  215083. sp_digit* rx = t + 4 * 32;
  215084. sp_digit* ry = t + 6 * 32;
  215085. sp_digit* h = t + 8 * 32;
  215086. sp_digit* r = t + 10 * 32;
  215087. /* r.x = (q.x + p.x) * c.y */
  215088. sp_1024_mont_mul_32(rx, qx_px, c->y, p1024_mod, p1024_mp_mod);
  215089. /* t2 = c.z^2 */
  215090. sp_1024_mont_sqr_32(t2, c->z, p1024_mod, p1024_mp_mod);
  215091. /* t1 = q.x * c.z^2 */
  215092. sp_1024_mont_mul_32(t1, q->x, t2, p1024_mod, p1024_mp_mod);
  215093. /* t1 = q.x * c.z^2 + c.x */
  215094. sp_1024_mont_add_32(h, t1, c->x, p1024_mod);
  215095. /* r = p.y * c.z */
  215096. sp_1024_mont_mul_32(ry, p->y, c->z, p1024_mod, p1024_mp_mod);
  215097. /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
  215098. sp_1024_mont_mul_32(t1, h, ry, p1024_mod, p1024_mp_mod);
  215099. /* r = p.y * c.z * c.z^2 = p.y * c.z^3 */
  215100. sp_1024_mont_mul_32(r, ry, t2, p1024_mod, p1024_mp_mod);
  215101. /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
  215102. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  215103. /* t1 = p.x * c.z^2 */
  215104. sp_1024_mont_mul_32(t1, p->x, t2, p1024_mod, p1024_mp_mod);
  215105. /* h = c.x - p.x * c.z^2 */
  215106. sp_1024_mont_sub_32(h, c->x, t1, p1024_mod);
  215107. /* c'.z = (c.x - p.x * c.z^2) * c.z */
  215108. sp_1024_mont_mul_32(c->z, h, c->z, p1024_mod, p1024_mp_mod);
  215109. /* r.y = (c.x - p.x * c.z^2) * c.z * q.y */
  215110. sp_1024_mont_mul_32(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
  215111. /* v = v * r */
  215112. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  215113. /* Add p to c using previously calculated values.
  215114. * h = c.x - p.x * c.z^2
  215115. * r = p.y * c.z^3
  215116. * c'.z = (c.x - p.x * c.z^2) * c.z
  215117. */
  215118. /* r = p.y * c.z^3 - c.y */
  215119. sp_1024_mont_sub_32(r, r, c->y, p1024_mod);
  215120. /* t1 = r^2 */
  215121. sp_1024_mont_sqr_32(t1, r, p1024_mod, p1024_mp_mod);
  215122. /* t2 = h^2 */
  215123. sp_1024_mont_sqr_32(rx, h, p1024_mod, p1024_mp_mod);
  215124. /* ry = c.x * h^2 */
  215125. sp_1024_mont_mul_32(ry, c->x, rx, p1024_mod, p1024_mp_mod);
  215126. /* t2 = h^3 */
  215127. sp_1024_mont_mul_32(t2, rx, h, p1024_mod, p1024_mp_mod);
  215128. /* c->x = r^2 + h^3 */
  215129. sp_1024_mont_add_32(c->x, t1, t2, p1024_mod);
  215130. /* t1 = 2 * c.x * h^2 */
  215131. sp_1024_mont_dbl_32(t1, ry, p1024_mod);
  215132. /* c'.x = r^2 + h^3 - 2 * c.x * h^2 */
  215133. sp_1024_mont_sub_32(c->x, c->x, t1, p1024_mod);
  215134. /* ry = c'.x - c.x * h^2 */
  215135. sp_1024_mont_sub_32(t1, c->x, ry, p1024_mod);
  215136. /* ry = r * (c'.x - c.x * h^2) */
  215137. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  215138. /* t2 = c.y * h^3 */
  215139. sp_1024_mont_mul_32(t1, t2, c->y, p1024_mod, p1024_mp_mod);
  215140. /* c'.y = r * (c'.x - c.x * h^2) - c.y * h^3 */
  215141. sp_1024_mont_sub_32(c->y, ry, t1, p1024_mod);
  215142. }
  215143. /*
  215144. * Calculate r = pairing <P, Q>.
  215145. *
  215146. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  215147. *
  215148. * @param [in] key SAKKE key.
  215149. * @param [in] p First point on E(F_p)[q].
  215150. * @param [in] q Second point on E(F_p)[q].
  215151. * @param [in] r Result of calculation.
  215152. * @return 0 on success.
  215153. * @return MEMORY_E when dynamic memory allocation fails.
  215154. * @return Other -ve value on internal failure.
  215155. */
  215156. int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
  215157. {
  215158. int err = MP_OKAY;
  215159. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  215160. defined(WOLFSSL_SP_SMALL_STACK)
  215161. sp_digit* td = NULL;
  215162. sp_digit* t;
  215163. sp_digit* vx;
  215164. sp_digit* vy;
  215165. sp_digit* qx_px;
  215166. #else
  215167. sp_digit t[36 * 2 * 32];
  215168. sp_digit vx[2 * 32];
  215169. sp_digit vy[2 * 32];
  215170. sp_digit qx_px[2 * 32];
  215171. sp_point_1024 pd;
  215172. sp_point_1024 qd;
  215173. sp_point_1024 cd;
  215174. #endif
  215175. sp_point_1024* p = NULL;
  215176. sp_point_1024* q = NULL;
  215177. sp_point_1024* c = NULL;
  215178. sp_digit* r = NULL;
  215179. int i;
  215180. err = sp_1024_point_new_32(NULL, pd, p);
  215181. if (err == MP_OKAY) {
  215182. err = sp_1024_point_new_32(NULL, qd, q);
  215183. }
  215184. if (err == MP_OKAY) {
  215185. err = sp_1024_point_new_32(NULL, cd, c);
  215186. }
  215187. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  215188. defined(WOLFSSL_SP_SMALL_STACK)
  215189. if (err == MP_OKAY) {
  215190. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 39 * 32 * 2, NULL,
  215191. DYNAMIC_TYPE_TMP_BUFFER);
  215192. if (td == NULL) {
  215193. err = MEMORY_E;
  215194. }
  215195. }
  215196. #endif
  215197. if (err == MP_OKAY) {
  215198. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  215199. defined(WOLFSSL_SP_SMALL_STACK)
  215200. t = td;
  215201. vx = td + 36 * 32 * 2;
  215202. vy = td + 37 * 32 * 2;
  215203. qx_px = td + 38 * 32 * 2;
  215204. #endif
  215205. r = vy;
  215206. sp_1024_point_from_ecc_point_32(p, pm);
  215207. sp_1024_point_from_ecc_point_32(q, qm);
  215208. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  215209. }
  215210. if (err == MP_OKAY) {
  215211. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  215212. }
  215213. if (err == MP_OKAY) {
  215214. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  215215. }
  215216. if (err == MP_OKAY) {
  215217. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  215218. }
  215219. if (err == MP_OKAY) {
  215220. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  215221. }
  215222. if (err == MP_OKAY) {
  215223. XMEMCPY(c, p, sizeof(sp_point_1024));
  215224. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  215225. vx[0] = 1;
  215226. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  215227. sp_1024_mont_add_32(qx_px, q->x, p->x, p1024_mod);
  215228. for (i = 1020; i >= 0; i--) {
  215229. /* Accumulate line into v and double point. */
  215230. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  215231. if ((i > 0) && ((p1024_order[i / 32] >> (i % 32)) & 1)) {
  215232. /* Accumulate line into v and add P into C. */
  215233. sp_1024_accumulate_line_add_one_32(vx, vy, c, p, q, qx_px, t);
  215234. }
  215235. }
  215236. /* Final exponentiation */
  215237. sp_1024_proj_sqr_32(vx, vy, t);
  215238. sp_1024_proj_sqr_32(vx, vy, t);
  215239. /* Convert from PF_p[q] to F_p */
  215240. sp_1024_mont_inv_32(vx, vx, t);
  215241. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  215242. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  215243. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  215244. err = sp_1024_to_mp(r, res);
  215245. }
  215246. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  215247. defined(WOLFSSL_SP_SMALL_STACK)
  215248. if (td != NULL) {
  215249. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  215250. }
  215251. #endif
  215252. sp_1024_point_free_32(c, 1, NULL);
  215253. sp_1024_point_free_32(q, 1, NULL);
  215254. sp_1024_point_free_32(p, 1, NULL);
  215255. return err;
  215256. }
  215257. #else
  215258. /*
  215259. * Calculate gradient of line through C, P and -C-P, accumulate line and
  215260. * add P to C.
  215261. *
  215262. * Both C and P have z ordinates to use in the calculation.
  215263. *
  215264. * Calculations:
  215265. * r.x = (q.x * c.z^2 + c.x) * p.y * c.z - (q.x * p.z^2 + p.x) * c.y * p.z
  215266. * r.y = (p.x * c.z^2 - c.x * p.z^2) * q.y * p.z * c.z
  215267. * v* = v* * r*
  215268. * h = p.x * c.z^2 - c.x * p.z^2
  215269. * r = p.y * c.z^3 - c.y * p.z^3
  215270. * c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2
  215271. * c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3
  215272. * c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
  215273. *
  215274. * @param [in,out] vx X-ordinate of projective value in F*.
  215275. * @param [in,out] vy Y-ordinate of projective value in F*.
  215276. * @param [in,out] c ECC point - current point on E(F_p^2) to be added
  215277. * to.
  215278. * @param [in,out] p ECC point - point on E(F_p^2) to add.
  215279. * @param [in,out] q ECC point - second point on E(F_P^2).
  215280. * @param [in,out] t SP temporaries (6 used).
  215281. * @param [in,out] neg Indicates to use negative P.
  215282. * @return 0 on success.
  215283. * @return MEMORY_E when dynamic memory allocation fails.
  215284. * @return Other -ve value on internal failure.
  215285. */
  215286. static void sp_1024_accumulate_line_add_n_32(sp_digit* vx, sp_digit* vy,
  215287. const sp_point_1024* p, const sp_point_1024* q,
  215288. sp_point_1024* c, sp_digit* t, int neg)
  215289. {
  215290. sp_digit* t1 = t;
  215291. sp_digit* t2 = t + 2 * 32;
  215292. sp_digit* rx = t + 4 * 32;
  215293. sp_digit* ry = t + 6 * 32;
  215294. sp_digit* h = t + 8 * 32;
  215295. sp_digit* r = t + 10 * 32;
  215296. /* h = p.z^2 */
  215297. sp_1024_mont_sqr_32(h, p->z, p1024_mod, p1024_mp_mod);
  215298. /* rx = q.x * p.z^2 */
  215299. sp_1024_mont_mul_32(rx, q->x, h, p1024_mod, p1024_mp_mod);
  215300. /* rx = q.x * p.z^2 + p.x */
  215301. sp_1024_mont_add_32(t2, rx, p->x, p1024_mod);
  215302. /* c.y = c.y * p.z */
  215303. sp_1024_mont_mul_32(t1, c->y, p->z, p1024_mod, p1024_mp_mod);
  215304. /* r.x = (q.x * p.z^2 + p.x) * c.y * p.z */
  215305. sp_1024_mont_mul_32(rx, t2, t1, p1024_mod, p1024_mp_mod);
  215306. /* c.y = c.y * p.z^3 */
  215307. sp_1024_mont_mul_32(c->y, t1, h, p1024_mod, p1024_mp_mod);
  215308. /* t2 = c.z^2 */
  215309. sp_1024_mont_sqr_32(t2, c->z, p1024_mod, p1024_mp_mod);
  215310. /* t1 = q.x * c.z^2 */
  215311. sp_1024_mont_mul_32(t1, q->x, t2, p1024_mod, p1024_mp_mod);
  215312. /* t1 = q.x * c.z^2 + c.x */
  215313. sp_1024_mont_add_32(t1, t1, c->x, p1024_mod);
  215314. /* c.x = c.x * p.z^2 */
  215315. sp_1024_mont_mul_32(c->x, c->x, h, p1024_mod, p1024_mp_mod);
  215316. /* r = p.y * c.z */
  215317. sp_1024_mont_mul_32(r, p->y, c->z, p1024_mod, p1024_mp_mod);
  215318. if (neg) {
  215319. /* r = -p.y * c.z */
  215320. sp_1024_mont_sub_32(r, p1024_mod, r, p1024_mod);
  215321. }
  215322. /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
  215323. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  215324. /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
  215325. sp_1024_mont_sub_32(rx, ry, rx, p1024_mod);
  215326. /* t1 = p.x * c.z^2 */
  215327. sp_1024_mont_mul_32(t1, p->x, t2, p1024_mod, p1024_mp_mod);
  215328. /* h = p.x * c.z^2 - c.x * p.z^2 */
  215329. sp_1024_mont_sub_32(h, t1, c->x, p1024_mod);
  215330. /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z */
  215331. sp_1024_mont_mul_32(t1, h, c->z, p1024_mod, p1024_mp_mod);
  215332. /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z */
  215333. sp_1024_mont_mul_32(c->z, t1, p->z, p1024_mod, p1024_mp_mod);
  215334. /* r.y = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z * q.y */
  215335. sp_1024_mont_mul_32(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
  215336. /* r = p.y * c.z^3 */
  215337. sp_1024_mont_mul_32(t1, r, t2, p1024_mod, p1024_mp_mod);
  215338. /* r = p.y * c.z^3 - c.y * p.z^3 */
  215339. sp_1024_mont_sub_32(r, t1, c->y, p1024_mod);
  215340. /* v = v * r */
  215341. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  215342. /* Add p to c using previously calculated values.
  215343. * h = p.x * c.z^2 - c.x * p.z^2
  215344. * r = p.y * c.z^3 - c.y * p.z^3
  215345. * c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
  215346. */
  215347. /* t1 = r^2 */
  215348. sp_1024_mont_sqr_32(t1, r, p1024_mod, p1024_mp_mod);
  215349. /* t2 = h^2 */
  215350. sp_1024_mont_sqr_32(rx, h, p1024_mod, p1024_mp_mod);
  215351. /* ry = c.x * p.z^2 * h^2 */
  215352. sp_1024_mont_mul_32(ry, rx, c->x, p1024_mod, p1024_mp_mod);
  215353. /* t2 = h^3 */
  215354. sp_1024_mont_mul_32(t2, rx, h, p1024_mod, p1024_mp_mod);
  215355. /* c'.x = r^2 - h^3 */
  215356. sp_1024_mont_sub_32(c->x, t1, t2, p1024_mod);
  215357. /* t1 = 2 * c.x * p.z^2 * h^2 */
  215358. sp_1024_mont_dbl_32(t1, ry, p1024_mod);
  215359. /* c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2 */
  215360. sp_1024_mont_sub_32(c->x, c->x, t1, p1024_mod);
  215361. /* ry = c.x * p.z^2 * h^2 - c'.x */
  215362. sp_1024_mont_sub_32(t1, ry, c->x, p1024_mod);
  215363. /* ry = r * (c.x * p.z^2 * h^2 - c'.x) */
  215364. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  215365. /* t2 = c.y * p.z^3 * h^3 */
  215366. sp_1024_mont_mul_32(t1, t2, c->y, p1024_mod, p1024_mp_mod);
  215367. /* c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3 */
  215368. sp_1024_mont_sub_32(c->y, ry, t1, p1024_mod);
  215369. }
  215370. /*
  215371. * Perform n accumulate doubles and doubles of P.
  215372. *
  215373. * py = 2 * p.y
  215374. *
  215375. * For each double:
  215376. * Calculate gradient of line through P, P and [-2]P, accumulate line and
  215377. * double P.
  215378. *
  215379. * Calculations:
  215380. * l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
  215381. * r.x = l * (p.x + q.x * p.z^2) - py^2 / 2
  215382. * r.y = py * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
  215383. * v* = v*^2 * r*
  215384. * p'.x = l^2 - 2 * py^2 * p.x
  215385. * py' = (py^2 * p.x - p'.x) * l - py^4 (= 2 * p'.y)
  215386. * p'.z = py * p.z
  215387. *
  215388. * Finally:
  215389. * p'.y = py' / 2
  215390. *
  215391. * @param [in,out] vx X-ordinate of projective value in F*.
  215392. * @param [in,out] vy Y-ordinate of projective value in F*.
  215393. * @param [in,out] p ECC point - point on E(F_p^2) to double.
  215394. * @param [in] q ECC point - second point on E(F_P^2).
  215395. * @param [in] n Number of times to double.
  215396. * @param [in] t SP temporaries (6 used).
  215397. */
  215398. static void sp_1024_accumulate_line_dbl_n_32(sp_digit* vx, sp_digit* vy,
  215399. sp_point_1024* p, const sp_point_1024* q, int n, sp_digit* t)
  215400. {
  215401. sp_digit* t1 = t + 0 * 32;
  215402. sp_digit* pz2 = t + 2 * 32;
  215403. sp_digit* rx = t + 4 * 32;
  215404. sp_digit* ry = t + 6 * 32;
  215405. sp_digit* l = t + 8 * 32;
  215406. sp_digit* ty = t + 10 * 32;
  215407. int i;
  215408. /* py = 2 * p.y */
  215409. sp_1024_mont_dbl_32(p->y, p->y, p1024_mod);
  215410. for (i = 0; i < n; i++) {
  215411. /* v = v^2 */
  215412. sp_1024_proj_sqr_32(vx, vy, t);
  215413. /* pz2 = p.z^2 */
  215414. sp_1024_mont_sqr_32(pz2, p->z, p1024_mod, p1024_mp_mod);
  215415. /* t1 = p.x + p.z^2 */
  215416. sp_1024_mont_add_32(t1, p->x, pz2, p1024_mod);
  215417. /* l = p.x - p.z^2 */
  215418. sp_1024_mont_sub_32(l, p->x, pz2, p1024_mod);
  215419. /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
  215420. sp_1024_mont_mul_32(ty, l, t1, p1024_mod, p1024_mp_mod);
  215421. /* l = 3 * (p.x^2 - p.z^4) */
  215422. sp_1024_mont_tpl_32(l, ty, p1024_mod);
  215423. /* t1 = q.x * p.z^2 */
  215424. sp_1024_mont_mul_32(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
  215425. /* t1 = p.x + q.x * p.z^2 */
  215426. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  215427. /* r.x = l * (p.x + q.x * p.z^2) */
  215428. sp_1024_mont_mul_32(rx, l, t1, p1024_mod, p1024_mp_mod);
  215429. /* ty = py ^ 2 */
  215430. sp_1024_mont_sqr_32(ty, p->y, p1024_mod, p1024_mp_mod);
  215431. /* t1 = py ^ 2 / 2 */
  215432. sp_1024_mont_div2_32(t1, ty, p1024_mod);
  215433. /* r.x -= py ^ 2 / 2 */
  215434. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  215435. /* p'.z = py * pz */
  215436. sp_1024_mont_mul_32(p->z, p->z, p->y, p1024_mod, p1024_mp_mod);
  215437. /* r.y = p'.z * p.z^2 */
  215438. sp_1024_mont_mul_32(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
  215439. /* r.y = p'.z * p.z^2 * q.y */
  215440. sp_1024_mont_mul_32(ry, t1, q->y, p1024_mod, p1024_mp_mod);
  215441. /* v = v^2 * r */
  215442. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  215443. /* Double point using previously calculated values
  215444. * l = 3 * (p.x - p.z^2).(p.x + p.z^2)
  215445. * ty = py^2
  215446. * p'.z = py * p.z
  215447. */
  215448. /* t1 = py^2 ^ 2 = py^4 */
  215449. sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod);
  215450. /* py' = py^2 * p. x */
  215451. sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
  215452. /* p'.x = l^2 */
  215453. sp_1024_mont_sqr_32(p->x, l, p1024_mod, p1024_mp_mod);
  215454. /* p'.x = l^2 - py^2 * p.x */
  215455. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  215456. /* p'.x = l^2 - 2 * p.y^2 * p.x */
  215457. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  215458. /* py' = py^2 * p.x - p.x' */
  215459. sp_1024_mont_sub_32(ty, p->y, p->x, p1024_mod);
  215460. /* py' = (p.y^2 * p.x - p'.x) * l */
  215461. sp_1024_mont_mul_32(p->y, ty, l, p1024_mod, p1024_mp_mod);
  215462. /* py' = (p.y^2 * p.x - p'.x) * l * 2 */
  215463. sp_1024_mont_dbl_32(p->y, p->y, p1024_mod);
  215464. /* py' = (p.y^2 * p.x - p'.x) * l * 2 - p.y^4 */
  215465. sp_1024_mont_sub_32(p->y, p->y, t1, p1024_mod);
  215466. }
  215467. /* p'.y = py' / 2 */
  215468. sp_1024_mont_div2_32(p->y, p->y, p1024_mod);
  215469. }
  215470. /* Operations to perform based on order - 1.
  215471. * Sliding window. Start at bottom and stop when bottom bit is one.
  215472. * Subtract if top bit in window is one.
  215473. * Width of 6 bits.
  215474. * Pairs: #dbls, add/subtract window value
  215475. */
  215476. static const signed char sp_1024_order_op[] = {
  215477. 5, 6, -13, 9, -21, 6, -5, 8, 31, 6, 3, 6, -27, 6, 25, 9,
  215478. -1, 6, -11, 6, -13, 6, -7, 6, -15, 6, -29, 7, 25, 6, -9, 6,
  215479. -19, 7, 3, 6, 11, 9, -23, 6, 1, 6, 27, 6, 1, 7, -25, 8,
  215480. 13, 7, -13, 7, -23, 10, 19, 7, 7, 7, -3, 7, 27, 6, -7, 7,
  215481. -21, 7, 11, 7, 31, 8, 1, 7, -23, 6, -17, 6, -3, 10, 11, 6,
  215482. -21, 7, -27, 11, -29, 6, -1, 10, 15, 8, 27, 7, 17, 6, 17, 7,
  215483. -13, 8, 13, 6, 21, 7, -29, 6, 19, 7, -25, 6, 11, 9, 29, 7,
  215484. -7, 8, 27, 7, 29, 10, -1, 8, -7, 8, 17, 6, 17, 7, -27, 7,
  215485. -21, 6, -9, 6, -27, 12, -23, 6, 19, 6, 13, 6, -11, 7, 27, 6,
  215486. 17, 6, -7, 6, -25, 7, -29, 6, 9, 7, 7, 6, 13, 6, -25, 6,
  215487. -19, 6, 13, 6, -11, 6, 5, 8, 19, 6, -21, 8, 23, 7, 27, 6,
  215488. -13, 6, -19, 11, 29, 7, -15, 6, -9, 7, -21, 10, -3, 7, 21, 10,
  215489. 25, 6, -15, 6, -23, 6, 21, 6, 1, 6, 21, 7, -3, 6, -3, 7,
  215490. -7, 6, -23, 7, 7, 8, 15, 9, 5, 6, -11, 6, 21, 11, -27, 7,
  215491. 27, 6, -11, 6, 31, 6, -21, 6, 19, 6, -7, 8, -7, 13, -3, 6,
  215492. -7, 7, -3, 6, 1, 6, 7, 8, 19, 8, 11, 9, -9, 7, -31, 12,
  215493. 25, 6, -17, 9, -15, 7, 5, 6, 25, 7, -5, 7, -25, 6, 17, 8,
  215494. -19, 6, -13, 6, 27, 8, 1, 7, -5, 7, -1, 6, 21, 6, 3, 10,
  215495. -3, 1,
  215496. };
  215497. /*
  215498. * Calculate r = pairing <P, Q>.
  215499. *
  215500. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  215501. *
  215502. * Sliding window. Start at bottom and stop when bottom bit is one.
  215503. * Subtract if top bit in window is one.
  215504. * Width of 6 bits.
  215505. *
  215506. * @param [in] pm First point on E(F_p)[q].
  215507. * @param [in] qm Second point on E(F_p)[q].
  215508. * @param [in] res Result of calculation.
  215509. * @return 0 on success.
  215510. * @return MEMORY_E when dynamic memory allocation fails.
  215511. */
  215512. int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
  215513. {
  215514. int err;
  215515. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  215516. defined(WOLFSSL_SP_SMALL_STACK)
  215517. sp_digit* td = NULL;
  215518. sp_digit* t;
  215519. sp_digit* vx;
  215520. sp_digit* vy;
  215521. sp_digit (*pre_vx)[64];
  215522. sp_digit (*pre_vy)[64];
  215523. sp_digit (*pre_nvy)[64];
  215524. sp_point_1024* pre_p;
  215525. #else
  215526. sp_digit t[36 * 2 * 32];
  215527. sp_digit vx[2 * 32];
  215528. sp_digit vy[2 * 32];
  215529. sp_digit pre_vx[16][64];
  215530. sp_digit pre_vy[16][64];
  215531. sp_digit pre_nvy[16][64];
  215532. sp_point_1024 pre_p[16];
  215533. sp_point_1024 pd;
  215534. sp_point_1024 qd;
  215535. sp_point_1024 cd;
  215536. #endif
  215537. sp_point_1024* p = NULL;
  215538. sp_point_1024* q = NULL;
  215539. sp_point_1024* c = NULL;
  215540. sp_digit* r = NULL;
  215541. int i;
  215542. int j;
  215543. err = sp_1024_point_new_32(NULL, pd, p);
  215544. if (err == MP_OKAY) {
  215545. err = sp_1024_point_new_32(NULL, qd, q);
  215546. }
  215547. if (err == MP_OKAY) {
  215548. err = sp_1024_point_new_32(NULL, cd, c);
  215549. }
  215550. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  215551. defined(WOLFSSL_SP_SMALL_STACK)
  215552. if (err == MP_OKAY) {
  215553. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 86 * 32 * 2 + 16 * sizeof(sp_point_1024), NULL,
  215554. DYNAMIC_TYPE_TMP_BUFFER);
  215555. if (td == NULL) {
  215556. err = MEMORY_E;
  215557. }
  215558. }
  215559. #endif
  215560. if (err == MP_OKAY) {
  215561. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  215562. defined(WOLFSSL_SP_SMALL_STACK)
  215563. t = td;
  215564. vx = td + 36 * 32 * 2;
  215565. vy = td + 37 * 32 * 2;
  215566. pre_vx = (sp_digit(*)[64])(td + 38 * 32 * 2);
  215567. pre_vy = (sp_digit(*)[64])(td + 54 * 32 * 2);
  215568. pre_nvy = (sp_digit(*)[64])(td + 70 * 32 * 2);
  215569. pre_p = (sp_point_1024*)(td + 86 * 32 * 2);
  215570. #endif
  215571. r = vy;
  215572. sp_1024_point_from_ecc_point_32(p, pm);
  215573. sp_1024_point_from_ecc_point_32(q, qm);
  215574. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  215575. }
  215576. if (err == MP_OKAY) {
  215577. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  215578. }
  215579. if (err == MP_OKAY) {
  215580. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  215581. }
  215582. if (err == MP_OKAY) {
  215583. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  215584. }
  215585. if (err == MP_OKAY) {
  215586. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  215587. }
  215588. if (err == MP_OKAY) {
  215589. /* Generate pre-computation table: 1, 3, ... , 31 */
  215590. XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
  215591. XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 32);
  215592. pre_vx[0][0] = 1;
  215593. XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 32);
  215594. sp_1024_mont_sub_32(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
  215595. /* [2]P for adding */
  215596. XMEMCPY(c, p, sizeof(sp_point_1024));
  215597. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  215598. vx[0] = 1;
  215599. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  215600. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  215601. /* 3, 5, ... */
  215602. for (i = 1; i < 16; i++) {
  215603. XMEMCPY(&pre_p[i], &pre_p[i-1], sizeof(sp_point_1024));
  215604. XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 32);
  215605. XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 32);
  215606. sp_1024_proj_mul_32(pre_vx[i], pre_vy[i], vx, vy, t);
  215607. sp_1024_accumulate_line_add_n_32(pre_vx[i], pre_vy[i], c,
  215608. q, &pre_p[i], t, 0);
  215609. sp_1024_mont_sub_32(pre_nvy[i], p1024_mod, pre_vy[i], p1024_mod);
  215610. }
  215611. j = sp_1024_order_op[0] / 2;
  215612. XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
  215613. XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 32);
  215614. XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 32);
  215615. /* Accumulate line into v and double point n times. */
  215616. sp_1024_accumulate_line_dbl_n_32(vx, vy, c, q,
  215617. sp_1024_order_op[1], t);
  215618. for (i = 2; i < 290; i += 2) {
  215619. j = sp_1024_order_op[i];
  215620. if (j > 0) {
  215621. j /= 2;
  215622. /* Accumulate line into v and add P into C. */
  215623. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_vy[j], t);
  215624. sp_1024_accumulate_line_add_n_32(vx, vy, &pre_p[j], q, c,
  215625. t, 0);
  215626. }
  215627. else {
  215628. j = -j / 2;
  215629. /* Accumulate line into v and add P into C. */
  215630. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_nvy[j], t);
  215631. sp_1024_accumulate_line_add_n_32(vx, vy, &pre_p[j], q, c,
  215632. t, 1);
  215633. }
  215634. /* Accumulate line into v and double point n times. */
  215635. sp_1024_accumulate_line_dbl_n_32(vx, vy, c, q,
  215636. sp_1024_order_op[i + 1], t);
  215637. }
  215638. /* Final exponentiation */
  215639. sp_1024_proj_sqr_32(vx, vy, t);
  215640. sp_1024_proj_sqr_32(vx, vy, t);
  215641. /* Convert from PF_p[q] to F_p */
  215642. sp_1024_mont_inv_32(vx, vx, t);
  215643. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  215644. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  215645. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  215646. err = sp_1024_to_mp(r, res);
  215647. }
  215648. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  215649. defined(WOLFSSL_SP_SMALL_STACK)
  215650. if (td != NULL) {
  215651. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  215652. }
  215653. #endif
  215654. sp_1024_point_free_32(c, 1, NULL);
  215655. sp_1024_point_free_32(q, 1, NULL);
  215656. sp_1024_point_free_32(p, 1, NULL);
  215657. return err;
  215658. }
  215659. #endif /* WOLFSSL_SP_SMALL */
  215660. #ifdef WOLFSSL_SP_SMALL
  215661. /*
  215662. * Generate table for pairing.
  215663. *
  215664. * Small implementation does not use a table - returns 0 length.
  215665. *
  215666. * pm [in] Point to generate table for.
  215667. * table [in] Generated table.
  215668. * len [in,out] On in, the size of the buffer.
  215669. * On out, length of table generated.
  215670. * @return 0 on success.
  215671. * LENGTH_ONLY_E when table is NULL and only length returned.
  215672. * BUFFER_E when len is too small.
  215673. */
  215674. int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
  215675. word32* len)
  215676. {
  215677. int err = 0;
  215678. if (table == NULL) {
  215679. *len = 0;
  215680. err = LENGTH_ONLY_E;
  215681. }
  215682. else if (*len != 0) {
  215683. err = BUFFER_E;
  215684. }
  215685. (void)*pm;
  215686. return err;
  215687. }
  215688. /*
  215689. * Calculate r = pairing <P, Q>.
  215690. *
  215691. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  215692. *
  215693. * Small implementation does not use a table - use the normal implementation.
  215694. *
  215695. * @param [in] pm First point on E(F_p)[q].
  215696. * @param [in] qm Second point on E(F_p)[q].
  215697. * @param [in] res Result of calculation.
  215698. * @param [in] table Precomputed table of values.
  215699. * @param [in] len Length of precomputed table of values in bytes.
  215700. * @return 0 on success.
  215701. * @return MEMORY_E when dynamic memory allocation fails.
  215702. */
  215703. int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
  215704. mp_int* res, const byte* table, word32 len)
  215705. {
  215706. (void)table;
  215707. (void)len;
  215708. return sp_Pairing_1024(pm, qm, res);
  215709. }
  215710. #else
  215711. /*
  215712. * Calc l and c for the point when doubling p.
  215713. *
  215714. * l = 3 * (p.x^2 - 1) / (2 * p.y)
  215715. * c = l * p.x - p.y
  215716. *
  215717. * @param [out] lr Gradient result - table entry.
  215718. * @param [out] cr Constant result - table entry.
  215719. * @param [in] px X-ordinate of point to double.
  215720. * @param [in] py Y-ordinate of point to double.
  215721. * @param [in] t SP temporaries (3 used).
  215722. */
  215723. static void sp_1024_accum_dbl_calc_lc_32(sp_digit* lr, sp_digit* cr,
  215724. const sp_digit* px, const sp_digit* py, sp_digit* t)
  215725. {
  215726. sp_digit* t1 = t + 33 * 2 * 32;
  215727. sp_digit* t2 = t + 34 * 2 * 32;
  215728. sp_digit* l = t + 35 * 2 * 32;
  215729. /* l = 1 / 2 * p.y */
  215730. sp_1024_mont_dbl_32(l, py, p1024_mod);
  215731. sp_1024_mont_inv_32(l, l, t);
  215732. /* t1 = p.x^2 */
  215733. sp_1024_mont_sqr_32(t1, px, p1024_mod, p1024_mp_mod);
  215734. /* t1 = p.x - 1 */
  215735. sp_1024_mont_sub_32(t1, t1, p1024_norm_mod, p1024_mod);
  215736. /* t1 = 3 * (p.x^2 - 1) */
  215737. sp_1024_mont_dbl_32(t2, t1, p1024_mod);
  215738. sp_1024_mont_add_32(t1, t1, t2, p1024_mod);
  215739. /* t1 = 3 * (p.x^2 - 1) / (2 * p.y) */
  215740. sp_1024_mont_mul_32(l, l, t1, p1024_mod, p1024_mp_mod);
  215741. /* t2 = l * p.x */
  215742. sp_1024_mont_mul_32(t2, l, px, p1024_mod, p1024_mp_mod);
  215743. /* c = t2 = l * p.x - p.y */
  215744. sp_1024_mont_sub_32(t2, t2, py, p1024_mod);
  215745. XMEMCPY(lr, l, sizeof(sp_digit) * 32);
  215746. XMEMCPY(cr, t2, sizeof(sp_digit) * 32);
  215747. }
  215748. /*
  215749. * Calc l and c when adding p and c.
  215750. *
  215751. * l = (c.y - p.y) / (c.x - p.x)
  215752. * c = (p.x * c.y - cx * p.y) / (cx - p.x)
  215753. *
  215754. * @param [out] lr Gradient result - table entry.
  215755. * @param [out] cr Constant result - table entry.
  215756. * @param [in] px X-ordinate of point to add.
  215757. * @param [in] py Y-ordinate of point to add.
  215758. * @param [in] cx X-ordinate of current point.
  215759. * @param [in] cy Y-ordinate of current point.
  215760. * @param [in] t SP temporaries (3 used).
  215761. */
  215762. static void sp_1024_accum_add_calc_lc_32(sp_digit* lr, sp_digit* cr,
  215763. const sp_digit* px, const sp_digit* py, const sp_digit* cx,
  215764. const sp_digit* cy, sp_digit* t)
  215765. {
  215766. sp_digit* t1 = t + 33 * 2 * 32;
  215767. sp_digit* c = t + 34 * 2 * 32;
  215768. sp_digit* l = t + 35 * 2 * 32;
  215769. /* l = 1 / (c.x - p.x) */
  215770. sp_1024_mont_sub_32(l, cx, px, p1024_mod);
  215771. sp_1024_mont_inv_32(l, l, t);
  215772. /* c = p.x * c.y */
  215773. sp_1024_mont_mul_32(c, px, cy, p1024_mod, p1024_mp_mod);
  215774. /* t1 = c.x * p.y */
  215775. sp_1024_mont_mul_32(t1, cx, py, p1024_mod, p1024_mp_mod);
  215776. /* c = (p.x * c.y) - (c.x * p.y) */
  215777. sp_1024_mont_sub_32(c, c, t1, p1024_mod);
  215778. /* c = ((p.x * c.y) - (c.x * p.y)) / (c.x - p.x) */
  215779. sp_1024_mont_mul_32(c, c, l, p1024_mod, p1024_mp_mod);
  215780. /* t1 = c.y - p.y */
  215781. sp_1024_mont_sub_32(t1, cy, py, p1024_mod);
  215782. /* l = (c.y - p.y) / (c.x - p.x) */
  215783. sp_1024_mont_mul_32(l, t1, l, p1024_mod, p1024_mp_mod);
  215784. XMEMCPY(lr, l, sizeof(sp_digit) * 32);
  215785. XMEMCPY(cr, c, sizeof(sp_digit) * 32);
  215786. }
  215787. /*
  215788. * Calculate vx and vy given gradient l and constant c and point q.
  215789. *
  215790. * l is a the gradient and is multiplied by q->x.
  215791. * c is a the constant that is added to the multiplicative result.
  215792. * q->y is the y-ordinate in result to multiply.
  215793. *
  215794. * if dbl
  215795. * v* = v*^2
  215796. * r.x = l * q.x + c
  215797. * r.y = q->y
  215798. * v* = v* * r*
  215799. *
  215800. * @param [in,out] vx X-ordinate of projective value in F*.
  215801. * @param [in,out] vy Y-ordinate of projective value in F*.
  215802. * @param [in] l Gradient to multiply with.
  215803. * @param [in] c Constant to add with.
  215804. * @param [in] q ECC point - second point on E(F_P^2).
  215805. * @param [in] t SP temporaries (3 used).
  215806. * @param [in] dbl Indicates whether this is for doubling. Otherwise
  215807. * adding.
  215808. */
  215809. static void sp_1024_accumulate_line_lc_32(sp_digit* vx, sp_digit* vy,
  215810. const sp_digit* l, const sp_digit* c, const sp_point_1024* q,
  215811. sp_digit* t, int dbl)
  215812. {
  215813. sp_digit* rx = t + 4 * 2 * 32;
  215814. /* v = v^2 */
  215815. if (dbl) {
  215816. sp_1024_proj_sqr_32(vx, vy, t);
  215817. }
  215818. /* rx = l * q.x + c */
  215819. sp_1024_mont_mul_32(rx, l, q->x, p1024_mod, p1024_mp_mod);
  215820. sp_1024_mont_add_32(rx, rx, c, p1024_mod);
  215821. /* v = v^2 * r */
  215822. sp_1024_proj_mul_32(vx, vy, rx, q->y, t);
  215823. }
  215824. /* Operations to perform based on order - 1.
  215825. * Sliding window. Start at bottom and stop when bottom bit is one.
  215826. * Subtract if top bit in window is one.
  215827. * Width of 6 bits.
  215828. * Pairs: #dbls, add/subtract window value
  215829. */
  215830. static const signed char sp_1024_order_op_pre[] = {
  215831. 5, 6, -13, 9, -21, 6, -5, 8, 31, 6, 3, 6, -27, 6, 25, 9,
  215832. -1, 6, -11, 6, -13, 6, -7, 6, -15, 6, -29, 7, 25, 6, -9, 6,
  215833. -19, 7, 3, 6, 11, 9, -23, 6, 1, 6, 27, 6, 1, 7, -25, 8,
  215834. 13, 7, -13, 7, -23, 10, 19, 7, 7, 7, -3, 7, 27, 6, -7, 7,
  215835. -21, 7, 11, 7, 31, 8, 1, 7, -23, 6, -17, 6, -3, 10, 11, 6,
  215836. -21, 7, -27, 11, -29, 6, -1, 10, 15, 8, 27, 7, 17, 6, 17, 7,
  215837. -13, 8, 13, 6, 21, 7, -29, 6, 19, 7, -25, 6, 11, 9, 29, 7,
  215838. -7, 8, 27, 7, 29, 10, -1, 8, -7, 8, 17, 6, 17, 7, -27, 7,
  215839. -21, 6, -9, 6, -27, 12, -23, 6, 19, 6, 13, 6, -11, 7, 27, 6,
  215840. 17, 6, -7, 6, -25, 7, -29, 6, 9, 7, 7, 6, 13, 6, -25, 6,
  215841. -19, 6, 13, 6, -11, 6, 5, 8, 19, 6, -21, 8, 23, 7, 27, 6,
  215842. -13, 6, -19, 11, 29, 7, -15, 6, -9, 7, -21, 10, -3, 7, 21, 10,
  215843. 25, 6, -15, 6, -23, 6, 21, 6, 1, 6, 21, 7, -3, 6, -3, 7,
  215844. -7, 6, -23, 7, 7, 8, 15, 9, 5, 6, -11, 6, 21, 11, -27, 7,
  215845. 27, 6, -11, 6, 31, 6, -21, 6, 19, 6, -7, 8, -7, 13, -3, 6,
  215846. -7, 7, -3, 6, 1, 6, 7, 8, 19, 8, 11, 9, -9, 7, -31, 12,
  215847. 25, 6, -17, 9, -15, 7, 5, 6, 25, 7, -5, 7, -25, 6, 17, 8,
  215848. -19, 6, -13, 6, 27, 8, 1, 7, -5, 7, -1, 6, 21, 6, 3, 10,
  215849. -3, 1,
  215850. };
  215851. /*
  215852. * Generate table for pairing.
  215853. *
  215854. * Calculate the graident (l) and constant (c) at each step of the way.
  215855. * Sliding window. Start at bottom and stop when bottom bit is one.
  215856. * Subtract if top bit in window is one.
  215857. * Width of 6 bits.
  215858. *
  215859. * pm [in] Point to generate table for.
  215860. * table [in] Generated table.
  215861. * len [in,out] On in, the size of the buffer.
  215862. * On out, length of table generated.
  215863. * @return 0 on success.
  215864. * LENGTH_ONLY_E when table is NULL and only length returned.
  215865. * BUFFER_E when len is too small.
  215866. * MEMORY_E when dynamic memory allocation fauls.
  215867. */
  215868. int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
  215869. word32* len)
  215870. {
  215871. int err = 0;
  215872. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  215873. defined(WOLFSSL_SP_SMALL_STACK)
  215874. sp_digit* td = NULL;
  215875. sp_digit* t;
  215876. sp_point_1024* pre_p;
  215877. #else
  215878. sp_digit t[36 * 2 * 32];
  215879. sp_point_1024 pre_p[16];
  215880. sp_point_1024 pd;
  215881. sp_point_1024 cd;
  215882. sp_point_1024 negd;
  215883. #endif
  215884. sp_point_1024* p = NULL;
  215885. sp_point_1024* c = NULL;
  215886. sp_point_1024* neg = NULL;
  215887. int i;
  215888. int j;
  215889. int k;
  215890. sp_table_entry_1024* precomp = (sp_table_entry_1024*)table;
  215891. if (table == NULL) {
  215892. *len = sizeof(sp_table_entry_1024) * 1167;
  215893. err = LENGTH_ONLY_E;
  215894. }
  215895. if ((err == MP_OKAY) &&
  215896. (*len < (int)(sizeof(sp_table_entry_1024) * 1167))) {
  215897. err = BUFFER_E;
  215898. }
  215899. if (err == MP_OKAY) {
  215900. err = sp_1024_point_new_32(NULL, pd, p);
  215901. }
  215902. if (err == MP_OKAY) {
  215903. err = sp_1024_point_new_32(NULL, cd, c);
  215904. }
  215905. if (err == MP_OKAY) {
  215906. err = sp_1024_point_new_32(NULL, negd, neg);
  215907. }
  215908. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  215909. defined(WOLFSSL_SP_SMALL_STACK)
  215910. if (err == MP_OKAY) {
  215911. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 36 * 32 * 2 + 16 *
  215912. sizeof(sp_point_1024), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  215913. if (td == NULL) {
  215914. err = MEMORY_E;
  215915. }
  215916. }
  215917. #endif
  215918. if (err == MP_OKAY) {
  215919. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  215920. defined(WOLFSSL_SP_SMALL_STACK)
  215921. t = td;
  215922. pre_p = (sp_point_1024*)(td + 36 * 32 * 2);
  215923. #endif
  215924. sp_1024_point_from_ecc_point_32(p, pm);
  215925. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  215926. }
  215927. if (err == MP_OKAY) {
  215928. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  215929. }
  215930. if (err == MP_OKAY) {
  215931. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  215932. neg->infinity = 0;
  215933. c->infinity = 0;
  215934. /* Generate pre-computation table: 1, 3, ... , 31 */
  215935. XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
  215936. /* [2]P for adding */
  215937. sp_1024_proj_point_dbl_32(c, p, t);
  215938. /* 1, 3, ... */
  215939. for (i = 1; i < 16; i++) {
  215940. sp_1024_proj_point_add_32(&pre_p[i], &pre_p[i-1], c, t);
  215941. sp_1024_mont_map_32(&pre_p[i], t);
  215942. }
  215943. k = 0;
  215944. j = sp_1024_order_op_pre[0] / 2;
  215945. XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
  215946. for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
  215947. sp_1024_accum_dbl_calc_lc_32(precomp[k].x, precomp[k].y, c->x,
  215948. c->y, t);
  215949. k++;
  215950. sp_1024_proj_point_dbl_32(c, c, t);
  215951. sp_1024_mont_map_32(c, t);
  215952. }
  215953. for (i = 2; i < 290; i += 2) {
  215954. j = sp_1024_order_op_pre[i];
  215955. if (j > 0) {
  215956. sp_1024_accum_add_calc_lc_32(precomp[k].x, precomp[k].y,
  215957. pre_p[j/2].x, pre_p[j/2].y, c->x, c->y, t);
  215958. k++;
  215959. sp_1024_proj_point_add_32(c, c, &pre_p[j/2], t);
  215960. sp_1024_mont_map_32(c, t);
  215961. }
  215962. else {
  215963. XMEMCPY(neg->x, pre_p[-j / 2].x, sizeof(pre_p->x));
  215964. sp_1024_mont_sub_32(neg->y, p1024_mod, pre_p[-j / 2].y,
  215965. p1024_mod);
  215966. XMEMCPY(neg->z, pre_p[-j / 2].z, sizeof(pre_p->z));
  215967. sp_1024_accum_add_calc_lc_32(precomp[k].x, precomp[k].y,
  215968. neg->x, neg->y, c->x, c->y, t);
  215969. k++;
  215970. sp_1024_proj_point_add_32(c, c, neg, t);
  215971. sp_1024_mont_map_32(c, t);
  215972. }
  215973. for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
  215974. sp_1024_accum_dbl_calc_lc_32(precomp[k].x, precomp[k].y, c->x,
  215975. c->y, t);
  215976. k++;
  215977. sp_1024_proj_point_dbl_32(c, c, t);
  215978. sp_1024_mont_map_32(c, t);
  215979. }
  215980. }
  215981. *len = sizeof(sp_table_entry_1024) * 1167;
  215982. }
  215983. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  215984. defined(WOLFSSL_SP_SMALL_STACK)
  215985. if (td != NULL) {
  215986. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  215987. }
  215988. #endif
  215989. sp_1024_point_free_32(neg, 1, NULL);
  215990. sp_1024_point_free_32(c, 1, NULL);
  215991. sp_1024_point_free_32(p, 1, NULL);
  215992. return err;
  215993. }
  215994. /*
  215995. * Calculate r = pairing <P, Q>.
  215996. *
  215997. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  215998. *
  215999. * Sliding window. Start at bottom and stop when bottom bit is one.
  216000. * Subtract if top bit in window is one.
  216001. * Width of 6 bits.
  216002. * Pre-generate values in window (1, 3, ...) - only V.
  216003. * Table contains all gradient l and a constant for each point on the path.
  216004. *
  216005. * @param [in] pm First point on E(F_p)[q].
  216006. * @param [in] qm Second point on E(F_p)[q].
  216007. * @param [in] res Result of calculation.
  216008. * @param [in] table Precomputed table of values.
  216009. * @param [in] len Length of precomputed table of values in bytes.
  216010. * @return 0 on success.
  216011. * @return MEMORY_E when dynamic memory allocation fails.
  216012. */
  216013. int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
  216014. mp_int* res, const byte* table, word32 len)
  216015. {
  216016. int err = 0;
  216017. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  216018. defined(WOLFSSL_SP_SMALL_STACK)
  216019. sp_digit* td = NULL;
  216020. sp_digit* t;
  216021. sp_digit* vx;
  216022. sp_digit* vy;
  216023. sp_digit (*pre_vx)[64];
  216024. sp_digit (*pre_vy)[64];
  216025. sp_digit (*pre_nvy)[64];
  216026. #else
  216027. sp_digit t[36 * 2 * 32];
  216028. sp_digit vx[2 * 32];
  216029. sp_digit vy[2 * 32];
  216030. sp_digit pre_vx[16][64];
  216031. sp_digit pre_vy[16][64];
  216032. sp_digit pre_nvy[16][64];
  216033. sp_point_1024 pd;
  216034. sp_point_1024 qd;
  216035. sp_point_1024 cd;
  216036. #endif
  216037. sp_point_1024* p = NULL;
  216038. sp_point_1024* q = NULL;
  216039. sp_point_1024* c = NULL;
  216040. sp_digit* r = NULL;
  216041. int i;
  216042. int j;
  216043. int k;
  216044. const sp_table_entry_1024* precomp = (const sp_table_entry_1024*)table;
  216045. if (len < (int)(sizeof(sp_table_entry_1024) * 1167)) {
  216046. err = BUFFER_E;
  216047. }
  216048. if (err == MP_OKAY) {
  216049. err = sp_1024_point_new_32(NULL, pd, p);
  216050. }
  216051. if (err == MP_OKAY) {
  216052. err = sp_1024_point_new_32(NULL, qd, q);
  216053. }
  216054. if (err == MP_OKAY) {
  216055. err = sp_1024_point_new_32(NULL, cd, c);
  216056. }
  216057. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  216058. defined(WOLFSSL_SP_SMALL_STACK)
  216059. if (err == MP_OKAY) {
  216060. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 86 * 32 * 2, NULL,
  216061. DYNAMIC_TYPE_TMP_BUFFER);
  216062. if (td == NULL) {
  216063. err = MEMORY_E;
  216064. }
  216065. }
  216066. #endif
  216067. if (err == MP_OKAY) {
  216068. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  216069. defined(WOLFSSL_SP_SMALL_STACK)
  216070. t = td;
  216071. vx = td + 36 * 32 * 2;
  216072. vy = td + 37 * 32 * 2;
  216073. pre_vx = (sp_digit(*)[64])(td + 38 * 32 * 2);
  216074. pre_vy = (sp_digit(*)[64])(td + 54 * 32 * 2);
  216075. pre_nvy = (sp_digit(*)[64])(td + 70 * 32 * 2);
  216076. #endif
  216077. r = vy;
  216078. sp_1024_point_from_ecc_point_32(p, pm);
  216079. sp_1024_point_from_ecc_point_32(q, qm);
  216080. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  216081. }
  216082. if (err == MP_OKAY) {
  216083. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  216084. }
  216085. if (err == MP_OKAY) {
  216086. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  216087. }
  216088. if (err == MP_OKAY) {
  216089. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  216090. }
  216091. if (err == MP_OKAY) {
  216092. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  216093. }
  216094. if (err == MP_OKAY) {
  216095. /* Generate pre-computation table: 1, 3, ... , 31 */
  216096. XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 32);
  216097. pre_vx[0][0] = 1;
  216098. XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 32);
  216099. sp_1024_mont_sub_32(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
  216100. /* [2]P for adding */
  216101. XMEMCPY(c, p, sizeof(sp_point_1024));
  216102. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  216103. vx[0] = 1;
  216104. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  216105. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  216106. /* 3, 5, ... */
  216107. for (i = 1; i < 16; i++) {
  216108. XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 32);
  216109. XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 32);
  216110. sp_1024_proj_mul_32(pre_vx[i], pre_vy[i], vx, vy, t);
  216111. sp_1024_accumulate_line_add_n_32(pre_vx[i], pre_vy[i], c,
  216112. q, p, t, 0);
  216113. sp_1024_mont_sub_32(pre_nvy[i], p1024_mod, pre_vy[i],
  216114. p1024_mod);
  216115. }
  216116. XMEMCPY(c->z, p1024_norm_mod, sizeof(sp_digit) * 32);
  216117. c->infinity = 0;
  216118. j = sp_1024_order_op_pre[0] / 2;
  216119. XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 32);
  216120. XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 32);
  216121. k = 0;
  216122. for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
  216123. /* Accumulate line into v and double point. */
  216124. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  216125. precomp[k].y, q, t, 1);
  216126. k++;
  216127. }
  216128. for (i = 2; i < 290; i += 2) {
  216129. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  216130. precomp[k].y, q, t, 0);
  216131. k++;
  216132. j = sp_1024_order_op_pre[i];
  216133. if (j > 0) {
  216134. j /= 2;
  216135. /* Accumulate line into v. */
  216136. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_vy[j], t);
  216137. }
  216138. else {
  216139. j = -j / 2;
  216140. /* Accumulate line into v. */
  216141. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_nvy[j], t);
  216142. }
  216143. for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
  216144. /* Accumulate line into v and double point. */
  216145. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  216146. precomp[k].y, q, t, 1);
  216147. k++;
  216148. }
  216149. }
  216150. /* Final exponentiation */
  216151. sp_1024_proj_sqr_32(vx, vy, t);
  216152. sp_1024_proj_sqr_32(vx, vy, t);
  216153. /* Convert from PF_p[q] to F_p */
  216154. sp_1024_mont_inv_32(vx, vx, t);
  216155. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  216156. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  216157. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  216158. err = sp_1024_to_mp(r, res);
  216159. }
  216160. #if (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_NO_MALLOC)) || \
  216161. defined(WOLFSSL_SP_SMALL_STACK)
  216162. if (td != NULL) {
  216163. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  216164. }
  216165. #endif
  216166. sp_1024_point_free_32(c, 1, NULL);
  216167. sp_1024_point_free_32(q, 1, NULL);
  216168. sp_1024_point_free_32(p, 1, NULL);
  216169. return err;
  216170. }
  216171. #endif /* WOLFSSL_SP_SMALL */
  216172. #ifdef HAVE_ECC_CHECK_KEY
  216173. /* Read big endian unsigned byte array into r.
  216174. *
  216175. * r A single precision integer.
  216176. * size Maximum number of bytes to convert
  216177. * a Byte array.
  216178. * n Number of bytes in array to read.
  216179. */
  216180. static void sp_1024_from_bin(sp_digit* r, int size, const byte* a, int n)
  216181. {
  216182. int i;
  216183. int j;
  216184. byte* d;
  216185. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  216186. r[j] = ((sp_digit)a[i - 0] << 0) |
  216187. ((sp_digit)a[i - 1] << 8) |
  216188. ((sp_digit)a[i - 2] << 16) |
  216189. ((sp_digit)a[i - 3] << 24);
  216190. j++;
  216191. }
  216192. if (i >= 0) {
  216193. r[j] = 0;
  216194. d = (byte*)r;
  216195. switch (i) {
  216196. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  216197. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  216198. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  216199. }
  216200. j++;
  216201. }
  216202. for (; j < size; j++) {
  216203. r[j] = 0;
  216204. }
  216205. }
  216206. /* Check that the x and y ordinates are a valid point on the curve.
  216207. *
  216208. * point EC point.
  216209. * heap Heap to use if dynamically allocating.
  216210. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  216211. * not on the curve and MP_OKAY otherwise.
  216212. */
  216213. static int sp_1024_ecc_is_point_32(const sp_point_1024* point,
  216214. void* heap)
  216215. {
  216216. #ifdef WOLFSSL_SP_SMALL_STACK
  216217. sp_digit* t1 = NULL;
  216218. #else
  216219. sp_digit t1[32 * 4];
  216220. #endif
  216221. sp_digit* t2 = NULL;
  216222. sp_int32 n;
  216223. int err = MP_OKAY;
  216224. #ifdef WOLFSSL_SP_SMALL_STACK
  216225. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 4, heap, DYNAMIC_TYPE_ECC);
  216226. if (t1 == NULL)
  216227. err = MEMORY_E;
  216228. #endif
  216229. (void)heap;
  216230. if (err == MP_OKAY) {
  216231. t2 = t1 + 2 * 32;
  216232. /* y^2 - x^3 - a.x = b */
  216233. sp_1024_sqr_32(t1, point->y);
  216234. (void)sp_1024_mod_32(t1, t1, p1024_mod);
  216235. sp_1024_sqr_32(t2, point->x);
  216236. (void)sp_1024_mod_32(t2, t2, p1024_mod);
  216237. sp_1024_mul_32(t2, t2, point->x);
  216238. (void)sp_1024_mod_32(t2, t2, p1024_mod);
  216239. sp_1024_mont_sub_32(t1, t1, t2, p1024_mod);
  216240. /* y^2 - x^3 + 3.x = b, when a = -3 */
  216241. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  216242. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  216243. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  216244. n = sp_1024_cmp_32(t1, p1024_mod);
  216245. sp_1024_cond_sub_32(t1, t1, p1024_mod, ~(n >> 31));
  216246. sp_1024_norm_32(t1);
  216247. if (!sp_1024_iszero_32(t1)) {
  216248. err = MP_VAL;
  216249. }
  216250. }
  216251. #ifdef WOLFSSL_SP_SMALL_STACK
  216252. if (t1 != NULL)
  216253. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  216254. #endif
  216255. return err;
  216256. }
  216257. /* Check that the x and y ordinates are a valid point on the curve.
  216258. *
  216259. * pX X ordinate of EC point.
  216260. * pY Y ordinate of EC point.
  216261. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  216262. * not on the curve and MP_OKAY otherwise.
  216263. */
  216264. int sp_ecc_is_point_1024(const mp_int* pX, const mp_int* pY)
  216265. {
  216266. #ifdef WOLFSSL_SP_SMALL_STACK
  216267. sp_point_1024* pub = NULL;
  216268. #else
  216269. sp_point_1024 pub[1];
  216270. #endif
  216271. const byte one[1] = { 1 };
  216272. int err = MP_OKAY;
  216273. #ifdef WOLFSSL_SP_SMALL_STACK
  216274. pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), NULL,
  216275. DYNAMIC_TYPE_ECC);
  216276. if (pub == NULL)
  216277. err = MEMORY_E;
  216278. #endif
  216279. if (err == MP_OKAY) {
  216280. sp_1024_from_mp(pub->x, 32, pX);
  216281. sp_1024_from_mp(pub->y, 32, pY);
  216282. sp_1024_from_bin(pub->z, 32, one, (int)sizeof(one));
  216283. err = sp_1024_ecc_is_point_32(pub, NULL);
  216284. }
  216285. #ifdef WOLFSSL_SP_SMALL_STACK
  216286. if (pub != NULL)
  216287. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  216288. #endif
  216289. return err;
  216290. }
  216291. /* Check that the private scalar generates the EC point (px, py), the point is
  216292. * on the curve and the point has the correct order.
  216293. *
  216294. * pX X ordinate of EC point.
  216295. * pY Y ordinate of EC point.
  216296. * privm Private scalar that generates EC point.
  216297. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  216298. * not on the curve, ECC_INF_E if the point does not have the correct order,
  216299. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  216300. * MP_OKAY otherwise.
  216301. */
  216302. int sp_ecc_check_key_1024(const mp_int* pX, const mp_int* pY,
  216303. const mp_int* privm, void* heap)
  216304. {
  216305. #ifdef WOLFSSL_SP_SMALL_STACK
  216306. sp_digit* priv = NULL;
  216307. sp_point_1024* pub = NULL;
  216308. #else
  216309. sp_digit priv[32];
  216310. sp_point_1024 pub[2];
  216311. #endif
  216312. sp_point_1024* p = NULL;
  216313. const byte one[1] = { 1 };
  216314. int err = MP_OKAY;
  216315. /* Quick check the lengs of public key ordinates and private key are in
  216316. * range. Proper check later.
  216317. */
  216318. if (((mp_count_bits(pX) > 1024) ||
  216319. (mp_count_bits(pY) > 1024) ||
  216320. ((privm != NULL) && (mp_count_bits(privm) > 1024)))) {
  216321. err = ECC_OUT_OF_RANGE_E;
  216322. }
  216323. #ifdef WOLFSSL_SP_SMALL_STACK
  216324. if (err == MP_OKAY) {
  216325. pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  216326. DYNAMIC_TYPE_ECC);
  216327. if (pub == NULL)
  216328. err = MEMORY_E;
  216329. }
  216330. if (err == MP_OKAY && privm) {
  216331. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  216332. DYNAMIC_TYPE_ECC);
  216333. if (priv == NULL)
  216334. err = MEMORY_E;
  216335. }
  216336. #endif
  216337. if (err == MP_OKAY) {
  216338. p = pub + 1;
  216339. sp_1024_from_mp(pub->x, 32, pX);
  216340. sp_1024_from_mp(pub->y, 32, pY);
  216341. sp_1024_from_bin(pub->z, 32, one, (int)sizeof(one));
  216342. if (privm)
  216343. sp_1024_from_mp(priv, 32, privm);
  216344. /* Check point at infinitiy. */
  216345. if ((sp_1024_iszero_32(pub->x) != 0) &&
  216346. (sp_1024_iszero_32(pub->y) != 0)) {
  216347. err = ECC_INF_E;
  216348. }
  216349. }
  216350. /* Check range of X and Y */
  216351. if ((err == MP_OKAY) &&
  216352. ((sp_1024_cmp_32(pub->x, p1024_mod) >= 0) ||
  216353. (sp_1024_cmp_32(pub->y, p1024_mod) >= 0))) {
  216354. err = ECC_OUT_OF_RANGE_E;
  216355. }
  216356. if (err == MP_OKAY) {
  216357. /* Check point is on curve */
  216358. err = sp_1024_ecc_is_point_32(pub, heap);
  216359. }
  216360. if (err == MP_OKAY) {
  216361. /* Point * order = infinity */
  216362. err = sp_1024_ecc_mulmod_32(p, pub, p1024_order, 1, 1, heap);
  216363. }
  216364. /* Check result is infinity */
  216365. if ((err == MP_OKAY) && ((sp_1024_iszero_32(p->x) == 0) ||
  216366. (sp_1024_iszero_32(p->y) == 0))) {
  216367. err = ECC_INF_E;
  216368. }
  216369. if (privm) {
  216370. if (err == MP_OKAY) {
  216371. /* Base * private = point */
  216372. err = sp_1024_ecc_mulmod_base_32(p, priv, 1, 1, heap);
  216373. }
  216374. /* Check result is public key */
  216375. if ((err == MP_OKAY) &&
  216376. ((sp_1024_cmp_32(p->x, pub->x) != 0) ||
  216377. (sp_1024_cmp_32(p->y, pub->y) != 0))) {
  216378. err = ECC_PRIV_KEY_E;
  216379. }
  216380. }
  216381. #ifdef WOLFSSL_SP_SMALL_STACK
  216382. if (pub != NULL)
  216383. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  216384. if (priv != NULL)
  216385. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  216386. #endif
  216387. return err;
  216388. }
  216389. #endif
  216390. #endif /* WOLFSSL_SP_1024 */
  216391. #endif /* WOLFCRYPT_HAVE_SAKKE */
  216392. #endif /* WOLFSSL_HAVE_SP_ECC */
  216393. #endif /* WOLFSSL_SP_ARM_THUMB_ASM */
  216394. #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH | WOLFSSL_HAVE_SP_ECC */